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.
Files changed (127) hide show
  1. package/build/data/ArrayElementView.spec.js +1 -1
  2. package/build/hooks/store.spec.js +1 -1
  3. package/build/hooks/useTrigger.spec.js +1 -1
  4. package/build/ui/Controller.spec.js +6 -2
  5. package/build/ui/app/startAppLoop.d.ts +3 -2
  6. package/build/ui/app/startHotAppLoop.d.ts +3 -2
  7. package/build/ui/layout/ContentPlaceholder.spec.js +12 -12
  8. package/build.js +129 -129
  9. package/dist/manifest.js +844 -844
  10. package/package.json +3 -2
  11. package/src/charts/Chart.ts +108 -108
  12. package/src/data/ArrayElementView.ts +90 -90
  13. package/src/data/AugmentedViewBase.ts +88 -88
  14. package/src/data/Binding.ts +104 -104
  15. package/src/data/ExposedRecordView.ts +95 -95
  16. package/src/data/ExposedValueView.ts +89 -89
  17. package/src/data/Expression.spec.ts +229 -229
  18. package/src/data/Expression.ts +233 -233
  19. package/src/data/Grouper.spec.ts +57 -57
  20. package/src/data/Grouper.ts +158 -158
  21. package/src/data/NestedDataView.ts +43 -43
  22. package/src/data/ReadOnlyDataView.ts +39 -39
  23. package/src/data/Ref.ts +104 -104
  24. package/src/data/Selector.ts +10 -10
  25. package/src/data/Store.ts +52 -52
  26. package/src/data/StoreProxy.ts +19 -19
  27. package/src/data/StoreRef.ts +66 -66
  28. package/src/data/StringTemplate.spec.ts +132 -132
  29. package/src/data/StringTemplate.ts +93 -93
  30. package/src/data/StructuredSelector.spec.ts +113 -113
  31. package/src/data/StructuredSelector.ts +146 -146
  32. package/src/data/SubscribableView.ts +63 -63
  33. package/src/data/ZoomIntoPropertyView.spec.ts +64 -64
  34. package/src/data/ZoomIntoPropertyView.ts +45 -45
  35. package/src/data/computable.spec.ts +62 -62
  36. package/src/data/createAccessorModelProxy.ts +60 -60
  37. package/src/data/createStructuredSelector.ts +62 -62
  38. package/src/data/getAccessor.spec.ts +11 -11
  39. package/src/data/getAccessor.ts +74 -74
  40. package/src/data/getSelector.spec.ts +43 -43
  41. package/src/data/getSelector.ts +66 -66
  42. package/src/data/ops/filter.spec.ts +35 -35
  43. package/src/data/ops/filter.ts +9 -9
  44. package/src/data/ops/merge.ts +13 -13
  45. package/src/data/ops/removeTreeNodes.spec.ts +37 -37
  46. package/src/data/ops/removeTreeNodes.ts +15 -15
  47. package/src/data/ops/updateArray.spec.ts +69 -69
  48. package/src/data/ops/updateArray.ts +31 -31
  49. package/src/data/ops/updateTree.ts +23 -23
  50. package/src/data/test-types.ts +7 -7
  51. package/src/hooks/useTrigger.ts +26 -26
  52. package/src/index.scss +6 -6
  53. package/src/jsx-runtime.ts +72 -72
  54. package/src/svg/BoundedObject.ts +101 -101
  55. package/src/ui/CSSHelper.ts +17 -17
  56. package/src/ui/ContentResolver.ts +124 -124
  57. package/src/ui/Controller.ts +189 -189
  58. package/src/ui/Culture.ts +159 -159
  59. package/src/ui/DataProxy.ts +55 -55
  60. package/src/ui/FocusManager.ts +171 -171
  61. package/src/ui/Instance.ts +868 -868
  62. package/src/ui/RenderingContext.ts +99 -99
  63. package/src/ui/Rescope.ts +49 -49
  64. package/src/ui/StructuredInstanceDataAccessor.ts +32 -32
  65. package/src/ui/VDOM.ts +34 -34
  66. package/src/ui/adapter/ArrayAdapter.spec.ts +55 -55
  67. package/src/ui/adapter/ArrayAdapter.ts +226 -226
  68. package/src/ui/adapter/TreeAdapter.spec.ts +76 -76
  69. package/src/ui/adapter/TreeAdapter.ts +185 -185
  70. package/src/ui/app/History.ts +133 -133
  71. package/src/ui/app/Url.spec.ts +50 -50
  72. package/src/ui/app/startAppLoop.tsx +2 -1
  73. package/src/ui/app/startHotAppLoop.ts +2 -1
  74. package/src/ui/createFunctionalComponent.ts +65 -65
  75. package/src/ui/index.ts +45 -45
  76. package/src/ui/layout/Content.ts +30 -30
  77. package/src/ui/layout/FirstVisibleChildLayout.ts +60 -60
  78. package/src/ui/selection/KeySelection.ts +165 -165
  79. package/src/ui/selection/PropertySelection.ts +87 -87
  80. package/src/ui/selection/Selection.ts +118 -118
  81. package/src/util/Format.ts +267 -267
  82. package/src/util/browserSupportsPassiveEventHandlers.ts +20 -20
  83. package/src/util/color/rgbToHsl.ts +35 -35
  84. package/src/util/getActiveElement.ts +4 -4
  85. package/src/util/hasKey.ts +18 -18
  86. package/src/util/index.ts +55 -55
  87. package/src/util/innerTextTrim.ts +10 -10
  88. package/src/util/isArray.ts +3 -3
  89. package/src/util/isDataRecord.ts +5 -5
  90. package/src/util/isDefined.ts +3 -3
  91. package/src/util/isString.ts +3 -3
  92. package/src/widgets/Sandbox.ts +103 -103
  93. package/src/widgets/autoFocus.ts +9 -9
  94. package/src/widgets/cx.ts +63 -63
  95. package/src/widgets/drag-drop/ops.tsx +1 -1
  96. package/src/widgets/grid/GridCell.ts +143 -143
  97. package/src/widgets/icons/calendar.tsx +17 -17
  98. package/src/widgets/icons/check.tsx +13 -13
  99. package/src/widgets/icons/clear.tsx +15 -15
  100. package/src/widgets/icons/close.tsx +20 -20
  101. package/src/widgets/icons/cx.tsx +38 -38
  102. package/src/widgets/icons/drop-down.tsx +15 -15
  103. package/src/widgets/icons/file.tsx +13 -13
  104. package/src/widgets/icons/folder-open.tsx +15 -15
  105. package/src/widgets/icons/folder.tsx +13 -13
  106. package/src/widgets/icons/forward.tsx +22 -22
  107. package/src/widgets/icons/loading.tsx +24 -24
  108. package/src/widgets/icons/menu.tsx +17 -17
  109. package/src/widgets/icons/pixel-picker.tsx +18 -18
  110. package/src/widgets/icons/search.tsx +13 -13
  111. package/src/widgets/icons/sort-asc.tsx +14 -14
  112. package/src/widgets/icons/square.tsx +18 -18
  113. package/src/widgets/nav/Route.ts +142 -142
  114. package/src/widgets/overlay/ContextMenu.ts +42 -42
  115. package/src/widgets/overlay/Dropdown.tsx +762 -762
  116. package/src/widgets/overlay/MsgBox.tsx +141 -141
  117. package/src/widgets/overlay/Toast.ts +111 -111
  118. package/src/widgets/overlay/Window.tsx +299 -299
  119. package/src/widgets/overlay/alerts.ts +46 -46
  120. package/src/widgets/overlay/captureMouse.ts +195 -195
  121. package/src/widgets/overlay/createHotPromiseWindowFactory.ts +72 -72
  122. package/src/widgets/overlay/index.d.ts +11 -11
  123. package/src/widgets/overlay/index.ts +11 -11
  124. package/src/widgets/overlay/tooltip-ops.ts +173 -173
  125. package/build/ui/PureContainer.spec.d.ts +0 -1
  126. package/build/ui/PureContainer.spec.js +0 -149
  127. package/dist/manifest.d.ts +0 -1443
