视图

视图是业务模型内容的最大承载节点,它包含了部件、逻辑等。

其中,视图内容逻辑在模板结构中是分离的。

本部分使用实体表格视图(类别文件)作为说明对象,解释视图的构成单位以及构成内容。

视图主要分为以下两个方面来介绍:

  • 构成单位
  • 构成内容

构成单位

表格视图视图的基本构成单位:

  • 视图(逻辑与内容) VIEW.tsx.ftl
  • 视图样式 VIEW.less.ftl
  • 视图标识 template.properties

视图(逻辑与内容)

视图逻辑

视图逻辑则是独立的目录维护,表格视图 VIEW.tsx.ftl 代码如下:

<#ibizinclude>
../@MACRO/GRID_VIEW.tsx.ftl
</#ibizinclude>

GRID_VIEW.tsx.ftl 宏文件内容如下:

<#ibizinclude>
./VIEW_HEADER.tsx.ftl
</#ibizinclude>

<#ibizinclude>
./VIEW_CONTENT.tsx.ftl
</#ibizinclude>
<#assign grid></#assign>
<#if view.hasPSControl('grid')>
<#assign grid = view.getPSControl('grid')>
</#if>
<#if grid??>

    /**
     * 是否单选
     *
     * @type {boolean}
     * @memberof ${srfclassname('${view.name}')}
     */
    public isSingleSelect: boolean = ${grid.isSingleSelect()?c};
</#if>

    /**
     * 搜索值
     *
     * @type {string}
     * @memberof ${srfclassname('${view.name}')}
     */
    public query: string = '';

    /**
     * 是否展开搜索表单
     *
     * @type {boolean}
     * @memberof ${srfclassname('${view.name}')}
     */
    public isExpandSearchForm: boolean = ${view.isExpandSearchForm()?c};

    /**
     * 表格行数据默认激活模式
     * 0 不激活
     * 1 单击激活
     * 2 双击激活
     *
     * @type {(number | 0 | 1 | 2)}
     * @memberof ${srfclassname('${view.name}')}
     */
    public gridRowActiveMode: number | 0 | 1 | 2 = ${view.getGridRowActiveMode()?c};

    /**
     * 快速搜索
     *
     * @param {*} $event
     * @memberof ${srfclassname('${view.name}')}
     */
    public onSearch($event: any): void {
        <#if grid??>
        const grid: any = this.$refs.${grid.name};
        if (grid) {
            grid.load({});
        }
        </#if>
    }
<#if grid??>

    /**
     * 刷新数据
     *
     * @readonly
     * @type {(number | null)}
     * @memberof ${srfclassname('${view.name}')}
     */
    get refreshdata(): number | null {
        return this.$store.getters['viewaction/getRefreshData'](this.viewtag);
    }

    /**
     * 监控数据变化
     *
     * @param {*} newVal
     * @param {*} oldVal
     * @returns
     * @memberof ${srfclassname('${view.name}')}
     */
    @Watch('refreshdata')
    onRefreshData(newVal: any, oldVal: any) {
        if (newVal === null || newVal === undefined) {
            return;
        }
        if (newVal === 0) {
            return;
        }
        const grid: any = this.$refs.${grid.name};
        if (grid) {
            grid.load({});
        }
    }
</#if>

<#ibizinclude>
./LAYOUTPANEL_VIEW.tsx.ftl
</#ibizinclude>

<#ibizinclude>
./VIEW_BOTTOM.tsx.ftl
</#ibizinclude>

其中 LAYOUTPANEL_VIEW.tsx.ftl 主要用于输出视图内容。

视图内容

视图内容主要在部件的视图布局面板中,该面板包含所有的视图布局。

LAYOUTPANEL_VIEW.tsx.ftl 输出视图内容,代码如下:

