import { Emit, Prop, Watch } from 'vue-property-decorator'; import { Util } from 'ibiz-core'; import { MobTabExpPanelControlBase } from '../../../widgets'; import { IPSDETabViewPanel } from '@ibiz/dynamic-model-api'; /** * 分页导航栏部件基类 * * @export * @class AppMobTabExpPanelBase * @extends {MobTabExpPanelControlBase} */ export class AppMobTabExpPanelBase extends MobTabExpPanelControlBase { /** * 部件动态参数 * * @memberof AppMobTabExpPanelBase */ @Prop() public declare dynamicProps: any; /** * 部件静态参数 * * @memberof AppMobTabExpPanelBase */ @Prop() public declare staticProps: any; /** * 监听部件动态参数变化 * * @param {*} newVal * @param {*} oldVal * @memberof AppMobTabExpPanelBase */ @Watch('dynamicProps', { immediate: true, }) public onDynamicPropsChange(newVal: any, oldVal: any) { if (newVal && !Util.isFieldsSame(newVal, oldVal)) { super.onDynamicPropsChange(newVal, oldVal); } } /** * 监听部件静态参数变化 * * @param {*} newVal * @param {*} oldVal * @memberof AppMobTabExpPanelBase */ @Watch('staticProps', { immediate: true, }) public onStaticPropsChange(newVal: any, oldVal: any) { if (newVal && !Util.isFieldsSame(newVal, oldVal)) { super.onStaticPropsChange(newVal, oldVal); } } /** * 销毁视图回调 * * @memberof AppMobTabExpPanelBase */ public destroyed() { this.ctrlDestroyed(); } /** * 部件事件 * * @param {{ controlname: string; action: string; data: any }} { controlname 部件名称, action 事件名称, data 事件参数 } * @memberof AppMobTabExpPanelBase */ @Emit('ctrl-event') public ctrlEvent({ controlname, action, data }: { controlname: string; action: string; data: any }): void { } /** * 绘制分页视图 * * @param {IPSDETabViewPanel} modelJson * @return {*} * @memberof AppMobTabExpPanelBase */ public renderTabViewPanel(modelJson: IPSDETabViewPanel) { let { targetCtrlName, targetCtrlParam, targetCtrlEvent } = this.computeTargetCtrlData(modelJson); return this.$createElement(targetCtrlName, { props: targetCtrlParam, ref: modelJson.name, on: targetCtrlEvent }) } /** * 绘制视图头部 * * @returns * @memberof MobTabExpPanelControlBase */ public readerViewHeadersSegment() { const segment = this.controlInstance.getPSControls() as IPSDETabViewPanel[]; return ( <ion-toolbar class="app-control-tabexppanel__header__toolbar"> <ion-segment class="toolbar__segment" ref="segment" value={this.activeTabViewPanel} on-ionChange={($event: any) => { this.tabExpPanelChange($event) }}> { segment?.map((item: IPSDETabViewPanel) => { let viewPanelCount: any = undefined; if (item?.counterId) { const targetCounterService: any = Util.findElementByField(this.counterServiceArray, 'id', item.getPSAppCounterRef()?.id)?.service; viewPanelCount = targetCounterService?.counterData?.[item.counterId.toLowerCase()] } return <ion-segment-button class={{'toolbar__segment__item':true}} value={item.name} layout="icon-start"> {item?.getPSSysImage()?.cssClass ? <app-mob-icon name={item.getPSSysImage()?.cssClass}></app-mob-icon> : null} {this.$tl(item.getCapPSLanguageRes()?.lanResTag, item.caption)} {viewPanelCount ? viewPanelCount > 99 ? <div class="toolbar__segment__item__count" color="danger">99+</div> : <div class="toolbar__segment__item__count" color="danger">{viewPanelCount}</div> : null} </ion-segment-button> }) } </ion-segment> </ion-toolbar> ) } /** * 绘制内容 * * @returns * @memberof AppMobTabExpPanelBase */ public render(): any { if (!this.controlIsLoaded) { return null; } const { controlClassNames } = this.renderOptions; const allControls = this.controlInstance.getPSControls() as IPSDETabViewPanel[]; return ( <div class={{ ...controlClassNames }}> <div class="control-header app-control-tabexppanel__header"> { this.readerViewHeadersSegment() } </div> <div class="control-content app-control-tabexppanel__content"> {allControls.map((item: IPSDETabViewPanel) => { return this.renderTabViewPanel(item); })} </div> </div> ) } }