到目前流程设计器流程结点的拖拽操作已基本完成,接下来就到结点的属性开发了。前面已经开发过流程模板的属性了,结点属性跟模板属性类似,从属性模板定义copy一份,然后按各结点类型进行调整就ok。
1、先来回顾下流程模板属性,这里对流程模板属性稍微进行了调整,效果图如下:
1 //定义流程模板属性 2 TemplateProperty = function () { 3 if (typeof TemplateProperty.defaults == "undefined") { 4 /*第一次定义对象时为TemplateProperty类定义静态属性*/ 5 TemplateProperty.defaults = { 6 data: { 7 RecNo: 0, 8 OrgNo: 0, 9 TemplateCode: "", 10 TemplateName: "", 11 InstanceName: "", 12 DesignWidth: 1000, 13 DesignHeight: 800, 14 Version: 0, 15 VerStatus: "设计", 16 DesignerName: "", 17 DesignTime: "", 18 PublisherName: "", 19 PublishTime: "", 20 TemplateMemo: "" 21 } 22 }; 23 /*第一次定义对象时定义实例共有方法*/ 24 var p = TemplateProperty.prototype; 25 p.createTable = function () { 26 this.$table = $("
1、开始节点属性
1 //定义开始节点属性 2 StartProperty = function () { 3 if (typeof StartProperty.defaults == "undefined") { 4 /*第一次定义对象时为StartProperty类定义静态属性*/ 5 StartProperty.defaults = { 6 data: { 7 id: "", 8 title: "" 9 } 10 }; 11 /*第一次定义对象时定义实例共有方法*/ 12 var p = StartProperty.prototype; 13 p.createTable = function () { 14 this.$table = $("
2、结束节点属性(跟开始结点比较类似,直接copy开始结点的)
1 //定义结束节点属性 2 EndProperty = function () { 3 if (typeof EndProperty.defaults == "undefined") { 4 /*第一次定义对象时为EndProperty类定义静态属性*/ 5 EndProperty.defaults = { 6 data: { 7 id: "", 8 title: "" 9 } 10 }; 11 /*第一次定义对象时定义实例共有方法*/ 12 var p = EndProperty.prototype; 13 p.createTable = function () { 14 this.$table = $("
3、活动节点属性
1 //定义活动节点属性 2 ActivityProperty = function () { 3 if (typeof ActivityProperty.defaults == "undefined") { 4 /*第一次定义对象时为ActivityProperty类定义静态属性*/ 5 ActivityProperty.defaults = { 6 data: { 7 RecNo: 0, 8 TempNo: 0, 9 ElementNo: 0, 10 ActivityCode: "Activity1", 11 ActivityName: "活动1", 12 ActivityType: 1,/*1:串签;2:并签*/ 13 ParallelRule: 1,/*1:一票否决;2:一票通过;3:少数服从多数*/ 14 NoApprover: false, //无参与者(不做处理/审批通过) 15 IsWriter: false, //是发起人(不做处理/审批通过) 16 IsPrior: false, //前一活动参与(不做处理/审批通过) 17 IsApproved: false, //参与过流程(不做处理/审批通过) 18 CanChange: false, //转处理人 19 CanHandling: false, //正在处理中 20 CanStop: false, //终止流程 21 CanCollect: false, //征询意见 22 CanHandRound: false, //传阅 23 CanReturnStart: false, //驳回开始 24 CanReturnPrior: false, //驳回上一步 25 CanReturnAny: false, //驳回任一步 26 AllowMail: true, //邮件通知 27 AllowMessage: true, //消息通知 28 Approvers: [] //参与者(多个) 29 } 30 }; 31 /*第一次定义对象时定义实例共有方法*/ 32 var p = ActivityProperty.prototype; 33 p.createTable = function () { 34 this.$table = $(""); 35 this.$tbody = $(""); 36 this.$table.append(this.$tbody); 37 this.$propertyDiv.append(this.$table); 38 //行0 - 基本属性(分组) 39 this.$trActivityBasic = $(GoFlow.formatString( 40 "
{0} - {1}
", item.ApproveOrder, item.ApproverText));
182 });
183 break;
184 case "NoApprover":
185 this.$tbody.find("tr:eq(7) > td:eq(2)").find("input[value='" + value + "']").prop("checked", true);
186 break;
187 case "IsWriter":
188 this.$tbody.find("tr:eq(8) > td:eq(2)").find("input[value='" + value + "']").prop("checked", true);
189 break;
190 case "IsPrior":
191 this.$tbody.find("tr:eq(9) > td:eq(2)").find("input[value='" + value + "']").prop("checked", true);
192 break;
193 case "IsApproved":
194 this.$tbody.find("tr:eq(10) > td:eq(2)").find("input[value='" + value + "']").prop("checked", true);
195 break;
196 case "CanChange":
197 this.$tbody.find("tr:eq(12) > td:eq(2)").find("input[id='CanChange']").prop("checked", value);
198 break;
199 case "CanHandling":
200 this.$tbody.find("tr:eq(12) > td:eq(2)").find("input[id='CanHandling']").prop("checked", value);
201 break;
202 case "CanStop":
203 this.$tbody.find("tr:eq(12) > td:eq(2)").find("input[id='CanStop']").prop("checked", value);
204 break;
205 case "CanCollect":
206 this.$tbody.find("tr:eq(13) > td:eq(2)").find("input[id='CanCollect']").prop("checked", value);
207 break;
208 case "CanHandRound":
209 this.$tbody.find("tr:eq(13) > td:eq(2)").find("input[id='CanHandRound']").prop("checked", value);
210 break;
211 case "CanReturnStart":
212 this.$tbody.find("tr:eq(14) > td:eq(2)").find("input[id='CanReturnStart']").prop("checked", value);
213 break;
214 case "CanReturnPrior":
215 this.$tbody.find("tr:eq(14) > td:eq(2)").find("input[id='CanReturnPrior']").prop("checked", value);
216 break;
217 case "CanReturnAny":
218 this.$tbody.find("tr:eq(14) > td:eq(2)").find("input[id='CanReturnAny']").prop("checked", value);
219 break;
220 case "AllowMail":
221 this.$tbody.find("tr:eq(16) > td:eq(2)").find("input[id='AllowMail']").prop("checked", value);
222 break;
223 case "AllowMessage":
224 this.$tbody.find("tr:eq(16) > td:eq(2)").find("input[id='AllowMessage']").prop("checked", value);
225 break;
226 default:
227 break;
228 };
229 };
230 //设置并签规则是否只读
231 p.setParallelRuleReadonly = function (bool) {
232 if (bool) {
233 this.$tbody.find("tr:eq(4) > td:eq(2)").attr("readonly", "true")
234 this.$tbody.find("tr:eq(4) > td:eq(2)").find("input").attr("disabled", "disabled");
235 }
236 else {
237 this.$tbody.find("tr:eq(4) > td:eq(2)").removeAttr("readonly");
238 this.$tbody.find("tr:eq(4) > td:eq(2)").find("input").removeAttr("disabled");
239 }
240 };
241 //显示/隐藏
242 p.setVisible = function (bool, data) {
243 this.$table.css("display", bool ? "block" : "none");
244 if (bool && data) {
245 this.bindData(data);
246 }
247 };
248 }
249 };
250 //初始化ActivityProperty对象
251 ActivityProperty.prototype.init = function (gf, pdiv, opts) {
252 this.$gf = gf;
253 this.$propertyDiv = pdiv;
254 this.$opts = opts;
255 this.createTable();
256 };
4、连线属性
1 //定义连线节点属性 2 LineProperty = function () { 3 if (typeof LineProperty.defaults == "undefined") { 4 /*第一次定义对象时为LineProperty类定义静态属性*/ 5 LineProperty.defaults = { 6 data: { 7 RecNo: 0, 8 TempNo: 0, 9 ElementNo: 0, 10 LineCode: "Line_1", 11 LineTitle: "", 12 LineType: 'I',/*连线类型(I/Z/N)*/ 13 FromElementCode: "", 14 FromElementName: '', 15 ToElementCode: "", 16 ToElementName: '' 17 } 18 }; 19 /*第一次定义对象时定义实例共有方法*/ 20 var p = LineProperty.prototype; 21 p.createTable = function () { 22 this.$table = $(""); 23 this.$tbody = $(""); 24 this.$table.append(this.$tbody); 25 this.$propertyDiv.append(this.$table); 26 //行0 - 基本属性(分组) 27 this.$trLineBasic = $(GoFlow.formatString( 28 "
5、条件结点属性
1 //定义条件节点属性 2 ConditionProperty = function () { 3 if (typeof ConditionProperty.defaults == "undefined") { 4 /*第一次定义对象时为ConditionProperty类定义静态属性*/ 5 ConditionProperty.defaults = { 6 data: { 7 RecNo: 0, 8 TempNo: 0, 9 ElementNo: 0, 10 ConditionCode: "Condition_1", 11 ConditionTitle: "", 12 ElementCodeForTrue: "", 13 ElementNameForTrue: "", 14 ElementCodeForFalse: "", 15 ElementNameForFalse: "", 16 Expressions: [] //条件表达式(多个) 17 } 18 }; 19 /*第一次定义对象时定义实例共有方法*/ 20 var p = ConditionProperty.prototype; 21 p.createTable = function () { 22 this.$table = $(""); 23 this.$tbody = $(""); 24 this.$table.append(this.$tbody); 25 this.$propertyDiv.append(this.$table); 26 //行0 - 基本属性(分组) 27 this.$trConditionBasic = $(GoFlow.formatString( 28 "
{0} {1} {2} {3}
",
112 item.LeftValue, item.LogicalOper, item.RightValue, item.RelationOper));
113 });
114 break;
115 case "ElementNameForTrue":
116 this.$tbody.find("tr:eq(5) > td:eq(2)").children("input:first").val(value);
117 break;
118 case "ElementNameForFalse":
119 this.$tbody.find("tr:eq(6) > td:eq(2)").children("input:first").val(value);
120 break;
121 default:
122 break;
123 };
124 };
125 //显示/隐藏
126 p.setVisible = function (bool, data) {
127 this.$table.css("display", bool ? "block" : "none");
128 if (bool && data) {
129 this.bindData(data);
130 }
131 };
132 }
133 };
134 //初始化ConditionProperty对象
135 ConditionProperty.prototype.init = function (gf, pdiv, opts) {
136 this.$gf = gf;
137 this.$propertyDiv = pdiv;
138 this.$opts = opts;
139 this.createTable();
140 };
6、切换属性方法
//切换属性显示 p.switchPropery = function (id, type) { type = type ? type : "template"; this.setPropertyTitle(id, type); this.$templateProp.setVisible(type == "template"); //显示流程模板属性 this.$startProp.setVisible(type == "start", type == "start" ? this.$nodeData[id] : null); //显示开始节点属性 this.$endProp.setVisible(type == "end", type == "end" ? this.$nodeData[id] : null); //显示结束节点属性 this.$lineProp.setVisible(type == "line", type == "line" ? this.$lineData[id].lineProperty : null); //显示连线属性 this.$activityProp.setVisible(type == "activity", type == "activity" ? this.$nodeData[id].activityProperty : null); //显示活动节点属性 this.$conditionProp.setVisible(type == "condition", type == "condition" ? this.$nodeData[id].conditionProperty : null); //显示条件节点属性 };
7、切换属性标题显示方法
//设置属性标题 p.setPropertyTitle = function (id, type) { var text = type == "template" && "流程模板属性:" + this.$templateData.TemplateName || type == "start" && "开始节点属性:" + this.$nodeData[id].title || type == "end" && "结束节点属性:" + this.$nodeData[id].title || type == "line" && "连线属性:" + id || type == "activity" && "活动节点属性:" + this.$nodeData[id].title || type == "condition" && "条件节点属性:" + this.$nodeData[id].title || ""; this.$propertyHeadDiv.children(".gf_p_head_inner").html(text); }
8、goflow插件最新代码结构如下
(function ($, undefined) { //定义流程模板属性 TemplateProperty = function () { }; //初始化TemplateProperty对象 TemplateProperty.prototype.init = function (gf, pdiv, opts) { }; //定义开始节点属性 StartProperty = function () { }; //初始化StartProperty对象 StartProperty.prototype.init = function (pdiv, opts) { }; //定义结束节点属性 EndProperty = function () { }; //初始化EndProperty对象 EndProperty.prototype.init = function (pdiv, opts) { }; //定义活动节点属性 ActivityProperty = function () { }; //初始化ActivityProperty对象 ActivityProperty.prototype.init = function (gf, pdiv, opts) { }; //定义连线节点属性 LineProperty = function () { }; //初始化LineProperty对象 LineProperty.prototype.init = function (gf, pdiv, opts) { }; //定义条件节点属性 ConditionProperty = function () { }; //初始化ConditionProperty对象 ConditionProperty.prototype.init = function (gf, pdiv, opts) { }; //定义GoFlow类 GoFlow = function () { }; //初始化GoFlow对象(gfDiv:jQuery对象;opts:参数) GoFlow.prototype.init = function (gfDiv, opts) { }; //插件的定义 $.fn.goflow = function (opts) { }; })(jQuery); //闭包结束
代码:GoFlow_06.zip
演示地址:Demo
微信演示公众号:
另:Silverlight版
Silverlight版Demo