cx 25.6.2 → 25.6.3

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 (103) hide show
  1. package/dist/manifest.js +749 -749
  2. package/dist/widgets.css +5 -0
  3. package/dist/widgets.js +77 -34
  4. package/package.json +1 -1
  5. package/src/charts/Legend.d.ts +45 -45
  6. package/src/charts/LegendEntry.js +128 -128
  7. package/src/charts/LegendEntry.scss +27 -27
  8. package/src/charts/PieChart.d.ts +92 -92
  9. package/src/charts/RangeMarker.js +159 -159
  10. package/src/charts/axis/Axis.d.ts +113 -113
  11. package/src/charts/axis/Axis.js +280 -280
  12. package/src/charts/axis/CategoryAxis.d.ts +30 -30
  13. package/src/charts/axis/CategoryAxis.js +241 -241
  14. package/src/charts/axis/NumericAxis.js +351 -351
  15. package/src/charts/axis/Stack.js +55 -55
  16. package/src/charts/axis/TimeAxis.js +611 -611
  17. package/src/charts/helpers/SnapPointFinder.js +69 -69
  18. package/src/data/Binding.spec.js +69 -69
  19. package/src/data/ExposedValueView.d.ts +19 -19
  20. package/src/data/Expression.js +229 -229
  21. package/src/data/Expression.spec.js +229 -229
  22. package/src/data/StringTemplate.js +92 -92
  23. package/src/data/StringTemplate.spec.js +132 -132
  24. package/src/data/StructuredSelector.js +132 -132
  25. package/src/data/getAccessor.spec.js +11 -11
  26. package/src/data/getSelector.js +49 -49
  27. package/src/hooks/createLocalStorageRef.d.ts +3 -3
  28. package/src/hooks/createLocalStorageRef.js +20 -20
  29. package/src/index.scss +6 -6
  30. package/src/ui/Culture.d.ts +57 -57
  31. package/src/ui/Culture.js +139 -139
  32. package/src/ui/FocusManager.js +171 -171
  33. package/src/ui/Format.js +108 -108
  34. package/src/ui/HoverSync.js +147 -147
  35. package/src/ui/Repeater.d.ts +61 -61
  36. package/src/ui/index.d.ts +42 -42
  37. package/src/ui/layout/ContentPlaceholder.d.ts +19 -19
  38. package/src/ui/layout/ContentPlaceholder.js +105 -105
  39. package/src/ui/layout/ContentPlaceholder.spec.js +579 -579
  40. package/src/ui/layout/LabelsTopLayout.js +134 -134
  41. package/src/util/Format.js +270 -270
  42. package/src/util/date/encodeDate.d.ts +1 -1
  43. package/src/util/date/encodeDate.js +8 -8
  44. package/src/util/date/encodeDateWithTimezoneOffset.d.ts +1 -1
  45. package/src/util/date/index.d.ts +11 -11
  46. package/src/util/date/index.js +11 -11
  47. package/src/util/date/parseDateInvariant.d.ts +3 -3
  48. package/src/util/date/parseDateInvariant.js +20 -20
  49. package/src/util/getSearchQueryPredicate.js +59 -59
  50. package/src/util/index.d.ts +51 -51
  51. package/src/util/index.js +54 -54
  52. package/src/util/isValidIdentifierName.d.ts +1 -1
  53. package/src/util/isValidIdentifierName.js +5 -5
  54. package/src/util/isValidIdentifierName.spec.js +33 -33
  55. package/src/util/scss/add-rules.scss +38 -38
  56. package/src/widgets/CxCredit.scss +37 -37
  57. package/src/widgets/HighlightedSearchText.js +36 -36
  58. package/src/widgets/HighlightedSearchText.scss +18 -18
  59. package/src/widgets/List.scss +91 -91
  60. package/src/widgets/Sandbox.d.ts +18 -16
  61. package/src/widgets/Sandbox.js +65 -63
  62. package/src/widgets/drag-drop/DropZone.js +214 -214
  63. package/src/widgets/form/Calendar.js +618 -618
  64. package/src/widgets/form/Calendar.scss +196 -196
  65. package/src/widgets/form/Checkbox.scss +127 -127
  66. package/src/widgets/form/ColorField.js +397 -397
  67. package/src/widgets/form/ColorField.scss +96 -96
  68. package/src/widgets/form/ColorPicker.scss +283 -283
  69. package/src/widgets/form/DateTimeField.js +576 -576
  70. package/src/widgets/form/DateTimePicker.js +392 -392
  71. package/src/widgets/form/LookupField.d.ts +179 -179
  72. package/src/widgets/form/LookupField.scss +219 -219
  73. package/src/widgets/form/MonthPicker.d.ts +8 -0
  74. package/src/widgets/form/MonthPicker.js +65 -23
  75. package/src/widgets/form/MonthPicker.scss +4 -0
  76. package/src/widgets/form/NumberField.js +459 -459
  77. package/src/widgets/form/NumberField.scss +61 -61
  78. package/src/widgets/form/Radio.scss +121 -121
  79. package/src/widgets/form/Select.scss +99 -99
  80. package/src/widgets/form/Slider.scss +118 -118
  81. package/src/widgets/form/Switch.scss +140 -140
  82. package/src/widgets/form/TextArea.scss +43 -43
  83. package/src/widgets/form/TextField.js +290 -290
  84. package/src/widgets/form/TextField.scss +55 -55
  85. package/src/widgets/form/UploadButton.d.ts +34 -34
  86. package/src/widgets/form/variables.scss +353 -353
  87. package/src/widgets/grid/Grid.d.ts +442 -442
  88. package/src/widgets/grid/GridRow.js +228 -228
  89. package/src/widgets/grid/TreeNode.d.ts +23 -23
  90. package/src/widgets/grid/TreeNode.scss +88 -88
  91. package/src/widgets/grid/variables.scss +133 -133
  92. package/src/widgets/nav/LinkButton.js +128 -128
  93. package/src/widgets/nav/Menu.scss +74 -74
  94. package/src/widgets/overlay/Dropdown.js +612 -612
  95. package/src/widgets/overlay/FlyweightTooltipTracker.js +39 -39
  96. package/src/widgets/overlay/Overlay.d.ts +73 -73
  97. package/src/widgets/overlay/Window.js +202 -202
  98. package/src/widgets/overlay/captureMouse.js +124 -124
  99. package/src/widgets/overlay/createHotPromiseWindowFactory.d.ts +18 -18
  100. package/src/widgets/overlay/createHotPromiseWindowFactory.js +56 -56
  101. package/src/widgets/overlay/index.d.ts +11 -11
  102. package/src/widgets/overlay/index.js +11 -11
  103. package/src/widgets/variables.scss +144 -144
