cx 25.4.1 → 25.5.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 (140) hide show
  1. package/dist/charts.js +2 -2
  2. package/dist/data.js +17 -3
  3. package/dist/manifest.js +732 -732
  4. package/dist/ui.js +94 -61
  5. package/dist/widgets.js +25 -13
  6. package/package.json +1 -1
  7. package/src/charts/Legend.d.ts +45 -45
  8. package/src/charts/LegendEntry.js +128 -128
  9. package/src/charts/LegendEntry.scss +27 -27
  10. package/src/charts/PieChart.d.ts +92 -92
  11. package/src/charts/RangeMarker.js +6 -2
  12. package/src/charts/axis/Axis.d.ts +113 -113
  13. package/src/charts/axis/Axis.js +280 -280
  14. package/src/charts/axis/CategoryAxis.d.ts +30 -30
  15. package/src/charts/axis/CategoryAxis.js +241 -241
  16. package/src/charts/axis/NumericAxis.d.ts +46 -46
  17. package/src/charts/axis/NumericAxis.js +351 -351
  18. package/src/charts/axis/Stack.js +55 -55
  19. package/src/charts/axis/TimeAxis.d.ts +31 -28
  20. package/src/charts/axis/TimeAxis.js +611 -611
  21. package/src/charts/helpers/PointReducer.js +47 -47
  22. package/src/charts/helpers/SnapPointFinder.js +69 -69
  23. package/src/data/AugmentedViewBase.js +77 -75
  24. package/src/data/Binding.spec.js +69 -69
  25. package/src/data/ExposedRecordView.js +75 -70
  26. package/src/data/ExposedValueView.js +73 -72
  27. package/src/data/Expression.js +229 -229
  28. package/src/data/Expression.spec.js +229 -229
  29. package/src/data/Ref.d.ts +24 -24
  30. package/src/data/Ref.spec.js +79 -79
  31. package/src/data/StoreRef.spec.js +24 -24
  32. package/src/data/StringTemplate.js +92 -92
  33. package/src/data/StringTemplate.spec.js +132 -132
  34. package/src/data/StructuredDataAccessor.d.ts +7 -7
  35. package/src/data/StructuredSelector.js +132 -132
  36. package/src/data/SubscribableView.js +54 -54
  37. package/src/data/getAccessor.spec.js +11 -11
  38. package/src/data/getSelector.js +49 -49
  39. package/src/hooks/createLocalStorageRef.d.ts +3 -3
  40. package/src/hooks/createLocalStorageRef.js +20 -20
  41. package/src/index.scss +6 -6
  42. package/src/ui/Container.js +154 -183
  43. package/src/ui/Culture.d.ts +57 -57
  44. package/src/ui/Culture.js +139 -139
  45. package/src/ui/Cx.js +3 -3
  46. package/src/ui/DataProxy.js +45 -44
  47. package/src/ui/DetachedScope.js +98 -94
  48. package/src/ui/FocusManager.js +171 -171
  49. package/src/ui/Format.js +108 -108
  50. package/src/ui/HoverSync.js +147 -147
  51. package/src/ui/Instance.d.ts +1 -1
  52. package/src/ui/Instance.js +25 -16
  53. package/src/ui/IsolatedScope.js +30 -30
  54. package/src/ui/Repeater.d.ts +61 -61
  55. package/src/ui/Repeater.js +109 -102
  56. package/src/ui/Rescope.js +35 -31
  57. package/src/ui/Restate.js +167 -163
  58. package/src/ui/Widget.js +184 -200
  59. package/src/ui/adapter/ArrayAdapter.js +152 -142
  60. package/src/ui/adapter/TreeAdapter.js +101 -100
  61. package/src/ui/createFunctionalComponent.d.ts +1 -1
  62. package/src/ui/createFunctionalComponent.js +31 -36
  63. package/src/ui/layout/ContentPlaceholder.d.ts +19 -19
  64. package/src/ui/layout/ContentPlaceholder.js +105 -105
  65. package/src/ui/layout/ContentPlaceholder.spec.js +579 -579
  66. package/src/ui/layout/LabelsTopLayout.js +134 -134
  67. package/src/ui/layout/exploreChildren.d.ts +12 -15
  68. package/src/ui/layout/exploreChildren.js +27 -40
  69. package/src/util/Format.js +270 -270
  70. package/src/util/date/encodeDate.d.ts +1 -1
  71. package/src/util/date/encodeDate.js +8 -8
  72. package/src/util/date/encodeDateWithTimezoneOffset.d.ts +1 -1
  73. package/src/util/date/index.d.ts +11 -11
  74. package/src/util/date/index.js +11 -11
  75. package/src/util/date/parseDateInvariant.d.ts +3 -3
  76. package/src/util/date/parseDateInvariant.js +20 -20
  77. package/src/util/debounce.js +18 -18
  78. package/src/util/getSearchQueryPredicate.js +59 -59
  79. package/src/util/index.d.ts +51 -51
  80. package/src/util/index.js +54 -54
  81. package/src/util/isValidIdentifierName.d.ts +1 -1
  82. package/src/util/isValidIdentifierName.js +5 -5
  83. package/src/util/isValidIdentifierName.spec.js +33 -33
  84. package/src/util/scss/add-rules.scss +38 -38
  85. package/src/util/validatedDebounce.js +19 -19
  86. package/src/widgets/Button.js +118 -118
  87. package/src/widgets/CxCredit.scss +37 -37
  88. package/src/widgets/HighlightedSearchText.js +36 -36
  89. package/src/widgets/HighlightedSearchText.scss +18 -18
  90. package/src/widgets/List.js +594 -587
  91. package/src/widgets/List.scss +91 -91
  92. package/src/widgets/Sandbox.js +9 -8
  93. package/src/widgets/drag-drop/DropZone.js +214 -214
  94. package/src/widgets/form/Calendar.d.ts +86 -86
  95. package/src/widgets/form/Calendar.js +618 -618
  96. package/src/widgets/form/Calendar.scss +196 -196
  97. package/src/widgets/form/Checkbox.scss +127 -127
  98. package/src/widgets/form/ColorField.js +397 -397
  99. package/src/widgets/form/ColorField.scss +96 -96
  100. package/src/widgets/form/ColorPicker.scss +283 -283
  101. package/src/widgets/form/DateTimeField.js +576 -576
  102. package/src/widgets/form/DateTimePicker.js +392 -392
  103. package/src/widgets/form/LookupField.d.ts +179 -179
  104. package/src/widgets/form/LookupField.scss +219 -219
  105. package/src/widgets/form/MonthField.d.ts +99 -99
  106. package/src/widgets/form/MonthField.js +523 -523
  107. package/src/widgets/form/MonthPicker.d.ts +76 -76
  108. package/src/widgets/form/MonthPicker.js +641 -641
  109. package/src/widgets/form/MonthPicker.scss +118 -118
  110. package/src/widgets/form/NumberField.js +459 -459
  111. package/src/widgets/form/NumberField.scss +61 -61
  112. package/src/widgets/form/Radio.scss +121 -121
  113. package/src/widgets/form/Select.scss +99 -99
  114. package/src/widgets/form/Slider.scss +118 -118
  115. package/src/widgets/form/Switch.scss +140 -140
  116. package/src/widgets/form/TextArea.scss +43 -43
  117. package/src/widgets/form/TextField.js +290 -290
  118. package/src/widgets/form/TextField.scss +55 -55
  119. package/src/widgets/form/UploadButton.d.ts +34 -34
  120. package/src/widgets/form/variables.scss +353 -353
  121. package/src/widgets/grid/Grid.d.ts +442 -442
  122. package/src/widgets/grid/Grid.js +7 -0
  123. package/src/widgets/grid/GridRow.js +228 -228
  124. package/src/widgets/grid/TreeNode.d.ts +23 -23
  125. package/src/widgets/grid/TreeNode.scss +88 -88
  126. package/src/widgets/grid/variables.scss +133 -133
  127. package/src/widgets/nav/LinkButton.js +128 -128
  128. package/src/widgets/nav/Menu.scss +74 -74
  129. package/src/widgets/nav/Route.js +102 -106
  130. package/src/widgets/overlay/Dropdown.js +612 -612
  131. package/src/widgets/overlay/FlyweightTooltipTracker.js +39 -39
  132. package/src/widgets/overlay/Overlay.d.ts +73 -73
  133. package/src/widgets/overlay/Tooltip.js +1 -1
  134. package/src/widgets/overlay/Window.js +202 -202
  135. package/src/widgets/overlay/captureMouse.js +124 -124
  136. package/src/widgets/overlay/createHotPromiseWindowFactory.d.ts +18 -18
  137. package/src/widgets/overlay/createHotPromiseWindowFactory.js +56 -56
  138. package/src/widgets/overlay/index.d.ts +11 -11
  139. package/src/widgets/overlay/index.js +11 -11
  140. package/src/widgets/variables.scss +144 -144