<#--  视图内容绘制  -->
<#if view.getPSViewMsgGroup()??>
<#assign viewMsgGroup = view.getPSViewMsgGroup()/>

    /**
     * 绘制视图消息 (上方)
     *
     * @returns
     * @memberof ${srfclassname('${view.name}')}
     */
    public renderPosTopMsgs() {
        return (
            <div class='view-top-messages'>
                <#list viewMsgGroup.getPSViewMsgGroupDetails() as detail>
                <#assign msg = detail.getPSViewMsg()>
                <#--  暂时支持静态  -->
                <#if msg.getCodeName() != '' && msg.getPosition() == 'TOP' && msg.getDynamicMode() == 0>
                {this.render${msg.getCodeName()}()}
                </#if>
                </#list>
            </div>
        );
    }

    /**
     * 绘制视图消息 (下方)
     *
     * @returns
     * @memberof ${srfclassname('${view.name}')}
     */
    public renderPosBottomMsgs() {
        return (
            <div class='view-bottom-messages'>
                <#list viewMsgGroup.getPSViewMsgGroupDetails() as detail>
                <#assign msg = detail.getPSViewMsg()>
                <#--  暂时支持静态  -->
                <#if msg.getCodeName() != '' && msg.getPosition() == 'BOTTOM' && msg.getDynamicMode() == 0>
                {this.render${msg.getCodeName()}()}
                </#if>
                </#list>
            </div>
        );
    }

<#list viewMsgGroup.getPSViewMsgGroupDetails() as detail>
<#assign msg = detail.getPSViewMsg()>
<#--  暂时支持静态  -->
<#if msg.getCodeName() != '' && msg.getDynamicMode() == 0>
<#assign type = msg.getMessageType() />

    /**
     * ${msg.getName()}
     *
     * @returns
     * @memberof ${srfclassname('${view.name}')}
     */
    public render${msg.getCodeName()}() {
        return (
            <alert type='<#if type == 'INFO'>info<#elseif type == 'WARN'>warning<#elseif type == 'ERROR'>error<#else>info</#if>' closable={${msg.isEnableRemove()?c}}>
                ${msg.getTitle()}
                <span slot='desc'>${msg.getMessage()}</span>
            </alert>
        );
    }
</#if>
</#list>
<#else>

    /**
     * 绘制视图消息 (上方)
     *
     * @returns
     * @memberof ${srfclassname('${view.name}')}
     */
    public renderPosTopMsgs() {
        return (
            <div class='view-top-messages'>
            </div>
        );
    }

    /**
     * 绘制视图消息 (下方)
     *
     * @returns
     * @memberof ${srfclassname('${view.name}')}
     */
    public renderPosBottomMsgs() {
        return (
            <div class='view-bottom-messages'>
            </div>
        );
    }
</#if>

    /**
     * 绘制内容
     *
     * @param {CreateElement} h
     * @returns
     * @memberof ${srfclassname('${view.name}')}
     */
    public render(h: CreateElement) {
        return (
<@ibizindent blank=8>
${P.getLayoutCode().code}
</@ibizindent>
        );
    }

该部分包括视图消息与绘制内容,此处主要介绍绘制内容,以实体表格视图为例。

视图内容成员主要包括:

  • 视图绘制内容 template.properties
  • 视图绘制样式 VIEW.less.ftl
  • 视图绘制标识 VIEW.tsx.ftl
视图绘制内容

表格视图绘制内容如下:

<#ibizinclude>
../@MACRO/GRID.tsx.ftl
</#ibizinclude>

GRID.tsx.ftl 宏文件内容:

<div class='view-container ${srffilepath2(view.getCodeName())}<#if view.getPSSysCss?? && view.getPSSysCss()??> ${view.getPSSysCss().getCssName()}</#if>'>
    <card class='view-card<#if !view.isShowCaptionBar()> view-no-caption</#if>'  dis-hover={true} bordered={false}>

    <#ibizinclude>
    ./VIEW_CAPTION.tsx.ftl
    </#ibizinclude>


        <div class='content-container'>
            {this.renderPosTopMsgs()}
