页面树结构

版本比较

标识

  • 该行被添加。
  • 该行被删除。
  • 格式已经改变。

...

代码块
languagejs
titlepart-web/modeler/forms/SimpleCellGroup.vue
collapsetrue
<template>
    	<!--
    建模时的预览前端,即插件的实际显示样式
    :addinName="name"和ref="main"一般情况不可去除
    -->
    	<section v-if="t_preview" :addinName="name" ref="main">
        		<!-- 在画布区的显示内容 -->
        <span>
            		<span>
			<!-- see https://www.iviewui.com/components/cell#JCYF -->
            			<Card :style="cardStyle" class="cell-group-wrapper">
                				<p slot="title">
                    					<!-- change to slot syntax to avoid a bug, where :title may not respond to change as a prop. -->
                    					<Icon :type="cellData.icon"></Icon>
                    					{{ cellData.title }}
                				</p>
                				<CellGroup v-if="cellData.list && cellData.list.length">
					<Cell
						v-for="obj in                  <Cell
                        v-for="obj in cellData.list"
                        :key="obj.oid"
                        :titlecellData.list"
						:key="obj.oid"
						:title="String(obj[args.attributeForTitle])"
						:label="String(obj[args.attributeForTitleattributeForLabel])"
                        :label					>
						<Avatar :src="String(obj[args.attributeForLabelattributeForIcon])" slot="icon" />
					</Cell>
				</CellGroup>
				<div v-else               >
                        <Avatar :src="String(obj[args.attributeForIcon])" slot="icon" />
                    </Cell>
                </CellGroup>
                <div v-else class="no-result-prompt">无数据展示...</div>
            </Card>
        </span>
        <span v-show="t_edit" ref="edit">
            <!-- v-bind. see https://vuejs.org/v2/api/#v-bind -->
            <EditBox
                v-if="actEdit"
                :addinName="name"
                :widgetAnnotation="widgetAnnotation"
                :editExtendInfo="editExtendInfo"
                ref="editbox"
                v-model="args"
                :attributes="filter_attributes"
                :router="router"
                :route="route"
				:store="store"
                :root="root"
                :itemValue="itemValue"
                :query_oprs="query_oprs"
                :dataTypes="dataTypes"
                :targetclass="itemValue.data.targetClass"
            >
                <div slot="attribute">
                    <!-- 从外部引用的辅助标签,用于显示属性 -->
                    <p>标题属性(Title)</p>
                    <AttributeSelector
                        :target-class="args.bindTargetClass"
                        v-model="args.attributeForTitle"
                    ></AttributeSelector>
                    <p>详情属性(Label)</p>
                    <AttributeSelector
                        :target-class="args.bindTargetClass"
                        v-model="args.attributeForLabel"
                    ></AttributeSelector>
                    <p>图标属性(Icon)</p>
                    <AttributeSelector
                        :target-class="args.bindTargetClass"
                        v-model="args.attributeForIcon"
                    ></AttributeSelector>
                    <Button type="primary" long @click="freshData">刷新数据</Button>
                </div>
            </EditBox>
        </span>
    </section>
    <section v-else :addinName="name">
        <span style="text-align: center">
            <div class="form-addin-icon">
                <!-- 控件拖放区图标的样式
                see: http://ise.thss.tsinghua.edu.cn/font_857540_a2fo0rqai0f/demo_index.html-->
                <i class="iconfont"></i>
            </div>
            <!-- 在控件拖放区图标的名字 -->
            <div class="form-addin-name">简单列表</div>
        </span>
    <class="no-result-prompt">无数据展示...</div>
			</Card>
		</span>
		<span v-show="t_edit" ref="edit">
			<!-- v-bind. see https://vuejs.org/v2/api/#v-bind -->
			<EditBox
				v-if="actEdit"
				:addinName="name"
				:widgetAnnotation="widgetAnnotation"
				:editExtendInfo="editExtendInfo"
				ref="editbox"
				v-model="args"
				:attributes="filter_attributes"
				:router="router"
				:route="route"
				:store="store"
				:root="root"
				:itemValue="itemValue"
				:query_oprs="query_oprs"
				:dataTypes="dataTypes"
				:targetclass="itemValue.data.targetClass"
			>
				<div slot="attribute">
					<!-- 从外部引用的辅助标签,用于显示属性 -->
					<p>标题属性(Title)</p>
					<AttributeSelector
						:target-class="args.bindTargetClass"
						v-model="args.attributeForTitle"
					></AttributeSelector>
					<p>详情属性(Label)</p>
					<AttributeSelector
						:target-class="args.bindTargetClass"
						v-model="args.attributeForLabel"
					></AttributeSelector>
					<p>图标属性(Icon)</p>
					<AttributeSelector
						:target-class="args.bindTargetClass"
						v-model="args.attributeForIcon"
					></AttributeSelector>
					<Button type="primary" long @click="freshData">刷新数据</Button>
				</div>
			</EditBox>
		</span>
	</section>
	<section v-else :addinName="name"></section>
