瀏覽代碼

①chart图配置项新增对轴的调整,添加复合chart图的逻辑代码(未放出配置界面);
②调整计算面板高度逻辑,现在能正确得到图片渲染之后的title高度;
③其他细节调整。

zhuth 7 年之前
父節點
當前提交
40c81cc2fa
共有 24 個文件被更改,包括 1256 次插入150 次删除
  1. 68 19
      kanban-console/src/main/java/com/uas/kanban/support/KanbanParser.java
  2. 84 9
      kanban-console/src/main/resources/map-rule.xsl
  3. 1 1
      kanban-console/src/main/webapp/WEB-INF/views/board.html
  4. 14 5
      kanban-console/src/main/webapp/resources/app/controller/board.js
  5. 12 6
      kanban-console/src/main/webapp/resources/app/store/component.js
  6. 15 13
      kanban-console/src/main/webapp/resources/app/view/component/barcomponent.js
  7. 1 1
      kanban-console/src/main/webapp/resources/app/view/component/formcomponent.js
  8. 1 17
      kanban-console/src/main/webapp/resources/app/view/component/gridcomponent.js
  9. 15 13
      kanban-console/src/main/webapp/resources/app/view/component/linecomponent.js
  10. 514 0
      kanban-console/src/main/webapp/resources/app/view/component/mixchartcomponent.js
  11. 3 13
      kanban-console/src/main/webapp/resources/app/view/component/piecomponent.js
  12. 2 26
      kanban-console/src/main/webapp/resources/app/view/core/trigger/BarTrigger.js
  13. 153 0
      kanban-console/src/main/webapp/resources/app/view/core/trigger/ChartAreaTrigger.js
  14. 1 1
      kanban-console/src/main/webapp/resources/app/view/core/trigger/FormRenderTrigger.js
  15. 2 26
      kanban-console/src/main/webapp/resources/app/view/core/trigger/LineTrigger.js
  16. 5 0
      kanban-console/src/main/webapp/resources/app/view/core/trigger/PieTrigger.js
  17. 176 0
      kanban-console/src/main/webapp/resources/app/view/core/trigger/XAxisTrigger.js
  18. 171 0
      kanban-console/src/main/webapp/resources/app/view/core/trigger/YAxisTrigger.js
  19. 18 0
      kanban-console/src/main/webapp/resources/css/boardmodel.css
  20. 二進制
      kanban-console/src/main/webapp/resources/images/icons/chart-area.png
  21. 二進制
      kanban-console/src/main/webapp/resources/images/icons/xaxis.png
  22. 二進制
      kanban-console/src/main/webapp/resources/images/icons/yaxis.png
  23. 0 0
      kanban-console/src/main/webapp/resources/js/boardshow/main.bundle.js
  24. 0 0
      kanban-console/src/main/webapp/resources/lib/boardshow/vendor.js

+ 68 - 19
kanban-console/src/main/java/com/uas/kanban/support/KanbanParser.java