@@ -1,50 +1,50 @@
1
- import { Url } from "./Url";
2
- import Route from "route-parser";
3
- import assert from "assert";
4
- describe("Url", function () {
5
- describe(".unresolve", function () {
6
- it("preserves query parameters", function () {
7
- Url.absoluteBase = "https://cxjs.io/docs/";
8
- assert.equal("~/?state=1", Url.unresolve("https://cxjs.io/docs/?state=1"));
9
- });
10
-
11
- it("doesn't touch unresolved urls", function () {
12
- assert.equal("~/test", Url.unresolve("~/test"));
13
- });
14
- });
15
-
16
- describe(".getBaseFromScriptSrc", () => {
17
- it("ignores query strings", function () {
18
- assert.equal(Url.getBaseFromScriptSrc("/vendor.js?qs=1", "~/vendor.js"), "/");
19
- });
20
-
21
- it("allows wildcards", function () {
22
- assert.equal(Url.getBaseFromScriptSrc("/vendor.123.js?qs=1", "~/vendor.*.js"), "/");
23
- });
24
-
25
- it("works for an application folder", function () {
26
- assert.equal(Url.getBaseFromScriptSrc("/datasync/vendor.124c82.js", "~/vendor.*.js"), "/datasync/");
27
- });
28
- });
29
- });
30
-
31
- describe("Route", function () {
32
- it("matches query param", function () {
33
- let route = new Route("~/?state=:state");
34
- let result = route.match("~/?state=1");
35
- assert(result !== false);
36
- assert.equal(result.state, "1");
37
- });
38
-
39
- it("matches routes with extra query params", function () {
40
- let route = new Route("~/?state=:state");
41
- let result = route.match("~/?state=1&more=2");
42
- assert(result);
43
- });
44
-
45
- it.skip("matches query params in any order", function () {
46
- let route = new Route("~/?a=:a&b=:b");
47
- let result = route.match("~/?b=1&a=2");
48
- assert(result);
49
- });
50
- });
1
+ import { Url } from "./Url";
2
+ import Route from "route-parser";
3
+ import assert from "assert";
4
+ describe("Url", function () {
5
+ describe(".unresolve", function () {
6
+ it("preserves query parameters", function () {
7
+ Url.absoluteBase = "https://cxjs.io/docs/";
8
+ assert.equal("~/?state=1", Url.unresolve("https://cxjs.io/docs/?state=1"));
9
+ });
10
+
11
+ it("doesn't touch unresolved urls", function () {
12
+ assert.equal("~/test", Url.unresolve("~/test"));
13
+ });
14
+ });
15
+
16
+ describe(".getBaseFromScriptSrc", () => {
17
+ it("ignores query strings", function () {
18
+ assert.equal(Url.getBaseFromScriptSrc("/vendor.js?qs=1", "~/vendor.js"), "/");
19
+ });
20
+
21
+ it("allows wildcards", function () {
22
+ assert.equal(Url.getBaseFromScriptSrc("/vendor.123.js?qs=1", "~/vendor.*.js"), "/");
23
+ });
24
+
25
+ it("works for an application folder", function () {
26
+ assert.equal(Url.getBaseFromScriptSrc("/datasync/vendor.124c82.js", "~/vendor.*.js"), "/datasync/");
27
+ });
28
+ });
29
+ });
30
+
31
+ describe("Route", function () {
32
+ it("matches query param", function () {
33
+ let route = new Route("~/?state=:state");
34
+ let result = route.match("~/?state=1");
35
+ assert(result !== false);
36
+ assert.equal(result.state, "1");
37
+ });
38
+
39
+ it("matches routes with extra query params", function () {
40
+ let route = new Route("~/?state=:state");
41
+ let result = route.match("~/?state=1&more=2");
42
+ assert(result);
43
+ });
44
+
45
+ it.skip("matches query params in any order", function () {
46
+ let route = new Route("~/?a=:a&b=:b");
47
+ let result = route.match("~/?b=1&a=2");
48
+ assert(result);
49
+ });
50
+ });
@@ -4,6 +4,7 @@ import { Widget, VDOM, WidgetConfig } from "../Widget";
4
4
  import { Store } from "../../data/Store";
