dockview-core 5.1.0 → 6.0.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/README.md +3 -1
- package/dist/cjs/api/component.api.d.ts +93 -1
- package/dist/cjs/api/component.api.js +146 -0
- package/dist/cjs/api/dockviewGroupPanelApi.d.ts +26 -0
- package/dist/cjs/api/dockviewGroupPanelApi.js +21 -1
- package/dist/cjs/api/entryPoints.js +4 -5
- package/dist/cjs/array.js +7 -8
- package/dist/cjs/dnd/dataTransfer.d.ts +2 -1
- package/dist/cjs/dnd/dataTransfer.js +5 -4
- package/dist/cjs/dnd/droptarget.d.ts +12 -0
- package/dist/cjs/dnd/droptarget.js +38 -10
- package/dist/cjs/dnd/ghost.js +1 -2
- package/dist/cjs/dockview/components/panel/content.js +5 -1
- package/dist/cjs/dockview/components/popupService.d.ts +9 -2
- package/dist/cjs/dockview/components/popupService.js +24 -9
- package/dist/cjs/dockview/components/tab/tab.d.ts +8 -1
- package/dist/cjs/dockview/components/tab/tab.js +94 -6
- package/dist/cjs/dockview/components/titlebar/tabGroupChip.d.ts +30 -0
- package/dist/cjs/dockview/components/titlebar/tabGroupChip.js +95 -0
- package/dist/cjs/dockview/components/titlebar/tabGroupIndicator.d.ts +71 -0
- package/dist/cjs/dockview/components/titlebar/tabGroupIndicator.js +471 -0
- package/dist/cjs/dockview/components/titlebar/tabGroups.d.ts +57 -0
- package/dist/cjs/dockview/components/titlebar/tabGroups.js +612 -0
- package/dist/cjs/dockview/components/titlebar/tabOverflowControl.js +1 -2
- package/dist/cjs/dockview/components/titlebar/tabs.d.ts +67 -0
- package/dist/cjs/dockview/components/titlebar/tabs.js +1464 -34
- package/dist/cjs/dockview/components/titlebar/tabsContainer.d.ts +6 -0
- package/dist/cjs/dockview/components/titlebar/tabsContainer.js +132 -14
- package/dist/cjs/dockview/contextMenu.d.ts +10 -0
- package/dist/cjs/dockview/contextMenu.js +298 -0
- package/dist/cjs/dockview/dockviewComponent.d.ts +60 -3
- package/dist/cjs/dockview/dockviewComponent.js +712 -126
- package/dist/cjs/dockview/dockviewGroupPanelModel.d.ts +83 -0
- package/dist/cjs/dockview/dockviewGroupPanelModel.js +619 -27
- package/dist/cjs/dockview/dockviewShell.d.ts +128 -0
- package/dist/cjs/dockview/dockviewShell.js +681 -0
- package/dist/cjs/dockview/events.d.ts +9 -0
- package/dist/cjs/dockview/framework.d.ts +14 -0
- package/dist/cjs/dockview/options.d.ts +97 -2
- package/dist/cjs/dockview/options.js +10 -5
- package/dist/cjs/dockview/tabGroup.d.ts +99 -0
- package/dist/cjs/dockview/tabGroup.js +219 -0
- package/dist/cjs/dockview/tabGroupAccent.d.ts +65 -0
- package/dist/cjs/dockview/tabGroupAccent.js +128 -0
- package/dist/cjs/dockview/theme.d.ts +56 -1
- package/dist/cjs/dockview/theme.js +103 -6
- package/dist/cjs/dockview/types.d.ts +2 -0
- package/dist/cjs/dom.js +19 -19
- package/dist/cjs/events.js +2 -2
- package/dist/cjs/gridview/baseComponentGridview.d.ts +1 -0
- package/dist/cjs/gridview/baseComponentGridview.js +6 -3
- package/dist/cjs/gridview/gridview.js +7 -7
- package/dist/cjs/index.d.ts +8 -5
- package/dist/cjs/index.js +6 -1
- package/dist/cjs/popoutWindow.js +3 -3
- package/dist/cjs/splitview/splitviewPanel.d.ts +1 -1
- package/dist/dockview-core.js +5188 -729
- package/dist/dockview-core.min.js +2 -2
- package/dist/dockview-core.min.js.map +1 -1
- package/dist/dockview-core.min.noStyle.js +2 -2
- package/dist/dockview-core.min.noStyle.js.map +1 -1
- package/dist/dockview-core.noStyle.js +5186 -727
- package/dist/esm/api/component.api.d.ts +93 -1
- package/dist/esm/api/component.api.js +118 -0
- package/dist/esm/api/dockviewGroupPanelApi.d.ts +26 -0
- package/dist/esm/api/dockviewGroupPanelApi.js +21 -1
- package/dist/esm/dnd/dataTransfer.d.ts +2 -1
- package/dist/esm/dnd/dataTransfer.js +2 -1
- package/dist/esm/dnd/droptarget.d.ts +12 -0
- package/dist/esm/dnd/droptarget.js +33 -5
- package/dist/esm/dockview/components/panel/content.js +5 -1
- package/dist/esm/dockview/components/popupService.d.ts +9 -2
- package/dist/esm/dockview/components/popupService.js +23 -9
- package/dist/esm/dockview/components/tab/tab.d.ts +8 -1
- package/dist/esm/dockview/components/tab/tab.js +96 -6
- package/dist/esm/dockview/components/titlebar/tabGroupChip.d.ts +30 -0
- package/dist/esm/dockview/components/titlebar/tabGroupChip.js +68 -0
- package/dist/esm/dockview/components/titlebar/tabGroupIndicator.d.ts +71 -0
- package/dist/esm/dockview/components/titlebar/tabGroupIndicator.js +354 -0
- package/dist/esm/dockview/components/titlebar/tabGroups.d.ts +57 -0
- package/dist/esm/dockview/components/titlebar/tabGroups.js +406 -0
- package/dist/esm/dockview/components/titlebar/tabs.d.ts +67 -0
- package/dist/esm/dockview/components/titlebar/tabs.js +1212 -25
- package/dist/esm/dockview/components/titlebar/tabsContainer.d.ts +6 -0
- package/dist/esm/dockview/components/titlebar/tabsContainer.js +105 -7
- package/dist/esm/dockview/contextMenu.d.ts +10 -0
- package/dist/esm/dockview/contextMenu.js +213 -0
- package/dist/esm/dockview/dockviewComponent.d.ts +60 -3
- package/dist/esm/dockview/dockviewComponent.js +460 -35
- package/dist/esm/dockview/dockviewGroupPanelModel.d.ts +83 -0
- package/dist/esm/dockview/dockviewGroupPanelModel.js +460 -4
- package/dist/esm/dockview/dockviewShell.d.ts +128 -0
- package/dist/esm/dockview/dockviewShell.js +621 -0
- package/dist/esm/dockview/events.d.ts +9 -0
- package/dist/esm/dockview/framework.d.ts +14 -0
- package/dist/esm/dockview/options.d.ts +97 -2
- package/dist/esm/dockview/options.js +5 -0
- package/dist/esm/dockview/tabGroup.d.ts +99 -0
- package/dist/esm/dockview/tabGroup.js +144 -0
- package/dist/esm/dockview/tabGroupAccent.d.ts +65 -0
- package/dist/esm/dockview/tabGroupAccent.js +116 -0
- package/dist/esm/dockview/theme.d.ts +56 -1
- package/dist/esm/dockview/theme.js +102 -5
- package/dist/esm/dockview/types.d.ts +2 -0
- package/dist/esm/dom.js +1 -1
- package/dist/esm/gridview/baseComponentGridview.d.ts +1 -0
- package/dist/esm/gridview/baseComponentGridview.js +4 -1
- package/dist/esm/index.d.ts +8 -5
- package/dist/esm/index.js +2 -1
- package/dist/esm/popoutWindow.js +1 -1
- package/dist/esm/splitview/splitviewPanel.d.ts +1 -1
- package/dist/package/main.cjs.js +5182 -753
- package/dist/package/main.cjs.min.js +2 -2
- package/dist/package/main.esm.min.mjs +2 -2
- package/dist/package/main.esm.mjs +5168 -753
- package/dist/styles/dockview.css +1968 -195
- package/package.json +5 -1
|
@@ -9,6 +9,7 @@ import { DockviewHeaderDirection } from '../../options';
|
|
|
9
9
|
export interface TabDropIndexEvent {
|
|
10
10
|
readonly event: DragEvent;
|
|
11
11
|
readonly index: number;
|
|
12
|
+
readonly targetTabGroupId?: string | null;
|
|
12
13
|
}
|
|
13
14
|
export interface TabDragEvent {
|
|
14
15
|
readonly nativeEvent: DragEvent;
|
|
@@ -41,6 +42,8 @@ export interface ITabsContainer extends IDisposable {
|
|
|
41
42
|
show(): void;
|
|
42
43
|
hide(): void;
|
|
43
44
|
updateDragAndDropState(): void;
|
|
45
|
+
updateTabGroups(): void;
|
|
46
|
+
refreshTabGroupAccent(): void;
|
|
44
47
|
}
|
|
45
48
|
export declare class TabsContainer extends CompositeDisposable implements ITabsContainer {
|
|
46
49
|
private readonly accessor;
|
|
@@ -58,6 +61,7 @@ export declare class TabsContainer extends CompositeDisposable implements ITabsC
|
|
|
58
61
|
private _direction;
|
|
59
62
|
private dropdownPart;
|
|
60
63
|
private _overflowTabs;
|
|
64
|
+
private _overflowTabGroups;
|
|
61
65
|
private readonly _dropdownDisposable;
|
|
62
66
|
private readonly _onDrop;
|
|
63
67
|
readonly onDrop: Event<TabDropIndexEvent>;
|
|
@@ -89,4 +93,6 @@ export declare class TabsContainer extends CompositeDisposable implements ITabsC
|
|
|
89
93
|
private updateClassnames;
|
|
90
94
|
private toggleDropdown;
|
|
91
95
|
updateDragAndDropState(): void;
|
|
96
|
+
updateTabGroups(): void;
|
|
97
|
+
refreshTabGroupAccent(): void;
|
|
92
98
|
}
|
|
@@ -35,6 +35,7 @@ var events_2 = require("../../events");
|
|
|
35
35
|
var dataTransfer_1 = require("../../../dnd/dataTransfer");
|
|
36
36
|
var tabs_1 = require("./tabs");
|
|
37
37
|
var tabOverflowControl_1 = require("./tabOverflowControl");
|
|
38
|
+
var tabGroupAccent_1 = require("../../tabGroupAccent");
|
|
38
39
|
var TabsContainer = /** @class */ (function (_super) {
|
|
39
40
|
__extends(TabsContainer, _super);
|
|
40
41
|
function TabsContainer(accessor, group) {
|
|
@@ -45,6 +46,7 @@ var TabsContainer = /** @class */ (function (_super) {
|
|
|
45
46
|
_this._direction = 'horizontal';
|
|
46
47
|
_this.dropdownPart = null;
|
|
47
48
|
_this._overflowTabs = [];
|
|
49
|
+
_this._overflowTabGroups = [];
|
|
48
50
|
_this._dropdownDisposable = new lifecycle_1.MutableDisposable();
|
|
49
51
|
_this._onDrop = new events_1.Emitter();
|
|
50
52
|
_this.onDrop = _this._onDrop.event;
|
|
@@ -65,11 +67,13 @@ var TabsContainer = /** @class */ (function (_super) {
|
|
|
65
67
|
showTabsOverflowControl: !accessor.options.disableTabsOverflowList,
|
|
66
68
|
});
|
|
67
69
|
_this.voidContainer = new voidContainer_1.VoidContainer(_this.accessor, _this.group);
|
|
70
|
+
_this.tabs.voidContainer = _this.voidContainer.element;
|
|
68
71
|
_this._element.appendChild(_this.preActionsContainer);
|
|
69
72
|
_this._element.appendChild(_this.tabs.element);
|
|
70
73
|
_this._element.appendChild(_this.leftActionsContainer);
|
|
71
74
|
_this._element.appendChild(_this.voidContainer.element);
|
|
72
75
|
_this._element.appendChild(_this.rightActionsContainer);
|
|
76
|
+
_this.tabs.setExtendedDropZone(_this._element);
|
|
73
77
|
_this.addDisposables(_this.tabs.onDrop(function (e) { return _this._onDrop.fire(e); }), _this.tabs.onWillShowOverlay(function (e) { return _this._onWillShowOverlay.fire(e); }), accessor.onDidOptionsChange(function () {
|
|
74
78
|
_this.tabs.showTabsOverflowControl =
|
|
75
79
|
!accessor.options.disableTabsOverflowList;
|
|
@@ -81,6 +85,10 @@ var TabsContainer = /** @class */ (function (_super) {
|
|
|
81
85
|
group: _this.group,
|
|
82
86
|
});
|
|
83
87
|
}), _this.voidContainer.onDrop(function (event) {
|
|
88
|
+
// If an active group drag is in progress, let Tabs handle it
|
|
89
|
+
if (_this.tabs.handleVoidDrop()) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
84
92
|
_this._onDrop.fire({
|
|
85
93
|
event: event.nativeEvent,
|
|
86
94
|
index: _this.tabs.size,
|
|
@@ -93,6 +101,25 @@ var TabsContainer = /** @class */ (function (_super) {
|
|
|
93
101
|
group: _this.group,
|
|
94
102
|
getData: dataTransfer_1.getPanelData,
|
|
95
103
|
}));
|
|
104
|
+
}), (0, events_1.addDisposableListener)(_this.leftActionsContainer, 'dragleave', function (event) {
|
|
105
|
+
var related = event.relatedTarget;
|
|
106
|
+
if (!_this.leftActionsContainer.contains(related) &&
|
|
107
|
+
!_this._element.contains(related)) {
|
|
108
|
+
// Left the header entirely
|
|
109
|
+
_this.tabs.clearExternalAnimState();
|
|
110
|
+
}
|
|
111
|
+
}), (0, events_1.addDisposableListener)(_this.voidContainer.element, 'dragleave', function (event) {
|
|
112
|
+
var related = event.relatedTarget;
|
|
113
|
+
if (!_this.voidContainer.element.contains(related)) {
|
|
114
|
+
if (_this._element.contains(related)) {
|
|
115
|
+
// Moved to another part of the header — keep state
|
|
116
|
+
_this.tabs.setExternalInsertionIndex(null);
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
// Left the header entirely
|
|
120
|
+
_this.tabs.clearExternalAnimState();
|
|
121
|
+
}
|
|
122
|
+
}
|
|
96
123
|
}), (0, events_1.addDisposableListener)(_this.voidContainer.element, 'pointerdown', function (event) {
|
|
97
124
|
if (event.defaultPrevented) {
|
|
98
125
|
return;
|
|
@@ -100,7 +127,8 @@ var TabsContainer = /** @class */ (function (_super) {
|
|
|
100
127
|
var isFloatingGroupsEnabled = !_this.accessor.options.disableFloatingGroups;
|
|
101
128
|
if (isFloatingGroupsEnabled &&
|
|
102
129
|
event.shiftKey &&
|
|
103
|
-
_this.group.api.location.type !== 'floating'
|
|
130
|
+
_this.group.api.location.type !== 'floating' &&
|
|
131
|
+
_this.group.api.location.type !== 'edge') {
|
|
104
132
|
event.preventDefault();
|
|
105
133
|
var _a = _this.element.getBoundingClientRect(), top_1 = _a.top, left = _a.left;
|
|
106
134
|
var _b = _this.accessor.element.getBoundingClientRect(), rootTop = _b.top, rootLeft = _b.left;
|
|
@@ -249,19 +277,22 @@ var TabsContainer = /** @class */ (function (_super) {
|
|
|
249
277
|
TabsContainer.prototype.toggleDropdown = function (options) {
|
|
250
278
|
var _this = this;
|
|
251
279
|
var tabs = options.reset ? [] : options.tabs;
|
|
280
|
+
var tabGroups = options.reset ? [] : options.tabGroups;
|
|
252
281
|
this._overflowTabs = tabs;
|
|
253
|
-
|
|
254
|
-
|
|
282
|
+
this._overflowTabGroups = tabGroups;
|
|
283
|
+
var totalCount = this._overflowTabs.length;
|
|
284
|
+
if (totalCount > 0 && this.dropdownPart) {
|
|
285
|
+
this.dropdownPart.update({ tabs: totalCount });
|
|
255
286
|
return;
|
|
256
287
|
}
|
|
257
|
-
if (
|
|
288
|
+
if (totalCount === 0) {
|
|
258
289
|
this._dropdownDisposable.dispose();
|
|
259
290
|
return;
|
|
260
291
|
}
|
|
261
292
|
var root = document.createElement('div');
|
|
262
293
|
root.className = 'dv-tabs-overflow-dropdown-root';
|
|
263
294
|
var part = (0, tabOverflowControl_1.createDropdownElementHandle)();
|
|
264
|
-
part.update({ tabs:
|
|
295
|
+
part.update({ tabs: totalCount });
|
|
265
296
|
this.dropdownPart = part;
|
|
266
297
|
root.appendChild(part.element);
|
|
267
298
|
this.rightActionsContainer.prepend(root);
|
|
@@ -273,11 +304,82 @@ var TabsContainer = /** @class */ (function (_super) {
|
|
|
273
304
|
}), (0, events_1.addDisposableListener)(root, 'pointerdown', function (event) {
|
|
274
305
|
event.preventDefault();
|
|
275
306
|
}, { capture: true }), (0, events_1.addDisposableListener)(root, 'click', function (event) {
|
|
276
|
-
var e_1, _a;
|
|
307
|
+
var e_1, _a, e_2, _b, e_3, _c;
|
|
277
308
|
var el = document.createElement('div');
|
|
278
309
|
el.style.overflow = 'auto';
|
|
279
310
|
el.className = 'dv-tabs-overflow-container';
|
|
311
|
+
// Build lookup: panelId → tabGroup for overflow groups
|
|
312
|
+
var overflowGroupSet = new Set(_this._overflowTabGroups);
|
|
313
|
+
var allTabGroups = _this.group.model.getTabGroups();
|
|
314
|
+
var panelToGroup = new Map();
|
|
315
|
+
try {
|
|
316
|
+
for (var allTabGroups_1 = __values(allTabGroups), allTabGroups_1_1 = allTabGroups_1.next(); !allTabGroups_1_1.done; allTabGroups_1_1 = allTabGroups_1.next()) {
|
|
317
|
+
var tg = allTabGroups_1_1.value;
|
|
318
|
+
if (overflowGroupSet.has(tg.id)) {
|
|
319
|
+
try {
|
|
320
|
+
for (var _d = (e_2 = void 0, __values(tg.panelIds)), _e = _d.next(); !_e.done; _e = _d.next()) {
|
|
321
|
+
var pid = _e.value;
|
|
322
|
+
panelToGroup.set(pid, tg);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
326
|
+
finally {
|
|
327
|
+
try {
|
|
328
|
+
if (_e && !_e.done && (_b = _d.return)) _b.call(_d);
|
|
329
|
+
}
|
|
330
|
+
finally { if (e_2) throw e_2.error; }
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
336
|
+
finally {
|
|
337
|
+
try {
|
|
338
|
+
if (allTabGroups_1_1 && !allTabGroups_1_1.done && (_a = allTabGroups_1.return)) _a.call(allTabGroups_1);
|
|
339
|
+
}
|
|
340
|
+
finally { if (e_1) throw e_1.error; }
|
|
341
|
+
}
|
|
342
|
+
// Track which groups have already been rendered
|
|
343
|
+
var renderedGroups = new Set();
|
|
280
344
|
var _loop_1 = function (tab) {
|
|
345
|
+
var tg = panelToGroup.get(tab.panel.id);
|
|
346
|
+
// If this tab belongs to an overflow group, render the
|
|
347
|
+
// group header before its first member tab.
|
|
348
|
+
if (tg && !renderedGroups.has(tg.id)) {
|
|
349
|
+
renderedGroups.add(tg.id);
|
|
350
|
+
var groupHeader = document.createElement('div');
|
|
351
|
+
groupHeader.className = 'dv-tabs-overflow-group-header';
|
|
352
|
+
var colorDot = document.createElement('span');
|
|
353
|
+
colorDot.className = 'dv-tabs-overflow-group-color';
|
|
354
|
+
(0, tabGroupAccent_1.applyTabGroupAccent)(colorDot, tg.color, _this.accessor.tabGroupColorPalette);
|
|
355
|
+
groupHeader.appendChild(colorDot);
|
|
356
|
+
var labelSpan = document.createElement('span');
|
|
357
|
+
labelSpan.className = 'dv-tabs-overflow-group-label';
|
|
358
|
+
labelSpan.textContent = tg.label || tg.id;
|
|
359
|
+
groupHeader.appendChild(labelSpan);
|
|
360
|
+
if (tg.collapsed) {
|
|
361
|
+
var badge = document.createElement('span');
|
|
362
|
+
badge.className =
|
|
363
|
+
'dv-tabs-overflow-group-collapsed-badge';
|
|
364
|
+
badge.textContent = "".concat(tg.panelIds.length);
|
|
365
|
+
groupHeader.appendChild(badge);
|
|
366
|
+
}
|
|
367
|
+
groupHeader.addEventListener('click', function () {
|
|
368
|
+
_this.accessor
|
|
369
|
+
.getPopupServiceForGroup(_this.group)
|
|
370
|
+
.close();
|
|
371
|
+
if (tg.collapsed) {
|
|
372
|
+
tg.expand();
|
|
373
|
+
}
|
|
374
|
+
// Activate the first panel in the group
|
|
375
|
+
var firstPanelId = tg.panelIds[0];
|
|
376
|
+
if (firstPanelId) {
|
|
377
|
+
var panel = _this.group.panels.find(function (p) { return p.id === firstPanelId; });
|
|
378
|
+
panel === null || panel === void 0 ? void 0 : panel.api.setActive();
|
|
379
|
+
}
|
|
380
|
+
});
|
|
381
|
+
el.appendChild(groupHeader);
|
|
382
|
+
}
|
|
281
383
|
var panelObject = _this.group.panels.find(function (panel) { return panel === tab.panel; });
|
|
282
384
|
var tabComponent = panelObject.view.createTabRenderer('headerOverflow');
|
|
283
385
|
var child = tabComponent.element;
|
|
@@ -285,11 +387,19 @@ var TabsContainer = /** @class */ (function (_super) {
|
|
|
285
387
|
(0, dom_1.toggleClass)(wrapper, 'dv-tab', true);
|
|
286
388
|
(0, dom_1.toggleClass)(wrapper, 'dv-active-tab', panelObject.api.isActive);
|
|
287
389
|
(0, dom_1.toggleClass)(wrapper, 'dv-inactive-tab', !panelObject.api.isActive);
|
|
390
|
+
if (tg) {
|
|
391
|
+
(0, dom_1.toggleClass)(wrapper, 'dv-tab--grouped', true);
|
|
392
|
+
}
|
|
288
393
|
wrapper.addEventListener('click', function (event) {
|
|
289
|
-
_this.accessor
|
|
394
|
+
_this.accessor
|
|
395
|
+
.getPopupServiceForGroup(_this.group)
|
|
396
|
+
.close();
|
|
290
397
|
if (event.defaultPrevented) {
|
|
291
398
|
return;
|
|
292
399
|
}
|
|
400
|
+
if (tg === null || tg === void 0 ? void 0 : tg.collapsed) {
|
|
401
|
+
tg.expand();
|
|
402
|
+
}
|
|
293
403
|
tab.element.scrollIntoView();
|
|
294
404
|
tab.panel.api.setActive();
|
|
295
405
|
});
|
|
@@ -297,22 +407,24 @@ var TabsContainer = /** @class */ (function (_super) {
|
|
|
297
407
|
el.appendChild(wrapper);
|
|
298
408
|
};
|
|
299
409
|
try {
|
|
300
|
-
for (var
|
|
410
|
+
for (var _f = __values(_this.tabs.tabs.filter(function (tab) {
|
|
301
411
|
return _this._overflowTabs.includes(tab.panel.id);
|
|
302
|
-
})),
|
|
303
|
-
var tab =
|
|
412
|
+
})), _g = _f.next(); !_g.done; _g = _f.next()) {
|
|
413
|
+
var tab = _g.value;
|
|
304
414
|
_loop_1(tab);
|
|
305
415
|
}
|
|
306
416
|
}
|
|
307
|
-
catch (
|
|
417
|
+
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
308
418
|
finally {
|
|
309
419
|
try {
|
|
310
|
-
if (
|
|
420
|
+
if (_g && !_g.done && (_c = _f.return)) _c.call(_f);
|
|
311
421
|
}
|
|
312
|
-
finally { if (
|
|
422
|
+
finally { if (e_3) throw e_3.error; }
|
|
313
423
|
}
|
|
314
424
|
var relativeParent = (0, dom_1.findRelativeZIndexParent)(root);
|
|
315
|
-
_this.accessor
|
|
425
|
+
_this.accessor
|
|
426
|
+
.getPopupServiceForGroup(_this.group)
|
|
427
|
+
.openPopover(el, {
|
|
316
428
|
x: event.clientX,
|
|
317
429
|
y: event.clientY,
|
|
318
430
|
zIndex: (relativeParent === null || relativeParent === void 0 ? void 0 : relativeParent.style.zIndex)
|
|
@@ -325,6 +437,12 @@ var TabsContainer = /** @class */ (function (_super) {
|
|
|
325
437
|
this.tabs.updateDragAndDropState();
|
|
326
438
|
this.voidContainer.updateDragAndDropState();
|
|
327
439
|
};
|
|
440
|
+
TabsContainer.prototype.updateTabGroups = function () {
|
|
441
|
+
this.tabs.updateTabGroups();
|
|
442
|
+
};
|
|
443
|
+
TabsContainer.prototype.refreshTabGroupAccent = function () {
|
|
444
|
+
this.tabs.refreshTabGroupAccent();
|
|
445
|
+
};
|
|
328
446
|
return TabsContainer;
|
|
329
447
|
}(lifecycle_1.CompositeDisposable));
|
|
330
448
|
exports.TabsContainer = TabsContainer;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { DockviewComponent } from './dockviewComponent';
|
|
2
|
+
import { DockviewGroupPanel } from './dockviewGroupPanel';
|
|
3
|
+
import { IDockviewPanel } from './dockviewPanel';
|
|
4
|
+
import { ITabGroup } from './tabGroup';
|
|
5
|
+
export declare class ContextMenuController {
|
|
6
|
+
private readonly accessor;
|
|
7
|
+
constructor(accessor: DockviewComponent);
|
|
8
|
+
show(panel: IDockviewPanel, group: DockviewGroupPanel, event: MouseEvent): void;
|
|
9
|
+
showForChip(tabGroup: ITabGroup, group: DockviewGroupPanel, event: MouseEvent): void;
|
|
10
|
+
}
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __values = (this && this.__values) || function(o) {
|
|
3
|
+
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
4
|
+
if (m) return m.call(o);
|
|
5
|
+
if (o && typeof o.length === "number") return {
|
|
6
|
+
next: function () {
|
|
7
|
+
if (o && i >= o.length) o = void 0;
|
|
8
|
+
return { value: o && o[i++], done: !o };
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
12
|
+
};
|
|
13
|
+
var __read = (this && this.__read) || function (o, n) {
|
|
14
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
15
|
+
if (!m) return o;
|
|
16
|
+
var i = m.call(o), r, ar = [], e;
|
|
17
|
+
try {
|
|
18
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
19
|
+
}
|
|
20
|
+
catch (error) { e = { error: error }; }
|
|
21
|
+
finally {
|
|
22
|
+
try {
|
|
23
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
24
|
+
}
|
|
25
|
+
finally { if (e) throw e.error; }
|
|
26
|
+
}
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
30
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
31
|
+
if (ar || !(i in from)) {
|
|
32
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
33
|
+
ar[i] = from[i];
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.ContextMenuController = void 0;
|
|
40
|
+
var dom_1 = require("../dom");
|
|
41
|
+
function popoverZIndexFor(target) {
|
|
42
|
+
if (!(target instanceof HTMLElement)) {
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
// Floating overlays live in the shell as siblings of the popover anchor
|
|
46
|
+
// and the AriaLevelTracker sets their inline z-index. Without this, a
|
|
47
|
+
// popover opened from inside a floating group would render behind it
|
|
48
|
+
// because they share the shell stacking context.
|
|
49
|
+
var relativeParent = (0, dom_1.findRelativeZIndexParent)(target);
|
|
50
|
+
return (relativeParent === null || relativeParent === void 0 ? void 0 : relativeParent.style.zIndex)
|
|
51
|
+
? "calc(".concat(relativeParent.style.zIndex, " * 2)")
|
|
52
|
+
: undefined;
|
|
53
|
+
}
|
|
54
|
+
var _nextId = 0;
|
|
55
|
+
var nextContextMenuItemId = function () { return "dv-ctx-menu-item-".concat(_nextId++); };
|
|
56
|
+
function isItemConfig(item) {
|
|
57
|
+
return typeof item === 'object';
|
|
58
|
+
}
|
|
59
|
+
function buildItem(label, close, action, disabled) {
|
|
60
|
+
var el = document.createElement('div');
|
|
61
|
+
el.className = 'dv-context-menu-item';
|
|
62
|
+
el.setAttribute('role', 'menuitem');
|
|
63
|
+
if (disabled) {
|
|
64
|
+
el.classList.add('dv-context-menu-item--disabled');
|
|
65
|
+
el.setAttribute('aria-disabled', 'true');
|
|
66
|
+
}
|
|
67
|
+
el.textContent = label;
|
|
68
|
+
if (!disabled) {
|
|
69
|
+
el.addEventListener('click', function () {
|
|
70
|
+
action();
|
|
71
|
+
close();
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
return el;
|
|
75
|
+
}
|
|
76
|
+
function buildSeparator() {
|
|
77
|
+
var el = document.createElement('div');
|
|
78
|
+
el.className = 'dv-context-menu-separator';
|
|
79
|
+
el.setAttribute('role', 'separator');
|
|
80
|
+
return el;
|
|
81
|
+
}
|
|
82
|
+
function buildRenameInput(tabGroup) {
|
|
83
|
+
var wrapper = document.createElement('div');
|
|
84
|
+
wrapper.className = 'dv-context-menu-rename';
|
|
85
|
+
var input = document.createElement('input');
|
|
86
|
+
input.className = 'dv-context-menu-rename-input';
|
|
87
|
+
input.type = 'text';
|
|
88
|
+
input.placeholder = 'Name This Group';
|
|
89
|
+
input.value = tabGroup.label;
|
|
90
|
+
input.addEventListener('input', function () {
|
|
91
|
+
tabGroup.setLabel(input.value);
|
|
92
|
+
});
|
|
93
|
+
input.addEventListener('keydown', function (e) {
|
|
94
|
+
if (e.key !== 'Escape' && e.key !== 'Enter') {
|
|
95
|
+
e.stopPropagation();
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
input.addEventListener('click', function (e) {
|
|
99
|
+
e.stopPropagation();
|
|
100
|
+
});
|
|
101
|
+
wrapper.appendChild(input);
|
|
102
|
+
requestAnimationFrame(function () {
|
|
103
|
+
input.focus();
|
|
104
|
+
input.select();
|
|
105
|
+
});
|
|
106
|
+
return wrapper;
|
|
107
|
+
}
|
|
108
|
+
function buildColorPicker(tabGroup, palette) {
|
|
109
|
+
var e_1, _a;
|
|
110
|
+
var wrapper = document.createElement('div');
|
|
111
|
+
wrapper.className = 'dv-context-menu-color-picker';
|
|
112
|
+
if (!palette.enabled) {
|
|
113
|
+
// Opt-out: render no swatches. Returning a wrapper rather than null
|
|
114
|
+
// keeps the call site simple; the wrapper is empty and visually inert.
|
|
115
|
+
return wrapper;
|
|
116
|
+
}
|
|
117
|
+
var _loop_1 = function (entry) {
|
|
118
|
+
var swatch = document.createElement('div');
|
|
119
|
+
swatch.className = 'dv-context-menu-color-swatch';
|
|
120
|
+
// Use a CSS custom property rather than setting `backgroundColor`
|
|
121
|
+
// directly: the IDL setter validates the value against a color
|
|
122
|
+
// grammar and rejects `var(...)` references in some environments
|
|
123
|
+
// (notably jsdom; some browsers have historically had similar
|
|
124
|
+
// quirks). The matching SCSS rule reads the var at use time.
|
|
125
|
+
swatch.style.setProperty('--dv-tab-group-color', entry.value);
|
|
126
|
+
if (entry.label) {
|
|
127
|
+
swatch.title = entry.label;
|
|
128
|
+
}
|
|
129
|
+
if (tabGroup.color === entry.id) {
|
|
130
|
+
swatch.classList.add('dv-context-menu-color-swatch--selected');
|
|
131
|
+
}
|
|
132
|
+
swatch.addEventListener('click', function () {
|
|
133
|
+
tabGroup.setColor(entry.id);
|
|
134
|
+
});
|
|
135
|
+
wrapper.appendChild(swatch);
|
|
136
|
+
};
|
|
137
|
+
try {
|
|
138
|
+
for (var _b = __values(palette.entries()), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
139
|
+
var entry = _c.value;
|
|
140
|
+
_loop_1(entry);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
144
|
+
finally {
|
|
145
|
+
try {
|
|
146
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
147
|
+
}
|
|
148
|
+
finally { if (e_1) throw e_1.error; }
|
|
149
|
+
}
|
|
150
|
+
return wrapper;
|
|
151
|
+
}
|
|
152
|
+
var ContextMenuController = /** @class */ (function () {
|
|
153
|
+
function ContextMenuController(accessor) {
|
|
154
|
+
this.accessor = accessor;
|
|
155
|
+
}
|
|
156
|
+
ContextMenuController.prototype.show = function (panel, group, event) {
|
|
157
|
+
var e_2, _a;
|
|
158
|
+
var _b, _c;
|
|
159
|
+
if (!this.accessor.options.getTabContextMenuItems) {
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
var items = this.accessor.options.getTabContextMenuItems({
|
|
163
|
+
panel: panel,
|
|
164
|
+
group: group,
|
|
165
|
+
api: this.accessor.api,
|
|
166
|
+
event: event,
|
|
167
|
+
});
|
|
168
|
+
if (items.length === 0) {
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
event.preventDefault();
|
|
172
|
+
var popupService = this.accessor.getPopupServiceForGroup(group);
|
|
173
|
+
var close = function () { return popupService.close(); };
|
|
174
|
+
var menuEl = document.createElement('div');
|
|
175
|
+
menuEl.className = 'dv-context-menu';
|
|
176
|
+
menuEl.setAttribute('role', 'menu');
|
|
177
|
+
var _loop_2 = function (item) {
|
|
178
|
+
if (item === 'separator') {
|
|
179
|
+
menuEl.appendChild(buildSeparator());
|
|
180
|
+
}
|
|
181
|
+
else if (item === 'close') {
|
|
182
|
+
menuEl.appendChild(buildItem('Close', close, function () { return panel.api.close(); }));
|
|
183
|
+
}
|
|
184
|
+
else if (item === 'closeOthers') {
|
|
185
|
+
menuEl.appendChild(buildItem('Close Others', close, function () {
|
|
186
|
+
group.panels
|
|
187
|
+
.filter(function (p) { return p !== panel; })
|
|
188
|
+
.forEach(function (p) { return p.api.close(); });
|
|
189
|
+
}));
|
|
190
|
+
}
|
|
191
|
+
else if (item === 'closeAll') {
|
|
192
|
+
menuEl.appendChild(buildItem('Close All', close, function () {
|
|
193
|
+
__spreadArray([], __read(group.panels), false).forEach(function (p) { return p.api.close(); });
|
|
194
|
+
}));
|
|
195
|
+
}
|
|
196
|
+
else if (isItemConfig(item) && item.element) {
|
|
197
|
+
menuEl.appendChild(item.element);
|
|
198
|
+
}
|
|
199
|
+
else if (isItemConfig(item) && item.component) {
|
|
200
|
+
var renderer = (_c = (_b = this_1.accessor.options).createContextMenuItemComponent) === null || _c === void 0 ? void 0 : _c.call(_b, {
|
|
201
|
+
id: nextContextMenuItemId(),
|
|
202
|
+
component: item.component,
|
|
203
|
+
});
|
|
204
|
+
if (renderer) {
|
|
205
|
+
renderer.init({
|
|
206
|
+
panel: panel,
|
|
207
|
+
group: group,
|
|
208
|
+
api: this_1.accessor.api,
|
|
209
|
+
close: close,
|
|
210
|
+
componentProps: item.componentProps,
|
|
211
|
+
});
|
|
212
|
+
menuEl.appendChild(renderer.element);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
else if (isItemConfig(item) && item.label) {
|
|
216
|
+
menuEl.appendChild(buildItem(item.label, close, function () { var _a; return (_a = item.action) === null || _a === void 0 ? void 0 : _a.call(item); }, item.disabled));
|
|
217
|
+
}
|
|
218
|
+
};
|
|
219
|
+
var this_1 = this;
|
|
220
|
+
try {
|
|
221
|
+
for (var items_1 = __values(items), items_1_1 = items_1.next(); !items_1_1.done; items_1_1 = items_1.next()) {
|
|
222
|
+
var item = items_1_1.value;
|
|
223
|
+
_loop_2(item);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
227
|
+
finally {
|
|
228
|
+
try {
|
|
229
|
+
if (items_1_1 && !items_1_1.done && (_a = items_1.return)) _a.call(items_1);
|
|
230
|
+
}
|
|
231
|
+
finally { if (e_2) throw e_2.error; }
|
|
232
|
+
}
|
|
233
|
+
popupService.openPopover(menuEl, {
|
|
234
|
+
x: event.clientX,
|
|
235
|
+
y: event.clientY,
|
|
236
|
+
zIndex: popoverZIndexFor(event.target),
|
|
237
|
+
});
|
|
238
|
+
};
|
|
239
|
+
ContextMenuController.prototype.showForChip = function (tabGroup, group, event) {
|
|
240
|
+
var e_3, _a;
|
|
241
|
+
if (!this.accessor.options.getTabGroupChipContextMenuItems) {
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
var items = this.accessor.options.getTabGroupChipContextMenuItems({
|
|
245
|
+
tabGroup: tabGroup,
|
|
246
|
+
group: group,
|
|
247
|
+
api: this.accessor.api,
|
|
248
|
+
event: event,
|
|
249
|
+
});
|
|
250
|
+
if (items.length === 0) {
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
event.preventDefault();
|
|
254
|
+
var popupService = this.accessor.getPopupServiceForGroup(group);
|
|
255
|
+
var close = function () { return popupService.close(); };
|
|
256
|
+
var menuEl = document.createElement('div');
|
|
257
|
+
menuEl.className = 'dv-context-menu';
|
|
258
|
+
menuEl.setAttribute('role', 'menu');
|
|
259
|
+
var _loop_3 = function (item) {
|
|
260
|
+
if (item === 'separator') {
|
|
261
|
+
menuEl.appendChild(buildSeparator());
|
|
262
|
+
}
|
|
263
|
+
else if (item === 'rename') {
|
|
264
|
+
menuEl.appendChild(buildRenameInput(tabGroup));
|
|
265
|
+
}
|
|
266
|
+
else if (item === 'colorPicker') {
|
|
267
|
+
menuEl.appendChild(buildColorPicker(tabGroup, this_2.accessor.tabGroupColorPalette));
|
|
268
|
+
}
|
|
269
|
+
else if (isItemConfig(item) && item.element) {
|
|
270
|
+
menuEl.appendChild(item.element);
|
|
271
|
+
}
|
|
272
|
+
else if (isItemConfig(item) && item.label) {
|
|
273
|
+
menuEl.appendChild(buildItem(item.label, close, function () { var _a; return (_a = item.action) === null || _a === void 0 ? void 0 : _a.call(item); }, item.disabled));
|
|
274
|
+
}
|
|
275
|
+
};
|
|
276
|
+
var this_2 = this;
|
|
277
|
+
try {
|
|
278
|
+
for (var items_2 = __values(items), items_2_1 = items_2.next(); !items_2_1.done; items_2_1 = items_2.next()) {
|
|
279
|
+
var item = items_2_1.value;
|
|
280
|
+
_loop_3(item);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
284
|
+
finally {
|
|
285
|
+
try {
|
|
286
|
+
if (items_2_1 && !items_2_1.done && (_a = items_2.return)) _a.call(items_2);
|
|
287
|
+
}
|
|
288
|
+
finally { if (e_3) throw e_3.error; }
|
|
289
|
+
}
|
|
290
|
+
popupService.openPopover(menuEl, {
|
|
291
|
+
x: event.clientX,
|
|
292
|
+
y: event.clientY,
|
|
293
|
+
zIndex: popoverZIndexFor(event.target),
|
|
294
|
+
});
|
|
295
|
+
};
|
|
296
|
+
return ContextMenuController;
|
|
297
|
+
}());
|
|
298
|
+
exports.ContextMenuController = ContextMenuController;
|