1e484b35bSopenharmony_ci/* 2e484b35bSopenharmony_ci * Licensed to the Apache Software Foundation (ASF) under one 3e484b35bSopenharmony_ci * or more contributor license agreements. See the NOTICE file 4e484b35bSopenharmony_ci * distributed with this work for additional information 5e484b35bSopenharmony_ci * regarding copyright ownership. The ASF licenses this file 6e484b35bSopenharmony_ci * to you under the Apache License, Version 2.0 (the 7e484b35bSopenharmony_ci * "License"); you may not use this file except in compliance 8e484b35bSopenharmony_ci * with the License. You may obtain a copy of the License at 9e484b35bSopenharmony_ci * 10e484b35bSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 11e484b35bSopenharmony_ci * 12e484b35bSopenharmony_ci * Unless required by applicable law or agreed to in writing, 13e484b35bSopenharmony_ci * software distributed under the License is distributed on an 14e484b35bSopenharmony_ci * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15e484b35bSopenharmony_ci * KIND, either express or implied. See the License for the 16e484b35bSopenharmony_ci * specific language governing permissions and limitations 17e484b35bSopenharmony_ci * under the License. 18e484b35bSopenharmony_ci */ 19e484b35bSopenharmony_ci/* 20e484b35bSopenharmony_ci * 2021.01.08 - Reconstruct the class 'Vm' and make it more adaptable to framework. 21e484b35bSopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd. 22e484b35bSopenharmony_ci */ 23e484b35bSopenharmony_ci 24e484b35bSopenharmony_ci/** 25e484b35bSopenharmony_ci * @fileOverview 26e484b35bSopenharmony_ci * ViewModel Constructor & definition 27e484b35bSopenharmony_ci */ 28e484b35bSopenharmony_ci 29e484b35bSopenharmony_ciimport { 30e484b35bSopenharmony_ci extend, 31e484b35bSopenharmony_ci Log, 32e484b35bSopenharmony_ci removeItem 33e484b35bSopenharmony_ci} from '../../utils/index'; 34e484b35bSopenharmony_ciimport { 35e484b35bSopenharmony_ci initState, 36e484b35bSopenharmony_ci initBases 37e484b35bSopenharmony_ci} from '../reactivity/state'; 38e484b35bSopenharmony_ciimport { 39e484b35bSopenharmony_ci build, FragBlockInterface 40e484b35bSopenharmony_ci} from './compiler'; 41e484b35bSopenharmony_ciimport { 42e484b35bSopenharmony_ci set, 43e484b35bSopenharmony_ci del 44e484b35bSopenharmony_ci} from '../reactivity/observer'; 45e484b35bSopenharmony_ciimport { 46e484b35bSopenharmony_ci watch, 47e484b35bSopenharmony_ci initPropsToData 48e484b35bSopenharmony_ci} from './pageLife'; 49e484b35bSopenharmony_ciimport { 50e484b35bSopenharmony_ci initEvents, 51e484b35bSopenharmony_ci ExternalEvent, 52e484b35bSopenharmony_ci Evt 53e484b35bSopenharmony_ci} from './events'; 54e484b35bSopenharmony_ciimport { 55e484b35bSopenharmony_ci selector 56e484b35bSopenharmony_ci} from './selector'; 57e484b35bSopenharmony_ciimport Page from '../page/index'; 58e484b35bSopenharmony_ciimport Element from '../../vdom/Element'; 59e484b35bSopenharmony_ciimport { 60e484b35bSopenharmony_ci ComputedInterface, 61e484b35bSopenharmony_ci cssType, 62e484b35bSopenharmony_ci Props, 63e484b35bSopenharmony_ci VmOptions, 64e484b35bSopenharmony_ci MediaStatusInterface, 65e484b35bSopenharmony_ci ExternalBindingInterface 66e484b35bSopenharmony_ci} from './vmOptions'; 67e484b35bSopenharmony_ciimport { 68e484b35bSopenharmony_ci hasOwn 69e484b35bSopenharmony_ci} from '../util/shared'; 70e484b35bSopenharmony_ci 71e484b35bSopenharmony_ci/** 72e484b35bSopenharmony_ci * VM constructor. 73e484b35bSopenharmony_ci * @param {string} type - Type. 74e484b35bSopenharmony_ci * @param {null | VmOptions} options - Component options. 75e484b35bSopenharmony_ci * @param {Vm} parentVm which contains __app. 76e484b35bSopenharmony_ci * @param {Element | FragBlockInterface} parentEl - root element or frag block. 77e484b35bSopenharmony_ci * @param {Object} mergedData - External data. 78e484b35bSopenharmony_ci * @param {ExternalEvent} externalEvents - External events. 79e484b35bSopenharmony_ci */ 80e484b35bSopenharmony_ciexport default class Vm { 81e484b35bSopenharmony_ci private $app: any; 82e484b35bSopenharmony_ci private __methods: Record<string, (...args: unknown[]) => any>; 83e484b35bSopenharmony_ci private __type: string; 84e484b35bSopenharmony_ci private __css: cssType; 85e484b35bSopenharmony_ci private __vmOptions: VmOptions; 86e484b35bSopenharmony_ci private __parent: Vm; 87e484b35bSopenharmony_ci private __realParent: Vm; 88e484b35bSopenharmony_ci private __computed: ComputedInterface; 89e484b35bSopenharmony_ci private __selector: object; 90e484b35bSopenharmony_ci private __parentEl: Element | FragBlockInterface; 91e484b35bSopenharmony_ci private __app: Page; 92e484b35bSopenharmony_ci private __shareData: any; 93e484b35bSopenharmony_ci private __data: any; 94e484b35bSopenharmony_ci private __props: Props; 95e484b35bSopenharmony_ci private __init: boolean; 96e484b35bSopenharmony_ci private __valid: boolean; 97e484b35bSopenharmony_ci private __visible: boolean; 98e484b35bSopenharmony_ci private __ready: boolean; 99e484b35bSopenharmony_ci private __rootEl: Element; 100e484b35bSopenharmony_ci private __ids: Record<string, {vm: Vm, el: Element}>; 101e484b35bSopenharmony_ci private __vmEvents: object; 102e484b35bSopenharmony_ci private __childrenVms: Vm[]; 103e484b35bSopenharmony_ci private __externalBinding: ExternalBindingInterface; 104e484b35bSopenharmony_ci private readonly __descriptor: string; 105e484b35bSopenharmony_ci private __isHide: boolean; 106e484b35bSopenharmony_ci private __mediaStatus: Partial<MediaStatusInterface<string, boolean>>; 107e484b35bSopenharmony_ci public $refs: Record<string, Element>; 108e484b35bSopenharmony_ci private __slotContext: { content: Record<string, any>, parentVm: Vm }; 109e484b35bSopenharmony_ci private __counterMapping = new Map(); 110e484b35bSopenharmony_ci 111e484b35bSopenharmony_ci constructor( 112e484b35bSopenharmony_ci type: string, 113e484b35bSopenharmony_ci options: null | VmOptions, 114e484b35bSopenharmony_ci parentVm: Vm | any, 115e484b35bSopenharmony_ci parentEl: Element | FragBlockInterface, 116e484b35bSopenharmony_ci mergedData: object, 117e484b35bSopenharmony_ci externalEvents: ExternalEvent 118e484b35bSopenharmony_ci ) { 119e484b35bSopenharmony_ci this.$app = global.aceapp; 120e484b35bSopenharmony_ci this.__parent = parentVm.__realParent ? parentVm.__realParent : parentVm; 121e484b35bSopenharmony_ci this.__app = parentVm.__app; 122e484b35bSopenharmony_ci parentVm.__childrenVms && parentVm.__childrenVms.push(this); 123e484b35bSopenharmony_ci 124e484b35bSopenharmony_ci if (!options && this.__app.customComponentMap) { 125e484b35bSopenharmony_ci options = this.__app.customComponentMap[type]; 126e484b35bSopenharmony_ci } 127e484b35bSopenharmony_ci const data = options.data || {}; 128e484b35bSopenharmony_ci const shareData = options.shareData || {}; 129e484b35bSopenharmony_ci this.__vmOptions = options; 130e484b35bSopenharmony_ci this.__computed = options.computed; 131e484b35bSopenharmony_ci this.__css = options.style || {}; 132e484b35bSopenharmony_ci this.__selector = selector(this.__css); 133e484b35bSopenharmony_ci this.__ids = {}; 134e484b35bSopenharmony_ci this.$refs = {}; 135e484b35bSopenharmony_ci this.__vmEvents = {}; 136e484b35bSopenharmony_ci this.__childrenVms = []; 137e484b35bSopenharmony_ci this.__type = type; 138e484b35bSopenharmony_ci this.__valid = true; 139e484b35bSopenharmony_ci this.__props = []; 140e484b35bSopenharmony_ci this.__methods = {}; 141e484b35bSopenharmony_ci 142e484b35bSopenharmony_ci // Bind events and lifecycles. 143e484b35bSopenharmony_ci initEvents(this, externalEvents); 144e484b35bSopenharmony_ci 145e484b35bSopenharmony_ci Log.debug( 146e484b35bSopenharmony_ci `'_innerInit' lifecycle in Vm(${this.__type}) and mergedData = ${JSON.stringify(mergedData)}.` 147e484b35bSopenharmony_ci ); 148e484b35bSopenharmony_ci this.$emit('hook:_innerInit'); 149e484b35bSopenharmony_ci this.__data = (typeof data === 'function' ? data.apply(this) : data) || {}; 150e484b35bSopenharmony_ci this.__shareData = (typeof shareData === 'function' ? shareData.apply(this) : shareData) || {}; 151e484b35bSopenharmony_ci this.__descriptor = options._descriptor; 152e484b35bSopenharmony_ci if (global.aceapp && global.aceapp.i18n && global.aceapp.i18n.extend) { 153e484b35bSopenharmony_ci global.aceapp.i18n.extend(this); 154e484b35bSopenharmony_ci } 155e484b35bSopenharmony_ci if (global.aceapp && global.aceapp.dpi && global.aceapp.dpi.extend) { 156e484b35bSopenharmony_ci global.aceapp.dpi.extend(this); 157e484b35bSopenharmony_ci } 158e484b35bSopenharmony_ci 159e484b35bSopenharmony_ci // MergedData means extras params. 160e484b35bSopenharmony_ci if (mergedData) { 161e484b35bSopenharmony_ci if (hasOwn(mergedData, 'paramsData') && hasOwn(mergedData, 'dontOverwrite') && mergedData['dontOverwrite'] === false) { 162e484b35bSopenharmony_ci dataAccessControl(this, mergedData['paramsData'], this.__app.options && this.__app.options.appCreate); 163e484b35bSopenharmony_ci extend(this._data, mergedData['paramsData']); 164e484b35bSopenharmony_ci } else { 165e484b35bSopenharmony_ci dataAccessControl(this, mergedData, this.__app.options && this.__app.options.appCreate); 166e484b35bSopenharmony_ci extend(this._data, mergedData); 167e484b35bSopenharmony_ci } 168e484b35bSopenharmony_ci } 169e484b35bSopenharmony_ci 170e484b35bSopenharmony_ci initPropsToData(this); 171e484b35bSopenharmony_ci initState(this); 172e484b35bSopenharmony_ci initBases(this); 173e484b35bSopenharmony_ci Log.debug(`"onInit" lifecycle in Vm(${this.__type})`); 174e484b35bSopenharmony_ci 175e484b35bSopenharmony_ci if (mergedData && hasOwn(mergedData, 'paramsData') && hasOwn(mergedData, 'dontOverwrite')) { 176e484b35bSopenharmony_ci if (mergedData['dontOverwrite'] === false) { 177e484b35bSopenharmony_ci this.$emit('hook:onInit'); 178e484b35bSopenharmony_ci } else { 179e484b35bSopenharmony_ci this.$emitDirect('hook:onInit', mergedData['paramsData']); 180e484b35bSopenharmony_ci } 181e484b35bSopenharmony_ci } else { 182e484b35bSopenharmony_ci this.$emit('hook:onInit'); 183e484b35bSopenharmony_ci } 184e484b35bSopenharmony_ci 185e484b35bSopenharmony_ci if (!this.__app.doc) { 186e484b35bSopenharmony_ci return; 187e484b35bSopenharmony_ci } 188e484b35bSopenharmony_ci this.__mediaStatus = {}; 189e484b35bSopenharmony_ci this.__mediaStatus.orientation = this.__app.options.orientation; 190e484b35bSopenharmony_ci this.__mediaStatus.width = this.__app.options.width; 191e484b35bSopenharmony_ci this.__mediaStatus.height = this.__app.options.height; 192e484b35bSopenharmony_ci this.__mediaStatus.resolution = this.__app.options.resolution; 193e484b35bSopenharmony_ci this.__mediaStatus['device-type'] = this.__app.options['device-type']; 194e484b35bSopenharmony_ci this.__mediaStatus['aspect-ratio'] = this.__app.options['aspect-ratio']; 195e484b35bSopenharmony_ci this.__mediaStatus['device-width'] = this.__app.options['device-width']; 196e484b35bSopenharmony_ci this.__mediaStatus['device-height'] = this.__app.options['device-height']; 197e484b35bSopenharmony_ci this.__mediaStatus['round-screen'] = this.__app.options['round-screen']; 198e484b35bSopenharmony_ci this.__mediaStatus['dark-mode'] = this.__app.options['dark-mode']; 199e484b35bSopenharmony_ci 200e484b35bSopenharmony_ci // If there is no parentElement, specify the documentElement. 201e484b35bSopenharmony_ci this.__parentEl = parentEl || this.__app.doc.documentElement; 202e484b35bSopenharmony_ci build(this); 203e484b35bSopenharmony_ci } 204e484b35bSopenharmony_ci 205e484b35bSopenharmony_ci /** 206e484b35bSopenharmony_ci * Get the element by id. 207e484b35bSopenharmony_ci * @param {string | number} [id] - Element id. 208e484b35bSopenharmony_ci * @return {Element} Element object. if get null, return root element. 209e484b35bSopenharmony_ci */ 210e484b35bSopenharmony_ci public $element(id?: string | number): Element { 211e484b35bSopenharmony_ci if (id) { 212e484b35bSopenharmony_ci if (typeof id !== 'string' && typeof id !== 'number') { 213e484b35bSopenharmony_ci Log.warn(`Invalid parameter type: The type of 'id' should be string or number, not ${typeof id}.`); 214e484b35bSopenharmony_ci return; 215e484b35bSopenharmony_ci } 216e484b35bSopenharmony_ci const info: any = this._ids[id]; 217e484b35bSopenharmony_ci if (info) { 218e484b35bSopenharmony_ci return info.el; 219e484b35bSopenharmony_ci } 220e484b35bSopenharmony_ci } else { 221e484b35bSopenharmony_ci return this.__rootEl; 222e484b35bSopenharmony_ci } 223e484b35bSopenharmony_ci } 224e484b35bSopenharmony_ci 225e484b35bSopenharmony_ci /** 226e484b35bSopenharmony_ci * Get the vm by id. 227e484b35bSopenharmony_ci * @param {string} id - Vm id. 228e484b35bSopenharmony_ci * @return {Vm} Vm object. 229e484b35bSopenharmony_ci */ 230e484b35bSopenharmony_ci public $vm(id: string): Vm { 231e484b35bSopenharmony_ci const info = this._ids[id]; 232e484b35bSopenharmony_ci if (info) { 233e484b35bSopenharmony_ci return info.vm; 234e484b35bSopenharmony_ci } 235e484b35bSopenharmony_ci } 236e484b35bSopenharmony_ci 237e484b35bSopenharmony_ci /** 238e484b35bSopenharmony_ci * Get parent Vm of current. 239e484b35bSopenharmony_ci */ 240e484b35bSopenharmony_ci public $parent(): Vm { 241e484b35bSopenharmony_ci return this._parent; 242e484b35bSopenharmony_ci } 243e484b35bSopenharmony_ci 244e484b35bSopenharmony_ci /** 245e484b35bSopenharmony_ci * Get child Vm of current. 246e484b35bSopenharmony_ci */ 247e484b35bSopenharmony_ci public $child(id: string): Vm { 248e484b35bSopenharmony_ci if (typeof id !== 'string') { 249e484b35bSopenharmony_ci Log.warn(`Invalid parameter type: The type of 'id' should be string, not ${typeof id}.`); 250e484b35bSopenharmony_ci return; 251e484b35bSopenharmony_ci } 252e484b35bSopenharmony_ci return this.$vm(id); 253e484b35bSopenharmony_ci } 254e484b35bSopenharmony_ci 255e484b35bSopenharmony_ci /** 256e484b35bSopenharmony_ci * Get root element of current. 257e484b35bSopenharmony_ci */ 258e484b35bSopenharmony_ci public $rootElement(): Element { 259e484b35bSopenharmony_ci return this.__rootEl; 260e484b35bSopenharmony_ci } 261e484b35bSopenharmony_ci 262e484b35bSopenharmony_ci /** 263e484b35bSopenharmony_ci * Get root Vm of current. 264e484b35bSopenharmony_ci */ 265e484b35bSopenharmony_ci public $root(): Vm { 266e484b35bSopenharmony_ci return getRoot(this); 267e484b35bSopenharmony_ci } 268e484b35bSopenharmony_ci 269e484b35bSopenharmony_ci /** 270e484b35bSopenharmony_ci * Execution Method. 271e484b35bSopenharmony_ci * @param {string} type - Type. 272e484b35bSopenharmony_ci * @param {Object} [detail] - May needed for Evt. 273e484b35bSopenharmony_ci * @param {*} args - Arg list. 274e484b35bSopenharmony_ci * @return {*} 275e484b35bSopenharmony_ci */ 276e484b35bSopenharmony_ci public $emit(type: string, detail?: object, ...args: any[]): any[] { 277e484b35bSopenharmony_ci if (typeof type !== 'string') { 278e484b35bSopenharmony_ci Log.warn(`Invalid parameter type: The type of 'type' should be string, not ${typeof type}.`); 279e484b35bSopenharmony_ci return; 280e484b35bSopenharmony_ci } 281e484b35bSopenharmony_ci const events = this.__vmEvents; 282e484b35bSopenharmony_ci const handlerList = events[type]; 283e484b35bSopenharmony_ci if (handlerList) { 284e484b35bSopenharmony_ci const results = []; 285e484b35bSopenharmony_ci const evt = new Evt(type, detail); 286e484b35bSopenharmony_ci handlerList.forEach((handler) => { 287e484b35bSopenharmony_ci results.push(handler.call(this, evt, ...args)); 288e484b35bSopenharmony_ci }); 289e484b35bSopenharmony_ci return results; 290e484b35bSopenharmony_ci } 291e484b35bSopenharmony_ci } 292e484b35bSopenharmony_ci 293e484b35bSopenharmony_ci /** 294e484b35bSopenharmony_ci * Execution Method directly. 295e484b35bSopenharmony_ci * @param {string} type - Type. 296e484b35bSopenharmony_ci * @param {*} args - Arg list. 297e484b35bSopenharmony_ci * @return {*} 298e484b35bSopenharmony_ci */ 299e484b35bSopenharmony_ci public $emitDirect(type: string, ...args: any[]): any[] { 300e484b35bSopenharmony_ci if (typeof type !== 'string') { 301e484b35bSopenharmony_ci Log.warn(`Invalid parameter type: The type of 'type' should be string, not ${typeof type}.`); 302e484b35bSopenharmony_ci return; 303e484b35bSopenharmony_ci } 304e484b35bSopenharmony_ci const events = this.__vmEvents; 305e484b35bSopenharmony_ci const handlerList = events[type]; 306e484b35bSopenharmony_ci if (handlerList) { 307e484b35bSopenharmony_ci const results = []; 308e484b35bSopenharmony_ci handlerList.forEach((handler) => { 309e484b35bSopenharmony_ci results.push(handler.call(this, ...args)); 310e484b35bSopenharmony_ci }); 311e484b35bSopenharmony_ci return results; 312e484b35bSopenharmony_ci } 313e484b35bSopenharmony_ci } 314e484b35bSopenharmony_ci 315e484b35bSopenharmony_ci /** 316e484b35bSopenharmony_ci * Dispatch events, passing upwards along the parent. 317e484b35bSopenharmony_ci * @param {string} type - Type. 318e484b35bSopenharmony_ci * @param {Object} [detail] - May needed for Evt. 319e484b35bSopenharmony_ci */ 320e484b35bSopenharmony_ci public $dispatch(type: string, detail?: object): void { 321e484b35bSopenharmony_ci if (typeof type !== 'string') { 322e484b35bSopenharmony_ci Log.warn(`Invalid parameter type: The type of 'type' should be string, not ${typeof type}.`); 323e484b35bSopenharmony_ci return; 324e484b35bSopenharmony_ci } 325e484b35bSopenharmony_ci const evt = new Evt(type, detail); 326e484b35bSopenharmony_ci this.$emit(type, evt); 327e484b35bSopenharmony_ci if (!evt.hasStopped() && this.__parent && this.__parent.$dispatch) { 328e484b35bSopenharmony_ci this.__parent.$dispatch(type, evt); 329e484b35bSopenharmony_ci } 330e484b35bSopenharmony_ci } 331e484b35bSopenharmony_ci 332e484b35bSopenharmony_ci /** 333e484b35bSopenharmony_ci * Broadcast event, which is passed down the subclass. 334e484b35bSopenharmony_ci * @param {string} type - Type. 335e484b35bSopenharmony_ci * @param {Object} [detail] - May be needed for Evt. 336e484b35bSopenharmony_ci */ 337e484b35bSopenharmony_ci public $broadcast(type: string, detail?: object): void { 338e484b35bSopenharmony_ci if (typeof type !== 'string') { 339e484b35bSopenharmony_ci Log.warn(`Invalid parameter type: The type of 'type' should be string, not ${typeof type}.`); 340e484b35bSopenharmony_ci return; 341e484b35bSopenharmony_ci } 342e484b35bSopenharmony_ci const evt = new Evt(type, detail); 343e484b35bSopenharmony_ci this.$emit(type, evt); 344e484b35bSopenharmony_ci if (!evt.hasStopped() && this.__childrenVms) { 345e484b35bSopenharmony_ci this.__childrenVms.forEach((subVm) => { 346e484b35bSopenharmony_ci subVm.$broadcast(type, evt); 347e484b35bSopenharmony_ci }); 348e484b35bSopenharmony_ci } 349e484b35bSopenharmony_ci } 350e484b35bSopenharmony_ci 351e484b35bSopenharmony_ci /** 352e484b35bSopenharmony_ci * Add the event listener. 353e484b35bSopenharmony_ci * @param {string} type - Type. 354e484b35bSopenharmony_ci * @param {Function} handler - To add. 355e484b35bSopenharmony_ci */ 356e484b35bSopenharmony_ci public $on(type: string, handler: Function): void { 357e484b35bSopenharmony_ci if (typeof type !== 'string') { 358e484b35bSopenharmony_ci Log.debug(`Invalid parameter type: The type of 'type' should be string, not ${typeof type}.`); 359e484b35bSopenharmony_ci return; 360e484b35bSopenharmony_ci } 361e484b35bSopenharmony_ci if (typeof handler !== 'function') { 362e484b35bSopenharmony_ci Log.debug(`Invalid parameter type: The type of 'handler' should be function, not ${typeof handler}.`); 363e484b35bSopenharmony_ci return; 364e484b35bSopenharmony_ci } 365e484b35bSopenharmony_ci const events = this.__vmEvents; 366e484b35bSopenharmony_ci const handlerList = events[type] || []; 367e484b35bSopenharmony_ci handlerList.push(handler); 368e484b35bSopenharmony_ci events[type] = handlerList; 369e484b35bSopenharmony_ci if (type === 'hook:onReady' && this.__ready) { 370e484b35bSopenharmony_ci this.$emit('hook:onReady'); 371e484b35bSopenharmony_ci } 372e484b35bSopenharmony_ci } 373e484b35bSopenharmony_ci 374e484b35bSopenharmony_ci /** 375e484b35bSopenharmony_ci * Remove the event listener. 376e484b35bSopenharmony_ci * @param {string} type - Type. 377e484b35bSopenharmony_ci * @param {Function} handler - To remove. 378e484b35bSopenharmony_ci */ 379e484b35bSopenharmony_ci public $off(type: string, handler: Function): void { 380e484b35bSopenharmony_ci if (typeof type !== 'string') { 381e484b35bSopenharmony_ci Log.warn(`Invalid parameter type: The type of 'type' should be string, not ${typeof type}.`); 382e484b35bSopenharmony_ci return; 383e484b35bSopenharmony_ci } 384e484b35bSopenharmony_ci if (typeof handler !== 'function') { 385e484b35bSopenharmony_ci Log.warn(`Invalid parameter type: The type of 'handler' should be function, not ${typeof handler}.`); 386e484b35bSopenharmony_ci return; 387e484b35bSopenharmony_ci } 388e484b35bSopenharmony_ci const events = this.__vmEvents; 389e484b35bSopenharmony_ci if (!handler) { 390e484b35bSopenharmony_ci delete events[type]; 391e484b35bSopenharmony_ci return; 392e484b35bSopenharmony_ci } 393e484b35bSopenharmony_ci const handlerList = events[type]; 394e484b35bSopenharmony_ci if (!handlerList) { 395e484b35bSopenharmony_ci return; 396e484b35bSopenharmony_ci } 397e484b35bSopenharmony_ci removeItem(handlerList, handler); 398e484b35bSopenharmony_ci } 399e484b35bSopenharmony_ci 400e484b35bSopenharmony_ci /** 401e484b35bSopenharmony_ci * Execution element.fireEvent Method. 402e484b35bSopenharmony_ci * @param {string} type - Type. 403e484b35bSopenharmony_ci * @param {Object} data - needed for Evt. 404e484b35bSopenharmony_ci * @param {string} id - Element id. 405e484b35bSopenharmony_ci */ 406e484b35bSopenharmony_ci public $emitElement(type: string, data: object, id: string): void { 407e484b35bSopenharmony_ci if (typeof type !== 'string') { 408e484b35bSopenharmony_ci Log.warn(`Invalid parameter type: The type of 'type' should be string, not ${typeof type}.`); 409e484b35bSopenharmony_ci return; 410e484b35bSopenharmony_ci } 411e484b35bSopenharmony_ci if (typeof id !== 'string') { 412e484b35bSopenharmony_ci Log.warn(`Invalid parameter type: The type of 'id' should be string, not ${typeof id}.`); 413e484b35bSopenharmony_ci return; 414e484b35bSopenharmony_ci } 415e484b35bSopenharmony_ci const info = this._ids[id]; 416e484b35bSopenharmony_ci if (info) { 417e484b35bSopenharmony_ci const element = info.el; 418e484b35bSopenharmony_ci const evt = new Evt(type, data); 419e484b35bSopenharmony_ci element.fireEvent(type, evt, false); 420e484b35bSopenharmony_ci } else { 421e484b35bSopenharmony_ci Log.warn('The id is invalid, id = ' + id); 422e484b35bSopenharmony_ci } 423e484b35bSopenharmony_ci } 424e484b35bSopenharmony_ci 425e484b35bSopenharmony_ci /** 426e484b35bSopenharmony_ci * Watch a calc function and callback if the calc value changes. 427e484b35bSopenharmony_ci * @param {string} data - Data that needed. 428e484b35bSopenharmony_ci * @param {Function | string} callback - Callback function. 429e484b35bSopenharmony_ci */ 430e484b35bSopenharmony_ci public $watch(data: string, callback: ((...args: any) => any) | string): void { 431e484b35bSopenharmony_ci if (typeof data !== 'string') { 432e484b35bSopenharmony_ci Log.warn(`Invalid parameter type: The type of 'data' should be string, not ${typeof data}.`); 433e484b35bSopenharmony_ci return; 434e484b35bSopenharmony_ci } 435e484b35bSopenharmony_ci if (typeof callback !== 'function' && typeof callback !== 'string') { 436e484b35bSopenharmony_ci Log.warn(`Invalid parameter type: The type of 'callback' should be function or string, not ${typeof callback}.`); 437e484b35bSopenharmony_ci return; 438e484b35bSopenharmony_ci } 439e484b35bSopenharmony_ci watch(this, data, callback); 440e484b35bSopenharmony_ci } 441e484b35bSopenharmony_ci 442e484b35bSopenharmony_ci /** 443e484b35bSopenharmony_ci * Set a property on an object. 444e484b35bSopenharmony_ci * @param {string} key - Get value by key. 445e484b35bSopenharmony_ci * @param {*} value - Property 446e484b35bSopenharmony_ci */ 447e484b35bSopenharmony_ci public $set(key: string, value: any): void { 448e484b35bSopenharmony_ci if (typeof key !== 'string') { 449e484b35bSopenharmony_ci Log.warn(`Invalid parameter type: The type of 'key' should be string, not ${typeof key}.`); 450e484b35bSopenharmony_ci return; 451e484b35bSopenharmony_ci } 452e484b35bSopenharmony_ci if (key.indexOf('.') !== -1) { 453e484b35bSopenharmony_ci _proxySet(this._data, key, value); 454e484b35bSopenharmony_ci } 455e484b35bSopenharmony_ci set(this._data, key, value); 456e484b35bSopenharmony_ci } 457e484b35bSopenharmony_ci 458e484b35bSopenharmony_ci /** 459e484b35bSopenharmony_ci * Delete a property and trigger change. 460e484b35bSopenharmony_ci * @param {string} key - Get by key. 461e484b35bSopenharmony_ci */ 462e484b35bSopenharmony_ci public $delete(key: string): void { 463e484b35bSopenharmony_ci if (typeof key !== 'string') { 464e484b35bSopenharmony_ci Log.warn(`Invalid parameter type: The type of 'key' should be string, not ${typeof key}.`); 465e484b35bSopenharmony_ci return; 466e484b35bSopenharmony_ci } 467e484b35bSopenharmony_ci del(this._data, key); 468e484b35bSopenharmony_ci } 469e484b35bSopenharmony_ci 470e484b35bSopenharmony_ci /** 471e484b35bSopenharmony_ci * Delete Vm object. 472e484b35bSopenharmony_ci */ 473e484b35bSopenharmony_ci public destroy(): void { 474e484b35bSopenharmony_ci Log.debug(`[JS Framework] "onDestroy" lifecycle in Vm(${this.__type})`); 475e484b35bSopenharmony_ci this.$emit('hook:onDestroy'); 476e484b35bSopenharmony_ci this.$emit('hook:onDetached'); 477e484b35bSopenharmony_ci fireNodeDetached(this.__rootEl); 478e484b35bSopenharmony_ci this.__valid = false; 479e484b35bSopenharmony_ci 480e484b35bSopenharmony_ci delete this.__app; 481e484b35bSopenharmony_ci delete this.__computed; 482e484b35bSopenharmony_ci delete this.__css; 483e484b35bSopenharmony_ci delete this.__data; 484e484b35bSopenharmony_ci delete this.__ids; 485e484b35bSopenharmony_ci delete this.__vmOptions; 486e484b35bSopenharmony_ci delete this.__parent; 487e484b35bSopenharmony_ci delete this.__parentEl; 488e484b35bSopenharmony_ci delete this.__rootEl; 489e484b35bSopenharmony_ci delete this.$refs; 490e484b35bSopenharmony_ci 491e484b35bSopenharmony_ci // Destroy child vms recursively. 492e484b35bSopenharmony_ci if (this.__childrenVms) { 493e484b35bSopenharmony_ci let vmCount: number = this.__childrenVms.length; 494e484b35bSopenharmony_ci while (vmCount--) { 495e484b35bSopenharmony_ci this.destroy.call(this.__childrenVms[vmCount], this.__childrenVms[vmCount]); 496e484b35bSopenharmony_ci } 497e484b35bSopenharmony_ci delete this.__childrenVms; 498e484b35bSopenharmony_ci } 499e484b35bSopenharmony_ci delete this.__type; 500e484b35bSopenharmony_ci delete this.__vmEvents; 501e484b35bSopenharmony_ci } 502e484b35bSopenharmony_ci 503e484b35bSopenharmony_ci /** 504e484b35bSopenharmony_ci * $t function. 505e484b35bSopenharmony_ci * @param {string} key - Key. 506e484b35bSopenharmony_ci * @return {string} - Key. 507e484b35bSopenharmony_ci */ 508e484b35bSopenharmony_ci public $t(key: string): string { 509e484b35bSopenharmony_ci return key; 510e484b35bSopenharmony_ci } 511e484b35bSopenharmony_ci 512e484b35bSopenharmony_ci /** 513e484b35bSopenharmony_ci * $tc function. 514e484b35bSopenharmony_ci * @param {string} key - Key. 515e484b35bSopenharmony_ci * @return {string} - Key. 516e484b35bSopenharmony_ci */ 517e484b35bSopenharmony_ci public $tc(key: string): string { 518e484b35bSopenharmony_ci return key; 519e484b35bSopenharmony_ci } 520e484b35bSopenharmony_ci 521e484b35bSopenharmony_ci /** 522e484b35bSopenharmony_ci * $r function. 523e484b35bSopenharmony_ci * @param {string} key - Key. 524e484b35bSopenharmony_ci * @return {string} - Key. 525e484b35bSopenharmony_ci */ 526e484b35bSopenharmony_ci public $r(key: string): string { 527e484b35bSopenharmony_ci return key; 528e484b35bSopenharmony_ci } 529e484b35bSopenharmony_ci 530e484b35bSopenharmony_ci /** 531e484b35bSopenharmony_ci * Methods of this Vm. 532e484b35bSopenharmony_ci * @type {Object} 533e484b35bSopenharmony_ci * @readonly 534e484b35bSopenharmony_ci */ 535e484b35bSopenharmony_ci public get _methods() { 536e484b35bSopenharmony_ci return this.__methods; 537e484b35bSopenharmony_ci } 538e484b35bSopenharmony_ci 539e484b35bSopenharmony_ci public $getCounterMapping(key: string): number { 540e484b35bSopenharmony_ci return this.__counterMapping.get(key); 541e484b35bSopenharmony_ci } 542e484b35bSopenharmony_ci 543e484b35bSopenharmony_ci public $setCounterMapping(key: string, value: number) { 544e484b35bSopenharmony_ci this.__counterMapping.set(key, value); 545e484b35bSopenharmony_ci } 546e484b35bSopenharmony_ci 547e484b35bSopenharmony_ci public get _counterMapping() { 548e484b35bSopenharmony_ci return this.__counterMapping; 549e484b35bSopenharmony_ci } 550e484b35bSopenharmony_ci 551e484b35bSopenharmony_ci /** 552e484b35bSopenharmony_ci * Type of this Vm. 553e484b35bSopenharmony_ci * @type {string} 554e484b35bSopenharmony_ci * @readonly 555e484b35bSopenharmony_ci */ 556e484b35bSopenharmony_ci public get _type() { 557e484b35bSopenharmony_ci return this.__type; 558e484b35bSopenharmony_ci } 559e484b35bSopenharmony_ci 560e484b35bSopenharmony_ci public set _type(newType: string) { 561e484b35bSopenharmony_ci this.__type = newType; 562e484b35bSopenharmony_ci } 563e484b35bSopenharmony_ci 564e484b35bSopenharmony_ci /** 565e484b35bSopenharmony_ci * Css of this Vm. 566e484b35bSopenharmony_ci * @type {[key: string]: any} 567e484b35bSopenharmony_ci * @readonly 568e484b35bSopenharmony_ci */ 569e484b35bSopenharmony_ci public get _css() { 570e484b35bSopenharmony_ci return this.__css; 571e484b35bSopenharmony_ci } 572e484b35bSopenharmony_ci 573e484b35bSopenharmony_ci /** 574e484b35bSopenharmony_ci * Options of this Vm. 575e484b35bSopenharmony_ci * @type {VmOptions} 576e484b35bSopenharmony_ci */ 577e484b35bSopenharmony_ci public get _vmOptions() { 578e484b35bSopenharmony_ci return this.__vmOptions; 579e484b35bSopenharmony_ci } 580e484b35bSopenharmony_ci 581e484b35bSopenharmony_ci public set _vmOptions(newOptions: VmOptions) { 582e484b35bSopenharmony_ci this.__vmOptions = newOptions; 583e484b35bSopenharmony_ci } 584e484b35bSopenharmony_ci 585e484b35bSopenharmony_ci /** 586e484b35bSopenharmony_ci * Parent of this Vm. 587e484b35bSopenharmony_ci * @type {Vm} 588e484b35bSopenharmony_ci * @readonly 589e484b35bSopenharmony_ci */ 590e484b35bSopenharmony_ci public get _parent() { 591e484b35bSopenharmony_ci return this.__parent; 592e484b35bSopenharmony_ci } 593e484b35bSopenharmony_ci 594e484b35bSopenharmony_ci /** 595e484b35bSopenharmony_ci * RealParent of this Vm. 596e484b35bSopenharmony_ci * @type {Vm} 597e484b35bSopenharmony_ci */ 598e484b35bSopenharmony_ci public get _realParent() { 599e484b35bSopenharmony_ci return this.__realParent; 600e484b35bSopenharmony_ci } 601e484b35bSopenharmony_ci 602e484b35bSopenharmony_ci public set _realParent(realParent: Vm) { 603e484b35bSopenharmony_ci this.__realParent = realParent; 604e484b35bSopenharmony_ci } 605e484b35bSopenharmony_ci 606e484b35bSopenharmony_ci /** 607e484b35bSopenharmony_ci * Computed of this Vm. 608e484b35bSopenharmony_ci * @type {ComputedInterface} 609e484b35bSopenharmony_ci */ 610e484b35bSopenharmony_ci public get computed() { 611e484b35bSopenharmony_ci return this.__computed; 612e484b35bSopenharmony_ci } 613e484b35bSopenharmony_ci 614e484b35bSopenharmony_ci public set computed(newComputed: ComputedInterface) { 615e484b35bSopenharmony_ci this.__computed = newComputed; 616e484b35bSopenharmony_ci } 617e484b35bSopenharmony_ci 618e484b35bSopenharmony_ci /** 619e484b35bSopenharmony_ci * Selector of this Vm. 620e484b35bSopenharmony_ci * @type {Object} 621e484b35bSopenharmony_ci * @readonly 622e484b35bSopenharmony_ci */ 623e484b35bSopenharmony_ci public get _selector() { 624e484b35bSopenharmony_ci return this.__selector; 625e484b35bSopenharmony_ci } 626e484b35bSopenharmony_ci 627e484b35bSopenharmony_ci /** 628e484b35bSopenharmony_ci * ParentEl of this Vm. 629e484b35bSopenharmony_ci * @type {FragBlockInterface | Element} 630e484b35bSopenharmony_ci */ 631e484b35bSopenharmony_ci public get _parentEl() { 632e484b35bSopenharmony_ci return this.__parentEl; 633e484b35bSopenharmony_ci } 634e484b35bSopenharmony_ci 635e484b35bSopenharmony_ci public set _parentEl(newParentEl: FragBlockInterface | Element) { 636e484b35bSopenharmony_ci this.__parentEl = newParentEl; 637e484b35bSopenharmony_ci } 638e484b35bSopenharmony_ci 639e484b35bSopenharmony_ci /** 640e484b35bSopenharmony_ci * App of this Vm. 641e484b35bSopenharmony_ci * @type {Page} 642e484b35bSopenharmony_ci */ 643e484b35bSopenharmony_ci public get _app() { 644e484b35bSopenharmony_ci return this.__app; 645e484b35bSopenharmony_ci } 646e484b35bSopenharmony_ci 647e484b35bSopenharmony_ci public set _app(newApp: Page) { 648e484b35bSopenharmony_ci this.__app = newApp; 649e484b35bSopenharmony_ci } 650e484b35bSopenharmony_ci 651e484b35bSopenharmony_ci /** 652e484b35bSopenharmony_ci * ShareData of this Vm. 653e484b35bSopenharmony_ci * @type {*} 654e484b35bSopenharmony_ci */ 655e484b35bSopenharmony_ci public get _shareData() { 656e484b35bSopenharmony_ci return this.__shareData; 657e484b35bSopenharmony_ci } 658e484b35bSopenharmony_ci 659e484b35bSopenharmony_ci public set _shareData(newShareData: object) { 660e484b35bSopenharmony_ci this.__shareData = newShareData; 661e484b35bSopenharmony_ci } 662e484b35bSopenharmony_ci 663e484b35bSopenharmony_ci /** 664e484b35bSopenharmony_ci * Data of this Vm. 665e484b35bSopenharmony_ci * @type {*} 666e484b35bSopenharmony_ci */ 667e484b35bSopenharmony_ci public get _data() { 668e484b35bSopenharmony_ci return this.__data; 669e484b35bSopenharmony_ci } 670e484b35bSopenharmony_ci 671e484b35bSopenharmony_ci public set _data(newData: any) { 672e484b35bSopenharmony_ci this.__data = newData; 673e484b35bSopenharmony_ci } 674e484b35bSopenharmony_ci 675e484b35bSopenharmony_ci /** 676e484b35bSopenharmony_ci * Props of this Vm. 677e484b35bSopenharmony_ci * @type {Props} 678e484b35bSopenharmony_ci * @readonly 679e484b35bSopenharmony_ci */ 680e484b35bSopenharmony_ci public get _props() { 681e484b35bSopenharmony_ci return this.__props; 682e484b35bSopenharmony_ci } 683e484b35bSopenharmony_ci 684e484b35bSopenharmony_ci /** 685e484b35bSopenharmony_ci * Init of this Vm. 686e484b35bSopenharmony_ci * @type {boolean} 687e484b35bSopenharmony_ci */ 688e484b35bSopenharmony_ci public get _init() { 689e484b35bSopenharmony_ci return this.__init; 690e484b35bSopenharmony_ci } 691e484b35bSopenharmony_ci 692e484b35bSopenharmony_ci public set _init(newInit: boolean) { 693e484b35bSopenharmony_ci this.__init = newInit; 694e484b35bSopenharmony_ci } 695e484b35bSopenharmony_ci 696e484b35bSopenharmony_ci /** 697e484b35bSopenharmony_ci * Valid of this Vm. 698e484b35bSopenharmony_ci * @type {boolean} 699e484b35bSopenharmony_ci * @readonly 700e484b35bSopenharmony_ci */ 701e484b35bSopenharmony_ci public get _valid() { 702e484b35bSopenharmony_ci return this.__valid; 703e484b35bSopenharmony_ci } 704e484b35bSopenharmony_ci 705e484b35bSopenharmony_ci /** 706e484b35bSopenharmony_ci * Visible of this Vm. 707e484b35bSopenharmony_ci * @type {boolean} 708e484b35bSopenharmony_ci */ 709e484b35bSopenharmony_ci public get _visible() { 710e484b35bSopenharmony_ci return this.__visible; 711e484b35bSopenharmony_ci } 712e484b35bSopenharmony_ci 713e484b35bSopenharmony_ci public set _visible(newVisible) { 714e484b35bSopenharmony_ci this.__visible = newVisible; 715e484b35bSopenharmony_ci } 716e484b35bSopenharmony_ci 717e484b35bSopenharmony_ci /** 718e484b35bSopenharmony_ci * Ready of this Vm. 719e484b35bSopenharmony_ci * @type {boolean} 720e484b35bSopenharmony_ci */ 721e484b35bSopenharmony_ci public get _ready() { 722e484b35bSopenharmony_ci return this.__ready; 723e484b35bSopenharmony_ci } 724e484b35bSopenharmony_ci 725e484b35bSopenharmony_ci public set _ready(newReady: boolean) { 726e484b35bSopenharmony_ci this.__ready = newReady; 727e484b35bSopenharmony_ci } 728e484b35bSopenharmony_ci 729e484b35bSopenharmony_ci /** 730e484b35bSopenharmony_ci * RootEl of this Vm. 731e484b35bSopenharmony_ci * @type {Element} 732e484b35bSopenharmony_ci */ 733e484b35bSopenharmony_ci public get _rootEl() { 734e484b35bSopenharmony_ci return this.__rootEl; 735e484b35bSopenharmony_ci } 736e484b35bSopenharmony_ci 737e484b35bSopenharmony_ci public set _rootEl(newRootEl: Element) { 738e484b35bSopenharmony_ci this.__rootEl = newRootEl; 739e484b35bSopenharmony_ci } 740e484b35bSopenharmony_ci 741e484b35bSopenharmony_ci /** 742e484b35bSopenharmony_ci * Ids of this Vm. 743e484b35bSopenharmony_ci * @type {{[key: string]: { vm: Vm, el: Element}}} 744e484b35bSopenharmony_ci * @readonly 745e484b35bSopenharmony_ci */ 746e484b35bSopenharmony_ci public get _ids() { 747e484b35bSopenharmony_ci return this.__ids; 748e484b35bSopenharmony_ci } 749e484b35bSopenharmony_ci 750e484b35bSopenharmony_ci /** 751e484b35bSopenharmony_ci * VmEvents of this Vm. 752e484b35bSopenharmony_ci * @type {Object} 753e484b35bSopenharmony_ci * @readonly 754e484b35bSopenharmony_ci */ 755e484b35bSopenharmony_ci public get _vmEvents() { 756e484b35bSopenharmony_ci return this.__vmEvents; 757e484b35bSopenharmony_ci } 758e484b35bSopenharmony_ci 759e484b35bSopenharmony_ci /** 760e484b35bSopenharmony_ci * children of vm. 761e484b35bSopenharmony_ci * @return {Array} - children of Vm. 762e484b35bSopenharmony_ci */ 763e484b35bSopenharmony_ci public get _childrenVms() { 764e484b35bSopenharmony_ci return this.__childrenVms; 765e484b35bSopenharmony_ci } 766e484b35bSopenharmony_ci 767e484b35bSopenharmony_ci /** 768e484b35bSopenharmony_ci * ExternalBinding of this Vm. 769e484b35bSopenharmony_ci * @type {ExternalBinding} 770e484b35bSopenharmony_ci */ 771e484b35bSopenharmony_ci public get _externalBinding() { 772e484b35bSopenharmony_ci return this.__externalBinding; 773e484b35bSopenharmony_ci } 774e484b35bSopenharmony_ci 775e484b35bSopenharmony_ci public set _externalBinding(newExternalBinding: ExternalBindingInterface) { 776e484b35bSopenharmony_ci this.__externalBinding = newExternalBinding; 777e484b35bSopenharmony_ci } 778e484b35bSopenharmony_ci 779e484b35bSopenharmony_ci /** 780e484b35bSopenharmony_ci * Descriptor of this Vm. 781e484b35bSopenharmony_ci * @type {string} 782e484b35bSopenharmony_ci * @readonly 783e484b35bSopenharmony_ci */ 784e484b35bSopenharmony_ci public get _descriptor() { 785e484b35bSopenharmony_ci return this.__descriptor; 786e484b35bSopenharmony_ci } 787e484b35bSopenharmony_ci 788e484b35bSopenharmony_ci /** 789e484b35bSopenharmony_ci * IsHide of this Vm. 790e484b35bSopenharmony_ci * @type {boolean} 791e484b35bSopenharmony_ci */ 792e484b35bSopenharmony_ci public get _isHide() { 793e484b35bSopenharmony_ci return this.__isHide; 794e484b35bSopenharmony_ci } 795e484b35bSopenharmony_ci 796e484b35bSopenharmony_ci public set _isHide(newIsHide: boolean) { 797e484b35bSopenharmony_ci this.__isHide = newIsHide; 798e484b35bSopenharmony_ci } 799e484b35bSopenharmony_ci 800e484b35bSopenharmony_ci /** 801e484b35bSopenharmony_ci * MediaStatus of this Vm. 802e484b35bSopenharmony_ci * @type {MediaStatusInterface<string, boolean>} 803e484b35bSopenharmony_ci */ 804e484b35bSopenharmony_ci public get _mediaStatus() { 805e484b35bSopenharmony_ci return this.__mediaStatus; 806e484b35bSopenharmony_ci } 807e484b35bSopenharmony_ci 808e484b35bSopenharmony_ci public set _mediaStatus(newMediaStatus: Partial<MediaStatusInterface<string, boolean>>) { 809e484b35bSopenharmony_ci this.__mediaStatus = newMediaStatus; 810e484b35bSopenharmony_ci } 811e484b35bSopenharmony_ci 812e484b35bSopenharmony_ci /** 813e484b35bSopenharmony_ci * slotContext of this Vm. 814e484b35bSopenharmony_ci * @type { content: Record<string, any>, parentVm: Vm } 815e484b35bSopenharmony_ci */ 816e484b35bSopenharmony_ci public get _slotContext() { 817e484b35bSopenharmony_ci return this.__slotContext; 818e484b35bSopenharmony_ci } 819e484b35bSopenharmony_ci 820e484b35bSopenharmony_ci public set _slotContext(newMSoltContext: { content: Record<string, any>, parentVm: Vm }) { 821e484b35bSopenharmony_ci this.__slotContext = newMSoltContext; 822e484b35bSopenharmony_ci } 823e484b35bSopenharmony_ci} 824e484b35bSopenharmony_ci 825e484b35bSopenharmony_ci/** 826e484b35bSopenharmony_ci * Set proxy. 827e484b35bSopenharmony_ci * @param {Object} data - Data that needed. 828e484b35bSopenharmony_ci * @param {string} key - Get prop by key. 829e484b35bSopenharmony_ci * @param {*} value - Property. 830e484b35bSopenharmony_ci */ 831e484b35bSopenharmony_cifunction _proxySet(data: object, key: string, value: any): void { 832e484b35bSopenharmony_ci let tempObj = data; 833e484b35bSopenharmony_ci const keys = key.split('.'); 834e484b35bSopenharmony_ci const len = keys.length; 835e484b35bSopenharmony_ci for (let i = 0; i < len; i++) { 836e484b35bSopenharmony_ci const prop = keys[i]; 837e484b35bSopenharmony_ci if (i === len - 1) { 838e484b35bSopenharmony_ci set(tempObj, prop, value); 839e484b35bSopenharmony_ci tempObj = null; 840e484b35bSopenharmony_ci break; 841e484b35bSopenharmony_ci } 842e484b35bSopenharmony_ci if (tempObj[prop] === null || typeof tempObj[prop] !== 'object' && typeof tempObj[prop] !== 'function') { 843e484b35bSopenharmony_ci Log.warn(`Force define property '${prop}' of '${JSON.stringify(tempObj)}' with value '{}', ` 844e484b35bSopenharmony_ci + `old value is '${tempObj[prop]}'.`); 845e484b35bSopenharmony_ci set(tempObj, prop, {}); 846e484b35bSopenharmony_ci } 847e484b35bSopenharmony_ci tempObj = tempObj[prop]; 848e484b35bSopenharmony_ci } 849e484b35bSopenharmony_ci} 850e484b35bSopenharmony_ci 851e484b35bSopenharmony_ci/** 852e484b35bSopenharmony_ci * Control data access. 853e484b35bSopenharmony_ci * @param {Vm} vm - Vm object. 854e484b35bSopenharmony_ci * @param {Object} mergedData - Merged data. 855e484b35bSopenharmony_ci * @param {boolean} external - If has external data. 856e484b35bSopenharmony_ci */ 857e484b35bSopenharmony_cifunction dataAccessControl(vm: any, mergedData: object, external: boolean): void { 858e484b35bSopenharmony_ci if (vm._descriptor && Object.keys(vm._descriptor).length !== 0) { 859e484b35bSopenharmony_ci const keys = Object.keys(mergedData); 860e484b35bSopenharmony_ci keys.forEach(key => { 861e484b35bSopenharmony_ci const desc = vm._descriptor[key]; 862e484b35bSopenharmony_ci if (!desc || desc.access === 'private' || external && desc.access === 'protected') { 863e484b35bSopenharmony_ci Log.error(`(${key}) can not modify`); 864e484b35bSopenharmony_ci delete mergedData[key]; 865e484b35bSopenharmony_ci } 866e484b35bSopenharmony_ci }); 867e484b35bSopenharmony_ci } 868e484b35bSopenharmony_ci} 869e484b35bSopenharmony_ci 870e484b35bSopenharmony_ci/** 871e484b35bSopenharmony_ci * Get root Vm. 872e484b35bSopenharmony_ci * @param {Vm} vm - Vm object. 873e484b35bSopenharmony_ci * @return {Vm} Root vm. 874e484b35bSopenharmony_ci */ 875e484b35bSopenharmony_cifunction getRoot(vm: any): Vm { 876e484b35bSopenharmony_ci const parent = vm._parent; 877e484b35bSopenharmony_ci if (!parent) { 878e484b35bSopenharmony_ci return vm; 879e484b35bSopenharmony_ci } 880e484b35bSopenharmony_ci if (parent.__rootVm) { 881e484b35bSopenharmony_ci return vm; 882e484b35bSopenharmony_ci } 883e484b35bSopenharmony_ci return getRoot(parent); 884e484b35bSopenharmony_ci} 885e484b35bSopenharmony_ci 886e484b35bSopenharmony_ci/** 887e484b35bSopenharmony_ci * order node and fire detached event. 888e484b35bSopenharmony_ci * @param {Element} el - Element object. 889e484b35bSopenharmony_ci */ 890e484b35bSopenharmony_cifunction fireNodeDetached(el: Element) { 891e484b35bSopenharmony_ci if (!el) { 892e484b35bSopenharmony_ci return; 893e484b35bSopenharmony_ci } 894e484b35bSopenharmony_ci if (el.event && el.event['detached']) { 895e484b35bSopenharmony_ci el.fireEvent('detached', {}); 896e484b35bSopenharmony_ci } 897e484b35bSopenharmony_ci if (el.children && el.children.length !== 0) { 898e484b35bSopenharmony_ci for (const child of el.children) { 899e484b35bSopenharmony_ci fireNodeDetached(child as Element); 900e484b35bSopenharmony_ci } 901e484b35bSopenharmony_ci } 902e484b35bSopenharmony_ci} 903