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.
- package/dist/manifest.js +749 -749
- package/dist/widgets.css +5 -0
- package/dist/widgets.js +77 -34
- package/package.json +1 -1
- package/src/charts/Legend.d.ts +45 -45
- package/src/charts/LegendEntry.js +128 -128
- package/src/charts/LegendEntry.scss +27 -27
- package/src/charts/PieChart.d.ts +92 -92
- package/src/charts/RangeMarker.js +159 -159
- package/src/charts/axis/Axis.d.ts +113 -113
- package/src/charts/axis/Axis.js +280 -280
- package/src/charts/axis/CategoryAxis.d.ts +30 -30
- package/src/charts/axis/CategoryAxis.js +241 -241
- package/src/charts/axis/NumericAxis.js +351 -351
- package/src/charts/axis/Stack.js +55 -55
- package/src/charts/axis/TimeAxis.js +611 -611
- package/src/charts/helpers/SnapPointFinder.js +69 -69
- package/src/data/Binding.spec.js +69 -69
- package/src/data/ExposedValueView.d.ts +19 -19
- package/src/data/Expression.js +229 -229
- package/src/data/Expression.spec.js +229 -229
- package/src/data/StringTemplate.js +92 -92
- package/src/data/StringTemplate.spec.js +132 -132
- package/src/data/StructuredSelector.js +132 -132
- package/src/data/getAccessor.spec.js +11 -11
- package/src/data/getSelector.js +49 -49
- package/src/hooks/createLocalStorageRef.d.ts +3 -3
- package/src/hooks/createLocalStorageRef.js +20 -20
- package/src/index.scss +6 -6
- package/src/ui/Culture.d.ts +57 -57
- package/src/ui/Culture.js +139 -139
- package/src/ui/FocusManager.js +171 -171
- package/src/ui/Format.js +108 -108
- package/src/ui/HoverSync.js +147 -147
- package/src/ui/Repeater.d.ts +61 -61
- package/src/ui/index.d.ts +42 -42
- package/src/ui/layout/ContentPlaceholder.d.ts +19 -19
- package/src/ui/layout/ContentPlaceholder.js +105 -105
- package/src/ui/layout/ContentPlaceholder.spec.js +579 -579
- package/src/ui/layout/LabelsTopLayout.js +134 -134
- package/src/util/Format.js +270 -270
- package/src/util/date/encodeDate.d.ts +1 -1
- package/src/util/date/encodeDate.js +8 -8
- package/src/util/date/encodeDateWithTimezoneOffset.d.ts +1 -1
- package/src/util/date/index.d.ts +11 -11
- package/src/util/date/index.js +11 -11
- package/src/util/date/parseDateInvariant.d.ts +3 -3
- package/src/util/date/parseDateInvariant.js +20 -20
- package/src/util/getSearchQueryPredicate.js +59 -59
- package/src/util/index.d.ts +51 -51
- package/src/util/index.js +54 -54
- package/src/util/isValidIdentifierName.d.ts +1 -1
- package/src/util/isValidIdentifierName.js +5 -5
- package/src/util/isValidIdentifierName.spec.js +33 -33
- package/src/util/scss/add-rules.scss +38 -38
- package/src/widgets/CxCredit.scss +37 -37
- package/src/widgets/HighlightedSearchText.js +36 -36
- package/src/widgets/HighlightedSearchText.scss +18 -18
- package/src/widgets/List.scss +91 -91
- package/src/widgets/Sandbox.d.ts +18 -16
- package/src/widgets/Sandbox.js +65 -63
- package/src/widgets/drag-drop/DropZone.js +214 -214
- package/src/widgets/form/Calendar.js +618 -618
- package/src/widgets/form/Calendar.scss +196 -196
- package/src/widgets/form/Checkbox.scss +127 -127
- package/src/widgets/form/ColorField.js +397 -397
- package/src/widgets/form/ColorField.scss +96 -96
- package/src/widgets/form/ColorPicker.scss +283 -283
- package/src/widgets/form/DateTimeField.js +576 -576
- package/src/widgets/form/DateTimePicker.js +392 -392
- package/src/widgets/form/LookupField.d.ts +179 -179
- package/src/widgets/form/LookupField.scss +219 -219
- package/src/widgets/form/MonthPicker.d.ts +8 -0
- package/src/widgets/form/MonthPicker.js +65 -23
- package/src/widgets/form/MonthPicker.scss +4 -0
- package/src/widgets/form/NumberField.js +459 -459
- package/src/widgets/form/NumberField.scss +61 -61
- package/src/widgets/form/Radio.scss +121 -121
- package/src/widgets/form/Select.scss +99 -99
- package/src/widgets/form/Slider.scss +118 -118
- package/src/widgets/form/Switch.scss +140 -140
- package/src/widgets/form/TextArea.scss +43 -43
- package/src/widgets/form/TextField.js +290 -290
- package/src/widgets/form/TextField.scss +55 -55
- package/src/widgets/form/UploadButton.d.ts +34 -34
- package/src/widgets/form/variables.scss +353 -353
- package/src/widgets/grid/Grid.d.ts +442 -442
- package/src/widgets/grid/GridRow.js +228 -228
- package/src/widgets/grid/TreeNode.d.ts +23 -23
- package/src/widgets/grid/TreeNode.scss +88 -88
- package/src/widgets/grid/variables.scss +133 -133
- package/src/widgets/nav/LinkButton.js +128 -128
- package/src/widgets/nav/Menu.scss +74 -74
- package/src/widgets/overlay/Dropdown.js +612 -612
- package/src/widgets/overlay/FlyweightTooltipTracker.js +39 -39
- package/src/widgets/overlay/Overlay.d.ts +73 -73
- package/src/widgets/overlay/Window.js +202 -202
- package/src/widgets/overlay/captureMouse.js +124 -124
- package/src/widgets/overlay/createHotPromiseWindowFactory.d.ts +18 -18
- package/src/widgets/overlay/createHotPromiseWindowFactory.js +56 -56
- package/src/widgets/overlay/index.d.ts +11 -11
- package/src/widgets/overlay/index.js +11 -11
- 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
|
|
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
|
|
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
|
|
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,
|
|
10815
|
-
var 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 (!
|
|
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
|
|
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
|
|
11157
|
-
cursorMonth =
|
|
11158
|
-
cursorYear =
|
|
11159
|
-
cursorQuarter =
|
|
11160
|
-
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.
|
|
11293
|
-
|
|
11294
|
-
|
|
11295
|
-
|
|
11296
|
-
|
|
11297
|
-
|
|
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
|
-
|
|
11304
|
-
|
|
11305
|
-
var
|
|
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:
|
|
11349
|
+
unselectable: unselectableMonth,
|
|
11318
11350
|
}),
|
|
11319
11351
|
"data-point": "Y-" + y + "-M-" + m,
|
|
11320
|
-
onMouseEnter:
|
|
11321
|
-
onMouseDown:
|
|
11322
|
-
onMouseUp:
|
|
11323
|
-
onTouchStart:
|
|
11324
|
-
onTouchMove:
|
|
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
package/src/charts/Legend.d.ts
CHANGED
|
@@ -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
|
+
}
|