@webiny/app-admin-ui 0.0.0-unstable.0156a4c312
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/Breadcrumbs/Breadcrumbs.d.ts +14 -0
- package/Breadcrumbs/Breadcrumbs.js +74 -0
- package/Breadcrumbs/Breadcrumbs.js.map +1 -0
- package/CommandPalette/CommandPalette.d.ts +6 -0
- package/CommandPalette/CommandPalette.js +202 -0
- package/CommandPalette/CommandPalette.js.map +1 -0
- package/CommandPalette/components/AiModeBadge.d.ts +3 -0
- package/CommandPalette/components/AiModeBadge.js +11 -0
- package/CommandPalette/components/AiModeBadge.js.map +1 -0
- package/CommandPalette/components/AiSuggestions.d.ts +9 -0
- package/CommandPalette/components/AiSuggestions.js +32 -0
- package/CommandPalette/components/AiSuggestions.js.map +1 -0
- package/CommandPalette/components/AiTurn.d.ts +11 -0
- package/CommandPalette/components/AiTurn.js +61 -0
- package/CommandPalette/components/AiTurn.js.map +1 -0
- package/CommandPalette/components/AnswerSkeleton.d.ts +6 -0
- package/CommandPalette/components/AnswerSkeleton.js +20 -0
- package/CommandPalette/components/AnswerSkeleton.js.map +1 -0
- package/CommandPalette/components/ApprovalPlan.d.ts +16 -0
- package/CommandPalette/components/ApprovalPlan.js +56 -0
- package/CommandPalette/components/ApprovalPlan.js.map +1 -0
- package/CommandPalette/components/CommandDetail.d.ts +13 -0
- package/CommandPalette/components/CommandDetail.js +39 -0
- package/CommandPalette/components/CommandDetail.js.map +1 -0
- package/CommandPalette/components/CommandItemRow.d.ts +5 -0
- package/CommandPalette/components/CommandItemRow.js +41 -0
- package/CommandPalette/components/CommandItemRow.js.map +1 -0
- package/CommandPalette/components/GroupHeading.d.ts +4 -0
- package/CommandPalette/components/GroupHeading.js +10 -0
- package/CommandPalette/components/GroupHeading.js.map +1 -0
- package/CommandPalette/components/HintIcon.d.ts +4 -0
- package/CommandPalette/components/HintIcon.js +11 -0
- package/CommandPalette/components/HintIcon.js.map +1 -0
- package/CommandPalette/components/Kbd.d.ts +4 -0
- package/CommandPalette/components/Kbd.js +14 -0
- package/CommandPalette/components/Kbd.js.map +1 -0
- package/CommandPalette/components/NoResults.d.ts +13 -0
- package/CommandPalette/components/NoResults.js +33 -0
- package/CommandPalette/components/NoResults.js.map +1 -0
- package/CommandPalette/components/PaletteFooter.d.ts +13 -0
- package/CommandPalette/components/PaletteFooter.js +18 -0
- package/CommandPalette/components/PaletteFooter.js.map +1 -0
- package/CommandPalette/components/ToolChip.d.ts +7 -0
- package/CommandPalette/components/ToolChip.js +32 -0
- package/CommandPalette/components/ToolChip.js.map +1 -0
- package/CommandPalette/components/index.d.ts +13 -0
- package/CommandPalette/components/index.js +13 -0
- package/CommandPalette/constants.d.ts +8 -0
- package/CommandPalette/constants.js +5 -0
- package/CommandPalette/constants.js.map +1 -0
- package/CommandPalette/deriveRows.d.ts +19 -0
- package/CommandPalette/deriveRows.js +100 -0
- package/CommandPalette/deriveRows.js.map +1 -0
- package/CommandPalette/modes/PaletteMode.d.ts +73 -0
- package/CommandPalette/modes/PaletteMode.js +0 -0
- package/CommandPalette/modes/createAiMode.d.ts +13 -0
- package/CommandPalette/modes/createAiMode.js +80 -0
- package/CommandPalette/modes/createAiMode.js.map +1 -0
- package/CommandPalette/modes/index.d.ts +2 -0
- package/CommandPalette/modes/index.js +1 -0
- package/CommandPalette/types.d.ts +15 -0
- package/CommandPalette/types.js +0 -0
- package/CommandPalette/usePaletteHotkeys.d.ts +16 -0
- package/CommandPalette/usePaletteHotkeys.js +38 -0
- package/CommandPalette/usePaletteHotkeys.js.map +1 -0
- package/Dashboard/Welcome.d.ts +6 -0
- package/Dashboard/Welcome.js +120 -0
- package/Dashboard/Welcome.js.map +1 -0
- package/Dashboard/components/AssistanceWidget.d.ts +2 -0
- package/Dashboard/components/AssistanceWidget.js +54 -0
- package/Dashboard/components/AssistanceWidget.js.map +1 -0
- package/Dashboard/components/CommunityWidget.d.ts +2 -0
- package/Dashboard/components/CommunityWidget.js +58 -0
- package/Dashboard/components/CommunityWidget.js.map +1 -0
- package/Dashboard/components/DashboardToolbar.d.ts +11 -0
- package/Dashboard/components/DashboardToolbar.js +48 -0
- package/Dashboard/components/DashboardToolbar.js.map +1 -0
- package/Dashboard/components/MissingPermissionsWidget.d.ts +2 -0
- package/Dashboard/components/MissingPermissionsWidget.js +16 -0
- package/Dashboard/components/MissingPermissionsWidget.js.map +1 -0
- package/Dashboard/components/addWidgetDrawer/AddToColumnMenu.d.ts +10 -0
- package/Dashboard/components/addWidgetDrawer/AddToColumnMenu.js +30 -0
- package/Dashboard/components/addWidgetDrawer/AddToColumnMenu.js.map +1 -0
- package/Dashboard/components/addWidgetDrawer/AddWidgetDrawer.d.ts +12 -0
- package/Dashboard/components/addWidgetDrawer/AddWidgetDrawer.js +61 -0
- package/Dashboard/components/addWidgetDrawer/AddWidgetDrawer.js.map +1 -0
- package/Dashboard/components/addWidgetDrawer/DrawerWidgetRow.d.ts +10 -0
- package/Dashboard/components/addWidgetDrawer/DrawerWidgetRow.js +38 -0
- package/Dashboard/components/addWidgetDrawer/DrawerWidgetRow.js.map +1 -0
- package/Dashboard/components/addWidgetDrawer/WidgetPreviewFrame.d.ts +7 -0
- package/Dashboard/components/addWidgetDrawer/WidgetPreviewFrame.js +44 -0
- package/Dashboard/components/addWidgetDrawer/WidgetPreviewFrame.js.map +1 -0
- package/Dashboard/components/addWidgetDrawer/WidgetSketch.d.ts +4 -0
- package/Dashboard/components/addWidgetDrawer/WidgetSketch.js +20 -0
- package/Dashboard/components/addWidgetDrawer/WidgetSketch.js.map +1 -0
- package/Dashboard/components/addWidgetDrawer/WidgetTabContent.d.ts +14 -0
- package/Dashboard/components/addWidgetDrawer/WidgetTabContent.js +76 -0
- package/Dashboard/components/addWidgetDrawer/WidgetTabContent.js.map +1 -0
- package/Dashboard/components/addWidgetDrawer/types.d.ts +10 -0
- package/Dashboard/components/addWidgetDrawer/types.js +0 -0
- package/Dashboard/components/assets/github.js +14 -0
- package/Dashboard/components/assets/github.js.map +1 -0
- package/Dashboard/components/assets/github.svg +1 -0
- package/Dashboard/components/assets/slack.js +27 -0
- package/Dashboard/components/assets/slack.js.map +1 -0
- package/Dashboard/components/assets/slack.svg +8 -0
- package/Dashboard/components/assets/x-twitter.js +18 -0
- package/Dashboard/components/assets/x-twitter.js.map +1 -0
- package/Dashboard/components/assets/x-twitter.svg +5 -0
- package/Dashboard/components/assets/youtube.js +28 -0
- package/Dashboard/components/assets/youtube.js.map +1 -0
- package/Dashboard/components/assets/youtube.svg +11 -0
- package/Dashboard/components/dnd/ColumnCountControl.d.ts +9 -0
- package/Dashboard/components/dnd/ColumnCountControl.js +52 -0
- package/Dashboard/components/dnd/ColumnCountControl.js.map +1 -0
- package/Dashboard/components/dnd/ColumnEmptyState.d.ts +10 -0
- package/Dashboard/components/dnd/ColumnEmptyState.js +52 -0
- package/Dashboard/components/dnd/ColumnEmptyState.js.map +1 -0
- package/Dashboard/components/dnd/DashboardDragLayer.d.ts +6 -0
- package/Dashboard/components/dnd/DashboardDragLayer.js +28 -0
- package/Dashboard/components/dnd/DashboardDragLayer.js.map +1 -0
- package/Dashboard/components/dnd/DashboardWidgetCard.d.ts +13 -0
- package/Dashboard/components/dnd/DashboardWidgetCard.js +59 -0
- package/Dashboard/components/dnd/DashboardWidgetCard.js.map +1 -0
- package/Dashboard/components/dnd/DashboardWidgetColumn.d.ts +19 -0
- package/Dashboard/components/dnd/DashboardWidgetColumn.js +72 -0
- package/Dashboard/components/dnd/DashboardWidgetColumn.js.map +1 -0
- package/Dashboard/components/dnd/WidgetDropIndicator.d.ts +11 -0
- package/Dashboard/components/dnd/WidgetDropIndicator.js +29 -0
- package/Dashboard/components/dnd/WidgetDropIndicator.js.map +1 -0
- package/Dashboard/components/dnd/WidgetSlot.d.ts +6 -0
- package/Dashboard/components/dnd/WidgetSlot.js +9 -0
- package/Dashboard/components/dnd/WidgetSlot.js.map +1 -0
- package/Dashboard/components/dnd/dragItem.d.ts +6 -0
- package/Dashboard/components/dnd/dragItem.js +4 -0
- package/Dashboard/components/dnd/dragItem.js.map +1 -0
- package/Dashboard/components/dnd/useWidgetHosts.d.ts +1 -0
- package/Dashboard/components/dnd/useWidgetHosts.js +16 -0
- package/Dashboard/components/dnd/useWidgetHosts.js.map +1 -0
- package/Dashboard/components/index.d.ts +3 -0
- package/Dashboard/components/index.js +3 -0
- package/Dashboard/components/layout/EditableColumns.d.ts +13 -0
- package/Dashboard/components/layout/EditableColumns.js +25 -0
- package/Dashboard/components/layout/EditableColumns.js.map +1 -0
- package/Dashboard/components/layout/StaticColumns.d.ts +8 -0
- package/Dashboard/components/layout/StaticColumns.js +20 -0
- package/Dashboard/components/layout/StaticColumns.js.map +1 -0
- package/Dashboard/components/layout/collapseColumns.d.ts +1 -0
- package/Dashboard/components/layout/collapseColumns.js +16 -0
- package/Dashboard/components/layout/collapseColumns.js.map +1 -0
- package/Dashboard/components/layout/layoutConstants.d.ts +2 -0
- package/Dashboard/components/layout/layoutConstants.js +5 -0
- package/Dashboard/components/layout/layoutConstants.js.map +1 -0
- package/Dashboard/components/layout/useColumnsThatFit.d.ts +6 -0
- package/Dashboard/components/layout/useColumnsThatFit.js +30 -0
- package/Dashboard/components/layout/useColumnsThatFit.js.map +1 -0
- package/Dashboard/components/layout/useWidgetPortals.d.ts +5 -0
- package/Dashboard/components/layout/useWidgetPortals.js +26 -0
- package/Dashboard/components/layout/useWidgetPortals.js.map +1 -0
- package/Dashboard/dashboardLayout/loadLayout/FetchDashboardLayoutUseCase.d.ts +12 -0
- package/Dashboard/dashboardLayout/loadLayout/FetchDashboardLayoutUseCase.js +19 -0
- package/Dashboard/dashboardLayout/loadLayout/FetchDashboardLayoutUseCase.js.map +1 -0
- package/Dashboard/dashboardLayout/loadLayout/GetCachedDashboardLayoutUseCase.d.ts +12 -0
- package/Dashboard/dashboardLayout/loadLayout/GetCachedDashboardLayoutUseCase.js +19 -0
- package/Dashboard/dashboardLayout/loadLayout/GetCachedDashboardLayoutUseCase.js.map +1 -0
- package/Dashboard/dashboardLayout/loadLayout/abstractions.d.ts +15 -0
- package/Dashboard/dashboardLayout/loadLayout/abstractions.js +6 -0
- package/Dashboard/dashboardLayout/loadLayout/abstractions.js.map +1 -0
- package/Dashboard/dashboardLayout/loadLayout/feature.d.ts +1 -0
- package/Dashboard/dashboardLayout/loadLayout/feature.js +13 -0
- package/Dashboard/dashboardLayout/loadLayout/feature.js.map +1 -0
- package/Dashboard/dashboardLayout/presenter/DashboardLayoutPresenter.d.ts +56 -0
- package/Dashboard/dashboardLayout/presenter/DashboardLayoutPresenter.js +308 -0
- package/Dashboard/dashboardLayout/presenter/DashboardLayoutPresenter.js.map +1 -0
- package/Dashboard/dashboardLayout/presenter/abstractions.d.ts +46 -0
- package/Dashboard/dashboardLayout/presenter/abstractions.js +5 -0
- package/Dashboard/dashboardLayout/presenter/abstractions.js.map +1 -0
- package/Dashboard/dashboardLayout/presenter/feature.d.ts +3 -0
- package/Dashboard/dashboardLayout/presenter/feature.js +23 -0
- package/Dashboard/dashboardLayout/presenter/feature.js.map +1 -0
- package/Dashboard/dashboardLayout/presenter/useDashboardLayoutPresenter.d.ts +1 -0
- package/Dashboard/dashboardLayout/presenter/useDashboardLayoutPresenter.js +6 -0
- package/Dashboard/dashboardLayout/presenter/useDashboardLayoutPresenter.js.map +1 -0
- package/Dashboard/dashboardLayout/repository/DashboardLayoutGateway.d.ts +13 -0
- package/Dashboard/dashboardLayout/repository/DashboardLayoutGateway.js +67 -0
- package/Dashboard/dashboardLayout/repository/DashboardLayoutGateway.js.map +1 -0
- package/Dashboard/dashboardLayout/repository/DashboardLayoutRepository.d.ts +20 -0
- package/Dashboard/dashboardLayout/repository/DashboardLayoutRepository.js +49 -0
- package/Dashboard/dashboardLayout/repository/DashboardLayoutRepository.js.map +1 -0
- package/Dashboard/dashboardLayout/repository/abstractions.d.ts +25 -0
- package/Dashboard/dashboardLayout/repository/abstractions.js +6 -0
- package/Dashboard/dashboardLayout/repository/abstractions.js.map +1 -0
- package/Dashboard/dashboardLayout/repository/feature.d.ts +1 -0
- package/Dashboard/dashboardLayout/repository/feature.js +13 -0
- package/Dashboard/dashboardLayout/repository/feature.js.map +1 -0
- package/Dashboard/dashboardLayout/saveLayout/SaveDashboardLayoutUseCase.d.ts +12 -0
- package/Dashboard/dashboardLayout/saveLayout/SaveDashboardLayoutUseCase.js +19 -0
- package/Dashboard/dashboardLayout/saveLayout/SaveDashboardLayoutUseCase.js.map +1 -0
- package/Dashboard/dashboardLayout/saveLayout/abstractions.d.ts +8 -0
- package/Dashboard/dashboardLayout/saveLayout/abstractions.js +5 -0
- package/Dashboard/dashboardLayout/saveLayout/abstractions.js.map +1 -0
- package/Dashboard/dashboardLayout/saveLayout/feature.d.ts +1 -0
- package/Dashboard/dashboardLayout/saveLayout/feature.js +11 -0
- package/Dashboard/dashboardLayout/saveLayout/feature.js.map +1 -0
- package/Dashboard/dashboardLayout/toColumnIndex.d.ts +1 -0
- package/Dashboard/dashboardLayout/toColumnIndex.js +7 -0
- package/Dashboard/dashboardLayout/toColumnIndex.js.map +1 -0
- package/Dashboard/dashboardLayout/types.d.ts +15 -0
- package/Dashboard/dashboardLayout/types.js +6 -0
- package/Dashboard/dashboardLayout/types.js.map +1 -0
- package/Dashboard.d.ts +2 -0
- package/Dashboard.js +9 -0
- package/Dashboard.js.map +1 -0
- package/Dialog/DialogContainer.d.ts +2 -0
- package/Dialog/DialogContainer.js +59 -0
- package/Dialog/DialogContainer.js.map +1 -0
- package/Dialog/DialogProvider.d.ts +5 -0
- package/Dialog/DialogProvider.js +8 -0
- package/Dialog/DialogProvider.js.map +1 -0
- package/Dialog.d.ts +2 -0
- package/Dialog.js +9 -0
- package/Dialog.js.map +1 -0
- package/LICENSE +21 -0
- package/Layout.d.ts +2 -0
- package/Layout.js +55 -0
- package/Layout.js.map +1 -0
- package/Logo.d.ts +2 -0
- package/Logo.js +16 -0
- package/Logo.js.map +1 -0
- package/Navigation/Navigation.d.ts +2 -0
- package/Navigation/Navigation.js +34 -0
- package/Navigation/Navigation.js.map +1 -0
- package/Navigation/SidebarMenuItems.d.ts +10 -0
- package/Navigation/SidebarMenuItems.js +36 -0
- package/Navigation/SidebarMenuItems.js.map +1 -0
- package/NotFound/notFound.js +297 -0
- package/NotFound/notFound.js.map +1 -0
- package/NotFound/notFound.svg +1 -0
- package/NotFound.d.ts +2 -0
- package/NotFound.js +20 -0
- package/NotFound.js.map +1 -0
- package/README.md +11 -0
- package/UserMenu/UserMenu.d.ts +2 -0
- package/UserMenu/UserMenu.js +22 -0
- package/UserMenu/UserMenu.js.map +1 -0
- package/UserMenu/UserMenuHandle.d.ts +2 -0
- package/UserMenu/UserMenuHandle.js +36 -0
- package/UserMenu/UserMenuHandle.js.map +1 -0
- package/UserMenu/UserMenuItem.d.ts +3 -0
- package/UserMenu/UserMenuItem.js +12 -0
- package/UserMenu/UserMenuItem.js.map +1 -0
- package/UserMenu/UserMenuLink.d.ts +3 -0
- package/UserMenu/UserMenuLink.js +12 -0
- package/UserMenu/UserMenuLink.js.map +1 -0
- package/UserMenu/UserMenuSeparator.d.ts +2 -0
- package/UserMenu/UserMenuSeparator.js +12 -0
- package/UserMenu/UserMenuSeparator.js.map +1 -0
- package/UserMenu.d.ts +2 -0
- package/UserMenu.js +10 -0
- package/UserMenu.js.map +1 -0
- package/index.d.ts +2 -0
- package/index.js +35 -0
- package/index.js.map +1 -0
- package/package.json +49 -0
- package/static/svg/github.08a73b00.svg +1 -0
- package/static/svg/notFound.e8b15981.svg +1 -0
- package/static/svg/slack.1b2ba162.svg +8 -0
- package/static/svg/x-twitter.46e7218c.svg +5 -0
- package/static/svg/youtube.3c232651.svg +11 -0
- package/styles.scss +2 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import react from "react";
|
|
2
|
+
import { collapseColumns } from "./collapseColumns.js";
|
|
3
|
+
import { DASHBOARD_MAX_WIDTH } from "./layoutConstants.js";
|
|
4
|
+
const StaticColumns = ({ columns, visibleCount, slots })=>{
|
|
5
|
+
const collapsed = collapseColumns(columns, visibleCount);
|
|
6
|
+
return /*#__PURE__*/ react.createElement("div", {
|
|
7
|
+
className: "flex gap-lg",
|
|
8
|
+
style: {
|
|
9
|
+
maxWidth: DASHBOARD_MAX_WIDTH
|
|
10
|
+
}
|
|
11
|
+
}, collapsed.map((names, index)=>/*#__PURE__*/ react.createElement("div", {
|
|
12
|
+
key: index,
|
|
13
|
+
className: "flex flex-1 flex-col gap-lg"
|
|
14
|
+
}, names.map((name)=>/*#__PURE__*/ react.createElement(react.Fragment, {
|
|
15
|
+
key: name
|
|
16
|
+
}, slots.get(name))))));
|
|
17
|
+
};
|
|
18
|
+
export { StaticColumns };
|
|
19
|
+
|
|
20
|
+
//# sourceMappingURL=StaticColumns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Dashboard/components/layout/StaticColumns.js","sources":["../../../../src/Dashboard/components/layout/StaticColumns.tsx"],"sourcesContent":["import React from \"react\";\nimport { collapseColumns } from \"./collapseColumns.js\";\nimport { DASHBOARD_MAX_WIDTH } from \"./layoutConstants.js\";\n\ninterface StaticColumnsProps {\n columns: string[][];\n // How many columns fit on screen; fewer than `columns.length` folds them together.\n visibleCount: number;\n slots: Map<string, React.ReactElement>;\n}\n\n// The everyday dashboard: widgets laid out in their columns, nothing to drag.\nexport const StaticColumns = ({ columns, visibleCount, slots }: StaticColumnsProps) => {\n const collapsed = collapseColumns(columns, visibleCount);\n return (\n <div className={\"flex gap-lg\"} style={{ maxWidth: DASHBOARD_MAX_WIDTH }}>\n {collapsed.map((names, index) => (\n <div key={index} className={\"flex flex-1 flex-col gap-lg\"}>\n {names.map(name => (\n <React.Fragment key={name}>{slots.get(name)}</React.Fragment>\n ))}\n </div>\n ))}\n </div>\n );\n};\n"],"names":["StaticColumns","columns","visibleCount","slots","collapsed","collapseColumns","DASHBOARD_MAX_WIDTH","names","index","name","React"],"mappings":";;;AAYO,MAAMA,gBAAgB,CAAC,EAAEC,OAAO,EAAEC,YAAY,EAAEC,KAAK,EAAsB;IAC9E,MAAMC,YAAYC,gBAAgBJ,SAASC;IAC3C,OAAO,WAAP,GACI,oBAAC;QAAI,WAAW;QAAe,OAAO;YAAE,UAAUI;QAAoB;OACjEF,UAAU,GAAG,CAAC,CAACG,OAAOC,QAAAA,WAAAA,GACnB,oBAAC;YAAI,KAAKA;YAAO,WAAW;WACvBD,MAAM,GAAG,CAACE,CAAAA,OAAAA,WAAAA,GACP,oBAACC,MAAAA,QAAc;gBAAC,KAAKD;eAAON,MAAM,GAAG,CAACM;AAM9D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const collapseColumns: (columns: string[][], count: number) => string[][];
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
const collapseColumns = (columns, count)=>{
|
|
2
|
+
const result = Array.from({
|
|
3
|
+
length: count
|
|
4
|
+
}, ()=>[]);
|
|
5
|
+
const perColumn = Math.ceil(columns.length / count);
|
|
6
|
+
const groupSize = Math.max(1, perColumn);
|
|
7
|
+
columns.forEach((column, index)=>{
|
|
8
|
+
const group = Math.floor(index / groupSize);
|
|
9
|
+
const target = Math.min(group, count - 1);
|
|
10
|
+
result[target].push(...column);
|
|
11
|
+
});
|
|
12
|
+
return result;
|
|
13
|
+
};
|
|
14
|
+
export { collapseColumns };
|
|
15
|
+
|
|
16
|
+
//# sourceMappingURL=collapseColumns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Dashboard/components/layout/collapseColumns.js","sources":["../../../../src/Dashboard/components/layout/collapseColumns.ts"],"sourcesContent":["// Folds `columns` into `count` visual columns, keeping neighbors together and reading order intact.\nexport const collapseColumns = (columns: string[][], count: number): string[][] => {\n const result: string[][] = Array.from({ length: count }, () => []);\n const perColumn = Math.ceil(columns.length / count);\n const groupSize = Math.max(1, perColumn);\n columns.forEach((column, index) => {\n const group = Math.floor(index / groupSize);\n const target = Math.min(group, count - 1);\n result[target].push(...column);\n });\n return result;\n};\n"],"names":["collapseColumns","columns","count","result","Array","perColumn","Math","groupSize","column","index","group","target"],"mappings":"AACO,MAAMA,kBAAkB,CAACC,SAAqBC;IACjD,MAAMC,SAAqBC,MAAM,IAAI,CAAC;QAAE,QAAQF;IAAM,GAAG,IAAM,EAAE;IACjE,MAAMG,YAAYC,KAAK,IAAI,CAACL,QAAQ,MAAM,GAAGC;IAC7C,MAAMK,YAAYD,KAAK,GAAG,CAAC,GAAGD;IAC9BJ,QAAQ,OAAO,CAAC,CAACO,QAAQC;QACrB,MAAMC,QAAQJ,KAAK,KAAK,CAACG,QAAQF;QACjC,MAAMI,SAASL,KAAK,GAAG,CAACI,OAAOR,QAAQ;QACvCC,MAAM,CAACQ,OAAO,CAAC,IAAI,IAAIH;IAC3B;IACA,OAAOL;AACX"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Dashboard/components/layout/layoutConstants.js","sources":["../../../../src/Dashboard/components/layout/layoutConstants.ts"],"sourcesContent":["// One width for every column count, so switching columns doesn't move the toolbar or the cards.\nexport const DASHBOARD_MAX_WIDTH = 1600;\n\n// Minimum width a column needs before the dashboard folds into fewer columns.\nexport const MIN_COLUMN_WIDTH = 360;\n"],"names":["DASHBOARD_MAX_WIDTH","MIN_COLUMN_WIDTH"],"mappings":"AACO,MAAMA,sBAAsB;AAG5B,MAAMC,mBAAmB"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import react, { useEffect, useState } from "react";
|
|
2
|
+
import { MIN_COLUMN_WIDTH } from "./layoutConstants.js";
|
|
3
|
+
const useColumnsThatFit = (columnCount)=>{
|
|
4
|
+
const ref = react.useRef(null);
|
|
5
|
+
const [width, setWidth] = useState(0);
|
|
6
|
+
useEffect(()=>{
|
|
7
|
+
const node = ref.current;
|
|
8
|
+
if (!node) return;
|
|
9
|
+
setWidth(node.clientWidth);
|
|
10
|
+
const observer = new ResizeObserver((entries)=>{
|
|
11
|
+
setWidth(entries[0].contentRect.width);
|
|
12
|
+
});
|
|
13
|
+
observer.observe(node);
|
|
14
|
+
return ()=>observer.disconnect();
|
|
15
|
+
}, []);
|
|
16
|
+
let fitCount = columnCount;
|
|
17
|
+
if (width > 0) {
|
|
18
|
+
const columnsThatFit = Math.floor(width / MIN_COLUMN_WIDTH);
|
|
19
|
+
fitCount = Math.max(1, columnsThatFit);
|
|
20
|
+
}
|
|
21
|
+
const visibleCount = Math.min(columnCount, fitCount);
|
|
22
|
+
return {
|
|
23
|
+
ref,
|
|
24
|
+
visibleCount,
|
|
25
|
+
allFit: visibleCount === columnCount
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
export { useColumnsThatFit };
|
|
29
|
+
|
|
30
|
+
//# sourceMappingURL=useColumnsThatFit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Dashboard/components/layout/useColumnsThatFit.js","sources":["../../../../src/Dashboard/components/layout/useColumnsThatFit.ts"],"sourcesContent":["import React from \"react\";\nimport { useEffect } from \"react\";\nimport { useState } from \"react\";\nimport { MIN_COLUMN_WIDTH } from \"./layoutConstants.js\";\n\n/*\n * Measures the dashboard and works out how many of the chosen columns fit. When fewer fit, the\n * dashboard shows `visibleCount` columns and `allFit` is false (Customize mode needs all of them).\n */\nexport const useColumnsThatFit = (columnCount: number) => {\n const ref = React.useRef<HTMLDivElement>(null);\n const [width, setWidth] = useState(0);\n\n useEffect(() => {\n const node = ref.current;\n if (!node) {\n return;\n }\n setWidth(node.clientWidth);\n const observer = new ResizeObserver(entries => {\n setWidth(entries[0].contentRect.width);\n });\n observer.observe(node);\n return () => observer.disconnect();\n }, []);\n\n let fitCount = columnCount;\n if (width > 0) {\n const columnsThatFit = Math.floor(width / MIN_COLUMN_WIDTH);\n fitCount = Math.max(1, columnsThatFit);\n }\n const visibleCount = Math.min(columnCount, fitCount);\n\n return { ref, visibleCount, allFit: visibleCount === columnCount };\n};\n"],"names":["useColumnsThatFit","columnCount","ref","React","width","setWidth","useState","useEffect","node","observer","ResizeObserver","entries","fitCount","columnsThatFit","Math","MIN_COLUMN_WIDTH","visibleCount"],"mappings":";;AASO,MAAMA,oBAAoB,CAACC;IAC9B,MAAMC,MAAMC,MAAAA,MAAY,CAAiB;IACzC,MAAM,CAACC,OAAOC,SAAS,GAAGC,SAAS;IAEnCC,UAAU;QACN,MAAMC,OAAON,IAAI,OAAO;QACxB,IAAI,CAACM,MACD;QAEJH,SAASG,KAAK,WAAW;QACzB,MAAMC,WAAW,IAAIC,eAAeC,CAAAA;YAChCN,SAASM,OAAO,CAAC,EAAE,CAAC,WAAW,CAAC,KAAK;QACzC;QACAF,SAAS,OAAO,CAACD;QACjB,OAAO,IAAMC,SAAS,UAAU;IACpC,GAAG,EAAE;IAEL,IAAIG,WAAWX;IACf,IAAIG,QAAQ,GAAG;QACX,MAAMS,iBAAiBC,KAAK,KAAK,CAACV,QAAQW;QAC1CH,WAAWE,KAAK,GAAG,CAAC,GAAGD;IAC3B;IACA,MAAMG,eAAeF,KAAK,GAAG,CAACb,aAAaW;IAE3C,OAAO;QAAEV;QAAKc;QAAc,QAAQA,iBAAiBf;IAAY;AACrE"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import react from "react";
|
|
2
|
+
import { createPortal } from "react-dom";
|
|
3
|
+
import { WidgetSlot } from "../dnd/WidgetSlot.js";
|
|
4
|
+
import { useWidgetHosts } from "../dnd/useWidgetHosts.js";
|
|
5
|
+
const useWidgetPortals = (placed, elements)=>{
|
|
6
|
+
const getHost = useWidgetHosts();
|
|
7
|
+
const slots = new Map();
|
|
8
|
+
const portals = [];
|
|
9
|
+
for (const name of placed){
|
|
10
|
+
const element = elements.get(name);
|
|
11
|
+
if (!element) continue;
|
|
12
|
+
const host = getHost(name);
|
|
13
|
+
slots.set(name, /*#__PURE__*/ react.createElement(WidgetSlot, {
|
|
14
|
+
host: host
|
|
15
|
+
}));
|
|
16
|
+
const portal = /*#__PURE__*/ createPortal(element, host, name);
|
|
17
|
+
portals.push(portal);
|
|
18
|
+
}
|
|
19
|
+
return {
|
|
20
|
+
slots,
|
|
21
|
+
portals
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
export { useWidgetPortals };
|
|
25
|
+
|
|
26
|
+
//# sourceMappingURL=useWidgetPortals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Dashboard/components/layout/useWidgetPortals.js","sources":["../../../../src/Dashboard/components/layout/useWidgetPortals.tsx"],"sourcesContent":["import React from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { WidgetSlot } from \"../dnd/WidgetSlot.js\";\nimport { useWidgetHosts } from \"../dnd/useWidgetHosts.js\";\n\n/*\n * Renders every placed widget once, into its own container, and returns a slot per widget for the\n * layouts to place. Moving a slot moves the widget without remounting it; see `useWidgetHosts`.\n * Render `portals` once, anywhere stable; render `slots.get(name)` wherever the widget goes.\n */\nexport const useWidgetPortals = (placed: string[], elements: Map<string, React.ReactElement>) => {\n const getHost = useWidgetHosts();\n const slots = new Map<string, React.ReactElement>();\n const portals: React.ReactNode[] = [];\n\n for (const name of placed) {\n const element = elements.get(name);\n if (!element) {\n continue;\n }\n const host = getHost(name);\n slots.set(name, <WidgetSlot host={host} />);\n const portal = createPortal(element, host, name);\n portals.push(portal);\n }\n\n return { slots, portals };\n};\n"],"names":["useWidgetPortals","placed","elements","getHost","useWidgetHosts","slots","Map","portals","name","element","host","WidgetSlot","portal","createPortal"],"mappings":";;;;AAUO,MAAMA,mBAAmB,CAACC,QAAkBC;IAC/C,MAAMC,UAAUC;IAChB,MAAMC,QAAQ,IAAIC;IAClB,MAAMC,UAA6B,EAAE;IAErC,KAAK,MAAMC,QAAQP,OAAQ;QACvB,MAAMQ,UAAUP,SAAS,GAAG,CAACM;QAC7B,IAAI,CAACC,SACD;QAEJ,MAAMC,OAAOP,QAAQK;QACrBH,MAAM,GAAG,CAACG,MAAM,WAANA,GAAM,oBAACG,YAAUA;YAAC,MAAMD;;QAClC,MAAME,SAAS,WAATA,GAASC,aAAaJ,SAASC,MAAMF;QAC3CD,QAAQ,IAAI,CAACK;IACjB;IAEA,OAAO;QAAEP;QAAOE;IAAQ;AAC5B"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { DashboardLayoutRepository } from "../repository/abstractions.js";
|
|
2
|
+
import { FetchDashboardLayoutUseCase as UseCaseAbstraction } from "./abstractions.js";
|
|
3
|
+
import type { DashboardLayoutData } from "../types.js";
|
|
4
|
+
declare class FetchDashboardLayoutUseCaseImpl implements UseCaseAbstraction.Interface {
|
|
5
|
+
private repository;
|
|
6
|
+
constructor(repository: DashboardLayoutRepository.Interface);
|
|
7
|
+
execute(userId: string): Promise<DashboardLayoutData | null>;
|
|
8
|
+
}
|
|
9
|
+
export declare const FetchDashboardLayoutUseCase: typeof FetchDashboardLayoutUseCaseImpl & {
|
|
10
|
+
__abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").IFetchDashboardLayoutUseCase>;
|
|
11
|
+
};
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { DashboardLayoutRepository } from "../repository/abstractions.js";
|
|
2
|
+
import { FetchDashboardLayoutUseCase } from "./abstractions.js";
|
|
3
|
+
class FetchDashboardLayoutUseCaseImpl {
|
|
4
|
+
constructor(repository){
|
|
5
|
+
this.repository = repository;
|
|
6
|
+
}
|
|
7
|
+
async execute(userId) {
|
|
8
|
+
return await this.repository.fetch(userId);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
const FetchDashboardLayoutUseCase_FetchDashboardLayoutUseCase = FetchDashboardLayoutUseCase.createImplementation({
|
|
12
|
+
implementation: FetchDashboardLayoutUseCaseImpl,
|
|
13
|
+
dependencies: [
|
|
14
|
+
DashboardLayoutRepository
|
|
15
|
+
]
|
|
16
|
+
});
|
|
17
|
+
export { FetchDashboardLayoutUseCase_FetchDashboardLayoutUseCase as FetchDashboardLayoutUseCase };
|
|
18
|
+
|
|
19
|
+
//# sourceMappingURL=FetchDashboardLayoutUseCase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Dashboard/dashboardLayout/loadLayout/FetchDashboardLayoutUseCase.js","sources":["../../../../src/Dashboard/dashboardLayout/loadLayout/FetchDashboardLayoutUseCase.ts"],"sourcesContent":["import { DashboardLayoutRepository } from \"../repository/abstractions.js\";\nimport { FetchDashboardLayoutUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport type { DashboardLayoutData } from \"../types.js\";\n\nclass FetchDashboardLayoutUseCaseImpl implements UseCaseAbstraction.Interface {\n constructor(private repository: DashboardLayoutRepository.Interface) {}\n\n async execute(userId: string): Promise<DashboardLayoutData | null> {\n return await this.repository.fetch(userId);\n }\n}\n\nexport const FetchDashboardLayoutUseCase = UseCaseAbstraction.createImplementation({\n implementation: FetchDashboardLayoutUseCaseImpl,\n dependencies: [DashboardLayoutRepository]\n});\n"],"names":["FetchDashboardLayoutUseCaseImpl","repository","userId","FetchDashboardLayoutUseCase","UseCaseAbstraction","DashboardLayoutRepository"],"mappings":";;AAIA,MAAMA;IACF,YAAoBC,UAA+C,CAAE;aAAjDA,UAAU,GAAVA;IAAkD;IAEtE,MAAM,QAAQC,MAAc,EAAuC;QAC/D,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAACA;IACvC;AACJ;AAEO,MAAMC,0DAA8BC,4BAAAA,oBAAuC,CAAC;IAC/E,gBAAgBJ;IAChB,cAAc;QAACK;KAA0B;AAC7C"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { DashboardLayoutRepository } from "../repository/abstractions.js";
|
|
2
|
+
import { GetCachedDashboardLayoutUseCase as UseCaseAbstraction } from "./abstractions.js";
|
|
3
|
+
import type { DashboardLayoutData } from "../types.js";
|
|
4
|
+
declare class GetCachedDashboardLayoutUseCaseImpl implements UseCaseAbstraction.Interface {
|
|
5
|
+
private repository;
|
|
6
|
+
constructor(repository: DashboardLayoutRepository.Interface);
|
|
7
|
+
execute(userId: string): DashboardLayoutData | null;
|
|
8
|
+
}
|
|
9
|
+
export declare const GetCachedDashboardLayoutUseCase: typeof GetCachedDashboardLayoutUseCaseImpl & {
|
|
10
|
+
__abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").IGetCachedDashboardLayoutUseCase>;
|
|
11
|
+
};
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { DashboardLayoutRepository } from "../repository/abstractions.js";
|
|
2
|
+
import { GetCachedDashboardLayoutUseCase } from "./abstractions.js";
|
|
3
|
+
class GetCachedDashboardLayoutUseCaseImpl {
|
|
4
|
+
constructor(repository){
|
|
5
|
+
this.repository = repository;
|
|
6
|
+
}
|
|
7
|
+
execute(userId) {
|
|
8
|
+
return this.repository.getCached(userId);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
const GetCachedDashboardLayoutUseCase_GetCachedDashboardLayoutUseCase = GetCachedDashboardLayoutUseCase.createImplementation({
|
|
12
|
+
implementation: GetCachedDashboardLayoutUseCaseImpl,
|
|
13
|
+
dependencies: [
|
|
14
|
+
DashboardLayoutRepository
|
|
15
|
+
]
|
|
16
|
+
});
|
|
17
|
+
export { GetCachedDashboardLayoutUseCase_GetCachedDashboardLayoutUseCase as GetCachedDashboardLayoutUseCase };
|
|
18
|
+
|
|
19
|
+
//# sourceMappingURL=GetCachedDashboardLayoutUseCase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Dashboard/dashboardLayout/loadLayout/GetCachedDashboardLayoutUseCase.js","sources":["../../../../src/Dashboard/dashboardLayout/loadLayout/GetCachedDashboardLayoutUseCase.ts"],"sourcesContent":["import { DashboardLayoutRepository } from \"../repository/abstractions.js\";\nimport { GetCachedDashboardLayoutUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport type { DashboardLayoutData } from \"../types.js\";\n\nclass GetCachedDashboardLayoutUseCaseImpl implements UseCaseAbstraction.Interface {\n constructor(private repository: DashboardLayoutRepository.Interface) {}\n\n execute(userId: string): DashboardLayoutData | null {\n return this.repository.getCached(userId);\n }\n}\n\nexport const GetCachedDashboardLayoutUseCase = UseCaseAbstraction.createImplementation({\n implementation: GetCachedDashboardLayoutUseCaseImpl,\n dependencies: [DashboardLayoutRepository]\n});\n"],"names":["GetCachedDashboardLayoutUseCaseImpl","repository","userId","GetCachedDashboardLayoutUseCase","UseCaseAbstraction","DashboardLayoutRepository"],"mappings":";;AAIA,MAAMA;IACF,YAAoBC,UAA+C,CAAE;aAAjDA,UAAU,GAAVA;IAAkD;IAEtE,QAAQC,MAAc,EAA8B;QAChD,OAAO,IAAI,CAAC,UAAU,CAAC,SAAS,CAACA;IACrC;AACJ;AAEO,MAAMC,kEAAkCC,gCAAAA,oBAAuC,CAAC;IACnF,gBAAgBJ;IAChB,cAAc;QAACK;KAA0B;AAC7C"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { DashboardLayoutData } from "../types.js";
|
|
2
|
+
export interface IGetCachedDashboardLayoutUseCase {
|
|
3
|
+
execute(userId: string): DashboardLayoutData | null;
|
|
4
|
+
}
|
|
5
|
+
export declare const GetCachedDashboardLayoutUseCase: import("@webiny/di").Abstraction<IGetCachedDashboardLayoutUseCase>;
|
|
6
|
+
export declare namespace GetCachedDashboardLayoutUseCase {
|
|
7
|
+
type Interface = IGetCachedDashboardLayoutUseCase;
|
|
8
|
+
}
|
|
9
|
+
export interface IFetchDashboardLayoutUseCase {
|
|
10
|
+
execute(userId: string): Promise<DashboardLayoutData | null>;
|
|
11
|
+
}
|
|
12
|
+
export declare const FetchDashboardLayoutUseCase: import("@webiny/di").Abstraction<IFetchDashboardLayoutUseCase>;
|
|
13
|
+
export declare namespace FetchDashboardLayoutUseCase {
|
|
14
|
+
type Interface = IFetchDashboardLayoutUseCase;
|
|
15
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { createAbstraction } from "@webiny/feature/admin";
|
|
2
|
+
const GetCachedDashboardLayoutUseCase = createAbstraction("GetCachedDashboardLayoutUseCase");
|
|
3
|
+
const FetchDashboardLayoutUseCase = createAbstraction("FetchDashboardLayoutUseCase");
|
|
4
|
+
export { FetchDashboardLayoutUseCase, GetCachedDashboardLayoutUseCase };
|
|
5
|
+
|
|
6
|
+
//# sourceMappingURL=abstractions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Dashboard/dashboardLayout/loadLayout/abstractions.js","sources":["../../../../src/Dashboard/dashboardLayout/loadLayout/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/admin\";\nimport type { DashboardLayoutData } from \"../types.js\";\n\n// Returns the cached layout without a request, so the dashboard can render it straight away.\nexport interface IGetCachedDashboardLayoutUseCase {\n execute(userId: string): DashboardLayoutData | null;\n}\n\nexport const GetCachedDashboardLayoutUseCase = createAbstraction<IGetCachedDashboardLayoutUseCase>(\n \"GetCachedDashboardLayoutUseCase\"\n);\n\nexport namespace GetCachedDashboardLayoutUseCase {\n export type Interface = IGetCachedDashboardLayoutUseCase;\n}\n\n// Fetches the stored layout from the API. `null` means the user never customized their dashboard.\nexport interface IFetchDashboardLayoutUseCase {\n execute(userId: string): Promise<DashboardLayoutData | null>;\n}\n\nexport const FetchDashboardLayoutUseCase = createAbstraction<IFetchDashboardLayoutUseCase>(\n \"FetchDashboardLayoutUseCase\"\n);\n\nexport namespace FetchDashboardLayoutUseCase {\n export type Interface = IFetchDashboardLayoutUseCase;\n}\n"],"names":["GetCachedDashboardLayoutUseCase","createAbstraction","FetchDashboardLayoutUseCase"],"mappings":";AAQO,MAAMA,kCAAkCC,kBAC3C;AAYG,MAAMC,8BAA8BD,kBACvC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const LoadDashboardLayoutFeature: import("@webiny/feature/admin").FeatureDefinition<any, []>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { createFeature } from "@webiny/feature/admin";
|
|
2
|
+
import { GetCachedDashboardLayoutUseCase } from "./GetCachedDashboardLayoutUseCase.js";
|
|
3
|
+
import { FetchDashboardLayoutUseCase } from "./FetchDashboardLayoutUseCase.js";
|
|
4
|
+
const LoadDashboardLayoutFeature = createFeature({
|
|
5
|
+
name: "AdminUI/LoadDashboardLayout",
|
|
6
|
+
register (container) {
|
|
7
|
+
container.register(GetCachedDashboardLayoutUseCase);
|
|
8
|
+
container.register(FetchDashboardLayoutUseCase);
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
export { LoadDashboardLayoutFeature };
|
|
12
|
+
|
|
13
|
+
//# sourceMappingURL=feature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Dashboard/dashboardLayout/loadLayout/feature.js","sources":["../../../../src/Dashboard/dashboardLayout/loadLayout/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/admin\";\nimport { GetCachedDashboardLayoutUseCase } from \"./GetCachedDashboardLayoutUseCase.js\";\nimport { FetchDashboardLayoutUseCase } from \"./FetchDashboardLayoutUseCase.js\";\n\nexport const LoadDashboardLayoutFeature = createFeature({\n name: \"AdminUI/LoadDashboardLayout\",\n register(container) {\n container.register(GetCachedDashboardLayoutUseCase);\n container.register(FetchDashboardLayoutUseCase);\n }\n});\n"],"names":["LoadDashboardLayoutFeature","createFeature","container","GetCachedDashboardLayoutUseCase","FetchDashboardLayoutUseCase"],"mappings":";;;AAIO,MAAMA,6BAA6BC,cAAc;IACpD,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC;QACnBD,UAAU,QAAQ,CAACE;IACvB;AACJ"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { GetCachedDashboardLayoutUseCase } from "../loadLayout/abstractions.js";
|
|
2
|
+
import { FetchDashboardLayoutUseCase } from "../loadLayout/abstractions.js";
|
|
3
|
+
import { SaveDashboardLayoutUseCase } from "../saveLayout/abstractions.js";
|
|
4
|
+
import type { DashboardLayoutData } from "../types.js";
|
|
5
|
+
import { DashboardLayoutPresenter as Abstraction } from "./abstractions.js";
|
|
6
|
+
import type { DashboardWidgetInput } from "./abstractions.js";
|
|
7
|
+
declare class DashboardLayoutPresenterImpl implements Abstraction.Interface {
|
|
8
|
+
private getCachedDashboardLayoutUseCase;
|
|
9
|
+
private fetchDashboardLayoutUseCase;
|
|
10
|
+
private saveDashboardLayoutUseCase;
|
|
11
|
+
private _userId;
|
|
12
|
+
private _columns;
|
|
13
|
+
private _columnCount;
|
|
14
|
+
private _hidden;
|
|
15
|
+
private _draggingName;
|
|
16
|
+
private _dropColumn;
|
|
17
|
+
private _dropBeforeName;
|
|
18
|
+
private _editing;
|
|
19
|
+
private _defaultColumns;
|
|
20
|
+
private _widgets;
|
|
21
|
+
private _changed;
|
|
22
|
+
private _saving;
|
|
23
|
+
private _pendingSave;
|
|
24
|
+
constructor(getCachedDashboardLayoutUseCase: GetCachedDashboardLayoutUseCase.Interface, fetchDashboardLayoutUseCase: FetchDashboardLayoutUseCase.Interface, saveDashboardLayoutUseCase: SaveDashboardLayoutUseCase.Interface);
|
|
25
|
+
get vm(): Abstraction.ViewModel;
|
|
26
|
+
init(userId: string, widgets: DashboardWidgetInput[]): void;
|
|
27
|
+
beginDrag: (name: string) => void;
|
|
28
|
+
hoverSlot: (column: number, beforeName: string | null) => void;
|
|
29
|
+
drop: () => void;
|
|
30
|
+
endDrag: () => void;
|
|
31
|
+
removeWidget: (name: string) => void;
|
|
32
|
+
addWidget: (name: string, column?: number) => void;
|
|
33
|
+
setColumnCount: (count: number) => void;
|
|
34
|
+
removeColumn: (index: number) => void;
|
|
35
|
+
startEditing: () => void;
|
|
36
|
+
stopEditing: () => void;
|
|
37
|
+
dispose: () => void;
|
|
38
|
+
resetToDefault: () => void;
|
|
39
|
+
applyFetchedLayout: (userId: string, fetched: DashboardLayoutData | null) => void;
|
|
40
|
+
/**
|
|
41
|
+
* Rebuild the columns and hidden list from a base state, keeping only currently registered
|
|
42
|
+
* widgets. Widgets neither placed nor hidden are treated as newly registered and appended to
|
|
43
|
+
* their default column.
|
|
44
|
+
*/
|
|
45
|
+
private applyOrder;
|
|
46
|
+
/** Pure computation of the resulting columns if `name` were dropped before `beforeName`. */
|
|
47
|
+
private computeMove;
|
|
48
|
+
private clampColumn;
|
|
49
|
+
private revalidate;
|
|
50
|
+
private persist;
|
|
51
|
+
private flushSaves;
|
|
52
|
+
}
|
|
53
|
+
export declare const DashboardLayoutPresenter: typeof DashboardLayoutPresenterImpl & {
|
|
54
|
+
__abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").IDashboardLayoutPresenter>;
|
|
55
|
+
};
|
|
56
|
+
export {};
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
import { makeAutoObservable } from "mobx";
|
|
2
|
+
import { FetchDashboardLayoutUseCase, GetCachedDashboardLayoutUseCase } from "../loadLayout/abstractions.js";
|
|
3
|
+
import { SaveDashboardLayoutUseCase } from "../saveLayout/abstractions.js";
|
|
4
|
+
import { DEFAULT_COLUMN_COUNT, MAX_COLUMN_COUNT, MIN_COLUMN_COUNT } from "../types.js";
|
|
5
|
+
import { DashboardLayoutPresenter } from "./abstractions.js";
|
|
6
|
+
class DashboardLayoutPresenterImpl {
|
|
7
|
+
constructor(getCachedDashboardLayoutUseCase, fetchDashboardLayoutUseCase, saveDashboardLayoutUseCase){
|
|
8
|
+
this.getCachedDashboardLayoutUseCase = getCachedDashboardLayoutUseCase;
|
|
9
|
+
this.fetchDashboardLayoutUseCase = fetchDashboardLayoutUseCase;
|
|
10
|
+
this.saveDashboardLayoutUseCase = saveDashboardLayoutUseCase;
|
|
11
|
+
this._userId = null;
|
|
12
|
+
this._columns = [];
|
|
13
|
+
this._columnCount = DEFAULT_COLUMN_COUNT;
|
|
14
|
+
this._hidden = [];
|
|
15
|
+
this._draggingName = null;
|
|
16
|
+
this._dropColumn = null;
|
|
17
|
+
this._dropBeforeName = null;
|
|
18
|
+
this._editing = false;
|
|
19
|
+
this._defaultColumns = new Map();
|
|
20
|
+
this._widgets = [];
|
|
21
|
+
this._changed = false;
|
|
22
|
+
this._saving = false;
|
|
23
|
+
this._pendingSave = null;
|
|
24
|
+
this.beginDrag = (name)=>{
|
|
25
|
+
this._draggingName = name;
|
|
26
|
+
};
|
|
27
|
+
this.hoverSlot = (column, beforeName)=>{
|
|
28
|
+
if (null === this._draggingName) return;
|
|
29
|
+
const moved = this.computeMove(this._draggingName, column, beforeName);
|
|
30
|
+
if (columnsEqual(moved, this._columns)) {
|
|
31
|
+
if (null !== this._dropColumn) {
|
|
32
|
+
this._dropColumn = null;
|
|
33
|
+
this._dropBeforeName = null;
|
|
34
|
+
}
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if (this._dropColumn === column && this._dropBeforeName === beforeName) return;
|
|
38
|
+
this._dropColumn = column;
|
|
39
|
+
this._dropBeforeName = beforeName;
|
|
40
|
+
};
|
|
41
|
+
this.drop = ()=>{
|
|
42
|
+
if (null !== this._draggingName && null !== this._dropColumn) {
|
|
43
|
+
this._columns = this.computeMove(this._draggingName, this._dropColumn, this._dropBeforeName);
|
|
44
|
+
this.persist();
|
|
45
|
+
}
|
|
46
|
+
this.endDrag();
|
|
47
|
+
};
|
|
48
|
+
this.endDrag = ()=>{
|
|
49
|
+
this._draggingName = null;
|
|
50
|
+
this._dropColumn = null;
|
|
51
|
+
this._dropBeforeName = null;
|
|
52
|
+
};
|
|
53
|
+
this.removeWidget = (name)=>{
|
|
54
|
+
this._columns = this._columns.map((column)=>column.filter((n)=>n !== name));
|
|
55
|
+
if (!this._hidden.includes(name)) this._hidden = [
|
|
56
|
+
...this._hidden,
|
|
57
|
+
name
|
|
58
|
+
];
|
|
59
|
+
this.persist();
|
|
60
|
+
};
|
|
61
|
+
this.addWidget = (name, column)=>{
|
|
62
|
+
if (!this._hidden.includes(name)) return;
|
|
63
|
+
this._hidden = this._hidden.filter((n)=>n !== name);
|
|
64
|
+
const requested = column ?? this._defaultColumns.get(name) ?? 0;
|
|
65
|
+
const target = this.clampColumn(requested);
|
|
66
|
+
this._columns = this._columns.map((names, index)=>{
|
|
67
|
+
if (index !== target || names.includes(name)) return names;
|
|
68
|
+
return [
|
|
69
|
+
...names,
|
|
70
|
+
name
|
|
71
|
+
];
|
|
72
|
+
});
|
|
73
|
+
this.persist();
|
|
74
|
+
};
|
|
75
|
+
this.setColumnCount = (count)=>{
|
|
76
|
+
const next = clamp(count, MIN_COLUMN_COUNT, MAX_COLUMN_COUNT);
|
|
77
|
+
if (next === this._columnCount) return;
|
|
78
|
+
this._columns = resizeColumns(this._columns, next);
|
|
79
|
+
this._columnCount = next;
|
|
80
|
+
this.persist();
|
|
81
|
+
};
|
|
82
|
+
this.removeColumn = (index)=>{
|
|
83
|
+
if (this._columnCount <= MIN_COLUMN_COUNT || index < 0 || index >= this._columns.length) return;
|
|
84
|
+
const removed = this._columns[index];
|
|
85
|
+
const columns = this._columns.filter((_, i)=>i !== index);
|
|
86
|
+
if (removed.length > 0) {
|
|
87
|
+
const target = Math.max(0, index - 1);
|
|
88
|
+
columns[target] = [
|
|
89
|
+
...columns[target],
|
|
90
|
+
...removed
|
|
91
|
+
];
|
|
92
|
+
}
|
|
93
|
+
this._columns = columns;
|
|
94
|
+
this._columnCount = columns.length;
|
|
95
|
+
this.persist();
|
|
96
|
+
};
|
|
97
|
+
this.startEditing = ()=>{
|
|
98
|
+
this._editing = true;
|
|
99
|
+
};
|
|
100
|
+
this.stopEditing = ()=>{
|
|
101
|
+
this._editing = false;
|
|
102
|
+
this.endDrag();
|
|
103
|
+
};
|
|
104
|
+
this.dispose = ()=>{
|
|
105
|
+
this.stopEditing();
|
|
106
|
+
};
|
|
107
|
+
this.resetToDefault = ()=>{
|
|
108
|
+
this._columnCount = DEFAULT_COLUMN_COUNT;
|
|
109
|
+
const columns = Array.from({
|
|
110
|
+
length: this._columnCount
|
|
111
|
+
}, ()=>[]);
|
|
112
|
+
for (const [name, column] of this._defaultColumns)columns[clamp(column, 0, this._columnCount - 1)].push(name);
|
|
113
|
+
this._columns = columns;
|
|
114
|
+
this._hidden = [];
|
|
115
|
+
this.persist();
|
|
116
|
+
};
|
|
117
|
+
this.applyFetchedLayout = (userId, fetched)=>{
|
|
118
|
+
if (this._userId !== userId || this._changed || null !== this._draggingName) return;
|
|
119
|
+
const layout = normalizeLayout(fetched);
|
|
120
|
+
this.applyOrder(this._widgets, layout);
|
|
121
|
+
};
|
|
122
|
+
makeAutoObservable(this, {
|
|
123
|
+
getCachedDashboardLayoutUseCase: false,
|
|
124
|
+
fetchDashboardLayoutUseCase: false,
|
|
125
|
+
saveDashboardLayoutUseCase: false,
|
|
126
|
+
_defaultColumns: false,
|
|
127
|
+
_widgets: false,
|
|
128
|
+
_changed: false,
|
|
129
|
+
_saving: false,
|
|
130
|
+
_pendingSave: false,
|
|
131
|
+
revalidate: false,
|
|
132
|
+
flushSaves: false
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
get vm() {
|
|
136
|
+
let dropTarget = null;
|
|
137
|
+
if (null !== this._dropColumn) dropTarget = {
|
|
138
|
+
column: this._dropColumn,
|
|
139
|
+
beforeName: this._dropBeforeName
|
|
140
|
+
};
|
|
141
|
+
return {
|
|
142
|
+
columns: this._columns.map((column)=>[
|
|
143
|
+
...column
|
|
144
|
+
]),
|
|
145
|
+
columnCount: this._columnCount,
|
|
146
|
+
hidden: [
|
|
147
|
+
...this._hidden
|
|
148
|
+
],
|
|
149
|
+
draggingName: this._draggingName,
|
|
150
|
+
dropTarget,
|
|
151
|
+
editing: this._editing
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
init(userId, widgets) {
|
|
155
|
+
this._widgets = widgets;
|
|
156
|
+
if (this._userId !== userId) {
|
|
157
|
+
this._userId = userId;
|
|
158
|
+
this._pendingSave = null;
|
|
159
|
+
this._changed = false;
|
|
160
|
+
this._editing = false;
|
|
161
|
+
this.endDrag();
|
|
162
|
+
const cached = this.getCachedDashboardLayoutUseCase.execute(userId);
|
|
163
|
+
const layout = normalizeLayout(cached);
|
|
164
|
+
this.applyOrder(widgets, layout);
|
|
165
|
+
this.revalidate(userId);
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
this.applyOrder(widgets, {
|
|
169
|
+
columns: this._columns,
|
|
170
|
+
hidden: this._hidden,
|
|
171
|
+
columnCount: this._columnCount
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
applyOrder(widgets, base) {
|
|
175
|
+
const names = widgets.map((w)=>w.name);
|
|
176
|
+
const registered = new Set(names);
|
|
177
|
+
const placed = new Set();
|
|
178
|
+
const columnCount = clamp(base.columnCount, MIN_COLUMN_COUNT, MAX_COLUMN_COUNT);
|
|
179
|
+
this._columnCount = columnCount;
|
|
180
|
+
const defaults = widgets.map((w)=>[
|
|
181
|
+
w.name,
|
|
182
|
+
clamp(w.column, 0, columnCount - 1)
|
|
183
|
+
]);
|
|
184
|
+
this._defaultColumns = new Map(defaults);
|
|
185
|
+
const columns = Array.from({
|
|
186
|
+
length: columnCount
|
|
187
|
+
}, ()=>[]);
|
|
188
|
+
base.columns.forEach((column, index)=>{
|
|
189
|
+
const target = Math.min(index, columnCount - 1);
|
|
190
|
+
for (const name of column)if (registered.has(name) && !placed.has(name)) {
|
|
191
|
+
columns[target].push(name);
|
|
192
|
+
placed.add(name);
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
const hidden = [];
|
|
196
|
+
for (const name of base.hidden)if (registered.has(name) && !placed.has(name)) {
|
|
197
|
+
hidden.push(name);
|
|
198
|
+
placed.add(name);
|
|
199
|
+
}
|
|
200
|
+
for (const widget of widgets)if (!placed.has(widget.name)) {
|
|
201
|
+
columns[clamp(widget.column, 0, columnCount - 1)].push(widget.name);
|
|
202
|
+
placed.add(widget.name);
|
|
203
|
+
}
|
|
204
|
+
this._columns = columns;
|
|
205
|
+
this._hidden = hidden;
|
|
206
|
+
}
|
|
207
|
+
computeMove(name, column, beforeName) {
|
|
208
|
+
if (beforeName === name) return this._columns.map((c)=>[
|
|
209
|
+
...c
|
|
210
|
+
]);
|
|
211
|
+
const columns = this._columns.map((c)=>c.filter((n)=>n !== name));
|
|
212
|
+
const target = columns[this.clampColumn(column)];
|
|
213
|
+
if (null === beforeName) target.push(name);
|
|
214
|
+
else {
|
|
215
|
+
const index = target.indexOf(beforeName);
|
|
216
|
+
if (index < 0) target.push(name);
|
|
217
|
+
else target.splice(index, 0, name);
|
|
218
|
+
}
|
|
219
|
+
return columns;
|
|
220
|
+
}
|
|
221
|
+
clampColumn(column) {
|
|
222
|
+
return clamp(column, 0, this._columnCount - 1);
|
|
223
|
+
}
|
|
224
|
+
async revalidate(userId) {
|
|
225
|
+
let fetched;
|
|
226
|
+
try {
|
|
227
|
+
fetched = await this.fetchDashboardLayoutUseCase.execute(userId);
|
|
228
|
+
} catch {
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
this.applyFetchedLayout(userId, fetched);
|
|
232
|
+
}
|
|
233
|
+
persist() {
|
|
234
|
+
if (null === this._userId) return;
|
|
235
|
+
this._changed = true;
|
|
236
|
+
this._pendingSave = {
|
|
237
|
+
userId: this._userId,
|
|
238
|
+
layout: {
|
|
239
|
+
columns: this._columns,
|
|
240
|
+
hidden: this._hidden,
|
|
241
|
+
columnCount: this._columnCount
|
|
242
|
+
}
|
|
243
|
+
};
|
|
244
|
+
if (!this._saving) this.flushSaves();
|
|
245
|
+
}
|
|
246
|
+
async flushSaves() {
|
|
247
|
+
this._saving = true;
|
|
248
|
+
while(this._pendingSave){
|
|
249
|
+
const { userId, layout } = this._pendingSave;
|
|
250
|
+
this._pendingSave = null;
|
|
251
|
+
try {
|
|
252
|
+
await this.saveDashboardLayoutUseCase.execute(userId, layout);
|
|
253
|
+
} catch {}
|
|
254
|
+
}
|
|
255
|
+
this._saving = false;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
function clamp(value, min, max) {
|
|
259
|
+
const upperBounded = Math.min(value, max);
|
|
260
|
+
return Math.max(min, upperBounded);
|
|
261
|
+
}
|
|
262
|
+
function columnsEqual(a, b) {
|
|
263
|
+
if (a.length !== b.length) return false;
|
|
264
|
+
return a.every((column, index)=>{
|
|
265
|
+
const other = b[index];
|
|
266
|
+
return column.length === other.length && column.every((v, i)=>v === other[i]);
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
function resizeColumns(columns, count) {
|
|
270
|
+
if (count >= columns.length) {
|
|
271
|
+
const next = columns.map((c)=>[
|
|
272
|
+
...c
|
|
273
|
+
]);
|
|
274
|
+
while(next.length < count)next.push([]);
|
|
275
|
+
return next;
|
|
276
|
+
}
|
|
277
|
+
const next = columns.slice(0, count).map((c)=>[
|
|
278
|
+
...c
|
|
279
|
+
]);
|
|
280
|
+
for(let i = count; i < columns.length; i++)next[count - 1].push(...columns[i]);
|
|
281
|
+
return next;
|
|
282
|
+
}
|
|
283
|
+
function normalizeLayout(layout) {
|
|
284
|
+
if (!layout) return {
|
|
285
|
+
columns: [],
|
|
286
|
+
hidden: [],
|
|
287
|
+
columnCount: DEFAULT_COLUMN_COUNT
|
|
288
|
+
};
|
|
289
|
+
const columns = layout.columns ?? [];
|
|
290
|
+
const requestedCount = layout.columnCount ?? columns.length;
|
|
291
|
+
const columnCount = clamp(requestedCount, MIN_COLUMN_COUNT, MAX_COLUMN_COUNT);
|
|
292
|
+
return {
|
|
293
|
+
columns,
|
|
294
|
+
hidden: layout.hidden ?? [],
|
|
295
|
+
columnCount
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
const DashboardLayoutPresenter_DashboardLayoutPresenter = DashboardLayoutPresenter.createImplementation({
|
|
299
|
+
implementation: DashboardLayoutPresenterImpl,
|
|
300
|
+
dependencies: [
|
|
301
|
+
GetCachedDashboardLayoutUseCase,
|
|
302
|
+
FetchDashboardLayoutUseCase,
|
|
303
|
+
SaveDashboardLayoutUseCase
|
|
304
|
+
]
|
|
305
|
+
});
|
|
306
|
+
export { DashboardLayoutPresenter_DashboardLayoutPresenter as DashboardLayoutPresenter };
|
|
307
|
+
|
|
308
|
+
//# sourceMappingURL=DashboardLayoutPresenter.js.map
|