flexlayout-react 0.7.15 → 0.8.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/ChangeLog.txt +23 -0
- package/README.md +157 -330
- package/Screenshot_light.png +0 -0
- package/Screenshot_rounded.png +0 -0
- package/declarations/Attribute.d.ts +1 -1
- package/declarations/AttributeDefinitions.d.ts +1 -1
- package/declarations/DockLocation.d.ts +12 -12
- package/declarations/DropInfo.d.ts +12 -12
- package/declarations/I18nLabel.d.ts +12 -14
- package/declarations/Orientation.d.ts +7 -7
- package/declarations/PopupMenu.d.ts +1 -1
- package/declarations/Rect.d.ts +41 -28
- package/declarations/Types.d.ts +95 -79
- package/declarations/examples/demo/Utils.d.ts +4 -0
- package/declarations/index.d.ts +21 -22
- package/declarations/model/Action.d.ts +5 -5
- package/declarations/model/Actions.d.ts +127 -110
- package/declarations/model/BorderNode.d.ts +30 -34
- package/declarations/model/BorderSet.d.ts +3 -4
- package/declarations/model/ICloseType.d.ts +5 -5
- package/declarations/model/IDraggable.d.ts +2 -2
- package/declarations/model/IDropTarget.d.ts +2 -2
- package/declarations/model/IJsonModel.d.ts +811 -149
- package/declarations/model/LayoutWindow.d.ts +28 -0
- package/declarations/model/Model.d.ts +91 -86
- package/declarations/model/Node.d.ts +17 -17
- package/declarations/model/RowNode.d.ts +10 -11
- package/declarations/model/TabNode.d.ts +44 -37
- package/declarations/model/TabSetNode.d.ts +44 -41
- package/declarations/model/Utils.d.ts +1 -1
- package/declarations/model/WindowLayout.d.ts +24 -0
- package/declarations/src/Attribute.d.ts +1 -0
- package/declarations/src/AttributeDefinitions.d.ts +1 -0
- package/declarations/src/DockLocation.d.ts +12 -0
- package/declarations/src/DropInfo.d.ts +12 -0
- package/declarations/src/I18nLabel.d.ts +10 -0
- package/declarations/src/Orientation.d.ts +7 -0
- package/declarations/src/PopupMenu.d.ts +1 -0
- package/declarations/src/Rect.d.ts +31 -0
- package/declarations/src/Types.d.ts +92 -0
- package/declarations/src/index.d.ts +20 -0
- package/declarations/src/model/Action.d.ts +5 -0
- package/declarations/src/model/Actions.d.ts +110 -0
- package/declarations/src/model/BorderNode.d.ts +28 -0
- package/declarations/src/model/BorderSet.d.ts +3 -0
- package/declarations/src/model/ICloseType.d.ts +5 -0
- package/declarations/src/model/IDraggable.d.ts +2 -0
- package/declarations/src/model/IDropTarget.d.ts +2 -0
- package/declarations/src/model/IJsonModel.d.ts +153 -0
- package/declarations/src/model/Model.d.ts +98 -0
- package/declarations/src/model/Node.d.ts +16 -0
- package/declarations/src/model/RowNode.d.ts +11 -0
- package/declarations/src/model/TabNode.d.ts +36 -0
- package/declarations/src/model/TabSetNode.d.ts +37 -0
- package/declarations/src/model/Utils.d.ts +1 -0
- package/declarations/src/view/BorderButton.d.ts +1 -0
- package/declarations/src/view/BorderTab.d.ts +2 -0
- package/declarations/src/view/BorderTabSet.d.ts +1 -0
- package/declarations/src/view/DragContainer.d.ts +1 -0
- package/declarations/src/view/ErrorBoundary.d.ts +1 -0
- package/declarations/src/view/FloatingWindow.d.ts +1 -0
- package/declarations/src/view/Icons.d.ts +7 -0
- package/declarations/src/view/Layout.d.ts +113 -0
- package/declarations/src/view/Overlay.d.ts +1 -0
- package/declarations/src/view/PopupMenu.d.ts +1 -0
- package/declarations/src/view/Row.d.ts +1 -0
- package/declarations/src/view/Splitter.d.ts +1 -0
- package/declarations/src/view/Tab.d.ts +1 -0
- package/declarations/src/view/TabButton.d.ts +1 -0
- package/declarations/src/view/TabButtonStamp.d.ts +1 -0
- package/declarations/src/view/TabOverflowHook.d.ts +1 -0
- package/declarations/src/view/TabSet.d.ts +1 -0
- package/declarations/src/view/Utils.d.ts +4 -0
- package/declarations/view/BorderButton.d.ts +1 -1
- package/declarations/view/BorderTab.d.ts +2 -0
- package/declarations/view/BorderTabSet.d.ts +1 -1
- package/declarations/view/DragContainer.d.ts +1 -0
- package/declarations/view/ErrorBoundary.d.ts +1 -1
- package/declarations/view/ExtendedResizeObserver.d.ts +23 -0
- package/declarations/view/FloatingWindow.d.ts +1 -1
- package/declarations/view/Icons.d.ts +8 -7
- package/declarations/view/Layout.d.ts +139 -161
- package/declarations/view/Overlay.d.ts +1 -0
- package/declarations/view/PopoutWindow.d.ts +1 -0
- package/declarations/view/PopupMenu.d.ts +1 -0
- package/declarations/view/Row.d.ts +1 -0
- package/declarations/view/SizeTracker.d.ts +10 -0
- package/declarations/view/Splitter.d.ts +1 -1
- package/declarations/view/Tab.d.ts +1 -1
- package/declarations/view/TabButton.d.ts +1 -1
- package/declarations/view/TabButtonStamp.d.ts +1 -1
- package/declarations/view/TabOverflowHook.d.ts +1 -1
- package/declarations/view/TabSet.d.ts +1 -1
- package/declarations/view/Utils.d.ts +11 -1
- package/dist/bundles/demo.js +232052 -0
- package/dist/bundles/demo.js.map +1 -0
- package/dist/flexlayout.js +122 -92
- package/dist/flexlayout_min.js +1 -1
- package/lib/Attribute.js +42 -31
- package/lib/Attribute.js.map +1 -1
- package/lib/AttributeDefinitions.js +131 -108
- package/lib/AttributeDefinitions.js.map +1 -1
- package/lib/DockLocation.js +120 -124
- package/lib/DockLocation.js.map +1 -1
- package/lib/DropInfo.js +9 -13
- package/lib/DropInfo.js.map +1 -1
- package/lib/I18nLabel.js +13 -18
- package/lib/I18nLabel.js.map +1 -1
- package/lib/Orientation.js +22 -26
- package/lib/Orientation.js.map +1 -1
- package/lib/Rect.js +104 -72
- package/lib/Rect.js.map +1 -1
- package/lib/Types.js +96 -83
- package/lib/Types.js.map +1 -1
- package/lib/index.js +21 -38
- package/lib/index.js.map +1 -1
- package/lib/model/Action.js +6 -10
- package/lib/model/Action.js.map +1 -1
- package/lib/model/Actions.js +169 -155
- package/lib/model/Actions.js.map +1 -1
- package/lib/model/BorderNode.js +385 -406
- package/lib/model/BorderNode.js.map +1 -1
- package/lib/model/BorderSet.js +66 -121
- package/lib/model/BorderSet.js.map +1 -1
- package/lib/model/ICloseType.js +6 -9
- package/lib/model/ICloseType.js.map +1 -1
- package/lib/model/IDraggable.js +1 -2
- package/lib/model/IDropTarget.js +1 -2
- package/lib/model/IJsonModel.js +1 -2
- package/lib/model/LayoutWindow.js +83 -0
- package/lib/model/LayoutWindow.js.map +1 -0
- package/lib/model/Model.js +614 -496
- package/lib/model/Model.js.map +1 -1
- package/lib/model/Node.js +217 -228
- package/lib/model/Node.js.map +1 -1
- package/lib/model/RowNode.js +491 -504
- package/lib/model/RowNode.js.map +1 -1
- package/lib/model/TabNode.js +289 -184
- package/lib/model/TabNode.js.map +1 -1
- package/lib/model/TabSetNode.js +457 -446
- package/lib/model/TabSetNode.js.map +1 -1
- package/lib/model/Utils.js +47 -82
- package/lib/model/Utils.js.map +1 -1
- package/lib/view/BorderButton.js +124 -138
- package/lib/view/BorderButton.js.map +1 -1
- package/lib/view/BorderTab.js +47 -0
- package/lib/view/BorderTab.js.map +1 -0
- package/lib/view/BorderTabSet.js +134 -128
- package/lib/view/BorderTabSet.js.map +1 -1
- package/lib/view/DragContainer.js +16 -0
- package/lib/view/DragContainer.js.map +1 -0
- package/lib/view/ErrorBoundary.js +23 -27
- package/lib/view/ErrorBoundary.js.map +1 -1
- package/lib/view/Icons.js +40 -45
- package/lib/view/Icons.js.map +1 -1
- package/lib/view/Layout.js +918 -907
- package/lib/view/Layout.js.map +1 -1
- package/lib/view/Overlay.js +9 -0
- package/lib/view/Overlay.js.map +1 -0
- package/lib/view/PopoutWindow.js +129 -0
- package/lib/view/PopoutWindow.js.map +1 -0
- package/lib/view/PopupMenu.js +71 -0
- package/lib/view/PopupMenu.js.map +1 -0
- package/lib/view/Row.js +45 -0
- package/lib/view/Row.js.map +1 -0
- package/lib/view/SizeTracker.js +11 -0
- package/lib/view/SizeTracker.js.map +1 -0
- package/lib/view/Splitter.js +191 -147
- package/lib/view/Splitter.js.map +1 -1
- package/lib/view/Tab.js +86 -60
- package/lib/view/Tab.js.map +1 -1
- package/lib/view/TabButton.js +122 -135
- package/lib/view/TabButton.js.map +1 -1
- package/lib/view/TabButtonStamp.js +16 -21
- package/lib/view/TabButtonStamp.js.map +1 -1
- package/lib/view/TabOverflowHook.js +150 -149
- package/lib/view/TabOverflowHook.js.map +1 -1
- package/lib/view/TabSet.js +267 -234
- package/lib/view/TabSet.js.map +1 -1
- package/lib/view/Utils.js +126 -68
- package/lib/view/Utils.js.map +1 -1
- package/package.json +36 -30
- package/src/Attribute.ts +23 -0
- package/src/AttributeDefinitions.ts +38 -15
- package/src/DockLocation.ts +13 -13
- package/src/I18nLabel.ts +7 -9
- package/src/Rect.ts +53 -1
- package/src/Types.ts +16 -0
- package/src/index.ts +1 -2
- package/src/model/Actions.ts +49 -29
- package/src/model/BorderNode.ts +208 -214
- package/src/model/BorderSet.ts +42 -91
- package/src/model/IJsonModel.ts +883 -103
- package/src/model/LayoutWindow.ts +121 -0
- package/src/model/Model.ts +488 -366
- package/src/model/Node.ts +98 -111
- package/src/model/RowNode.ts +323 -319
- package/src/model/TabNode.ts +294 -110
- package/src/model/TabSetNode.ts +300 -242
- package/src/model/Utils.ts +6 -32
- package/src/view/BorderButton.tsx +32 -52
- package/src/view/BorderTab.tsx +70 -0
- package/src/view/BorderTabSet.tsx +64 -52
- package/src/view/DragContainer.tsx +32 -0
- package/src/view/Icons.tsx +6 -0
- package/src/view/Layout.tsx +1051 -1046
- package/src/view/Overlay.tsx +22 -0
- package/src/view/PopoutWindow.tsx +152 -0
- package/src/{PopupMenu.tsx → view/PopupMenu.tsx} +36 -31
- package/src/view/Row.tsx +68 -0
- package/src/view/SizeTracker.tsx +20 -0
- package/src/view/Splitter.tsx +167 -112
- package/src/view/Tab.tsx +76 -42
- package/src/view/TabButton.tsx +36 -55
- package/src/view/TabButtonStamp.tsx +5 -9
- package/src/view/TabOverflowHook.tsx +14 -9
- package/src/view/TabSet.tsx +217 -176
- package/src/view/Utils.tsx +119 -39
- package/style/_base.scss +140 -34
- package/style/dark.css +685 -580
- package/style/dark.css.map +1 -1
- package/style/dark.scss +3 -1
- package/style/gray.css +668 -563
- package/style/gray.css.map +1 -1
- package/style/gray.scss +2 -0
- package/style/light.css +669 -564
- package/style/light.css.map +1 -1
- package/style/light.scss +4 -2
- package/style/rounded.css +697 -0
- package/style/rounded.css.map +1 -0
- package/style/rounded.scss +194 -0
- package/style/underline.css +690 -585
- package/style/underline.css.map +1 -1
- package/style/underline.scss +2 -0
- package/cypress.config.ts +0 -16
- package/lib/DragDrop.js +0 -316
- package/lib/DragDrop.js.map +0 -1
- package/lib/PopupMenu.js +0 -68
- package/lib/PopupMenu.js.map +0 -1
- package/lib/model/SplitterNode.js +0 -72
- package/lib/model/SplitterNode.js.map +0 -1
- package/lib/view/FloatingWindow.js +0 -123
- package/lib/view/FloatingWindow.js.map +0 -1
- package/lib/view/FloatingWindowTab.js +0 -19
- package/lib/view/FloatingWindowTab.js.map +0 -1
- package/lib/view/TabFloating.js +0 -66
- package/lib/view/TabFloating.js.map +0 -1
- package/src/DragDrop.ts +0 -392
- package/src/model/SplitterNode.ts +0 -78
- package/src/view/FloatingWindow.tsx +0 -140
- package/src/view/FloatingWindowTab.tsx +0 -29
- package/src/view/TabFloating.tsx +0 -101
package/src/view/TabButton.tsx
CHANGED
|
@@ -3,43 +3,49 @@ import { I18nLabel } from "../I18nLabel";
|
|
|
3
3
|
import { Actions } from "../model/Actions";
|
|
4
4
|
import { TabNode } from "../model/TabNode";
|
|
5
5
|
import { TabSetNode } from "../model/TabSetNode";
|
|
6
|
-
import {
|
|
7
|
-
import { IconFactory, IIcons, ILayoutCallbacks, TitleFactory } from "./Layout";
|
|
6
|
+
import { LayoutInternal } from "./Layout";
|
|
8
7
|
import { ICloseType } from "../model/ICloseType";
|
|
9
8
|
import { CLASSES } from "../Types";
|
|
10
9
|
import { getRenderStateEx, isAuxMouseEvent } from "./Utils";
|
|
11
10
|
|
|
12
11
|
/** @internal */
|
|
13
12
|
export interface ITabButtonProps {
|
|
14
|
-
layout:
|
|
13
|
+
layout: LayoutInternal;
|
|
15
14
|
node: TabNode;
|
|
16
15
|
selected: boolean;
|
|
17
|
-
iconFactory?: IconFactory;
|
|
18
|
-
titleFactory?: TitleFactory;
|
|
19
|
-
icons: IIcons;
|
|
20
16
|
path: string;
|
|
21
17
|
}
|
|
22
18
|
|
|
23
19
|
/** @internal */
|
|
24
20
|
export const TabButton = (props: ITabButtonProps) => {
|
|
25
|
-
const { layout, node, selected,
|
|
21
|
+
const { layout, node, selected, path } = props;
|
|
26
22
|
const selfRef = React.useRef<HTMLDivElement | null>(null);
|
|
27
23
|
const contentRef = React.useRef<HTMLInputElement | null>(null);
|
|
24
|
+
const icons = layout.getIcons();
|
|
28
25
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
if (
|
|
32
|
-
|
|
26
|
+
React.useLayoutEffect(() => {
|
|
27
|
+
node.setTabRect(layout.getBoundingClientRect(selfRef.current!));
|
|
28
|
+
if (layout.getEditingTab() === node) {
|
|
29
|
+
(contentRef.current! as HTMLInputElement).select();
|
|
33
30
|
}
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
const onDragStart = (event: React.DragEvent<HTMLElement>) => {
|
|
34
|
+
event.stopPropagation(); // prevent starting a tabset drag as well
|
|
35
|
+
layout.setDragNode(event.nativeEvent, node as TabNode);
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
const onDragEnd = (event: React.DragEvent<HTMLElement>) => {
|
|
39
|
+
layout.clearDragMain();
|
|
34
40
|
};
|
|
35
41
|
|
|
36
|
-
const onAuxMouseClick = (event: React.MouseEvent<
|
|
42
|
+
const onAuxMouseClick = (event: React.MouseEvent<HTMLElement, MouseEvent>) => {
|
|
37
43
|
if (isAuxMouseEvent(event)) {
|
|
38
44
|
layout.auxMouseClick(node, event);
|
|
39
|
-
}
|
|
45
|
+
}
|
|
40
46
|
};
|
|
41
47
|
|
|
42
|
-
const onContextMenu = (event: React.MouseEvent<
|
|
48
|
+
const onContextMenu = (event: React.MouseEvent<HTMLElement, MouseEvent>) => {
|
|
43
49
|
layout.showContextMenu(node, event);
|
|
44
50
|
};
|
|
45
51
|
|
|
@@ -47,22 +53,21 @@ export const TabButton = (props: ITabButtonProps) => {
|
|
|
47
53
|
layout.doAction(Actions.selectTab(node.getId()));
|
|
48
54
|
};
|
|
49
55
|
|
|
50
|
-
const onDoubleClick = (event:
|
|
56
|
+
const onDoubleClick = (event: React.MouseEvent<HTMLElement>) => {
|
|
51
57
|
if (node.isEnableRename()) {
|
|
52
58
|
onRename();
|
|
59
|
+
event.stopPropagation();
|
|
53
60
|
}
|
|
54
61
|
};
|
|
55
62
|
|
|
56
63
|
const onRename = () => {
|
|
57
64
|
layout.setEditingTab(node);
|
|
58
|
-
layout.getCurrentDocument()!.body.addEventListener("
|
|
59
|
-
layout.getCurrentDocument()!.body.addEventListener("touchstart", onEndEdit);
|
|
65
|
+
layout.getCurrentDocument()!.body.addEventListener("pointerdown", onEndEdit);
|
|
60
66
|
};
|
|
61
67
|
|
|
62
68
|
const onEndEdit = (event: Event) => {
|
|
63
69
|
if (event.target !== contentRef.current!) {
|
|
64
|
-
layout.getCurrentDocument()!.body.removeEventListener("
|
|
65
|
-
layout.getCurrentDocument()!.body.removeEventListener("touchstart", onEndEdit);
|
|
70
|
+
layout.getCurrentDocument()!.body.removeEventListener("pointerdown", onEndEdit);
|
|
66
71
|
layout.setEditingTab(undefined);
|
|
67
72
|
}
|
|
68
73
|
};
|
|
@@ -81,7 +86,7 @@ export const TabButton = (props: ITabButtonProps) => {
|
|
|
81
86
|
return false;
|
|
82
87
|
};
|
|
83
88
|
|
|
84
|
-
const onClose = (event: React.MouseEvent<
|
|
89
|
+
const onClose = (event: React.MouseEvent<HTMLElement>) => {
|
|
85
90
|
if (isClosable()) {
|
|
86
91
|
layout.doAction(Actions.deleteTab(node.getId()));
|
|
87
92
|
} else {
|
|
@@ -89,35 +94,11 @@ export const TabButton = (props: ITabButtonProps) => {
|
|
|
89
94
|
}
|
|
90
95
|
};
|
|
91
96
|
|
|
92
|
-
const
|
|
97
|
+
const onClosePointerDown = (event: React.PointerEvent<HTMLElement>) => {
|
|
93
98
|
event.stopPropagation();
|
|
94
99
|
};
|
|
95
100
|
|
|
96
|
-
React.
|
|
97
|
-
updateRect();
|
|
98
|
-
if (layout.getEditingTab() === node) {
|
|
99
|
-
(contentRef.current! as HTMLInputElement).select();
|
|
100
|
-
}
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
const updateRect = () => {
|
|
104
|
-
// record position of tab in node
|
|
105
|
-
const layoutRect = layout.getDomRect();
|
|
106
|
-
const r = selfRef.current?.getBoundingClientRect();
|
|
107
|
-
if (r && layoutRect) {
|
|
108
|
-
node._setTabRect(
|
|
109
|
-
new Rect(
|
|
110
|
-
r.left - layoutRect.left,
|
|
111
|
-
r.top - layoutRect.top,
|
|
112
|
-
r.width,
|
|
113
|
-
r.height
|
|
114
|
-
)
|
|
115
|
-
);
|
|
116
|
-
}
|
|
117
|
-
};
|
|
118
|
-
|
|
119
|
-
const onTextBoxMouseDown = (event: React.MouseEvent<HTMLInputElement> | React.TouchEvent<HTMLInputElement>) => {
|
|
120
|
-
// console.log("onTextBoxMouseDown");
|
|
101
|
+
const onTextBoxPointerDown = (event: React.PointerEvent<HTMLInputElement>) => {
|
|
121
102
|
event.stopPropagation();
|
|
122
103
|
};
|
|
123
104
|
|
|
@@ -152,7 +133,7 @@ export const TabButton = (props: ITabButtonProps) => {
|
|
|
152
133
|
classNames += " " + node.getClassName();
|
|
153
134
|
}
|
|
154
135
|
|
|
155
|
-
const renderState = getRenderStateEx(layout, node
|
|
136
|
+
const renderState = getRenderStateEx(layout, node);
|
|
156
137
|
|
|
157
138
|
let content = renderState.content ? (
|
|
158
139
|
<div className={cm(CLASSES.FLEXLAYOUT__TAB_BUTTON_CONTENT)}>
|
|
@@ -174,8 +155,7 @@ export const TabButton = (props: ITabButtonProps) => {
|
|
|
174
155
|
autoFocus={true}
|
|
175
156
|
defaultValue={node.getName()}
|
|
176
157
|
onKeyDown={onTextBoxKeyPress}
|
|
177
|
-
|
|
178
|
-
onTouchStart={onTextBoxMouseDown}
|
|
158
|
+
onPointerDown={onTextBoxPointerDown}
|
|
179
159
|
/>
|
|
180
160
|
);
|
|
181
161
|
}
|
|
@@ -188,9 +168,8 @@ export const TabButton = (props: ITabButtonProps) => {
|
|
|
188
168
|
data-layout-path={path + "/button/close"}
|
|
189
169
|
title={closeTitle}
|
|
190
170
|
className={cm(CLASSES.FLEXLAYOUT__TAB_BUTTON_TRAILING)}
|
|
191
|
-
|
|
192
|
-
onClick={onClose}
|
|
193
|
-
onTouchStart={onCloseMouseDown}>
|
|
171
|
+
onPointerDown={onClosePointerDown}
|
|
172
|
+
onClick={onClose}>
|
|
194
173
|
{(typeof icons.close === "function") ? icons.close(node) : icons.close}
|
|
195
174
|
</div>
|
|
196
175
|
);
|
|
@@ -201,12 +180,14 @@ export const TabButton = (props: ITabButtonProps) => {
|
|
|
201
180
|
ref={selfRef}
|
|
202
181
|
data-layout-path={path}
|
|
203
182
|
className={classNames}
|
|
204
|
-
|
|
205
|
-
onClick={onAuxMouseClick}
|
|
183
|
+
onClick={onClick}
|
|
206
184
|
onAuxClick={onAuxMouseClick}
|
|
207
185
|
onContextMenu={onContextMenu}
|
|
208
|
-
onTouchStart={onMouseDown}
|
|
209
186
|
title={node.getHelpText()}
|
|
187
|
+
draggable={true}
|
|
188
|
+
onDragStart={onDragStart}
|
|
189
|
+
onDragEnd={onDragEnd}
|
|
190
|
+
onDoubleClick={onDoubleClick}
|
|
210
191
|
>
|
|
211
192
|
{leading}
|
|
212
193
|
{content}
|
|
@@ -1,33 +1,30 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
import { TabNode } from "../model/TabNode";
|
|
3
|
-
import {
|
|
3
|
+
import { LayoutInternal } from "./Layout";
|
|
4
4
|
import { CLASSES } from "../Types";
|
|
5
5
|
import { getRenderStateEx } from "./Utils";
|
|
6
6
|
|
|
7
7
|
/** @internal */
|
|
8
8
|
export interface ITabButtonStampProps {
|
|
9
9
|
node: TabNode;
|
|
10
|
-
layout:
|
|
11
|
-
iconFactory?: IconFactory;
|
|
12
|
-
titleFactory?: TitleFactory;
|
|
10
|
+
layout: LayoutInternal;
|
|
13
11
|
}
|
|
14
12
|
|
|
15
13
|
/** @internal */
|
|
16
14
|
export const TabButtonStamp = (props: ITabButtonStampProps) => {
|
|
17
|
-
const { layout, node
|
|
18
|
-
const selfRef = React.useRef<HTMLDivElement | null>(null);
|
|
15
|
+
const { layout, node } = props;
|
|
19
16
|
|
|
20
17
|
const cm = layout.getClassName;
|
|
21
18
|
|
|
22
19
|
let classNames = cm(CLASSES.FLEXLAYOUT__TAB_BUTTON_STAMP);
|
|
23
20
|
|
|
24
|
-
const renderState = getRenderStateEx(layout, node
|
|
21
|
+
const renderState = getRenderStateEx(layout, node);
|
|
25
22
|
|
|
26
23
|
let content = renderState.content ? (
|
|
27
24
|
<div className={cm(CLASSES.FLEXLAYOUT__TAB_BUTTON_CONTENT)}>
|
|
28
25
|
{renderState.content}
|
|
29
26
|
</div>)
|
|
30
|
-
: node.
|
|
27
|
+
: node.getNameForOverflowMenu();
|
|
31
28
|
|
|
32
29
|
const leading = renderState.leading ? (
|
|
33
30
|
<div className={cm(CLASSES.FLEXLAYOUT__TAB_BUTTON_LEADING)}>
|
|
@@ -36,7 +33,6 @@ export const TabButtonStamp = (props: ITabButtonStampProps) => {
|
|
|
36
33
|
|
|
37
34
|
return (
|
|
38
35
|
<div
|
|
39
|
-
ref={selfRef}
|
|
40
36
|
className={classNames}
|
|
41
37
|
title={node.getHelpText()}
|
|
42
38
|
>
|
|
@@ -9,12 +9,12 @@ import { Orientation } from "../Orientation";
|
|
|
9
9
|
export const useTabOverflow = (
|
|
10
10
|
node: TabSetNode | BorderNode,
|
|
11
11
|
orientation: Orientation,
|
|
12
|
-
toolbarRef: React.MutableRefObject<
|
|
13
|
-
stickyButtonsRef: React.MutableRefObject<
|
|
12
|
+
toolbarRef: React.MutableRefObject<HTMLElement | null>,
|
|
13
|
+
stickyButtonsRef: React.MutableRefObject<HTMLElement | null>
|
|
14
14
|
) => {
|
|
15
15
|
const firstRender = React.useRef<boolean>(true);
|
|
16
16
|
const tabsTruncated = React.useRef<boolean>(false);
|
|
17
|
-
const lastRect = React.useRef<Rect>(
|
|
17
|
+
const lastRect = React.useRef<Rect>(Rect.empty());
|
|
18
18
|
const selfRef = React.useRef<HTMLDivElement | null>(null);
|
|
19
19
|
|
|
20
20
|
const [position, setPosition] = React.useState<number>(0);
|
|
@@ -28,10 +28,13 @@ export const useTabOverflow = (
|
|
|
28
28
|
}, [node.getSelectedNode(), node.getRect().width, node.getRect().height]);
|
|
29
29
|
|
|
30
30
|
React.useLayoutEffect(() => {
|
|
31
|
-
|
|
31
|
+
const nodeRect = node instanceof TabSetNode ? node.getRect() : (node as BorderNode).getTabHeaderRect()!;
|
|
32
|
+
if (nodeRect.width > 0 && nodeRect.height > 0) {
|
|
33
|
+
updateVisibleTabs();
|
|
34
|
+
}
|
|
32
35
|
});
|
|
33
36
|
|
|
34
|
-
const instance =
|
|
37
|
+
const instance = toolbarRef.current;
|
|
35
38
|
React.useEffect(() => {
|
|
36
39
|
if (!instance) {
|
|
37
40
|
return;
|
|
@@ -109,10 +112,12 @@ export const useTabOverflow = (
|
|
|
109
112
|
// when selected tab is larger than available space then align left
|
|
110
113
|
if (getSize(selectedRect) + 2 * tabMargin >= endPos - getNear(nodeRect)) {
|
|
111
114
|
shiftPos = getNear(nodeRect) - selectedStart;
|
|
115
|
+
// console.log("shiftPos1", shiftPos, getNear(nodeRect), selectedStart);
|
|
112
116
|
} else {
|
|
113
117
|
if (selectedEnd > endPos || selectedStart < getNear(nodeRect)) {
|
|
114
118
|
if (selectedStart < getNear(nodeRect)) {
|
|
115
119
|
shiftPos = getNear(nodeRect) - selectedStart;
|
|
120
|
+
// console.log("shiftPos2", shiftPos, getNear(nodeRect), selectedStart);
|
|
116
121
|
}
|
|
117
122
|
// use second if statement to prevent tab moving back then forwards if not enough space for single tab
|
|
118
123
|
if (selectedEnd + shiftPos > endPos) {
|
|
@@ -124,6 +129,7 @@ export const useTabOverflow = (
|
|
|
124
129
|
|
|
125
130
|
const extraSpace = Math.max(0, endPos - (getFar(lastChild.getTabRect()!) + tabMargin + shiftPos));
|
|
126
131
|
const newPosition = Math.min(0, position + shiftPos + extraSpace);
|
|
132
|
+
// console.log("newPosition", newPosition, position, shiftPos, extraSpace);
|
|
127
133
|
|
|
128
134
|
// find hidden tabs
|
|
129
135
|
const diff = newPosition - position;
|
|
@@ -135,12 +141,11 @@ export const useTabOverflow = (
|
|
|
135
141
|
}
|
|
136
142
|
}
|
|
137
143
|
|
|
138
|
-
|
|
139
|
-
tabsTruncated.current = true;
|
|
140
|
-
}
|
|
144
|
+
tabsTruncated.current = hidden.length > 0;
|
|
141
145
|
|
|
142
146
|
firstRender.current = false; // need to do a second render
|
|
143
147
|
setHiddenTabs(hidden);
|
|
148
|
+
// console.log(newPosition);
|
|
144
149
|
setPosition(newPosition);
|
|
145
150
|
}
|
|
146
151
|
} else {
|
|
@@ -148,7 +153,7 @@ export const useTabOverflow = (
|
|
|
148
153
|
}
|
|
149
154
|
};
|
|
150
155
|
|
|
151
|
-
const onMouseWheel = (event: React.WheelEvent<
|
|
156
|
+
const onMouseWheel = (event: React.WheelEvent<HTMLElement>) => {
|
|
152
157
|
let delta = 0;
|
|
153
158
|
if (Math.abs(event.deltaX) > Math.abs(event.deltaY)) {
|
|
154
159
|
delta = -event.deltaX;
|