package/dist/widgets.css CHANGED
@@ -2519,6 +2519,11 @@ th.cxe-calendar-display {
2519
2519
  padding: 0 0.5em;
2520
2520
  color: lightgray;
2521
2521
  }
2522
+ .cxb-monthpicker th.cxs-unselectable {
2523
+ cursor: default;
2524
+ opacity: 0.5;
2525
+ pointer-events: none;
2526
+ }
2522
2527
  .cxb-monthpicker .cxe-monthpicker-year {
2523
2528
  font-size: 120%;
2524
2529
  color: gray;
package/dist/widgets.js CHANGED
@@ -1813,6 +1813,7 @@ var Sandbox = /*#__PURE__*/ (function (_PureContainer) {
1813
1813
  key: data.key,
1814
1814
  recordName: this.recordName,
1815
1815
  immutable: this.immutable,
1816
+ sealed: this.sealed,
1816
1817
  });
1817
1818
  instance.clearChildrenCache();
1818
1819
  }
@@ -1822,6 +1823,7 @@ var Sandbox = /*#__PURE__*/ (function (_PureContainer) {
1822
1823
  })(PureContainer);
1823
1824
  Sandbox.prototype.recordName = "$page";
1824
1825
  Sandbox.prototype.immutable = false;
1826
+ Sandbox.prototype.sealed = false;
1825
1827
  Widget.alias("sandbox", Sandbox);
1826
1828
 
