Browse Source

Merge remote-tracking branch 'origin/dev' into dev

sunyj 8 năm trước cách đây
mục cha
commit
43676861b9
20 tập tin đã thay đổi với 779 bổ sung121 xóa
  1. 1 0
      kanban-console/src/main/webapp/WEB-INF/views/board.html
  2. 23 7
      kanban-console/src/main/webapp/resources/app/controller/board.js
  3. 10 0
      kanban-console/src/main/webapp/resources/app/store/boardicon.js
  4. 2 5
      kanban-console/src/main/webapp/resources/app/view/boardmodel/detailpropertiesgrid.js
  5. 1 1
      kanban-console/src/main/webapp/resources/app/view/component/barcomponent.js
  6. 26 35
      kanban-console/src/main/webapp/resources/app/view/component/formcomponent.js
  7. 41 42
      kanban-console/src/main/webapp/resources/app/view/component/gridcomponent.js
  8. 1 1
      kanban-console/src/main/webapp/resources/app/view/component/linecomponent.js
  9. 1 1
      kanban-console/src/main/webapp/resources/app/view/component/piecomponent.js
  10. 159 0
      kanban-console/src/main/webapp/resources/app/view/core/trigger/FormRenderTrigger.js
  11. 170 0
      kanban-console/src/main/webapp/resources/app/view/core/trigger/GridRenderTrigger.js
  12. 220 0
      kanban-console/src/main/webapp/resources/app/view/core/trigger/StyleTrigger.js
  13. 78 0
      kanban-console/src/main/webapp/resources/app/view/core/trigger/TextTrigger.js
  14. 3 10
      kanban-console/src/main/webapp/resources/app/view/desktop/BoardManageMainPanel.js
  15. 7 1
      kanban-console/src/main/webapp/resources/app/view/desktop/BoardManageRightPanel.js
  16. 9 18
      kanban-console/src/main/webapp/resources/app/view/user/UserInfo.js
  17. 27 0
      kanban-console/src/main/webapp/resources/css/boardmodel.css
  18. BIN
      kanban-console/src/main/webapp/resources/images/icons/render.png
  19. BIN
      kanban-console/src/main/webapp/resources/images/icons/style.png
  20. BIN
      kanban-console/src/main/webapp/resources/images/icons/text.png

+ 1 - 0
kanban-console/src/main/webapp/WEB-INF/views/board.html

@@ -8,6 +8,7 @@
 <script src="static/lib/ext/4.2/ext-all.js" type="text/javascript"></script>
 <script type="text/javascript" src="static/lib/i18n/i18n.js"></script>
 <script type="text/javascript" src="static/js/util/utils.js"></script>
