<template>
<#if ctrl.render??>
    ${ctrl.render.code}
<#else>
    <div class='app-dr-bar<#if ctrl.getPSSysCss?? && ctrl.getPSSysCss()??><#assign singleCss = ctrl.getPSSysCss()> ${singleCss.getCssName()}</#if>' :style="{ width: <#noparse>`${width}px`</#noparse> }">
        <el-menu
            :mode="menuDir"
            :default-openeds="defaultOpeneds"
            :default-active="selection ? selection.id : ''"
            @select="onSelect"
            @open="onOpen"
            @close="onClose">
            <app-sider-menus :menus="items"></app-sider-menus>
        </el-menu>
    </div>
</#if>
</template>
<#ibizinclude>
../@MACRO/CONTROL/CONTROL_HEADER-BASE.vue.ftl
</#ibizinclude>

<#ibizinclude>
../@MACRO/FUNC/MACRO.ftl
</#ibizinclude>

    /**
     * 菜单方向

     * @type {('horizontal' | 'vertical')}
     * @memberof ${srfclassname('${ctrl.codeName}')}Base
     */
    @Prop({ default: 'vertical' }) public menuDir?: 'horizontal' | 'vertical';

    /**
     * 获取多项数据
     *
     * @returns {any[]}
     * @memberof ${srfclassname('${ctrl.codeName}')}Base
     */
    public getDatas(): any[] {
        return this.items;
    }

    /**
     * 获取单项树
     *
     * @returns {*}
     * @memberof ${srfclassname('${ctrl.codeName}')}Base
     */
    public getData(): any {
        return this.selection;
    }

    /**
     * 加载行为
     *
     * @type {string}
     * @memberof ${srfclassname('${ctrl.codeName}')}Base
     */
    @Prop() public loadAction?: string;

    /**
     *  表单数据
     *
     * @type {*}
     * @memberof ${srfclassname('${ctrl.codeName}')}Base
     */
    public formData: any = {};

    /**
     * 数据选中项
     *
     * @type {*}
     * @memberof ${srfclassname('${ctrl.codeName}')}Base
     */
    public selection: any = {};

    /**
     * 关系栏数据项
     *
     * @type {any[]}
     * @memberof ${srfclassname('${ctrl.codeName}')}Base
     */
    public items: any[] = [
<#if ctrl.getPSDEDRBarGroups?? && ctrl.getPSDEDRBarGroups()??>
    <#list ctrl.getPSDEDRBarGroups() as group>
        {
            text: '${group.getCaption()}',
            id: '<#if group.getId?? && group.getId()??>${group.getId()}</#if>',
            name: '<#if group.getId?? && group.getId()??>${group.getId()}</#if>',
            codeName: '<#if group.getId?? && group.getId()??>${group.getId()}</#if>',
            hidden: <#if group.isHidden?? && group.isHidden()>true<#else>false</#if>,
            <#if group.getPSDEDRBarItems?? && group.getPSDEDRBarItems()??>
            items: [
                <#list group.getPSDEDRBarItems() as drItem>
                {
                    text: "${drItem.getCaption()}",
                    disabled: false,
                    id: "${drItem.getName()?lower_case}",
                    <#if drItem.getPSSysImage()??>
                    iconcls: '${drItem.getPSSysImage().getCssClass()}',
                    icon: '${drItem.getPSSysImage().getImagePath()}',
                    </#if>
                    <#if drItem.getPSDEDRBarGroup?? && drItem.getPSDEDRBarGroup()??>
                    groupCodeName: '<#if drItem.getPSDEDRBarGroup().getId?? && drItem.getPSDEDRBarGroup().getId()??>${drItem.getPSDEDRBarGroup().getId()}</#if>',
                    </#if>
                    <#if drItem.getPSAppView?? && drItem.getPSAppView()??>
                    navView: '${srffilepath2(drItem.getPSAppView().codeName)}',
                    </#if>
                    localContext:<#if drItem.getPSNavigateContexts?? && drItem.getPSNavigateContexts()??><@getNavigateContext drItem /><#else>null</#if>,
                    localViewParam:<#if drItem.getPSNavigateParams?? && drItem.getPSNavigateParams()??><@getNavigateParams drItem /><#else>null</#if>
                },
                </#list>
            ]
            </#if>
        },
    </#list>
</#if>
<#if ctrl.getPSDEDRCtrlItems?? && ctrl.getPSDEDRCtrlItems()??>
    <#list ctrl.getPSDEDRCtrlItems() as drItem>
        <#if !(drItem.getPSDEDRBarGroup?? && drItem.getPSDEDRBarGroup()??)>
        {
            text: "${drItem.getCaption()}",
            disabled: false,
            id: "${drItem.getName()?lower_case}",
            <#if drItem.getPSSysImage()??>
            iconcls: '${drItem.getPSSysImage().getCssClass()}',
            icon: '${drItem.getPSSysImage().getImagePath()}',
            </#if>
            <#if drItem.getPSDEDRBarGroup?? && drItem.getPSDEDRBarGroup()??>
            groupCodeName: '<#if drItem.getPSDEDRBarGroup().getId?? && drItem.getPSDEDRBarGroup().getId()??>${drItem.getPSDEDRBarGroup().getId()}</#if>',
            </#if>
            <#if drItem.getPSAppView?? && drItem.getPSAppView()??>
            navView: '${srffilepath2(drItem.getPSAppView().codeName)}',
            </#if>
            localContext:<#if drItem.getPSNavigateContexts?? && drItem.getPSNavigateContexts()??><@getNavigateContext drItem /><#else>null</#if>,
            localViewParam:<#if drItem.getPSNavigateParams?? && drItem.getPSNavigateParams()??><@getNavigateParams drItem /><#else>null</#if>
        }
        </#if>
    </#list>
</#if>
    ]

    /**
     * 默认打开项
     *
     * @type {string[]}
     * @memberof ${srfclassname('${ctrl.codeName}')}Base
     */
    public defaultOpeneds: string[] = [];

    /**
     * 父数据
     *
     * @public
     * @type {*}
     * @memberof ${srfclassname('${ctrl.codeName}')}Base
     */
    public parentData: any = {};

    /**
     * 宽度
     *
     * @type {number}
     * @memberof ${srfclassname('${ctrl.codeName}')}Base
     */
    public width: number = <#if ctrl.getWidth() gt 240><#else>240</#if>;

    /**
     * 生命周期
     *
     * @memberof ${srfclassname('${ctrl.codeName}')}Base
     */
    public created(): void {
        this.afterCreated();
    }

    /**
     * 执行created后的逻辑
     *
     *  @memberof ${srfclassname('${ctrl.codeName}')}Base
     */    
    public afterCreated(){
        if (this.viewState) {
            this.viewStateEvent = this.viewState.subscribe(({ tag, action, data }) => {
                if (!Object.is(tag, this.name)) {
                    return;
                }
                if (Object.is('state', action)) {
                    this.handleFormChange(data);
                }
                if (Object.is('change', action)) {
                    this.selection = data;
                }
            });
        }
    }

    /**
     * vue 生命周期
     *
     * @memberof ${srfclassname('${ctrl.codeName}')}Base
     */
    public destroyed() {
        this.afterDestroy();
    }

    /**
     * 执行destroyed后的逻辑
     *
     * @memberof ${srfclassname('${ctrl.codeName}')}Base
     */
    public afterDestroy() {
        if (this.viewStateEvent) {
            this.viewStateEvent.unsubscribe();
        }
        <#if destroyed_block??>
        ${destroyed_block}
        </#if>
    }

    /**
     * 处理数据
     *
     * @public
     * @param {any[]} items
     * @memberof ${srfclassname('${ctrl.codeName}')}Base
     */
    public dataProcess(items: any[]): void {
        items.forEach((_item: any) => {
            if (_item.expanded) {
                this.defaultOpeneds.push(_item.id);
            }

            _item.disabled = false;
            if (_item.items && Array.isArray(_item.items) && _item.items.length > 0) {
                this.dataProcess(_item.items);
            }
        });
    }

    /**
     * 获取子项
     *
     * @param {any[]} items
     * @param {string} id
     * @returns {*}
     * @memberof ${srfclassname('${ctrl.codeName}')}Base
     */
    public getItem(items: any[], id: string): any {
        const item: any = {};
        items.some((_item: any) => {
            if (Object.is(_item.id, id)) {
                Object.assign(item, _item);
                return true;
            }
            if (_item.items && _item.items.length > 0) {
                const subItem = this.getItem(_item.items, id);
                if (Object.keys(subItem).length > 0) {
                    Object.assign(item, subItem);
                    return true;
                }
            }
            return false;
        });
        return item;
    }

    /**
     * 节点选中
     *
     * @param {*} $event
     * @memberof ${srfclassname('${ctrl.codeName}')}Base
     */
    public onSelect(key: string): void {
        if (key === this.selection.id) {
            return;
        }
        const selectItem = this.getItem(this.items, key);
        if (!selectItem) {
            return;
        }
        const tempContext = Util.deepCopy(this.context);
        const tempViewParams = Util.deepCopy(this.viewparams);
        if (selectItem.localContext && Object.keys(selectItem.localContext).length > 0) {
            const _context: any = this.$util.computedNavData(this.formData, tempContext, tempViewParams, selectItem.localContext);
            Object.assign(tempContext, _context);
        }
        if (this.formData.srfparentkey) {
           Object.assign(tempContext, { srfparentkey: this.formData.srfparentkey });
           Object.assign(tempViewParams, { srfparentkey: this.formData.srfparentkey });
        }
        if (selectItem.localViewParam && Object.keys(selectItem.localViewParam).length > 0) {
            const _params: any = this.$util.computedNavData(this.formData, tempContext, tempViewParams, selectItem.localViewParam);
            Object.assign(tempViewParams, _params);
        }
        if (this.formData.srfparentdename) {
            Object.assign(tempContext, { srfparentdename: this.formData.srfparentdename });
            Object.assign(tempViewParams, { srfparentdename: this.formData.srfparentdename });
        }
        const drItem = {
            id: selectItem.id,
            navView: selectItem.navView,
            srfnavdata: {
                context: tempContext,
                viewparams: tempViewParams
            }
        }
        this.$emit('selectionchange', drItem);
    }

    /**
     * 处理表单变化
     *
     * @param {*} $event
     * @memberof ${srfclassname('${ctrl.codeName}')}Base
     */
    public handleFormChange(args: any) {
        if (args && Object.is(args.srfuf, '1')) {
            this.setDisabled(this.items, false);
        } else {
            this.setDisabled(this.items, true);
        }
        this.formData = args;
    }

    /**
     * 子节点打开
     *
     * @param {*} $event
     * @memberof ${srfclassname('${ctrl.codeName}')}Base
     */
    public onOpen($event: any): void {
        const item = this.getItem(this.items, $event);
        if (Object.is(item.id, this.selection.id)) {
            return;
        }
        this.selection = {};
        Object.assign(this.selection, item);
        if (Object.is(item.id, 'form') || (item.viewname && !Object.is(item.viewname, ''))) {
            this.$emit('selectionchange', [this.selection]);
        }
    }

    /**
     * 子节点关闭
     *
     * @param {*} $event
     * @memberof ${srfclassname('${ctrl.codeName}')}Base
     */
    public onClose($event: any): void {
        const item = this.getItem(this.items, $event);
        if (Object.is(item.id, this.selection.id)) {
            return;
        }
        this.selection = {};
        Object.assign(this.selection, item);
        if (Object.is(item.id, 'form') || (item.viewname && !Object.is(item.viewname, ''))) {
            this.$emit('selectionchange', [this.selection]);
        }
    }

    /**
     * 设置禁用状态
     *
     * @memberof ${srfclassname('${ctrl.codeName}')}Base
     */
    public setDisabled(items: any[], state: boolean) {
        items.forEach((item: any) => {
            item.disabled = state;
            if (item && item.items && item.items.length > 0) {
                this.setDisabled(item.items, state);
            }
        })
    }

<#ibizinclude>
../@MACRO/CONTROL/CONTROL_BOTTOM-BASE.vue.ftl
</#ibizinclude>

<#ibizinclude>
../@MACRO/CONTROL/CONTROL-BASE.style.ftl
</#ibizinclude>