</template>
 
<script>
// 从本地引擎的一个自定义标签
import AttributeSelector from "./AttributeSelector";
import EditBox from "@/ext_components/form/_EditBox.vue";
import { mapGetters, mapActions } from "vuex";

export default {
	props: [
		"addin",
		"basicArgs",
		"argsProps",
		"activeUUID",
		"store",
		"itemValue",
		"attributes",
		"relation",
		"editExtendInfo",
		"widgetAnnotation",
		"checkResult",
		"query_oprs",
		"route",
		"router",
		"root",
		"Message",
		"echarts",
	],
	components: {
		EditBox,
		AttributeSelector,
	},
	// Vue数据绑定的时候要求返回的结果
	data() {
		return {
			// 插件的名字
			name: "SimpleCellGroup",
			// 表示是否已经进入画布区
			t_preview: true,
			// 是否显示控件的属性编辑区
			t_edit: false,
			// 属性配置项,按需设置
			addIcon: true,
			actEdit: true,
			actIndex: -1,
			setModal: false,
			// 控件支持设置类型
			dataTypes: ["String"],
			// 属性配置项,按需设置
			args: {
				// 在选项区显示的名称
				title: "简单列表",
				// 直接复用DWF默认的配置项,从而无需自行开发配置界面
				bindTargetClass: "",
				// 标签作为列表标题
				label: "",
				// 建模设置的过滤条件
				filterQuery: "",
				// 高度取值和单位
				height: "",
				heightType: "px",
				// 宽度取值和单位
				width: "",
				widthType: "px",
				// 背景色设置
				back_color: "",
				// 文字颜色设置
				txt_fontColor: "",
				/* ---------------------
				 * 下面是新增的自定义属性
				 * -------------------- */
				// 单元格显示标题
				attributeForTitle: "",
				// 单元格显示内容
				attributeForLabel: "",
				// 显示图标对应属性
				attributeForIcon: "",
				// 在配置区支持的事件列表,元素为事件中文名
				eventRange: ["单击"],
				// 已被用户设置的事件列表,元素格式为 { opr_type: '', opr_path: '', name: '事件中文名' }
				events: [],
			},
			cellData: {},
		};
	},
	created() {
		// 将表单引擎传递下来的store赋值给当前控件的store,以便handleQueryData可以用到这个全局属性
		this.$store = this.store;
	},
	mounted() {
		// 生命周期函数,实现数据加载
		this.freshData();
	},
	computed: {
		//...mapGetters("DWF_form", 		this.$store = this.store;
	},
	mounted(["Entities", "Relations"]),
		cardStyle() {
			// 外层卡片的样式
			const result = {};
			if (this.args.height) {
			// 生命周期函数,实现数据加载
		this.freshData();
		console.log(this.itemValue.data.targetClass	result["height"] =
					String(this.args.height) + (this.args.heightType || "px");
			},
	computed:			if (this.args.width) {
		//...mapGetters("DWF_form", ["Entities", "Relations"]),
		cardStyle() {
			// 外层卡片的样式
			const result = {};		result["width"] =
					String(this.args.width) + (this.args.widthType || "px");
			}
			if (this.args.heightback_color) {
				result["heightbackgroundColor"] = this.args.back_color;
			}
			Stringif (this.args.height) + (txt_fontColor) {
				result["color"] = this.args.heightType || "px")txt_fontColor;
			}
			return result;
			}},
		// 需要用到实体类属性列表时使用
			if (this.args.widthfilter_attributes() {
				result["width"] =
					String(this.args.width) + (this.args.widthType || "px");
			}
			if (this.args.back_colorreturn [];
		},
	},
	methods: {
		// use `handleQueryData` to fetch data.
		...mapActions("DWF_form", ["handleQueryData"]),
		// 默认不用变化,返回编辑框供建模工具绘制,当控件拖入画布区以后被点击的时候触发
		getEditBox() {
				result["backgroundColor"] =this.t_edit = true;
			return this.args$refs.back_coloredit;
			},
		// 当插件无法直接通过style设置高度时,使用setHeight方法设置高度
		if (this.args.txt_fontColorsetHeight() {
				result["color"] = if (!this.args.txt_fontColor;
			}
			return result$refs.main) return;
		},
		// 需要用到实体类属性列表时使用现有表单加载在画布区加载控件的时候,会将之前的配置传入
		filter_attributessetArgs(args) {
			return [for (var i in args) {
				this.args[i] = args[i];
			},
	},
	methods: {		return this;
		},
		// use `handleQueryData` to fetch data.
		...mapActions("DWF_form", ["handleQueryData"]),
表单保存的时候将控件的设置合并到表单自身的JSON中
		getArgs() {
			return this.args;
		},
		// 默认不用变化,返回编辑框供建模工具绘制,当控件拖入画布区以后被点击的时候触发返回控件绑定的目标属性,如果没有绑定返回undefined或者null
		getEditBoxgetFormName() {
			this.t_edit =
true;
			return this.$refsargs.editname;
		},
		// 当插件无法直接通过style设置高度时,使用setHeight方法设置高度freshData() {
		setHeight() {	const bindTargetClass = this.args.bindTargetClass;
			if (!this.$refs.main) bindTargetClass) {
				console.error("no bindTargetClass");
				return;
			},

			const regexForTargetClass = /^([0-9a-zA-Z_]+)&([er])$/;
现有表单加载在画布区加载控件的时候,会将之前的配置传入
			setArgs(args) {const result = regexForTargetClass.exec(bindTargetClass);
			forif (varresult i in args=== null) {
				this.args[i] = args[i];
console.error(
			}
			return this;
		},
		// 表单保存的时候将控件的设置合并到表单自身的JSON中
		getArgs() {
`handleRefresh: invalid targetClass value -> ${bindTargetClass}`
				);
				return this.args;
			},

			// 返回控件绑定的目标属性,如果没有绑定返回undefined或者null
		getFormName()let targetClass = result[1];
			let query = {
			return	query: this.args.name;
		},
		freshData() {filterQuery,
				pageSize: 4,
				startIndex: 0,
			};

			constlet bindTargetClassobjs = this.args.bindTargetClass;
			if (!bindTargetClass) handleQueryData({
				console.error("no bindTargetClass");targetClass: targetClass,
				return;
query: query,
				}fresh: true,
			const regexForTargetClass}).then((res) = /^([0-9a-zA-Z_]+)&([er])$/;
> {
				constlet resultobjs = regexForTargetClass.exec(bindTargetClass)res;
				if (result ==this.cellData = null) {
					console.error(title: this.args.label,
					`handleRefreshicon: invalid targetClass value -> ${bindTargetClass}`"ios-bookmarks-outline",
					list: res,
				)};
				return});
		},
	},
};
</script>
 			let
