@openfin/core 31.74.1 → 31.74.3

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 (120) hide show
  1. package/package.json +1 -1
  2. package/src/OpenFin.d.ts +284 -253
  3. package/src/OpenFin.js +0 -2
  4. package/src/api/api-exposer/api-consumer.d.ts +28 -0
  5. package/src/api/api-exposer/api-consumer.js +28 -0
  6. package/src/api/api-exposer/api-exposer.d.ts +35 -0
  7. package/src/api/api-exposer/api-exposer.js +38 -0
  8. package/src/api/api-exposer/decorators.d.ts +10 -0
  9. package/src/api/api-exposer/decorators.js +18 -0
  10. package/src/api/api-exposer/index.d.ts +4 -0
  11. package/src/api/api-exposer/index.js +20 -0
  12. package/src/api/api-exposer/strategies/index.d.ts +1 -0
  13. package/src/api/api-exposer/strategies/index.js +17 -0
  14. package/src/api/api-exposer/strategies/openfin-channels/channels-consumer.d.ts +14 -0
  15. package/src/api/api-exposer/strategies/openfin-channels/channels-consumer.js +20 -0
  16. package/src/api/api-exposer/strategies/openfin-channels/channels-exposer.d.ts +20 -0
  17. package/src/api/api-exposer/strategies/openfin-channels/channels-exposer.js +23 -0
  18. package/src/api/api-exposer/strategies/openfin-channels/index.d.ts +2 -0
  19. package/src/api/api-exposer/strategies/openfin-channels/index.js +18 -0
  20. package/src/api/application/Factory.js +1 -2
  21. package/src/api/application/Instance.js +23 -5
  22. package/src/api/base.d.ts +5 -2
  23. package/src/api/base.js +7 -0
  24. package/src/api/events/application.d.ts +22 -22
  25. package/src/api/events/base.d.ts +6 -9
  26. package/src/api/events/channel.d.ts +5 -5
  27. package/src/api/events/emitterMap.d.ts +1 -1
  28. package/src/api/events/externalApplication.d.ts +3 -3
  29. package/src/api/events/frame.d.ts +5 -5
  30. package/src/api/events/globalHotkey.d.ts +3 -3
  31. package/src/api/events/platform.d.ts +3 -3
  32. package/src/api/events/system.d.ts +18 -18
  33. package/src/api/events/typedEventEmitter.d.ts +1 -1
  34. package/src/api/events/view.d.ts +17 -14
  35. package/src/api/events/webcontents.d.ts +24 -22
  36. package/src/api/events/window.d.ts +65 -57
  37. package/src/api/fin.d.ts +1 -1
  38. package/src/api/frame/Instance.d.ts +1 -1
  39. package/src/api/interappbus/channel/channel.d.ts +4 -4
  40. package/src/api/interappbus/channel/channel.js +3 -3
  41. package/src/api/interappbus/channel/client.d.ts +2 -2
  42. package/src/api/interappbus/channel/client.js +20 -20
  43. package/src/api/interappbus/channel/connection-manager.d.ts +1 -1
  44. package/src/api/interappbus/channel/connection-manager.js +12 -12
  45. package/src/api/interappbus/channel/index.d.ts +2 -2
  46. package/src/api/interappbus/channel/index.js +1 -1
  47. package/src/api/interappbus/channel/protocols/classic/strategy.d.ts +1 -1
  48. package/src/api/interappbus/channel/protocols/combined/strategy.d.ts +2 -2
  49. package/src/api/interappbus/channel/protocols/combined/strategy.js +5 -5
  50. package/src/api/interappbus/channel/protocols/index.d.ts +4 -4
  51. package/src/api/interappbus/channel/protocols/rtc/endpoint.d.ts +1 -1
  52. package/src/api/interappbus/channel/protocols/rtc/strategy.d.ts +1 -1
  53. package/src/api/interappbus/channel/protocols/strategy-types.d.ts +4 -4
  54. package/src/api/interappbus/channel/protocols/strategy.d.ts +3 -3
  55. package/src/api/interappbus/channel/provider.d.ts +5 -5
  56. package/src/api/interappbus/channel/provider.js +24 -24
  57. package/src/api/interop/InteropBroker.d.ts +1 -1
  58. package/src/api/interop/InteropBroker.js +6 -2
  59. package/src/api/interop/fdc3/PrivateChannelClient.d.ts +2 -1
  60. package/src/api/interop/fdc3/PrivateChannelClient.js +15 -7
  61. package/src/api/interop/fdc3/PrivateChannelProvider.d.ts +16 -2
  62. package/src/api/interop/fdc3/PrivateChannelProvider.js +80 -28
  63. package/src/api/interop/fdc3/fdc3-1.2.js +53 -5
  64. package/src/api/interop/fdc3/fdc3-2.0.d.ts +11 -10
  65. package/src/api/interop/fdc3/fdc3-2.0.js +18 -19
  66. package/src/api/interop/fdc3/shapes/fdc3v1.d.ts +3 -3
  67. package/src/api/interop/fdc3/shapes/fdc3v2.d.ts +5 -5
  68. package/src/api/interop/fdc3/utils.d.ts +17 -0
  69. package/src/api/interop/fdc3/utils.js +75 -21
  70. package/src/api/interop/fdc3/versions.d.ts +1 -1
  71. package/src/api/interop/utils.d.ts +0 -1
  72. package/src/api/interop/utils.js +1 -9
  73. package/src/api/me.d.ts +3 -3
  74. package/src/api/platform/Factory.js +5 -9
  75. package/src/api/platform/Instance.d.ts +1 -1
  76. package/src/api/platform/Instance.js +1 -1
  77. package/src/api/platform/common-utils.d.ts +1 -1
  78. package/src/api/platform/layout/Factory.d.ts +1 -1
  79. package/src/api/platform/layout/Factory.js +11 -3
  80. package/src/api/platform/layout/Instance.d.ts +9 -3
  81. package/src/api/platform/layout/Instance.js +26 -1
  82. package/src/api/platform/layout/controllers/layout-content-cache.d.ts +9 -0
  83. package/src/api/platform/layout/controllers/layout-content-cache.js +54 -0
  84. package/src/api/platform/layout/controllers/layout-entities-controller.d.ts +117 -0
  85. package/src/api/platform/layout/controllers/layout-entities-controller.js +270 -0
  86. package/src/api/platform/layout/controllers/splitter-controller.d.ts +1 -1
  87. package/src/api/platform/layout/entities/layout-entities.d.ts +144 -0
  88. package/src/api/platform/layout/entities/layout-entities.js +216 -0
  89. package/src/api/platform/layout/entities/shapes.d.ts +6 -0
  90. package/src/api/platform/layout/entities/shapes.js +2 -0
  91. package/src/api/platform/layout/layout.constants.d.ts +1 -0
  92. package/src/api/platform/layout/layout.constants.js +4 -0
  93. package/src/api/platform/layout/shapes.d.ts +4 -1
  94. package/src/api/platform/layout/utils/layout-traversal.d.ts +4 -0
  95. package/src/api/platform/layout/utils/layout-traversal.js +65 -0
  96. package/src/api/system/index.d.ts +13 -13
  97. package/src/api/view/Instance.d.ts +13 -3
  98. package/src/api/view/Instance.js +41 -4
  99. package/src/environment/browser.d.ts +1 -1
  100. package/src/environment/environment.d.ts +1 -1
  101. package/src/environment/node-env.d.ts +1 -1
  102. package/src/environment/openfin-env.d.ts +1 -1
  103. package/src/mock.d.ts +1 -1
  104. package/src/mock.js +5 -2
  105. package/src/shapes/ERROR_BOX_TYPES.d.ts +1 -1
  106. package/src/shapes/protocol.d.ts +3 -3
  107. package/src/transport/transport-errors.d.ts +2 -2
  108. package/src/transport/transport.d.ts +3 -3
  109. package/src/transport/transport.js +1 -4
  110. package/src/transport/wire.d.ts +14 -13
  111. package/src/util/channel-api-relay.d.ts +13 -0
  112. package/src/util/channel-api-relay.js +37 -0
  113. package/src/util/errors.d.ts +2 -2
  114. package/src/util/http.js +4 -2
  115. package/src/util/lazy.d.ts +16 -0
  116. package/src/util/lazy.js +26 -0
  117. package/src/util/promises.d.ts +1 -1
  118. package/src/util/reversible-map.d.ts +11 -0
  119. package/src/util/reversible-map.js +49 -0
  120. package/src/util/utilTypes.d.ts +1 -1