@@ -244,7 +244,7 @@ public class KanbanParser {
             throws DocumentException, IllegalStateException, SQLException {
         Document document = getDocument(content);
         // 获取 bar 和 line 组件
-        List<Element> elements = document.selectNodes("//bar | //line");
+        List<Element> elements = document.selectNodes("//bar | //line | //mixchart");
         for (Element element : elements) {
             // 执行 sql ,获取数据
             String sql = element.attribute("sql").getText();
@@ -264,29 +264,78 @@ public class KanbanParser {
                 // 设置 xvalue
                 element.attribute("xfields").setText(toString(map.remove(xvalue.toUpperCase())));
             }
-
-            // fields 名称
-            String[] fields = element.attribute("fields").getText().split(",[\\s]*");
-            if (ArrayUtils.isEmpty(fields)) {
-                continue;
+            if(element.attribute("fields") != null) {
+            	// fields 名称
+                String[] fields = element.attribute("fields").getText().split(",[\\s]*");
+                if (ArrayUtils.isEmpty(fields)) {
+                    continue;
+                }
+                // 添加 series 节点,用于存储 fields 的值
+                for (String field : fields) {
+                    Element seriesElement = new DefaultElement("series");
+                    seriesElement.addAttribute("name", field);
+                    List<Object> value = map.remove(field.toUpperCase());
+                    // 对于某一列,其每一行的数据创建一个 data 标签
+                    if (CollectionUtils.isEmpty(value)) {
+                        Element dataElement = new DefaultElement("data");
+                        seriesElement.add(dataElement);
+                    } else {
+                        for (Object object : value) {
+                            Element dataElement = new DefaultElement("data");
+                            dataElement.setText(toString(object));
+                            seriesElement.add(dataElement);
+                        }
+                    }
+                    element.add(seriesElement);
+                }
             }
-            // 添加 series 节点,用于存储 fields 的值
-            for (String field : fields) {
-                Element seriesElement = new DefaultElement("series");
-                seriesElement.addAttribute("name", field);
-                List<Object> value = map.remove(field.toUpperCase());
-                // 对于某一列,其每一行的数据创建一个 data 标签
-                if (CollectionUtils.isEmpty(value)) {
-                    Element dataElement = new DefaultElement("data");
-                    seriesElement.add(dataElement);
-                } else {
-                    for (Object object : value) {
+            if(element.attribute("barfields") != null) {
+                String[] barfields = element.attribute("barfields").getText().split(",[\\s]*");
+                if (ArrayUtils.isEmpty(barfields)) {
+                	continue;
+                }
+                for (String field : barfields) {
+                    Element seriesElement = new DefaultElement("series");
+                    seriesElement.addAttribute("name", field);
+                    seriesElement.addAttribute("type", "bar");
+                    List<Object> value = map.remove(field.toUpperCase());
+                    // 对于某一列,其每一行的数据创建一个 data 标签
+                    if (CollectionUtils.isEmpty(value)) {
                         Element dataElement = new DefaultElement("data");
-                        dataElement.setText(toString(object));
                         seriesElement.add(dataElement);
+                    } else {
+                        for (Object object : value) {
+                            Element dataElement = new DefaultElement("data");
+                            dataElement.setText(toString(object));
+                            seriesElement.add(dataElement);
+                        }
                     }
+                    element.add(seriesElement);
+                }
+            }
+            if(element.attribute("linefields") != null) {
+            	String[] linefields = element.attribute("linefields").getText().split(",[\\s]*");
+                if (ArrayUtils.isEmpty(linefields)) {
+                	continue;
+                }
+                for (String field : linefields) {
+                    Element seriesElement = new DefaultElement("series");
+                    seriesElement.addAttribute("name", field);
+                    seriesElement.addAttribute("type", "line");
+                    List<Object> value = map.remove(field.toUpperCase());
+                    // 对于某一列,其每一行的数据创建一个 data 标签
+                    if (CollectionUtils.isEmpty(value)) {
+                        Element dataElement = new DefaultElement("data");
+                        seriesElement.add(dataElement);
+                    } else {
+                        for (Object object : value) {
+                            Element dataElement = new DefaultElement("data");
+                            dataElement.setText(toString(object));
+                            seriesElement.add(dataElement);
+                        }
+                    }
+                    element.add(seriesElement);
                 }
-                element.add(seriesElement);
             }
         }
         return document.asXML();

+ 84 - 9
kanban-console/src/main/resources/map-rule.xsl

@@ -144,6 +144,16 @@
                     </xsl:with-param>
                 </xsl:call-template>
             </xsl:for-each>
+            
+            <!-- mixchart -->
+            <xsl:for-each select="mixchart">
+                <xsl:call-template name="barOrLine">
+                    <xsl:with-param name="type">
+                        <!-- 不直接输出字符串,是因为有空格的问题 -->
+                        <xsl:value-of select="concat('mixchart', '')"/>
+                    </xsl:with-param>
+                </xsl:call-template>
+            </xsl:for-each>
 
             <!-- pie -->
             <xsl:for-each select="pie">
@@ -205,28 +215,93 @@
                 <xfields>
                     <xsl:value-of select="@xfields"/>
                 </xfields>
-                <ytitle>
-                    <xsl:value-of select="@ytitle"/>
-                </ytitle>
-                <ytype>
-                    <xsl:value-of select="@ytype"/>
-                </ytype>
+                <xconfig>
+                    <xsl:value-of select="@xconfig"/>
+                </xconfig>
+                <xsl:if test="@ytitle">
+                    <ytitle>
+	                    <xsl:value-of select="@ytitle"/>
+	                </ytitle>
+                </xsl:if>
+                <xsl:if test="@ytype">
+	                <ytype>
+	                    <xsl:value-of select="@ytype"/>
+	                </ytype>
+                </xsl:if>
+                <xsl:if test="@yconfig">
+	                <yconfig>
+	                    <xsl:value-of select="@yconfig"/>
+	                </yconfig>
+                </xsl:if>
                 <legendconfig>
                     <xsl:value-of select="@legendconfig"/>
                 </legendconfig>
                 <areaconfig>
                     <xsl:value-of select="@areaconfig"/>
                 </areaconfig>
-                <color>
-                	<xsl:value-of select="@color"/>
-                </color>
+                <xsl:if test="@barconfig">
+                	<barconfig>
+	                	<xsl:value-of select="@barconfig"/>
+	                </barconfig>
+                </xsl:if>
+                <xsl:if test="@lineconfig">
+	                <lineconfig>
+	                	<xsl:value-of select="@lineconfig"/>
+	                </lineconfig>
+                </xsl:if>
+                <xsl:if test="@color">
+	                <color>
+	                	<xsl:value-of select="@color"/>
+	                </color>
+	            </xsl:if>
+	            <xsl:if test="@ybartitle">
+	            	<ybar>
+	            		<title>
+	            			<xsl:value-of select="@ybartitle"/>
+	            		</title>
+	            		<type>
+	            			<xsl:value-of select="@ybartype"/>
+	            		</type>
+	            		<config>
+		                    <xsl:value-of select="@ybarconfig"/>
+		                </config>
+	                </ybar>
+	            </xsl:if>
+	            <xsl:if test="@ylinetitle">
+	            	<yline>
+	            		<title>
+	            			<xsl:value-of select="@ylinetitle"/>
+	            		</title>
+	            		<type>
+	            			<xsl:value-of select="@ylinetype"/>
+	            		</type>
+	            		<config>
+		                    <xsl:value-of select="@ylineconfig"/>
+		                </config>
+	                </yline>
+	            </xsl:if>
                 <!-- TODO -->
                 <yfields/>
+                <xsl:if test="@barcolor">
+                	<barcolor>
+                		<xsl:value-of select="@barcolor"/> 
+                	</barcolor>
+                </xsl:if>
+                <xsl:if test="@linecolor">
+                	<linecolor>
+                		<xsl:value-of select="@linecolor"/> 
+                	</linecolor>
+                </xsl:if>
                 <xsl:for-each select="series">
                     <series>
                         <name>
                             <xsl:value-of select="@name"/>
                         </name>
+                        <xsl:if test="@type">
+	                        <type>
+	                        	<xsl:value-of select="@type"/>
+	                        </type>
+                        </xsl:if>
                         <xsl:for-each select="data">
                             <data>
                                 <xsl:value-of select="."/>

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

@@ -47,7 +47,7 @@ var panelName = codes3[1];
 .components ul{
 	list-style-type:none; 
 	margin:0;
-	padding:0 3px 0 0;
+	padding:3px 3px 0 0;
 	width:100%; 
 }
 .components ul li{ 

+ 14 - 5
kanban-console/src/main/webapp/resources/app/controller/board.js

@@ -4,10 +4,10 @@ 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','component.mixchartcomponent',
 	'core.trigger.TextTrigger', 'core.trigger.StyleTrigger', 'core.trigger.GridRenderTrigger', 'core.trigger.FormRenderTrigger',
 	'boardmodel.modelbackupgrid', 'core.trigger.LegendTrigger', 'core.trigger.PieTrigger', 'core.trigger.ColorPoolTrigger', 'core.trigger.ColorPicker',
-	'core.trigger.BarTrigger', 'core.trigger.LineTrigger'
+	'core.trigger.BarTrigger', 'core.trigger.LineTrigger', 'core.trigger.ChartAreaTrigger', 'core.trigger.XAxisTrigger', 'core.trigger.YAxisTrigger'
     ],
     stores:['component'],
     init:function(){
@@ -146,7 +146,7 @@ Ext.define('erp.controller.board', {
     				if(detailSelect!=null){
 	    				var propGrid = Ext.getCmp('detailpropertiesgrid');
 	    				propGrid.getStore().loadData([{
-	    					property:records[0].get('name'),
+	    					property:records[0].get('name')
 	    					//propvalue:records[0].get('value')
 	    				}],true);    					
     				}
@@ -172,7 +172,6 @@ Ext.define('erp.controller.board', {
 					var editor;
 					for(var i = 0; i < propconfig.length; i++) {
 						if(propconfig[i].property == record.get('property')) {
-							console.log(propconfig[i].editor);
 							editor = propconfig[i].editor || {xtype: 'textfield'};
 						}
 					}
@@ -359,12 +358,22 @@ Ext.define('erp.controller.board', {
 				xtype: ch.getAttribute('xtype'),
 				xvalue: ch.getAttribute('xvalue'),
 				ytitle: ch.getAttribute('ytitle'),
+				ybartitle: ch.getAttribute('ybartitle'),
+				ylinetitle: ch.getAttribute('ylinetitle'),
 				ytype: ch.getAttribute('ytype'),
+				ybartype: ch.getAttribute('ybartype'),
+				ylinetype: ch.getAttribute('ylinetype'),
+				ybarpos: ch.getAttribute('ybarpos'),
+				ylinepos: ch.getAttribute('ylinepos'),
 				field: ch.getAttribute('field'),
 				value: ch.getAttribute('value'),
 				legendconfig: ch.getAttribute('legendconfig'),
-				pieconfig: ch.getAttribute('pieconfig'),
 				areaconfig: ch.getAttribute('areaconfig'),
+				barconfig: ch.getAttribute('barconfig'),
+				lineconfig: ch.getAttribute('lineconfig'),
+				barfields: ch.getAttribute('barfields'),
+				linefields: ch.getAttribute('linefields'),
+				pieconfig: ch.getAttribute('pieconfig'),
 				color: ch.getAttribute('color'),
 				x:x,
 				y:y,

+ 12 - 6
kanban-console/src/main/webapp/resources/app/store/component.js

@@ -2,34 +2,40 @@
      extend: 'Ext.data.Store',
      fields: ['name','description','config'],
      data:[{
-		name:'Form Panel',
+		name:'表单',
 		description:'Form Panel',
 		config:{
 			xtype:'formcomponent'
 		}
 	},{
-		name:'Grid Panel',
+		name:'表格',
 		description:'Grid Panel',
 		config:{
 			xtype:'gridcomponent'
 		}			
 	},{
-		name: 'Chart-Bar',
+		name: '柱状图',
 		description:'柱状图',
 		config:{
 			xtype:'barcomponent'
 		}
 	},{
-		name: 'Chart-Line',
+		name: '折线图',
 		description: '折线图',
 		config: {
 			xtype: 'linecomponent'
 		}
 	},{
-		name: 'Chart-Pie',
+		name: '饼图',
 		description: '饼图',
 		config: {
 			xtype: 'piecomponent'
 		}
-	}]
+	}/*,{
+		name: '柱-线复合图',
+		description: '柱状图折线图复合图形',
+		config: {
+			xtype: 'mixchartcomponent'
+		}
+	}*/]
  });

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

@@ -11,7 +11,7 @@ function getAxesType() {
 Ext.define('erp.view.component.barcomponent',{
 	extend:'Ext.panel.Panel',
 	alias:'widget.barcomponent',
-	title:'Chart-Bar',
+	title:'柱状图',
 	type:'bar',
 	mixins: ['erp.view.component.commonpanel'],
 	closable:true,
@@ -23,17 +23,7 @@ Ext.define('erp.view.component.barcomponent',{
 				baseConfigForm:[{
 					xtype:'textfield',
 					fieldLabel:'标题',
-					name:'maintitle',
-					listeners:{
-						blur:function( field, e, eOpts ){
-							//修改title
-							var v=field.getValue();
-							if(v){
-								this.changeTitle(v);
-							}
-						},
-						scope:this				        
-					}
+					name:'maintitle'
 				},{
 					xtype:'textfield',
 					fieldLabel:'副标题',
@@ -94,6 +84,10 @@ Ext.define('erp.view.component.barcomponent',{
 						xtype: 'textfield',
 						fieldLabel: '变量名',
 						name: 'xvalue'
+					},{
+						xtype: 'xaxistrigger',
+						fieldLabel: '其他设置',
+						name: 'xconfig'
 					}]
 				},{
 					xtype:'fieldset',
@@ -127,6 +121,10 @@ Ext.define('erp.view.component.barcomponent',{
     					value: 'numeric',
 						store: getAxesType(),
 						readOnly: true
+					},{
+						xtype: 'yaxistrigger',
+						fieldLabel: '其他设置',
+						name: 'yconfig'
 					}]
 				},{
 					xtype:'textfield', 
@@ -142,9 +140,13 @@ Ext.define('erp.view.component.barcomponent',{
 					fieldLabel: '图例设置',
 					name: 'legendconfig'
 				},{
-					xtype: 'bartrigger',
+					xtype: 'chartareatrigger',
 					fieldLabel: '图域设置',
 					name: 'areaconfig'
+				},{
+					xtype: 'bartrigger',
+					fieldLabel: '图形设置',
+					name: 'barconfig'
 				},{
 					xtype: 'colorpooltrigger',
 					fieldLabel: '色池',

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

@@ -1,7 +1,7 @@
 Ext.define('erp.view.component.formcomponent', {
 	extend: 'Ext.form.Panel',
 	alias: 'widget.formcomponent',
-	title: 'Form Panel',
+	title: '表单',
 	type: 'form',
 	mixins: ['erp.view.component.commonpanel'],
 	layout: 'column',

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

@@ -1,23 +1,7 @@
-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',
-	title:'Grid Panel',
+	title:'表格',
 	type:'grid',
 	mixins: ['erp.view.component.commonpanel'],
 	closable:true,

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

@@ -11,7 +11,7 @@ function getAxesType() {
 Ext.define('erp.view.component.linecomponent',{
 	extend:'Ext.panel.Panel',
 	alias:'widget.linecomponent',
-	title:'Chart-Line',
+	title:'折线图',
 	type:'line',
 	mixins: ['erp.view.component.commonpanel'],
 	closable:true,
@@ -23,17 +23,7 @@ Ext.define('erp.view.component.linecomponent',{
 				baseConfigForm:[{
 					xtype:'textfield',
 					fieldLabel:'标题',
-					name:'maintitle',
-					listeners:{
-						blur:function( field, e, eOpts ){
-							//修改title
-							var v=field.getValue();
-							if(v){
-								this.changeTitle(v);
-							}
-						},
-						scope:this				        
-					}
+					name:'maintitle'
 				},{
 					xtype:'textfield',
 					fieldLabel:'副标题',
@@ -95,6 +85,10 @@ Ext.define('erp.view.component.linecomponent',{
 						xtype: 'textfield',
 						fieldLabel: '变量名',
 						name: 'xvalue'
+					},{
+						xtype: 'xaxistrigger',
+						fieldLabel: '其他设置',
+						name: 'xconfig'
 					}]
 				},{
 					xtype:'fieldset',
@@ -128,6 +122,10 @@ Ext.define('erp.view.component.linecomponent',{
     					value: 'numeric',
 						store: getAxesType(),
 						readOnly: true
+					},{
+						xtype: 'yaxistrigger',
+						fieldLabel: '其他设置',
+						name: 'yconfig'
 					}]
 				},{
 					xtype:'textfield', 
@@ -143,9 +141,13 @@ Ext.define('erp.view.component.linecomponent',{
 					fieldLabel: '图例设置',
 					name: 'legendconfig'
 				},{
-					xtype: 'linetrigger',
+					xtype: 'chartareatrigger',
 					fieldLabel: '图域设置',
 					name: 'areaconfig'
+				},{
+					xtype: 'linetrigger',
+					fieldLabel: '图形设置',
+					name: 'lineconfig'
 				},{
 					xtype: 'colorpooltrigger',
 					fieldLabel: '色池',

+ 514 - 0
kanban-console/src/main/webapp/resources/app/view/component/mixchartcomponent.js

@@ -0,0 +1,514 @@
+function getAxesType() {
+	return Ext.create('Ext.data.Store', {
+		fields: ['name','type'],
+		data: [
+			{name: '数值轴(value)', type: 'numeric'},
+			{name: '时间轴(time)', type: 'time'},
+			{name: '分类轴(category)', type: 'category'}
+		]
+	})
+}
+Ext.define('erp.view.component.mixchartcomponent',{
+	extend:'Ext.panel.Panel',
+	alias:'widget.mixchartcomponent',
+	title:'柱-线复合图',
+	type:'mixchart',
+	mixins: ['erp.view.component.commonpanel'],
+	closable:true,
+	initComponent:function(){		
+		var me = this;
+		Ext.apply(me.listeners,this.mixins['erp.view.component.commonpanel'].listeners);
+		Ext.apply(me,{
+			config:{
+				baseConfigForm:[{
+					xtype:'textfield',
+					fieldLabel:'标题',
+					name:'maintitle'
+				},{
+					xtype:'textfield',
+					fieldLabel:'副标题',
+					name:'subtitle'
+				},{
+					xtype:'checkbox',
+					fieldLabel:'是否开启动画',
+					name:'animate',
+					hidden: true
+				},{
+					xtype:'fieldset',
+					title:'X轴',
+					items: [{
+						xtype: 'textfield',
+						fieldLabel:'轴名称',
+						name:'xtitle',
+						value: 'X-name',
+						listeners:{
+							blur:function( field, e, eOpts ){
+								var chart = this.up().currenSelectPanel.down('chart');
+								if(chart) {
+									var chartConfig = this.getChartConfig();
+									var baseconfig = this.getBaseConfig();
+									var series = chartConfig.series;
+									var data = chartConfig.data;
+									var xt = baseconfig.xtitle;
+									var yt = baseconfig.ytitle;
+									this.createChart(series, data, xt, yt);
+								}
+							},
+							scope:this				        
+						}
+					},{
+						xtype: 'combo',
+						name: 'xtype',
+						fieldLabel: '轴类型',
+						displayField: 'name',
+    					valueField: 'type',
+    					value: 'category',
+						store: getAxesType(),
+						readOnly: true
+					
+					},{
+						xtype: 'textfield',
+						fieldLabel:'刻度值',
+						name:'xfields',
+						hidden: true,
+						value: '刻度1,刻度2,刻度3',
+						listeners:{
+							blur:function( field, e, eOpts ){
+								this.removeAll();
+								var detailGrid = Ext.getCmp('elementdetailgrid');
+								detailGrid.getStore().removeAll();
+								this.fireEvent('addLineItem', this.up(), detailGrid);
+							},
+							scope:this				        
+						}
+					},{
+						xtype: 'textfield',
+						fieldLabel: '变量名',
+						name: 'xvalue'
+					},{
+						xtype: 'xaxistrigger',
+						fieldLabel: '其他设置',
+						name: 'xconfig'
+					}]
+				},{
+					xtype:'fieldset',
+					title:'Y轴-柱状图',
+					items: [{
+						xtype: 'textfield',
+						fieldLabel:'轴名称',
+						name:'ybartitle',
+						value: 'Y-Bar-name',
+						listeners:{
+							blur:function( field, e, eOpts ){
+								var chart = this.up().currenSelectPanel.down('chart');
+								if(chart) {
+									var chartConfig = this.getChartConfig();
+									var baseconfig = this.getBaseConfig();
+									var series = chartConfig.series;
+									var data = chartConfig.data;
+									var xt = baseconfig.xtitle;
+									var ybt = baseconfig.ybartitle;
+									var ylt = baseconfig.ylinetitle;
+									this.createChart(series, data, xt, ybt, ylt);
+								}
+							},
+							scope:this			        
+						}
+					}, {
+						xtype: 'combo',
+						name: 'ybartype',
+						fieldLabel: '轴类型',
+						displayField: 'name',
+    					valueField: 'type',
+    					value: 'numeric',
+						store: getAxesType(),
+						readOnly: true
+					}, {
+						xtype:'textfield', 
+						fieldLabel:'数据组字段',
+						name:'barfields',
+						value: '数据组0,数据组1'
+					},{
+						xtype: 'yaxistrigger',
+						fieldLabel: '其他设置',
+						name: 'ybarconfig'
+					}]
+				},{
+					xtype:'fieldset',
+					title:'Y轴-折线图',
+					items: [{
+						xtype: 'textfield',
+						fieldLabel:'轴名称',
+						name:'ylinetitle',
+						value: 'Y-Line-name',
+						listeners:{
+							blur:function( field, e, eOpts ){
+								var chart = this.up().currenSelectPanel.down('chart');
+								if(chart) {
+									var chartConfig = this.getChartConfig();
+									var baseconfig = this.getBaseConfig();
+									var series = chartConfig.series;
+									var data = chartConfig.data;
+									var xt = baseconfig.xtitle;
+									var ybt = baseconfig.ybartitle;
+									var ylt = baseconfig.ylinetitle;
+									this.createChart(series, data, xt, ybt, ylt);
+								}
+							},
+							scope:this			        
+						}
+					}, {
+						xtype: 'combo',
+						name: 'ylinetype',
+						fieldLabel: '轴类型',
+						displayField: 'name',
+    					valueField: 'type',
+    					value: 'numeric',
+						store: getAxesType(),
+						readOnly: true
+					}, {
+						xtype:'textfield', 
+						fieldLabel:'数据组字段',
+						name:'linefields',
+						value: '数据组2'
+					}, {
+						xtype: 'yaxistrigger',
+						fieldLabel: '其他设置',
+						name: 'ylineconfig'
+					}]
+				},{
+					xtype: 'texttrigger',
+					fieldLabel: '数据源',
+					name: 'sql'
+				},{
+					xtype: 'legendtrigger',
+					fieldLabel: '图例设置',
+					name: 'legendconfig'
+				},{
+					xtype: 'chartareatrigger',
+					fieldLabel: '图域设置',
+					name: 'areaconfig'
+				},{
+					xtype: 'bartrigger',
+					fieldLabel: '柱状图图形设置',
+					name: 'barconfig'
+				},{
+					xtype: 'linetrigger',
+					fieldLabel: '折线图图形设置',
+					name: 'lineconfig'
+				},{
+					xtype: 'colorpooltrigger',
+					fieldLabel: '柱状图色池',
+					name: 'barcolor'
+				},{
+					xtype: 'colorpooltrigger',
+					fieldLabel: '折线图色池',
+					name: 'linecolor'
+				},this.mixins['erp.view.component.commonpanel'].basicLayoutForm],
+				itemDefault:{
+				},
+				propGridDefault:{
+					fieldindex: 'data',
+					fieldname:'数据组',
+					propconfig:[{
+						display: '值(仅作展示)',
+						property: 'data',
+						propvalue: (Math.random()*100 | 0)+','+(Math.random()*100 | 0)+','+(Math.random()*100 | 0)
+					},{
+						display:'变量名',
+						property:'value',
+						propvalue:''
+					}]			
+				}
+			}
+		});
+		me.callParent(arguments);
+	},
+	layout: 'fit',
+	listeners:{
+		afterrender: function() {
+			this.removeAll();
+			var detailGrid = Ext.getCmp('elementdetailgrid');
+			detailGrid.getStore().removeAll();
+			this.fireEvent('addBarItem', this, detailGrid);
+			this.fireEvent('addLineItem', this, detailGrid);
+			this.fireEvent('addLineItem', this, detailGrid);
+		},
+		resetitemposition:function(panel,fieldRecords,from,to){
+			var chartconfig = this.getChartConfig();
+			var series = chartconfig.series;
+			var data = chartconfig.data;
+			
+			if(from < to) {
+				series.splice(to+1, 0, series[from]);
+				series.splice(from, 1);
+			}else {
+				series.splice(to, 0, series[from]);
+				series.splice(from+1, 1);
+			}
+			var baseconfig = this.getBaseConfig();
+			var xt = baseconfig.xtitle;
+			var yt = baseconfig.ytitle;
+			
+			this.createChart(series, data, xt, yt);
+		},
+		addLineItem:function(panel,detailGrid){
+			this.randomData();
+			
+			var item = this.gridNewLine(detailGrid);
+			var baseconfig = this.getBaseConfig();
+			var xt = baseconfig.xtitle;
+			var ybt = baseconfig.ybartitle;
+			var ylt = baseconfig.ylinetitle;
+			var x = baseconfig.xdata;
+			var y = baseconfig.ydata;
+			
+			// 刷新chart
+			var chartConfig = this.getChartConfig();
+			var series = chartConfig.series;
+			var data = chartConfig.data;
+			series.push({
+				type: 'line',
+				axis: 'right',
+				title: item.fieldname,
+				xField: 'xbottom',
+				yField: item.fieldindex
+			});
+			
+			if(data.length == 0) {
+				for(var i = 0; i < x.length; i++) {
+					var d = {xbottom: x[i]};
+					d[item.fieldindex] = Number(y[i]);
+					data.push(d);
+				}
+			}else {
+				for(var i = 0; i < data.length; i++) {
+					data[i][item.fieldindex] = Number(y[i]);
+				}
+			}
+			this.createChart(series, data, xt, ybt, ylt);
+		},
+		addBarItem:function(panel,detailGrid){
+			this.randomData();
+			
+			var item = this.gridNewLine(detailGrid);
+			
+			var baseconfig = this.getBaseConfig();
+			var xt = baseconfig.xtitle;
+			var ybt = baseconfig.ybartitle;
+			var ylt = baseconfig.ylinetitle;
+			var x = baseconfig.xdata;
+			var y = baseconfig.ydata;
+			
+			// 刷新chart
+			var chartConfig = this.getChartConfig();
+			var series = chartConfig.series;
+			var data = chartConfig.data;
+			series.push({
+				type: 'column',
+				axis: 'left',
+				title: [item.fieldname],
+				xField: 'xbottom',
+				yField: [item.fieldindex]
+			});
+			
+			if(data.length == 0) {
+				for(var i = 0; i < x.length; i++) {
+					var d = {xbottom: x[i]};
+					d[item.fieldindex] = Number(y[i]);
+					data.push(d);
+				}
+			}else {
+				for(var i = 0; i < data.length; i++) {
+					data[i][item.fieldindex] = Number(y[i]);
+				}
+			}
+			this.createChart(series, data, xt, ybt, ylt);
+		},
+		fieldnamechange:function(panel,record){
+			var fieldindex = record.raw.fieldindex;
+			var chartconfig = this.getChartConfig();
+			var baseconfig = this.getBaseConfig();
+			var xt = baseconfig.xtitle;
+			var yt = baseconfig.ytitle;
+			var series = chartconfig.series;
+			var data = chartconfig.data;
+			var detailGrid = Ext.getCmp('elementdetailgrid');
+			var selectedrow = detailGrid.getSelectionModel().getSelection()[0];
+			var index = detailGrid.getStore().indexOf(selectedrow);
+			series[index].title = record.get('fieldname');
+			this.createChart(series, data, xt, yt);
+		},
+		fieldpropchange:function(panel,record,detailindex){
+			var chartconfig = this.getChartConfig();
+			var baseconfig = this.getBaseConfig();
+			var series = chartconfig.series;
+			var data = chartconfig.data;
+			var xt = baseconfig.xtitle;
+			var yt = baseconfig.ytitle;
+			
+			var oldData = record.modified.propconfig[0].propvalue.split(',');
+			var newData = record.data.propconfig[0].propvalue.split(',');
+			var fieldindex = record.raw.fieldindex;
+			for(var i = 0; i < data.length; i++) {
+				data[i][fieldindex] = Number(newData[i]);
+			}
+			this.createChart(series, data, xt, yt);
+		},
+		fielddelete:function(panel,record){
+			var chartconfig = this.getChartConfig();
+			var fieldindex = record.raw.fieldindex;
+			var series = chartconfig.series;
+			var data = chartconfig.data;
+			for(var i = 0; i < series.length; i++) {
+				if(series[i].yField == fieldindex) {
+					series.splice(i,1);
+				}
+			}
+			for(var i = 0; i < data.length; i++) {
+				delete data[i][fieldindex];
+			}
+			var baseconfig = this.getBaseConfig();
+			var xt = baseconfig.xtitle;
+			var yt = baseconfig.ytitle;
+			
+			this.createChart(series, data, xt, yt);
+		}			
+	},
+	/**
+	 * 添加grid行
+	 */
+	gridNewLine: function(detailGrid) {
+		var alldata = detailGrid.getStore().data.items;
+		var prop = this.config.propGridDefault;
+		var item = Object.assign({},prop);
+		var arr = [];
+		for(var i = 0; i < alldata.length; i++) {
+			arr.push(alldata[i].raw.fieldindex);
+		}
+		var count = 0;
+		for(var i = 0; i < arr.length; i++) {
+			if(arr.indexOf(item.fieldindex+''+count) > -1) {
+				count++;
+			}
+		}
+		var sufname = ('' + count);
+		item.fieldname += sufname;
+		item.fieldindex += sufname;
+		var store = detailGrid.getStore();
+		store.add([item],true);
+		detailGrid.getSelectionModel().select(arr.length);
+		return item;
+	},
+	/**
+	 * 重设随机数值
+	 */
+	randomData: function() {
+		var prop = this.config.propGridDefault;
+		var item = Object.assign({},prop);
+		var arr2 = item.propconfig.map(function(c,i){return c.property;});
+		var baseform = Ext.getCmp('baseConfigForm');
+		var xfieldsarr = baseform.getForm().getValues().xfields.split(',');
+		var newarr = xfieldsarr.map(function() {
+			return (Math.random()*100 | 0)
+		});
+		prop.propconfig[arr2.indexOf('data')].propvalue = newarr.toString();
+	},
+	/**
+	 * 获得基本设置
+	 * @return {}
+	 */
+	getBaseConfig: function() {
+		var prop = this.config.propGridDefault;
+		var item = Object.assign({},prop);
+		var arr = item.propconfig.map(function(c,i){return c.property;});
+		var ystr = item.propconfig[arr.indexOf('data')].propvalue;
+		var baseform = Ext.getCmp('baseConfigForm');
+		var baseinfo = baseform.getForm().getValues();
+		
+		var xtitle = baseinfo.xtitle;// x轴名称
+		var ybartitle = baseinfo.ybartitle;// ybar轴名称
+		var ylinetitle = baseinfo.ylinetitle;// yline轴名称
+		var xdata = baseinfo.xfields.split(','); // x坐标数组
+		var ydata = ystr.split(','); // y坐标数组
+		return {
+			xtitle: xtitle,
+			ybartitle: ybartitle,
+			ylinetitle: ylinetitle,
+			xdata: xdata,
+			ydata: ydata
+		}
+	},
+	/**
+	 * 获得chart图数据配置
+	 */
+	getChartConfig: function() {
+		var chart = this.down('chart');
+		var series = [];
+		var data = [];
+		if(chart) {
+			series = chart.series.items.map(function(item, index) {
+				return {
+					type: item.type,
+					axis: item.axis,
+					title: item.title,
+					xField: item.xField,
+					yField: item.yField
+				}
+			});
+			data = chart.getStore().data.items.map(function(item, index) {
+				var d = item.data;
+				return d;
+			});
+		}
+		return {
+			series: series,
+			data: data
+		}
+	},
+	createChart: function(series, data, xtitle, ybartitle, ylinetitle) {
+		var fields = barFields = lineFields = [];
+		for(var key in data[0]) {fields.push(key)}
+		series.map(function(s) {
+			if(s.type == 'bar') {
+				barFields.push(s.yField);
+			}else if(s.type == 'line') {
+				lineFields.push(s.yField);
+			}
+		});
+		var store = Ext.create('Ext.data.JsonStore',{
+			fields: fields,
+		    data: data
+		});
+		this.removeAll();
+		this.add({
+			xtype: 'chart',
+			legend: true,
+			store:  store,
+		    axes: [{//轴
+	                type: 'Numeric',
+	                minimum: 0,
+	                position: 'left',
+	                fields: barFields,
+	                title: ybartitle || 'y-title-bar'
+	            }, {
+			        type: 'Numeric',
+			        minimum: 0,
+			        position: 'right',
+			        fields: lineFields,
+			        title: ylinetitle || 'y-title-line',
+			        grid: true
+		    	}, {
+	                type: 'Category',
+	                position: 'bottom',
+	                fields: ['xbottom'],
+	                title: xtitle || 'x-title'
+	            }],
+	            series: series
+		})
+	},
+	repaint: function() {
+//		this.setPosition(this.toLeft,this.toTop);
+		// this.setTitle(this.baseConfigFormValue.title);
+	}
+});

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

@@ -1,7 +1,7 @@
 Ext.define('erp.view.component.piecomponent',{
 	extend:'Ext.panel.Panel',
 	alias:'widget.piecomponent',
-	title:'Chart-Pie',
+	title:'饼图',
 	type:'pie',
 	mixins: ['erp.view.component.commonpanel'],
 	closable:true,
@@ -13,17 +13,7 @@ Ext.define('erp.view.component.piecomponent',{
 				baseConfigForm:[{
 					xtype:'textfield',
 					fieldLabel:'标题',
-					name:'maintitle',
-					listeners:{
-						blur:function( field, e, eOpts ){
-							//修改title
-							var v=field.getValue();
-							if(v){
-								this.changeTitle(v);
-							}
-						},
-						scope:this				        
-					}
+					name:'maintitle'
 				},{
 					xtype:'textfield',
 					fieldLabel:'副标题',
@@ -51,7 +41,7 @@ Ext.define('erp.view.component.piecomponent',{
 					name: 'legendconfig'
 				}, {
 					xtype: 'pietrigger',
-					fieldLabel: '图设置',
+					fieldLabel: '图设置',
 					name: 'pieconfig'
 				},{
 					xtype: 'colorpooltrigger',

+ 2 - 26
kanban-console/src/main/webapp/resources/app/view/core/trigger/BarTrigger.js

@@ -17,7 +17,7 @@ Ext.define('erp.view.core.trigger.BarTrigger', {
             field: trigger,
             title: trigger.fieldLabel,
             width: 700,
-            height: 400,
+            height: 300,
             modal:true,
             layout:'border',
             items: [{
@@ -31,30 +31,6 @@ Ext.define('erp.view.core.trigger.BarTrigger', {
                 	width: 300
                 },
                 items: [{
-                    xtype: 'numberfield',
-                    fieldLabel: '上边距(%)',
-                    name: 'top',
-                    minValue: 0,
-                    emptyText: 'auto'
-                }, {
-                    xtype: 'numberfield',
-                    fieldLabel: '左边距(%)',
-                    name: 'left',
-                    minValue: 0,
-                    emptyText: '10'
-                }, {
-                    xtype: 'numberfield',
-                    fieldLabel: '右边距(%)',
-                    name: 'right',
-                    minValue: 0,
-                    emptyText: '10'
-                }, {
-                    xtype: 'numberfield',
-                    fieldLabel: '下边距(%)',
-                    name: 'bottom',
-                    minValue: 0,
-                    emptyText: 'auto'
-                }, {
                 	xtype: 'textfield',
                 	fieldLabel: '<font title="柱条的宽度,支持设置成数字或者相对于类目宽度的百分比。">柱条宽度</font>',
                 	name: 'barWidth',
@@ -118,7 +94,7 @@ Ext.define('erp.view.core.trigger.BarTrigger', {
                 	emptyText: '5'
                 }, {
                 	xtype: 'texttrigger',
-                	fieldLabel: '<font title="模板变量有 {a}、{b}、{c},分别表示系列名,数据名,数据值。示例:formatter: \'{a}\\n{b}: {c}\'">标注render</font>',
+                	fieldLabel: '<font title="模板变量有 {a}、{b}、{c},分别表示系列名,数据名,数据值。示例:formatter: \'{a}\\n{b}: {c}\'">标注格式</font>',
                 	name: 'labelFormatter',
                 	emptyText: '{c}'
                 }],

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

@@ -0,0 +1,153 @@
+/**
+ * chart-area设置
+ */
+Ext.define('erp.view.core.trigger.ChartAreaTrigger', {
+    extend: 'Ext.form.field.Trigger',
+    alias: 'widget.chartareatrigger',
+    triggerCls: 'chartarea-trigger-icon',
+    onTriggerClick: function() {
+        var trigger = this;
+        try {
+            Ext.JSON.decode(trigger.getValue() || '{}');
+        }catch(e) {
+            showErrorMsg('失败', '格式有误!');
+            return;
+        }
+        var legendEditor = Ext.create('Ext.window.Window', {
+            field: trigger,
+            title: trigger.fieldLabel,
+            width: 400,
+            height: 280,
+            modal:true,
+            layout:'border',
+            items: [{
+                xtype:'form',
+                region: 'center',
+                bodyPadding: 10,
+                autoScroll: true,
+                layout: 'column',
+                defaults: {
+                	padding: '0 10 10 10',
+                	width: 300
+                },
+                items: [{
+                    xtype: 'numberfield',
+                    fieldLabel: '上边距(%)',
+                    name: 'top',
+                    minValue: 0,
+                    emptyText: 'auto'
+                }, {
+                    xtype: 'numberfield',
+                    fieldLabel: '左边距(%)',
+                    name: 'left',
+                    minValue: 0,
+                    emptyText: '5'
+                }, {
+                    xtype: 'numberfield',
+                    fieldLabel: '右边距(%)',
+                    name: 'right',
+                    minValue: 0,
+                    emptyText: '5'
+                }, {
+                    xtype: 'numberfield',
+                    fieldLabel: '下边距(%)',
+                    name: 'bottom',
+                    minValue: 0,
+                    emptyText: 'auto'
+                }],
+                setConfig: function(configObj) {
+                    var form = this;
+                    var o = {
+                        data: Object.assign({}, configObj),
+                        getData: function() {return this.data}
+                    };
+                    form.loadRecord(o);
+                },
+                getConfig: function() {
+                    var form = this;
+                    var config = form.getForm().getValues();
+                    configObj = {};
+                    for(var key in config) {
+                        if(config[key]) {
+                        	configObj[key] = config[key];
+                        }
+                    }
+                    return configObj;
+                }
+            }],
+            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.getConfig() ) );
+                        var rowIndex = store.indexOf(selected);
+                        var colIndex = 0;
+                        var columns = grid.columnManager.columns;
+                        for(var i = 0; i < columns.length; i ++) {
+                            var column = columns[i];
+                            if(column.dataIndex == fieldname) {
+                                colIndex = i;
+                                break;
+                            }
+                        }
+
+                        var getPropConfigByRecord = function(records) {
+                            var propConfig = new Array();
+                            var obj;
+                            Ext.Array.each(records,function(record){
+                                obj = new Object();
+                                obj.display = record.get('display');
+                                obj.property = record.get('property');
+                                obj.propvalue = record.get('propvalue');
+                                propConfig.push(obj);
+                            });
+                            return propConfig;
+                        }
+
+                        var detailGrid = Ext.getCmp('elementdetailgrid');
+                        var detailSelect = detailGrid.getSelectionModel().getSelection()[0];
+                        detailSelect.set('propconfig',getPropConfigByRecord(grid.store.data.items));
+
+                        grid.getPlugin().startEditByPosition({row: rowIndex, column: colIndex});
+                    }else {
+                        win.field.setValue( Ext.JSON.encode( win.getConfig() ) );
+                    }
+                    win.close();
+                }
+            },{
+                text:'取消',
+                handler:function(btn){
+                    var win = btn.ownerCt.ownerCt;
+                    win.close();
+                }
+            }],
+            listeners: {
+                afterrender: function() {
+                    var me = this;
+                    me.setConfig(me.field.getValue());
+                }
+            },
+            setConfig: function(configStr) {
+                var me = this;
+                var form = me.down('form');
+                var configObj = Ext.JSON.decode(configStr || '{}');
+                form.setConfig(configObj);
+            },
+            getConfig: function() {
+                var me = this;
+                var form = me.down('form');
+                return form.getConfig();
+            }
+        });
+        legendEditor.show();
+    }
+}); 

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

@@ -93,7 +93,7 @@ Ext.define('erp.view.core.trigger.FormRenderTrigger', {
                     var grid = this;
                     var rowIndex = grid.getStore().add(record);
                     grid.getPlugin().startEditByPosition({ row: grid.getStore().getCount() - 1, column: 0 });
-                },
+                }
             }],
             buttonAlign: 'center',
             buttons:[{

+ 2 - 26
kanban-console/src/main/webapp/resources/app/view/core/trigger/LineTrigger.js

@@ -17,7 +17,7 @@ Ext.define('erp.view.core.trigger.LineTrigger', {
             field: trigger,
             title: trigger.fieldLabel,
             width: 700,
-            height: 400,
+            height: 300,
             modal:true,
             layout:'border',
             items: [{
@@ -31,30 +31,6 @@ Ext.define('erp.view.core.trigger.LineTrigger', {
                 	width: 300
                 },
                 items: [{
-                    xtype: 'numberfield',
-                    fieldLabel: '上边距(%)',
-                    name: 'top',
-                    minValue: 0,
-                    emptyText: 'auto'
-                }, {
-                    xtype: 'numberfield',
-                    fieldLabel: '左边距(%)',
-                    name: 'left',
-                    minValue: 0,
-                    emptyText: '10'
-                }, {
-                    xtype: 'numberfield',
-                    fieldLabel: '右边距(%)',
-                    name: 'right',
-                    minValue: 0,
-                    emptyText: '10'
-                }, {
-                    xtype: 'numberfield',
-                    fieldLabel: '下边距(%)',
-                    name: 'bottom',
-                    minValue: 0,
-                    emptyText: 'auto'
-                }, {
                 	xtype: 'numberfield',
                     fieldLabel: '线宽(px)',
                     name: 'lineWidth',
@@ -161,7 +137,7 @@ Ext.define('erp.view.core.trigger.LineTrigger', {
                 	emptyText: '5'
                 }, {
                 	xtype: 'texttrigger',
-                	fieldLabel: '<font title="模板变量有 {a}、{b}、{c},分别表示系列名,数据名,数据值。示例:formatter: \'{a}\\n{b}: {c}\'">标注render</font>',
+                	fieldLabel: '<font title="模板变量有 {a}、{b}、{c},分别表示系列名,数据名,数据值。示例:formatter: \'{a}\\n{b}: {c}\'">标注格式</font>',
                 	name: 'labelFormatter',
                 	emptyText: '{c}'
                 }],

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

@@ -56,6 +56,11 @@ Ext.define('erp.view.core.trigger.PieTrigger', {
                     fieldLabel: '隐藏标注',
                     name: 'hideLabel',
                     inputValue: true
+                }, {
+                	xtype: 'texttrigger',
+                	fieldLabel: '<font title="模板变量有 {b}、{c}、{d},分别表示数据名,数据值,百分比。示例:formatter: \'{b}: {d}%\'">标注格式</font>',
+                	name: 'labelFormatter',
+                	emptyText: '{b}:  {c} \n {d}%'
                 }],
                 setConfig: function(configObj) {
                     var form = this;

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

@@ -0,0 +1,176 @@
+/**
+ * chart-xAxis(x轴)设置
+ */
+Ext.define('erp.view.core.trigger.XAxisTrigger', {
+    extend: 'Ext.form.field.Trigger',
+    alias: 'widget.xaxistrigger',
+    triggerCls: 'xaxis-trigger-icon',
+    onTriggerClick: function() {
+        var trigger = this;
+        try {
+            Ext.JSON.decode(trigger.getValue() || '{}');
+        }catch(e) {
+            showErrorMsg('失败', '格式有误!');
+            return;
+        }
+        var legendEditor = Ext.create('Ext.window.Window', {
+            field: trigger,
+            title: trigger.fieldLabel,
+            width: 400,
+            height: 280,
+            modal:true,
+            layout:'border',
+            items: [{
+                xtype:'form',
+                region: 'center',
+                bodyPadding: 10,
+                autoScroll: true,
+                layout: 'column',
+                defaults: {
+                	padding: '0 10 10 10',
+                	width: 300
+                },
+                items: [{
+                	xtype: 'combobox',
+                	fieldLabel: '轴位置',
+                	name: 'position',
+                    store: Ext.create('Ext.data.Store', {
+                        fields: ['value', 'name'],
+                        data : [
+                            { name: '上', value: 'top'},
+                            { name: '下', value: 'bottom'}
+                        ]
+                    }),
+                    queryMode: 'local',
+                    displayField: 'name',
+                    valueField: 'value',
+                    emptyText: '下'
+                }, {
+                    xtype: 'combobox',
+                    fieldLabel: '轴名称位置',
+                    name: 'nameLocation',
+                    store: Ext.create('Ext.data.Store', {
+                        fields: ['value', 'name'],
+                        data : [
+                            { name: '起点', value: 'start'},
+                            { name: '中间', value: 'middle'},
+                            { name: '终点', value: 'end'}
+                        ]
+                    }),
+                    queryMode: 'local',
+                    displayField: 'name',
+                    valueField: 'value',
+                    emptyText: '终点'
+                }, {
+                    xtype: 'numberfield',
+                    fieldLabel: '<font title="坐标轴名称与轴线之间的距离">轴名称偏移</font>',
+                    name: 'nameGap',
+                    minValue: 0,
+                    emptyText: '15'
+                }, {
+                    xtype: 'numberfield',
+                    fieldLabel: '<font title="坐标轴名字旋转角度值">轴名称旋转(°)</font>',
+                    name: 'nameRotate',
+                    emptyText: '0'
+                },{
+                	xtype: 'numberfield',
+                    fieldLabel: '<font title="刻度标签旋转的角度,可以防止标签之间重叠">刻度标签旋转(°)</font>',
+                    name: 'labelRotate',
+                    emptyText: 'auto'
+                }],
+                setConfig: function(configObj) {
+                    var form = this;
+                    var o = {
+                        data: Object.assign({}, configObj),
+                        getData: function() {return this.data}
+                    };
+                    form.loadRecord(o);
+                },
+                getConfig: function() {
+                    var form = this;
+                    var config = form.getForm().getValues();
+                    configObj = {};
+                    for(var key in config) {
+                        if(config[key]) {
+                        	configObj[key] = config[key];
+                        }
+                    }
+                    return configObj;
+                }
+            }],
+            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.getConfig() ) );
+                        var rowIndex = store.indexOf(selected);
+                        var colIndex = 0;
+                        var columns = grid.columnManager.columns;
+                        for(var i = 0; i < columns.length; i ++) {
+                            var column = columns[i];
+                            if(column.dataIndex == fieldname) {
+                                colIndex = i;
+                                break;
+                            }
+                        }
+
+                        var getPropConfigByRecord = function(records) {
+                            var propConfig = new Array();
+                            var obj;
+                            Ext.Array.each(records,function(record){
+                                obj = new Object();
+                                obj.display = record.get('display');
+                                obj.property = record.get('property');
+                                obj.propvalue = record.get('propvalue');
+                                propConfig.push(obj);
+                            });
+                            return propConfig;
+                        }
+
+                        var detailGrid = Ext.getCmp('elementdetailgrid');
+                        var detailSelect = detailGrid.getSelectionModel().getSelection()[0];
+                        detailSelect.set('propconfig',getPropConfigByRecord(grid.store.data.items));
+
+                        grid.getPlugin().startEditByPosition({row: rowIndex, column: colIndex});
+                    }else {
+                        win.field.setValue( Ext.JSON.encode( win.getConfig() ) );
+                    }
+                    win.close();
+                }
+            },{
+                text:'取消',
+                handler:function(btn){
+                    var win = btn.ownerCt.ownerCt;
+                    win.close();
+                }
+            }],
+            listeners: {
+                afterrender: function() {
+                    var me = this;
+                    me.setConfig(me.field.getValue());
+                }
+            },
+            setConfig: function(configStr) {
+                var me = this;
+                var form = me.down('form');
+                var configObj = Ext.JSON.decode(configStr || '{}');
+                form.setConfig(configObj);
+            },
+            getConfig: function() {
+                var me = this;
+                var form = me.down('form');
+                return form.getConfig();
+            }
+        });
+        legendEditor.show();
+    }
+}); 

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

@@ -0,0 +1,171 @@
+/**
+ * chart-yAxis(y轴)设置
+ */
+Ext.define('erp.view.core.trigger.YAxisTrigger', {
+    extend: 'Ext.form.field.Trigger',
+    alias: 'widget.yaxistrigger',
+    triggerCls: 'yaxis-trigger-icon',
+    onTriggerClick: function() {
+        var trigger = this;
+        try {
+            Ext.JSON.decode(trigger.getValue() || '{}');
+        }catch(e) {
+            showErrorMsg('失败', '格式有误!');
+            return;
+        }
+        var legendEditor = Ext.create('Ext.window.Window', {
+            field: trigger,
+            title: trigger.fieldLabel,
+            width: 400,
+            height: 280,
+            modal:true,
+            layout:'border',
+            items: [{
+                xtype:'form',
+                region: 'center',
+                bodyPadding: 10,
+                autoScroll: true,
+                layout: 'column',
+                defaults: {
+                	padding: '0 10 10 10',
+                	width: 300
+                },
+                items: [{
+                	xtype: 'combobox',
+                	fieldLabel: '轴位置',
+                	name: 'position',
+                    store: Ext.create('Ext.data.Store', {
+                        fields: ['value', 'name'],
+                        data : [
+                            { name: '左', value: 'left'},
+                            { name: '右', value: 'right'}
+                        ]
+                    }),
+                    queryMode: 'local',
+                    displayField: 'name',
+                    valueField: 'value',
+                    emptyText: '左'
+                }, {
+                    xtype: 'combobox',
+                    fieldLabel: '轴名称位置',
+                    name: 'nameLocation',
+                    store: Ext.create('Ext.data.Store', {
+                        fields: ['value', 'name'],
+                        data : [
+                            { name: '起点', value: 'start'},
+                            { name: '中间', value: 'middle'},
+                            { name: '终点', value: 'end'}
+                        ]
+                    }),
+                    queryMode: 'local',
+                    displayField: 'name',
+                    valueField: 'value',
+                    emptyText: '终点'
+                }, {
+                    xtype: 'numberfield',
+                    fieldLabel: '<font title="坐标轴名称与轴线之间的距离">轴名称偏移</font>',
+                    name: 'nameGap',
+                    minValue: 0,
+                    emptyText: '15'
+                }, {
+                    xtype: 'numberfield',
+                    fieldLabel: '<font title="坐标轴名字旋转角度值">轴名称旋转(°)</font>',
+                    name: 'nameRotate',
+                    emptyText: '0'
+                }],
+                setConfig: function(configObj) {
+                    var form = this;
+                    var o = {
+                        data: Object.assign({}, configObj),
+                        getData: function() {return this.data}
+                    };
+                    form.loadRecord(o);
+                },
+                getConfig: function() {
+                    var form = this;
+                    var config = form.getForm().getValues();
+                    configObj = {};
+                    for(var key in config) {
+                        if(config[key]) {
+                        	configObj[key] = config[key];
+                        }
+                    }
+                    return configObj;
+                }
+            }],
+            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.getConfig() ) );
+                        var rowIndex = store.indexOf(selected);
+                        var colIndex = 0;
+                        var columns = grid.columnManager.columns;
+                        for(var i = 0; i < columns.length; i ++) {
+                            var column = columns[i];
+                            if(column.dataIndex == fieldname) {
+                                colIndex = i;
+                                break;
+                            }
+                        }
+
+                        var getPropConfigByRecord = function(records) {
+                            var propConfig = new Array();
+                            var obj;
+                            Ext.Array.each(records,function(record){
+                                obj = new Object();
+                                obj.display = record.get('display');
+                                obj.property = record.get('property');
+                                obj.propvalue = record.get('propvalue');
+                                propConfig.push(obj);
+                            });
+                            return propConfig;
+                        }
+
+                        var detailGrid = Ext.getCmp('elementdetailgrid');
+                        var detailSelect = detailGrid.getSelectionModel().getSelection()[0];
+                        detailSelect.set('propconfig',getPropConfigByRecord(grid.store.data.items));
+
+                        grid.getPlugin().startEditByPosition({row: rowIndex, column: colIndex});
+                    }else {
+                        win.field.setValue( Ext.JSON.encode( win.getConfig() ) );
+                    }
+                    win.close();
+                }
+            },{
+                text:'取消',
+                handler:function(btn){
+                    var win = btn.ownerCt.ownerCt;
+                    win.close();
+                }
+            }],
+            listeners: {
+                afterrender: function() {
+                    var me = this;
+                    me.setConfig(me.field.getValue());
+                }
+            },
+            setConfig: function(configStr) {
+                var me = this;
+                var form = me.down('form');
+                var configObj = Ext.JSON.decode(configStr || '{}');
+                form.setConfig(configObj);
+            },
+            getConfig: function() {
+                var me = this;
+                var form = me.down('form');
+                return form.getConfig();
+            }
+        });
+        legendEditor.show();
+    }
+}); 

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

@@ -63,4 +63,22 @@
     background-position-y: 2px !important;
     background-position-x: 0 !important;
 	background-image: url(../images/icons/line-chart.png) !important;
+}
+.chartarea-trigger-icon {
+	background-repeat: no-repeat !important;
+    background-position-y: 2px !important;
+    background-position-x: 0 !important;
+	background-image: url(../images/icons/chart-area.png) !important;
+}
+.xaxis-trigger-icon {
+	background-repeat: no-repeat !important;
+    background-position-y: 2px !important;
+    background-position-x: 0 !important;
+	background-image: url(../images/icons/xaxis.png) !important;
+}
+.yaxis-trigger-icon {
+	background-repeat: no-repeat !important;
+    background-position-y: 2px !important;
+    background-position-x: 0 !important;
+	background-image: url(../images/icons/yaxis.png) !important;
 }

二進制
kanban-console/src/main/webapp/resources/images/icons/chart-area.png


二進制
kanban-console/src/main/webapp/resources/images/icons/xaxis.png


二進制
kanban-console/src/main/webapp/resources/images/icons/yaxis.png


File diff suppressed because it is too large
+ 0 - 0
kanban-console/src/main/webapp/resources/js/boardshow/main.bundle.js


File diff suppressed because it is too large
+ 0 - 0
kanban-console/src/main/webapp/resources/lib/boardshow/vendor.js


Some files were not shown because too many files changed in this diff