@webiny/app-admin-ui 0.0.0-unstable.7be00a75a9 → 0.0.0-unstable.7c2def32a7

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 (198) hide show
  1. package/Breadcrumbs/Breadcrumbs.d.ts +14 -0
  2. package/Breadcrumbs/Breadcrumbs.js +74 -0
  3. package/Breadcrumbs/Breadcrumbs.js.map +1 -0
  4. package/CommandPalette/CommandPalette.d.ts +6 -0
  5. package/CommandPalette/CommandPalette.js +202 -0
  6. package/CommandPalette/CommandPalette.js.map +1 -0
  7. package/CommandPalette/components/AiModeBadge.d.ts +3 -0
  8. package/CommandPalette/components/AiModeBadge.js +11 -0
  9. package/CommandPalette/components/AiModeBadge.js.map +1 -0
  10. package/CommandPalette/components/AiSuggestions.d.ts +9 -0
  11. package/CommandPalette/components/AiSuggestions.js +32 -0
  12. package/CommandPalette/components/AiSuggestions.js.map +1 -0
  13. package/CommandPalette/components/AiTurn.d.ts +11 -0
  14. package/CommandPalette/components/AiTurn.js +61 -0
  15. package/CommandPalette/components/AiTurn.js.map +1 -0
  16. package/CommandPalette/components/AnswerSkeleton.d.ts +6 -0
  17. package/CommandPalette/components/AnswerSkeleton.js +20 -0
  18. package/CommandPalette/components/AnswerSkeleton.js.map +1 -0
  19. package/CommandPalette/components/ApprovalPlan.d.ts +16 -0
  20. package/CommandPalette/components/ApprovalPlan.js +56 -0
  21. package/CommandPalette/components/ApprovalPlan.js.map +1 -0
  22. package/CommandPalette/components/CommandDetail.d.ts +13 -0
  23. package/CommandPalette/components/CommandDetail.js +39 -0
  24. package/CommandPalette/components/CommandDetail.js.map +1 -0
  25. package/CommandPalette/components/CommandItemRow.d.ts +5 -0
  26. package/CommandPalette/components/CommandItemRow.js +41 -0
  27. package/CommandPalette/components/CommandItemRow.js.map +1 -0
  28. package/CommandPalette/components/GroupHeading.d.ts +4 -0
  29. package/CommandPalette/components/GroupHeading.js +10 -0
  30. package/CommandPalette/components/GroupHeading.js.map +1 -0
  31. package/CommandPalette/components/HintIcon.d.ts +4 -0
  32. package/CommandPalette/components/HintIcon.js +11 -0
  33. package/CommandPalette/components/HintIcon.js.map +1 -0
  34. package/CommandPalette/components/Kbd.d.ts +4 -0
  35. package/CommandPalette/components/Kbd.js +14 -0
  36. package/CommandPalette/components/Kbd.js.map +1 -0
  37. package/CommandPalette/components/NoResults.d.ts +13 -0
  38. package/CommandPalette/components/NoResults.js +33 -0
  39. package/CommandPalette/components/NoResults.js.map +1 -0
  40. package/CommandPalette/components/PaletteFooter.d.ts +13 -0
  41. package/CommandPalette/components/PaletteFooter.js +18 -0
  42. package/CommandPalette/components/PaletteFooter.js.map +1 -0
  43. package/CommandPalette/components/ToolChip.d.ts +7 -0
  44. package/CommandPalette/components/ToolChip.js +32 -0
  45. package/CommandPalette/components/ToolChip.js.map +1 -0
  46. package/CommandPalette/components/index.d.ts +13 -0
  47. package/CommandPalette/components/index.js +13 -0
  48. package/CommandPalette/constants.d.ts +8 -0
  49. package/CommandPalette/constants.js +5 -0
  50. package/CommandPalette/constants.js.map +1 -0
  51. package/CommandPalette/deriveRows.d.ts +19 -0
  52. package/CommandPalette/deriveRows.js +100 -0
  53. package/CommandPalette/deriveRows.js.map +1 -0
  54. package/CommandPalette/modes/PaletteMode.d.ts +73 -0
  55. package/CommandPalette/modes/PaletteMode.js +0 -0
  56. package/CommandPalette/modes/createAiMode.d.ts +13 -0
  57. package/CommandPalette/modes/createAiMode.js +80 -0
  58. package/CommandPalette/modes/createAiMode.js.map +1 -0
  59. package/CommandPalette/modes/index.d.ts +2 -0
  60. package/CommandPalette/modes/index.js +1 -0
  61. package/CommandPalette/types.d.ts +15 -0
  62. package/CommandPalette/types.js +0 -0
  63. package/CommandPalette/usePaletteHotkeys.d.ts +16 -0
  64. package/CommandPalette/usePaletteHotkeys.js +38 -0
  65. package/CommandPalette/usePaletteHotkeys.js.map +1 -0
  66. package/Dashboard/Welcome.d.ts +4 -1
  67. package/Dashboard/Welcome.js +111 -24
  68. package/Dashboard/Welcome.js.map +1 -1
  69. package/Dashboard/components/DashboardToolbar.d.ts +11 -0
  70. package/Dashboard/components/DashboardToolbar.js +48 -0
  71. package/Dashboard/components/DashboardToolbar.js.map +1 -0
  72. package/Dashboard/components/addWidgetDrawer/AddToColumnMenu.d.ts +10 -0
  73. package/Dashboard/components/addWidgetDrawer/AddToColumnMenu.js +30 -0
  74. package/Dashboard/components/addWidgetDrawer/AddToColumnMenu.js.map +1 -0
  75. package/Dashboard/components/addWidgetDrawer/AddWidgetDrawer.d.ts +12 -0
  76. package/Dashboard/components/addWidgetDrawer/AddWidgetDrawer.js +61 -0
  77. package/Dashboard/components/addWidgetDrawer/AddWidgetDrawer.js.map +1 -0
  78. package/Dashboard/components/addWidgetDrawer/DrawerWidgetRow.d.ts +10 -0
  79. package/Dashboard/components/addWidgetDrawer/DrawerWidgetRow.js +38 -0
  80. package/Dashboard/components/addWidgetDrawer/DrawerWidgetRow.js.map +1 -0
  81. package/Dashboard/components/addWidgetDrawer/WidgetPreviewFrame.d.ts +7 -0
  82. package/Dashboard/components/addWidgetDrawer/WidgetPreviewFrame.js +44 -0
  83. package/Dashboard/components/addWidgetDrawer/WidgetPreviewFrame.js.map +1 -0
  84. package/Dashboard/components/addWidgetDrawer/WidgetSketch.d.ts +4 -0
  85. package/Dashboard/components/addWidgetDrawer/WidgetSketch.js +20 -0
  86. package/Dashboard/components/addWidgetDrawer/WidgetSketch.js.map +1 -0
  87. package/Dashboard/components/addWidgetDrawer/WidgetTabContent.d.ts +14 -0
  88. package/Dashboard/components/addWidgetDrawer/WidgetTabContent.js +76 -0
  89. package/Dashboard/components/addWidgetDrawer/WidgetTabContent.js.map +1 -0
  90. package/Dashboard/components/addWidgetDrawer/types.d.ts +10 -0
  91. package/Dashboard/components/addWidgetDrawer/types.js +0 -0
  92. package/Dashboard/components/dnd/ColumnCountControl.d.ts +9 -0
  93. package/Dashboard/components/dnd/ColumnCountControl.js +52 -0
  94. package/Dashboard/components/dnd/ColumnCountControl.js.map +1 -0
  95. package/Dashboard/components/dnd/ColumnEmptyState.d.ts +10 -0
  96. package/Dashboard/components/dnd/ColumnEmptyState.js +52 -0
  97. package/Dashboard/components/dnd/ColumnEmptyState.js.map +1 -0
  98. package/Dashboard/components/dnd/DashboardDragLayer.d.ts +6 -0
  99. package/Dashboard/components/dnd/DashboardDragLayer.js +28 -0
  100. package/Dashboard/components/dnd/DashboardDragLayer.js.map +1 -0
  101. package/Dashboard/components/dnd/DashboardWidgetCard.d.ts +13 -0
  102. package/Dashboard/components/dnd/DashboardWidgetCard.js +59 -0
  103. package/Dashboard/components/dnd/DashboardWidgetCard.js.map +1 -0
  104. package/Dashboard/components/dnd/DashboardWidgetColumn.d.ts +19 -0
  105. package/Dashboard/components/dnd/DashboardWidgetColumn.js +72 -0
  106. package/Dashboard/components/dnd/DashboardWidgetColumn.js.map +1 -0
  107. package/Dashboard/components/dnd/WidgetDropIndicator.d.ts +11 -0
  108. package/Dashboard/components/dnd/WidgetDropIndicator.js +29 -0
  109. package/Dashboard/components/dnd/WidgetDropIndicator.js.map +1 -0
  110. package/Dashboard/components/dnd/WidgetSlot.d.ts +6 -0
  111. package/Dashboard/components/dnd/WidgetSlot.js +9 -0
  112. package/Dashboard/components/dnd/WidgetSlot.js.map +1 -0
  113. package/Dashboard/components/dnd/dragItem.d.ts +6 -0
  114. package/Dashboard/components/dnd/dragItem.js +4 -0
  115. package/Dashboard/components/dnd/dragItem.js.map +1 -0
  116. package/Dashboard/components/dnd/useWidgetHosts.d.ts +1 -0
  117. package/Dashboard/components/dnd/useWidgetHosts.js +16 -0
  118. package/Dashboard/components/dnd/useWidgetHosts.js.map +1 -0
  119. package/Dashboard/components/layout/EditableColumns.d.ts +13 -0
  120. package/Dashboard/components/layout/EditableColumns.js +25 -0
  121. package/Dashboard/components/layout/EditableColumns.js.map +1 -0
  122. package/Dashboard/components/layout/StaticColumns.d.ts +8 -0
  123. package/Dashboard/components/layout/StaticColumns.js +20 -0
  124. package/Dashboard/components/layout/StaticColumns.js.map +1 -0
  125. package/Dashboard/components/layout/collapseColumns.d.ts +1 -0
  126. package/Dashboard/components/layout/collapseColumns.js +16 -0
  127. package/Dashboard/components/layout/collapseColumns.js.map +1 -0
  128. package/Dashboard/components/layout/layoutConstants.d.ts +2 -0
  129. package/Dashboard/components/layout/layoutConstants.js +5 -0
  130. package/Dashboard/components/layout/layoutConstants.js.map +1 -0
  131. package/Dashboard/components/layout/useColumnsThatFit.d.ts +6 -0
  132. package/Dashboard/components/layout/useColumnsThatFit.js +30 -0
  133. package/Dashboard/components/layout/useColumnsThatFit.js.map +1 -0
  134. package/Dashboard/components/layout/useWidgetPortals.d.ts +5 -0
  135. package/Dashboard/components/layout/useWidgetPortals.js +26 -0
  136. package/Dashboard/components/layout/useWidgetPortals.js.map +1 -0
  137. package/Dashboard/dashboardLayout/loadLayout/FetchDashboardLayoutUseCase.d.ts +12 -0
  138. package/Dashboard/dashboardLayout/loadLayout/FetchDashboardLayoutUseCase.js +19 -0
  139. package/Dashboard/dashboardLayout/loadLayout/FetchDashboardLayoutUseCase.js.map +1 -0
  140. package/Dashboard/dashboardLayout/loadLayout/GetCachedDashboardLayoutUseCase.d.ts +12 -0
  141. package/Dashboard/dashboardLayout/loadLayout/GetCachedDashboardLayoutUseCase.js +19 -0
  142. package/Dashboard/dashboardLayout/loadLayout/GetCachedDashboardLayoutUseCase.js.map +1 -0
  143. package/Dashboard/dashboardLayout/loadLayout/abstractions.d.ts +15 -0
  144. package/Dashboard/dashboardLayout/loadLayout/abstractions.js +6 -0
  145. package/Dashboard/dashboardLayout/loadLayout/abstractions.js.map +1 -0
  146. package/Dashboard/dashboardLayout/loadLayout/feature.d.ts +1 -0
  147. package/Dashboard/dashboardLayout/loadLayout/feature.js +13 -0
  148. package/Dashboard/dashboardLayout/loadLayout/feature.js.map +1 -0
  149. package/Dashboard/dashboardLayout/presenter/DashboardLayoutPresenter.d.ts +56 -0
  150. package/Dashboard/dashboardLayout/presenter/DashboardLayoutPresenter.js +308 -0
  151. package/Dashboard/dashboardLayout/presenter/DashboardLayoutPresenter.js.map +1 -0
  152. package/Dashboard/dashboardLayout/presenter/abstractions.d.ts +46 -0
  153. package/Dashboard/dashboardLayout/presenter/abstractions.js +5 -0
  154. package/Dashboard/dashboardLayout/presenter/abstractions.js.map +1 -0
  155. package/Dashboard/dashboardLayout/presenter/feature.d.ts +3 -0
  156. package/Dashboard/dashboardLayout/presenter/feature.js +23 -0
  157. package/Dashboard/dashboardLayout/presenter/feature.js.map +1 -0
  158. package/Dashboard/dashboardLayout/presenter/useDashboardLayoutPresenter.d.ts +1 -0
  159. package/Dashboard/dashboardLayout/presenter/useDashboardLayoutPresenter.js +6 -0
  160. package/Dashboard/dashboardLayout/presenter/useDashboardLayoutPresenter.js.map +1 -0
  161. package/Dashboard/dashboardLayout/repository/DashboardLayoutGateway.d.ts +13 -0
  162. package/Dashboard/dashboardLayout/repository/DashboardLayoutGateway.js +67 -0
  163. package/Dashboard/dashboardLayout/repository/DashboardLayoutGateway.js.map +1 -0
  164. package/Dashboard/dashboardLayout/repository/DashboardLayoutRepository.d.ts +20 -0
  165. package/Dashboard/dashboardLayout/repository/DashboardLayoutRepository.js +49 -0
  166. package/Dashboard/dashboardLayout/repository/DashboardLayoutRepository.js.map +1 -0
  167. package/Dashboard/dashboardLayout/repository/abstractions.d.ts +25 -0
  168. package/Dashboard/dashboardLayout/repository/abstractions.js +6 -0
  169. package/Dashboard/dashboardLayout/repository/abstractions.js.map +1 -0
  170. package/Dashboard/dashboardLayout/repository/feature.d.ts +1 -0
  171. package/Dashboard/dashboardLayout/repository/feature.js +13 -0
  172. package/Dashboard/dashboardLayout/repository/feature.js.map +1 -0
  173. package/Dashboard/dashboardLayout/saveLayout/SaveDashboardLayoutUseCase.d.ts +12 -0
  174. package/Dashboard/dashboardLayout/saveLayout/SaveDashboardLayoutUseCase.js +19 -0
  175. package/Dashboard/dashboardLayout/saveLayout/SaveDashboardLayoutUseCase.js.map +1 -0
  176. package/Dashboard/dashboardLayout/saveLayout/abstractions.d.ts +8 -0
  177. package/Dashboard/dashboardLayout/saveLayout/abstractions.js +5 -0
  178. package/Dashboard/dashboardLayout/saveLayout/abstractions.js.map +1 -0
  179. package/Dashboard/dashboardLayout/saveLayout/feature.d.ts +1 -0
  180. package/Dashboard/dashboardLayout/saveLayout/feature.js +11 -0
  181. package/Dashboard/dashboardLayout/saveLayout/feature.js.map +1 -0
  182. package/Dashboard/dashboardLayout/toColumnIndex.d.ts +1 -0
  183. package/Dashboard/dashboardLayout/toColumnIndex.js +7 -0
  184. package/Dashboard/dashboardLayout/toColumnIndex.js.map +1 -0
  185. package/Dashboard/dashboardLayout/types.d.ts +15 -0
  186. package/Dashboard/dashboardLayout/types.js +6 -0
  187. package/Dashboard/dashboardLayout/types.js.map +1 -0
  188. package/Layout.js +50 -21
  189. package/Layout.js.map +1 -1
  190. package/index.js +16 -5
  191. package/index.js.map +1 -1
  192. package/package.json +15 -8
  193. package/Navigation/SidebarProvider.d.ts +0 -6
  194. package/Navigation/SidebarProvider.js +0 -26
  195. package/Navigation/SidebarProvider.js.map +0 -1
  196. package/Navigation.d.ts +0 -2
  197. package/Navigation.js +0 -10
  198. package/Navigation.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dashboard/components/dnd/DashboardWidgetCard.js","sources":["../../../../src/Dashboard/components/dnd/DashboardWidgetCard.tsx"],"sourcesContent":["import React from \"react\";\nimport { useRef } from \"react\";\nimport { useDrag } from \"react-dnd\";\nimport { DragPreviewImage } from \"react-dnd\";\nimport { IconButton } from \"@webiny/admin-ui\";\nimport { Tooltip } from \"@webiny/admin-ui\";\nimport { cn } from \"@webiny/admin-ui\";\nimport { ReactComponent as RemoveIcon } from \"@webiny/icons/delete.svg\";\nimport type { DashboardLayoutPresenter } from \"../../dashboardLayout/presenter/abstractions.js\";\nimport { DASHBOARD_WIDGET_DND_TYPE } from \"./dragItem.js\";\nimport type { DashboardWidgetDragItem } from \"./dragItem.js\";\n\n// Transparent 1px gif. Hides the browser's drag preview so DashboardDragLayer's card is the only one.\nconst EMPTY_DRAG_IMAGE =\n \"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\";\n\ninterface DashboardWidgetCardProps {\n name: string;\n title: string;\n isDragging: boolean;\n presenter: DashboardLayoutPresenter.Interface;\n /** Reports the card's DOM node to the column so it can measure drop slots. */\n registerRef: (name: string, node: HTMLElement | null) => void;\n children: React.ReactNode;\n}\n\n/*\n * A widget in Customize mode. The whole card is the drag target: an overlay covers the widget, so\n * its own links and buttons can't catch the pointer, and a remove button sits in the corner.\n */\nexport const DashboardWidgetCard = ({\n name,\n title,\n isDragging,\n presenter,\n registerRef,\n children\n}: DashboardWidgetCardProps) => {\n const cardRef = useRef<HTMLElement | null>(null);\n\n const [, drag, preview] = useDrag({\n type: DASHBOARD_WIDGET_DND_TYPE,\n item: () => {\n presenter.beginDrag(name);\n const height = cardRef.current?.getBoundingClientRect().height ?? 0;\n return { name, title, height } satisfies DashboardWidgetDragItem;\n },\n end: () => {\n presenter.endDrag();\n }\n });\n\n return (\n <>\n <DragPreviewImage connect={preview} src={EMPTY_DRAG_IMAGE} />\n <div\n ref={node => {\n cardRef.current = node;\n registerRef(name, node);\n }}\n className={cn(\n // A named group: a plain `group` here would also trigger `group-hover:` styles inside the\n // widget (e.g. every Tabs trigger at once), since those match any `.group` ancestor.\n \"group/card relative rounded-xl transition-opacity\",\n isDragging && \"opacity-50\"\n )}\n >\n {/*\n `inert` keeps the widget out of the tab order and away from clicks. It's set\n through a ref because React 18's types don't know the attribute yet.\n */}\n <div ref={node => node?.setAttribute(\"inert\", \"\")} className={\"select-none\"}>\n {children}\n </div>\n <div\n ref={node => {\n drag(node);\n }}\n role={\"button\"}\n aria-label={`Drag ${title} to move it`}\n data-testid={`dashboard-card-${name}`}\n className={cn(\n // `rounded-xl` matches the DS Widget, so the outline follows its corners.\n \"absolute inset-0 z-10 cursor-grab rounded-xl active:cursor-grabbing\",\n \"ring-2 ring-inset ring-primary/30 transition-colors\",\n \"hover:bg-primary/5 hover:ring-primary/60\"\n )}\n />\n {/*\n On the corner, half outside the card, so it never covers the widget's own\n actions. Only the card under the pointer (or with focus) shows it, so six cards\n don't mean six buttons.\n */}\n <div\n className={cn(\n \"absolute -right-sm -top-sm z-20 opacity-0 transition-opacity\",\n \"group-hover/card:opacity-100 focus-within:opacity-100\"\n )}\n >\n <Tooltip\n content={\"Remove from dashboard\"}\n trigger={\n <IconButton\n variant={\"tertiary\"}\n size={\"sm\"}\n icon={<RemoveIcon />}\n aria-label={`Remove ${title} from the dashboard`}\n onClick={() => presenter.removeWidget(name)}\n />\n }\n />\n </div>\n </div>\n </>\n );\n};\n"],"names":["EMPTY_DRAG_IMAGE","DashboardWidgetCard","name","title","isDragging","presenter","registerRef","children","cardRef","useRef","drag","preview","useDrag","DASHBOARD_WIDGET_DND_TYPE","height","DragPreviewImage","node","cn","Tooltip","IconButton","RemoveIcon"],"mappings":";;;;;AAaA,MAAMA,mBACF;AAgBG,MAAMC,sBAAsB,CAAC,EAChCC,IAAI,EACJC,KAAK,EACLC,UAAU,EACVC,SAAS,EACTC,WAAW,EACXC,QAAQ,EACe;IACvB,MAAMC,UAAUC,OAA2B;IAE3C,MAAM,GAAGC,MAAMC,QAAQ,GAAGC,QAAQ;QAC9B,MAAMC;QACN,MAAM;YACFR,UAAU,SAAS,CAACH;YACpB,MAAMY,SAASN,QAAQ,OAAO,EAAE,wBAAwB,UAAU;YAClE,OAAO;gBAAEN;gBAAMC;gBAAOW;YAAO;QACjC;QACA,KAAK;YACDT,UAAU,OAAO;QACrB;IACJ;IAEA,OAAO,WAAP,GACI,wDACI,oBAACU,kBAAgBA;QAAC,SAASJ;QAAS,KAAKX;sBACzC,oBAAC;QACG,KAAKgB,CAAAA;YACDR,QAAQ,OAAO,GAAGQ;YAClBV,YAAYJ,MAAMc;QACtB;QACA,WAAWC,GAGP,qDACAb,cAAc;qBAOlB,oBAAC;QAAI,KAAKY,CAAAA,OAAQA,MAAM,aAAa,SAAS;QAAK,WAAW;OACzDT,WAAAA,WAAAA,GAEL,oBAAC;QACG,KAAKS,CAAAA;YACDN,KAAKM;QACT;QACA,MAAM;QACN,cAAY,CAAC,KAAK,EAAEb,MAAM,WAAW,CAAC;QACtC,eAAa,CAAC,eAAe,EAAED,MAAM;QACrC,WAAWe,GAEP,uEACA,uDACA;sBAQR,oBAAC;QACG,WAAWA,GACP,gEACA;qBAGJ,oBAACC,SAAOA;QACJ,SAAS;QACT,uBACI,oBAACC,YAAUA;YACP,SAAS;YACT,MAAM;YACN,oBAAM,oBAACC,gBAAUA;YACjB,cAAY,CAAC,OAAO,EAAEjB,MAAM,mBAAmB,CAAC;YAChD,SAAS,IAAME,UAAU,YAAY,CAACH;;;AAQtE"}
