@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.
- package/LICENSE +21 -0
- package/README.md +24 -0
- package/dist/cjs/index.js +40 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/ts/config/config.js +870 -0
- package/dist/cjs/ts/config/config.js.map +1 -0
- package/dist/cjs/ts/config/resolved-config.js +477 -0
- package/dist/cjs/ts/config/resolved-config.js.map +1 -0
- package/dist/cjs/ts/container/component-container.js +412 -0
- package/dist/cjs/ts/container/component-container.js.map +1 -0
- package/dist/cjs/ts/controls/browser-popout.js +298 -0
- package/dist/cjs/ts/controls/browser-popout.js.map +1 -0
- package/dist/cjs/ts/controls/drag-proxy.js +221 -0
- package/dist/cjs/ts/controls/drag-proxy.js.map +1 -0
- package/dist/cjs/ts/controls/drag-source.js +149 -0
- package/dist/cjs/ts/controls/drag-source.js.map +1 -0
- package/dist/cjs/ts/controls/drop-target-indicator.js +31 -0
- package/dist/cjs/ts/controls/drop-target-indicator.js.map +1 -0
- package/dist/cjs/ts/controls/header-button.js +34 -0
- package/dist/cjs/ts/controls/header-button.js.map +1 -0
- package/dist/cjs/ts/controls/header.js +366 -0
- package/dist/cjs/ts/controls/header.js.map +1 -0
- package/dist/cjs/ts/controls/splitter.js +42 -0
- package/dist/cjs/ts/controls/splitter.js.map +1 -0
- package/dist/cjs/ts/controls/tab.js +262 -0
- package/dist/cjs/ts/controls/tab.js.map +1 -0
- package/dist/cjs/ts/controls/tabs-container.js +236 -0
- package/dist/cjs/ts/controls/tabs-container.js.map +1 -0
- package/dist/cjs/ts/controls/transition-indicator.js +64 -0
- package/dist/cjs/ts/controls/transition-indicator.js.map +1 -0
- package/dist/cjs/ts/errors/external-error.js +46 -0
- package/dist/cjs/ts/errors/external-error.js.map +1 -0
- package/dist/cjs/ts/errors/internal-error.js +38 -0
- package/dist/cjs/ts/errors/internal-error.js.map +1 -0
- package/dist/cjs/ts/golden-layout.js +299 -0
- package/dist/cjs/ts/golden-layout.js.map +1 -0
- package/dist/cjs/ts/items/component-item.js +190 -0
- package/dist/cjs/ts/items/component-item.js.map +1 -0
- package/dist/cjs/ts/items/component-parentable-item.js +18 -0
- package/dist/cjs/ts/items/component-parentable-item.js.map +1 -0
- package/dist/cjs/ts/items/content-item.js +414 -0
- package/dist/cjs/ts/items/content-item.js.map +1 -0
- package/dist/cjs/ts/items/ground-item.js +352 -0
- package/dist/cjs/ts/items/ground-item.js.map +1 -0
- package/dist/cjs/ts/items/row-or-column.js +609 -0
- package/dist/cjs/ts/items/row-or-column.js.map +1 -0
- package/dist/cjs/ts/items/stack.js +841 -0
- package/dist/cjs/ts/items/stack.js.map +1 -0
- package/dist/cjs/ts/layout-manager.js +1618 -0
- package/dist/cjs/ts/layout-manager.js.map +1 -0
- package/dist/cjs/ts/utils/config-minifier.js +218 -0
- package/dist/cjs/ts/utils/config-minifier.js.map +1 -0
- package/dist/cjs/ts/utils/dom-constants.js +3 -0
- package/dist/cjs/ts/utils/dom-constants.js.map +1 -0
- package/dist/cjs/ts/utils/drag-listener.js +132 -0
- package/dist/cjs/ts/utils/drag-listener.js.map +1 -0
- package/dist/cjs/ts/utils/event-emitter.js +201 -0
- package/dist/cjs/ts/utils/event-emitter.js.map +1 -0
- package/dist/cjs/ts/utils/event-hub.js +135 -0
- package/dist/cjs/ts/utils/event-hub.js.map +1 -0
- package/dist/cjs/ts/utils/i18n-strings.js +74 -0
- package/dist/cjs/ts/utils/i18n-strings.js.map +1 -0
- package/dist/cjs/ts/utils/jquery-legacy.js +15 -0
- package/dist/cjs/ts/utils/jquery-legacy.js.map +1 -0
- package/dist/cjs/ts/utils/style-constants.js +11 -0
- package/dist/cjs/ts/utils/style-constants.js.map +1 -0
- package/dist/cjs/ts/utils/types.js +94 -0
- package/dist/cjs/ts/utils/types.js.map +1 -0
- package/dist/cjs/ts/utils/utils.js +211 -0
- package/dist/cjs/ts/utils/utils.js.map +1 -0
- package/dist/cjs/ts/virtual-layout.js +247 -0
- package/dist/cjs/ts/virtual-layout.js.map +1 -0
- package/dist/css/goldenlayout-base.css +319 -0
- package/dist/css/themes/goldenlayout-borderless-dark-theme.css +136 -0
- package/dist/css/themes/goldenlayout-dark-theme.css +139 -0
- package/dist/css/themes/goldenlayout-light-theme.css +129 -0
- package/dist/css/themes/goldenlayout-soda-theme.css +126 -0
- package/dist/css/themes/goldenlayout-translucent-theme.css +152 -0
- package/dist/esm/index.js +21 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/ts/config/config.js +864 -0
- package/dist/esm/ts/config/config.js.map +1 -0
- package/dist/esm/ts/config/resolved-config.js +474 -0
- package/dist/esm/ts/config/resolved-config.js.map +1 -0
- package/dist/esm/ts/container/component-container.js +408 -0
- package/dist/esm/ts/container/component-container.js.map +1 -0
- package/dist/esm/ts/controls/browser-popout.js +294 -0
- package/dist/esm/ts/controls/browser-popout.js.map +1 -0
- package/dist/esm/ts/controls/drag-proxy.js +217 -0
- package/dist/esm/ts/controls/drag-proxy.js.map +1 -0
- package/dist/esm/ts/controls/drag-source.js +145 -0
- package/dist/esm/ts/controls/drag-source.js.map +1 -0
- package/dist/esm/ts/controls/drop-target-indicator.js +27 -0
- package/dist/esm/ts/controls/drop-target-indicator.js.map +1 -0
- package/dist/esm/ts/controls/header-button.js +30 -0
- package/dist/esm/ts/controls/header-button.js.map +1 -0
- package/dist/esm/ts/controls/header.js +362 -0
- package/dist/esm/ts/controls/header.js.map +1 -0
- package/dist/esm/ts/controls/splitter.js +38 -0
- package/dist/esm/ts/controls/splitter.js.map +1 -0
- package/dist/esm/ts/controls/tab.js +258 -0
- package/dist/esm/ts/controls/tab.js.map +1 -0
- package/dist/esm/ts/controls/tabs-container.js +232 -0
- package/dist/esm/ts/controls/tabs-container.js.map +1 -0
- package/dist/esm/ts/controls/transition-indicator.js +60 -0
- package/dist/esm/ts/controls/transition-indicator.js.map +1 -0
- package/dist/esm/ts/errors/external-error.js +38 -0
- package/dist/esm/ts/errors/external-error.js.map +1 -0
- package/dist/esm/ts/errors/internal-error.js +31 -0
- package/dist/esm/ts/errors/internal-error.js.map +1 -0
- package/dist/esm/ts/golden-layout.js +295 -0
- package/dist/esm/ts/golden-layout.js.map +1 -0
- package/dist/esm/ts/items/component-item.js +186 -0
- package/dist/esm/ts/items/component-item.js.map +1 -0
- package/dist/esm/ts/items/component-parentable-item.js +14 -0
- package/dist/esm/ts/items/component-parentable-item.js.map +1 -0
- package/dist/esm/ts/items/content-item.js +410 -0
- package/dist/esm/ts/items/content-item.js.map +1 -0
- package/dist/esm/ts/items/ground-item.js +348 -0
- package/dist/esm/ts/items/ground-item.js.map +1 -0
- package/dist/esm/ts/items/row-or-column.js +605 -0
- package/dist/esm/ts/items/row-or-column.js.map +1 -0
- package/dist/esm/ts/items/stack.js +837 -0
- package/dist/esm/ts/items/stack.js.map +1 -0
- package/dist/esm/ts/layout-manager.js +1614 -0
- package/dist/esm/ts/layout-manager.js.map +1 -0
- package/dist/esm/ts/utils/config-minifier.js +215 -0
- package/dist/esm/ts/utils/config-minifier.js.map +1 -0
- package/dist/esm/ts/utils/dom-constants.js +2 -0
- package/dist/esm/ts/utils/dom-constants.js.map +1 -0
- package/dist/esm/ts/utils/drag-listener.js +128 -0
- package/dist/esm/ts/utils/drag-listener.js.map +1 -0
- package/dist/esm/ts/utils/event-emitter.js +197 -0
- package/dist/esm/ts/utils/event-emitter.js.map +1 -0
- package/dist/esm/ts/utils/event-hub.js +131 -0
- package/dist/esm/ts/utils/event-hub.js.map +1 -0
- package/dist/esm/ts/utils/i18n-strings.js +71 -0
- package/dist/esm/ts/utils/i18n-strings.js.map +1 -0
- package/dist/esm/ts/utils/jquery-legacy.js +11 -0
- package/dist/esm/ts/utils/jquery-legacy.js.map +1 -0
- package/dist/esm/ts/utils/style-constants.js +8 -0
- package/dist/esm/ts/utils/style-constants.js.map +1 -0
- package/dist/esm/ts/utils/types.js +91 -0
- package/dist/esm/ts/utils/types.js.map +1 -0
- package/dist/esm/ts/utils/utils.js +191 -0
- package/dist/esm/ts/utils/utils.js.map +1 -0
- package/dist/esm/ts/virtual-layout.js +243 -0
- package/dist/esm/ts/virtual-layout.js.map +1 -0
- package/dist/img/lm_close_black.png +0 -0
- package/dist/img/lm_close_tab_white.png +0 -0
- package/dist/img/lm_close_white.png +0 -0
- package/dist/img/lm_maximise_black.png +0 -0
- package/dist/img/lm_maximise_white.png +0 -0
- package/dist/img/lm_minimize_black.png +0 -0
- package/dist/img/lm_minimize_white.png +0 -0
- package/dist/img/lm_popin_black.png +0 -0
- package/dist/img/lm_popin_white.png +0 -0
- package/dist/img/lm_popout_black.png +0 -0
- package/dist/img/lm_popout_white.png +0 -0
- package/dist/less/goldenlayout-base.less +422 -0
- package/dist/less/themes/goldenlayout-borderless-dark-theme.less +230 -0
- package/dist/less/themes/goldenlayout-dark-theme.less +233 -0
- package/dist/less/themes/goldenlayout-light-theme.less +223 -0
- package/dist/less/themes/goldenlayout-soda-theme.less +211 -0
- package/dist/less/themes/goldenlayout-translucent-theme.less +237 -0
- package/dist/scss/goldenlayout-base.scss +422 -0
- package/dist/scss/themes/_goldenlayout-var-theme.scss +232 -0
- package/dist/types/golden-layout-untrimmed.d.ts +3428 -0
- package/dist/types/index.d.ts +2246 -0
- package/dist/types/tsdoc-metadata.json +11 -0
- package/package.json +107 -0
- package/src/TOOLCHAIN.md +54 -0
- package/src/img/lm_close_black.png +0 -0
- package/src/img/lm_close_tab_white.png +0 -0
- package/src/img/lm_close_white.png +0 -0
- package/src/img/lm_maximise_black.png +0 -0
- package/src/img/lm_maximise_white.png +0 -0
- package/src/img/lm_minimize_black.png +0 -0
- package/src/img/lm_minimize_white.png +0 -0
- package/src/img/lm_popin_black.png +0 -0
- package/src/img/lm_popin_white.png +0 -0
- package/src/img/lm_popout_black.png +0 -0
- package/src/img/lm_popout_white.png +0 -0
- package/src/index.ts +21 -0
- package/src/less/goldenlayout-base.less +422 -0
- package/src/less/themes/goldenlayout-borderless-dark-theme.less +230 -0
- package/src/less/themes/goldenlayout-dark-theme.less +233 -0
- package/src/less/themes/goldenlayout-light-theme.less +223 -0
- package/src/less/themes/goldenlayout-soda-theme.less +211 -0
- package/src/less/themes/goldenlayout-translucent-theme.less +237 -0
- package/src/scss/goldenlayout-base.scss +422 -0
- package/src/scss/themes/_goldenlayout-var-theme.scss +232 -0
- package/src/ts/config/config.ts +1283 -0
- package/src/ts/config/resolved-config.ts +621 -0
- package/src/ts/container/component-container.ts +500 -0
- package/src/ts/controls/browser-popout.ts +325 -0
- package/src/ts/controls/drag-proxy.ts +259 -0
- package/src/ts/controls/drag-source.ts +167 -0
- package/src/ts/controls/drop-target-indicator.ts +35 -0
- package/src/ts/controls/header-button.ts +39 -0
- package/src/ts/controls/header.ts +483 -0
- package/src/ts/controls/splitter.ts +50 -0
- package/src/ts/controls/tab.ts +293 -0
- package/src/ts/controls/tabs-container.ts +281 -0
- package/src/ts/controls/transition-indicator.ts +78 -0
- package/src/ts/errors/external-error.ts +39 -0
- package/src/ts/errors/internal-error.ts +34 -0
- package/src/ts/golden-layout.ts +365 -0
- package/src/ts/items/component-item.ts +252 -0
- package/src/ts/items/component-parentable-item.ts +16 -0
- package/src/ts/items/content-item.ts +513 -0
- package/src/ts/items/ground-item.ts +404 -0
- package/src/ts/items/row-or-column.ts +707 -0
- package/src/ts/items/stack.ts +975 -0
- package/src/ts/layout-manager.ts +1862 -0
- package/src/ts/utils/config-minifier.ts +235 -0
- package/src/ts/utils/dom-constants.ts +44 -0
- package/src/ts/utils/drag-listener.ts +178 -0
- package/src/ts/utils/event-emitter.ts +275 -0
- package/src/ts/utils/event-hub.ts +163 -0
- package/src/ts/utils/i18n-strings.ts +96 -0
- package/src/ts/utils/jquery-legacy.ts +12 -0
- package/src/ts/utils/style-constants.ts +6 -0
- package/src/ts/utils/types.ts +145 -0
- package/src/ts/utils/utils.ts +206 -0
- package/src/ts/virtual-layout.ts +328 -0
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
import { ResolvedLayoutConfig } from '../config/resolved-config';
|
|
2
|
+
import { PopoutBlockedError } from '../errors/external-error';
|
|
3
|
+
import { UnexpectedNullError, UnexpectedUndefinedError } from '../errors/internal-error';
|
|
4
|
+
import { EventEmitter } from '../utils/event-emitter';
|
|
5
|
+
import { deepExtend, getErrorMessage, getUniqueId } from '../utils/utils';
|
|
6
|
+
/**
|
|
7
|
+
* Pops a content item out into a new browser window.
|
|
8
|
+
* This is achieved by
|
|
9
|
+
*
|
|
10
|
+
* - Creating a new configuration with the content item as root element
|
|
11
|
+
* - Serializing and minifying the configuration
|
|
12
|
+
* - Opening the current window's URL with the configuration as a GET parameter
|
|
13
|
+
* - GoldenLayout when opened in the new window will look for the GET parameter
|
|
14
|
+
* and use it instead of the provided configuration
|
|
15
|
+
* @public
|
|
16
|
+
*/
|
|
17
|
+
export class BrowserPopout extends EventEmitter {
|
|
18
|
+
/**
|
|
19
|
+
* @param _config - GoldenLayout item config
|
|
20
|
+
* @param _initialWindowSize - A map with width, height, top and left
|
|
21
|
+
* @internal
|
|
22
|
+
*/
|
|
23
|
+
constructor(
|
|
24
|
+
/** @internal */
|
|
25
|
+
_config,
|
|
26
|
+
/** @internal */
|
|
27
|
+
_initialWindowSize,
|
|
28
|
+
/** @internal */
|
|
29
|
+
_layoutManager) {
|
|
30
|
+
super();
|
|
31
|
+
this._config = _config;
|
|
32
|
+
this._initialWindowSize = _initialWindowSize;
|
|
33
|
+
this._layoutManager = _layoutManager;
|
|
34
|
+
this._isInitialised = false;
|
|
35
|
+
this._popoutWindow = null;
|
|
36
|
+
this.createWindow();
|
|
37
|
+
}
|
|
38
|
+
toConfig() {
|
|
39
|
+
var _a, _b;
|
|
40
|
+
if (this._isInitialised === false) {
|
|
41
|
+
throw new Error('Can\'t create config, layout not yet initialised');
|
|
42
|
+
}
|
|
43
|
+
const glInstance = this.getGlInstance();
|
|
44
|
+
const glInstanceConfig = glInstance.saveLayout();
|
|
45
|
+
let left;
|
|
46
|
+
let top;
|
|
47
|
+
if (this._popoutWindow === null) {
|
|
48
|
+
left = null;
|
|
49
|
+
top = null;
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
left = (_a = this._popoutWindow.screenX) !== null && _a !== void 0 ? _a : this._popoutWindow.screenLeft;
|
|
53
|
+
top = (_b = this._popoutWindow.screenY) !== null && _b !== void 0 ? _b : this._popoutWindow.screenTop;
|
|
54
|
+
}
|
|
55
|
+
const window = {
|
|
56
|
+
width: this.getGlInstance().width,
|
|
57
|
+
height: this.getGlInstance().height,
|
|
58
|
+
left,
|
|
59
|
+
top,
|
|
60
|
+
};
|
|
61
|
+
const config = {
|
|
62
|
+
root: glInstanceConfig.root,
|
|
63
|
+
openPopouts: glInstanceConfig.openPopouts,
|
|
64
|
+
settings: glInstanceConfig.settings,
|
|
65
|
+
dimensions: glInstanceConfig.dimensions,
|
|
66
|
+
header: glInstanceConfig.header,
|
|
67
|
+
window,
|
|
68
|
+
parentId: this._config.parentId,
|
|
69
|
+
indexInParent: this._config.indexInParent,
|
|
70
|
+
resolved: true,
|
|
71
|
+
};
|
|
72
|
+
return config;
|
|
73
|
+
}
|
|
74
|
+
getGlInstance() {
|
|
75
|
+
if (this._popoutWindow === null) {
|
|
76
|
+
throw new UnexpectedNullError('BPGGI24693');
|
|
77
|
+
}
|
|
78
|
+
return this._popoutWindow.__glInstance;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Retrieves the native BrowserWindow backing this popout.
|
|
82
|
+
* Might throw an UnexpectedNullError exception when the window is not initialized yet.
|
|
83
|
+
* @public
|
|
84
|
+
*/
|
|
85
|
+
getWindow() {
|
|
86
|
+
if (this._popoutWindow === null) {
|
|
87
|
+
throw new UnexpectedNullError('BPGW087215');
|
|
88
|
+
}
|
|
89
|
+
return this._popoutWindow;
|
|
90
|
+
}
|
|
91
|
+
close() {
|
|
92
|
+
if (this.getGlInstance()) {
|
|
93
|
+
this.getGlInstance().closeWindow();
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
try {
|
|
97
|
+
this.getWindow().close();
|
|
98
|
+
}
|
|
99
|
+
catch (e) {
|
|
100
|
+
//
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Returns the popped out item to its original position. If the original
|
|
106
|
+
* parent isn't available anymore it falls back to the layout's topmost element
|
|
107
|
+
*/
|
|
108
|
+
popIn() {
|
|
109
|
+
let parentItem;
|
|
110
|
+
let index = this._config.indexInParent;
|
|
111
|
+
if (!this._config.parentId) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
/*
|
|
115
|
+
* The deepExtend call seems a bit pointless, but it's crucial to
|
|
116
|
+
* copy the config returned by this.getGlInstance().toConfig()
|
|
117
|
+
* onto a new object. Internet Explorer keeps the references
|
|
118
|
+
* to objects on the child window, resulting in the following error
|
|
119
|
+
* once the child window is closed:
|
|
120
|
+
*
|
|
121
|
+
* The callee (server [not server application]) is not available and disappeared
|
|
122
|
+
*/
|
|
123
|
+
const glInstanceLayoutConfig = this.getGlInstance().saveLayout();
|
|
124
|
+
const copiedGlInstanceLayoutConfig = deepExtend({}, glInstanceLayoutConfig);
|
|
125
|
+
const copiedRoot = copiedGlInstanceLayoutConfig.root;
|
|
126
|
+
if (copiedRoot === undefined) {
|
|
127
|
+
throw new UnexpectedUndefinedError('BPPIR19998');
|
|
128
|
+
}
|
|
129
|
+
const groundItem = this._layoutManager.groundItem;
|
|
130
|
+
if (groundItem === undefined) {
|
|
131
|
+
throw new UnexpectedUndefinedError('BPPIG34972');
|
|
132
|
+
}
|
|
133
|
+
parentItem = groundItem.getItemsByPopInParentId(this._config.parentId)[0];
|
|
134
|
+
/*
|
|
135
|
+
* Fallback if parentItem is not available. Either add it to the topmost
|
|
136
|
+
* item or make it the topmost item if the layout is empty
|
|
137
|
+
*/
|
|
138
|
+
if (!parentItem) {
|
|
139
|
+
if (groundItem.contentItems.length > 0) {
|
|
140
|
+
parentItem = groundItem.contentItems[0];
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
parentItem = groundItem;
|
|
144
|
+
}
|
|
145
|
+
index = 0;
|
|
146
|
+
}
|
|
147
|
+
const newContentItem = this._layoutManager.createAndInitContentItem(copiedRoot, parentItem);
|
|
148
|
+
parentItem.addChild(newContentItem, index);
|
|
149
|
+
if (this._layoutManager.layoutConfig.settings.popInOnClose) {
|
|
150
|
+
this._onClose();
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
this.close();
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Creates the URL and window parameter
|
|
158
|
+
* and opens a new window
|
|
159
|
+
* @internal
|
|
160
|
+
*/
|
|
161
|
+
createWindow() {
|
|
162
|
+
const url = this.createUrl();
|
|
163
|
+
/**
|
|
164
|
+
* Bogus title to prevent re-usage of existing window with the
|
|
165
|
+
* same title. The actual title will be set by the new window's
|
|
166
|
+
* GoldenLayout instance if it detects that it is in subWindowMode
|
|
167
|
+
*/
|
|
168
|
+
const target = Math.floor(Math.random() * 1000000).toString(36);
|
|
169
|
+
/**
|
|
170
|
+
* The options as used in the window.open string
|
|
171
|
+
*/
|
|
172
|
+
const features = this.serializeWindowFeatures({
|
|
173
|
+
width: this._initialWindowSize.width,
|
|
174
|
+
height: this._initialWindowSize.height,
|
|
175
|
+
innerWidth: this._initialWindowSize.width,
|
|
176
|
+
innerHeight: this._initialWindowSize.height,
|
|
177
|
+
menubar: 'no',
|
|
178
|
+
toolbar: 'no',
|
|
179
|
+
location: 'no',
|
|
180
|
+
personalbar: 'no',
|
|
181
|
+
resizable: 'yes',
|
|
182
|
+
scrollbars: 'no',
|
|
183
|
+
status: 'no'
|
|
184
|
+
});
|
|
185
|
+
this._popoutWindow = globalThis.open(url, target, features);
|
|
186
|
+
if (!this._popoutWindow) {
|
|
187
|
+
if (this._layoutManager.layoutConfig.settings.blockedPopoutsThrowError === true) {
|
|
188
|
+
const error = new PopoutBlockedError('Popout blocked');
|
|
189
|
+
throw error;
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
this._popoutWindow.addEventListener('load', () => this.positionWindow(), { passive: true });
|
|
196
|
+
this._popoutWindow.addEventListener('beforeunload', () => {
|
|
197
|
+
if (this._layoutManager.layoutConfig.settings.popInOnClose) {
|
|
198
|
+
this.popIn();
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
this._onClose();
|
|
202
|
+
}
|
|
203
|
+
}, { passive: true });
|
|
204
|
+
/**
|
|
205
|
+
* Polling the childwindow to find out if GoldenLayout has been initialised
|
|
206
|
+
* doesn't seem optimal, but the alternatives - adding a callback to the parent
|
|
207
|
+
* window or raising an event on the window object - both would introduce knowledge
|
|
208
|
+
* about the parent to the child window which we'd rather avoid
|
|
209
|
+
*/
|
|
210
|
+
this._checkReadyInterval = setInterval(() => this.checkReady(), 10);
|
|
211
|
+
}
|
|
212
|
+
/** @internal */
|
|
213
|
+
checkReady() {
|
|
214
|
+
if (this._popoutWindow === null) {
|
|
215
|
+
throw new UnexpectedNullError('BPCR01844');
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
if (this._popoutWindow.__glInstance && this._popoutWindow.__glInstance.isInitialised) {
|
|
219
|
+
this.onInitialised();
|
|
220
|
+
if (this._checkReadyInterval !== undefined) {
|
|
221
|
+
clearInterval(this._checkReadyInterval);
|
|
222
|
+
this._checkReadyInterval = undefined;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Serialises a map of key:values to a window options string
|
|
229
|
+
*
|
|
230
|
+
* @param windowOptions -
|
|
231
|
+
*
|
|
232
|
+
* @returns serialised window options
|
|
233
|
+
* @internal
|
|
234
|
+
*/
|
|
235
|
+
serializeWindowFeatures(windowOptions) {
|
|
236
|
+
const windowOptionsString = [];
|
|
237
|
+
for (const key in windowOptions) {
|
|
238
|
+
windowOptionsString.push(key + '=' + windowOptions[key].toString());
|
|
239
|
+
}
|
|
240
|
+
return windowOptionsString.join(',');
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Creates the URL for the new window, including the
|
|
244
|
+
* config GET parameter
|
|
245
|
+
*
|
|
246
|
+
* @returns URL
|
|
247
|
+
* @internal
|
|
248
|
+
*/
|
|
249
|
+
createUrl() {
|
|
250
|
+
const storageKey = 'gl-window-config-' + getUniqueId();
|
|
251
|
+
const config = ResolvedLayoutConfig.minifyConfig(this._config);
|
|
252
|
+
try {
|
|
253
|
+
localStorage.setItem(storageKey, JSON.stringify(config));
|
|
254
|
+
}
|
|
255
|
+
catch (e) {
|
|
256
|
+
throw new Error('Error while writing to localStorage ' + getErrorMessage(e));
|
|
257
|
+
}
|
|
258
|
+
const url = new URL(location.href);
|
|
259
|
+
url.searchParams.set('gl-window', storageKey);
|
|
260
|
+
return url.toString();
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Move the newly created window roughly to
|
|
264
|
+
* where the component used to be.
|
|
265
|
+
* @internal
|
|
266
|
+
*/
|
|
267
|
+
positionWindow() {
|
|
268
|
+
if (this._popoutWindow === null) {
|
|
269
|
+
throw new Error('BrowserPopout.positionWindow: null popoutWindow');
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
this._popoutWindow.moveTo(this._initialWindowSize.left, this._initialWindowSize.top);
|
|
273
|
+
this._popoutWindow.focus();
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Callback when the new window is opened and the GoldenLayout instance
|
|
278
|
+
* within it is initialised
|
|
279
|
+
* @internal
|
|
280
|
+
*/
|
|
281
|
+
onInitialised() {
|
|
282
|
+
this._isInitialised = true;
|
|
283
|
+
this.getGlInstance().on('popIn', () => this.popIn());
|
|
284
|
+
this.emit('initialised');
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Invoked 50ms after the window unload event
|
|
288
|
+
* @internal
|
|
289
|
+
*/
|
|
290
|
+
_onClose() {
|
|
291
|
+
setTimeout(() => this.emit('closed'), 50);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
//# sourceMappingURL=browser-popout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-popout.js","sourceRoot":"","sources":["../../../../src/ts/controls/browser-popout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAA8B,MAAM,2BAA2B,CAAC;AAC7F,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAGzF,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtD,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE1E;;;;;;;;;;GAUG;AAEH,MAAM,OAAO,aAAc,SAAQ,YAAY;IAQ3C;;;;OAIG;IACH;IACI,gBAAgB;IACR,OAAmC;IAC3C,gBAAgB;IACR,kBAAwB;IAChC,gBAAgB;IACR,cAA6B;QAErC,KAAK,EAAE,CAAC;QANA,YAAO,GAAP,OAAO,CAA4B;QAEnC,uBAAkB,GAAlB,kBAAkB,CAAM;QAExB,mBAAc,GAAd,cAAc,CAAe;QAIrC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,YAAY,EAAE,CAAC;IACxB,CAAC;IAED,QAAQ;;QACJ,IAAI,IAAI,CAAC,cAAc,KAAK,KAAK,EAAE;YAC/B,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;SACvE;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACxC,MAAM,gBAAgB,GAAG,UAAU,CAAC,UAAU,EAAE,CAAC;QAEjD,IAAI,IAAmB,CAAC;QACxB,IAAI,GAAkB,CAAC;QACvB,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,EAAE;YAC7B,IAAI,GAAG,IAAI,CAAC;YACZ,GAAG,GAAG,IAAI,CAAC;SACd;aAAM;YACH,IAAI,GAAG,MAAA,IAAI,CAAC,aAAa,CAAC,OAAO,mCAAI,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC;YACnE,GAAG,GAAG,MAAA,IAAI,CAAC,aAAa,CAAC,OAAO,mCAAI,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC;SACpE;QAED,MAAM,MAAM,GAAsC;YAC9C,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,KAAK;YACjC,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM;YACnC,IAAI;YACJ,GAAG;SACN,CAAC;QAEF,MAAM,MAAM,GAA+B;YACvC,IAAI,EAAE,gBAAgB,CAAC,IAAI;YAC3B,WAAW,EAAE,gBAAgB,CAAC,WAAW;YACzC,QAAQ,EAAE,gBAAgB,CAAC,QAAQ;YACnC,UAAU,EAAE,gBAAgB,CAAC,UAAU;YACvC,MAAM,EAAE,gBAAgB,CAAC,MAAM;YAC/B,MAAM;YACN,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ;YAC/B,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa;YACzC,QAAQ,EAAE,IAAI;SACjB,CAAC;QAEF,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,aAAa;QACT,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,EAAE;YAC7B,MAAM,IAAI,mBAAmB,CAAC,YAAY,CAAC,CAAC;SAC/C;QACD,OAAO,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC;IAC3C,CAAC;IAED;;;;OAIG;IACH,SAAS;QACL,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,EAAE;YAC7B,MAAM,IAAI,mBAAmB,CAAC,YAAY,CAAC,CAAC;SAC/C;QACD,OAAO,IAAI,CAAC,aAAa,CAAC;IAC9B,CAAC;IAED,KAAK;QACD,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE;YACtB,IAAI,CAAC,aAAa,EAAE,CAAC,WAAW,EAAE,CAAC;SACtC;aAAM;YACH,IAAI;gBACA,IAAI,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC;aAC5B;YAAC,OAAO,CAAC,EAAE;gBACR,EAAE;aACL;SACJ;IACL,CAAC;IAED;;;OAGG;IACH,KAAK;QACD,IAAI,UAAuB,CAAC;QAC5B,IAAI,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;QAEvC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE;YACxB,OAAO;SACV;QAED;;;;;;;;UAQE;QACF,MAAM,sBAAsB,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,UAAU,EAAE,CAAC;QACjE,MAAM,4BAA4B,GAAG,UAAU,CAAC,EAAE,EAAE,sBAAsB,CAAyB,CAAC;QACpG,MAAM,UAAU,GAAG,4BAA4B,CAAC,IAAI,CAAC;QACrD,IAAI,UAAU,KAAK,SAAS,EAAE;YAC1B,MAAM,IAAI,wBAAwB,CAAC,YAAY,CAAC,CAAC;SACpD;QACD,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC;QAClD,IAAI,UAAU,KAAK,SAAS,EAAE;YAC1B,MAAM,IAAI,wBAAwB,CAAC,YAAY,CAAC,CAAC;SACpD;QACD,UAAU,GAAG,UAAU,CAAC,uBAAuB,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAE1E;;;UAGE;QACF,IAAI,CAAC,UAAU,EAAE;YACb,IAAI,UAAU,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;gBACpC,UAAU,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;aAC3C;iBAAM;gBACH,UAAU,GAAG,UAAU,CAAC;aAC3B;YACD,KAAK,GAAG,CAAC,CAAC;SACb;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,wBAAwB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAE5F,UAAU,CAAC,QAAQ,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;QAC3C,IAAI,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,QAAQ,CAAC,YAAY,EAAE;YACxD,IAAI,CAAC,QAAQ,EAAE,CAAC;SACnB;aAAM;YACH,IAAI,CAAC,KAAK,EAAE,CAAC;SAChB;IACL,CAAC;IAED;;;;OAIG;IACK,YAAY;QAChB,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAE7B;;;;WAIG;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAEhE;;WAEG;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,uBAAuB,CAAC;YAC1C,KAAK,EAAE,IAAI,CAAC,kBAAkB,CAAC,KAAK;YACpC,MAAM,EAAE,IAAI,CAAC,kBAAkB,CAAC,MAAM;YACtC,UAAU,EAAE,IAAI,CAAC,kBAAkB,CAAC,KAAK;YACzC,WAAW,EAAE,IAAI,CAAC,kBAAkB,CAAC,MAAM;YAC3C,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,IAAI;YACjB,SAAS,EAAE,KAAK;YAChB,UAAU,EAAE,IAAI;YAChB,MAAM,EAAE,IAAI;SACf,CAAC,CAAC;QAEH,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QAE5D,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;YACrB,IAAI,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,QAAQ,CAAC,wBAAwB,KAAK,IAAI,EAAE;gBAC7E,MAAM,KAAK,GAAG,IAAI,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;gBACvD,MAAM,KAAK,CAAC;aACf;iBAAM;gBACH,OAAO;aACV;SACJ;QAED,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;QAC3F,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,cAAc,EAAE,GAAG,EAAE;YACrD,IAAI,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,QAAQ,CAAC,YAAY,EAAE;gBACxD,IAAI,CAAC,KAAK,EAAE,CAAC;aAChB;iBAAM;gBACH,IAAI,CAAC,QAAQ,EAAE,CAAC;aACnB;QACL,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;QAErB;;;;;WAKG;QACH,IAAI,CAAC,mBAAmB,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,gBAAgB;IACR,UAAU;QACd,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,EAAE;YAC7B,MAAM,IAAI,mBAAmB,CAAC,WAAW,CAAC,CAAC;SAC9C;aAAM;YACH,IAAI,IAAI,CAAC,aAAa,CAAC,YAAY,IAAI,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,aAAa,EAAE;gBAClF,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,IAAI,IAAI,CAAC,mBAAmB,KAAK,SAAS,EAAE;oBACxC,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;oBACxC,IAAI,CAAC,mBAAmB,GAAG,SAAS,CAAC;iBACxC;aACJ;SACJ;IACL,CAAC;IAED;;;;;;;OAOG;IACK,uBAAuB,CAAC,aAA8C;QAC1E,MAAM,mBAAmB,GAAa,EAAE,CAAC;QAEzC,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE;YAC7B,mBAAmB,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;SACvE;QAED,OAAO,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzC,CAAC;IAED;;;;;;OAMG;IACK,SAAS;QACb,MAAM,UAAU,GAAG,mBAAmB,GAAG,WAAW,EAAE,CAAC;QACvD,MAAM,MAAM,GAAG,oBAAoB,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE/D,IAAI;YACA,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;SAC5D;QAAC,OAAO,CAAC,EAAE;YACR,MAAM,IAAI,KAAK,CAAC,sCAAsC,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;SAChF;QAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACnC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QAC9C,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;IAC1B,CAAC;IAED;;;;OAIG;IACK,cAAc;QAClB,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,EAAE;YAC7B,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;SACtE;aAAM;YACH,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;YACrF,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;SAC9B;IACL,CAAC;IAED;;;;OAIG;IACK,aAAa;QACjB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACrD,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACK,QAAQ;QACZ,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9C,CAAC;CACJ"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import { UnexpectedNullError, UnexpectedUndefinedError } from '../errors/internal-error';
|
|
2
|
+
import { Stack } from '../items/stack';
|
|
3
|
+
import { EventEmitter } from '../utils/event-emitter';
|
|
4
|
+
import { Side } from '../utils/types';
|
|
5
|
+
import { numberToPixels } from '../utils/utils';
|
|
6
|
+
/**
|
|
7
|
+
* This class creates a temporary container
|
|
8
|
+
* for the component whilst it is being dragged
|
|
9
|
+
* and handles drag events
|
|
10
|
+
* @internal
|
|
11
|
+
*/
|
|
12
|
+
export class DragProxy extends EventEmitter {
|
|
13
|
+
/**
|
|
14
|
+
* @param x - The initial x position
|
|
15
|
+
* @param y - The initial y position
|
|
16
|
+
* @internal
|
|
17
|
+
*/
|
|
18
|
+
constructor(x, y, _dragListener, _layoutManager, _componentItem, _originalParent) {
|
|
19
|
+
super();
|
|
20
|
+
this._dragListener = _dragListener;
|
|
21
|
+
this._layoutManager = _layoutManager;
|
|
22
|
+
this._componentItem = _componentItem;
|
|
23
|
+
this._originalParent = _originalParent;
|
|
24
|
+
this._area = null;
|
|
25
|
+
this._lastValidArea = null;
|
|
26
|
+
this._dragListener.on('drag', (offsetX, offsetY, event) => this.onDrag(offsetX, offsetY, event));
|
|
27
|
+
this._dragListener.on('dragStop', () => this.onDrop());
|
|
28
|
+
this.createDragProxyElements(x, y);
|
|
29
|
+
if (this._componentItem.parent === null) {
|
|
30
|
+
// Note that _contentItem will have dummy GroundItem as parent if initiated by a external drag source
|
|
31
|
+
throw new UnexpectedNullError('DPC10097');
|
|
32
|
+
}
|
|
33
|
+
this._componentItemFocused = this._componentItem.focused;
|
|
34
|
+
if (this._componentItemFocused) {
|
|
35
|
+
this._componentItem.blur();
|
|
36
|
+
}
|
|
37
|
+
this._componentItem.parent.removeChild(this._componentItem, true);
|
|
38
|
+
this.setDimensions();
|
|
39
|
+
document.body.appendChild(this._element);
|
|
40
|
+
this.determineMinMaxXY();
|
|
41
|
+
this._layoutManager.calculateItemAreas();
|
|
42
|
+
this.setDropPosition(x, y);
|
|
43
|
+
}
|
|
44
|
+
get element() { return this._element; }
|
|
45
|
+
/** Create Stack-like structure to contain the dragged component */
|
|
46
|
+
createDragProxyElements(initialX, initialY) {
|
|
47
|
+
this._element = document.createElement('div');
|
|
48
|
+
this._element.classList.add("lm_dragProxy" /* DomConstants.ClassName.DragProxy */);
|
|
49
|
+
const headerElement = document.createElement('div');
|
|
50
|
+
headerElement.classList.add("lm_header" /* DomConstants.ClassName.Header */);
|
|
51
|
+
const tabsElement = document.createElement('div');
|
|
52
|
+
tabsElement.classList.add("lm_tabs" /* DomConstants.ClassName.Tabs */);
|
|
53
|
+
const tabElement = document.createElement('div');
|
|
54
|
+
tabElement.classList.add("lm_tab" /* DomConstants.ClassName.Tab */);
|
|
55
|
+
const titleElement = document.createElement('span');
|
|
56
|
+
titleElement.classList.add("lm_title" /* DomConstants.ClassName.Title */);
|
|
57
|
+
tabElement.appendChild(titleElement);
|
|
58
|
+
tabsElement.appendChild(tabElement);
|
|
59
|
+
headerElement.appendChild(tabsElement);
|
|
60
|
+
this._proxyContainerElement = document.createElement('div');
|
|
61
|
+
this._proxyContainerElement.classList.add("lm_content" /* DomConstants.ClassName.Content */);
|
|
62
|
+
this._element.appendChild(headerElement);
|
|
63
|
+
this._element.appendChild(this._proxyContainerElement);
|
|
64
|
+
if (this._originalParent instanceof Stack && this._originalParent.headerShow) {
|
|
65
|
+
this._sided = this._originalParent.headerLeftRightSided;
|
|
66
|
+
this._element.classList.add('lm_' + this._originalParent.headerSide);
|
|
67
|
+
if ([Side.right, Side.bottom].indexOf(this._originalParent.headerSide) >= 0) {
|
|
68
|
+
this._proxyContainerElement.insertAdjacentElement('afterend', headerElement);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
this._element.style.left = numberToPixels(initialX);
|
|
72
|
+
this._element.style.top = numberToPixels(initialY);
|
|
73
|
+
tabElement.setAttribute('title', this._componentItem.title);
|
|
74
|
+
titleElement.insertAdjacentText('afterbegin', this._componentItem.title);
|
|
75
|
+
this._proxyContainerElement.appendChild(this._componentItem.element);
|
|
76
|
+
}
|
|
77
|
+
determineMinMaxXY() {
|
|
78
|
+
const groundItem = this._layoutManager.groundItem;
|
|
79
|
+
if (groundItem === undefined) {
|
|
80
|
+
throw new UnexpectedUndefinedError('DPDMMXY73109');
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
const groundElement = groundItem.element;
|
|
84
|
+
const rect = groundElement.getBoundingClientRect();
|
|
85
|
+
this._minX = rect.left + document.body.scrollLeft;
|
|
86
|
+
this._minY = rect.top + document.body.scrollTop;
|
|
87
|
+
this._maxX = this._minX + rect.width;
|
|
88
|
+
this._maxY = this._minY + rect.height;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Callback on every mouseMove event during a drag. Determines if the drag is
|
|
93
|
+
* still within the valid drag area and calls the layoutManager to highlight the
|
|
94
|
+
* current drop area
|
|
95
|
+
*
|
|
96
|
+
* @param offsetX - The difference from the original x position in px
|
|
97
|
+
* @param offsetY - The difference from the original y position in px
|
|
98
|
+
* @param event -
|
|
99
|
+
* @internal
|
|
100
|
+
*/
|
|
101
|
+
onDrag(offsetX, offsetY, event) {
|
|
102
|
+
const x = event.pageX;
|
|
103
|
+
const y = event.pageY;
|
|
104
|
+
this.setDropPosition(x, y);
|
|
105
|
+
this._componentItem.drag();
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Sets the target position, highlighting the appropriate area
|
|
109
|
+
*
|
|
110
|
+
* @param x - The x position in px
|
|
111
|
+
* @param y - The y position in px
|
|
112
|
+
*
|
|
113
|
+
* @internal
|
|
114
|
+
*/
|
|
115
|
+
setDropPosition(x, y) {
|
|
116
|
+
if (this._layoutManager.layoutConfig.settings.constrainDragToContainer) {
|
|
117
|
+
if (x <= this._minX) {
|
|
118
|
+
x = Math.ceil(this._minX);
|
|
119
|
+
}
|
|
120
|
+
else if (x >= this._maxX) {
|
|
121
|
+
x = Math.floor(this._maxX);
|
|
122
|
+
}
|
|
123
|
+
if (y <= this._minY) {
|
|
124
|
+
y = Math.ceil(this._minY);
|
|
125
|
+
}
|
|
126
|
+
else if (y >= this._maxY) {
|
|
127
|
+
y = Math.floor(this._maxY);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
this._element.style.left = numberToPixels(x);
|
|
131
|
+
this._element.style.top = numberToPixels(y);
|
|
132
|
+
this._area = this._layoutManager.getArea(x, y);
|
|
133
|
+
if (this._area !== null) {
|
|
134
|
+
this._lastValidArea = this._area;
|
|
135
|
+
this._area.contentItem.highlightDropZone(x, y, this._area);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Callback when the drag has finished. Determines the drop area
|
|
140
|
+
* and adds the child to it
|
|
141
|
+
* @internal
|
|
142
|
+
*/
|
|
143
|
+
onDrop() {
|
|
144
|
+
const dropTargetIndicator = this._layoutManager.dropTargetIndicator;
|
|
145
|
+
if (dropTargetIndicator === null) {
|
|
146
|
+
throw new UnexpectedNullError('DPOD30011');
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
dropTargetIndicator.hide();
|
|
150
|
+
}
|
|
151
|
+
this._componentItem.exitDragMode();
|
|
152
|
+
/*
|
|
153
|
+
* Valid drop area found
|
|
154
|
+
*/
|
|
155
|
+
let droppedComponentItem;
|
|
156
|
+
if (this._area !== null) {
|
|
157
|
+
droppedComponentItem = this._componentItem;
|
|
158
|
+
this._area.contentItem.onDrop(droppedComponentItem, this._area);
|
|
159
|
+
/**
|
|
160
|
+
* No valid drop area available at present, but one has been found before.
|
|
161
|
+
* Use it
|
|
162
|
+
*/
|
|
163
|
+
}
|
|
164
|
+
else if (this._lastValidArea !== null) {
|
|
165
|
+
droppedComponentItem = this._componentItem;
|
|
166
|
+
const newParentContentItem = this._lastValidArea.contentItem;
|
|
167
|
+
newParentContentItem.onDrop(droppedComponentItem, this._lastValidArea);
|
|
168
|
+
/**
|
|
169
|
+
* No valid drop area found during the duration of the drag. Return
|
|
170
|
+
* content item to its original position if a original parent is provided.
|
|
171
|
+
* (Which is not the case if the drag had been initiated by createDragSource)
|
|
172
|
+
*/
|
|
173
|
+
}
|
|
174
|
+
else if (this._originalParent) {
|
|
175
|
+
droppedComponentItem = this._componentItem;
|
|
176
|
+
this._originalParent.addChild(droppedComponentItem);
|
|
177
|
+
/**
|
|
178
|
+
* The drag didn't ultimately end up with adding the content item to
|
|
179
|
+
* any container. In order to ensure clean up happens, destroy the
|
|
180
|
+
* content item.
|
|
181
|
+
*/
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
this._componentItem.destroy(); // contentItem children are now destroyed as well
|
|
185
|
+
}
|
|
186
|
+
this._element.remove();
|
|
187
|
+
this._layoutManager.emit('itemDropped', this._componentItem);
|
|
188
|
+
if (this._componentItemFocused && droppedComponentItem !== undefined) {
|
|
189
|
+
droppedComponentItem.focus();
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Updates the Drag Proxy's dimensions
|
|
194
|
+
* @internal
|
|
195
|
+
*/
|
|
196
|
+
setDimensions() {
|
|
197
|
+
const dimensions = this._layoutManager.layoutConfig.dimensions;
|
|
198
|
+
if (dimensions === undefined) {
|
|
199
|
+
throw new Error('DragProxy.setDimensions: dimensions undefined');
|
|
200
|
+
}
|
|
201
|
+
let width = dimensions.dragProxyWidth;
|
|
202
|
+
let height = dimensions.dragProxyHeight;
|
|
203
|
+
if (width === undefined || height === undefined) {
|
|
204
|
+
throw new Error('DragProxy.setDimensions: width and/or height undefined');
|
|
205
|
+
}
|
|
206
|
+
const headerHeight = this._layoutManager.layoutConfig.header.show === false ? 0 : dimensions.headerHeight;
|
|
207
|
+
this._element.style.width = numberToPixels(width);
|
|
208
|
+
this._element.style.height = numberToPixels(height);
|
|
209
|
+
width -= (this._sided ? headerHeight : 0);
|
|
210
|
+
height -= (!this._sided ? headerHeight : 0);
|
|
211
|
+
this._proxyContainerElement.style.width = numberToPixels(width);
|
|
212
|
+
this._proxyContainerElement.style.height = numberToPixels(height);
|
|
213
|
+
this._componentItem.enterDragMode(width, height);
|
|
214
|
+
this._componentItem.show();
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=drag-proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drag-proxy.js","sourceRoot":"","sources":["../../../../src/ts/controls/drag-proxy.ts"],"names":[],"mappings":"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"}
|