@itwin/appui-react 3.2.0-dev.3 → 3.2.0-dev.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/CHANGELOG.md +35 -1
  2. package/lib/cjs/appui-react/UiFramework.d.ts +11 -2
  3. package/lib/cjs/appui-react/UiFramework.d.ts.map +1 -1
  4. package/lib/cjs/appui-react/UiFramework.js +20 -3
  5. package/lib/cjs/appui-react/UiFramework.js.map +1 -1
  6. package/lib/cjs/appui-react/accudraw/AccuDrawFieldContainer.js +4 -4
  7. package/lib/cjs/appui-react/accudraw/AccuDrawFieldContainer.js.map +1 -1
  8. package/lib/cjs/appui-react/accudraw/AccuDrawInputField.js +1 -1
  9. package/lib/cjs/appui-react/accudraw/AccuDrawInputField.js.map +1 -1
  10. package/lib/cjs/appui-react/accudraw/AccuDrawPopupManager.js +6 -6
  11. package/lib/cjs/appui-react/accudraw/AccuDrawPopupManager.js.map +1 -1
  12. package/lib/cjs/appui-react/accudraw/Calculator.d.ts.map +1 -1
  13. package/lib/cjs/appui-react/accudraw/Calculator.js +3 -2
  14. package/lib/cjs/appui-react/accudraw/Calculator.js.map +1 -1
  15. package/lib/cjs/appui-react/backstage/BackstageComposerItem.d.ts.map +1 -1
  16. package/lib/cjs/appui-react/backstage/BackstageComposerItem.js +4 -2
  17. package/lib/cjs/appui-react/backstage/BackstageComposerItem.js.map +1 -1
  18. package/lib/cjs/appui-react/childwindow/ChildWindowManager.js +1 -1
  19. package/lib/cjs/appui-react/childwindow/ChildWindowManager.js.map +1 -1
  20. package/lib/cjs/appui-react/configurableui/state.d.ts +5 -0
  21. package/lib/cjs/appui-react/configurableui/state.d.ts.map +1 -1
  22. package/lib/cjs/appui-react/configurableui/state.js +7 -0
  23. package/lib/cjs/appui-react/configurableui/state.js.map +1 -1
  24. package/lib/cjs/appui-react/frontstage/Frontstage.d.ts +5 -0
  25. package/lib/cjs/appui-react/frontstage/Frontstage.d.ts.map +1 -1
  26. package/lib/cjs/appui-react/frontstage/Frontstage.js +9 -1
  27. package/lib/cjs/appui-react/frontstage/Frontstage.js.map +1 -1
  28. package/lib/cjs/appui-react/frontstage/FrontstageComposer.d.ts.map +1 -1
  29. package/lib/cjs/appui-react/frontstage/FrontstageComposer.js +2 -0
  30. package/lib/cjs/appui-react/frontstage/FrontstageComposer.js.map +1 -1
  31. package/lib/cjs/appui-react/frontstage/FrontstageDef.d.ts.map +1 -1
  32. package/lib/cjs/appui-react/frontstage/FrontstageDef.js +18 -9
  33. package/lib/cjs/appui-react/frontstage/FrontstageDef.js.map +1 -1
  34. package/lib/cjs/appui-react/frontstage/ModalSettingsStage.js +2 -2
  35. package/lib/cjs/appui-react/frontstage/ModalSettingsStage.js.map +1 -1
  36. package/lib/cjs/appui-react/popup/KeyinPalettePanel.js +1 -1
  37. package/lib/cjs/appui-react/popup/KeyinPalettePanel.js.map +1 -1
  38. package/lib/cjs/appui-react/redux/FrameworkState.d.ts +1 -1
  39. package/lib/cjs/appui-react/settings/ui/UiSettingsPage.d.ts.map +1 -1
  40. package/lib/cjs/appui-react/settings/ui/UiSettingsPage.js +16 -5
  41. package/lib/cjs/appui-react/settings/ui/UiSettingsPage.js.map +1 -1
  42. package/lib/cjs/appui-react/stagepanels/StagePanel.d.ts +1 -1
  43. package/lib/cjs/appui-react/stagepanels/StagePanel.d.ts.map +1 -1
  44. package/lib/cjs/appui-react/stagepanels/StagePanel.js.map +1 -1
  45. package/lib/cjs/appui-react/stagepanels/StagePanelDef.d.ts +6 -4
  46. package/lib/cjs/appui-react/stagepanels/StagePanelDef.d.ts.map +1 -1
  47. package/lib/cjs/appui-react/stagepanels/StagePanelDef.js +6 -10
  48. package/lib/cjs/appui-react/stagepanels/StagePanelDef.js.map +1 -1
  49. package/lib/cjs/appui-react/statusfields/Indicator.d.ts +3 -3
  50. package/lib/cjs/appui-react/statusfields/Indicator.d.ts.map +1 -1
  51. package/lib/cjs/appui-react/statusfields/Indicator.js.map +1 -1
  52. package/lib/cjs/appui-react/statusfields/tileloading/TileLoadingIndicator.js +1 -1
  53. package/lib/cjs/appui-react/statusfields/tileloading/TileLoadingIndicator.js.map +1 -1
  54. package/lib/cjs/appui-react/statusfields/toolassistance/ToolAssistanceField.d.ts.map +1 -1
  55. package/lib/cjs/appui-react/statusfields/toolassistance/ToolAssistanceField.js +35 -33
  56. package/lib/cjs/appui-react/statusfields/toolassistance/ToolAssistanceField.js.map +1 -1
  57. package/lib/cjs/appui-react/theme/ThemeManager.js +1 -1
  58. package/lib/cjs/appui-react/theme/ThemeManager.js.map +1 -1
  59. package/lib/cjs/appui-react/toolbar/Toolbar.js +1 -1
  60. package/lib/cjs/appui-react/toolbar/Toolbar.js.map +1 -1
  61. package/lib/cjs/appui-react/ui-items-provider/StandardStatusbarItemsProvider.d.ts +2 -2
  62. package/lib/cjs/appui-react/ui-items-provider/StandardStatusbarItemsProvider.js +4 -3
  63. package/lib/cjs/appui-react/ui-items-provider/StandardStatusbarItemsProvider.js.map +1 -1
  64. package/lib/cjs/appui-react/uistate/AppUiSettings.d.ts +3 -0
  65. package/lib/cjs/appui-react/uistate/AppUiSettings.d.ts.map +1 -1
  66. package/lib/cjs/appui-react/uistate/AppUiSettings.js +4 -0
  67. package/lib/cjs/appui-react/uistate/AppUiSettings.js.map +1 -1
  68. package/lib/cjs/appui-react/utils/PropsHelper.d.ts +3 -1
  69. package/lib/cjs/appui-react/utils/PropsHelper.d.ts.map +1 -1
  70. package/lib/cjs/appui-react/utils/PropsHelper.js +10 -0
  71. package/lib/cjs/appui-react/utils/PropsHelper.js.map +1 -1
  72. package/lib/cjs/appui-react/utils/UiShowHideManager.d.ts.map +1 -1
  73. package/lib/cjs/appui-react/utils/UiShowHideManager.js +1 -0
  74. package/lib/cjs/appui-react/utils/UiShowHideManager.js.map +1 -1
  75. package/lib/cjs/appui-react/widget-panels/Frontstage.d.ts +17 -1
  76. package/lib/cjs/appui-react/widget-panels/Frontstage.d.ts.map +1 -1
  77. package/lib/cjs/appui-react/widget-panels/Frontstage.js +129 -124
  78. package/lib/cjs/appui-react/widget-panels/Frontstage.js.map +1 -1
  79. package/lib/cjs/appui-react/widget-panels/ToolSettings.scss +10 -0
  80. package/lib/cjs/appui-react/widgets/BackstageAppButton.js +3 -3
  81. package/lib/cjs/appui-react/widgets/BackstageAppButton.js.map +1 -1
  82. package/lib/cjs/appui-react/widgets/BasicToolWidget.d.ts +1 -1
  83. package/lib/cjs/appui-react/widgets/BasicToolWidget.d.ts.map +1 -1
  84. package/lib/cjs/appui-react/widgets/BasicToolWidget.js.map +1 -1
  85. package/lib/cjs/appui-react/widgets/WidgetDef.d.ts +8 -1
  86. package/lib/cjs/appui-react/widgets/WidgetDef.d.ts.map +1 -1
  87. package/lib/cjs/appui-react/widgets/WidgetDef.js +13 -3
  88. package/lib/cjs/appui-react/widgets/WidgetDef.js.map +1 -1
  89. package/lib/cjs/appui-react/widgets/WidgetHost.d.ts +1 -1
  90. package/lib/cjs/appui-react/widgets/WidgetHost.d.ts.map +1 -1
  91. package/lib/cjs/appui-react/widgets/WidgetHost.js +56 -7
  92. package/lib/cjs/appui-react/widgets/WidgetHost.js.map +1 -1
  93. package/lib/cjs/appui-react/widgets/WidgetManager.d.ts.map +1 -1
  94. package/lib/cjs/appui-react/widgets/WidgetManager.js +2 -1
  95. package/lib/cjs/appui-react/widgets/WidgetManager.js.map +1 -1
  96. package/lib/esm/appui-react/UiFramework.d.ts +11 -2
  97. package/lib/esm/appui-react/UiFramework.d.ts.map +1 -1
  98. package/lib/esm/appui-react/UiFramework.js +20 -3
  99. package/lib/esm/appui-react/UiFramework.js.map +1 -1
  100. package/lib/esm/appui-react/accudraw/AccuDrawFieldContainer.js +4 -4
  101. package/lib/esm/appui-react/accudraw/AccuDrawFieldContainer.js.map +1 -1
  102. package/lib/esm/appui-react/accudraw/AccuDrawInputField.js +1 -1
  103. package/lib/esm/appui-react/accudraw/AccuDrawInputField.js.map +1 -1
  104. package/lib/esm/appui-react/accudraw/AccuDrawPopupManager.js +6 -6
  105. package/lib/esm/appui-react/accudraw/AccuDrawPopupManager.js.map +1 -1
  106. package/lib/esm/appui-react/accudraw/Calculator.d.ts.map +1 -1
  107. package/lib/esm/appui-react/accudraw/Calculator.js +5 -4
  108. package/lib/esm/appui-react/accudraw/Calculator.js.map +1 -1
  109. package/lib/esm/appui-react/backstage/BackstageComposerItem.d.ts.map +1 -1
  110. package/lib/esm/appui-react/backstage/BackstageComposerItem.js +5 -3
  111. package/lib/esm/appui-react/backstage/BackstageComposerItem.js.map +1 -1
  112. package/lib/esm/appui-react/childwindow/ChildWindowManager.js +1 -1
  113. package/lib/esm/appui-react/childwindow/ChildWindowManager.js.map +1 -1
  114. package/lib/esm/appui-react/configurableui/state.d.ts +5 -0
  115. package/lib/esm/appui-react/configurableui/state.d.ts.map +1 -1
  116. package/lib/esm/appui-react/configurableui/state.js +7 -0
  117. package/lib/esm/appui-react/configurableui/state.js.map +1 -1
  118. package/lib/esm/appui-react/frontstage/Frontstage.d.ts +5 -0
  119. package/lib/esm/appui-react/frontstage/Frontstage.d.ts.map +1 -1
  120. package/lib/esm/appui-react/frontstage/Frontstage.js +7 -0
  121. package/lib/esm/appui-react/frontstage/Frontstage.js.map +1 -1
  122. package/lib/esm/appui-react/frontstage/FrontstageComposer.d.ts.map +1 -1
  123. package/lib/esm/appui-react/frontstage/FrontstageComposer.js +2 -0
  124. package/lib/esm/appui-react/frontstage/FrontstageComposer.js.map +1 -1
  125. package/lib/esm/appui-react/frontstage/FrontstageDef.d.ts.map +1 -1
  126. package/lib/esm/appui-react/frontstage/FrontstageDef.js +18 -9
  127. package/lib/esm/appui-react/frontstage/FrontstageDef.js.map +1 -1
  128. package/lib/esm/appui-react/frontstage/ModalSettingsStage.js +2 -2
  129. package/lib/esm/appui-react/frontstage/ModalSettingsStage.js.map +1 -1
  130. package/lib/esm/appui-react/popup/KeyinPalettePanel.js +1 -1
  131. package/lib/esm/appui-react/popup/KeyinPalettePanel.js.map +1 -1
  132. package/lib/esm/appui-react/redux/FrameworkState.d.ts +1 -1
  133. package/lib/esm/appui-react/settings/ui/UiSettingsPage.d.ts.map +1 -1
  134. package/lib/esm/appui-react/settings/ui/UiSettingsPage.js +16 -5
  135. package/lib/esm/appui-react/settings/ui/UiSettingsPage.js.map +1 -1
  136. package/lib/esm/appui-react/stagepanels/StagePanel.d.ts +1 -1
  137. package/lib/esm/appui-react/stagepanels/StagePanel.d.ts.map +1 -1
  138. package/lib/esm/appui-react/stagepanels/StagePanel.js.map +1 -1
  139. package/lib/esm/appui-react/stagepanels/StagePanelDef.d.ts +6 -4
  140. package/lib/esm/appui-react/stagepanels/StagePanelDef.d.ts.map +1 -1
  141. package/lib/esm/appui-react/stagepanels/StagePanelDef.js +6 -10
  142. package/lib/esm/appui-react/stagepanels/StagePanelDef.js.map +1 -1
  143. package/lib/esm/appui-react/statusfields/Indicator.d.ts +3 -3
  144. package/lib/esm/appui-react/statusfields/Indicator.d.ts.map +1 -1
  145. package/lib/esm/appui-react/statusfields/Indicator.js.map +1 -1
  146. package/lib/esm/appui-react/statusfields/tileloading/TileLoadingIndicator.js +1 -1
  147. package/lib/esm/appui-react/statusfields/tileloading/TileLoadingIndicator.js.map +1 -1
  148. package/lib/esm/appui-react/statusfields/toolassistance/ToolAssistanceField.d.ts.map +1 -1
  149. package/lib/esm/appui-react/statusfields/toolassistance/ToolAssistanceField.js +20 -18
  150. package/lib/esm/appui-react/statusfields/toolassistance/ToolAssistanceField.js.map +1 -1
  151. package/lib/esm/appui-react/theme/ThemeManager.js +1 -1
  152. package/lib/esm/appui-react/theme/ThemeManager.js.map +1 -1
  153. package/lib/esm/appui-react/toolbar/Toolbar.js +1 -1
  154. package/lib/esm/appui-react/toolbar/Toolbar.js.map +1 -1
  155. package/lib/esm/appui-react/ui-items-provider/StandardStatusbarItemsProvider.d.ts +2 -2
  156. package/lib/esm/appui-react/ui-items-provider/StandardStatusbarItemsProvider.js +4 -3
  157. package/lib/esm/appui-react/ui-items-provider/StandardStatusbarItemsProvider.js.map +1 -1
  158. package/lib/esm/appui-react/uistate/AppUiSettings.d.ts +3 -0
  159. package/lib/esm/appui-react/uistate/AppUiSettings.d.ts.map +1 -1
  160. package/lib/esm/appui-react/uistate/AppUiSettings.js +4 -0
  161. package/lib/esm/appui-react/uistate/AppUiSettings.js.map +1 -1
  162. package/lib/esm/appui-react/utils/PropsHelper.d.ts +3 -1
  163. package/lib/esm/appui-react/utils/PropsHelper.d.ts.map +1 -1
  164. package/lib/esm/appui-react/utils/PropsHelper.js +11 -1
  165. package/lib/esm/appui-react/utils/PropsHelper.js.map +1 -1
  166. package/lib/esm/appui-react/utils/UiShowHideManager.d.ts.map +1 -1
  167. package/lib/esm/appui-react/utils/UiShowHideManager.js +1 -0
  168. package/lib/esm/appui-react/utils/UiShowHideManager.js.map +1 -1
  169. package/lib/esm/appui-react/widget-panels/Frontstage.d.ts +17 -1
  170. package/lib/esm/appui-react/widget-panels/Frontstage.d.ts.map +1 -1
  171. package/lib/esm/appui-react/widget-panels/Frontstage.js +130 -125
  172. package/lib/esm/appui-react/widget-panels/Frontstage.js.map +1 -1
  173. package/lib/esm/appui-react/widget-panels/ToolSettings.scss +10 -0
  174. package/lib/esm/appui-react/widgets/BackstageAppButton.js +3 -3
  175. package/lib/esm/appui-react/widgets/BackstageAppButton.js.map +1 -1
  176. package/lib/esm/appui-react/widgets/BasicToolWidget.d.ts +1 -1
  177. package/lib/esm/appui-react/widgets/BasicToolWidget.d.ts.map +1 -1
  178. package/lib/esm/appui-react/widgets/BasicToolWidget.js.map +1 -1
  179. package/lib/esm/appui-react/widgets/WidgetDef.d.ts +8 -1
  180. package/lib/esm/appui-react/widgets/WidgetDef.d.ts.map +1 -1
  181. package/lib/esm/appui-react/widgets/WidgetDef.js +13 -3
  182. package/lib/esm/appui-react/widgets/WidgetDef.js.map +1 -1
  183. package/lib/esm/appui-react/widgets/WidgetHost.d.ts +1 -1
  184. package/lib/esm/appui-react/widgets/WidgetHost.d.ts.map +1 -1
  185. package/lib/esm/appui-react/widgets/WidgetHost.js +56 -7
  186. package/lib/esm/appui-react/widgets/WidgetHost.js.map +1 -1
  187. package/lib/esm/appui-react/widgets/WidgetManager.d.ts.map +1 -1
  188. package/lib/esm/appui-react/widgets/WidgetManager.js +2 -1
  189. package/lib/esm/appui-react/widgets/WidgetManager.js.map +1 -1
  190. package/lib/public/locales/en/UiFramework.json +3 -1
  191. package/package.json +34 -34
