cx 26.0.4 → 26.0.6
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/build/data/ArrayElementView.spec.js +1 -1
- package/build/hooks/store.spec.js +1 -1
- package/build/hooks/useTrigger.spec.js +1 -1
- package/build/ui/Controller.spec.js +6 -2
- package/build/ui/app/startAppLoop.d.ts +3 -2
- package/build/ui/app/startHotAppLoop.d.ts +3 -2
- package/build/ui/layout/ContentPlaceholder.spec.js +12 -12
- package/build.js +129 -129
- package/dist/manifest.js +844 -844
- package/package.json +3 -2
- package/src/charts/Chart.ts +108 -108
- package/src/data/ArrayElementView.ts +90 -90
- package/src/data/AugmentedViewBase.ts +88 -88
- package/src/data/Binding.ts +104 -104
- package/src/data/ExposedRecordView.ts +95 -95
- package/src/data/ExposedValueView.ts +89 -89
- package/src/data/Expression.spec.ts +229 -229
- package/src/data/Expression.ts +233 -233
- package/src/data/Grouper.spec.ts +57 -57
- package/src/data/Grouper.ts +158 -158
- package/src/data/NestedDataView.ts +43 -43
- package/src/data/ReadOnlyDataView.ts +39 -39
- package/src/data/Ref.ts +104 -104
- package/src/data/Selector.ts +10 -10
- package/src/data/Store.ts +52 -52
- package/src/data/StoreProxy.ts +19 -19
- package/src/data/StoreRef.ts +66 -66
- package/src/data/StringTemplate.spec.ts +132 -132
- package/src/data/StringTemplate.ts +93 -93
- package/src/data/StructuredSelector.spec.ts +113 -113
- package/src/data/StructuredSelector.ts +146 -146
- package/src/data/SubscribableView.ts +63 -63
- package/src/data/ZoomIntoPropertyView.spec.ts +64 -64
- package/src/data/ZoomIntoPropertyView.ts +45 -45
- package/src/data/computable.spec.ts +62 -62
- package/src/data/createAccessorModelProxy.ts +60 -60
- package/src/data/createStructuredSelector.ts +62 -62
- package/src/data/getAccessor.spec.ts +11 -11
- package/src/data/getAccessor.ts +74 -74
- package/src/data/getSelector.spec.ts +43 -43
- package/src/data/getSelector.ts +66 -66
- package/src/data/ops/filter.spec.ts +35 -35
- package/src/data/ops/filter.ts +9 -9
- package/src/data/ops/merge.ts +13 -13
- package/src/data/ops/removeTreeNodes.spec.ts +37 -37
- package/src/data/ops/removeTreeNodes.ts +15 -15
- package/src/data/ops/updateArray.spec.ts +69 -69
- package/src/data/ops/updateArray.ts +31 -31
- package/src/data/ops/updateTree.ts +23 -23
- package/src/data/test-types.ts +7 -7
- package/src/hooks/useTrigger.ts +26 -26
- package/src/index.scss +6 -6
- package/src/jsx-runtime.ts +72 -72
- package/src/svg/BoundedObject.ts +101 -101
- package/src/ui/CSSHelper.ts +17 -17
- package/src/ui/ContentResolver.ts +124 -124
- package/src/ui/Controller.ts +189 -189
- package/src/ui/Culture.ts +159 -159
- package/src/ui/DataProxy.ts +55 -55
- package/src/ui/FocusManager.ts +171 -171
- package/src/ui/Instance.ts +868 -868
- package/src/ui/RenderingContext.ts +99 -99
- package/src/ui/Rescope.ts +49 -49
- package/src/ui/StructuredInstanceDataAccessor.ts +32 -32
- package/src/ui/VDOM.ts +34 -34
- package/src/ui/adapter/ArrayAdapter.spec.ts +55 -55
- package/src/ui/adapter/ArrayAdapter.ts +226 -226
- package/src/ui/adapter/TreeAdapter.spec.ts +76 -76
- package/src/ui/adapter/TreeAdapter.ts +185 -185
- package/src/ui/app/History.ts +133 -133
- package/src/ui/app/Url.spec.ts +50 -50
- package/src/ui/app/startAppLoop.tsx +2 -1
- package/src/ui/app/startHotAppLoop.ts +2 -1
- package/src/ui/createFunctionalComponent.ts +65 -65
- package/src/ui/index.ts +45 -45
- package/src/ui/layout/Content.ts +30 -30
- package/src/ui/layout/FirstVisibleChildLayout.ts +60 -60
- package/src/ui/selection/KeySelection.ts +165 -165
- package/src/ui/selection/PropertySelection.ts +87 -87
- package/src/ui/selection/Selection.ts +118 -118
- package/src/util/Format.ts +267 -267
- package/src/util/browserSupportsPassiveEventHandlers.ts +20 -20
- package/src/util/color/rgbToHsl.ts +35 -35
- package/src/util/getActiveElement.ts +4 -4
- package/src/util/hasKey.ts +18 -18
- package/src/util/index.ts +55 -55
- package/src/util/innerTextTrim.ts +10 -10
- package/src/util/isArray.ts +3 -3
- package/src/util/isDataRecord.ts +5 -5
- package/src/util/isDefined.ts +3 -3
- package/src/util/isString.ts +3 -3
- package/src/widgets/Sandbox.ts +103 -103
- package/src/widgets/autoFocus.ts +9 -9
- package/src/widgets/cx.ts +63 -63
- package/src/widgets/drag-drop/ops.tsx +1 -1
- package/src/widgets/grid/GridCell.ts +143 -143
- package/src/widgets/icons/calendar.tsx +17 -17
- package/src/widgets/icons/check.tsx +13 -13
- package/src/widgets/icons/clear.tsx +15 -15
- package/src/widgets/icons/close.tsx +20 -20
- package/src/widgets/icons/cx.tsx +38 -38
- package/src/widgets/icons/drop-down.tsx +15 -15
- package/src/widgets/icons/file.tsx +13 -13
- package/src/widgets/icons/folder-open.tsx +15 -15
- package/src/widgets/icons/folder.tsx +13 -13
- package/src/widgets/icons/forward.tsx +22 -22
- package/src/widgets/icons/loading.tsx +24 -24
- package/src/widgets/icons/menu.tsx +17 -17
- package/src/widgets/icons/pixel-picker.tsx +18 -18
- package/src/widgets/icons/search.tsx +13 -13
- package/src/widgets/icons/sort-asc.tsx +14 -14
- package/src/widgets/icons/square.tsx +18 -18
- package/src/widgets/nav/Route.ts +142 -142
- package/src/widgets/overlay/ContextMenu.ts +42 -42
- package/src/widgets/overlay/Dropdown.tsx +762 -762
- package/src/widgets/overlay/MsgBox.tsx +141 -141
- package/src/widgets/overlay/Toast.ts +111 -111
- package/src/widgets/overlay/Window.tsx +299 -299
- package/src/widgets/overlay/alerts.ts +46 -46
- package/src/widgets/overlay/captureMouse.ts +195 -195
- package/src/widgets/overlay/createHotPromiseWindowFactory.ts +72 -72
- package/src/widgets/overlay/index.d.ts +11 -11
- package/src/widgets/overlay/index.ts +11 -11
- package/src/widgets/overlay/tooltip-ops.ts +173 -173
- package/build/ui/PureContainer.spec.d.ts +0 -1
- package/build/ui/PureContainer.spec.js +0 -149
- package/dist/manifest.d.ts +0 -1443
package/src/util/hasKey.ts
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import { isFunction } from "./isFunction";
|
|
2
|
-
import { isString } from "./isString";
|
|
3
|
-
|
|
4
|
-
export function hasKey<K extends string>(obj: object, key: K): obj is Record<K, unknown> {
|
|
5
|
-
return key in obj;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export function hasStringAtKey<K extends string>(obj: object, key: K): obj is Record<K, string> {
|
|
9
|
-
return hasKey(obj, key) && isString(obj[key]);
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export function hasValueAtKey<K extends string>(obj: object, key: K, value: unknown): obj is Record<K, unknown> {
|
|
13
|
-
return hasKey(obj, key) && obj[key] === value;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export function hasFunctionAtKey<K extends string>(obj: object, key: K): obj is Record<K, (...args: any[]) => any> {
|
|
17
|
-
return hasKey(obj, key) && isFunction(obj[key]);
|
|
18
|
-
}
|
|
1
|
+
import { isFunction } from "./isFunction";
|
|
2
|
+
import { isString } from "./isString";
|
|
3
|
+
|
|
4
|
+
export function hasKey<K extends string>(obj: object, key: K): obj is Record<K, unknown> {
|
|
5
|
+
return key in obj;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export function hasStringAtKey<K extends string>(obj: object, key: K): obj is Record<K, string> {
|
|
9
|
+
return hasKey(obj, key) && isString(obj[key]);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function hasValueAtKey<K extends string>(obj: object, key: K, value: unknown): obj is Record<K, unknown> {
|
|
13
|
+
return hasKey(obj, key) && obj[key] === value;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function hasFunctionAtKey<K extends string>(obj: object, key: K): obj is Record<K, (...args: any[]) => any> {
|
|
17
|
+
return hasKey(obj, key) && isFunction(obj[key]);
|
|
18
|
+
}
|
package/src/util/index.ts
CHANGED
|
@@ -1,55 +1,55 @@
|
|
|
1
|
-
export * from "./Console";
|
|
2
|
-
export * from "./Debug";
|
|
3
|
-
export * from "./DOM";
|
|
4
|
-
export * from "./Format";
|
|
5
|
-
export * from "./expandFatArrows";
|
|
6
|
-
export * from "./GlobalCacheIdentifier";
|
|
7
|
-
export * from "./innerTextTrim";
|
|
8
|
-
export * from "./isDigit";
|
|
9
|
-
export * from "./isPromise";
|
|
10
|
-
export * from "./isTouchDevice";
|
|
11
|
-
export * from "./KeyCode";
|
|
12
|
-
export * from "./parseStyle";
|
|
13
|
-
export * from "./quote";
|
|
14
|
-
export * from "./scrollElementIntoView";
|
|
15
|
-
export * from "./shallowEquals";
|
|
16
|
-
export * from "./Timing";
|
|
17
|
-
export * from "./date/index";
|
|
18
|
-
export * from "./color/index";
|
|
19
|
-
export * from "./getVendorPrefix";
|
|
20
|
-
export * from "./eventCallbacks";
|
|
21
|
-
export * from "./getSearchQueryPredicate";
|
|
22
|
-
export * from "./escapeSpecialRegexCharacters";
|
|
23
|
-
export * from "./browserSupportsPassiveEventHandlers";
|
|
24
|
-
export * from "./isTouchEvent";
|
|
25
|
-
export * from "./debounce";
|
|
26
|
-
export * from "./throttle";
|
|
27
|
-
export * from "./SubscriberList";
|
|
28
|
-
export * from "./findScrollableParent";
|
|
29
|
-
export * from "./getScrollerBoundingClientRect";
|
|
30
|
-
export * from "./isNonEmptyArray";
|
|
31
|
-
export * from "./isArray";
|
|
32
|
-
export * from "./isObject";
|
|
33
|
-
export * from "./isNumber";
|
|
34
|
-
export * from "./isFunction";
|
|
35
|
-
export * from "./isString";
|
|
36
|
-
export * from "./isUndefined";
|
|
37
|
-
export * from "./isDefined";
|
|
38
|
-
export * from "./routeAppend";
|
|
39
|
-
export * from "./reverseSlice";
|
|
40
|
-
export * from "./getTopLevelBoundingClientRect";
|
|
41
|
-
export * from "./getParentFrameBoundingClientRect";
|
|
42
|
-
export * from "./getActiveElement";
|
|
43
|
-
export * from "./Component";
|
|
44
|
-
export * from "./onIdleCallback";
|
|
45
|
-
export * from "./validatedDebounce";
|
|
46
|
-
export * from "./addEventListenerWithOptions";
|
|
47
|
-
export * from "./coalesce";
|
|
48
|
-
export * from "./dummyCallback";
|
|
49
|
-
export * from "./calculateNaturalElementHeight";
|
|
50
|
-
export * from "./isTextInputElement";
|
|
51
|
-
export * from "./capitalize";
|
|
52
|
-
export * from "./isValidIdentifierName";
|
|
53
|
-
export * from "./isDataRecord";
|
|
54
|
-
export * from "./TraversalStack";
|
|
55
|
-
export * from "./hasKey"
|
|
1
|
+
export * from "./Console";
|
|
2
|
+
export * from "./Debug";
|
|
3
|
+
export * from "./DOM";
|
|
4
|
+
export * from "./Format";
|
|
5
|
+
export * from "./expandFatArrows";
|
|
6
|
+
export * from "./GlobalCacheIdentifier";
|
|
7
|
+
export * from "./innerTextTrim";
|
|
8
|
+
export * from "./isDigit";
|
|
9
|
+
export * from "./isPromise";
|
|
10
|
+
export * from "./isTouchDevice";
|
|
11
|
+
export * from "./KeyCode";
|
|
12
|
+
export * from "./parseStyle";
|
|
13
|
+
export * from "./quote";
|
|
14
|
+
export * from "./scrollElementIntoView";
|
|
15
|
+
export * from "./shallowEquals";
|
|
16
|
+
export * from "./Timing";
|
|
17
|
+
export * from "./date/index";
|
|
18
|
+
export * from "./color/index";
|
|
19
|
+
export * from "./getVendorPrefix";
|
|
20
|
+
export * from "./eventCallbacks";
|
|
21
|
+
export * from "./getSearchQueryPredicate";
|
|
22
|
+
export * from "./escapeSpecialRegexCharacters";
|
|
23
|
+
export * from "./browserSupportsPassiveEventHandlers";
|
|
24
|
+
export * from "./isTouchEvent";
|
|
25
|
+
export * from "./debounce";
|
|
26
|
+
export * from "./throttle";
|
|
27
|
+
export * from "./SubscriberList";
|
|
28
|
+
export * from "./findScrollableParent";
|
|
29
|
+
export * from "./getScrollerBoundingClientRect";
|
|
30
|
+
export * from "./isNonEmptyArray";
|
|
31
|
+
export * from "./isArray";
|
|
32
|
+
export * from "./isObject";
|
|
33
|
+
export * from "./isNumber";
|
|
34
|
+
export * from "./isFunction";
|
|
35
|
+
export * from "./isString";
|
|
36
|
+
export * from "./isUndefined";
|
|
37
|
+
export * from "./isDefined";
|
|
38
|
+
export * from "./routeAppend";
|
|
39
|
+
export * from "./reverseSlice";
|
|
40
|
+
export * from "./getTopLevelBoundingClientRect";
|
|
41
|
+
export * from "./getParentFrameBoundingClientRect";
|
|
42
|
+
export * from "./getActiveElement";
|
|
43
|
+
export * from "./Component";
|
|
44
|
+
export * from "./onIdleCallback";
|
|
45
|
+
export * from "./validatedDebounce";
|
|
46
|
+
export * from "./addEventListenerWithOptions";
|
|
47
|
+
export * from "./coalesce";
|
|
48
|
+
export * from "./dummyCallback";
|
|
49
|
+
export * from "./calculateNaturalElementHeight";
|
|
50
|
+
export * from "./isTextInputElement";
|
|
51
|
+
export * from "./capitalize";
|
|
52
|
+
export * from "./isValidIdentifierName";
|
|
53
|
+
export * from "./isDataRecord";
|
|
54
|
+
export * from "./TraversalStack";
|
|
55
|
+
export * from "./hasKey"
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
* @param str
|
|
4
|
-
* @return {string}
|
|
5
|
-
*/
|
|
6
|
-
export function innerTextTrim(str: string): string {
|
|
7
|
-
str = str.replace(/\t/g, "");
|
|
8
|
-
str = str.replace(/(\s*[\r\n]\s*)/g, " ");
|
|
9
|
-
return str;
|
|
10
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
*
|
|
3
|
+
* @param str
|
|
4
|
+
* @return {string}
|
|
5
|
+
*/
|
|
6
|
+
export function innerTextTrim(str: string): string {
|
|
7
|
+
str = str.replace(/\t/g, "");
|
|
8
|
+
str = str.replace(/(\s*[\r\n]\s*)/g, " ");
|
|
9
|
+
return str;
|
|
10
|
+
}
|
package/src/util/isArray.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export function isArray<T = unknown>(x: unknown): x is T[] {
|
|
2
|
-
return Array.isArray(x);
|
|
3
|
-
}
|
|
1
|
+
export function isArray<T = unknown>(x: unknown): x is T[] {
|
|
2
|
+
return Array.isArray(x);
|
|
3
|
+
}
|
package/src/util/isDataRecord.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { isObject } from "./isObject";
|
|
2
|
-
|
|
3
|
-
export function isDataRecord(v: unknown): v is Record<string, any> {
|
|
4
|
-
return isObject(v);
|
|
5
|
-
}
|
|
1
|
+
import { isObject } from "./isObject";
|
|
2
|
+
|
|
3
|
+
export function isDataRecord(v: unknown): v is Record<string, any> {
|
|
4
|
+
return isObject(v);
|
|
5
|
+
}
|
package/src/util/isDefined.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export function isDefined<T>(x: T | undefined): x is T {
|
|
2
|
-
return x !== undefined;
|
|
3
|
-
}
|
|
1
|
+
export function isDefined<T>(x: T | undefined): x is T {
|
|
2
|
+
return x !== undefined;
|
|
3
|
+
}
|
package/src/util/isString.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export function isString(x: unknown): x is string {
|
|
2
|
-
return typeof x === "string";
|
|
3
|
-
}
|
|
1
|
+
export function isString(x: unknown): x is string {
|
|
2
|
+
return typeof x === "string";
|
|
3
|
+
}
|
package/src/widgets/Sandbox.ts
CHANGED
|
@@ -1,103 +1,103 @@
|
|
|
1
|
-
import { Widget } from "../ui/Widget";
|
|
2
|
-
import { PureContainerBase, PureContainerConfig } from "../ui/PureContainer";
|
|
3
|
-
import { Binding, BindingInput } from "../data/Binding";
|
|
4
|
-
import { ExposedValueView, ExposedValueViewConfig } from "../data/ExposedValueView";
|
|
5
|
-
import { RenderingContext } from "../ui/RenderingContext";
|
|
6
|
-
import { Instance } from "../ui/Instance";
|
|
7
|
-
import { StringProp, WritableProp } from "../ui/Prop";
|
|
8
|
-
|
|
9
|
-
export interface SandboxConfig extends PureContainerConfig {
|
|
10
|
-
/** Binding to the object that holds sandbox data. */
|
|
11
|
-
storage: WritableProp<Record<string, any>>;
|
|
12
|
-
|
|
13
|
-
/** Key used to identify the sandbox instance within the storage. */
|
|
14
|
-
key?: StringProp;
|
|
15
|
-
|
|
16
|
-
/** Alias for `key`. */
|
|
17
|
-
accessKey?: StringProp;
|
|
18
|
-
|
|
19
|
-
/** Alias used to expose sandbox data. Default is `$page`. */
|
|
20
|
-
recordName?: string;
|
|
21
|
-
|
|
22
|
-
/** Alias for `recordName`. */
|
|
23
|
-
recordAlias?: string;
|
|
24
|
-
|
|
25
|
-
/** Indicate that parent store data should not be mutated. */
|
|
26
|
-
immutable?: boolean;
|
|
27
|
-
|
|
28
|
-
/** Indicate that sandbox store data should not be mutated. */
|
|
29
|
-
sealed?: boolean;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export interface SandboxInstance extends Instance {
|
|
33
|
-
store: ExposedValueView;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export class Sandbox extends PureContainerBase<SandboxConfig, SandboxInstance> {
|
|
37
|
-
declare storage: WritableProp<Record<string, any>>;
|
|
38
|
-
declare key?: StringProp;
|
|
39
|
-
declare recordName?: string;
|
|
40
|
-
declare recordAlias?: string;
|
|
41
|
-
declare accessKey?: StringProp;
|
|
42
|
-
declare immutable?: boolean;
|
|
43
|
-
declare sealed?: boolean;
|
|
44
|
-
declare storageBinding: Binding;
|
|
45
|
-
init(): void {
|
|
46
|
-
if (this.recordAlias) this.recordName = this.recordAlias;
|
|
47
|
-
|
|
48
|
-
if (this.accessKey) this.key = this.accessKey;
|
|
49
|
-
|
|
50
|
-
this.storageBinding = Binding.get(this.storage);
|
|
51
|
-
|
|
52
|
-
super.init();
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
initInstance(context: RenderingContext, instance: SandboxInstance): void {
|
|
56
|
-
instance.store = new ExposedValueView({
|
|
57
|
-
store: instance.parentStore,
|
|
58
|
-
containerBinding: this.storageBinding,
|
|
59
|
-
key: null,
|
|
60
|
-
recordName: this.recordName,
|
|
61
|
-
immutable: this.immutable,
|
|
62
|
-
});
|
|
63
|
-
super.initInstance(context, instance);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
applyParentStore(instance: SandboxInstance): void {
|
|
67
|
-
instance.store.setStore(instance.parentStore);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
declareData(...args: Record<string, unknown>[]): void {
|
|
71
|
-
super.declareData(
|
|
72
|
-
{
|
|
73
|
-
storage: undefined,
|
|
74
|
-
key: undefined,
|
|
75
|
-
},
|
|
76
|
-
...args,
|
|
77
|
-
);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
prepareData(context: RenderingContext, instance: SandboxInstance): void {
|
|
81
|
-
var { store, data } = instance;
|
|
82
|
-
if (store.getKey() !== data.key) {
|
|
83
|
-
//when navigating to a page using the same widget tree as the previous page
|
|
84
|
-
//everything needs to be reinstantiated, e.g. user/1 => user/2
|
|
85
|
-
instance.store = new ExposedValueView({
|
|
86
|
-
store: store,
|
|
87
|
-
containerBinding: this.storageBinding,
|
|
88
|
-
key: data.key,
|
|
89
|
-
recordName: this.recordName,
|
|
90
|
-
immutable: this.immutable,
|
|
91
|
-
sealed: this.sealed,
|
|
92
|
-
});
|
|
93
|
-
instance.clearChildrenCache();
|
|
94
|
-
}
|
|
95
|
-
super.prepareData(context, instance);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
Sandbox.prototype.recordName = "$page";
|
|
100
|
-
Sandbox.prototype.immutable = false;
|
|
101
|
-
Sandbox.prototype.sealed = false;
|
|
102
|
-
|
|
103
|
-
Widget.alias("sandbox", Sandbox);
|
|
1
|
+
import { Widget } from "../ui/Widget";
|
|
2
|
+
import { PureContainerBase, PureContainerConfig } from "../ui/PureContainer";
|
|
3
|
+
import { Binding, BindingInput } from "../data/Binding";
|
|
4
|
+
import { ExposedValueView, ExposedValueViewConfig } from "../data/ExposedValueView";
|
|
5
|
+
import { RenderingContext } from "../ui/RenderingContext";
|
|
6
|
+
import { Instance } from "../ui/Instance";
|
|
7
|
+
import { StringProp, WritableProp } from "../ui/Prop";
|
|
8
|
+
|
|
9
|
+
export interface SandboxConfig extends PureContainerConfig {
|
|
10
|
+
/** Binding to the object that holds sandbox data. */
|
|
11
|
+
storage: WritableProp<Record<string, any>>;
|
|
12
|
+
|
|
13
|
+
/** Key used to identify the sandbox instance within the storage. */
|
|
14
|
+
key?: StringProp;
|
|
15
|
+
|
|
16
|
+
/** Alias for `key`. */
|
|
17
|
+
accessKey?: StringProp;
|
|
18
|
+
|
|
19
|
+
/** Alias used to expose sandbox data. Default is `$page`. */
|
|
20
|
+
recordName?: string;
|
|
21
|
+
|
|
22
|
+
/** Alias for `recordName`. */
|
|
23
|
+
recordAlias?: string;
|
|
24
|
+
|
|
25
|
+
/** Indicate that parent store data should not be mutated. */
|
|
26
|
+
immutable?: boolean;
|
|
27
|
+
|
|
28
|
+
/** Indicate that sandbox store data should not be mutated. */
|
|
29
|
+
sealed?: boolean;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface SandboxInstance extends Instance {
|
|
33
|
+
store: ExposedValueView;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export class Sandbox extends PureContainerBase<SandboxConfig, SandboxInstance> {
|
|
37
|
+
declare storage: WritableProp<Record<string, any>>;
|
|
38
|
+
declare key?: StringProp;
|
|
39
|
+
declare recordName?: string;
|
|
40
|
+
declare recordAlias?: string;
|
|
41
|
+
declare accessKey?: StringProp;
|
|
42
|
+
declare immutable?: boolean;
|
|
43
|
+
declare sealed?: boolean;
|
|
44
|
+
declare storageBinding: Binding;
|
|
45
|
+
init(): void {
|
|
46
|
+
if (this.recordAlias) this.recordName = this.recordAlias;
|
|
47
|
+
|
|
48
|
+
if (this.accessKey) this.key = this.accessKey;
|
|
49
|
+
|
|
50
|
+
this.storageBinding = Binding.get(this.storage);
|
|
51
|
+
|
|
52
|
+
super.init();
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
initInstance(context: RenderingContext, instance: SandboxInstance): void {
|
|
56
|
+
instance.store = new ExposedValueView({
|
|
57
|
+
store: instance.parentStore,
|
|
58
|
+
containerBinding: this.storageBinding,
|
|
59
|
+
key: null,
|
|
60
|
+
recordName: this.recordName,
|
|
61
|
+
immutable: this.immutable,
|
|
62
|
+
});
|
|
63
|
+
super.initInstance(context, instance);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
applyParentStore(instance: SandboxInstance): void {
|
|
67
|
+
instance.store.setStore(instance.parentStore);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
declareData(...args: Record<string, unknown>[]): void {
|
|
71
|
+
super.declareData(
|
|
72
|
+
{
|
|
73
|
+
storage: undefined,
|
|
74
|
+
key: undefined,
|
|
75
|
+
},
|
|
76
|
+
...args,
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
prepareData(context: RenderingContext, instance: SandboxInstance): void {
|
|
81
|
+
var { store, data } = instance;
|
|
82
|
+
if (store.getKey() !== data.key) {
|
|
83
|
+
//when navigating to a page using the same widget tree as the previous page
|
|
84
|
+
//everything needs to be reinstantiated, e.g. user/1 => user/2
|
|
85
|
+
instance.store = new ExposedValueView({
|
|
86
|
+
store: store,
|
|
87
|
+
containerBinding: this.storageBinding,
|
|
88
|
+
key: data.key,
|
|
89
|
+
recordName: this.recordName,
|
|
90
|
+
immutable: this.immutable,
|
|
91
|
+
sealed: this.sealed,
|
|
92
|
+
});
|
|
93
|
+
instance.clearChildrenCache();
|
|
94
|
+
}
|
|
95
|
+
super.prepareData(context, instance);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
Sandbox.prototype.recordName = "$page";
|
|
100
|
+
Sandbox.prototype.immutable = false;
|
|
101
|
+
Sandbox.prototype.sealed = false;
|
|
102
|
+
|
|
103
|
+
Widget.alias("sandbox", Sandbox);
|
package/src/widgets/autoFocus.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { FocusManager } from "../ui/FocusManager";
|
|
2
|
-
import { isTouchEvent } from "../util/isTouchEvent";
|
|
3
|
-
|
|
4
|
-
export function autoFocus(el: HTMLElement | undefined | null, component: any): void {
|
|
5
|
-
let data = component.props.data || component.props.instance.data;
|
|
6
|
-
let autoFocusValue = el && data.autoFocus;
|
|
7
|
-
if (autoFocusValue && autoFocusValue != component.autoFocusValue && !isTouchEvent()) FocusManager.focus(el!);
|
|
8
|
-
component.autoFocusValue = autoFocusValue;
|
|
9
|
-
}
|
|
1
|
+
import { FocusManager } from "../ui/FocusManager";
|
|
2
|
+
import { isTouchEvent } from "../util/isTouchEvent";
|
|
3
|
+
|
|
4
|
+
export function autoFocus(el: HTMLElement | undefined | null, component: any): void {
|
|
5
|
+
let data = component.props.data || component.props.instance.data;
|
|
6
|
+
let autoFocusValue = el && data.autoFocus;
|
|
7
|
+
if (autoFocusValue && autoFocusValue != component.autoFocusValue && !isTouchEvent()) FocusManager.focus(el!);
|
|
8
|
+
component.autoFocusValue = autoFocusValue;
|
|
9
|
+
}
|
package/src/widgets/cx.ts
CHANGED
|
@@ -1,63 +1,63 @@
|
|
|
1
|
-
import { HtmlElement } from "./HtmlElement";
|
|
2
|
-
import { VDOM } from "../ui/Widget";
|
|
3
|
-
import { createComponentFactory, isComponentFactory } from "../util/Component";
|
|
4
|
-
import { createFunctionalComponent } from "../ui/createFunctionalComponent";
|
|
5
|
-
import { isString } from "../util/isString";
|
|
6
|
-
import { isNumber } from "../util/isNumber";
|
|
7
|
-
import { isFunction } from "../util/isFunction";
|
|
8
|
-
import { isUndefined } from "../util/isUndefined";
|
|
9
|
-
import { isArray } from "../util/isArray";
|
|
10
|
-
|
|
11
|
-
import { flattenProps } from "../ui/flattenProps";
|
|
12
|
-
|
|
13
|
-
let htmlFactoryCache: Record<string, any> = {};
|
|
14
|
-
|
|
15
|
-
function getHtmlElementFactory(tagName: string): any {
|
|
16
|
-
let factory = htmlFactoryCache[tagName];
|
|
17
|
-
if (factory) return factory;
|
|
18
|
-
return (htmlFactoryCache[tagName] = createComponentFactory(
|
|
19
|
-
() => {},
|
|
20
|
-
(config: any) => HtmlElement.create(HtmlElement, { tag: tagName }, flattenProps(config)),
|
|
21
|
-
{ tag: tagName },
|
|
22
|
-
));
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export function cx(typeName: any, props?: any, ...children: any[]): any {
|
|
26
|
-
if (isArray(typeName)) return typeName;
|
|
27
|
-
|
|
28
|
-
if (isFunction(typeName) && isUndefined(props))
|
|
29
|
-
return createFunctionalComponent((config: any) => typeName(flattenProps(config)));
|
|
30
|
-
|
|
31
|
-
if (typeName.type || typeName.$type) return typeName;
|
|
32
|
-
|
|
33
|
-
if (children && children.length == 0) children = [];
|
|
34
|
-
|
|
35
|
-
if (children && children.length == 1) children = children[0];
|
|
36
|
-
|
|
37
|
-
if (typeName == "cx") return children;
|
|
38
|
-
|
|
39
|
-
if (typeName == "react") return react(children);
|
|
40
|
-
|
|
41
|
-
if (isString(typeName) && typeName[0] == typeName[0].toLowerCase()) typeName = getHtmlElementFactory(typeName);
|
|
42
|
-
|
|
43
|
-
return {
|
|
44
|
-
$type: typeName,
|
|
45
|
-
$props: props,
|
|
46
|
-
jsxAttributes: props && Object.keys(props),
|
|
47
|
-
children,
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
export function react(config: any): any {
|
|
52
|
-
if (!config || isString(config) || isNumber(config) || VDOM.isValidElement(config)) return config;
|
|
53
|
-
|
|
54
|
-
if (isArray(config)) return config.map(react);
|
|
55
|
-
|
|
56
|
-
let type = config.$type;
|
|
57
|
-
|
|
58
|
-
if (isComponentFactory(type) && type.$meta && type.$meta.tag) type = type.$meta.tag;
|
|
59
|
-
|
|
60
|
-
if (isArray(config.children)) return VDOM.createElement(type, config.$props, ...config.children.map(react));
|
|
61
|
-
|
|
62
|
-
return VDOM.createElement(type, config.$props, react(config.children));
|
|
63
|
-
}
|
|
1
|
+
import { HtmlElement } from "./HtmlElement";
|
|
2
|
+
import { VDOM } from "../ui/Widget";
|
|
3
|
+
import { createComponentFactory, isComponentFactory } from "../util/Component";
|
|
4
|
+
import { createFunctionalComponent } from "../ui/createFunctionalComponent";
|
|
5
|
+
import { isString } from "../util/isString";
|
|
6
|
+
import { isNumber } from "../util/isNumber";
|
|
7
|
+
import { isFunction } from "../util/isFunction";
|
|
8
|
+
import { isUndefined } from "../util/isUndefined";
|
|
9
|
+
import { isArray } from "../util/isArray";
|
|
10
|
+
|
|
11
|
+
import { flattenProps } from "../ui/flattenProps";
|
|
12
|
+
|
|
13
|
+
let htmlFactoryCache: Record<string, any> = {};
|
|
14
|
+
|
|
15
|
+
function getHtmlElementFactory(tagName: string): any {
|
|
16
|
+
let factory = htmlFactoryCache[tagName];
|
|
17
|
+
if (factory) return factory;
|
|
18
|
+
return (htmlFactoryCache[tagName] = createComponentFactory(
|
|
19
|
+
() => {},
|
|
20
|
+
(config: any) => HtmlElement.create(HtmlElement, { tag: tagName }, flattenProps(config)),
|
|
21
|
+
{ tag: tagName },
|
|
22
|
+
));
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function cx(typeName: any, props?: any, ...children: any[]): any {
|
|
26
|
+
if (isArray(typeName)) return typeName;
|
|
27
|
+
|
|
28
|
+
if (isFunction(typeName) && isUndefined(props))
|
|
29
|
+
return createFunctionalComponent((config: any) => typeName(flattenProps(config)));
|
|
30
|
+
|
|
31
|
+
if (typeName.type || typeName.$type) return typeName;
|
|
32
|
+
|
|
33
|
+
if (children && children.length == 0) children = [];
|
|
34
|
+
|
|
35
|
+
if (children && children.length == 1) children = children[0];
|
|
36
|
+
|
|
37
|
+
if (typeName == "cx") return children;
|
|
38
|
+
|
|
39
|
+
if (typeName == "react") return react(children);
|
|
40
|
+
|
|
41
|
+
if (isString(typeName) && typeName[0] == typeName[0].toLowerCase()) typeName = getHtmlElementFactory(typeName);
|
|
42
|
+
|
|
43
|
+
return {
|
|
44
|
+
$type: typeName,
|
|
45
|
+
$props: props,
|
|
46
|
+
jsxAttributes: props && Object.keys(props),
|
|
47
|
+
children,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function react(config: any): any {
|
|
52
|
+
if (!config || isString(config) || isNumber(config) || VDOM.isValidElement(config)) return config;
|
|
53
|
+
|
|
54
|
+
if (isArray(config)) return config.map(react);
|
|
55
|
+
|
|
56
|
+
let type = config.$type;
|
|
57
|
+
|
|
58
|
+
if (isComponentFactory(type) && type.$meta && type.$meta.tag) type = type.$meta.tag;
|
|
59
|
+
|
|
60
|
+
if (isArray(config.children)) return VDOM.createElement(type, config.$props, ...config.children.map(react));
|
|
61
|
+
|
|
62
|
+
return VDOM.createElement(type, config.$props, react(config.children));
|
|
63
|
+
}
|
|
@@ -157,7 +157,7 @@ export function initiateDragDrop(
|
|
|
157
157
|
};
|
|
158
158
|
|
|
159
159
|
if (clone.widget && clone.store && !clone.cloneContent) {
|
|
160
|
-
let content = { $type: ContextWrap, value: { disabled: true }, children: clone.widget }
|
|
160
|
+
let content = { $type: ContextWrap, value: { disabled: true }, children: clone.widget };
|
|
161
161
|
puppet.stop = startAppLoop(cloneEl, clone.store, content, {
|
|
162
162
|
removeParentDOMElement: true,
|
|
163
163
|
});
|