提交 005b1ea1 编写于 作者: ibizdev's avatar ibizdev

初始化项目

上级
# General
*.DS_Store
.AppleDouble
.LSOverride
# Icon must end with two \r
Icon
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
vue
\ No newline at end of file
<style lang='less'>
@import './${srffilepath2(ctrl.codeName)}-${ctrl.getControlType()?lower_case}.less';
</style>
\ No newline at end of file
<template>
<div>This is template</div>
</template>
\ No newline at end of file
<script lang='ts'>
import { Component } from 'vue-property-decorator';
import ${srfclassname('${ctrl.codeName}')}Base from './${srffilepath2(ctrl.getCodeName())}-${ctrl.getControlType()?lower_case}-base.vue';
<#if ctrl.getPSControls?? && ctrl.getPSControls()??>
<#list ctrl.getPSControls() as subctrl>
<#if subctrl.getControlType() != 'TOOLBAR' && subctrl.getControlType() != 'CONTEXTMENU' && !(subctrl.getControlType() == 'PORTLET' && subctrl.getPortletType() == 'CONTAINER')>
<#if subctrl.getPSAppDataEntity?? && subctrl.getPSAppDataEntity()??>
import view_${subctrl.getName()} from '@widgets/${srffilepath2(subctrl.getPSAppDataEntity().getCodeName())}/${srffilepath2(subctrl.getCodeName())}-${subctrl.getControlType()?lower_case}/${srffilepath2(subctrl.getCodeName())}-${subctrl.getControlType()?lower_case}.vue';
<#else>
import view_${subctrl.getName()} from '@widgets/app/${srffilepath2(subctrl.getCodeName())}-${subctrl.getControlType()?lower_case}/${srffilepath2(subctrl.getCodeName())}-${subctrl.getControlType()?lower_case}.vue';
</#if>
</#if>
</#list>
</#if>
<#if ctrl.getPSLayoutPanels?? && ctrl.getPSLayoutPanels()??>
<#list ctrl.getPSLayoutPanels() as panel>
import layout_${panel.getName()} from '@widgets/${srffilepath2(panel.getPSDataEntity().getCodeName())}/${srffilepath2(panel.getCodeName())}-${panel.getControlType()?lower_case}/${srffilepath2(panel.getCodeName())}-${panel.getControlType()?lower_case}.vue';
</#list>
</#if>
<#if import_block??>${import_block}</#if>
@Component({
components: {
<#if ctrl.getPSControls?? && ctrl.getPSControls()??>
<#list ctrl.getPSControls() as subctrl>
<#if subctrl.getControlType() != 'TOOLBAR' && subctrl.getControlType() != 'CONTEXTMENU' && !(subctrl.getControlType() == 'PORTLET' && subctrl.getPortletType() == 'CONTAINER')>
view_${subctrl.getName()},
</#if>
</#list>
</#if>
<#if ctrl.getPSLayoutPanels?? && ctrl.getPSLayoutPanels()??>
<#list ctrl.getPSLayoutPanels() as panel>
layout_${panel.getName()},
</#list>
</#if>
<#if components??>${components}</#if>
}
})
export default class ${srfclassname('${ctrl.codeName}')} extends ${srfclassname('${ctrl.codeName}')}Base {
}
</script>
\ No newline at end of file
}
</script>
\ No newline at end of file
<script lang='ts'>
import { Vue, Component, Prop, Provide, Emit, Watch, Model } from 'vue-property-decorator';
import { CreateElement } from 'vue';
import { Subject, Subscription } from 'rxjs';
import { ControlInterface } from '@/interface/control';
import GlobalUiService from '@/global-ui-service/global-ui-service';
<#if appde??>
import ${srfclassname('${appde.getCodeName()}')}Service from '@/app-core/service/${srffilepath2(appde.getCodeName())}/${srffilepath2(appde.getCodeName())}-service';
import ${srfclassname('${ctrl.codeName}')}Service from '@/app-core/ctrl-service/${srffilepath2(appde.getCodeName())}/${srffilepath2(ctrl.codeName)}-${ctrl.getControlType()?lower_case}-service';
<#else>
import ${srfclassname('${ctrl.codeName}')}Service from '@/app-core/ctrl-service/app/${srffilepath2(ctrl.codeName)}-${ctrl.getControlType()?lower_case}-service';
</#if>
<#-- 语言资源入口 -->
<#ibizinclude>
./LANGBASE.vue.ftl
</#ibizinclude>
<#if import_block??>${import_block}</#if>
@Component({
components: {
}
})
export default class ${srfclassname('${ctrl.codeName}')}Base extends Vue implements ControlInterface {
/**
* 名称
*
* @type {string}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
@Prop() protected name?: string;
/**
* 视图通讯对象
*
* @type {Subject<ViewState>}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
@Prop() protected viewState!: Subject<ViewState>;
/**
* 应用上下文
*
* @type {*}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
@Prop({ default: {} }) protected context?: any;
/**
* 视图参数
*
* @type {*}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
@Prop({ default: {} }) protected viewparams?: any;
/**
* 视图状态事件
*
* @protected
* @type {(Subscription | undefined)}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
protected viewStateEvent: Subscription | undefined;
/**
* 获取部件类型
*
* @returns {string}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
protected getControlType(): string {
return '${ctrl.getControlType()}'
}
/**
* 全局 ui 服务
*
* @private
* @type {GlobalUiService}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
private globaluiservice: GlobalUiService = new GlobalUiService();
/**
* 建构部件服务对象
*
* @type {${srfclassname('${ctrl.codeName}')}Service}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
protected service: ${srfclassname('${ctrl.codeName}')}Service = new ${srfclassname('${ctrl.codeName}')}Service();
<#if appde??>
/**
* 实体服务对象
*
* @type {${srfclassname('${appde.getCodeName()}')}Service}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
protected appEntityService: ${srfclassname('${appde.getCodeName()}')}Service = new ${srfclassname('${appde.getCodeName()}')}Service();
</#if>
<#if ctrl.getPSControls?? && ctrl.getPSControls()??>
<#list ctrl.getPSControls() as childCtrl>
<#if childCtrl.getControlType()??>
<#if childCtrl.getHookEventNames()??>
<#list childCtrl.getHookEventNames() as eventName>
/**
* ${childCtrl.name} 部件 ${eventName?lower_case} 事件
*
* @param {*} [args={}]
* @param {*} $event
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
protected ${childCtrl.name}_${eventName?lower_case}($event: any, $event2?: any) {
<#if childCtrl.getPSControlLogics(eventName)??>
<#list childCtrl.getPSControlLogics(eventName) as ctrlLogic>
<#if ctrlLogic.getLogicType?? && ctrlLogic.getLogicType() == "APPVIEWENGINE" && ctrlLogic.getPSAppViewEngine()??>
this.${ctrlLogic.getPSAppViewEngine().getName()}.onCtrlEvent('${childCtrl.name}', '${eventName?lower_case}', $event);
<#else>
<#if ctrlLogic.getEventArg()?? && ctrlLogic.getEventArg()?length gt 0>
if (Object.is($event.tag, '${ctrlLogic.getEventArg()}')) {
this.${ctrlLogic.name}($event, '<#if ctrlLogic.getLogicTag()?length gt 0>${ctrlLogic.getLogicTag()}</#if>', $event2);
}
<#else>
this.${ctrlLogic.name}($event, '<#if ctrlLogic.getLogicTag()?length gt 0>${ctrlLogic.getLogicTag()}</#if>', $event2);
</#if>
</#if>
</#list>
</#if>
}
</#list>
</#if>
</#if>
</#list>
</#if>
<#if ctrl.getPSAppViewLogics?? && ctrl.getPSAppViewLogics()??>
<#list ctrl.getPSAppViewLogics() as logic>
<#if logic.getLogicTrigger() == "CUSTOM" || logic.getLogicTrigger() == "CTRLEVENT">
${P.getLogicCode(logic, "LOGIC.vue").code}
</#if>
</#list>
</#if>
/**
* 关闭视图
*
* @param {any[]} args
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
protected closeView(args: any[]): void {
let _this: any = this;
_this.$emit('closeview', args);
}
<#-- <#assign layout='TABLE_24COL'><#if formmenber.getPSLayoutPos()??><#if formmenber.getPSLayoutPos().getParentPSLayout()??><#assign layout='${formmenber.getPSLayoutPos().getParentPSLayout().getLayout()}'></#if></#if>
<#assign LayoutPos = formmenber.getPSLayoutPos()>
<#if layout == 'TABLE_24COL' && LayoutPos??>
<van-col v-show="detailsModel.${formmenber.name}.visible" :style="{<#if (formmenber.getHeight?? && formmenber.getHeight() gt 0)>'height': '${formmenber.getHeight()?c}px !important',</#if><#if (formmenber.getWidth?? && formmenber.getWidth() gt 0)>'width':'${formmenber.getWidth()?c}px !important'</#if>}" span="24">
${P.getPartCode(formmenber).code}
</van-col>
<#elseif layout == 'FLEX'>
<div v-show="detailsModel.${formmenber.name}.visible" :style="{<#if LayoutPos.getGrow() != -1>'flex-grow': '${LayoutPos.getGrow()?c}',<#if !LayoutPos.getHeight()??>'height': 0,</#if></#if><#if LayoutPos.getWidth()??>'width': '${LayoutPos.getWidth()?c}px',</#if><#if LayoutPos.getHeight()??>'height':'${LayoutPos.getHeight()?c}px'</#if>}">
${P.getPartCode(formmenber).code}
</div>
<#else>
<div v-show="detailsModel.${formmenber.name}.visible">
${P.getPartCode(formmenber).code}
</div>
</#if> -->
<#-- <template v-show="detailsModel.${formmenber.name}.visible">
${P.getPartCode(formmenber).code}
</template> -->
${P.getPartCode(formmenber).code}
<#assign langbase><#if appde??>${appde.getCodeName()?lower_case}.${ctrl.getCodeName()?lower_case}_${ctrl.getControlType()?lower_case}</#if></#assign>
\ No newline at end of file
// this is less
.srf_empty_class {
width: 100%;
height: 100%;
}
<#if ctrl.getPSSysCsses?? && ctrl.getPSSysCsses()??>
<#list ctrl.getPSSysCsses() as css>
<#if css.getRawCssStyle()?? && css.getRawCssStyle()?length gt 0>
.${css.getCssName()} {
${css.getRawCssStyle()}
}
</#if>
<#if css.getCssStyle()??>
${css.getCssStyle()}
</#if>
</#list>
</#if>
\ No newline at end of file
<#-- ctrl document -->
<view_${ctrl.getName()}
:viewState="viewState"
:viewparams="viewparams"
:context="context"
<#if content??>
${content}<#t>
</#if>
name="${ctrl.name}"
ref='${ctrl.name}'
<#if ctrl.getHookEventNames()??>
<#list ctrl.getHookEventNames() as eventName>
@${eventName?lower_case}="${ctrl.name}_${eventName?lower_case}($event)"
</#list>
</#if>
@closeview="closeView($event)">
</view_${ctrl.getName()}>
\ No newline at end of file
<#-- ctrl document -->
<view_${ctrl.getName()}
:viewState="viewState"
name='${ctrl.name}'
ref='${ctrl.name}'
<#if ctrl.getHookEventNames()??>
<#list ctrl.getHookEventNames() as eventName>
@${eventName?lower_case}='${ctrl.name}_${eventName?lower_case}($event)'
</#list>
</#if>
@closeview='closeView($event)'>
<#if view.hasPSControl('form')>
${P.getCtrlCode('form', 'CONTROL.html').code}
</#if>
</view_${ctrl.getName()}>
\ No newline at end of file
<#-- content -->
<#assign content>
:autosave="${ctrl.isEnableAutoSave()?c}"
:viewtag="viewtag"
:showBusyIndicator="${ctrl.isShowBusyIndicator()?c}"
updateAction="<#if ctrl.getUpdatePSControlAction()?? && ctrl.getUpdatePSControlAction().getPSAppDEMethod()??>${ctrl.getUpdatePSControlAction().getPSAppDEMethod().getCodeName()}</#if>"
removeAction="<#if ctrl.getRemovePSControlAction()?? && ctrl.getRemovePSControlAction().getPSAppDEMethod()??>${ctrl.getRemovePSControlAction().getPSAppDEMethod().getCodeName()}</#if>"
loaddraftAction="<#if ctrl.getGetDraftPSControlAction()?? && ctrl.getGetDraftPSControlAction().getPSAppDEMethod()??>${ctrl.getGetDraftPSControlAction().getPSAppDEMethod().getCodeName()}</#if>"
loadAction="<#if ctrl.getGetPSControlAction()?? && ctrl.getGetPSControlAction().getPSAppDEMethod()??>${ctrl.getGetPSControlAction().getPSAppDEMethod().getCodeName()}</#if>"
createAction="<#if ctrl.getCreatePSControlAction()?? && ctrl.getCreatePSControlAction().getPSAppDEMethod()??>${ctrl.getCreatePSControlAction().getPSAppDEMethod().getCodeName()}</#if>"
WFSubmitAction="<#if ctrl.getWFSubmitPSControlAction()?? && ctrl.getWFSubmitPSControlAction().getPSAppDEMethod()??>${ctrl.getWFSubmitPSControlAction().getPSAppDEMethod().getCodeName()}</#if>"
WFStartAction="<#if ctrl.getWFStartPSControlAction()?? && ctrl.getWFStartPSControlAction().getPSAppDEMethod()??>${ctrl.getWFStartPSControlAction().getPSAppDEMethod().getCodeName()}</#if>"
style="<#if ctrl.getWidth() gt 0>width: ${ctrl.getWidth()?c}px</#if><#if ctrl.getHeight() gt 0>height: ${ctrl.getHeight()?c}px</#if>"
</#assign>
<#ibizinclude>
./DEFAULT.html.ftl
</#ibizinclude>
\ No newline at end of file
<#-- content -->
<#assign content>
:isSingleSelect="isSingleSelect"
:showBusyIndicator="${ctrl.isShowBusyIndicator()?c}"
<#if view.getViewType() == "DEGRIDVIEW" || view.getViewType() == "DEGRIDVIEW9">
:isOpenEdit="${view.isRowEditDefault()?c}"
@save="onSave"
</#if>
updateAction="<#if ctrl.getUpdatePSControlAction()?? && ctrl.getUpdatePSControlAction().getPSAppDEMethod()??>${ctrl.getUpdatePSControlAction().getPSAppDEMethod().getCodeName()}</#if>"
removeAction="<#if ctrl.getRemovePSControlAction()?? && ctrl.getRemovePSControlAction().getPSAppDEMethod()??>${ctrl.getRemovePSControlAction().getPSAppDEMethod().getCodeName()}</#if>"
loaddraftAction="<#if ctrl.getGetDraftPSControlAction()?? && ctrl.getGetDraftPSControlAction().getPSAppDEMethod()??>${ctrl.getGetDraftPSControlAction().getPSAppDEMethod().getCodeName()}</#if>"
loadAction="<#if ctrl.getGetPSControlAction()?? && ctrl.getGetPSControlAction().getPSAppDEMethod()??>${ctrl.getGetPSControlAction().getPSAppDEMethod().getCodeName()}</#if>"
createAction="<#if ctrl.getCreatePSControlAction()?? && ctrl.getCreatePSControlAction().getPSAppDEMethod()??>${ctrl.getCreatePSControlAction().getPSAppDEMethod().getCodeName()}</#if>"
fetchAction="<#if ctrl.getFetchPSControlAction()?? && ctrl.getFetchPSControlAction().getPSAppDEMethod()??>${ctrl.getFetchPSControlAction().getPSAppDEMethod().getCodeName()}</#if>"
</#assign>
<#ibizinclude>
./DEFAULT.html.ftl
</#ibizinclude>
\ No newline at end of file
<#ibizinclude>
./MODEL_HEADER.ts.ftl
</#ibizinclude>
/**
* 获取数据项集合
*
* @returns {any[]}
* @memberof ${srfclassname('${ctrl.codeName}')}Model
*/
public getDataItems(): any[] {
return [
<#-- 主实体所有属性 -->
<#if ctrl.getPSAppDataEntity()??>
<#assign appDataEntity = ctrl.getPSAppDataEntity() />
<#if appDataEntity.getAllPSAppDEFields?? && appDataEntity.getAllPSAppDEFields()??>
<#list appDataEntity.getAllPSAppDEFields() as defield>
{
<#if defield.isKeyField()>
name: '${appDataEntity.getCodeName()?lower_case}',
prop: '${defield.getCodeName()?lower_case}',
<#else>
name: '${defield.getCodeName()?lower_case}',
</#if>
},
</#list>
</#if>
</#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: '${majorAppDataEntity.getKeyPSAppDEField().getCodeName()?lower_case}',
dataType: 'FONTKEY',
},
</#if>
</#list>
</#if>
</#if>
]
}
<#ibizinclude>
./MODEL_BOTTOM.ts.ftl
</#ibizinclude>
\ No newline at end of file
<#ibizinclude>
./MODEL_HEADER.ts.ftl
</#ibizinclude>
/**
* 获取数据项集合
*
* @returns {any[]}
* @memberof ${srfclassname('${ctrl.codeName}')}Model
*/
public getDataItems(): any[] {
return [
<#-- 表单项 -->
<#if ctrl.getPSDEFormItems()??>
<#list ctrl.getPSDEFormItems() as dataitem>
{
name: '${dataitem.getName()}',
<#if dataitem.getPSDEField()??>
prop: '${dataitem.getPSDEField().getCodeName()?lower_case}',
dataType: '${dataitem.getPSDEField().getDataType()}',
</#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: '${majorAppDataEntity.getKeyPSAppDEField().getCodeName()?lower_case}',
dataType: 'FONTKEY',
},
</#if>
</#list>
</#if>
</#if>
<#-- 界面主键标识 -->
<#if ctrl.getPSDEFormItems()??>
<#list ctrl.getPSDEFormItems() as dataitem>
<#if dataitem.getPSAppDEField()?? && dataitem.getPSAppDEField().isKeyField() == true>
<#if !P.exists("importService1", dataitem.getPSAppDEField().getId(), "")>
{
name: '${ctrl.getPSAppDataEntity().getCodeName()?lower_case}',
prop: '${dataitem.getPSDEField().getCodeName()?lower_case}',
dataType: 'FONTKEY',
},
</#if>
</#if>
</#list>
</#if>
]
}
<#ibizinclude>
./MODEL_BOTTOM.ts.ftl
</#ibizinclude>
\ No newline at end of file
}
// 默认导出
export default ${srfclassname('${ctrl.codeName}')}Model;
\ No newline at end of file
/**
* ${srfclassname('${ctrl.codeName}')} 部件模型
*
* @export
* @class ${srfclassname('${ctrl.codeName}')}Model
*/
export class ${srfclassname('${ctrl.codeName}')}Model {
\ No newline at end of file
<#ibizinclude>
./SERVICE_HEADER.ts.ftl
</#ibizinclude>
/**
* 获取跨实体数据集合
*
* @param {string} serviceName 服务名称
* @param {string} interfaceName 接口名称
* @param {*} [context]
* @param {*} [data]
* @param {boolean} [isLoading]
* @returns {Promise<any[]>}
* @memberof ${srfclassname(ctrl.codeName)}Service
*/
public async getItems(serviceName: string, interfaceName: string, context?: any, data?: any, isLoading?: boolean): Promise<any[]> {
<#list ctrl.getPSDEFormItems() as deItem>
<#if deItem.getPSEditor()?? && deItem.getPSEditor().getPSAppDataEntity?? && deItem.getPSEditor().getPSAppDataEntity()?? && deItem.getPSEditor().getPSAppDEDataSet?? && deItem.getPSEditor().getPSAppDEDataSet()??>
<#assign _appde = deItem.getPSEditor().getPSAppDataEntity()/>
<#assign deDataSet = deItem.getPSEditor().getPSAppDEDataSet()/>
<#if !P.exists("importService4", _appde.getId() + deDataSet.getCodeName(), "")>
<#if _appde.getId() == appde.getId()>
if (Object.is(serviceName, '${srfclassname(_appde.getCodeName())}Service') && Object.is(interfaceName, '${deDataSet.getCodeName()}')) {
await this.onBeforeAction(interfaceName, context, data, isLoading);
const response: any = await this.service.${deDataSet.getCodeName()}(data);
await this.onAfterAction(interfaceName, context, response);
return this.doItems(response);
}
<#else>
if (Object.is(serviceName, '${srfclassname(_appde.getCodeName())}Service') && Object.is(interfaceName, '${deDataSet.getCodeName()}')) {
const service: any = await this.getService('${_appde.getCodeName()?lower_case}');
await this.onBeforeAction(interfaceName, context, data, isLoading);
const response: any = await service.${deDataSet.getCodeName()}(data);
await this.onAfterAction(interfaceName, context, response);
return this.doItems(response);
}
</#if>
</#if>
</#if>
</#list>
return [];
}
/**
* 合并配置的默认值
*
* @protected
* @param {*} [response={}]
* @memberof ${srfclassname(ctrl.codeName)}Service
*/
public mergeDefaults(response:any = {}): void {
if (response.data) {
<#list ctrl.getAllPSDEFormDetails() as formdetail><#t>
<#if formdetail.getCreateDV?? && formdetail.getCreateDV()??><#t>
<#if !(formdetail.getCreateDV() == '')><#t>
Object.assign(response.data, { '${formdetail.getCodeName()?lower_case}': '${formdetail.getCreateDV()}' });
</#if>
</#if>
</#list>
}
}
<#ibizinclude>
./SERVICE_BOTTOM.ts.ftl
</#ibizinclude>
\ No newline at end of file
}
// 默认导出
export default ${srfclassname('${ctrl.codeName}')}Service;
\ No newline at end of file
import { <#if extendsClass??>${extendsClass}</#if> } from '@/ibiz-core';
import { Util, HttpResponse } from '@/ibiz-core/utils';
import { ${srfclassname(ctrl.codeName)}Model } from '@/app-core/ctrl-model/<#if ctrl.getPSAppDataEntity?? && ctrl.getPSAppDataEntity()??>${srffilepath2(ctrl.getPSAppDataEntity().getCodeName())}<#else>app</#if>/${srffilepath2(ctrl.getCodeName())}-${ctrl.getControlType()?lower_case}-model';
<#if import_block??>${import_block}</#if>
/**
* ${srfclassname(ctrl.codeName)} 部件服务对象
*
* @export
* @class ${srfclassname(ctrl.codeName)}Service
* @extends {<#if extendsClass??>${extendsClass}</#if>}
*/
export class ${srfclassname(ctrl.codeName)}Service extends <#if extendsClass??>${extendsClass}</#if> {
/**
* 部件模型
*
* @protected
* @type {${srfclassname(ctrl.codeName)}Model}
* @memberof ControlServiceBase
*/
protected model: ${srfclassname(ctrl.codeName)}Model = new ${srfclassname(ctrl.codeName)}Model();
<#if view.isPSDEView()?? && view.getTempMode?? && view.getTempMode()?? && view.getTempMode() == 2>
/**
* 是否为从数据临时模式
*
* @protected
* @type {boolean}
* @memberof ${srfclassname(ctrl.codeName)}Service
*/
protected isTempMode: boolean = true;
</#if>
<#if appde??>
/**
* 应用实体名称
*
* @protected
* @type {string}
* @memberof ${srfclassname(ctrl.codeName)}Service
*/
protected appDEName: string = '${appde.getCodeName()?lower_case}';
/**
* 当前应用实体主键标识
*
* @protected
* @type {string}
* @memberof ${srfclassname(ctrl.codeName)}Service
*/
protected appDeKey: string = '${appde.getKeyPSAppDEField().getCodeName()?lower_case}';
</#if>
\ No newline at end of file
<template>
<#if ctrl.render??>
${ctrl.render.code}
<#else>
<span>
<#list ctrl.getPSControls() as tabviewpanel>
<span v-show="activiedTabViewPanel == '${tabviewpanel.name}'">
<@ibizindent blank=12>
${P.getCtrlCode(tabviewpanel, 'CONTROL.html').code}
</@ibizindent>
</span>
</#list>
</span>
</#if>
</template>
\ No newline at end of file
<#ibizinclude>
./CONTROL-BASE.template.ftl
</#ibizinclude>
<#ibizinclude>
../@MACRO/CONTROL/CONTROL_HEADER-BASE.vue.ftl
</#ibizinclude>
/**
* 获取多项数据
*
* @returns {any[]}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
public getDatas(): any[] {
return [];
}
/**
* 获取单项树
*
* @returns {*}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
public getData(): any {
return null;
}
/**
* 行为参数
*
* @protected
* @type {*}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
protected action:any = '';
/**
* 被激活的分页面板
*
* @type {string}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
protected activiedTabViewPanel: string = '<#list ctrl.getPSControls() as tabviewpanel><#if tabviewpanel_index==0>${tabviewpanel.name}</#if></#list>';
/**
* vue 生命周期
*
* @returns
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
protected created() {
this.afterCreated();
}
/**
* 执行created后的逻辑
*
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
protected afterCreated(){
if (this.viewState) {
this.viewStateEvent = this.viewState.subscribe(({ tag, action, data }) => {
if (!Object.is(tag, this.name)) {
return;
}
this.action = action;
if (data.activeItem) {
this.tabPanelClick(data.activeItem);
} else {
this.$nextTick(() => {
this.viewState.next({ tag: this.activiedTabViewPanel, action: action, data: data });
});
}
});
}
}
/**
* vue 生命周期
*
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
protected destroyed() {
this.afterDestroy();
}
/**
* 执行destroyed后的逻辑
*
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
protected afterDestroy() {
if (this.viewStateEvent) {
this.viewStateEvent.unsubscribe();
}
<#if destroyed_block??>
${destroyed_block}
</#if>
}
/**
* 分页面板选中
*
* @param {*} $event
* @returns
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
protected tabPanelClick($event: any) {
if (!$event) {
return;
}
if (!this.viewState) {
return;
}
this.activiedTabViewPanel = $event;
this.$nextTick(() => {
this.viewState.next({ tag: this.activiedTabViewPanel, action: this.action, data: {}});
});
}
<#ibizinclude>
../@MACRO/CONTROL/CONTROL_BOTTOM-BASE.vue.ftl
</#ibizinclude>
<#ibizinclude>
../@MACRO/CONTROL/CONTROL-BASE.style.ftl
</#ibizinclude>
\ 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>
.tabexppanel {
height: 100%;
>.ivu-tabs-bar {
margin-bottom: 0px;
}
>.ivu-tabs-content {
height: calc(100% - 36px);
padding: 0px !important;
.ivu-tabs-tabpane {
height: 100%;
}
}
}
\ No newline at end of file
<#ibizinclude>
../@MACRO/CONTROL/CONTROL.vue.ftl
</#ibizinclude>
\ No newline at end of file
<#ibizinclude>
../@MACRO/MODEL/DEFAULT.ts.ftl
</#ibizinclude>
\ No newline at end of file
<#assign extendsClass>TabExpServiceBase</#assign>
<#ibizinclude>
../@MACRO/SERVICE/SERVICE_HEADER.ts.ftl
</#ibizinclude>
<#ibizinclude>
../@MACRO/SERVICE/SERVICE_BOTTOM.ts.ftl
</#ibizinclude>
\ No newline at end of file
CTRLTYPE=TABEXPPANEL
\ No newline at end of file
<template>
<#if ctrl.render??>
${ctrl.render.code}
<#else>
<div class='app-tab-view-panel <#if ctrl.getPSSysCss()??><#assign singleCss = ctrl.getPSSysCss()> ${singleCss.getCssName()}</#if>' v-if='isActivied' >
<#if ctrl.getEmbeddedPSAppDEView()??>
<#assign embedddevedview = ctrl.getEmbeddedPSAppDEView()>
<${srffilepath2(embedddevedview.getCodeName())}
:_context="JSON.stringify(context)"
:_viewparams="JSON.stringify(viewparams)"
:viewDefaultUsage="false" >
</${srffilepath2(embedddevedview.getCodeName())}></#if>
</div>
</#if>
</template>
\ No newline at end of file
<#ibizinclude>
./CONTROL-BASE.template.ftl
</#ibizinclude>
<#ibizinclude>
../@MACRO/CONTROL/CONTROL_HEADER-BASE.vue.ftl
</#ibizinclude>
/**
* 获取多项数据
*
* @returns {any[]}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
public getDatas(): any[] {
return [];
}
/**
* 获取单项树
*
* @returns {*}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
public getData(): any {
return null;
}
/**
* 是否被激活
*
* @type {boolean}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
protected isActivied: boolean = false;
/**
* vue 生命周期
*
* @returns
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
protected created() {
this.afterCreated();
}
/**
* 执行created后的逻辑
*
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
protected afterCreated(){
if (this.viewState) {
this.viewStateEvent = this.viewState.subscribe(({ tag, action, data }) => {
if (!Object.is(tag, this.name)) {
return;
}
if (!this.isActivied) {
this.$nextTick(() => {
this.isActivied = true;
});
}
});
}
}
/**
* vue 生命周期
*
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
protected destroyed() {
this.afterDestroy();
}
/**
* 执行destroyed后的逻辑
*
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
protected afterDestroy() {
if (this.viewStateEvent) {
this.viewStateEvent.unsubscribe();
}
<#if destroyed_block??>
${destroyed_block}
</#if>
}
<#ibizinclude>
../@MACRO/CONTROL/CONTROL_BOTTOM-BASE.vue.ftl
</#ibizinclude>
<#ibizinclude>
../@MACRO/CONTROL/CONTROL-BASE.style.ftl
</#ibizinclude>
\ 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>
\ No newline at end of file
<#ibizinclude>
../@MACRO/CONTROL/CONTROL.vue.ftl
</#ibizinclude>
\ No newline at end of file
<#ibizinclude>
../@MACRO/MODEL/DEFAULT.ts.ftl
</#ibizinclude>
\ No newline at end of file
<#assign extendsClass>TabViewPanelServiceBase</#assign>
<#ibizinclude>
../@MACRO/SERVICE/SERVICE_HEADER.ts.ftl
</#ibizinclude>
<#ibizinclude>
../@MACRO/SERVICE/SERVICE_BOTTOM.ts.ftl
</#ibizinclude>
\ No newline at end of file
CTRLTYPE=TABVIEWPANEL
\ No newline at end of file
<template>
<#if ctrl.render??>
${ctrl.render.code}
<#else>
<div class="app-mob-mdctrl <#if ctrl.getPSSysCss()??><#assign singleCss = ctrl.getPSSysCss()> ${singleCss.getCssName()}</#if>">
<div class="app-mob-mdctrl-${ctrl.name}">
<ion-list class="items">
<template v-if="controlStyle != 'SWIPERVIEW' ">
<ion-item-sliding v-for="(item, index) in items" @click="goPage(item)" :key="index" class="app-mob-mdctrl-item">
<#if ctrl.getItemPSLayoutPanel()??>
<#assign layoutpanel=ctrl.getItemPSLayoutPanel()>
<div style="width:100%;">
<view_${layoutpanel.getName()} :item="item"></view_${layoutpanel.getName()}>
</div>
<#else>
<#if ctrl.getPSDEUIActionGroup?? && ctrl.getPSDEUIActionGroup()?? && ctrl.getPSDEUIActionGroup().getPSUIActionGroupDetails()??>
<#assign details = ctrl.getPSDEUIActionGroup().getPSUIActionGroupDetails()>
<ion-item-options v-if="controlStyle != 'LISTVIEW3'" side="start">
<#list details as detail>
<#if detail.getPSUIAction()??>
<#assign uiaction = detail.getPSUIAction()>
<ion-item-option color="<#if uiaction.getUIActionTag() == "Remove">danger<#else>primary</#if>" @click="mdctrl_click($event, '${detail.getName()}', item)">${uiaction.getCaption()}</ion-item-option>
</#if>
</#list>
</ion-item-options>
</#if>
<ion-item>
<#-- 实体列表项集合-->
<#if ctrl.getPSDEListItems()??>
<!-- 列表视图样式 -->
<app-list-default :item="item" v-if="controlStyle.substring(0,8) === 'LISTVIEW'"></app-list-default>
<!-- 图标视图样式 -->
<app-icon-list :item="item" v-if="controlStyle === 'ICONVIEW'"></app-icon-list>
<#else>
<div>暂无数据</div>
</#if>
</ion-item>
<#if ctrl.getPSDEUIActionGroup2?? && ctrl.getPSDEUIActionGroup2()?? && ctrl.getPSDEUIActionGroup2().getPSUIActionGroupDetails()??>
<#assign details = ctrl.getPSDEUIActionGroup2().getPSUIActionGroupDetails()>
<ion-item-options v-if="controlStyle != 'LISTVIEW3'" side="end">
<#list details as detail>
<#if detail.getPSUIAction()??>
<#assign uiaction = detail.getPSUIAction()>
<ion-item-option color="<#if uiaction.getUIActionTag() == "Remove">danger<#else>primary</#if>" @click="mdctrl_click($event, '${detail.getName()}', item)">${uiaction.getCaption()}</ion-item-option>
</#if>
</#list>
</ion-item-options>
</#if>
</#if>
</ion-item-sliding>
</template>
</ion-list>
<ion-list class="items">
<#--多数据视图||多数据视图(部件视图)-->
<template v-if="controlStyle != 'SWIPERVIEW' ">
<ion-item-sliding v-for="(item, index) in items" @click="goPage(item)" :key="index" class="app-mob-mdctrl-item">
<#if ctrl.getItemPSLayoutPanel()??>
<#assign layoutpanel=ctrl.getItemPSLayoutPanel()>
<div style="width:100%;">
<view_${layoutpanel.getName()} :item="item"></view_${layoutpanel.getName()}>
</div>
<#else>
<#if ctrl.getPSDEUIActionGroup?? && ctrl.getPSDEUIActionGroup()?? && ctrl.getPSDEUIActionGroup().getPSUIActionGroupDetails()??>
<#assign details = ctrl.getPSDEUIActionGroup().getPSUIActionGroupDetails()>
<ion-item-options v-if="controlStyle != 'LISTVIEW3'" side="start">
<#list details as detail>
<#if detail.getPSUIAction()??>
<#assign uiaction = detail.getPSUIAction()>
<ion-item-option color="<#if uiaction.getUIActionTag() == "Remove">danger<#else>primary</#if>" @click="mdctrl_click($event, '${detail.getName()}', item)">${uiaction.getCaption()}</ion-item-option>
</#if>
</#list>
</ion-item-options>
</#if>
<ion-item>
<#-- 实体列表项集合-->
<#if ctrl.getPSDEListItems()??>
<!-- 列表视图样式 -->
<app-list-default :item="item" v-if="controlStyle.substring(0,8) === 'LISTVIEW'"></app-list-default>
<!-- 图标视图样式 -->
<app-icon-list :item="item" v-if="controlStyle === 'ICONVIEW'"></app-icon-list>
<#else>
<div>暂无数据</div>
</#if>
</ion-item>
<#if ctrl.getPSDEUIActionGroup2?? && ctrl.getPSDEUIActionGroup2()?? && ctrl.getPSDEUIActionGroup2().getPSUIActionGroupDetails()??>
<#assign details = ctrl.getPSDEUIActionGroup2().getPSUIActionGroupDetails()>
<ion-item-options v-if="controlStyle != 'LISTVIEW3'" side="end">
<#list details as detail>
<#if detail.getPSUIAction()??>
<#assign uiaction = detail.getPSUIAction()>
<ion-item-option color="<#if uiaction.getUIActionTag() == "Remove">danger<#else>primary</#if>" @click="mdctrl_click($event, '${detail.getName()}', item)">${uiaction.getCaption()}</ion-item-option>
</#if>
</#list>
</ion-item-options>
</#if>
</#if>
</ion-item-sliding>
</template>
<template v-else-if="controlStyle === 'SWIPERVIEW'">
<app-list-swipe :items="items"></app-list-swipe>
</template>
</ion-list>
</div>
</div>
</#if>
</template>
\ No newline at end of file
<#ibizinclude>
./CONTROL-BASE.template.ftl
</#ibizinclude>
<#ibizinclude>
../@MACRO/CONTROL/CONTROL_HEADER-BASE.vue.ftl
</#ibizinclude>
/**
* 获取多项数据
*
* @returns {any[]}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
public getDatas(): any[] {
return [];
}
/**
* 获取单项树
*
* @returns {*}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
public getData(): any {
return {};
}
/**
* 显示处理提示
*
* @type {boolean}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
@Prop({ default: true }) protected showBusyIndicator?: boolean;
/**
* 部件行为--update
*
* @type {string}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
@Prop() protected updateAction!: string;
/**
* 部件行为--fetch
*
* @type {string}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
@Prop() protected fetchAction!: string;
/**
* 部件行为--remove
*
* @type {string}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
@Prop() protected removeAction!: string;
/**
* 部件行为--load
*
* @type {string}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
@Prop() protected loadAction!: string;
/**
* 部件行为--loaddraft
*
* @type {string}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
@Prop() protected loaddraftAction!: string;
/**
* 部件行为--create
*
* @type {string}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
@Prop() protected createAction!: string;
/**
* 列表数组
*
* @param {Array<any>}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
public items:Array<any> =[];
/**
* 分页大小
*
* @type {number}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
public pageSize: number = ${ctrl.getPagingSize()?c};
/**
* 总页数
*
* @type {number}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
public pageTotal: number = 0;
/**
* 当前页数
*
* @type {number}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
public pageNumber: number = 1;
/**
* 部件样式
*
* @type {string}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
@Prop({default: '<#if ctrl.getMobListStyle?? && ctrl.getMobListStyle()??>${ctrl.getMobListStyle()}</#if>'}) protected controlStyle!: string;
/**
* 格式化数据
*
* @type {boolean}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
public formatdate(datelist : any){
this.items = datelist;
}
/**
* 多项数据加载
*
* @private
* @param {*} [arg={}]
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
private load(data:any,type:any):void {
const post: Promise<any> = this.service.search(this.fetchAction,this.context, data, this.showBusyIndicator);
post.then((response: any) => {
if (!response || response.status !== 200) {
// this.$notifyMessage.danger('错误,' + response.info);
}
let datelist = response.data.records;
this.formatdate(datelist);
}).catch((response : any)=>{
if (response && response.status === 401) {
return;
}
if (!response || !response.status || !response.data) {
// this.$notifyMessage.danger('错误,系统异常!');
return;
}
const { data: _data } = response;
console.error(_data.title + _data.message);
});
}
/**
* vue生命周期created
*
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
created() {
this.handleCreated();
}
/**
* 执行created后的逻辑
*
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
public handleCreated(){
if (this.viewState) {
this.viewStateEvent = this.viewState.subscribe(
({ tag, action, data }) => {
if (!Object.is(tag, this.name)) {
return;
}
this.load(Object.assign(data, { page: this.pageNumber, size: this.pageSize }),"");
}
);
}
}
<#ibizinclude>
../@MACRO/CONTROL/CONTROL_BOTTOM-BASE.vue.ftl
</#ibizinclude>
<#ibizinclude>
../@MACRO/CONTROL/CONTROL-BASE.style.ftl
</#ibizinclude>
\ No newline at end of file
<#-- content -->
<#assign content>
:showBusyIndicator="${ctrl.isShowBusyIndicator()?c}"
updateAction="<#if ctrl.getUpdatePSControlAction?? && ctrl.getUpdatePSControlAction()?? && ctrl.getUpdatePSControlAction().getPSAppDEMethod()??>${ctrl.getUpdatePSControlAction().getPSAppDEMethod().getCodeName()}</#if>"
removeAction="<#if ctrl.getRemovePSControlAction?? && ctrl.getRemovePSControlAction()?? && ctrl.getRemovePSControlAction().getPSAppDEMethod()??>${ctrl.getRemovePSControlAction().getPSAppDEMethod().getCodeName()}</#if>"
loaddraftAction="<#if ctrl.getGetDraftPSControlAction?? && ctrl.getGetDraftPSControlAction()?? && ctrl.getGetDraftPSControlAction().getPSAppDEMethod()??>${ctrl.getGetDraftPSControlAction().getPSAppDEMethod().getCodeName()}</#if>"
loadAction="<#if ctrl.getGetPSControlAction?? && ctrl.getGetPSControlAction()?? && ctrl.getGetPSControlAction().getPSAppDEMethod()??>${ctrl.getGetPSControlAction().getPSAppDEMethod().getCodeName()}</#if>"
createAction="<#if ctrl.getCreatePSControlAction?? && ctrl.getCreatePSControlAction()?? && ctrl.getCreatePSControlAction().getPSAppDEMethod()??>${ctrl.getCreatePSControlAction().getPSAppDEMethod().getCodeName()}</#if>"
fetchAction="<#if ctrl.getFetchPSControlAction?? && ctrl.getFetchPSControlAction()?? && ctrl.getFetchPSControlAction().getPSAppDEMethod()??>${ctrl.getFetchPSControlAction().getPSAppDEMethod().getCodeName()}</#if>"
<#if ctrl.getControlStyle?? && ctrl.getControlStyle()??>controlStyle="${ctrl.getControlStyle()}"</#if>
</#assign>
<#ibizinclude>
../@MACRO/HTML/DEFAULT.html.ftl
</#ibizinclude>
<#ibizinclude>
../@MACRO/CSS/DEFAULT.less.ftl
</#ibizinclude>
<#if ctrl.getItemPSLayoutPanel()??>
<#assign layoutpanel=ctrl.getItemPSLayoutPanel()>
${P.getCtrlCode(layoutpanel, 'CONTROL.less').code}
</#if>
<#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 getDataItems(): any[] {
return [
<#-- 列表数据项 -->
<#if ctrl.getPSListDataItems()??>
<#list ctrl.getPSListDataItems() as dataitem>
{
name: '${dataitem.getName()}',
<#if dataitem.getPSDEField()??>
prop: '${dataitem.getPSDEField().getCodeName()?lower_case}',
dataType: '${dataitem.getPSDEField().getDataType()}',
</#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: '${majorAppDataEntity.getKeyPSAppDEField().getCodeName()?lower_case}'
},
</#if>
</#list>
</#if>
<#if ctrl.getPSListDataItems()??>
<#list ctrl.getPSListDataItems() as dataitem>
<#-- 界面主键标识 -->
<#if dataitem.getPSDEField?? && dataitem.getPSDEField()??>
<#if !P.exists("importService", dataitem.getPSDEField().getId(), "")>
<#if dataitem.getPSDEField().isKeyDEField() == true>
{
name: '${appDataEntity.getCodeName()?lower_case}',
prop: '${dataitem.getPSDEField().getCodeName()?lower_case}',
dataType: 'FONTKEY',
},
</#if>
</#if>
</#if>
</#list>
</#if>
</#if>
{
name:'size',
prop:'size'
},
{
name:'query',
prop:'query'
},
{
name:'page',
prop:'page'
}
]
}
<#ibizinclude>
../@MACRO/MODEL/MODEL_BOTTOM.ts.ftl
</#ibizinclude>
\ No newline at end of file
### ibiz预置列表表现样式
#### 一、配置参数
##### (1)视图参数:通过配置数据部件的表现样式
​ 配置:
​ ![视图参数配置](./imgs/view-params-config.png)
​ 代码:
​ ![视图参数](./imgs/view-parmams.png)
##### (2)部件默认参数:通过配置移动端列表样式
配置:
​ ![部件参数配置](./imgs/control-params-config.png)
代码:
​ ![部件参数](./imgs/control-params.png)
#### 二、动态控制
![动态控制](./imgs/dynamic-control.png)
#### 三、效果展示
1、列表视图(默认)、(无刷新)、(无滑动)
​ (1)、展示效果
​ ![默认列表样式](./imgs/default-list-view.png)
​ (2)、支持功能(刷新、滑动) ps:无刷新不支持刷新、无滑动不支持滑动
![刷新行为](./imgs/refresh-action.png) ![左滑行为](./imgs/left-slide.png)
2、图标视图
​ (1)、展示效果
​ ![icon列表样式](./imgs/icon-list-view.png)
​ (2)、支持功能(刷新、滑动)
3、图片滑动视图
​ (1)、展示效果
​ ![图片滑动样式](./imgs/img-swiper-view.png)
​ (2)、支持功能(刷新)
<#assign extendsClass>ListServiceBase</#assign>
<#ibizinclude>
../@MACRO/SERVICE/SERVICE_HEADER.ts.ftl
</#ibizinclude>
<#ibizinclude>
../@MACRO/SERVICE/SERVICE_BOTTOM.ts.ftl
</#ibizinclude>
\ No newline at end of file
<template>
<#if ctrl.render??>
${ctrl.render.code}
<#else>
<div class="app-mob-list app-mob-list-${ctrl.name}<#if ctrl.getPSSysCss()??><#assign singleCss = ctrl.getPSSysCss()> ${singleCss.getCssName()}</#if>">
<mt-loadmore
ref="loadmore"
:bottom-distance=10
:auto-fill="false">
<ul class="app-mob-list-ul">
<#if ctrl.getItemPSLayoutPanel()??>
<li v-for="item in items" :key="item.srfkey" class="app-mob-list-item">
<#assign layoutpanel = ctrl.getItemPSLayoutPanel()>
${P.getCtrlCode(layoutpanel, 'CONTROL.html').code}
</li>
<#elseif ctrl.itemRender??>
<li v-for="item in items" :key="item.srfkey" class="app-mob-list-item">
${ctrl.itemRender.code}
</li>
<#else>
<template v-if = "controlStyle != 'SWIPERVIEW'">
<li v-for="item in items" :key="item.srfkey" class="app-mob-list-item">
<!-- 列表视图样式 -->
<app-list-default :item="item" v-if="controlStyle.substring(0,8) === 'LISTVIEW'"></app-list-default>
<!-- 图标视图样式 -->
<app-icon-list :item="item" v-if="controlStyle === 'ICONVIEW'"></app-icon-list>
<!-- 图片滑动视图样式 -->
<app-card-list :item="item" v-if="controlStyle === 'SWIPERVIEW'"></app-card-list>
</li>
</template>
<template v-if = "controlStyle === 'SWIPERVIEW'">
<app-list-swipe :items="items"></app-list-swipe>
</template>
</#if>
</ul>
</mt-loadmore>
</div>
</#if>
</template>
\ No newline at end of file
CTRLTYPE=LIST
\ No newline at end of file
<#ibizinclude>
../@MACRO/MODEL/DEFAULT.ts.ftl
</#ibizinclude>
\ No newline at end of file
<#assign extendsClass>WizardPanelServiceBase</#assign>
<#ibizinclude>
../@MACRO/SERVICE/SERVICE_HEADER.ts.ftl
</#ibizinclude>
<#ibizinclude>
../@MACRO/SERVICE/SERVICE_BOTTOM.ts.ftl
</#ibizinclude>
\ No newline at end of file
CTRLTYPE=WIZARDPANEL
\ No newline at end of file
此差异已折叠。
<#-- content -->
<#assign content>
:showBusyIndicator="${ctrl.isShowBusyIndicator()?c}"
:saveRefView="saveRefView"
@viewdatadirty="onViewDataDirty"
@drdatasaved="onDRDataSaved"
updateAction="<#if ctrl.getUpdatePSControlAction()?? && ctrl.getUpdatePSControlAction().getPSAppDEMethod()??>${ctrl.getUpdatePSControlAction().getPSAppDEMethod().getCodeName()}</#if>"
removeAction="<#if ctrl.getRemovePSControlAction()?? && ctrl.getRemovePSControlAction().getPSAppDEMethod()??>${ctrl.getRemovePSControlAction().getPSAppDEMethod().getCodeName()}</#if>"
<#-- loaddraftAction="<#if ctrl.getGetDraftPSControlAction()?? && ctrl.getGetDraftPSControlAction().getPSAppDEMethod()??>${ctrl.getGetDraftPSControlAction().getPSAppDEMethod().getCodeName()}</#if>" -->
loaddraftAction="<#if ctrl.getPSAppDataEntity?? && ctrl.getPSAppDataEntity()??><#if ctrl.getPSAppDataEntity().isEnableTempData()>GetDraftTemp<#else>GetDraft</#if></#if>"
loadAction="<#if ctrl.getGetPSControlAction()?? && ctrl.getGetPSControlAction().getPSAppDEMethod()??>${ctrl.getGetPSControlAction().getPSAppDEMethod().getCodeName()}</#if>"
createAction="<#if ctrl.getCreatePSControlAction()?? && ctrl.getCreatePSControlAction().getPSAppDEMethod()??>${ctrl.getCreatePSControlAction().getPSAppDEMethod().getCodeName()}</#if>"
fetchAction="<#if ctrl.getFetchPSControlAction()?? && ctrl.getFetchPSControlAction().getPSAppDEMethod()??>${ctrl.getFetchPSControlAction().getPSAppDEMethod().getCodeName()}</#if>"
</#assign>
<#ibizinclude>
../@MACRO/HTML/DEFAULT.html.ftl
</#ibizinclude>
\ No newline at end of file
<#ibizinclude>
../@MACRO/CSS/DEFAULT.less.ftl
</#ibizinclude>
.app-mob-meditviewpanel{
width: 100%;
.border-bottom{
border-bottom: 1px solid #ddd;
height: 1px;
padding: 5px;
}
.handleAddbtn_box{
text-align: right;
padding: 10px;
.handleAddbtn{
border: 1px solid;
border-radius: 50%;
font-size: 30px;
color: #26a2ff;
}
}
}
\ No newline at end of file
<#ibizinclude>
../@MACRO/CONTROL/CONTROL.vue.ftl
</#ibizinclude>
\ No newline at end of file
<#ibizinclude>
../@MACRO/MODEL/DEFAULT.ts.ftl
</#ibizinclude>
\ No newline at end of file
<#assign extendsClass>MultiEditViewPanelServiceBase</#assign>
<#ibizinclude>
../@MACRO/SERVICE/SERVICE_HEADER.ts.ftl
</#ibizinclude>
<#ibizinclude>
../@MACRO/SERVICE/SERVICE_BOTTOM.ts.ftl
</#ibizinclude>
\ No newline at end of file
CTRLTYPE=MULTIEDITVIEWPANEL
\ No newline at end of file
<#ibizinclude>
../@MACRO/CONTROL/LANGBASE.vue.ftl
</#ibizinclude>
<#assign deuiaction=item.getPSUIAction()>
<#if ctrl.getToolbarStyle() == 'MOBBOTTOMMENU'>
<ion-button @click="${ctrl.name}_click({ tag: '${item.name}' }, $event)" v-show="${(ctrl.getName())?lower_case}Models.${item.name}.visabled">
<#if item.isShowIcon() && item.getPSSysImage()??>
<ion-icon name="<#if item.getPSSysImage().getCssClass() != "">${item.getPSSysImage().getCssClass()}<#else>fa fa-ellipsis-h</#if>"></ion-icon>
</#if>
<#if item.isShowCaption()>{{<#if langbase??>$t('${langbase}.${item.name}.caption')<#else>'${item.getCaption()}'</#if>}}</#if>
</ion-button>
<#elseif ctrl.getToolbarStyle() == 'MOBWFACTIONMENU'>
<ion-button class="app-quick-toolbar-item" v-show="${(ctrl.getName()?lower_case)}Models.${item.name}.visabled" :disabled="${(ctrl.getName())?lower_case}Models.${item.name}.disabled" @click="${ctrl.name}_click({ tag: '${item.name}' }, $event)" >
<#if item.isShowIcon()>
<#if item.getPSSysImage()??>
<ion-icon name="<#if item.getPSSysImage().getCssClass() != "">${item.getPSSysImage().getCssClass()}<#else>fa fa-ellipsis-h</#if>"> <#-- <#if item.getPSSysImage().getImagePath() != ""> <img src="${item.getPSSysImage().getImagePath()}" /></#if>--></ion-icon>
</#if>
</#if>
<#if item.isShowCaption()>{{<#if langbase??>$t('${langbase}.${item.name}.caption')<#else>'${item.getCaption()}'</#if>}}</#if>
</ion-button>
<#else>
<ion-button class="app-view-toolbar-button" v-show="${(ctrl.getName())?lower_case}Models.${item.name}.visabled" :disabled="${(ctrl.getName())?lower_case}Models.${item.name}.disabled" @click="${ctrl.name}_click({ tag: '${item.name}' }, $event)" >
<#if item.isShowIcon()>
<#if item.getPSSysImage()??>
<ion-icon name="<#if item.getPSSysImage().getCssClass() != "">${item.getPSSysImage().getCssClass()}<#else>fa fa-ellipsis-h</#if>"> <#--<#if item.getPSSysImage().getImagePath() != ""> <img src="${item.getPSSysImage().getImagePath()}" /></#if>--></ion-icon>
</#if>
</#if>
<#if item.isShowCaption()>{{<#if langbase??>$t('${langbase}.${item.name}.caption')<#else>'${item.getCaption()}'</#if>}}</#if>
</ion-button>
</#if>
\ No newline at end of file
<#ibizinclude>
../@MACRO/CONTROL/LANGBASE.vue.ftl
</#ibizinclude>
<#if ctrl.getToolbarStyle()?? >
<ion-button class="app-view-toolbar-button" @click="${ctrl.name}Models.${item.name}.isshow=!${ctrl.name}Models.${item.name}.isshow">
<#if item.isShowIcon()>
<#if item.getPSSysImage()??>
<ion-icon name="<#if item.getPSSysImage().getCssClass() != "">${item.getPSSysImage().getCssClass()}<#else>fa fa-ellipsis-h</#if>" <#-- <#if item.getPSSysImage().getImagePath() != ""><img src="${item.getPSSysImage().getImagePath()}" /></#if> -->></ion-icon>
</#if>
</#if>
<#if item.isShowCaption()>{{<#if langbase??>$t('${langbase}.${item.name}.caption')<#else>'${item.getCaption()}'</#if>}}</#if>
</ion-button>
<#if item.getPSDEToolbarItems()??>
<#-- 右toolbar begin -->
<#if ctrl.getToolbarStyle() == 'MOBNAVRIGHTMENU' || ctrl.getToolbarStyle() == 'MOBNAVLEFTMENU' >
<div class = "group-button" v-show="${ctrl.name}Models.${item.name}.isshow" @click="${ctrl.name}Models.${item.name}.isshow = false" z-index='9999'>
<ion-list class="toolbar_group_<#if ctrl.getToolbarStyle() == 'MOBNAVRIGHTMENU'>right<#else>left</#if>">
<#list item.getPSDEToolbarItems() as toolbarItem>
<ion-item @click="${ctrl.name}_click({ tag: '${toolbarItem.name}' }, $event)"><ion-button class="app-view-toolbar-button"><#if toolbarItem.isShowIcon()><#if toolbarItem.getPSSysImage()??> <ion-icon name="<#if toolbarItem.getPSSysImage().getCssClass() != "">${toolbarItem.getPSSysImage().getCssClass()}<#else>reorder-four-outline</#if>"></ion-icon><#else><ion-icon name="reorder-four-outline"></ion-icon></#if></#if> {{<#if toolbarItem.isShowCaption()><#if langbase??>$t('${langbase}.${toolbarItem.name}.caption')<#else>'${toolbarItem.getCaption()}'</#if></#if>}}</ion-button> </ion-item>
</#list>
</ion-list>
</div>
</#if>
<#if ctrl.getToolbarStyle() == 'MOBBOTTOMMENU' >
<#list item.getPSDEToolbarItems() as toolbarItem>
</#list>
</#if>
</#if>
</#if>
\ No newline at end of file
<#if ctrl.render??>
${ctrl.render.code}
<#else>
<#if ctrl.getToolbarStyle() == 'MOBWFACTIONMENU'>
<div class="app-toolbar-container <#if ctrl.getPSSysCss()??><#assign singleCss = ctrl.getPSSysCss()> ${singleCss.getCssName()}</#if>">
<#-- 流程操作菜单:BEGIN -->
<div class="app-view-footer">
<div class="app-quick-toolbar">
<#list ctrl.getPSDEToolbarItems() as item>
${P.getPartCode(item).code}
</#list>
</div>
</div>
</div>
<#-- 流程操作菜单:END -->
<#elseif ctrl.getToolbarStyle() == 'MOBBOTTOMMENU'>
<#-- 底部菜单:BEGIN -->
<div class = "bottom_menu">
<#list ctrl.getPSDEToolbarItems() as item>
${P.getPartCode(item).code}
</#list>
</div>
<#-- 底部菜单:END -->
<#elseif ctrl.getToolbarStyle() == 'MOBNAVLEFTMENU'>
<div class="app-toolbar-container <#if ctrl.getPSSysCss()??><#assign singleCss = ctrl.getPSSysCss()> ${singleCss.getCssName()}</#if>">
<#-- 导航左侧菜单:BEGIN -->
<div class="app-quick-toolbar">
<#list ctrl.getPSDEToolbarItems() as item>
${P.getPartCode(item).code}
</#list>
</div>
</div>
<#-- 导航左侧菜单:END -->
<#elseif ctrl.getToolbarStyle() == 'MOBNAVRIGHTMENU'>
<div class="app-toolbar-container <#if ctrl.getPSSysCss()??><#assign singleCss = ctrl.getPSSysCss()> ${singleCss.getCssName()}</#if>">
<#-- 导航右侧菜单:BEGIN -->
<div class="app-quick-toolbar">
<#list ctrl.getPSDEToolbarItems() as item>
${P.getPartCode(item).code}
</#list>
</div>
</div>
<#-- 导航右侧菜单:END -->
<#else>
<div class="app-toolbar-container <#if ctrl.getPSSysCss()??><#assign singleCss = ctrl.getPSSysCss()> ${singleCss.getCssName()}</#if>">
<div class="app-quick-toolbar">
<#list ctrl.getPSDEToolbarItems() as item>
${P.getPartCode(item).code}
</#list>
</div>
</div>
</#if>
</#if>
\ No newline at end of file
<#ibizinclude>
../@MACRO/CSS/DEFAULT.less.ftl
</#ibizinclude>
<#if ctrl.getToolbarStyle() == 'MOBBOTTOMMENU'>
.app-${ctrl.name}-bar-button {
position: absolute;
bottom: @toolbar-bottomtoolbar-offset-y;
right: @toolbar-bottomtoolbar-offset-x;
border-radius: @border-radius-round;
height: @toolbar-bottomtoolbar-height;
line-height: @toolbar-bottomtoolbar-height;
}
.bottom_menu{
text-align: center;
}
.app-${ctrl.name}-bar-overlay {
.wrapper {
display: flex;
align-items: flex-end;
justify-content: flex-end;
height: 100%;
.block {
width: 120px;
height: 100%;
display: flex;
z-index: 2000;
.app-toolbar-container {
position: absolute;
bottom: @toolbar-bottomtoolbar-group-offset-y;
right: @toolbar-bottomtoolbar-group-offset-x;
width: auto;
height: auto;
.righttoolbar-item {
color: @toolbar-bottomtoolbar-item-color;
margin-bottom: 10px;
font-size: @toolbar-bottomtoolbar-item-fontSize;
display: flex;
.righttoolbar-item-btn {
margin-left: 5px;
border-radius: @border-radius-round;
}
}
}
}
}
}
</#if>
.toolbar_group_right{
position: absolute;
right: 20px;
z-index: 999;
width: 40%;
}
.toolbar_group_left{
position: absolute;
left: 20px;
z-index: 999;
width: 40%;
}
ion-backdrop {
opacity: 0.3;
}
.ionlist{
border-radius: @toolbar-group-border-radius;
}
.group_ion-icon{
margin-right: 10px;
}
.footer_group {
position: absolute;
z-index: 99;
bottom: 67px;
width: 40%;
right: 20px;
}
<#assign havestyle = 0>
<#if ctrl.getToolbarStyle() == 'MOBNAVLEFTMENU'|| ctrl.getToolbarStyle() == 'MOBNAVRIGHTMENU' && havestyle = 0>
<#assign havestyle = 1>
.group-button{
display: flex;
flex-flow: column;
position: absolute;
}
.app-view-righttoolbar,
.app-view-lefttoolbar {
.toolbar_group_right {
border-radius: @toolbar-group-border-radius;
position: absolute;
right: @toolbar-toptoolbar-offset-x;
top: @toolbar-toptoolbar-offset-y;
}
.toolbar_group_left {
border-radius: @toolbar-group-border-radius;
position: absolute;
left:@toolbar-toptoolbar-offset-x;
top: @toolbar-toptoolbar-offset-y;
}
.van-cell__title,
.van-cell__value {
text-align: left;
}
.van-cell {
border-radius: @toolbar-group-border-radius;
}
.van-hairline--top-bottom::after, .van-hairline-unset--top-bottom::after {
border-width: 0;
}
.van-button--default {
background-color: transparent;
border: none;
padding: 0;
color: #fff;
}
}
</#if>
<#assign deuiaction=item.getPSUIAction()>
<#if deuiaction.getUIActionTag() == 'ExportExcel'>
${item.getName()?lower_case}: { name: '${item.getName()?lower_case}', caption: '${item.caption}', disabled: false, type: '${item.getItemType()}', visabled: true, dataaccaction: '<#if deuiaction.getDataAccessAction()??>${deuiaction.getDataAccessAction()}</#if>', uiaction: { tag: '${deuiaction.getUIActionTag()}', target: '${deuiaction.getActionTarget()}' }<#if view.hasPSControl("GRID")><#assign gridhandler = view.getPSControl("GRID").getPSAjaxControlHandler()>, MaxRowCount: <#if gridhandler?? && gridhandler.getPSDEDataExport()??>${gridhandler.getPSDEDataExport().getMaxRowCount()?c}<#elseif sys.getDEDataExportMaxRowCount() gt 0>${sys.getDEDataExportMaxRowCount()?c}<#else>10000</#if></#if> },
<#elseif deuiaction.getUIActionTag() == 'ToggleRowEdit'>
${item.getName()?lower_case}: { name: '${item.getName()?lower_case}', caption: '${item.caption}', disabled: false, type: '${item.getItemType()}', visabled: true, dataaccaction: '<#if deuiaction.getDataAccessAction()??>${deuiaction.getDataAccessAction()}</#if>', uiaction: { tag: '${deuiaction.getUIActionTag()}', target: '${deuiaction.getActionTarget()}' } },
<#else>
${item.getName()?lower_case}: { name: '${item.getName()?lower_case}', caption: '${item.caption}', disabled: false, type: '${item.getItemType()}', visabled: true, dataaccaction: '<#if deuiaction.getDataAccessAction()??>${deuiaction.getDataAccessAction()}</#if>', uiaction: { tag: '${deuiaction.getUIActionTag()}', target: '${deuiaction.getActionTarget()}' } },
</#if>
\ No newline at end of file
${item.getName()?lower_case}: { isshow:false, name: '${item.getName()?lower_case}', caption: '${item.caption}', disabled: false, type: '${item.getItemType()}', visabled: true, dataaccaction: '', uiaction: { } },
<#if item.getPSDEToolbarItems()??>
<#list item.getPSDEToolbarItems() as toolbarItem>
<@ibizindent blank=8>
${P.getPartCode(toolbarItem).code}
</@ibizindent>
</#list>
</#if>
\ No newline at end of file
${item.getName()?lower_case}: { name: '${item.getName()?lower_case}', type: '${item.getItemType()}', visabled: true, dataaccaction: '', uiaction: { } },
\ No newline at end of file
${item.getName()?lower_case}: { name: '${item.getName()?lower_case}', type: '${item.getItemType()}', visabled: true, dataaccaction: '', uiaction: { } },
\ No newline at end of file
<#-- 工具栏模型 -->
/**
* 工具栏 ${srfclassname('${view.name}')} 模型
*
* @type {*}
* @memberof ${srfclassname('${view.name}')}
*/
public ${ctrl.name?lower_case}Models: any = {
<#if ctrl.getPSDEToolbarItems()??>
<#list ctrl.getPSDEToolbarItems() as item>
${P.getPartCode(item).code}
</#list>
</#if>
};
<#if ctrl.getToolbarStyle() == 'MOBBOTTOMMENU'>
/**
* 工具栏显示状态
*
* @type {boolean}
* @memberof ${srfclassname('${view.name}')}
*/
public ${ctrl.name}ShowState: boolean = false;
</#if>
## ibiz工具栏样式相关文档(移动端)
### 一、工具栏样式
#### 1、移动端导航栏左侧菜单
##### (1)支持功能:icon、分组、显示模式
##### (2)界面UI
​ ![lefttoolbar](./imgs/lefttoolbar.png)![lefttollbar_group](./imgs/lefttollbar_group.png)
#### 2、移动端导航栏右侧菜单
##### (1)支持功能:icon、分组、显示模式
##### (2)界面UI
​ ![righttoolbar](./imgs/righttoolbar.png)![toptoolbar_group](./imgs/toptoolbar_group.png)
#### 3、移动端视图下方菜单
##### (1)支持功能:icon
##### (2)界面UI
​ ![bottomtoolbar](./imgs/bottomtoolbar.png)
\ No newline at end of file
CTRLTYPE=TOOLBAR
\ No newline at end of file
<template>
<#if ctrl.render??>
${ctrl.render.code}
<#else>
<!-- 预置菜单样式:图标视图 BEGIN -->
<app-mob-menu-ionic-view
class="<#if ctrl.getPSSysCss()??><#assign singleCss = ctrl.getPSSysCss()> ${singleCss.getCssName()}</#if>"
menuName="${ctrl.codeName?lower_case}"
counterName="<#if ctrl.getPSSysCounter?? && ctrl.getPSSysCounter()??>${ctrl.getPSSysCounter().getCodeName()?lower_case}</#if>"
:items="menus"
:menuModels="menuMode.getAppFuncs()"
@select="select($event)"
v-if="controlStyle == 'ICONVIEW'">
</app-mob-menu-ionic-view>
<!-- 预置菜单样式:图标视图 END -->
<!-- 预置菜单样式:列表视图 BEGIN -->
<app-mob-menu-list-view
class="<#if ctrl.getPSSysCss()??><#assign singleCss = ctrl.getPSSysCss()> ${singleCss.getCssName()}</#if>"
menuName="${ctrl.codeName?lower_case}"
counterName="<#if ctrl.getPSSysCounter?? && ctrl.getPSSysCounter()??>${ctrl.getPSSysCounter().getCodeName()?lower_case}</#if>"
:items="menus"
:menuModels="menuMode.getAppFuncs()"
@select="select($event)"
v-else-if="controlStyle == 'LISTVIEW'" >
</app-mob-menu-list-view>
<!-- 预置菜单样式:列表视图 END -->
<!-- 预置菜单样式:图片滑动视图 BEGIN -->
<app-mob-menu-swiper-view
class="<#if ctrl.getPSSysCss()??><#assign singleCss = ctrl.getPSSysCss()> ${singleCss.getCssName()}</#if>"
menuName="${ctrl.codeName?lower_case}"
counterName="<#if ctrl.getPSSysCounter?? && ctrl.getPSSysCounter()??>${ctrl.getPSSysCounter().getCodeName()?lower_case}</#if>"
:items="menus"
:menuModels="menuMode.getAppFuncs()"
@select="select($event)"
v-else-if="controlStyle == 'SWIPERVIEW'">
</app-mob-menu-swiper-view>
<!-- 预置菜单样式:图片滑动视图 END -->
<!-- 预置菜单样式:默认样式 BEGIN -->
<app-mob-menu-default-view
class="<#if ctrl.getPSSysCss()??><#assign singleCss = ctrl.getPSSysCss()> ${singleCss.getCssName()}</#if>"
menuName="${ctrl.codeName?lower_case}"
counterName="<#if ctrl.getPSSysCounter?? && ctrl.getPSSysCounter()??>${ctrl.getPSSysCounter().getCodeName()?lower_case}</#if>"
:items="menus"
:menuModels="menuMode.getAppFuncs()"
v-model="defaultActive"
@select="select($event)"
v-else>
</app-mob-menu-default-view>
<!-- 预置菜单样式:默认样式 BEGIN -->
</#if>
</template>
\ No newline at end of file
此差异已折叠。
<#-- content -->
<#assign content>
:showBusyIndicator="${ctrl.isShowBusyIndicator()?c}"
controlStyle="<#if ctrl.getControlStyle?? && ctrl.getControlStyle()??>${ctrl.getControlStyle()}</#if>"
<#if (view.isDefaultPage?? && view.isDefaultPage())>
v-model="collapseChange"
:mode="mode"
:selectTheme="selectTheme"
:isDefaultPage="isDefaultPage"
:defPSAppView="defPSAppView"
</#if>
</#assign>
<#ibizinclude>
../@MACRO/HTML/DEFAULT.html.ftl
</#ibizinclude>
\ No newline at end of file
/*** BRGIN:菜单样式 ***/
<#ibizinclude>
../@MACRO/CSS/DEFAULT.less.ftl
</#ibizinclude>
.van-tabbar {
z-index: 0;
}
\ No newline at end of file
<#ibizinclude>
../@MACRO/CONTROL/CONTROL.vue.ftl
</#ibizinclude>
\ No newline at end of file
{
id: '${item.getId()?j_string}',
name: '${item.getName()?j_string}',
text: '${item.getText()?j_string}',
type: '<#if item.getItemType()??>${item.getItemType()?j_string}<#else></#if>',
counterid: '<#if item.getCounterId()??>${item.getCounterId()?j_string}<#else></#if>',
tooltip: '<#if item.getTooltip()??>${item.getTooltip()?j_string}</#if>',
expanded: <#if item.isExpanded()>true<#else>false</#if>,
separator: <#if item.isSeperator()>true<#else>false</#if>,
hidden: <#if item.isHidden()>true<#else>false</#if>,
hidesidebar: <#if item.isHideSideBar()>true<#else>false</#if>,
opendefault: <#if item.isOpenDefault()>true<#else>false</#if>,
<#if item.getPSSysImage()??>
iconcls: '${item.getPSSysImage().getCssClass()}',
icon: '${item.getPSSysImage().getImagePath()}',
<#else>
iconcls: '',
icon: '',
</#if>
<#if item.getPSSysCss()??>
textcls: '${item.getPSSysCss().getCssName()}',
<#else>
textcls: '',
</#if>
<#if item.getPSAppFunc()??>
appfunctag: '${item.getPSAppFunc().codeName}',
<#else>
appfunctag: '',
</#if>
resourcetag: '<#if item.getAccessKey()??>${item.getAccessKey()}</#if>',
<#if item.getPSAppMenuItems()??>
items: [
<#list item.getPSAppMenuItems() as child>
${P.getPartCode(child,"ITEM").code},
</#list>
],
</#if>
}
\ No newline at end of file
<#ibizinclude>
../@MACRO/MODEL/MODEL_HEADER.ts.ftl
</#ibizinclude>
/**
* 菜单项集合
*
* @private
* @type {any[]}
* @memberof ${srfclassname('${ctrl.codeName}')}Model
*/
private items: any[] = [
<#list ctrl.getPSAppMenuItems() as child>
${P.getPartCode(child,"ITEM").code},
</#list>
];
/**
* 应用功能集合
*
* @private
* @type {any[]}
* @memberof ${srfclassname('${ctrl.codeName}')}Model
*/
private funcs: any[] = [
<#if view.isDefaultPage?? && view.isDefaultPage()>
<#list ctrl.getPSAppFuncs() as appFuncs>
{
appfunctag: '${appFuncs.getCodeName()}',
appfuncyype: '${appFuncs.getAppFuncType()}',
<#if appFuncs.getAppFuncType() == 'APPVIEW'>
<#assign dataview = appFuncs.getPSAppView()/>
openmode: '${dataview.getOpenMode()}',
componentname: '${srffilepath2(dataview.getCodeName())}',
codename: '${dataview.getCodeName()?lower_case}',
deResParameters: [],
<#-- BEGIN:是否应用实体视图 -->
<#if dataview.isPSDEView()>
<#assign appDataEntity = dataview.getPSAppDataEntity()/>
routepath: '/${view.getCodeName()?lower_case}/:${view.getCodeName()?lower_case}?/${srfpluralize(appDataEntity.codeName)?lower_case}/:${appDataEntity.getCodeName()?lower_case}?/${dataview.getPSDEViewCodeName()?lower_case}/:${dataview.getPSDEViewCodeName()?lower_case}?',
parameters: [
{ pathName: '${srfpluralize(appDataEntity.codeName)?lower_case}', parameterName: '${appDataEntity.getCodeName()?lower_case}' },
{ pathName: '${dataview.getPSDEViewCodeName()?lower_case}', parameterName: '${dataview.getPSDEViewCodeName()?lower_case}' },
],
<#else>
routepath: '/${view.getCodeName()?lower_case}/:${view.getCodeName()?lower_case}?/${dataview.getCodeName()?lower_case}/:${dataview.getCodeName()?lower_case}?',
parameters: [
{ pathName: '${dataview.getCodeName()?lower_case}', parameterName: '${dataview.getCodeName()?lower_case}' },
],
</#if>
<#-- END:是否应用实体视图 -->
</#if>
},
</#list>
</#if>
];
/**
* 获取所有菜单项集合
*
* @returns {any[]}
* @memberof ${srfclassname('${ctrl.codeName}')}Model
*/
public getAppMenuItems(): any[] {
return this.items;
}
/**
* 获取所有应用功能集合
*
* @returns {any[]}
* @memberof ${srfclassname('${ctrl.codeName}')}Model
*/
public getAppFuncs(): any[] {
return this.funcs;
}
<#ibizinclude>
../@MACRO/MODEL/MODEL_BOTTOM.ts.ftl
</#ibizinclude>
\ No newline at end of file
# 菜单预置样式
菜单预置样式可以通过在菜单部件中配置预置样式,也可以在菜单被引用的位置配置预置样式,后者产生的模型值,会覆盖前者的模型值。该模式保证一个菜单部件可以在不同的场景中被使用,同时,该部件本身具备预置样式绘制能力,使得菜单部件成为独立的资源内容
## 代码
本部分代码分为两个部分,分别是样式类型和组件文件代码。
预置样式提供多个类型,菜单实现 `ICONVIEW``LISTVIEW``SWIPERVIEW`,其他样式采用默认样式输出
```typescript
/**
* 部件样式
*
* @protected
* @type {(string | 'ICONVIEW' | 'LISTVIEW' | 'SWIPERVIEW' | 'LISTVIEW2' | 'LISTVIEW3' | 'LISTVIEW4')}
* 默认空字符串 | 图标视图 | 列表视图 | 图片滑动视图 | 列表视图(无刷新) | 列表视图(无滑动) | 列表视图(无背景)
* @memberof AppIndexView
*/
@Prop({ default: '' }) protected controlStyle!: string | 'ICONVIEW' | 'LISTVIEW' | 'SWIPERVIEW' | 'LISTVIEW2' | 'LISTVIEW3' | 'LISTVIEW4';
```
渲染内容代码
```html
<template>
<#if ctrl.render??>
${ctrl.render.code}
<#else>
<!-- 预置菜单样式:图标视图 BEGIN -->
<app-mob-menu-ionic-view
class="<#if ctrl.getPSSysCss()??><#assign singleCss = ctrl.getPSSysCss()> ${singleCss.getCssName()}</#if>"
menuName="${ctrl.codeName?lower_case}"
:items="menus"
@select="select($event)"
v-if="controlStyle == 'ICONVIEW'">
</app-mob-menu-ionic-view>
<!-- 预置菜单样式:图标视图 END -->
<!-- 预置菜单样式:列表视图 BEGIN -->
<app-mob-menu-list-view
class="<#if ctrl.getPSSysCss()??><#assign singleCss = ctrl.getPSSysCss()> ${singleCss.getCssName()}</#if>"
menuName="${ctrl.codeName?lower_case}"
:items="menus"
@select="select($event)"
v-else-if="controlStyle == 'LISTVIEW'" >
</app-mob-menu-list-view>
<!-- 预置菜单样式:列表视图 END -->
<!-- 预置菜单样式:图片滑动视图 BEGIN -->
<app-mob-menu-swiper-view
class="<#if ctrl.getPSSysCss()??><#assign singleCss = ctrl.getPSSysCss()> ${singleCss.getCssName()}</#if>"
menuName="${ctrl.codeName?lower_case}"
:items="menus"
@select="select($event)"
v-else-if="controlStyle == 'SWIPERVIEW'">
</app-mob-menu-swiper-view>
<!-- 预置菜单样式:图片滑动视图 END -->
<!-- 预置菜单样式:默认样式 BEGIN -->
<app-mob-menu-default-view
class="<#if ctrl.getPSSysCss()??><#assign singleCss = ctrl.getPSSysCss()> ${singleCss.getCssName()}</#if>"
menuName="${ctrl.codeName?lower_case}"
:items="menus"
v-model="defaultActive"
@select="select($event)"
v-else>
</app-mob-menu-default-view>
<!-- 预置菜单样式:默认样式 BEGIN -->
</#if>
</template>
```
## 图标视图
### 配置
![config](./img/ionic-view/config.png)
### 效果
<img src="./img/ionic-view/ionic-view1.jpg" alt="ionic-view1" style="zoom:25%;" />
## 列表视图
### 配置
![config](./img/list-view/config.png)
### 效果
<img src="./img/list-view/list-view1.jpg" alt="list-view1" style="zoom:25%;" />
## 图片滑动视图
### 配置
![config](./img/swiper-view/config.png)
### 效果
<img src="./img/swiper-view/swiper-view1.jpg" alt="ionic-view1" style="zoom:25%;" />
<img src="./img/swiper-view/swiper-view2.jpg" alt="ionic-view2" style="zoom:25%;" />
<img src="./img/swiper-view/swiper-view3.jpg" alt="ionic-view3" style="zoom:25%;" />
<img src="./img/swiper-view/swiper-view4.jpg" alt="ionic-view4" style="zoom:25%;" />
## 默认样式
### 配置
菜单默认样式,属于用于导航应用功能展示,其一般处于底部的导航区域,不需要额外添加配置。
### 效果
<img src="./img/default-view/default-view1.jpg" alt="default-view1" style="zoom:25%;" />
\ No newline at end of file
<#assign extendsClass>AppMenuServiceBase</#assign>
<#ibizinclude>
../@MACRO/SERVICE/SERVICE_HEADER.ts.ftl
</#ibizinclude>
/**
* 获取数据
*
* @returns {Promise<any>}
* @memberof ${srfclassname('${ctrl.codeName}')}
*/
public get(params: any = {}): Promise<any> {
return this.http.get('v7/${srffilepath2(ctrl.codeName)}${ctrl.getControlType()?lower_case}', params);
}
<#ibizinclude>
../@MACRO/SERVICE/SERVICE_BOTTOM.ts.ftl
</#ibizinclude>
\ No newline at end of file
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册