@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,275 @@
1
+ import { BrowserPopout } from '../controls/browser-popout';
2
+ import { Tab } from '../controls/tab';
3
+ import { ComponentItem } from '../items/component-item';
4
+
5
+ /**
6
+ * A generic and very fast EventEmitter implementation. On top of emitting the actual event it emits an
7
+ * {@link (EventEmitter:namespace).ALL_EVENT} event for every event triggered. This allows to hook into it and proxy events forwards
8
+ * @public
9
+ */
10
+ export class EventEmitter {
11
+ /** @internal */
12
+ private _allEventSubscriptions: EventEmitter.UnknownCallback[] = [];
13
+ /** @internal */
14
+ private _subscriptionsMap = new Map<string, EventEmitter.UnknownCallback[]>();
15
+
16
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
17
+ tryBubbleEvent(name: string, args: unknown[]): void {
18
+ // overridden by ContentItem
19
+ }
20
+
21
+ /**
22
+ * Emit an event and notify listeners
23
+ *
24
+ * @param eventName - The name of the event
25
+ * @param args - Additional arguments that will be passed to the listener
26
+ */
27
+ emit<K extends keyof EventEmitter.EventParamsMap>(eventName: K, ...args: EventEmitter.EventParamsMap[K]): void {
28
+ let subcriptions = this._subscriptionsMap.get(eventName);
29
+
30
+ if (subcriptions !== undefined) {
31
+ subcriptions = subcriptions.slice();
32
+ for (let i = 0; i < subcriptions.length; i++) {
33
+ const subscription = subcriptions[i];
34
+ subscription(...args);
35
+ }
36
+ }
37
+
38
+ this.emitAllEvent(eventName, args);
39
+ this.tryBubbleEvent(eventName, args);
40
+ }
41
+
42
+ /** @internal */
43
+ emitUnknown(eventName: string, ...args: EventEmitter.UnknownParams): void {
44
+ let subs = this._subscriptionsMap.get(eventName);
45
+
46
+ if (subs !== undefined) {
47
+ subs = subs.slice();
48
+ for (let i = 0; i < subs.length; i++) {
49
+ subs[i](...args);
50
+ }
51
+ }
52
+
53
+ this.emitAllEvent(eventName, args);
54
+ this.tryBubbleEvent(eventName, args);
55
+ }
56
+
57
+ /* @internal **/
58
+ emitBaseBubblingEvent<K extends keyof EventEmitter.EventParamsMap>(eventName: K): void {
59
+ const event = new EventEmitter.BubblingEvent(eventName, this);
60
+ this.emitUnknown(eventName, event);
61
+ }
62
+
63
+ /** @internal */
64
+ emitUnknownBubblingEvent(eventName: string): void {
65
+ const event = new EventEmitter.BubblingEvent(eventName, this);
66
+ this.emitUnknown(eventName, event);
67
+ }
68
+
69
+ /**
70
+ * Removes a listener for an event.
71
+ * @param eventName - The name of the event
72
+ * @param callback - The previously registered callback method (optional)
73
+ */
74
+ removeEventListener<K extends keyof EventEmitter.EventParamsMap>(eventName: K, callback: EventEmitter.Callback<K>): void {
75
+ const unknownCallback = callback as EventEmitter.UnknownCallback;
76
+ this.removeUnknownEventListener(eventName, unknownCallback);
77
+ }
78
+
79
+ off<K extends keyof EventEmitter.EventParamsMap>(eventName: K, callback: EventEmitter.Callback<K>): void {
80
+ this.removeEventListener(eventName, callback);
81
+ }
82
+
83
+ /**
84
+ * Alias for off
85
+ */
86
+ unbind = this.removeEventListener;
87
+
88
+ /**
89
+ * Alias for emit
90
+ */
91
+ trigger = this.emit;
92
+
93
+ /**
94
+ * Listen for events
95
+ *
96
+ * @param eventName - The name of the event to listen to
97
+ * @param callback - The callback to execute when the event occurs
98
+ */
99
+ addEventListener<K extends keyof EventEmitter.EventParamsMap>(eventName: K, callback: EventEmitter.Callback<K>): void {
100
+ const unknownCallback = callback as EventEmitter.UnknownCallback;
101
+ this.addUnknownEventListener(eventName, unknownCallback);
102
+ }
103
+
104
+ on<K extends keyof EventEmitter.EventParamsMap>(eventName: K, callback: EventEmitter.Callback<K>): void {
105
+ this.addEventListener(eventName, callback);
106
+ }
107
+
108
+ /** @internal */
109
+ private addUnknownEventListener(eventName: string, callback: EventEmitter.UnknownCallback): void {
110
+ if (eventName === EventEmitter.ALL_EVENT) {
111
+ this._allEventSubscriptions.push(callback);
112
+ } else {
113
+ let subscriptions = this._subscriptionsMap.get(eventName);
114
+ if (subscriptions !== undefined) {
115
+ subscriptions.push(callback);
116
+ } else {
117
+ subscriptions = [callback];
118
+ this._subscriptionsMap.set(eventName, subscriptions);
119
+ }
120
+ }
121
+ }
122
+
123
+ /** @internal */
124
+ private removeUnknownEventListener(eventName: string, callback: EventEmitter.UnknownCallback): void {
125
+ if (eventName === EventEmitter.ALL_EVENT) {
126
+ this.removeSubscription(eventName, this._allEventSubscriptions, callback);
127
+ } else {
128
+ const subscriptions = this._subscriptionsMap.get(eventName);
129
+ if (subscriptions === undefined) {
130
+ throw new Error('No subscribtions to unsubscribe for event ' + eventName);
131
+ } else {
132
+ this.removeSubscription(eventName, subscriptions, callback);
133
+ }
134
+ }
135
+ }
136
+
137
+ /** @internal */
138
+ private removeSubscription(eventName: string, subscriptions: EventEmitter.UnknownCallback[], callback: EventEmitter.UnknownCallback) {
139
+ const idx = subscriptions.indexOf(callback);
140
+ if (idx < 0) {
141
+ throw new Error('Nothing to unbind for ' + eventName);
142
+ } else {
143
+ subscriptions.splice(idx, 1);
144
+ }
145
+ }
146
+
147
+ /** @internal */
148
+ private emitAllEvent(eventName: string, args: unknown[]) {
149
+ const allEventSubscriptionsCount = this._allEventSubscriptions.length;
150
+ if (allEventSubscriptionsCount > 0) {
151
+ const unknownArgs = args.slice() as EventEmitter.UnknownParams;
152
+ unknownArgs.unshift(eventName);
153
+
154
+ const allEventSubcriptions = this._allEventSubscriptions.slice();
155
+
156
+ for (let i = 0; i < allEventSubscriptionsCount; i++) {
157
+ allEventSubcriptions[i](...unknownArgs);
158
+ }
159
+ }
160
+ }
161
+ }
162
+
163
+ /** @public */
164
+ export namespace EventEmitter {
165
+ /**
166
+ * The name of the event that's triggered for every event
167
+ */
168
+ export const ALL_EVENT = '__all';
169
+
170
+ export const headerClickEventName = 'stackHeaderClick';
171
+ export const headerTouchStartEventName = 'stackHeaderTouchStart';
172
+
173
+ /** @internal */
174
+ export type UnknownCallback = (this: void, ...args: UnknownParams) => void;
175
+ export type Callback<K extends keyof EventEmitter.EventParamsMap> = (this: void, ...args: EventParamsMap[K]) => void;
176
+
177
+ export interface EventParamsMap {
178
+ "__all": UnknownParams;
179
+ "activeContentItemChanged": ComponentItemParam;
180
+ "close": NoParams;
181
+ "closed": NoParams;
182
+ "destroy": NoParams;
183
+ "drag": DragParams;
184
+ "dragStart": DragStartParams;
185
+ "dragStop": DragStopParams;
186
+ "hide": NoParams;
187
+ "initialised": NoParams;
188
+ "itemDropped": ComponentItemParam;
189
+ "maximised": NoParams;
190
+ "minimised": NoParams;
191
+ "open": NoParams;
192
+ "popIn": NoParams;
193
+ "resize": NoParams;
194
+ "show": NoParams;
195
+ /** @deprecated - use show instead */
196
+ "shown": NoParams;
197
+ "stateChanged": NoParams;
198
+ "tab": TabParam;
199
+ "tabCreated": TabParam;
200
+ "titleChanged": StringParam;
201
+ "windowClosed": PopoutParam;
202
+ "windowOpened": PopoutParam;
203
+ "beforeComponentRelease": BeforeComponentReleaseParams;
204
+ "beforeItemDestroyed": BubblingEventParam;
205
+ "itemCreated": BubblingEventParam;
206
+ "itemDestroyed": BubblingEventParam;
207
+ "focus": BubblingEventParam;
208
+ "blur": BubblingEventParam;
209
+ "stackHeaderClick": ClickBubblingEventParam;
210
+ "stackHeaderTouchStart": TouchStartBubblingEventParam;
211
+ "userBroadcast": UnknownParams;
212
+ }
213
+
214
+ export type UnknownParams = unknown[];
215
+ export type NoParams = [];
216
+ export type UnknownParam = [unknown];
217
+ export type PopoutParam = [BrowserPopout];
218
+ export type ComponentItemParam = [ComponentItem];
219
+ export type TabParam = [Tab];
220
+ export type BubblingEventParam = [EventEmitter.BubblingEvent]
221
+ export type StringParam = [string];
222
+ export type DragStartParams = [originalX: number, originalY: number];
223
+ export type DragStopParams = [event: PointerEvent | undefined];
224
+ export type DragParams = [offsetX: number, offsetY: number, event: PointerEvent];
225
+ export type BeforeComponentReleaseParams = [component: unknown];
226
+ export type ClickBubblingEventParam = [ClickBubblingEvent];
227
+ export type TouchStartBubblingEventParam = [TouchStartBubblingEvent];
228
+
229
+ export class BubblingEvent {
230
+ /** @internal */
231
+ private _isPropagationStopped = false;
232
+
233
+ get name(): string { return this._name; }
234
+ get target(): EventEmitter { return this._target; }
235
+ /** @deprecated Use {@link (EventEmitter:namespace).(BubblingEvent:class).target} instead */
236
+ get origin(): EventEmitter { return this._target; }
237
+ get isPropagationStopped(): boolean { return this._isPropagationStopped; }
238
+
239
+ /** @internal */
240
+ constructor(
241
+ /** @internal */
242
+ private readonly _name: string,
243
+ /** @internal */
244
+ private readonly _target: EventEmitter) {
245
+ }
246
+
247
+ stopPropagation(): void {
248
+ this._isPropagationStopped = true;
249
+ }
250
+ }
251
+
252
+ export class ClickBubblingEvent extends BubblingEvent {
253
+ get mouseEvent(): MouseEvent { return this._mouseEvent; }
254
+
255
+ /** @internal */
256
+ constructor(name: string, target: EventEmitter,
257
+ /** @internal */
258
+ private readonly _mouseEvent: MouseEvent
259
+ ) {
260
+ super(name, target);
261
+ }
262
+ }
263
+
264
+ export class TouchStartBubblingEvent extends BubblingEvent {
265
+ get touchEvent(): TouchEvent { return this._touchEvent; }
266
+
267
+ /** @internal */
268
+ constructor(name: string, target: EventEmitter,
269
+ /** @internal */
270
+ private readonly _touchEvent: TouchEvent
271
+ ) {
272
+ super(name, target);
273
+ }
274
+ }
275
+ }
@@ -0,0 +1,163 @@
1
+ import { UnexpectedNullError } from '../errors/internal-error';
2
+ import { LayoutManager } from '../layout-manager';
3
+ import { EventEmitter } from './event-emitter';
4
+
5
+ // Add our ChildEvent to WindowEventMap for type safety
6
+ /** @public */
7
+ declare global {
8
+ interface WindowEventMap {
9
+ [EventHub.ChildEventName]: CustomEvent<EventHub.ChildEventDetail>;
10
+ }
11
+ }
12
+
13
+ /**
14
+ * An EventEmitter singleton that propagates events
15
+ * across multiple windows. This is a little bit trickier since
16
+ * windows are allowed to open childWindows in their own right.
17
+ *
18
+ * This means that we deal with a tree of windows. Therefore, we do the event propagation in two phases:
19
+ *
20
+ * - Propagate events from this layout to the parent layout
21
+ * - Repeat until the event arrived at the root layout
22
+ * - Propagate events to this layout and to all children
23
+ * - Repeat until all layouts got the event
24
+ *
25
+ * **WARNING**: Only userBroadcast events are propagated between windows.
26
+ * This means the you have to take care of propagating state changes between windows yourself.
27
+ *
28
+ * @public
29
+ */
30
+ export class EventHub extends EventEmitter {
31
+
32
+ /** @internal */
33
+ private _childEventListener = (childEvent: CustomEvent<EventHub.ChildEventDetail>) => this.onEventFromChild(childEvent);
34
+
35
+ /**
36
+ * Creates a new EventHub instance
37
+ * @param _layoutManager - the layout manager to synchronize between the windows
38
+ * @internal
39
+ */
40
+ constructor(
41
+ /** @internal */
42
+ private _layoutManager: LayoutManager
43
+ ) {
44
+ super();
45
+ globalThis.addEventListener(EventHub.ChildEventName, this._childEventListener, { passive: true });
46
+ }
47
+
48
+ /**
49
+ * Emit an event and notify listeners
50
+ *
51
+ * @param eventName - The name of the event
52
+ * @param args - Additional arguments that will be passed to the listener
53
+ * @public
54
+ */
55
+ override emit<K extends keyof EventEmitter.EventParamsMap>(eventName: K, ...args: EventEmitter.EventParamsMap[K]): void {
56
+ if (eventName === 'userBroadcast') {
57
+ // Explicitly redirect the user broadcast to our overridden method.
58
+ this.emitUserBroadcast(...args);
59
+ } else {
60
+ super.emit(eventName, ...args);
61
+ }
62
+ }
63
+
64
+ /**
65
+ * Broadcasts a message to all other currently opened windows.
66
+ * @public
67
+ */
68
+ emitUserBroadcast(...args: EventEmitter.UnknownParams): void {
69
+ // Step 1: Bubble up the event
70
+ this.handleUserBroadcastEvent('userBroadcast', args);
71
+ }
72
+
73
+ /**
74
+ * Destroys the EventHub
75
+ * @internal
76
+ */
77
+ destroy(): void {
78
+ globalThis.removeEventListener(EventHub.ChildEventName, this._childEventListener);
79
+ }
80
+
81
+ /**
82
+ * Internal processor to process local events.
83
+ * @internal
84
+ */
85
+ private handleUserBroadcastEvent(eventName: string, args: unknown[]) {
86
+ if (this._layoutManager.isSubWindow) {
87
+ // We are a sub window and received an event from one of our children.
88
+ // So propagate it to the Root.
89
+ this.propagateToParent(eventName, args);
90
+ } else {
91
+ // We are the root window, propagate it to the subtree below us.
92
+ this.propagateToThisAndSubtree(eventName, args);
93
+ }
94
+ }
95
+
96
+ /**
97
+ * Callback for child events raised on the window
98
+ * @internal
99
+ */
100
+ private onEventFromChild(event: CustomEvent<EventHub.ChildEventDetail>) {
101
+ const detail = event.detail;
102
+ this.handleUserBroadcastEvent(detail.eventName, detail.args);
103
+ }
104
+
105
+ /**
106
+ * Propagates the event to the parent by emitting
107
+ * it on the parent's DOM window
108
+ * @internal
109
+ */
110
+ private propagateToParent(eventName: string, args: unknown[]) {
111
+ const detail: EventHub.ChildEventDetail = {
112
+ layoutManager: this._layoutManager,
113
+ eventName,
114
+ args: args,
115
+ }
116
+
117
+ const eventInit: EventHub.ChildEventInit = {
118
+ bubbles: true,
119
+ cancelable: true,
120
+ detail,
121
+ };
122
+
123
+ const event = new CustomEvent<EventHub.ChildEventDetail>(EventHub.ChildEventName, eventInit);
124
+ const opener = globalThis.opener;
125
+ if (opener === null) {
126
+ throw new UnexpectedNullError('EHPTP15778')
127
+ }
128
+
129
+ opener.dispatchEvent(event);
130
+ }
131
+
132
+ /**
133
+ * Propagate events to the whole subtree under this event hub.
134
+ * @internal
135
+ */
136
+ private propagateToThisAndSubtree(eventName: string, args: unknown[]) {
137
+ this.emitUnknown(eventName, ...args);
138
+ for (let i = 0; i < this._layoutManager.openPopouts.length; i++) {
139
+ const childGl = this._layoutManager.openPopouts[i].getGlInstance();
140
+
141
+ if (childGl) {
142
+ childGl.eventHub.propagateToThisAndSubtree(eventName, args);
143
+ }
144
+ }
145
+ }
146
+ }
147
+
148
+ /** @public */
149
+ export namespace EventHub {
150
+
151
+ /** @internal */
152
+ export const ChildEventName = 'gl_child_event';
153
+
154
+ /** @internal */
155
+ export type ChildEventDetail = {
156
+ layoutManager: LayoutManager;
157
+ eventName: string;
158
+ args: unknown[];
159
+ };
160
+
161
+ /** @internal */
162
+ export type ChildEventInit = CustomEventInit<ChildEventDetail>;
163
+ }
@@ -0,0 +1,96 @@
1
+ import { AssertError } from '../errors/internal-error';
2
+
3
+ /** @public */
4
+ export const enum I18nStringId {
5
+ PopoutCannotBeCreatedWithGroundItemConfig,
6
+ PleaseRegisterAConstructorFunction,
7
+ ComponentTypeNotRegisteredAndBindComponentEventHandlerNotAssigned,
8
+ ComponentIsAlreadyRegistered,
9
+ ComponentIsNotVirtuable,
10
+ VirtualComponentDoesNotHaveRootHtmlElement,
11
+ ItemConfigIsNotTypeComponent,
12
+ InvalidNumberPartInSizeString,
13
+ UnknownUnitInSizeString,
14
+ UnsupportedUnitInSizeString,
15
+ }
16
+
17
+ /** @public */
18
+ export namespace I18nStrings {
19
+ /** @internal */
20
+ let initialised = false;
21
+
22
+ /** @internal */
23
+ interface Info {
24
+ readonly id: I18nStringId;
25
+ readonly default: string;
26
+ }
27
+
28
+ /** @internal */
29
+ type InfosObject = { [id in keyof typeof I18nStringId]: Info };
30
+
31
+ /** @internal */
32
+ const infosObject: InfosObject = {
33
+ PopoutCannotBeCreatedWithGroundItemConfig: {
34
+ id: I18nStringId.PopoutCannotBeCreatedWithGroundItemConfig,
35
+ default: 'Popout cannot be created with ground ItemConfig'
36
+ },
37
+ PleaseRegisterAConstructorFunction: {
38
+ id: I18nStringId.PleaseRegisterAConstructorFunction,
39
+ default: 'Please register a constructor function'
40
+ },
41
+ ComponentTypeNotRegisteredAndBindComponentEventHandlerNotAssigned: {
42
+ id: I18nStringId.ComponentTypeNotRegisteredAndBindComponentEventHandlerNotAssigned,
43
+ default: 'Component type not registered and BindComponentEvent handler not assigned',
44
+ },
45
+ ComponentIsAlreadyRegistered: {
46
+ id: I18nStringId.ComponentIsAlreadyRegistered,
47
+ default: 'Component is already registered',
48
+ },
49
+ ComponentIsNotVirtuable: {
50
+ id: I18nStringId.ComponentIsNotVirtuable,
51
+ default: 'Component is not virtuable. Requires rootHtmlElement field/getter',
52
+ },
53
+ VirtualComponentDoesNotHaveRootHtmlElement: {
54
+ id: I18nStringId.VirtualComponentDoesNotHaveRootHtmlElement,
55
+ default: 'Virtual component does not have getter "rootHtmlElement"',
56
+ },
57
+ ItemConfigIsNotTypeComponent: {
58
+ id: I18nStringId.ItemConfigIsNotTypeComponent,
59
+ default: 'ItemConfig is not of type component',
60
+ },
61
+
62
+ InvalidNumberPartInSizeString: {
63
+ id: I18nStringId.InvalidNumberPartInSizeString,
64
+ default: 'Invalid number part in size string',
65
+ },
66
+ UnknownUnitInSizeString: {
67
+ id: I18nStringId.UnknownUnitInSizeString,
68
+ default: 'Unknown unit in size string',
69
+ },
70
+ UnsupportedUnitInSizeString: {
71
+ id: I18nStringId.UnsupportedUnitInSizeString,
72
+ default: 'Unsupported unit in size string',
73
+ },
74
+ }
75
+
76
+ export const idCount = Object.keys(infosObject).length;
77
+ /** @internal */
78
+ const infos = Object.values(infosObject);
79
+
80
+ export function checkInitialise(): void {
81
+ if (!initialised) {
82
+ for (let i = 0; i < idCount; i++) {
83
+ const info = infos[i];
84
+ if (info.id !== i) {
85
+ throw new AssertError('INSI00110', `${i}: ${info.id}`);
86
+ } else {
87
+ i18nStrings[i] = info.default;
88
+ }
89
+ }
90
+ }
91
+ initialised = true;
92
+ }
93
+ }
94
+
95
+ /** @public */
96
+ export const i18nStrings = new Array<string>(I18nStrings.idCount);
@@ -0,0 +1,12 @@
1
+ import { LeftAndTop } from './types';
2
+ import { pixelsToNumber } from './utils';
3
+
4
+ /** @internal */
5
+ export function getJQueryLeftAndTop(element: HTMLElement): LeftAndTop {
6
+ const style = getComputedStyle(element, null);
7
+ const leftAndTop: LeftAndTop = {
8
+ left: pixelsToNumber(style.left),
9
+ top: pixelsToNumber(style.top),
10
+ }
11
+ return leftAndTop;
12
+ }
@@ -0,0 +1,6 @@
1
+ /** @public */
2
+ export namespace StyleConstants {
3
+ export const defaultComponentBaseZIndex = 'auto';
4
+ export const defaultComponentDragZIndex = '32';
5
+ export const defaultComponentStackMaximisedZIndex = '41';
6
+ }
@@ -0,0 +1,145 @@
1
+ import { UnreachableCaseError } from '../errors/internal-error';
2
+ import { StyleConstants } from './style-constants';
3
+
4
+ /** @internal */
5
+ export type WidthOrHeightPropertyName = 'width' | 'height';
6
+
7
+ /** @internal */
8
+ export namespace WidthOrHeightPropertyName {
9
+ export const width = 'width';
10
+ export const height = 'height';
11
+ }
12
+
13
+ /** @internal */
14
+ export interface WidthAndHeight {
15
+ width: number;
16
+ height: number;
17
+ }
18
+
19
+ /** @internal */
20
+ export interface LeftAndTop {
21
+ left: number;
22
+ top: number;
23
+ }
24
+
25
+ /** @public */
26
+ export type Side = 'top' | 'left' | 'right' | 'bottom';
27
+ /** @public */
28
+ export namespace Side {
29
+ export const top = 'top';
30
+ export const left = 'left';
31
+ export const right = 'right';
32
+ export const bottom = 'bottom';
33
+ }
34
+
35
+ /** @public */
36
+ export type LogicalZIndex = 'base' | 'drag' | 'stackMaximised';
37
+ /** @public */
38
+ export namespace LogicalZIndex {
39
+ export const base = 'base';
40
+ export const drag = 'drag';
41
+ export const stackMaximised = 'stackMaximised';
42
+ }
43
+
44
+ /** @public */
45
+ export const LogicalZIndexToDefaultMap = {
46
+ base: StyleConstants.defaultComponentBaseZIndex,
47
+ drag: StyleConstants.defaultComponentDragZIndex,
48
+ stackMaximised: StyleConstants.defaultComponentStackMaximisedZIndex,
49
+ }
50
+
51
+ /** @internal */
52
+ export interface Rect {
53
+ left: number,
54
+ top: number,
55
+ width: number,
56
+ height: number,
57
+ }
58
+
59
+ /** @internal */
60
+ export interface AreaLinkedRect {
61
+ x1: number, // left
62
+ x2: number, // nextLeft
63
+ y1: number, // top
64
+ y2: number, // nextTop
65
+ }
66
+
67
+ /** @public */
68
+ // eslint-disable-next-line @typescript-eslint/ban-types
69
+ export type JsonValue = string | number | boolean | null | Json | object | JsonValueArray;
70
+ /** @public */
71
+ export interface Json {
72
+ [name: string]: JsonValue;
73
+ }
74
+ /** @public */
75
+ export type JsonValueArray = Array<JsonValue>
76
+ /** @public */
77
+ export namespace JsonValue {
78
+ export function isJson(value: JsonValue): value is Json {
79
+ return isJsonObject(value);
80
+ }
81
+
82
+ // eslint-disable-next-line @typescript-eslint/ban-types
83
+ export function isJsonObject(value: JsonValue): value is Json | object {
84
+ return !Array.isArray(value) && value !== null && typeof value === 'object';
85
+ }
86
+ }
87
+
88
+ /** @public */
89
+ export type ItemType = 'ground' | 'row' | 'column' | 'stack' | 'component';
90
+
91
+ /** @public */
92
+ export namespace ItemType {
93
+ export const ground = 'ground';
94
+ export const row = 'row';
95
+ export const column = 'column';
96
+ export const stack = 'stack';
97
+ export const component = 'component';
98
+ }
99
+
100
+ /** @public */
101
+ export type ResponsiveMode = 'none' | 'always' | 'onload';
102
+ /** @public */
103
+ export namespace ResponsiveMode {
104
+ export const none = 'none';
105
+ export const always = 'always';
106
+ export const onload = 'onload';
107
+ }
108
+
109
+ /**
110
+ * Length units which can specify the size of a Component Item
111
+ * @public
112
+ */
113
+ export type SizeUnit = 'px' | '%' | 'fr' | 'em';
114
+
115
+ /** @public */
116
+ export enum SizeUnitEnum {
117
+ Pixel = 'px',
118
+ Percent = '%',
119
+ Fractional = 'fr',
120
+ Em = 'em',
121
+ }
122
+
123
+ /** @public */
124
+ export namespace SizeUnitEnum {
125
+ export function tryParse(value: string) {
126
+ switch (value) {
127
+ case SizeUnitEnum.Pixel: return SizeUnitEnum.Pixel;
128
+ case SizeUnitEnum.Percent: return SizeUnitEnum.Percent;
129
+ case SizeUnitEnum.Fractional: return SizeUnitEnum.Fractional;
130
+ case SizeUnitEnum.Em: return SizeUnitEnum.Em;
131
+ default: return undefined;
132
+ }
133
+ }
134
+
135
+ export function format(value: SizeUnitEnum) {
136
+ switch (value) {
137
+ case SizeUnitEnum.Pixel: return SizeUnitEnum.Pixel;
138
+ case SizeUnitEnum.Percent: return SizeUnitEnum.Percent;
139
+ case SizeUnitEnum.Fractional: return SizeUnitEnum.Fractional;
140
+ case SizeUnitEnum.Em: return SizeUnitEnum.Em;
141
+ default:
142
+ throw new UnreachableCaseError('SUEF44998', value);
143
+ }
144
+ }
145
+ }