echarts CalendarModel 源码
echarts CalendarModel 代码
文件路径:/src/coord/calendar/CalendarModel.ts
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import * as zrUtil from 'zrender/src/core/util';
import ComponentModel from '../../model/Component';
import {
getLayoutParams,
sizeCalculable,
mergeLayoutParam
} from '../../util/layout';
import Calendar from './Calendar';
import {
ComponentOption,
BoxLayoutOptionMixin,
LayoutOrient,
LineStyleOption,
ItemStyleOption,
LabelOption,
OptionDataValueDate
} from '../../util/types';
import GlobalModel from '../../model/Global';
import Model from '../../model/Model';
export interface CalendarMonthLabelFormatterCallbackParams {
nameMap: string
yyyy: string
yy: string
/**
* Month string. With 0 prefix.
*/
MM: string
/**
* Month number
*/
M: number
}
export interface CalendarYearLabelFormatterCallbackParams {
nameMap: string
/**
* Start year
*/
start: string
/**
* End year
*/
end: string
}
export interface CalendarOption extends ComponentOption, BoxLayoutOptionMixin {
mainType?: 'calendar'
cellSize?: number | 'auto' | (number | 'auto')[]
orient?: LayoutOrient
splitLine?: {
show?: boolean
lineStyle?: LineStyleOption
}
itemStyle?: ItemStyleOption
/**
* // one year
* range: 2017
* // one month
* range: '2017-02'
* // a range
* range: ['2017-01-02', '2017-02-23']
* // note: they will be identified as ['2017-01-01', '2017-02-01']
* range: ['2017-01', '2017-02']
*/
range?: OptionDataValueDate | (OptionDataValueDate)[]
dayLabel?: Omit<LabelOption, 'position'> & {
/**
* First day of week.
*/
firstDay?: number
/**
* Margin between day label and axis line.
* Can be percent string of cell size.
*/
margin?: number | string
/**
* Position of week, at the beginning or end of the range.
*/
position?: 'start' | 'end'
/**
* Week text content
*
* defaults to auto-detected locale by the browser or the specified locale by `echarts.init` function.
* It supports any registered locale name (case-sensitive) or customized array.
* index 0 always means Sunday.
*/
nameMap?: string | string[]
}
monthLabel?: Omit<LabelOption, 'position'> & {
/**
* Margin between month label and axis line.
*/
margin?: number
/**
* Position of month label, at the beginning or end of the range.
*/
position?: 'start' | 'end'
/**
* Month text content
*
* defaults to auto-detected locale by the browser or the specified locale by `echarts.init` function.
* It supports any registered locale name (case-sensitive) or customized array.
* index 0 always means Jan.
*/
nameMap?: string | string[]
formatter?: string | ((params: CalendarMonthLabelFormatterCallbackParams) => string)
}
yearLabel?: Omit<LabelOption, 'position'> & {
/**
* Margin between year label and axis line.
*/
margin?: number
/**
* Position of year label, at the beginning or end of the range.
*/
position?: 'top' | 'bottom' | 'left' | 'right'
formatter?: string | ((params: CalendarYearLabelFormatterCallbackParams) => string)
}
}
class CalendarModel extends ComponentModel<CalendarOption> {
static type = 'calendar';
type = CalendarModel.type;
coordinateSystem: Calendar;
/**
* @override
*/
init(option: CalendarOption, parentModel: Model, ecModel: GlobalModel) {
const inputPositionParams = getLayoutParams(option);
super.init.apply(this, arguments as any);
mergeAndNormalizeLayoutParams(option, inputPositionParams);
}
/**
* @override
*/
mergeOption(option: CalendarOption) {
super.mergeOption.apply(this, arguments as any);
mergeAndNormalizeLayoutParams(this.option, option);
}
getCellSize() {
// Has been normalized
return this.option.cellSize as (number | 'auto')[];
}
static defaultOption: CalendarOption = {
// zlevel: 0,
z: 2,
left: 80,
top: 60,
cellSize: 20,
// horizontal vertical
orient: 'horizontal',
// month separate line style
splitLine: {
show: true,
lineStyle: {
color: '#000',
width: 1,
type: 'solid'
}
},
// rect style temporarily unused emphasis
itemStyle: {
color: '#fff',
borderWidth: 1,
borderColor: '#ccc'
},
// week text style
dayLabel: {
show: true,
firstDay: 0,
// start end
position: 'start',
margin: '50%', // 50% of cellSize
color: '#000'
},
// month text style
monthLabel: {
show: true,
// start end
position: 'start',
margin: 5,
// center or left
align: 'center',
formatter: null,
color: '#000'
},
// year text style
yearLabel: {
show: true,
// top bottom left right
position: null,
margin: 30,
formatter: null,
color: '#ccc',
fontFamily: 'sans-serif',
fontWeight: 'bolder',
fontSize: 20
}
};
}
function mergeAndNormalizeLayoutParams(target: CalendarOption, raw: BoxLayoutOptionMixin) {
// Normalize cellSize
const cellSize = target.cellSize;
let cellSizeArr: (number | 'auto')[];
if (!zrUtil.isArray(cellSize)) {
cellSizeArr = target.cellSize = [cellSize, cellSize];
}
else {
cellSizeArr = cellSize;
}
if (cellSizeArr.length === 1) {
cellSizeArr[1] = cellSizeArr[0];
}
const ignoreSize = zrUtil.map([0, 1], function (hvIdx) {
// If user have set `width` or both `left` and `right`, cellSizeArr
// will be automatically set to 'auto', otherwise the default
// setting of cellSizeArr will make `width` setting not work.
if (sizeCalculable(raw, hvIdx)) {
cellSizeArr[hvIdx] = 'auto';
}
return cellSizeArr[hvIdx] != null && cellSizeArr[hvIdx] !== 'auto';
});
mergeLayoutParam(target, raw, {
type: 'box', ignoreSize: ignoreSize
});
}
export default CalendarModel;
相关信息
相关文章
0
赞
热门推荐
-
2、 - 优质文章
-
3、 gate.io
-
8、 golang
-
9、 openharmony
-
10、 Vue中input框自动聚焦