cx 25.2.0 → 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 (107) hide show
  1. package/dist/manifest.js +616 -616
  2. package/dist/widgets.js +8 -2
  3. package/package.json +32 -32
  4. package/src/charts/Legend.js +167 -167
  5. package/src/charts/Legend.scss +40 -40
  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/PieChart.js +529 -529
  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.d.ts +28 -28
  17. package/src/charts/axis/TimeAxis.js +611 -611
  18. package/src/charts/helpers/PointReducer.js +47 -47
  19. package/src/charts/helpers/SnapPointFinder.js +69 -69
  20. package/src/data/Binding.spec.js +69 -69
  21. package/src/data/Expression.js +229 -229
  22. package/src/data/Expression.spec.js +229 -229
  23. package/src/data/StringTemplate.js +92 -92
  24. package/src/data/StringTemplate.spec.js +132 -132
  25. package/src/data/StructuredSelector.js +132 -132
  26. package/src/data/getAccessor.spec.js +11 -11
  27. package/src/data/getSelector.js +49 -49
  28. package/src/hooks/createLocalStorageRef.d.ts +3 -3
  29. package/src/hooks/createLocalStorageRef.js +20 -20
  30. package/src/index.scss +6 -6
  31. package/src/ui/Culture.d.ts +57 -57
  32. package/src/ui/Culture.js +139 -139
  33. package/src/ui/FocusManager.js +171 -171
  34. package/src/ui/Format.js +108 -108
  35. package/src/ui/HoverSync.js +147 -147
  36. package/src/ui/Instance.d.ts +72 -72
  37. package/src/ui/Instance.js +614 -614
  38. package/src/ui/Repeater.d.ts +61 -61
  39. package/src/ui/index.d.ts +42 -42
  40. package/src/ui/layout/ContentPlaceholder.d.ts +19 -19
  41. package/src/ui/layout/ContentPlaceholder.js +105 -105
  42. package/src/ui/layout/ContentPlaceholder.spec.js +579 -579
  43. package/src/ui/layout/LabelsTopLayout.js +134 -134
  44. package/src/util/Format.js +270 -270
  45. package/src/util/date/encodeDate.d.ts +1 -1
  46. package/src/util/date/encodeDate.js +8 -8
  47. package/src/util/date/encodeDateWithTimezoneOffset.d.ts +1 -1
  48. package/src/util/date/index.d.ts +11 -11
  49. package/src/util/date/index.js +11 -11
  50. package/src/util/date/parseDateInvariant.d.ts +3 -3
  51. package/src/util/date/parseDateInvariant.js +20 -20
  52. package/src/util/getSearchQueryPredicate.js +59 -59
  53. package/src/util/index.d.ts +51 -51
  54. package/src/util/index.js +54 -54
  55. package/src/util/isValidIdentifierName.d.ts +1 -1
  56. package/src/util/isValidIdentifierName.js +5 -5
  57. package/src/util/isValidIdentifierName.spec.js +33 -33
  58. package/src/util/scss/add-rules.scss +38 -38
  59. package/src/widgets/CxCredit.scss +37 -37
  60. package/src/widgets/HighlightedSearchText.js +36 -36
  61. package/src/widgets/HighlightedSearchText.scss +18 -18
  62. package/src/widgets/List.scss +91 -91
  63. package/src/widgets/drag-drop/DropZone.js +214 -214
  64. package/src/widgets/form/Calendar.js +618 -618
  65. package/src/widgets/form/Calendar.scss +196 -196
  66. package/src/widgets/form/Checkbox.scss +127 -127
  67. package/src/widgets/form/ColorField.js +397 -397
  68. package/src/widgets/form/ColorField.scss +96 -96
  69. package/src/widgets/form/ColorPicker.scss +283 -283
  70. package/src/widgets/form/DateTimeField.js +576 -576
  71. package/src/widgets/form/DateTimePicker.js +392 -392
  72. package/src/widgets/form/LookupField.d.ts +179 -179
  73. package/src/widgets/form/LookupField.scss +219 -219
  74. package/src/widgets/form/MonthField.d.ts +99 -99
  75. package/src/widgets/form/MonthField.js +523 -523
  76. package/src/widgets/form/MonthPicker.d.ts +76 -76
  77. package/src/widgets/form/MonthPicker.js +641 -641
  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 +3414 -3414
  92. package/src/widgets/grid/GridRow.js +228 -228
  93. package/src/widgets/grid/TreeNode.d.ts +23 -23
  94. package/src/widgets/grid/TreeNode.scss +88 -88
  95. package/src/widgets/grid/variables.scss +133 -133
  96. package/src/widgets/nav/Menu.scss +74 -74
  97. package/src/widgets/overlay/Dropdown.js +612 -612
  98. package/src/widgets/overlay/FlyweightTooltipTracker.js +39 -39
  99. package/src/widgets/overlay/Overlay.d.ts +73 -73
  100. package/src/widgets/overlay/Tooltip.js +308 -303
  101. package/src/widgets/overlay/Window.js +202 -202
  102. package/src/widgets/overlay/captureMouse.js +124 -124
  103. package/src/widgets/overlay/createHotPromiseWindowFactory.d.ts +18 -18
  104. package/src/widgets/overlay/createHotPromiseWindowFactory.js +56 -56
  105. package/src/widgets/overlay/index.d.ts +11 -11
  106. package/src/widgets/overlay/index.js +11 -11
  107. 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.2.0",
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
+ }