@datagrok-libraries/dock-spawn-dg 0.0.1

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 (222) hide show
  1. package/.eslintrc.json +47 -0
  2. package/CHANGELOG.md +355 -0
  3. package/LICENSE +21 -0
  4. package/README.md +11 -0
  5. package/css/dock-manager-context-menu.css +19 -0
  6. package/css/dock-manager-style.css +190 -0
  7. package/css/dock-manager.css +411 -0
  8. package/images/close.svg +6 -0
  9. package/images/dock_bottom.png +0 -0
  10. package/images/dock_bottom_sel.png +0 -0
  11. package/images/dock_fill.png +0 -0
  12. package/images/dock_fill_sel.png +0 -0
  13. package/images/dock_left.png +0 -0
  14. package/images/dock_left_sel.png +0 -0
  15. package/images/dock_right.png +0 -0
  16. package/images/dock_right_sel.png +0 -0
  17. package/images/dock_top.png +0 -0
  18. package/images/dock_top_sel.png +0 -0
  19. package/index.ts +32 -0
  20. package/lib/BrowserDialogHelper.d.ts +8 -0
  21. package/lib/BrowserDialogHelper.d.ts.map +1 -0
  22. package/lib/BrowserDialogHelper.js +60 -0
  23. package/lib/ContainerType.d.ts +7 -0
  24. package/lib/ContainerType.d.ts.map +1 -0
  25. package/lib/ContainerType.js +7 -0
  26. package/lib/Dialog.d.ts +51 -0
  27. package/lib/Dialog.d.ts.map +1 -0
  28. package/lib/Dialog.js +209 -0
  29. package/lib/DockConfig.d.ts +9 -0
  30. package/lib/DockConfig.d.ts.map +1 -0
  31. package/lib/DockConfig.js +14 -0
  32. package/lib/DockGraphDeserializer.d.ts +19 -0
  33. package/lib/DockGraphDeserializer.d.ts.map +1 -0
  34. package/lib/DockGraphDeserializer.js +114 -0
  35. package/lib/DockGraphSerializer.d.ts +14 -0
  36. package/lib/DockGraphSerializer.d.ts.map +1 -0
  37. package/lib/DockGraphSerializer.js +40 -0
  38. package/lib/DockLayoutEngine.d.ts +36 -0
  39. package/lib/DockLayoutEngine.d.ts.map +1 -0
  40. package/lib/DockLayoutEngine.js +323 -0
  41. package/lib/DockManager.d.ts +155 -0
  42. package/lib/DockManager.d.ts.map +1 -0
  43. package/lib/DockManager.js +752 -0
  44. package/lib/DockManagerContext.d.ts +10 -0
  45. package/lib/DockManagerContext.d.ts.map +1 -0
  46. package/lib/DockManagerContext.js +12 -0
  47. package/lib/DockModel.d.ts +9 -0
  48. package/lib/DockModel.d.ts.map +1 -0
  49. package/lib/DockModel.js +8 -0
  50. package/lib/DockNode.d.ts +16 -0
  51. package/lib/DockNode.d.ts.map +1 -0
  52. package/lib/DockNode.js +64 -0
  53. package/lib/DockWheel.d.ts +41 -0
  54. package/lib/DockWheel.d.ts.map +1 -0
  55. package/lib/DockWheel.js +208 -0
  56. package/lib/DockWheelItem.d.ts +16 -0
  57. package/lib/DockWheelItem.d.ts.map +1 -0
  58. package/lib/DockWheelItem.js +34 -0
  59. package/lib/DocumentManagerContainer.d.ts +16 -0
  60. package/lib/DocumentManagerContainer.d.ts.map +1 -0
  61. package/lib/DocumentManagerContainer.js +28 -0
  62. package/lib/DocumentTabPage.d.ts +11 -0
  63. package/lib/DocumentTabPage.d.ts.map +1 -0
  64. package/lib/DocumentTabPage.js +26 -0
  65. package/lib/DraggableContainer.d.ts +51 -0
  66. package/lib/DraggableContainer.d.ts.map +1 -0
  67. package/lib/DraggableContainer.js +145 -0
  68. package/lib/EventHandler.d.ts +8 -0
  69. package/lib/EventHandler.d.ts.map +1 -0
  70. package/lib/EventHandler.js +14 -0
  71. package/lib/FillDockContainer.d.ts +34 -0
  72. package/lib/FillDockContainer.d.ts.map +1 -0
  73. package/lib/FillDockContainer.js +80 -0
  74. package/lib/HorizontalDockContainer.d.ts +7 -0
  75. package/lib/HorizontalDockContainer.d.ts.map +1 -0
  76. package/lib/HorizontalDockContainer.js +9 -0
  77. package/lib/PanelContainer.d.ts +114 -0
  78. package/lib/PanelContainer.d.ts.map +1 -0
  79. package/lib/PanelContainer.js +517 -0
  80. package/lib/Point.d.ts +6 -0
  81. package/lib/Point.d.ts.map +1 -0
  82. package/lib/Point.js +8 -0
  83. package/lib/ResizableContainer.d.ts +56 -0
  84. package/lib/ResizableContainer.d.ts.map +1 -0
  85. package/lib/ResizableContainer.js +254 -0
  86. package/lib/ResizeHandle.d.ts +16 -0
  87. package/lib/ResizeHandle.d.ts.map +1 -0
  88. package/lib/ResizeHandle.js +58 -0
  89. package/lib/SplitterBar.d.ts +33 -0
  90. package/lib/SplitterBar.d.ts.map +1 -0
  91. package/lib/SplitterBar.js +137 -0
  92. package/lib/SplitterDockContainer.d.ts +36 -0
  93. package/lib/SplitterDockContainer.d.ts.map +1 -0
  94. package/lib/SplitterDockContainer.js +75 -0
  95. package/lib/SplitterPanel.d.ts +27 -0
  96. package/lib/SplitterPanel.d.ts.map +1 -0
  97. package/lib/SplitterPanel.js +195 -0
  98. package/lib/TabHandle.d.ts +56 -0
  99. package/lib/TabHandle.d.ts.map +1 -0
  100. package/lib/TabHandle.js +292 -0
  101. package/lib/TabHost.d.ts +47 -0
  102. package/lib/TabHost.d.ts.map +1 -0
  103. package/lib/TabHost.js +238 -0
  104. package/lib/TabPage.d.ts +20 -0
  105. package/lib/TabPage.d.ts.map +1 -0
  106. package/lib/TabPage.js +81 -0
  107. package/lib/UndockInitiator.d.ts +32 -0
  108. package/lib/UndockInitiator.d.ts.map +1 -0
  109. package/lib/UndockInitiator.js +152 -0
  110. package/lib/Utils.d.ts +15 -0
  111. package/lib/Utils.d.ts.map +1 -0
  112. package/lib/Utils.js +69 -0
  113. package/lib/VerticalDockContainer.d.ts +7 -0
  114. package/lib/VerticalDockContainer.d.ts.map +1 -0
  115. package/lib/VerticalDockContainer.js +9 -0
  116. package/lib/enums/PanelType.d.ts +5 -0
  117. package/lib/enums/PanelType.d.ts.map +1 -0
  118. package/lib/enums/PanelType.js +5 -0
  119. package/lib/enums/TabHostDirection.d.ts +7 -0
  120. package/lib/enums/TabHostDirection.d.ts.map +1 -0
  121. package/lib/enums/TabHostDirection.js +7 -0
  122. package/lib/enums/WheelTypes.d.ts +12 -0
  123. package/lib/enums/WheelTypes.d.ts.map +1 -0
  124. package/lib/enums/WheelTypes.js +14 -0
  125. package/lib/i18n/Defaults.d.ts +12 -0
  126. package/lib/i18n/Defaults.d.ts.map +1 -0
  127. package/lib/i18n/Defaults.js +9 -0
  128. package/lib/i18n/Localizer.d.ts +7 -0
  129. package/lib/i18n/Localizer.d.ts.map +1 -0
  130. package/lib/i18n/Localizer.js +16 -0
  131. package/lib/index.d.ts +33 -0
  132. package/lib/index.d.ts.map +1 -0
  133. package/lib/index.js +32 -0
  134. package/lib/interfaces/IDockContainer.d.ts +26 -0
  135. package/lib/interfaces/IDockContainer.d.ts.map +1 -0
  136. package/lib/interfaces/IDockContainer.js +1 -0
  137. package/lib/interfaces/IDockContainerWithSize.d.ts +6 -0
  138. package/lib/interfaces/IDockContainerWithSize.d.ts.map +1 -0
  139. package/lib/interfaces/IDockContainerWithSize.js +1 -0
  140. package/lib/interfaces/ILayoutEventListener.d.ts +27 -0
  141. package/lib/interfaces/ILayoutEventListener.d.ts.map +1 -0
  142. package/lib/interfaces/ILayoutEventListener.js +1 -0
  143. package/lib/interfaces/IMouseOrTouchEvent.d.ts +7 -0
  144. package/lib/interfaces/IMouseOrTouchEvent.d.ts.map +1 -0
  145. package/lib/interfaces/IMouseOrTouchEvent.js +1 -0
  146. package/lib/interfaces/INodeInfo.d.ts +8 -0
  147. package/lib/interfaces/INodeInfo.d.ts.map +1 -0
  148. package/lib/interfaces/INodeInfo.js +1 -0
  149. package/lib/interfaces/IPanelInfo.d.ts +10 -0
  150. package/lib/interfaces/IPanelInfo.d.ts.map +1 -0
  151. package/lib/interfaces/IPanelInfo.js +1 -0
  152. package/lib/interfaces/IRectangle.d.ts +7 -0
  153. package/lib/interfaces/IRectangle.d.ts.map +1 -0
  154. package/lib/interfaces/IRectangle.js +1 -0
  155. package/lib/interfaces/ISize.d.ts +5 -0
  156. package/lib/interfaces/ISize.d.ts.map +1 -0
  157. package/lib/interfaces/ISize.js +1 -0
  158. package/lib/interfaces/IState.d.ts +12 -0
  159. package/lib/interfaces/IState.d.ts.map +1 -0
  160. package/lib/interfaces/IState.js +1 -0
  161. package/lib/interfaces/IThickness.d.ts +7 -0
  162. package/lib/interfaces/IThickness.d.ts.map +1 -0
  163. package/lib/interfaces/IThickness.js +1 -0
  164. package/lib/webcomponent/DockSpawnTsWebcomponent.d.ts +35 -0
  165. package/lib/webcomponent/DockSpawnTsWebcomponent.d.ts.map +1 -0
  166. package/lib/webcomponent/DockSpawnTsWebcomponent.js +209 -0
  167. package/lib/webcomponent/styles.d.ts +5 -0
  168. package/lib/webcomponent/styles.d.ts.map +1 -0
  169. package/lib/webcomponent/styles.js +537 -0
  170. package/package.json +36 -0
  171. package/src/BrowserDialogHelper.ts +76 -0
  172. package/src/ContainerType.ts +6 -0
  173. package/src/Dialog.ts +253 -0
  174. package/src/DockConfig.ts +15 -0
  175. package/src/DockGraphDeserializer.ts +129 -0
  176. package/src/DockGraphSerializer.ts +53 -0
  177. package/src/DockLayoutEngine.ts +370 -0
  178. package/src/DockManager.ts +880 -0
  179. package/src/DockManagerContext.ts +16 -0
  180. package/src/DockModel.ts +12 -0
  181. package/src/DockNode.ts +81 -0
  182. package/src/DockWheel.ts +215 -0
  183. package/src/DockWheelItem.ts +41 -0
  184. package/src/DocumentManagerContainer.ts +39 -0
  185. package/src/DocumentTabPage.ts +35 -0
  186. package/src/DraggableContainer.ts +177 -0
  187. package/src/EventHandler.ts +17 -0
  188. package/src/FillDockContainer.ts +98 -0
  189. package/src/HorizontalDockContainer.ts +13 -0
  190. package/src/PanelContainer.ts +596 -0
  191. package/src/Point.ts +10 -0
  192. package/src/ResizableContainer.ts +293 -0
  193. package/src/ResizeHandle.ts +59 -0
  194. package/src/SplitterBar.ts +157 -0
  195. package/src/SplitterDockContainer.ts +95 -0
  196. package/src/SplitterPanel.ts +228 -0
  197. package/src/TabHandle.ts +347 -0
  198. package/src/TabHost.ts +267 -0
  199. package/src/TabPage.ts +98 -0
  200. package/src/UndockInitiator.ts +181 -0
  201. package/src/Utils.ts +85 -0
  202. package/src/VerticalDockContainer.ts +13 -0
  203. package/src/enums/PanelType.ts +4 -0
  204. package/src/enums/TabHostDirection.ts +6 -0
  205. package/src/enums/WheelTypes.ts +14 -0
  206. package/src/i18n/Defaults.ts +20 -0
  207. package/src/i18n/Localizer.ts +23 -0
  208. package/src/index.ts +32 -0
  209. package/src/interfaces/IDockContainer.ts +27 -0
  210. package/src/interfaces/IDockContainerWithSize.ts +6 -0
  211. package/src/interfaces/ILayoutEventListener.ts +28 -0
  212. package/src/interfaces/IMouseOrTouchEvent.ts +6 -0
  213. package/src/interfaces/INodeInfo.ts +8 -0
  214. package/src/interfaces/IPanelInfo.ts +10 -0
  215. package/src/interfaces/IRectangle.ts +6 -0
  216. package/src/interfaces/ISize.ts +4 -0
  217. package/src/interfaces/IState.ts +12 -0
  218. package/src/interfaces/IThickness.ts +6 -0
  219. package/src/webcomponent/DockSpawnTsWebcomponent.ts +248 -0
  220. package/src/webcomponent/styles.ts +544 -0
  221. package/tsconfig.json +74 -0
  222. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,517 @@