targetClass<style = result[1];
			let query =scoped>
/* 没有合适的数据的时候使用的样式 */
.no-result-prompt {
	display: flex;
	align-items: center;
		query: this.args.filterQuery,
				pageSize: 4,
				startIndex: 0,
			};

			let objs = this.handleQueryData({
				targetClass: targetClass,
				query: query,
				fresh: true,
			}).then((res) => {
				let objs = res;
				this.cellData = {
					title: this.args.label,
					icon: "ios-bookmarks-outline",
					list: res,
				};
			});
		},
	},
};
</script>justify-content: center;
	background-color: #eeeeee;
	color: #00000022;
	font-weight: bold;
	font-size: 2em;
}

/* hack to respond to height change.
     see https://vue-loader.vuejs.org/guide/scoped-css.html#deep-selectors
   */
.cell-group-wrapper >>> .ivu-card-body {
	position: relative;
	height: calc(100% - 60px);
}
.cell-group-wrapper >>> .ivu-cell-group {
	height: 100%;
	overflow-y: auto;
}
</style>

对应的配置文件如下:

代码块
languageyml
titleassemble-to.yaml
config:
  ignore:
  info:
    part-web:
      name: modeler
      cname: 建模端
      forms:
		...
        SimpleCellGroup.vue:
          icon: "md-apps"
          cname: 高级控件
          type: form/multi
      operations:
		...       mobileForms:
		...mobileForms:
      mobileOperations:
		...
      dependencies:
		...