5
5
  import { Cx } from "../Cx";
6
6
  import { Instance } from "../Instance";
7
+ import { Create } from "../../util/Component";
7
8
 
8
9
  export interface StartAppLoopOptions {
9
10
  destroyDelay?: number;
@@ -14,7 +15,7 @@ export interface StartAppLoopOptions {
14
15
  export function startAppLoop(
15
16
  parentDOMElement: HTMLElement,
16
17
  storeOrInstance?: Store | Instance,
17
- widget?: Widget | WidgetConfig,
18
+ widget?: Create<typeof Widget> | Create<typeof Widget>[],
18
19
  options: StartAppLoopOptions = {},
19
20
  ): () => void {
20
21
  if (!parentDOMElement || parentDOMElement.nodeType !== 1)
@@ -1,6 +1,7 @@
1
1
  import { startAppLoop, StartAppLoopOptions } from "./startAppLoop";
2
2
  import { Widget, WidgetConfig } from "../Widget";
3
3
  import { Store } from "../../data/Store";
4
+ import { Create } from "../../util/Component";
4
5
 
5
6
  export interface HotModule {
6
7
  hot?: {
@@ -14,7 +15,7 @@ export function startHotAppLoop(
14
15
  appModule: HotModule,
15
16
  element: HTMLElement,
16
17
  store: Store,
17
- widgets: Widget | WidgetConfig,
18
+ widgets: Create<typeof Widget> | Create<typeof Widget>[],
18
19
  options: StartAppLoopOptions = {},
19
20
  ): () => void {
20
21
  let stop: (() => void) | undefined;
@@ -1,65 +1,65 @@
1
- import { createComponentFactory, isComponentFactory } from "../util/Component";
2
- import { flattenProps } from "../ui/flattenProps";
3
- import { PureContainer } from "./PureContainer";
4
- import { UseParentLayout } from "./layout/UseParentLayout";
5
- import { isDefined } from "../util/isDefined";
6
-
7
- let currentInstance: any = null;
8
-
9
- class FunctionalComponent extends PureContainer {
10
- declare childrenFactory: (props: any) => any;
11
- declare props: any;
12
-
13
- initInstance(context: any, instance: any) {
14
- instance.store = instance.parentStore;
15
- this.clear();
16
- currentInstance = instance;
17
- this.add(this.childrenFactory(this.props));
18
- instance.content = this.layout ? this.layout.items : this.items;
19
- this.clear();
20
- currentInstance = null;
21
- }
22
-
23
- explore(context: any, instance: any) {
24
- if (this.layout) this.layout.items = instance.content;
25
- else this.items = instance.content;
26
- this.exploreItems(context, instance, instance.content);
27
- if (instance.computables) {
28
- instance.computables.forEach((cb: any) => cb(instance.store.getData()));
29
- }
30
- }
31
- }
32
-
33
- export function createFunctionalComponent(factory: any) {
34
- if (isComponentFactory(factory)) return factory;
35
-
36
- return createComponentFactory(factory, (props: any = {}) => {
37
- let innerProps = flattenProps(props);
38
- delete innerProps.visible;
39
- delete innerProps.if;
40
- delete innerProps.controller;
41
- delete innerProps.layout;
42
- delete innerProps.outerLayout;
43
- delete innerProps.putInto;
44
- delete innerProps.contentFor;
45
- delete innerProps.jsxAttributes;
46
- delete innerProps.$type;
47
- delete innerProps.vdomKey;
48
-
49
- return {
50
- type: FunctionalComponent,
51
- visible: isDefined(props.if) ? props.if : isDefined(props.visible) ? props.visible : true,
52
- layout: props.layout || UseParentLayout,
53
- controller: props.controller,
54
- outerLayout: props.outerLayout,
55
- putInto: props.contentFor || props.putInto,
56
- vdomKey: props.vdomKey,
57
- childrenFactory: factory,
58
- props: innerProps,
59
- };
60
- });
61
- }
62
-
63
- export function getCurrentInstance() {
64
- return currentInstance;
65
- }
1
+ import { createComponentFactory, isComponentFactory } from "../util/Component";
2
+ import { flattenProps } from "../ui/flattenProps";
3
+ import { PureContainer } from "./PureContainer";
4
+ import { UseParentLayout } from "./layout/UseParentLayout";
5
+ import { isDefined } from "../util/isDefined";
6
+
7
+ let currentInstance: any = null;
8
+
9
+ class FunctionalComponent extends PureContainer {
10
+ declare childrenFactory: (props: any) => any;
11
+ declare props: any;
12
+
13
+ initInstance(context: any, instance: any) {
14
+ instance.store = instance.parentStore;
15
+ this.clear();
16
+ currentInstance = instance;
17
+ this.add(this.childrenFactory(this.props));
18
+ instance.content = this.layout ? this.layout.items : this.items;
19
+ this.clear();
20
+ currentInstance = null;
21
+ }
22
+
23
+ explore(context: any, instance: any) {
24
+ if (this.layout) this.layout.items = instance.content;
25
+ else this.items = instance.content;
26
+ this.exploreItems(context, instance, instance.content);
27
+ if (instance.computables) {
28
+ instance.computables.forEach((cb: any) => cb(instance.store.getData()));
29
+ }
30
+ }
31
+ }
32
+
33
+ export function createFunctionalComponent(factory: any) {
34
+ if (isComponentFactory(factory)) return factory;
35
+
36
+ return createComponentFactory(factory, (props: any = {}) => {
37
+ let innerProps = flattenProps(props);
38
+ delete innerProps.visible;
39
+ delete innerProps.if;
40
+ delete innerProps.controller;
41
+ delete innerProps.layout;
42
+ delete innerProps.outerLayout;
43
+ delete innerProps.putInto;
44
+ delete innerProps.contentFor;
45
+ delete innerProps.jsxAttributes;
46
+ delete innerProps.$type;
47
+ delete innerProps.vdomKey;
48
+
49
+ return {
50
+ type: FunctionalComponent,
51
+ visible: isDefined(props.if) ? props.if : isDefined(props.visible) ? props.visible : true,
52
+ layout: props.layout || UseParentLayout,
53
+ controller: props.controller,
54
+ outerLayout: props.outerLayout,
55
+ putInto: props.contentFor || props.putInto,
56
+ vdomKey: props.vdomKey,
57
+ childrenFactory: factory,
58
+ props: innerProps,
59
+ };
60
+ });
61
+ }
62
+
63
+ export function getCurrentInstance() {
64
+ return currentInstance;
65
+ }
package/src/ui/index.ts CHANGED
@@ -1,45 +1,45 @@
1
- export * from "./Prop";
2
- export * from "./Controller";
3
- export * from "./Widget";
4
- export * from "./Container";
5
- export * from "./PureContainer";
6
- export * from "./Repeater";
7
- export * from "./Rescope";
8
- export * from "./StaticText";
9
- export * from "./Text";
10
- export * from "./CSS";
11
- export * from "./CSSHelper";
12
- export * from "./FocusManager";
13
- export * from "./ResizeManager";
14
- export * from "./ZIndexManager";
15
- export * from "./Format";
16
- export * from "./Culture";
17
- export * from "./Localization";
18
- export * from "./Cx";
19
- export * from "./Instance";
20
- export * from "./RenderingContext";
21
- export * from "./ContentResolver";
22
- export * from "./batchUpdates";
23
- export * from "./IsolatedScope";
24
- export * from "./DetachedScope";
25
- export * from "./Restate";
26
- export * from "./DataProxy";
27
- export * from "./keyboardShortcuts";
28
- export * from "./StructuredInstanceDataAccessor";
29
- export * from "./HoverSync";
30
-
31
- export * from "./createFunctionalComponent";
32
- export * from "./flattenProps";
33
-
34
- export * from "./selection/index";
35
- export * from "./layout/index";
36
- export * from "./app/index";
37
- export * from "./adapter/index";
38
-
39
- export * from "./bind";
40
- export * from "./tpl";
41
- export * from "./expr";
42
-
43
- //re-export computable here
44
- import { computable } from "../data/computable";
45
- export { computable };
1
+ export * from "./Prop";
2
+ export * from "./Controller";
3
+ export * from "./Widget";
4
+ export * from "./Container";
5
+ export * from "./PureContainer";
6
+ export * from "./Repeater";
7
+ export * from "./Rescope";
8
+ export * from "./StaticText";
9
+ export * from "./Text";
10
+ export * from "./CSS";
11
+ export * from "./CSSHelper";
12
+ export * from "./FocusManager";
13
+ export * from "./ResizeManager";
14
+ export * from "./ZIndexManager";
15
+ export * from "./Format";
16
+ export * from "./Culture";
17
+ export * from "./Localization";
18
+ export * from "./Cx";
19
+ export * from "./Instance";
20
+ export * from "./RenderingContext";
21
+ export * from "./ContentResolver";
22
+ export * from "./batchUpdates";
23
+ export * from "./IsolatedScope";
24
+ export * from "./DetachedScope";
25
+ export * from "./Restate";
26
+ export * from "./DataProxy";
27
+ export * from "./keyboardShortcuts";
28
+ export * from "./StructuredInstanceDataAccessor";
29
+ export * from "./HoverSync";
30
+
31
+ export * from "./createFunctionalComponent";
32
+ export * from "./flattenProps";
33
+
34
+ export * from "./selection/index";
35
+ export * from "./layout/index";
36
+ export * from "./app/index";
37
+ export * from "./adapter/index";
38
+
39
+ export * from "./bind";
40
+ export * from "./tpl";
41
+ export * from "./expr";
42
+
43
+ //re-export computable here
44
+ import { computable } from "../data/computable";
45
+ export { computable };
@@ -1,30 +1,30 @@
1
- import { Widget } from "../Widget";
2
- import { PureContainerBase, PureContainerConfig } from "../PureContainer";
3
- import { Instance } from "../Instance";
4
-
5
- export interface ContentConfig extends PureContainerConfig {
6
- /** Placeholder name where the content is rendered. */
7
- name?: string;
8
-
9
- /** Placeholder name where the content is rendered. */
10
- for?: string;
11
- }
12
-
13
- export class Content extends PureContainerBase<ContentConfig, Instance> {
14
- declare name?: string;
15
- declare for?: string;
16
-
17
- constructor(config?: ContentConfig) {
18
- super(config);
19
- }
20
-
21
- init(): void {
22
- super.init();
23
- if (!this.putInto) this.putInto = this.for || this.name;
24
- }
25
- }
26
-
27
- Content.prototype.name = "body";
28
- Content.prototype.isContent = true;
29
-
30
- Widget.alias("content", Content);
1
+ import { Widget } from "../Widget";
2
+ import { PureContainerBase, PureContainerConfig } from "../PureContainer";
3
+ import { Instance } from "../Instance";
4
+
5
+ export interface ContentConfig extends PureContainerConfig {
6
+ /** Placeholder name where the content is rendered. */
7
+ name?: string;
8
+
9
+ /** Placeholder name where the content is rendered. */
10
+ for?: string;
11
+ }
12
+
13
+ export class Content extends PureContainerBase<ContentConfig, Instance> {
14
+ declare name?: string;
15
+ declare for?: string;
16
+
17
+ constructor(config?: ContentConfig) {
18
+ super(config);
19
+ }
20
+
21
+ init(): void {
22
+ super.init();
23
+ if (!this.putInto) this.putInto = this.for || this.name;
24
+ }
25
+ }
26
+
27
+ Content.prototype.name = "body";
28
+ Content.prototype.isContent = true;
29
+
30
+ Widget.alias("content", Content);
@@ -1,60 +1,60 @@
1
- import { PureContainerConfig } from "./../PureContainer";
2
- import { Instance } from "../Instance";
3
- import { PureContainer } from "../PureContainer";
4
- import { RenderingContext } from "../RenderingContext";
5
-
6
- function isVisibleDeep(instance: Instance): boolean {
7
- if (instance.visible && (!instance.widget.isPureContainer || !instance.widget.useParentLayout)) return true;
8
- if (instance.children) {
9
- for (let i = 0; i < instance.children.length; i++) if (isVisibleDeep(instance.children[i])) return true;
10
- }
11
- return false;
12
- }
13
-
14
- class FirstVisibleChildItem extends PureContainer {
15
- constructor(config: PureContainerConfig) {
16
- super(config);
17
- }
18
-
19
- checkVisible(context: RenderingContext, instance: any, data: any): boolean {
20
- if (instance.parent.firstVisibleChild) return false;
21
- return super.checkVisible(context, instance, data);
22
- }
23
-
24
- explore(context: RenderingContext, instance: any): void {
25
- if (instance.parent.firstVisibleChild) return;
26
- super.explore(context, instance);
27
- }
28
-
29
- exploreCleanup(context: RenderingContext, instance: any): void {
30
- if (instance.parent.firstVisibleChild) return;
31
- if (isVisibleDeep(instance)) instance.parent.firstVisibleChild = instance;
32
- }
33
-
34
- render(context: RenderingContext, instance: any, key: any): any {
35
- if (instance.parent.firstVisibleChild != instance) return null;
36
- return super.render(context, instance, key);
37
- }
38
- }
39
-
40
- FirstVisibleChildItem.prototype.useParentLayout = true;
41
-
42
- export class FirstVisibleChildLayout extends PureContainer {
43
- explore(context: RenderingContext, instance: any): void {
44
- instance.firstVisibleChild = null;
45
- super.explore(context, instance);
46
- }
47
-
48
- exploreCleanup(context: RenderingContext, instance: any): void {
49
- let { children, firstVisibleChild } = instance;
50
- if (children) {
51
- for (let i = 0; i < children.length; i++) if (children[i] != firstVisibleChild) children[i].destroy();
52
- }
53
- instance.children = [];
54
- if (firstVisibleChild) instance.children.push(firstVisibleChild);
55
- }
56
-
57
- wrapItem(item: any): any {
58
- return item instanceof FirstVisibleChildItem ? item : FirstVisibleChildItem.create({ items: item });
59
- }
60
- }
1
+ import { PureContainerConfig } from "./../PureContainer";
2
+ import { Instance } from "../Instance";
3
+ import { PureContainer } from "../PureContainer";
4
+ import { RenderingContext } from "../RenderingContext";
5
+
6
+ function isVisibleDeep(instance: Instance): boolean {
7
+ if (instance.visible && (!instance.widget.isPureContainer || !instance.widget.useParentLayout)) return true;
8
+ if (instance.children) {
9
+ for (let i = 0; i < instance.children.length; i++) if (isVisibleDeep(instance.children[i])) return true;
10
+ }
11
+ return false;
12
+ }
13
+
14
+ class FirstVisibleChildItem extends PureContainer {
15
+ constructor(config: PureContainerConfig) {
16
+ super(config);
17
+ }
18
+
19
+ checkVisible(context: RenderingContext, instance: any, data: any): boolean {
20
+ if (instance.parent.firstVisibleChild) return false;
21
+ return super.checkVisible(context, instance, data);
22
+ }
23
+
24
+ explore(context: RenderingContext, instance: any): void {
25
+ if (instance.parent.firstVisibleChild) return;
26
+ super.explore(context, instance);
27
+ }
28
+
29
+ exploreCleanup(context: RenderingContext, instance: any): void {
30
+ if (instance.parent.firstVisibleChild) return;
31
+ if (isVisibleDeep(instance)) instance.parent.firstVisibleChild = instance;
32
+ }
33
+
34
+ render(context: RenderingContext, instance: any, key: any): any {
35
+ if (instance.parent.firstVisibleChild != instance) return null;
36
+ return super.render(context, instance, key);
37
+ }
38
+ }
39
+
40
+ FirstVisibleChildItem.prototype.useParentLayout = true;
41
+
42
+ export class FirstVisibleChildLayout extends PureContainer {
43
+ explore(context: RenderingContext, instance: any): void {
44
+ instance.firstVisibleChild = null;
45
+ super.explore(context, instance);
46
+ }
47
+
48
+ exploreCleanup(context: RenderingContext, instance: any): void {
49
+ let { children, firstVisibleChild } = instance;
50
+ if (children) {
51
+ for (let i = 0; i < children.length; i++) if (children[i] != firstVisibleChild) children[i].destroy();
52
+ }
53
+ instance.children = [];
54
+ if (firstVisibleChild) instance.children.push(firstVisibleChild);
55
+ }
56
+
57
+ wrapItem(item: any): any {
58
+ return item instanceof FirstVisibleChildItem ? item : FirstVisibleChildItem.create({ items: item });
59
+ }
60
+ }