|
|
@@ -0,0 +1,406 @@
|
|
|
+function converter(data) {
|
|
|
+ let { content } = data;
|
|
|
+ let { title, items } = content;
|
|
|
+ let itemsarr = items ? (items instanceof Array ? items : [items]) : [];
|
|
|
+
|
|
|
+ let me = this;
|
|
|
+ let newItems = itemsarr.map(function (v, i) {
|
|
|
+ let type = v.type;
|
|
|
+ if (type == 'form') {
|
|
|
+ return formConfig(v);
|
|
|
+ } else if (type == 'table') {
|
|
|
+ return tableConfig(v);
|
|
|
+ } else if (type == 'bar') {
|
|
|
+ return barConfig(v);
|
|
|
+ } else if (type == 'line') {
|
|
|
+ return lineConfig(v);
|
|
|
+ } else if (type == 'pie') {
|
|
|
+ return pieConfig(v);
|
|
|
+ } else {
|
|
|
+
|
|
|
+ }
|
|
|
+ });
|
|
|
+ return {
|
|
|
+ title: titleConfig(title),
|
|
|
+ content: {
|
|
|
+ items: newItems
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+function titleConfig(title) {
|
|
|
+ return {
|
|
|
+ title: replaceSpecTag(title),
|
|
|
+ fontSize: getFontSize()
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+function formConfig(model) {
|
|
|
+ let { type, config, layout } = model;
|
|
|
+ let { fontSize, header, fieldStyle, valueStyle, columns, data } = config;
|
|
|
+ data = data ? ( ( data instanceof Array ) ? data : [data] ) : [];
|
|
|
+ data = data.map((d) => {
|
|
|
+ d.field = {
|
|
|
+ text: d.field.text,
|
|
|
+ style: parseStyleStr(d.field.style)
|
|
|
+ };
|
|
|
+ d.value = {
|
|
|
+ text: d.value.text,
|
|
|
+ style: parseStyleStr(d.value.style)
|
|
|
+ };
|
|
|
+ d.render = renderFunction(d.render);
|
|
|
+ return d;
|
|
|
+ });
|
|
|
+ if(header) {
|
|
|
+ header.style = parseStyleStr(header.style || '{}');
|
|
|
+ }
|
|
|
+ let c = {
|
|
|
+ type: 'form',
|
|
|
+ config: {
|
|
|
+ fontSize: fontSize || getFontSize(),
|
|
|
+ header: header,
|
|
|
+ fieldStyle: parseStyleStr(fieldStyle),
|
|
|
+ valueStyle: parseStyleStr(valueStyle),
|
|
|
+ columns,
|
|
|
+ data
|
|
|
+ },
|
|
|
+ layout: getLayout(layout)
|
|
|
+ }
|
|
|
+ return c;
|
|
|
+}
|
|
|
+
|
|
|
+function tableConfig(model) {
|
|
|
+ let { type, config, layout } = model;
|
|
|
+ let { fontSize, title, cls, render, columns, data, pagesize, interval, headerrowsstyle, rowsstyle } = config;
|
|
|
+ let allWidth = 0;
|
|
|
+ columns = columns ? ( ( columns instanceof Array ) ? columns : [columns] ) : [];
|
|
|
+ columns.map((c, i) => allWidth += (c.width || 100));
|
|
|
+ data = data ? ( ( data instanceof Array ) ? data : [data] ) : [];
|
|
|
+ if(title) {
|
|
|
+ title.style = parseStyleStr(title.style || '{}');
|
|
|
+ }
|
|
|
+ return {
|
|
|
+ type: 'table',
|
|
|
+ config: {
|
|
|
+ fontSize: fontSize || getFontSize(),
|
|
|
+ pageSize: pagesize,
|
|
|
+ refreshInterval: interval,
|
|
|
+ title: title,
|
|
|
+ render: renderFunction(render),
|
|
|
+ columns: columns.map( (v, i) => {
|
|
|
+ v.key = i;
|
|
|
+ v.width ? v.width = getScreenSize().width * (layout.w/100) * (v.width/ allWidth) : '';
|
|
|
+ v.render = renderFunction(v.render);
|
|
|
+ v.headerRowStyle = parseStyleStr(v.headerrowstyle);
|
|
|
+ v.rowStyle = parseStyleStr(v.rowstyle);
|
|
|
+ return v;
|
|
|
+ }),
|
|
|
+ data: data.map( (v, i) => {
|
|
|
+ if(v){
|
|
|
+ v.key = i;
|
|
|
+ }
|
|
|
+ return v || {};
|
|
|
+ } ),
|
|
|
+ headerRowsStyle: parseStyleStr(headerrowsstyle),
|
|
|
+ rowsStyle: parseStyleStr(rowsstyle),
|
|
|
+ },
|
|
|
+ layout: getLayout(layout)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+function barConfig(model) {
|
|
|
+ let { type, config, layout } = model;
|
|
|
+ let { fontSize, title, subtitle, xtitle, xtype, xfields, ytitle, ytype, yfields, series } = config;
|
|
|
+ let xf = (xfields instanceof Array) ? xfields : (xfields.replace(['['], '').replace([']'], '').split(','));
|
|
|
+ return {
|
|
|
+ type: 'charts',
|
|
|
+ config: {
|
|
|
+ option: {
|
|
|
+ title: getChartsTitle(fontSize, layout, title, subtitle),
|
|
|
+ tooltip: {
|
|
|
+ trigger: 'axis',
|
|
|
+ axisPointer: {
|
|
|
+ type: 'shadow'
|
|
|
+ }
|
|
|
+ },
|
|
|
+ grid: {
|
|
|
+ top: layout.h * getScreenSize().height / 100 < 310 ? '35%' : '28%',
|
|
|
+ bottom: layout.h * getScreenSize().height / 100 < 310 ? '20%' : '16%',
|
|
|
+ },
|
|
|
+ legend: {
|
|
|
+ top: layout.h * getScreenSize().height / 100 < 310 ? '20%' : '18%',
|
|
|
+ right: '5%',
|
|
|
+ padding: 0,
|
|
|
+ orient: 'horizontal',
|
|
|
+ itemGap: layout.w,
|
|
|
+ data: series.map((v, i) => {
|
|
|
+ return v.name
|
|
|
+ })
|
|
|
+ },
|
|
|
+ xAxis: [{
|
|
|
+ type: xtype,
|
|
|
+ data: xf,
|
|
|
+ name: xtitle,
|
|
|
+ nameGap: 5,
|
|
|
+ nameRotate: 270,
|
|
|
+ nameLocation: 'end',
|
|
|
+ axisLabel: {
|
|
|
+ rotate: getScreenSize().width * layout.w / xf.length / 100 < 80 ? 45 : 0,
|
|
|
+ interval: 0
|
|
|
+ }
|
|
|
+ }],
|
|
|
+ yAxis: [{
|
|
|
+ name: ytitle,
|
|
|
+ nameRotate: .1,
|
|
|
+ type: ytype == 'numeric' ? 'value' : ytype,
|
|
|
+ }],
|
|
|
+ series: getBarSeries(fontSize, layout, series)
|
|
|
+ }
|
|
|
+ },
|
|
|
+ layout: getLayout(layout)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+function lineConfig(model) {
|
|
|
+ let { type, config, layout } = model;
|
|
|
+ let { fontSize, title, subtitle, xtitle, xtype, xfields, ytitle, ytype, yfields, series } = config;
|
|
|
+ let xf = (xfields instanceof Array) ? xfields : (xfields.replace(['['], '').replace([']'], '').split(','));
|
|
|
+ return {
|
|
|
+ type: 'charts',
|
|
|
+ config: {
|
|
|
+ option: {
|
|
|
+ title: getChartsTitle(fontSize, layout, title, subtitle),
|
|
|
+ tooltip: {
|
|
|
+ trigger: 'axis'
|
|
|
+ },
|
|
|
+ grid: {
|
|
|
+ top: layout.h * getScreenSize().height / 100 < 310 ? '35%' : '28%',
|
|
|
+ bottom: layout.h * getScreenSize().height / 100 < 310 ? '20%' : '16%',
|
|
|
+ },
|
|
|
+ legend: {
|
|
|
+ top: layout.h * getScreenSize().height / 100 < 310 ? '20%' : '18%',
|
|
|
+ right: '5%',
|
|
|
+ padding: 0,
|
|
|
+ orient: 'horizontal',
|
|
|
+ itemGap: layout.w,
|
|
|
+ data: series.map((v, i) => {
|
|
|
+ return v.name
|
|
|
+ })
|
|
|
+ },
|
|
|
+ xAxis: [{
|
|
|
+ type: xtype,
|
|
|
+ data: xf,
|
|
|
+ name: xtitle,
|
|
|
+ nameRotate: 270,
|
|
|
+ nameLocation: 'end',
|
|
|
+ nameGap: 5,
|
|
|
+ axisLabel: {
|
|
|
+ rotate: getScreenSize().width * layout.w / xf.length / 100 < 80 ? 45 : 0,
|
|
|
+ interval: 0
|
|
|
+ }
|
|
|
+ }],
|
|
|
+ yAxis: [{
|
|
|
+ name: ytitle,
|
|
|
+ nameRotate: .1,
|
|
|
+ type: ytype == 'numeric' ? 'value' : ytype
|
|
|
+ }],
|
|
|
+ series: getLineSeries(fontSize, series),
|
|
|
+ dataZoom: [
|
|
|
+ {
|
|
|
+ type: 'slider',
|
|
|
+ show: false,
|
|
|
+ xAxisIndex: [0],
|
|
|
+ start: 0,
|
|
|
+ endValue: Math.round(getScreenSize().width * layout.w / 100 / 60) >= series[0].data.length ? series[0].data.length - 1 : Math.round(getScreenSize().width * layout.w / 100 / 60),
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ }
|
|
|
+ },
|
|
|
+ layout: getLayout(layout)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+function pieConfig(model) {
|
|
|
+ let { type, config, layout } = model;
|
|
|
+ let { fontSize, title, subtitle, series } = config;
|
|
|
+ series = series.map((v, i) => {
|
|
|
+ v.value = v.data;
|
|
|
+ return v;
|
|
|
+ });
|
|
|
+ return {
|
|
|
+ type: 'charts',
|
|
|
+ config: {
|
|
|
+ option: {
|
|
|
+ title: getChartsTitle(fontSize, layout, title, subtitle),
|
|
|
+ tooltip: {
|
|
|
+ trigger: 'item',
|
|
|
+ formatter: '{b} : {c} ({d}%)'
|
|
|
+ },
|
|
|
+ legend: getPieLegend(fontSize, layout, series),
|
|
|
+ series: getPieSeries(fontSize, layout, series)
|
|
|
+ }
|
|
|
+ },
|
|
|
+ layout: getLayout(layout)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+function renderFunction(funcStr) {
|
|
|
+ let func = undefined;
|
|
|
+ func = (new Function("return " + funcStr))();
|
|
|
+ return func;
|
|
|
+}
|
|
|
+
|
|
|
+function getChartsTitle(fontSize, layout, title, subtitle) {
|
|
|
+ var title = {
|
|
|
+ show: true,
|
|
|
+ text: title,
|
|
|
+ subtext: layout.h * getScreenSize().height / 100 < 300 ? '' : subtitle,
|
|
|
+ textAlign: 'center',
|
|
|
+ textStyle: {
|
|
|
+ verticalAlign: 'top'
|
|
|
+ },
|
|
|
+ subtextStyle: {
|
|
|
+ verticalAlign: 'top'
|
|
|
+ },
|
|
|
+ left: '50%',
|
|
|
+ right: '50%',
|
|
|
+ itemGap: 5,
|
|
|
+ padding: 10
|
|
|
+ }
|
|
|
+ return title;
|
|
|
+}
|
|
|
+
|
|
|
+function getBarSeries(fontSize, layout, series) {
|
|
|
+ let s = [];
|
|
|
+ const model = {
|
|
|
+ type: 'bar',
|
|
|
+ label: {
|
|
|
+ normal: {
|
|
|
+ show: true,
|
|
|
+ position: 'top',
|
|
|
+ formatter: '{c}',
|
|
|
+ }
|
|
|
+ },
|
|
|
+ barGap: 0
|
|
|
+ }
|
|
|
+ s = series.map((v, i) => {
|
|
|
+ let m = Object.assign({}, model);
|
|
|
+ m.name = v.name;
|
|
|
+ m.data = v.data instanceof Array ? v.data : [v.data];
|
|
|
+ return m;
|
|
|
+ });
|
|
|
+ return s;
|
|
|
+}
|
|
|
+
|
|
|
+function getLineSeries(fontSize, series) {
|
|
|
+ let s = [];
|
|
|
+ const model = {
|
|
|
+ type: 'line',
|
|
|
+ smooth: false,
|
|
|
+ markLine: {
|
|
|
+ symbol: '',
|
|
|
+ label: {
|
|
|
+ normal: {
|
|
|
+ show: false
|
|
|
+ }
|
|
|
+ },
|
|
|
+ data: [{
|
|
|
+ name: '起始位置',
|
|
|
+ yAxis: null,
|
|
|
+ xAxis: ''
|
|
|
+ }]
|
|
|
+ },
|
|
|
+ label: {
|
|
|
+ normal: {
|
|
|
+ show: true,
|
|
|
+ position: 'inside',
|
|
|
+ formatter: '{c}'
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ s = series.map((v, i) => {
|
|
|
+ let m = Object.assign({}, model);
|
|
|
+ m.name = v.name;
|
|
|
+ m.data = v.data instanceof Array ? v.data : [v.data];
|
|
|
+ return m;
|
|
|
+ });
|
|
|
+ return s;
|
|
|
+}
|
|
|
+
|
|
|
+function getPieSeries(fontSize, layout, series) {
|
|
|
+ let data = series instanceof Array ? series : [series];
|
|
|
+ const model = {
|
|
|
+ type: 'pie',
|
|
|
+ label: {
|
|
|
+ normal: {
|
|
|
+ formatter: '{b}: {c} \n {d}%'
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ let s = Object.assign({}, model);
|
|
|
+ s.name = '';
|
|
|
+ s.data = data.map((d, i) => { d.name = d.name || 'Unkonw'; return d; });
|
|
|
+ return [s];
|
|
|
+}
|
|
|
+
|
|
|
+function getPieLegend(fontSize, layout, series) {
|
|
|
+ let legend = {
|
|
|
+ padding: 0,
|
|
|
+ itemGap: layout.w / 10,
|
|
|
+ data: series.map((v, i) => {
|
|
|
+ return v.name || 'Unkonw';
|
|
|
+ })
|
|
|
+ }
|
|
|
+ return legend;
|
|
|
+}
|
|
|
+
|
|
|
+function getLayout(layout) {
|
|
|
+ let l = {};
|
|
|
+ for (let k in layout) {
|
|
|
+ l[k] = layout[k] / 10
|
|
|
+ }
|
|
|
+ return l;
|
|
|
+}
|
|
|
+
|
|
|
+function parseStyleStr(str) {
|
|
|
+ if (!str) {
|
|
|
+ return {};
|
|
|
+ }
|
|
|
+ if (typeof str == 'object') {
|
|
|
+ return str;
|
|
|
+ }else {
|
|
|
+ return JSON.parse(str);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+function replaceSpecTag(str) {
|
|
|
+ if (str) {
|
|
|
+ if (typeof (str) === 'string') {
|
|
|
+ return str.replace(/&/g, '&')
|
|
|
+ .replace(/</g, '<')
|
|
|
+ .replace(/>/g, '>')
|
|
|
+ .replace(/'/g, '\'')
|
|
|
+ .replace(/"/g, '"')
|
|
|
+ .replace(/ /g, ' ');
|
|
|
+ } else {
|
|
|
+ return str;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ return str;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+function getScreenSize() {
|
|
|
+ let root = document.getElementById('root');
|
|
|
+ let height = root.offsetHeight;
|
|
|
+ let width = root.offsetWidth;
|
|
|
+ return { height, width };
|
|
|
+}
|
|
|
+
|
|
|
+function getFontSize() {
|
|
|
+ let { height, width } = getScreenSize();
|
|
|
+ let fontSize = width / 300 * 2 + 16 + Math.round(width / 1000) * 2;
|
|
|
+ return fontSize;
|
|
|
+}
|
|
|
+
|
|
|
+export { converter };
|