mdt-charts 1.12.2 → 1.12.6

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.
Files changed (59) hide show
  1. package/lib/config/config.d.ts +19 -12
  2. package/lib/designer/designerConfig.d.ts +3 -5
  3. package/lib/engine/features/aggregator/aggregator.d.ts +9 -7
  4. package/lib/engine/features/aggregator/aggregator.js +51 -37
  5. package/lib/engine/features/gridLine/gidLineHelper.d.ts +2 -0
  6. package/lib/engine/features/gridLine/gidLineHelper.js +22 -0
  7. package/lib/engine/features/gridLine/gridLine.d.ts +5 -3
  8. package/lib/engine/features/gridLine/gridLine.js +16 -17
  9. package/lib/engine/features/scale/scale.d.ts +2 -0
  10. package/lib/engine/features/scale/scale.js +6 -3
  11. package/lib/engine/intervalNotation/intervalManager.js +1 -1
  12. package/lib/engine/polarNotation/donut/donut.js +1 -1
  13. package/lib/engine/polarNotation/polarManager.js +1 -1
  14. package/lib/engine/twoDimensionalNotation/area/areaHelper.js +2 -2
  15. package/lib/engine/twoDimensionalNotation/bar/bar.js +3 -3
  16. package/lib/engine/twoDimensionalNotation/bar/barHelper.js +8 -8
  17. package/lib/engine/twoDimensionalNotation/twoDimensionalManager.js +2 -2
  18. package/lib/model/chartStyleModel/TwoDimensionalChartStyleModel.d.ts +4 -4
  19. package/lib/model/dataManagerModel/dataManagerModel.js +1 -1
  20. package/lib/model/featuresModel/axisModel.d.ts +2 -1
  21. package/lib/model/featuresModel/axisModel.js +19 -5
  22. package/lib/model/featuresModel/legendModel/legendModel.js +3 -3
  23. package/lib/model/featuresModel/legendModel/polarMarginCalculator.js +1 -1
  24. package/lib/model/featuresModel/scaleModel/scaleAxisRecalcer.d.ts +20 -0
  25. package/lib/model/featuresModel/scaleModel/scaleAxisRecalcer.js +31 -0
  26. package/lib/model/featuresModel/scaleModel/scaleModel.d.ts +19 -0
  27. package/lib/model/featuresModel/scaleModel/scaleModel.js +115 -0
  28. package/lib/model/featuresModel/scaleModel.d.ts +7 -6
  29. package/lib/model/featuresModel/scaleModel.js +19 -4
  30. package/lib/model/featuresModel/titleModel.js +4 -4
  31. package/lib/model/marginModel.d.ts +1 -3
  32. package/lib/model/marginModel.js +7 -29
  33. package/lib/model/model.d.ts +18 -6
  34. package/lib/model/modelBuilder.js +8 -9
  35. package/lib/model/modelInstance/canvasModel/canvasModel.d.ts +5 -4
  36. package/lib/model/modelInstance/canvasModel/canvasModel.js +6 -2
  37. package/lib/model/modelInstance/canvasModel/marginModelService.d.ts +11 -0
  38. package/lib/model/modelInstance/canvasModel/marginModelService.js +26 -0
  39. package/lib/model/modelInstance/dataModel/dataModel.d.ts +14 -0
  40. package/lib/model/modelInstance/dataModel/dataModel.js +26 -0
  41. package/lib/model/modelInstance/dataModel/dataRepository.d.ts +12 -0
  42. package/lib/model/modelInstance/dataModel/dataRepository.js +20 -0
  43. package/lib/model/modelInstance/modelInstance.d.ts +3 -3
  44. package/lib/model/modelInstance/modelInstance.js +6 -4
  45. package/lib/model/notations/intervalModel.d.ts +2 -2
  46. package/lib/model/notations/intervalModel.js +1 -1
  47. package/lib/model/notations/polar/donut/donutAggregatorService.d.ts +12 -0
  48. package/lib/model/notations/polar/donut/donutAggregatorService.js +25 -0
  49. package/lib/model/notations/polar/donut/donutModel.d.ts +10 -0
  50. package/lib/model/notations/polar/donut/donutModel.js +32 -0
  51. package/lib/model/notations/polar/donut/donutThicknessService.d.ts +9 -0
  52. package/lib/model/notations/polar/donut/donutThicknessService.js +30 -0
  53. package/lib/model/notations/polar/polarModel.d.ts +15 -0
  54. package/lib/model/notations/polar/polarModel.js +53 -0
  55. package/lib/model/notations/twoDimensionalModel.d.ts +6 -6
  56. package/lib/model/notations/twoDimensionalModel.js +9 -5
  57. package/lib/style/charts-main.css +6 -2
  58. package/lib/style/charts-main.less +6 -2
  59. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  import { ModelHelper } from "../../modelHelper";
