基于Extjs的web表单设计器 第四节——控件拖放

  接着上一节介绍控件拖放的设计。

  通过前面的介绍知道,我们的区域类型的容器控件有三种:Card、Table、Mixed。

  Card 可以支持几乎所有的常用控件,包括:文本TextField、多文本TextArea、数字NumberField、金额NumberField、日期DateField、下拉树NetDropDown、按钮Button、复选框CheckBox、单选框Radio;Table可以支持的常用控件比Card稍微少一点,它不支持button类型的控件以及多文本TextArea控件;Mixed不支持常用控件,它只支持我们的容器控件类型,就是它本身和Card和Table,它的作用就是一个嵌套作用,让我们可以生成复杂的表单模板。三个类型的容器控件支持的子控件各不相同,我们先定义一个公共的Object对象来存储一些容器相关的信息,方便我们后面处理控件拖放事件的时候做一些判断使用。

1  //公共配置信息
2     ftConfig = {
3         isDraging: false, //表示是否正在拖放控件
4         dragXY: { x: 0, y: 0 }, //拖动控件时候记录坐标
5         panelType: ‘Card Table Mixed‘,//表示我们容器控件类型的字符串
6         tableRejectType: ‘Button TextArea CheckBox Radio‘//表格区域不接受的控件类型字符串
7     };

然后就是我们具体的拖放处理代码逻辑。上一节我们介绍了使用一个Droptarget来为我们的画布控件添加了可以接收拖动、释放的功能,在Droptarget里面我们为它定义了两个事件1. notifyEnter事件,当我们的鼠标拖动控件到画布区域上面后就设置配置信息的isDraging=true;

2. notifyDrop事件,当我们在画布上释放拖动的控件后就会触发该事件,通过该事件我们获取到拖放的控件信息,并进行相关的拖放处理。

 1 ftConfig = {
 2         regNum: 1,//区域序号
 3         ctrolNum: 1,//控件序号
 4         isDraging: false, //表示是否正在拖放控件
 5         dragXY: { x: 0, y: 0 }, //拖动控件时候记录坐标
 6         panelType: ‘card table mixed‘,//表示我们容器控件类型的字符串
 7         tableRejectType: ‘button textarea checkbox radio‘//表格区域不接受的控件类型字符串
 8     };
 9     function notifyDrop(dd, e, data) {
10         var c, d = data.records[0].data, dropId,
11             type = d.type.toLocaleLowerCase();
12         ftConfig.isDraging = false;
13         switch (type) {
14             case ‘card‘:
15                 c = {
16                     id: ‘region‘ + ftConfig.regNum,
17                     title: ‘卡片区域‘ + ftConfig.regNum,
18                     type: type,
19                     cols: 4, //默认为卡片区域设置4列
20                     minHeight: 100,
21                     border: true,
22                     collapsible: true,
23                     bodyPadding: ‘5 20px 5 0‘,
24                     margin: ‘0px 0px 5px 0‘,
25                     layout: ‘column‘,
26                     closable: true,
27                     defaults: { labelAlign: ‘right‘, labelWidth: 100, margin: ‘3,0‘ }
28                 }; break;
29             case ‘table‘:
30                 c = {
31                     id: ‘region‘ + ftConfig.regNum,
32                     title: ‘表格区域‘ + ftConfig.regNum,
33                     type: type,
34                     xtype: ‘grid‘,
35                     height: 200,
36                     margin: ‘0px 0px 5px 0‘,
37                     collapsible: true,
38                     autoScroll: true,
39                     closable: true,
40                     columns: {}
41                 }; break;
42             case ‘mixed‘:
43                 c = {
44                     id: ‘region‘ + ftConfig.regNum,
45                     title: ‘混合区域‘ + ftConfig.regNum,
46                     type: type,
47                     border: true,
48                     collapsible: true,
49                     closable: true,
50                     minHeight: 100,
51                     bodyPadding: ‘10px‘,
52                     margin: ‘0px 0px 5px 0‘
53                 }; break;
54             default:
55                 c = {
56                     id: newID(‘ct‘),
57                     index: ftConfig.ctrolNum,
58                     type: type,
59                     xtype: type,
60                     fieldLabel: ‘控件‘
61                 }; break;
62         }
63         dropId = e.target.id.split(‘-‘)[0];
64         dropId = dropId === ‘gridview‘ ? e.target.parentNode.id.split(‘-‘)[0] : dropId;
65         return addRegionControl(dropId, c);
66     }

