提交 c46c93eb 编写于 作者: Mosher's avatar Mosher

update:更新导航视图

上级 f0e5cc64
...@@ -21,8 +21,9 @@ ...@@ -21,8 +21,9 @@
</#if> </#if>
<#if ctrl.isEnableSearch()> <#if ctrl.isEnableSearch()>
<div class='search-container'> <div class='search-container'>
<i-input :search="true" <i-input
@on-change="($event) => { this.searchText = $event.target.value; }" v-model="searchText"
:search="true"
:placeholder="placeholder" :placeholder="placeholder"
@on-search="onSearch"> @on-search="onSearch">
</i-input> </i-input>
...@@ -462,7 +463,7 @@ import ${srfclassname('${appCounter.getCodeName()}')}CounterService from '@/co ...@@ -462,7 +463,7 @@ import ${srfclassname('${appCounter.getCodeName()}')}CounterService from '@/co
</#if> </#if>
if (this.navigateContext && Object.keys(this.navigateContext).length > 0) { if (this.navigateContext && Object.keys(this.navigateContext).length > 0) {
let _context:any = this.$util.computedNavData(arg, tempContext, tempViewParam, this.navigateContext); let _context:any = this.$util.computedNavData(arg, tempContext, tempViewParam, this.navigateContext);
Object.assign(tempContext, _context); Object.assign(tempContext,_context);
} }
if (this.navigateParams && Object.keys(this.navigateParams).length > 0) { if (this.navigateParams && Object.keys(this.navigateParams).length > 0) {
let _params:any = this.$util.computedNavData(arg, tempContext, tempViewParam, this.navigateParams); let _params:any = this.$util.computedNavData(arg, tempContext, tempViewParam, this.navigateParams);
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
<#if ctrl.render??> <#if ctrl.render??>
${ctrl.render.code} ${ctrl.render.code}
<#else> <#else>
<split id="${ctrl.getCodeName()?lower_case}" class="app-dataview-exp-bar<#if ctrl.getPSSysCss()??><#assign singleCss = ctrl.getPSSysCss()> ${singleCss.getCssName()}</#if>" v-model="split" mode="<#if view.getSideBarLayout()?? && view.getSideBarLayout() == "LEFT">horizontal<#else>vertical</#if>" @on-move-end="onSplitChange"> <div id="${ctrl.getCodeName()?lower_case}" class="app-dataview-exp-bar<#if ctrl.getPSSysCss()??><#assign singleCss = ctrl.getPSSysCss()> ${singleCss.getCssName()}</#if>">
<div slot='<#if view.getSideBarLayout()?? && view.getSideBarLayout() == "LEFT">left<#else>top</#if>'> <div slot='<#if view.getSideBarLayout()?? && view.getSideBarLayout() == "LEFT">left<#else>top</#if>'>
<#if ctrl.isShowTitleBar()> <#if ctrl.isShowTitleBar()>
<div class='dataview-exp-bar-header'> <div class='dataview-exp-bar-header'>
...@@ -11,23 +11,24 @@ ...@@ -11,23 +11,24 @@
</div> </div>
</div> </div>
</#if> </#if>
<div class="container-header"> <div class="exp-bar-action-container">
<#if view.isEnableQuickGroup()> <#if view.isEnableQuickGroup()>
<#if view.getPSSysCounterRef?? && view.getPSSysCounterRef()?? && view.getPSSysCounterRef().getPSAppCounter()??> <#if view.getPSSysCounterRef?? && view.getPSSysCounterRef()?? && view.getPSSysCounterRef().getPSAppCounter()??>
<#assign appCounter = view.getPSSysCounterRef().getPSAppCounter() /> <#assign appCounter = view.getPSSysCounterRef().getPSAppCounter() />
</#if> </#if>
<div class="quick-group-container"> <div class="quick-group-container">
<app-quick-group :items="quickGroupModel" <#if appCounter??>:counterService="${appCounter.getCodeName()?lower_case}counterservice"</#if> @valuechange="quickGroupValueChange"></app-quick-group> <app-quick-group :items="quickGroupModel" <#if appCounter??>:counterService="${appCounter.getCodeName()?lower_case}counterservice"</#if> @valuechange="quickGroupValueChange"></app-quick-group>
</div> </div>
</#if> </#if>
<#if ctrl.isEnableSearch()> <#if ctrl.isEnableSearch()>
<div class='search-container'> <div class='search-container'>
<i-input :search="true" <i-input
@on-change="($event) => { this.searchText = $event.target.value; }" v-model="searchText"
:placeholder="placeholder" :search="true"
@on-search="onSearch"> :placeholder="placeholder"
</i-input> @on-search="onSearch">
</div> </i-input>
</div>
</#if> </#if>
<#if ctrl.getPSControls()??> <#if ctrl.getPSControls()??>
<#assign controls = ctrl.getPSControls()/> <#assign controls = ctrl.getPSControls()/>
...@@ -38,29 +39,19 @@ ...@@ -38,29 +39,19 @@
</#list> </#list>
</#if> </#if>
</div> </div>
<div class='<#if ctrl.isShowTitleBar()>dataview-exp-bar-content<#else>dataview-exp-bar-content2</#if>'>
<#if ctrl.getPSControls()??>
<#assign controls = ctrl.getPSControls()/>
<#list controls as singleControl>
<#if singleControl.getControlType() == "DATAVIEW">
${P.getCtrlCode(singleControl, 'CONTROL.html').code}
</#if>
</#list>
</#if>
</div>
</div> </div>
<div slot='<#if view.getSideBarLayout()?? && view.getSideBarLayout() == "LEFT">right<#else>bottom</#if>'> <div class='dataview-exp-bar-content'>
<component <#if ctrl.getPSControls()??>
v-if="selection.view && !Object.is(this.selection.view.viewname, '')" <#assign controls = ctrl.getPSControls()/>
:is="selection.view.viewname" <#list controls as singleControl>
class="viewcontainer2" <#if singleControl.getControlType() == "DATAVIEW">
:viewDefaultUsage="false" ${P.getCtrlCode(singleControl, 'CONTROL.html').code}
:viewdata="JSON.stringify(selection.context)" </#if>
:viewparam="JSON.stringify(selection.viewparam)"> </#list>
</component> </#if>
</div> </div>
</split> </div>
</#if> </#if>
</template> </template>
<#assign import_block> <#assign import_block>
...@@ -131,31 +122,6 @@ import ${srfclassname('${appCounter.getCodeName()}')}CounterService from '@/co ...@@ -131,31 +122,6 @@ import ${srfclassname('${appCounter.getCodeName()}')}CounterService from '@/co
public ${appCounter.getCodeName()?lower_case}counterservice: ${srfclassname('${appCounter.getCodeName()}')}CounterService = new ${srfclassname('${appCounter.getCodeName()}')}CounterService({ context:this.context,viewparams:this.viewparams }); public ${appCounter.getCodeName()?lower_case}counterservice: ${srfclassname('${appCounter.getCodeName()}')}CounterService = new ${srfclassname('${appCounter.getCodeName()}')}CounterService({ context:this.context,viewparams:this.viewparams });
</#if> </#if>
/**
* 呈现模式,可选值:horizontal或者vertical
*
* @public
* @type {(string)}
* @memberof ${srfclassname('${ctrl.codeName}')}Base
*/
public showMode:string ="<#if view.getSideBarLayout()?? && view.getSideBarLayout() == "LEFT">horizontal<#else>vertical</#if>";
/**
* 控件宽度
*
* @type {number}
* @memberof ${srfclassname('${ctrl.codeName}')}Base
*/
public ctrlWidth:number = <#if ctrl.getWidth()??>${ctrl.getWidth()?c}<#else>0</#if>;
/**
* 控件高度
*
* @type {number}
* @memberof ${srfclassname('${ctrl.codeName}')}Base
*/
public ctrlHeight: number = <#if ctrl.getHeight()??>${ctrl.getHeight()?c}<#else>0</#if>;
/** /**
* 可搜索字段名称 * 可搜索字段名称
* *
...@@ -163,7 +129,7 @@ import ${srfclassname('${appCounter.getCodeName()}')}CounterService from '@/co ...@@ -163,7 +129,7 @@ import ${srfclassname('${appCounter.getCodeName()}')}CounterService from '@/co
* @type {(string)} * @type {(string)}
* @memberof ${srfclassname('${ctrl.codeName}')}Base * @memberof ${srfclassname('${ctrl.codeName}')}Base
*/ */
public placeholder="<@getQuickSearchPlaceholder ctrl />"; public placeholder = "<@getQuickSearchPlaceholder ctrl />";
/** /**
* 搜素值 * 搜素值
...@@ -172,15 +138,7 @@ import ${srfclassname('${appCounter.getCodeName()}')}CounterService from '@/co ...@@ -172,15 +138,7 @@ import ${srfclassname('${appCounter.getCodeName()}')}CounterService from '@/co
* @type {(string)} * @type {(string)}
* @memberof ${srfclassname('${ctrl.codeName}')}Base * @memberof ${srfclassname('${ctrl.codeName}')}Base
*/ */
public searchText:string = ""; public searchText: string = "";
/**
* 分割宽度
*
* @type {number}
* @memberof ${srfclassname('${ctrl.codeName}')}Base
*/
public split: number = 0.5;
<#if ctrl.getXDataPSControl()??> <#if ctrl.getXDataPSControl()??>
<#assign xDataControl = ctrl.getXDataPSControl() /> <#assign xDataControl = ctrl.getXDataPSControl() />
...@@ -382,32 +340,13 @@ import ${srfclassname('${appCounter.getCodeName()}')}CounterService from '@/co ...@@ -382,32 +340,13 @@ import ${srfclassname('${appCounter.getCodeName()}')}CounterService from '@/co
return null; return null;
} }
/**
* 选中数据
*
* @type {*}
* @memberof ${srfclassname('${ctrl.codeName}')}Base
*/
public selection: any = {};
/**
* split值变化事件
*
* @memberof ${srfclassname('${ctrl.codeName}')}Base
*/
public onSplitChange() {
if(this.split){
this.$store.commit("setViewSplit",{viewUID:this.viewUID,viewSplit:this.split});
}
}
/** /**
* Vue声明周期(组件初始化完毕) * Vue声明周期(组件初始化完毕)
* *
* @memberof ${srfclassname('${ctrl.codeName}')}Base * @memberof ${srfclassname('${ctrl.codeName}')}Base
*/ */
public created() { public created() {
this.afterCreated(); this.afterCreated();
} }
/** /**
...@@ -446,24 +385,7 @@ import ${srfclassname('${appCounter.getCodeName()}')}CounterService from '@/co ...@@ -446,24 +385,7 @@ import ${srfclassname('${appCounter.getCodeName()}')}CounterService from '@/co
* *
* @memberof ${srfclassname('${ctrl.codeName}')}Base * @memberof ${srfclassname('${ctrl.codeName}')}Base
*/ */
public afterMounted(){ public afterMounted() { }
if(this.$store.getters.getViewSplit(this.viewUID)){
this.split = this.$store.getters.getViewSplit(this.viewUID);
}else{
let containerWidth:number = (document.getElementById("${ctrl.getCodeName()?lower_case}") as any).offsetWidth;
let containerHeight:number = (document.getElementById("${ctrl.getCodeName()?lower_case}") as any).offsetHeight;
if(Object.is(this.showMode,'horizontal')){
if(this.ctrlWidth && containerWidth != 0){
this.split = this.ctrlWidth/containerWidth;
}
}else{
if(this.ctrlHeight && containerHeight != 0){
this.split = this.ctrlHeight/containerHeight;
}
}
this.$store.commit("setViewSplit",{viewUID:this.viewUID,viewSplit:this.split});
}
}
/** /**
* vue 生命周期 * vue 生命周期
...@@ -545,10 +467,16 @@ import ${srfclassname('${appCounter.getCodeName()}')}CounterService from '@/co ...@@ -545,10 +467,16 @@ import ${srfclassname('${appCounter.getCodeName()}')}CounterService from '@/co
let _params:any = this.$util.computedNavData(arg,tempContext,tempViewParam,this.navigateParams); let _params:any = this.$util.computedNavData(arg,tempContext,tempViewParam,this.navigateParams);
Object.assign(tempViewParam,_params); Object.assign(tempViewParam,_params);
} }
this.selection = {}; const navItem: any = {
Object.assign(this.selection, { view: { viewname: this.navViewName },context:tempContext,viewparam:tempViewParam}); navView: this.navViewName,
data: args,
srfnavdata: {
context: tempContext,
viewparams: tempViewParam
}
}
this.calcToolbarItemState(false); this.calcToolbarItemState(false);
this.$forceUpdate(); this.$emit('selectionchange', navItem);
} }
/** /**
......
.app-dataview-exp-bar { .app-dataview-exp-bar {
> .ivu-split-horizontal { height: 100%;
> .ivu-split-trigger-con { display: flex;
height: 100%; flex-direction: column;
width: 1px; .dataview-exp-bar-header {
} line-height: 50px;
> .ivu-split-pane { border-bottom: 1px solid #ddd;
> div { .dataview-exp-bar-title {
height: 100%; font-size: 18px;
overflow: auto; padding-left: 8px;
display: flex; i {
flex-direction: column; font-size: 20px;
.dataview-exp-bar-header { margin-top: -2px;
line-height: 50px; }
border-bottom: 1px solid #ddd; }
.dataview-exp-bar-title { }
font-size: 18px; .exp-bar-action-container {
padding-left: 8px; display: flex;
i { align-items: center;
font-size: 20px; }
margin-top: -2px; .container-header{
} display: flex;
} justify-content: flex-start;
} align-items: center;
.container-header{ flex-wrap: wrap;
display: flex; .search-container {
justify-content: flex-start; width: 30%;
align-items: center; height: 48px;
flex-wrap: wrap; padding: 10px 10px 10px 0;
.quick-group-container { min-width: 200px;
padding-top: 8px; max-width: 400px;
padding-right: 20px; }
} .toolbar-container{
.search-container { padding: 4px;
width: 30%; }
height: 48px; .quick-group-container {
padding: 10px 10px 10px 0; padding-top: 8px;
min-width: 200px; padding-right: 20px;
max-width: 400px; }
} }
.toolbar-container{ .dataview-exp-bar-content {
padding: 4px; flex-grow: 1;
display: flex; overflow: auto;
flex-wrap: wrap; }
align-items: center; }
}
} <#ibizinclude>
.dataview-exp-bar-content { ../@MACRO/CSS/DEFAULT.less.ftl
<#-- 计算高度 -->
<#if ctrl.isShowTitleBar() && ctrl.isEnableSearch()>
height: calc(100% - 88px);
<#elseif ctrl.isShowTitleBar() && !ctrl.isEnableSearch()>
height: calc(100% - 40px);
<#elseif !ctrl.isShowTitleBar() && ctrl.isEnableSearch()>
height: calc(100% - 38px);
<#else>
height: 100%;
</#if>
overflow: auto;
padding: 16px 0;
margin-bottom: 10px;
}
.dataview-exp-bar-content2 {
height: 100%;
overflow: auto;
flex-grow: 1;
}
}
}
> .right-pane.ivu-split-pane {
> div {
padding-left: 10px;
}
}
> .left-pane.ivu-split-pane {
padding-right: 10px;
}
}
> .ivu-split-vertical{
> .ivu-split-pane {
> div {
height: 100%;
.dataview-exp-bar-header {
line-height: 50px;
border-bottom: 1px solid #ddd;
.dataview-exp-bar-title {
font-size: 18px;
padding-left: 8px;
i {
font-size: 20px;
margin-top: -2px;
}
}
}
.container-header{
display: flex;
justify-content: flex-start;
align-items: center;
flex-wrap: wrap;
.search-container {
width: 30%;
height: 48px;
padding: 10px 10px 10px 0;
min-width: 200px;
max-width: 400px;
}
.toolbar-container{
padding: 4px;
}
.quick-group-container{
padding-top: 8px;
padding-right: 20px;
}
}
.dataview-exp-bar-content {
<#-- 计算高度 -->
<#if ctrl.isShowTitleBar() && ctrl.isEnableSearch()>
height: calc(100% - 88px);
<#elseif ctrl.isShowTitleBar() && !ctrl.isEnableSearch()>
height: calc(100% - 40px);
<#elseif !ctrl.isShowTitleBar() && ctrl.isEnableSearch()>
height: calc(100% - 38px);
<#else>
height: 100%;
</#if>
overflow: auto;
margin-bottom: 10px;
}
.dataview-exp-bar-content2 {
height: 100%;
overflow: auto;
flex-grow: 1;
}
}
}
> .top-pane.ivu-split-pane {
> div {
padding-bottom: 10px;
}
}
> .bottom-pane.ivu-split-pane {
padding-top: 10px;
}
}
}
<#ibizinclude>
../@MACRO/CSS/DEFAULT.less.ftl
</#ibizinclude> </#ibizinclude>
\ No newline at end of file
<template> <template>
<#if ctrl.render??> <#if ctrl.render??>
${ctrl.render.code} ${ctrl.render.code}
<#else> <#else>
<split id="${ctrl.getCodeName()?lower_case}" class="app-calendar-exp-bar<#if ctrl.getPSSysCss?? && ctrl.getPSSysCss()??><#assign singleCss = ctrl.getPSSysCss()> ${singleCss.getCssName()}</#if>" v-model="split" mode="<#if view.getSideBarLayout()?? && view.getSideBarLayout() == "LEFT">horizontal<#else>vertical</#if>" @on-move-end="onSplitChange"> <div id="${ctrl.getCodeName()?lower_case}" class="app-calendar-exp-bar<#if ctrl.getPSSysCss?? && ctrl.getPSSysCss()??><#assign singleCss = ctrl.getPSSysCss()> ${singleCss.getCssName()}</#if>">
<div slot='<#if view.getSideBarLayout()?? && view.getSideBarLayout() == "LEFT">left<#else>top</#if>'> <#if ctrl.isShowTitleBar()>
<#if ctrl.isShowTitleBar()> <div class='calendar-exp-bar-header'>
<div class='calendar-exp-bar-header'> <div class="calendar-exp-bar-title">
<div class="calendar-exp-bar-title"> <icon type='ios-home-outline'/><#if ctrl.getTitle() == ''>{{ $t('app.calendarExpBar.title') }}<#else>${ctrl.getTitle()}</#if>
<icon type='ios-home-outline'/><#if ctrl.getTitle() == ''>{{ $t('app.calendarExpBar.title') }}<#else>${ctrl.getTitle()}</#if> </div>
</div> </div>
</div> </#if>
</#if> <div class="exp-bar-action-container">
<div class="container-header"> <#if ctrl.isEnableSearch()>
<#if ctrl.isEnableSearch()> <div class='search-container'>
<div class='search-container'> <i-input
<i-input :search="true" v-model="searchText"
@on-change="($event) => { this.searchText = $event.target.value; }" :search="true"
:placeholder="placeholder" :placeholder="placeholder"
@on-search="onSearch"> @on-search="onSearch">
</i-input> </i-input>
</div> </div>
</#if> </#if>
<#if ctrl.getPSControls()??> <#if ctrl.getPSControls()??>
<#assign controls = ctrl.getPSControls()/> <#assign controls = ctrl.getPSControls()/>
<#list controls as singleControl> <#list controls as singleControl>
<#if singleControl.getControlType() == "TOOLBAR"> <#if singleControl.getControlType() == "TOOLBAR">
${P.getCtrlCode(singleControl, 'CONTROL.html').code} ${P.getCtrlCode(singleControl, 'CONTROL.html').code}
</#if> </#if>
</#list> </#list>
</#if> </#if>
</div> </div>
<div class='<#if ctrl.isShowTitleBar()>calendar-exp-bar-content<#else>calendar-exp-bar-content2</#if>'> <div class='calendar-exp-bar-content'>
<#if ctrl.getPSControls()??> <#if ctrl.getPSControls()??>
<#assign controls = ctrl.getPSControls()/> <#assign controls = ctrl.getPSControls()/>
<#list controls as singleControl> <#list controls as singleControl>
<#if singleControl.getControlType() == "CALENDAR"> <#if singleControl.getControlType() == "CALENDAR">
${P.getCtrlCode(singleControl, 'CONTROL.html').code} ${P.getCtrlCode(singleControl, 'CONTROL.html').code}
</#if> </#if>
</#list> </#list>
</#if> </#if>
</div> </div>
</div> </div>
<div slot='<#if view.getSideBarLayout()?? && view.getSideBarLayout() == "LEFT">right<#else>bottom</#if>'> </#if>
<component </template>
v-if="selection.view && !Object.is(this.selection.view.viewname, '')"
:is="selection.view.viewname"
class="viewcontainer2" <#ibizinclude>
:viewDefaultUsage="false" ../@MACRO/CONTROL/CONTROL_HEADER-BASE.vue.ftl
:viewdata="JSON.stringify(selection.context)" </#ibizinclude>
:viewparam="JSON.stringify(selection.viewparam)">
</component> <#ibizinclude>
</div> ../@MACRO/FUNC/MACRO.ftl
</split> </#ibizinclude>
</#if>
</template> /**
* 视图唯一标识
*
<#ibizinclude> * @type {boolean}
../@MACRO/CONTROL/CONTROL_HEADER-BASE.vue.ftl * @memberof ${srfclassname('${ctrl.codeName}')}Base
</#ibizinclude> */
@Prop() public viewUID!:string;
<#ibizinclude>
../@MACRO/FUNC/MACRO.ftl <#if view.getPSAppViewLogics?? && view.getPSAppViewLogics()??>
</#ibizinclude> <#list view.getPSAppViewLogics() as logic>
<#if logic.getPFLogicCodeType() == 'APP_NEWDATA'>
/** /**
* 视图唯一标识 * 打开新建数据视图
* *
* @type {boolean} * @type {any}
* @memberof ${srfclassname('${ctrl.codeName}')}Base * @memberof ${srfclassname('${ctrl.codeName}')}Base
*/ */
@Prop() public viewUID!:string; @Prop() public newdata: any;
</#if>
<#if view.getPSAppViewLogics?? && view.getPSAppViewLogics()??> <#if logic.getPFLogicCodeType() == 'APP_OPENDATA'>
<#list view.getPSAppViewLogics() as logic> /**
<#if logic.getPFLogicCodeType() == 'APP_NEWDATA'> * 打开编辑数据视图
/** *
* 打开新建数据视图 * @type {any}
* * @memberof ${srfclassname('${ctrl.codeName}')}Base
* @type {any} */
* @memberof ${srfclassname('${ctrl.codeName}')}Base @Prop() public opendata: any;
*/ </#if>
@Prop() public newdata: any; </#list>
</#if> </#if>
<#if logic.getPFLogicCodeType() == 'APP_OPENDATA'>
/** /**
* 打开编辑数据视图 * 是否单选
* *
* @type {any} * @public
* @memberof ${srfclassname('${ctrl.codeName}')}Base * @type {(boolean)}
*/ * @memberof ${srfclassname('${ctrl.codeName}')}Base
@Prop() public opendata: any; */
</#if> public isSingleSelect:boolean = true;
</#list>
</#if> /**
* 可搜索字段名称
/** *
* 是否单选 *
* * @type {(string)}
* @public * @memberof ${srfclassname('${ctrl.codeName}')}Base
* @type {(boolean)} */
* @memberof ${srfclassname('${ctrl.codeName}')}Base public placeholder = "<@getQuickSearchPlaceholder ctrl />";
*/
public isSingleSelect:boolean = true; /**
* 搜素值
/** *
* 呈现模式,可选值:horizontal或者vertical * @public
* * @type {(string)}
* @public * @memberof ${srfclassname('${ctrl.codeName}')}Base
* @type {(string)} */
* @memberof ${srfclassname('${ctrl.codeName}')}Base public searchText: string = "";
*/
public showMode:string ="<#if view.getSideBarLayout()?? && view.getSideBarLayout() == "LEFT">horizontal<#else>vertical</#if>"; <#if ctrl.getXDataPSControl()??>
<#assign xDataControl = ctrl.getXDataPSControl() />
/**
* 控件宽度 /**
* * 导航视图名称
* @type {number} *
* @memberof ${srfclassname('${ctrl.codeName}')}Base * @type {string}
*/ * @memberof ${srfclassname('${ctrl.codeName}')}Base
public ctrlWidth:number = <#if ctrl.getWidth()??>${ctrl.getWidth()?c}<#else>0</#if>; */
public navViewName: any = {
/** <#if xDataControl.getPSSysCalendarItems()??>
* 控件高度 <#list xDataControl.getPSSysCalendarItems() as calendarItem>
* ${calendarItem.getItemType()}: "<#if calendarItem.getNavPSAppView?? && calendarItem.getNavPSAppView()??><#assign navPSAppView = calendarItem.getNavPSAppView() />${srffilepath2(navPSAppView.getCodeName())}</#if>"<#if calendarItem_has_next>,</#if>
* @type {number} </#list>
* @memberof ${srfclassname('${ctrl.codeName}')}Base </#if>
*/ };
public ctrlHeight: number = <#if ctrl.getHeight()??>${ctrl.getHeight()?c}<#else>0</#if>;
/**
/** * 导航参数
* 可搜索字段名称 *
* * @type {*}
* * @memberof ${srfclassname('${ctrl.codeName}')}Base
* @type {(string)} */
* @memberof ${srfclassname('${ctrl.codeName}')}Base public navParam: any = {
*/ <#if xDataControl.getPSSysCalendarItems()??>
public placeholder="<@getQuickSearchPlaceholder ctrl />"; <#list xDataControl.getPSSysCalendarItems() as calendarItem>
${calendarItem.getItemType()}: {
/** navigateContext:<#if calendarItem.getPSNavigateContexts?? && calendarItem.getPSNavigateContexts()??><@getNavigateContext calendarItem /><#else>null</#if>,
* 搜素值 navigateParams:<#if calendarItem.getPSNavigateParams?? && calendarItem.getPSNavigateParams()??><@getNavigateParams calendarItem /><#else>null</#if>
* }<#if calendarItem_has_next>,</#if>
* @public </#list>
* @type {(string)} </#if>
* @memberof ${srfclassname('${ctrl.codeName}')}Base };
*/
public searchText:string = ""; /**
* 导航过滤项
/** *
* 分割宽度 * @type {*}
* * @memberof ${srfclassname('${ctrl.codeName}')}Base
* @type {number} */
* @memberof ${srfclassname('${ctrl.codeName}')}Base public navFilter: any = {
*/ <#if xDataControl.getPSSysCalendarItems()??>
public split: number = 0.5; <#list xDataControl.getPSSysCalendarItems() as calendarItem>
${calendarItem.getItemType()}: "<#if calendarItem.getNavFilter?? && calendarItem.getNavFilter()??>${calendarItem.getNavFilter()}</#if>"<#if calendarItem_has_next>,</#if>
<#if ctrl.getXDataPSControl()??> </#list>
<#assign xDataControl = ctrl.getXDataPSControl() /> </#if>
};
/**
* 导航视图名称 /**
* * 导航关系
* @type {string} *
* @memberof ${srfclassname('${ctrl.codeName}')}Base * @type {*}
*/ * @memberof ${srfclassname('${ctrl.codeName}')}Base
public navViewName: any = { */
<#if xDataControl.getPSSysCalendarItems()??> public navPSDer: any = {
<#list xDataControl.getPSSysCalendarItems() as calendarItem> <#if xDataControl.getPSSysCalendarItems()??>
${calendarItem.getItemType()}: "<#if calendarItem.getNavPSAppView?? && calendarItem.getNavPSAppView()??><#assign navPSAppView = calendarItem.getNavPSAppView() />${srffilepath2(navPSAppView.getCodeName())}</#if>"<#if calendarItem_has_next>,</#if> <#list xDataControl.getPSSysCalendarItems() as calendarItem>
</#list> ${calendarItem.getItemType()}: "<#if calendarItem.getNavPSDER?? && calendarItem.getNavPSDER()??>n_${calendarItem.getNavPSDER().getPSPickupDEField().getCodeName()?lower_case}_eq</#if>"<#if calendarItem_has_next>,</#if>
</#if> </#list>
}; </#if>
};
/** </#if>
* 导航参数
* /**
* @type {*} * 显示处理提示
* @memberof ${srfclassname('${ctrl.codeName}')}Base *
*/ * @type {boolean}
public navParam: any = { * @memberof ${srfclassname('${ctrl.codeName}')}Base
<#if xDataControl.getPSSysCalendarItems()??> */
<#list xDataControl.getPSSysCalendarItems() as calendarItem> @Prop({ default: true }) public showBusyIndicator!: boolean;
${calendarItem.getItemType()}: {
navigateContext:<#if calendarItem.getPSNavigateContexts?? && calendarItem.getPSNavigateContexts()??><@getNavigateContext calendarItem /><#else>null</#if>, <#if ctrl.getPSControls()??>
navigateParams:<#if calendarItem.getPSNavigateParams?? && calendarItem.getPSNavigateParams()??><@getNavigateParams calendarItem /><#else>null</#if> <#assign controls = ctrl.getPSControls()/>
}<#if calendarItem_has_next>,</#if> <#list controls as singleControl>
</#list> <#if singleControl.getControlType() == "TOOLBAR">
</#if>
}; ${P.getCtrlCode(singleControl, 'CONTROL.vue').code}
</#if>
/** </#list>
* 导航过滤项 </#if>
*
* @type {*} /**
* @memberof ${srfclassname('${ctrl.codeName}')}Base * 获取多项数据
*/ *
public navFilter: any = { * @returns {any[]}
<#if xDataControl.getPSSysCalendarItems()??> * @memberof ${srfclassname('${ctrl.codeName}')}Base
<#list xDataControl.getPSSysCalendarItems() as calendarItem> */
${calendarItem.getItemType()}: "<#if calendarItem.getNavFilter?? && calendarItem.getNavFilter()??>${calendarItem.getNavFilter()}</#if>"<#if calendarItem_has_next>,</#if> public getDatas(): any[] {
</#list> return [];
</#if> }
};
/**
/** * 获取单项树
* 导航关系 *
* * @returns {*}
* @type {*} * @memberof ${srfclassname('${ctrl.codeName}')}Base
* @memberof ${srfclassname('${ctrl.codeName}')}Base */
*/ public getData(): any {
public navPSDer: any = { return null;
<#if xDataControl.getPSSysCalendarItems()??> }
<#list xDataControl.getPSSysCalendarItems() as calendarItem>
${calendarItem.getItemType()}: "<#if calendarItem.getNavPSDER?? && calendarItem.getNavPSDER()??>n_${calendarItem.getNavPSDER().getPSPickupDEField().getCodeName()?lower_case}_eq</#if>"<#if calendarItem_has_next>,</#if> /**
</#list> * Vue声明周期(组件初始化完毕)
</#if> *
}; * @memberof ${srfclassname('${ctrl.codeName}')}Base
</#if> */
public created() {
/** this.afterCreated();
* 显示处理提示 }
*
* @type {boolean} /**
* @memberof ${srfclassname('${ctrl.codeName}')}Base * 执行created后的逻辑
*/ *
@Prop({ default: true }) public showBusyIndicator!: boolean; * @memberof ${srfclassname('${ctrl.codeName}')}Base
*/
<#if ctrl.getPSControls()??> public afterCreated(){
<#assign controls = ctrl.getPSControls()/> if (this.viewState) {
<#list controls as singleControl> this.viewStateEvent = this.viewState.subscribe(({ tag, action, data }) => {
<#if singleControl.getControlType() == "TOOLBAR"> if (!Object.is(tag, this.name)) {
return;
${P.getCtrlCode(singleControl, 'CONTROL.vue').code} }
</#if> <#if ctrl.getXDataPSControl?? && ctrl.getXDataPSControl()??>
</#list> <#assign xDataControl = ctrl.getXDataPSControl() />
</#if> this.viewState.next({ tag: '${xDataControl.getName()}', action: action, data: data });
</#if>
/** });
* 获取多项数据 }
* }
* @returns {any[]}
* @memberof ${srfclassname('${ctrl.codeName}')}Base /**
*/ * Vue声明周期(组件渲染完毕)
public getDatas(): any[] { *
return []; * @memberof ${srfclassname('${ctrl.codeName}')}Base
} */
public mounted() {
/** this.afterMounted();
* 获取单项树 }
*
* @returns {*} /**
* @memberof ${srfclassname('${ctrl.codeName}')}Base * 执行mounted后的逻辑
*/ *
public getData(): any { * @memberof ${srfclassname('${ctrl.codeName}')}Base
return null; */
} public afterMounted() { }
/** /**
* 选中数据 * vue 生命周期
* *
* @type {*} * @memberof ${srfclassname('${ctrl.codeName}')}Base
* @memberof ${srfclassname('${ctrl.codeName}')}Base */
*/ public destroyed() {
public selection: any = {}; this.afterDestroy();
}
/**
* split值变化事件 /**
* * 执行destroyed后的逻辑
* @memberof ${srfclassname('${ctrl.codeName}')}Base *
*/ * @memberof ${srfclassname('${ctrl.codeName}')}Base
public onSplitChange() { */
<#if ctrl.getXDataPSControl()??> public afterDestroy() {
<#assign xDataControl = ctrl.getXDataPSControl() /> if (this.viewStateEvent) {
if(this.$refs.${xDataControl.getName()}){ this.viewStateEvent.unsubscribe();
const calendarContainer:any = this.$refs.${xDataControl.getName()}; }
if(calendarContainer.$refs.calendar){ <#if destroyed_block??>
const appCalendar: any = calendarContainer.$refs.calendar; ${destroyed_block}
const api = appCalendar.getApi(); </#if>
api.updateSize(); }
}
} /**
</#if> * 刷新
if(this.split){ *
this.$store.commit("setViewSplit",{viewUID:this.viewUID,viewSplit:this.split}); * @memberof ${srfclassname('${ctrl.codeName}')}Base
} */
} public refresh(args?: any): void {
<#if ctrl.getXDataPSControl?? && ctrl.getXDataPSControl()??>
/** <#assign dataControl = ctrl.getXDataPSControl() />
* Vue声明周期(组件初始化完毕) const refs: any = this.$refs;
* if (refs && refs.${dataControl.name}) {
* @memberof ${srfclassname('${ctrl.codeName}')}Base refs.${dataControl.name}.refresh();
*/ }
public created() { </#if>
this.afterCreated(); }
}
/**
/** * ${ctrl.name}的选中数据事件
* 执行created后的逻辑 *
* * @memberof ${srfclassname('${ctrl.codeName}')}Base
* @memberof ${srfclassname('${ctrl.codeName}')}Base */
*/ public ${ctrl.name}_selectionchange(args: any [], tag?: string, $event2?: any): void {
public afterCreated(){ let tempContext:any = {};
if (this.viewState) { let tempViewParam:any = {};
this.viewStateEvent = this.viewState.subscribe(({ tag, action, data }) => { if (args.length === 0) {
if (!Object.is(tag, this.name)) { this.calcToolbarItemState(true);
return; return ;
} }
<#if ctrl.getXDataPSControl?? && ctrl.getXDataPSControl()??> const arg:any = args[0];
<#assign xDataControl = ctrl.getXDataPSControl() /> if(this.context){
this.viewState.next({ tag: '${xDataControl.getName()}', action: action, data: data }); Object.assign(tempContext,JSON.parse(JSON.stringify(this.context)));
</#if> }
}); switch(arg.itemType) {
} <#if xDataControl?? && xDataControl.getPSSysCalendarItems()??>
} <#list xDataControl.getPSSysCalendarItems() as calendarItem>
<#if calendarItem.getPSAppDataEntity()??>
/** <#assign _appde = calendarItem.getPSAppDataEntity() />
* Vue声明周期(组件渲染完毕) case "${calendarItem.getItemType()}":
* Object.assign(tempContext,{ ${_appde.getCodeName()?lower_case} : arg.${_appde.getCodeName()?lower_case}});
* @memberof ${srfclassname('${ctrl.codeName}')}Base Object.assign(tempContext,{srfparentdename:'${_appde.getCodeName()}',srfparentkey:arg['${_appde.getCodeName()?lower_case}']});
*/ if(this.navFilter && this.navFilter['${calendarItem.getItemType()}'] && !Object.is(this.navFilter['${calendarItem.getItemType()}'],"")){
public mounted() { Object.assign(tempViewParam,{[this.navFilter['${calendarItem.getItemType()}']]:arg['${_appde.getCodeName()?lower_case}']});
this.afterMounted(); }
} if(this.navPSDer && this.navFilter['${calendarItem.getItemType()}'] && !Object.is(this.navPSDer['${calendarItem.getItemType()}'],"")){
Object.assign(tempViewParam,{[this.navPSDer['${calendarItem.getItemType()}']]:arg['${_appde.getCodeName()?lower_case}']});
/** }
* 执行mounted后的逻辑 if(this.navParam && this.navParam['${calendarItem.getItemType()}'] && this.navParam['${calendarItem.getItemType()}'].navigateContext && Object.keys(this.navParam['${calendarItem.getItemType()}'].navigateContext).length >0){
* let _context:any = this.$util.computedNavData(arg,tempContext,tempViewParam,this.navParam['${calendarItem.getItemType()}'].navigateContext);
* @memberof ${srfclassname('${ctrl.codeName}')}Base Object.assign(tempContext,_context);
*/ }
public afterMounted(){ if(this.navParam && this.navParam['${calendarItem.getItemType()}'] && this.navParam['${calendarItem.getItemType()}'].navigateParams && Object.keys(this.navParam['${calendarItem.getItemType()}'].navigateParams).length >0){
if(this.$store.getters.getViewSplit(this.viewUID)){ let _params:any = this.$util.computedNavData(arg,tempContext,tempViewParam,this.navParam['${calendarItem.getItemType()}'].navigateParams);
this.split = this.$store.getters.getViewSplit(this.viewUID); Object.assign(tempViewParam,_params);
}else{ }
let containerWidth:number = (document.getElementById("${ctrl.getCodeName()?lower_case}") as any).offsetWidth; break;
let containerHeight:number = (document.getElementById("${ctrl.getCodeName()?lower_case}") as any).offsetHeight; </#if>
if(Object.is(this.showMode,'horizontal')){ </#list>
if(this.ctrlWidth && containerWidth != 0){ </#if>
this.split = this.ctrlWidth/containerWidth; }
} const navItem: any = {
}else{ navView: this.navViewName,
if(this.ctrlHeight && containerHeight != 0){ data: args,
this.split = this.ctrlHeight/containerHeight; srfnavdata: {
} context: tempContext,
} viewparams: tempViewParam
this.$store.commit("setViewSplit",{viewUID:this.viewUID,viewSplit:this.split}); }
} }
} this.calcToolbarItemState(false);
this.$emit('selectionchange', navItem);
/** }
* vue 生命周期
* /**
* @memberof ${srfclassname('${ctrl.codeName}')}Base * ${ctrl.name}的load完成事件
*/ *
public destroyed() { * @memberof ${srfclassname('${ctrl.codeName}')}Base
this.afterDestroy(); */
} public ${ctrl.name}_load(args:any, tag?: string, $event2?: any){
this.calcToolbarItemState(true);
/** this.$emit('load',args);
* 执行destroyed后的逻辑 }
*
* @memberof ${srfclassname('${ctrl.codeName}')}Base /**
*/ * 设置导航区工具栏禁用状态
public afterDestroy() { *
if (this.viewStateEvent) { * @param {boolean} state
this.viewStateEvent.unsubscribe(); * @return {*}
} * @memberof ${srfclassname('${ctrl.codeName}')}Base
<#if destroyed_block??> */
${destroyed_block} public calcToolbarItemState(state: boolean) {
</#if> let _this: any = this;
} const models:any = _this.${ctrl.getCodeName()?lower_case}_toolbarModels;
if (models) {
/** for (const key in models) {
* 刷新 if (!models.hasOwnProperty(key)) {
* return;
* @memberof ${srfclassname('${ctrl.codeName}')}Base }
*/ const _item = models[key];
public refresh(args?: any): void { if (_item.uiaction && (Object.is(_item.uiaction.target, 'SINGLEKEY') || Object.is(_item.uiaction.target, 'MULTIKEY'))) {
<#if ctrl.getXDataPSControl?? && ctrl.getXDataPSControl()??> _item.disabled = state;
<#assign dataControl = ctrl.getXDataPSControl() /> }
const refs: any = this.$refs; _item.visabled = true;
if (refs && refs.${dataControl.name}) { if (_item.noprivdisplaymode && _item.noprivdisplaymode === 6) {
refs.${dataControl.name}.refresh(); _item.visabled = false;
} }
</#if> }
} this.calcNavigationToolbarState();
}
/** }
* ${ctrl.name}的选中数据事件
* /**
* @memberof ${srfclassname('${ctrl.codeName}')}Base * 计算导航工具栏权限状态
*/ *
public ${ctrl.name}_selectionchange(args: any [], tag?: string, $event2?: any): void { * @memberof ${srfclassname('${ctrl.codeName}')}Base
let tempContext:any = {}; */
let tempViewParam:any = {}; public calcNavigationToolbarState(){
if (args.length === 0) { let _this: any = this;
this.calcToolbarItemState(true); // 界面行为
return ; <#assign ModelsName>${ctrl.getCodeName()?lower_case}_toolbarModels</#assign>
} if(_this.${ModelsName}){
const arg:any = args[0]; <#if ctrl.getPSAppDataEntity?? && ctrl.getPSAppDataEntity()??>
if(this.context){ <#assign curAppEntity = ctrl.getPSAppDataEntity() />
Object.assign(tempContext,JSON.parse(JSON.stringify(this.context))); const curUIService:${srfclassname('${curAppEntity.getCodeName()}')}UIService = new ${srfclassname('${curAppEntity.getCodeName()}')}UIService();
} ViewTool.calcActionItemAuthState({},_this.${ModelsName},curUIService);
switch(arg.itemType) { </#if>
<#if xDataControl?? && xDataControl.getPSSysCalendarItems()??> }
<#list xDataControl.getPSSysCalendarItems() as calendarItem> }
<#if calendarItem.getPSAppDataEntity()??>
<#assign _appde = calendarItem.getPSAppDataEntity() /> /**
case "${calendarItem.getItemType()}": * 执行搜索
Object.assign(tempContext,{ ${_appde.getCodeName()?lower_case} : arg.${_appde.getCodeName()?lower_case}}); *
Object.assign(tempContext,{srfparentdename:'${_appde.getCodeName()}',srfparentkey:arg['${_appde.getCodeName()?lower_case}']}); * @memberof ${srfclassname('${ctrl.codeName}')}Base
if(this.navFilter && this.navFilter['${calendarItem.getItemType()}'] && !Object.is(this.navFilter['${calendarItem.getItemType()}'],"")){ */
Object.assign(tempViewParam,{[this.navFilter['${calendarItem.getItemType()}']]:arg['${_appde.getCodeName()?lower_case}']}); public onSearch($event:any) {
} <#if ctrl.getXDataPSControl()??>
if(this.navPSDer && this.navFilter['${calendarItem.getItemType()}'] && !Object.is(this.navPSDer['${calendarItem.getItemType()}'],"")){ <#assign xDataControl = ctrl.getXDataPSControl()/>
Object.assign(tempViewParam,{[this.navPSDer['${calendarItem.getItemType()}']]:arg['${_appde.getCodeName()?lower_case}']}); let calendar:any = this.$refs.${xDataControl.getName()};
} calendar.searchEvents({ query: this.searchText });
if(this.navParam && this.navParam['${calendarItem.getItemType()}'] && this.navParam['${calendarItem.getItemType()}'].navigateContext && Object.keys(this.navParam['${calendarItem.getItemType()}'].navigateContext).length >0){ </#if>
let _context:any = this.$util.computedNavData(arg,tempContext,tempViewParam,this.navParam['${calendarItem.getItemType()}'].navigateContext); }
Object.assign(tempContext,_context);
} <#ibizinclude>
if(this.navParam && this.navParam['${calendarItem.getItemType()}'] && this.navParam['${calendarItem.getItemType()}'].navigateParams && Object.keys(this.navParam['${calendarItem.getItemType()}'].navigateParams).length >0){ ../@MACRO/CONTROL/CONTROL_BOTTOM-BASE.vue.ftl
let _params:any = this.$util.computedNavData(arg,tempContext,tempViewParam,this.navParam['${calendarItem.getItemType()}'].navigateParams); </#ibizinclude>
Object.assign(tempViewParam,_params);
} <#ibizinclude>
break; ../@MACRO/CONTROL/CONTROL-BASE.style.ftl
</#if>
</#list>
</#if>
}
this.selection = {};
Object.assign(this.selection, { view: { viewname: this.navViewName[arg.itemType] }, context:tempContext,viewparam:tempViewParam });
this.calcToolbarItemState(false);
this.$emit('selectionchange',args);
this.$forceUpdate();
}
/**
* ${ctrl.name}的load完成事件
*
* @memberof ${srfclassname('${ctrl.codeName}')}Base
*/
public ${ctrl.name}_load(args:any, tag?: string, $event2?: any){
this.calcToolbarItemState(true);
this.$emit('load',args);
}
/**
* 设置导航区工具栏禁用状态
*
* @param {boolean} state
* @return {*}
* @memberof ${srfclassname('${ctrl.codeName}')}Base
*/
public calcToolbarItemState(state: boolean) {
let _this: any = this;
const models:any = _this.${ctrl.getCodeName()?lower_case}_toolbarModels;
if (models) {
for (const key in models) {
if (!models.hasOwnProperty(key)) {
return;
}
const _item = models[key];
if (_item.uiaction && (Object.is(_item.uiaction.target, 'SINGLEKEY') || Object.is(_item.uiaction.target, 'MULTIKEY'))) {
_item.disabled = state;
}
_item.visabled = true;
if (_item.noprivdisplaymode && _item.noprivdisplaymode === 6) {
_item.visabled = false;
}
}
this.calcNavigationToolbarState();
}
}
/**
* 计算导航工具栏权限状态
*
* @memberof ${srfclassname('${ctrl.codeName}')}Base
*/
public calcNavigationToolbarState(){
let _this: any = this;
// 界面行为
<#assign ModelsName>${ctrl.getCodeName()?lower_case}_toolbarModels</#assign>
if(_this.${ModelsName}){
<#if ctrl.getPSAppDataEntity?? && ctrl.getPSAppDataEntity()??>
<#assign curAppEntity = ctrl.getPSAppDataEntity() />
const curUIService:${srfclassname('${curAppEntity.getCodeName()}')}UIService = new ${srfclassname('${curAppEntity.getCodeName()}')}UIService();
ViewTool.calcActionItemAuthState({},_this.${ModelsName},curUIService);
</#if>
}
}
/**
* 执行搜索
*
* @memberof ${srfclassname('${ctrl.codeName}')}Base
*/
public onSearch($event:any) {
<#if ctrl.getXDataPSControl()??>
<#assign xDataControl = ctrl.getXDataPSControl()/>
let calendar:any = this.$refs.${xDataControl.getName()};
calendar.searchEvents({ query: this.searchText });
</#if>
}
<#ibizinclude>
../@MACRO/CONTROL/CONTROL_BOTTOM-BASE.vue.ftl
</#ibizinclude>
<#ibizinclude>
../@MACRO/CONTROL/CONTROL-BASE.style.ftl
</#ibizinclude> </#ibizinclude>
\ No newline at end of file
.app-calendar-exp-bar { .app-calendar-exp-bar {
> .ivu-split-horizontal { height: 100%;
> .ivu-split-trigger-con { display: flex;
height: 100%; flex-direction: column;
width: 1px; .calendar-exp-bar-header {
} line-height: 50px;
> .ivu-split-pane { border-bottom: 1px solid #ddd;
> div { .calendar-exp-bar-title {
height: 100%; font-size: 18px;
overflow: auto; padding-left: 8px;
display: flex; i {
flex-direction: column; font-size: 20px;
.calendar-exp-bar-header { margin-top: -2px;
line-height: 50px; }
border-bottom: 1px solid #ddd; }
.calendar-exp-bar-title { }
font-size: 18px; .exp-bar-action-container {
padding-left: 8px; display: flex;
i { align-items: center;
font-size: 20px; }
margin-top: -2px; .container-header{
} display: flex;
} justify-content: flex-start;
} align-items: center;
.container-header{ flex-wrap: wrap;
display: flex; .search-container {
justify-content: flex-start; width: 30%;
align-items: center; height: 48px;
flex-wrap: wrap; padding: 10px 10px 10px 0;
.quick-group-container { min-width: 200px;
padding-top: 8px; max-width: 400px;
padding-right: 20px; }
} .toolbar-container{
.search-container { padding: 4px;
width: 30%; }
height: 48px; .quick-group-container {
padding: 10px; padding-top: 8px;
min-width: 200px; padding-right: 20px;
max-width: 400px; }
} }
.toolbar-container{ .calendar-exp-bar-content {
padding: 4px; flex-grow: 1;
display: flex; overflow: auto;
flex-wrap: wrap; }
align-items: center; }
}
} <#ibizinclude>
.calendar-exp-bar-content { ../@MACRO/CSS/DEFAULT.less.ftl
<#-- 计算高度 -->
<#if ctrl.isShowTitleBar() && ctrl.isEnableSearch()>
height: calc(100% - 88px);
<#elseif ctrl.isShowTitleBar() && !ctrl.isEnableSearch()>
height: calc(100% - 40px);
<#elseif !ctrl.isShowTitleBar() && ctrl.isEnableSearch()>
height: calc(100% - 38px);
<#else>
height: 100%;
</#if>
overflow: auto;
padding: 16px 0;
margin-bottom: 10px;
}
.calendar-exp-bar-content2 {
height: 100%;
overflow: auto;
flex-grow: 1;
}
}
}
> .right-pane.ivu-split-pane {
> div {
padding-left: 10px;
}
}
> .left-pane.ivu-split-pane {
padding-right: 10px;
}
}
> .ivu-split-vertical{
> .ivu-split-pane {
> div {
height: 100%;
overflow: auto;
display: flex;
flex-direction: column;
.calendar-exp-bar-header {
line-height: 50px;
border-bottom: 1px solid #ddd;
.calendar-exp-bar-title {
font-size: 18px;
padding-left: 8px;
i {
font-size: 20px;
margin-top: -2px;
}
}
}
.container-header{
display: flex;
justify-content: flex-start;
align-items: center;
flex-wrap: wrap;
.quick-group-container {
padding-top: 8px;
padding-right: 20px;
}
.search-container {
width: 30%;
height: 48px;
padding: 10px 10px 10px 0;
min-width: 200px;
max-width: 400px;
}
.toolbar-container{
padding: 4px;
}
}
.calendar-exp-bar-content {
<#-- 计算高度 -->
<#if ctrl.isShowTitleBar() && ctrl.isEnableSearch()>
height: calc(100% - 88px);
<#elseif ctrl.isShowTitleBar() && !ctrl.isEnableSearch()>
height: calc(100% - 40px);
<#elseif !ctrl.isShowTitleBar() && ctrl.isEnableSearch()>
height: calc(100% - 38px);
<#else>
height: 100%;
</#if>
overflow: auto;
margin-bottom: 10px;
}
.calendar-exp-bar-content2 {
height: 100%;
overflow: auto;
flex-grow: 1;
}
}
}
> .top-pane.ivu-split-pane {
> div {
padding-bottom: 10px;
}
}
> .bottom-pane.ivu-split-pane {
padding-top: 10px;
}
}
}
<#ibizinclude>
../@MACRO/CSS/DEFAULT.less.ftl
</#ibizinclude> </#ibizinclude>
\ No newline at end of file
<template> <template>
<#if ctrl.render??> <#if ctrl.render??>
${ctrl.render.code} ${ctrl.render.code}
<#else> <#else>
<split id="${ctrl.getCodeName()?lower_case}" class='app-tree-exp-bar<#if ctrl.getPSSysCss?? && ctrl.getPSSysCss()??><#assign singleCss = ctrl.getPSSysCss()> ${singleCss.getCssName()}</#if>' v-model="split" mode="horizontal" @on-move-end="onSplitChange"> <div id="${ctrl.getCodeName()?lower_case}" class='app-tree-exp-bar<#if ctrl.getPSSysCss?? && ctrl.getPSSysCss()??><#assign singleCss = ctrl.getPSSysCss()> ${singleCss.getCssName()}</#if>'>
<div slot='left'> <#if ctrl.isShowTitleBar()>
<#if ctrl.isShowTitleBar()> <div class='tree-exp-bar-header'>
<div class='tree-exp-bar-header'> <div class="tree-exp-bar-title">
<div class="tree-exp-bar-title"> <icon type='ios-home-outline'/><#if ctrl.getTitle() == ''>{{ $t('app.treeExpBar.title') }}<#else>${ctrl.getTitle()}</#if>
<icon type='ios-home-outline'/><#if ctrl.getTitle() == ''>{{ $t('app.treeExpBar.title') }}<#else>${ctrl.getTitle()}</#if> </div>
</div> <#if ctrl.getPSControls()??>
<#if ctrl.getPSControls()??> <#assign controls = ctrl.getPSControls()/>
<#assign controls = ctrl.getPSControls()/> <#list controls as singleControl>
<#list controls as singleControl> <#if singleControl.getControlType() == "TOOLBAR">
<#if singleControl.getControlType() == "TOOLBAR"> ${P.getCtrlCode(singleControl, 'CONTROL.html').code}
${P.getCtrlCode(singleControl, 'CONTROL.html').code} </#if>
</#if> </#list>
</#list> </#if>
</#if> </div>
</div> </#if>
</#if> <#if ctrl.isEnableSearch()>
<#if ctrl.isEnableSearch()> <div class='search-content'>
<div class='search-content'> <i-input
<i-input :search="true" v-model="srfnodefilter"
@on-change="($event) => { this.srfnodefilter = $event.target.value; }" :search="true"
:placeholder="placeholder" :placeholder="placeholder"
@on-search="onSearch"> @on-search="onSearch">
</i-input> </i-input>
</div> </div>
</#if> </#if>
<div class='<#if ctrl.isShowTitleBar()>tree-exp-content<#else>tree-exp-content2</#if>'> <div class='tree-exp-content'>
<#if ctrl.getPSDETree()??><#t> <#if ctrl.getPSDETree()??><#t>
<#assign tree = ctrl.getPSDETree()/> <#assign tree = ctrl.getPSDETree()/>
<@ibizindent blank=12> <@ibizindent blank=12>
${P.getCtrlCode(tree, 'CONTROL.html').code} ${P.getCtrlCode(tree, 'CONTROL.html').code}
</@ibizindent> </@ibizindent>
</#if> </#if>
</div> </div>
</div> </div>
<div slot='right'> </#if>
<component </template>
v-if="selection.view && !Object.is(this.selection.view.viewname, '')" <#ibizinclude>
:is="selection.view.viewname" ../@MACRO/CONTROL/CONTROL_HEADER-BASE.vue.ftl
class="viewcontainer2" </#ibizinclude>
:viewDefaultUsage="false"
:viewdata="JSON.stringify(selection.context)" <#ibizinclude>
:viewparam="JSON.stringify(selection.viewparam)" ../@MACRO/FUNC/MACRO.ftl
@viewdataschange="onViewDatasChange" </#ibizinclude>
@drdatasaved="onDrViewDatasChange"
@drdatasremove="onDrViewDatasChange" <#if view.getPSAppViewLogics?? && view.getPSAppViewLogics()??>
@viewdatasactivated="viewDatasActivated" <#list view.getPSAppViewLogics() as logic>
@viewload="onViewLoad"> <#if logic.getPFLogicCodeType() == 'APP_NEWDATA'>
</component> /**
</div> * 打开新建数据视图
</split> *
</#if> * @type {any}
</template> * @memberof ${srfclassname('${ctrl.codeName}')}Base
<#ibizinclude> */
../@MACRO/CONTROL/CONTROL_HEADER-BASE.vue.ftl @Prop() public newdata: any;
</#ibizinclude> </#if>
<#if logic.getPFLogicCodeType() == 'APP_OPENDATA'>
<#ibizinclude> /**
../@MACRO/FUNC/MACRO.ftl * 打开编辑数据视图
</#ibizinclude> *
* @type {any}
<#if view.getPSAppViewLogics?? && view.getPSAppViewLogics()??> * @memberof ${srfclassname('${ctrl.codeName}')}Base
<#list view.getPSAppViewLogics() as logic> */
<#if logic.getPFLogicCodeType() == 'APP_NEWDATA'> @Prop() public opendata: any;
/** </#if>
* 打开新建数据视图 </#list>
* </#if>
* @type {any}
* @memberof ${srfclassname('${ctrl.codeName}')}Base /**
*/ * 视图唯一标识
@Prop() public newdata: any; *
</#if> * @type {boolean}
<#if logic.getPFLogicCodeType() == 'APP_OPENDATA'> * @memberof ${srfclassname('${ctrl.codeName}')}Base
/** */
* 打开编辑数据视图 @Prop() public viewUID!:string;
*
* @type {any} /**
* @memberof ${srfclassname('${ctrl.codeName}')}Base * 获取多项数据
*/ *
@Prop() public opendata: any; * @returns {any[]}
</#if> * @memberof ${srfclassname('${ctrl.codeName}')}Base
</#list> */
</#if> public getDatas(): any[] {
return [];
/** }
* 视图唯一标识
* /**
* @type {boolean} * 获取单项树
* @memberof ${srfclassname('${ctrl.codeName}')}Base *
*/ * @returns {*}
@Prop() public viewUID!:string; * @memberof ${srfclassname('${ctrl.codeName}')}Base
*/
/** public getData(): any {
* 获取多项数据 return {};
* }
* @returns {any[]}
* @memberof ${srfclassname('${ctrl.codeName}')}Base /**
*/ * 可搜索字段名称
public getDatas(): any[] { *
return []; *
} * @type {(string)}
* @memberof ${srfclassname('${ctrl.codeName}')}Base
/** */
* 获取单项树 public placeholder = "<@getQuickSearchPlaceholder ctrl />";
*
* @returns {*} /**
* @memberof ${srfclassname('${ctrl.codeName}')}Base * 过滤值
*/ *
public getData(): any { * @type {string}
return {}; * @memberof ${srfclassname('${ctrl.codeName}')}Base
} */
public srfnodefilter: string = '';
/**
* 选中数据 /**
* * 刷新标识
* @type {*} *
* @memberof ${srfclassname('${ctrl.codeName}')}Base * @public
*/ * @type {number}
public selection: any = {}; * @memberof ${srfclassname('${ctrl.codeName}')}Base
*/
/** public counter:number = 0;
* 控件宽度
* /**
* @type {number} * 是否加载默认关联视图
* @memberof ${srfclassname('${ctrl.codeName}')}Base *
*/ * @public
public ctrlWidth:number = <#if ctrl.getWidth()??>${ctrl.getWidth()?c}<#else>0</#if>; * @type {boolean}
* @memberof ${srfclassname('${ctrl.codeName}')}Base
/** */
* 可搜索字段名称 public istLoadDefaultRefView: boolean = false;
*
* /**
* @type {(string)} * 获取关系项视图
* @memberof ${srfclassname('${ctrl.codeName}')}Base *
*/ * @param {*} [arg={}]
public placeholder="<@getQuickSearchPlaceholder ctrl />"; * @returns {*}
* @memberof ${srfclassname('${ctrl.codeName}')}Base
/** */
* 过滤值 public getExpItemView(arg: any = {}): any {
* let expmode = arg.nodetype.toUpperCase();
* @type {string} if (!expmode) {
* @memberof ${srfclassname('${ctrl.codeName}')}Base expmode = '';
*/ }
public srfnodefilter: string = ''; <#list ctrl.getPSAppViewRefs() as item>
<#if (item.getName()?index_of("EXPITEM:")==0)>
/** <#assign refview = item.getRefPSAppView()>
* 刷新标识 if (Object.is(expmode, '${item.getName()?substring(8)?upper_case}')) {
* return {
* @public viewname: '${srffilepath2(refview.codeName)}',
* @type {number} parentdata: <#if item.getParentDataJO()??>${item.getParentDataJO()},<#else>{},</#if>
* @memberof ${srfclassname('${ctrl.codeName}')}Base <#if refview.getPSAppDataEntity?? && refview.getPSAppDataEntity()??>
*/ deKeyField:'${refview.getPSAppDataEntity().codeName?lower_case}'
public counter:number = 0; </#if>
};
/** }
* 是否加载默认关联视图 </#if>
* </#list>
* @public return null;
* @type {boolean} }
* @memberof ${srfclassname('${ctrl.codeName}')}Base
*/ /**
public istLoadDefaultRefView: boolean = false; * 树导航选中
*
/** * @param {any []} args
* 分割宽度 * @param {string} [tag]
* * @param {*} [$event2]
* @type {number} * @returns {void}
* @memberof ${srfclassname('${ctrl.codeName}')}Base * @memberof ${srfclassname('${ctrl.codeName}')}Base
*/ */
public split: number = 0.2; public ${ctrl.name}_selectionchange(args: any [], tag?: string, $event2?: any): void {
if (args.length === 0) {
/** this.calcToolbarItemState(true);
* split值变化事件 return ;
* }
* @memberof ${srfclassname('${ctrl.codeName}')}Base const arg:any = args[0];
*/ if (!arg.id) {
public onSplitChange() { this.calcToolbarItemState(true);
if(this.split){ return;
this.$store.commit("setViewSplit",{viewUID:this.viewUID,viewSplit:this.split}); }
} const nodetype = arg.id.split(';')[0];
} const refview = this.getExpItemView({ nodetype: nodetype });
if (!refview) {
/** this.calcToolbarItemState(true);
* 获取关系项视图 return;
* }
* @param {*} [arg={}] let tempViewparam:any = {};
* @returns {*} let tempContext:any ={};
* @memberof ${srfclassname('${ctrl.codeName}')}Base if(arg && arg.navfilter){
*/ this.counter += 1;
public getExpItemView(arg: any = {}): any { Object.defineProperty(tempViewparam, arg.navfilter, {
let expmode = arg.nodetype.toUpperCase(); value : arg.srfkey,
if (!expmode) { writable : true,
expmode = ''; enumerable : true,
} configurable : true
<#list ctrl.getPSAppViewRefs() as item> })
<#if (item.getName()?index_of("EXPITEM:")==0)> Object.assign(tempContext,{srfcounter:this.counter});
<#assign refview = item.getRefPSAppView()> }
if (Object.is(expmode, '${item.getName()?substring(8)?upper_case}')) { Object.assign(tempContext,JSON.parse(JSON.stringify(this.context)));
return { if(arg.srfappctx){
viewname: '${srffilepath2(refview.codeName)}', Object.assign(tempContext,JSON.parse(JSON.stringify(arg.srfappctx)));
parentdata: <#if item.getParentDataJO()??>${item.getParentDataJO()},<#else>{},</#if> }
<#if refview.getPSAppDataEntity?? && refview.getPSAppDataEntity()??> // 计算导航上下文
deKeyField:'${refview.getPSAppDataEntity().codeName?lower_case}' if(arg && arg.navigateContext && Object.keys(arg.navigateContext).length >0){
</#if> let tempData:any = arg.curData?JSON.parse(JSON.stringify(arg.curData)):{};
}; Object.assign(tempData,arg);
} let _context = this.$util.computedNavData(tempData,tempContext,tempViewparam,arg.navigateContext);
</#if> Object.assign(tempContext,_context);
</#list> }
return null; if(arg.srfparentdename){
} Object.assign(tempContext,{srfparentdename:arg.srfparentdename});
}
/** if(arg.srfparentkey){
* 树导航选中 Object.assign(tempContext,{srfparentkey:arg.srfparentkey});
* }
* @param {any []} args // 计算导航参数
* @param {string} [tag] if(arg && arg.navigateParams && Object.keys(arg.navigateParams).length >0){
* @param {*} [$event2] let tempData:any = arg.curData?JSON.parse(JSON.stringify(arg.curData)):{};
* @returns {void} Object.assign(tempData,arg);
* @memberof ${srfclassname('${ctrl.codeName}')}Base let _params = this.$util.computedNavData(tempData,tempContext,tempViewparam,arg.navigateParams);
*/ Object.assign(tempViewparam,_params);
public ${ctrl.name}_selectionchange(args: any [], tag?: string, $event2?: any): void { this.counter += 1;
if (args.length === 0) { Object.assign(tempContext,{srfcounter:this.counter});
this.calcToolbarItemState(true); }
return ; const navItem: any = {
} navView: this.navViewName,
const arg:any = args[0]; data: args,
if (!arg.id) { srfnavdata: {
this.calcToolbarItemState(true); context: tempContext,
return; viewparams: tempViewParam
} }
const nodetype = arg.id.split(';')[0]; }
const refview = this.getExpItemView({ nodetype: nodetype }); this.calcToolbarItemState(false);
if (!refview) { this.$emit('selectionchange', navItem);
this.calcToolbarItemState(true); }
return;
} /**
let tempViewparam:any = {}; * 树加载完成
let tempContext:any ={}; *
if(arg && arg.navfilter){ * @param {any[]} args
this.counter += 1; * @param {string} [tag]
Object.defineProperty(tempViewparam, arg.navfilter, { * @param {*} [$event2]
value : arg.srfkey, * @returns {void}
writable : true, * @memberof ${srfclassname('${ctrl.codeName}')}Base
enumerable : true, */
configurable : true public ${ctrl.name}_load(args: any[], tag?: string, $event2?: any): void {
}) this.calcToolbarItemState(true);
Object.assign(tempContext,{srfcounter:this.counter}); this.$emit('load',args);
} }
Object.assign(tempContext,JSON.parse(JSON.stringify(this.context)));
if(arg.srfappctx){ /**
Object.assign(tempContext,JSON.parse(JSON.stringify(arg.srfappctx))); * 执行搜索
} *
// 计算导航上下文 * @memberof ${srfclassname('${ctrl.codeName}')}Base
if(arg && arg.navigateContext && Object.keys(arg.navigateContext).length >0){ */
let tempData:any = arg.curData?JSON.parse(JSON.stringify(arg.curData)):{}; public onSearch(): void {
Object.assign(tempData,arg); if (!this.viewState) {
let _context = this.$util.computedNavData(tempData,tempContext,tempViewparam,arg.navigateContext); return;
Object.assign(tempContext,_context); }
} <#if ctrl.getPSDETree()??>
if(arg.srfparentdename){ <#assign tree = ctrl.getPSDETree()/>
Object.assign(tempContext,{srfparentdename:arg.srfparentdename}); this.istLoadDefaultRefView = false;
} this.viewState.next({ tag: '${tree.name}', action: 'filter', data: { srfnodefilter: this.srfnodefilter } });
if(arg.srfparentkey){ </#if>
Object.assign(tempContext,{srfparentkey:arg.srfparentkey}); }
}
// 计算导航参数 /**
if(arg && arg.navigateParams && Object.keys(arg.navigateParams).length >0){ * vue 声明周期
let tempData:any = arg.curData?JSON.parse(JSON.stringify(arg.curData)):{}; *
Object.assign(tempData,arg); * @memberof @memberof ${srfclassname('${ctrl.codeName}')}Base
let _params = this.$util.computedNavData(tempData,tempContext,tempViewparam,arg.navigateParams); */
Object.assign(tempViewparam,_params); public created() {
this.counter += 1; this.afterCreated();
Object.assign(tempContext,{srfcounter:this.counter}); }
}
this.selection = {}; /**
Object.assign(this.selection, { view: { viewname: refview.viewname } }); * 执行created后的逻辑
Object.assign(this.selection,{'viewparam':tempViewparam,'context':tempContext}); *
this.calcToolbarItemState(false); * @memberof ${srfclassname('${ctrl.codeName}')}Base
this.$forceUpdate(); */
} public afterCreated() {
if (this.viewState) {
/** this.viewStateEvent = this.viewState.subscribe(({ tag, action, data }) => {
* 树加载完成 if (!Object.is(tag, this.name)) {
* return;
* @param {any[]} args }
* @param {string} [tag] <#if ctrl.getPSDETree()??>
* @param {*} [$event2] <#assign tree = ctrl.getPSDETree()/>
* @returns {void} this.istLoadDefaultRefView = false;
* @memberof ${srfclassname('${ctrl.codeName}')}Base this.viewState.next({ tag: '${tree.name}', action: action, data: data });
*/ </#if>
public ${ctrl.name}_load(args: any[], tag?: string, $event2?: any): void { });
this.calcToolbarItemState(true); }
this.$emit('load',args); }
}
/**
/** * Vue声明周期(组件渲染完毕)
* 执行搜索 *
* * @memberof ${srfclassname('${ctrl.codeName}')}Base
* @memberof ${srfclassname('${ctrl.codeName}')}Base */
*/ public mounted() {
public onSearch(): void { this.afterMounted();
if (!this.viewState) { }
return;
} /**
<#if ctrl.getPSDETree()??> * 执行mounted后的逻辑
<#assign tree = ctrl.getPSDETree()/> *
this.istLoadDefaultRefView = false; * @memberof ${srfclassname('${ctrl.codeName}')}Base
this.viewState.next({ tag: '${tree.name}', action: 'filter', data: { srfnodefilter: this.srfnodefilter } }); */
</#if> public afterMounted() { }
}
/** /**
* vue 声明周期 * vue 生命周期
* *
* @memberof @memberof ${srfclassname('${ctrl.codeName}')}Base * @memberof ${srfclassname('${ctrl.codeName}')}Base
*/ */
public created() { public destroyed() {
this.afterCreated(); this.afterDestroy();
} }
/** /**
* 执行created后的逻辑 * 执行destroyed后的逻辑
* *
* @memberof ${srfclassname('${ctrl.codeName}')}Base * @memberof ${srfclassname('${ctrl.codeName}')}Base
*/ */
public afterCreated(){ public afterDestroy() {
if (this.viewState) { if (this.viewStateEvent) {
this.viewStateEvent = this.viewState.subscribe(({ tag, action, data }) => { this.viewStateEvent.unsubscribe();
if (!Object.is(tag, this.name)) { }
return; <#if destroyed_block??>
} ${destroyed_block}
<#if ctrl.getPSDETree()??> </#if>
<#assign tree = ctrl.getPSDETree()/> }
this.istLoadDefaultRefView = false;
this.viewState.next({ tag: '${tree.name}', action: action, data: data }); /**
</#if> * 视图数据变化
}); *
} * @param {*} $event
} * @memberof ${srfclassname('${ctrl.codeName}')}Base
*/
/** public onViewDatasChange($event: any): void {
* Vue声明周期(组件渲染完毕) this.$emit('selectionchange', $event);
* }
* @memberof ${srfclassname('${ctrl.codeName}')}Base
*/ /**
public mounted() { * 视图数据变化
this.afterMounted(); *
} * @param {*} $event
* @memberof ${srfclassname('${ctrl.codeName}')}Base
/** */
* 执行mounted后的逻辑 public onDrViewDatasChange($event: any): void {
* <#if ctrl.getPSDETree()??>
* @memberof ${srfclassname('${ctrl.codeName}')}Base <#assign tree = ctrl.getPSDETree()/>
*/ this.viewState.next({ tag: '${tree.name}', action: 'refresh_parent' });
public afterMounted(){ </#if>
if(this.$store.getters.getViewSplit(this.viewUID)){ }
this.split = this.$store.getters.getViewSplit(this.viewUID);
}else{ /**
let containerWidth:number = (document.getElementById("${ctrl.getCodeName()?lower_case}") as any).offsetWidth; * 视图数据被激活
if(this.ctrlWidth && containerWidth != 0){ *
this.split = this.ctrlWidth/containerWidth; * @param {*} $event
} * @memberof ${srfclassname('${ctrl.codeName}')}Base
this.$store.commit("setViewSplit",{viewUID:this.viewUID,viewSplit:this.split}); */
} public viewDatasActivated($event: any): void {
} this.$emit('activated', $event);
}
/** /**
* vue 生命周期 * 视图数据加载完成
* *
* @memberof ${srfclassname('${ctrl.codeName}')}Base * @param {*} $event
*/ * @memberof ${srfclassname('${ctrl.codeName}')}Base
public destroyed() { */
this.afterDestroy(); public onViewLoad($event: any): void {
} this.$emit('load', $event);
}
/**
* 执行destroyed后的逻辑 /**
* * 设置导航区工具栏禁用状态
* @memberof ${srfclassname('${ctrl.codeName}')}Base *
*/ * @param {boolean} state
public afterDestroy() { * @return {*}
if (this.viewStateEvent) { * @memberof ${srfclassname('${ctrl.codeName}')}Base
this.viewStateEvent.unsubscribe(); */
} public calcToolbarItemState(state: boolean) {
<#if destroyed_block??> let _this: any = this;
${destroyed_block} const models:any = _this.${ctrl.getCodeName()?lower_case}_toolbarModels;
</#if> if (models) {
} for (const key in models) {
if (!models.hasOwnProperty(key)) {
/** return;
* 视图数据变化 }
* const _item = models[key];
* @param {*} $event if (_item.uiaction && (Object.is(_item.uiaction.target, 'SINGLEKEY') || Object.is(_item.uiaction.target, 'MULTIKEY'))) {
* @memberof ${srfclassname('${ctrl.codeName}')}Base _item.disabled = state;
*/ }
public onViewDatasChange($event: any): void { _item.visabled = true;
this.$emit('selectionchange', $event); if (_item.noprivdisplaymode && _item.noprivdisplaymode === 6) {
} _item.visabled = false;
}
/** }
* 视图数据变化 this.calcNavigationToolbarState();
* }
* @param {*} $event }
* @memberof ${srfclassname('${ctrl.codeName}')}Base
*/ /**
public onDrViewDatasChange($event: any): void { * 计算导航工具栏权限状态
<#if ctrl.getPSDETree()??> *
<#assign tree = ctrl.getPSDETree()/> * @memberof ${srfclassname('${ctrl.codeName}')}Base
this.viewState.next({ tag: '${tree.name}', action: 'refresh_parent' }); */
</#if> public calcNavigationToolbarState(){
} let _this: any = this;
// 界面行为
/** <#assign ModelsName>${ctrl.getCodeName()?lower_case}_toolbarModels</#assign>
* 视图数据被激活 if(_this.${ModelsName}){
* <#if ctrl.getPSAppDataEntity?? && ctrl.getPSAppDataEntity()??>
* @param {*} $event <#assign curAppEntity = ctrl.getPSAppDataEntity() />
* @memberof ${srfclassname('${ctrl.codeName}')}Base const curUIService:${srfclassname('${curAppEntity.getCodeName()}')}UIService = new ${srfclassname('${curAppEntity.getCodeName()}')}UIService();
*/ ViewTool.calcActionItemAuthState({},_this.${ModelsName},curUIService);
public viewDatasActivated($event: any): void { </#if>
this.$emit('activated', $event); }
} }
/** <#if ctrl.getPSControls()??>
* 视图数据加载完成 <#assign controls = ctrl.getPSControls()/>
* <#list controls as singleControl>
* @param {*} $event <#if singleControl.getControlType() == "TOOLBAR">
* @memberof ${srfclassname('${ctrl.codeName}')}Base
*/ ${P.getCtrlCode(singleControl, 'CONTROL.vue').code}
public onViewLoad($event: any): void { </#if>
this.$emit('load', $event); </#list>
} </#if>
<#ibizinclude>
/** ../@MACRO/CONTROL/CONTROL_BOTTOM-BASE.vue.ftl
* 设置导航区工具栏禁用状态 </#ibizinclude>
*
* @param {boolean} state <#ibizinclude>
* @return {*} ../@MACRO/CONTROL/CONTROL-BASE.style.ftl
* @memberof ${srfclassname('${ctrl.codeName}')}Base </#ibizinclude>
*/
public calcToolbarItemState(state: boolean) {
let _this: any = this;
const models:any = _this.${ctrl.getCodeName()?lower_case}_toolbarModels;
if (models) {
for (const key in models) {
if (!models.hasOwnProperty(key)) {
return;
}
const _item = models[key];
if (_item.uiaction && (Object.is(_item.uiaction.target, 'SINGLEKEY') || Object.is(_item.uiaction.target, 'MULTIKEY'))) {
_item.disabled = state;
}
_item.visabled = true;
if (_item.noprivdisplaymode && _item.noprivdisplaymode === 6) {
_item.visabled = false;
}
}
this.calcNavigationToolbarState();
}
}
/**
* 计算导航工具栏权限状态
*
* @memberof ${srfclassname('${ctrl.codeName}')}Base
*/
public calcNavigationToolbarState(){
let _this: any = this;
// 界面行为
<#assign ModelsName>${ctrl.getCodeName()?lower_case}_toolbarModels</#assign>
if(_this.${ModelsName}){
<#if ctrl.getPSAppDataEntity?? && ctrl.getPSAppDataEntity()??>
<#assign curAppEntity = ctrl.getPSAppDataEntity() />
const curUIService:${srfclassname('${curAppEntity.getCodeName()}')}UIService = new ${srfclassname('${curAppEntity.getCodeName()}')}UIService();
ViewTool.calcActionItemAuthState({},_this.${ModelsName},curUIService);
</#if>
}
}
<#if ctrl.getPSControls()??>
<#assign controls = ctrl.getPSControls()/>
<#list controls as singleControl>
<#if singleControl.getControlType() == "TOOLBAR">
${P.getCtrlCode(singleControl, 'CONTROL.vue').code}
</#if>
</#list>
</#if>
<#ibizinclude>
../@MACRO/CONTROL/CONTROL_BOTTOM-BASE.vue.ftl
</#ibizinclude>
<#ibizinclude>
../@MACRO/CONTROL/CONTROL-BASE.style.ftl
</#ibizinclude>
<div class="view-container ${view.getViewType()?lower_case} ${srffilepath2(view.getCodeName())}<#if view.getPSSysCss?? && view.getPSSysCss()??> ${view.getPSSysCss().getCssName()}</#if>"> <div class="view-container ${view.getViewType()?lower_case} ${srffilepath2(view.getCodeName())}<#if view.getPSSysCss?? && view.getPSSysCss()??> ${view.getPSSysCss().getCssName()}</#if>">
<app-studioaction :viewTitle="$t(model.srfCaption)" viewName="${view.getCodeName()?lower_case}"></app-studioaction> <app-studioaction :viewTitle="$t(model.srfCaption)" viewName="${view.getCodeName()?lower_case}"></app-studioaction>
<card class='view-card <#if !view.isShowCaptionBar()> view-no-caption</#if> <#if !view.hasPSControl('toolbar')> view-no-toolbar</#if>' :dis-hover="true" :bordered="false"> <card class='view-card <#if !view.isShowCaptionBar()> view-no-caption</#if> <#if !view.hasPSControl('toolbar')> view-no-toolbar</#if>' :dis-hover="true" :bordered="false">
<#ibizinclude>
<#ibizinclude> ../@MACRO/VIEW_CAPTION_DATAINFO.vue.ftl
../@MACRO/VIEW_CAPTION_DATAINFO.vue.ftl </#ibizinclude>
</#ibizinclude> <#-- BEGIN:视图顶部视图消息 -->
<@ibizindent blank=8>
<#-- BEGIN:视图顶部视图消息 --> <#ibizinclude>
<@ibizindent blank=8> ../@MACRO/View_Pos_Top_Msgs.vue.ftl
<#ibizinclude> </#ibizinclude>
../@MACRO/View_Pos_Top_Msgs.vue.ftl </@ibizindent>
</#ibizinclude> <#-- END:视图顶部视图消息 -->
</@ibizindent> <div class="content-container">
<#-- END:视图顶部视图消息 --> <#-- BEGIN:视图内容区视图消息 -->
<div class="content-container"> <@ibizindent blank=8>
<#-- BEGIN:视图内容区视图消息 --> <#ibizinclude>
<@ibizindent blank=8> ../@MACRO/View_Pos_Body_Msgs.vue.ftl
<#ibizinclude> </#ibizinclude>
../@MACRO/View_Pos_Body_Msgs.vue.ftl </@ibizindent>
</#ibizinclude> <split v-model="split" mode="<#if view.getSideBarLayout()?? && view.getSideBarLayout() == "LEFT">horizontal<#else>vertical</#if>" @on-move-end="onSplitChange">
</@ibizindent> <template slot="<#if view.getSideBarLayout()?? && view.getSideBarLayout() == "LEFT">left<#else>top</#if>">
<#-- END:视图内容区视图消息 --> <#if view.hasPSControl('dataviewexpbar')>
<#if view.hasPSControl('dataviewexpbar')> ${P.getCtrlCode('dataviewexpbar', 'CONTROL.html').code}
${P.getCtrlCode('dataviewexpbar', 'CONTROL.html').code} </#if>
</#if> </template>
</div> <template slot="<#if view.getSideBarLayout()?? && view.getSideBarLayout() == "LEFT">right<#else>bottom</#if>">
<#-- BEGIN:视图底部视图消息 --> <component
<@ibizindent blank=8> v-if="navItem && navItem.navView"
<#ibizinclude> :is="navItem.navView"
../@MACRO/View_Pos_Bottom_Msgs.vue.ftl :key="navItem.data && navItem.data.length ? navItem.data[0].srfkey : ''"
</#ibizinclude> class="viewcontainer2"
</@ibizindent> :viewDefaultUsage="false"
<#-- END:视图底部视图消息 --> :viewdata="JSON.stringify(navItem.srfnavdata.context)"
</card> :viewparam="JSON.stringify(navItem.srfnavdata.viewparams)">
</component>
</template>
</split>
<#-- END:视图内容区视图消息 -->
</div>
<#-- BEGIN:视图底部视图消息 -->
<@ibizindent blank=8>
<#ibizinclude>
../@MACRO/View_Pos_Bottom_Msgs.vue.ftl
</#ibizinclude>
</@ibizindent>
<#-- END:视图底部视图消息 -->
</card>
</div> </div>
\ No newline at end of file
<div class="view-container ${view.getViewType()?lower_case} ${srffilepath2(view.getCodeName())}<#if view.getPSSysCss?? && view.getPSSysCss()??> ${view.getPSSysCss().getCssName()}</#if>"> <div class="view-container ${view.getViewType()?lower_case} ${srffilepath2(view.getCodeName())}<#if view.getPSSysCss?? && view.getPSSysCss()??> ${view.getPSSysCss().getCssName()}</#if>">
<app-studioaction :viewTitle="$t(model.srfCaption)" viewName="${view.getCodeName()?lower_case}"></app-studioaction> <app-studioaction :viewTitle="$t(model.srfCaption)" viewName="${view.getCodeName()?lower_case}"></app-studioaction>
<card class='view-card <#if !view.isShowCaptionBar()> view-no-caption</#if> <#if !view.hasPSControl('toolbar')> view-no-toolbar</#if>' :dis-hover="true" :bordered="false"> <card class='view-card <#if !view.isShowCaptionBar()> view-no-caption</#if> <#if !view.hasPSControl('toolbar')> view-no-toolbar</#if>' :dis-hover="true" :bordered="false">
<#ibizinclude>
<#ibizinclude> ../@MACRO/VIEW_CAPTION_DATAINFO.vue.ftl
../@MACRO/VIEW_CAPTION_DATAINFO.vue.ftl </#ibizinclude>
</#ibizinclude> <#-- BEGIN:视图顶部视图消息 -->
<@ibizindent blank=8>
<#-- BEGIN:视图顶部视图消息 --> <#ibizinclude>
<@ibizindent blank=8> ../@MACRO/View_Pos_Top_Msgs.vue.ftl
<#ibizinclude> </#ibizinclude>
../@MACRO/View_Pos_Top_Msgs.vue.ftl </@ibizindent>
</#ibizinclude> <#-- END:视图顶部视图消息 -->
</@ibizindent> <div class="content-container">
<#-- END:视图顶部视图消息 --> <#-- BEGIN:视图内容区视图消息 -->
<div class="content-container"> <@ibizindent blank=8>
<#-- BEGIN:视图内容区视图消息 --> <#ibizinclude>
<@ibizindent blank=8> ../@MACRO/View_Pos_Body_Msgs.vue.ftl
<#ibizinclude> </#ibizinclude>
../@MACRO/View_Pos_Body_Msgs.vue.ftl </@ibizindent>
</#ibizinclude> <split v-model="split" mode="<#if view.getSideBarLayout()?? && view.getSideBarLayout() == "LEFT">horizontal<#else>vertical</#if>" @on-move-end="onSplitChange">
</@ibizindent> <template slot="<#if view.getSideBarLayout()?? && view.getSideBarLayout() == "LEFT">left<#else>top</#if>">
<#-- END:视图内容区视图消息 --> <#if view.hasPSControl('calendarexpbar')>
<#if view.hasPSControl('calendarexpbar')> ${P.getCtrlCode('calendarexpbar', 'CONTROL.html').code}
${P.getCtrlCode('calendarexpbar', 'CONTROL.html').code} </#if>
</#if> </template>
</div> <template slot="<#if view.getSideBarLayout()?? && view.getSideBarLayout() == "LEFT">right<#else>bottom</#if>">
<#-- BEGIN:视图底部视图消息 --> <component
<@ibizindent blank=8> v-if="navItem && navItem.navView"
<#ibizinclude> :is="navItem.navView"
../@MACRO/View_Pos_Bottom_Msgs.vue.ftl :key="navItem.data && navItem.data.length ? navItem.data[0].srfkey : ''"
</#ibizinclude> class="viewcontainer2"
</@ibizindent> :viewDefaultUsage="false"
<#-- END:视图底部视图消息 --> :viewdata="JSON.stringify(navItem.srfnavdata.context)"
</card> :viewparam="JSON.stringify(navItem.srfnavdata.viewparams)">
</component>
</template>
</split>
</div>
<#-- END:视图内容区视图消息 -->
<#-- BEGIN:视图底部视图消息 -->
<@ibizindent blank=8>
<#ibizinclude>
../@MACRO/View_Pos_Bottom_Msgs.vue.ftl
</#ibizinclude>
</@ibizindent>
<#-- END:视图底部视图消息 -->
</card>
</div> </div>
\ No newline at end of file
<div class='view-container ${view.getViewType()?lower_case} ${srffilepath2(view.getCodeName())}<#if view.getPSSysCss?? && view.getPSSysCss()??> ${view.getPSSysCss().getCssName()}</#if>'> <div class='view-container ${view.getViewType()?lower_case} ${srffilepath2(view.getCodeName())}<#if view.getPSSysCss?? && view.getPSSysCss()??> ${view.getPSSysCss().getCssName()}</#if>'>
<app-studioaction :viewTitle="$t(model.srfCaption)" viewName="${view.getCodeName()?lower_case}"></app-studioaction> <app-studioaction :viewTitle="$t(model.srfCaption)" viewName="${view.getCodeName()?lower_case}"></app-studioaction>
<card class='view-card <#if !view.isShowCaptionBar()> view-no-caption</#if> <#if !view.hasPSControl('toolbar')> view-no-toolbar</#if>' :dis-hover="true" :bordered="false"> <card class='view-card <#if !view.isShowCaptionBar()> view-no-caption</#if> <#if !view.hasPSControl('toolbar')> view-no-toolbar</#if>' :dis-hover="true" :bordered="false">
<@ibizindent blank=8> <@ibizindent blank=8>
<#ibizinclude> <#ibizinclude>
../@MACRO/VIEW_CAPTION_DATAINFO.vue.ftl ../@MACRO/VIEW_CAPTION_DATAINFO.vue.ftl
</#ibizinclude> </#ibizinclude>
</@ibizindent> </@ibizindent>
<#-- BEGIN:视图顶部视图消息 -->
<#-- BEGIN:视图顶部视图消息 --> <@ibizindent blank=12>
<@ibizindent blank=12> <#ibizinclude>
<#ibizinclude> ../@MACRO/View_Pos_Top_Msgs.vue.ftl
../@MACRO/View_Pos_Top_Msgs.vue.ftl </#ibizinclude>
</#ibizinclude> </@ibizindent>
</@ibizindent> <#-- END:视图顶部视图消息 -->
<#-- END:视图顶部视图消息 --> <div class='content-container'>
<div class='content-container'> <split v-model="split" mode="<#if view.getSideBarLayout()?? && view.getSideBarLayout() == "LEFT">horizontal<#else>vertical</#if>" @on-move-end="onSplitChange">
<#-- BEGIN:视图内容区视图消息 --> <template slot="<#if view.getSideBarLayout()?? && view.getSideBarLayout() == "LEFT">left<#else>top</#if>">
<@ibizindent blank=8> <#if view.hasPSControl('treeexpbar')>
<#ibizinclude> <@ibizindent blank=12>
../@MACRO/View_Pos_Body_Msgs.vue.ftl ${P.getCtrlCode('treeexpbar', 'CONTROL.html').code}<#t>
</#ibizinclude> </@ibizindent>
</@ibizindent> </#if>
<#-- END:视图内容区视图消息 --> </template>
<#if view.hasPSControl('treeexpbar')> <template slot="<#if view.getSideBarLayout()?? && view.getSideBarLayout() == "LEFT">right<#else>bottom</#if>">
<@ibizindent blank=12> <component
${P.getCtrlCode('treeexpbar', 'CONTROL.html').code}<#t> v-if="navItem && navItem.navView"
</@ibizindent> :is="navItem.navView"
</#if> :key="navItem.data && navItem.data.length ? navItem.data[0].srfkey : ''"
</div> class="viewcontainer2"
<#-- BEGIN:视图底部视图消息 --> :viewDefaultUsage="false"
<@ibizindent blank=12> :viewdata="JSON.stringify(navItem.srfnavdata.context)"
<#ibizinclude> :viewparam="JSON.stringify(navItem.srfnavdata.viewparams)">
../@MACRO/View_Pos_Bottom_Msgs.vue.ftl </component>
</#ibizinclude> </template>
</@ibizindent> </split>
<#-- END:视图底部视图消息 --> <#-- BEGIN:视图内容区视图消息 -->
</card> <@ibizindent blank=8>
<#ibizinclude>
../@MACRO/View_Pos_Body_Msgs.vue.ftl
</#ibizinclude>
</@ibizindent>
<#-- END:视图内容区视图消息 -->
</div>
<#-- BEGIN:视图底部视图消息 -->
<@ibizindent blank=12>
<#ibizinclude>
../@MACRO/View_Pos_Bottom_Msgs.vue.ftl
</#ibizinclude>
</@ibizindent>
<#-- END:视图底部视图消息 -->
</card>
</div> </div>
\ No newline at end of file
<#ibizinclude> <#ibizinclude>
../@MACRO/DATAVIEW_VIEW.vue.ftl ../@MACRO/LAYOUTPANEL_VIEW.template.ftl
</#ibizinclude>
<#ibizinclude>
../@MACRO/VIEW_HEADER-BASE.vue.ftl
</#ibizinclude>
<#ibizinclude>
../@MACRO/VIEW_CONTENT-BASE.vue.ftl
</#ibizinclude>
/**
* 视图唯一标识
*
* @type {string}
* @memberof ${srfclassname('${view.name}')}Base
*/
public viewUID: string = '${srffilepath2(view.getPSAppModule().getCodeName())}-${srffilepath2(view.getCodeName())}';
/**
* 分隔值
*
* @type {number}
* @memberof ${srfclassname('${view.name}')}Base
*/
public split: number = 0.5;
/**
* 导航项
*
* @type {*}
* @memberof ${srfclassname('${view.name}')}Base
*/
public navItem: any = {};
/**
* split值变化事件
*
* @memberof ${srfclassname('${view.name}')}Base
*/
public onSplitChange() {
if (this.split) {
this.$store.commit("setViewSplit", { viewUID: this.viewUID, viewSplit: this.split });
}
}
/**
* 初始化分隔值
*
* @memberof ${srfclassname('${view.name}')}Base
*/
public initSplit() {
if (this.$store.getters.getViewSplit(this.viewUID)) {
this.split = this.$store.getters.getViewSplit(this.viewUID);
} else {
<#if view.getSideBarLayout()?? && view.getSideBarLayout() == "LEFT">
const containerWidth = (this.$el as any).offsetWidth;
<#list view.getPSControls() as singleCtrl>
<#if singleCtrl.getControlType() == 'DATAVIEWEXPBAR' && singleCtrl.getWidth()??>
this.split = ${singleCtrl.getWidth()?c} / containerWidth;
</#if>
</#list>
<#else>
const containerHeight = (this.$el as any).offsetHeight;
<#list view.getPSControls() as singleCtrl>
<#if singleCtrl.getControlType() == 'DATAVIEWEXPBAR' && singleCtrl.getHeight()??>
this.split = ${singleCtrl.getHeight()?c} / containerHeight;
</#if>
</#list>
</#if>
this.$store.commit("setViewSplit", { viewUID: this.viewUID, viewSplit: this.split });
}
}
<#ibizinclude>
../@MACRO/VIEW_BOTTOM-BASE.vue.ftl
</#ibizinclude>
<#ibizinclude>
../@MACRO/VIEW-BASE.style.ftl
</#ibizinclude> </#ibizinclude>
\ No newline at end of file
<#ibizinclude> <#ibizinclude>
../@MACRO/LAYOUTPANEL_VIEW.template.ftl ../@MACRO/LAYOUTPANEL_VIEW.template.ftl
</#ibizinclude> </#ibizinclude>
<#ibizinclude> <#ibizinclude>
../@MACRO/VIEW_HEADER-BASE.vue.ftl ../@MACRO/VIEW_HEADER-BASE.vue.ftl
</#ibizinclude> </#ibizinclude>
<#ibizinclude> <#ibizinclude>
../@MACRO/VIEW_CONTENT-BASE.vue.ftl ../@MACRO/VIEW_CONTENT-BASE.vue.ftl
</#ibizinclude> </#ibizinclude>
/** /**
* 视图唯一标识 * 视图唯一标识
* *
* @type {string} * @type {string}
* @memberof ${srfclassname('${view.name}')}Base * @memberof ${srfclassname('${view.name}')}Base
*/ */
public viewUID: string = '${srffilepath2(view.getPSAppModule().getCodeName())}-${srffilepath2(view.getCodeName())}'; public viewUID: string = '${srffilepath2(view.getPSAppModule().getCodeName())}-${srffilepath2(view.getCodeName())}';
<#ibizinclude> /**
../@MACRO/VIEW_BOTTOM-BASE.vue.ftl * 分隔值
</#ibizinclude> *
* @type {number}
<#ibizinclude> * @memberof ${srfclassname('${view.name}')}Base
../@MACRO/VIEW-BASE.style.ftl */
public split: number = 0.5;
/**
* 导航项
*
* @type {*}
* @memberof ${srfclassname('${view.name}')}Base
*/
public navItem: any = {};
/**
* split值变化事件
*
* @memberof ${srfclassname('${view.name}')}Base
*/
public onSplitChange() {
if (this.split) {
this.$store.commit("setViewSplit", { viewUID: this.viewUID, viewSplit: this.split });
}
}
/**
* 初始化分隔值
*
* @memberof ${srfclassname('${view.name}')}Base
*/
public initSplit() {
if (this.$store.getters.getViewSplit(this.viewUID)) {
this.split = this.$store.getters.getViewSplit(this.viewUID);
} else {
<#if view.getSideBarLayout()?? && view.getSideBarLayout() == "LEFT">
const containerWidth = (this.$el as any).offsetWidth;
<#list view.getPSControls() as singleCtrl>
<#if singleCtrl.getControlType() == 'CALENDAREXPBAR' && singleCtrl.getWidth()??>
this.split = ${singleCtrl.getWidth()?c} / containerWidth;
</#if>
</#list>
<#else>
const containerHeight = (this.$el as any).offsetHeight;
<#list view.getPSControls() as singleCtrl>
<#if singleCtrl.getControlType() == 'CALENDAREXPBAR' && singleCtrl.getHeight()??>
this.split = ${singleCtrl.getHeight()?c} / containerHeight;
</#if>
</#list>
</#if>
this.$store.commit("setViewSplit", { viewUID: this.viewUID, viewSplit: this.split });
}
}
<#ibizinclude>
../@MACRO/VIEW_BOTTOM-BASE.vue.ftl
</#ibizinclude>
<#ibizinclude>
../@MACRO/VIEW-BASE.style.ftl
</#ibizinclude> </#ibizinclude>
\ No newline at end of file
<#ibizinclude> <#ibizinclude>
../@MACRO/LAYOUTPANEL_VIEW.template.ftl ../@MACRO/LAYOUTPANEL_VIEW.template.ftl
</#ibizinclude> </#ibizinclude>
<#ibizinclude> <#ibizinclude>
../@MACRO/VIEW_HEADER-BASE.vue.ftl ../@MACRO/VIEW_HEADER-BASE.vue.ftl
</#ibizinclude> </#ibizinclude>
<#ibizinclude> <#ibizinclude>
../@MACRO/VIEW_CONTENT-BASE.vue.ftl ../@MACRO/VIEW_CONTENT-BASE.vue.ftl
</#ibizinclude> </#ibizinclude>
/** /**
* 视图唯一标识 * 视图唯一标识
* *
* @type {string} * @type {string}
* @memberof ${srfclassname('${view.name}')}Base * @memberof ${srfclassname('${view.name}')}Base
*/ */
public viewUID: string = '${srffilepath2(view.getPSAppModule().getCodeName())}-${srffilepath2(view.getCodeName())}'; public viewUID: string = '${srffilepath2(view.getPSAppModule().getCodeName())}-${srffilepath2(view.getCodeName())}';
<#ibizinclude> /**
../@MACRO/VIEW_BOTTOM-BASE.vue.ftl * 分隔值
</#ibizinclude> *
* @type {number}
<#ibizinclude> * @memberof ${srfclassname('${view.name}')}Base
../@MACRO/VIEW-BASE.style.ftl */
public split: number = 0.5;
/**
* 导航项
*
* @type {*}
* @memberof ${srfclassname('${view.name}')}Base
*/
public navItem: any = {};
/**
* split值变化事件
*
* @memberof ${srfclassname('${view.name}')}Base
*/
public onSplitChange() {
if (this.split) {
this.$store.commit("setViewSplit", { viewUID: this.viewUID, viewSplit: this.split });
}
}
/**
* 初始化分隔值
*
* @memberof ${srfclassname('${view.name}')}Base
*/
public initSplit() {
if (this.$store.getters.getViewSplit(this.viewUID)) {
this.split = this.$store.getters.getViewSplit(this.viewUID);
} else {
<#if view.getSideBarLayout()?? && view.getSideBarLayout() == "LEFT">
const containerWidth = (this.$el as any).offsetWidth;
<#list view.getPSControls() as singleCtrl>
<#if singleCtrl.getControlType() == 'TREEEXPBAR' && singleCtrl.getWidth()??>
this.split = ${singleCtrl.getWidth()?c} / containerWidth;
</#if>
</#list>
<#else>
const containerHeight = (this.$el as any).offsetHeight;
<#list view.getPSControls() as singleCtrl>
<#if singleCtrl.getControlType() == 'TREEEXPBAR' && singleCtrl.getHeight()??>
this.split = ${singleCtrl.getHeight()?c} / containerHeight;
</#if>
</#list>
</#if>
this.$store.commit("setViewSplit", { viewUID: this.viewUID, viewSplit: this.split });
}
}
<#ibizinclude>
../@MACRO/VIEW_BOTTOM-BASE.vue.ftl
</#ibizinclude>
<#ibizinclude>
../@MACRO/VIEW-BASE.style.ftl
</#ibizinclude> </#ibizinclude>
\ No newline at end of file
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册