@@ -0,0 +1,144 @@
1
+ import type * as OpenFin from '../../../../OpenFin';
2
+ import { LayoutEntitiesClient } from '../shapes';
3
+ /**
4
+ * @internal
5
+ * Supplies an ApiClient for {@link LayoutEntitiesController} and helper methods
6
+ * for the entities {@link TabStack} AND {@link ColumnOrRow} to use.
7
+ */
8
+ export declare abstract class LayoutNode {
9
+ #private;
10
+ /** @internal */
11
+ protected constructor(client: LayoutEntitiesClient, entityId: string);
12
+ /**
13
+ * @internal
14
+ * The type of this node, one of: 'row' | 'column' | 'stack';
15
+ */
16
+ readonly abstract type: OpenFin.LayoutEntityTypes;
17
+ /**
18
+ * @internal
19
+ * This instance's unique id used when calling the layout-entities-controller api client
20
+ */
21
+ protected readonly entityId: string;
22
+ /**
23
+ * @internal
24
+ * Encapsulates Api consumption of {@link LayoutEntitiesController} with a relayed dispatch
25
+ * @param client
26
+ * @param controllerId
27
+ * @param identity
28
+ * @returns a new instance of {@link LayoutEntitiesClient} with bound to the controllerId
29
+ */
30
+ static newLayoutEntitiesClient: (client: OpenFin.ChannelClient, controllerId: string, identity: OpenFin.Identity) => Promise<LayoutEntitiesClient>;
31
+ static getEntity: (definition: OpenFin.LayoutEntityDefinition, client: LayoutEntitiesClient) => ColumnOrRow | TabStack;
32
+ /**
33
+ * Determines if this {@link ColumnOrRow} or {@link TabStack} is the top level content item in the current layout.
34
+ * @returns Promise resolving true if this is the root, or false otherwise.
35
+ */
36
+ isRoot: () => Promise<boolean>;
37
+ /**
38
+ * Determines if this {@link ColumnOrRow} or {@link TabStack} is the top level
39
+ * content item in the current layout.
40
+ * @returns Promise resolving true if this is the root, or false otherwise.
41
+ */
42
+ exists: () => Promise<boolean>;
43
+ /**
44
+ * Retrieves the parent {@link ColumnOrRow} or {@link TabStack} of this item, if one exists.
45
+ * @returns Promise resolving with the {@link ColumnOrRow} or {@link TabStack} that contains this item, or undefined if this is the root content item.
46
+ */
47
+ getParent: () => Promise<ColumnOrRow | TabStack | undefined>;
48
+ /**
49
+ * Given a list of view creation options or references and a layout position, creates an adjacent {@link TabStack}
50
+ *
51
+ * Known Issue: If the number of views to add overflows the tab-container, the added views will be set as active
52
+ * during each render, and then placed at the front of the tab-stack, while the underlying order of tabs will remain unchanged.
53
+ * This means the views you pass to createAdjacentStack() may not render in the order given by the array.
54
+ * Until fixed, this problem can be avoided only if your window is wide enough to fit creating all the views in the tabstack.
55
+ *
56
+ * @param views List of identities or view creation options of the views to include in the stack
57
+ * @param options Creation options, defaults to position: 'right'
58
+ * @returns an instance of {@link TabStack} containing the given views
59
+ * @experimental
60
+ */
61
+ createAdjacentStack: (views: OpenFin.PlatformViewCreationOptions[], options: {
62
+ position?: OpenFin.LayoutPosition;
63
+ }) => Promise<TabStack>;
64
+ /**
65
+ * Finds the immediate adjacent layout item given an edge Position
66
+ * @param edge
67
+ * @returns an array of {@link TabStack} found, if none found returns an empty array.
68
+ */
69
+ getAdjacentStacks: (edge: OpenFin.LayoutPosition) => Promise<TabStack[]>;
70
+ }
71
+ /**
72
+ * A {@link TabStack} is used to manage the state of a TabStack within an OpenFin Layout and
73
+ * traverse to its parent Content Item.
74
+ */
75
+ export declare class TabStack extends LayoutNode {
76
+ #private;
77
+ /** @internal */
78
+ constructor(client: LayoutEntitiesClient, entityId: string);
79
+ /**
80
+ * Type of the content item. Always stack, but useful for distinguishing between a {@link TabStack} and {@link ColumnOrRow}.
81
+ */
82
+ readonly type = "stack";
83
+ /**
84
+ * Retrieves a list of all views belonging to this {@link TabStack}.
85
+ *
86
+ * Known Issue: If adding a view overflows the tab-container width, the added view will be set as active
87
+ * and rendered at the front of the tab-stack, while the underlying order of tabs will remain unchanged.
88
+ * If that happens and then getViews() is called, it will return the identities in a different order than
89
+ * than the currently rendered tab order.
90
+ *
91
+ * @returns Resolves with a list containing the {@link OpenFin.Identity identities} of each view belonging to the {@link TabStack}.
92
+ * @throws If the {@link TabStack} has been destroyed.
93
+ * @experimental
94
+ */
95
+ getViews: () => Promise<OpenFin.Identity[]>;
96
+ /**
97
+ * Adds or creates a view in this {@link TabStack}.
98
+ *
99
+ * Known Issue: If adding a view overflows the tab-container, the added view will be set as active
100
+ * and rendered at the front of the tab-stack, while the underlying order of tabs will remain unchanged.
101
+ *
102
+ * @param view The identity of an existing view to add, or options to create a view.
103
+ * @param options Optional view options: index number used to insert the view into the stack at that index. Defaults to 0 (front of the stack)
104
+ * @returns Resolves with the {@link OpenFin.Identity identity} of the added view.
105
+ * @throws If the view does not exist or fails to create.
106
+ * @throws If the {@link TabStack} has been destroyed.
107
+ * @experimental
108
+ */
109
+ addView: (view: OpenFin.Identity | OpenFin.PlatformViewCreationOptions, options?: OpenFin.AddViewToStackOptions) => Promise<OpenFin.Identity>;
110
+ /**
111
+ * Removes a view from this {@link TabStack}.
112
+ * @param view {@link OpenFin.Identiy Identity} of the view to remove.
113
+ * @throws If the view does not exist or does not belong to the stack.
114
+ * @throws If the {@link TabStack} has been destroyed.
115
+ */
116
+ removeView: (view: OpenFin.Identity) => Promise<void>;
117
+ /**
118
+ * Sets the active view of the {@link TabStack} without focusing it.
119
+ * @param view {@link OpenFin.Identity Identity} of the view to activate.
120
+ * @returns Promise which resolves with void once the view has been activated.
121
+ * @throws If the {@link TabStack} has been destroyed.
122
+ * @throws If the view does not exist.
123
+ * @tutorial TabStack.setActiveView
124
+ * @experimental
125
+ */
126
+ setActiveView: (view: OpenFin.Identity) => Promise<void>;
127
+ }
128
+ /**
129
+ * A {@link ColumnOrRow} is used to manage the state of a ColumnOrRow within an OpenFin Layout.
130
+ */
131
+ export declare class ColumnOrRow extends LayoutNode {
132
+ #private;
133
+ /** @internal */
134
+ constructor(client: LayoutEntitiesClient, entityId: string, type: 'row' | 'column');
135
+ /**
136
+ * The type of this {@link ColumnOrRow}. Either 'row' or 'column'.
137
+ */
138
+ readonly type: 'column' | 'row';
139
+ /**
140
+ * Retrieves a list of all content items belonging to this {@link ColumnOrRow} in order of appearance.
141
+ * @returns Resolves with a list containing {@link ColumnOrRow} and {@link TabStack} items belonging to this {@link ColumnOrRow}.
142
+ */
143
+ getContent: () => Promise<(ColumnOrRow | TabStack)[]>;
144
+ }
@@ -0,0 +1,216 @@
1
+ "use strict";
2
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
3
+ if (kind === "m") throw new TypeError("Private method is not writable");
4
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
5
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
6
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
7
+ };
8
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
9
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
10
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
11
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
+ };
13
+ var _a, _LayoutNode_client, _TabStack_client, _ColumnOrRow_client;
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.ColumnOrRow = exports.TabStack = exports.LayoutNode = void 0;
16
+ const api_exposer_1 = require("../../../api-exposer");
17
+ const channel_api_relay_1 = require("../../../../util/channel-api-relay");
18
+ /*
19
+ This file includes LayoutNode, ColumnOrRow and TabStack classes, which are all closely
20
+ intertwined, and share members via parent abstract class LayoutNode. To prevent circular
21
+ refs, we define and export all the classes here.
22
+ */
23
+ /**
24
+ * @internal
25
+ * Supplies an ApiClient for {@link LayoutEntitiesController} and helper methods
26
+ * for the entities {@link TabStack} AND {@link ColumnOrRow} to use.
27
+ */
28
+ class LayoutNode {
29
+ /** @internal */
30
+ constructor(client, entityId) {
31
+ /**
32
+ * @internal
33
+ * ApiClient for {@link LayoutEntitiesController}
34
+ */
35
+ _LayoutNode_client.set(this, void 0);
36
+ /**
37
+ * Determines if this {@link ColumnOrRow} or {@link TabStack} is the top level content item in the current layout.
38
+ * @returns Promise resolving true if this is the root, or false otherwise.
39
+ */
40
+ this.isRoot = () => __classPrivateFieldGet(this, _LayoutNode_client, "f").isRoot(this.entityId);
41
+ /**
42
+ * Determines if this {@link ColumnOrRow} or {@link TabStack} is the top level
43
+ * content item in the current layout.
44
+ * @returns Promise resolving true if this is the root, or false otherwise.
45
+ */
46
+ this.exists = () => __classPrivateFieldGet(this, _LayoutNode_client, "f").exists(this.entityId);
47
+ /**
48
+ * Retrieves the parent {@link ColumnOrRow} or {@link TabStack} of this item, if one exists.
49
+ * @returns Promise resolving with the {@link ColumnOrRow} or {@link TabStack} that contains this item, or undefined if this is the root content item.
50
+ */
51
+ this.getParent = async () => {
52
+ const parent = await __classPrivateFieldGet(this, _LayoutNode_client, "f").getParent(this.entityId);
53
+ if (!parent) {
54
+ return undefined;
55
+ }
56
+ return LayoutNode.getEntity(parent, __classPrivateFieldGet(this, _LayoutNode_client, "f"));
57
+ };
58
+ /**
59
+ * Given a list of view creation options or references and a layout position, creates an adjacent {@link TabStack}
60
+ *
61
+ * Known Issue: If the number of views to add overflows the tab-container, the added views will be set as active
62
+ * during each render, and then placed at the front of the tab-stack, while the underlying order of tabs will remain unchanged.
63
+ * This means the views you pass to createAdjacentStack() may not render in the order given by the array.
64
+ * Until fixed, this problem can be avoided only if your window is wide enough to fit creating all the views in the tabstack.
65
+ *
66
+ * @param views List of identities or view creation options of the views to include in the stack
67
+ * @param options Creation options, defaults to position: 'right'
68
+ * @returns an instance of {@link TabStack} containing the given views
69
+ * @experimental
70
+ */
71
+ this.createAdjacentStack = async (views, options) => {
72
+ const entityId = await __classPrivateFieldGet(this, _LayoutNode_client, "f").createAdjacentStack(this.entityId, views, options);
73
+ return LayoutNode.getEntity({ entityId, type: 'stack' }, __classPrivateFieldGet(this, _LayoutNode_client, "f"));
74
+ };
75
+ /**
76
+ * Finds the immediate adjacent layout item given an edge Position
77
+ * @param edge
78
+ * @returns an array of {@link TabStack} found, if none found returns an empty array.
79
+ */
80
+ this.getAdjacentStacks = async (edge) => {
81
+ const adjacentStacks = await __classPrivateFieldGet(this, _LayoutNode_client, "f").getAdjacentStacks({
82
+ targetId: this.entityId,
83
+ edge
84
+ });
85
+ return adjacentStacks.map(stack => LayoutNode.getEntity({
86
+ type: 'stack',
87
+ entityId: stack.entityId
88
+ }, __classPrivateFieldGet(this, _LayoutNode_client, "f")));
89
+ };
90
+ __classPrivateFieldSet(this, _LayoutNode_client, client, "f");
91
+ this.entityId = entityId;
92
+ }
93
+ }
94
+ exports.LayoutNode = LayoutNode;
95
+ _a = LayoutNode, _LayoutNode_client = new WeakMap();
96
+ /**
97
+ * @internal
98
+ * Encapsulates Api consumption of {@link LayoutEntitiesController} with a relayed dispatch
99
+ * @param client
100
+ * @param controllerId
101
+ * @param identity
102
+ * @returns a new instance of {@link LayoutEntitiesClient} with bound to the controllerId
103
+ */
104
+ LayoutNode.newLayoutEntitiesClient = async (client, controllerId, identity) => {
105
+ const dispatch = (0, channel_api_relay_1.createRelayedDispatch)(client, identity, 'layout-relay', 'You are trying to interact with a layout component on a window that has been destroyed.');
106
+ const consumer = new api_exposer_1.ApiConsumer(new api_exposer_1.ChannelsConsumer({ dispatch }));
107
+ return consumer.consume({ id: controllerId });
108
+ };
109
+ LayoutNode.getEntity = (definition, client) => {
110
+ const { entityId, type } = definition;
111
+ switch (type) {
112
+ case 'column':
113
+ case 'row':
114
+ return new ColumnOrRow(client, entityId, type);
115
+ case 'stack':
116
+ return new TabStack(client, entityId);
117
+ default:
118
+ throw new Error(`Unrecognised Layout Entity encountered ('${JSON.stringify(definition)})`);
119
+ }
120
+ };
121
+ /**
122
+ * A {@link TabStack} is used to manage the state of a TabStack within an OpenFin Layout and
123
+ * traverse to its parent Content Item.
124
+ */
125
+ class TabStack extends LayoutNode {
126
+ /** @internal */
127
+ constructor(client, entityId) {
128
+ super(client, entityId);
129
+ /**
130
+ * @internal
131
+ * ApiClient for {@link LayoutEntitiesController}
132
+ */
133
+ _TabStack_client.set(this, void 0);
134
+ /**
135
+ * Type of the content item. Always stack, but useful for distinguishing between a {@link TabStack} and {@link ColumnOrRow}.
136
+ */
137
+ this.type = 'stack';
138
+ /**
139
+ * Retrieves a list of all views belonging to this {@link TabStack}.
140
+ *
141
+ * Known Issue: If adding a view overflows the tab-container width, the added view will be set as active
142
+ * and rendered at the front of the tab-stack, while the underlying order of tabs will remain unchanged.
143
+ * If that happens and then getViews() is called, it will return the identities in a different order than
144
+ * than the currently rendered tab order.
145
+ *
146
+ * @returns Resolves with a list containing the {@link OpenFin.Identity identities} of each view belonging to the {@link TabStack}.
147
+ * @throws If the {@link TabStack} has been destroyed.
148
+ * @experimental
149
+ */
150
+ this.getViews = () => __classPrivateFieldGet(this, _TabStack_client, "f").getStackViews(this.entityId);
151
+ /**
152
+ * Adds or creates a view in this {@link TabStack}.
153
+ *
154
+ * Known Issue: If adding a view overflows the tab-container, the added view will be set as active
155
+ * and rendered at the front of the tab-stack, while the underlying order of tabs will remain unchanged.
156
+ *
157
+ * @param view The identity of an existing view to add, or options to create a view.
158
+ * @param options Optional view options: index number used to insert the view into the stack at that index. Defaults to 0 (front of the stack)
159
+ * @returns Resolves with the {@link OpenFin.Identity identity} of the added view.
160
+ * @throws If the view does not exist or fails to create.
161
+ * @throws If the {@link TabStack} has been destroyed.
162
+ * @experimental
163
+ */
164
+ this.addView = async (view, options = { index: 0 }) => __classPrivateFieldGet(this, _TabStack_client, "f").addViewToStack(this.entityId, view, options);
165
+ /**
166
+ * Removes a view from this {@link TabStack}.
167
+ * @param view {@link OpenFin.Identiy Identity} of the view to remove.
168
+ * @throws If the view does not exist or does not belong to the stack.
169
+ * @throws If the {@link TabStack} has been destroyed.
170
+ */
171
+ this.removeView = async (view) => {
172
+ await __classPrivateFieldGet(this, _TabStack_client, "f").removeViewFromStack(this.entityId, view);
173
+ };
174
+ /**
175
+ * Sets the active view of the {@link TabStack} without focusing it.
176
+ * @param view {@link OpenFin.Identity Identity} of the view to activate.
177
+ * @returns Promise which resolves with void once the view has been activated.
178
+ * @throws If the {@link TabStack} has been destroyed.
179
+ * @throws If the view does not exist.
180
+ * @tutorial TabStack.setActiveView
181
+ * @experimental
182
+ */
183
+ this.setActiveView = async (view) => {
184
+ await __classPrivateFieldGet(this, _TabStack_client, "f").setStackActiveView(this.entityId, view);
185
+ };
186
+ __classPrivateFieldSet(this, _TabStack_client, client, "f");
187
+ }
188
+ }
189
+ exports.TabStack = TabStack;
190
+ _TabStack_client = new WeakMap();
191
+ /**
192
+ * A {@link ColumnOrRow} is used to manage the state of a ColumnOrRow within an OpenFin Layout.
193
+ */
194
+ class ColumnOrRow extends LayoutNode {
195
+ /** @internal */
196
+ constructor(client, entityId, type) {
197
+ super(client, entityId);
198
+ /**
199
+ * @internal
200
+ * ApiClient for {@link LayoutEntitiesController}
201
+ */
202
+ _ColumnOrRow_client.set(this, void 0);
203
+ /**
204
+ * Retrieves a list of all content items belonging to this {@link ColumnOrRow} in order of appearance.
205
+ * @returns Resolves with a list containing {@link ColumnOrRow} and {@link TabStack} items belonging to this {@link ColumnOrRow}.
206
+ */
207
+ this.getContent = async () => {
208
+ const contentItemEntities = await __classPrivateFieldGet(this, _ColumnOrRow_client, "f").getContent(this.entityId);
209
+ return contentItemEntities.map((entity) => LayoutNode.getEntity(entity, __classPrivateFieldGet(this, _ColumnOrRow_client, "f")));
210
+ };
211
+ __classPrivateFieldSet(this, _ColumnOrRow_client, client, "f");
212
+ this.type = type;
213
+ }
214
+ }
215
+ exports.ColumnOrRow = ColumnOrRow;
216
+ _ColumnOrRow_client = new WeakMap();
@@ -0,0 +1,6 @@
1
+ export type LayoutEntityTypes = Exclude<GoldenLayout.ItemType, 'component' | 'root'>;
2
+ export type LayoutPosition = 'top' | 'bottom' | 'left' | 'right';
3
+ export type LayoutEntityDefinition<TLayoutEntityType extends LayoutEntityTypes = LayoutEntityTypes> = {
4
+ type: TLayoutEntityType;
5
+ entityId: string;
6
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1 @@
1
+ export declare const LAYOUT_CONTROLLER_ID = "layout-entities";
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LAYOUT_CONTROLLER_ID = void 0;
4
+ exports.LAYOUT_CONTROLLER_ID = 'layout-entities';
@@ -1,5 +1,7 @@
1
+ import { ApiClient } from '../../api-exposer';
1
2
  import type * as OpenFin from '../../../OpenFin';
2
- declare type LayoutPresetType = OpenFin.LayoutPresetType;
3
+ import { LayoutEntitiesController } from './controllers/layout-entities-controller';
4
+ type LayoutPresetType = OpenFin.LayoutPresetType;
3
5
  export interface InitLayoutOptions {
4
6
  containerId?: string;
5
7
  }
@@ -10,4 +12,5 @@ export interface DragPayload {
10
12
  'view-config': OpenFin.ViewCreationOptions;
11
13
  'view-identity': [string, string, string];
12
14
  }
15
+ export type LayoutEntitiesClient = ApiClient<LayoutEntitiesController>;
13
16
  export {};
@@ -0,0 +1,4 @@
1
+ import type * as OpenFin from '../../../../OpenFin';
2
+ export declare const getAdjacentItem: (component: GoldenLayout.ContentItem, edge: OpenFin.LayoutPosition) => GoldenLayout.ContentItem | undefined;
3
+ export declare const doShareEdge: (a: GoldenLayout.ContentItem, b: GoldenLayout.ContentItem, edge: OpenFin.LayoutPosition) => boolean;
4
+ export declare const getAdjacentStacks: (item: GoldenLayout.ContentItem, edge: OpenFin.LayoutPosition) => GoldenLayout.ContentItem[];
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getAdjacentStacks = exports.doShareEdge = exports.getAdjacentItem = void 0;
4
+ const getAdjacentItem = (component, edge) => {
5
+ const { parent } = component;
6
+ if (parent.isRoot) {
7
+ return undefined;
8
+ }
9
+ const targetType = ['top', 'bottom'].includes(edge) ? 'column' : 'row';
10
+ const edgeSiblingOffset = ['top', 'left'].includes(edge) ? -1 : 1;
11
+ if (parent.type === targetType) {
12
+ const componentIndex = parent.contentItems.indexOf(component);
13
+ const targetIndex = componentIndex + edgeSiblingOffset;
14
+ if (targetIndex >= 0 && targetIndex < parent.contentItems.length) {
15
+ return parent.contentItems[targetIndex];
16
+ }
17
+ }
18
+ return (0, exports.getAdjacentItem)(parent, edge);
19
+ };
20
+ exports.getAdjacentItem = getAdjacentItem;
21
+ const doShareEdge = (a, b, edge) => {
22
+ var _a, _b;
23
+ const boundsA = (_a = a.element.get(0)) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect();
24
+ const boundsB = (_b = b.element.get(0)) === null || _b === void 0 ? void 0 : _b.getBoundingClientRect();
25
+ if (!boundsA || !boundsB) {
26
+ return false;
27
+ }
28
+ if (['top', 'bottom'].includes(edge)) {
29
+ return ((boundsB.left >= boundsA.left && boundsB.left < boundsA.right) ||
30
+ (boundsB.right > boundsA.left && boundsB.right <= boundsA.right));
31
+ }
32
+ return ((boundsB.top >= boundsA.top && boundsB.top < boundsA.bottom) ||
33
+ (boundsB.bottom > boundsA.top && boundsB.bottom <= boundsA.bottom));
34
+ };
35
+ exports.doShareEdge = doShareEdge;
36
+ const getAdjacentStacks = (item, edge) => {
37
+ const targetContainer = ['top', 'bottom'].includes(edge) ? 'row' : 'column';
38
+ const findEdgeStacks = (component) => {
39
+ if (component.type === 'stack') {
40
+ if ((0, exports.doShareEdge)(item, component, edge)) {
41
+ return [component];
42
+ }
43
+ return [];
44
+ }
45
+ if (component.type === 'root') {
46
+ return [];
47
+ }
48
+ if (component.type === targetContainer) {
49
+ return component.contentItems.map((contentItem) => findEdgeStacks(contentItem)).flat();
50
+ }
51
+ if (component.type !== targetContainer) {
52
+ if (['top', 'right'].includes(edge)) {
53
+ return findEdgeStacks(component.contentItems[component.contentItems.length - 1]);
54
+ }
55
+ return findEdgeStacks(component.contentItems[0]);
56
+ }
57
+ return [];
58
+ };
59
+ const edgeItem = (0, exports.getAdjacentItem)(item, edge);
60
+ if (edgeItem) {
61
+ return findEdgeStacks(edgeItem);
62
+ }
63
+ return [];
64
+ };
65
+ exports.getAdjacentStacks = getAdjacentStacks;
@@ -1,19 +1,19 @@
1
1
  import type * as OpenFin from '../../OpenFin';
2
2
  import { EmitterBase } from '../base';
3
3
  import { Transport } from '../../transport/transport';
4
- declare type Identity = OpenFin.Identity;
5
- declare type ProxyInfo = OpenFin.ProxyInfo;
6
- declare type ProxyConfig = OpenFin.ProxyConfig;
7
- declare type InstalledApps = OpenFin.InstalledApps;
8
- declare type LogInfo = OpenFin.LogInfo;
9
- declare type LogLevel = OpenFin.LogLevel;
10
- declare type GetLogRequestType = OpenFin.GetLogRequestType;
11
- declare type RegistryInfo = OpenFin.RegistryInfo;
12
- declare type EntityInfo = OpenFin.EntityInfo;
13
- declare type Entity = OpenFin.ApplicationType;
14
- declare type ApplicationState = OpenFin.ApplicationState;
15
- declare type ApplicationWindowInfo = OpenFin.ApplicationWindowInfo;
16
- declare type PrinterInfo = OpenFin.PrinterInfo;
4
+ type Identity = OpenFin.Identity;
5
+ type ProxyInfo = OpenFin.ProxyInfo;
6
+ type ProxyConfig = OpenFin.ProxyConfig;
7
+ type InstalledApps = OpenFin.InstalledApps;
8
+ type LogInfo = OpenFin.LogInfo;
9
+ type LogLevel = OpenFin.LogLevel;
10
+ type GetLogRequestType = OpenFin.GetLogRequestType;
11
+ type RegistryInfo = OpenFin.RegistryInfo;
12
+ type EntityInfo = OpenFin.EntityInfo;
13
+ type Entity = OpenFin.ApplicationType;
14
+ type ApplicationState = OpenFin.ApplicationState;
15
+ type ApplicationWindowInfo = OpenFin.ApplicationWindowInfo;
16
+ type PrinterInfo = OpenFin.PrinterInfo;
17
17
  /**
18
18
  * An object representing the core of OpenFin Runtime. Allows the developer
19
19
  * to perform system-level actions, such as accessing logs, viewing processes,
@@ -1,9 +1,8 @@
1
1
  import type * as OpenFin from '../../OpenFin';
2
- import { WebContents } from '../webcontents/main';
3
2
  import { Transport } from '../../transport/transport';
4
- import { Layout } from '../platform/layout';
5
3
  import { ViewEvent } from '../events/view';
6
- declare type UpdatableViewOptions = OpenFin.UpdatableViewOptions;
4
+ import { WebContents } from '../webcontents/main';
5
+ type UpdatableViewOptions = OpenFin.UpdatableViewOptions;
7
6
  /**
8
7
  * @PORTED
9
8
  * @typedef {object} View~options
@@ -172,6 +171,7 @@ declare type UpdatableViewOptions = OpenFin.UpdatableViewOptions;
172
171
  * @hideconstructor
173
172
  */
174
173
  export declare class View extends WebContents<ViewEvent> {
174
+ #private;
175
175
  identity: OpenFin.Identity;
176
176
  constructor(wire: Transport, identity: OpenFin.Identity);
177
177
  /**
@@ -445,6 +445,12 @@ export declare class View extends WebContents<ViewEvent> {
445
445
  * @experimental
446
446
  */
447
447
  getCurrentWindow: () => Promise<OpenFin.Window>;
448
+ /**
449
+ * Retrieves the current {@link TabStack} of the view if it belongs to one.
450
+ * @return {Promise<TabStack>} The {@link TabStack} this view belongs to.
451
+ * @throws if this view does not belong to a TabStack or if the window has been destroyed.
452
+ */
453
+ getCurrentStack: () => Promise<OpenFin.TabStack>;
448
454
  /**
449
455
  * Triggers the before-unload handler for the View, if one is set. Returns `true` if the handler is trying to prevent the View from unloading, and `false` if it isn't.
450
456
  * Only enabled when setting enableBeforeUnload: true in your View options. If this option is not enabled it will always return false.
@@ -457,6 +463,10 @@ export declare class View extends WebContents<ViewEvent> {
457
463
  * **NOTE**: Internal use only.
458
464
  * Attaches this view to an HTML element in the current context. The view will resize responsively when the element bounds change.
459
465
  *
466
+ * **Known issue**: View.bindToElement does not track position changes, if the element has fixed px width and height values it is possible for the view to not update responsively.
467
+ *
468
+ * **Known issue**: When View.bindToElement is used on a element that takes up the entire page in a platform window, the bound view will not respond responsively when the window is resized to be smaller.
469
+ *
460
470
  * @param {HTMLElement} element - HTML element to attach the view to.
461
471
  * @return {Function} - Cleanup function that will disconnect the element resize observer.
462
472
  * @internal
@@ -1,12 +1,19 @@
1
1
  "use strict";
2
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
4
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
5
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
6
+ };
7
+ var _View_providerChannelClient;
2
8
  Object.defineProperty(exports, "__esModule", { value: true });
3
9
  exports.View = void 0;
4
- /* eslint-disable import/prefer-default-export */
5
- /* eslint-disable consistent-return */
6
- /* eslint-disable @typescript-eslint/no-non-null-assertion */
10
+ const transport_errors_1 = require("../../transport/transport-errors");
11
+ const lazy_1 = require("../../util/lazy");
12
+ const layout_entities_1 = require("../platform/layout/entities/layout-entities");
13
+ const layout_constants_1 = require("../platform/layout/layout.constants");
14
+ const bounds_observer_1 = require("../platform/layout/utils/bounds-observer");
7
15
  const main_1 = require("../webcontents/main");
8
16
  const window_1 = require("../window");
9
- const bounds_observer_1 = require("../platform/layout/utils/bounds-observer");
10
17
  /**
11
18
  * @PORTED
12
19
  * @typedef {object} View~options
@@ -178,6 +185,10 @@ class View extends main_1.WebContents {
178
185
  constructor(wire, identity) {
179
186
  super(wire, identity, 'view');
180
187
  this.identity = identity;
188
+ _View_providerChannelClient.set(this, new lazy_1.Lazy(() => {
189
+ const platform = this.fin.Platform.wrapSync(this.identity);
190
+ return platform.getClient();
191
+ }));
181
192
  /**
182
193
  * Returns the zoom level of the view.
183
194
  * @function getZoomLevel
@@ -446,6 +457,27 @@ class View extends main_1.WebContents {
446
457
  const { payload: { data } } = await this.wire.sendAction('get-view-window', { ...this.identity });
447
458
  return new window_1._Window(this.wire, data);
448
459
  };
460
+ /**
461
+ * Retrieves the current {@link TabStack} of the view if it belongs to one.
462
+ * @return {Promise<TabStack>} The {@link TabStack} this view belongs to.
463
+ * @throws if this view does not belong to a TabStack or if the window has been destroyed.
464
+ */
465
+ this.getCurrentStack = async () => {
466
+ try {
467
+ const layoutWindow = await this.getCurrentWindow();
468
+ const providerChannelClient = await __classPrivateFieldGet(this, _View_providerChannelClient, "f").getValue();
469
+ const client = await layout_entities_1.LayoutNode.newLayoutEntitiesClient(providerChannelClient, layout_constants_1.LAYOUT_CONTROLLER_ID, layoutWindow.identity);
470
+ const stackDefinition = await client.getStackByView(this.identity);
471
+ return layout_entities_1.LayoutNode.getEntity(stackDefinition, client);
472
+ }
473
+ catch (error) {
474
+ const e = new transport_errors_1.RuntimeError({ reason: 'This view does not belong to a stack.' });
475
+ // TODO: @pierre to fix
476
+ // @ts-expect-error pending PR !3459 to fix runtime errors
477
+ e.cause = error;
478
+ throw e;
479
+ }
480
+ };
449
481
  /**
450
482
  * Triggers the before-unload handler for the View, if one is set. Returns `true` if the handler is trying to prevent the View from unloading, and `false` if it isn't.
451
483
  * Only enabled when setting enableBeforeUnload: true in your View options. If this option is not enabled it will always return false.
@@ -461,6 +493,10 @@ class View extends main_1.WebContents {
461
493
  * **NOTE**: Internal use only.
462
494
  * Attaches this view to an HTML element in the current context. The view will resize responsively when the element bounds change.
463
495
  *
496
+ * **Known issue**: View.bindToElement does not track position changes, if the element has fixed px width and height values it is possible for the view to not update responsively.
497
+ *
498
+ * **Known issue**: When View.bindToElement is used on a element that takes up the entire page in a platform window, the bound view will not respond responsively when the window is resized to be smaller.
499
+ *
464
500
  * @param {HTMLElement} element - HTML element to attach the view to.
465
501
  * @return {Function} - Cleanup function that will disconnect the element resize observer.
466
502
  * @internal
@@ -511,3 +547,4 @@ class View extends main_1.WebContents {
511
547
  }
512
548
  }
513
549
  exports.View = View;
550
+ _View_providerChannelClient = new WeakMap();
@@ -1,7 +1,7 @@
1
1
  import type * as OpenFin from '../OpenFin';
2
2
  import { NewConnectConfig } from '../transport/wire';
3
3
  import { ChildContentOptions, Environment } from './environment';
4
- declare type EntityType = OpenFin.EntityType;
4
+ type EntityType = OpenFin.EntityType;
5
5
  export declare class BrowserEnvironment implements Environment {
6
6
  getManagerConstructor(): Promise<any>;
7
7
  getProviderInitializer(): Promise<any>;
@@ -1,6 +1,6 @@
1
1
  import type * as OpenFin from '../OpenFin';
2
2
  import { NewConnectConfig } from '../transport/wire';
3
- declare type EntityType = OpenFin.EntityType;
3
+ type EntityType = OpenFin.EntityType;
4
4
  export interface Environment {
5
5
  getManagerConstructor(): Promise<any>;
6
6
  getProviderInitializer(): Promise<any>;
@@ -1,7 +1,7 @@
1
1
  import type * as OpenFin from '../OpenFin';
2
2
  import { Environment } from './environment';
3
3
  import { NewConnectConfig } from '../transport/wire';
4
- declare type EntityType = OpenFin.EntityType;
4
+ type EntityType = OpenFin.EntityType;
5
5
  export default class NodeEnvironment implements Environment {
6
6
  getDefaultChannelOptions(): {
7
7
  create: OpenFin.ChannelCreateOptions;