@@ -1,102 +1,109 @@
1
- import { Widget } from "./Widget";
2
- import { PureContainer } from "./PureContainer";
3
- import { Container } from "./Container";
4
- import { ArrayAdapter } from "./adapter/ArrayAdapter";
5
- import { UseParentLayout } from "./layout/UseParentLayout";
6
- import { getAccessor } from "../data/getAccessor";
7
-
8
- export class Repeater extends Container {
9
- declareData() {
10
- super.declareData(
11
- {
12
- records: undefined,
13
- sorters: undefined,
14
- sortField: undefined,
15
- sortDirection: undefined,
16
- filterParams: {
17
- structured: true,
18
- },
19
- },
20
- ...arguments
21
- );
22
- }
23
-
24
- init() {
25
- this.recordsAccessor = getAccessor(this.records);
26
-
27
- if (this.recordAlias) this.recordName = this.recordAlias;
28
-
29
- if (this.indexAlias) this.indexName = this.indexAlias;
30
-
31
- this.dataAdapter = ArrayAdapter.create({
32
- ...this.dataAdapter,
33
- recordName: this.recordName,
34
- indexName: this.indexName,
35
- keyField: this.keyField,
36
- immutable: this.immutable,
37
- sealed: this.sealed,
38
- recordsAccessor: this.recordsAccessor,
39
- sortOptions: this.sortOptions,
40
- });
41
-
42
- this.item = PureContainer.create({
43
- children: this.items || this.children,
44
- layout: UseParentLayout,
45
- });
46
-
47
- delete this.children;
48
- delete this.items;
49
-
50
- super.init();
51
- }
52
-
53
- initInstance(context, instance) {
54
- this.dataAdapter.initInstance(context, instance);
55
- }
56
-
57
- prepareData(context, instance) {
58
- let { data } = instance;
59
- if (data.sortField)
60
- data.sorters = [
61
- {
62
- field: data.sortField,
63
- direction: data.sortDirection || "ASC",
64
- },
65
- ];
66
- this.dataAdapter.sort(data.sorters);
67
- let filter = null;
68
- if (this.onCreateFilter) filter = instance.invoke("onCreateFilter", data.filterParams, instance);
69
- else if (this.filter) filter = (item) => this.filter(item, data.filterParams);
70
- this.dataAdapter.setFilter(filter);
71
- instance.mappedRecords = this.dataAdapter.getRecords(context, instance, data.records, instance.store);
72
-
73
- if (this.onTrackMappedRecords) {
74
- instance.invoke("onTrackMappedRecords", instance.mappedRecords, instance);
75
- }
76
-
77
- super.prepareData(context, instance);
78
- }
79
-
80
- explore(context, instance, data) {
81
- let instances = [];
82
- instance.mappedRecords.forEach((record) => {
83
- let subInstance = instance.getChild(context, this.item, record.key, record.store);
84
- let changed = subInstance.cache("recordData", record.data) || subInstance.cache("key", record.key);
85
- subInstance.record = record;
86
- if (this.cached && !changed && subInstance.visible && !subInstance.childStateDirty) {
87
- instances.push(subInstance);
88
- subInstance.shouldUpdate = false;
89
- } else if (subInstance.scheduleExploreIfVisible(context)) instances.push(subInstance);
90
- });
91
- instance.children = instances;
92
- }
93
- }
94
-
95
- Repeater.prototype.recordName = "$record";
96
- Repeater.prototype.indexName = "$index";
97
- Repeater.prototype.cached = false;
98
- Repeater.prototype.immutable = false;
99
- Repeater.prototype.sealed = false;
100
- Repeater.prototype.isPureContainer = true;
101
-
102
- Widget.alias("repeater", Repeater);
1
+ import { Widget } from "./Widget";
2
+ import { PureContainer } from "./PureContainer";
3
+ import { Container } from "./Container";
4
+ import { ArrayAdapter } from "./adapter/ArrayAdapter";
5
+ import { UseParentLayout } from "./layout/UseParentLayout";
6
+ import { getAccessor } from "../data/getAccessor";
7
+
8
+ export class Repeater extends Container {
9
+ declareData() {
10
+ super.declareData(
11
+ {
12
+ records: undefined,
13
+ sorters: undefined,
14
+ sortField: undefined,
15
+ sortDirection: undefined,
16
+ filterParams: {
17
+ structured: true,
18
+ },
19
+ },
20
+ ...arguments,
21
+ );
22
+ }
23
+
24
+ init() {
25
+ this.recordsAccessor = getAccessor(this.records);
26
+
27
+ if (this.recordAlias) this.recordName = this.recordAlias;
28
+
29
+ if (this.indexAlias) this.indexName = this.indexAlias;
30
+
31
+ this.dataAdapter = ArrayAdapter.create({
32
+ ...this.dataAdapter,
33
+ recordName: this.recordName,
34
+ indexName: this.indexName,
35
+ keyField: this.keyField,
36
+ immutable: this.immutable,
37
+ sealed: this.sealed,
38
+ recordsAccessor: this.recordsAccessor,
39
+ sortOptions: this.sortOptions,
40
+ });
41
+
42
+ this.item = PureContainer.create({
43
+ children: this.items || this.children,
44
+ layout: UseParentLayout,
45
+ });
46
+
47
+ delete this.children;
48
+ delete this.items;
49
+
50
+ super.init();
51
+ }
52
+
53
+ initInstance(context, instance) {
54
+ this.dataAdapter.initInstance(context, instance);
55
+ }
56
+
57
+ applyParentStore(instance) {
58
+ super.applyParentStore(instance);
59
+
60
+ // force prepareData to execute again and propagate the store change to the records
61
+ if (instance.cached) delete instance.cached.rawData;
62
+ }
63
+
64
+ prepareData(context, instance) {
65
+ let { data } = instance;
66
+ if (data.sortField)
67
+ data.sorters = [
68
+ {
69
+ field: data.sortField,
70
+ direction: data.sortDirection || "ASC",
71
+ },
72
+ ];
73
+ this.dataAdapter.sort(data.sorters);
74
+ let filter = null;
75
+ if (this.onCreateFilter) filter = instance.invoke("onCreateFilter", data.filterParams, instance);
76
+ else if (this.filter) filter = (item) => this.filter(item, data.filterParams);
77
+ this.dataAdapter.setFilter(filter);
78
+ instance.mappedRecords = this.dataAdapter.getRecords(context, instance, data.records, instance.store);
79
+
80
+ if (this.onTrackMappedRecords) {
81
+ instance.invoke("onTrackMappedRecords", instance.mappedRecords, instance);
82
+ }
83
+
84
+ super.prepareData(context, instance);
85
+ }
86
+
87
+ explore(context, instance, data) {
88
+ let instances = [];
89
+ instance.mappedRecords.forEach((record) => {
90
+ let subInstance = instance.getChild(context, this.item, record.key, record.store);
91
+ let changed = subInstance.cache("recordData", record.data) || subInstance.cache("key", record.key);
92
+ subInstance.record = record;
93
+ if (this.cached && !changed && subInstance.visible && !subInstance.childStateDirty) {
94
+ instances.push(subInstance);
95
+ subInstance.shouldUpdate = false;
96
+ } else if (subInstance.scheduleExploreIfVisible(context)) instances.push(subInstance);
97
+ });
98
+ instance.children = instances;
99
+ }
100
+ }
101
+
102
+ Repeater.prototype.recordName = "$record";
103
+ Repeater.prototype.indexName = "$index";
104
+ Repeater.prototype.cached = false;
105
+ Repeater.prototype.immutable = false;
106
+ Repeater.prototype.sealed = false;
107
+ Repeater.prototype.isPureContainer = true;
108
+
109
+ Widget.alias("repeater", Repeater);
package/src/ui/Rescope.js CHANGED
@@ -1,31 +1,35 @@
1
- import { Widget } from "./Widget";
2
- import { PureContainer } from "./PureContainer";
3
- import { Binding } from "../data/Binding";
4
- import { ZoomIntoPropertyView } from "../data/ZoomIntoPropertyView";
5
- import { StructuredInstanceDataAccessor } from "./StructuredInstanceDataAccessor";
6
- import { isObject } from "../util/isObject";
7
-
8
- export class Rescope extends PureContainer {
9
- init() {
10
- this.binding = Binding.get(this.bind);
11
- if (this.rootAlias) this.rootName = this.rootAlias;
12
- super.init();
13
- }
14
-
15
- initInstance(context, instance) {
16
- instance.store = new ZoomIntoPropertyView({
17
- store: instance.store,
18
- binding: this.binding,
19
- rootName: this.rootName,
20
- nestedData: isObject(this.data) ? new StructuredInstanceDataAccessor({ instance, data: this.data, useParentStore: true }) : null,
21
- });
22
- instance.setStore = (store) => {
23
- instance.store.setStore(store);
24
- };
25
- }
26
- }
27
-
28
- Rescope.prototype.bind = "$page";
29
- Rescope.prototype.rootName = "$root";
30
-
31
- Widget.alias("rescope", Rescope);
1
+ import { Widget } from "./Widget";
2
+ import { PureContainer } from "./PureContainer";
3
+ import { Binding } from "../data/Binding";
4
+ import { ZoomIntoPropertyView } from "../data/ZoomIntoPropertyView";
5
+ import { StructuredInstanceDataAccessor } from "./StructuredInstanceDataAccessor";
6
+ import { isObject } from "../util/isObject";
7
+
8
+ export class Rescope extends PureContainer {
9
+ init() {
10
+ this.binding = Binding.get(this.bind);
11
+ if (this.rootAlias) this.rootName = this.rootAlias;
12
+ super.init();
13
+ }
14
+
15
+ initInstance(context, instance) {
16
+ instance.store = new ZoomIntoPropertyView({
17
+ store: instance.parentStore,
18
+ binding: this.binding,
19
+ rootName: this.rootName,
20
+ nestedData: isObject(this.data)
21
+ ? new StructuredInstanceDataAccessor({ instance, data: this.data, useParentStore: true })
22
+ : null,
23
+ });
24
+ super.initInstance(context, instance);
25
+ }
26
+
27
+ applyParentStore(instance) {
28
+ instance.store.setStore(instance.parentStore);
29
+ }
30
+ }
31
+
32
+ Rescope.prototype.bind = "$page";
33
+ Rescope.prototype.rootName = "$root";
34
+
35
+ Widget.alias("rescope", Rescope);
package/src/ui/Restate.js CHANGED
@@ -1,163 +1,167 @@
1
- import { PureContainer } from "./PureContainer";
2
- import { Store } from "../data/Store";
3
- import { Cx } from "./Cx";
4
- import { VDOM } from "./VDOM";
5
- import { isObject } from "../util/isObject";
6
- import { isUndefined } from "../util/isUndefined";
7
- import { Binding } from "../data/Binding";
8
- import { StructuredSelector } from "../data/StructuredSelector";
9
- import { getCurrentCulture } from "./Culture";
10
-
11
- let persistenceCache = {};
12
-
13
- export class Restate extends PureContainer {
14
- declareData() {
15
- return super.declareData(...arguments, {
16
- deferredUntilIdle: undefined,
17
- idleTimeout: undefined,
18
- cacheKey: undefined,
19
- });
20
- }
21
-
22
- init() {
23
- this.container = PureContainer.create({
24
- type: PureContainer,
25
- items: this.children || this.items,
26
- layout: this.layout,
27
- controller: this.controller,
28
- outerLayout: this.outerLayout,
29
- useParentLayout: !this.detached,
30
- ws: this.ws,
31
- });
32
- this.privateDataSelector = new StructuredSelector({
33
- props: this.data || {},
34
- values: this.data,
35
- });
36
- delete this.items;
37
- delete this.children;
38
- delete this.controller;
39
- delete this.outerLayout;
40
- delete this.layout;
41
- if (this.useParentLayout == null) this.useParentLayout = !this.detached;
42
- super.init();
43
- }
44
-
45
- initSubStore(context, instance) {
46
- let { cacheKey } = instance.data;
47
- this.privateDataSelector.init(instance.store);
48
- instance.subStore = new RestateStore({
49
- store: instance.store,
50
- detached: this.detached,
51
- privateData: this.data || {},
52
- data: cacheKey ? persistenceCache[cacheKey] || {} : {},
53
- dataSelector: this.privateDataSelector.create(),
54
- onSet: (path, value) => instance.nestedDataSet(path, value, this.data),
55
- });
56
-
57
- instance.setStore = (store) => {
58
- instance.store = store;
59
- instance.subStore.setStore(store);
60
- };
61
-
62
- if (cacheKey) {
63
- instance.subscribeOnDestroy(() => {
64
- persistenceCache[cacheKey] = instance.subStore.getData();
65
- });
66
- }
67
- }
68
-
69
- explore(context, instance) {
70
- if (!instance.subStore) this.initSubStore(context, instance);
71
- if (instance.subStore.parentDataCheck()) instance.markShouldUpdate();
72
- instance.cultureInfo = this.culture ?? getCurrentCulture();
73
- if (instance.cache("cultureInfo", instance.culture)) instance.markShouldUpdate();
74
- super.explore(context, instance);
75
- }
76
-
77
- exploreItems(context, instance, items) {
78
- if (!this.detached) {
79
- instance.container = instance.getChild(context, this.container, "container", instance.subStore);
80
- instance.container.scheduleExploreIfVisible(context);
81
- instance.children = [instance.container];
82
- }
83
- }
84
-
85
- render(context, instance, key) {
86
- if (!this.detached) return instance.container.render(context);
87
-
88
- return (
89
- <Cx
90
- key={key}
91
- widget={this.container}
92
- parentInstance={instance}
93
- store={instance.subStore}
94
- subscribe
95
- options={this.options}
96
- onError={this.onError}
97
- deferredUntilIdle={instance.data.deferredUntilIdle}
98
- idleTimeout={instance.data.idleTimeout}
99
- immediate={this.immediate}
100
- cultureInfo={instance.cultureInfo}
101
- />
102
- );
103
- }
104
- }
105
-
106
- Restate.prototype.detached = false;
107
- Restate.prototype.waitForIdle = false;
108
- Restate.prototype.immediate = false;
109
- Restate.prototype.culture = null;
110
-
111
- export const PrivateStore = Restate;
112
-
113
- class RestateStore extends Store {
114
- constructor(config) {
115
- super(config);
116
- this.parentDataVersion = -1;
117
- }
118
-
119
- getData() {
120
- this.silently(() => {
121
- this.parentDataCheck();
122
- });
123
- return super.getData();
124
- }
125
-
126
- parentDataCheck() {
127
- if (this.parentDataVersion == this.store.meta.version) return false;
128
- this.parentDataVersion = this.store.meta.version;
129
- this.parentData = this.dataSelector(this.store.getData());
130
- return this.batch(() => {
131
- for (let key in this.parentData) {
132
- super.setItem(key, this.parentData[key]);
133
- }
134
- });
135
- }
136
-
137
- setItem(path, value) {
138
- let binding = Binding.get(path);
139
- let bindingRoot = binding.parts[0];
140
- if (!isObject(this.privateData) || !this.privateData.hasOwnProperty(bindingRoot)) {
141
- let changed = isUndefined(value) ? super.deleteItem(path) : super.setItem(path, value);
142
- return changed;
143
- }
144
-
145
- let newValue = value;
146
- if (binding.parts.length > 1) newValue = binding.set(this.getData(), value)[bindingRoot];
147
- this.onSet(bindingRoot, newValue);
148
- this.batch(() => {
149
- super.setItem(bindingRoot, newValue);
150
- this.parentDataCheck();
151
- });
152
- return true;
153
- }
154
-
155
- deleteItem(path) {
156
- return this.setItem(path, undefined);
157
- }
158
-
159
- doNotify() {
160
- if (!this.detached) this.store.notify();
161
- super.doNotify();
162
- }
163
- }
1
+ import { PureContainer } from "./PureContainer";
2
+ import { Store } from "../data/Store";
3
+ import { Cx } from "./Cx";
4
+ import { VDOM } from "./VDOM";
5
+ import { isObject } from "../util/isObject";
6
+ import { isUndefined } from "../util/isUndefined";
7
+ import { Binding } from "../data/Binding";
8
+ import { StructuredSelector } from "../data/StructuredSelector";
9
+ import { getCurrentCulture } from "./Culture";
10
+
11
+ let persistenceCache = {};
12
+
13
+ export class Restate extends PureContainer {
14
+ declareData() {
15
+ return super.declareData(...arguments, {
16
+ deferredUntilIdle: undefined,
17
+ idleTimeout: undefined,
18
+ cacheKey: undefined,
19
+ });
20
+ }
21
+
22
+ init() {
23
+ this.container = PureContainer.create({
24
+ type: PureContainer,
25
+ items: this.children || this.items,
26
+ layout: this.layout,
27
+ controller: this.controller,
28
+ outerLayout: this.outerLayout,
29
+ useParentLayout: !this.detached,
30
+ ws: this.ws,
31
+ });
32
+ this.privateDataSelector = new StructuredSelector({
33
+ props: this.data || {},
34
+ values: this.data,
35
+ });
36
+ delete this.items;
37
+ delete this.children;
38
+ delete this.controller;
39
+ delete this.outerLayout;
40
+ delete this.layout;
41
+ if (this.useParentLayout == null) this.useParentLayout = !this.detached;
42
+ super.init();
43
+ }
44
+
45
+ initSubStore(context, instance) {
46
+ let { cacheKey } = instance.data;
47
+ this.privateDataSelector.init(instance.store);
48
+ instance.subStore = new RestateStore({
49
+ store: instance.store,
50
+ detached: this.detached,
51
+ privateData: this.data || {},
52
+ data: cacheKey ? persistenceCache[cacheKey] || {} : {},
53
+ dataSelector: this.privateDataSelector.create(),
54
+ onSet: (path, value) => instance.nestedDataSet(path, value, this.data),
55
+ });
56
+
57
+ if (cacheKey) {
58
+ instance.subscribeOnDestroy(() => {
59
+ persistenceCache[cacheKey] = instance.subStore.getData();
60
+ });
61
+ }
62
+ }
63
+
64
+ applyParentStore(instance) {
65
+ if (instance.subStore) instance.subStore.setStore(instance.parentStore);
66
+ }
67
+
68
+ explore(context, instance) {
69
+ if (!instance.subStore) this.initSubStore(context, instance);
70
+ if (instance.subStore.parentDataCheck()) instance.markShouldUpdate();
71
+ instance.cultureInfo = this.culture ?? getCurrentCulture();
72
+ if (instance.cache("cultureInfo", instance.culture)) instance.markShouldUpdate();
73
+ super.explore(context, instance);
74
+ }
75
+
76
+ exploreItems(context, instance, items) {
77
+ if (!this.detached) {
78
+ instance.container = instance.getChild(context, this.container, "container", instance.subStore);
79
+ instance.container.scheduleExploreIfVisible(context);
80
+ instance.children = [instance.container];
81
+ }
82
+ }
83
+
84
+ render(context, instance, key) {
85
+ if (!this.detached) return instance.container.render(context);
86
+
87
+ return (
88
+ <Cx
89
+ key={key}
90
+ widget={this.container}
91
+ parentInstance={instance}
92
+ store={instance.subStore}
93
+ subscribe
94
+ options={this.options}
95
+ onError={this.onError}
96
+ deferredUntilIdle={instance.data.deferredUntilIdle}
97
+ idleTimeout={instance.data.idleTimeout}
98
+ immediate={this.immediate}
99
+ cultureInfo={instance.cultureInfo}
100
+ />
101
+ );
102
+ }
103
+ }
104
+
105
+ Restate.prototype.detached = false;
106
+ Restate.prototype.waitForIdle = false;
107
+ Restate.prototype.immediate = false;
108
+ Restate.prototype.culture = null;
109
+
110
+ export const PrivateStore = Restate;
111
+
112
+ class RestateStore extends Store {
113
+ constructor(config) {
114
+ super(config);
115
+ this.parentDataVersion = -1;
116
+ }
117
+
118
+ getData() {
119
+ this.silently(() => {
120
+ this.parentDataCheck();
121
+ });
122
+ return super.getData();
123
+ }
124
+
125
+ parentDataCheck() {
126
+ if (this.parentDataVersion == this.store.meta.version) return false;
127
+ this.parentDataVersion = this.store.meta.version;
128
+ this.parentData = this.dataSelector(this.store.getData());
129
+ return this.batch(() => {
130
+ for (let key in this.parentData) {
131
+ super.setItem(key, this.parentData[key]);
132
+ }
133
+ });
134
+ }
135
+
136
+ setItem(path, value) {
137
+ let binding = Binding.get(path);
138
+ let bindingRoot = binding.parts[0];
139
+ if (!isObject(this.privateData) || !this.privateData.hasOwnProperty(bindingRoot)) {
140
+ let changed = isUndefined(value) ? super.deleteItem(path) : super.setItem(path, value);
141
+ return changed;
142
+ }
143
+
144
+ let newValue = value;
145
+ if (binding.parts.length > 1) newValue = binding.set(this.getData(), value)[bindingRoot];
146
+ this.onSet(bindingRoot, newValue);
147
+ this.batch(() => {
148
+ super.setItem(bindingRoot, newValue);
149
+ this.parentDataCheck();
150
+ });
151
+ return true;
152
+ }
153
+
154
+ deleteItem(path) {
155
+ return this.setItem(path, undefined);
156
+ }
157
+
158
+ doNotify() {
159
+ if (!this.detached) this.store.notify();
160
+ super.doNotify();
161
+ }
162
+
163
+ // override the default implementation to avoid meta overwrites
164
+ setStore(store) {
165
+ this.store = store;
166
+ }
167
+ }