@genesis-community/golden-layout 2.6.0

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 (226) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +24 -0
  3. package/dist/cjs/index.js +40 -0
  4. package/dist/cjs/index.js.map +1 -0
  5. package/dist/cjs/ts/config/config.js +870 -0
  6. package/dist/cjs/ts/config/config.js.map +1 -0
  7. package/dist/cjs/ts/config/resolved-config.js +477 -0
  8. package/dist/cjs/ts/config/resolved-config.js.map +1 -0
  9. package/dist/cjs/ts/container/component-container.js +412 -0
  10. package/dist/cjs/ts/container/component-container.js.map +1 -0
  11. package/dist/cjs/ts/controls/browser-popout.js +298 -0
  12. package/dist/cjs/ts/controls/browser-popout.js.map +1 -0
  13. package/dist/cjs/ts/controls/drag-proxy.js +221 -0
  14. package/dist/cjs/ts/controls/drag-proxy.js.map +1 -0
  15. package/dist/cjs/ts/controls/drag-source.js +149 -0
  16. package/dist/cjs/ts/controls/drag-source.js.map +1 -0
  17. package/dist/cjs/ts/controls/drop-target-indicator.js +31 -0
  18. package/dist/cjs/ts/controls/drop-target-indicator.js.map +1 -0
  19. package/dist/cjs/ts/controls/header-button.js +34 -0
  20. package/dist/cjs/ts/controls/header-button.js.map +1 -0
  21. package/dist/cjs/ts/controls/header.js +366 -0
  22. package/dist/cjs/ts/controls/header.js.map +1 -0
  23. package/dist/cjs/ts/controls/splitter.js +42 -0
  24. package/dist/cjs/ts/controls/splitter.js.map +1 -0
  25. package/dist/cjs/ts/controls/tab.js +262 -0
  26. package/dist/cjs/ts/controls/tab.js.map +1 -0
  27. package/dist/cjs/ts/controls/tabs-container.js +236 -0
  28. package/dist/cjs/ts/controls/tabs-container.js.map +1 -0
  29. package/dist/cjs/ts/controls/transition-indicator.js +64 -0
  30. package/dist/cjs/ts/controls/transition-indicator.js.map +1 -0
  31. package/dist/cjs/ts/errors/external-error.js +46 -0
  32. package/dist/cjs/ts/errors/external-error.js.map +1 -0
  33. package/dist/cjs/ts/errors/internal-error.js +38 -0
  34. package/dist/cjs/ts/errors/internal-error.js.map +1 -0
  35. package/dist/cjs/ts/golden-layout.js +299 -0
  36. package/dist/cjs/ts/golden-layout.js.map +1 -0
  37. package/dist/cjs/ts/items/component-item.js +190 -0
  38. package/dist/cjs/ts/items/component-item.js.map +1 -0
  39. package/dist/cjs/ts/items/component-parentable-item.js +18 -0
  40. package/dist/cjs/ts/items/component-parentable-item.js.map +1 -0
  41. package/dist/cjs/ts/items/content-item.js +414 -0
  42. package/dist/cjs/ts/items/content-item.js.map +1 -0
  43. package/dist/cjs/ts/items/ground-item.js +352 -0
  44. package/dist/cjs/ts/items/ground-item.js.map +1 -0
  45. package/dist/cjs/ts/items/row-or-column.js +609 -0
  46. package/dist/cjs/ts/items/row-or-column.js.map +1 -0
  47. package/dist/cjs/ts/items/stack.js +841 -0
  48. package/dist/cjs/ts/items/stack.js.map +1 -0
  49. package/dist/cjs/ts/layout-manager.js +1618 -0
  50. package/dist/cjs/ts/layout-manager.js.map +1 -0
  51. package/dist/cjs/ts/utils/config-minifier.js +218 -0
  52. package/dist/cjs/ts/utils/config-minifier.js.map +1 -0
  53. package/dist/cjs/ts/utils/dom-constants.js +3 -0
  54. package/dist/cjs/ts/utils/dom-constants.js.map +1 -0
  55. package/dist/cjs/ts/utils/drag-listener.js +132 -0
  56. package/dist/cjs/ts/utils/drag-listener.js.map +1 -0
  57. package/dist/cjs/ts/utils/event-emitter.js +201 -0
  58. package/dist/cjs/ts/utils/event-emitter.js.map +1 -0
  59. package/dist/cjs/ts/utils/event-hub.js +135 -0
  60. package/dist/cjs/ts/utils/event-hub.js.map +1 -0
  61. package/dist/cjs/ts/utils/i18n-strings.js +74 -0
  62. package/dist/cjs/ts/utils/i18n-strings.js.map +1 -0
  63. package/dist/cjs/ts/utils/jquery-legacy.js +15 -0
  64. package/dist/cjs/ts/utils/jquery-legacy.js.map +1 -0
  65. package/dist/cjs/ts/utils/style-constants.js +11 -0
  66. package/dist/cjs/ts/utils/style-constants.js.map +1 -0
  67. package/dist/cjs/ts/utils/types.js +94 -0
  68. package/dist/cjs/ts/utils/types.js.map +1 -0
  69. package/dist/cjs/ts/utils/utils.js +211 -0
  70. package/dist/cjs/ts/utils/utils.js.map +1 -0
  71. package/dist/cjs/ts/virtual-layout.js +247 -0
  72. package/dist/cjs/ts/virtual-layout.js.map +1 -0
  73. package/dist/css/goldenlayout-base.css +319 -0
  74. package/dist/css/themes/goldenlayout-borderless-dark-theme.css +136 -0
  75. package/dist/css/themes/goldenlayout-dark-theme.css +139 -0
  76. package/dist/css/themes/goldenlayout-light-theme.css +129 -0
  77. package/dist/css/themes/goldenlayout-soda-theme.css +126 -0
  78. package/dist/css/themes/goldenlayout-translucent-theme.css +152 -0
  79. package/dist/esm/index.js +21 -0
  80. package/dist/esm/index.js.map +1 -0
  81. package/dist/esm/ts/config/config.js +864 -0
  82. package/dist/esm/ts/config/config.js.map +1 -0
  83. package/dist/esm/ts/config/resolved-config.js +474 -0
  84. package/dist/esm/ts/config/resolved-config.js.map +1 -0
  85. package/dist/esm/ts/container/component-container.js +408 -0
  86. package/dist/esm/ts/container/component-container.js.map +1 -0
  87. package/dist/esm/ts/controls/browser-popout.js +294 -0
  88. package/dist/esm/ts/controls/browser-popout.js.map +1 -0
  89. package/dist/esm/ts/controls/drag-proxy.js +217 -0
  90. package/dist/esm/ts/controls/drag-proxy.js.map +1 -0
  91. package/dist/esm/ts/controls/drag-source.js +145 -0
  92. package/dist/esm/ts/controls/drag-source.js.map +1 -0
  93. package/dist/esm/ts/controls/drop-target-indicator.js +27 -0
  94. package/dist/esm/ts/controls/drop-target-indicator.js.map +1 -0
  95. package/dist/esm/ts/controls/header-button.js +30 -0
  96. package/dist/esm/ts/controls/header-button.js.map +1 -0
  97. package/dist/esm/ts/controls/header.js +362 -0
  98. package/dist/esm/ts/controls/header.js.map +1 -0
  99. package/dist/esm/ts/controls/splitter.js +38 -0
  100. package/dist/esm/ts/controls/splitter.js.map +1 -0
  101. package/dist/esm/ts/controls/tab.js +258 -0
  102. package/dist/esm/ts/controls/tab.js.map +1 -0
  103. package/dist/esm/ts/controls/tabs-container.js +232 -0
  104. package/dist/esm/ts/controls/tabs-container.js.map +1 -0
  105. package/dist/esm/ts/controls/transition-indicator.js +60 -0
  106. package/dist/esm/ts/controls/transition-indicator.js.map +1 -0
  107. package/dist/esm/ts/errors/external-error.js +38 -0
  108. package/dist/esm/ts/errors/external-error.js.map +1 -0
  109. package/dist/esm/ts/errors/internal-error.js +31 -0
  110. package/dist/esm/ts/errors/internal-error.js.map +1 -0
  111. package/dist/esm/ts/golden-layout.js +295 -0
  112. package/dist/esm/ts/golden-layout.js.map +1 -0
  113. package/dist/esm/ts/items/component-item.js +186 -0
  114. package/dist/esm/ts/items/component-item.js.map +1 -0
  115. package/dist/esm/ts/items/component-parentable-item.js +14 -0
  116. package/dist/esm/ts/items/component-parentable-item.js.map +1 -0
  117. package/dist/esm/ts/items/content-item.js +410 -0
  118. package/dist/esm/ts/items/content-item.js.map +1 -0
  119. package/dist/esm/ts/items/ground-item.js +348 -0
  120. package/dist/esm/ts/items/ground-item.js.map +1 -0
  121. package/dist/esm/ts/items/row-or-column.js +605 -0
  122. package/dist/esm/ts/items/row-or-column.js.map +1 -0
  123. package/dist/esm/ts/items/stack.js +837 -0
  124. package/dist/esm/ts/items/stack.js.map +1 -0
  125. package/dist/esm/ts/layout-manager.js +1614 -0
  126. package/dist/esm/ts/layout-manager.js.map +1 -0
  127. package/dist/esm/ts/utils/config-minifier.js +215 -0
  128. package/dist/esm/ts/utils/config-minifier.js.map +1 -0
  129. package/dist/esm/ts/utils/dom-constants.js +2 -0
  130. package/dist/esm/ts/utils/dom-constants.js.map +1 -0
  131. package/dist/esm/ts/utils/drag-listener.js +128 -0
  132. package/dist/esm/ts/utils/drag-listener.js.map +1 -0
  133. package/dist/esm/ts/utils/event-emitter.js +197 -0
  134. package/dist/esm/ts/utils/event-emitter.js.map +1 -0
  135. package/dist/esm/ts/utils/event-hub.js +131 -0
  136. package/dist/esm/ts/utils/event-hub.js.map +1 -0
  137. package/dist/esm/ts/utils/i18n-strings.js +71 -0
  138. package/dist/esm/ts/utils/i18n-strings.js.map +1 -0
  139. package/dist/esm/ts/utils/jquery-legacy.js +11 -0
  140. package/dist/esm/ts/utils/jquery-legacy.js.map +1 -0
  141. package/dist/esm/ts/utils/style-constants.js +8 -0
  142. package/dist/esm/ts/utils/style-constants.js.map +1 -0
  143. package/dist/esm/ts/utils/types.js +91 -0
  144. package/dist/esm/ts/utils/types.js.map +1 -0
  145. package/dist/esm/ts/utils/utils.js +191 -0
  146. package/dist/esm/ts/utils/utils.js.map +1 -0
  147. package/dist/esm/ts/virtual-layout.js +243 -0
  148. package/dist/esm/ts/virtual-layout.js.map +1 -0
  149. package/dist/img/lm_close_black.png +0 -0
  150. package/dist/img/lm_close_tab_white.png +0 -0
  151. package/dist/img/lm_close_white.png +0 -0
  152. package/dist/img/lm_maximise_black.png +0 -0
  153. package/dist/img/lm_maximise_white.png +0 -0
  154. package/dist/img/lm_minimize_black.png +0 -0
  155. package/dist/img/lm_minimize_white.png +0 -0
  156. package/dist/img/lm_popin_black.png +0 -0
  157. package/dist/img/lm_popin_white.png +0 -0
  158. package/dist/img/lm_popout_black.png +0 -0
  159. package/dist/img/lm_popout_white.png +0 -0
  160. package/dist/less/goldenlayout-base.less +422 -0
  161. package/dist/less/themes/goldenlayout-borderless-dark-theme.less +230 -0
  162. package/dist/less/themes/goldenlayout-dark-theme.less +233 -0
  163. package/dist/less/themes/goldenlayout-light-theme.less +223 -0
  164. package/dist/less/themes/goldenlayout-soda-theme.less +211 -0
  165. package/dist/less/themes/goldenlayout-translucent-theme.less +237 -0
  166. package/dist/scss/goldenlayout-base.scss +422 -0
  167. package/dist/scss/themes/_goldenlayout-var-theme.scss +232 -0
  168. package/dist/types/golden-layout-untrimmed.d.ts +3428 -0
  169. package/dist/types/index.d.ts +2246 -0
  170. package/dist/types/tsdoc-metadata.json +11 -0
  171. package/package.json +107 -0
  172. package/src/TOOLCHAIN.md +54 -0
  173. package/src/img/lm_close_black.png +0 -0
  174. package/src/img/lm_close_tab_white.png +0 -0
  175. package/src/img/lm_close_white.png +0 -0
  176. package/src/img/lm_maximise_black.png +0 -0
  177. package/src/img/lm_maximise_white.png +0 -0
  178. package/src/img/lm_minimize_black.png +0 -0
  179. package/src/img/lm_minimize_white.png +0 -0
  180. package/src/img/lm_popin_black.png +0 -0
  181. package/src/img/lm_popin_white.png +0 -0
  182. package/src/img/lm_popout_black.png +0 -0
  183. package/src/img/lm_popout_white.png +0 -0
  184. package/src/index.ts +21 -0
  185. package/src/less/goldenlayout-base.less +422 -0
  186. package/src/less/themes/goldenlayout-borderless-dark-theme.less +230 -0
  187. package/src/less/themes/goldenlayout-dark-theme.less +233 -0
  188. package/src/less/themes/goldenlayout-light-theme.less +223 -0
  189. package/src/less/themes/goldenlayout-soda-theme.less +211 -0
  190. package/src/less/themes/goldenlayout-translucent-theme.less +237 -0
  191. package/src/scss/goldenlayout-base.scss +422 -0
  192. package/src/scss/themes/_goldenlayout-var-theme.scss +232 -0
  193. package/src/ts/config/config.ts +1283 -0
  194. package/src/ts/config/resolved-config.ts +621 -0
  195. package/src/ts/container/component-container.ts +500 -0
  196. package/src/ts/controls/browser-popout.ts +325 -0
  197. package/src/ts/controls/drag-proxy.ts +259 -0
  198. package/src/ts/controls/drag-source.ts +167 -0
  199. package/src/ts/controls/drop-target-indicator.ts +35 -0
  200. package/src/ts/controls/header-button.ts +39 -0
  201. package/src/ts/controls/header.ts +483 -0
  202. package/src/ts/controls/splitter.ts +50 -0
  203. package/src/ts/controls/tab.ts +293 -0
  204. package/src/ts/controls/tabs-container.ts +281 -0
  205. package/src/ts/controls/transition-indicator.ts +78 -0
  206. package/src/ts/errors/external-error.ts +39 -0
  207. package/src/ts/errors/internal-error.ts +34 -0
  208. package/src/ts/golden-layout.ts +365 -0
  209. package/src/ts/items/component-item.ts +252 -0
  210. package/src/ts/items/component-parentable-item.ts +16 -0
  211. package/src/ts/items/content-item.ts +513 -0
  212. package/src/ts/items/ground-item.ts +404 -0
  213. package/src/ts/items/row-or-column.ts +707 -0
  214. package/src/ts/items/stack.ts +975 -0
  215. package/src/ts/layout-manager.ts +1862 -0
  216. package/src/ts/utils/config-minifier.ts +235 -0
  217. package/src/ts/utils/dom-constants.ts +44 -0
  218. package/src/ts/utils/drag-listener.ts +178 -0
  219. package/src/ts/utils/event-emitter.ts +275 -0
  220. package/src/ts/utils/event-hub.ts +163 -0
  221. package/src/ts/utils/i18n-strings.ts +96 -0
  222. package/src/ts/utils/jquery-legacy.ts +12 -0
  223. package/src/ts/utils/style-constants.ts +6 -0
  224. package/src/ts/utils/types.ts +145 -0
  225. package/src/ts/utils/utils.ts +206 -0
  226. package/src/ts/virtual-layout.ts +328 -0