2
- import { PolarModel } from "../../notations/polarModel";
2
+ import { PolarModel } from "../../notations/polar/polarModel";
3
3
  import { LegendCanvasModel } from "./legendCanvasModel";
4
4
  export class LegendModel {
5
5
  static getLegendSize(chartNotation, position, texts, legendMaxWidth, blockSize, legendBlockModel) {
@@ -30,12 +30,12 @@ export class LegendModel {
30
30
  },
31
31
  right: {
32
32
  size: 0,
33
- margin: { top: canvasModel.titleCanvas.getAllNeededSpace(), bottom: mb, left: 10, right: 0 },
33
+ margin: { top: canvasModel.titleCanvas.getAllNeededSpace(), bottom: mb, left: 5, right: 0 },
34
34
  pad: 0
35
35
  },
36
36
  top: {
37
37
  size: 0,
38
- margin: { top: 10, bottom: 10, left: 20, right: 20 },
38
+ margin: { top: 5, bottom: 10, left: 0, right: 0 },
39
39
  pad: canvasModel.titleCanvas.getAllNeededSpace()
40
40
  }
41
41
  },
@@ -1,6 +1,6 @@
1
1
  import { DataManagerModel } from "../../dataManagerModel/dataManagerModel";
2
2
  import { MarginModel } from "../../marginModel";
3
- import { MIN_DONUT_BLOCK_SIZE } from "../../notations/polarModel";
3
+ import { MIN_DONUT_BLOCK_SIZE } from "../../notations/polar/polarModel";
4
4
  import { LegendModel } from "./legendModel";
5
5
  export class LegendPolarMarginCalculator {
6
6
  recalcMargin(modelInstance, options, legendMaxWidth, legendBlockModel, data) {
@@ -0,0 +1,20 @@
1
+ import { ScaleLinear, ScaleTime } from "d3-scale";
2
+ import { ChartOrientation, DiscreteAxisOptions } from "../../../config/config";
3
+ import { ScaleValueModel } from "../../model";
4
+ import { CanvasModel } from "../../modelInstance/canvasModel/canvasModel";
5
+ export declare const keyAxisLabelVerticalLog = "keyAxisLabel_vertical_margin_log";
6
+ export declare const keyAxisLabelHorizontalLog = "keyAxisLabel_horizontal_margin_log";
7
+ interface ScaleInfo {
8
+ scale: ScaleValueModel;
9
+ scaleFn: ScaleLinear<number, number, never> | ScaleTime<number, number, never>;
10
+ }
11
+ /**
12
+ * Предназначен для получения нового scaleValue и уменьшения globalMargin, если ось ключей находится где-то внутри chartBlock, а не на его границе
13
+ */
14
+ export declare class ScaleAxisRecalcer {
15
+ private generateScaleLinear;
16
+ constructor(generateScaleLinear: () => ScaleValueModel);
17
+ recalculateMargin(canvasModel: CanvasModel, chartOrientation: ChartOrientation, keyAxis: DiscreteAxisOptions): void;
18
+ getScaleValue(): ScaleInfo;
19
+ }
20
+ export {};
@@ -0,0 +1,31 @@
1
+ import { Scale } from "../../../engine/features/scale/scale";
2
+ export const keyAxisLabelVerticalLog = "keyAxisLabel_vertical_margin_log";
3
+ export const keyAxisLabelHorizontalLog = "keyAxisLabel_horizontal_margin_log";
4
+ /**
5
+ * Предназначен для получения нового scaleValue и уменьшения globalMargin, если ось ключей находится где-то внутри chartBlock, а не на его границе
6
+ */
7
+ export class ScaleAxisRecalcer {
8
+ constructor(generateScaleLinear) {
9
+ this.generateScaleLinear = generateScaleLinear;
10
+ }
11
+ recalculateMargin(canvasModel, chartOrientation, keyAxis) {
12
+ const scaleValue = this.generateScaleLinear();
13
+ //TODO: rm import from engine
14
+ const scaleValueFn = Scale.getScaleValue(scaleValue);
15
+ const coordinateOnChartBlock = (keyAxis.position === "start"
16
+ ? scaleValueFn(0)
17
+ : (chartOrientation === "vertical"
18
+ ? canvasModel.getChartBlockHeight()
19
+ : canvasModel.getChartBlockWidth()) - scaleValueFn(0));
20
+ const key = chartOrientation === "vertical" ? keyAxisLabelVerticalLog : keyAxisLabelHorizontalLog;
21
+ const logInfo = canvasModel.marginService.getDataByKey(key);
22
+ canvasModel.decreaseMarginSide(logInfo.side, logInfo.byValue - coordinateOnChartBlock < 0 ? logInfo.byValue : coordinateOnChartBlock);
23
+ }
24
+ getScaleValue() {
25
+ const scale = this.generateScaleLinear();
26
+ return {
27
+ scale,
28
+ scaleFn: Scale.getScaleValue(scale)
29
+ };
30
+ }
31
+ }
@@ -0,0 +1,19 @@
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
+ }
@@ -0,0 +1,115 @@
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,18 +1,19 @@
1
1
  import { ScaleKeyModel, ScaleKeyType, ScaleValueModel, ScaleValueType } from "../model";
2
- import { AxisPosition, NumberDomain, IntervalChart, TwoDimensionalChart, MdtChartsTwoDimensionalOptions, ChartOrientation, MdtChartsDataSource } from "../../config/config";
2
+ import { AxisPosition, NumberDomain, IntervalChart, MdtChartsTwoDimensionalChart, MdtChartsTwoDimensionalOptions, ChartOrientation, MdtChartsDataSource, MdtChartsDataRow } from "../../config/config";
3
3
  import { CanvasModel } from "../modelInstance/canvasModel/canvasModel";
4
4
  export declare enum ScaleType {
5
5
  Key = 0,
6
6
  Value = 1
7
7
  }
8
8
  export declare class ScaleModel {
9
- static getScaleKey(allowableKeys: string[], orient: ChartOrientation, canvasModel: CanvasModel, charts: TwoDimensionalChart[], barCharts: TwoDimensionalChart[]): ScaleKeyModel;
9
+ static getScaleKey(allowableKeys: string[], orient: ChartOrientation, canvasModel: CanvasModel, charts: MdtChartsTwoDimensionalChart[], barCharts: MdtChartsTwoDimensionalChart[]): ScaleKeyModel;
10
10
  static getScaleLinear(options: MdtChartsTwoDimensionalOptions, data: MdtChartsDataSource, canvasModel: CanvasModel): ScaleValueModel;
11
11
  static getRangePeek(scaleType: ScaleType, chartOrientation: string, canvasModel: CanvasModel): number;
12
12
  static getDateValueDomain(data: MdtChartsDataSource, chart: IntervalChart, keyAxisPosition: AxisPosition, dataSource: string): [Date, Date];
13
13
  static getLinearDomain(configDomain: NumberDomain, data: MdtChartsDataSource, configOptions: MdtChartsTwoDimensionalOptions): [number, number];
14
- static getScaleKeyType(charts: TwoDimensionalChart[]): ScaleKeyType;
15
- static getScaleValueType(charts: TwoDimensionalChart[] | IntervalChart[]): ScaleValueType;
16
- static getElementsAmount(barCharts: TwoDimensionalChart[]): number;
17
- static getScaleMaxValue(charts: TwoDimensionalChart[], dataSource: string, data: MdtChartsDataSource): 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;
18
19
  }
@@ -47,11 +47,11 @@ export class ScaleModel {
47
47
  let domainPeekMin;
48
48
  let domainPeekMax;
49
49
  if (configDomain.start === -1)
50
- domainPeekMin = 0;
50
+ domainPeekMin = this.getScaleMinValue(configOptions.charts, data[configOptions.data.dataSource]);
51
51
  else
52
52
  domainPeekMin = configDomain.start;
53
53
  if (configDomain.end === -1)
54
- domainPeekMax = this.getScaleMaxValue(configOptions.charts, configOptions.data.dataSource, data);
54
+ domainPeekMax = this.getScaleMaxValue(configOptions.charts, data[configOptions.data.dataSource]);
55
55
  else
56
56
  domainPeekMax = configDomain.end;
57
57
  if (configOptions.axis.key.position === 'start')
@@ -80,10 +80,10 @@ export class ScaleModel {
80
80
  });
81
81
  return barsAmount;
82
82
  }
83
- static getScaleMaxValue(charts, dataSource, data) {
83
+ static getScaleMaxValue(charts, dataRows) {
84
84
  let max = 0;
85
85
  charts.forEach(chart => {
86
- data[dataSource].forEach(dataRow => {
86
+ dataRows.forEach(dataRow => {
87
87
  let sumInRow = 0;
88
88
  chart.data.valueFields.forEach(field => {
89
89
  if (chart.isSegmented)
@@ -97,4 +97,19 @@ export class ScaleModel {
97
97
  });
98
98
  return max;
99
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
+ }
100
115
  }
@@ -4,10 +4,10 @@ export class TitleModel {
4
4
  const pad = titleText ? defaultPads : 0;
5
5
  return {
6
6
  margin: {
7
- bottom: 10,
8
- left: pad,
9
- right: pad,
10
- top: pad
7
+ bottom: 5,
8
+ left: 0,
9
+ right: 0,
10
+ top: 0
11
11
  },
12
12
  size: pad,
13
13
  pad: 0
@@ -1,13 +1,12 @@
1
1
  import { MdtChartsConfig, MdtChartsDataSource } from "../config/config";
2
2
  import { DesignerConfig } from "../designer/designerConfig";
3
- import { DataScope, LegendBlockModel, Orient, OtherCommonComponents, PolarOptionsModel } from "./model";
3
+ import { DataScope, LegendBlockModel, Orient, OtherCommonComponents } from "./model";
4
4
  import { ModelInstance } from "./modelInstance/modelInstance";
5
5
  import { CanvasModel } from "./modelInstance/canvasModel/canvasModel";
6
6
  export declare const AXIS_HORIZONTAL_LABEL_PADDING = 15;
7
7
  export declare const AXIS_VERTICAL_LABEL_PADDING = 10;
8
8
  export declare class MarginModel {
9
9
  static initMargin(designerConfig: DesignerConfig, config: MdtChartsConfig, otherComponents: OtherCommonComponents, data: MdtChartsDataSource, modelInstance: ModelInstance): void;
10
- static recalcPolarMarginWithScopedData(modelInstance: ModelInstance, designerConfig: DesignerConfig, config: MdtChartsConfig, legendBlockModel: LegendBlockModel, dataScope: DataScope, options: PolarOptionsModel): void;
11
10
  static recalcMarginByVerticalAxisLabel(modelInstance: ModelInstance, config: MdtChartsConfig, designerConfig: DesignerConfig, dataScope: DataScope): void;
12
11
  private static getHorizontalMarginByAxisLabels;
13
12
  private static recalcVerticalMarginByAxisLabelHeight;
@@ -15,6 +14,5 @@ export declare class MarginModel {
15
14
  private static recalcMarginWithLegend;
16
15
  private static getLegendItemsContent;
17
16
  static appendToGlobalMarginValuesLegendMargin(canvasModel: CanvasModel, position: Orient, legendBlockModel: LegendBlockModel): void;
18
- private static clearMarginByLegendBlockPosition;
19
17
  private static recalcMarginByTitle;
20
18
  }
@@ -3,7 +3,7 @@ import { DataManagerModel } from "./dataManagerModel/dataManagerModel";
3
3
  import { LegendModel } from "./featuresModel/legendModel/legendModel";
4
4
  import { AxisType } from "./modelBuilder";
5
5
  import { TwoDimensionalModel } from "./notations/twoDimensionalModel";
6
- import { PolarModel } from "./notations/polarModel";
6
+ import { keyAxisLabelHorizontalLog, keyAxisLabelVerticalLog } from "./featuresModel/scaleModel/scaleAxisRecalcer";
7
7
  export const AXIS_HORIZONTAL_LABEL_PADDING = 15;
8
8
  export const AXIS_VERTICAL_LABEL_PADDING = 10;
9
9
  export class MarginModel {
@@ -24,28 +24,15 @@ export class MarginModel {
24
24
  this.recalcHorizontalMarginByAxisLabelWidth(labelSize, canvasModel, config.options.orientation, config.options.axis, showingFlag);
25
25
  }
26
26
  }
27
- static recalcPolarMarginWithScopedData(modelInstance, designerConfig, config, legendBlockModel, dataScope, options) {
28
- const canvasModel = modelInstance.canvasModel;
29
- let position = canvasModel.legendCanvas.getPosition();
30
- if (position !== 'off') {
31
- position = PolarModel.getLegendPositionByBlockSize(canvasModel); // reset position
32
- this.clearMarginByLegendBlockPosition(canvasModel, legendBlockModel);
33
- let allowableKeys = [...dataScope.allowableKeys];
34
- if (dataScope.hidedRecordsAmount !== 0 && position === 'bottom')
35
- allowableKeys.push('1'); // Если есть спрятанные записи, то в массив добавляется объект, чтобы выделить место в легенде для индикатора переполнения
36
- const legendSize = LegendModel.getLegendSize(config.options.type, position, allowableKeys, designerConfig.canvas.legendBlock.maxWidth, config.canvas.size, legendBlockModel);
37
- canvasModel.increaseMarginSide(position, legendSize + legendBlockModel.coordinate[position].margin[position]);
38
- legendBlockModel.coordinate[position].size = legendSize;
39
- options.legend.position = position;
40
- }
41
- }
42
27
  static recalcMarginByVerticalAxisLabel(modelInstance, config, designerConfig, dataScope) {
43
28
  if ((config.options.type === '2d' || config.options.type === 'interval') && config.options.orientation === 'vertical') {
44
29
  const axisLabelSize = AxisModel.getLabelSize(designerConfig.canvas.axisLabel.maxSize.main, dataScope.allowableKeys);
45
30
  const axisConfig = AxisModel.getKeyAxisLabelPosition(modelInstance.canvasModel, dataScope.allowableKeys.length, config.options.axis.key);
46
31
  const marginOrient = config.options.axis.key.position === 'end' ? 'bottom' : 'top';
47
- if (axisConfig === 'rotated')
48
- modelInstance.canvasModel.setMarginSide(marginOrient, modelInstance.canvasModel.getMarginSide(marginOrient) + (axisLabelSize.width - axisLabelSize.height));
32
+ if (axisConfig === 'rotated') {
33
+ modelInstance.canvasModel.decreaseMarginSide(marginOrient, axisLabelSize.height);
34
+ modelInstance.canvasModel.increaseMarginSide(marginOrient, axisLabelSize.width, keyAxisLabelVerticalLog);
35
+ }
49
36
  }
50
37
  }
51
38
  static getHorizontalMarginByAxisLabels(labelsMaxWidth, axis, data, options) {
@@ -64,7 +51,7 @@ export class MarginModel {
64
51
  const valueAxisOrient = AxisModel.getAxisOrient(AxisType.Value, orientation, axis.value.position);
65
52
  if ((keyAxisOrient === 'bottom' || keyAxisOrient === 'top')) {
66
53
  if (axis.key.visibility)
67
- canvasModel.increaseMarginSide(keyAxisOrient, labelSize.height + AXIS_HORIZONTAL_LABEL_PADDING);
54
+ canvasModel.increaseMarginSide(keyAxisOrient, labelSize.height + AXIS_HORIZONTAL_LABEL_PADDING, keyAxisLabelVerticalLog);
68
55
  }
69
56
  else if (axis.value.visibility)
70
57
  canvasModel.increaseMarginSide(valueAxisOrient, labelSize.height + AXIS_HORIZONTAL_LABEL_PADDING);
@@ -73,7 +60,7 @@ export class MarginModel {
73
60
  const keyAxisOrient = AxisModel.getAxisOrient(AxisType.Key, orientation, axis.key.position);
74
61
  const valueAxisOrient = AxisModel.getAxisOrient(AxisType.Value, orientation, axis.value.position);
75
62
  if ((keyAxisOrient === 'left' || keyAxisOrient === 'right') && isShow && axis.key.visibility) {
76
- canvasModel.increaseMarginSide(keyAxisOrient, labelSize.width + AXIS_VERTICAL_LABEL_PADDING);
63
+ canvasModel.increaseMarginSide(keyAxisOrient, labelSize.width + AXIS_VERTICAL_LABEL_PADDING, keyAxisLabelHorizontalLog);
77
64
  }
78
65
  else if ((valueAxisOrient === 'left' || valueAxisOrient === 'right') && axis.value.visibility) {
79
66
  canvasModel.increaseMarginSide(valueAxisOrient, labelSize.width + AXIS_VERTICAL_LABEL_PADDING);
@@ -117,15 +104,6 @@ export class MarginModel {
117
104
  else
118
105
  canvasModel.increaseMarginSide(position, legendCoordinate[position].margin.top + legendCoordinate[position].margin.bottom);
119
106
  }
120
- static clearMarginByLegendBlockPosition(canvasModel, legendBlockModel) {
121
- const legendCoordinate = legendBlockModel.coordinate;
122
- ['left', 'right', 'top', 'bottom'].forEach((position) => {
123
- const decreaseByValue = legendCoordinate[position].size === 0
124
- ? 0
125
- : legendCoordinate[position].size + legendCoordinate[position].margin[position];
126
- canvasModel.descreaseMarginSide(position, decreaseByValue);
127
- });
128
- }
129
107
  static recalcMarginByTitle(canvasModel, titleBlockModel) {
130
108
  canvasModel.increaseMarginSide("top", titleBlockModel.margin.top + titleBlockModel.size + titleBlockModel.margin.bottom);
131
109
  }
@@ -9,10 +9,10 @@ export declare type EmbeddedLabelTypeModel = "none" | "key" | "value";
9
9
  export declare type DataOptions = {
10
10
  [option: string]: any;
11
11
  };
12
- export interface Model {
12
+ export interface Model<O = TwoDimensionalOptionsModel | PolarOptionsModel | IntervalOptionsModel> {
13
13
  blockCanvas: BlockCanvas;
14
14
  chartBlock: ChartBlockModel;
15
- options: TwoDimensionalOptionsModel | PolarOptionsModel | IntervalOptionsModel;
15
+ options: O;
16
16
  otherComponents: OtherCommonComponents;
17
17
  dataSettings: DataSettings;
18
18
  transitions?: Transitions;
@@ -136,12 +136,24 @@ export interface BarChartSettings {
136
136
  maxBarWidth: number;
137
137
  minBarWidth: number;
138
138
  }
139
- export interface DonutChartSettings extends Omit<DonutOptionsCanvas, "aggregatorPad"> {
140
- aggregator: DonutChartAggreagorModel;
139
+ export interface DonutChartSettings extends Omit<DonutOptionsCanvas, "aggregatorPad" | "thickness"> {
140
+ aggregator: DonutAggregatorModel;
141
+ thickness: DonutThicknessOptions;
141
142
  }
142
- export interface DonutChartAggreagorModel {
143
+ export interface DonutAggregatorModel {
143
144
  margin: number;
144
- text: string;
145
+ content: DonutAggregatorContent;
146
+ }
147
+ export interface DonutAggregatorContent {
148
+ value: string | number;
149
+ title: string;
150
+ }
151
+ export declare type DonutThicknessUnit = "px" | "%";
152
+ export interface DonutThicknessOptions {
153
+ min: number;
154
+ max: number;
155
+ value: number;
156
+ unit: DonutThicknessUnit;
145
157
  }
146
158
  interface ChartModel {
147
159
  tooltip: TooltipModel;
@@ -1,6 +1,6 @@
1
1
  import { MarginModel } from './marginModel';
2
2
  import { TwoDimensionalModel } from './notations/twoDimensionalModel';
3
- import { PolarModel } from './notations/polarModel';
3
+ import { PolarModel } from './notations/polar/polarModel';
4
4
  import { DataManagerModel } from './dataManagerModel/dataManagerModel';
5
5
  import { IntervalModel } from './notations/intervalModel';
6
6
  import { OtherComponentsModel } from './featuresModel/otherComponents';
@@ -30,16 +30,16 @@ function getChartBlockModel(modelInstance) {
30
30
  margin: modelInstance.canvasModel.getMargin()
31
31
  };
32
32
  }
33
- function getOptions(config, designerConfig, modelInstance, dataScope, data) {
33
+ function getOptions(config, designerConfig, modelInstance, data) {
34
34
  //TODO: migrate to polymorphism
35
35
  if (config.options.type === '2d') {
36
- return TwoDimensionalModel.getOptions(config.options, designerConfig, dataScope, data, modelInstance);
36
+ return TwoDimensionalModel.getOptions(config.options, designerConfig, data, modelInstance);
37
37
  }
38
38
  else if (config.options.type === 'polar') {
39
- return PolarModel.getOptions(config.options, data, designerConfig, modelInstance);
39
+ return PolarModel.getOptions(config.options, designerConfig, modelInstance);
40
40
  }
41
41
  else if (config.options.type === 'interval') {
42
- return IntervalModel.getOptions(config, designerConfig, modelInstance.canvasModel.getMargin(), dataScope, data, modelInstance);
42
+ return IntervalModel.getOptions(config, designerConfig, modelInstance.canvasModel.getMargin(), modelInstance.dataModel.getScope(), data, modelInstance);
43
43
  }
44
44
  }
45
45
  function getDataSettings(dataScope, designerConfig) {
@@ -57,7 +57,7 @@ function getTransitions(designerConfig) {
57
57
  return designerConfig.transitions;
58
58
  }
59
59
  export function assembleModel(config, data, designerConfig) {
60
- const modelInstance = ModelInstance.create(config);
60
+ const modelInstance = ModelInstance.create(config, data);
61
61
  if (!data || Object.keys(data).length === 0)
62
62
  return {
63
63
  blockCanvas: getBlockCanvas(config, modelInstance),
@@ -71,15 +71,14 @@ export function assembleModel(config, data, designerConfig) {
71
71
  MarginModel.initMargin(designerConfig, config, otherComponents, data, modelInstance);
72
72
  DataManagerModel.initDataScope(config, data, designerConfig, otherComponents.legendBlock, modelInstance);
73
73
  const preparedData = DataManagerModel.getPreparedData(data, modelInstance.dataModel.getAllowableKeys(), config);
74
+ modelInstance.dataModel.repository.initScopedFullSource(preparedData);
74
75
  if (config.options.type === '2d' && config.options.axis.key.visibility)
75
76
  MarginModel.recalcMarginByVerticalAxisLabel(modelInstance, config, designerConfig, modelInstance.dataModel.getScope());
76
77
  const blockCanvas = getBlockCanvas(config, modelInstance);
77
78
  const chartBlock = getChartBlockModel(modelInstance);
78
- const options = getOptions(config, designerConfig, modelInstance, modelInstance.dataModel.getScope(), preparedData);
79
+ const options = getOptions(config, designerConfig, modelInstance, preparedData);
79
80
  const dataSettings = getDataSettings(modelInstance.dataModel.getScope(), designerConfig);
80
81
  const transitions = getTransitions(designerConfig);
81
- // if (options.type === 'polar')
82
- // MarginModel.recalcPolarMarginWithScopedData(modelInstance, designerConfig, config, otherComponents.legendBlock, modelInstance.dataModel.getScope(), options);
83
82
  modelInstance.canvasModel.roundMargin();
84
83
  return {
85
84
  blockCanvas,
@@ -1,11 +1,13 @@
1
1
  import { Size } from "../../../config/config";
2
2
  import { BlockMargin } from "../../model";
3
3
  import { LegendCanvasModelInstance } from "./legendCanvasModel";
4
+ import { MarginModelService } from "./marginModelService";
4
5
  import { TitleCanvasModel } from "./titleCanvas";
5
- declare type MarginSide = keyof BlockMargin;
6
+ export declare type MarginSide = keyof BlockMargin;
6
7
  export declare class CanvasModel {
7
8
  titleCanvas: TitleCanvasModel;
8
9
  legendCanvas: LegendCanvasModelInstance;
10
+ marginService: MarginModelService;
9
11
  private blockSize;
10
12
  private margin;
11
13
  constructor();
@@ -13,12 +15,11 @@ export declare class CanvasModel {
13
15
  getMargin(): BlockMargin;
14
16
  getMarginSide(side: MarginSide): number;
15
17
  setMarginSide(side: MarginSide, size: number): void;
16
- increaseMarginSide(side: MarginSide, byValue: number): void;
17
- descreaseMarginSide(side: MarginSide, byValue: number): void;
18
+ increaseMarginSide(side: MarginSide, byValue: number, key?: string): void;
19
+ decreaseMarginSide(side: MarginSide, byValue: number): void;
18
20
  roundMargin(): void;
19
21
  initBlockSize(blockSize: Size): void;
20
22
  getBlockSize(): Size;
21
23
  getChartBlockWidth(): number;
22
24
  getChartBlockHeight(): number;
23
25
  }
24
- export {};
@@ -1,9 +1,11 @@
1
1
  import { LegendCanvasModelInstance } from "./legendCanvasModel";
2
+ import { MarginModelService } from "./marginModelService";
2
3
  import { TitleCanvasModel } from "./titleCanvas";
3
4
  export class CanvasModel {
4
5
  constructor() {
5
6
  this.titleCanvas = new TitleCanvasModel();
6
7
  this.legendCanvas = new LegendCanvasModelInstance();
8
+ this.marginService = new MarginModelService();
7
9
  }
8
10
  initMargin(margin) {
9
11
  this.margin = margin;
@@ -17,10 +19,12 @@ export class CanvasModel {
17
19
  setMarginSide(side, size) {
18
20
  this.margin[side] = size;
19
21
  }
20
- increaseMarginSide(side, byValue) {
22
+ increaseMarginSide(side, byValue, key) {
21
23
  this.margin[side] += byValue;
24
+ if (key)
25
+ this.marginService.appendLog(key, side, byValue);
22
26
  }
23
- descreaseMarginSide(side, byValue) {
27
+ decreaseMarginSide(side, byValue) {
24
28
  this.margin[side] -= byValue;
25
29
  }
26
30
  roundMargin() {
@@ -0,0 +1,11 @@
1
+ import { MarginSide } from "./canvasModel";
2
+ export interface MarginLogData {
3
+ side: MarginSide;
4
+ byValue: number;
5
+ }
6
+ export declare class MarginModelService {
7
+ private log;
8
+ appendLog(key: string, side: MarginSide, byValue: number): void;
9
+ getDataByKey(key: string): MarginLogData;
10
+ private findLogByKey;
11
+ }
@@ -0,0 +1,26 @@
1
+ export class MarginModelService {
2
+ constructor() {
3
+ this.log = [];
4
+ }
5
+ appendLog(key, side, byValue) {
6
+ const log = this.findLogByKey(key);
7
+ if (log) {
8
+ log.data = { side, byValue };
9
+ return;
10
+ }
11
+ this.log.push({
12
+ key,
13
+ data: {
14
+ side,
15
+ byValue
16
+ }
17
+ });
18
+ }
19
+ getDataByKey(key) {
20
+ var _a;
21
+ return (_a = this.findLogByKey(key)) === null || _a === void 0 ? void 0 : _a.data;
22
+ }
23
+ findLogByKey(key) {
24
+ return this.log.find(l => l.key === key);
25
+ }
26
+ }
@@ -0,0 +1,14 @@
1
+ import { DataScope } from "../../model";
2
+ import { DataRepositoryModel } from "./dataRepository";
3
+ export declare const DEFAULT_MAX_RECORDS_AMOUNT = 50;
4
+ export declare class DataModelInstance {
5
+ repository: DataRepositoryModel;
6
+ constructor();
7
+ private maxRecordsAmount;
8
+ private scope;
9
+ initMaxRecordsAmount(amount: number): void;
10
+ getMaxRecordsAmount(): number;
11
+ initScope(scope: DataScope): void;
12
+ getScope(): DataScope;
13
+ getAllowableKeys(): string[];
14
+ }
@@ -0,0 +1,26 @@
1
+ import { DataRepositoryModel } from "./dataRepository";
2
+ export const DEFAULT_MAX_RECORDS_AMOUNT = 50;
3
+ export class DataModelInstance {
4
+ constructor() {
5
+ //TODO: create dataScopeModel.
6
+ this.maxRecordsAmount = DEFAULT_MAX_RECORDS_AMOUNT;
7
+ this.repository = new DataRepositoryModel();
8
+ }
9
+ initMaxRecordsAmount(amount) {
10
+ if (typeof amount === "number" && amount > 0) {
11
+ this.maxRecordsAmount = amount;
12
+ }
13
+ }
14
+ getMaxRecordsAmount() {
15
+ return this.maxRecordsAmount;
16
+ }
17
+ initScope(scope) {
18
+ this.scope = scope;
19
+ }
20
+ getScope() {
21
+ return this.scope;
22
+ }
23
+ getAllowableKeys() {
24
+ return this.getScope().allowableKeys;
25
+ }
26
+ }