1
+ import { Utils } from './Utils.js';
2
+ import { UndockInitiator } from './UndockInitiator.js';
3
+ import { ContainerType } from './ContainerType.js';
4
+ import { EventHandler } from './EventHandler.js';
5
+ import { PanelType } from './enums/PanelType.js';
6
+ import { Localizer } from './i18n/Localizer.js';
7
+ import { moveElementToNewBrowserWindow } from './BrowserDialogHelper.js';
8
+ /**
9
+ * This dock container wraps the specified element on a panel frame with a title bar and close button
10
+ */
11
+ export class PanelContainer {
12
+ closePanelContainerCallback;
13
+ onTitleChanged;
14
+ elementPanel;
15
+ elementTitle;
16
+ elementTitleText;
17
+ elementContentHost;
18
+ name;
19
+ state;
20
+ elementContent;
21
+ _resolvedElementContent;
22
+ elementContentContainer;
23
+ elementContentWrapper;
24
+ dockManager;
25
+ title;
26
+ containerType;
27
+ icon;
28
+ hasChanges;
29
+ minimumAllowedChildNodes;
30
+ isDialog;
31
+ eventListeners;
32
+ undockInitiator;
33
+ elementButtonClose;
34
+ closeButtonClickedHandler;
35
+ closeButtonTouchedHandler;
36
+ mouseDownHandler;
37
+ touchDownHandler;
38
+ panelType;
39
+ tabPage;
40
+ undockedToNewBrowserWindow = false;
41
+ contextMenuHandler;
42
+ lastDialogSize;
43
+ _floatingDialog;
44
+ _canUndock;
45
+ _cachedWidth;
46
+ _cachedHeight;
47
+ _hideCloseButton;
48
+ _grayOut;
49
+ _ctxMenu;
50
+ constructor(elementContent, dockManager, title, panelType, hideCloseButton, panelIcon) {
51
+ if (!title)
52
+ title = Localizer.getString('DefaultPanelName');
53
+ if (!panelType)
54
+ panelType = PanelType.panel;
55
+ this.panelType = panelType;
56
+ elementContent._dockSpawnPanelContainer = this;
57
+ this.elementContent = elementContent;
58
+ elementContent.style.position = 'absolute';
59
+ elementContent.style.width = '100%';
60
+ elementContent.style.height = '100%';
61
+ elementContent.style.top = '0';
62
+ elementContent.style.bottom = '0';
63
+ this.elementContentContainer = document.createElement('div');
64
+ this.elementContentContainer.className = 'panel-element-content-container';
65
+ this.elementContentContainer.style.position = 'absolute';
66
+ this.elementContentContainer._panel = this;
67
+ this.elementContentContainer.addEventListener('pointerdown', (e) => {
68
+ try {
69
+ if (this.isDialog)
70
+ this._floatingDialog.bringToFront();
71
+ else {
72
+ if (this.tabPage)
73
+ this.tabPage.setSelected(true, true);
74
+ }
75
+ this.dockManager.activePanel = this;
76
+ }
77
+ catch { }
78
+ }, { passive: true });
79
+ this.elementContentContainer.appendChild(elementContent);
80
+ dockManager.config.dialogRootElement.appendChild(this.elementContentContainer);
81
+ this.dockManager = dockManager;
82
+ this.title = title;
83
+ this.containerType = ContainerType.panel;
84
+ this.icon = panelIcon;
85
+ this.minimumAllowedChildNodes = 0;
86
+ this._floatingDialog = undefined;
87
+ this.isDialog = false;
88
+ this._canUndock = dockManager._undockEnabled;
89
+ this.eventListeners = [];
90
+ this._hideCloseButton = hideCloseButton;
91
+ this.windowsContextMenuClose = this.windowsContextMenuClose.bind(this);
92
+ this._initialize();
93
+ }
94
+ _initialize() {
95
+ this.name = Utils.getNextId('panel_');
96
+ this.elementPanel = document.createElement('div');
97
+ this.elementPanel.tabIndex = 0;
98
+ this.elementTitle = document.createElement('div');
99
+ this.contextMenuHandler = new EventHandler(this.elementTitle, 'contextmenu', this.oncontextMenuClicked.bind(this));
100
+ this.elementTitleText = document.createElement('div');
101
+ this.elementContentHost = document.createElement('div');
102
+ this.elementButtonClose = document.createElement('div');
103
+ this.elementPanel.appendChild(this.elementTitle);
104
+ this.elementTitle.appendChild(this.elementTitleText);
105
+ this.elementTitle.appendChild(this.elementButtonClose);
106
+ this.elementButtonClose.classList.add('panel-titlebar-button-close');
107
+ this.elementButtonClose.style.display = this._hideCloseButton ? 'none' : 'block';
108
+ this.elementPanel.appendChild(this.elementContentHost);
109
+ this.elementPanel.classList.add('panel-base');
110
+ this.elementTitle.classList.add('panel-titlebar');
111
+ this.elementTitle.classList.add('disable-selection');
112
+ this.elementTitleText.classList.add('panel-titlebar-text');
113
+ this.elementContentHost.classList.add('panel-content');
114
+ // set the size of the dialog elements based on the panel's size
115
+ const panelWidth = this.elementContentContainer.clientWidth;
116
+ const panelHeight = this.elementContentContainer.clientHeight;
117
+ const titleHeight = this.elementTitle.clientHeight;
118
+ this.elementContentWrapper = document.createElement('div');
119
+ this.elementContentWrapper.classList.add('panel-content-wrapper');
120
+ this._setPanelDimensions(panelWidth, panelHeight + titleHeight);
121
+ if (!this._hideCloseButton) {
122
+ this.closeButtonClickedHandler =
123
+ new EventHandler(this.elementButtonClose, 'mousedown', this.onCloseButtonClicked.bind(this));
124
+ this.closeButtonTouchedHandler =
125
+ new EventHandler(this.elementButtonClose, 'touchstart', this.onCloseButtonClicked.bind(this));
126
+ }
127
+ Utils.removeNode(this.elementContentWrapper);
128
+ this.elementContentHost.appendChild(this.elementContentWrapper);
129
+ // Extract the title from the content element's attribute
130
+ const contentTitle = this.elementContent.dataset.panelCaption;
131
+ if (contentTitle)
132
+ this.title = contentTitle;
133
+ this._updateTitle();
134
+ this.undockInitiator = new UndockInitiator(this.elementTitle, this.performUndockToDialog.bind(this));
135
+ delete this.floatingDialog;
136
+ this.mouseDownHandler = new EventHandler(this.elementPanel, 'mousedown', this.onMouseDown.bind(this));
137
+ this.touchDownHandler = new EventHandler(this.elementPanel, 'touchstart', this.onMouseDown.bind(this), { passive: true });
138
+ this._resolvedElementContent = this.elementContent;
139
+ if (this.elementContent instanceof HTMLSlotElement)
140
+ this._resolvedElementContent = this.elementContent.assignedElements()?.[0];
141
+ }
142
+ static createContextMenuContentCallback = (panelContainer) => {
143
+ const result = [];
144
+ if (panelContainer.dockManager.config.enableBrowserWindows) {
145
+ const btnNewBrowserWindow = document.createElement('div');
146
+ btnNewBrowserWindow.innerText = Localizer.getString('NewBrowserWindow');
147
+ result.push(btnNewBrowserWindow);
148
+ btnNewBrowserWindow.onclick = () => {
149
+ panelContainer.undockToBrowserDialog();
150
+ panelContainer.closeContextMenu();
151
+ };
152
+ }
153
+ return result;
154
+ };
155
+ oncontextMenuClicked(e) {
156
+ e.preventDefault();
157
+ if (!this._ctxMenu && PanelContainer.createContextMenuContentCallback) {
158
+ const menuItems = PanelContainer.createContextMenuContentCallback(this);
159
+ if (menuItems.length == 0)
160
+ return;
161
+ this._ctxMenu = document.createElement('div');
162
+ this._ctxMenu.className = 'dockspab-tab-handle-context-menu';
163
+ this._ctxMenu.append(...menuItems);
164
+ this._ctxMenu.style.left = e.pageX + 'px';
165
+ this._ctxMenu.style.top = e.pageY + 'px';
166
+ document.body.appendChild(this._ctxMenu);
167
+ window.addEventListener('mouseup', this.windowsContextMenuClose);
168
+ }
169
+ else
170
+ this.closeContextMenu();
171
+ }
172
+ closeContextMenu() {
173
+ if (this._ctxMenu) {
174
+ document.body.removeChild(this._ctxMenu);
175
+ delete this._ctxMenu;
176
+ window.removeEventListener('mouseup', this.windowsContextMenuClose);
177
+ }
178
+ }
179
+ windowsContextMenuClose(e) {
180
+ const cp = e.composedPath();
181
+ for (const i in cp) {
182
+ const el = cp[i];
183
+ if (el == this._ctxMenu)
184
+ return;
185
+ }
186
+ this.closeContextMenu();
187
+ }
188
+ canUndock(state) {
189
+ this._canUndock = state;
190
+ this.undockInitiator.enabled = state;
191
+ this.eventListeners.forEach((listener) => {
192
+ if (listener.onDockEnabled)
193
+ listener.onDockEnabled({ self: this, state: state });
194
+ });
195
+ }
196
+ addListener(listener) {
197
+ this.eventListeners.push(listener);
198
+ }
199
+ removeListener(listener) {
200
+ this.eventListeners.splice(this.eventListeners.indexOf(listener), 1);
201
+ }
202
+ get floatingDialog() {
203
+ return this._floatingDialog;
204
+ }
205
+ set floatingDialog(value) {
206
+ this._floatingDialog = value;
207
+ const canUndock = (this._floatingDialog === undefined);
208
+ this.undockInitiator.enabled = canUndock;
209
+ }
210
+ static async loadFromState(state, dockManager) {
211
+ let elementContent;
212
+ let title;
213
+ if (!dockManager.getElementCallback) {
214
+ const elementName = state.element;
215
+ elementContent = document.getElementById(elementName);
216
+ }
217
+ else {
218
+ const res = await dockManager.getElementCallback(state);
219
+ elementContent = res.element;
220
+ title = res.title;
221
+ }
222
+ if (elementContent === null)
223
+ return null;
224
+ const ret = new PanelContainer(elementContent, dockManager, title);
225
+ ret.loadState(state);
226
+ return ret;
227
+ }
228
+ saveState(state) {
229
+ state.panelIcon = this.icon;
230
+ state.element = this.elementContent.tagName === 'SLOT' ?
231
+ //@ts-ignore
232
+ this.elementContent.assignedElements()[0].getAttribute('dock-spawn-title') :
233
+ this.elementContent.id;
234
+ state.width = this.width;
235
+ state.height = this.height;
236
+ state.canUndock = this._canUndock;
237
+ state.hideCloseButton = this._hideCloseButton;
238
+ state.panelType = this.panelType;
239
+ }
240
+ loadState(state) {
241
+ this.width = state.width;
242
+ this.height = state.height;
243
+ this.state = { width: state.width, height: state.height };
244
+ this.canUndock(state.canUndock);
245
+ this.hideCloseButton(state.hideCloseButton);
246
+ this.panelType = state.panelType;
247
+ this.icon = state.panelIcon;
248
+ this._updateTitle();
249
+ }
250
+ setActiveChild( /*child*/) {
251
+ }
252
+ get containerElement() {
253
+ return this.elementPanel;
254
+ }
255
+ grayOut(show) {
256
+ if (!show && this._grayOut) {
257
+ this.elementContentWrapper.removeChild(this._grayOut);
258
+ this.elementButtonClose.style.display = this._hideCloseButton ? 'none' : 'block';
259
+ this._grayOut = null;
260
+ if (!this._hideCloseButton) {
261
+ this.eventListeners.forEach((listener) => {
262
+ if (listener.onHideCloseButton)
263
+ listener.onHideCloseButton({ self: this, state: this._hideCloseButton });
264
+ });
265
+ }
266
+ }
267
+ else if (show && !this._grayOut) {
268
+ this._grayOut = document.createElement('div');
269
+ this._grayOut.className = 'panel-grayout';
270
+ this.elementButtonClose.style.display = 'none';
271
+ this.elementContentWrapper.appendChild(this._grayOut);
272
+ this.eventListeners.forEach((listener) => {
273
+ if (listener.onHideCloseButton)
274
+ listener.onHideCloseButton({ self: this, state: true });
275
+ });
276
+ }
277
+ }
278
+ onMouseDown() {
279
+ this.dockManager.activePanel = this;
280
+ }
281
+ hideCloseButton(state) {
282
+ this._hideCloseButton = state;
283
+ this.elementButtonClose.style.display = state ? 'none' : 'block';
284
+ this.eventListeners.forEach((listener) => {
285
+ if (listener.onHideCloseButton)
286
+ listener.onHideCloseButton({ self: this, state: state });
287
+ });
288
+ }
289
+ destroy() {
290
+ if (this.mouseDownHandler) {
291
+ this.mouseDownHandler.cancel();
292
+ delete this.mouseDownHandler;
293
+ }
294
+ if (this.touchDownHandler) {
295
+ this.touchDownHandler.cancel();
296
+ delete this.touchDownHandler;
297
+ }
298
+ if (this.contextMenuHandler)
299
+ this.contextMenuHandler.cancel();
300
+ Utils.removeNode(this.elementPanel);
301
+ if (this.closeButtonClickedHandler) {
302
+ this.closeButtonClickedHandler.cancel();
303
+ delete this.closeButtonClickedHandler;
304
+ }
305
+ if (this.closeButtonTouchedHandler) {
306
+ this.closeButtonTouchedHandler.cancel();
307
+ delete this.closeButtonTouchedHandler;
308
+ }
309
+ }
310
+ /**
311
+ * Undocks the panel and and converts it to a dialog box
312
+ */
313
+ performUndockToDialog(e, dragOffset) {
314
+ this.isDialog = true;
315
+ this.undockInitiator.enabled = false;
316
+ this.elementContentWrapper.style.display = 'block';
317
+ this.elementPanel.style.position = '';
318
+ return this.dockManager.requestUndockToDialog(this, e, dragOffset);
319
+ }
320
+ /**
321
+ * Closes the panel
322
+ */
323
+ performClose() {
324
+ this.isDialog = true;
325
+ this.undockInitiator.enabled = false;
326
+ this.elementContentWrapper.style.display = 'block';
327
+ this.elementContentContainer.style.display = 'none';
328
+ this.elementPanel.style.position = '';
329
+ this.dockManager.requestClose(this);
330
+ }
331
+ /**
332
+ * Undocks the container and from the layout hierarchy
333
+ * The container would be removed from the DOM
334
+ */
335
+ performUndock() {
336
+ this.undockInitiator.enabled = false;
337
+ this.dockManager.requestUndock(this);
338
+ }
339
+ ;
340
+ prepareForDocking() {
341
+ this.isDialog = false;
342
+ this.undockInitiator.enabled = this._canUndock;
343
+ if (this.elementContentContainer.parentElement != this.dockManager.config.dialogRootElement)
344
+ this.dockManager.config.dialogRootElement.appendChild(this.elementContentContainer);
345
+ }
346
+ get width() {
347
+ return this._cachedWidth;
348
+ }
349
+ set width(value) {
350
+ if (value !== this._cachedWidth) {
351
+ this._cachedWidth = value;
352
+ this.elementPanel.style.width = value + 'px';
353
+ }
354
+ }
355
+ get height() {
356
+ return this._cachedHeight;
357
+ }
358
+ set height(value) {
359
+ if (value !== this._cachedHeight) {
360
+ this._cachedHeight = value;
361
+ this.elementPanel.style.height = value + 'px';
362
+ }
363
+ }
364
+ get resolvedElementContent() {
365
+ if (this._resolvedElementContent)
366
+ return this._resolvedElementContent;
367
+ this._resolvedElementContent = this.elementContent;
368
+ if (this.elementContent instanceof HTMLSlotElement)
369
+ this._resolvedElementContent = this.elementContent.assignedElements()?.[0];
370
+ return this._resolvedElementContent;
371
+ }
372
+ panelDocked() {
373
+ if (this.elementContent.hidden)
374
+ this.elementContent.hidden = false;
375
+ if (this.elementContentContainer.parentElement !== this.dockManager.config.dialogRootElement)
376
+ this.dockManager.config.dialogRootElement.appendChild(this.elementContentContainer);
377
+ }
378
+ resize(width, height) {
379
+ // if (this._cachedWidth === width && this._cachedHeight === height)
380
+ // {
381
+ // // Already in the desired size
382
+ // return;
383
+ // }
384
+ this.panelDocked();
385
+ this.setVisible(true);
386
+ this._setPanelDimensions(width, height);
387
+ this._cachedWidth = width;
388
+ this._cachedHeight = height;
389
+ try {
390
+ if (this.elementContent != undefined && (typeof this.elementContent.resizeHandler == 'function'))
391
+ this.elementContent.resizeHandler(width, height - this.elementTitle.clientHeight);
392
+ }
393
+ catch (err) {
394
+ console.log('error calling resizeHandler:', err, ' elt:', this.elementContent);
395
+ }
396
+ }
397
+ _setPanelDimensions(width, height) {
398
+ this.elementTitle.style.width = width + 'px';
399
+ this.elementContentHost.style.width = width + 'px';
400
+ this.elementContentContainer.style.width = width + 'px';
401
+ this.elementPanel.style.width = width + 'px';
402
+ const titleBarHeight = this.elementTitle.clientHeight;
403
+ const contentHeight = height - titleBarHeight;
404
+ this.elementContentHost.style.height = contentHeight + 'px';
405
+ this.elementContentContainer.style.height = contentHeight + 'px';
406
+ this.elementPanel.style.height = height + 'px';
407
+ //if (this.elementContentContainer.parentElement != this.dockManager.config.dialogRootElement)
408
+ // this.dockManager.config.dialogRootElement.appendChild(this.elementContentContainer);
409
+ const rect = this.elementContentWrapper.getBoundingClientRect();
410
+ const rootRect = this.dockManager.config.dialogRootElement.getBoundingClientRect();
411
+ this.elementContentContainer.style.left = (rect.x - rootRect.x) + 'px';
412
+ this.elementContentContainer.style.top = (rect.y - rootRect.y) + 'px';
413
+ this.elementContentContainer.style.width = rect.width + 'px';
414
+ this.elementContentContainer.style.height = rect.height + 'px';
415
+ }
416
+ setDialogPosition(x, y) {
417
+ this.elementContentContainer.style.left = x + 'px';
418
+ //todo, 25px if it is a dialog, is it always 25px? where do we know...
419
+ this.elementContentContainer.style.top = (y + this.elementTitle.clientHeight) + 'px';
420
+ }
421
+ setVisible(isVisible) {
422
+ this.elementContentContainer.style.display = isVisible ? 'block' : 'none';
423
+ }
424
+ setTitle(title) {
425
+ this.title = title;
426
+ this._updateTitle();
427
+ if (this.onTitleChanged)
428
+ this.onTitleChanged(this, title);
429
+ }
430
+ setTitleIcon(icon) {
431
+ this.icon = icon;
432
+ this._updateTitle();
433
+ if (this.onTitleChanged)
434
+ this.onTitleChanged(this, this.title);
435
+ }
436
+ setHasChanges(changes) {
437
+ this.hasChanges = changes;
438
+ this._updateTitle();
439
+ if (changes)
440
+ this.elementTitleText.classList.add('panel-has-changes');
441
+ else
442
+ this.elementTitleText.classList.remove('panel-has-changes');
443
+ if (this.onTitleChanged)
444
+ this.onTitleChanged(this, this.title);
445
+ }
446
+ setCloseIconTemplate(closeIconTemplate) {
447
+ this.elementButtonClose.innerHTML = closeIconTemplate;
448
+ }
449
+ _updateTitle() {
450
+ if (!!this.icon) {
451
+ this.elementTitleText.innerHTML = `<i class="grok-icon fal fa-${this.icon}" style="margin-right: 3px"></i><span>${this.title}</span>`;
452
+ return;
453
+ }
454
+ this.elementTitleText.innerHTML = this.title;
455
+ }
456
+ getRawTitle() {
457
+ return this.elementTitleText.innerHTML;
458
+ }
459
+ performLayout(children, relayoutEvenIfEqual) {
460
+ }
461
+ onCloseButtonClicked(e) {
462
+ e.preventDefault();
463
+ e.stopPropagation();
464
+ this.close();
465
+ }
466
+ undockToBrowserDialog() {
467
+ moveElementToNewBrowserWindow(this.resolvedElementContent, {
468
+ title: this.elementTitleText.textContent,
469
+ closeCallback: () => {
470
+ this.undockedToNewBrowserWindow = true;
471
+ this.closeInternal(false);
472
+ },
473
+ newWindowClosedCallback: () => {
474
+ this.undockedToNewBrowserWindow = false;
475
+ this.dockManager.notifyOnClosePanel(this);
476
+ },
477
+ focused: (e) => {
478
+ this.dockManager.activePanel = this;
479
+ },
480
+ blured: (e) => {
481
+ this.dockManager.activePanel = null;
482
+ },
483
+ });
484
+ }
485
+ async close() {
486
+ this.closeInternal(true);
487
+ }
488
+ async closeInternal(runCallback) {
489
+ let close = true;
490
+ if (this.elementContentContainer.parentElement === this.dockManager.config.dialogRootElement) {
491
+ if (!runCallback)
492
+ close = true;
493
+ else if (this.closePanelContainerCallback)
494
+ close = await this.closePanelContainerCallback(this);
495
+ else if (this.dockManager.closePanelContainerCallback)
496
+ close = await this.dockManager.closePanelContainerCallback(this);
497
+ if (close) {
498
+ this.dockManager.config.dialogRootElement.removeChild(this.elementContentContainer);
499
+ if (this.isDialog) {
500
+ if (this.floatingDialog) {
501
+ //this.floatingDialog.hide();
502
+ this.floatingDialog.close(); // fires onClose notification
503
+ }
504
+ }
505
+ else {
506
+ try {
507
+ this.dockManager.notifyOnClosePanel(this);
508
+ }
509
+ catch (err) {
510
+ console.error(err);
511
+ }
512
+ this.performClose();
513
+ }
514
+ }
515
+ }
516
+ }
517
+ }
package/lib/Point.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ export declare class Point {
2
+ x: number;
3
+ y: number;
4
+ constructor(x: number, y: number);
5
+ }
6
+ //# sourceMappingURL=Point.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Point.d.ts","sourceRoot":"","sources":["../src/Point.ts"],"names":[],"mappings":"AAAA,qBAAa,KAAK;IAEd,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;gBAEE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM;CAInC"}
package/lib/Point.js ADDED
@@ -0,0 +1,8 @@
1
+ export class Point {
2
+ x;
3
+ y;
4
+ constructor(x, y) {
5
+ this.x = x;
6
+ this.y = y;
7
+ }
8
+ }
@@ -0,0 +1,56 @@
1
+ import { Dialog } from "./Dialog.js";
2
+ import { ResizeHandle } from "./ResizeHandle.js";
3
+ import { DockManager } from "./DockManager.js";
4
+ import { IDockContainer } from "./interfaces/IDockContainer.js";
5
+ import { ContainerType } from "./ContainerType.js";
6
+ import { Point } from "./Point.js";
7
+ import { IThickness } from "./interfaces/IThickness.js";
8
+ import { IState } from "./interfaces/IState.js";
9
+ /**
10
+ * Decorates a dock container with resizer handles around its base element
11
+ * This enables the container to be resized from all directions
12
+ */
13
+ export declare class ResizableContainer implements IDockContainer {
14
+ topLevelElement: HTMLElement;
15
+ dialog: Dialog;
16
+ delegate: IDockContainer;
17
+ dockManager: DockManager;
18
+ containerElement: HTMLElement;
19
+ containerType: ContainerType;
20
+ minimumAllowedChildNodes: number;
21
+ readyToProcessNextResize: boolean;
22
+ dockSpawnResizedEvent: CustomEvent<{}>;
23
+ resizeHandles: ResizeHandle[];
24
+ previousMousePosition: Point;
25
+ private iframeEventHandlers;
26
+ private disableResize;
27
+ constructor(dialog: Dialog, delegate: IDockContainer, topLevelElement: HTMLElement, disableResize?: boolean);
28
+ setActiveChild(): void;
29
+ _buildResizeHandles(): void;
30
+ _buildResizeHandle(east: boolean, west: boolean, north: boolean, south: boolean): void;
31
+ saveState(state: IState): void;
32
+ loadState(state: IState): void;
33
+ get width(): number;
34
+ get height(): number;
35
+ get name(): string;
36
+ set name(value: string);
37
+ resize(width: number, height: number): void;
38
+ _adjustResizeHandles(width: number, height: number): void;
39
+ performLayout(children: any): void;
40
+ destroy(): void;
41
+ removeDecorator(): void;
42
+ onMouseMovedIframe(handle: any, e: MouseEvent, iframe: HTMLIFrameElement): void;
43
+ onMouseMoved(handle: ResizeHandle, event: TouchEvent | MouseEvent, iframeOffset?: {
44
+ x: number;
45
+ y: number;
46
+ }): void;
47
+ onMouseDown(handle: any, event: TouchEvent | MouseEvent): void;
48
+ onMouseUp(handle: any): void;
49
+ _performDrag(handle: any, dx: number, dy: number): void;
50
+ _resizeWest(dx: number, bounds: IThickness): void;
51
+ _resizeEast(dx: number, bounds: IThickness): void;
52
+ _resizeNorth(dy: number, bounds: IThickness): void;
53
+ _resizeSouth(dy: number, bounds: IThickness): void;
54
+ _resizeContainer(leftDelta: number, topDelta: number, widthDelta: number, heightDelta: number, bounds: IThickness): void;
55
+ }
56
+ //# sourceMappingURL=ResizableContainer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResizableContainer.d.ts","sourceRoot":"","sources":["../src/ResizableContainer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAEhD;;;GAGG;AACH,qBAAa,kBAAmB,YAAW,cAAc;IAErD,eAAe,EAAE,WAAW,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,cAAc,CAAC;IACzB,WAAW,EAAE,WAAW,CAAC;IACzB,gBAAgB,EAAE,WAAW,CAAC;IAC9B,aAAa,EAAE,aAAa,CAAC;IAC7B,wBAAwB,EAAE,MAAM,CAAC;IACjC,wBAAwB,EAAE,OAAO,CAAC;IAClC,qBAAqB,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;IACvC,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,qBAAqB,EAAE,KAAK,CAAC;IAC7B,OAAO,CAAC,mBAAmB,CAAiB;IAC5C,OAAO,CAAC,aAAa,CAAU;gBAEnB,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,GAAE,OAAe;IAiBlH,cAAc;IAGd,mBAAmB;IAenB,kBAAkB,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO;IA8B/E,SAAS,CAAC,KAAK,EAAE,MAAM;IAIvB,SAAS,CAAC,KAAK,EAAE,MAAM;IAIvB,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,IAAI,IAAI,WAEP;IACD,IAAI,IAAI,CAAC,KAAK,QAAA,EAGb;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAMpC,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAMlD,aAAa,CAAC,QAAQ,KAAA;IAItB,OAAO;IAKP,eAAe;IAGf,kBAAkB,CAAC,MAAM,KAAA,EAAE,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,iBAAiB;IAKnE,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,GAAG,UAAU,EAAE,YAAY,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE;IA8B1G,WAAW,CAAC,MAAM,KAAA,EAAE,KAAK,EAAE,UAAU,GAAG,UAAU;IAmDlD,SAAS,CAAC,MAAM,KAAA;IAiBhB,YAAY,CAAC,MAAM,KAAA,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;IAa3C,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU;IAI1C,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU;IAI1C,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU;IAI3C,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU;IAI3C,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU;CAgBpH"}