mdt-charts 1.12.13 → 1.12.14

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.
@@ -158,8 +158,8 @@ export interface MdtChartsAggregatorModel {
158
158
  data: MdtChartsDataRow[];
159
159
  }
160
160
  export interface MdtChartsAggregatorContent {
161
- value: string | number;
162
- title: string;
161
+ value?: string | number;
162
+ title?: string;
163
163
  }
164
164
  interface IntervalChartData {
165
165
  valueField1: MdtChartsValueField;
@@ -19,7 +19,9 @@ export class ScaleAxisRecalcer {
19
19
  : canvasModel.getChartBlockWidth()) - scaleValueFn(0));
20
20
  const key = chartOrientation === "vertical" ? keyAxisLabelVerticalLog : keyAxisLabelHorizontalLog;
21
21
  const logInfo = canvasModel.marginService.getDataByKey(key);
22
- canvasModel.decreaseMarginSide(logInfo.side, logInfo.byValue - coordinateOnChartBlock < 0 ? logInfo.byValue : coordinateOnChartBlock);
22
+ if (logInfo) {
23
+ canvasModel.decreaseMarginSide(logInfo.side, logInfo.byValue - coordinateOnChartBlock < 0 ? logInfo.byValue : coordinateOnChartBlock);
24
+ }
23
25
  }