@@ -0,0 +1,19 @@
1
+ import React from "react";
2
+ import type { DashboardDropTarget } from "../../dashboardLayout/presenter/abstractions.js";
3
+ import type { DashboardLayoutPresenter } from "../../dashboardLayout/presenter/abstractions.js";
4
+ interface DashboardWidgetColumnProps {
5
+ columnIndex: number;
6
+ /** Ordered widget names for this column (from the presenter's view model). */
7
+ names: string[];
8
+ draggingName: string | null;
9
+ dropTarget: DashboardDropTarget | null;
10
+ canRemoveColumn: boolean;
11
+ elements: Map<string, React.ReactElement>;
12
+ titles: Map<string, {
13
+ title: string;
14
+ }>;
15
+ presenter: DashboardLayoutPresenter.Interface;
16
+ onBrowseWidgets: () => void;
17
+ }
18
+ export declare const DashboardWidgetColumn: ({ columnIndex, names, draggingName, dropTarget, canRemoveColumn, elements, titles, presenter, onBrowseWidgets }: DashboardWidgetColumnProps) => React.JSX.Element;
19
+ export {};
@@ -0,0 +1,72 @@
1
+ import react, { useRef } from "react";
2
+ import { useDrop } from "react-dnd";
3
+ import { DASHBOARD_WIDGET_DND_TYPE } from "./dragItem.js";
4
+ import { DashboardWidgetCard } from "./DashboardWidgetCard.js";
5
+ import { WidgetDropIndicator } from "./WidgetDropIndicator.js";
6
+ import { ColumnEmptyState } from "./ColumnEmptyState.js";
7
+ const DashboardWidgetColumn = ({ columnIndex, names, draggingName, dropTarget, canRemoveColumn, elements, titles, presenter, onBrowseWidgets })=>{
8
+ const cardRefs = useRef(new Map());
9
+ const registerRef = (name, node)=>{
10
+ if (node) cardRefs.current.set(name, node);
11
+ else cardRefs.current.delete(name);
12
+ };
13
+ const [{ item }, drop] = useDrop({
14
+ accept: DASHBOARD_WIDGET_DND_TYPE,
15
+ collect: (monitor)=>({
16
+ item: monitor.getItem()
17
+ }),
18
+ hover: (_item, monitor)=>{
19
+ const pointer = monitor.getClientOffset();
20
+ if (!pointer) return;
21
+ let beforeName = null;
22
+ for (const name of names){
23
+ const node = cardRefs.current.get(name);
24
+ if (!node) continue;
25
+ const rect = node.getBoundingClientRect();
26
+ if (pointer.y < rect.top + rect.height / 2) {
27
+ beforeName = name;
28
+ break;
29
+ }
30
+ }
31
+ presenter.hoverSlot(columnIndex, beforeName);
32
+ },
33
+ drop: ()=>{
34
+ presenter.drop();
35
+ }
36
+ });
37
+ const isDragging = null !== draggingName;
38
+ const showIndicatorBefore = (name)=>isDragging && null !== dropTarget && dropTarget.column === columnIndex && dropTarget.beforeName === name;
39
+ let indicator = null;
40
+ if (item) indicator = /*#__PURE__*/ react.createElement(WidgetDropIndicator, {
41
+ title: item.title,
42
+ height: item.height
43
+ });
44
+ return /*#__PURE__*/ react.createElement("div", {
45
+ ref: (node)=>{
46
+ drop(node);
47
+ },
48
+ className: "relative flex min-h-[120px] flex-1 flex-col gap-lg",
49
+ "data-testid": `dashboard-column-${columnIndex}`
50
+ }, names.map((name)=>{
51
+ const element = elements.get(name);
52
+ if (!element) return null;
53
+ return /*#__PURE__*/ react.createElement(react.Fragment, {
54
+ key: name
55
+ }, showIndicatorBefore(name) ? indicator : null, /*#__PURE__*/ react.createElement(DashboardWidgetCard, {
56
+ name: name,
57
+ title: titles.get(name)?.title ?? name,
58
+ isDragging: name === draggingName,
59
+ presenter: presenter,
60
+ registerRef: registerRef
61
+ }, element));
62
+ }), names.length > 0 && showIndicatorBefore(null) && indicator, 0 === names.length && /*#__PURE__*/ react.createElement(ColumnEmptyState, {
63
+ canRemove: canRemoveColumn,
64
+ onRemove: ()=>presenter.removeColumn(columnIndex),
65
+ onBrowse: onBrowseWidgets,
66
+ dragging: isDragging,
67
+ active: showIndicatorBefore(null)
68
+ }));
69
+ };
70
+ export { DashboardWidgetColumn };
71
+
72
+ //# sourceMappingURL=DashboardWidgetColumn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dashboard/components/dnd/DashboardWidgetColumn.js","sources":["../../../../src/Dashboard/components/dnd/DashboardWidgetColumn.tsx"],"sourcesContent":["import React from \"react\";\nimport { useRef } from \"react\";\nimport { useDrop } from \"react-dnd\";\nimport { DASHBOARD_WIDGET_DND_TYPE } from \"./dragItem.js\";\nimport type { DashboardWidgetDragItem } from \"./dragItem.js\";\nimport { DashboardWidgetCard } from \"./DashboardWidgetCard.js\";\nimport { WidgetDropIndicator } from \"./WidgetDropIndicator.js\";\nimport { ColumnEmptyState } from \"./ColumnEmptyState.js\";\nimport type { DashboardDropTarget } from \"../../dashboardLayout/presenter/abstractions.js\";\nimport type { DashboardLayoutPresenter } from \"../../dashboardLayout/presenter/abstractions.js\";\n\ninterface DashboardWidgetColumnProps {\n columnIndex: number;\n /** Ordered widget names for this column (from the presenter's view model). */\n names: string[];\n draggingName: string | null;\n dropTarget: DashboardDropTarget | null;\n canRemoveColumn: boolean;\n elements: Map<string, React.ReactElement>;\n titles: Map<string, { title: string }>;\n presenter: DashboardLayoutPresenter.Interface;\n onBrowseWidgets: () => void;\n}\n\nexport const DashboardWidgetColumn = ({\n columnIndex,\n names,\n draggingName,\n dropTarget,\n canRemoveColumn,\n elements,\n titles,\n presenter,\n onBrowseWidgets\n}: DashboardWidgetColumnProps) => {\n // The whole column is one drop target. On hover we measure each card's midpoint to decide\n // which slot the pointer is nearest, so gaps (and the indicator itself) never miss a drop.\n const cardRefs = useRef(new Map<string, HTMLElement>());\n\n const registerRef = (name: string, node: HTMLElement | null) => {\n if (node) {\n cardRefs.current.set(name, node);\n } else {\n cardRefs.current.delete(name);\n }\n };\n\n const [{ item }, drop] = useDrop({\n accept: DASHBOARD_WIDGET_DND_TYPE,\n collect: monitor => ({ item: monitor.getItem<DashboardWidgetDragItem | null>() }),\n hover: (_item, monitor) => {\n const pointer = monitor.getClientOffset();\n if (!pointer) {\n return;\n }\n let beforeName: string | null = null;\n for (const name of names) {\n const node = cardRefs.current.get(name);\n if (!node) {\n continue;\n }\n const rect = node.getBoundingClientRect();\n if (pointer.y < rect.top + rect.height / 2) {\n beforeName = name;\n break;\n }\n }\n presenter.hoverSlot(columnIndex, beforeName);\n },\n drop: () => {\n presenter.drop();\n }\n });\n\n const isDragging = draggingName !== null;\n const showIndicatorBefore = (name: string | null) =>\n isDragging &&\n dropTarget !== null &&\n dropTarget.column === columnIndex &&\n dropTarget.beforeName === name;\n\n // The slot takes the dragged card's size and names it, so it shows exactly what lands there.\n let indicator = null;\n if (item) {\n indicator = <WidgetDropIndicator title={item.title} height={item.height} />;\n }\n\n return (\n <div\n ref={node => {\n drop(node);\n }}\n className={\"relative flex min-h-[120px] flex-1 flex-col gap-lg\"}\n data-testid={`dashboard-column-${columnIndex}`}\n >\n {names.map(name => {\n const element = elements.get(name);\n if (!element) {\n return null;\n }\n return (\n <React.Fragment key={name}>\n {showIndicatorBefore(name) ? indicator : null}\n <DashboardWidgetCard\n name={name}\n title={titles.get(name)?.title ?? name}\n isDragging={name === draggingName}\n presenter={presenter}\n registerRef={registerRef}\n >\n {element}\n </DashboardWidgetCard>\n </React.Fragment>\n );\n })}\n {names.length > 0 && showIndicatorBefore(null) && indicator}\n {/* An empty column stays put and becomes the target itself, like the editor's empty slots. */}\n {names.length === 0 && (\n <ColumnEmptyState\n canRemove={canRemoveColumn}\n onRemove={() => presenter.removeColumn(columnIndex)}\n onBrowse={onBrowseWidgets}\n dragging={isDragging}\n active={showIndicatorBefore(null)}\n />\n )}\n </div>\n );\n};\n"],"names":["DashboardWidgetColumn","columnIndex","names","draggingName","dropTarget","canRemoveColumn","elements","titles","presenter","onBrowseWidgets","cardRefs","useRef","Map","registerRef","name","node","item","drop","useDrop","DASHBOARD_WIDGET_DND_TYPE","monitor","_item","pointer","beforeName","rect","isDragging","showIndicatorBefore","indicator","WidgetDropIndicator","element","React","DashboardWidgetCard","ColumnEmptyState"],"mappings":";;;;;;AAwBO,MAAMA,wBAAwB,CAAC,EAClCC,WAAW,EACXC,KAAK,EACLC,YAAY,EACZC,UAAU,EACVC,eAAe,EACfC,QAAQ,EACRC,MAAM,EACNC,SAAS,EACTC,eAAe,EACU;IAGzB,MAAMC,WAAWC,OAAO,IAAIC;IAE5B,MAAMC,cAAc,CAACC,MAAcC;QAC/B,IAAIA,MACAL,SAAS,OAAO,CAAC,GAAG,CAACI,MAAMC;aAE3BL,SAAS,OAAO,CAAC,MAAM,CAACI;IAEhC;IAEA,MAAM,CAAC,EAAEE,IAAI,EAAE,EAAEC,KAAK,GAAGC,QAAQ;QAC7B,QAAQC;QACR,SAASC,CAAAA,UAAY;gBAAE,MAAMA,QAAQ,OAAO;YAAmC;QAC/E,OAAO,CAACC,OAAOD;YACX,MAAME,UAAUF,QAAQ,eAAe;YACvC,IAAI,CAACE,SACD;YAEJ,IAAIC,aAA4B;YAChC,KAAK,MAAMT,QAAQZ,MAAO;gBACtB,MAAMa,OAAOL,SAAS,OAAO,CAAC,GAAG,CAACI;gBAClC,IAAI,CAACC,MACD;gBAEJ,MAAMS,OAAOT,KAAK,qBAAqB;gBACvC,IAAIO,QAAQ,CAAC,GAAGE,KAAK,GAAG,GAAGA,KAAK,MAAM,GAAG,GAAG;oBACxCD,aAAaT;oBACb;gBACJ;YACJ;YACAN,UAAU,SAAS,CAACP,aAAasB;QACrC;QACA,MAAM;YACFf,UAAU,IAAI;QAClB;IACJ;IAEA,MAAMiB,aAAatB,AAAiB,SAAjBA;IACnB,MAAMuB,sBAAsB,CAACZ,OACzBW,cACArB,AAAe,SAAfA,cACAA,WAAW,MAAM,KAAKH,eACtBG,WAAW,UAAU,KAAKU;IAG9B,IAAIa,YAAY;IAChB,IAAIX,MACAW,YAAY,WAAZA,GAAY,oBAACC,qBAAmBA;QAAC,OAAOZ,KAAK,KAAK;QAAE,QAAQA,KAAK,MAAM;;IAG3E,OAAO,WAAP,GACI,oBAAC;QACG,KAAKD,CAAAA;YACDE,KAAKF;QACT;QACA,WAAW;QACX,eAAa,CAAC,iBAAiB,EAAEd,aAAa;OAE7CC,MAAM,GAAG,CAACY,CAAAA;QACP,MAAMe,UAAUvB,SAAS,GAAG,CAACQ;QAC7B,IAAI,CAACe,SACD,OAAO;QAEX,OAAO,WAAP,GACI,oBAACC,MAAAA,QAAc;YAAC,KAAKhB;WAChBY,oBAAoBZ,QAAQa,YAAY,oBACzC,oBAACI,qBAAmBA;YAChB,MAAMjB;YACN,OAAOP,OAAO,GAAG,CAACO,OAAO,SAASA;YAClC,YAAYA,SAASX;YACrB,WAAWK;YACX,aAAaK;WAEZgB;IAIjB,IACC3B,MAAM,MAAM,GAAG,KAAKwB,oBAAoB,SAASC,WAEjDzB,AAAiB,MAAjBA,MAAM,MAAM,IAAU,WAAL,GACd,oBAAC8B,kBAAgBA;QACb,WAAW3B;QACX,UAAU,IAAMG,UAAU,YAAY,CAACP;QACvC,UAAUQ;QACV,UAAUgB;QACV,QAAQC,oBAAoB;;AAKhD"}
@@ -0,0 +1,11 @@
1
+ import React from "react";
2
+ interface WidgetDropIndicatorProps {
3
+ title: string;
4
+ height: number;
5
+ }
6
+ /**
7
+ * The slot a dragged widget would drop into: an empty card the size of the dragged one, titled
8
+ * like it. It grows from nothing when it appears, so the cards below slide instead of jump.
9
+ */
10
+ export declare const WidgetDropIndicator: ({ title, height }: WidgetDropIndicatorProps) => React.JSX.Element;
11
+ export {};
@@ -0,0 +1,29 @@
1
+ import react, { useEffect, useState } from "react";
2
+ import { Text, cn } from "@webiny/admin-ui";
3
+ const FALLBACK_HEIGHT = 80;
4
+ const WidgetDropIndicator = ({ title, height })=>{
5
+ const [grown, setGrown] = useState(false);
6
+ useEffect(()=>{
7
+ const frame = requestAnimationFrame(()=>setGrown(true));
8
+ return ()=>cancelAnimationFrame(frame);
9
+ }, []);
10
+ let targetHeight = FALLBACK_HEIGHT;
11
+ if (height > 0) targetHeight = height;
12
+ return /*#__PURE__*/ react.createElement("div", {
13
+ "aria-hidden": true,
14
+ "data-testid": "dashboard-widget-drop-indicator",
15
+ className: cn("pointer-events-none w-full flex-none overflow-hidden", "rounded-xl border-2 border-dashed", "motion-safe:transition-[height] motion-safe:duration-200 motion-safe:ease-out"),
16
+ style: {
17
+ height: grown ? targetHeight : 0,
18
+ borderColor: "var(--color-primary-400)",
19
+ backgroundColor: "color-mix(in srgb, var(--color-primary-500) 6%, transparent)"
20
+ }
21
+ }, /*#__PURE__*/ react.createElement(Text, {
22
+ as: "div",
23
+ size: "md",
24
+ className: "px-lg pt-md-plus font-semibold text-accent-primary"
25
+ }, title));
26
+ };
27
+ export { WidgetDropIndicator };
28
+
29
+ //# sourceMappingURL=WidgetDropIndicator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dashboard/components/dnd/WidgetDropIndicator.js","sources":["../../../../src/Dashboard/components/dnd/WidgetDropIndicator.tsx"],"sourcesContent":["import React from \"react\";\nimport { useEffect } from \"react\";\nimport { useState } from \"react\";\nimport { Text } from \"@webiny/admin-ui\";\nimport { cn } from \"@webiny/admin-ui\";\n\n// Used when the dragged card couldn't be measured.\nconst FALLBACK_HEIGHT = 80;\n\ninterface WidgetDropIndicatorProps {\n // The dragged widget's title, shown in the slot.\n title: string;\n // The dragged card's height, so the slot reserves exactly the space the widget will take.\n height: number;\n}\n\n/**\n * The slot a dragged widget would drop into: an empty card the size of the dragged one, titled\n * like it. It grows from nothing when it appears, so the cards below slide instead of jump.\n */\nexport const WidgetDropIndicator = ({ title, height }: WidgetDropIndicatorProps) => {\n const [grown, setGrown] = useState(false);\n\n useEffect(() => {\n // One frame at zero height first, so the browser has something to transition from.\n const frame = requestAnimationFrame(() => setGrown(true));\n return () => cancelAnimationFrame(frame);\n }, []);\n\n let targetHeight = FALLBACK_HEIGHT;\n if (height > 0) {\n targetHeight = height;\n }\n\n return (\n <div\n aria-hidden\n data-testid={\"dashboard-widget-drop-indicator\"}\n className={cn(\n \"pointer-events-none w-full flex-none overflow-hidden\",\n // `rounded-xl` and the 2px border match the cards' outline in Customize mode.\n \"rounded-xl border-2 border-dashed\",\n \"motion-safe:transition-[height] motion-safe:duration-200 motion-safe:ease-out\"\n )}\n style={{\n height: grown ? targetHeight : 0,\n borderColor: \"var(--color-primary-400)\",\n backgroundColor: \"color-mix(in srgb, var(--color-primary-500) 6%, transparent)\"\n }}\n >\n {/* Where the card's own title sits, and out of the way of the drag chip under the pointer. */}\n <Text\n as={\"div\"}\n size={\"md\"}\n className={\"px-lg pt-md-plus font-semibold text-accent-primary\"}\n >\n {title}\n </Text>\n </div>\n );\n};\n"],"names":["FALLBACK_HEIGHT","WidgetDropIndicator","title","height","grown","setGrown","useState","useEffect","frame","requestAnimationFrame","cancelAnimationFrame","targetHeight","cn","Text"],"mappings":";;AAOA,MAAMA,kBAAkB;AAajB,MAAMC,sBAAsB,CAAC,EAAEC,KAAK,EAAEC,MAAM,EAA4B;IAC3E,MAAM,CAACC,OAAOC,SAAS,GAAGC,SAAS;IAEnCC,UAAU;QAEN,MAAMC,QAAQC,sBAAsB,IAAMJ,SAAS;QACnD,OAAO,IAAMK,qBAAqBF;IACtC,GAAG,EAAE;IAEL,IAAIG,eAAeX;IACnB,IAAIG,SAAS,GACTQ,eAAeR;IAGnB,OAAO,WAAP,GACI,oBAAC;QACG;QACA,eAAa;QACb,WAAWS,GACP,wDAEA,qCACA;QAEJ,OAAO;YACH,QAAQR,QAAQO,eAAe;YAC/B,aAAa;YACb,iBAAiB;QACrB;qBAGA,oBAACE,MAAIA;QACD,IAAI;QACJ,MAAM;QACN,WAAW;OAEVX;AAIjB"}
@@ -0,0 +1,6 @@
1
+ import React from "react";
2
+ interface WidgetSlotProps {
3
+ host: HTMLDivElement;
4
+ }
5
+ export declare const WidgetSlot: ({ host }: WidgetSlotProps) => React.JSX.Element;
6
+ export {};
@@ -0,0 +1,9 @@
1
+ import react from "react";
2
+ const WidgetSlot = ({ host })=>/*#__PURE__*/ react.createElement("div", {
3
+ ref: (node)=>{
4
+ if (node && host.parentNode !== node) node.appendChild(host);
5
+ }
6
+ });
7
+ export { WidgetSlot };
8
+
9
+ //# sourceMappingURL=WidgetSlot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dashboard/components/dnd/WidgetSlot.js","sources":["../../../../src/Dashboard/components/dnd/WidgetSlot.tsx"],"sourcesContent":["import React from \"react\";\n\ninterface WidgetSlotProps {\n // The widget's container from `useWidgetHosts`.\n host: HTMLDivElement;\n}\n\n// Marks where a widget sits and moves the widget's container here. See `useWidgetHosts`.\nexport const WidgetSlot = ({ host }: WidgetSlotProps) => {\n return (\n <div\n ref={node => {\n if (node && host.parentNode !== node) {\n node.appendChild(host);\n }\n }}\n />\n );\n};\n"],"names":["WidgetSlot","host","node"],"mappings":";AAQO,MAAMA,aAAa,CAAC,EAAEC,IAAI,EAAmB,GACzC,WAAP,GACI,oBAAC;QACG,KAAKC,CAAAA;YACD,IAAIA,QAAQD,KAAK,UAAU,KAAKC,MAC5BA,KAAK,WAAW,CAACD;QAEzB"}
@@ -0,0 +1,6 @@
1
+ export declare const DASHBOARD_WIDGET_DND_TYPE = "dashboard-widget";
2
+ export interface DashboardWidgetDragItem {
3
+ name: string;
4
+ title: string;
5
+ height: number;
6
+ }
@@ -0,0 +1,4 @@
1
+ const DASHBOARD_WIDGET_DND_TYPE = "dashboard-widget";
2
+ export { DASHBOARD_WIDGET_DND_TYPE };
3
+
4
+ //# sourceMappingURL=dragItem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dashboard/components/dnd/dragItem.js","sources":["../../../../src/Dashboard/components/dnd/dragItem.ts"],"sourcesContent":["export const DASHBOARD_WIDGET_DND_TYPE = \"dashboard-widget\";\n\n// What a dragged widget carries, so any column can size and label the slot it would drop into.\nexport interface DashboardWidgetDragItem {\n name: string;\n title: string;\n // The card's height when the drag started, in pixels.\n height: number;\n}\n"],"names":["DASHBOARD_WIDGET_DND_TYPE"],"mappings":"AAAO,MAAMA,4BAA4B"}
@@ -0,0 +1 @@
1
+ export declare const useWidgetHosts: () => (name: string) => HTMLDivElement;
@@ -0,0 +1,16 @@
1
+ import { useCallback, useRef } from "react";
2
+ const useWidgetHosts = ()=>{
3
+ const hosts = useRef(new Map());
4
+ return useCallback((name)=>{
5
+ let host = hosts.current.get(name);
6
+ if (!host) {
7
+ host = document.createElement("div");
8
+ host.dataset.widgetHost = name;
9
+ hosts.current.set(name, host);
10
+ }
11
+ return host;
12
+ }, []);
13
+ };
14
+ export { useWidgetHosts };
15
+
16
+ //# sourceMappingURL=useWidgetHosts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dashboard/components/dnd/useWidgetHosts.js","sources":["../../../../src/Dashboard/components/dnd/useWidgetHosts.ts"],"sourcesContent":["import { useCallback } from \"react\";\nimport { useRef } from \"react\";\n\n/*\n * One detached container per widget, created once and kept for the life of the dashboard.\n *\n * Each widget renders into its container through a portal, and `WidgetSlot` moves the container\n * to wherever the widget currently sits. The portal's container never changes, so React never\n * remounts the widget: switching Customize mode or dropping a widget into another column doesn't\n * reload it.\n */\nexport const useWidgetHosts = () => {\n const hosts = useRef(new Map<string, HTMLDivElement>());\n\n return useCallback((name: string): HTMLDivElement => {\n let host = hosts.current.get(name);\n if (!host) {\n host = document.createElement(\"div\");\n host.dataset.widgetHost = name;\n hosts.current.set(name, host);\n }\n return host;\n }, []);\n};\n"],"names":["useWidgetHosts","hosts","useRef","Map","useCallback","name","host","document"],"mappings":";AAWO,MAAMA,iBAAiB;IAC1B,MAAMC,QAAQC,OAAO,IAAIC;IAEzB,OAAOC,YAAY,CAACC;QAChB,IAAIC,OAAOL,MAAM,OAAO,CAAC,GAAG,CAACI;QAC7B,IAAI,CAACC,MAAM;YACPA,OAAOC,SAAS,aAAa,CAAC;YAC9BD,KAAK,OAAO,CAAC,UAAU,GAAGD;YAC1BJ,MAAM,OAAO,CAAC,GAAG,CAACI,MAAMC;QAC5B;QACA,OAAOA;IACX,GAAG,EAAE;AACT"}
@@ -0,0 +1,13 @@
1
+ import React from "react";
2
+ import type { DashboardLayoutPresenter } from "../../dashboardLayout/presenter/abstractions.js";
3
+ interface EditableColumnsProps {
4
+ vm: DashboardLayoutPresenter.ViewModel;
5
+ slots: Map<string, React.ReactElement>;
6
+ titles: Map<string, {
7
+ title: string;
8
+ }>;
9
+ presenter: DashboardLayoutPresenter.Interface;
10
+ onBrowseWidgets: () => void;
11
+ }
12
+ export declare const EditableColumns: ({ vm, slots, titles, presenter, onBrowseWidgets }: EditableColumnsProps) => React.JSX.Element;
13
+ export {};
@@ -0,0 +1,25 @@
1
+ import react from "react";
2
+ import { DashboardDragLayer } from "../dnd/DashboardDragLayer.js";
3
+ import { DashboardWidgetColumn } from "../dnd/DashboardWidgetColumn.js";
4
+ import { MIN_COLUMN_COUNT } from "../../dashboardLayout/types.js";
5
+ import { DASHBOARD_MAX_WIDTH } from "./layoutConstants.js";
6
+ const EditableColumns = ({ vm, slots, titles, presenter, onBrowseWidgets })=>/*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement(DashboardDragLayer, null), /*#__PURE__*/ react.createElement("div", {
7
+ className: "flex gap-lg",
8
+ style: {
9
+ maxWidth: DASHBOARD_MAX_WIDTH
10
+ }
11
+ }, vm.columns.map((names, index)=>/*#__PURE__*/ react.createElement(DashboardWidgetColumn, {
12
+ key: index,
13
+ columnIndex: index,
14
+ names: names,
15
+ draggingName: vm.draggingName,
16
+ dropTarget: vm.dropTarget,
17
+ canRemoveColumn: vm.columnCount > MIN_COLUMN_COUNT,
18
+ elements: slots,
19
+ titles: titles,
20
+ presenter: presenter,
21
+ onBrowseWidgets: onBrowseWidgets
22
+ }))));
23
+ export { EditableColumns };
24
+
25
+ //# sourceMappingURL=EditableColumns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dashboard/components/layout/EditableColumns.js","sources":["../../../../src/Dashboard/components/layout/EditableColumns.tsx"],"sourcesContent":["import React from \"react\";\nimport { DashboardDragLayer } from \"../dnd/DashboardDragLayer.js\";\nimport { DashboardWidgetColumn } from \"../dnd/DashboardWidgetColumn.js\";\nimport { MIN_COLUMN_COUNT } from \"../../dashboardLayout/types.js\";\nimport type { DashboardLayoutPresenter } from \"../../dashboardLayout/presenter/abstractions.js\";\nimport { DASHBOARD_MAX_WIDTH } from \"./layoutConstants.js\";\n\ninterface EditableColumnsProps {\n vm: DashboardLayoutPresenter.ViewModel;\n slots: Map<string, React.ReactElement>;\n titles: Map<string, { title: string }>;\n presenter: DashboardLayoutPresenter.Interface;\n onBrowseWidgets: () => void;\n}\n\n// Customize mode: every column is a drop target and every widget can be dragged or removed.\nexport const EditableColumns = ({\n vm,\n slots,\n titles,\n presenter,\n onBrowseWidgets\n}: EditableColumnsProps) => {\n return (\n <>\n <DashboardDragLayer />\n <div className={\"flex gap-lg\"} style={{ maxWidth: DASHBOARD_MAX_WIDTH }}>\n {vm.columns.map((names, index) => (\n <DashboardWidgetColumn\n key={index}\n columnIndex={index}\n names={names}\n draggingName={vm.draggingName}\n dropTarget={vm.dropTarget}\n canRemoveColumn={vm.columnCount > MIN_COLUMN_COUNT}\n elements={slots}\n titles={titles}\n presenter={presenter}\n onBrowseWidgets={onBrowseWidgets}\n />\n ))}\n </div>\n </>\n );\n};\n"],"names":["EditableColumns","vm","slots","titles","presenter","onBrowseWidgets","DashboardDragLayer","DASHBOARD_MAX_WIDTH","names","index","DashboardWidgetColumn","MIN_COLUMN_COUNT"],"mappings":";;;;;AAgBO,MAAMA,kBAAkB,CAAC,EAC5BC,EAAE,EACFC,KAAK,EACLC,MAAM,EACNC,SAAS,EACTC,eAAe,EACI,GACZ,WAAP,GACI,wDACI,oBAACC,oBAAkBA,OAAAA,WAAAA,GACnB,oBAAC;QAAI,WAAW;QAAe,OAAO;YAAE,UAAUC;QAAoB;OACjEN,GAAG,OAAO,CAAC,GAAG,CAAC,CAACO,OAAOC,QAAAA,WAAAA,GACpB,oBAACC,uBAAqBA;YAClB,KAAKD;YACL,aAAaA;YACb,OAAOD;YACP,cAAcP,GAAG,YAAY;YAC7B,YAAYA,GAAG,UAAU;YACzB,iBAAiBA,GAAG,WAAW,GAAGU;YAClC,UAAUT;YACV,QAAQC;YACR,WAAWC;YACX,iBAAiBC"}
@@ -0,0 +1,8 @@
1
+ import React from "react";
2
+ interface StaticColumnsProps {
3
+ columns: string[][];
4
+ visibleCount: number;
5
+ slots: Map<string, React.ReactElement>;
6
+ }
7
+ export declare const StaticColumns: ({ columns, visibleCount, slots }: StaticColumnsProps) => React.JSX.Element;
8
+ export {};
@@ -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,2 @@
1
+ export declare const DASHBOARD_MAX_WIDTH = 1600;
2
+ export declare const MIN_COLUMN_WIDTH = 360;
@@ -0,0 +1,5 @@
1
+ const DASHBOARD_MAX_WIDTH = 1600;
2
+ const MIN_COLUMN_WIDTH = 360;
3
+ export { DASHBOARD_MAX_WIDTH, MIN_COLUMN_WIDTH };
4
+
5
+ //# sourceMappingURL=layoutConstants.js.map
@@ -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,6 @@
1
+ import React from "react";
2
+ export declare const useColumnsThatFit: (columnCount: number) => {
3
+ ref: React.RefObject<HTMLDivElement>;
4
+ visibleCount: number;
5
+ allFit: boolean;
6
+ };
@@ -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,5 @@
1
+ import React from "react";
2
+ export declare const useWidgetPortals: (placed: string[], elements: Map<string, React.ReactElement>) => {
3
+ slots: Map<string, React.ReactElement<any, string | React.JSXElementConstructor<any>>>;
4
+ portals: React.ReactNode[];
5
+ };
@@ -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"}