@@ -14,7 +14,7 @@ import { assert, Logger, ProcessDetector } from "@itwin/core-bentley";
14
14
  import { StagePanelLocation, UiItemsManager, WidgetState } from "@itwin/appui-abstract";
15
15
  import { Size, UiStateStorageStatus } from "@itwin/core-react";
16
16
  import { ToolbarPopupAutoHideContext } from "@itwin/components-react";
17
- import { addPanelWidget, addTab, addWidgetTabToFloatingPanel, convertAllPopupWidgetContainersToFloating, createNineZoneState, createTabsState, createTabState, createWidgetState, findTab, findWidget, floatingWidgetBringToFront, FloatingWidgets, getUniqueId, isFloatingLocation, isHorizontalPanelSide, NineZone, NineZoneStateReducer, panelSides, removeTab, toolSettingsTabId, WidgetPanels, } from "@itwin/appui-layout-react";
17
+ import { addPanelWidget, addTab, addWidgetTabToFloatingPanel, addWidgetTabToPanelSection, convertAllPopupWidgetContainersToFloating, createNineZoneState, createTabsState, createTabState, createWidgetState, findTab, findWidget, floatingWidgetBringToFront, FloatingWidgets, getUniqueId, getWidgetPanelSectionId, isFloatingLocation, isHorizontalPanelSide, NineZone, NineZoneStateReducer, panelSides, removeTab, toolSettingsTabId, WidgetPanels, } from "@itwin/appui-layout-react";
18
18
  import { useActiveFrontstageDef } from "../frontstage/Frontstage";
