自定义View的Layout
自定义View的Layout
简介
当在日常需求中需要调整Layout时,通常涉及到对页面布局进行调整以满足特定的显示需求。 在树表结构(左树右表、级联)等情况下,可能需要通过修改View的Layout来完成、
使用规则
pamirs:
meta:
views-packages: /pamirs/views/${module}/layout/**/*.xml #禁止修改
根据YAML 扫描resource包下的路径/pamirs/views/${模块} /layout/**/*.xml
下面的所有XML文件YAML中的配置禁止修改!!!! 一但修改 所有设计器将无法使用优先级顺序: 当XML里面没有配置,则用元数据覆盖了。 当XML里面配置了,则不会用元数据覆盖了。
自定义实现Layout
自定义表格Layout
如果我们想去除表格视图区域的搜索区、ActionBar(操作区),就可以为视图自定义一个简单的Layout就行啦
新建一个表格的Layout
在views/demo_core/layout
路径下创建名为sample_table_layout.xml
的文件,并设置name属性为sampleTableLayout。
<view type="TABLE" name="sampleTableLayout">
<pack widget="fieldset" style="height: 100%" wrapperStyle="height: 100%">
<pack widget="row" style="height: 100%; flex-direction: column">
<pack widget="col" mode="full" style="min-height: 234px">
<element widget="table" slot="table" slotSupport="field">
<xslot name="fields" slotSupport="field" />
<element widget="rowAction" slot="rowActions" slotSupport="action"/>
</element>
</pack>
</pack>
</pack>
</view>
修改宠物达人自定义表格Template 在view标签上增加layout属性值为"sampleTableLayout"
<view name="tableView" model="demo.PetTalent" cols="1" type="TABLE" enableSequence="true" layout="sampleTableLayout">
……省略其他
</view>
自定义树表Layout
本节以“给商品管理页面以树表的方式增加商品类目过滤”为例
增加商品类目模型
增加PetItemCategory模型继承CodeModel,新增两个字段定义name和parent,其中parent字段M2O关联自身模型,非必填字段(如字段值为空即为一级类目)
package pro.shushi.pamirs.demo.api.model;
import pro.shushi.pamirs.meta.annotation.Field;
import pro.shushi.pamirs.meta.annotation.Model;
import pro.shushi.pamirs.meta.base.common.CodeModel;
@Model.model(PetItemCategory.MODEL_MODEL)
@Model(displayName = "宠物商品类目",summary="宠物商品类目",labelFields={"name"})
public class PetItemCategory extends CodeModel {
public static final String MODEL_MODEL="demo.PetItemCategory";
@Field(displayName = "类目名称",required = true)
private String name;
@Field(displayName = "父类目")
@Field.many2one
private PetItemCategory parent;
}
修改自定义商品模型
@Field(displayName = "类目")
@Field.many2one
private PetItemCategory category;
新增名为 treeTableLayout的Layout
在views/demo_core/layout
路径下增加一个名为tree_table_layout.xml
文件,name设置为treeTableLayout
<view type="TABLE" name="treeTableLayout">
<view type="SEARCH">
<pack widget="fieldset">
<element widget="search" slot="search" slotSupport="field"/>
</pack>
</view>
<pack widget="fieldset" style="height: 100%" wrapperStyle="height: 100%">
<pack widget="row" wrap="false" style="height: 100%">
<pack widget="col" mode="full" style="min-width: 257px; max-width: 257px">
<pack widget="fieldset" style="height: 100%" wrapperStyle="height: 100%; padding: 24px 16px">
<pack widget="col" style="height: 100%">
<element widget="tree" slot="tree" style="height: 100%" />
</pack>
</pack>
</pack>
<pack widget="col" mode="full" style="min-width: 400px">
<pack widget="row" style="height: 100%; flex-direction: column">
<pack widget="col" mode="full" style="width: 100%; flex: 0 0 auto">
<element widget="actionBar" slot="actionBar" slotSupport="action">
<xslot name="actions" slotSupport="action" />
</element>
</pack>
<pack widget="col" mode="full" style="width: 100%; min-height: 345px">
<element widget="table" slot="table" slotSupport="field">
<xslot name="fields" slotSupport="field" />
<element widget="rowAction" slot="rowActions" slotSupport="action" />
</element>
</pack>
</pack>
</pack>
</pack>
</pack>
</view>
自定义商品管理的Template
- 在
views/demo_core/template
路径下创建一个名为pet_item_table.xml
的文件。 - 与普通自定义template的区别在于:
- 配置layout属性为treeTableLayout,与之前定义的layout保持一致。
- 配置了widget为tree的template节点,node可以配置多个,node配置说明如下:
- model,模型编码,必填。
- label,数据标题,支持表达式,必填。
- labelFields,数据标题中使用的字段列表,必填。
- references,层级关联字段,第一层无效,其他层必填。模型编码#字段。
- selfReferences,自关联字段,模型编码#字段。
- search,点击搜索字段,必须使用主表格字段。模型编码#字段。
- filter,层级过滤条件。模型编码#字段。 以上所有使用#拼接的属性配置,与model一致的情况下,均可以省略模型编码。
<view name="tableView" model="demo.PetItem" type="TABLE" cols="1" enableSequence="false" layout="treeTableLayout">
<template slot="actions" autoFill="true"/>
<template slot="rowActions" autoFill="true"/>
<template slot="fields">
<field invisible="true" priority="5" data="id" label="ID" readonly="true"/>
<field priority="90" data="code" label="编码"/>
<field priority="101" data="itemName" label="商品名称"/>
<field priority="101" data="dataStatus" label="数据状态">
<options>
<option name="DRAFT" displayName="草稿" value="DRAFT" state="ACTIVE"/>
<option name="NOT_ENABLED" displayName="未启用" value="NOT_ENABLED" state="ACTIVE"/>
<option name="ENABLED" displayName="已启用" value="ENABLED" state="ACTIVE"/>
<option name="DISABLED" displayName="已禁用" value="DISABLED" state="ACTIVE"/>
</options>
</field>
<field priority="102" data="price" label="商品价格"/>
<field priority="103" data="shop" label="店铺">
<options>
<option references="demo.PetShop" referencesType="STORE" referencesLabelFields="shopName">
<field name="shopName" data="shopName" ttype="STRING"/>
</option>
</options>
</field>
<field priority="104" data="shopId" label="店铺id"/>
<field priority="105" data="type" label="品种">
<options>
<option references="demo.PetType" referencesType="STORE" referencesLabelFields="name">
<field name="name" data="name" ttype="STRING"/>
</option>
</options>
</field>
<field priority="106" data="typeId" label="品种类型"/>
<field priority="107" data="petItemDetails" label="详情">
<options>
<option references="demo.PetItemDetail" referencesType="TRANSIENT" referencesLabelFields="remark">
<field name="remark" data="remark" ttype="STRING"/>
</option>
</options>
</field>
<field priority="108" data="tags" label="商品标签"/>
<field priority="109" data="petTalents" label="推荐达人">
<options>
<option references="demo.PetTalent" referencesType="STORE" referencesLabelFields="name">
<field name="name" data="name" ttype="STRING"/>
</option>
</options>
</field>
<field priority="200" data="createDate" label="创建时间" readonly="true"/>
<field priority="210" data="writeDate" label="更新时间" readonly="true"/>
<field priority="220" data="createUid" label="创建人id"/>
<field priority="230" data="writeUid" label="更新人id"/>
</template>
<template slot="search" autoFill="true" cols="4"/>
<template enableSearch="true" slot="tree" style="height: 100%" widget="tree">
<nodes>
<!-- <node label="activeRecord.name" labelFields="name" model="demo.PetItemCategory" search="demo.PetItem#category" selfReferences="parent"/> -->
<node label="activeRecord.name" labelFields="name" model="demo.PetItemCategory" search="demo.PetItem#category" selfReferences="demo.PetItemCategory#parent"/>
</nodes>
</template>
</view>
自定义级联Layout
本节以“给商品管理页面以级联的方式增加商品类目过滤”为例,该例子中左边级联项由多个模型组成
增加商品类目类型模型
增加PetItemCategoryType模型集成CodeModel,新增两个字段定义name
package pro.shushi.pamirs.demo.api.model;
import pro.shushi.pamirs.meta.annotation.Field;
import pro.shushi.pamirs.meta.annotation.Model;
import pro.shushi.pamirs.meta.base.common.CodeModel;
@Model.model(PetItemCategoryType.MODEL_MODEL)
@Model(displayName = "宠物商品类目类型",summary="宠物商品类目类型",labelFields={"name"})
public class PetItemCategoryType extends CodeModel {
public static final String MODEL_MODEL="demo.PetItemCategoryType";
@Field(displayName = "类目类型名称",required = true)
private String name;
}
修改商品类目
为商品类目模型PetItemCategory增加一个type字段m2o关联PetItemCategoryType
@Field(displayName = "类目类型")
@Field.many2one
private PetItemCategoryType type;
新增名为cascaderTableLayout 的Layout
在views/demo_core/layout
路径下增加一个名为cascader_table_layout.xml
文件
<view type="TABLE" name="cascaderTableLayout">
<view type="SEARCH">
<pack widget="fieldset">
<element widget="search" slot="search" slotSupport="field"/>
</pack>
</view>
<pack widget="fieldset" style="height: 100%" wrapperStyle="height: 100%; overflow: auto">
<pack widget="row" wrap="false" style="height: 100%">
<pack widget="col" mode="full" style="flex: unset">
<element widget="card-cascader" slot="cardCascader" style="height: 100%" />
</pack>
<pack widget="col" mode="full" style="min-width: 564px">
<pack widget="row" style="height: 100%; flex-direction: column">
<pack widget="col" mode="full" style="width: 100%; flex: 0 0 auto">
<element widget="actionBar" slot="actionBar" slotSupport="action">
<xslot name="actions" slotSupport="action" />
</element>
</pack>
<pack widget="col" mode="full" style="width: 100%; min-height: 345px">
<element widget="table" slot="table" slotSupport="field">
<xslot name="fields" slotSupport="field" />
<element widget="rowAction" slot="rowActions" slotSupport="action"/>
</element>
</pack>
</pack>
</pack>
</pack>
</pack>
</view>
修改商品管理的Template
- 在
views/demo_core/template
路径下,修改名为pet_item_table.xml
的文件如下所示:- 配置layout属性为【cascaderTableLayout】,与之前的layout定义保持一致。
- 配置了widget为card-cascader的template节点,node可以配置多个,node配置与树表的配置相同。
<view name="tableView" model="demo.PetItem" type="TABLE" cols="1" enableSequence="false" layout="cascaderTableLayout">
<template slot="actions" autoFill="true"/>
<template slot="rowActions" autoFill="true"/>
<template slot="fields">
<field invisible="true" priority="5" data="id" label="ID" readonly="true"/>
<field priority="90" data="code" label="编码"/>
<field priority="101" data="itemName" label="商品名称"/>
<field priority="101" data="dataStatus" label="数据状态">
<options>
<option name="DRAFT" displayName="草稿" value="DRAFT" state="ACTIVE"/>
<option name="NOT_ENABLED" displayName="未启用" value="NOT_ENABLED" state="ACTIVE"/>
<option name="ENABLED" displayName="已启用" value="ENABLED" state="ACTIVE"/>
<option name="DISABLED" displayName="已禁用" value="DISABLED" state="ACTIVE"/>
</options>
</field>
<field priority="102" data="price" label="商品价格"/>
<field priority="103" data="shop" label="店铺">
<options>
<option references="demo.PetShop" referencesType="STORE" referencesLabelFields="shopName">
<field name="shopName" data="shopName" ttype="STRING"/>
</option>
</options>
</field>
<field priority="104" data="shopId" label="店铺id"/>
<field priority="105" data="type" label="品种">
<options>
<option references="demo.PetType" referencesType="STORE" referencesLabelFields="name">
<field name="name" data="name" ttype="STRING"/>
</option>
</options>
</field>
<field priority="106" data="typeId" label="品种类型"/>
<field priority="107" data="petItemDetails" label="详情">
<options>
<option references="demo.PetItemDetail" referencesType="TRANSIENT" referencesLabelFields="remark">
<field name="remark" data="remark" ttype="STRING"/>
</option>
</options>
</field>
<field priority="108" data="tags" label="商品标签"/>
<field priority="109" data="petTalents" label="推荐达人">
<options>
<option references="demo.PetTalent" referencesType="STORE" referencesLabelFields="name">
<field name="name" data="name" ttype="STRING"/>
</option>
</options>
</field>
<field priority="200" data="createDate" label="创建时间" readonly="true"/>
<field priority="210" data="writeDate" label="更新时间" readonly="true"/>
<field priority="220" data="createUid" label="创建人id"/>
<field priority="230" data="writeUid" label="更新人id"/>
</template>
<template slot="search" autoFill="true" cols="4"/>
<template enableSearch="true" slot="cardCascader" style="height: 100%" widget="card-cascader">
<nodes>
<node label="activeRecord.name" title="类目类型" labelFields="name" model="demo.PetItemCategoryType" />
<node label="activeRecord.name" title="类目" labelFields="name" model="demo.PetItemCategory" search="demo.PetItem#category" references="demo.PetItemCategory#type" selfReferences="demo.PetItemCategory#parent"/>
</nodes>
</template>
</view>