notifyDrop function

 1 //添加控件到区域
 2     function addRegionControl(pid, c) {
 3         var p = findRegion(pid);
 4         if (!p) return false;
 5         if (ftConfig.panelType.indexOf(c.type) >= 0 && p.type !== ‘mixed‘) {//如果是区域控件就只能放在mixed类型panel里面;
 6             p = p.findParentByType(‘panel‘);
 7             if (p) {
 8                 return addRegionControl(p.id, c);
 9             }
10             return false;
11         }
12         else if (ftConfig.panelType.indexOf(c.type) < 0) {
13             if (p.type === ‘mixed‘) {//如果是其他控件就不能放到mixed类型panel里面;
14                 return false;
15             }
16             else if (p.type === ‘table‘) {//如果是控件添加到表格区域的处理
17                 var index = p.columns.length + 1;
18                 p.addColumn({ text: ‘列‘ + index, width: 120, cls: "center", align: ‘left‘ });
19             }
20             else {//(p.type === ‘card‘) 如果是添加控件到卡片区域的处理
21                 c.columnWidth = 1 / p.cols;
22                 p.add(c);
23             }
24         }
25         else {
26             p.add(c);
27         }
28         ftConfig.ptype.indexOf(c.type) >= 0 ? ftConfig.regNum++ : ftConfig.ctrolNum++;
29         return true;
30     }
31     //根据Id查找区域的可用控件或者父级控件
32     function findRegion(id) {
33         if (!id || !(c = Ext.getCmp(id)))
34             return null;
35         if (c.type && ftConfig.panelType.indexOf(c.type) >= 0) {
36             return c;
37         }
38         else {
39             var p = c.findParentByType(‘panel‘);
40             if (p) {
41                 return findRegion(p.id);
42             }
43             return null;
44         }
45     }

add control process

通过上面的拖放处理逻辑我们已经可以初步的设计表单模板了,下面附上4张图片操作效果图:

图一

图二

图三

图四

大家可以看看拖放前后四张图的区别。

至此我们实现了设计器最重要的一步——拖拽控件,好吧这一节就先到这里。。。洗洗睡了。

时间: 2024-12-20 10:49:32

基于Extjs的web表单设计器 第四节——控件拖放的相关文章

基于Extjs的web表单设计器 第七节——取数公式设计之取数公式的使用

基于Extjs的web表单设计器 基于Extjs的web表单设计器 第一节 基于Extjs的web表单设计器 第二节——表单控件设计 基于Extjs的web表单设计器 第三节——控件拖放 基于Extjs的web表单设计器 第四节——控件拖放 基于Extjs的web表单设计器 第五节——数据库设计 基于Extjs的web表单设计器 第六节——界面框架设计 基于Extjs的web表单设计器 第七节——取数公式设计之取数公式定义 基于Extjs的web表单设计器 第七节——取数公式设计之取数公式的使用

基于Extjs的web表单设计器 第五节——数据库设计

这里列出表单设计器系列的内容,6.7.8节的内容应该在春节后才有时间出了.因为这周末就请假回老家了,准备我的结婚大事.在此提前祝大家春节快乐! 基于Extjs的web表单设计器 基于Extjs的web表单设计器 第一节 基于Extjs的web表单设计器 第二节——表单控件设计 基于Extjs的web表单设计器 第三节——控件拖放 基于Extjs的web表单设计器 第四节——控件拖放 基于Extjs的web表单设计器 第五节——数据库设计 基于Extjs的web表单设计器 第六节——界面框架设计

基于Extjs的web表单设计器 第六节——界面框架设计

基于Extjs的web表单设计器 基于Extjs的web表单设计器 第一节 基于Extjs的web表单设计器 第二节——表单控件设计 基于Extjs的web表单设计器 第三节——控件拖放 基于Extjs的web表单设计器 第四节——控件拖放 基于Extjs的web表单设计器 第五节——数据库设计 基于Extjs的web表单设计器 第六节——界面框架设计 基于Extjs的web表单设计器 第七节——取数公式设计 基于Extjs的web表单设计器 第八节——表单引擎设计 这一节我给大家介绍一下表单设