+<link rel="stylesheet" type="text/css" href="static/css/boardmodel.css" />
 
 <script type="text/javascript">
 Ext.Loader.setConfig({

+ 23 - 7
kanban-console/src/main/webapp/resources/app/controller/board.js

@@ -4,7 +4,8 @@ Ext.define('erp.controller.board', {
     views:['boardmodel.viewport','boardmodel.modeltree','boardmodel.modeleditpanel',
     'boardmodel.editcomponent','boardmodel.modelbuilderpanel','boardmodel.elementconfigpanel',
     'boardmodel.elementdetailgrid','boardmodel.detailpropertiesgrid','component.commonpanel','component.formcomponent',
-    'component.gridcomponent','component.barcomponent','component.linecomponent','component.piecomponent'
+	'component.gridcomponent','component.barcomponent','component.linecomponent','component.piecomponent',
+	'core.trigger.TextTrigger', 'core.trigger.StyleTrigger', 'core.trigger.GridRenderTrigger', 'core.trigger.FormRenderTrigger'
     ],
     stores:['component'],
     init:function(){
@@ -158,11 +159,25 @@ Ext.define('erp.controller.board', {
 					var builderPanel = Ext.getCmp('modelbuilderpanel');
     				var currenSelectPanel = builderPanel.currenSelectPanel;
     				currenSelectPanel.fireEvent('fieldpropchange',currenSelectPanel,detailSelect,rowIdx);
-    			}
-    		},
-    		'modeltree': {
-				select: function() {
-				}
+				},
+				celldblclick: function (gridview, colEl, colIndex, record, rowEl, rowIndex, e, eOpts) {
+					var grid = gridview.up('grid');
+					var column = grid.columnManager.columns[1];
+					var builderPanel = Ext.getCmp('modelbuilderpanel');
+					var currenSelectPanel = builderPanel.currenSelectPanel; 
+					var propconfig = currenSelectPanel.config.propGridDefault.propconfig;
+
+					for(var i = 0; i < propconfig.length; i++) {
+						if(propconfig[i].property == record.get('property')) {
+							record.set('editor', propconfig[i].editor)
+						}
+					}
+					var startTime ={
+						xtype: record.get('editor') || 'textfield'
+					};
+					column.setEditor(startTime);
+					gridview.up('grid').getPlugin().startEditByPosition({row: rowIndex, column: 1});
+                }
     		}
     	});
   	 },
@@ -320,7 +335,8 @@ Ext.define('erp.controller.board', {
     		}
     		
     		var baseConfigFormValue = {
-				title: ch.getAttribute('title'),
+				titletext: ch.getAttribute('titletext'),
+				titlestyle: ch.getAttribute('titlestyle'),
 				/*allcls: ch.getAttribute('allcls'),*/
 				headerrowsstyle: ch.getAttribute('headerrowsstyle'),
 				rowsstyle: ch.getAttribute('rowsstyle'),

+ 10 - 0
kanban-console/src/main/webapp/resources/app/store/boardicon.js

@@ -0,0 +1,10 @@
+Ext.define('erp.store.boardicon', {
+    extend: 'Ext.data.Store',
+    fields: ['iconCls'],
+    data: [
+        { iconCls: 'grid-shortcut'},
+        { iconCls: 'accordion-shortcut'},
+        { iconCls: 'cpu-shortcut'},
+        { iconCls: 'notepad-shortcut'}
+    ]
+});

+ 2 - 5
kanban-console/src/main/webapp/resources/app/view/boardmodel/detailpropertiesgrid.js

@@ -9,7 +9,7 @@ Ext.define('erp.view.boardmodel.detailpropertiesgrid',{
         })
     ],
 	store:Ext.create('Ext.data.Store',{
-		fields:['property','display','propvalue']
+		fields:['property','display','propvalue','editor']
 	}),
 	columns:[{
 		hidden:true,
@@ -22,10 +22,7 @@ Ext.define('erp.view.boardmodel.detailpropertiesgrid',{
 	},{
 		header:'值',
 		flex:0.6,
-		dataIndex:'propvalue',
-		editor:{
-			xtype:'textfield'
-		}
+		dataIndex:'propvalue'
 	}],
 	plugins: [
         Ext.create('Ext.grid.plugin.CellEditing', {

+ 1 - 1
kanban-console/src/main/webapp/resources/app/view/component/barcomponent.js

@@ -418,6 +418,6 @@ Ext.define('erp.view.component.barcomponent',{
 	},
 	repaint: function() {
 //		this.setPosition(this.toLeft,this.toTop);
-		this.setTitle(this.baseConfigFormValue.maintitle);
+		// this.setTitle(this.baseConfigFormValue.maintitle);
 	}
 });

+ 26 - 35
kanban-console/src/main/webapp/resources/app/view/component/formcomponent.js

@@ -22,19 +22,13 @@ Ext.define('erp.view.component.formcomponent', {
 		Ext.apply(me, {
 			config: {
 				baseConfigForm: [{
-					xtype: 'textfield',
-					fieldLabel: '标题',
-					name: 'title',
-					listeners: {
-						blur: function (field, e, eOpts) {
-							//修改title
-							var v = field.getValue();
-							if (v) {
-								this.changeTitle(v);
-							}
-						},
-						scope: this
-					}
+					xtype:'texttrigger',
+					fieldLabel: '标题内容',
+					name: 'titletext'
+				}, {
+					xtype:'styletrigger',
+					name:'titlestyle',
+					fieldLabel: '标题样式'
 				}, {
 					xtype: 'numberfield',
 					fieldLabel: '列数',
@@ -42,25 +36,17 @@ Ext.define('erp.view.component.formcomponent', {
 					minValue: 1,
 					value: 2
 				}, {
-					xtype: 'textfield',
-					fieldLabel: 'field-style',
-					name: 'fieldstyle'
+					xtype:'styletrigger',
+					name:'fieldstyle',
+					fieldLabel: 'field-style'
 				}, {
-					xtype: 'textfield',
-					fieldLabel: 'value-style',
-					name: 'valuestyle'
+					xtype:'styletrigger',
+					name:'valuestyle',
+					fieldLabel: 'value-style'
 				}, {
-					xtype: 'textarea',
+					xtype: 'texttrigger',
 					fieldLabel: '数据源',
-					grow: true,
-					name: 'sql',
-					listeners: {
-						afterrender: function (cmp) {
-							cmp.getEl().set({
-								'spellcheck': 'false'
-							});
-						}
-					}
+					name: 'sql'
 				}, this.mixins['erp.view.component.commonpanel'].basicLayoutForm],
 				itemDefault: {
 					xtype: 'displayfield',
@@ -73,23 +59,28 @@ Ext.define('erp.view.component.formcomponent', {
 					propconfig: [{
 						display: '变量名',
 						property: 'value',
-						propvalue: ''
+						propvalue: '',
+
 					}, {
 						display: '宽度(%)',
 						property: 'width',
-						propvalue: ''
+						propvalue: '',
+						editor: 'numberfield'
 					}, {
 						display: 'field-style',
 						property: 'fieldstyle',
-						propvalue: ''
+						propvalue: '',
+						editor: 'styletrigger'
 					}, {
 						display: 'value-style',
 						property: 'valuestyle',
-						propvalue: ''
+						propvalue: '',
+						editor: 'styletrigger'
 					}, {
 						display: '显示',
 						property: 'rendername',
-						propvalue: ''
+						propvalue: '',
+						editor: 'formrendertrigger'
 					}]
 				}
 			}
@@ -192,7 +183,7 @@ Ext.define('erp.view.component.formcomponent', {
 	},
 	repaint: function () {
 		var me = this;
-		me.setTitle(me.baseConfigFormValue.title);
+		// me.setTitle(me.baseConfigFormValue.title);
 
 		me.detailData.map(function (v, i) {
 			var item = Object.assign({}, me.config.itemDefault);

+ 41 - 42
kanban-console/src/main/webapp/resources/app/view/component/gridcomponent.js

@@ -1,3 +1,19 @@
+Ext.apply(Ext.form.VTypes, {
+    gridTitle: function (value, field) {
+		var func;
+		try {
+			func = (new Function("return " + value))();
+		}catch(e) {
+			return false;
+		}
+		if(func instanceof Function) {
+			return true;
+		}else {
+			return false;
+		}
+    },
+	gridTitleText: '必须定义为具有返回值 { text, style } 的Function字符串!',
+});
 Ext.define('erp.view.component.gridcomponent',{
 	extend:'Ext.grid.Panel',
 	alias:'widget.gridcomponent',
@@ -14,33 +30,23 @@ Ext.define('erp.view.component.gridcomponent',{
 		Ext.apply(me,{
 			config:{
 				baseConfigForm:[{
-					xtype:'textfield',
-					fieldLabel:'标题',
-					name:'title',
-					listeners:{
-						blur:function( field, e, eOpts ){
-							//修改title
-							var v=field.getValue();
-							if(v){
-								this.changeTitle(v);
-							}
-						},
-						scope:this				        
-					}
-				},/*{
-					xtype: 'textfield',
-					fieldLabel: '样式名',
-					name: 'allcls'
-				},*/{
-					xtype: 'textfield',
+					xtype:'texttrigger',
+					fieldLabel: '标题内容',
+					name: 'titletext'
+				}, {
+					xtype:'styletrigger',
+					name:'titlestyle',
+					fieldLabel: '标题样式'
+				}, {
+					xtype: 'styletrigger',
 					fieldLabel: '表头样式',
 					name: 'headerrowsstyle'
 				},{
-					xtype: 'textfield',
+					xtype: 'styletrigger',
 					fieldLabel: '行样式',
 					name: 'rowsstyle'
 				},{
-					xtype: 'textfield',
+					xtype: 'gridrendertrigger',
 					fieldLabel: '显示',
 					name: 'allrender'
 				},{
@@ -55,17 +61,9 @@ Ext.define('erp.view.component.gridcomponent',{
 					name: 'pagesize',
 					minValue: 0
 				},{
-					xtype:'textarea', 
+					xtype:'texttrigger', 
 					fieldLabel:'数据源',
-					name:'sql',
-					grow:true,
-					listeners:{
-						afterrender:function(cmp){
-	        				cmp.getEl().set({
-				                'spellcheck': 'false'
-				            });
-	        			}						
-					}
+					name:'sql'
 				},this.mixins['erp.view.component.commonpanel'].basicLayoutForm],
 				itemDefault:{
 					header: '列',
@@ -79,23 +77,28 @@ Ext.define('erp.view.component.gridcomponent',{
 					propconfig:[{
 						display:'宽度',
 						property:'width',
-						propvalue:100
+						propvalue:100,
+						editor: 'numberfield'
 					},{
 						display: '排序',
 						property: 'sort',
-						propvalue: 0
+						propvalue: 0,
+						editor: 'numberfield'
 					},{
 						display: '列头样式',
 						property: 'headerrowstyle',
-						propvalue:''
+						propvalue:'',
+						editor: 'styletrigger'
 					},{
 						display: '列样式',
 						property: 'rowstyle',
-						propvalue:''
+						propvalue:'',
+						editor: 'styletrigger'
 					},{
 						display: '显示',
 						property: 'rendername',
-						propvalue:''
+						propvalue:'',
+						editor: 'gridrendertrigger'
 					},{
 						display: '数据绑定',
 						property: 'dataindex',
@@ -104,11 +107,7 @@ Ext.define('erp.view.component.gridcomponent',{
 						display: '值(仅作展示)',
 						property: 'data',
 						propvalue: (Math.random()*100 | 0) + ',' + (Math.random()*100 | 0) + ',' + (Math.random()*100 | 0)
-					}/*,{
-						display:'变量名',
-						property:'value',
-						propvalue:''
-					}*/]			
+					}]			
 				}
 			}
 		});
@@ -284,7 +283,7 @@ Ext.define('erp.view.component.gridcomponent',{
 	},
 	repaint: function() {
 //		this.setPosition(this.toLeft,this.toTop);
-		this.setTitle(this.baseConfigFormValue.title);
+		// this.setTitle(this.baseConfigFormValue.title);
 		var prop = this.config.propGridDefault;
 		var item = Object.assign({},prop);
 		var arr2 = item.propconfig.map(function(v,i){return v.property;});

+ 1 - 1
kanban-console/src/main/webapp/resources/app/view/component/linecomponent.js

@@ -396,6 +396,6 @@ Ext.define('erp.view.component.linecomponent',{
 	},
 	repaint: function() {
 //		this.setPosition(this.toLeft,this.toTop);
-		this.setTitle(this.baseConfigFormValue.title);
+		// this.setTitle(this.baseConfigFormValue.title);
 	}
 });

+ 1 - 1
kanban-console/src/main/webapp/resources/app/view/component/piecomponent.js

@@ -219,6 +219,6 @@ Ext.define('erp.view.component.piecomponent',{
 	},
 	repaint: function() {
 //		this.setPosition(this.toLeft,this.toTop);
-		this.setTitle(this.baseConfigFormValue.maintitle);
+		// this.setTitle(this.baseConfigFormValue.maintitle);
 	}
 });

+ 159 - 0
kanban-console/src/main/webapp/resources/app/view/core/trigger/FormRenderTrigger.js

@@ -0,0 +1,159 @@
+Ext.define('erp.view.core.trigger.FormRenderTrigger', {
+    extend: 'Ext.form.field.Trigger',
+    alias: 'widget.formrendertrigger',
+    triggerCls: 'render-trigger-icon-form',
+    onTriggerClick: function() {
+        var trigger = this;
+        var symbolStore = Ext.create('Ext.data.Store', {
+            fields: ['value', 'name'],
+            data: [
+                { "value": "if", "name": "if" },
+                { "value": "else if", "name": "else-if" },
+                { "value": "else", "name": "else" }
+            ]
+        });
+        var symbolCombobox = new Ext.form.ComboBox({
+            store: symbolStore,
+            valueField: 'value',
+            displayField: 'name',
+            mode: 'local',
+            editable: false
+        });
+        var renderEditor = Ext.create('Ext.window.Window', {
+            field: trigger,
+            title: trigger.fieldLabel,
+            width:600,
+            height:400,
+            modal:true,
+            layout:'border',
+            items: [{
+                xtype:'form',
+                region: 'north',
+                layout: 'fit',
+                height: '40%',
+                bodyPadding: 10,
+                autoScroll: true,
+                items: [{
+                    xtype: 'textarea',
+                    labelAlign: 'top',
+                    fieldLabel:'参数为(field, value)',
+                    name: 'functionbody',
+                    emptyText: '方法体'
+                }]
+            }, {
+                xtype: 'grid',
+                region: 'center',
+                height: '60%',
+                store: Ext.create('Ext.data.JsonStore',{
+                    fields: ['symbol', 'expression', 'fieldtext', 'fieldstyle', 'valuetext', 'valuestyle'],
+                    data: []
+                }),
+                autoScroll: true,
+                forceFit: true,
+                columnLines: true,
+                columns: [
+                    { text: '条件连接符', dataIndex: 'symbol', flex: 1, editor: symbolCombobox },
+                    { text: '条件表达式', dataIndex: 'expression', flex: 2, editor: 'texttrigger' },
+                    { text: '返回field值', dataIndex: 'text', flex: 1, editor: 'texttrigger' },
+                    { text: '返回field值样式', dataIndex: 'style', flex: 1, editor: 'styletrigger' },
+                    { text: '返回value值', dataIndex: 'text', flex: 1, editor: 'texttrigger' },
+                    { text: '返回value值样式', dataIndex: 'style', flex: 1, editor: 'styletrigger' }
+                ],
+                plugins: [
+                    Ext.create('Ext.grid.plugin.CellEditing', {
+                        clicksToEdit: 2
+                    })
+                ],
+                tbar: [{
+                    xtype: 'button',
+                    text: '添加条件',
+                    handler: function() {
+                        var grid = this.up('grid');
+                        var record = {
+                            symbol: 'if',
+                            expression: '1=1',
+                            text: 'value',
+                            style: ''
+                        };
+                        grid.addParam(record);
+                    }
+                }, {
+                    xtype: 'button',
+                    text: '删除条件',
+                    handler: function() {
+                        var grid =this.up('grid');
+                        var record = grid.getSelectionModel().getSelection()[0];
+                        if(record) {
+                            grid.getStore().remove(record);
+                        }
+                    }
+                }],
+                addParam: function(record) {
+                    var grid = this;
+                    var rowIndex = grid.getStore().add(record);
+                    grid.getPlugin().startEditByPosition({ row: grid.getStore().getCount() - 1, column: 0 });
+                },
+            }],
+            buttonAlign: 'center',
+            buttons:[{
+                text:'确定',
+                formBind:true,
+                handler:function(btn){
+                    var win = btn.ownerCt.ownerCt;
+                    var componet = Ext.getCmp(win.field.ownerCt.el.dom.parentNode.id);
+                    if(componet) {
+                        var grid = componet;
+                        var fieldname = win.field.column.dataIndex;
+                        var selections = grid.getSelectionModel().getSelection();
+                        var store = grid.getStore();
+                        var selected = selections[0];
+                        selected.set(fieldname, win.getRender());
+                        var rowIndex = store.indexOf(selected);
+                        grid.getPlugin().startEditByPosition({row: rowIndex, column: 1});
+                    }else {
+                        win.getRender();
+                        win.field.setValue(win.getRender());
+                    }
+                    win.close();
+                }
+            },{
+                text:'取消',
+                handler:function(btn){
+                    var win = btn.ownerCt.ownerCt;
+                    win.close();
+                }
+            }],
+            listeners: {
+                afterrender: function() {
+                    var me = this;
+                    var grid = me.down('grid');
+                    grid.getStore().add({
+                        symbol: 'if',
+                        expression: '1==1',
+                        fieldtext: 'field',
+                        fieldstyle: '{}',
+                        valuetext: 'value',
+                        valuestyle: '{}'
+                    })
+                }
+            },
+            getRender: function() {
+                var me = this;
+                var form = me.down('form');
+                var grid = me.down('grid');
+                var functionBody = form.getForm().findField('functionbody').getValue();
+                var returnValue = grid.getStore().data.items.map(function(item) {
+                    return item.data;
+                })
+                var renderFuncStr = '';
+                var conditionStr = '';
+                returnValue.map(function(v) {
+                    conditionStr += v.symbol + '('+ v.expression +'){return{field:{text:' + v.fieldtext + ',style:'+ v.fieldstyle +'},value:{text:'+ v.valuetext +',style:'+ v.valuestyle +'}}}'
+                });
+                renderFuncStr += 'function(field,value){' + functionBody + conditionStr + '}';
+                return renderFuncStr;
+            }
+        });
+        renderEditor.show();
+    }
+}); 

+ 170 - 0
kanban-console/src/main/webapp/resources/app/view/core/trigger/GridRenderTrigger.js

@@ -0,0 +1,170 @@
+Ext.define('erp.view.core.trigger.GridRenderTrigger', {
+    extend: 'Ext.form.field.Trigger',
+    alias: 'widget.gridrendertrigger',
+    triggerCls: 'render-trigger-icon-form',
+    onTriggerClick: function() {
+        var trigger = this;
+        var symbolStore = Ext.create('Ext.data.Store', {
+            fields: ['value', 'name'],
+            data: [
+                { "value": "if", "name": "if" },
+                { "value": "else if", "name": "else-if" },
+                { "value": "else", "name": "else" }
+            ]
+        });
+        var symbolCombobox = new Ext.form.ComboBox({
+            store: symbolStore,
+            valueField: 'value',
+            displayField: 'name',
+            mode: 'local',
+            editable: false
+        });
+        var renderEditor = Ext.create('Ext.window.Window', {
+            field: trigger,
+            title: trigger.fieldLabel,
+            width:600,
+            height:400,
+            modal:true,
+            layout:'border',
+            items: [{
+                xtype:'form',
+                region: 'north',
+                layout: 'fit',
+                height: '40%',
+                bodyPadding: 10,
+                autoScroll: true,
+                items: [{
+                    xtype: 'textarea',
+                    labelAlign: 'top',
+                    fieldLabel:'参数为(value, record, index)',
+                    name: 'functionbody',
+                    emptyText: '方法体'
+                }]
+            }, {
+                xtype: 'grid',
+                region: 'center',
+                height: '60%',
+                store: Ext.create('Ext.data.JsonStore',{
+                    fields: ['symbol', 'expression', 'text', 'style'],
+                    data: []
+                }),
+                autoScroll: true,
+                forceFit: true,
+                columnLines: true,
+                columns: [
+                    { text: '条件连接符', dataIndex: 'symbol', flex: 1, editor: symbolCombobox },
+                    { text: '条件表达式', dataIndex: 'expression', flex: 2, editor: 'texttrigger' },
+                    { text: '返回值', dataIndex: 'text', flex: 1, editor: 'texttrigger' },
+                    { text: '返回值样式', dataIndex: 'style', flex: 1, editor: 'styletrigger' }
+                ],
+                plugins: [
+                    Ext.create('Ext.grid.plugin.CellEditing', {
+                        clicksToEdit: 2
+                    })
+                ],
+                tbar: [{
+                    xtype: 'button',
+                    text: '添加条件',
+                    handler: function() {
+                        var grid = this.up('grid');
+                        var record = {
+                            symbol: 'if',
+                            expression: '1=1',
+                            text: 'value',
+                            style: ''
+                        };
+                        grid.addParam(record);
+                    }
+                }, {
+                    xtype: 'button',
+                    text: '删除条件',
+                    handler: function() {
+                        var grid =this.up('grid');
+                        var record = grid.getSelectionModel().getSelection()[0];
+                        if(record) {
+                            grid.getStore().remove(record);
+                        }
+                    }
+                }],
+                addParam: function(record) {
+                    var grid = this;
+                    var rowIndex = grid.getStore().add(record);
+                    grid.getPlugin().startEditByPosition({ row: grid.getStore().getCount() - 1, column: 0 });
+                },
+            }],
+            buttonAlign: 'center',
+            buttons:[{
+                text:'确定',
+                formBind:true,
+                handler:function(btn){
+                    var win = btn.ownerCt.ownerCt;
+                    var componet = Ext.getCmp(win.field.ownerCt.el.dom.parentNode.id);
+                    if(componet) {
+                        var grid = componet;
+                        var fieldname = win.field.column.dataIndex;
+                        var selections = grid.getSelectionModel().getSelection();
+                        var store = grid.getStore();
+                        var selected = selections[0];
+                        selected.set(fieldname, win.getRender());
+                        var rowIndex = store.indexOf(selected);
+                        grid.getPlugin().startEditByPosition({row: rowIndex, column: 1});
+                    }else {
+                        win.getRender();
+                        win.field.setValue(win.getRender());
+                    }
+                    win.close();
+                }
+            },{
+                text:'取消',
+                handler:function(btn){
+                    var win = btn.ownerCt.ownerCt;
+                    win.close();
+                }
+            }],
+            listeners: {
+                afterrender: function() {
+                    var me = this;
+                    var grid = me.down('grid');
+                    grid.getStore().add({
+                        symbol: 'if',
+                        expression: '1==1',
+                        text: 'value',
+                        style: '{}'
+                    })
+                }
+            },
+            decodeRenderFunctionStr: function(renderFunctionStr) {
+                // 匹配function(value,record,index){
+                var reg1 = /^[\s]{0,}function[\s]{0,}\([\s]{0,}value[\s]{0,},[\s]{0,}record[\s]{0,},[\s]{0,}index[\s]{0,}\)[\s]{0,}{[\s]{0,}/;
+                var reg2 = /[\s]{0,}[if\(][\S]{0,}/g
+                renderFunctionStr.replace(reg1,'')
+            },
+            setRender: function(renderObj) {
+                var me = this;
+                var form = me.down('form');
+                var grid = me.down('grid');
+                var functionBody = renderObj.functionBody;
+                var returnValue  = renderObj.returnValue || [];
+                form.getForm().findField('functionbody').setValue(functionBody),
+                grid.getStore().add(returnValue);
+            },
+            getRender: function() {
+                var me = this;
+                var form = me.down('form');
+                var grid = me.down('grid');
+                var functionBody = form.getForm().findField('functionbody').getValue();
+                var returnValue = grid.getStore().data.items.map(function(item) {
+                    return item.data;
+                })
+                var renderFuncStr = '';
+                var conditionStr = '';
+                returnValue.map(function(v) {
+                    conditionStr += v.symbol + '('+ v.expression +'){return{children:' + v.text + ',props:{style:'+ v.style +'}}}'
+                });
+                renderFuncStr += 'function(value,record,index){' + functionBody + conditionStr + '}';
+                return renderFuncStr;
+            }
+        });
+        renderEditor.show();
+    }
+}); 

+ 220 - 0
kanban-console/src/main/webapp/resources/app/view/core/trigger/StyleTrigger.js

@@ -0,0 +1,220 @@
+Ext.define('erp.view.core.trigger.StyleTrigger', {
+    extend: 'Ext.form.field.Trigger',
+    alias: 'widget.styletrigger',
+    triggerCls: 'style-trigger-icon-form',
+    onTriggerClick: function() {
+        var trigger = this;
+        var styleEditor = Ext.create('Ext.window.Window', {
+            field: trigger,
+            title: trigger.fieldLabel,
+            width:320,
+            height:320,
+            modal:true,
+            layout:'border',
+            items: [{
+                xtype:'form',
+                region: 'center',
+                bodyPadding: 10,
+                autoScroll: true,
+                items: [{
+                    xtype: 'triggerfield',
+                    name: 'color',
+                    id: 'titlecolore',
+                    _CLICK: new Date(),
+                    fieldLabel: '字体颜色',
+                    triggerCls: '',
+                    overCls: '',
+                    hideTrigger: false,
+                    editable: true,
+                    allowBlank: true,
+                    emptyText: '#FFFFFF',
+                    onTriggerClick: function () {
+                        var me = this;
+                        if (!me.picker) {
+                            me.picker = Ext.create('Ext.picker.Color', {
+                                pickerField: this,
+                                ownerCt: this,
+                                renderTo: Ext.getBody(),
+                                floating: true,
+                                focusOnShow: true,
+                                style: {
+                                    backgroundColor: "#fff"
+                                },
+                                listeners: {
+                                    scope: this,
+                                    select: function (field, value, opts) {
+                                        me.setValue('#' + value);
+                                        me.picker.hide();
+                                        me.pickerShow = false;
+                                    }
+                                }
+                            });
+                            me.picker.alignTo(me.inputEl, 'tl-bl?');
+                        }
+                        if(me.pickerShow) {
+                            me.picker.hide();
+                            me.pickerShow = false;
+                        }else {
+                            me.picker.show();
+                            me.pickerShow = true;
+                        }
+                    },
+                    listeners: {
+                        change: function(field, newValue, oldValue, eOpts) {
+                            this.inputEl.applyStyles({
+                                backgroundColor: newValue
+                            });
+                        }
+                    }
+                }, {
+                    xtype: 'numberfield',
+                    fieldLabel: '字体大小',
+                    name: 'fontSize',
+                    minValue: 0,
+                    emptyText: '默认'
+                }, {
+                    xtype: 'checkboxfield',
+                    fieldLabel: '字体倾斜',
+                    name: 'fontStyle',
+                    inputValue: 'oblique'
+                }, {
+                    xtype: 'combobox',
+                    fieldLabel: '字体粗细',
+                    name: 'fontWeight',
+                    editable: false,
+                    listConfig: {
+                        maxHeight: 100,
+                    },
+                    store: Ext.create('Ext.data.Store', {
+                        fields: ['value', 'name'],
+                        data : [
+                            { name: '正常', value: 'normal'},
+                            { name: '粗体', value: 'bold'},
+                            { name: '加粗', value: 'bolder'},
+                            { name: '细体', value: 'lighter'},
+                            { name: '100', value: '100'},
+                            { name: '200', value: '200'},
+                            { name: '300', value: '300'},
+                            { name: '400', value: '400'},
+                            { name: '500', value: '500'},
+                            { name: '600', value: '600'},
+                            { name: '700', value: '700'},
+                            { name: '800', value: '800'},
+                            { name: '900', value: '900'}
+                        ]
+                    }),
+                    queryMode: 'local',
+                    displayField: 'name',
+                    valueField: 'value',
+                    emptyText: '正常'
+                }, {
+                    xtype: 'combobox',
+                    fieldLabel: '对齐方式',
+                    name: 'textAlign',
+                    editable: false,
+                    store: Ext.create('Ext.data.Store', {
+                        fields: ['value', 'name'],
+                        data : [
+                            { name: '左对齐', value: 'left'},
+                            { name: '居中', value: 'center'},
+                            { name: '右对齐', value: 'right'}
+                        ]
+                    }),
+                    queryMode: 'local',
+                    displayField: 'name',
+                    valueField: 'value',
+                    emptyText: '居中'
+                }, {
+                    xtype: 'textfield',
+                    fieldLabel: '自定义',
+                    name: 'otherStyle',
+                    emptyText: '多个样式以分号;间隔'
+                }],
+                setStyle: function(styleObj) {
+                    var styleForm = this;
+                    var o = {
+                        data: Object.assign({}, styleObj),
+                        getData: function() {return this.data}
+                    }
+                    for(var key in styleObj) {
+                        if(styleForm.getForm().findField(key)) {
+                            delete styleObj[key];
+                        }
+                    }
+                    o.data.otherStyle = Ext.JSON.encode(styleObj).replace(/[{"}]/g, '').replace(',', ';');
+                    styleForm.loadRecord(o);
+                },
+                getStyle: function() {
+                    var styleForm = this;
+                    var styles = styleForm.getForm().getValues();
+                    styleObj = {};
+                    for(var key in styles) {
+                        if(styles[key]) {
+                            if(key == 'otherStyle') {
+                                var sarr = styles[key].split(';');
+                                sarr.map(function(s) {
+                                    var so = s.split(':');
+                                    if(so[0] && s[1]) {
+                                        styleObj[so[0]] = so[1];
+                                    }
+                                });
+                            }else if(key == 'fontSize') {
+                                styleObj[key] = styles[key] + 'px';
+                            }else {
+                                styleObj[key] = styles[key];
+                            }
+                        }
+                    }
+                    return styleObj;
+                }
+            }],
+            buttonAlign: 'center',
+            buttons:[{
+                text:'确定',
+                formBind:true,
+                handler:function(btn){
+                    var win = btn.ownerCt.ownerCt;
+                    var componet = Ext.getCmp(win.field.ownerCt.el.dom.parentNode.id);
+                    if(componet) {
+                        var grid = componet;
+                        var fieldname = win.field.column.dataIndex;
+                        var selections = grid.getSelectionModel().getSelection();
+                        var store = grid.getStore();
+                        var selected = selections[0];
+                        selected.set(fieldname, Ext.JSON.encode( win.getStyle() ) );
+                        var rowIndex = store.indexOf(selected);
+                        grid.getPlugin().startEditByPosition({row: rowIndex, column: 1});
+                    }else {
+                        win.field.setValue( Ext.JSON.encode( win.getStyle() ) );
+                    }
+                    win.close();
+                }
+            },{
+                text:'取消',
+                handler:function(btn){
+                    var win = btn.ownerCt.ownerCt;
+                    win.close();
+                }
+            }],
+            listeners: {
+                afterrender: function() {
+                    var me = this;
+                    trigger.record = 
+                    me.setStyle(me.field.getValue());
+                }
+            },
+            setStyle: function(styleStr) {
+                var me = this;
+                var styleForm = me.down('form');
+                var styleObj = Ext.JSON.decode(styleStr || '{}');
+                styleForm.setStyle(styleObj);
+            },
+            getStyle: function() {
+                var me = this;
+                var styleForm = me.down('form');
+                return styleForm.getStyle();
+            }
+        });
+        styleEditor.show();
+    }
+}); 

+ 78 - 0
kanban-console/src/main/webapp/resources/app/view/core/trigger/TextTrigger.js

@@ -0,0 +1,78 @@
+Ext.define('erp.view.core.trigger.TextTrigger', {
+    extend: 'Ext.form.field.Trigger',
+    alias: 'widget.texttrigger',
+    triggerCls: 'text-trigger-icon-form',
+    onTriggerClick : function(){
+        var trigger = this;
+        var titleEditor = Ext.create('Ext.window.Window', {
+            field: trigger,
+            title: trigger.fieldLabel,
+            width:420,
+            height:320,
+            modal:true,
+            layout:'fit',
+            items: [{
+                xtype:'form',
+                layout: 'fit',
+                autoScroll: true,
+                bodyPadding: 10,
+                defaults: {
+                    labelAlign: 'top'
+                },
+                items: [{
+                    xtype: 'textarea',
+                    fieldLabel: '内容',
+                    name: 'text'
+                }],
+                tbar: [{
+                    xtype: 'button',
+                    cls: 'ux-start-button',
+                    iconCls: 'ux-start-button-icon',
+                    menuAlign: 'bl-tl',
+                    text:'引入参数',
+                    menu:Ext.widget('startmenu'),
+                }]
+            }],
+            buttonAlign: 'center',
+            buttons:[{
+                text:'确定',
+                formBind:true,
+                handler:function(btn){
+                    var win = btn.ownerCt.ownerCt;
+                    win.field.setValue(win.getText());
+                    win.close();
+                }
+            },{
+                text:'取消',
+                handler:function(btn){
+                    btn.ownerCt.ownerCt.close()
+                }
+            }],
+            listeners: {
+                afterrender: function() {
+                    var me = this;
+                    me.setText(me.field.getValue());
+                }
+            },
+            setText: function(text) {
+                var me = this;
+                var form = me.down('form');
+                var record = {
+                    data: {
+                        text: text
+                    },
+                    getData: function() {
+                        return this.data;
+                    }
+                }
+                form.loadRecord(record);
+            },
+            getText: function() {
+                var me = this;
+                var form = me.down('form');
+                return form.getForm().findField('text').getValue();
+            }
+        });
+        titleEditor.show();
+    }
+}); 

+ 3 - 10
kanban-console/src/main/webapp/resources/app/view/desktop/BoardManageMainPanel.js

@@ -15,7 +15,7 @@ Ext.define('erp.view.desktop.BoardManageMainPanel', {
         var dataTypeStore = Ext.create('Ext.data.Store', {
             fields: ['type', 'name'],
             data: [
-                { "type": "String", "name": "下拉" },
+                { "type": "String", "name": "下拉" },
                 { "type": "SQL", "name": "SQL取数" }
             ]
         });
@@ -392,6 +392,7 @@ Ext.define('erp.view.desktop.BoardManageMainPanel', {
             height: 200,
             width: 400,
             layout: 'fit',
+            autoScroll: true,
             modal:true,
             items: [{
                 xtype: 'dataview',
@@ -399,15 +400,7 @@ Ext.define('erp.view.desktop.BoardManageMainPanel', {
                 selectedItemCls: 'icon-selected',
                 trackOver: true,
                 itemSelector: 'div.select-icon-item',
-                store: Ext.create('Ext.data.Store', {
-                    fields: ['name', 'iconCls', 'code'],
-                    data: [
-                        { iconCls: 'grid-shortcut'},
-                        { iconCls: 'accordion-shortcut'},
-                        { iconCls: 'cpu-shortcut'},
-                        { iconCls: 'notepad-shortcut'}
-                    ]
-                }),
+                store: Ext.create('erp.store.boardicon'),
                 tpl: new Ext.XTemplate([
                     '<tpl for=".">',
                     '<div icon="{iconCls}" class="select-icon-item {iconCls}">',

+ 7 - 1
kanban-console/src/main/webapp/resources/app/view/desktop/BoardManageRightPanel.js

@@ -84,6 +84,10 @@ Ext.define('erp.view.desktop.BoardManageRightPanel',{
                     tooltip: '看板配置',
                     handler: function(grid, rowIndex, colIndex, th, eOpts, record) {
                         var code = record.get('code');
+                        if(!code) {
+                            showErrorMsg('提示', '请先保存该看板!');
+                            return;
+                        }
                         var panelRecord = Ext.getCmp('managemain').initRecord;
                         window.open(basePath+'board?code=' + code + '&name=' + record.get('name') + '&panelCode=' + record.get('panelCode') + '&panelName=' + panelRecord.get('name'), code);
                     }
@@ -158,7 +162,8 @@ Ext.define('erp.view.desktop.BoardManageRightPanel',{
             },
             saveModel: function(record) {
                 var grid = this;
-                var type = record.get('code') ? 'updatePart' : 'savePart'
+                var type = record.get('code') ? 'updatePart' : 'savePart';
+                grid.getEl().mask('loading...');
                 Ext.Ajax.request({
                     url:'kanban/' + type,
                     method:'POST',
@@ -166,6 +171,7 @@ Ext.define('erp.view.desktop.BoardManageRightPanel',{
                         json:Ext.encode(record)
                     },
                     callback:function(options,success,response){
+                        grid.getEl().unmask();
                         var res = JSON.parse(response.responseText);
                         if(success) {
                             if(grid) {

+ 9 - 18
kanban-console/src/main/webapp/resources/app/view/user/UserInfo.js

@@ -1,18 +1,13 @@
 Ext.apply(Ext.form.VTypes, {
     confirmPwd: function (value, field) {
-        if (field.confirmPwd) {
-            var first = field.confirmPwd.first;
-            var second = field.confirmPwd.second;
-
-            this.firstField = Ext.getCmp('newpassword');
-            this.seconField = Ext.getCmp('newpassword2');
-            var firstPwd = this.firstField.getValue();
-            var secondPwd = this.seconField.getValue();
-            if (firstPwd == secondPwd) {
-                return true;
-            } else {
-                return false;
-            }
+        this.firstField = Ext.getCmp('newpassword');
+        this.seconField = Ext.getCmp('newpassword2');
+        var firstPwd = this.firstField.getValue();
+        var secondPwd = this.seconField.getValue();
+        if (firstPwd == secondPwd) {
+            return true;
+        } else {
+            return false;
         }
     },
     confirmPwdText: '两次输入的密码不一致!',
@@ -74,11 +69,7 @@ Ext.define('erp.view.user.UserInfo',{
                 fieldLabel: '确认新密码',
                 regex: /^[\s\S]{0,16}$/,
                 regexText: '密码长度不能超过16个字符',
-                vtype:'confirmPwd',
-                confirmPwd: {
-                    first: 'loginPassword',
-                    second:'rePassword'
-                }
+                vtype:'confirmPwd'
             }],
             buttons: [{
                 xtype: 'button',

+ 27 - 0
kanban-console/src/main/webapp/resources/css/boardmodel.css

@@ -0,0 +1,27 @@
+.text-trigger-icon-form {
+    background-repeat: no-repeat !important;
+    background-position-y: 2px !important;
+    background-position-x: 0 !important;
+    background-image: url(../images/icons/text.png) !important;
+}
+.style-trigger-icon-form {
+    background-repeat: no-repeat !important;
+    background-position-y: 2px !important;
+    background-position-x: 0 !important;
+    background-image: url(../images/icons/style.png) !important;
+}
+.render-trigger-icon-form {
+    background-repeat: no-repeat !important;
+    background-position-y: 2px !important;
+    background-position-x: 0 !important;
+    background-image: url(../images/icons/render.png) !important;
+}
+.text-trigger-icon-grid {
+    background-image: url(../images/icons/text.png) !important;
+}
+.style-trigger-icon-grid {
+    background-image: url(../images/icons/style.png) !important;
+}
+.render-trigger-icon-grid {
+    background-image: url(../images/icons/render.png) !important;
+}

BIN
kanban-console/src/main/webapp/resources/images/icons/render.png


BIN
kanban-console/src/main/webapp/resources/images/icons/style.png


BIN
kanban-console/src/main/webapp/resources/images/icons/text.png