cx 24.11.3 → 25.1.0

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 (108) hide show
  1. package/dist/charts.js +18 -17
  2. package/dist/data.js +2 -2
  3. package/dist/manifest.js +707 -698
  4. package/dist/ui.js +5 -4
  5. package/dist/util.js +40 -10
  6. package/dist/widgets.js +42 -35
  7. package/package.json +32 -32
  8. package/src/charts/Legend.js +167 -167
  9. package/src/charts/Legend.scss +40 -40
  10. package/src/charts/LegendEntry.js +128 -128
  11. package/src/charts/LegendEntry.scss +27 -27
  12. package/src/charts/PieChart.d.ts +92 -92
  13. package/src/charts/PieChart.js +529 -529
  14. package/src/charts/axis/Axis.d.ts +113 -113
  15. package/src/charts/axis/Axis.js +280 -280
  16. package/src/charts/axis/CategoryAxis.d.ts +30 -30
  17. package/src/charts/axis/CategoryAxis.js +241 -241
  18. package/src/charts/axis/NumericAxis.js +351 -351
  19. package/src/charts/axis/Stack.js +55 -55
  20. package/src/charts/axis/TimeAxis.d.ts +28 -28
  21. package/src/charts/axis/TimeAxis.js +611 -610
  22. package/src/charts/helpers/PointReducer.js +47 -47
  23. package/src/charts/helpers/SnapPointFinder.js +69 -69
  24. package/src/data/Binding.spec.js +69 -69
  25. package/src/data/Expression.js +221 -221
  26. package/src/data/Expression.spec.js +217 -217
  27. package/src/data/StringTemplate.js +2 -2
  28. package/src/data/StringTemplate.spec.js +110 -105
  29. package/src/data/getAccessor.spec.js +11 -11
  30. package/src/hooks/createLocalStorageRef.d.ts +3 -3
  31. package/src/hooks/createLocalStorageRef.js +20 -20
  32. package/src/index.scss +6 -6
  33. package/src/ui/Culture.d.ts +57 -55
  34. package/src/ui/Culture.js +139 -139
  35. package/src/ui/FocusManager.js +171 -171
  36. package/src/ui/Format.js +5 -4
  37. package/src/ui/HoverSync.js +3 -3
  38. package/src/ui/Instance.d.ts +72 -72
  39. package/src/ui/Instance.js +614 -614
  40. package/src/ui/Repeater.d.ts +61 -61
  41. package/src/ui/index.d.ts +42 -42
  42. package/src/ui/layout/ContentPlaceholder.d.ts +19 -19
  43. package/src/ui/layout/ContentPlaceholder.js +105 -105
  44. package/src/ui/layout/ContentPlaceholder.spec.js +579 -579
  45. package/src/ui/layout/LabelsTopLayout.js +134 -134
  46. package/src/util/Format.js +3 -2
  47. package/src/util/date/encodeDate.d.ts +1 -0
  48. package/src/util/date/encodeDate.js +8 -0
  49. package/src/util/date/encodeDateWithTimezoneOffset.d.ts +1 -1
  50. package/src/util/date/index.d.ts +11 -9
  51. package/src/util/date/index.js +11 -9
  52. package/src/util/date/parseDateInvariant.d.ts +3 -0
  53. package/src/util/date/parseDateInvariant.js +20 -0
  54. package/src/util/getSearchQueryPredicate.js +59 -59
  55. package/src/util/index.d.ts +51 -51
  56. package/src/util/index.js +54 -54
  57. package/src/util/isValidIdentifierName.d.ts +1 -1
  58. package/src/util/isValidIdentifierName.js +5 -5
  59. package/src/util/isValidIdentifierName.spec.js +33 -33
  60. package/src/util/scss/add-rules.scss +38 -38
  61. package/src/widgets/CxCredit.scss +37 -37
  62. package/src/widgets/HighlightedSearchText.js +36 -36
  63. package/src/widgets/HighlightedSearchText.scss +18 -18
  64. package/src/widgets/List.scss +91 -91
  65. package/src/widgets/drag-drop/DropZone.js +214 -214
  66. package/src/widgets/form/Calendar.js +7 -6
  67. package/src/widgets/form/Calendar.scss +196 -196
  68. package/src/widgets/form/Checkbox.scss +127 -127
  69. package/src/widgets/form/ColorField.js +397 -397
  70. package/src/widgets/form/ColorField.scss +96 -96
  71. package/src/widgets/form/ColorPicker.scss +283 -283
  72. package/src/widgets/form/DateTimeField.js +576 -573
  73. package/src/widgets/form/DateTimePicker.js +9 -8
  74. package/src/widgets/form/LookupField.d.ts +179 -179
  75. package/src/widgets/form/LookupField.scss +219 -219
  76. package/src/widgets/form/MonthField.js +517 -516
  77. package/src/widgets/form/MonthPicker.js +17 -16
  78. package/src/widgets/form/MonthPicker.scss +118 -118
  79. package/src/widgets/form/NumberField.js +459 -459
  80. package/src/widgets/form/NumberField.scss +61 -61
  81. package/src/widgets/form/Radio.scss +121 -121
  82. package/src/widgets/form/Select.scss +99 -99
  83. package/src/widgets/form/Slider.scss +118 -118
  84. package/src/widgets/form/Switch.scss +140 -140
  85. package/src/widgets/form/TextArea.scss +43 -43
  86. package/src/widgets/form/TextField.js +290 -290
  87. package/src/widgets/form/TextField.scss +55 -55
  88. package/src/widgets/form/UploadButton.d.ts +34 -34
  89. package/src/widgets/form/variables.scss +353 -353
  90. package/src/widgets/grid/Grid.d.ts +442 -442
  91. package/src/widgets/grid/Grid.js +5 -4
  92. package/src/widgets/grid/Grid.scss +637 -637
  93. package/src/widgets/grid/GridRow.js +2 -2
  94. package/src/widgets/grid/TreeNode.d.ts +23 -23
  95. package/src/widgets/grid/TreeNode.scss +88 -88
  96. package/src/widgets/grid/variables.scss +133 -133
  97. package/src/widgets/nav/Menu.scss +74 -74
  98. package/src/widgets/overlay/Dropdown.js +612 -612
  99. package/src/widgets/overlay/FlyweightTooltipTracker.js +39 -39
  100. package/src/widgets/overlay/Overlay.d.ts +73 -73
  101. package/src/widgets/overlay/Tooltip.js +303 -303
  102. package/src/widgets/overlay/Window.js +202 -202
  103. package/src/widgets/overlay/captureMouse.js +124 -124
  104. package/src/widgets/overlay/createHotPromiseWindowFactory.d.ts +18 -18
  105. package/src/widgets/overlay/createHotPromiseWindowFactory.js +56 -52
  106. package/src/widgets/overlay/index.d.ts +11 -11
  107. package/src/widgets/overlay/index.js +11 -11
  108. package/src/widgets/variables.scss +144 -144
