Spaces:
Running
Running
| /* | |
| * 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 GlobalModel from './Global'; | |
| import { ComponentOption, ComponentMainType } from '../util/types'; | |
| import { createHashMap, assert } from 'zrender/src/core/util'; | |
| import { isComponentIdInternal } from '../util/model'; | |
| // PNEDING: | |
| // (1) Only Internal usage at present, do not export to uses. | |
| // (2) "Internal components" are generated internally during the `Global.ts#_mergeOption`. | |
| // It is added since echarts 3. | |
| // (3) Why keep supporting "internal component" in global model rather than | |
| // make each type components manage their models themselves? | |
| // Because a potential feature that reproduces a chart from a different chart instance | |
| // might be useful in some BI analysis scenario, where the entire state needs to be | |
| // retrieved from the current chart instance. So we'd better manage all of the | |
| // state universally. | |
| // (4) Internal component always merged in "replaceMerge" approach, that is, if the existing | |
| // internal components does not matched by a new option with the same id, it will be | |
| // removed. | |
| // (5) In `InternalOptionCreator`, only the previous component models (dependencies) can be read. | |
| interface InternalOptionCreator { | |
| (ecModel: GlobalModel): ComponentOption[] | |
| } | |
| const internalOptionCreatorMap = createHashMap<InternalOptionCreator, string>(); | |
| export function registerInternalOptionCreator( | |
| mainType: ComponentMainType, creator: InternalOptionCreator | |
| ) { | |
| assert(internalOptionCreatorMap.get(mainType) == null && creator); | |
| internalOptionCreatorMap.set(mainType, creator); | |
| } | |
| export function concatInternalOptions( | |
| ecModel: GlobalModel, | |
| mainType: ComponentMainType, | |
| newCmptOptionList: ComponentOption[] | |
| ): ComponentOption[] { | |
| const internalOptionCreator = internalOptionCreatorMap.get(mainType); | |
| if (!internalOptionCreator) { | |
| return newCmptOptionList; | |
| } | |
| const internalOptions = internalOptionCreator(ecModel); | |
| if (!internalOptions) { | |
| return newCmptOptionList; | |
| } | |
| if (__DEV__) { | |
| for (let i = 0; i < internalOptions.length; i++) { | |
| assert(isComponentIdInternal(internalOptions[i])); | |
| } | |
| } | |
| return newCmptOptionList.concat(internalOptions); | |
| } | |