基于Extjs的web表单设计器 第三节——控件拖放

看过之前设计器截图的朋友应该有印象,可能会发觉我们的设计器UI设计布局其实类似Visual studio 的设计界面,采用的是左.中.右三个区域布局.左侧为控件区域.中间为表单的画布设区域.右侧为属性区域.这样的UI设计肯定就得支持控件的拖拽设计,用户只要拖放一个控件到我们的画布上,那么画布就应该立即能够看到我们拖放的控件在画布中的位置.大小.以及一些控件自带的默认信息.不用说这样的设计对于用户来说不论在操作体验上还是设计的感官上都更加直接和方便,因为我在设计阶段就可以知道我设计后的表单在系统运

基于Extjs的web表单设计器 第二节——表单控件设计

这一节介绍表单设计器的常用控件的设计. 在前面两章节的附图中我已经给出了表单控件的两大分类:区域控件.常用控件.这里对每个分类以及分类所包含的控件的作用进行一一的介绍,因为它们很重要,是表单设计器的基本元素,更是核心组成部门. 一.区域控件,它主要包含三个类型的控件:卡片区域.表格区域.混合区域.这三个控件是我们的其他控件的容器或者叫包装器,相当于VS里面的各种Panel.它们很重要,每种区域控件的作用都不一样,能够包含的控件类型也不大一样,它们三个区域相互配合使用,可以为我们的表单提供强大的支

基于Extjs的web表单设计器

由于这样工作和自身的一些原因很长一段时间没有写过博客了.最近想把自己前面一段时间搞出的一个表单设计器的相关经验或者经历记录下来.分享给大家,也算是对自己前2个月的一个总结回顾吧. 首先介绍一下开发此版本的表单设计器的原因及背景.该项目是公司为中国某大型国有企业开发网上经费报销系统,主要是处理改集团及其二级单位,三级单位等子分公司的各种日常经费报销,预算控制及其他常用业务审批(比如:备用金借支.出差申请及差旅费报销.合同管理.资产调拨等).系统主要由两个最重要的部分组成一个WF流程设计及流程引擎—

基于Extjs的web表单设计器 第一节

前面一节介绍了表单设计器的背景和最终的大概样式,本节主要介绍表单设计器的需求及功能设计. 在讲需求之前先明确几个常用的概念: 主表或者卡片表——具有多行多列的一个区域的控件块,如下图所示. 明细表——就是常用的表格类型的控件块,表头信息就确立了该列的数据类型,如下图所示. 卡片式的表:指的是一个表单模板只包括一个主表: 主子表:指的是一个表单模板包含一个主表.一个明细表: 多子表:指的是一个表单模板包含一个主表.多个明细表: 嵌套多子表:指的是一个表单模板嵌套了多个主子表或者多个多子表: 表单设

基于vue开发的一款强大的表单设计器,支持element和antd-vue表单快速开发。

基于 vue 和 element-ui 实现的表单设计器,使用了最新的前端技术栈,内置了 i18n 国际化解决方案,支持生成element 和 antd-vue 表单,让表单开发简单而高效. 在线预览 使用文档 特性 可视化配置页面 提供栅格布局,并采用flex实现对齐 一键预览配置的效果 一键生成配置json数据 一键生成代码,立即可运行 提供自定义组件满足用户自定义需求 提供远端数据接口,方便用户需要异步获取数据加载 提供功能强大的高级组件 支持表单验证 快速获取表单数据 国际化支持 组件

.net web 开发平台- 表单设计器 一(web版)

如今为了适应需求的不断变化,动态表单设计器应运而生.它主要是为了满足界面的不断变化和提高开发速度.比如:一些页面客户可能也无法确定页面的终于布局,控件的位置,在哪种情况下显示或不显示等可能须要随时改动.为了应对这些需求而不去多次改动源码进行公布,就能够在项目中使用动态表单设计器.如今分享一下我做的动态表单设计器的设计思路,共同学习. 想做一个表单设计器,首先要确定是做c/s的还是b/s.我考虑到以后的发展方向是c/s向b/s转化,所以就选择了b/s的方向,并且做b/s比做c/s要简单非常多.在做