Bläddra i källkod

折线图区域填充效果实现

zhuth 7 år sedan
förälder
incheckning
ce8ff32fb6

+ 4 - 1
.gitignore

@@ -52,4 +52,7 @@ buildNumber.properties
 .mvn/timing.properties
 
 # Avoid ignoring Maven wrapper jar file (.jar files are usually ignored)
-!/.mvn/wrapper/maven-wrapper.jar
+!/.mvn/wrapper/maven-wrapper.jar
+
+# other
+kanban-console/.factorypath

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

@@ -6,9 +6,9 @@ Ext.define('erp.controller.board', {
     'boardmodel.elementdetailgrid','boardmodel.detailpropertiesgrid','component.commonpanel','component.formcomponent',
 	'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.LegendTrigger', 'core.trigger.PieTrigger', 'core.trigger.ColorPoolTrigger', 'core.trigger.ColorPicker', 'core.trigger.LineAreaStyleTrigger',
 	'core.trigger.BarTrigger', 'core.trigger.LineTrigger', 'core.trigger.ChartAreaTrigger', 'core.trigger.XAxisTrigger', 'core.trigger.YAxisTrigger',
-	'core.field.FileField', 'boardmodel.LogoWin'
+	'core.trigger.DoubleColorPoolTrigger', 'boardmodel.modelbackupgrid', 'core.field.FileField', 'boardmodel.LogoWin'
     ],
     stores:['component'],
     init:function(){

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

@@ -0,0 +1,232 @@
+/**
+ * chart取色池设置-两个值
+ */
+Ext.define('erp.view.core.trigger.DoubleColorPoolTrigger', {
+    extend: 'Ext.form.field.Trigger',
+    alias: 'widget.doublecolorpooltrigger',
+    triggerCls: 'colorpool-trigger-icon',
+    onTriggerClick: function () {
+        var trigger = this;
+        try {
+            var arr = Ext.JSON.decode(trigger.getValue() || '[]');
+            if(!(arr instanceof Array)) {
+            	showErrorMsg('失败', '格式有误!');
+            	return;
+            }
+            var success = true;
+            Ext.Array.each(arr, function(a) {
+            	if(!isColorValue(a[0]) || !isColorValue(a[1])) {
+            		success = false;
+            	}
+            });
+            if(!success) {
+            	showErrorMsg('失败', '格式有误!');
+            	return;
+            }
+        }catch(e) {
+            showErrorMsg('失败', '格式有误!');
+            return;
+        }
+        var legendEditor = Ext.create('Ext.window.Window', {
+            field: trigger,
+            title: trigger.fieldLabel,
+            width: 320,
+            height: 320,
+            modal: true,
+            cls: 'x-colorpool-window',
+            layout: 'border',
+            items: [{
+                xtype: 'grid',
+                region: 'center',
+                store: Ext.create('Ext.data.JsonStore', {
+                    fields: ['startColor', 'endColor'],
+                    data: []
+                }),
+                autoScroll: true,
+                forceFit: true,
+                columnLines: true,
+//                hideHeaders: true,
+                columns: [{
+                    xtype: 'rownumberer'
+                }, {
+                    text: '起始颜色',
+                    dataIndex: 'startColor',
+                    editor: 'colorpicker',
+                    renderer: function(value,a) {
+                    	if(!value) {
+                    		return '';
+                    	}
+                    	var RgbValue = color2Rgb(value);
+                    	var fontColor = isDeepColor(RgbValue) ? 'white' : 'black';
+                    	
+                    	a.style += ' background-color:'+value+';color:'+fontColor+';';
+                    	return value;
+                    }
+                }, {
+                	text: '结束颜色',
+                    dataIndex: 'endColor',
+                    editor: 'colorpicker',
+                    renderer: function(value,a) {
+                    	if(!value) {
+                    		return '';
+                    	}
+                    	var RgbValue = color2Rgb(value);
+                    	var fontColor = isDeepColor(RgbValue) ? 'white' : 'black';
+                    	
+                    	a.style += ' background-color:'+value+';color:'+fontColor+';';
+                    	return value;
+                    }
+                }],
+                plugins: [
+                    Ext.create('Ext.grid.plugin.CellEditing', {
+                        clicksToEdit: 2
+                    })
+                ],
+				listeners: {
+					afterrender: function() {
+						var win = document.getElementsByClassName('x-colorpool-window')[0];
+						var body = win.getElementsByClassName('x-window-body')[0];
+						var panel = body.getElementsByClassName('x-panel')[0];
+						
+						// 使colorpicker可以超出容器显示
+						body.style.overflow = 'visible';
+						panel.style.overflow = 'visible';
+					},
+					validateedit: function(editor, e) {
+						if(e.value != '' && !isColorValue(e.value)) {
+							showErrorMsg('警告', '这不是一个有效的颜色值!');
+							e.cancel = true;
+						}
+					}
+				},
+                rbar: [{
+                    xtype: 'button',
+                    text: '添加',
+                    handler: function (btn) {
+                    	var grid = btn.ownerCt.ownerCt;
+                    	grid.getStore().add({
+                    		startColor: '',
+                    		endColor: ''
+                    	});
+                    	grid.getPlugin().startEditByPosition({ row: grid.getStore().getCount() - 1, column: 1 });
+                    }
+                }, {
+                    xtype: 'button',
+                    text: '删除',
+                    handler: function (btn) {
+                        var grid = btn.ownerCt.ownerCt;
+	                    var record = grid.getSelectionModel().getSelection()[0];
+	                    grid.getStore().remove(record);
+                    }
+                },'->', {
+                	xtype: 'button',
+                	text: '说明',
+                    iconCls: 'x-info-icon',
+                    tooltip: '图形优先从该色池中取色,未定义的项再从默认色池中取,支持多种色值格式'
+                }],
+                load: function () {
+                    var grid = this;
+                    var params = me.paramRecord.get('optionalValues') || [];
+                    var record = params.map(function (p) {
+                        return {
+                        	endColor: p[0],
+                            endColor: p[1]
+                        }
+                    });
+                    grid.getStore().loadData(record);
+                },
+                getConfig: function () {
+                    var grid = this;
+                    var config = [];
+                    Ext.Array.each(grid.getStore().data.items, function(item) {
+                    	if(item.data.startColor && item.data.endColor) {
+                    		config.push([item.data.startColor, item.data.endColor]);
+                    	}
+                    });
+                    return config;
+                }
+            }],
+            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 grid = me.down('grid');
+                var configObj = Ext.JSON.decode(configStr || '[]');
+                Ext.Array.each(configObj, function(obj) {
+                	grid.getStore().add({
+                		startColor: obj[0],
+                		endColor: obj[1]
+                	});
+                });
+            },
+            getConfig: function () {
+                var me = this;
+                var grid = me.down('grid');
+                return grid.getConfig();
+            }
+        });
+        legendEditor.show();
+    }
+});

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

@@ -0,0 +1,184 @@
+/**
+ * line-areaStyle设置
+ */
+Ext.define('erp.view.core.trigger.LineAreaStyleTrigger', {
+    extend: 'Ext.form.field.Trigger',
+    alias: 'widget.lineareastyletrigger',
+    triggerCls: 'linearea-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: 360,
+            height:320,
+            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: 'type',
+                	listConfig: {
+                        maxHeight: 120
+                    },
+                    store: Ext.create('Ext.data.Store', {
+                        fields: ['value', 'name'],
+                        data : [
+                        	{ name: '无', value: 'null' },
+                            { name: '横向', value: 'horizontal' },
+                        	{ name: '纵向', value: 'vertical' }
+                        ]
+                    }),
+                    queryMode: 'local',
+                    displayField: 'name',
+                    valueField: 'value',
+                    emptyText: '无',
+                    listeners: {
+                    	change: function(f, v) {
+                    		var form = f.up('form');
+                			var colorField = form.getForm().findField('color');
+                			var colorsField = form.getForm().findField('colors');
+                			
+                    		if(v == 'null') {
+                    			colorsField.setValue(null);
+                    			colorField.setVisible(true);
+                    			colorsField.setVisible(false);
+                    		}else {
+                    			colorField.setValue(null);
+                    			colorField.setVisible(false);
+                    			colorsField.setVisible(true);
+                    		}
+                    	}
+                    }
+				}, {
+                    xtype: 'colorpooltrigger',
+                    fieldLabel: '<font title="为每条折线设置单独的填充色,默认取折线颜色">颜色</font>',
+                    name: 'color',
+                    emptyText: 'auto'
+                }, {
+                    xtype: 'doublecolorpooltrigger',
+                    fieldLabel: '<font title="为每条折线设置单独的填充色(包括渐变的起止颜色),默认取折线颜色">颜色</font>',
+                    hidden: true,
+                    name: 'colors',
+                    emptyText: 'auto'
+                }, {
+                	xtype: 'numberfield',
+                	fieldLabel: '透明度',
+                    name: 'opacity',
+                    minValue: 0,
+                    maxValue: 1,
+                    step: 0.1,
+                    emptyText: '1'
+                }],
+                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();
+    }
+}); 

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

@@ -60,6 +60,10 @@ Ext.define('erp.view.core.trigger.LineTrigger', {
                 	fieldLabel: '<font title="线条将平滑转折">平滑线条</font>',
                 	name: 'smooth',
                 	inputValue: true
+                }, {
+                	xtype: 'lineareastyletrigger',
+                	fieldLabel: '区域填充',
+                	name: 'areaStyle'
                 }, {
                 	xtype: 'checkbox',
                 	fieldLabel: '隐藏标注图形',

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

@@ -82,6 +82,12 @@
     background-position-x: 0 !important;
 	background-image: url(../images/icons/yaxis.png) !important;
 }
+.linearea-trigger-icon {
+	background-repeat: no-repeat !important;
+    background-position-y: 2px !important;
+    background-position-x: 0 !important;
+	background-image: url(../images/icons/line-area.png) !important;
+}
 .x-logo-item {
 	width:100%;
 	height:80px;

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


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
kanban-console/src/main/webapp/resources/js/boardshow/main.bundle.js


Vissa filer visades inte eftersom för många filer har ändrats