19
19
  import { FrontstageManager } from "../frontstage/FrontstageManager";
20
20
  import { StagePanelState } from "../stagepanels/StagePanelDef";
@@ -31,7 +31,7 @@ import { ToolSettingsContent, WidgetPanelsToolSettings } from "./ToolSettings";
31
31
  import { useEscapeSetFocusToHome } from "../hooks/useEscapeSetFocusToHome";
32
32
  import { useSelector } from "react-redux";
33
33
  import { useUiVisibility } from "../hooks/useUiVisibility";
34
- const panelZoneKeys = ["start", "middle", "end"];
34
+ const panelZoneKeys = ["start", "end"];
35
35
  // istanbul ignore next
36
36
  const WidgetPanelsFrontstageComponent = React.memo(function WidgetPanelsFrontstageComponent() {
37
37
  const activeModalFrontstageInfo = useActiveModalFrontstageInfo();
@@ -181,9 +181,13 @@ export function ActiveFrontstageDefProvider({ frontstageDef }) {
181
181
  const frameworkState = state[UiFramework.frameworkStateKey];
182
182
  return !!frameworkState.configurableUiState.showWidgetIcon;
183
183
  });
184
+ const autoCollapseUnpinnedPanels = useSelector((state) => {
185
+ const frameworkState = state[UiFramework.frameworkStateKey];
186
+ return !!frameworkState.configurableUiState.autoCollapseUnpinnedPanels;
187
+ });
184
188
  const handleKeyDown = useEscapeSetFocusToHome();
185
189
  return (React.createElement("div", { className: "uifw-widgetPanels-frontstage", onKeyDown: handleKeyDown, role: "presentation" },
186
- React.createElement(NineZone, { dispatch: dispatch, labels: labels, state: nineZone, tab: tabElement, showWidgetIcon: showWidgetIcon, toolSettingsContent: toolSettingsContent, widgetContent: widgetContent }, widgetPanelsFrontstage)));
190
+ React.createElement(NineZone, { dispatch: dispatch, labels: labels, state: nineZone, tab: tabElement, showWidgetIcon: showWidgetIcon, autoCollapseUnpinnedPanels: autoCollapseUnpinnedPanels, toolSettingsContent: toolSettingsContent, widgetContent: widgetContent }, widgetPanelsFrontstage)));
187
191
  }