{}


7.2 应用前端

代码块
languagejs
titlepart-web/modeler/forms/SimpleCellGroup.vue
collapsetrue
<template>
	<!--
    建模时的预览前端,即插件的实际显示样式
    :addinName="name"和ref="main"一般情况不可去除
    	-->
	<section :addinName="name" ref="main">
		<!-- 在画布区的显示内容 -->
		<span>
			<!-- see https://www.iviewui.com/components/cell#JCYF -->
			<Card :style="cardStyle" class="cell-group-wrapper">
				<p slot="title">
					<!-- change to slot syntax to avoid a bug, where :title may not respond to change as a prop. -->
					<Icon :type="cellData.icon"></Icon>
					{{ cellData.title }}
				</p>
				<CellGroup
					v-if="cellData.list && cellData.list.length"
					@on-click="onClick"
				>
					<Cell
						v-for="(obj, idx) in cellData.list"
						:key="obj.oid"
						:name="idx"
						:title="String(obj[args.attributeForTitle])"
						:label="String(obj[args.attributeForLabel])"
						@click="onClick"
					>
						<Avatar :src="String(obj[args.attributeForIcon])" slot="icon" />
					</Cell>
				</CellGroup>
				<div v-else class="no-result-prompt">无数据展示...</div>
			</Card>
		</span>
	</section>
</template>
 
<script>
// 引入内部图标备用
import "@/styles/component/iconfont.css";

import { mapActions } from "vuex";