24
26
  getScaleValue() {
25
27
  const scale = this.generateScaleLinear();
@@ -9,4 +9,5 @@ export declare class DonutAggregatorService {
9
9
  getContent(aggregatorOptions: MdtChartsDonutAggregator, dataOptions: AggregatorServiceDataOptions): DonutAggregatorContent;
10
10
  private doesValueExist;
11
11
  private generateDefaultContent;
12
+ private getDefaultValue;
12
13
  }
@@ -4,14 +4,25 @@ export class DonutAggregatorService {
4
4
  if (!(aggregatorOptions === null || aggregatorOptions === void 0 ? void 0 : aggregatorOptions.content) || !dataOptions.rows)
5
5
  return this.generateDefaultContent(dataOptions);
6
6
  const content = aggregatorOptions.content({ data: dataOptions.rows });
7
- if (this.doesValueExist(content.value) && content.title)
8
- return content;
7
+ if (!content || (!this.doesValueExist(content.value) && !content.title))
8
+ return this.generateDefaultContent(dataOptions);
9
+ if (this.doesValueExist(content.value) && content.title) {
10
+ return {
11
+ title: content.title,
12
+ value: content.value
13
+ };
14
+ }
9
15
  if (!content.title && this.doesValueExist(content.value))
10
16
  return {
11
17
  value: content.value,
12
18
  title: AGGREGATOR_DEFAULT_TITLE
13
19
  };
14
- return this.generateDefaultContent(dataOptions);
20
+ if (!this.doesValueExist(content.value) && content.title) {
21
+ return {
22
+ value: this.getDefaultValue(dataOptions),
23
+ title: content.title
24
+ };
25
+ }
15
26
  }
16
27
  doesValueExist(content) {
17
28
  return content != null;
@@ -19,7 +30,11 @@ export class DonutAggregatorService {
19
30
  generateDefaultContent(dataOptions) {
20
31
  return {
21
32
  title: AGGREGATOR_DEFAULT_TITLE,
22
- value: dataOptions.rows ? dataOptions.rows.reduce((acc, row) => acc + row[dataOptions.valueFieldName], 0) : 0
33
+ value: dataOptions.rows ? this.getDefaultValue(dataOptions) : 0
23
34
  };
24
35
  }
36
+ getDefaultValue(dataOptions) {
37
+ const totalSumOfValues = dataOptions.rows.reduce((acc, row) => acc + row[dataOptions.valueFieldName], 0);
38
+ return totalSumOfValues;
39
+ }
25
40
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mdt-charts",
3
- "version": "1.12.13",
3
+ "version": "1.12.14",
4
4
  "description": "",
5
5
  "main": "lib/main.js",
6
6
  "scripts": {
@@ -18,6 +18,7 @@
18
18
  "node_modules",
19
19
  "**/__tests__/*",
20
20
  "src/playground/*",
21
- "**/*Example.ts"
21
+ "**/*Example.ts",
22
+ "**/*.test.ts"
22
23
  ]
23
24
  }
@@ -1,186 +0,0 @@
1
- import { NewTooltipServiceClass } from "./newTooltipService";
2
- const ignoredValue = 0;
3
- const ignoredBigvalue = 1000000;
4
- describe('newTooltipService', () => {
5
- const getIgnoredSize = (big) => {
6
- return {
7
- height: big ? ignoredBigvalue : ignoredValue,
8
- width: big ? ignoredBigvalue : ignoredValue
9
- };
10
- };
11
- const getSizeWithOne = (key, value) => {
12
- const size = getIgnoredSize();
13
- size[key] = value;
14
- return size;
15
- };
16
- const getPosWithOne = (key, value) => {
17
- const coordinate = {
18
- left: ignoredValue,
19
- top: ignoredValue
20
- };
21
- coordinate[key] = value;
22
- return coordinate;
23
- };
24
- const getBoundingWithOne = (key, value) => {
25
- const blockBounding = {
26
- left: ignoredValue,
27
- bottom: ignoredValue,
28
- height: ignoredValue,
29
- top: ignoredValue,
30
- width: ignoredValue
31
- };
32
- blockBounding[key] = value;
33
- return blockBounding;
34
- };
35
- const service = new NewTooltipServiceClass();
36
- describe('getTooltipByWindow with parentBlock', () => {
37
- test('should return left point equal to `-(left of parent block)` if left of tooltip is less', () => {
38
- const tooltipBounding = getIgnoredSize();
39
- const preCoordinate = getPosWithOne("left", -50);
40
- const windowSize = getIgnoredSize(true);
41
- const blockBounding = getBoundingWithOne("left", 10);
42
- const res = service.getTooltipByWindow(tooltipBounding, preCoordinate, windowSize, blockBounding);
43
- expect(res.left).toBe(-blockBounding.left);
44
- });
45
- test('should return left point equal to left of preCoordinate if left of tooltip is less', () => {
46
- const tooltipBounding = getIgnoredSize();
47
- const preCoordinate = getPosWithOne("left", 20);
48
- const windowSize = getIgnoredSize(true);
49
- const blockBounding = getBoundingWithOne("left", 10);
50
- const res = service.getTooltipByWindow(tooltipBounding, preCoordinate, windowSize, blockBounding);
51
- expect(res.left).toBe(preCoordinate.left);
52
- });
53
- test('should return left point equal to `(window width - tooltip width)` if right of tooltip is bigger', () => {
54
- const tooltipBounding = getSizeWithOne("width", 50);
55
- const preCoordinate = getPosWithOne("left", 20);
56
- const windowSize = getSizeWithOne("width", 90);
57
- const blockBounding = getBoundingWithOne("left", 30);
58
- const res = service.getTooltipByWindow(tooltipBounding, preCoordinate, windowSize, blockBounding);
59
- expect(res.left).toBe(-8); // 50 + 20 + 30 > 90 => 90 - 30 - 50 - scrollPad(18)
60
- });
61
- test('should return left point equal to left of preCoordinate if right of tooltip is less than window width', () => {
62
- const tooltipBounding = getSizeWithOne("width", 50);
63
- const preCoordinate = getPosWithOne("left", 20);
64
- const windowSize = getSizeWithOne("width", 200);
65
- const blockBounding = getBoundingWithOne("left", 30);
66
- const res = service.getTooltipByWindow(tooltipBounding, preCoordinate, windowSize, blockBounding);
67
- expect(res.left).toBe(preCoordinate.left); // 50 + 20 + 30 < 200
68
- });
69
- test('should return top point equal to `-(top of parent block)` if top of tooltip is less', () => {
70
- const tooltipBounding = getIgnoredSize();
71
- const preCoordinate = getPosWithOne("top", -40);
72
- const windowSize = getIgnoredSize(true);
73
- const blockBounding = getBoundingWithOne("top", -20);
74
- let res = service.getTooltipByWindow(tooltipBounding, preCoordinate, windowSize, blockBounding);
75
- expect(res.top).toBe(-blockBounding.top);
76
- blockBounding.top = -60;
77
- res = service.getTooltipByWindow(tooltipBounding, preCoordinate, windowSize, blockBounding);
78
- expect(res.top).toBe(-blockBounding.top); // 60 by blockBounding = 0 by window
79
- blockBounding.top = -100;
80
- preCoordinate.top = 20;
81
- res = service.getTooltipByWindow(tooltipBounding, preCoordinate, windowSize, blockBounding);
82
- expect(res.top).toBe(-blockBounding.top);
83
- blockBounding.top = -10;
84
- preCoordinate.top = 5;
85
- res = service.getTooltipByWindow(tooltipBounding, preCoordinate, windowSize, blockBounding);
86
- expect(res.top).toBe(-blockBounding.top);
87
- });
88
- test('should return top point equal top of preCoordinate if top of tooltip is bigger', () => {
89
- const tooltipBounding = getIgnoredSize();
90
- const preCoordinate = getPosWithOne("top", 20);
91
- const windowSize = getIgnoredSize(true);
92
- const blockBounding = getBoundingWithOne("top", 100);
93
- let res = service.getTooltipByWindow(tooltipBounding, preCoordinate, windowSize, blockBounding);
94
- expect(res.top).toBe(preCoordinate.top);
95
- preCoordinate.top = -99;
96
- res = service.getTooltipByWindow(tooltipBounding, preCoordinate, windowSize, blockBounding);
97
- expect(res.top).toBe(preCoordinate.top);
98
- });
99
- test('should return top point equal to `(winHeight - tooltipHeight)` if bottom of tooltip is bigger than window height', () => {
100
- const tooltipBounding = getSizeWithOne("height", 50);
101
- const preCoordinate = getPosWithOne("top", 90);
102
- const windowSize = getSizeWithOne("height", 200);
103
- const blockBounding = {
104
- left: ignoredValue,
105
- bottom: 210,
106
- height: 110,
107
- top: 100,
108
- width: ignoredValue
109
- };
110
- const res = service.getTooltipByWindow(tooltipBounding, preCoordinate, windowSize, blockBounding);
111
- expect(res.top).toBe(50); // 110 - 50 - (210 - 200)
112
- });
113
- test('should return top point equal to top of preCoordinate if bottom of tooltip is less than height of window', () => {
114
- const tooltipBounding = getSizeWithOne("height", 50);
115
- const preCoordinate = getPosWithOne("top", 90);
116
- const windowSize = getSizeWithOne("height", 300);
117
- const blockBounding = {
118
- left: ignoredValue,
119
- bottom: 210,
120
- height: 110,
121
- top: 100,
122
- width: ignoredValue
123
- };
124
- const res = service.getTooltipByWindow(tooltipBounding, preCoordinate, windowSize, blockBounding);
125
- expect(res.top).toBe(preCoordinate.top); // 90 + 50 + 100 < 300
126
- });
127
- });
128
- describe('getTooltipByWindow without parentBlock', () => {
129
- test('should return left point equal to 0 if left of tooltip is less', () => {
130
- const tooltipBounding = getIgnoredSize();
131
- const preCoordinate = getPosWithOne("left", -50);
132
- const windowSize = getIgnoredSize(true);
133
- const res = service.getTooltipByWindow(tooltipBounding, preCoordinate, windowSize);
134
- expect(res.left === 0).toBe(true); // negative zero jest not matching with simple zero
135
- });
136
- test('should return left point equal to left of preCoordinate if left of tooltip is bigger than 0', () => {
137
- const tooltipBounding = getIgnoredSize();
138
- const preCoordinate = getPosWithOne("left", 20);
139
- const windowSize = getIgnoredSize(true);
140
- const res = service.getTooltipByWindow(tooltipBounding, preCoordinate, windowSize);
141
- expect(res.left).toBe(preCoordinate.left);
142
- });
143
- test('should return left point equal to `(window width - tooltip width)` if right of tooltip is bigger', () => {
144
- const tooltipBounding = getSizeWithOne("width", 50);
145
- const preCoordinate = getPosWithOne("left", 60);
146
- const windowSize = getSizeWithOne("width", 100);
147
- const res = service.getTooltipByWindow(tooltipBounding, preCoordinate, windowSize);
148
- expect(res.left).toBe(32); // 60 + 50 > 100 => 100 - 50 - scrollPad(18)
149
- });
150
- test('should return left point equal to left of preCoordinate if right of tooltip is less than window width', () => {
151
- const tooltipBounding = getSizeWithOne("width", 50);
152
- const preCoordinate = getPosWithOne("left", 20);
153
- const windowSize = getSizeWithOne("width", 200);
154
- const res = service.getTooltipByWindow(tooltipBounding, preCoordinate, windowSize);
155
- expect(res.left).toBe(preCoordinate.left); // 50 + 20 < 200
156
- });
157
- test('should return top point equal to 0 if top of tooltip is less than 0', () => {
158
- const tooltipBounding = getIgnoredSize();
159
- const preCoordinate = getPosWithOne("top", -40);
160
- const windowSize = getIgnoredSize(true);
161
- const res = service.getTooltipByWindow(tooltipBounding, preCoordinate, windowSize);
162
- expect(res.top === 0).toBe(true);
163
- });
164
- test('should return top point equal top of preCoordinate if top of tooltip is bigger than 0', () => {
165
- const tooltipBounding = getIgnoredSize();
166
- const preCoordinate = getPosWithOne("top", 20);
167
- const windowSize = getIgnoredSize(true);
168
- const res = service.getTooltipByWindow(tooltipBounding, preCoordinate, windowSize);
169
- expect(res.top).toBe(preCoordinate.top);
170
- });
171
- test('should return top point equal to `(winHeight - tooltipHeight)` if bottom of tooltip is bigger than window height', () => {
172
- const tooltipBounding = getSizeWithOne("height", 50);
173
- const preCoordinate = getPosWithOne("top", 90);
174
- const windowSize = getSizeWithOne("height", 100);
175
- const res = service.getTooltipByWindow(tooltipBounding, preCoordinate, windowSize);
176
- expect(res.top).toBe(50); // 90 + 50 > 100 => 100 - 50
177
- });
178
- test('should return top point equal to top of preCoordinate if bottom of tooltip is less than height of window', () => {
179
- const tooltipBounding = getSizeWithOne("height", 50);
180
- const preCoordinate = getPosWithOne("top", 90);
181
- const windowSize = getSizeWithOne("height", 300);
182
- const res = service.getTooltipByWindow(tooltipBounding, preCoordinate, windowSize);
183
- expect(res.top).toBe(preCoordinate.top); // 90 + 50 < 300
184
- });
185
- });
186
- });
@@ -1,199 +0,0 @@
1
- import { DataStacker } from "./dataStacker";
2
- import { DataStackerService } from "./dataStackerService";
3
- describe('DataStacker', () => {
4
- const stacker = new DataStacker();
5
- describe('getStackedData', () => {
6
- describe('for positive values', () => {
7
- let dataRows = [
8
- { price: 12, count: 30 },
9
- { price: 30, count: 12 },
10
- { price: 0, count: 100 },
11
- { price: 10, count: 0 }
12
- ];
13
- const valueFields = ["price", "count"];
14
- test('should return right stack', () => {
15
- const res = stacker.getStackedData(dataRows, valueFields);
16
- expect(res).toEqual([
17
- [
18
- { "0": 0, "1": 12, data: dataRows[0] },
19
- { "0": 0, "1": 30, data: dataRows[1] },
20
- { "0": 0, "1": 0, data: dataRows[2] },
21
- { "0": 0, "1": 10, data: dataRows[3] },
22
- ],
23
- [
24
- { "0": 12, "1": 42, data: dataRows[0] },
25
- { "0": 30, "1": 42, data: dataRows[1] },
26
- { "0": 0, "1": 100, data: dataRows[2] },
27
- { "0": 10, "1": 10, data: dataRows[3] },
28
- ]
29
- ]);
30
- });
31
- });
32
- describe('for negative values', () => {
33
- let dataRows = [
34
- { price: -12, count: -30 },
35
- { price: -30, count: -12 },
36
- { price: 0, count: -100 },
37
- { price: -10, count: 0 }
38
- ];
39
- const valueFields = ["price", "count"];
40
- test('should return right stack', () => {
41
- const res = stacker.getStackedData(dataRows, valueFields);
42
- expect(res).toEqual([
43
- [
44
- { "0": 0, "1": -12, data: dataRows[0] },
45
- { "0": 0, "1": -30, data: dataRows[1] },
46
- { "0": 0, "1": 0, data: dataRows[2] },
47
- { "0": 0, "1": -10, data: dataRows[3] },
48
- ],
49
- [
50
- { "0": -12, "1": -42, data: dataRows[0] },
51
- { "0": -30, "1": -42, data: dataRows[1] },
52
- { "0": 0, "1": -100, data: dataRows[2] },
53
- { "0": -10, "1": -10, data: dataRows[3] },
54
- ]
55
- ]);
56
- });
57
- });
58
- });
59
- });
60
- describe('DataStackerService', () => {
61
- const service = new DataStackerService();
62
- let data = [
63
- [
64
- { "0": 0, "1": 42, data: {} },
65
- { "0": 0, "1": -123, data: {} }
66
- ]
67
- ];
68
- describe('getLastValue', () => {
69
- test('should return 0 if vfIndex is 0', () => {
70
- const res = service.getValue0(data, 0, 0, 0);
71
- expect(res).toBe(0);
72
- });
73
- test('should return last positive values if positive value exists and need positive', () => {
74
- const res = service.getValue0(data, 1, 0, 12);
75
- expect(res).toBe(42);
76
- });
77
- test('should return 0 if positive value not exists and need positive', () => {
78
- const res = service.getValue0(data, 1, 1, 12);
79
- expect(res).toBe(0);
80
- });
81
- test('should return last negative value if negative value exists and need negative', () => {
82
- const res = service.getValue0(data, 1, 1, -12);
83
- expect(res).toBe(-123);
84
- });
85
- test('should return 0 if negative value not exists and need negative', () => {
86
- const res = service.getValue0(data, 1, 0, -12);
87
- expect(res).toBe(0);
88
- });
89
- });
90
- describe('getValue1', () => {
91
- test('should return sum of value0 + value from data', () => {
92
- let res = service.getValue1(0, 12);
93
- expect(res).toBe(12);
94
- res = service.getValue1(-12, -30);
95
- expect(res).toBe(-42);
96
- res = service.getValue1(0, 30);
97
- expect(res).toBe(30);
98
- res = service.getValue1(0, -30);
99
- expect(res).toBe(-30);
100
- });
101
- });
102
- });
103
- describe('real example (positive only)', () => {
104
- const stacker = new DataStacker();
105
- const data = [
106
- {
107
- $id: 1,
108
- brand: "BMW BMW",
109
- price: 100000,
110
- count: 12000,
111
- color: "red"
112
- },
113
- {
114
- $id: 2,
115
- brand: "LADA",
116
- price: 0,
117
- count: 1000,
118
- color: "green"
119
- },
120
- {
121
- $id: 3,
122
- brand: "MERCEDES",
123
- price: 15000,
124
- count: 1200,
125
- color: "blue"
126
- },
127
- {
128
- $id: 4,
129
- brand: "AUDI",
130
- price: 20000,
131
- count: 500,
132
- color: "yellow"
133
- },
134
- {
135
- $id: 5,
136
- brand: "VOLKSWAGEN",
137
- price: 115000,
138
- count: 6000,
139
- color: "cyan"
140
- },
141
- {
142
- $id: 6,
143
- brand: "DODGE",
144
- price: 115000,
145
- count: 4000,
146
- color: "red"
147
- },
148
- {
149
- $id: 7,
150
- brand: "SAAB",
151
- price: 50000,
152
- count: 11000,
153
- color: "orange"
154
- },
155
- {
156
- $id: 8,
157
- brand: "HONDA",
158
- price: 20000,
159
- count: 2000,
160
- color: "brown"
161
- },
162
- {
163
- $id: 9,
164
- brand: "TOYOTA",
165
- price: 40000,
166
- count: 15000,
167
- color: "pink"
168
- }
169
- ];
170
- const valueFields = ["price", "count"];
171
- const stackedData = [
172
- [
173
- { "0": 0, "1": 100000, data: data[0] },
174
- { "0": 0, "1": 0, data: data[1] },
175
- { "0": 0, "1": 15000, data: data[2] },
176
- { "0": 0, "1": 20000, data: data[3] },
177
- { "0": 0, "1": 115000, data: data[4] },
178
- { "0": 0, "1": 115000, data: data[5] },
179
- { "0": 0, "1": 50000, data: data[6] },
180
- { "0": 0, "1": 20000, data: data[7] },
181
- { "0": 0, "1": 40000, data: data[8] }
182
- ],
183
- [
184
- { "0": 100000, "1": 112000, data: data[0] },
185
- { "0": 0, "1": 1000, data: data[1] },
186
- { "0": 15000, "1": 16200, data: data[2] },
187
- { "0": 20000, "1": 20500, data: data[3] },
188
- { "0": 115000, "1": 121000, data: data[4] },
189
- { "0": 115000, "1": 119000, data: data[5] },
190
- { "0": 50000, "1": 61000, data: data[6] },
191
- { "0": 20000, "1": 22000, data: data[7] },
192
- { "0": 40000, "1": 55000, data: data[8] }
193
- ]
194
- ];
195
- test('check on real example', () => {
196
- const res = stacker.getStackedData(data, valueFields);
197
- expect(res).toEqual(stackedData);
198
- });
199
- });
@@ -1,19 +0,0 @@
1
- import { ScaleKeyModel, ScaleKeyType, ScaleValueModel, ScaleValueType } from "../model";
2
- import { AxisPosition, NumberDomain, IntervalChart, MdtChartsTwoDimensionalChart, MdtChartsTwoDimensionalOptions, ChartOrientation, MdtChartsDataSource, MdtChartsDataRow } from "../../config/config";
3
- import { CanvasModel } from "../modelInstance/canvasModel/canvasModel";
4
- export declare enum ScaleType {
5
- Key = 0,
6
- Value = 1
7
- }
8
- export declare class ScaleModel {
9
- static getScaleKey(allowableKeys: string[], orient: ChartOrientation, canvasModel: CanvasModel, charts: MdtChartsTwoDimensionalChart[], barCharts: MdtChartsTwoDimensionalChart[]): ScaleKeyModel;
10
- static getScaleLinear(options: MdtChartsTwoDimensionalOptions, data: MdtChartsDataSource, canvasModel: CanvasModel): ScaleValueModel;
11
- static getRangePeek(scaleType: ScaleType, chartOrientation: string, canvasModel: CanvasModel): number;
12
- static getDateValueDomain(data: MdtChartsDataSource, chart: IntervalChart, keyAxisPosition: AxisPosition, dataSource: string): [Date, Date];
13
- static getLinearDomain(configDomain: NumberDomain, data: MdtChartsDataSource, configOptions: MdtChartsTwoDimensionalOptions): [number, number];
14
- static getScaleKeyType(charts: MdtChartsTwoDimensionalChart[]): ScaleKeyType;
15
- static getScaleValueType(charts: MdtChartsTwoDimensionalChart[] | IntervalChart[]): ScaleValueType;
16
- static getElementsAmount(barCharts: MdtChartsTwoDimensionalChart[]): number;
17
- static getScaleMaxValue(charts: MdtChartsTwoDimensionalChart[], dataRows: MdtChartsDataRow[]): number;
18
- static getScaleMinValue(charts: MdtChartsTwoDimensionalChart[], dataRows: MdtChartsDataRow[]): number;
19
- }
@@ -1,115 +0,0 @@
1
- import { ModelHelper } from "../modelHelper";
2
- export var ScaleType;
3
- (function (ScaleType) {
4
- ScaleType[ScaleType["Key"] = 0] = "Key";
5
- ScaleType[ScaleType["Value"] = 1] = "Value";
6
- })(ScaleType || (ScaleType = {}));
7
- export class ScaleModel {
8
- static getScaleKey(allowableKeys, orient, canvasModel, charts, barCharts) {
9
- return {
10
- domain: allowableKeys,
11
- range: {
12
- start: 0,
13
- end: ScaleModel.getRangePeek(ScaleType.Key, orient, canvasModel)
14
- },
15
- type: ScaleModel.getScaleKeyType(charts),
16
- elementsAmount: this.getElementsAmount(barCharts)
17
- };
18
- }
19
- static getScaleLinear(options, data, canvasModel) {
20
- return {
21
- domain: ScaleModel.getLinearDomain(options.axis.value.domain, data, options),
22
- range: {
23
- start: 0,
24
- end: ScaleModel.getRangePeek(ScaleType.Value, options.orientation, canvasModel)
25
- },
26
- type: ScaleModel.getScaleValueType(options.charts)
27
- };
28
- }
29
- static getRangePeek(scaleType, chartOrientation, canvasModel) {
30
- if (chartOrientation === 'vertical')
31
- return scaleType === ScaleType.Key
32
- ? canvasModel.getChartBlockWidth()
33
- : canvasModel.getChartBlockHeight();
34
- return scaleType === ScaleType.Key
35
- ? canvasModel.getChartBlockHeight()
36
- : canvasModel.getChartBlockWidth();
37
- }
38
- static getDateValueDomain(data, chart, keyAxisPosition, dataSource) {
39
- const minMax = ModelHelper.getMinAndMaxOfIntervalData(data, dataSource, chart);
40
- let domainPeekMin = minMax[0];
41
- let domainPeekMax = minMax[1];
42
- if (keyAxisPosition === 'start')
43
- return [domainPeekMin, domainPeekMax];
44
- return [domainPeekMax, domainPeekMin];
45
- }
46
- static getLinearDomain(configDomain, data, configOptions) {
47
- let domainPeekMin;
48
- let domainPeekMax;
49
- if (configDomain.start === -1)
50
- domainPeekMin = this.getScaleMinValue(configOptions.charts, data[configOptions.data.dataSource]);
51
- else
52
- domainPeekMin = configDomain.start;
53
- if (configDomain.end === -1)
54
- domainPeekMax = this.getScaleMaxValue(configOptions.charts, data[configOptions.data.dataSource]);
55
- else
56
- domainPeekMax = configDomain.end;
57
- if (configOptions.axis.key.position === 'start')
58
- return [domainPeekMin, domainPeekMax];
59
- return [domainPeekMax, domainPeekMin];
60
- }
61
- static getScaleKeyType(charts) {
62
- if (charts.findIndex((chart) => chart.type === 'bar') === -1)
63
- return 'point';
64
- return 'band';
65
- }
66
- static getScaleValueType(charts) {
67
- if (charts.findIndex((chart) => chart.type === 'gantt') !== -1)
68
- return 'datetime';
69
- return 'linear';
70
- }
71
- static getElementsAmount(barCharts) {
72
- if (barCharts.length === 0)
73
- return 1;
74
- let barsAmount = 0;
75
- barCharts.forEach(chart => {
76
- if (chart.isSegmented)
77
- barsAmount += 1; // Если бар сегментированный, то все valueFields являются частями одного бара
78
- else
79
- barsAmount += chart.data.valueFields.length;
80
- });
81
- return barsAmount;
82
- }
83
- static getScaleMaxValue(charts, dataRows) {
84
- let max = 0;
85
- charts.forEach(chart => {
86
- dataRows.forEach(dataRow => {
87
- let sumInRow = 0;
88
- chart.data.valueFields.forEach(field => {
89
- if (chart.isSegmented)
90
- sumInRow += dataRow[field.name];
91
- else if (dataRow[field.name] > sumInRow)
92
- sumInRow = dataRow[field.name];
93
- });
94
- if (max < sumInRow)
95
- max = sumInRow;
96
- });
97
- });
98
- return max;
99
- }
100
- static getScaleMinValue(charts, dataRows) {
101
- let min = 0;
102
- charts.forEach(chart => {
103
- dataRows.forEach(dataRow => {
104
- let sumInRow = 0;
105
- chart.data.valueFields.forEach(field => {
106
- if (dataRow[field.name] < sumInRow)
107
- sumInRow = dataRow[field.name];
108
- });
109
- if (min > sumInRow)
110
- min = sumInRow;
111
- });
112
- });
113
- return min;
114
- }
115
- }
@@ -1,17 +0,0 @@
1
- import { MdtChartsConfig, MdtChartsDataSource } from "../config/config";
2
- import { DesignerConfig } from "../designer/designerConfig";
3
- import { DataScope, LegendBlockModel, Orient, OtherCommonComponents } from "./model";
4
- import { ModelInstance } from "./modelInstance/modelInstance";
5
- import { CanvasModel } from "./modelInstance/canvasModel/canvasModel";
6
- export declare const AXIS_HORIZONTAL_LABEL_PADDING = 15;
7
- export declare const AXIS_VERTICAL_LABEL_PADDING = 10;
8
- export declare class MarginModel {
9
- private static twoDimLegendModel;
10
- static initMargin(designerConfig: DesignerConfig, config: MdtChartsConfig, otherComponents: OtherCommonComponents, data: MdtChartsDataSource, modelInstance: ModelInstance): void;
11
- static recalcMarginByVerticalAxisLabel(modelInstance: ModelInstance, config: MdtChartsConfig, designerConfig: DesignerConfig, dataScope: DataScope): void;
12
- static appendToGlobalMarginValuesLegendMargin(canvasModel: CanvasModel, position: Orient, legendBlockModel: LegendBlockModel): void;
13
- private static getHorizontalMarginByAxisLabels;
14
- private static recalcVerticalMarginByAxisLabelHeight;
15
- private static recalcHorizontalMarginByAxisLabelWidth;
16
- private static recalcMarginByTitle;
17
- }
@@ -1,80 +0,0 @@
1
- import { AxisModel } from "./featuresModel/axisModel";
2
- import { DataManagerModel } from "./dataManagerModel/dataManagerModel";
3
- import { AxisType } from "./modelBuilder";
4
- import { TwoDimensionalModel } from "./notations/twoDimensionalModel";
5
- import { keyAxisLabelHorizontalLog, keyAxisLabelVerticalLog } from "./featuresModel/scaleModel/scaleAxisRecalcer";
6
- import { TwoDimLegendModel } from "./featuresModel/legendModel/twoDimLegendModel";
7
- export const AXIS_HORIZONTAL_LABEL_PADDING = 15;
8
- export const AXIS_VERTICAL_LABEL_PADDING = 10;
9
- export class MarginModel {
10
- static initMargin(designerConfig, config, otherComponents, data, modelInstance) {
11
- const canvasModel = modelInstance.canvasModel;
12
- canvasModel.initMargin(Object.assign({}, designerConfig.canvas.chartBlockMargin));
13
- this.recalcMarginByTitle(canvasModel, otherComponents.titleBlock);
14
- if (config.options.type === '2d') {
15
- this.twoDimLegendModel.recalcMarginWith2DLegend(modelInstance, otherComponents.legendBlock);
16
- const labelSize = this.getHorizontalMarginByAxisLabels(designerConfig.canvas.axisLabel.maxSize.main, config.options.axis, data, config.options);
17
- this.recalcVerticalMarginByAxisLabelHeight(labelSize, canvasModel, config.options.orientation, config.options.axis);
18
- // Если встроенный лейбл показывает ключи, то лейблы оси ключей не показываются
19
- // При этом все графики должны иметь: embeddedLabels = 'key'
20
- // И все графики должны быть типа bar.
21
- const showingFlag = config.options.type === '2d'
22
- ? !TwoDimensionalModel.getChartsEmbeddedLabelsFlag(config.options.charts, config.options.orientation)
23
- : true;
24
- this.recalcHorizontalMarginByAxisLabelWidth(labelSize, canvasModel, config.options.orientation, config.options.axis, showingFlag);
25
- }
26
- }
27
- static recalcMarginByVerticalAxisLabel(modelInstance, config, designerConfig, dataScope) {
28
- if ((config.options.type === '2d' || config.options.type === 'interval') && config.options.orientation === 'vertical') {
29
- const axisLabelSize = AxisModel.getLabelSize(designerConfig.canvas.axisLabel.maxSize.main, dataScope.allowableKeys);
30
- const axisConfig = AxisModel.getKeyAxisLabelPosition(modelInstance.canvasModel, dataScope.allowableKeys.length, config.options.axis.key);
31
- const marginOrient = config.options.axis.key.position === 'end' ? 'bottom' : 'top';
32
- if (axisConfig === 'rotated') {
33
- modelInstance.canvasModel.decreaseMarginSide(marginOrient, axisLabelSize.height);
34
- modelInstance.canvasModel.increaseMarginSide(marginOrient, axisLabelSize.width, keyAxisLabelVerticalLog);
35
- }
36
- }
37
- }
38
- static appendToGlobalMarginValuesLegendMargin(canvasModel, position, legendBlockModel) {
39
- const legendCoordinate = legendBlockModel.coordinate;
40
- if (position === 'left' || position === 'right')
41
- canvasModel.increaseMarginSide(position, legendCoordinate[position].margin.left + legendCoordinate[position].margin.right);
42
- else
43
- canvasModel.increaseMarginSide(position, legendCoordinate[position].margin.top + legendCoordinate[position].margin.bottom);
44
- }
45
- static getHorizontalMarginByAxisLabels(labelsMaxWidth, axis, data, options) {
46
- const keyAxisOrient = AxisModel.getAxisOrient(AxisType.Key, options.orientation, axis.key.position);
47
- let labelsTexts;
48
- if (keyAxisOrient === 'left' || keyAxisOrient === 'right') {
49
- labelsTexts = DataManagerModel.getDataValuesByKeyField(data, options.data.dataSource, options.data.keyField.name);
50
- }
51
- else {
52
- labelsTexts = ['0000'];
53
- }
54
- return AxisModel.getLabelSize(labelsMaxWidth, labelsTexts);
55
- }
56
- static recalcVerticalMarginByAxisLabelHeight(labelSize, canvasModel, orientation, axis) {
57
- const keyAxisOrient = AxisModel.getAxisOrient(AxisType.Key, orientation, axis.key.position);
58
- const valueAxisOrient = AxisModel.getAxisOrient(AxisType.Value, orientation, axis.value.position);
59
- if ((keyAxisOrient === 'bottom' || keyAxisOrient === 'top')) {
60
- if (axis.key.visibility)
61
- canvasModel.increaseMarginSide(keyAxisOrient, labelSize.height + AXIS_HORIZONTAL_LABEL_PADDING, keyAxisLabelVerticalLog);
62
- }
63
- else if (axis.value.visibility)
64
- canvasModel.increaseMarginSide(valueAxisOrient, labelSize.height + AXIS_HORIZONTAL_LABEL_PADDING);
65
- }
66
- static recalcHorizontalMarginByAxisLabelWidth(labelSize, canvasModel, orientation, axis, isShow) {
67
- const keyAxisOrient = AxisModel.getAxisOrient(AxisType.Key, orientation, axis.key.position);
68
- const valueAxisOrient = AxisModel.getAxisOrient(AxisType.Value, orientation, axis.value.position);
69
- if ((keyAxisOrient === 'left' || keyAxisOrient === 'right') && isShow && axis.key.visibility) {
70
- canvasModel.increaseMarginSide(keyAxisOrient, labelSize.width + AXIS_VERTICAL_LABEL_PADDING, keyAxisLabelHorizontalLog);
71
- }
72
- else if ((valueAxisOrient === 'left' || valueAxisOrient === 'right') && axis.value.visibility) {
73
- canvasModel.increaseMarginSide(valueAxisOrient, labelSize.width + AXIS_VERTICAL_LABEL_PADDING);
74
- }
75
- }
76
- static recalcMarginByTitle(canvasModel, titleBlockModel) {
77
- canvasModel.increaseMarginSide("top", titleBlockModel.margin.top + titleBlockModel.size + titleBlockModel.margin.bottom);
78
- }
79
- }
80
- MarginModel.twoDimLegendModel = new TwoDimLegendModel();
@@ -1,7 +0,0 @@
1
- import { MdtChartsDataSource, IntervalChart } from "../config/config";
2
- export declare class ModelHelper {
3
- static getSum(items: number[]): number;
4
- static getMinAndMaxOfIntervalData(data: MdtChartsDataSource, dataSource: string, chart: IntervalChart): [Date, Date];
5
- static getUniqueValues(values: string[]): string[];
6
- static getStringScore(word: string): number;
7
- }
@@ -1,41 +0,0 @@
1
- export class ModelHelper {
2
- static getSum(items) {
3
- return items.reduce((acc, item) => acc + item, 0);
4
- }
5
- static getMinAndMaxOfIntervalData(data, dataSource, chart) {
6
- let min = data[dataSource][0][chart.data.valueField1.name];
7
- let max = data[dataSource][0][chart.data.valueField1.name];
8
- const chartData = data[dataSource];
9
- const valueField1 = chart.data.valueField1.name;
10
- const valueField2 = chart.data.valueField2.name;
11
- chartData.forEach(dataRow => {
12
- if (dataRow[valueField1] > max)
13
- max = dataRow[valueField1];
14
- if (dataRow[valueField1] < min)
15
- min = dataRow[valueField1];
16
- if (dataRow[valueField2] > max)
17
- max = dataRow[valueField2];
18
- if (dataRow[valueField2] < min)
19
- min = dataRow[valueField2];
20
- });
21
- return [min, max];
22
- }
23
- static getUniqueValues(values) {
24
- const uniqueValues = values.filter((keyValue, index, self) => self.indexOf(keyValue) === index);
25
- return uniqueValues;
26
- }
27
- static getStringScore(word) {
28
- // lower case letter width ~ 0.74 from upper case width.
29
- // Number width == lower case letter width
30
- let score = 0;
31
- const upperLetterScore = 1;
32
- const lowerLetterScore = 0.74;
33
- for (let i = 0; i < word.length; i++) {
34
- if (word[i].toUpperCase() === word[i] && parseFloat(word[i]).toString() !== word[i])
35
- score += upperLetterScore;
36
- else
37
- score += lowerLetterScore;
38
- }
39
- return score;
40
- }
41
- }
@@ -1,11 +0,0 @@
1
- import { DataScope } from "../model";
2
- export declare const DEFAULT_MAX_RECORDS_AMOUNT = 50;
3
- export declare class DataModelInstance {
4
- private maxRecordsAmount;
5
- private scope;
6
- initMaxRecordsAmount(amount: number): void;
7
- getMaxRecordsAmount(): number;
8
- initScope(scope: DataScope): void;
9
- getScope(): DataScope;
10
- getAllowableKeys(): string[];
11
- }
@@ -1,23 +0,0 @@
1
- export const DEFAULT_MAX_RECORDS_AMOUNT = 50;
2
- export class DataModelInstance {
3
- constructor() {
4
- this.maxRecordsAmount = DEFAULT_MAX_RECORDS_AMOUNT;
5
- }
6
- initMaxRecordsAmount(amount) {
7
- if (typeof amount === "number" && amount > 0) {
8
- this.maxRecordsAmount = amount;
9
- }
10
- }
11
- getMaxRecordsAmount() {
12
- return this.maxRecordsAmount;
13
- }
14
- initScope(scope) {
15
- this.scope = scope;
16
- }
17
- getScope() {
18
- return this.scope;
19
- }
20
- getAllowableKeys() {
21
- return this.getScope().allowableKeys;
22
- }
23
- }
@@ -1,15 +0,0 @@
1
- import { MdtChartsDataSource, MdtChartsPolarOptions } from "../../config/config";
2
- import { DesignerConfig } from "../../designer/designerConfig";
3
- import { PolarOptionsModel, LegendCoordinate } from "../model";
4
- import { CanvasModel } from "../modelInstance/canvasModel/canvasModel";
5
- import { ModelInstance } from "../modelInstance/modelInstance";
6
- /** If donut block has width less than this const, legend change postion from "right" to "bottom" */
7
- export declare const MIN_DONUT_BLOCK_SIZE = 120;
8
- export declare class PolarModel {
9
- static getOptions(options: MdtChartsPolarOptions, data: MdtChartsDataSource, designerConfig: DesignerConfig, modelInstance: ModelInstance): PolarOptionsModel;
10
- static getLegendPositionByBlockSize(canvasModel: CanvasModel): "bottom" | "right";
11
- static doesChartBlockHasEnoughWidthForContainsLegend(chartBlockWidth: number, legendWidth: number, legendCoordinate: LegendCoordinate): boolean;
12
- static doesChartBlockHasEnoughHeightForContainsLegend(chartBlockHeight: number, legendCoordinate: LegendCoordinate): boolean;
13
- private static getDonutSettings;
14
- private static getChartsModel;
15
- }
@@ -1,59 +0,0 @@
1
- import { ChartStyleModelService } from "../chartStyleModel/chartStyleModel";
2
- /** If donut block has width less than this const, legend change postion from "right" to "bottom" */
3
- export const MIN_DONUT_BLOCK_SIZE = 120;
4
- export class PolarModel {
5
- static getOptions(options, data, designerConfig, modelInstance) {
6
- return {
7
- type: options.type,
8
- selectable: !!options.selectable,
9
- title: options.title,
10
- data: Object.assign({}, options.data),
11
- charts: this.getChartsModel(options.chart, data[options.data.dataSource].length, designerConfig.chartStyle),
12
- legend: modelInstance.canvasModel.legendCanvas.getModel(),
13
- tooltip: options.tooltip,
14
- chartCanvas: this.getDonutSettings(designerConfig.canvas.chartOptions.donut, options.chart)
15
- };
16
- }
17
- //TODO: type for returned value
18
- static getLegendPositionByBlockSize(canvasModel) {
19
- const widthCoefficientWhenLegendShouldInBottom = 1.5;
20
- const avgLegendWidth = 100;
21
- const blockWidth = canvasModel.getBlockSize().width;
22
- const blockHeight = canvasModel.getBlockSize().height;
23
- return canvasModel.getChartBlockWidth() < MIN_DONUT_BLOCK_SIZE + avgLegendWidth
24
- && blockWidth * widthCoefficientWhenLegendShouldInBottom < blockHeight
25
- ? 'bottom'
26
- : 'right';
27
- }
28
- static doesChartBlockHasEnoughWidthForContainsLegend(chartBlockWidth, legendWidth, legendCoordinate) {
29
- const rightLegendMargin = legendCoordinate.right.margin;
30
- return chartBlockWidth - legendWidth - rightLegendMargin.left - rightLegendMargin.right >= MIN_DONUT_BLOCK_SIZE;
31
- }
32
- static doesChartBlockHasEnoughHeightForContainsLegend(chartBlockHeight, legendCoordinate) {
33
- const minHeightForLegend = 30;
34
- const bottomLegendMargin = legendCoordinate.bottom.margin;
35
- const heightForLegend = chartBlockHeight - bottomLegendMargin.bottom - bottomLegendMargin.top - MIN_DONUT_BLOCK_SIZE;
36
- return heightForLegend >= minHeightForLegend;
37
- }
38
- static getDonutSettings(settings, chartOptions) {
39
- return {
40
- padAngle: settings.padAngle,
41
- thickness: Object.assign({}, settings.thickness),
42
- aggregator: {
43
- margin: settings.aggregatorPad,
44
- text: chartOptions.aggregator.text
45
- }
46
- };
47
- }
48
- static getChartsModel(chart, dataLength, chartStyleConfig) {
49
- const chartsModel = [];
50
- chartsModel.push({
51
- type: chart.type,
52
- data: Object.assign({}, chart.data),
53
- tooltip: chart.tooltip,
54
- cssClasses: ChartStyleModelService.getCssClasses(0),
55
- style: ChartStyleModelService.getChartStyle(dataLength, chartStyleConfig)
56
- });
57
- return chartsModel;
58
- }
59
- }