cx 25.1.2 → 25.2.1

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 (109) hide show
  1. package/dist/data.js +3 -3
  2. package/dist/manifest.js +747 -747
  3. package/dist/widgets.js +8 -2
  4. package/package.json +32 -32
  5. package/src/charts/Legend.js +167 -167
  6. package/src/charts/Legend.scss +40 -40
  7. package/src/charts/LegendEntry.js +128 -128
  8. package/src/charts/LegendEntry.scss +27 -27
  9. package/src/charts/PieChart.d.ts +92 -92
  10. package/src/charts/PieChart.js +529 -529
  11. package/src/charts/axis/Axis.d.ts +113 -113
  12. package/src/charts/axis/Axis.js +280 -280
  13. package/src/charts/axis/CategoryAxis.d.ts +30 -30
  14. package/src/charts/axis/CategoryAxis.js +241 -241
  15. package/src/charts/axis/NumericAxis.js +351 -351
  16. package/src/charts/axis/Stack.js +55 -55
  17. package/src/charts/axis/TimeAxis.d.ts +28 -28
  18. package/src/charts/axis/TimeAxis.js +611 -611
  19. package/src/charts/helpers/PointReducer.js +47 -47
  20. package/src/charts/helpers/SnapPointFinder.js +69 -69
  21. package/src/data/Binding.spec.js +69 -69
  22. package/src/data/Expression.js +229 -229
  23. package/src/data/Expression.spec.js +229 -229
  24. package/src/data/StringTemplate.js +92 -92
  25. package/src/data/StringTemplate.spec.js +132 -127
  26. package/src/data/StructuredSelector.js +2 -1
  27. package/src/data/getAccessor.spec.js +11 -11
  28. package/src/data/getSelector.js +2 -1
  29. package/src/hooks/createLocalStorageRef.d.ts +3 -3
  30. package/src/hooks/createLocalStorageRef.js +20 -20
  31. package/src/index.scss +6 -6
  32. package/src/ui/Culture.d.ts +57 -57
  33. package/src/ui/Culture.js +139 -139
  34. package/src/ui/FocusManager.js +171 -171
  35. package/src/ui/Format.js +108 -108
  36. package/src/ui/HoverSync.js +147 -147
  37. package/src/ui/Instance.d.ts +72 -72
  38. package/src/ui/Instance.js +614 -614
  39. package/src/ui/Repeater.d.ts +61 -61
  40. package/src/ui/index.d.ts +42 -42
  41. package/src/ui/layout/ContentPlaceholder.d.ts +19 -19
  42. package/src/ui/layout/ContentPlaceholder.js +105 -105
  43. package/src/ui/layout/ContentPlaceholder.spec.js +579 -579
  44. package/src/ui/layout/LabelsTopLayout.js +134 -134
  45. package/src/util/Format.js +270 -270
  46. package/src/util/date/encodeDate.d.ts +1 -1
  47. package/src/util/date/encodeDate.js +8 -8
  48. package/src/util/date/encodeDateWithTimezoneOffset.d.ts +1 -1
  49. package/src/util/date/index.d.ts +11 -11
  50. package/src/util/date/index.js +11 -11
  51. package/src/util/date/parseDateInvariant.d.ts +3 -3
  52. package/src/util/date/parseDateInvariant.js +20 -20
  53. package/src/util/getSearchQueryPredicate.js +59 -59
  54. package/src/util/index.d.ts +51 -51
  55. package/src/util/index.js +54 -54
  56. package/src/util/isValidIdentifierName.d.ts +1 -1
  57. package/src/util/isValidIdentifierName.js +5 -5
  58. package/src/util/isValidIdentifierName.spec.js +33 -33
  59. package/src/util/scss/add-rules.scss +38 -38
  60. package/src/widgets/CxCredit.scss +37 -37
  61. package/src/widgets/HighlightedSearchText.js +36 -36
  62. package/src/widgets/HighlightedSearchText.scss +18 -18
  63. package/src/widgets/List.scss +91 -91
  64. package/src/widgets/drag-drop/DropZone.js +214 -214
  65. package/src/widgets/form/Calendar.js +618 -618
  66. package/src/widgets/form/Calendar.scss +196 -196
  67. package/src/widgets/form/Checkbox.scss +127 -127
  68. package/src/widgets/form/ColorField.js +397 -397
  69. package/src/widgets/form/ColorField.scss +96 -96
  70. package/src/widgets/form/ColorPicker.scss +283 -283
  71. package/src/widgets/form/DateTimeField.js +576 -576
  72. package/src/widgets/form/DateTimePicker.js +392 -392
  73. package/src/widgets/form/LookupField.d.ts +179 -179
  74. package/src/widgets/form/LookupField.scss +219 -219
  75. package/src/widgets/form/MonthField.d.ts +99 -99
  76. package/src/widgets/form/MonthField.js +523 -523
  77. package/src/widgets/form/MonthPicker.d.ts +76 -76
  78. package/src/widgets/form/MonthPicker.js +641 -641
  79. package/src/widgets/form/MonthPicker.scss +118 -118
  80. package/src/widgets/form/NumberField.js +459 -459
  81. package/src/widgets/form/NumberField.scss +61 -61
  82. package/src/widgets/form/Radio.scss +121 -121
  83. package/src/widgets/form/Select.scss +99 -99
  84. package/src/widgets/form/Slider.scss +118 -118
  85. package/src/widgets/form/Switch.scss +140 -140
  86. package/src/widgets/form/TextArea.scss +43 -43
  87. package/src/widgets/form/TextField.js +290 -290
  88. package/src/widgets/form/TextField.scss +55 -55
  89. package/src/widgets/form/UploadButton.d.ts +34 -34
  90. package/src/widgets/form/variables.scss +353 -353
  91. package/src/widgets/grid/Grid.d.ts +442 -442
  92. package/src/widgets/grid/Grid.js +3414 -3414
  93. package/src/widgets/grid/Grid.scss +638 -637
  94. package/src/widgets/grid/GridRow.js +228 -228
  95. package/src/widgets/grid/TreeNode.d.ts +23 -23
  96. package/src/widgets/grid/TreeNode.scss +88 -88
  97. package/src/widgets/grid/variables.scss +133 -133
  98. package/src/widgets/nav/Menu.scss +74 -74
  99. package/src/widgets/overlay/Dropdown.js +612 -612
  100. package/src/widgets/overlay/FlyweightTooltipTracker.js +39 -39
  101. package/src/widgets/overlay/Overlay.d.ts +73 -73
  102. package/src/widgets/overlay/Tooltip.js +308 -303
  103. package/src/widgets/overlay/Window.js +202 -202
  104. package/src/widgets/overlay/captureMouse.js +124 -124
  105. package/src/widgets/overlay/createHotPromiseWindowFactory.d.ts +18 -18
  106. package/src/widgets/overlay/createHotPromiseWindowFactory.js +56 -56
  107. package/src/widgets/overlay/index.d.ts +11 -11
  108. package/src/widgets/overlay/index.js +11 -11
  109. package/src/widgets/variables.scss +144 -144
