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