1827
1829
  var CxCredit = /*#__PURE__*/ (function (_HtmlElement) {
@@ -8161,7 +8163,7 @@ var Calendar = /*#__PURE__*/ (function (_Field) {
8161
8163
  widget = instance.widget;
8162
8164
  e.stopPropagation();
8163
8165
  if (data.disabled) return;
8164
- if (!validationCheck$1(date, data)) return;
8166
+ if (!validationCheck(date, data)) return;
8165
8167
  if (this.onBeforeSelect && instance.invoke("onBeforeSelect", e, instance, date) === false) return;
8166
8168
  if (widget.partial) {
8167
8169
  var mixed = parseDateInvariant(data.value);
@@ -8191,7 +8193,7 @@ Calendar.prototype.todayButtonText = "Today";
8191
8193
  Calendar.prototype.startWithMonday = false;
8192
8194
  Calendar.prototype.focusable = true;
8193
8195
  Localization.registerPrototype("cx/widgets/Calendar", Calendar);
8194
- var validationCheck$1 = function validationCheck(date, data, disabledDaysOfWeek) {
8196
+ var validationCheck = function validationCheck(date, data, disabledDaysOfWeek) {
8195
8197
  if (data.maxValue && !upperBoundCheck(date, data.maxValue, data.maxExclusive)) return false;
8196
8198
  if (data.minValue && !lowerBoundCheck(date, data.minValue, data.minExclusive)) return false;
8197
8199
  if (disabledDaysOfWeek && disabledDaysOfWeek.includes(date.getDay())) return false;
@@ -8514,7 +8516,7 @@ var CalendarCmp = /*#__PURE__*/ (function (_VDOM$Component) {
8514
8516
  var days = [];
8515
8517
  for (var i = 0; i < 7; i++) {
8516
8518
  var dayInfo = (data.dayData && data.dayData[date.toDateString()]) || empty;
8517
- var unselectable = !validationCheck$1(date, data, disabledDaysOfWeek);
8519
+ var unselectable = !validationCheck(date, data, disabledDaysOfWeek);
8518
8520
  var classNames = CSS.expand(
8519
8521
  CSS.element(baseClass, "day", {
8520
8522
  outside: month != date.getMonth(),
@@ -10811,8 +10813,8 @@ var MonthPicker = /*#__PURE__*/ (function (_Field) {
10811
10813
  _proto.init = function init() {
10812
10814
  _Field.prototype.init.call(this);
10813
10815
  };
10814
- _proto.prepareData = function prepareData(context, _ref) {
10815
- var data = _ref.data;
10816
+ _proto.prepareData = function prepareData(context, instance) {
10817
+ var data = instance.data;
10816
10818
  data.stateMods = {
10817
10819
  disabled: data.disabled,
10818
10820
  };
@@ -10828,6 +10830,13 @@ var MonthPicker = /*#__PURE__*/ (function (_Field) {
10828
10830
  if (data.refDate) data.refDate = monthStart(parseDateInvariant(data.refDate));
10829
10831
  if (data.maxValue) data.maxValue = monthStart(parseDateInvariant(data.maxValue));
10830
10832
  if (data.minValue) data.minValue = monthStart(parseDateInvariant(data.minValue));
10833
+ if (this.onCreateIsMonthDateSelectable) {
10834
+ instance.isMonthDateSelectable = instance.invoke(
10835
+ "onCreateIsMonthDateSelectable",
10836
+ data.validationParams,
10837
+ instance,
10838
+ );
10839
+ }
10831
10840
  _Field.prototype.prepareData.apply(this, arguments);
10832
10841
  };
10833
10842
  _proto.validate = function validate(context, instance) {
@@ -10864,10 +10873,12 @@ var MonthPicker = /*#__PURE__*/ (function (_Field) {
10864
10873
  };
10865
10874
  _proto.handleSelect = function handleSelect(e, instance, date1, date2) {
10866
10875
  var data = instance.data,
10867
- widget = instance.widget;
10876
+ widget = instance.widget,
10877
+ isMonthDateSelectable = instance.isMonthDateSelectable;
10868
10878
  var encode = widget.encoding || Culture.getDefaultDateEncoding();
10869
10879
  if (data.disabled) return;
10870
- if (!validationCheck(date1, data)) return;
10880
+ if (isMonthDateSelectable && !isMonthDateSelectable(date1)) return;
10881
+ if (!dateSelectableCheck(date1, data)) return;
10871
10882
  if (this.onBeforeSelect && instance.invoke("onBeforeSelect", e, instance, date1, date2) === false) return;
10872
10883
  if (this.range) {
10873
10884
  instance.set("from", encode(date1));
@@ -10894,7 +10905,7 @@ MonthPicker.prototype.minExclusiveErrorText = "Select a date after {0:d}.";
10894
10905
  MonthPicker.prototype.inclusiveTo = false;
10895
10906
  Localization.registerPrototype("cx/widgets/MonthPicker", MonthPicker);
10896
10907
  Widget.alias("month-picker", MonthPicker);
10897
- var validationCheck = function validationCheck(date, data) {
10908
+ var dateSelectableCheck = function dateSelectableCheck(date, data) {
10898
10909
  if (data.maxValue && !upperBoundCheck(date, data.maxValue, data.maxExclusive)) return false;
10899
10910
  if (data.minValue && !lowerBoundCheck(date, data.minValue, data.minExclusive)) return false;
10900
10911
  return true;
@@ -11153,11 +11164,11 @@ var MonthPickerComponent = /*#__PURE__*/ (function (_VDOM$Component) {
11153
11164
  if (this.props.onFocusOut) this.props.onFocusOut();
11154
11165
  };
11155
11166
  _proto2.getCursorDates = function getCursorDates(cursor) {
11156
- var _ref2 = cursor || this.state,
11157
- cursorMonth = _ref2.cursorMonth,
11158
- cursorYear = _ref2.cursorYear,
11159
- cursorQuarter = _ref2.cursorQuarter,
11160
- column = _ref2.column;
11167
+ var _ref = cursor || this.state,
11168
+ cursorMonth = _ref.cursorMonth,
11169
+ cursorYear = _ref.cursorYear,
11170
+ cursorQuarter = _ref.cursorQuarter,
11171
+ column = _ref.column;
11161
11172
  switch (column) {
11162
11173
  case "M":
11163
11174
  return [new Date(cursorYear, cursorMonth - 1, 1), new Date(cursorYear, cursorMonth, 1)];
@@ -11240,7 +11251,8 @@ var MonthPickerComponent = /*#__PURE__*/ (function (_VDOM$Component) {
11240
11251
  var _this3 = this;
11241
11252
  var instance = this.props.instance;
11242
11253
  var data = instance.data,
11243
- widget = instance.widget;
11254
+ widget = instance.widget,
11255
+ isMonthDateSelectable = instance.isMonthDateSelectable;
11244
11256
  var CSS = widget.CSS,
11245
11257
  baseClass = widget.baseClass,
11246
11258
  startYear = widget.startYear,
@@ -11279,30 +11291,50 @@ var MonthPickerComponent = /*#__PURE__*/ (function (_VDOM$Component) {
11279
11291
  var monthNames = Culture.getDateTimeCulture().getMonthNames("short");
11280
11292
  var showCursor = this.state.hover || this.state.focused;
11281
11293
  for (var y = start; y <= end; y++) {
11294
+ var selectableMonths = 4095;
11295
+ // Loop through the months in a year to check if all months are unselectable
11296
+ for (var i = 0; i < 12; i++) {
11297
+ if (
11298
+ (isMonthDateSelectable && !isMonthDateSelectable(new Date(y, i, 1))) ||
11299
+ !dateSelectableCheck(new Date(y, i, 1), data)
11300
+ ) {
11301
+ // Set month as unselectable at specified bit
11302
+ selectableMonths &= ~(1 << i);
11303
+ }
11304
+ }
11305
+
11306
+ // All bits are 0 - all months are unselectable
11307
+ var unselectableYear = selectableMonths === 0;
11282
11308
  var rows = [];
11283
11309
  for (var q = 0; q < 4; q++) {
11284
11310
  var row = [];
11285
- if (q == 0)
11311
+ if (q == 0) {
11286
11312
  row.push(
11287
11313
  /*#__PURE__*/ jsx(
11288
11314
  "th",
11289
11315
  {
11290
11316
  rowSpan: 4,
11291
11317
  "data-point": "Y-" + y,
11292
- className: CSS.element(baseClass, "year", {
11293
- cursor: showCursor && this.state.column == "Y" && y == this.state.cursorYear,
11294
- }),
11295
- onMouseEnter: this.handleMouseEnter,
11296
- onMouseDown: this.handleMouseDown,
11297
- onMouseUp: this.handleMouseUp,
11318
+ className: CSS.expand(
11319
+ CSS.element(baseClass, "year", {
11320
+ cursor: showCursor && this.state.column == "Y" && y == this.state.cursorYear,
11321
+ }),
11322
+ CSS.state({
11323
+ unselectable: unselectableYear,
11324
+ }),
11325
+ ),
11326
+ onMouseEnter: unselectableYear ? null : this.handleMouseEnter,
11327
+ onMouseDown: unselectableYear ? null : this.handleMouseDown,
11328
+ onMouseUp: unselectableYear ? null : this.handleMouseUp,
11298
11329
  children: y,
11299
11330
  },
11300
11331
  "year",
11301
11332
  ),
11302
11333
  );
11303
- for (var i = 0; i < 3; i++) {
11304
- var m = q * 3 + i + 1;
11305
- var unselectable = !validationCheck(new Date(y, m - 1, 1), data);
11334
+ }
11335
+ for (var _i = 0; _i < 3; _i++) {
11336
+ var m = q * 3 + _i + 1;
11337
+ var unselectableMonth = (selectableMonths & (1 << (m - 1))) === 0;
11306
11338
  var mno = y * 12 + m - 1;
11307
11339
  var handle = true; //isTouchDevice(); //mno === from || mno === to - 1;
11308
11340
  row.push(
@@ -11314,14 +11346,14 @@ var MonthPickerComponent = /*#__PURE__*/ (function (_VDOM$Component) {
11314
11346
  showCursor && this.state.column == "M" && y == this.state.cursorYear && m == this.state.cursorMonth,
11315
11347
  handle: handle,
11316
11348
  selected: mno >= from && mno < to,
11317
- unselectable: unselectable,
11349
+ unselectable: unselectableMonth,
11318
11350
  }),
11319
11351
  "data-point": "Y-" + y + "-M-" + m,
11320
- onMouseEnter: unselectable ? null : this.handleMouseEnter,
11321
- onMouseDown: unselectable ? null : this.handleMouseDown,
11322
- onMouseUp: unselectable ? null : this.handleMouseUp,
11323
- onTouchStart: unselectable ? null : this.handleMouseDown,
11324
- onTouchMove: unselectable ? null : this.handleTouchMove,
11352
+ onMouseEnter: unselectableMonth ? null : this.handleMouseEnter,
11353
+ onMouseDown: unselectableMonth ? null : this.handleMouseDown,
11354
+ onMouseUp: unselectableMonth ? null : this.handleMouseUp,
11355
+ onTouchStart: unselectableMonth ? null : this.handleMouseDown,
11356
+ onTouchMove: unselectableMonth ? null : this.handleTouchMove,
11325
11357
  onTouchEnd: this.handleMouseUp,
11326
11358
  children: monthNames[m - 1].substr(0, 3),
11327
11359
  },
@@ -11329,7 +11361,16 @@ var MonthPickerComponent = /*#__PURE__*/ (function (_VDOM$Component) {
11329
11361
  ),
11330
11362
  );
11331
11363
  }
11332
- if (!hideQuarters)
11364
+ if (!hideQuarters) {
11365
+ var unselectableQuarter = true;
11366
+ var _start = q * 3;
11367
+ for (var _i2 = _start; _i2 < _start + 3; _i2++) {
11368
+ if ((selectableMonths & (1 << _i2)) !== 0) {
11369
+ // found a selectable month in a quarter
11370
+ unselectableQuarter = false;
11371
+ break;
11372
+ }
11373
+ }
11333
11374
  row.push(
11334
11375
  /*#__PURE__*/ jsx(
11335
11376
  "th",
@@ -11340,16 +11381,18 @@ var MonthPickerComponent = /*#__PURE__*/ (function (_VDOM$Component) {
11340
11381
  this.state.column == "Q" &&
11341
11382
  y == this.state.cursorYear &&
11342
11383
  q == this.state.cursorQuarter,
11384
+ unselectable: unselectableQuarter,
11343
11385
  }),
11344
11386
  "data-point": "Y-" + y + "-Q-" + q,
11345
- onMouseEnter: this.handleMouseEnter,
11346
- onMouseDown: this.handleMouseDown,
11347
- onMouseUp: this.handleMouseUp,
11387
+ onMouseEnter: unselectableQuarter ? null : this.handleMouseEnter,
11388
+ onMouseDown: unselectableQuarter ? null : this.handleMouseDown,
11389
+ onMouseUp: unselectableQuarter ? null : this.handleMouseUp,
11348
11390
  children: "Q" + (q + 1),
11349
11391
  },
11350
11392
  "q" + q,
11351
11393
  ),
11352
11394
  );
11395
+ }
11353
11396
  rows.push(row);
11354
11397
  }
11355
11398
  years.push(rows);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cx",
3
- "version": "25.6.2",
3
+ "version": "25.6.3",
4
4
  "description": "Advanced JavaScript UI framework for admin and dashboard applications with ready to use grid, form and chart components.",
5
5
  "main": "index.js",
6
6
  "jsnext:main": "src/index.js",
@@ -1,45 +1,45 @@
1
- import * as Cx from "../core";
2
-
3
- interface LegendProps extends Cx.HtmlElementProps {
4
- /** Name of the legend. Default is `legend`. */
5
- name?: string;
6
-
7
- /** Base CSS class to be applied to the element. Defaults to `legend`. */
8
- baseClass?: string;
9
-
10
- /** Switch to vertical mode. */
11
- vertical?: boolean;
12
-
13
- /** Size of the svg shape container in pixels. Default value is 20. */
14
- svgSize?: number;
15
-
16
- /** Shape size in pixels. Default value is 18. */
17
- shapeSize?: number;
18
-
19
- /** Default shape that will be applied to the all legend items. */
20
- shape?: Cx.StringProp;
21
-
22
- /** CSS style that will be applied to the legend entry. */
23
- entryStyle?: Cx.StyleProp;
24
-
25
- /** CSS class that will be applied to the legend entry. */
26
- entryClass?: Cx.ClassProp;
27
-
28
- /** CSS style that will be applied to the legend entry value segment. */
29
- valueStyle?: Cx.StyleProp;
30
-
31
- /** CSS class that will be applied to the legend entry value segment. */
32
- valueClass?: Cx.ClassProp;
33
-
34
- /** Set to true to show values. Mostly used for PieChart legends. */
35
- showValues?: Cx.BooleanProp;
36
-
37
- /** Format used for values, i.e. n;2 or currency. The default value is s.*/
38
- valueFormat?: string;
39
- }
40
-
41
- export class Legend extends Cx.Widget<LegendProps> {
42
- static Scope(): any;
43
- }
44
-
45
- export class LegendScope extends Cx.Widget<Cx.PureContainerProps> {}
1
+ import * as Cx from "../core";
2
+
3
+ interface LegendProps extends Cx.HtmlElementProps {
4
+ /** Name of the legend. Default is `legend`. */
5
+ name?: string;
6
+
7
+ /** Base CSS class to be applied to the element. Defaults to `legend`. */
8
+ baseClass?: string;
9
+
10
+ /** Switch to vertical mode. */
11
+ vertical?: boolean;
12
+
13
+ /** Size of the svg shape container in pixels. Default value is 20. */
14
+ svgSize?: number;
15
+
16
+ /** Shape size in pixels. Default value is 18. */
17
+ shapeSize?: number;
18
+
19
+ /** Default shape that will be applied to the all legend items. */
20
+ shape?: Cx.StringProp;
21
+
22
+ /** CSS style that will be applied to the legend entry. */
23
+ entryStyle?: Cx.StyleProp;
24
+
25
+ /** CSS class that will be applied to the legend entry. */
26
+ entryClass?: Cx.ClassProp;
27
+
28
+ /** CSS style that will be applied to the legend entry value segment. */
29
+ valueStyle?: Cx.StyleProp;
30
+
31
+ /** CSS class that will be applied to the legend entry value segment. */
32
+ valueClass?: Cx.ClassProp;
33
+
34
+ /** Set to true to show values. Mostly used for PieChart legends. */
35
+ showValues?: Cx.BooleanProp;
36
+
37
+ /** Format used for values, i.e. n;2 or currency. The default value is s.*/
38
+ valueFormat?: string;
39
+ }
40
+
41
+ export class Legend extends Cx.Widget<LegendProps> {
42
+ static Scope(): any;
43
+ }
44
+
45
+ export class LegendScope extends Cx.Widget<Cx.PureContainerProps> {}
@@ -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);
@@ -1,27 +1,27 @@
1
- @mixin cx-legendentry($name: "legendentry", $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: inline-flex;
8
- align-items: center;
9
- padding: 5px;
10
- gap: 5px;
11
- position: relative;
12
- box-sizing: border-box;
13
- cursor: pointer;
14
- }
15
-
16
- .#{$element}#{$name}-svg {
17
- flex-shrink: 0;
18
- }
19
-
20
- .#{$element}#{$name}-shape {
21
- fill: #eee;
22
- }
23
- }
24
-
25
- @if (cx-should-include("cx/charts/LegendEntry")) {
26
- @include cx-legendentry();
27
- }
1
+ @mixin cx-legendentry($name: "legendentry", $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: inline-flex;
8
+ align-items: center;
9
+ padding: 5px;
10
+ gap: 5px;
11
+ position: relative;
12
+ box-sizing: border-box;
13
+ cursor: pointer;
14
+ }
15
+
16
+ .#{$element}#{$name}-svg {
17
+ flex-shrink: 0;
18
+ }
19
+
20
+ .#{$element}#{$name}-shape {
21
+ fill: #eee;
22
+ }
23
+ }
24
+
25
+ @if (cx-should-include("cx/charts/LegendEntry")) {
26
+ @include cx-legendentry();
27
+ }