@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,61 @@
1
+ import react, { useState } from "react";
2
+ import { Drawer, Tabs } from "@webiny/admin-ui";
3
+ import { WidgetTabContent } from "./WidgetTabContent.js";
4
+ const AddWidgetDrawer = ({ open, onOpenChange, widgets, columnCount, presenter })=>{
5
+ const [search, setSearch] = useState("");
6
+ const changeOpen = (next)=>{
7
+ if (!next) setSearch("");
8
+ onOpenChange(next);
9
+ };
10
+ const onDashboard = widgets.filter((widget)=>widget.added);
11
+ const notAdded = widgets.filter((widget)=>!widget.added);
12
+ let defaultTab = "all";
13
+ if (notAdded.length > 0) defaultTab = "notAdded";
14
+ const renderTab = (items, emptyTitle, emptyDescription)=>/*#__PURE__*/ react.createElement(WidgetTabContent, {
15
+ items: items,
16
+ search: search,
17
+ onSearch: setSearch,
18
+ emptyTitle: emptyTitle,
19
+ emptyDescription: emptyDescription,
20
+ columnCount: columnCount,
21
+ presenter: presenter
22
+ });
23
+ return /*#__PURE__*/ react.createElement(Drawer, {
24
+ open: open,
25
+ onOpenChange: changeOpen,
26
+ modal: true,
27
+ title: "Add widget",
28
+ description: "Pick a column when you add a widget. You can drag it anywhere after.",
29
+ width: 400,
30
+ bodyPadding: false,
31
+ headerSeparator: false,
32
+ showCloseButton: true
33
+ }, /*#__PURE__*/ react.createElement(Tabs, {
34
+ separator: true,
35
+ spacing: "lg",
36
+ defaultValue: defaultTab,
37
+ tabs: [
38
+ /*#__PURE__*/ react.createElement(Tabs.Tab, {
39
+ key: "notAdded",
40
+ value: "notAdded",
41
+ trigger: `Not added (${notAdded.length})`,
42
+ content: renderTab(notAdded, "All widgets are on your dashboard", "Remove a widget from its menu and it shows up here.")
43
+ }),
44
+ /*#__PURE__*/ react.createElement(Tabs.Tab, {
45
+ key: "onDashboard",
46
+ value: "onDashboard",
47
+ trigger: `On dashboard (${onDashboard.length})`,
48
+ content: renderTab(onDashboard, "Your dashboard is empty", "Add a widget from the Not added tab.")
49
+ }),
50
+ /*#__PURE__*/ react.createElement(Tabs.Tab, {
51
+ key: "all",
52
+ value: "all",
53
+ trigger: `All (${widgets.length})`,
54
+ content: renderTab(widgets, "No widgets available", "No app has registered a dashboard widget.")
55
+ })
56
+ ]
57
+ }));
58
+ };
59
+ export { AddWidgetDrawer };
60
+
61
+ //# sourceMappingURL=AddWidgetDrawer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dashboard/components/addWidgetDrawer/AddWidgetDrawer.js","sources":["../../../../src/Dashboard/components/addWidgetDrawer/AddWidgetDrawer.tsx"],"sourcesContent":["import React from \"react\";\nimport { useState } from \"react\";\nimport { Drawer } from \"@webiny/admin-ui\";\nimport { Tabs } from \"@webiny/admin-ui\";\nimport type { DashboardLayoutPresenter } from \"../../dashboardLayout/presenter/abstractions.js\";\nimport type { DrawerWidget } from \"./types.js\";\nimport { WidgetTabContent } from \"./WidgetTabContent.js\";\n\ninterface AddWidgetDrawerProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n widgets: DrawerWidget[];\n columnCount: number;\n presenter: DashboardLayoutPresenter.Interface;\n}\n\nexport const AddWidgetDrawer = ({\n open,\n onOpenChange,\n widgets,\n columnCount,\n presenter\n}: AddWidgetDrawerProps) => {\n const [search, setSearch] = useState(\"\");\n\n const changeOpen = (next: boolean) => {\n // Every visit starts with an empty search.\n if (!next) {\n setSearch(\"\");\n }\n onOpenChange(next);\n };\n\n const onDashboard = widgets.filter(widget => widget.added);\n const notAdded = widgets.filter(widget => !widget.added);\n\n // Open where the user can act. When everything is added already, show the whole list.\n let defaultTab = \"all\";\n if (notAdded.length > 0) {\n defaultTab = \"notAdded\";\n }\n\n const renderTab = (items: DrawerWidget[], emptyTitle: string, emptyDescription: string) => (\n <WidgetTabContent\n items={items}\n search={search}\n onSearch={setSearch}\n emptyTitle={emptyTitle}\n emptyDescription={emptyDescription}\n columnCount={columnCount}\n presenter={presenter}\n />\n );\n\n return (\n <Drawer\n open={open}\n onOpenChange={changeOpen}\n modal={true}\n title={\"Add widget\"}\n description={\"Pick a column when you add a widget. You can drag it anywhere after.\"}\n width={400}\n bodyPadding={false}\n headerSeparator={false}\n showCloseButton={true}\n >\n <Tabs\n separator={true}\n spacing={\"lg\"}\n defaultValue={defaultTab}\n tabs={[\n <Tabs.Tab\n key={\"notAdded\"}\n value={\"notAdded\"}\n trigger={`Not added (${notAdded.length})`}\n content={renderTab(\n notAdded,\n \"All widgets are on your dashboard\",\n \"Remove a widget from its menu and it shows up here.\"\n )}\n />,\n <Tabs.Tab\n key={\"onDashboard\"}\n value={\"onDashboard\"}\n trigger={`On dashboard (${onDashboard.length})`}\n content={renderTab(\n onDashboard,\n \"Your dashboard is empty\",\n \"Add a widget from the Not added tab.\"\n )}\n />,\n <Tabs.Tab\n key={\"all\"}\n value={\"all\"}\n trigger={`All (${widgets.length})`}\n content={renderTab(\n widgets,\n \"No widgets available\",\n \"No app has registered a dashboard widget.\"\n )}\n />\n ]}\n />\n </Drawer>\n );\n};\n"],"names":["AddWidgetDrawer","open","onOpenChange","widgets","columnCount","presenter","search","setSearch","useState","changeOpen","next","onDashboard","widget","notAdded","defaultTab","renderTab","items","emptyTitle","emptyDescription","WidgetTabContent","Drawer","Tabs"],"mappings":";;;AAgBO,MAAMA,kBAAkB,CAAC,EAC5BC,IAAI,EACJC,YAAY,EACZC,OAAO,EACPC,WAAW,EACXC,SAAS,EACU;IACnB,MAAM,CAACC,QAAQC,UAAU,GAAGC,SAAS;IAErC,MAAMC,aAAa,CAACC;QAEhB,IAAI,CAACA,MACDH,UAAU;QAEdL,aAAaQ;IACjB;IAEA,MAAMC,cAAcR,QAAQ,MAAM,CAACS,CAAAA,SAAUA,OAAO,KAAK;IACzD,MAAMC,WAAWV,QAAQ,MAAM,CAACS,CAAAA,SAAU,CAACA,OAAO,KAAK;IAGvD,IAAIE,aAAa;IACjB,IAAID,SAAS,MAAM,GAAG,GAClBC,aAAa;IAGjB,MAAMC,YAAY,CAACC,OAAuBC,YAAoBC,mBAAAA,WAAAA,GAC1D,oBAACC,kBAAgBA;YACb,OAAOH;YACP,QAAQV;YACR,UAAUC;YACV,YAAYU;YACZ,kBAAkBC;YAClB,aAAad;YACb,WAAWC;;IAInB,OAAO,WAAP,GACI,oBAACe,QAAMA;QACH,MAAMnB;QACN,cAAcQ;QACd,OAAO;QACP,OAAO;QACP,aAAa;QACb,OAAO;QACP,aAAa;QACb,iBAAiB;QACjB,iBAAiB;qBAEjB,oBAACY,MAAIA;QACD,WAAW;QACX,SAAS;QACT,cAAcP;QACd,MAAM;0BACF,oBAACO,KAAK,GAAG;gBACL,KAAK;gBACL,OAAO;gBACP,SAAS,CAAC,WAAW,EAAER,SAAS,MAAM,CAAC,CAAC,CAAC;gBACzC,SAASE,UACLF,UACA,qCACA;;0BAGR,oBAACQ,KAAK,GAAG;gBACL,KAAK;gBACL,OAAO;gBACP,SAAS,CAAC,cAAc,EAAEV,YAAY,MAAM,CAAC,CAAC,CAAC;gBAC/C,SAASI,UACLJ,aACA,2BACA;;0BAGR,oBAACU,KAAK,GAAG;gBACL,KAAK;gBACL,OAAO;gBACP,SAAS,CAAC,KAAK,EAAElB,QAAQ,MAAM,CAAC,CAAC,CAAC;gBAClC,SAASY,UACLZ,SACA,wBACA;;SAGX;;AAIjB"}
@@ -0,0 +1,10 @@
1
+ import React from "react";
2
+ import type { DashboardLayoutPresenter } from "../../dashboardLayout/presenter/abstractions.js";
3
+ import type { DrawerWidget } from "./types.js";
4
+ interface DrawerWidgetRowProps {
5
+ widget: DrawerWidget;
6
+ columnCount: number;
7
+ presenter: DashboardLayoutPresenter.Interface;
8
+ }
9
+ export declare const DrawerWidgetRow: ({ widget, columnCount, presenter }: DrawerWidgetRowProps) => React.JSX.Element;
10
+ export {};
@@ -0,0 +1,38 @@
1
+ import react from "react";
2
+ import { Button, Text } from "@webiny/admin-ui";
3
+ import { AddToColumnMenu } from "./AddToColumnMenu.js";
4
+ import { WidgetPreviewFrame } from "./WidgetPreviewFrame.js";
5
+ const DrawerWidgetRow = ({ widget, columnCount, presenter })=>{
6
+ let action = /*#__PURE__*/ react.createElement(AddToColumnMenu, {
7
+ widget: widget,
8
+ columnCount: columnCount,
9
+ presenter: presenter
10
+ });
11
+ if (widget.added) action = /*#__PURE__*/ react.createElement(Button, {
12
+ size: "sm",
13
+ variant: "tertiary",
14
+ text: "Added",
15
+ disabled: true
16
+ });
17
+ return /*#__PURE__*/ react.createElement("div", {
18
+ className: "flex flex-col gap-sm rounded-md border-sm border-neutral-muted p-sm-extra"
19
+ }, /*#__PURE__*/ react.createElement(WidgetPreviewFrame, {
20
+ preview: widget.preview,
21
+ added: widget.added
22
+ }), /*#__PURE__*/ react.createElement("div", {
23
+ className: "flex items-start gap-md"
24
+ }, /*#__PURE__*/ react.createElement("div", {
25
+ className: "min-w-0 flex-1"
26
+ }, /*#__PURE__*/ react.createElement(Text, {
27
+ as: "div",
28
+ size: "md",
29
+ className: "font-semibold"
30
+ }, widget.title), widget.description && /*#__PURE__*/ react.createElement(Text, {
31
+ as: "div",
32
+ size: "sm",
33
+ className: "mt-xxs text-neutral-strong"
34
+ }, widget.description)), action));
35
+ };
36
+ export { DrawerWidgetRow };
37
+
38
+ //# sourceMappingURL=DrawerWidgetRow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dashboard/components/addWidgetDrawer/DrawerWidgetRow.js","sources":["../../../../src/Dashboard/components/addWidgetDrawer/DrawerWidgetRow.tsx"],"sourcesContent":["import React from \"react\";\nimport { Button } from \"@webiny/admin-ui\";\nimport { Text } from \"@webiny/admin-ui\";\nimport type { DashboardLayoutPresenter } from \"../../dashboardLayout/presenter/abstractions.js\";\nimport type { DrawerWidget } from \"./types.js\";\nimport { AddToColumnMenu } from \"./AddToColumnMenu.js\";\nimport { WidgetPreviewFrame } from \"./WidgetPreviewFrame.js\";\n\ninterface DrawerWidgetRowProps {\n widget: DrawerWidget;\n columnCount: number;\n presenter: DashboardLayoutPresenter.Interface;\n}\n\nexport const DrawerWidgetRow = ({ widget, columnCount, presenter }: DrawerWidgetRowProps) => {\n let action = (\n <AddToColumnMenu widget={widget} columnCount={columnCount} presenter={presenter} />\n );\n if (widget.added) {\n action = <Button size={\"sm\"} variant={\"tertiary\"} text={\"Added\"} disabled={true} />;\n }\n\n return (\n <div\n className={\"flex flex-col gap-sm rounded-md border-sm border-neutral-muted p-sm-extra\"}\n >\n <WidgetPreviewFrame preview={widget.preview} added={widget.added} />\n <div className={\"flex items-start gap-md\"}>\n <div className={\"min-w-0 flex-1\"}>\n <Text as={\"div\"} size={\"md\"} className={\"font-semibold\"}>\n {widget.title}\n </Text>\n {widget.description && (\n <Text as={\"div\"} size={\"sm\"} className={\"mt-xxs text-neutral-strong\"}>\n {widget.description}\n </Text>\n )}\n </div>\n {action}\n </div>\n </div>\n );\n};\n"],"names":["DrawerWidgetRow","widget","columnCount","presenter","action","AddToColumnMenu","Button","WidgetPreviewFrame","Text"],"mappings":";;;;AAcO,MAAMA,kBAAkB,CAAC,EAAEC,MAAM,EAAEC,WAAW,EAAEC,SAAS,EAAwB;IACpF,IAAIC,SAAS,WAATA,GACA,oBAACC,iBAAeA;QAAC,QAAQJ;QAAQ,aAAaC;QAAa,WAAWC;;IAE1E,IAAIF,OAAO,KAAK,EACZG,SAAS,WAATA,GAAS,oBAACE,QAAMA;QAAC,MAAM;QAAM,SAAS;QAAY,MAAM;QAAS,UAAU;;IAG/E,OAAO,WAAP,GACI,oBAAC;QACG,WAAW;qBAEX,oBAACC,oBAAkBA;QAAC,SAASN,OAAO,OAAO;QAAE,OAAOA,OAAO,KAAK;sBAChE,oBAAC;QAAI,WAAW;qBACZ,oBAAC;QAAI,WAAW;qBACZ,oBAACO,MAAIA;QAAC,IAAI;QAAO,MAAM;QAAM,WAAW;OACnCP,OAAO,KAAK,GAEhBA,OAAO,WAAW,IAAI,WAAJ,GACf,oBAACO,MAAIA;QAAC,IAAI;QAAO,MAAM;QAAM,WAAW;OACnCP,OAAO,WAAW,IAI9BG;AAIjB"}
@@ -0,0 +1,7 @@
1
+ import React from "react";
2
+ interface WidgetPreviewFrameProps {
3
+ preview?: React.ReactElement;
4
+ added: boolean;
5
+ }
6
+ export declare const WidgetPreviewFrame: ({ preview, added }: WidgetPreviewFrameProps) => React.JSX.Element;
7
+ export {};
@@ -0,0 +1,44 @@
1
+ import react, { useLayoutEffect, useRef, useState } from "react";
2
+ import { cn } from "@webiny/admin-ui";
3
+ import { WidgetSketch } from "./WidgetSketch.js";
4
+ const RENDER_WIDTH = 520;
5
+ const FRAME_HEIGHT = 150;
6
+ const WidgetPreviewFrame = ({ preview, added })=>{
7
+ const frameRef = useRef(null);
8
+ const [scale, setScale] = useState(0);
9
+ useLayoutEffect(()=>{
10
+ const frame = frameRef.current;
11
+ if (!frame) return;
12
+ frame.setAttribute("inert", "");
13
+ const fit = ()=>setScale(frame.clientWidth / RENDER_WIDTH);
14
+ fit();
15
+ const observer = new ResizeObserver(fit);
16
+ observer.observe(frame);
17
+ return ()=>observer.disconnect();
18
+ }, []);
19
+ let content = /*#__PURE__*/ react.createElement("div", {
20
+ className: "flex h-full items-center justify-center"
21
+ }, /*#__PURE__*/ react.createElement(WidgetSketch, {
22
+ added: added
23
+ }));
24
+ if (preview) content = /*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement("div", {
25
+ className: "origin-top-left p-md",
26
+ style: {
27
+ width: RENDER_WIDTH,
28
+ transform: `scale(${scale})`
29
+ }
30
+ }, preview), /*#__PURE__*/ react.createElement("div", {
31
+ className: "absolute inset-x-0 bottom-0 h-xl bg-gradient-to-t from-neutral-light"
32
+ }));
33
+ return /*#__PURE__*/ react.createElement("div", {
34
+ "aria-hidden": true,
35
+ ref: frameRef,
36
+ className: cn("pointer-events-none relative overflow-hidden rounded-sm bg-neutral-light", "select-none", added && "opacity-60"),
37
+ style: {
38
+ height: FRAME_HEIGHT
39
+ }
40
+ }, content);
41
+ };
42
+ export { WidgetPreviewFrame };
43
+
44
+ //# sourceMappingURL=WidgetPreviewFrame.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dashboard/components/addWidgetDrawer/WidgetPreviewFrame.js","sources":["../../../../src/Dashboard/components/addWidgetDrawer/WidgetPreviewFrame.tsx"],"sourcesContent":["import React from \"react\";\nimport { useLayoutEffect } from \"react\";\nimport { useRef } from \"react\";\nimport { useState } from \"react\";\nimport { cn } from \"@webiny/admin-ui\";\nimport { WidgetSketch } from \"./WidgetSketch.js\";\n\n// The preview renders at a dashboard column's width, then shrinks to the frame's width.\nconst RENDER_WIDTH = 520;\nconst FRAME_HEIGHT = 150;\n\ninterface WidgetPreviewFrameProps {\n preview?: React.ReactElement;\n // Already on the dashboard; the preview is dimmed to match the disabled \"Added\" button.\n added: boolean;\n}\n\nexport const WidgetPreviewFrame = ({ preview, added }: WidgetPreviewFrameProps) => {\n const frameRef = useRef<HTMLDivElement>(null);\n const [scale, setScale] = useState(0);\n\n useLayoutEffect(() => {\n const frame = frameRef.current;\n if (!frame) {\n return;\n }\n // A preview is a picture: its links and buttons must not take focus or clicks.\n frame.setAttribute(\"inert\", \"\");\n\n const fit = () => setScale(frame.clientWidth / RENDER_WIDTH);\n fit();\n const observer = new ResizeObserver(fit);\n observer.observe(frame);\n return () => observer.disconnect();\n }, []);\n\n let content = (\n <div className={\"flex h-full items-center justify-center\"}>\n <WidgetSketch added={added} />\n </div>\n );\n if (preview) {\n content = (\n <>\n <div\n className={\"origin-top-left p-md\"}\n style={{ width: RENDER_WIDTH, transform: `scale(${scale})` }}\n >\n {preview}\n </div>\n {/* Taller widgets are cropped; the fade makes the cut look intentional. */}\n <div\n className={\n \"absolute inset-x-0 bottom-0 h-xl bg-gradient-to-t from-neutral-light\"\n }\n />\n </>\n );\n }\n\n return (\n <div\n aria-hidden\n ref={frameRef}\n className={cn(\n \"pointer-events-none relative overflow-hidden rounded-sm bg-neutral-light\",\n \"select-none\",\n added && \"opacity-60\"\n )}\n style={{ height: FRAME_HEIGHT }}\n >\n {content}\n </div>\n );\n};\n"],"names":["RENDER_WIDTH","FRAME_HEIGHT","WidgetPreviewFrame","preview","added","frameRef","useRef","scale","setScale","useState","useLayoutEffect","frame","fit","observer","ResizeObserver","content","WidgetSketch","cn"],"mappings":";;;AAQA,MAAMA,eAAe;AACrB,MAAMC,eAAe;AAQd,MAAMC,qBAAqB,CAAC,EAAEC,OAAO,EAAEC,KAAK,EAA2B;IAC1E,MAAMC,WAAWC,OAAuB;IACxC,MAAM,CAACC,OAAOC,SAAS,GAAGC,SAAS;IAEnCC,gBAAgB;QACZ,MAAMC,QAAQN,SAAS,OAAO;QAC9B,IAAI,CAACM,OACD;QAGJA,MAAM,YAAY,CAAC,SAAS;QAE5B,MAAMC,MAAM,IAAMJ,SAASG,MAAM,WAAW,GAAGX;QAC/CY;QACA,MAAMC,WAAW,IAAIC,eAAeF;QACpCC,SAAS,OAAO,CAACF;QACjB,OAAO,IAAME,SAAS,UAAU;IACpC,GAAG,EAAE;IAEL,IAAIE,UAAU,WAAVA,GACA,oBAAC;QAAI,WAAW;qBACZ,oBAACC,cAAYA;QAAC,OAAOZ;;IAG7B,IAAID,SACAY,UAAU,WAAVA,GACI,wDACI,oBAAC;QACG,WAAW;QACX,OAAO;YAAE,OAAOf;YAAc,WAAW,CAAC,MAAM,EAAEO,MAAM,CAAC,CAAC;QAAC;OAE1DJ,UAAAA,WAAAA,GAGL,oBAAC;QACG,WACI;;IAOpB,OAAO,WAAP,GACI,oBAAC;QACG;QACA,KAAKE;QACL,WAAWY,GACP,4EACA,eACAb,SAAS;QAEb,OAAO;YAAE,QAAQH;QAAa;OAE7Bc;AAGb"}
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ export declare const WidgetSketch: ({ added }: {
3
+ added: boolean;
4
+ }) => React.JSX.Element;
@@ -0,0 +1,20 @@
1
+ import react from "react";
2
+ import { cn } from "@webiny/admin-ui";
3
+ const WidgetSketch = ({ added })=>/*#__PURE__*/ react.createElement("div", {
4
+ className: cn("flex h-[58px] w-[84px] flex-none flex-col gap-xxs overflow-hidden rounded-sm", "border-sm border-neutral-muted bg-neutral-base p-xs")
5
+ }, /*#__PURE__*/ react.createElement("div", {
6
+ className: "flex items-center gap-[3px]"
7
+ }, /*#__PURE__*/ react.createElement("span", {
8
+ className: cn("size-[7px] rounded-[2px]", added ? "bg-neutral-strong" : "bg-primary")
9
+ }), /*#__PURE__*/ react.createElement("span", {
10
+ className: "h-[4px] w-[30px] rounded-[2px] bg-neutral-strong/40"
11
+ })), /*#__PURE__*/ react.createElement("span", {
12
+ className: "h-[4px] w-full rounded-[2px] bg-neutral-muted"
13
+ }), /*#__PURE__*/ react.createElement("span", {
14
+ className: "h-[4px] w-3/4 rounded-[2px] bg-neutral-muted"
15
+ }), /*#__PURE__*/ react.createElement("span", {
16
+ className: "mt-[2px] h-[12px] w-[40px] rounded-[3px] bg-neutral-dimmed"
17
+ }));
18
+ export { WidgetSketch };
19
+
20
+ //# sourceMappingURL=WidgetSketch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dashboard/components/addWidgetDrawer/WidgetSketch.js","sources":["../../../../src/Dashboard/components/addWidgetDrawer/WidgetSketch.tsx"],"sourcesContent":["import React from \"react\";\nimport { cn } from \"@webiny/admin-ui\";\n\n// A tiny sketch of a widget card, for widgets that don't provide a preview.\nexport const WidgetSketch = ({ added }: { added: boolean }) => {\n return (\n <div\n className={cn(\n \"flex h-[58px] w-[84px] flex-none flex-col gap-xxs overflow-hidden rounded-sm\",\n \"border-sm border-neutral-muted bg-neutral-base p-xs\"\n )}\n >\n <div className={\"flex items-center gap-[3px]\"}>\n <span\n className={cn(\n \"size-[7px] rounded-[2px]\",\n added ? \"bg-neutral-strong\" : \"bg-primary\"\n )}\n />\n <span className={\"h-[4px] w-[30px] rounded-[2px] bg-neutral-strong/40\"} />\n </div>\n <span className={\"h-[4px] w-full rounded-[2px] bg-neutral-muted\"} />\n <span className={\"h-[4px] w-3/4 rounded-[2px] bg-neutral-muted\"} />\n <span className={\"mt-[2px] h-[12px] w-[40px] rounded-[3px] bg-neutral-dimmed\"} />\n </div>\n );\n};\n"],"names":["WidgetSketch","added","cn"],"mappings":";;AAIO,MAAMA,eAAe,CAAC,EAAEC,KAAK,EAAsB,GAC/C,WAAP,GACI,oBAAC;QACG,WAAWC,GACP,gFACA;qBAGJ,oBAAC;QAAI,WAAW;qBACZ,oBAAC;QACG,WAAWA,GACP,4BACAD,QAAQ,sBAAsB;sBAGtC,oBAAC;QAAK,WAAW;uBAErB,oBAAC;QAAK,WAAW;sBACjB,oBAAC;QAAK,WAAW;sBACjB,oBAAC;QAAK,WAAW"}
@@ -0,0 +1,14 @@
1
+ import React from "react";
2
+ import type { DashboardLayoutPresenter } from "../../dashboardLayout/presenter/abstractions.js";
3
+ import type { DrawerWidget } from "./types.js";
4
+ interface WidgetTabContentProps {
5
+ items: DrawerWidget[];
6
+ search: string;
7
+ onSearch: (value: string) => void;
8
+ emptyTitle: string;
9
+ emptyDescription: string;
10
+ columnCount: number;
11
+ presenter: DashboardLayoutPresenter.Interface;
12
+ }
13
+ export declare const WidgetTabContent: ({ items, search, onSearch, emptyTitle, emptyDescription, columnCount, presenter }: WidgetTabContentProps) => React.JSX.Element;
14
+ export {};
@@ -0,0 +1,76 @@
1
+ import react from "react";
2
+ import { EmptyState, Icon, Input, Text } from "@webiny/admin-ui";
3
+ import { ReactComponent } from "@webiny/icons/search.svg";
4
+ import { DrawerWidgetRow } from "./DrawerWidgetRow.js";
5
+ const DEFAULT_GROUP = "Other";
6
+ const matchesSearch = (widget, query)=>{
7
+ if (!query) return true;
8
+ const fields = [
9
+ widget.title,
10
+ widget.description,
11
+ widget.group
12
+ ];
13
+ return fields.some((value)=>value?.toLowerCase().includes(query));
14
+ };
15
+ const groupWidgets = (widgets)=>{
16
+ const byGroup = new Map();
17
+ for (const widget of widgets){
18
+ const group = widget.group ?? DEFAULT_GROUP;
19
+ const items = byGroup.get(group) ?? [];
20
+ byGroup.set(group, [
21
+ ...items,
22
+ widget
23
+ ]);
24
+ }
25
+ return [
26
+ ...byGroup.entries()
27
+ ];
28
+ };
29
+ const WidgetTabContent = ({ items, search, onSearch, emptyTitle, emptyDescription, columnCount, presenter })=>{
30
+ const query = search.trim().toLowerCase();
31
+ const matches = items.filter((widget)=>matchesSearch(widget, query));
32
+ const groups = groupWidgets(matches);
33
+ let emptyState = null;
34
+ if (0 === items.length) emptyState = /*#__PURE__*/ react.createElement(EmptyState, {
35
+ size: "sm",
36
+ type: "layout",
37
+ title: emptyTitle,
38
+ description: emptyDescription
39
+ });
40
+ else if (0 === matches.length) emptyState = /*#__PURE__*/ react.createElement(EmptyState, {
41
+ size: "sm",
42
+ type: "select",
43
+ title: `No widgets match "${search}"`,
44
+ description: "Try a different search."
45
+ });
46
+ return /*#__PURE__*/ react.createElement("div", {
47
+ className: "pb-lg"
48
+ }, items.length > 0 && /*#__PURE__*/ react.createElement(Input, {
49
+ placeholder: "Search widgets",
50
+ value: search,
51
+ onChange: onSearch,
52
+ startIcon: /*#__PURE__*/ react.createElement(Icon, {
53
+ label: "Search",
54
+ icon: /*#__PURE__*/ react.createElement(ReactComponent, null)
55
+ })
56
+ }), emptyState && /*#__PURE__*/ react.createElement("div", {
57
+ className: "mt-lg"
58
+ }, emptyState), groups.map(([group, groupItems])=>/*#__PURE__*/ react.createElement("div", {
59
+ key: group,
60
+ className: "mt-lg"
61
+ }, /*#__PURE__*/ react.createElement(Text, {
62
+ as: "div",
63
+ size: "sm",
64
+ className: "mb-sm font-semibold uppercase tracking-wide text-neutral-strong"
65
+ }, group), /*#__PURE__*/ react.createElement("div", {
66
+ className: "flex flex-col gap-sm"
67
+ }, groupItems.map((widget)=>/*#__PURE__*/ react.createElement(DrawerWidgetRow, {
68
+ key: widget.name,
69
+ widget: widget,
70
+ columnCount: columnCount,
71
+ presenter: presenter
72
+ }))))));
73
+ };
74
+ export { WidgetTabContent };
75
+
76
+ //# sourceMappingURL=WidgetTabContent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dashboard/components/addWidgetDrawer/WidgetTabContent.js","sources":["../../../../src/Dashboard/components/addWidgetDrawer/WidgetTabContent.tsx"],"sourcesContent":["import React from \"react\";\nimport { EmptyState } from \"@webiny/admin-ui\";\nimport { Icon } from \"@webiny/admin-ui\";\nimport { Input } from \"@webiny/admin-ui\";\nimport { Text } from \"@webiny/admin-ui\";\nimport { ReactComponent as SearchIcon } from \"@webiny/icons/search.svg\";\nimport type { DashboardLayoutPresenter } from \"../../dashboardLayout/presenter/abstractions.js\";\nimport type { DrawerWidget } from \"./types.js\";\nimport { DrawerWidgetRow } from \"./DrawerWidgetRow.js\";\n\nconst DEFAULT_GROUP = \"Other\";\n\nconst matchesSearch = (widget: DrawerWidget, query: string): boolean => {\n if (!query) {\n return true;\n }\n const fields = [widget.title, widget.description, widget.group];\n return fields.some(value => value?.toLowerCase().includes(query));\n};\n\nconst groupWidgets = (widgets: DrawerWidget[]): [string, DrawerWidget[]][] => {\n const byGroup = new Map<string, DrawerWidget[]>();\n for (const widget of widgets) {\n const group = widget.group ?? DEFAULT_GROUP;\n const items = byGroup.get(group) ?? [];\n byGroup.set(group, [...items, widget]);\n }\n return [...byGroup.entries()];\n};\n\ninterface WidgetTabContentProps {\n items: DrawerWidget[];\n search: string;\n onSearch: (value: string) => void;\n emptyTitle: string;\n emptyDescription: string;\n columnCount: number;\n presenter: DashboardLayoutPresenter.Interface;\n}\n\nexport const WidgetTabContent = ({\n items,\n search,\n onSearch,\n emptyTitle,\n emptyDescription,\n columnCount,\n presenter\n}: WidgetTabContentProps) => {\n const query = search.trim().toLowerCase();\n const matches = items.filter(widget => matchesSearch(widget, query));\n const groups = groupWidgets(matches);\n\n let emptyState: React.ReactNode = null;\n if (items.length === 0) {\n emptyState = (\n <EmptyState\n size={\"sm\"}\n type={\"layout\"}\n title={emptyTitle}\n description={emptyDescription}\n />\n );\n } else if (matches.length === 0) {\n emptyState = (\n <EmptyState\n size={\"sm\"}\n type={\"select\"}\n title={`No widgets match \"${search}\"`}\n description={\"Try a different search.\"}\n />\n );\n }\n\n return (\n <div className={\"pb-lg\"}>\n {items.length > 0 && (\n <Input\n placeholder={\"Search widgets\"}\n value={search}\n onChange={onSearch}\n startIcon={<Icon label={\"Search\"} icon={<SearchIcon />} />}\n />\n )}\n {emptyState && <div className={\"mt-lg\"}>{emptyState}</div>}\n {groups.map(([group, groupItems]) => (\n <div key={group} className={\"mt-lg\"}>\n <Text\n as={\"div\"}\n size={\"sm\"}\n className={\n \"mb-sm font-semibold uppercase tracking-wide text-neutral-strong\"\n }\n >\n {group}\n </Text>\n <div className={\"flex flex-col gap-sm\"}>\n {groupItems.map(widget => (\n <DrawerWidgetRow\n key={widget.name}\n widget={widget}\n columnCount={columnCount}\n presenter={presenter}\n />\n ))}\n </div>\n </div>\n ))}\n </div>\n );\n};\n"],"names":["DEFAULT_GROUP","matchesSearch","widget","query","fields","value","groupWidgets","widgets","byGroup","Map","group","items","WidgetTabContent","search","onSearch","emptyTitle","emptyDescription","columnCount","presenter","matches","groups","emptyState","EmptyState","Input","Icon","SearchIcon","groupItems","Text","DrawerWidgetRow"],"mappings":";;;;AAUA,MAAMA,gBAAgB;AAEtB,MAAMC,gBAAgB,CAACC,QAAsBC;IACzC,IAAI,CAACA,OACD,OAAO;IAEX,MAAMC,SAAS;QAACF,OAAO,KAAK;QAAEA,OAAO,WAAW;QAAEA,OAAO,KAAK;KAAC;IAC/D,OAAOE,OAAO,IAAI,CAACC,CAAAA,QAASA,OAAO,cAAc,SAASF;AAC9D;AAEA,MAAMG,eAAe,CAACC;IAClB,MAAMC,UAAU,IAAIC;IACpB,KAAK,MAAMP,UAAUK,QAAS;QAC1B,MAAMG,QAAQR,OAAO,KAAK,IAAIF;QAC9B,MAAMW,QAAQH,QAAQ,GAAG,CAACE,UAAU,EAAE;QACtCF,QAAQ,GAAG,CAACE,OAAO;eAAIC;YAAOT;SAAO;IACzC;IACA,OAAO;WAAIM,QAAQ,OAAO;KAAG;AACjC;AAYO,MAAMI,mBAAmB,CAAC,EAC7BD,KAAK,EACLE,MAAM,EACNC,QAAQ,EACRC,UAAU,EACVC,gBAAgB,EAChBC,WAAW,EACXC,SAAS,EACW;IACpB,MAAMf,QAAQU,OAAO,IAAI,GAAG,WAAW;IACvC,MAAMM,UAAUR,MAAM,MAAM,CAACT,CAAAA,SAAUD,cAAcC,QAAQC;IAC7D,MAAMiB,SAASd,aAAaa;IAE5B,IAAIE,aAA8B;IAClC,IAAIV,AAAiB,MAAjBA,MAAM,MAAM,EACZU,aAAa,WAAbA,GACI,oBAACC,YAAUA;QACP,MAAM;QACN,MAAM;QACN,OAAOP;QACP,aAAaC;;SAGlB,IAAIG,AAAmB,MAAnBA,QAAQ,MAAM,EACrBE,aAAa,WAAbA,GACI,oBAACC,YAAUA;QACP,MAAM;QACN,MAAM;QACN,OAAO,CAAC,kBAAkB,EAAET,OAAO,CAAC,CAAC;QACrC,aAAa;;IAKzB,OAAO,WAAP,GACI,oBAAC;QAAI,WAAW;OACXF,MAAM,MAAM,GAAG,KAAK,WAAL,GACZ,oBAACY,OAAKA;QACF,aAAa;QACb,OAAOV;QACP,UAAUC;QACV,yBAAW,oBAACU,MAAIA;YAAC,OAAO;YAAU,oBAAM,oBAACC,gBAAUA;;QAG1DJ,cAAc,WAAdA,GAAc,oBAAC;QAAI,WAAW;OAAUA,aACxCD,OAAO,GAAG,CAAC,CAAC,CAACV,OAAOgB,WAAW,iBAC5B,oBAAC;YAAI,KAAKhB;YAAO,WAAW;yBACxB,oBAACiB,MAAIA;YACD,IAAI;YACJ,MAAM;YACN,WACI;WAGHjB,QAAAA,WAAAA,GAEL,oBAAC;YAAI,WAAW;WACXgB,WAAW,GAAG,CAACxB,CAAAA,SAAAA,WAAAA,GACZ,oBAAC0B,iBAAeA;gBACZ,KAAK1B,OAAO,IAAI;gBAChB,QAAQA;gBACR,aAAae;gBACb,WAAWC;;AAQ3C"}
@@ -0,0 +1,10 @@
1
+ import type React from "react";
2
+ export interface DrawerWidget {
3
+ name: string;
4
+ title: string;
5
+ description?: string;
6
+ group?: string;
7
+ preview?: React.ReactElement;
8
+ added: boolean;
9
+ defaultColumn: number;
10
+ }
File without changes
@@ -0,0 +1,9 @@
1
+ import React from "react";
2
+ import type { DashboardLayoutPresenter } from "../../dashboardLayout/presenter/abstractions.js";
3
+ interface ColumnCountControlProps {
4
+ columnCount: number;
5
+ disabled?: boolean;
6
+ presenter: DashboardLayoutPresenter.Interface;
7
+ }
8
+ export declare const ColumnCountControl: ({ columnCount, disabled, presenter }: ColumnCountControlProps) => React.JSX.Element;
9
+ export {};
@@ -0,0 +1,52 @@
1
+ import react from "react";
2
+ import { Icon, ToggleGroup } from "@webiny/admin-ui";
3
+ import { ReactComponent } from "@webiny/icons/view_column_2.svg";
4
+ import { ReactComponent as view_column_svg_ReactComponent } from "@webiny/icons/view_column.svg";
5
+ import { ReactComponent as view_column_4_svg_ReactComponent } from "@webiny/icons/view_column_4.svg";
6
+ const ITEMS = [
7
+ {
8
+ value: "2",
9
+ icon: /*#__PURE__*/ react.createElement(Icon, {
10
+ icon: /*#__PURE__*/ react.createElement(ReactComponent, null),
11
+ label: "2 columns",
12
+ size: "sm"
13
+ }),
14
+ tooltip: "2 columns"
15
+ },
16
+ {
17
+ value: "3",
18
+ icon: /*#__PURE__*/ react.createElement(Icon, {
19
+ icon: /*#__PURE__*/ react.createElement(view_column_svg_ReactComponent, null),
20
+ label: "3 columns",
21
+ size: "sm"
22
+ }),
23
+ tooltip: "3 columns"
24
+ },
25
+ {
26
+ value: "4",
27
+ icon: /*#__PURE__*/ react.createElement(Icon, {
28
+ icon: /*#__PURE__*/ react.createElement(view_column_4_svg_ReactComponent, null),
29
+ label: "4 columns",
30
+ size: "sm"
31
+ }),
32
+ tooltip: "4 columns"
33
+ }
34
+ ];
35
+ const ColumnCountControl = ({ columnCount, disabled, presenter })=>/*#__PURE__*/ react.createElement(ToggleGroup, {
36
+ type: "single",
37
+ variant: "ghost",
38
+ size: "sm",
39
+ bordered: true,
40
+ items: ITEMS,
41
+ value: String(columnCount),
42
+ disabled: disabled,
43
+ onChange: (value)=>{
44
+ if (value) {
45
+ const count = Number(value);
46
+ presenter.setColumnCount(count);
47
+ }
48
+ }
49
+ });
50
+ export { ColumnCountControl };
51
+
52
+ //# sourceMappingURL=ColumnCountControl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dashboard/components/dnd/ColumnCountControl.js","sources":["../../../../src/Dashboard/components/dnd/ColumnCountControl.tsx"],"sourcesContent":["import React from \"react\";\nimport { Icon } from \"@webiny/admin-ui\";\nimport { ToggleGroup } from \"@webiny/admin-ui\";\nimport { ReactComponent as TwoColumnsIcon } from \"@webiny/icons/view_column_2.svg\";\nimport { ReactComponent as ThreeColumnsIcon } from \"@webiny/icons/view_column.svg\";\nimport { ReactComponent as FourColumnsIcon } from \"@webiny/icons/view_column_4.svg\";\nimport type { DashboardLayoutPresenter } from \"../../dashboardLayout/presenter/abstractions.js\";\n\ninterface ColumnCountControlProps {\n columnCount: number;\n disabled?: boolean;\n presenter: DashboardLayoutPresenter.Interface;\n}\n\n// Covers MIN_COLUMN_COUNT..MAX_COLUMN_COUNT; add an icon here if that range grows.\n// `Icon`'s label is what gives each icon-only toggle an accessible name.\nconst ITEMS = [\n {\n value: \"2\",\n icon: <Icon icon={<TwoColumnsIcon />} label={\"2 columns\"} size={\"sm\"} />,\n tooltip: \"2 columns\"\n },\n {\n value: \"3\",\n icon: <Icon icon={<ThreeColumnsIcon />} label={\"3 columns\"} size={\"sm\"} />,\n tooltip: \"3 columns\"\n },\n {\n value: \"4\",\n icon: <Icon icon={<FourColumnsIcon />} label={\"4 columns\"} size={\"sm\"} />,\n tooltip: \"4 columns\"\n }\n];\n\nexport const ColumnCountControl = ({\n columnCount,\n disabled,\n presenter\n}: ColumnCountControlProps) => {\n return (\n <ToggleGroup\n type={\"single\"}\n variant={\"ghost\"}\n size={\"sm\"}\n bordered={true}\n items={ITEMS}\n value={String(columnCount)}\n disabled={disabled}\n onChange={value => {\n // Clicking the active option would clear it; a count is always required.\n if (value) {\n const count = Number(value);\n presenter.setColumnCount(count);\n }\n }}\n />\n );\n};\n"],"names":["ITEMS","Icon","TwoColumnsIcon","ThreeColumnsIcon","FourColumnsIcon","ColumnCountControl","columnCount","disabled","presenter","ToggleGroup","String","value","count","Number"],"mappings":";;;;;AAgBA,MAAMA,QAAQ;IACV;QACI,OAAO;QACP,MAAM,WAAN,GAAM,oBAACC,MAAIA;YAAC,oBAAM,oBAACC,gBAAcA;YAAK,OAAO;YAAa,MAAM;;QAChE,SAAS;IACb;IACA;QACI,OAAO;QACP,MAAM,WAAN,GAAM,oBAACD,MAAIA;YAAC,oBAAM,oBAACE,gCAAgBA;YAAK,OAAO;YAAa,MAAM;;QAClE,SAAS;IACb;IACA;QACI,OAAO;QACP,MAAM,WAAN,GAAM,oBAACF,MAAIA;YAAC,oBAAM,oBAACG,kCAAeA;YAAK,OAAO;YAAa,MAAM;;QACjE,SAAS;IACb;CACH;AAEM,MAAMC,qBAAqB,CAAC,EAC/BC,WAAW,EACXC,QAAQ,EACRC,SAAS,EACa,GACf,WAAP,GACI,oBAACC,aAAWA;QACR,MAAM;QACN,SAAS;QACT,MAAM;QACN,UAAU;QACV,OAAOT;QACP,OAAOU,OAAOJ;QACd,UAAUC;QACV,UAAUI,CAAAA;YAEN,IAAIA,OAAO;gBACP,MAAMC,QAAQC,OAAOF;gBACrBH,UAAU,cAAc,CAACI;YAC7B;QACJ"}
@@ -0,0 +1,10 @@
1
+ import React from "react";
2
+ interface ColumnEmptyStateProps {
3
+ canRemove: boolean;
4
+ onRemove: () => void;
5
+ onBrowse: () => void;
6
+ dragging: boolean;
7
+ active: boolean;
8
+ }
9
+ export declare const ColumnEmptyState: ({ canRemove, onRemove, onBrowse, dragging, active }: ColumnEmptyStateProps) => React.JSX.Element;
10
+ export {};
@@ -0,0 +1,52 @@
1
+ import react from "react";
2
+ import { Button, Icon, Text, cn } from "@webiny/admin-ui";
3
+ import { ReactComponent } from "@webiny/icons/dashboard_customize.svg";
4
+ import { ReactComponent as add_circle_svg_ReactComponent } from "@webiny/icons/add_circle.svg";
5
+ const IDLE_CLASSES = "border-neutral-strong/40 bg-neutral-base/50 hover:border-neutral-strong/60";
6
+ const CAN_DROP_CLASSES = "border-primary/50 bg-primary/5";
7
+ const ACTIVE_CLASSES = "border-primary bg-primary/10";
8
+ const ColumnEmptyState = ({ canRemove, onRemove, onBrowse, dragging, active })=>{
9
+ let stateClasses = IDLE_CLASSES;
10
+ if (active) stateClasses = ACTIVE_CLASSES;
11
+ else if (dragging) stateClasses = CAN_DROP_CLASSES;
12
+ let icon = /*#__PURE__*/ react.createElement(Icon, {
13
+ icon: /*#__PURE__*/ react.createElement(ReactComponent, null),
14
+ label: "Empty column",
15
+ size: "sm",
16
+ color: "neutral-strong"
17
+ });
18
+ if (dragging) icon = /*#__PURE__*/ react.createElement(Icon, {
19
+ icon: /*#__PURE__*/ react.createElement(add_circle_svg_ReactComponent, null),
20
+ label: "Drop here",
21
+ size: "sm",
22
+ color: "accent"
23
+ });
24
+ let body = /*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement(Text, {
25
+ as: "div",
26
+ size: "sm",
27
+ className: "text-center text-neutral-strong"
28
+ }, "Drop a widget here", /*#__PURE__*/ react.createElement("br", null), "or ", /*#__PURE__*/ react.createElement("button", {
29
+ type: "button",
30
+ onClick: onBrowse,
31
+ className: "cursor-pointer text-primary hover:underline"
32
+ }, "browse widgets")), canRemove && /*#__PURE__*/ react.createElement(Button, {
33
+ size: "sm",
34
+ variant: "ghost",
35
+ text: "Remove column",
36
+ onClick: onRemove
37
+ }));
38
+ if (dragging) body = /*#__PURE__*/ react.createElement(Text, {
39
+ as: "div",
40
+ size: "sm",
41
+ className: "text-center text-primary"
42
+ }, "Drop it here");
43
+ return /*#__PURE__*/ react.createElement("div", {
44
+ "data-testid": "dashboard-empty-column",
45
+ className: cn("flex min-h-[220px] flex-col items-center justify-center gap-sm rounded-xl", "border-2 border-dashed p-lg transition-colors", stateClasses)
46
+ }, /*#__PURE__*/ react.createElement("span", {
47
+ className: cn("flex size-xl items-center justify-center rounded-md", dragging ? "bg-primary/10" : "bg-neutral-dimmed")
48
+ }, icon), body);
49
+ };
50
+ export { ColumnEmptyState };
51
+
52
+ //# sourceMappingURL=ColumnEmptyState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dashboard/components/dnd/ColumnEmptyState.js","sources":["../../../../src/Dashboard/components/dnd/ColumnEmptyState.tsx"],"sourcesContent":["import React from \"react\";\nimport { Button } from \"@webiny/admin-ui\";\nimport { Icon } from \"@webiny/admin-ui\";\nimport { Text } from \"@webiny/admin-ui\";\nimport { cn } from \"@webiny/admin-ui\";\nimport { ReactComponent as DashboardCustomizeIcon } from \"@webiny/icons/dashboard_customize.svg\";\nimport { ReactComponent as AddCircleIcon } from \"@webiny/icons/add_circle.svg\";\n\ninterface ColumnEmptyStateProps {\n canRemove: boolean;\n onRemove: () => void;\n onBrowse: () => void;\n // A widget is being dragged somewhere on the dashboard.\n dragging: boolean;\n // ...and it's over this column.\n active: boolean;\n}\n\nconst IDLE_CLASSES = \"border-neutral-strong/40 bg-neutral-base/50 hover:border-neutral-strong/60\";\nconst CAN_DROP_CLASSES = \"border-primary/50 bg-primary/5\";\nconst ACTIVE_CLASSES = \"border-primary bg-primary/10\";\n\nexport const ColumnEmptyState = ({\n canRemove,\n onRemove,\n onBrowse,\n dragging,\n active\n}: ColumnEmptyStateProps) => {\n let stateClasses = IDLE_CLASSES;\n if (active) {\n stateClasses = ACTIVE_CLASSES;\n } else if (dragging) {\n stateClasses = CAN_DROP_CLASSES;\n }\n\n let icon = (\n <Icon\n icon={<DashboardCustomizeIcon />}\n label={\"Empty column\"}\n size={\"sm\"}\n color={\"neutral-strong\"}\n />\n );\n if (dragging) {\n icon = <Icon icon={<AddCircleIcon />} label={\"Drop here\"} size={\"sm\"} color={\"accent\"} />;\n }\n\n let body = (\n <>\n <Text as={\"div\"} size={\"sm\"} className={\"text-center text-neutral-strong\"}>\n {\"Drop a widget here\"}\n <br />\n {\"or \"}\n <button\n type={\"button\"}\n onClick={onBrowse}\n className={\"cursor-pointer text-primary hover:underline\"}\n >\n {\"browse widgets\"}\n </button>\n </Text>\n {canRemove && (\n <Button size={\"sm\"} variant={\"ghost\"} text={\"Remove column\"} onClick={onRemove} />\n )}\n </>\n );\n if (dragging) {\n body = (\n <Text as={\"div\"} size={\"sm\"} className={\"text-center text-primary\"}>\n {\"Drop it here\"}\n </Text>\n );\n }\n\n return (\n <div\n data-testid={\"dashboard-empty-column\"}\n className={cn(\n // `rounded-xl` and the 2px border match the cards' outline and the drop slot.\n \"flex min-h-[220px] flex-col items-center justify-center gap-sm rounded-xl\",\n \"border-2 border-dashed p-lg transition-colors\",\n stateClasses\n )}\n >\n <span\n className={cn(\n \"flex size-xl items-center justify-center rounded-md\",\n dragging ? \"bg-primary/10\" : \"bg-neutral-dimmed\"\n )}\n >\n {icon}\n </span>\n {body}\n </div>\n );\n};\n"],"names":["IDLE_CLASSES","CAN_DROP_CLASSES","ACTIVE_CLASSES","ColumnEmptyState","canRemove","onRemove","onBrowse","dragging","active","stateClasses","icon","Icon","DashboardCustomizeIcon","AddCircleIcon","body","Text","Button","cn"],"mappings":";;;;AAkBA,MAAMA,eAAe;AACrB,MAAMC,mBAAmB;AACzB,MAAMC,iBAAiB;AAEhB,MAAMC,mBAAmB,CAAC,EAC7BC,SAAS,EACTC,QAAQ,EACRC,QAAQ,EACRC,QAAQ,EACRC,MAAM,EACc;IACpB,IAAIC,eAAeT;IACnB,IAAIQ,QACAC,eAAeP;SACZ,IAAIK,UACPE,eAAeR;IAGnB,IAAIS,OAAO,WAAPA,GACA,oBAACC,MAAIA;QACD,oBAAM,oBAACC,gBAAsBA;QAC7B,OAAO;QACP,MAAM;QACN,OAAO;;IAGf,IAAIL,UACAG,OAAO,WAAPA,GAAO,oBAACC,MAAIA;QAAC,oBAAM,oBAACE,+BAAaA;QAAK,OAAO;QAAa,MAAM;QAAM,OAAO;;IAGjF,IAAIC,OAAO,WAAPA,GACA,wDACI,oBAACC,MAAIA;QAAC,IAAI;QAAO,MAAM;QAAM,WAAW;OACnC,oCACD,oBAAC,aACA,qBACD,oBAAC;QACG,MAAM;QACN,SAAST;QACT,WAAW;OAEV,oBAGRF,aAAa,WAAbA,GACG,oBAACY,QAAMA;QAAC,MAAM;QAAM,SAAS;QAAS,MAAM;QAAiB,SAASX;;IAIlF,IAAIE,UACAO,OAAO,WAAPA,GACI,oBAACC,MAAIA;QAAC,IAAI;QAAO,MAAM;QAAM,WAAW;OACnC;IAKb,OAAO,WAAP,GACI,oBAAC;QACG,eAAa;QACb,WAAWE,GAEP,6EACA,iDACAR;qBAGJ,oBAAC;QACG,WAAWQ,GACP,uDACAV,WAAW,kBAAkB;OAGhCG,OAEJI;AAGb"}
@@ -0,0 +1,6 @@
1
+ import React from "react";
2
+ /**
3
+ * A custom drag preview that follows the cursor. The native HTML5 preview is suppressed
4
+ * (see DashboardWidgetCard), so this chip is the only thing the user sees moving.
5
+ */
6
+ export declare const DashboardDragLayer: () => React.JSX.Element | null;
@@ -0,0 +1,28 @@
1
+ import react from "react";
2
+ import { useDragLayer } from "react-dnd";
3
+ import { Icon, cn } from "@webiny/admin-ui";
4
+ import { ReactComponent } from "@webiny/icons/drag_indicator.svg";
5
+ const DashboardDragLayer = ()=>{
6
+ const { isDragging, item, offset } = useDragLayer((monitor)=>({
7
+ isDragging: monitor.isDragging(),
8
+ item: monitor.getItem(),
9
+ offset: monitor.getClientOffset()
10
+ }));
11
+ if (!isDragging || !item || !offset) return null;
12
+ return /*#__PURE__*/ react.createElement("div", {
13
+ className: "pointer-events-none fixed left-0 top-0 z-[9999]"
14
+ }, /*#__PURE__*/ react.createElement("div", {
15
+ style: {
16
+ transform: `translate(${offset.x + 12}px, ${offset.y + 12}px)`
17
+ },
18
+ className: cn("flex items-center gap-sm whitespace-nowrap rounded-lg border-sm", "border-neutral-dimmed bg-neutral-base px-sm-extra py-sm-plus text-md", "font-semibold text-neutral-primary shadow-lg")
19
+ }, /*#__PURE__*/ react.createElement(Icon, {
20
+ icon: /*#__PURE__*/ react.createElement(ReactComponent, null),
21
+ label: "Dragging",
22
+ size: "sm",
23
+ color: "neutral-light"
24
+ }), item.title));
25
+ };
26
+ export { DashboardDragLayer };
27
+
28
+ //# sourceMappingURL=DashboardDragLayer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dashboard/components/dnd/DashboardDragLayer.js","sources":["../../../../src/Dashboard/components/dnd/DashboardDragLayer.tsx"],"sourcesContent":["import React from \"react\";\nimport { useDragLayer } from \"react-dnd\";\nimport type { XYCoord } from \"react-dnd\";\nimport { Icon } from \"@webiny/admin-ui\";\nimport { cn } from \"@webiny/admin-ui\";\nimport { ReactComponent as DragIndicatorIcon } from \"@webiny/icons/drag_indicator.svg\";\n\nimport type { DashboardWidgetDragItem } from \"./dragItem.js\";\n\ninterface DragLayerState {\n isDragging: boolean;\n item: DashboardWidgetDragItem | null;\n offset: XYCoord | null;\n}\n\n/**\n * A custom drag preview that follows the cursor. The native HTML5 preview is suppressed\n * (see DashboardWidgetCard), so this chip is the only thing the user sees moving.\n */\nexport const DashboardDragLayer = () => {\n const { isDragging, item, offset } = useDragLayer<\n DragLayerState,\n DashboardWidgetDragItem | null\n >(monitor => ({\n isDragging: monitor.isDragging(),\n item: monitor.getItem(),\n offset: monitor.getClientOffset()\n }));\n\n if (!isDragging || !item || !offset) {\n return null;\n }\n\n return (\n <div className={\"pointer-events-none fixed left-0 top-0 z-[9999]\"}>\n <div\n style={{\n transform: `translate(${offset.x + 12}px, ${offset.y + 12}px)`\n }}\n className={cn(\n \"flex items-center gap-sm whitespace-nowrap rounded-lg border-sm\",\n \"border-neutral-dimmed bg-neutral-base px-sm-extra py-sm-plus text-md\",\n \"font-semibold text-neutral-primary shadow-lg\"\n )}\n >\n <Icon\n icon={<DragIndicatorIcon />}\n label={\"Dragging\"}\n size={\"sm\"}\n color={\"neutral-light\"}\n />\n {item.title}\n </div>\n </div>\n );\n};\n"],"names":["DashboardDragLayer","isDragging","item","offset","useDragLayer","monitor","cn","Icon","DragIndicatorIcon"],"mappings":";;;;AAmBO,MAAMA,qBAAqB;IAC9B,MAAM,EAAEC,UAAU,EAAEC,IAAI,EAAEC,MAAM,EAAE,GAAGC,aAGnCC,CAAAA,UAAY;YACV,YAAYA,QAAQ,UAAU;YAC9B,MAAMA,QAAQ,OAAO;YACrB,QAAQA,QAAQ,eAAe;QACnC;IAEA,IAAI,CAACJ,cAAc,CAACC,QAAQ,CAACC,QACzB,OAAO;IAGX,OAAO,WAAP,GACI,oBAAC;QAAI,WAAW;qBACZ,oBAAC;QACG,OAAO;YACH,WAAW,CAAC,UAAU,EAAEA,OAAO,CAAC,GAAG,GAAG,IAAI,EAAEA,OAAO,CAAC,GAAG,GAAG,GAAG,CAAC;QAClE;QACA,WAAWG,GACP,mEACA,wEACA;qBAGJ,oBAACC,MAAIA;QACD,oBAAM,oBAACC,gBAAiBA;QACxB,OAAO;QACP,MAAM;QACN,OAAO;QAEVN,KAAK,KAAK;AAI3B"}
@@ -0,0 +1,13 @@
1
+ import React from "react";
2
+ import type { DashboardLayoutPresenter } from "../../dashboardLayout/presenter/abstractions.js";
3
+ interface DashboardWidgetCardProps {
4
+ name: string;
5
+ title: string;
6
+ isDragging: boolean;
7
+ presenter: DashboardLayoutPresenter.Interface;
8
+ /** Reports the card's DOM node to the column so it can measure drop slots. */
9
+ registerRef: (name: string, node: HTMLElement | null) => void;
10
+ children: React.ReactNode;
11
+ }
12
+ export declare const DashboardWidgetCard: ({ name, title, isDragging, presenter, registerRef, children }: DashboardWidgetCardProps) => React.JSX.Element;
13
+ export {};
@@ -0,0 +1,59 @@
1
+ import react, { useRef } from "react";
2
+ import { DragPreviewImage, useDrag } from "react-dnd";
3
+ import { IconButton, Tooltip, cn } from "@webiny/admin-ui";
4
+ import { ReactComponent } from "@webiny/icons/delete.svg";
5
+ import { DASHBOARD_WIDGET_DND_TYPE } from "./dragItem.js";
6
+ const EMPTY_DRAG_IMAGE = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==";
7
+ const DashboardWidgetCard = ({ name, title, isDragging, presenter, registerRef, children })=>{
8
+ const cardRef = useRef(null);
9
+ const [, drag, preview] = useDrag({
10
+ type: DASHBOARD_WIDGET_DND_TYPE,
11
+ item: ()=>{
12
+ presenter.beginDrag(name);
13
+ const height = cardRef.current?.getBoundingClientRect().height ?? 0;
14
+ return {
15
+ name,
16
+ title,
17
+ height
18
+ };
19
+ },
20
+ end: ()=>{
21
+ presenter.endDrag();
22
+ }
23
+ });
24
+ return /*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement(DragPreviewImage, {
25
+ connect: preview,
26
+ src: EMPTY_DRAG_IMAGE
27
+ }), /*#__PURE__*/ react.createElement("div", {
28
+ ref: (node)=>{
29
+ cardRef.current = node;
30
+ registerRef(name, node);
31
+ },
32
+ className: cn("group/card relative rounded-xl transition-opacity", isDragging && "opacity-50")
33
+ }, /*#__PURE__*/ react.createElement("div", {
34
+ ref: (node)=>node?.setAttribute("inert", ""),
35
+ className: "select-none"
36
+ }, children), /*#__PURE__*/ react.createElement("div", {
37
+ ref: (node)=>{
38
+ drag(node);
39
+ },
40
+ role: "button",
41
+ "aria-label": `Drag ${title} to move it`,
42
+ "data-testid": `dashboard-card-${name}`,
43
+ className: cn("absolute inset-0 z-10 cursor-grab rounded-xl active:cursor-grabbing", "ring-2 ring-inset ring-primary/30 transition-colors", "hover:bg-primary/5 hover:ring-primary/60")
44
+ }), /*#__PURE__*/ react.createElement("div", {
45
+ className: cn("absolute -right-sm -top-sm z-20 opacity-0 transition-opacity", "group-hover/card:opacity-100 focus-within:opacity-100")
46
+ }, /*#__PURE__*/ react.createElement(Tooltip, {
47
+ content: "Remove from dashboard",
48
+ trigger: /*#__PURE__*/ react.createElement(IconButton, {
49
+ variant: "tertiary",
50
+ size: "sm",
51
+ icon: /*#__PURE__*/ react.createElement(ReactComponent, null),
52
+ "aria-label": `Remove ${title} from the dashboard`,
53
+ onClick: ()=>presenter.removeWidget(name)
54
+ })
55
+ }))));
56
+ };
57
+ export { DashboardWidgetCard };
58
+
59
+ //# sourceMappingURL=DashboardWidgetCard.js.map