@@ -1,167 +1,167 @@
1
- import { Widget, VDOM } from "../ui/Widget";
2
- import { HtmlElement } from "../widgets/HtmlElement";
3
- import { PureContainer } from "../ui/PureContainer";
4
- import { getShape } from "./shapes";
5
- import { isUndefined } from "../util/isUndefined";
6
- import { isNonEmptyArray } from "../util/isNonEmptyArray";
7
- import { parseStyle } from "../util/parseStyle";
8
- import { withHoverSync } from "../ui/HoverSync";
9
-
10
- export class Legend extends HtmlElement {
11
- declareData() {
12
- super.declareData(...arguments, {
13
- shape: undefined,
14
- entryStyle: { structured: true },
15
- entryClass: { structured: true },
16
- });
17
- }
18
-
19
- init() {
20
- this.entryStyle = parseStyle(this.entryStyle);
21
- super.init();
22
- }
23
-
24
- prepareData(context, instance) {
25
- let { data } = instance;
26
- data.stateMods = Object.assign(data.stateMods || {}, {
27
- vertical: this.vertical,
28
- });
29
- super.prepareData(context, instance);
30
- }
31
-
32
- isValidHtmlAttribute(attrName) {
33
- switch (attrName) {
34
- case "shapeSize":
35
- case "svgSize":
36
- case "shape":
37
- case "entryStyle":
38
- case "entryClass":
39
- return false;
40
-
41
- default:
42
- return super.isValidHtmlAttribute(attrName);
43
- }
44
- }
45
-
46
- explore(context, instance) {
47
- if (!context.legends) context.legends = {};
48
-
49
- instance.legends = context.legends;
50
-
51
- context.addLegendEntry = (legendName, entry) => {
52
- if (!legendName) return;
53
-
54
- //case when all legends are scoped and new entry is added outside the scope
55
- if (!context.legends) return;
56
-
57
- let legend = context.legends[legendName];
58
- if (!legend)
59
- legend = context.legends[legendName] = {
60
- entries: [],
61
- names: {},
62
- };
63
-
64
- if (!legend.names[entry.name]) {
65
- legend.entries.push(entry);
66
- legend.names[entry.name] = entry;
67
- }
68
- };
69
-
70
- super.explore(context, instance);
71
- }
72
-
73
- renderChildren(context, instance) {
74
- const CSS = this.CSS;
75
-
76
- let entries = instance.legends[this.name] && instance.legends[this.name].entries,
77
- list;
78
-
79
- let { entryClass, entryStyle, shape } = instance.data;
80
-
81
- if (isNonEmptyArray(entries)) {
82
- list = entries.map((e, i) =>
83
- withHoverSync(i, e.hoverSync, e.hoverChannel, e.hoverId, ({ onMouseMove, onMouseLeave, hover }) => (
84
- <div
85
- key={i}
86
- className={CSS.expand(
87
- CSS.element(this.baseClass, "entry", {
88
- "color-root": true,
89
- hover,
90
- disabled: e.disabled,
91
- selected: e.selected,
92
- }),
93
- entryClass,
94
- )}
95
- style={entryStyle}
96
- onClick={e.onClick}
97
- onMouseMove={onMouseMove}
98
- onMouseLeave={onMouseLeave}
99
- >
100
- {this.renderShape(e, shape)}
101
- <div>{e.displayText || e.name}</div>
102
- </div>
103
- )),
104
- );
105
- }
106
-
107
- return [list, super.renderChildren(context, instance)];
108
- }
109
-
110
- renderShape(entry, legendEntriesShape) {
111
- const className = this.CSS.element(this.baseClass, "shape", {
112
- [`color-${entry.colorIndex}`]: entry.colorIndex != null && (isUndefined(entry.active) || entry.active),
113
- });
114
- const shape = getShape(legendEntriesShape || entry.shape || "square");
115
-
116
- // if the entry has a custom fill or stroke set, use it for both values
117
- let style = { ...entry.style };
118
- style.fill = style.fill ?? style.stroke;
119
- style.stroke = style.stroke ?? style.fill;
120
-
121
- return (
122
- <svg
123
- className={this.CSS.element(this.baseClass, "svg")}
124
- style={{
125
- width: `${this.svgSize}px`,
126
- height: `${this.svgSize}px`,
127
- }}
128
- >
129
- {shape(this.svgSize / 2, this.svgSize / 2, entry.shapeSize || this.shapeSize, {
130
- style,
131
- className,
132
- })}
133
- </svg>
134
- );
135
- }
136
- }
137
-
138
- Legend.prototype.name = "legend";
139
- Legend.prototype.baseClass = "legend";
140
- Legend.prototype.vertical = false;
141
- Legend.prototype.memoize = false;
142
- Legend.prototype.shapeSize = 18;
143
- Legend.prototype.shape = null;
144
- Legend.prototype.svgSize = 20;
145
-
146
- Widget.alias("legend", Legend);
147
-
148
- Legend.Scope = class extends PureContainer {
149
- explore(context, instance) {
150
- context.push("legends", (instance.legends = {}));
151
- super.explore(context, instance);
152
- }
153
-
154
- exploreCleanup(context, instance) {
155
- context.pop("legends");
156
- }
157
-
158
- prepare(context, instance) {
159
- context.push("legends", instance.legends);
160
- }
161
-
162
- prepareCleanup(context, instance) {
163
- context.pop("legends");
164
- }
165
- };
166
-
167
- export const LegendScope = Legend.Scope;
1
+ import { Widget, VDOM } from "../ui/Widget";
2
+ import { HtmlElement } from "../widgets/HtmlElement";
3
+ import { PureContainer } from "../ui/PureContainer";
4
+ import { getShape } from "./shapes";
5
+ import { isUndefined } from "../util/isUndefined";
6
+ import { isNonEmptyArray } from "../util/isNonEmptyArray";
7
+ import { parseStyle } from "../util/parseStyle";
8
+ import { withHoverSync } from "../ui/HoverSync";
9
+
10
+ export class Legend extends HtmlElement {
11
+ declareData() {
12
+ super.declareData(...arguments, {
13
+ shape: undefined,
14
+ entryStyle: { structured: true },
15
+ entryClass: { structured: true },
16
+ });
17
+ }
18
+
19
+ init() {
20
+ this.entryStyle = parseStyle(this.entryStyle);
21
+ super.init();
22
+ }
23
+
24
+ prepareData(context, instance) {
25
+ let { data } = instance;
26
+ data.stateMods = Object.assign(data.stateMods || {}, {
27
+ vertical: this.vertical,
28
+ });
29
+ super.prepareData(context, instance);
30
+ }
31
+
32
+ isValidHtmlAttribute(attrName) {
33
+ switch (attrName) {
34
+ case "shapeSize":
35
+ case "svgSize":
36
+ case "shape":
37
+ case "entryStyle":
38
+ case "entryClass":
39
+ return false;
40
+
41
+ default:
42
+ return super.isValidHtmlAttribute(attrName);
43
+ }
44
+ }
45
+
46
+ explore(context, instance) {
47
+ if (!context.legends) context.legends = {};
48
+
49
+ instance.legends = context.legends;
50
+
51
+ context.addLegendEntry = (legendName, entry) => {
52
+ if (!legendName) return;
53
+
54
+ //case when all legends are scoped and new entry is added outside the scope
55
+ if (!context.legends) return;
56
+
57
+ let legend = context.legends[legendName];
58
+ if (!legend)
59
+ legend = context.legends[legendName] = {
60
+ entries: [],
61
+ names: {},
62
+ };
63
+
64
+ if (!legend.names[entry.name]) {
65
+ legend.entries.push(entry);
66
+ legend.names[entry.name] = entry;
67
+ }
68
+ };
69
+
70
+ super.explore(context, instance);
71
+ }
72
+
73
+ renderChildren(context, instance) {
74
+ const CSS = this.CSS;
75
+
76
+ let entries = instance.legends[this.name] && instance.legends[this.name].entries,
77
+ list;
78
+
79
+ let { entryClass, entryStyle, shape } = instance.data;
80
+
81
+ if (isNonEmptyArray(entries)) {
82
+ list = entries.map((e, i) =>
83
+ withHoverSync(i, e.hoverSync, e.hoverChannel, e.hoverId, ({ onMouseMove, onMouseLeave, hover }) => (
84
+ <div
85
+ key={i}
86
+ className={CSS.expand(
87
+ CSS.element(this.baseClass, "entry", {
88
+ "color-root": true,
89
+ hover,
90
+ disabled: e.disabled,
91
+ selected: e.selected,
92
+ }),
93
+ entryClass,
94
+ )}
95
+ style={entryStyle}
96
+ onClick={e.onClick}
97
+ onMouseMove={onMouseMove}
98
+ onMouseLeave={onMouseLeave}
99
+ >
100
+ {this.renderShape(e, shape)}
101
+ <div>{e.displayText || e.name}</div>
102
+ </div>
103
+ )),
104
+ );
105
+ }
106
+
107
+ return [list, super.renderChildren(context, instance)];
108
+ }
109
+
110
+ renderShape(entry, legendEntriesShape) {
111
+ const className = this.CSS.element(this.baseClass, "shape", {
112
+ [`color-${entry.colorIndex}`]: entry.colorIndex != null && (isUndefined(entry.active) || entry.active),
113
+ });
114
+ const shape = getShape(legendEntriesShape || entry.shape || "square");
115
+
116
+ // if the entry has a custom fill or stroke set, use it for both values
117
+ let style = { ...entry.style };
118
+ style.fill = style.fill ?? style.stroke;
119
+ style.stroke = style.stroke ?? style.fill;
120
+
121
+ return (
122
+ <svg
123
+ className={this.CSS.element(this.baseClass, "svg")}
124
+ style={{
125
+ width: `${this.svgSize}px`,
126
+ height: `${this.svgSize}px`,
127
+ }}
128
+ >
129
+ {shape(this.svgSize / 2, this.svgSize / 2, entry.shapeSize || this.shapeSize, {
130
+ style,
131
+ className,
132
+ })}
133
+ </svg>
134
+ );
135
+ }
136
+ }
137
+
138
+ Legend.prototype.name = "legend";
139
+ Legend.prototype.baseClass = "legend";
140
+ Legend.prototype.vertical = false;
141
+ Legend.prototype.memoize = false;
142
+ Legend.prototype.shapeSize = 18;
143
+ Legend.prototype.shape = null;
144
+ Legend.prototype.svgSize = 20;
145
+
146
+ Widget.alias("legend", Legend);
147
+
148
+ Legend.Scope = class extends PureContainer {
149
+ explore(context, instance) {
150
+ context.push("legends", (instance.legends = {}));
151
+ super.explore(context, instance);
152
+ }
153
+
154
+ exploreCleanup(context, instance) {
155
+ context.pop("legends");
156
+ }
157
+
158
+ prepare(context, instance) {
159
+ context.push("legends", instance.legends);
160
+ }
161
+
162
+ prepareCleanup(context, instance) {
163
+ context.pop("legends");
164
+ }
165
+ };
166
+
167
+ export const LegendScope = Legend.Scope;
@@ -1,40 +1,40 @@
1
- @mixin cx-legend($name: "legend", $besm: $cx-besm) {
2
- $block: map-get($besm, block);
3
- $element: map-get($besm, element);
4
- $state: map-get($besm, state);
5
-
6
- .#{$block}#{$name} {
7
- display: flex;
8
- justify-content: center;
9
- align-items: flex-start;
10
- flex-wrap: wrap;
11
- gap: 5px 10px;
12
- }
13
-
14
- .#{$block}#{$name}.#{$state}vertical {
15
- flex-direction: column;
16
- }
17
-
18
- .#{$element}#{$name}-entry {
19
- display: flex;
20
- align-items: center;
21
- padding: 5px;
22
- gap: 5px;
23
- font-size: smaller;
24
- position: relative;
25
- box-sizing: border-box;
26
- cursor: pointer;
27
- }
28
-
29
- .#{$element}#{$name}-svg {
30
- flex-shrink: 0;
31
- }
32
-
33
- .#{$element}#{$name}-shape {
34
- fill: rgba(128, 128, 128, 0.1);
35
- }
36
- }
37
-
38
- @if (cx-should-include("cx/charts/Legend")) {
39
- @include cx-legend();
40
- }
1
+ @mixin cx-legend($name: "legend", $besm: $cx-besm) {
2
+ $block: map-get($besm, block);
3
+ $element: map-get($besm, element);
4
+ $state: map-get($besm, state);
5
+
6
+ .#{$block}#{$name} {
7
+ display: flex;
8
+ justify-content: center;
9
+ align-items: flex-start;
10
+ flex-wrap: wrap;
11
+ gap: 5px 10px;
12
+ }
13
+
14
+ .#{$block}#{$name}.#{$state}vertical {
15
+ flex-direction: column;
16
+ }
17
+
18
+ .#{$element}#{$name}-entry {
19
+ display: flex;
20
+ align-items: center;
21
+ padding: 5px;
22
+ gap: 5px;
23
+ font-size: smaller;
24
+ position: relative;
25
+ box-sizing: border-box;
26
+ cursor: pointer;
27
+ }
28
+
29
+ .#{$element}#{$name}-svg {
30
+ flex-shrink: 0;
31
+ }
32
+
33
+ .#{$element}#{$name}-shape {
34
+ fill: rgba(128, 128, 128, 0.1);
35
+ }
36
+ }
37
+
38
+ @if (cx-should-include("cx/charts/Legend")) {
39
+ @include cx-legend();
40
+ }
@@ -1,128 +1,128 @@
1
- import { Widget, VDOM } from "../ui/Widget";
2
- import { getShape } from "./shapes";
3
- import { Selection } from "../ui/selection/Selection";
4
- import { stopPropagation } from "../util/eventCallbacks";
5
- import { isUndefined } from "../util/isUndefined";
6
- import { Container } from "../ui/Container";
7
-
8
- export class LegendEntry extends Container {
9
- init() {
10
- this.selection = Selection.create(this.selection);
11
- super.init();
12
- }
13
-
14
- declareData() {
15
- var selection = this.selection.configureWidget(this);
16
-
17
- super.declareData(...arguments, selection, {
18
- selected: undefined,
19
- shape: undefined,
20
- colorIndex: undefined,
21
- colorMap: undefined,
22
- colorName: undefined,
23
- name: undefined,
24
- active: true,
25
- size: undefined,
26
- rx: undefined,
27
- ry: undefined,
28
- text: undefined,
29
- });
30
- }
31
-
32
- prepareData(context, instance) {
33
- let { data } = instance;
34
-
35
- if (data.name && !data.colorName) data.colorName = data.name;
36
-
37
- super.prepareData(context, instance);
38
- }
39
-
40
- explore(context, instance) {
41
- var { data } = instance;
42
- instance.colorMap = data.colorMap && context.getColorMap && context.getColorMap(data.colorMap);
43
- if (instance.colorMap && data.colorName) instance.colorMap.acknowledge(data.colorName);
44
- super.explore(context, instance);
45
- }
46
-
47
- prepare(context, instance) {
48
- var { data, colorMap } = instance;
49
-
50
- if (colorMap && data.colorName) {
51
- data.colorIndex = colorMap.map(data.colorName);
52
- if (instance.cache("colorIndex", data.colorIndex)) instance.markShouldUpdate(context);
53
- }
54
- }
55
-
56
- handleClick(e, instance) {
57
- if (this.onClick && instance.invoke("onClick", e, instance) === false) return;
58
-
59
- e.stopPropagation();
60
-
61
- var any = this.legendAction == "auto";
62
-
63
- if (any || this.legendAction == "toggle") if (instance.set("active", !instance.data.active)) return;
64
-
65
- if ((any || this.legendAction == "select") && !this.selection.isDummy) this.selection.selectInstance(instance);
66
- }
67
-
68
- render(context, instance, key) {
69
- let { data } = instance;
70
- let content = !isUndefined(this.text) ? data.text : this.renderChildren(context, instance);
71
- return (
72
- <div
73
- key={key}
74
- className={data.classNames}
75
- style={data.style}
76
- onMouseDown={stopPropagation}
77
- onClick={(e) => {
78
- this.handleClick(e, instance);
79
- }}
80
- >
81
- {this.renderShape(instance)}
82
- {content != null && <div>{content}</div>}
83
- </div>
84
- );
85
- }
86
-
87
- renderShape(instance) {
88
- var entry = instance.data;
89
- var className = this.CSS.element(this.baseClass, "shape", {
90
- disabled: entry.disabled,
91
- selected: entry.selected || this.selection.isInstanceSelected(instance),
92
- [`color-${entry.colorIndex}`]: entry.colorIndex != null && (isUndefined(entry.active) || entry.active),
93
- });
94
- var shape = getShape(entry.shape || "square");
95
-
96
- // if the entry has a custom fill or stroke set, use it for both values
97
- let style = { ...entry.style };
98
- style.fill = style.fill ?? style.stroke;
99
- style.stroke = style.stroke ?? style.fill;
100
-
101
- return (
102
- <svg
103
- key="svg"
104
- className={this.CSS.element(this.baseClass, "svg")}
105
- style={{
106
- width: `${this.svgSize}px`,
107
- height: `${this.svgSize}px`,
108
- }}
109
- >
110
- {shape(this.svgSize / 2, this.svgSize / 2, entry.size, {
111
- style,
112
- className,
113
- rx: entry.rx,
114
- ry: entry.ry,
115
- })}
116
- </svg>
117
- );
118
- }
119
- }
120
-
121
- LegendEntry.prototype.baseClass = "legendentry";
122
- LegendEntry.prototype.shape = "square";
123
- LegendEntry.prototype.legendAction = "auto";
124
- LegendEntry.prototype.size = 18;
125
- LegendEntry.prototype.svgSize = 20;
126
- LegendEntry.prototype.styled = true;
127
-
128
- Widget.alias("legend-entry", LegendEntry);
1
+ import { Widget, VDOM } from "../ui/Widget";
2
+ import { getShape } from "./shapes";
3
+ import { Selection } from "../ui/selection/Selection";
4
+ import { stopPropagation } from "../util/eventCallbacks";
5
+ import { isUndefined } from "../util/isUndefined";
6
+ import { Container } from "../ui/Container";
7
+
8
+ export class LegendEntry extends Container {
9
+ init() {
10
+ this.selection = Selection.create(this.selection);
11
+ super.init();
12
+ }
13
+
14
+ declareData() {
15
+ var selection = this.selection.configureWidget(this);
16
+
17
+ super.declareData(...arguments, selection, {
18
+ selected: undefined,
19
+ shape: undefined,
20
+ colorIndex: undefined,
21
+ colorMap: undefined,
22
+ colorName: undefined,
23
+ name: undefined,
24
+ active: true,
25
+ size: undefined,
26
+ rx: undefined,
27
+ ry: undefined,
28
+ text: undefined,
29
+ });
30
+ }
31
+
32
+ prepareData(context, instance) {
33
+ let { data } = instance;
34
+
35
+ if (data.name && !data.colorName) data.colorName = data.name;
36
+
37
+ super.prepareData(context, instance);
38
+ }
39
+
40
+ explore(context, instance) {
41
+ var { data } = instance;
42
+ instance.colorMap = data.colorMap && context.getColorMap && context.getColorMap(data.colorMap);
43
+ if (instance.colorMap && data.colorName) instance.colorMap.acknowledge(data.colorName);
44
+ super.explore(context, instance);
45
+ }
46
+
47
+ prepare(context, instance) {
48
+ var { data, colorMap } = instance;
49
+
50
+ if (colorMap && data.colorName) {
51
+ data.colorIndex = colorMap.map(data.colorName);
52
+ if (instance.cache("colorIndex", data.colorIndex)) instance.markShouldUpdate(context);
53
+ }
54
+ }
55
+
56
+ handleClick(e, instance) {
57
+ if (this.onClick && instance.invoke("onClick", e, instance) === false) return;
58
+
59
+ e.stopPropagation();
60
+
61
+ var any = this.legendAction == "auto";
62
+
63
+ if (any || this.legendAction == "toggle") if (instance.set("active", !instance.data.active)) return;
64
+
65
+ if ((any || this.legendAction == "select") && !this.selection.isDummy) this.selection.selectInstance(instance);
66
+ }
67
+
68
+ render(context, instance, key) {
69
+ let { data } = instance;
70
+ let content = !isUndefined(this.text) ? data.text : this.renderChildren(context, instance);
71
+ return (
72
+ <div
73
+ key={key}
74
+ className={data.classNames}
75
+ style={data.style}
76
+ onMouseDown={stopPropagation}
77
+ onClick={(e) => {
78
+ this.handleClick(e, instance);
79
+ }}
80
+ >
81
+ {this.renderShape(instance)}
82
+ {content != null && <div>{content}</div>}
83
+ </div>
84
+ );
85
+ }
86
+
87
+ renderShape(instance) {
88
+ var entry = instance.data;
89
+ var className = this.CSS.element(this.baseClass, "shape", {
90
+ disabled: entry.disabled,
91
+ selected: entry.selected || this.selection.isInstanceSelected(instance),
92
+ [`color-${entry.colorIndex}`]: entry.colorIndex != null && (isUndefined(entry.active) || entry.active),
93
+ });
94
+ var shape = getShape(entry.shape || "square");
95
+
96
+ // if the entry has a custom fill or stroke set, use it for both values
97
+ let style = { ...entry.style };
98
+ style.fill = style.fill ?? style.stroke;
99
+ style.stroke = style.stroke ?? style.fill;
100
+
101
+ return (
102
+ <svg
103
+ key="svg"
104
+ className={this.CSS.element(this.baseClass, "svg")}
105
+ style={{
106
+ width: `${this.svgSize}px`,
107
+ height: `${this.svgSize}px`,
108
+ }}
109
+ >
110
+ {shape(this.svgSize / 2, this.svgSize / 2, entry.size, {
111
+ style,
112
+ className,
113
+ rx: entry.rx,
114
+ ry: entry.ry,
115
+ })}
116
+ </svg>
117
+ );
118
+ }
119
+ }
120
+
121
+ LegendEntry.prototype.baseClass = "legendentry";
122
+ LegendEntry.prototype.shape = "square";
123
+ LegendEntry.prototype.legendAction = "auto";
124
+ LegendEntry.prototype.size = 18;
125
+ LegendEntry.prototype.svgSize = 20;
126
+ LegendEntry.prototype.styled = true;
127
+
128
+ Widget.alias("legend-entry", LegendEntry);