export default {
	props: [
		"widgetAnnotation",
		"itemValue",
		"attributes",
		"route",
		"router",
		"root",
		"store",
		"query_oprs",
		"echarts",
	],
	// Vue数据绑定的时候要求返回的结果
	data() {
		return {
			// 插件的名字
			name: "simpleCellGroupSimpleCellGroup",
			// 表示是否已经进入画布区
			t_preview: false,
			// 是否显示控件的属性编辑区
			t_edit: false,
			// 属性配置项,按需设置
			args: {
				title: "简单列表",
				// 直接复用DWF默认的配置项,从而无需自行开发配置界面
				bindTargetClass: "",
				// 标签作为列表标题
				label: "",
				// 建模设置的过滤条件
				filterQuery: "",
				// 高度取值和单位
				height: "",
				heightType: "px",
				// 宽度取值和单位
				width: "",
				widthType: "px",
				// 背景色设置
				back_color: "",
				// 文字颜色设置
				txt_fontColor: "",

				/* ---------------------
				 * 下面是新增的自定义属性
				 * -------------------- */
				// 单元格显示标题
				attributeForTitle: "",
				// 单元格显示内容
				attributeForLabel: "",
				// 已被用户设置的事件列表,元素格式为 { opr_type: '', opr_path: '', name: '事件中文名' }
				events: [],
			},
			// 需要显示数据的集合,包括标题,图标,单元标题,单元内容,约定格式如下
			cellData: {},
			// 记录被点击选择的对象
			cellSelected: {},
		};
	},
	mounted() {
		// 生命周期函数,实现数据加载
		this.freshData();
	},
	computed: {
		cardStyle() {
			// 外层卡片的样式
			const result = {};
			if (this.args.height) {
				result["height"] =
					String(this.args.height) + (this.args.heightType || "px");
			}
			if (this.args.width) {
				result["width"] =
					String(this.args.width) + (this.args.widthType || "px");
			}
			if (this.args.back_color) {
				result["backgroundColor"] = this.args.back_color;
			}
			if (this.args.txt_fontColor) {
				result["color"] = this.args.txt_fontColor;
			}
			return result;
		},
	},
	methods: {
		// use `handleQueryData` to fetch data.
		...mapActions("DWF_form", ["handleQueryData"]),
		/*
		在建模的时候传入,提示控件是在画布区还是在控件列表中
		0:表示在画布区,已经被拖入
		1:表示在控件区,准备被拖入
		
        在建模的时候传入,提示控件是在画布区还是在控件列表中
        0:表示在画布区,已经被拖入
        1:表示在控件区,准备被拖入
        2: 表示在拖动中,还未放下
		
        */
		setDisplayType(type) {
			if (type == 0) this.t_preview = true;
			return this;
		},
		// 当插件无法直接通过style设置高度时,使用setHeight方法设置高度
		setHeight() {
			if (!this.$refs.main) return;
		},
		// 现有表单加载在画布区加载控件的时候,会将之前的配置传入
		setArgs(args) {
			for (var i in args) {
				this.args[i] = args[i];
			}
			return this;
		},
		// 表单保存的时候将控件的设置合并到表单自身的JSON中
		getArgs() {
			return this.args;
		},
		// 返回控件绑定的目标属性,如果没有绑定返回undefined或者null返回控件绑定的目标属性,如果没有绑定返回undefined或者null,默认保留this.args.name
		getFormName() {
			return nullthis.args.name;
		},
		getSelected() {
			return this.cellSelected;
		},
		getAll() {
			return this.cellData.list;
		},
		// 单击事件
		onClick(idx) {
			this.cellSelected = this.cellData.list[idx];
			this.triggerEvent("单击");
		},
		// 根据名字触发表单事件上配置的操作
		triggerEvent(eventName) {
			let eventConfig = null;
			// 提取事件对应的操作参数
			if (this.args.events && this.args.events.length > 0) {
				eventConfig = this.args.events.find((val) => {
					return val.name === eventName;
				});
			}
			// 触发实际操作
			if (eventConfig) {
				this.invokeOperation(
					eventConfig.opr_type,
					eventConfig.opr_path,
					this.itemValue,
					this.store
				);
			}
		},
		// 刷新控件内部数据
		freshData() {
			const bindTargetClass = this.args.bindTargetClass;

			if (!bindTargetClass) {
				console.error("no bindTargetClass");
				return;
			}

			const regexForTargetClass = /^([0-9a-zA-Z_]+)&([er])$/;
			const glob = regexForTargetClass.exec(bindTargetClass);
			if (glob === null) {
				console.error(
					`handleRefresh: invalid targetClass value -> ${bindTargetClass}`
				);
				return;
			}

			const targetClass = glob[1];
			const query = this.args.filterQuery;

			console.log(this.dwf_ctx);

			this.handleQueryData({
				targetClass: targetClass,
				query: query,
				fresh: true,
			}).then((res) => {
				const attributeForTitle = this.args.attributeForTitle;
				const attributeForLabel = this.args.attributeForLabel;
				let objs = res;
				this.cellData = {
					title: this.args.label,
					icon: "ios-bookmarks-outline",
					list: res,
				};
			});
		},
	},
};
</script>
 
<style scoped>
/* 没有合适的数据的时候使用的样式 */
.no-result-prompt {
	display: flex;
	align-items: center;
	justify-content: center;
	background-color: #eeeeee;
	color: #00000022;
	font-weight: bold;
	font-size: 2em;
}

/* hack to respond to height change.
     see https://vue-loader.vuejs.org/guide/scoped-css.html#deep-selectors
   */
.cell-group-wrapper >>> .ivu-card-body {
	position: relative;
	height: calc(100% - 60px);
}
.cell-group-wrapper >>> .ivu-cell-group {
	height: 100%;
	overflow-y: auto;
}
</style>

...