@gisce/ooui 0.6.7 → 0.6.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Char.d.ts +3 -3
- package/dist/Char.js +0 -4
- package/dist/Char.js.map +1 -1
- package/dist/Graph/processor/graphProcessor.d.ts +17 -6
- package/dist/Graph/processor/graphProcessor.js +80 -92
- package/dist/Graph/processor/graphProcessor.js.map +1 -1
- package/package.json +1 -1
- package/src/Char.ts +3 -3
- package/src/Graph/processor/graphProcessor.ts +97 -83
- package/src/spec/graphProcessor.spec.ts +247 -90
package/dist/Char.d.ts
CHANGED
|
@@ -12,9 +12,9 @@ declare class Char extends Field {
|
|
|
12
12
|
/**
|
|
13
13
|
* Field size
|
|
14
14
|
*/
|
|
15
|
-
_size: number;
|
|
16
|
-
get size(): number;
|
|
17
|
-
set size(value: number);
|
|
15
|
+
_size: number | undefined;
|
|
16
|
+
get size(): number | undefined;
|
|
17
|
+
set size(value: number | undefined);
|
|
18
18
|
_isPassword: boolean;
|
|
19
19
|
get isPassword(): boolean;
|
|
20
20
|
set isPassword(value: boolean);
|
package/dist/Char.js
CHANGED
package/dist/Char.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Char.js","sourceRoot":"","sources":["../src/Char.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,OAAO,KAAK,MAAM,SAAS,CAAC;AAE5B;;GAEG;AACH;IAAmB,wBAAK;IAuCtB,cAAY,KAAU;QAAtB,YACE,kBAAM,KAAK,CAAC,SAgBb;QAvDD;;WAEG;QACH,kBAAY,GAAW,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"Char.js","sourceRoot":"","sources":["../src/Char.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,OAAO,KAAK,MAAM,SAAS,CAAC;AAE5B;;GAEG;AACH;IAAmB,wBAAK;IAuCtB,cAAY,KAAU;QAAtB,YACE,kBAAM,KAAK,CAAC,SAgBb;QAvDD;;WAEG;QACH,kBAAY,GAAW,EAAE,CAAC;QAmB1B,iBAAW,GAAY,KAAK,CAAC;QAQ7B,mBAAa,GAAY,KAAK,CAAC;QAW7B,IAAI,KAAK,EAAE;YACT,IAAI,KAAK,CAAC,IAAI,EAAE;gBACd,KAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;aACzB;YAED,IAAI,KAAK,CAAC,QAAQ,EAAE;gBAClB,KAAI,CAAC,UAAU,GAAG,KAAK,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;aAC5D;YAED,IAAI,KAAK,CAAC,SAAS,EAAE;gBACnB,KAAI,CAAC,YAAY;oBACf,KAAK,CAAC,SAAS,KAAK,MAAM,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;aACzE;SACF;;IACH,CAAC;IAnDD,sBAAI,6BAAW;aAAf;YACE,OAAO,IAAI,CAAC,YAAY,CAAC;QAC3B,CAAC;aACD,UAAgB,KAAa;YAC3B,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC5B,CAAC;;;OAHA;IASD,sBAAI,sBAAI;aAAR;YACE,OAAO,IAAI,CAAC,KAAK,CAAC;QACpB,CAAC;aACD,UAAS,KAAyB;YAChC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACrB,CAAC;;;OAHA;IAMD,sBAAI,4BAAU;aAAd;YACE,OAAO,IAAI,CAAC,WAAW,CAAC;QAC1B,CAAC;aACD,UAAe,KAAc;YAC3B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QAC3B,CAAC;;;OAHA;IAMD,sBAAI,8BAAY;aAAhB;YACE,OAAO,IAAI,CAAC,aAAa,CAAC;QAC5B,CAAC;aACD,UAAiB,KAAc;YAC7B,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC7B,CAAC;;;OAHA;IAuBH,WAAC;AAAD,CAAC,AAzDD,CAAmB,KAAK,GAyDvB;AAED,eAAe,IAAI,CAAC"}
|
|
@@ -25,15 +25,21 @@ export declare const processGraphData: ({ ooui, values, fields, }: {
|
|
|
25
25
|
[key: string]: any;
|
|
26
26
|
};
|
|
27
27
|
}) => {
|
|
28
|
-
xField: string;
|
|
29
|
-
yFields: string[];
|
|
30
|
-
seriesFields: (string | undefined)[] | undefined;
|
|
31
|
-
isGroup: boolean;
|
|
32
|
-
isStack: boolean;
|
|
33
28
|
data: {
|
|
34
29
|
[key: string]: any;
|
|
35
30
|
}[];
|
|
31
|
+
isGroup: boolean;
|
|
32
|
+
isStack: boolean;
|
|
36
33
|
};
|
|
34
|
+
export declare function getValuesForYField({ entries, fieldName, fields, }: {
|
|
35
|
+
entries: {
|
|
36
|
+
[key: string]: any;
|
|
37
|
+
}[];
|
|
38
|
+
fieldName: string;
|
|
39
|
+
fields: {
|
|
40
|
+
[key: string]: any;
|
|
41
|
+
};
|
|
42
|
+
}): any[];
|
|
37
43
|
export declare function getValueForOperator({ operator, values, }: {
|
|
38
44
|
operator: Operator;
|
|
39
45
|
values: any[];
|
|
@@ -48,4 +54,9 @@ export declare function getValuesGroupedByField({ fieldName, fields, values, }:
|
|
|
48
54
|
};
|
|
49
55
|
}): GroupedValues;
|
|
50
56
|
export declare function getAllObjectsInGroupedValues(grouped: GroupedValues): any[];
|
|
51
|
-
export declare function getYAxisFieldname(
|
|
57
|
+
export declare function getYAxisFieldname({ yAxis, fields, }: {
|
|
58
|
+
yAxis: GraphYAxis;
|
|
59
|
+
fields: {
|
|
60
|
+
[key: string]: any;
|
|
61
|
+
};
|
|
62
|
+
}): string;
|
|
@@ -1,14 +1,3 @@
|
|
|
1
|
-
var __assign = (this && this.__assign) || function () {
|
|
2
|
-
__assign = Object.assign || function(t) {
|
|
3
|
-
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
4
|
-
s = arguments[i];
|
|
5
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
6
|
-
t[p] = s[p];
|
|
7
|
-
}
|
|
8
|
-
return t;
|
|
9
|
-
};
|
|
10
|
-
return __assign.apply(this, arguments);
|
|
11
|
-
};
|
|
12
1
|
var __read = (this && this.__read) || function (o, n) {
|
|
13
2
|
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
14
3
|
if (!m) return o;
|
|
@@ -41,112 +30,109 @@ export var labelsForOperator = {
|
|
|
41
30
|
};
|
|
42
31
|
export var processGraphData = function (_a) {
|
|
43
32
|
var ooui = _a.ooui, values = _a.values, fields = _a.fields;
|
|
33
|
+
// First we group all the results by the x field. This way we will have one or more items in an array for every occurrence of ooui.x.name
|
|
34
|
+
// Result of this will be an object which keys will be unique keys for values of ooui.x.name for each item
|
|
44
35
|
var valuesGroupedByX = getValuesGroupedByField({
|
|
45
36
|
fieldName: ooui.x.name,
|
|
46
37
|
values: values,
|
|
47
38
|
fields: fields,
|
|
48
39
|
});
|
|
49
|
-
var fieldsData = {
|
|
50
|
-
xField: ooui.x.name,
|
|
51
|
-
yFields: __spread(new Set(ooui.y.map(function (item) { return getYAxisFieldname(item); }))),
|
|
52
|
-
seriesFields: ooui.y.filter(function (yField) { return yField.label; }).length !== 0
|
|
53
|
-
? __spread(new Set(ooui.y.map(function (item) { return item.label; }))) : undefined,
|
|
54
|
-
isGroup: false,
|
|
55
|
-
isStack: false,
|
|
56
|
-
};
|
|
57
40
|
var data = [];
|
|
41
|
+
// We iterate through the y axis items found in the ooui object
|
|
58
42
|
ooui.y.forEach(function (yField) {
|
|
43
|
+
// We iterate now for every single key of the grouped results by x
|
|
59
44
|
Object.keys(valuesGroupedByX).forEach(function (xValue) {
|
|
60
|
-
var _a;
|
|
61
45
|
var xLabel = valuesGroupedByX[xValue].label;
|
|
62
46
|
var objectsForXValue = valuesGroupedByX[xValue].entries;
|
|
63
|
-
|
|
47
|
+
// If the y field hasn't got label defined
|
|
48
|
+
if (!yField.label) {
|
|
49
|
+
// We calculate the final value using the entries of this unique x key
|
|
50
|
+
var valuesForYField = getValuesForYField({
|
|
51
|
+
entries: objectsForXValue,
|
|
52
|
+
fields: fields,
|
|
53
|
+
fieldName: yField.name,
|
|
54
|
+
});
|
|
55
|
+
var finalValue = getValueForOperator({
|
|
56
|
+
values: valuesForYField,
|
|
57
|
+
operator: yField.operator,
|
|
58
|
+
});
|
|
59
|
+
data.push({
|
|
60
|
+
x: xLabel || false,
|
|
61
|
+
value: finalValue,
|
|
62
|
+
type: getYAxisFieldname({
|
|
63
|
+
yAxis: yField,
|
|
64
|
+
fields: fields,
|
|
65
|
+
}),
|
|
66
|
+
stacked: yField.stacked,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
// The field has label
|
|
70
|
+
else {
|
|
71
|
+
// We retrieve an object with unique keys and grouped values for the label
|
|
64
72
|
var valuesGroupedByYLabel_1 = getValuesGroupedByField({
|
|
65
73
|
fieldName: yField.label,
|
|
66
74
|
values: objectsForXValue,
|
|
67
75
|
fields: fields,
|
|
68
76
|
});
|
|
77
|
+
// For every key of the grouped results by label
|
|
69
78
|
Object.keys(valuesGroupedByYLabel_1).forEach(function (yUniqueValue) {
|
|
70
|
-
var _a;
|
|
71
79
|
var entries = valuesGroupedByYLabel_1[yUniqueValue].entries;
|
|
72
80
|
var label = valuesGroupedByYLabel_1[yUniqueValue].label;
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
fields: fields,
|
|
79
|
-
});
|
|
80
|
-
})
|
|
81
|
-
.map(function (_a) {
|
|
82
|
-
var value = _a.value, label = _a.label;
|
|
83
|
-
return label;
|
|
81
|
+
// We calculate the final value using the entries of this unique x key
|
|
82
|
+
var valuesForYField = getValuesForYField({
|
|
83
|
+
entries: entries,
|
|
84
|
+
fields: fields,
|
|
85
|
+
fieldName: yField.name,
|
|
84
86
|
});
|
|
85
87
|
var finalValue = getValueForOperator({
|
|
86
88
|
values: valuesForYField,
|
|
87
89
|
operator: yField.operator,
|
|
88
90
|
});
|
|
89
|
-
data.push(
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
else {
|
|
97
|
-
var valuesForYField = objectsForXValue
|
|
98
|
-
.map(function (obj) {
|
|
99
|
-
return getValueAndLabelForField({
|
|
100
|
-
fieldName: yField.name,
|
|
101
|
-
values: obj,
|
|
102
|
-
fields: fields,
|
|
91
|
+
data.push({
|
|
92
|
+
x: xLabel || false,
|
|
93
|
+
value: finalValue,
|
|
94
|
+
type: label,
|
|
95
|
+
stacked: yField.stacked,
|
|
103
96
|
});
|
|
104
|
-
})
|
|
105
|
-
.map(function (_a) {
|
|
106
|
-
var value = _a.value, label = _a.label;
|
|
107
|
-
return label;
|
|
108
|
-
});
|
|
109
|
-
var finalValue = getValueForOperator({
|
|
110
|
-
values: valuesForYField,
|
|
111
|
-
operator: yField.operator,
|
|
112
97
|
});
|
|
113
|
-
data.push((_a = {},
|
|
114
|
-
_a[ooui.x.name] = xLabel || false,
|
|
115
|
-
_a[getYAxisFieldname(yField)] = finalValue,
|
|
116
|
-
_a));
|
|
117
98
|
}
|
|
118
99
|
});
|
|
119
100
|
});
|
|
120
|
-
//
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
return
|
|
131
|
-
}
|
|
132
|
-
return
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
}
|
|
140
|
-
else if (yFieldsWithLabel === 1 && yFieldsWithStacked === 1) {
|
|
141
|
-
fieldsData.isGroup = false;
|
|
142
|
-
fieldsData.isStack = true;
|
|
143
|
-
}
|
|
144
|
-
else if (yFieldsWithLabel > 1 && yFieldsWithStacked > 1) {
|
|
145
|
-
fieldsData.isGroup = true;
|
|
146
|
-
fieldsData.isStack = true;
|
|
147
|
-
}
|
|
148
|
-
return __assign({ data: data }, fieldsData);
|
|
101
|
+
// Check if we have to flag isGroup
|
|
102
|
+
var isGroup = ooui.y.some(function (y) { return y.label !== undefined; });
|
|
103
|
+
// Check if we have to flag
|
|
104
|
+
var isStack = data.some(function (entry) { return entry.stacked !== undefined; });
|
|
105
|
+
// We sort the data by x
|
|
106
|
+
var sortedData = data.sort(function (a, b) {
|
|
107
|
+
if (a["x"] < b["x"]) {
|
|
108
|
+
return -1;
|
|
109
|
+
}
|
|
110
|
+
if (a["x"] > b["x"]) {
|
|
111
|
+
return 1;
|
|
112
|
+
}
|
|
113
|
+
return 0;
|
|
114
|
+
});
|
|
115
|
+
return {
|
|
116
|
+
data: sortedData,
|
|
117
|
+
isGroup: isGroup,
|
|
118
|
+
isStack: isStack,
|
|
119
|
+
};
|
|
149
120
|
};
|
|
121
|
+
export function getValuesForYField(_a) {
|
|
122
|
+
var entries = _a.entries, fieldName = _a.fieldName, fields = _a.fields;
|
|
123
|
+
return entries
|
|
124
|
+
.map(function (obj) {
|
|
125
|
+
return getValueAndLabelForField({
|
|
126
|
+
fieldName: fieldName,
|
|
127
|
+
values: obj,
|
|
128
|
+
fields: fields,
|
|
129
|
+
});
|
|
130
|
+
})
|
|
131
|
+
.map(function (_a) {
|
|
132
|
+
var value = _a.value, label = _a.label;
|
|
133
|
+
return label;
|
|
134
|
+
});
|
|
135
|
+
}
|
|
150
136
|
export function getValueForOperator(_a) {
|
|
151
137
|
var operator = _a.operator, values = _a.values;
|
|
152
138
|
switch (operator) {
|
|
@@ -208,10 +194,12 @@ export function getAllObjectsInGroupedValues(grouped) {
|
|
|
208
194
|
});
|
|
209
195
|
return totalObjects;
|
|
210
196
|
}
|
|
211
|
-
export function getYAxisFieldname(
|
|
212
|
-
|
|
213
|
-
|
|
197
|
+
export function getYAxisFieldname(_a) {
|
|
198
|
+
var yAxis = _a.yAxis, fields = _a.fields;
|
|
199
|
+
var fieldProps = fields[yAxis.name];
|
|
200
|
+
if (fieldProps && fieldProps.string) {
|
|
201
|
+
return fieldProps.string + " (" + labelsForOperator[yAxis.operator] + ")";
|
|
214
202
|
}
|
|
215
|
-
return
|
|
203
|
+
return yAxis.name + "_" + labelsForOperator[yAxis.operator];
|
|
216
204
|
}
|
|
217
205
|
//# sourceMappingURL=graphProcessor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graphProcessor.js","sourceRoot":"","sources":["../../../src/Graph/processor/graphProcessor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"graphProcessor.js","sourceRoot":"","sources":["../../../src/Graph/processor/graphProcessor.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/Char.ts
CHANGED
|
@@ -18,11 +18,11 @@ class Char extends Field {
|
|
|
18
18
|
/**
|
|
19
19
|
* Field size
|
|
20
20
|
*/
|
|
21
|
-
_size: number
|
|
22
|
-
get size(): number {
|
|
21
|
+
_size: number | undefined;
|
|
22
|
+
get size(): number | undefined {
|
|
23
23
|
return this._size;
|
|
24
24
|
}
|
|
25
|
-
set size(value: number) {
|
|
25
|
+
set size(value: number | undefined) {
|
|
26
26
|
this._size = value;
|
|
27
27
|
}
|
|
28
28
|
|
|
@@ -24,124 +24,129 @@ export const processGraphData = ({
|
|
|
24
24
|
values: { [key: string]: any }[];
|
|
25
25
|
fields: { [key: string]: any };
|
|
26
26
|
}) => {
|
|
27
|
+
// First we group all the results by the x field. This way we will have one or more items in an array for every occurrence of ooui.x.name
|
|
28
|
+
// Result of this will be an object which keys will be unique keys for values of ooui.x.name for each item
|
|
27
29
|
const valuesGroupedByX = getValuesGroupedByField({
|
|
28
30
|
fieldName: ooui.x.name,
|
|
29
31
|
values,
|
|
30
32
|
fields,
|
|
31
33
|
});
|
|
32
34
|
|
|
33
|
-
let fieldsData = {
|
|
34
|
-
xField: ooui.x.name,
|
|
35
|
-
yFields: [...new Set(ooui.y.map((item) => getYAxisFieldname(item)))],
|
|
36
|
-
seriesFields:
|
|
37
|
-
ooui.y.filter((yField) => yField.label).length !== 0
|
|
38
|
-
? [...new Set(ooui.y.map((item) => item.label))]
|
|
39
|
-
: undefined,
|
|
40
|
-
isGroup: false,
|
|
41
|
-
isStack: false,
|
|
42
|
-
};
|
|
43
|
-
|
|
44
35
|
const data: { [key: string]: any }[] = [];
|
|
45
36
|
|
|
37
|
+
// We iterate through the y axis items found in the ooui object
|
|
46
38
|
ooui.y.forEach((yField) => {
|
|
39
|
+
// We iterate now for every single key of the grouped results by x
|
|
47
40
|
Object.keys(valuesGroupedByX).forEach((xValue) => {
|
|
48
41
|
const xLabel = valuesGroupedByX[xValue].label;
|
|
49
42
|
const objectsForXValue = valuesGroupedByX[xValue].entries;
|
|
50
43
|
|
|
51
|
-
|
|
44
|
+
// If the y field hasn't got label defined
|
|
45
|
+
if (!yField.label) {
|
|
46
|
+
// We calculate the final value using the entries of this unique x key
|
|
47
|
+
const valuesForYField = getValuesForYField({
|
|
48
|
+
entries: objectsForXValue,
|
|
49
|
+
fields,
|
|
50
|
+
fieldName: yField.name,
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
const finalValue = getValueForOperator({
|
|
54
|
+
values: valuesForYField,
|
|
55
|
+
operator: yField.operator,
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
data.push({
|
|
59
|
+
x: xLabel || false,
|
|
60
|
+
value: finalValue,
|
|
61
|
+
type: getYAxisFieldname({
|
|
62
|
+
yAxis: yField,
|
|
63
|
+
fields,
|
|
64
|
+
}),
|
|
65
|
+
stacked: yField.stacked,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
// The field has label
|
|
69
|
+
else {
|
|
70
|
+
// We retrieve an object with unique keys and grouped values for the label
|
|
52
71
|
const valuesGroupedByYLabel = getValuesGroupedByField({
|
|
53
72
|
fieldName: yField.label,
|
|
54
73
|
values: objectsForXValue,
|
|
55
74
|
fields,
|
|
56
75
|
});
|
|
57
76
|
|
|
77
|
+
// For every key of the grouped results by label
|
|
58
78
|
Object.keys(valuesGroupedByYLabel).forEach((yUniqueValue) => {
|
|
59
79
|
const entries = valuesGroupedByYLabel[yUniqueValue].entries;
|
|
60
80
|
const label = valuesGroupedByYLabel[yUniqueValue].label;
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
.map(({ value, label }) => {
|
|
70
|
-
return label;
|
|
71
|
-
});
|
|
81
|
+
|
|
82
|
+
// We calculate the final value using the entries of this unique x key
|
|
83
|
+
const valuesForYField = getValuesForYField({
|
|
84
|
+
entries,
|
|
85
|
+
fields,
|
|
86
|
+
fieldName: yField.name,
|
|
87
|
+
});
|
|
88
|
+
|
|
72
89
|
const finalValue = getValueForOperator({
|
|
73
90
|
values: valuesForYField,
|
|
74
91
|
operator: yField.operator,
|
|
75
92
|
});
|
|
76
93
|
data.push({
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
[yField.label!]: label,
|
|
94
|
+
x: xLabel || false,
|
|
95
|
+
value: finalValue,
|
|
96
|
+
type: label,
|
|
97
|
+
stacked: yField.stacked,
|
|
82
98
|
});
|
|
83
99
|
});
|
|
84
|
-
} else {
|
|
85
|
-
const valuesForYField = objectsForXValue
|
|
86
|
-
.map((obj) => {
|
|
87
|
-
return getValueAndLabelForField({
|
|
88
|
-
fieldName: yField.name,
|
|
89
|
-
values: obj,
|
|
90
|
-
fields: fields,
|
|
91
|
-
});
|
|
92
|
-
})
|
|
93
|
-
.map(({ value, label }) => {
|
|
94
|
-
return label;
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
const finalValue = getValueForOperator({
|
|
98
|
-
values: valuesForYField,
|
|
99
|
-
operator: yField.operator,
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
data.push({
|
|
103
|
-
[ooui.x.name]: xLabel || false,
|
|
104
|
-
[getYAxisFieldname(yField)]: finalValue,
|
|
105
|
-
});
|
|
106
100
|
}
|
|
107
101
|
});
|
|
108
102
|
});
|
|
109
103
|
|
|
110
|
-
//
|
|
111
|
-
|
|
112
|
-
if (ooui.y.filter((yField) => yField.label).length === 0) {
|
|
113
|
-
const uniqueXkeys = [...new Set(data.map((item) => item[ooui.x.name]))];
|
|
114
|
-
const processedData = uniqueXkeys.map((key) => {
|
|
115
|
-
const mergedRecord = {};
|
|
116
|
-
const valuesForKey = data.filter((item) => item[ooui.x.name] === key);
|
|
117
|
-
valuesForKey.forEach((item) => {
|
|
118
|
-
Object.assign(mergedRecord, item);
|
|
119
|
-
});
|
|
120
|
-
return mergedRecord as { [key: string]: any };
|
|
121
|
-
});
|
|
122
|
-
return { data: processedData, ...fieldsData };
|
|
123
|
-
}
|
|
104
|
+
// Check if we have to flag isGroup
|
|
105
|
+
const isGroup = ooui.y.some((y) => y.label !== undefined);
|
|
124
106
|
|
|
125
|
-
|
|
126
|
-
const
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
}
|
|
107
|
+
// Check if we have to flag
|
|
108
|
+
const isStack = data.some((entry) => entry.stacked !== undefined);
|
|
109
|
+
|
|
110
|
+
// We sort the data by x
|
|
111
|
+
const sortedData = data.sort((a, b) => {
|
|
112
|
+
if (a["x"] < b["x"]) {
|
|
113
|
+
return -1;
|
|
114
|
+
}
|
|
115
|
+
if (a["x"] > b["x"]) {
|
|
116
|
+
return 1;
|
|
117
|
+
}
|
|
118
|
+
return 0;
|
|
119
|
+
});
|
|
138
120
|
|
|
139
121
|
return {
|
|
140
|
-
data,
|
|
141
|
-
|
|
122
|
+
data: sortedData,
|
|
123
|
+
isGroup,
|
|
124
|
+
isStack,
|
|
142
125
|
};
|
|
143
126
|
};
|
|
144
127
|
|
|
128
|
+
export function getValuesForYField({
|
|
129
|
+
entries,
|
|
130
|
+
fieldName,
|
|
131
|
+
fields,
|
|
132
|
+
}: {
|
|
133
|
+
entries: { [key: string]: any }[];
|
|
134
|
+
fieldName: string;
|
|
135
|
+
fields: { [key: string]: any };
|
|
136
|
+
}) {
|
|
137
|
+
return entries
|
|
138
|
+
.map((obj) => {
|
|
139
|
+
return getValueAndLabelForField({
|
|
140
|
+
fieldName: fieldName,
|
|
141
|
+
values: obj,
|
|
142
|
+
fields: fields,
|
|
143
|
+
});
|
|
144
|
+
})
|
|
145
|
+
.map(({ value, label }) => {
|
|
146
|
+
return label;
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
|
|
145
150
|
export function getValueForOperator({
|
|
146
151
|
operator,
|
|
147
152
|
values,
|
|
@@ -229,9 +234,18 @@ export function getAllObjectsInGroupedValues(grouped: GroupedValues) {
|
|
|
229
234
|
return totalObjects;
|
|
230
235
|
}
|
|
231
236
|
|
|
232
|
-
export function getYAxisFieldname(
|
|
233
|
-
|
|
234
|
-
|
|
237
|
+
export function getYAxisFieldname({
|
|
238
|
+
yAxis,
|
|
239
|
+
fields,
|
|
240
|
+
}: {
|
|
241
|
+
yAxis: GraphYAxis;
|
|
242
|
+
fields: { [key: string]: any };
|
|
243
|
+
}) {
|
|
244
|
+
const fieldProps = fields[yAxis.name];
|
|
245
|
+
|
|
246
|
+
if (fieldProps && fieldProps.string) {
|
|
247
|
+
return `${fieldProps.string} (${labelsForOperator[yAxis.operator]})`;
|
|
235
248
|
}
|
|
236
|
-
|
|
249
|
+
|
|
250
|
+
return yAxis.name + "_" + labelsForOperator[yAxis.operator];
|
|
237
251
|
}
|
|
@@ -103,151 +103,308 @@ describe("in getValuesGroupedByField method", () => {
|
|
|
103
103
|
|
|
104
104
|
describe("in processGraphData method", () => {
|
|
105
105
|
it("should do basic test with one y axis", () => {
|
|
106
|
-
const
|
|
106
|
+
const { data, isGroup, isStack } = getGraphData(
|
|
107
|
+
`<?xml version="1.0"?>
|
|
107
108
|
<graph type="pie">
|
|
108
109
|
<field name="llista_preu" axis="x"/>
|
|
109
110
|
<field name="llista_preu" operator="count" axis="y"/>
|
|
110
111
|
</graph>
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
if (!model) {
|
|
115
|
-
throw new Error("Model not found");
|
|
116
|
-
}
|
|
117
|
-
const values = model.data;
|
|
118
|
-
const fields = model.fields;
|
|
112
|
+
`,
|
|
113
|
+
"polissa"
|
|
114
|
+
);
|
|
119
115
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
values: values as any,
|
|
123
|
-
fields: fields as any,
|
|
124
|
-
});
|
|
116
|
+
expect(isGroup).toBe(false);
|
|
117
|
+
expect(isStack).toBe(false);
|
|
125
118
|
|
|
126
119
|
expect(data.length).toBe(6);
|
|
127
120
|
expect(
|
|
128
121
|
data.find(
|
|
129
122
|
(d) =>
|
|
130
|
-
d.
|
|
131
|
-
d.
|
|
123
|
+
d.x === "TARIFAS ELECTRICIDAD (EUR)" &&
|
|
124
|
+
d.value === 8 &&
|
|
125
|
+
d.type === "Tarifa Comercialitzadora (count)"
|
|
132
126
|
)
|
|
133
127
|
).toBeTruthy();
|
|
134
128
|
expect(
|
|
135
129
|
data.find(
|
|
136
|
-
(d) =>
|
|
130
|
+
(d) =>
|
|
131
|
+
d.x === "Adeu (CHF)" &&
|
|
132
|
+
d.value === 4 &&
|
|
133
|
+
d.type === "Tarifa Comercialitzadora (count)"
|
|
137
134
|
)
|
|
138
135
|
).toBeTruthy();
|
|
139
136
|
expect(
|
|
140
137
|
data.find(
|
|
141
138
|
(d) =>
|
|
142
|
-
d.
|
|
139
|
+
d.x === "Hola bipartit (EUR)" &&
|
|
140
|
+
d.value === 5 &&
|
|
141
|
+
d.type === "Tarifa Comercialitzadora (count)"
|
|
143
142
|
)
|
|
144
143
|
).toBeTruthy();
|
|
145
144
|
expect(
|
|
146
145
|
data.find(
|
|
147
146
|
(d) =>
|
|
148
|
-
d.
|
|
147
|
+
d.x === "Mucha potencia (EUR)" &&
|
|
148
|
+
d.value === 1 &&
|
|
149
|
+
d.type === "Tarifa Comercialitzadora (count)"
|
|
149
150
|
)
|
|
150
151
|
).toBeTruthy();
|
|
151
152
|
|
|
152
153
|
expect(
|
|
153
154
|
data.find(
|
|
154
|
-
(d) =>
|
|
155
|
+
(d) =>
|
|
156
|
+
d.x === "Hola (EUR)" &&
|
|
157
|
+
d.value === 13 &&
|
|
158
|
+
d.type === "Tarifa Comercialitzadora (count)"
|
|
155
159
|
)
|
|
156
160
|
).toBeTruthy();
|
|
157
161
|
|
|
158
162
|
expect(
|
|
159
|
-
data.find(
|
|
163
|
+
data.find(
|
|
164
|
+
(d) =>
|
|
165
|
+
d.x === false &&
|
|
166
|
+
d.value === 2 &&
|
|
167
|
+
d.type === "Tarifa Comercialitzadora (count)"
|
|
168
|
+
)
|
|
160
169
|
).toBeTruthy();
|
|
161
170
|
|
|
162
171
|
expect(
|
|
163
|
-
data.find(
|
|
172
|
+
data.find(
|
|
173
|
+
(d) =>
|
|
174
|
+
d.x === "random" &&
|
|
175
|
+
d.value === 15 &&
|
|
176
|
+
d.type === "Tarifa Comercialitzadora (count)"
|
|
177
|
+
)
|
|
164
178
|
).toBeUndefined();
|
|
165
179
|
|
|
166
180
|
expect(data).toBeTruthy();
|
|
167
181
|
});
|
|
168
|
-
|
|
169
|
-
|
|
182
|
+
|
|
183
|
+
it("should do basic test with one y axis with label", () => {
|
|
184
|
+
const { data, isGroup, isStack } = getGraphData(
|
|
185
|
+
`<?xml version="1.0"?>
|
|
170
186
|
<graph type="bar">
|
|
171
187
|
<field name="name" axis="x" />
|
|
172
|
-
<field name="consum" operator="+" axis="y"/>
|
|
173
|
-
<field name="ajust" operator="+" axis="y" />
|
|
188
|
+
<field name="consum" operator="+" label="periode" axis="y"/>
|
|
174
189
|
</graph>
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
expect(model).toBeDefined();
|
|
179
|
-
if (!model) {
|
|
180
|
-
throw new Error("Model not found");
|
|
181
|
-
}
|
|
182
|
-
const values = model.data;
|
|
183
|
-
const fields = model.fields;
|
|
190
|
+
`,
|
|
191
|
+
"lectura"
|
|
192
|
+
);
|
|
184
193
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
values: values as any,
|
|
188
|
-
fields: fields as any,
|
|
189
|
-
});
|
|
194
|
+
expect(isGroup).toBe(true);
|
|
195
|
+
expect(isStack).toBe(false);
|
|
190
196
|
|
|
191
|
-
expect(
|
|
192
|
-
|
|
193
|
-
expect(
|
|
194
|
-
expect(
|
|
195
|
-
expect(
|
|
196
|
-
|
|
197
|
-
expect(
|
|
198
|
-
expect(
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
expect(data.find((d) => d.name === "2020-06-30")).toBeTruthy();
|
|
203
|
-
const obj2 = data.find((d) => d.name === "2020-06-30")!;
|
|
204
|
-
expect(obj2.consum_sum).toBe(150);
|
|
205
|
-
expect(obj2.ajust_sum).toBe(0);
|
|
206
|
-
expect(data.find((d) => d.name === "2016-04-04")).toBeTruthy();
|
|
207
|
-
const obj3 = data.find((d) => d.name === "2016-04-04")!;
|
|
208
|
-
expect(obj3.consum_sum).toBe(15);
|
|
209
|
-
expect(obj3.ajust_sum).toBe(15);
|
|
197
|
+
expect(data.length).toBe(15);
|
|
198
|
+
const obj1 = data.find((d) => d.x === "2020-09-30")!;
|
|
199
|
+
expect(obj1).toBeTruthy();
|
|
200
|
+
expect(obj1.value).toBe(0);
|
|
201
|
+
expect(obj1.type).toBe("2.0A (P1)");
|
|
202
|
+
const obj2 = data.filter((d) => d.x === "2020-07-31")!;
|
|
203
|
+
expect(obj2).toBeTruthy();
|
|
204
|
+
expect(obj2.length).toBe(3);
|
|
205
|
+
expect(obj2.map((e) => e.type).toString()).toBe(
|
|
206
|
+
"2.0A (P1),2.0DHA (P1),2.0DHA (P2)"
|
|
207
|
+
);
|
|
210
208
|
});
|
|
211
|
-
|
|
212
|
-
|
|
209
|
+
|
|
210
|
+
it("should do basic test with one y axis with label and stacked", () => {
|
|
211
|
+
const { data, isGroup, isStack } = getGraphData(
|
|
212
|
+
`<?xml version="1.0"?>
|
|
213
213
|
<graph type="bar">
|
|
214
214
|
<field name="name" axis="x" />
|
|
215
|
-
<field name="consum" operator="+" label="periode" axis="y"/>
|
|
215
|
+
<field name="consum" operator="+" label="periode" stacked="periode" axis="y"/>
|
|
216
216
|
</graph>
|
|
217
|
-
|
|
217
|
+
`,
|
|
218
|
+
"lectura"
|
|
219
|
+
);
|
|
218
220
|
|
|
219
|
-
const model = models.find((m) => m.key === "lectura");
|
|
220
|
-
expect(model).toBeDefined();
|
|
221
|
-
if (!model) {
|
|
222
|
-
throw new Error("Model not found");
|
|
223
|
-
}
|
|
224
|
-
const values = model.data;
|
|
225
|
-
const fields = model.fields;
|
|
226
|
-
|
|
227
|
-
const { data, xField, yFields, seriesFields, isGroup } = processGraphData(
|
|
228
|
-
{
|
|
229
|
-
ooui: parsedGraph,
|
|
230
|
-
values: values as any,
|
|
231
|
-
fields: fields as any,
|
|
232
|
-
}
|
|
233
|
-
);
|
|
234
|
-
|
|
235
|
-
expect(xField).toBe("name");
|
|
236
|
-
expect(yFields!.length).toBe(1);
|
|
237
|
-
expect(yFields![0]).toBe("consum_sum");
|
|
238
|
-
expect(seriesFields!.length).toBe(1);
|
|
239
|
-
expect(seriesFields![0]).toBe("periode");
|
|
240
221
|
expect(isGroup).toBe(true);
|
|
222
|
+
expect(isStack).toBe(true);
|
|
241
223
|
|
|
242
224
|
expect(data.length).toBe(15);
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
expect(obj1.
|
|
246
|
-
expect(obj1.
|
|
247
|
-
const obj2 = data.filter((d) => d.
|
|
225
|
+
const obj1 = data.find((d) => d.x === "2020-09-30")!;
|
|
226
|
+
expect(obj1).toBeTruthy();
|
|
227
|
+
expect(obj1.value).toBe(0);
|
|
228
|
+
expect(obj1.type).toBe("2.0A (P1)");
|
|
229
|
+
const obj2 = data.filter((d) => d.x === "2020-07-31")!;
|
|
230
|
+
expect(obj2).toBeTruthy();
|
|
248
231
|
expect(obj2.length).toBe(3);
|
|
249
|
-
expect(obj2.map((e) => e.
|
|
232
|
+
expect(obj2.map((e) => e.type).toString()).toBe(
|
|
250
233
|
"2.0A (P1),2.0DHA (P1),2.0DHA (P2)"
|
|
251
234
|
);
|
|
252
235
|
});
|
|
236
|
+
|
|
237
|
+
it("should do basic test with two y axis", () => {
|
|
238
|
+
const { data, isGroup, isStack } = getGraphData(
|
|
239
|
+
`<?xml version="1.0"?>
|
|
240
|
+
<graph type="bar">
|
|
241
|
+
<field name="name" axis="x"/>
|
|
242
|
+
<field name="consum" operator="+" axis="y"/>
|
|
243
|
+
<field name="ajust" operator="+" axis="y"/>
|
|
244
|
+
</graph>
|
|
245
|
+
`,
|
|
246
|
+
"lectura"
|
|
247
|
+
);
|
|
248
|
+
|
|
249
|
+
expect(isGroup).toBe(false);
|
|
250
|
+
expect(isStack).toBe(false);
|
|
251
|
+
|
|
252
|
+
expect(data.length).toBe(24);
|
|
253
|
+
|
|
254
|
+
const obj1 = data.find(
|
|
255
|
+
(d) => d.x === "2015-10-31" && d.type == "Consum (sum)"
|
|
256
|
+
);
|
|
257
|
+
expect(obj1!).toBeTruthy();
|
|
258
|
+
expect(obj1!.value).toBe(0);
|
|
259
|
+
|
|
260
|
+
const obj2 = data.find(
|
|
261
|
+
(d) => d.x === "2015-10-31" && d.type == "Ajust (sum)"
|
|
262
|
+
);
|
|
263
|
+
expect(obj2!).toBeTruthy();
|
|
264
|
+
expect(obj2!.value).toBe(15);
|
|
265
|
+
|
|
266
|
+
const obj3 = data.find(
|
|
267
|
+
(d) => d.x === "2020-07-31" && d.type == "Consum (sum)"
|
|
268
|
+
);
|
|
269
|
+
expect(obj3!).toBeTruthy();
|
|
270
|
+
expect(obj3!.value).toBe(400);
|
|
271
|
+
|
|
272
|
+
const obj4 = data.find(
|
|
273
|
+
(d) => d.x === "2020-09-30" && d.type == "Consum (sum)"
|
|
274
|
+
);
|
|
275
|
+
expect(obj4!).toBeTruthy();
|
|
276
|
+
expect(obj4!.value).toBe(0);
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
it("should do basic test with 4 y axis, stacked but without labels", () => {
|
|
280
|
+
const { data, isGroup, isStack } = getGraphData(
|
|
281
|
+
`<?xml version="1.0"?>
|
|
282
|
+
<graph type="bar">
|
|
283
|
+
<field name="name" axis="x"/>
|
|
284
|
+
<field name="consum" operator="+" axis="y" stacked="entrada" />
|
|
285
|
+
<field name="ajust" operator="+" axis="y" stacked="entrada" />
|
|
286
|
+
<field name="generacio" operator="+" axis="y" stacked="sortida" />
|
|
287
|
+
<field name="ajust_exporta" operator="+" axis="y" stacked="sortida" />
|
|
288
|
+
</graph>
|
|
289
|
+
`,
|
|
290
|
+
"lectura"
|
|
291
|
+
);
|
|
292
|
+
|
|
293
|
+
expect(isGroup).toBe(false);
|
|
294
|
+
expect(isStack).toBe(true);
|
|
295
|
+
|
|
296
|
+
expect(data.length).toBe(48);
|
|
297
|
+
|
|
298
|
+
const obj1 = data.find(
|
|
299
|
+
(d) => d.x === "2015-10-31" && d.type == "Consum (sum)"
|
|
300
|
+
);
|
|
301
|
+
expect(obj1!).toBeTruthy();
|
|
302
|
+
expect(obj1!.value).toBe(0);
|
|
303
|
+
expect(obj1!.stacked).toBe("entrada");
|
|
304
|
+
|
|
305
|
+
const obj2 = data.find(
|
|
306
|
+
(d) => d.x === "2015-10-31" && d.type == "Ajust (sum)"
|
|
307
|
+
);
|
|
308
|
+
expect(obj2!).toBeTruthy();
|
|
309
|
+
expect(obj2!.value).toBe(15);
|
|
310
|
+
expect(obj2!.stacked).toBe("entrada");
|
|
311
|
+
|
|
312
|
+
const obj3 = data.find(
|
|
313
|
+
(d) => d.x === "2015-10-31" && d.type == "Generació (sum)"
|
|
314
|
+
);
|
|
315
|
+
expect(obj3!).toBeTruthy();
|
|
316
|
+
expect(obj3!.value).toBe(0);
|
|
317
|
+
expect(obj3!.stacked).toBe("sortida");
|
|
318
|
+
|
|
319
|
+
const obj4 = data.find(
|
|
320
|
+
(d) => d.x === "2015-10-31" && d.type == "Ajust Exporta (sum)"
|
|
321
|
+
);
|
|
322
|
+
expect(obj4!).toBeTruthy();
|
|
323
|
+
expect(obj4!.value).toBe(0);
|
|
324
|
+
expect(obj4!.stacked).toBe("sortida");
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
it("should do basic test with 2 y axis, stacked and label", () => {
|
|
328
|
+
const { data, isGroup, isStack } = getGraphData(
|
|
329
|
+
`<?xml version="1.0"?>
|
|
330
|
+
<graph type="bar">
|
|
331
|
+
<field name="name" axis="x"/>
|
|
332
|
+
<field name="consum" operator="+" label="periode" axis="y" stacked="entrada" />
|
|
333
|
+
<field name="generacio" operator="+" label="periode" axis="y" stacked="sortida" />
|
|
334
|
+
</graph>
|
|
335
|
+
`,
|
|
336
|
+
"lectura"
|
|
337
|
+
);
|
|
338
|
+
|
|
339
|
+
expect(isGroup).toBe(true);
|
|
340
|
+
expect(isStack).toBe(true);
|
|
341
|
+
|
|
342
|
+
expect(data.length).toBe(30);
|
|
343
|
+
|
|
344
|
+
const obj1 = data.find(
|
|
345
|
+
(d) => d.x === "2015-10-31" && d.stacked == "entrada"
|
|
346
|
+
);
|
|
347
|
+
expect(obj1!).toBeTruthy();
|
|
348
|
+
expect(obj1!.value).toBe(0);
|
|
349
|
+
expect(obj1!.type).toBe("2.0A (P1)");
|
|
350
|
+
|
|
351
|
+
const obj2 = data.find(
|
|
352
|
+
(d) => d.x === "2015-10-31" && d.stacked == "sortida"
|
|
353
|
+
);
|
|
354
|
+
expect(obj2!).toBeTruthy();
|
|
355
|
+
expect(obj2!.value).toBe(0);
|
|
356
|
+
expect(obj2!.type).toBe("2.0A (P1)");
|
|
357
|
+
});
|
|
358
|
+
|
|
359
|
+
it("should do basic test with 2 y axis, stacked, 1 label, 1 without label", () => {
|
|
360
|
+
const { data, isGroup, isStack } = getGraphData(
|
|
361
|
+
`<?xml version="1.0"?>
|
|
362
|
+
<graph type="bar">
|
|
363
|
+
<field name="name" axis="x"/>
|
|
364
|
+
<field name="consum" operator="+" label="periode" axis="y" stacked="entrada" />
|
|
365
|
+
<field name="generacio" operator="+" axis="y" stacked="sortida" />
|
|
366
|
+
</graph>
|
|
367
|
+
`,
|
|
368
|
+
"lectura"
|
|
369
|
+
);
|
|
370
|
+
|
|
371
|
+
expect(isGroup).toBe(true);
|
|
372
|
+
expect(isStack).toBe(true);
|
|
373
|
+
|
|
374
|
+
expect(data.length).toBe(27);
|
|
375
|
+
|
|
376
|
+
const obj1 = data.find(
|
|
377
|
+
(d) => d.x === "2015-10-31" && d.stacked == "entrada"
|
|
378
|
+
);
|
|
379
|
+
expect(obj1!).toBeTruthy();
|
|
380
|
+
expect(obj1!.value).toBe(0);
|
|
381
|
+
expect(obj1!.type).toBe("2.0A (P1)");
|
|
382
|
+
|
|
383
|
+
const obj2 = data.find(
|
|
384
|
+
(d) => d.x === "2015-10-31" && d.stacked == "sortida"
|
|
385
|
+
);
|
|
386
|
+
expect(obj2!).toBeTruthy();
|
|
387
|
+
expect(obj2!.value).toBe(0);
|
|
388
|
+
expect(obj2!.type).toBe("Generació (sum)");
|
|
389
|
+
});
|
|
253
390
|
});
|
|
391
|
+
|
|
392
|
+
function getModelData(model: string) {
|
|
393
|
+
const modelObj = models.find((m) => m.key === model);
|
|
394
|
+
if (!modelObj) {
|
|
395
|
+
throw new Error("Model not found");
|
|
396
|
+
}
|
|
397
|
+
return modelObj;
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
function getGraphData(xml: string, model: string) {
|
|
401
|
+
const parsedGraph = parseGraph(xml) as GraphChart;
|
|
402
|
+
|
|
403
|
+
const { data: values, fields } = getModelData(model);
|
|
404
|
+
|
|
405
|
+
return processGraphData({
|
|
406
|
+
ooui: parsedGraph,
|
|
407
|
+
values: values as any,
|
|
408
|
+
fields: fields as any,
|
|
409
|
+
});
|
|
410
|
+
}
|