提交 fb05161f 编写于 作者: tony001's avatar tony001

Merge branch 'DEV'

...@@ -2,6 +2,9 @@ ...@@ -2,6 +2,9 @@
../@MACRO/CONTROL/LANGBASE.vue.ftl ../@MACRO/CONTROL/LANGBASE.vue.ftl
</#ibizinclude> </#ibizinclude>
<template> <template>
<#if ctrl.getBatchPSDEToolbar?? && ctrl.getBatchPSDEToolbar()??>
<div>
</#if>
<div :class="['app-list',<#if ctrl.getPSSysCss?? && ctrl.getPSSysCss()??><#assign singleCss = ctrl.getPSSysCss()>'${singleCss.getCssName()}',</#if>this.items.length > 0 ? '' : 'app-list-empty' ]"> <div :class="['app-list',<#if ctrl.getPSSysCss?? && ctrl.getPSSysCss()??><#assign singleCss = ctrl.getPSSysCss()>'${singleCss.getCssName()}',</#if>this.items.length > 0 ? '' : 'app-list-empty' ]">
<div v-if="items.length > 0"> <div v-if="items.length > 0">
<#if ctrl.render??> <#if ctrl.render??>
...@@ -16,7 +19,15 @@ ...@@ -16,7 +19,15 @@
<#elseif ctrl.itemRender??> <#elseif ctrl.itemRender??>
${ctrl.itemRender.code} ${ctrl.itemRender.code}
<#else> <#else>
{{item.srfmajortext}} <div class="app-list-item-content">{{item.srfmajortext}}</div>
<div calss="app-list-item-action">
<template v-for="(action,index) in Object.keys(ActionModel)">
<a :key="index" style="display: inline-block;margin: 0 12px;" @click="uiAction(item, action, $event)">
<i :class="ActionModel[action].icon" style="margin-right:2px;"></i>
<span>{{ActionModel[action].caption}}</span>
</a>
</template>
</div>
</#if> </#if>
</div> </div>
<#elseif ctrl.isEnableGroup?? && ctrl.isEnableGroup()> <#elseif ctrl.isEnableGroup?? && ctrl.isEnableGroup()>
...@@ -35,7 +46,15 @@ ...@@ -35,7 +46,15 @@
<#elseif ctrl.itemRender??> <#elseif ctrl.itemRender??>
${ctrl.itemRender.code} ${ctrl.itemRender.code}
<#else> <#else>
{{item.srfmajortext}} <div class="app-list-item-content">{{item.srfmajortext}}</div>
<div calss="app-list-item-action">
<template v-for="(action,index) in Object.keys(ActionModel)">
<a :key="index" style="display: inline-block;margin: 0 12px;" @click="uiAction(item, action, $event)">
<i :class="ActionModel[action].icon" style="margin-right:2px;"></i>
<span>{{ActionModel[action].caption}}</span>
</a>
</template>
</div>
</#if> </#if>
</div> </div>
</div> </div>
...@@ -52,9 +71,28 @@ ...@@ -52,9 +71,28 @@
</div> </div>
<div v-else> <div v-else>
{{ $t('<#if langbase??>${langbase}.nodata</#if>') }} {{ $t('<#if langbase??>${langbase}.nodata</#if>') }}
<#if ctrl.getQuickPSDEToolbar?? && ctrl.getQuickPSDEToolbar()??>
<span class="quick-toolbar">
<#assign quickToolbar = ctrl.getQuickPSDEToolbar()/>
<@ibizindent blank=12>
${P.getCtrlCode(quickToolbar, 'CONTROL.html').code}
</@ibizindent>
</span>
</#if>
</div> </div>
<el-backtop target=".content-container .app-list"></el-backtop> <el-backtop target=".content-container .app-list"></el-backtop>
</div> </div>
<#if ctrl.getBatchPSDEToolbar?? && ctrl.getBatchPSDEToolbar()??>
<row class='list-pagination' v-if="selections.length > 0">
<span class="batch-toolbar">
<#assign batchToolbar = ctrl.getBatchPSDEToolbar()/>
<@ibizindent blank=12>
${P.getCtrlCode(batchToolbar, 'CONTROL.html').code}
</@ibizindent>
</span>
</row>
</div>
</#if>
</template> </template>
<#assign import_block> <#assign import_block>
import CodeListService from "@/codelist/codelist-service"; import CodeListService from "@/codelist/codelist-service";
...@@ -243,6 +281,9 @@ import CodeListService from "@/codelist/codelist-service"; ...@@ -243,6 +281,9 @@ import CodeListService from "@/codelist/codelist-service";
} else if(Object.is(this.codelistType, "STATIC")){ } else if(Object.is(this.codelistType, "STATIC")){
groups = this.$store.getters.getCodeListItems(this.tag); groups = this.$store.getters.getCodeListItems(this.tag);
} }
if(groups.length == 0){
console.warn("分组数据无效");
}
groups.forEach((group: any,i: number)=>{ groups.forEach((group: any,i: number)=>{
let children:Array<any> = []; let children:Array<any> = [];
data.forEach((item: any,j: number)=>{ data.forEach((item: any,j: number)=>{
...@@ -258,7 +299,7 @@ import CodeListService from "@/codelist/codelist-service"; ...@@ -258,7 +299,7 @@ import CodeListService from "@/codelist/codelist-service";
}); });
let child:Array<any> = []; let child:Array<any> = [];
data.forEach((item: any)=>{ data.forEach((item: any)=>{
let i = groups.findIndex((group: any)=>Object.is(group,item[this.groupField])); let i = groups.findIndex((group: any)=>Object.is(group.label,item[this.groupField]));
if(i < 0){ if(i < 0){
child.push(item); child.push(item);
} }
...@@ -267,7 +308,9 @@ import CodeListService from "@/codelist/codelist-service"; ...@@ -267,7 +308,9 @@ import CodeListService from "@/codelist/codelist-service";
group: this.$t('app.commonWords.other'), group: this.$t('app.commonWords.other'),
children: child children: child
} }
groupTree.push(Tree); if(child && child.length > 0){
groupTree.push(Tree);
}
this.groupData = [...groupTree]; this.groupData = [...groupTree];
} }
</#if> </#if>
...@@ -287,6 +330,9 @@ import CodeListService from "@/codelist/codelist-service"; ...@@ -287,6 +330,9 @@ import CodeListService from "@/codelist/codelist-service";
} }
}); });
groups = [...new Set(groups)]; groups = [...new Set(groups)];
if(groups.length == 0){
console.warn("分组数据无效");
}
let groupTree:Array<any> = []; let groupTree:Array<any> = [];
groups.forEach((group: any,i: number)=>{ groups.forEach((group: any,i: number)=>{
let children:Array<any> = []; let children:Array<any> = [];
...@@ -295,6 +341,7 @@ import CodeListService from "@/codelist/codelist-service"; ...@@ -295,6 +341,7 @@ import CodeListService from "@/codelist/codelist-service";
children.push(item); children.push(item);
} }
}); });
group = group ? group : this.$t('app.commonWords.other');
const tree: any ={ const tree: any ={
group: group, group: group,
children: children children: children
...@@ -305,6 +352,16 @@ import CodeListService from "@/codelist/codelist-service"; ...@@ -305,6 +352,16 @@ import CodeListService from "@/codelist/codelist-service";
} }
</#if> </#if>
<#if ctrl.getQuickPSDEToolbar?? && ctrl.getQuickPSDEToolbar()??>
<#assign quickToolbar = ctrl.getQuickPSDEToolbar()/>
${P.getCtrlCode(quickToolbar, 'CONTROL.vue').code}
</#if>
<#if ctrl.getBatchPSDEToolbar?? && ctrl.getBatchPSDEToolbar()??>
<#assign batchToolbar = ctrl.getBatchPSDEToolbar()/>
${P.getCtrlCode(batchToolbar, 'CONTROL.vue').code}
</#if>
/** /**
* 当前页 * 当前页
* *
...@@ -831,6 +888,45 @@ import CodeListService from "@/codelist/codelist-service"; ...@@ -831,6 +888,45 @@ import CodeListService from "@/codelist/codelist-service";
}); });
} }
/**
* 操作栏模型数据
*
* @type {*}
* @memberof ${srfclassname('${ctrl.codeName}')}Base
*/
public ActionModel:any ={
<#if ctrl.getPSAppViewUIActions?? && ctrl.getPSAppViewUIActions()??>
<#list ctrl.getPSAppViewUIActions() as viewUIAction>
<#if viewUIAction.getPSUIAction?? && viewUIAction.getPSUIAction()??>
<#assign UIAction = viewUIAction.getPSUIAction() />
"${UIAction.getUIActionTag()}":{name:"${UIAction.getUIActionTag()}",icon:"<#if UIAction.getPSSysImage()??><#assign img=UIAction.getPSSysImage() /><#if img.getCssClass()?? && (img.getCssClass()?length gt 0)>${img.getCssClass()}</#if></#if>",caption:"${UIAction.getCaption()}",disabled: false, visabled: true,noprivdisplaymode:<#if UIAction.getNoPrivDisplayMode(view)??>${UIAction.getNoPrivDisplayMode(view)}</#if>,dataaccaction: "<#if UIAction.getDataAccessAction()??>${UIAction.getDataAccessAction()}</#if>", actiontarget: "${UIAction.getActionTarget()}"}<#if viewUIAction_has_next>,</#if>
</#if>
</#list>
</#if>
};
/**
* 操作列界面行为
*
* @param {*} data
* @param {*} tag
* @param {*} $event
* @memberof ${srfclassname('${ctrl.codeName}')}Base
*/
public uiAction(data: any, tag: any, $event: any) {
$event.stopPropagation();
<#if ctrl.getPSAppViewLogics()??>
<#list ctrl.getPSAppViewLogics() as logic>
<#if logic.getPSAppViewUIAction().getPSUIAction()??>
<#assign action = logic.getPSAppViewUIAction().getPSUIAction()>
if(Object.is('${action.getUIActionTag()}', tag)) {
this.${logic.getName()}(data, tag, $event);
}
</#if>
</#list>
</#if>
}
<#ibizinclude> <#ibizinclude>
../@MACRO/CONTROL/CONTROL_BOTTOM-BASE.vue.ftl ../@MACRO/CONTROL/CONTROL_BOTTOM-BASE.vue.ftl
</#ibizinclude> </#ibizinclude>
......
...@@ -18,6 +18,9 @@ ...@@ -18,6 +18,9 @@
box-shadow: 0px 0px 2px 1px rgb(209, 208, 208); box-shadow: 0px 0px 2px 1px rgb(209, 208, 208);
background: #f7f7fa; background: #f7f7fa;
min-height: 24px; min-height: 24px;
display: flex;
justify-content: space-between;
align-items: center;
} }
.app-list-item.isSelect { .app-list-item.isSelect {
background: #ecf5ff; background: #ecf5ff;
...@@ -41,4 +44,27 @@ ...@@ -41,4 +44,27 @@
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
} <#if ctrl.getQuickPSDEToolbar?? && ctrl.getQuickPSDEToolbar()??>
\ No newline at end of file .quick-toolbar{
display: inline-block;
button{
background: #ebf3fb;
color: #2575ca;
border: 0;
}
}
</#if>
}
<#if ctrl.getBatchPSDEToolbar?? && ctrl.getBatchPSDEToolbar()??>
.list-pagination {
position: fixed;
background-color: #fff;
height: 50px;
bottom: 30px;
display: flex;
align-items: center;
justify-content: center;
font-size: 20px;
z-index: 5;
}
</#if>
\ No newline at end of file
此差异已折叠。
<#ibizinclude>
../@MACRO/HTML/DEFAULT.html.ftl
</#ibizinclude>
\ No newline at end of file
<#ibizinclude>
../@MACRO/CSS/DEFAULT.less.ftl
</#ibizinclude>
.map{
width: 80vw;
height: 70vh;
}
\ No newline at end of file
<#ibizinclude>
../@MACRO/CONTROL/CONTROL.vue.ftl
</#ibizinclude>
\ No newline at end of file
<#ibizinclude>
../@MACRO/MODEL/MODEL_HEADER.ts.ftl
</#ibizinclude>
/**
* 地图项类型
*
* @returns {any[]}
* @memberof ${srfclassname('${ctrl.getCodeName()}')}${srfclassname('${ctrl.name}')}Mode
*/
public itemType: string = "";
/**
* 获取数据项集合
*
* @returns {any[]}
* @memberof ${srfclassname('${ctrl.getCodeName()}')}${srfclassname('${ctrl.name}')}Mode
*/
public getDataItems(): any[] {
let dataItems: any = [
<#-- 关联主实体的主键 -->
<#if ctrl.getPSAppDataEntity()??>
<#assign appDataEntity = ctrl.getPSAppDataEntity() />
<#if appDataEntity.isMajor() == false && appDataEntity.getMinorPSAppDERSs()??>
<#list appDataEntity.getMinorPSAppDERSs() as minorAppDERSs>
<#if minorAppDERSs.getMajorPSAppDataEntity()??>
<#assign majorAppDataEntity = minorAppDERSs.getMajorPSAppDataEntity() />
{
name: '${majorAppDataEntity.getCodeName()?lower_case}',
prop: '${majorAppDataEntity.getKeyPSAppDEField().getCodeName()?lower_case}'
},
</#if>
</#list>
</#if>
</#if>
{
name: 'itemType',
},
];
switch (this.itemType) {
<#-- 地图项实体映射 -->
<#if ctrl.getPSSysMapItems()??>
<#list ctrl.getPSSysMapItems() as mapItem>
<#if mapItem.getPSAppDataEntity()??>
case "${mapItem.getItemType()?lower_case}":
dataItems =
[
...dataItems,
{
name: 'longitude',
prop: '${mapItem.getLongitudePSAppDEField().getCodeName()?lower_case}'
},
{
name: 'latitude',
prop: '${mapItem.getLatitudePSAppDEField().getCodeName()?lower_case}'
},
{
// 高度
name: 'height',
prop: '<#if mapItem.getAltitudePSAppDEField?? && mapItem.getAltitudePSAppDEField()??>${mapItem.getAltitudePSAppDEField().getCodeName()?lower_case}</#if>'
},
{
// 背景颜色
name: 'height',
prop: '<#if mapItem.getBKColorPSAppDEField?? && mapItem.getBKColorPSAppDEField()??>${mapItem.getBKColorPSAppDEField().getCodeName()?lower_case}</#if>'
},
{
// 提示
name: 'tips',
prop: '<#if mapItem.getTipsPSAppDEField?? && mapItem.getTipsPSAppDEField()??>${mapItem.getTipsPSAppDEField().getCodeName()?lower_case}</#if>'
},
{
// 文本值
name: 'text',
prop: '<#if mapItem.getTextPSAppDEField?? && mapItem.getTextPSAppDEField()??>${mapItem.getTextPSAppDEField().getCodeName()?lower_case}</#if>'
},
{
// 排序
name: 'height',
prop: '<#if mapItem.getOrderValuePSAppDEField?? && mapItem.getOrderValuePSAppDEField()??>${mapItem.getOrderValuePSAppDEField().getCodeName()?lower_case}</#if>'
},
{
// 字体颜色
name: 'fontcolor',
prop: '<#if mapItem.getColorPSAppDEField?? && mapItem.getColorPSAppDEField()??>${mapItem.getColorPSAppDEField().getCodeName()?lower_case}</#if>'
},
{
// 数据项内容
name: 'content',
prop: '<#if mapItem.getContentPSDEField?? && mapItem.getContentPSDEField()??>${mapItem.getContentPSDEField().getCodeName()?lower_case}</#if>'
},
{
// 分组
name: 'group',
prop: '<#if mapItem.getGroupPSAppDEField?? && mapItem.getGroupPSAppDEField()??>${mapItem.getGroupPSAppDEField().getCodeName()?lower_case}</#if>'
},
{
// 图标
name: 'icon',
prop: '<#if mapItem.getIconPSAppDEField?? && mapItem.getIconPSAppDEField()??>${mapItem.getIconPSAppDEField().getCodeName()?lower_case}</#if>'
},
];
break;
</#if>
</#list>
</#if>
}
return dataItems;
}
<#ibizinclude>
../@MACRO/MODEL/MODEL_BOTTOM.ts.ftl
</#ibizinclude>
\ No newline at end of file
<#assign import_block>
<#if ctrl.getPSSysMapItems?? && ctrl.getPSSysMapItems()??>
<#list ctrl.getPSSysMapItems() as mapitem>
<#if mapitem.getPSAppDataEntity()??>
<#assign _appde = mapitem.getPSAppDataEntity() />
<#if _appde.getId() != appde.getId()>
<#if !P.exists("importService", _appde.getId(), "")>
import ${srfclassname('${_appde.getCodeName()}')}Service from '@/service/${srffilepath2(_appde.getCodeName())}/${srffilepath2(_appde.getCodeName())}-service';
</#if>
</#if>
</#if>
</#list>
</#if>
</#assign>
<#ibizinclude>
../@MACRO/SERVICE/SERVICE_HEADER.ts.ftl
</#ibizinclude>
<#if ctrl.getPSSysMapItems?? && ctrl.getPSSysMapItems()??>
<#list ctrl.getPSSysMapItems() as mapitem>
<#if mapitem.getPSAppDataEntity()??>
<#assign _appde = mapitem.getPSAppDataEntity() />
<#if _appde.getId() != appde.getId()>
<#if !P.exists("importService", _appde.getId(), "")>
/**
* ${_appde.getLogicName()}服务对象
*
* @type {${srfclassname('${_appde.getCodeName()}')}Service}
* @memberof ${srfclassname('${ctrl.codeName}')}Service
*/
public ${_appde.getCodeName()?lower_case}Service: ${srfclassname('${_appde.getCodeName()}')}Service = new ${srfclassname('${_appde.getCodeName()}')}Service();
</#if>
</#if>
</#if>
</#list>
</#if>
/**
* 地图配置集合
*
* @type {*}
* @memberof ${srfclassname('${ctrl.codeName}')}Service
*/
public mapConfig: any[] = [
<#if ctrl.getPSSysMapItems?? && ctrl.getPSSysMapItems()??>
<#list ctrl.getPSSysMapItems() as mapitem>
{
itemName: '${mapitem.getName()}',
itemType: '${mapitem.getItemType()}',
color : '${mapitem.getBKColor()}',
textColor : '${mapitem.getColor()}'
}<#if mapitem_has_next>,</#if>
</#list>
</#if>
];
/**
* 查询数据
*
* @param {string} action
* @param {*} [context={}]
* @param {*} [data={}]
* @param {boolean} [isloading]
* @returns {Promise<any>}
* @memberof ${srfclassname('${ctrl.codeName}')}Service
*/
@Errorlog
public search(action: string, context: any = {},data: any = {}, isloading?: boolean): Promise<any> {
let _this = this;
return new Promise((resolve: any, reject: any) => {
let promises:any = [];
let tempRequest:any;
<#if ctrl.getPSSysMapItems()??>
<#list ctrl.getPSSysMapItems() as mapitem>
<#if mapitem.getPSAppDataEntity()?? && mapitem.getPSDEDataSet()??>
<#assign _appde = mapitem.getPSAppDataEntity() />
<#assign deDataSet = mapitem.getPSDEDataSet() />
<#if !P.exists("importService3", _appde.getId() + deDataSet.getCodeName(), "")>
<#if _appde.getId() == appde.getId()>
tempRequest = this.handleRequestData(action,context,data,true,"${mapitem.getItemType()}");
promises.push(this.appEntityService.Fetch${deDataSet.getCodeName()}(tempRequest.context, tempRequest.data, isloading));
<#else>
tempRequest = this.handleRequestData(action,context,data,true,"${mapitem.getItemType()}");
promises.push(this.${_appde.getCodeName()?lower_case}Service.Fetch${deDataSet.getCodeName()}(tempRequest.context, tempRequest.data, isloading));
</#if>
</#if>
</#if>
</#list>
</#if>
Promise.all(promises).then((resArray: any) => {
let _data:any = [];
resArray.forEach((response:any,resIndex:number) => {
if (!response || response.status !== 200) {
return;
}
let _response: any = JSON.parse(JSON.stringify(response));
_response.data.forEach((item:any,index:number) =>{
_response.data[index].color = _this.mapConfig[resIndex].color;
_response.data[index].textColor = _this.mapConfig[resIndex].textColor;
_response.data[index].itemType = _this.mapConfig[resIndex].itemType;
});
;
_this.handleResponse(action, _response,false,_this.mapConfig[resIndex].itemType);
_data.push(..._response.data);
});
let result = {status: 200, data: _data};
resolve(result);
}).catch((response: any) => {
reject(response);
});
});
}
/**
* 处理request请求数据
*
* @param action 行为
* @param data 数据
* @memberof ${srfclassname('${ctrl.codeName}')}Service
*/
public handleRequestData(action: string,context:any ={},data: any = {},isMerge:boolean = false,itemType:string=""){
let model: any = this.getMode();
model.itemType = itemType;
return super.handleRequestData(action,context,data,isMerge);
}
/**
* 处理response返回数据
*
* @param {string} action
* @param {*} response
* @memberof ${srfclassname('${ctrl.codeName}')}Service
*/
public async handleResponse(action: string, response: any,isCreate:boolean = false,itemType:string=""){
let model: any = this.getMode();
model.itemType = itemType;
super.handleResponse(action,response,isCreate);
}
<#ibizinclude>
../@MACRO/SERVICE/SERVICE_BOTTOM.ts.ftl
</#ibizinclude>
\ No newline at end of file
CTRLTYPE=MAP
\ No newline at end of file
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
<#else> <#else>
<div class="app-data-chart<#if ctrl.getPSSysCss?? && ctrl.getPSSysCss()??><#assign singleCss = ctrl.getPSSysCss()> ${singleCss.getCssName()}</#if>"> <div class="app-data-chart<#if ctrl.getPSSysCss?? && ctrl.getPSSysCss()??><#assign singleCss = ctrl.getPSSysCss()> ${singleCss.getCssName()}</#if>">
<div v-show="isNoData" class="chart-no-data"><i class="el-icon-data-analysis"></i>{{$t('<#if langbase??>${langbase}.nodata</#if>')}}</div> <div v-show="isNoData" class="chart-no-data"><i class="el-icon-data-analysis"></i>{{$t('<#if langbase??>${langbase}.nodata</#if>')}}</div>
<div v-show="!isNoData" class="app-charts" :id="chartId" style="<#if ctrl.getWidth() gt 0>width: ${ctrl.getWidth()};</#if>height: <#if ctrl.getHeight() gt 0>${ctrl.getHeight()}px<#else>100%</#if>;padding: 6px 0;"></div> <div v-show="!isNoData" class="app-charts" :id="chartId" style="<#if ctrl.getWidth() gt 0>width: ${ctrl.getWidth()?c}px;</#if>height: <#if ctrl.getHeight() gt 0>${ctrl.getHeight()?c}px<#else>100%</#if>;padding: 6px 0;"></div>
</div> </div>
</#if> </#if>
</template> </template>
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
<#else> <#else>
<div class="app-data-chart<#if ctrl.getPSSysCss?? && ctrl.getPSSysCss()??><#assign singleCss = ctrl.getPSSysCss()> ${singleCss.getCssName()}</#if>"> <div class="app-data-chart<#if ctrl.getPSSysCss?? && ctrl.getPSSysCss()??><#assign singleCss = ctrl.getPSSysCss()> ${singleCss.getCssName()}</#if>">
<div v-show="isNoData" class="chart-no-data"><i class="el-icon-data-analysis"></i>{{$t('<#if langbase??>${langbase}.nodata</#if>')}}</div> <div v-show="isNoData" class="chart-no-data"><i class="el-icon-data-analysis"></i>{{$t('<#if langbase??>${langbase}.nodata</#if>')}}</div>
<div v-show="!isNoData" class="app-charts" :id="chartId" style="<#if ctrl.getWidth() gt 0>width: ${ctrl.getWidth()};</#if>height: <#if ctrl.getHeight() gt 0>${ctrl.getHeight()}px<#else>100%</#if>;padding: 6px 0;"></div> <div v-show="!isNoData" class="app-charts" :id="chartId" style="<#if ctrl.getWidth() gt 0>width: ${ctrl.getWidth()?c}px;</#if>height: <#if ctrl.getHeight() gt 0>${ctrl.getHeight()?c}px<#else>100%</#if>;padding: 6px 0;"></div>
</div> </div>
</#if> </#if>
</template> </template>
......
...@@ -46,12 +46,22 @@ ...@@ -46,12 +46,22 @@
<#elseif ctrl.itemRender??> <#elseif ctrl.itemRender??>
${ctrl.itemRender.code} ${ctrl.itemRender.code}
<#else> <#else>
<img v-if="item.srficonpath" :src="item.srficonpath" class="single-card-img" /> <div class="data-view-item">
<img v-else src="/assets/img/noimage.png" class="single-card-img" /> <img v-if="item.srficonpath" :src="item.srficonpath" class="single-card-img" />
<div class="single-card-default"> <img v-else src="/assets/img/noimage.png" class="single-card-img" />
<Tooltip :content="item.srfmajortext"> <div class="single-card-default">
{{item.srfmajortext}} <Tooltip :content="item.srfmajortext">
</Tooltip> {{item.srfmajortext}}
</Tooltip>
</div>
</div>
<div class="data-view-item-action">
<template v-for="(action,index) in Object.keys(ActionModel)">
<button type="info" :key="index" @click="uiAction(item, action, $event)">
<i :class="ActionModel[action].icon" style="margin-right:2px;"></i>
<span>{{ActionModel[action].caption}}</span>
</button>
</template>
</div> </div>
</#if> </#if>
</el-card> </el-card>
...@@ -75,12 +85,22 @@ ...@@ -75,12 +85,22 @@
<#elseif ctrl.itemRender??> <#elseif ctrl.itemRender??>
${ctrl.itemRender.code} ${ctrl.itemRender.code}
<#else> <#else>
<img v-if="item.srficonpath" :src="item.srficonpath" class="single-card-img" /> <div class="data-view-item">
<img v-else src="/assets/img/noimage.png" class="single-card-img" /> <img v-if="item.srficonpath" :src="item.srficonpath" class="single-card-img" />
<div class="single-card-default"> <img v-else src="/assets/img/noimage.png" class="single-card-img" />
<Tooltip :content="item.srfmajortext"> <div class="single-card-default">
{{item.srfmajortext}} <Tooltip :content="item.srfmajortext">
</Tooltip> {{item.srfmajortext}}
</Tooltip>
</div>
</div>
<div class="data-view-item-action">
<template v-for="(action,index) in Object.keys(ActionModel)">
<button type="info" :key="index" @click="uiAction(item, action, $event)">
<i :class="ActionModel[action].icon" style="margin-right:2px;"></i>
<span>{{ActionModel[action].caption}}</span>
</button>
</template>
</div> </div>
</#if> </#if>
</el-card> </el-card>
...@@ -94,8 +114,31 @@ ...@@ -94,8 +114,31 @@
</el-collapse> </el-collapse>
</#if> </#if>
</row> </row>
<div v-else class="app-data-empty">{{ $t('<#if langbase??>${langbase}.nodata</#if>') }}</div> <div v-else class="app-data-empty">
{{ $t('<#if langbase??>${langbase}.nodata</#if>') }}
<#if ctrl.getQuickPSDEToolbar?? && ctrl.getQuickPSDEToolbar()??>
<span class="quick-toolbar">
<#assign quickToolbar = ctrl.getQuickPSDEToolbar()/>
<@ibizindent blank=12>
${P.getCtrlCode(quickToolbar, 'CONTROL.html').code}
</@ibizindent>
</span>
</#if>
</div>
<el-backtop target=".content-container .app-data-view"></el-backtop> <el-backtop target=".content-container .app-data-view"></el-backtop>
<#if ctrl.getBatchPSDEToolbar?? && ctrl.getBatchPSDEToolbar()??>
<row class='dataview-pagination'>
<div v-show="flag" class="batch-toolbar">
<#assign batchToolbar = ctrl.getBatchPSDEToolbar()/>
<@ibizindent blank=12>
${P.getCtrlCode(batchToolbar, 'CONTROL.html').code}
</@ibizindent>
</div>
<div class="dataview-pagination-icon">
<Icon type="md-code-working" @click="onClick"/>
</div>
</row>
</#if>
</div> </div>
</#if> </#if>
</template> </template>
...@@ -353,6 +396,16 @@ import CodeListService from "@/codelist/codelist-service"; ...@@ -353,6 +396,16 @@ import CodeListService from "@/codelist/codelist-service";
* @memberof ${srfclassname('${ctrl.codeName}')}Base * @memberof ${srfclassname('${ctrl.codeName}')}Base
*/ */
@Prop() public isSingleSelect?: boolean; @Prop() public isSingleSelect?: boolean;
<#if ctrl.getQuickPSDEToolbar?? && ctrl.getQuickPSDEToolbar()??>
<#assign quickToolbar = ctrl.getQuickPSDEToolbar()/>
${P.getCtrlCode(quickToolbar, 'CONTROL.vue').code}
</#if>
<#if ctrl.getBatchPSDEToolbar?? && ctrl.getBatchPSDEToolbar()??>
<#assign batchToolbar = ctrl.getBatchPSDEToolbar()/>
${P.getCtrlCode(batchToolbar, 'CONTROL.vue').code}
</#if>
/** /**
* 数据 * 数据
...@@ -362,6 +415,23 @@ import CodeListService from "@/codelist/codelist-service"; ...@@ -362,6 +415,23 @@ import CodeListService from "@/codelist/codelist-service";
*/ */
public items: any[] = []; public items: any[] = [];
/**
* 操作栏模型数据
*
* @type {*}
* @memberof ${srfclassname('${ctrl.codeName}')}Base
*/
public ActionModel:any ={
<#if ctrl.getPSAppViewUIActions?? && ctrl.getPSAppViewUIActions()??>
<#list ctrl.getPSAppViewUIActions() as viewUIAction>
<#if viewUIAction.getPSUIAction?? && viewUIAction.getPSUIAction()??>
<#assign UIAction = viewUIAction.getPSUIAction() />
"${UIAction.getUIActionTag()}":{name:"${UIAction.getUIActionTag()}",icon:"<#if UIAction.getPSSysImage()??><#assign img=UIAction.getPSSysImage() /><#if img.getCssClass()?? && (img.getCssClass()?length gt 0)>${img.getCssClass()}</#if></#if>",caption:"${UIAction.getCaption()}",disabled: false, visabled: true,noprivdisplaymode:<#if UIAction.getNoPrivDisplayMode(view)??>${UIAction.getNoPrivDisplayMode(view)}</#if>,dataaccaction: "<#if UIAction.getDataAccessAction()??>${UIAction.getDataAccessAction()}</#if>", actiontarget: "${UIAction.getActionTarget()}"}<#if viewUIAction_has_next>,</#if>
</#if>
</#list>
</#if>
};
/** /**
* 是否支持分页 * 是否支持分页
* *
...@@ -434,6 +504,24 @@ import CodeListService from "@/codelist/codelist-service"; ...@@ -434,6 +504,24 @@ import CodeListService from "@/codelist/codelist-service";
*/ */
public appStateEvent: Subscription | undefined; public appStateEvent: Subscription | undefined;
/**
* 默认隐藏批量操作工具栏
*
* @type {boolean}
* @memberof ${srfclassname('${ctrl.codeName}')}Base
*/
public flag: boolean = false;
/**
* 更改批量操作工具栏显示状态
*
* @param $event
* @memberof ${srfclassname('${ctrl.codeName}')}Base
*/
public onClick($event: any){
this.flag = !this.flag;
}
/** /**
* 排序点击事件 * 排序点击事件
* @param {string} field 属性名 * @param {string} field 属性名
...@@ -485,13 +573,15 @@ import CodeListService from "@/codelist/codelist-service"; ...@@ -485,13 +573,15 @@ import CodeListService from "@/codelist/codelist-service";
* @memberof ${srfclassname('${ctrl.codeName}')}Base * @memberof ${srfclassname('${ctrl.codeName}')}Base
*/ */
public afterMounted(){ public afterMounted(){
<#if ctrl.isEnablePagingBar()>
this.$el.addEventListener('scroll', ()=> { this.$el.addEventListener('scroll', ()=> {
let el: any = this.$el.getElementsByClassName('dataview-pagination')[0];
el.style.top = 40 + this.$el.scrollTop + 'px';
<#if ctrl.isEnablePagingBar()>
if( this.$el.scrollTop + this.$el.clientHeight >= this.$el.scrollHeight) { if( this.$el.scrollTop + this.$el.clientHeight >= this.$el.scrollHeight) {
this.loadMore(); this.loadMore();
} }
})
</#if> </#if>
})
} }
/** /**
...@@ -875,6 +965,29 @@ import CodeListService from "@/codelist/codelist-service"; ...@@ -875,6 +965,29 @@ import CodeListService from "@/codelist/codelist-service";
}); });
this.$emit('selectionchange', this.selections); this.$emit('selectionchange', this.selections);
} }
/**
* 操作列界面行为
*
* @param {*} data
* @param {*} tag
* @param {*} $event
* @memberof ${srfclassname('${ctrl.codeName}')}Base
*/
public uiAction(data: any, tag: any, $event: any) {
$event.stopPropagation();
<#if ctrl.getPSAppViewLogics()??>
<#list ctrl.getPSAppViewLogics() as logic>
<#if logic.getPSAppViewUIAction().getPSUIAction()??>
<#assign action = logic.getPSAppViewUIAction().getPSUIAction()>
if(Object.is('${action.getUIActionTag()}', tag)) {
this.${logic.getName()}(data, tag, $event);
}
</#if>
</#list>
</#if>
}
<#ibizinclude> <#ibizinclude>
../@MACRO/CONTROL/CONTROL_BOTTOM-BASE.vue.ftl ../@MACRO/CONTROL/CONTROL_BOTTOM-BASE.vue.ftl
</#ibizinclude> </#ibizinclude>
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
height: 100%; height: 100%;
overflow-y: auto; overflow-y: auto;
overflow-x: hidden; overflow-x: hidden;
position: relative;
// 排序栏样式 // 排序栏样式
.bar-container{ .bar-container{
padding: 6px 8px; padding: 6px 8px;
...@@ -98,23 +99,35 @@ ...@@ -98,23 +99,35 @@
width: 100%; width: 100%;
cursor: pointer; cursor: pointer;
border: 2px solid transparent; border: 2px solid transparent;
.single-card-default { .data-view-item{
.ivu-tooltip{ .single-card-default {
.ivu-tooltip-rel{ .ivu-tooltip{
width: 150px; .ivu-tooltip-rel{
white-space: nowrap; width: 150px;
text-overflow: ellipsis; white-space: nowrap;
overflow: hidden; text-overflow: ellipsis;
text-align: left; overflow: hidden;
padding-left: 5px; text-align: left;
font-size: 18px; padding-left: 5px;
font-weight: 800; font-size: 18px;
} font-weight: 800;
} }
}
}
.single-card-img {
width: 150px;
height: calc(100% - 32px);
}
} }
.single-card-img { .data-view-item-action{
width: 150px; button{
height: calc(100% - 32px); margin: 0 3px;
cursor: pointer;
padding:3px;
}
button:hover{
color: #409eff;
}
} }
} }
.isselected{ .isselected{
...@@ -149,6 +162,36 @@ ...@@ -149,6 +162,36 @@
.el-backtop { .el-backtop {
position: absolute; position: absolute;
} }
<#if ctrl.getBatchPSDEToolbar?? && ctrl.getBatchPSDEToolbar()??>
.dataview-pagination {
position: absolute;
height: 42px;
width: 100%;
top: 40px;
display: flex;
justify-content: flex-end;
align-items: center;
text-align: center;
font-size: 20px;
z-index: 5;
.dataview-pagination-icon{
width: 30px;
height: 30px;
display: flex;
align-items: center;
justify-content: center;
text-align: center;
border:1px solid #dcdee2;
border-radius: 50%;
background-color: #FFF;
margin: 3px;
}
.dataview-pagination-icon:hover{
background-color: #409eff;
color: #fff;
}
}
</#if>
} }
<#ibizinclude> <#ibizinclude>
../@MACRO/CSS/DEFAULT.less.ftl ../@MACRO/CSS/DEFAULT.less.ftl
......
...@@ -11,9 +11,17 @@ ${ctrl.render.code} ...@@ -11,9 +11,17 @@ ${ctrl.render.code}
<#if ctrl.groupRender??> <#if ctrl.groupRender??>
${ctrl.groupRender.code} ${ctrl.groupRender.code}
<#else> <#else>
<div :key="group + index" class="dataview-group-content" style="<#if ctrl.getGroupWidth() gt 0>width: ${ctrl.getGroupWidth()?c}px;<#else>flex-grow: 1;</#if>"> <div :key="index" class="dataview-group-folading-kanban">
<div class="dataview-group-icon">
<Icon :type="group.folding ? 'md-arrow-dropright' : 'md-arrow-dropleft'" size="25" @click="onClick(group,index)"/>
</div>
<div class="dataview-group-folding">
<span>{{getGroupText(group.value)}}({{group.items.length}})</span>
</div>
</div>
<div :key="group + index" class="dataview-group-content dataview-group-kanban" style="<#if ctrl.getGroupWidth() gt 0>width: ${ctrl.getGroupWidth()?c}px;<#else>flex-grow: 1;</#if>">
<div class="dataview-group-header<#if ctrl.getGroupPSSysCss()??> ${ctrl.getGroupPSSysCss().getCssName()}</#if>"> <div class="dataview-group-header<#if ctrl.getGroupPSSysCss()??> ${ctrl.getGroupPSSysCss().getCssName()}</#if>">
{{ getGroupText(group.name) }} {{ getGroupText(group.value) }}
<#if ctrl.getGroupPSUIActionGroup()??> <#if ctrl.getGroupPSUIActionGroup()??>
<Poptip trigger="hover" content="content" placement="bottom-end" style="float: right;"> <Poptip trigger="hover" content="content" placement="bottom-end" style="float: right;">
<Icon type="md-more" /> <Icon type="md-more" />
...@@ -38,11 +46,11 @@ ${ctrl.render.code} ...@@ -38,11 +46,11 @@ ${ctrl.render.code}
</Poptip> </Poptip>
</#if> </#if>
</div> </div>
<draggable :list="group.items" group="${ctrl.name}" class="dataview-group-items" @change="onDragChange($event, group.name)"> <draggable :list="group.items" group="${ctrl.name}" class="dataview-group-items" @change="onDragChange($event, group.value)">
<div v-for="(item, i) in group.items" :key="i" :class="{'dataview-group-item': true, 'is-select': item.isselected}" @click="handleClick(item)" @dblclick="handleDblClick(item)"> <div v-for="(item, i) in group.items" :key="i" :class="{'dataview-group-item': true, 'is-select': item.isselected}" @click="handleClick(item)" @dblclick="handleDblClick(item)">
<#if ctrl.getItemPSLayoutPanel()??> <#if ctrl.getItemPSLayoutPanel()??>
<#assign panel = ctrl.getItemPSLayoutPanel()> <#assign panel = ctrl.getItemPSLayoutPanel()>
<layout_${panel.getName()} name='${panel.name}' :inputData="item"></layout_${panel.getName()}> <layout_${panel.getName()} name='${panel.name}' :inputData="item" @panelDataChange="($event)=>{onPanelDataChange(item,$event)}"></layout_${panel.getName()}>
<#elseif ctrl.itemRender??> <#elseif ctrl.itemRender??>
${ctrl.itemRender.code} ${ctrl.itemRender.code}
<#else> <#else>
...@@ -81,6 +89,7 @@ ${ctrl.render.code} ...@@ -81,6 +89,7 @@ ${ctrl.render.code}
</template> </template>
<#assign import_block> <#assign import_block>
import draggable from "vuedraggable"; import draggable from "vuedraggable";
import CodeListService from '@codelist/codelist-service';
</#assign> </#assign>
<#assign component_block> <#assign component_block>
draggable, draggable,
...@@ -235,6 +244,22 @@ draggable, ...@@ -235,6 +244,22 @@ draggable,
*/ */
public selections: Array<any> = []; public selections: Array<any> = [];
/**
* 代码表服务
*
* @type {CodeListService}
* @memberof ${srfclassname('${ctrl.codeName}')}Base
*/
public codeListService:CodeListService = new CodeListService( {$store: this.$store});
/**
* 代码表数据
*
* @type {Array<any>}
* @memberof ${srfclassname('${ctrl.codeName}')}Base
*/
public allCodeList:Array<any> = [];
/** /**
* 当前页 * 当前页
* *
...@@ -296,13 +321,12 @@ draggable, ...@@ -296,13 +321,12 @@ draggable,
*/ */
public groupMode: string = '${ctrl.getGroupMode()}' public groupMode: string = '${ctrl.getGroupMode()}'
/** /**
* 分组模式 * 分组代码表
* *
* @type {string} * @type {string}
* @memberof ${srfclassname('${ctrl.codeName}')}Base * @memberof ${srfclassname('${ctrl.codeName}')}Base
*/ */
public groupCodelist: string = '<#if ctrl.getGroupPSCodeList()??>${ctrl.getGroupPSCodeList().getCodeName()}</#if>' public groupCodelist: any = {<#if ctrl.getGroupPSCodeList()??>type:'${ctrl.getGroupPSCodeList().getCodeListType()}',tag:'${ctrl.getGroupPSCodeList().getCodeName()}'</#if>};
/** /**
* Vue声明周期,组件挂载完毕 * Vue声明周期,组件挂载完毕
* *
...@@ -413,7 +437,7 @@ draggable, ...@@ -413,7 +437,7 @@ draggable,
* @param {boolean} [isReset=false] 是否重置items * @param {boolean} [isReset=false] 是否重置items
* @memberof ${srfclassname('${ctrl.codeName}')}Base * @memberof ${srfclassname('${ctrl.codeName}')}Base
*/ */
public load(opt: any = {}, isReset: boolean = false): void { public async load(opt: any = {}, isReset: boolean = false) {
if(!this.fetchAction){ if(!this.fetchAction){
this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: '${view.getName()}' + (this.$t('app.kanban.notConfig.fetchAction') as string) }); this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: '${view.getName()}' + (this.$t('app.kanban.notConfig.fetchAction') as string) });
return; return;
...@@ -585,7 +609,7 @@ draggable, ...@@ -585,7 +609,7 @@ draggable,
Object.assign(arg, { viewparams: this.viewparams }); Object.assign(arg, { viewparams: this.viewparams });
let _context = JSON.parse(JSON.stringify(this.context)); let _context = JSON.parse(JSON.stringify(this.context));
<#if ctrl.getPSAppDataEntity()??> <#if ctrl.getPSAppDataEntity()??>
Object.assign(_context, { ${ctrl.getPSAppDataEntity().getCodeName()?lower_case}: opt.task }); Object.assign(_context, { ${ctrl.getPSAppDataEntity().getCodeName()?lower_case}: opt.srfkey });
</#if> </#if>
const post: Promise<any> = this.service.update(this.updateGroupAction, _context, arg, this.showBusyIndicator); const post: Promise<any> = this.service.update(this.updateGroupAction, _context, arg, this.showBusyIndicator);
post.then((response: any) => { post.then((response: any) => {
...@@ -618,7 +642,7 @@ draggable, ...@@ -618,7 +642,7 @@ draggable,
* @param {} * @param {}
* @memberof ${srfclassname('${ctrl.codeName}')}Base * @memberof ${srfclassname('${ctrl.codeName}')}Base
*/ */
public setGroups() { public async setGroups() {
if(!this.isGroup || !this.groupField || Object.is(this.groupMode, 'NONE')) { if(!this.isGroup || !this.groupField || Object.is(this.groupMode, 'NONE')) {
return; return;
} }
...@@ -629,6 +653,7 @@ draggable, ...@@ -629,6 +653,7 @@ draggable,
if(!group) { if(!group) {
this.groups.push({ this.groups.push({
name: item[this.groupField], name: item[this.groupField],
value: item[this.groupField],
items: this.getGroupItems(item[this.groupField]) items: this.getGroupItems(item[this.groupField])
}) })
} }
...@@ -636,11 +661,13 @@ draggable, ...@@ -636,11 +661,13 @@ draggable,
} }
if(Object.is(this.groupMode, 'CODELIST') && this.groupCodelist) { if(Object.is(this.groupMode, 'CODELIST') && this.groupCodelist) {
this.groups = []; this.groups = [];
let codelist: any = this.$store.getters.getCodeList(this.groupCodelist); let codelistItems: any = await this.codeListService.getDataItems(this.groupCodelist);
if(codelist) { this.allCodeList = Util.deepCopy(codelistItems);
codelist.items.forEach((item: any) => { if(codelistItems && codelistItems.length >0) {
codelistItems.forEach((item: any) => {
this.groups.push({ this.groups.push({
name: item.value, name: item.value,
value: item.value,
items: this.getGroupItems(item.value) items: this.getGroupItems(item.value)
}) })
}) })
...@@ -672,18 +699,18 @@ draggable, ...@@ -672,18 +699,18 @@ draggable,
*/ */
public getGroupText(name: string) { public getGroupText(name: string) {
if(Object.is(this.groupMode, 'CODELIST') && this.groupCodelist) { if(Object.is(this.groupMode, 'CODELIST') && this.groupCodelist) {
let codelist: any = this.$store.getters.getCodeList(this.groupCodelist); if(this.allCodeList && this.allCodeList.length >0) {
if(codelist) {
if(!name) { if(!name) {
return codelist.emptytext; return '未定义';
} }
let item = codelist.items.find((item: any) => Object.is(item.value, name)); let item = this.allCodeList.find((item: any) => Object.is(item.value, name));
if(item) { if(item) {
return item.text; return item.text;
} }
} }
}else{
return name;
} }
return name;
} }
/** /**
...@@ -731,6 +758,24 @@ draggable, ...@@ -731,6 +758,24 @@ draggable,
this.$emit('selectionchange', this.selections); this.$emit('selectionchange', this.selections);
} }
/**
* 点击时触发看板的展开和收起
*
* @param group 分组看板
* @param index 分组看板编号
* @memberof ${srfclassname('${ctrl.codeName}')}Base
*/
public onClick(group: any,index: number){
group.folding = !group.folding;
let kanban: any = this.$el.getElementsByClassName('dataview-group-kanban')[index];
if(group.folding){
kanban.style.display="none";
}else{
kanban.style.display="block";
}
this.$forceUpdate();
}
/** /**
* 界面行为 * 界面行为
* *
...@@ -752,6 +797,17 @@ draggable, ...@@ -752,6 +797,17 @@ draggable,
</#if> </#if>
} }
/**
* 面板数据变化处理事件
* @param {any} item 当前列数据
* @param {any} $event 面板事件数据
*
* @memberof ${srfclassname('${ctrl.codeName}')}Base
*/
public onPanelDataChange(item:any,$event:any) {
Object.assign(item, $event, {rowDataState:'update'});
}
/** /**
* 拖拽变化 * 拖拽变化
* *
......
...@@ -2,6 +2,24 @@ ...@@ -2,6 +2,24 @@
height: 100%; height: 100%;
display: flex; display: flex;
overflow: auto; overflow: auto;
.dataview-group-folading-kanban{
border: 1px solid #ddd;
text-align: center;
border-left: 0;
height: 100%;
width: 40px;
background-color: #d8d8d8;
color: #a5a5a5;
.dataview-group-icon{
padding: 6px 0;
}
.dataview-group-folding{
height: calc(100% - 39px);
writing-mode: tb;
width: 31px;
font-size: 17px;
}
}
.dataview-group-content { .dataview-group-content {
border: 1px solid #ddd; border: 1px solid #ddd;
border-left: 0; border-left: 0;
......
...@@ -40,6 +40,14 @@ import { Environment } from '@/environments/environment'; ...@@ -40,6 +40,14 @@ import { Environment } from '@/environments/environment';
*/ */
public formKeyItemName: string = '<#list ctrl.getPSDEFormItems() as formitem><#if formitem.getPSAppDEField?? && formitem.getPSAppDEField()??><#if !formitem.isHidden() && formitem.getPSAppDEField().isKeyField()>${formitem.getName()}</#if></#if></#list>'; public formKeyItemName: string = '<#list ctrl.getPSDEFormItems() as formitem><#if formitem.getPSAppDEField?? && formitem.getPSAppDEField()??><#if !formitem.isHidden() && formitem.getPSAppDEField().isKeyField()>${formitem.getName()}</#if></#if></#list>';
/**
* 是否自动加载
*
* @type {boolean}
* @memberof ${srfclassname('${ctrl.codeName}')}Base
*/
@Prop({default:false}) public isautoload?:boolean;
/** /**
* 界面UI服务对象 * 界面UI服务对象
* *
...@@ -440,34 +448,40 @@ import { Environment } from '@/environments/environment'; ...@@ -440,34 +448,40 @@ import { Environment } from '@/environments/environment';
startOp(true); startOp(true);
return falg; return falg;
} }
// 常规规则 try {
if(item.type == 'SIMPLE'){ // 常规规则
startOp(!this.$verify.checkFieldSimpleRule(dataValue,item.condOP,item.paramValue,item.ruleInfo,item.paramType,this.data,item.isKeyCond)); if(item.type == 'SIMPLE'){
falg.infoMessage = item.ruleInfo; startOp(!this.$verify.checkFieldSimpleRule(dataValue,item.condOP,item.paramValue,item.ruleInfo,item.paramType,this.data,item.isKeyCond));
if(!falg.isPast) return falg; falg.infoMessage = item.ruleInfo;
} if(!falg.isPast) return falg;
// 数值范围 }
if(item.type == 'VALUERANGE2'){ // 数值范围
startOp( !this.$verify.checkFieldValueRangeRule(dataValue,item.minValue,item.isIncludeMinValue,item.maxValue,item.isIncludeMaxValue,item.ruleInfo,item.isKeyCond)); if(item.type == 'VALUERANGE2'){
falg.infoMessage = item.ruleInfo; startOp( !this.$verify.checkFieldValueRangeRule(dataValue,item.minValue,item.isIncludeMinValue,item.maxValue,item.isIncludeMaxValue,item.ruleInfo,item.isKeyCond));
if(!falg.isPast) return falg; falg.infoMessage = item.ruleInfo;
} if(!falg.isPast) return falg;
// 正则式 }
if (item.type == "REGEX") { // 正则式
startOp(!this.$verify.checkFieldRegExRule(dataValue,item.regExCode,item.ruleInfo,item.isKeyCond)); if (item.type == "REGEX") {
falg.infoMessage = item.ruleInfo; startOp(!this.$verify.checkFieldRegExRule(dataValue,item.regExCode,item.ruleInfo,item.isKeyCond));
if(!falg.isPast) return falg; falg.infoMessage = item.ruleInfo;
} if(!falg.isPast) return falg;
// 长度 }
if (item.type == "STRINGLENGTH") { // 长度
startOp(!this.$verify.checkFieldStringLengthRule(dataValue,item.minValue,item.isIncludeMinValue,item.maxValue,item.isIncludeMaxValue,item.ruleInfo,item.isKeyCond)); if (item.type == "STRINGLENGTH") {
falg.infoMessage = item.ruleInfo; startOp(!this.$verify.checkFieldStringLengthRule(dataValue,item.minValue,item.isIncludeMinValue,item.maxValue,item.isIncludeMaxValue,item.ruleInfo,item.isKeyCond));
if(!falg.isPast) return falg; falg.infoMessage = item.ruleInfo;
} if(!falg.isPast) return falg;
// 系统值规则 }
if(item.type == "SYSVALUERULE") { // 系统值规则
startOp(!this.$verify.checkFieldSysValueRule(dataValue,item.sysRule.regExCode,item.ruleInfo,item.isKeyCond)); if(item.type == "SYSVALUERULE") {
startOp(!this.$verify.checkFieldSysValueRule(dataValue,item.sysRule.regExCode,item.ruleInfo,item.isKeyCond));
falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
}
} catch(error) {
falg.infoMessage = item.ruleInfo; falg.infoMessage = item.ruleInfo;
startOp(false);
if(!falg.isPast) return falg; if(!falg.isPast) return falg;
} }
// 分组 // 分组
...@@ -482,7 +496,7 @@ import { Environment } from '@/environments/environment'; ...@@ -482,7 +496,7 @@ import { Environment } from '@/environments/environment';
if(!falg.hasOwnProperty("isPast")){ if(!falg.hasOwnProperty("isPast")){
falg.isPast = true; falg.isPast = true;
} }
if(!this.data[name]){ if(!this.data[name] && this.data[name] != 0){
falg.isPast = true; falg.isPast = true;
} }
return falg; return falg;
...@@ -995,6 +1009,9 @@ import { Environment } from '@/environments/environment'; ...@@ -995,6 +1009,9 @@ import { Environment } from '@/environments/environment';
* @memberof ${srfclassname('${ctrl.codeName}')}Base * @memberof ${srfclassname('${ctrl.codeName}')}Base
*/ */
public afterCreated(){ public afterCreated(){
if(this.isautoload){
this.autoLoad({srfkey:this.context.documentcenter});
}
if (this.viewState) { if (this.viewState) {
this.viewStateEvent = this.viewState.subscribe(({ tag, action, data }) => { this.viewStateEvent = this.viewState.subscribe(({ tag, action, data }) => {
if (!Object.is(tag, this.name)) { if (!Object.is(tag, this.name)) {
...@@ -1952,6 +1969,17 @@ import { Environment } from '@/environments/environment'; ...@@ -1952,6 +1969,17 @@ import { Environment } from '@/environments/environment';
</#if> </#if>
</#if> </#if>
/**
* 面板数据变化处理事件
* @param {any} item 当前列数据
* @param {any} $event 面板事件数据
*
* @memberof ${srfclassname('${ctrl.codeName}')}Base
*/
public onPanelDataChange(item:any,$event:any) {
Object.assign(item, $event, {rowDataState:'update'});
}
<#ibizinclude> <#ibizinclude>
../@MACRO/CONTROL/CONTROL_BOTTOM-BASE.vue.ftl ../@MACRO/CONTROL/CONTROL_BOTTOM-BASE.vue.ftl
......
此差异已折叠。
<#ibizinclude>
../@MACRO/HTML/GRID.html.ftl
</#ibizinclude>
\ No newline at end of file
<#ibizinclude>
../@MACRO/CSS/DEFAULT.less.ftl
</#ibizinclude>
\ No newline at end of file
<#ibizinclude>
../@MACRO/CONTROL/CONTROL.vue.ftl
</#ibizinclude>
\ No newline at end of file
<#ibizinclude>
../@MACRO/MODEL/MODEL_HEADER.ts.ftl
</#ibizinclude>
/**
* 是否是实体数据导出
*
* @returns {any[]}
* @memberof ${srfclassname('${ctrl.getCodeName()}')}${srfclassname('${ctrl.name}')}Mode
*/
public isDEExport: boolean = false;
/**
* 获取数据项集合
*
* @returns {any[]}
* @memberof ${srfclassname('${ctrl.getCodeName()}')}${srfclassname('${ctrl.name}')}Mode
*/
public getDataItems(): any[] {
if(this.isDEExport){
return [
<#-- 实体导出数据项 -->
<#if ctrl.getPSDEDataExport?? && ctrl.getPSDEDataExport()?? && ctrl.getPSDEDataExport().getPSDEDataExportItems()??>
<#list ctrl.getPSDEDataExport().getPSDEDataExportItems() as dataitem>
{
name: '${dataitem.getName()}',
<#if dataitem.getPSDEField()??>
prop: '${dataitem.getPSDEField().getCodeName()?lower_case}',
dataType: '${dataitem.getPSDEField().getDataType()}',
</#if>
<#if ctrl.getPSDEGridEditItems()??>
<#list ctrl.getPSDEGridEditItems() as editItem>
<#if editItem.getName() == dataitem.getName()>
<#if editItem.isEditable()>
isEditable:${editItem.isEditable()?c}
</#if>
</#if>
</#list>
</#if>
},
</#list>
</#if>
]
}else{
return [
<#-- 表格数据项 -->
<#if ctrl.getPSDEGridDataItems()??>
<#list ctrl.getPSDEGridDataItems() as dataitem>
{
name: '${dataitem.getName()}',
<#if dataitem.getPSDEField()??>
prop: '${dataitem.getPSDEField().getCodeName()?lower_case}',
dataType: '${dataitem.getPSDEField().getDataType()}',
</#if>
<#if ctrl.getPSDEGridEditItems()??>
<#list ctrl.getPSDEGridEditItems() as editItem>
<#if editItem.getName() == dataitem.getName()>
<#if editItem.isEditable()>
isEditable:${editItem.isEditable()?c}
</#if>
</#if>
</#list>
</#if>
},
</#list>
</#if>
<#-- 关联主实体的主键 -->
<#if ctrl.getPSAppDataEntity()??>
<#assign appDataEntity = ctrl.getPSAppDataEntity() />
<#if appDataEntity.isMajor() == false && appDataEntity.getMinorPSAppDERSs()??>
<#list appDataEntity.getMinorPSAppDERSs() as minorAppDERSs>
<#if minorAppDERSs.getMajorPSAppDataEntity()??>
<#assign majorAppDataEntity = minorAppDERSs.getMajorPSAppDataEntity() />
{
name: '${majorAppDataEntity.getCodeName()?lower_case}',
prop: '${minorAppDERSs.getPSDER1N().getPSPickupDEField().getCodeName()?lower_case}',
dataType: 'FONTKEY',
},
</#if>
</#list>
</#if>
</#if>
<#if ctrl.getPSDEGridDataItems()??>
<#list ctrl.getPSDEGridDataItems() as dataitem>
<#-- 界面主键标识 -->
<#if dataitem.getPSDEField?? && dataitem.getPSDEField()??>
<#if !P.exists("importService", dataitem.getPSDEField().getId(), "")>
<#if dataitem.getPSDEField().isKeyDEField() == true>
{
name: '${ctrl.getPSAppDataEntity().getCodeName()?lower_case}',
prop: '${dataitem.getPSDEField().getCodeName()?lower_case}',
},
</#if>
</#if>
</#if>
</#list>
</#if>
<#if view.hasPSControl('searchform')>
${P.getCtrlCode('searchform', 'MODEL_CONTENT.ts').code}
</#if>
{
name:'size',
prop:'size'
},
{
name:'query',
prop:'query'
},
{
name:'filter',
prop:'filter'
},
{
name:'page',
prop:'page'
},
{
name:'sort',
prop:'sort'
},
{
name:'srfparentdata',
prop:'srfparentdata'
},
// 前端新增修改标识,新增为"0",修改为"1"或未设值
{
name: 'srffrontuf',
prop: 'srffrontuf',
dataType: 'TEXT',
},
]
}
}
<#ibizinclude>
../@MACRO/MODEL/MODEL_BOTTOM.ts.ftl
</#ibizinclude>
\ No newline at end of file
此差异已折叠。
CTRLTYPE=GRID#PivotTable
\ No newline at end of file
<#ibizinclude>
../@MACRO/DEFAULT.less.ftl
</#ibizinclude>
\ No newline at end of file
<#ibizinclude>../../@MACRO/FUNC/MACRO.ftl</#ibizinclude>
<#assign MDContent><#t>
<#if view.getPSSysCounterRef?? && view.getPSSysCounterRef()?? && view.getPSSysCounterRef().getPSAppCounter()??>
<#assign appCounter = view.getPSSysCounterRef().getPSAppCounter() />
</#if>
<#if view.getViewType() == "DEGRIDVIEW9">
<#if view.hasPSControl('searchform')>
${P.getCtrlCode('searchform', 'CONTROL.html').code}
</#if>
<#if view.hasPSControl('grid')>
${P.getCtrlCode('grid', 'CONTROL.html').code}
</#if>
</#if>
<#-- BEGIN:快速搜索框或工具栏或支持快速分组搜索或快速搜索表单部件存在 -->
<#if (view.isEnableQuickSearch() || view.hasPSControl('toolbar') || view.isEnableQuickGroup() || view.getQuickPSDESearchForm()??)>
<div style='margin-bottom: 6px;'>
<#if view.isEnableQuickGroup()>
<div class="quick-group-container">
<app-quick-group :items="quickGroupModel" <#if appCounter??>:counterService="${srfclassname('${appCounter.getCodeName()}')}counterservice"</#if> @valuechange="qucikGroupValueChange"></app-quick-group>
</div>
</#if>
<#if view.getQuickPSDESearchForm()??>
<div class="quick-search-container">
<#assign quickSearchForm = view.getQuickPSDESearchForm() />
${P.getCtrlCode(quickSearchForm, 'CONTROL.html').code}
</div>
</#if>
<#if view.isEnableQuickSearch()>
<i-input<#if view.hasPSControl('searchform')><#if view.isExpandSearchForm??> v-show="!isExpandSearchForm"</#if></#if> v-model="query" search enter-button @on-search="onSearch($event)" class='quick-search-input' style='max-width: 400px;' placeholder="<@getQuickSearchPlaceholder view />" />
</#if>
<div class='pull-left'>
<#if view.hasPSControl('toolbar')>
<@ibizindent blank=8>
${P.getCtrlCode('toolbar', 'CONTROL.html').code}<#t>
</@ibizindent>
</#if>
</div>
</div>
</#if>
<#-- END:快速搜索或工具栏存在 -->
<#if view.getViewType() != "DEGRIDVIEW9">
<#if view.hasPSControl('searchform')>
${P.getCtrlCode('searchform', 'CONTROL.html').code}
</#if>
<#if view.hasPSControl('map')>
${P.getCtrlCode('map', 'CONTROL.html').code}
</#if>
</#if>
</#assign>
<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.srfTitle)" viewName="${view.getCodeName()?lower_case}"></app-studioaction>
<card class='view-card <#if !view.isShowCaptionBar()> view-no-caption</#if>' :dis-hover="true" :bordered="false">
<@ibizindent blank=8>
<#ibizinclude>
../@MACRO/VIEW_CAPTION.vue.ftl
</#ibizinclude>
</@ibizindent>
<div class='content-container'>
<#-- BEGIN:视图顶部视图消息 -->
<@ibizindent blank=12>
<#ibizinclude>
../@MACRO/View_Pos_Top_Msgs.vue.ftl
</#ibizinclude>
</@ibizindent>
<#-- END:视图顶部视图消息 -->
<#-- BEGIN:视图内容 -->
<@ibizindent blank=12>
<#ibizinclude>
../@MACRO/VIEW_MD_CONTENT.vue.ftl
</#ibizinclude>
</@ibizindent>
<#-- END:视图内容 -->
<#-- BEGIN:视图底部视图消息 -->
<@ibizindent blank=12>
<#ibizinclude>
../@MACRO/View_Pos_Bottom_Msgs.vue.ftl
</#ibizinclude>
</@ibizindent>
<#-- END:视图底部视图消息 -->
</div>
</card>
</div>
\ No newline at end of file
CTRLTYPE=VIEWLAYOUTPANEL#APPDEMAPVIEW
\ No newline at end of file
<#ibizinclude>
../@MACRO/DEFAULT.less.ftl
</#ibizinclude>
\ No newline at end of file
<#ibizinclude>../../@MACRO/FUNC/MACRO.ftl</#ibizinclude>
<#assign MDContent><#t>
<#if view.getPSSysCounterRef?? && view.getPSSysCounterRef()?? && view.getPSSysCounterRef().getPSAppCounter()??>
<#assign appCounter = view.getPSSysCounterRef().getPSAppCounter() />
</#if>
<#if view.getViewType() == "DEGRIDVIEW9">
<#if view.hasPSControl('searchform')>
${P.getCtrlCode('searchform', 'CONTROL.html').code}
</#if>
</#if>
<#-- BEGIN:快速搜索框或工具栏或支持快速分组搜索或快速搜索表单部件存在 -->
<#if (view.isEnableQuickSearch() || view.hasPSControl('toolbar') || view.isEnableQuickGroup() || view.getQuickPSDESearchForm()??)>
<div style='margin-bottom: 6px;'>
<#if view.isEnableQuickGroup()>
<div class="quick-group-container">
<app-quick-group :items="quickGroupModel" <#if appCounter??>:counterService="${srfclassname('${appCounter.getCodeName()}')}counterservice"</#if> @valuechange="qucikGroupValueChange"></app-quick-group>
</div>
</#if>
<#if view.getQuickPSDESearchForm()??>
<div class="quick-search-container">
<#assign quickSearchForm = view.getQuickPSDESearchForm() />
${P.getCtrlCode(quickSearchForm, 'CONTROL.html').code}
</div>
</#if>
<#if view.isEnableQuickSearch()>
<i-input<#if view.hasPSControl('searchform')><#if view.isExpandSearchForm??> v-show="!isExpandSearchForm"</#if></#if> v-model="query" search enter-button @on-search="onSearch($event)" class='quick-search-input' style='max-width: 400px;' placeholder="<@getQuickSearchPlaceholder view />" />
</#if>
<div class='pull-left'>
<#if view.hasPSControl('toolbar')>
<@ibizindent blank=8>
${P.getCtrlCode('toolbar', 'CONTROL.html').code}<#t>
</@ibizindent>
</#if>
</div>
</div>
</#if>
<#-- END:快速搜索或工具栏存在 -->
<#if view.getViewType() != "DEGRIDVIEW9">
<#if view.hasPSControl('searchform')>
${P.getCtrlCode('searchform', 'CONTROL.html').code}
</#if>
<#if view.hasPSControl('map')>
${P.getCtrlCode('map', 'CONTROL.html').code}
</#if>
</#if>
</#assign>
<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.srfTitle)" viewName="${view.getCodeName()?lower_case}"></app-studioaction>
<card class='view-card <#if !view.isShowCaptionBar()> view-no-caption</#if>' :dis-hover="true" :bordered="false">
<@ibizindent blank=8>
<#ibizinclude>
../@MACRO/VIEW_CAPTION.vue.ftl
</#ibizinclude>
</@ibizindent>
<div class='content-container'>
<#-- BEGIN:视图顶部视图消息 -->
<@ibizindent blank=12>
<#ibizinclude>
../@MACRO/View_Pos_Top_Msgs.vue.ftl
</#ibizinclude>
</@ibizindent>
<#-- END:视图顶部视图消息 -->
<#-- BEGIN:视图内容 -->
<@ibizindent blank=12>
<#ibizinclude>
../@MACRO/VIEW_MD_CONTENT.vue.ftl
</#ibizinclude>
</@ibizindent>
<#-- END:视图内容 -->
<#-- BEGIN:视图底部视图消息 -->
<@ibizindent blank=12>
<#ibizinclude>
../@MACRO/View_Pos_Bottom_Msgs.vue.ftl
</#ibizinclude>
</@ibizindent>
<#-- END:视图底部视图消息 -->
</div>
</card>
</div>
\ No newline at end of file
CTRLTYPE=VIEWLAYOUTPANEL#APPDEMAPVIEW9
\ No newline at end of file
<#ibizinclude>
../@MACRO/DEFAULT.less.ftl
</#ibizinclude>
\ 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>">
<app-studioaction :viewTitle="$t(model.srfCaption)" viewName="${view.getCodeName()?lower_case}"></app-studioaction>
<card class='view-card view-no-caption view-no-toolbar' :disHover="true" :padding="0" :bordered="false">
<div class="content-container">
<component
:is="activeForm.name"
:viewState="viewState"
:viewparams="viewparams"
:context="context"
:autosave="false"
:viewtag="viewtag"
:showBusyIndicator="activeForm.showBusyIndicator"
:updateAction="activeForm.updateAction"
:removeAction="activeForm.removeAction"
:loaddraftAction="activeForm.loaddraftAction"
:loadAction="activeForm.loadAction"
:createAction="activeForm.createAction"
:WFSubmitAction="activeForm.WFSubmitAction"
:WFStartAction="activeForm.WFStartAction"
name="form"
ref='form'>
</component>
</div>
<card dis-hover :bordered="false" class='footer'>
<row style=" text-align: right ">
<i-button type='primary' @click="onClickOk">{{ $t("app.commonWords.ok") }}</i-button>
&nbsp;&nbsp;
<i-button @click="onClickCancel">{{ $t("app.commonWords.cancel") }}</i-button>
</row>
</card>
</card>
</div>
\ No newline at end of file
CTRLTYPE=VIEWLAYOUTPANEL#APPDEWFDYNAACTIONVIEW
\ No newline at end of file
...@@ -15,11 +15,29 @@ ...@@ -15,11 +15,29 @@
</div> </div>
</div> </div>
<div class="content-container"> <div class="content-container">
<#if view.hasPSControl('form')> <component
<@ibizindent blank=8> :is="activeForm.name"
${P.getCtrlCode('form', 'CONTROL.html').code} :isautoload="true"
</@ibizindent> :viewState="viewState"
</#if> :viewparams="viewparams"
:context="context"
:autosave="false"
:viewtag="viewtag"
:showBusyIndicator="activeForm.showBusyIndicator"
:updateAction="activeForm.updateAction"
:removeAction="activeForm.removeAction"
:loaddraftAction="activeForm.loaddraftAction"
:loadAction="activeForm.loadAction"
:createAction="activeForm.createAction"
:WFSubmitAction="activeForm.WFSubmitAction"
:WFStartAction="activeForm.WFStartAction"
name="form"
ref='form'
@save="form_save($event)"
@remove="form_remove($event)"
@load="form_load($event)"
@closeview="closeView($event)">
</component>
</div> </div>
</card> </card>
</div> </div>
\ No newline at end of file
<#if editor?? && editor.render??> <#if editor?? && editor.render??>
${editor.render.code} ${editor.render.code}
<#else> <#else>
<i-input type="password" v-model="data.${editor.name}" :disabled="detailsModel.${editor.name}.disabled" style="${editor.getEditorCssStyle()}"></i-input> <i-input type="password" v-model="data.${editor.name}" <#if item.getPlaceHolder()??>placeholder="${item.getPlaceHolder()}"</#if> :disabled="detailsModel.${editor.name}.disabled" style="${editor.getEditorCssStyle()}"></i-input>
</#if> </#if>
\ No newline at end of file
<#if editor?? && editor.render??> <#if editor?? && editor.render??>
${editor.render.code} ${editor.render.code}
<#else> <#else>
<input-box type="password" :disabled="getColumnDisabled(row,column.property)" v-model="row[column.property]" style="${item.getEditorCssStyle()}" @change="($event)=>{gridEditItemChange(row, column.property, $event, $index)}"></input-box> <input-box type="password" :disabled="getColumnDisabled(row,column.property)" <#if item.getPlaceHolder()??>placeholder="${item.getPlaceHolder()}"</#if> v-model="row[column.property]" style="${item.getEditorCssStyle()}" @change="($event)=>{gridEditItemChange(row, column.property, $event, $index)}"></input-box>
</#if> </#if>
\ No newline at end of file
...@@ -4,6 +4,9 @@ ...@@ -4,6 +4,9 @@
<input-box <input-box
type="password" type="password"
:disabled="detailsModel.${item.getCodeName()}.disabled" :disabled="detailsModel.${item.getCodeName()}.disabled"
<#if item.getPlaceHolder()??>
placeholder="${item.getPlaceHolder()}"
</#if>
v-model="data.${editor.name?lower_case}" v-model="data.${editor.name?lower_case}"
style="${item.getEditorCssStyle()}" style="${item.getEditorCssStyle()}"
@change="($event)=>{panelEditItemChange(data, '${editor.name?lower_case}', $event)}"> @change="($event)=>{panelEditItemChange(data, '${editor.name?lower_case}', $event)}">
......
此差异已折叠。
EDITORTYPE=PICKER#MAPPOSITION
\ No newline at end of file
此差异已折叠。
<app-address-selection :value="data.${editor.name}" :disabled="detailsModel.${editor.name}.disabled" style="${editor.getEditorCssStyle()}"></app-address-selection> <app-address-selection :value="data.${editor.name}" <#if item.getPlaceHolder()??>placeholder="${item.getPlaceHolder()}"</#if> :disabled="detailsModel.${editor.name}.disabled" style="${editor.getEditorCssStyle()}"></app-address-selection>
\ No newline at end of file \ No newline at end of file
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册