| /* | |
| * 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; |