188
192
  /** @internal */
189
193
  export function useLabels() {
@@ -211,6 +215,7 @@ export function addWidgets(state, widgets, side, widgetId) {
211
215
  label,
212
216
  iconSpec: widget.iconSpec,
213
217
  preferredPanelWidgetSize: widget.preferredPanelSize,
218
+ preferredFloatingWidgetSize: widget.defaultFloatingSize,
214
219
  canPopout: widget.canPopout,
215
220
  isFloatingStateWindowResizable: widget.isFloatingStateWindowResizable,
216
221
  });
@@ -233,15 +238,16 @@ export function appendWidgets(state, widgetDefs, side, preferredWidgetIndex) {
233
238
  var _a;
234
239
  if (widgetDefs.length === 0)
235
240
  return state;
236
- // Add new tabs.
237
- const tabs = new Array();
241
+ // Add missing widget tabs.
238
242
  for (const widgetDef of widgetDefs) {
239
243
  const label = getWidgetLabel(widgetDef.label);
240
244
  const saveTab = state.tabs[widgetDef.id];
241
245
  const preferredPanelWidgetSize = saveTab ? saveTab.preferredPanelWidgetSize : widgetDef.preferredPanelSize;
242
- const preferredFloatingWidgetSize = saveTab ? saveTab.preferredFloatingWidgetSize : undefined;
246
+ const preferredFloatingWidgetSize = saveTab ? saveTab.preferredFloatingWidgetSize : widgetDef.defaultFloatingSize;
243
247
  const preferredPopoutWidgetSize = saveTab ? saveTab.preferredPopoutWidgetSize : undefined;
244
- const userSized = saveTab ? saveTab.userSized : undefined;
248
+ // if a defaultFloatingSize is specified then this mean the widget can't determine its intrinsic size and must be explicitly sized
249
+ const userSized = saveTab ? (saveTab.userSized || !!widgetDef.defaultFloatingSize && !!saveTab.preferredFloatingWidgetSize)
250
+ : !!widgetDef.defaultFloatingSize;
245
251
  state = addTab(state, widgetDef.id, {
246
252
  label,
247
253
  iconSpec: widgetDef.iconSpec,
@@ -260,29 +266,8 @@ export function appendWidgets(state, widgetDefs, side, preferredWidgetIndex) {
260
266
  state = addWidgetTabToFloatingPanel(state, floatingContainerId, widgetDef.id, homePanelInfo, preferredFloatingWidgetSize, preferredPosition, userSized, widgetDef.isFloatingStateWindowResizable);
261
267
  }
262
268
  else {
263
- tabs.push(widgetDef.id);
264
- }
265
- }
266
- if (tabs.length) {
267
- const panel = state.panels[side];
268
- preferredWidgetIndex = preferredWidgetIndex >= panel.maxWidgetCount ? panel.maxWidgetCount - 1 : preferredWidgetIndex;
269
- if (preferredWidgetIndex < panel.widgets.length) {
270
- // Append tabs to existing widget.
271
- const widgetId = panel.widgets[preferredWidgetIndex];
272
- state = produce(state, (draft) => {
273
- const widget = draft.widgets[widgetId];
274
- for (const tab of tabs) {
275
- widget.tabs.push(tab);
276
- }
277
- });
278
- }
279
- else {
280
- const newWidgetId = getNextAvailablePanelWidgetId(panel);
281
- const widget = createWidgetState(newWidgetId, tabs);
282
- state = produce(state, (draft) => {
283
- draft.panels[side].widgets.push(widget.id);
284
- draft.widgets[widget.id] = castDraft(widget);
285
- });
269
+ const widgetPanelSectionId = getWidgetPanelSectionId(side, preferredWidgetIndex);
270
+ state = addWidgetTabToPanelSection(state, side, widgetPanelSectionId, widgetDef.id);
286
271
  }
287
272
  }
288
273
  return state;
@@ -306,28 +291,26 @@ function processPopoutWidgets(initialState, frontstageDef) {
306
291
  * @internal
307
292
  */
308
293
  export function addMissingWidgets(frontstageDef, initialState) {
309
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v;
294
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t;
310
295
  let state = initialState;
311
296
  state = appendWidgets(state, determineNewWidgets((_a = frontstageDef.centerLeft) === null || _a === void 0 ? void 0 : _a.widgetDefs, initialState), "left", 0);
312
297
  state = appendWidgets(state, determineNewWidgets((_b = frontstageDef.leftPanel) === null || _b === void 0 ? void 0 : _b.panelZones.start.widgetDefs, initialState), "left", 0);
313
298
  state = appendWidgets(state, determineNewWidgets((_c = frontstageDef.bottomLeft) === null || _c === void 0 ? void 0 : _c.widgetDefs, initialState), "left", 1);
314
- state = appendWidgets(state, determineNewWidgets((_d = frontstageDef.leftPanel) === null || _d === void 0 ? void 0 : _d.panelZones.middle.widgetDefs, initialState), "left", 1);
315
- state = appendWidgets(state, determineNewWidgets((_e = frontstageDef.leftPanel) === null || _e === void 0 ? void 0 : _e.panelWidgetDefs, initialState), "left", 2);
316
- state = appendWidgets(state, determineNewWidgets((_f = frontstageDef.leftPanel) === null || _f === void 0 ? void 0 : _f.panelZones.end.widgetDefs, initialState), "left", 2);
317
- state = appendWidgets(state, determineNewWidgets((_g = frontstageDef.centerRight) === null || _g === void 0 ? void 0 : _g.widgetDefs, initialState), "right", 0);
318
- state = appendWidgets(state, determineNewWidgets((_h = frontstageDef.rightPanel) === null || _h === void 0 ? void 0 : _h.panelZones.start.widgetDefs, initialState), "right", 0);
319
- state = appendWidgets(state, determineNewWidgets((_j = frontstageDef.bottomRight) === null || _j === void 0 ? void 0 : _j.widgetDefs, initialState), "right", 1);
320
- state = appendWidgets(state, determineNewWidgets((_k = frontstageDef.rightPanel) === null || _k === void 0 ? void 0 : _k.panelZones.middle.widgetDefs, initialState), "right", 1);
321
- state = appendWidgets(state, determineNewWidgets((_l = frontstageDef.rightPanel) === null || _l === void 0 ? void 0 : _l.panelWidgetDefs, initialState), "right", 2);
322
- state = appendWidgets(state, determineNewWidgets((_m = frontstageDef.rightPanel) === null || _m === void 0 ? void 0 : _m.panelZones.end.widgetDefs, initialState), "right", 2);
323
- state = appendWidgets(state, determineNewWidgets((_o = frontstageDef.topPanel) === null || _o === void 0 ? void 0 : _o.panelWidgetDefs, initialState), "top", 0);
324
- state = appendWidgets(state, determineNewWidgets((_p = frontstageDef.topPanel) === null || _p === void 0 ? void 0 : _p.panelZones.start.widgetDefs, initialState), "top", 0);
325
- state = appendWidgets(state, determineNewWidgets((_q = frontstageDef.topMostPanel) === null || _q === void 0 ? void 0 : _q.panelWidgetDefs, initialState), "top", 1); // eslint-disable-line deprecation/deprecation
326
- state = appendWidgets(state, determineNewWidgets((_r = frontstageDef.topPanel) === null || _r === void 0 ? void 0 : _r.panelZones.end.widgetDefs, initialState), "top", 1);
327
- state = appendWidgets(state, determineNewWidgets((_s = frontstageDef.bottomPanel) === null || _s === void 0 ? void 0 : _s.panelWidgetDefs, initialState), "bottom", 0);
328
- state = appendWidgets(state, determineNewWidgets((_t = frontstageDef.bottomPanel) === null || _t === void 0 ? void 0 : _t.panelZones.start.widgetDefs, initialState), "bottom", 0);
329
- state = appendWidgets(state, determineNewWidgets((_u = frontstageDef.bottomMostPanel) === null || _u === void 0 ? void 0 : _u.panelWidgetDefs, initialState), "bottom", 1); // eslint-disable-line deprecation/deprecation
330
- state = appendWidgets(state, determineNewWidgets((_v = frontstageDef.bottomPanel) === null || _v === void 0 ? void 0 : _v.panelZones.end.widgetDefs, initialState), "bottom", 1);
299
+ state = appendWidgets(state, determineNewWidgets((_d = frontstageDef.leftPanel) === null || _d === void 0 ? void 0 : _d.panelWidgetDefs, initialState), "left", 1);
300
+ state = appendWidgets(state, determineNewWidgets((_e = frontstageDef.leftPanel) === null || _e === void 0 ? void 0 : _e.panelZones.end.widgetDefs, initialState), "left", 1);
301
+ state = appendWidgets(state, determineNewWidgets((_f = frontstageDef.centerRight) === null || _f === void 0 ? void 0 : _f.widgetDefs, initialState), "right", 0);
302
+ state = appendWidgets(state, determineNewWidgets((_g = frontstageDef.rightPanel) === null || _g === void 0 ? void 0 : _g.panelZones.start.widgetDefs, initialState), "right", 0);
303
+ state = appendWidgets(state, determineNewWidgets((_h = frontstageDef.bottomRight) === null || _h === void 0 ? void 0 : _h.widgetDefs, initialState), "right", 1);
304
+ state = appendWidgets(state, determineNewWidgets((_j = frontstageDef.rightPanel) === null || _j === void 0 ? void 0 : _j.panelWidgetDefs, initialState), "right", 1);
305
+ state = appendWidgets(state, determineNewWidgets((_k = frontstageDef.rightPanel) === null || _k === void 0 ? void 0 : _k.panelZones.end.widgetDefs, initialState), "right", 1);
306
+ state = appendWidgets(state, determineNewWidgets((_l = frontstageDef.topPanel) === null || _l === void 0 ? void 0 : _l.panelWidgetDefs, initialState), "top", 0);
307
+ state = appendWidgets(state, determineNewWidgets((_m = frontstageDef.topPanel) === null || _m === void 0 ? void 0 : _m.panelZones.start.widgetDefs, initialState), "top", 0);
308
+ state = appendWidgets(state, determineNewWidgets((_o = frontstageDef.topMostPanel) === null || _o === void 0 ? void 0 : _o.panelWidgetDefs, initialState), "top", 1); // eslint-disable-line deprecation/deprecation
309
+ state = appendWidgets(state, determineNewWidgets((_p = frontstageDef.topPanel) === null || _p === void 0 ? void 0 : _p.panelZones.end.widgetDefs, initialState), "top", 1);
310
+ state = appendWidgets(state, determineNewWidgets((_q = frontstageDef.bottomPanel) === null || _q === void 0 ? void 0 : _q.panelWidgetDefs, initialState), "bottom", 0);
311
+ state = appendWidgets(state, determineNewWidgets((_r = frontstageDef.bottomPanel) === null || _r === void 0 ? void 0 : _r.panelZones.start.widgetDefs, initialState), "bottom", 0);
312
+ state = appendWidgets(state, determineNewWidgets((_s = frontstageDef.bottomMostPanel) === null || _s === void 0 ? void 0 : _s.panelWidgetDefs, initialState), "bottom", 1); // eslint-disable-line deprecation/deprecation
313
+ state = appendWidgets(state, determineNewWidgets((_t = frontstageDef.bottomPanel) === null || _t === void 0 ? void 0 : _t.panelZones.end.widgetDefs, initialState), "bottom", 1);
331
314
  return state;
332
315
  }
333
316
  /** Removes widgets with Hidden defaultState. */
@@ -383,18 +366,12 @@ export function getWidgetId(side, key) {
383
366
  if (key === "start") {
384
367
  return "leftStart";
385
368
  }
386
- else if (key === "middle") {
387
- return "leftMiddle";
388
- }
389
369
  return "leftEnd";
390
370
  }
391
371
  case "right": {
392
372
  if (key === "start") {
393
373
  return "rightStart";
394
374
  }
395
- else if (key === "middle") {
396
- return "rightMiddle";
397
- }
398
375
  return "rightEnd";
399
376
  }
400
377
  case "top": {
@@ -411,74 +388,90 @@ export function getWidgetId(side, key) {
411
388
  }
412
389
  }
413
390
  /** @internal */
414
- function getNextAvailablePanelWidgetId(panel) {
415
- const index = panel.widgets.length;
416
- return getWidgetId(panel.side, panelZoneKeys[index]);
417
- }
418
- function isVerticalPanelSide(side) { return !isHorizontalPanelSide(side); }
419
- /** @internal */
420
391
  export function getPanelZoneWidgets(frontstageDef, panelZone) {
421
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v;
392
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t;
422
393
  switch (panelZone) {
423
394
  case "leftStart": {
424
- return [
425
- ...((_a = frontstageDef.centerLeft) === null || _a === void 0 ? void 0 : _a.widgetDefs) || [],
426
- ...((_b = frontstageDef.leftPanel) === null || _b === void 0 ? void 0 : _b.panelZones.start.widgetDefs) || [],
427
- ];
428
- }
429
- case "leftMiddle": {
430
- return [
431
- ...((_c = frontstageDef.bottomLeft) === null || _c === void 0 ? void 0 : _c.widgetDefs) || [],
432
- ...((_d = frontstageDef.leftPanel) === null || _d === void 0 ? void 0 : _d.panelZones.middle.widgetDefs) || [],
433
- ];
395
+ const outArray = [...((_a = frontstageDef.centerLeft) === null || _a === void 0 ? void 0 : _a.widgetDefs) || []];
396
+ (_b = frontstageDef.leftPanel) === null || _b === void 0 ? void 0 : _b.panelZones.start.widgetDefs.forEach((widgetDef) => {
397
+ // istanbul ignore else
398
+ if (undefined === outArray.find((widget) => widget.id === widgetDef.id))
399
+ outArray.push(widgetDef);
400
+ });
401
+ return outArray;
434
402
  }
435
403
  case "leftEnd": {
436
- return [
437
- ...((_e = frontstageDef.leftPanel) === null || _e === void 0 ? void 0 : _e.panelWidgetDefs) || [],
438
- ...((_f = frontstageDef.leftPanel) === null || _f === void 0 ? void 0 : _f.panelZones.end.widgetDefs) || [],
439
- ];
404
+ const outArray = [...((_c = frontstageDef.bottomLeft) === null || _c === void 0 ? void 0 : _c.widgetDefs) || []];
405
+ (_d = frontstageDef.leftPanel) === null || _d === void 0 ? void 0 : _d.panelZones.end.widgetDefs.forEach((widgetDef) => {
406
+ // istanbul ignore else
407
+ if (undefined === outArray.find((widget) => widget.id === widgetDef.id))
408
+ outArray.push(widgetDef);
409
+ });
410
+ (_e = frontstageDef.leftPanel) === null || _e === void 0 ? void 0 : _e.panelWidgetDefs.forEach((widgetDef) => {
411
+ // istanbul ignore else
412
+ if (undefined === outArray.find((widget) => widget.id === widgetDef.id))
413
+ outArray.push(widgetDef);
414
+ });
415
+ return outArray;
440
416
  }
441
417
  case "rightStart": {
442
- return [
443
- ...((_g = frontstageDef.centerRight) === null || _g === void 0 ? void 0 : _g.widgetDefs) || [],
444
- ...((_h = frontstageDef.rightPanel) === null || _h === void 0 ? void 0 : _h.panelZones.start.widgetDefs) || [],
445
- ];
446
- }
447
- case "rightMiddle": {
448
- return [
449
- ...((_j = frontstageDef.bottomRight) === null || _j === void 0 ? void 0 : _j.widgetDefs) || [],
450
- ...((_k = frontstageDef.rightPanel) === null || _k === void 0 ? void 0 : _k.panelZones.middle.widgetDefs) || [],
451
- ];
418
+ const outArray = [...((_f = frontstageDef.centerRight) === null || _f === void 0 ? void 0 : _f.widgetDefs) || []];
419
+ (_g = frontstageDef.rightPanel) === null || _g === void 0 ? void 0 : _g.panelZones.start.widgetDefs.forEach((widgetDef) => {
420
+ // istanbul ignore else
421
+ if (undefined === outArray.find((widget) => widget.id === widgetDef.id))
422
+ outArray.push(widgetDef);
423
+ });
424
+ return outArray;
452
425
  }
453
426
  case "rightEnd": {
454
- return [
455
- ...((_l = frontstageDef.rightPanel) === null || _l === void 0 ? void 0 : _l.panelWidgetDefs) || [],
456
- ...((_m = frontstageDef.rightPanel) === null || _m === void 0 ? void 0 : _m.panelZones.end.widgetDefs) || [],
457
- ];
427
+ const outArray = [...((_h = frontstageDef.bottomRight) === null || _h === void 0 ? void 0 : _h.widgetDefs) || []];
428
+ (_j = frontstageDef.rightPanel) === null || _j === void 0 ? void 0 : _j.panelZones.end.widgetDefs.forEach((widgetDef) => {
429
+ // istanbul ignore else
430
+ if (undefined === outArray.find((widget) => widget.id === widgetDef.id))
431
+ outArray.push(widgetDef);
432
+ });
433
+ (_k = frontstageDef.rightPanel) === null || _k === void 0 ? void 0 : _k.panelWidgetDefs.forEach((widgetDef) => {
434
+ // istanbul ignore else
435
+ if (undefined === outArray.find((widget) => widget.id === widgetDef.id))
436
+ outArray.push(widgetDef);
437
+ });
438
+ return outArray;
458
439
  }
459
440
  case "topStart": {
460
- return [
461
- ...((_o = frontstageDef.topPanel) === null || _o === void 0 ? void 0 : _o.panelWidgetDefs) || [],
462
- ...((_p = frontstageDef.topPanel) === null || _p === void 0 ? void 0 : _p.panelZones.start.widgetDefs) || [],
463
- ];
441
+ const outArray = [...((_l = frontstageDef.topPanel) === null || _l === void 0 ? void 0 : _l.panelWidgetDefs) || []];
442
+ (_m = frontstageDef.topPanel) === null || _m === void 0 ? void 0 : _m.panelZones.start.widgetDefs.forEach((widgetDef) => {
443
+ // istanbul ignore else
444
+ if (undefined === outArray.find((widget) => widget.id === widgetDef.id))
445
+ outArray.push(widgetDef);
446
+ });
447
+ return outArray;
464
448
  }
465
449
  case "topEnd": {
466
- return [
467
- ...((_q = frontstageDef.topMostPanel) === null || _q === void 0 ? void 0 : _q.panelWidgetDefs) || [],
468
- ...((_r = frontstageDef.topPanel) === null || _r === void 0 ? void 0 : _r.panelZones.end.widgetDefs) || [],
469
- ];
450
+ const outArray = [...((_o = frontstageDef.topMostPanel) === null || _o === void 0 ? void 0 : _o.panelWidgetDefs) || []]; // eslint-disable-line deprecation/deprecation
451
+ (_p = frontstageDef.topPanel) === null || _p === void 0 ? void 0 : _p.panelZones.end.widgetDefs.forEach((widgetDef) => {
452
+ // istanbul ignore else
453
+ if (undefined === outArray.find((widget) => widget.id === widgetDef.id))
454
+ outArray.push(widgetDef);
455
+ });
456
+ return outArray;
470
457
  }
471
458
  case "bottomStart": {
472
- return [
473
- ...((_s = frontstageDef.bottomPanel) === null || _s === void 0 ? void 0 : _s.panelWidgetDefs) || [],
474
- ...((_t = frontstageDef.bottomPanel) === null || _t === void 0 ? void 0 : _t.panelZones.start.widgetDefs) || [],
475
- ];
459
+ const outArray = [...((_q = frontstageDef.bottomPanel) === null || _q === void 0 ? void 0 : _q.panelWidgetDefs) || []];
460
+ (_r = frontstageDef.bottomPanel) === null || _r === void 0 ? void 0 : _r.panelZones.start.widgetDefs.forEach((widgetDef) => {
461
+ // istanbul ignore else
462
+ if (undefined === outArray.find((widget) => widget.id === widgetDef.id))
463
+ outArray.push(widgetDef);
464
+ });
465
+ return outArray;
476
466
  }
477
467
  case "bottomEnd": {
478
- return [
479
- ...((_u = frontstageDef.bottomMostPanel) === null || _u === void 0 ? void 0 : _u.panelWidgetDefs) || [],
480
- ...((_v = frontstageDef.bottomPanel) === null || _v === void 0 ? void 0 : _v.panelZones.end.widgetDefs) || [],
481
- ];
468
+ const outArray = [...((_s = frontstageDef.bottomMostPanel) === null || _s === void 0 ? void 0 : _s.panelWidgetDefs) || []]; // eslint-disable-line deprecation/deprecation
469
+ (_t = frontstageDef.bottomPanel) === null || _t === void 0 ? void 0 : _t.panelZones.end.widgetDefs.forEach((widgetDef) => {
470
+ // istanbul ignore else
471
+ if (undefined === outArray.find((widget) => widget.id === widgetDef.id))
472
+ outArray.push(widgetDef);
473
+ });
474
+ return outArray;
482
475
  }
483
476
  }
484
477
  }
@@ -487,11 +480,6 @@ export function addPanelWidgets(state, frontstageDef, side) {
487
480
  const start = getWidgetId(side, "start");
488
481
  const startWidgets = getPanelZoneWidgets(frontstageDef, start);
489
482
  state = addWidgets(state, startWidgets, side, start);
490
- if (isVerticalPanelSide(side)) {
491
- const middle = getWidgetId(side, "middle");
492
- const middleWidgets = getPanelZoneWidgets(frontstageDef, middle);
493
- state = addWidgets(state, middleWidgets, side, middle);
494
- }
495
483
  const end = getWidgetId(side, "end");
496
484
  const endWidgets = getPanelZoneWidgets(frontstageDef, end);
497
485
  state = addWidgets(state, endWidgets, side, end);
@@ -529,7 +517,7 @@ function getPanelMaxSize(maxSizeSpec, panel, nineZoneSize) {
529
517
  const size = isHorizontalPanelSide(panel) ? nineZoneSize.height : nineZoneSize.width;
530
518
  return maxSizeSpec.percentage / 100 * size;
531
519
  }
532
- const stateVersion = 11; // this needs to be bumped when NineZoneState is changed (to recreate layout).
520
+ const stateVersion = 12; // this needs to be bumped when NineZoneState is changed (to recreate layout).
533
521
  /** @internal */
534
522
  export function initializeNineZoneState(frontstageDef) {
535
523
  let nineZone = defaultNineZone;
@@ -613,6 +601,31 @@ export function restoreNineZoneState(frontstageDef, saved) {
613
601
  isFloatingStateWindowResizable: widgetDef === null || widgetDef === void 0 ? void 0 : widgetDef.isFloatingStateWindowResizable,
614
602
  };
615
603
  }
604
+ // remove center panel section if one is found in left or right panels
605
+ const oldLeftMiddleIndex = saved.panels.left.widgets.findIndex((value) => value === "leftMiddle");
606
+ // istanbul ignore next
607
+ if (-1 !== oldLeftMiddleIndex) {
608
+ draft.panels.left.widgets = saved.panels.left.widgets.filter((value) => value !== "leftMiddle");
609
+ if ("leftEnd" in draft.widgets) {
610
+ draft.widgets.leftMiddle.tabs.forEach((tab) => draft.widgets.leftEnd.tabs.push(tab));
611
+ }
612
+ else {
613
+ draft.widgets.leftEnd = { ...draft.widgets.leftMiddle };
614
+ delete draft.widgets.leftMiddle;
615
+ }
616
+ }
617
+ const oldRightMiddleIndex = saved.panels.right.widgets.findIndex((value) => value === "rightMiddle");
618
+ // istanbul ignore next
619
+ if (-1 !== oldRightMiddleIndex) {
620
+ draft.panels.right.widgets = saved.panels.right.widgets.filter((value) => value !== "rightMiddle");
621
+ if ("rightEnd" in draft.widgets) {
622
+ draft.widgets.rightMiddle.tabs.forEach((tab) => draft.widgets.rightEnd.tabs.push(tab));
623
+ }
624
+ else {
625
+ draft.widgets.rightEnd = { ...draft.widgets.rightMiddle };
626
+ delete draft.widgets.rightMiddle;
627
+ }
628
+ }
616
629
  return;
617
630
  });
618
631
  if (FrontstageManager.nineZoneSize && (0 !== FrontstageManager.nineZoneSize.height || 0 !== FrontstageManager.nineZoneSize.width)) {
@@ -661,6 +674,7 @@ function addRemovedTab(nineZone, widgetDef) {
661
674
  const newTab = createTabState(widgetDef.id, {
662
675
  label: getWidgetLabel(widgetDef.label),
663
676
  canPopout: widgetDef.canPopout,
677
+ iconSpec: widgetDef.iconSpec,
664
678
  preferredPanelWidgetSize: widgetDef.preferredPanelSize,
665
679
  isFloatingStateWindowResizable: widgetDef.isFloatingStateWindowResizable,
666
680
  });
@@ -721,20 +735,11 @@ export const setWidgetState = produce((nineZone, widgetDef, state) => {
721
735
  location = findTab(nineZone, id);
722
736
  assert(!!location);
723
737
  }
724
- const widget = nineZone.widgets[location.widgetId];
725
- if (id !== widget.activeTabId)
726
- return;
727
- const minimized = widget.minimized;
728
- widget.minimized = true;
729
- if ("side" in location) {
730
- const panel = nineZone.panels[location.side];
731
- const maximized = panel.widgets.find((wId) => {
732
- const w = nineZone.widgets[wId];
733
- return !w.minimized;
734
- });
735
- if (maximized === undefined)
736
- widget.minimized = minimized;
737
- return;
738
+ if (isFloatingLocation(location)) {
739
+ const widget = nineZone.widgets[location.widgetId];
740
+ if (id !== widget.activeTabId)
741
+ return;
742
+ widget.minimized = true;
738
743
  }
739
744
  }
740
745
  else if (state === WidgetState.Hidden) {