package/dist/widgets.js CHANGED
@@ -4277,6 +4277,7 @@ function tooltipMouseMove(e, parentInstance, tooltip, options) {
4277
4277
  dismiss();
4278
4278
  instance.dismissTooltip = null;
4279
4279
  };
4280
+ instance.lastClickTime = Date.now();
4280
4281
  setTimeout(function () {
4281
4282
  var relatedElement = instance.widget.relatedElement;
4282
4283
  if (!canceled && instance.mouseOverTarget && relatedElement.ownerDocument.body.contains(relatedElement)) {
@@ -4291,8 +4292,13 @@ function tooltipMouseMove(e, parentInstance, tooltip, options) {
4291
4292
  }, instance.widget.createDelay);
4292
4293
  } else {
4293
4294
  if (isTouchEvent() && instance.widget.touchBehavior == "toggle") {
4294
- instance.dismissTooltip();
4295
- instance.dismissTooltip = null;
4295
+ var _instance$lastClickTi;
4296
+ // ios fires mousemove events after touchend
4297
+ if (Date.now() - ((_instance$lastClickTi = instance.lastClickTime) != null ? _instance$lastClickTi : 0) > 50) {
4298
+ instance.lastClickTime = Date.now();
4299
+ instance.dismissTooltip();
4300
+ instance.dismissTooltip = null;
4301
+ }
4296
4302
  } else if (dirty && instance.update) instance.update();
4297
4303
  }
4298
4304
  if (instance.trackMouse && e && e.target) instance.trackMouse(e);
package/package.json CHANGED
@@ -1,32 +1,32 @@
1
- {
2
- "name": "cx",
3
- "version": "25.1.2",
4
- "description": "Advanced JavaScript UI framework for admin and dashboard applications with ready to use grid, form and chart components.",
5
- "main": "index.js",
6
- "jsnext:main": "src/index.js",
7
- "scripts": {
8
- "build": "node build/index"
9
- },
10
- "author": "Codaxy",
11
- "license": "MIT",
12
- "bugs": {
13
- "url": "https://github.com/codaxy/cxjs"
14
- },
15
- "homepage": "https://cxjs.io",
16
- "dependencies": {
17
- "intl-io": "^0.4.3",
18
- "route-parser": "^0.0.5"
19
- },
20
- "peerDependencies": {
21
- "@types/react": "*",
22
- "react": "*",
23
- "react-dom": "*"
24
- },
25
- "repository": {
26
- "type": "git",
27
- "url": "git@github.com:codaxy/cxjs.git"
28
- },
29
- "devDependencies": {
30
- "react-test-renderer": "^18.3.1"
31
- }
32
- }
1
+ {
2
+ "name": "cx",
3
+ "version": "25.2.1",
4
+ "description": "Advanced JavaScript UI framework for admin and dashboard applications with ready to use grid, form and chart components.",
5
+ "main": "index.js",
6
+ "jsnext:main": "src/index.js",
7
+ "scripts": {
8
+ "build": "node build/index"
9
+ },
10
+ "author": "Codaxy",
11
+ "license": "MIT",
12
+ "bugs": {
13
+ "url": "https://github.com/codaxy/cxjs"
14
+ },
15
+ "homepage": "https://cxjs.io",
16
+ "dependencies": {
17
+ "intl-io": "^0.4.3",
18
+ "route-parser": "^0.0.5"
19
+ },
20
+ "peerDependencies": {
21
+ "@types/react": "*",
22
+ "react": "*",
23
+ "react-dom": "*"
24
+ },
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "git@github.com:codaxy/cxjs.git"
28
+ },
29
+ "devDependencies": {
30
+ "react-test-renderer": "^18.3.1"
31
+ }
32
+ }
@@ -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
+ }