| /* | 
 | * 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 axisDefault from './axisDefault'; | 
 | import ComponentModel from '../model/Component'; | 
 | import { | 
 |     getLayoutParams, | 
 |     mergeLayoutParam, | 
 |     fetchLayoutMode | 
 | } from '../util/layout'; | 
 | import OrdinalMeta from '../data/OrdinalMeta'; | 
 | import { DimensionName, BoxLayoutOptionMixin, OrdinalRawValue } from '../util/types'; | 
 | import { AxisBaseOption, AXIS_TYPES, CategoryAxisBaseOption } from './axisCommonTypes'; | 
 | import GlobalModel from '../model/Global'; | 
 | import { each, merge } from 'zrender/src/core/util'; | 
 | import { EChartsExtensionInstallRegisters } from '../extension'; | 
 |  | 
 |  | 
 | type Constructor<T> = new (...args: any[]) => T; | 
 |  | 
 | export interface AxisModelExtendedInCreator { | 
 |     getCategories(rawData?: boolean): OrdinalRawValue[] | CategoryAxisBaseOption['data'] | 
 |     getOrdinalMeta(): OrdinalMeta | 
 | } | 
 |  | 
 | /** | 
 |  * Generate sub axis model class | 
 |  * @param axisName 'x' 'y' 'radius' 'angle' 'parallel' ... | 
 |  */ | 
 | export default function axisModelCreator< | 
 |     AxisOptionT extends AxisBaseOption, | 
 |     AxisModelCtor extends Constructor<ComponentModel<AxisOptionT>> | 
 | >( | 
 |     registers: EChartsExtensionInstallRegisters, | 
 |     axisName: DimensionName, | 
 |     BaseAxisModelClass: AxisModelCtor, | 
 |     extraDefaultOption?: AxisOptionT | 
 | ) { | 
 |  | 
 |     each(AXIS_TYPES, function (v, axisType) { | 
 |  | 
 |         const defaultOption = merge( | 
 |             merge({}, axisDefault[axisType], true), | 
 |             extraDefaultOption, true | 
 |         ); | 
 |  | 
 |         class AxisModel extends BaseAxisModelClass implements AxisModelExtendedInCreator { | 
 |  | 
 |             static type = axisName + 'Axis.' + axisType; | 
 |             type = axisName + 'Axis.' + axisType; | 
 |  | 
 |             static defaultOption = defaultOption; | 
 |  | 
 |             private __ordinalMeta: OrdinalMeta; | 
 |  | 
 |  | 
 |             mergeDefaultAndTheme(option: AxisOptionT, ecModel: GlobalModel): void { | 
 |                 const layoutMode = fetchLayoutMode(this); | 
 |                 const inputPositionParams = layoutMode | 
 |                     ? getLayoutParams(option as BoxLayoutOptionMixin) : {}; | 
 |  | 
 |                 const themeModel = ecModel.getTheme(); | 
 |                 merge(option, themeModel.get(axisType + 'Axis')); | 
 |                 merge(option, this.getDefaultOption()); | 
 |  | 
 |                 option.type = getAxisType(option); | 
 |  | 
 |                 if (layoutMode) { | 
 |                     mergeLayoutParam(option as BoxLayoutOptionMixin, inputPositionParams, layoutMode); | 
 |                 } | 
 |             } | 
 |  | 
 |             optionUpdated(): void { | 
 |                 const thisOption = this.option; | 
 |                 if (thisOption.type === 'category') { | 
 |                     this.__ordinalMeta = OrdinalMeta.createByAxisModel(this); | 
 |                 } | 
 |             } | 
 |  | 
 |             /** | 
 |              * Should not be called before all of 'getInitailData' finished. | 
 |              * Because categories are collected during initializing data. | 
 |              */ | 
 |             getCategories(rawData?: boolean): OrdinalRawValue[] | CategoryAxisBaseOption['data'] { | 
 |                 const option = this.option; | 
 |                 // FIXME | 
 |                 // warning if called before all of 'getInitailData' finished. | 
 |                 if (option.type === 'category') { | 
 |                     if (rawData) { | 
 |                         return (option as CategoryAxisBaseOption).data; | 
 |                     } | 
 |                     return this.__ordinalMeta.categories; | 
 |                 } | 
 |             } | 
 |  | 
 |             getOrdinalMeta(): OrdinalMeta { | 
 |                 return this.__ordinalMeta; | 
 |             } | 
 |         } | 
 |  | 
 |         registers.registerComponentModel(AxisModel); | 
 |     }); | 
 |  | 
 |     registers.registerSubTypeDefaulter( | 
 |         axisName + 'Axis', | 
 |         getAxisType | 
 |     ); | 
 | } | 
 |  | 
 | function getAxisType(option: AxisBaseOption) { | 
 |     // Default axis with data is category axis | 
 |     return option.type || ((option as CategoryAxisBaseOption).data ? 'category' : 'value'); | 
 | } |