<#assign MDContent>
<#comment><!--开始:快速搜索或工具栏存在--></#comment>
<#if (view.isEnableQuickSearch() || view.hasPSControl('toolbar'))>
<row style='margin-bottom: 6px;'>
    <#if view.isEnableQuickSearch()>
    <i-input<#if view.hasPSControl('searchform')><#if view.isExpandSearchForm??> v-show={!this.isExpandSearchForm}</#if></#if> v-model={this.query} search enter-button on-on-search={($event: any) => this.onSearch($event)} class='pull-left' style='max-width: 400px;margin-top:6px;' />
    </#if>
    <div class='pull-right'>
<@ibizindent blank=8>
<#if view.hasPSControl('toolbar')>
${P.getCtrlCode('toolbar', 'CONTROL.html').code}
</#if>
</@ibizindent>
    </div>
</row>
</#if>
<#comment><!--结束:快速搜索或工具栏存在--></#comment>
<#if view.hasPSControl('searchform')>
${P.getCtrlCode('searchform', 'CONTROL.html').code}
</#if>
<#if view.hasPSControl('grid')>
${P.getCtrlCode('grid', 'CONTROL.html').code}
</#if>
</#assign>

<#ibizinclude>
./VIEW_MD_CONTENT.tsx.ftl
</#ibizinclude>
            {this.renderPosBottomMsgs()}
        </div>
    </card>
</div>
视图绘制样式

视图绘制样式丰富了的视图内容组成,了解更多查看视图样式

视图绘制标识
CTRLTYPE=VIEWLAYOUTPANEL#APPDEGRIDVIEW

CTRLTYPE 是部件类型,VIEWLAYOUTPANEL#APPDEGRIDVIEW 是视图布局面板标识名称和视图标识名称,属于 IBizSys 模型预置。

视图样式

视图样式输出过程如下:

DEFAULT.less.ftl --------> 布局面板实体表格视图样式 --------> 实体表格视图样式

输出实体表格视图样式 FreeMarker 代码,它指向布局面板实体表格视图样式。

${P.getLayoutCode().code}

布局面板实体表格视图样式,引入了宏文件,视图样式扩展,目标是替换该文件。

<#ibizinclude>
../@MACRO/DEFAULT.less.ftl
</#ibizinclude>

DEFAULT.less.ftl 宏文件内容。

// this is less

<#if view.hasPSControl('toolbar')>
<@ibizindent blank=8>
${P.getCtrlCode('toolbar', 'CONTROL.less').code}
</@ibizindent>
</#if>

<#assign viewCssName = '' />
<#if view.getPSSysCss()??>
<#assign viewCssName = view.getPSSysCss().getCssName()>
</#if>
<#list view.getPSSysCsses() as syscss>
<#if syscss.getCssStyle()??>
<#if syscss.getCssName() != viewCssName>
<#if syscss.getRawCssStyle()?? && syscss.getRawCssStyle()?length gt 0>
.${syscss.getCssName() } {
    ${syscss.getRawCssStyle()}
}
</#if>
<#if syscss.getCssStyle()??>
${syscss.getCssStyle()}
</#if>
</#if>
</#if>
</#list>

<#if view.getPSSysCss()??>
<#assign css=view.getPSSysCss()/>
<#if css.getRawCssStyle()?? && css.getRawCssStyle()?length gt 0>
.${css.getCssName()} {
    ${css.getRawCssStyle()}
}
</#if>
<#if css.getCssStyle()??>
${css.getCssStyle()}
</#if>
</#if>

视图标识

VIEWTYPE=APPDEGRIDVIEW

VIEWTYPE 是视图类型,APPDEGRIDVIEW 是视图标识名称,属于 IBizSys 模型预置。

构成内容

后续更新

results matching ""

    No results matching ""