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