@@ -0,0 +1,500 @@
1
+ import { ComponentItemConfig, ItemConfig } from '../config/config';
2
+ import { ResolvedComponentItemConfig } from '../config/resolved-config';
3
+ import { Tab } from '../controls/tab';
4
+ import { AssertError, UnexpectedNullError } from '../errors/internal-error';
5
+ import { ComponentItem } from '../items/component-item';
6
+ import { ContentItem } from '../items/content-item';
7
+ import { LayoutManager } from '../layout-manager';
8
+ import { EventEmitter } from '../utils/event-emitter';
9
+ import { JsonValue, LogicalZIndex, LogicalZIndexToDefaultMap } from '../utils/types';
10
+ import { deepExtend, setElementHeight, setElementWidth } from '../utils/utils';
11
+
12
+ /** @public */
13
+ export class ComponentContainer extends EventEmitter {
14
+ /** @internal */
15
+ private _componentType: JsonValue;
16
+ /** @internal */
17
+ private _boundComponent: ComponentContainer.BindableComponent;
18
+ /** @internal */
19
+ private _width: number;
20
+ /** @internal */
21
+ private _height: number;
22
+ /** @internal */
23
+ private _isClosable;
24
+ /** @internal */
25
+ private _initialState: JsonValue | undefined;
26
+ /** @internal */
27
+ private _state: JsonValue | undefined;
28
+ /** @internal */
29
+ private _visible;
30
+ /** @internal */
31
+ private _isShownWithZeroDimensions;
32
+ /** @internal */
33
+ private _tab: Tab;
34
+ /** @internal */
35
+ private _stackMaximised = false;
36
+ /** @internal */
37
+ private _logicalZIndex: LogicalZIndex;
38
+
39
+ stateRequestEvent: ComponentContainer.StateRequestEventHandler | undefined;
40
+ virtualRectingRequiredEvent: ComponentContainer.VirtualRectingRequiredEvent | undefined;
41
+ virtualVisibilityChangeRequiredEvent: ComponentContainer.VirtualVisibilityChangeRequiredEvent | undefined;
42
+ virtualZIndexChangeRequiredEvent: ComponentContainer.VirtualZIndexChangeRequiredEvent | undefined;
43
+
44
+ get width(): number { return this._width; }
45
+ get height(): number { return this._height; }
46
+ get parent(): ComponentItem { return this._parent; }
47
+ /** @internal @deprecated use {@link (ComponentContainer:class).componentType} */
48
+ get componentName(): JsonValue { return this._componentType; }
49
+ get componentType(): JsonValue { return this._componentType; }
50
+ get virtual(): boolean { return this._boundComponent.virtual; }
51
+ get component(): ComponentContainer.Component { return this._boundComponent.component; }
52
+ get tab(): Tab { return this._tab; }
53
+ get title(): string { return this._parent.title; }
54
+ get layoutManager(): LayoutManager { return this._layoutManager; }
55
+ get isHidden(): boolean { return !this._visible; }
56
+ get visible(): boolean { return this._visible; }
57
+ get state(): JsonValue | undefined { return this._state; }
58
+ /** Return the initial component state */
59
+ get initialState(): JsonValue | undefined { return this._initialState; }
60
+ /** The inner DOM element where the container's content is intended to live in */
61
+ get element(): HTMLElement { return this._element; }
62
+
63
+ /** @internal */
64
+ constructor(
65
+ /** @internal */
66
+ private readonly _config: ResolvedComponentItemConfig,
67
+ /** @internal */
68
+ private readonly _parent: ComponentItem,
69
+ /** @internal */
70
+ private readonly _layoutManager: LayoutManager,
71
+ /** @internal */
72
+ private readonly _element: HTMLElement,
73
+ /** @internal */
74
+ private readonly _updateItemConfigEvent: ComponentContainer.UpdateItemConfigEventHandler,
75
+ /** @internal */
76
+ private readonly _showEvent: ComponentContainer.ShowEventHandler,
77
+ /** @internal */
78
+ private readonly _hideEvent: ComponentContainer.HideEventHandler,
79
+ /** @internal */
80
+ private readonly _focusEvent: ComponentContainer.FocusEventHandler,
81
+ /** @internal */
82
+ private readonly _blurEvent: ComponentContainer.BlurEventHandler,
83
+ ) {
84
+ super();
85
+
86
+ this._width = 0;
87
+ this._height = 0;
88
+ this._visible = true;
89
+ this._isShownWithZeroDimensions = true;
90
+
91
+ this._componentType = _config.componentType;
92
+ this._isClosable = _config.isClosable;
93
+ this._initialState = _config.componentState;
94
+ this._state = this._initialState;
95
+
96
+ this._boundComponent = this.layoutManager.bindComponent(this, _config);
97
+
98
+ this.updateElementPositionPropertyFromBoundComponent();
99
+ }
100
+
101
+ /** @internal */
102
+ destroy(): void {
103
+ this.releaseComponent();
104
+ this.stateRequestEvent = undefined;
105
+ this.emit('destroy');
106
+ }
107
+
108
+ /** @deprecated use {@link (ComponentContainer:class).element } */
109
+ getElement(): HTMLElement {
110
+ return this._element;
111
+ }
112
+
113
+ /**
114
+ * Hides the container's component item (and hence, the container) if not already hidden.
115
+ * Emits hide event prior to hiding the container.
116
+ */
117
+ hide(): void {
118
+ this._hideEvent();
119
+ }
120
+
121
+ /**
122
+ * Shows the container's component item (and hence, the container) if not visible.
123
+ * Emits show event prior to hiding the container.
124
+ */
125
+ show(): void {
126
+ this._showEvent();
127
+ }
128
+
129
+ /**
130
+ * Focus this component in Layout.
131
+ */
132
+ focus(suppressEvent = false): void {
133
+ this._focusEvent(suppressEvent);
134
+ }
135
+
136
+ /**
137
+ * Remove focus from this component in Layout.
138
+ */
139
+ blur(suppressEvent = false): void {
140
+ this._blurEvent(suppressEvent);
141
+ }
142
+
143
+ /**
144
+ * Set the size from within the container. Traverses up
145
+ * the item tree until it finds a row or column element
146
+ * and resizes its items accordingly.
147
+ *
148
+ * If this container isn't a descendant of a row or column
149
+ * it returns false
150
+ * @param width - The new width in pixel
151
+ * @param height - The new height in pixel
152
+ *
153
+ * @returns resizeSuccesful
154
+ *
155
+ * @internal
156
+ */
157
+ setSize(width: number, height: number): boolean {
158
+ let ancestorItem: ContentItem | null = this._parent;
159
+ if (ancestorItem.isColumn || ancestorItem.isRow || ancestorItem.parent === null) {
160
+ throw new AssertError('ICSSPRC', 'ComponentContainer cannot have RowColumn Parent');
161
+ } else {
162
+ let ancestorChildItem: ContentItem;
163
+ do {
164
+ ancestorChildItem = ancestorItem;
165
+ ancestorItem = ancestorItem.parent;
166
+ } while (ancestorItem !== null && !ancestorItem.isColumn && !ancestorItem.isRow);
167
+
168
+ if (ancestorItem === null) {
169
+ // no Row or Column found
170
+ return false;
171
+ } else {
172
+ // ancestorItem is Row or Column
173
+ const direction = ancestorItem.isColumn ? 'height' : 'width';
174
+ const currentSize = this[direction];
175
+ if (currentSize === null) {
176
+ throw new UnexpectedNullError('ICSSCS11194');
177
+ } else {
178
+ const newSize = direction === 'height' ? height : width;
179
+
180
+ const totalPixel = currentSize * (1 / (ancestorChildItem.size / 100));
181
+ const percentage = (newSize / totalPixel) * 100;
182
+ const delta = (ancestorChildItem.size - percentage) / (ancestorItem.contentItems.length - 1);
183
+
184
+ for (let i = 0; i < ancestorItem.contentItems.length; i++) {
185
+ const ancestorItemContentItem = ancestorItem.contentItems[i];
186
+ if (ancestorItemContentItem === ancestorChildItem) {
187
+ ancestorItemContentItem.size = percentage;
188
+ } else {
189
+ ancestorItemContentItem.size += delta;
190
+ }
191
+ }
192
+
193
+ ancestorItem.updateSize(false);
194
+
195
+ return true;
196
+ }
197
+ }
198
+ }
199
+ }
200
+
201
+ /**
202
+ * Closes the container if it is closable. Can be called by
203
+ * both the component within at as well as the contentItem containing
204
+ * it. Emits a close event before the container itself is closed.
205
+ */
206
+ close(): void {
207
+ if (this._isClosable) {
208
+ this.emit('close');
209
+ this._parent.close();
210
+ }
211
+ }
212
+
213
+ /** Replaces component without affecting layout */
214
+ replaceComponent(itemConfig: ComponentItemConfig): void {
215
+ this.releaseComponent();
216
+
217
+ if (!ItemConfig.isComponent(itemConfig)) {
218
+ throw new Error('ReplaceComponent not passed a component ItemConfig')
219
+ } else {
220
+ const config = ComponentItemConfig.resolve(itemConfig, false);
221
+ this._initialState = config.componentState;
222
+ this._state = this._initialState;
223
+ this._componentType = config.componentType;
224
+
225
+ this._updateItemConfigEvent(config);
226
+
227
+ this._boundComponent = this.layoutManager.bindComponent(this, config);
228
+ this.updateElementPositionPropertyFromBoundComponent();
229
+
230
+ if (this._boundComponent.virtual) {
231
+ if (this.virtualVisibilityChangeRequiredEvent !== undefined) {
232
+ this.virtualVisibilityChangeRequiredEvent(this, this._visible);
233
+ }
234
+ if (this.virtualRectingRequiredEvent !== undefined) {
235
+ this._layoutManager.fireBeforeVirtualRectingEvent(1);
236
+ try {
237
+ this.virtualRectingRequiredEvent(this, this._width, this._height);
238
+ } finally {
239
+ this._layoutManager.fireAfterVirtualRectingEvent();
240
+ }
241
+ }
242
+ this.setBaseLogicalZIndex();
243
+ }
244
+
245
+ this.emit('stateChanged');
246
+ }
247
+ }
248
+
249
+ /**
250
+ * Returns the initial component state or the latest passed in setState()
251
+ * @returns state
252
+ * @deprecated Use {@link (ComponentContainer:class).initialState}
253
+ */
254
+ getState(): JsonValue | undefined {
255
+ return this._state;
256
+ }
257
+
258
+ /**
259
+ * Merges the provided state into the current one
260
+ * @deprecated Use {@link (ComponentContainer:class).stateRequestEvent}
261
+ */
262
+ extendState(state: Record<string, unknown>): void {
263
+ const extendedState = deepExtend(this._state as Record<string, unknown>, state);
264
+ this.setState(extendedState as JsonValue);
265
+ }
266
+
267
+ /**
268
+ * Sets the component state
269
+ * @deprecated Use {@link (ComponentContainer:class).stateRequestEvent}
270
+ */
271
+ setState(state: JsonValue): void {
272
+ this._state = state;
273
+ this._parent.emitBaseBubblingEvent('stateChanged');
274
+ }
275
+
276
+ /**
277
+ * Set's the components title
278
+ */
279
+ setTitle(title: string): void {
280
+ this._parent.setTitle(title);
281
+ }
282
+
283
+ /** @internal */
284
+ setTab(tab: Tab): void {
285
+ this._tab = tab;
286
+ this.emit('tab', tab)
287
+ }
288
+
289
+ /** @internal */
290
+ setVisibility(value: boolean): void {
291
+ if (this._boundComponent.virtual) {
292
+ if (this.virtualVisibilityChangeRequiredEvent !== undefined) {
293
+ this.virtualVisibilityChangeRequiredEvent(this, value);
294
+ }
295
+ }
296
+
297
+ if (value) {
298
+ if (!this._visible) {
299
+ this._visible = true;
300
+ if (this._height === 0 && this._width === 0) {
301
+ this._isShownWithZeroDimensions = true;
302
+ } else {
303
+ this._isShownWithZeroDimensions = false;
304
+ this.setSizeToNodeSize(this._width, this._height, true);
305
+ this.emitShow();
306
+ }
307
+ } else {
308
+ if (this._isShownWithZeroDimensions && (this._height !== 0 || this._width !== 0)) {
309
+ this._isShownWithZeroDimensions = false;
310
+ this.setSizeToNodeSize(this._width, this._height, true);
311
+ this.emitShow();
312
+ }
313
+ }
314
+ } else {
315
+ if (this._visible) {
316
+ this._visible = false;
317
+ this._isShownWithZeroDimensions = false;
318
+ this.emitHide();
319
+ }
320
+ }
321
+ }
322
+
323
+ setBaseLogicalZIndex(): void {
324
+ this.setLogicalZIndex(LogicalZIndex.base);
325
+ }
326
+
327
+ setLogicalZIndex(logicalZIndex: LogicalZIndex): void {
328
+ if (logicalZIndex !== this._logicalZIndex) {
329
+ this._logicalZIndex = logicalZIndex;
330
+
331
+ this.notifyVirtualZIndexChangeRequired();
332
+ }
333
+ }
334
+
335
+ /**
336
+ * Set the container's size, but considered temporary (for dragging)
337
+ * so don't emit any events.
338
+ * @internal
339
+ */
340
+ enterDragMode(width: number, height: number): void {
341
+ this._width = width;
342
+ this._height = height;
343
+ setElementWidth(this._element, width);
344
+ setElementHeight(this._element, height);
345
+
346
+ this.setLogicalZIndex(LogicalZIndex.drag);
347
+
348
+ this.drag();
349
+ }
350
+
351
+ /** @internal */
352
+ exitDragMode(): void {
353
+ this.setBaseLogicalZIndex();
354
+ }
355
+
356
+ /** @internal */
357
+ enterStackMaximised(): void {
358
+ this._stackMaximised = true;
359
+ this.setLogicalZIndex(LogicalZIndex.stackMaximised);
360
+ }
361
+
362
+ /** @internal */
363
+ exitStackMaximised(): void {
364
+ this.setBaseLogicalZIndex();
365
+ this._stackMaximised = false;
366
+ }
367
+
368
+ /** @internal */
369
+ drag(): void {
370
+ if (this._boundComponent.virtual) {
371
+ if (this.virtualRectingRequiredEvent !== undefined) {
372
+ this._layoutManager.fireBeforeVirtualRectingEvent(1);
373
+ try {
374
+ this.virtualRectingRequiredEvent(this, this._width, this._height);
375
+ } finally {
376
+ this._layoutManager.fireAfterVirtualRectingEvent();
377
+ }
378
+ }
379
+ }
380
+ }
381
+
382
+ /**
383
+ * Sets the container's size. Called by the container's component item.
384
+ * To instead set the size programmatically from within the component itself,
385
+ * use the public setSize method
386
+ * @param width - in px
387
+ * @param height - in px
388
+ * @param force - set even if no change
389
+ * @internal
390
+ */
391
+ setSizeToNodeSize(width: number, height: number, force: boolean): void {
392
+ if (width !== this._width || height !== this._height || force) {
393
+ this._width = width;
394
+ this._height = height;
395
+ setElementWidth(this._element, width);
396
+ setElementHeight(this._element, height);
397
+
398
+ if (this._boundComponent.virtual) {
399
+ this.addVirtualSizedContainerToLayoutManager();
400
+ } else {
401
+ this.emit('resize');
402
+ this.checkShownFromZeroDimensions();
403
+ }
404
+ }
405
+ }
406
+
407
+ /** @internal */
408
+ notifyVirtualRectingRequired(): void {
409
+ if (this.virtualRectingRequiredEvent !== undefined) {
410
+ this.virtualRectingRequiredEvent(this, this._width, this._height);
411
+ this.emit('resize');
412
+ this.checkShownFromZeroDimensions();
413
+ }
414
+ }
415
+
416
+ /** @internal */
417
+ private notifyVirtualZIndexChangeRequired(): void {
418
+ if (this.virtualZIndexChangeRequiredEvent !== undefined) {
419
+ const logicalZIndex = this._logicalZIndex;
420
+ const defaultZIndex = LogicalZIndexToDefaultMap[logicalZIndex];
421
+ this.virtualZIndexChangeRequiredEvent(this, logicalZIndex, defaultZIndex);
422
+ }
423
+ }
424
+
425
+ /** @internal */
426
+ private updateElementPositionPropertyFromBoundComponent() {
427
+ if (this._boundComponent.virtual) {
428
+ this._element.style.position = 'static';
429
+ } else {
430
+ this._element.style.position = ''; // set it back to attribute value
431
+ }
432
+ }
433
+
434
+ /** @internal */
435
+ private addVirtualSizedContainerToLayoutManager() {
436
+ this._layoutManager.beginVirtualSizedContainerAdding();
437
+ try {
438
+ this._layoutManager.addVirtualSizedContainer(this);
439
+ } finally {
440
+ this._layoutManager.endVirtualSizedContainerAdding();
441
+ }
442
+ }
443
+
444
+ /** @internal */
445
+ private checkShownFromZeroDimensions() {
446
+ if (this._isShownWithZeroDimensions && (this._height !== 0 || this._width !== 0)) {
447
+ this._isShownWithZeroDimensions = false;
448
+ this.emitShow();
449
+ }
450
+ }
451
+
452
+ /** @internal */
453
+ private emitShow(): void {
454
+ this.emit('shown');
455
+ this.emit('show');
456
+ }
457
+
458
+ /** @internal */
459
+ private emitHide(): void {
460
+ this.emit('hide');
461
+ }
462
+
463
+ /** @internal */
464
+ private releaseComponent() {
465
+ if (this._stackMaximised) {
466
+ this.exitStackMaximised();
467
+ }
468
+ this.emit('beforeComponentRelease', this._boundComponent.component);
469
+ this.layoutManager.unbindComponent(this, this._boundComponent.virtual, this._boundComponent.component);
470
+ }
471
+ }
472
+
473
+ /** @public @deprecated use {@link ComponentContainer} */
474
+ export type ItemContainer = ComponentContainer;
475
+
476
+ /** @public */
477
+ export namespace ComponentContainer {
478
+ export type Component = unknown;
479
+
480
+ export interface BindableComponent {
481
+ component: Component;
482
+ virtual: boolean;
483
+ }
484
+
485
+ export type StateRequestEventHandler = (this: void) => JsonValue | undefined;
486
+ export type VirtualRectingRequiredEvent = (this: void, container: ComponentContainer, width: number, height: number) => void;
487
+ export type VirtualVisibilityChangeRequiredEvent = (this: void, container: ComponentContainer, visible: boolean) => void;
488
+ export type VirtualZIndexChangeRequiredEvent =
489
+ (this: void, container: ComponentContainer, logicalZIndex: LogicalZIndex, defaultZIndex: string) => void;
490
+ /** @internal */
491
+ export type ShowEventHandler = (this: void) => void;
492
+ /** @internal */
493
+ export type HideEventHandler = (this: void) => void;
494
+ /** @internal */
495
+ export type FocusEventHandler = (this: void, suppressEvent: boolean) => void;
496
+ /** @internal */
497
+ export type BlurEventHandler = (this: void, suppressEvent: boolean) => void;
498
+ /** @internal */
499
+ export type UpdateItemConfigEventHandler = (itemConfig: ResolvedComponentItemConfig) => void;
500
+ }