@webiny/app-admin-ui 0.0.0-unstable.a4f3e4ea8b → 0.0.0-unstable.a85ef555b2

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 (171) 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 +2 -2
  5. package/CommandPalette/CommandPalette.js +106 -75
  6. package/CommandPalette/CommandPalette.js.map +1 -1
  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/CommandItemRow.js +4 -2
  23. package/CommandPalette/components/CommandItemRow.js.map +1 -1
  24. package/CommandPalette/components/NoResults.d.ts +13 -0
  25. package/CommandPalette/components/NoResults.js +33 -0
  26. package/CommandPalette/components/NoResults.js.map +1 -0
  27. package/CommandPalette/components/PaletteFooter.d.ts +13 -0
  28. package/CommandPalette/components/PaletteFooter.js +18 -0
  29. package/CommandPalette/components/PaletteFooter.js.map +1 -0
  30. package/CommandPalette/components/ToolChip.d.ts +7 -0
  31. package/CommandPalette/components/ToolChip.js +32 -0
  32. package/CommandPalette/components/ToolChip.js.map +1 -0
  33. package/CommandPalette/components/index.d.ts +13 -5
  34. package/CommandPalette/components/index.js +13 -5
  35. package/CommandPalette/modes/PaletteMode.d.ts +73 -0
  36. package/CommandPalette/modes/PaletteMode.js +0 -0
  37. package/CommandPalette/modes/createAiMode.d.ts +13 -0
  38. package/CommandPalette/modes/createAiMode.js +80 -0
  39. package/CommandPalette/modes/createAiMode.js.map +1 -0
  40. package/CommandPalette/modes/index.d.ts +2 -0
  41. package/CommandPalette/modes/index.js +1 -0
  42. package/CommandPalette/usePaletteHotkeys.d.ts +16 -0
  43. package/CommandPalette/usePaletteHotkeys.js +38 -0
  44. package/CommandPalette/usePaletteHotkeys.js.map +1 -0
  45. package/Dashboard/Welcome.d.ts +4 -1
  46. package/Dashboard/Welcome.js +111 -24
  47. package/Dashboard/Welcome.js.map +1 -1
  48. package/Dashboard/components/DashboardToolbar.d.ts +11 -0
  49. package/Dashboard/components/DashboardToolbar.js +48 -0
  50. package/Dashboard/components/DashboardToolbar.js.map +1 -0
  51. package/Dashboard/components/addWidgetDrawer/AddToColumnMenu.d.ts +10 -0
  52. package/Dashboard/components/addWidgetDrawer/AddToColumnMenu.js +30 -0
  53. package/Dashboard/components/addWidgetDrawer/AddToColumnMenu.js.map +1 -0
  54. package/Dashboard/components/addWidgetDrawer/AddWidgetDrawer.d.ts +12 -0
  55. package/Dashboard/components/addWidgetDrawer/AddWidgetDrawer.js +61 -0
  56. package/Dashboard/components/addWidgetDrawer/AddWidgetDrawer.js.map +1 -0
  57. package/Dashboard/components/addWidgetDrawer/DrawerWidgetRow.d.ts +10 -0
  58. package/Dashboard/components/addWidgetDrawer/DrawerWidgetRow.js +38 -0
  59. package/Dashboard/components/addWidgetDrawer/DrawerWidgetRow.js.map +1 -0
  60. package/Dashboard/components/addWidgetDrawer/WidgetPreviewFrame.d.ts +7 -0
  61. package/Dashboard/components/addWidgetDrawer/WidgetPreviewFrame.js +44 -0
  62. package/Dashboard/components/addWidgetDrawer/WidgetPreviewFrame.js.map +1 -0
  63. package/Dashboard/components/addWidgetDrawer/WidgetSketch.d.ts +4 -0
  64. package/Dashboard/components/addWidgetDrawer/WidgetSketch.js +20 -0
  65. package/Dashboard/components/addWidgetDrawer/WidgetSketch.js.map +1 -0
  66. package/Dashboard/components/addWidgetDrawer/WidgetTabContent.d.ts +14 -0
  67. package/Dashboard/components/addWidgetDrawer/WidgetTabContent.js +76 -0
  68. package/Dashboard/components/addWidgetDrawer/WidgetTabContent.js.map +1 -0
  69. package/Dashboard/components/addWidgetDrawer/types.d.ts +10 -0
  70. package/Dashboard/components/addWidgetDrawer/types.js +0 -0
  71. package/Dashboard/components/dnd/ColumnCountControl.d.ts +9 -0
  72. package/Dashboard/components/dnd/ColumnCountControl.js +52 -0
  73. package/Dashboard/components/dnd/ColumnCountControl.js.map +1 -0
  74. package/Dashboard/components/dnd/ColumnEmptyState.d.ts +10 -0
  75. package/Dashboard/components/dnd/ColumnEmptyState.js +52 -0
  76. package/Dashboard/components/dnd/ColumnEmptyState.js.map +1 -0
  77. package/Dashboard/components/dnd/DashboardDragLayer.d.ts +6 -0
  78. package/Dashboard/components/dnd/DashboardDragLayer.js +28 -0
  79. package/Dashboard/components/dnd/DashboardDragLayer.js.map +1 -0
  80. package/Dashboard/components/dnd/DashboardWidgetCard.d.ts +13 -0
  81. package/Dashboard/components/dnd/DashboardWidgetCard.js +59 -0
  82. package/Dashboard/components/dnd/DashboardWidgetCard.js.map +1 -0
  83. package/Dashboard/components/dnd/DashboardWidgetColumn.d.ts +19 -0
  84. package/Dashboard/components/dnd/DashboardWidgetColumn.js +72 -0
  85. package/Dashboard/components/dnd/DashboardWidgetColumn.js.map +1 -0
  86. package/Dashboard/components/dnd/WidgetDropIndicator.d.ts +11 -0
  87. package/Dashboard/components/dnd/WidgetDropIndicator.js +29 -0
  88. package/Dashboard/components/dnd/WidgetDropIndicator.js.map +1 -0
  89. package/Dashboard/components/dnd/WidgetSlot.d.ts +6 -0
  90. package/Dashboard/components/dnd/WidgetSlot.js +9 -0
  91. package/Dashboard/components/dnd/WidgetSlot.js.map +1 -0
  92. package/Dashboard/components/dnd/dragItem.d.ts +6 -0
  93. package/Dashboard/components/dnd/dragItem.js +4 -0
  94. package/Dashboard/components/dnd/dragItem.js.map +1 -0
  95. package/Dashboard/components/dnd/useWidgetHosts.d.ts +1 -0
  96. package/Dashboard/components/dnd/useWidgetHosts.js +16 -0
  97. package/Dashboard/components/dnd/useWidgetHosts.js.map +1 -0
  98. package/Dashboard/components/layout/EditableColumns.d.ts +13 -0
  99. package/Dashboard/components/layout/EditableColumns.js +25 -0
  100. package/Dashboard/components/layout/EditableColumns.js.map +1 -0
  101. package/Dashboard/components/layout/StaticColumns.d.ts +8 -0
  102. package/Dashboard/components/layout/StaticColumns.js +20 -0
  103. package/Dashboard/components/layout/StaticColumns.js.map +1 -0
  104. package/Dashboard/components/layout/collapseColumns.d.ts +1 -0
  105. package/Dashboard/components/layout/collapseColumns.js +16 -0
  106. package/Dashboard/components/layout/collapseColumns.js.map +1 -0
  107. package/Dashboard/components/layout/layoutConstants.d.ts +2 -0
  108. package/Dashboard/components/layout/layoutConstants.js +5 -0
  109. package/Dashboard/components/layout/layoutConstants.js.map +1 -0
  110. package/Dashboard/components/layout/useColumnsThatFit.d.ts +6 -0
  111. package/Dashboard/components/layout/useColumnsThatFit.js +30 -0
  112. package/Dashboard/components/layout/useColumnsThatFit.js.map +1 -0
  113. package/Dashboard/components/layout/useWidgetPortals.d.ts +5 -0
  114. package/Dashboard/components/layout/useWidgetPortals.js +26 -0
  115. package/Dashboard/components/layout/useWidgetPortals.js.map +1 -0
  116. package/Dashboard/dashboardLayout/loadLayout/FetchDashboardLayoutUseCase.d.ts +12 -0
  117. package/Dashboard/dashboardLayout/loadLayout/FetchDashboardLayoutUseCase.js +19 -0
  118. package/Dashboard/dashboardLayout/loadLayout/FetchDashboardLayoutUseCase.js.map +1 -0
  119. package/Dashboard/dashboardLayout/loadLayout/GetCachedDashboardLayoutUseCase.d.ts +12 -0
  120. package/Dashboard/dashboardLayout/loadLayout/GetCachedDashboardLayoutUseCase.js +19 -0
  121. package/Dashboard/dashboardLayout/loadLayout/GetCachedDashboardLayoutUseCase.js.map +1 -0
  122. package/Dashboard/dashboardLayout/loadLayout/abstractions.d.ts +15 -0
  123. package/Dashboard/dashboardLayout/loadLayout/abstractions.js +6 -0
  124. package/Dashboard/dashboardLayout/loadLayout/abstractions.js.map +1 -0
  125. package/Dashboard/dashboardLayout/loadLayout/feature.d.ts +1 -0
  126. package/Dashboard/dashboardLayout/loadLayout/feature.js +13 -0
  127. package/Dashboard/dashboardLayout/loadLayout/feature.js.map +1 -0
  128. package/Dashboard/dashboardLayout/presenter/DashboardLayoutPresenter.d.ts +56 -0
  129. package/Dashboard/dashboardLayout/presenter/DashboardLayoutPresenter.js +308 -0
  130. package/Dashboard/dashboardLayout/presenter/DashboardLayoutPresenter.js.map +1 -0
  131. package/Dashboard/dashboardLayout/presenter/abstractions.d.ts +46 -0
  132. package/Dashboard/dashboardLayout/presenter/abstractions.js +5 -0
  133. package/Dashboard/dashboardLayout/presenter/abstractions.js.map +1 -0
  134. package/Dashboard/dashboardLayout/presenter/feature.d.ts +3 -0
  135. package/Dashboard/dashboardLayout/presenter/feature.js +23 -0
  136. package/Dashboard/dashboardLayout/presenter/feature.js.map +1 -0
  137. package/Dashboard/dashboardLayout/presenter/useDashboardLayoutPresenter.d.ts +1 -0
  138. package/Dashboard/dashboardLayout/presenter/useDashboardLayoutPresenter.js +6 -0
  139. package/Dashboard/dashboardLayout/presenter/useDashboardLayoutPresenter.js.map +1 -0
  140. package/Dashboard/dashboardLayout/repository/DashboardLayoutGateway.d.ts +13 -0
  141. package/Dashboard/dashboardLayout/repository/DashboardLayoutGateway.js +67 -0
  142. package/Dashboard/dashboardLayout/repository/DashboardLayoutGateway.js.map +1 -0
  143. package/Dashboard/dashboardLayout/repository/DashboardLayoutRepository.d.ts +20 -0
  144. package/Dashboard/dashboardLayout/repository/DashboardLayoutRepository.js +49 -0
  145. package/Dashboard/dashboardLayout/repository/DashboardLayoutRepository.js.map +1 -0
  146. package/Dashboard/dashboardLayout/repository/abstractions.d.ts +25 -0
  147. package/Dashboard/dashboardLayout/repository/abstractions.js +6 -0
  148. package/Dashboard/dashboardLayout/repository/abstractions.js.map +1 -0
  149. package/Dashboard/dashboardLayout/repository/feature.d.ts +1 -0
  150. package/Dashboard/dashboardLayout/repository/feature.js +13 -0
  151. package/Dashboard/dashboardLayout/repository/feature.js.map +1 -0
  152. package/Dashboard/dashboardLayout/saveLayout/SaveDashboardLayoutUseCase.d.ts +12 -0
  153. package/Dashboard/dashboardLayout/saveLayout/SaveDashboardLayoutUseCase.js +19 -0
  154. package/Dashboard/dashboardLayout/saveLayout/SaveDashboardLayoutUseCase.js.map +1 -0
  155. package/Dashboard/dashboardLayout/saveLayout/abstractions.d.ts +8 -0
  156. package/Dashboard/dashboardLayout/saveLayout/abstractions.js +5 -0
  157. package/Dashboard/dashboardLayout/saveLayout/abstractions.js.map +1 -0
  158. package/Dashboard/dashboardLayout/saveLayout/feature.d.ts +1 -0
  159. package/Dashboard/dashboardLayout/saveLayout/feature.js +11 -0
  160. package/Dashboard/dashboardLayout/saveLayout/feature.js.map +1 -0
  161. package/Dashboard/dashboardLayout/toColumnIndex.d.ts +1 -0
  162. package/Dashboard/dashboardLayout/toColumnIndex.js +7 -0
  163. package/Dashboard/dashboardLayout/toColumnIndex.js.map +1 -0
  164. package/Dashboard/dashboardLayout/types.d.ts +15 -0
  165. package/Dashboard/dashboardLayout/types.js +6 -0
  166. package/Dashboard/dashboardLayout/types.js.map +1 -0
  167. package/Layout.js +7 -5
  168. package/Layout.js.map +1 -1
  169. package/index.js +15 -4
  170. package/index.js.map +1 -1
  171. package/package.json +13 -7
@@ -1,32 +1,119 @@
1
- import react from "react";
2
- import { Grid, Heading } from "@webiny/admin-ui";
3
- import { useAdminConfig, useSecurity } from "@webiny/app-admin";
4
- const Welcome = ()=>{
1
+ import react, { useEffect, useMemo, useState } from "react";
2
+ import { DndProvider } from "react-dnd";
3
+ import { HTML5Backend } from "react-dnd-html5-backend";
4
+ import { Heading, Text } from "@webiny/admin-ui";
5
+ import { createReactiveComponent, useAdminConfig, useSecurity } from "@webiny/app-admin";
6
+ import { useDashboardLayoutPresenter } from "./dashboardLayout/presenter/useDashboardLayoutPresenter.js";
7
+ import { toColumnIndex } from "./dashboardLayout/toColumnIndex.js";
8
+ import { AddWidgetDrawer } from "./components/addWidgetDrawer/AddWidgetDrawer.js";
9
+ import { DashboardToolbar } from "./components/DashboardToolbar.js";
10
+ import { EditableColumns } from "./components/layout/EditableColumns.js";
11
+ import { StaticColumns } from "./components/layout/StaticColumns.js";
12
+ import { useColumnsThatFit } from "./components/layout/useColumnsThatFit.js";
13
+ import { useWidgetPortals } from "./components/layout/useWidgetPortals.js";
14
+ import { DASHBOARD_MAX_WIDTH } from "./components/layout/layoutConstants.js";
15
+ const WelcomeBase = ()=>{
5
16
  const { identity } = useSecurity();
6
17
  const { widgets } = useAdminConfig();
7
- return /*#__PURE__*/ react.createElement("div", {
8
- className: "my-xxl"
18
+ const presenter = useDashboardLayoutPresenter();
19
+ const elements = useMemo(()=>{
20
+ const map = new Map();
21
+ widgets.forEach((widget)=>map.set(widget.name, widget.element));
22
+ return map;
23
+ }, [
24
+ widgets
25
+ ]);
26
+ const titles = useMemo(()=>{
27
+ const map = new Map();
28
+ widgets.forEach((widget)=>map.set(widget.name, {
29
+ title: widget.title ?? widget.name
30
+ }));
31
+ return map;
32
+ }, [
33
+ widgets
34
+ ]);
35
+ const widgetsKey = widgets.map((w)=>`${w.name}:${toColumnIndex(w.column)}`).join("|");
36
+ useEffect(()=>{
37
+ const inputs = widgets.map((widget)=>({
38
+ name: widget.name,
39
+ column: toColumnIndex(widget.column)
40
+ }));
41
+ presenter.init(identity.id, inputs);
42
+ }, [
43
+ identity?.id,
44
+ widgetsKey
45
+ ]);
46
+ useEffect(()=>()=>presenter.dispose(), [
47
+ presenter
48
+ ]);
49
+ const { vm } = presenter;
50
+ const [drawerOpen, setDrawerOpen] = useState(false);
51
+ const openDrawer = ()=>setDrawerOpen(true);
52
+ const drawerWidgets = widgets.map((widget)=>{
53
+ const registeredColumn = toColumnIndex(widget.column);
54
+ return {
55
+ name: widget.name,
56
+ title: widget.title ?? widget.name,
57
+ description: widget.description,
58
+ group: widget.group,
59
+ preview: widget.preview,
60
+ added: !vm.hidden.includes(widget.name),
61
+ defaultColumn: Math.min(registeredColumn, vm.columnCount - 1)
62
+ };
63
+ });
64
+ const { ref: containerRef, visibleCount, allFit } = useColumnsThatFit(vm.columnCount);
65
+ const placed = vm.columns.flat();
66
+ const { slots, portals } = useWidgetPortals(placed, elements);
67
+ const editing = vm.editing && allFit;
68
+ let subtitle = "Your dashboard. Arrange the widgets however you work best.";
69
+ let columns = /*#__PURE__*/ react.createElement(StaticColumns, {
70
+ columns: vm.columns,
71
+ visibleCount: visibleCount,
72
+ slots: slots
73
+ });
74
+ if (editing) {
75
+ subtitle = "Drag widgets to rearrange them, and click Done when you're finished.";
76
+ columns = /*#__PURE__*/ react.createElement(EditableColumns, {
77
+ vm: vm,
78
+ slots: slots,
79
+ titles: titles,
80
+ presenter: presenter,
81
+ onBrowseWidgets: openDrawer
82
+ });
83
+ }
84
+ return /*#__PURE__*/ react.createElement(DndProvider, {
85
+ backend: HTML5Backend
9
86
  }, /*#__PURE__*/ react.createElement("div", {
10
- className: "mb-3xl"
11
- }, /*#__PURE__*/ react.createElement(Heading, {
87
+ className: "my-xxl",
88
+ ref: containerRef
89
+ }, portals, /*#__PURE__*/ react.createElement("div", {
90
+ className: "mb-xl flex items-center justify-between gap-lg",
91
+ style: {
92
+ maxWidth: DASHBOARD_MAX_WIDTH
93
+ }
94
+ }, /*#__PURE__*/ react.createElement("div", null, /*#__PURE__*/ react.createElement(Heading, {
12
95
  level: 3
13
- }, `Hi ${identity.displayName}, what are we doing today?`)), /*#__PURE__*/ react.createElement(Grid, {
14
- gap: "spacious",
15
- className: "max-w-[1200px]"
16
- }, /*#__PURE__*/ react.createElement(Grid.Column, {
17
- span: 6
18
- }, /*#__PURE__*/ react.createElement("div", {
19
- className: "flex flex-col gap-lg"
20
- }, widgets.filter((w)=>"left" === w.column).map((widget)=>/*#__PURE__*/ react.createElement(react.Fragment, {
21
- key: widget.name
22
- }, widget.element)))), /*#__PURE__*/ react.createElement(Grid.Column, {
23
- span: 6
24
- }, /*#__PURE__*/ react.createElement("div", {
25
- className: "flex flex-col gap-lg"
26
- }, widgets.filter((w)=>"right" === w.column).map((widget)=>/*#__PURE__*/ react.createElement(react.Fragment, {
27
- key: widget.name
28
- }, widget.element))))));
96
+ }, `Hi ${identity.displayName}, what are we doing today?`), /*#__PURE__*/ react.createElement(Text, {
97
+ as: "div",
98
+ size: "md",
99
+ className: "mt-xs text-neutral-strong"
100
+ }, subtitle)), /*#__PURE__*/ react.createElement("div", {
101
+ className: "flex flex-none items-center gap-sm"
102
+ }, /*#__PURE__*/ react.createElement(DashboardToolbar, {
103
+ vm: vm,
104
+ editing: editing,
105
+ canCustomize: allFit,
106
+ presenter: presenter,
107
+ onAddWidget: openDrawer
108
+ }))), columns, /*#__PURE__*/ react.createElement(AddWidgetDrawer, {
109
+ open: drawerOpen,
110
+ onOpenChange: setDrawerOpen,
111
+ widgets: drawerWidgets,
112
+ columnCount: vm.columnCount,
113
+ presenter: presenter
114
+ })));
29
115
  };
116
+ const Welcome = createReactiveComponent(WelcomeBase);
30
117
  const Dashboard_Welcome = Welcome;
31
118
  export default Dashboard_Welcome;
32
119
 
@@ -1 +1 @@
1
- {"version":3,"file":"Dashboard/Welcome.js","sources":["../../src/Dashboard/Welcome.tsx"],"sourcesContent":["import React from \"react\";\nimport { Grid, Heading } from \"@webiny/admin-ui\";\nimport { useSecurity } from \"@webiny/app-admin\";\nimport { useAdminConfig } from \"@webiny/app-admin\";\n\nconst Welcome = () => {\n const { identity } = useSecurity();\n const { widgets } = useAdminConfig();\n\n return (\n <div className={\"my-xxl\"}>\n <div className={\"mb-3xl\"}>\n <Heading\n level={3}\n >{`Hi ${identity!.displayName}, what are we doing today?`}</Heading>\n </div>\n <Grid gap={\"spacious\"} className={\"max-w-[1200px]\"}>\n <Grid.Column span={6}>\n <div className={\"flex flex-col gap-lg\"}>\n {widgets\n .filter(w => w.column === \"left\")\n .map(widget => (\n <React.Fragment key={widget.name}>{widget.element}</React.Fragment>\n ))}\n </div>\n </Grid.Column>\n <Grid.Column span={6}>\n <div className={\"flex flex-col gap-lg\"}>\n {widgets\n .filter(w => w.column === \"right\")\n .map(widget => (\n <React.Fragment key={widget.name}>{widget.element}</React.Fragment>\n ))}\n </div>\n </Grid.Column>\n </Grid>\n </div>\n );\n};\n\nexport default Welcome;\n"],"names":["Welcome","identity","useSecurity","widgets","useAdminConfig","Heading","Grid","w","widget","React"],"mappings":";;;AAKA,MAAMA,UAAU;IACZ,MAAM,EAAEC,QAAQ,EAAE,GAAGC;IACrB,MAAM,EAAEC,OAAO,EAAE,GAAGC;IAEpB,OAAO,WAAP,GACI,oBAAC;QAAI,WAAW;qBACZ,oBAAC;QAAI,WAAW;qBACZ,oBAACC,SAAOA;QACJ,OAAO;OACT,CAAC,GAAG,EAAEJ,SAAU,WAAW,CAAC,0BAA0B,CAAC,kBAE7D,oBAACK,MAAIA;QAAC,KAAK;QAAY,WAAW;qBAC9B,oBAACA,KAAK,MAAM;QAAC,MAAM;qBACf,oBAAC;QAAI,WAAW;OACXH,QACI,MAAM,CAACI,CAAAA,IAAKA,AAAa,WAAbA,EAAE,MAAM,EACpB,GAAG,CAACC,CAAAA,SAAAA,WAAAA,GACD,oBAACC,MAAAA,QAAc;YAAC,KAAKD,OAAO,IAAI;WAAGA,OAAO,OAAO,oBAIjE,oBAACF,KAAK,MAAM;QAAC,MAAM;qBACf,oBAAC;QAAI,WAAW;OACXH,QACI,MAAM,CAACI,CAAAA,IAAKA,AAAa,YAAbA,EAAE,MAAM,EACpB,GAAG,CAACC,CAAAA,SAAAA,WAAAA,GACD,oBAACC,MAAAA,QAAc;YAAC,KAAKD,OAAO,IAAI;WAAGA,OAAO,OAAO;AAOjF;AAEA,0BAAeR"}
1
+ {"version":3,"file":"Dashboard/Welcome.js","sources":["../../src/Dashboard/Welcome.tsx"],"sourcesContent":["import React from \"react\";\nimport { useEffect } from \"react\";\nimport { useMemo } from \"react\";\nimport { useState } from \"react\";\nimport { DndProvider } from \"react-dnd\";\nimport { HTML5Backend } from \"react-dnd-html5-backend\";\nimport { Heading } from \"@webiny/admin-ui\";\nimport { Text } from \"@webiny/admin-ui\";\nimport { useSecurity } from \"@webiny/app-admin\";\nimport { useAdminConfig } from \"@webiny/app-admin\";\nimport { createReactiveComponent } from \"@webiny/app-admin\";\nimport { useDashboardLayoutPresenter } from \"./dashboardLayout/presenter/useDashboardLayoutPresenter.js\";\nimport { toColumnIndex } from \"./dashboardLayout/toColumnIndex.js\";\nimport { AddWidgetDrawer } from \"./components/addWidgetDrawer/AddWidgetDrawer.js\";\nimport type { DrawerWidget } from \"./components/addWidgetDrawer/types.js\";\nimport { DashboardToolbar } from \"./components/DashboardToolbar.js\";\nimport { EditableColumns } from \"./components/layout/EditableColumns.js\";\nimport { StaticColumns } from \"./components/layout/StaticColumns.js\";\nimport { useColumnsThatFit } from \"./components/layout/useColumnsThatFit.js\";\nimport { useWidgetPortals } from \"./components/layout/useWidgetPortals.js\";\nimport { DASHBOARD_MAX_WIDTH } from \"./components/layout/layoutConstants.js\";\n\nconst WelcomeBase = () => {\n const { identity } = useSecurity();\n const { widgets } = useAdminConfig();\n const presenter = useDashboardLayoutPresenter();\n\n // Map of widget name -> React element, so the presenter can deal purely in names.\n const elements = useMemo(() => {\n const map = new Map<string, React.ReactElement>();\n widgets.forEach(widget => map.set(widget.name, widget.element));\n return map;\n }, [widgets]);\n\n // Widget titles, for the cards' labels while customizing.\n const titles = useMemo(() => {\n const map = new Map<string, { title: string }>();\n widgets.forEach(widget => map.set(widget.name, { title: widget.title ?? widget.name }));\n return map;\n }, [widgets]);\n\n // Re-initialize the presenter when the user or the set of registered widgets changes.\n const widgetsKey = widgets.map(w => `${w.name}:${toColumnIndex(w.column)}`).join(\"|\");\n useEffect(() => {\n const inputs = widgets.map(widget => ({\n name: widget.name,\n column: toColumnIndex(widget.column)\n }));\n presenter.init(identity!.id, inputs);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [identity?.id, widgetsKey]);\n\n // The presenter is a singleton; leaving the dashboard resets per-visit state like Customize mode.\n useEffect(() => {\n return () => presenter.dispose();\n }, [presenter]);\n\n // A reactive component re-renders when anything it reads from `vm` changes.\n const { vm } = presenter;\n\n const [drawerOpen, setDrawerOpen] = useState(false);\n const openDrawer = () => setDrawerOpen(true);\n const drawerWidgets: DrawerWidget[] = widgets.map(widget => {\n // Same clamping the presenter applies, so \"(default)\" marks the column it would pick.\n const registeredColumn = toColumnIndex(widget.column);\n return {\n name: widget.name,\n title: widget.title ?? widget.name,\n description: widget.description,\n group: widget.group,\n preview: widget.preview,\n added: !vm.hidden.includes(widget.name),\n defaultColumn: Math.min(registeredColumn, vm.columnCount - 1)\n };\n });\n\n const { ref: containerRef, visibleCount, allFit } = useColumnsThatFit(vm.columnCount);\n const placed = vm.columns.flat();\n const { slots, portals } = useWidgetPortals(placed, elements);\n\n // Customize mode needs every chosen column on screen; too narrow, and it isn't offered.\n const editing = vm.editing && allFit;\n\n let subtitle = \"Your dashboard. Arrange the widgets however you work best.\";\n let columns = <StaticColumns columns={vm.columns} visibleCount={visibleCount} slots={slots} />;\n if (editing) {\n subtitle = \"Drag widgets to rearrange them, and click Done when you're finished.\";\n columns = (\n <EditableColumns\n vm={vm}\n slots={slots}\n titles={titles}\n presenter={presenter}\n onBrowseWidgets={openDrawer}\n />\n );\n }\n\n return (\n <DndProvider backend={HTML5Backend}>\n <div className={\"my-xxl\"} ref={containerRef}>\n {portals}\n <div\n className={\"mb-xl flex items-center justify-between gap-lg\"}\n style={{ maxWidth: DASHBOARD_MAX_WIDTH }}\n >\n <div>\n <Heading\n level={3}\n >{`Hi ${identity!.displayName}, what are we doing today?`}</Heading>\n <Text as={\"div\"} size={\"md\"} className={\"mt-xs text-neutral-strong\"}>\n {subtitle}\n </Text>\n </div>\n <div className={\"flex flex-none items-center gap-sm\"}>\n <DashboardToolbar\n vm={vm}\n editing={editing}\n canCustomize={allFit}\n presenter={presenter}\n onAddWidget={openDrawer}\n />\n </div>\n </div>\n {columns}\n <AddWidgetDrawer\n open={drawerOpen}\n onOpenChange={setDrawerOpen}\n widgets={drawerWidgets}\n columnCount={vm.columnCount}\n presenter={presenter}\n />\n </div>\n </DndProvider>\n );\n};\n\nconst Welcome = createReactiveComponent(WelcomeBase);\n\nexport default Welcome;\n"],"names":["WelcomeBase","identity","useSecurity","widgets","useAdminConfig","presenter","useDashboardLayoutPresenter","elements","useMemo","map","Map","widget","titles","widgetsKey","w","toColumnIndex","useEffect","inputs","vm","drawerOpen","setDrawerOpen","useState","openDrawer","drawerWidgets","registeredColumn","Math","containerRef","visibleCount","allFit","useColumnsThatFit","placed","slots","portals","useWidgetPortals","editing","subtitle","columns","StaticColumns","EditableColumns","DndProvider","HTML5Backend","DASHBOARD_MAX_WIDTH","Heading","Text","DashboardToolbar","AddWidgetDrawer","Welcome","createReactiveComponent"],"mappings":";;;;;;;;;;;;;;AAsBA,MAAMA,cAAc;IAChB,MAAM,EAAEC,QAAQ,EAAE,GAAGC;IACrB,MAAM,EAAEC,OAAO,EAAE,GAAGC;IACpB,MAAMC,YAAYC;IAGlB,MAAMC,WAAWC,QAAQ;QACrB,MAAMC,MAAM,IAAIC;QAChBP,QAAQ,OAAO,CAACQ,CAAAA,SAAUF,IAAI,GAAG,CAACE,OAAO,IAAI,EAAEA,OAAO,OAAO;QAC7D,OAAOF;IACX,GAAG;QAACN;KAAQ;IAGZ,MAAMS,SAASJ,QAAQ;QACnB,MAAMC,MAAM,IAAIC;QAChBP,QAAQ,OAAO,CAACQ,CAAAA,SAAUF,IAAI,GAAG,CAACE,OAAO,IAAI,EAAE;gBAAE,OAAOA,OAAO,KAAK,IAAIA,OAAO,IAAI;YAAC;QACpF,OAAOF;IACX,GAAG;QAACN;KAAQ;IAGZ,MAAMU,aAAaV,QAAQ,GAAG,CAACW,CAAAA,IAAK,GAAGA,EAAE,IAAI,CAAC,CAAC,EAAEC,cAAcD,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC;IACjFE,UAAU;QACN,MAAMC,SAASd,QAAQ,GAAG,CAACQ,CAAAA,SAAW;gBAClC,MAAMA,OAAO,IAAI;gBACjB,QAAQI,cAAcJ,OAAO,MAAM;YACvC;QACAN,UAAU,IAAI,CAACJ,SAAU,EAAE,EAAEgB;IAEjC,GAAG;QAAChB,UAAU;QAAIY;KAAW;IAG7BG,UAAU,IACC,IAAMX,UAAU,OAAO,IAC/B;QAACA;KAAU;IAGd,MAAM,EAAEa,EAAE,EAAE,GAAGb;IAEf,MAAM,CAACc,YAAYC,cAAc,GAAGC,SAAS;IAC7C,MAAMC,aAAa,IAAMF,cAAc;IACvC,MAAMG,gBAAgCpB,QAAQ,GAAG,CAACQ,CAAAA;QAE9C,MAAMa,mBAAmBT,cAAcJ,OAAO,MAAM;QACpD,OAAO;YACH,MAAMA,OAAO,IAAI;YACjB,OAAOA,OAAO,KAAK,IAAIA,OAAO,IAAI;YAClC,aAAaA,OAAO,WAAW;YAC/B,OAAOA,OAAO,KAAK;YACnB,SAASA,OAAO,OAAO;YACvB,OAAO,CAACO,GAAG,MAAM,CAAC,QAAQ,CAACP,OAAO,IAAI;YACtC,eAAec,KAAK,GAAG,CAACD,kBAAkBN,GAAG,WAAW,GAAG;QAC/D;IACJ;IAEA,MAAM,EAAE,KAAKQ,YAAY,EAAEC,YAAY,EAAEC,MAAM,EAAE,GAAGC,kBAAkBX,GAAG,WAAW;IACpF,MAAMY,SAASZ,GAAG,OAAO,CAAC,IAAI;IAC9B,MAAM,EAAEa,KAAK,EAAEC,OAAO,EAAE,GAAGC,iBAAiBH,QAAQvB;IAGpD,MAAM2B,UAAUhB,GAAG,OAAO,IAAIU;IAE9B,IAAIO,WAAW;IACf,IAAIC,UAAU,WAAVA,GAAU,oBAACC,eAAaA;QAAC,SAASnB,GAAG,OAAO;QAAE,cAAcS;QAAc,OAAOI;;IACrF,IAAIG,SAAS;QACTC,WAAW;QACXC,UAAU,WAAVA,GACI,oBAACE,iBAAeA;YACZ,IAAIpB;YACJ,OAAOa;YACP,QAAQnB;YACR,WAAWP;YACX,iBAAiBiB;;IAG7B;IAEA,OAAO,WAAP,GACI,oBAACiB,aAAWA;QAAC,SAASC;qBAClB,oBAAC;QAAI,WAAW;QAAU,KAAKd;OAC1BM,SAAAA,WAAAA,GACD,oBAAC;QACG,WAAW;QACX,OAAO;YAAE,UAAUS;QAAoB;qBAEvC,oBAAC,2BACG,oBAACC,SAAOA;QACJ,OAAO;OACT,CAAC,GAAG,EAAEzC,SAAU,WAAW,CAAC,0BAA0B,CAAC,iBACzD,oBAAC0C,MAAIA;QAAC,IAAI;QAAO,MAAM;QAAM,WAAW;OACnCR,YAAAA,WAAAA,GAGT,oBAAC;QAAI,WAAW;qBACZ,oBAACS,kBAAgBA;QACb,IAAI1B;QACJ,SAASgB;QACT,cAAcN;QACd,WAAWvB;QACX,aAAaiB;UAIxBc,SAAAA,WAAAA,GACD,oBAACS,iBAAeA;QACZ,MAAM1B;QACN,cAAcC;QACd,SAASG;QACT,aAAaL,GAAG,WAAW;QAC3B,WAAWb;;AAK/B;AAEA,MAAMyC,UAAUC,wBAAwB/C;AAExC,0BAAe8C"}
@@ -0,0 +1,11 @@
1
+ import React from "react";
2
+ import type { DashboardLayoutPresenter } from "../dashboardLayout/presenter/abstractions.js";
3
+ interface DashboardToolbarProps {
4
+ vm: DashboardLayoutPresenter.ViewModel;
5
+ editing: boolean;
6
+ canCustomize: boolean;
7
+ presenter: DashboardLayoutPresenter.Interface;
8
+ onAddWidget: () => void;
9
+ }
10
+ export declare const DashboardToolbar: ({ vm, editing, canCustomize, presenter, onAddWidget }: DashboardToolbarProps) => React.JSX.Element;
11
+ export {};
@@ -0,0 +1,48 @@
1
+ import react from "react";
2
+ import { Button, IconButton, Tooltip } from "@webiny/admin-ui";
3
+ import { ReactComponent } from "@webiny/icons/restart_alt.svg";
4
+ import { ReactComponent as add_svg_ReactComponent } from "@webiny/icons/add.svg";
5
+ import { ReactComponent as dashboard_customize_svg_ReactComponent } from "@webiny/icons/dashboard_customize.svg";
6
+ import { ReactComponent as check_svg_ReactComponent } from "@webiny/icons/check.svg";
7
+ import { ColumnCountControl } from "./dnd/ColumnCountControl.js";
8
+ const DashboardToolbar = ({ vm, editing, canCustomize, presenter, onAddWidget })=>{
9
+ if (editing) return /*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement(ColumnCountControl, {
10
+ columnCount: vm.columnCount,
11
+ disabled: null !== vm.draggingName,
12
+ presenter: presenter
13
+ }), /*#__PURE__*/ react.createElement(Tooltip, {
14
+ content: "Reset to default layout",
15
+ trigger: /*#__PURE__*/ react.createElement(IconButton, {
16
+ variant: "tertiary",
17
+ size: "md",
18
+ icon: /*#__PURE__*/ react.createElement(ReactComponent, null),
19
+ "aria-label": "Reset to default layout",
20
+ onClick: ()=>presenter.resetToDefault()
21
+ })
22
+ }), /*#__PURE__*/ react.createElement(Button, {
23
+ variant: "tertiary",
24
+ text: "Add widget",
25
+ icon: /*#__PURE__*/ react.createElement(add_svg_ReactComponent, null),
26
+ onClick: onAddWidget
27
+ }), /*#__PURE__*/ react.createElement(Button, {
28
+ variant: "primary",
29
+ text: "Done",
30
+ icon: /*#__PURE__*/ react.createElement(check_svg_ReactComponent, null),
31
+ onClick: ()=>presenter.stopEditing()
32
+ }));
33
+ let hint = "Rearrange, add or remove widgets";
34
+ if (!canCustomize) hint = "Make the window wider to customize the dashboard";
35
+ return /*#__PURE__*/ react.createElement(Tooltip, {
36
+ content: hint,
37
+ trigger: /*#__PURE__*/ react.createElement(Button, {
38
+ variant: "tertiary",
39
+ text: "Customize",
40
+ icon: /*#__PURE__*/ react.createElement(dashboard_customize_svg_ReactComponent, null),
41
+ disabled: !canCustomize,
42
+ onClick: ()=>presenter.startEditing()
43
+ })
44
+ });
45
+ };
46
+ export { DashboardToolbar };
47
+
48
+ //# sourceMappingURL=DashboardToolbar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dashboard/components/DashboardToolbar.js","sources":["../../../src/Dashboard/components/DashboardToolbar.tsx"],"sourcesContent":["import React from \"react\";\nimport { Button } from \"@webiny/admin-ui\";\nimport { IconButton } from \"@webiny/admin-ui\";\nimport { Tooltip } from \"@webiny/admin-ui\";\nimport { ReactComponent as RestartAltIcon } from \"@webiny/icons/restart_alt.svg\";\nimport { ReactComponent as AddIcon } from \"@webiny/icons/add.svg\";\nimport { ReactComponent as DashboardCustomizeIcon } from \"@webiny/icons/dashboard_customize.svg\";\nimport { ReactComponent as CheckIcon } from \"@webiny/icons/check.svg\";\nimport { ColumnCountControl } from \"./dnd/ColumnCountControl.js\";\nimport type { DashboardLayoutPresenter } from \"../dashboardLayout/presenter/abstractions.js\";\n\ninterface DashboardToolbarProps {\n vm: DashboardLayoutPresenter.ViewModel;\n // Customize mode is on and every chosen column fits on screen.\n editing: boolean;\n // Every chosen column fits on screen, so Customize mode can be offered.\n canCustomize: boolean;\n presenter: DashboardLayoutPresenter.Interface;\n onAddWidget: () => void;\n}\n\n// Top-right controls: one \"Customize\" button normally, the full editing set in Customize mode.\nexport const DashboardToolbar = ({\n vm,\n editing,\n canCustomize,\n presenter,\n onAddWidget\n}: DashboardToolbarProps) => {\n if (editing) {\n return (\n <>\n <ColumnCountControl\n columnCount={vm.columnCount}\n disabled={vm.draggingName !== null}\n presenter={presenter}\n />\n <Tooltip\n content={\"Reset to default layout\"}\n trigger={\n <IconButton\n variant={\"tertiary\"}\n size={\"md\"}\n icon={<RestartAltIcon />}\n aria-label={\"Reset to default layout\"}\n onClick={() => presenter.resetToDefault()}\n />\n }\n />\n <Button\n variant={\"tertiary\"}\n text={\"Add widget\"}\n icon={<AddIcon />}\n onClick={onAddWidget}\n />\n <Button\n variant={\"primary\"}\n text={\"Done\"}\n icon={<CheckIcon />}\n onClick={() => presenter.stopEditing()}\n />\n </>\n );\n }\n\n let hint = \"Rearrange, add or remove widgets\";\n if (!canCustomize) {\n hint = \"Make the window wider to customize the dashboard\";\n }\n\n return (\n <Tooltip\n content={hint}\n trigger={\n <Button\n variant={\"tertiary\"}\n text={\"Customize\"}\n icon={<DashboardCustomizeIcon />}\n disabled={!canCustomize}\n onClick={() => presenter.startEditing()}\n />\n }\n />\n );\n};\n"],"names":["DashboardToolbar","vm","editing","canCustomize","presenter","onAddWidget","ColumnCountControl","Tooltip","IconButton","RestartAltIcon","Button","AddIcon","CheckIcon","hint","DashboardCustomizeIcon"],"mappings":";;;;;;;AAsBO,MAAMA,mBAAmB,CAAC,EAC7BC,EAAE,EACFC,OAAO,EACPC,YAAY,EACZC,SAAS,EACTC,WAAW,EACS;IACpB,IAAIH,SACA,OAAO,WAAP,GACI,wDACI,oBAACI,oBAAkBA;QACf,aAAaL,GAAG,WAAW;QAC3B,UAAUA,AAAoB,SAApBA,GAAG,YAAY;QACzB,WAAWG;sBAEf,oBAACG,SAAOA;QACJ,SAAS;QACT,uBACI,oBAACC,YAAUA;YACP,SAAS;YACT,MAAM;YACN,oBAAM,oBAACC,gBAAcA;YACrB,cAAY;YACZ,SAAS,IAAML,UAAU,cAAc;;sBAInD,oBAACM,QAAMA;QACH,SAAS;QACT,MAAM;QACN,oBAAM,oBAACC,wBAAOA;QACd,SAASN;sBAEb,oBAACK,QAAMA;QACH,SAAS;QACT,MAAM;QACN,oBAAM,oBAACE,0BAASA;QAChB,SAAS,IAAMR,UAAU,WAAW;;IAMpD,IAAIS,OAAO;IACX,IAAI,CAACV,cACDU,OAAO;IAGX,OAAO,WAAP,GACI,oBAACN,SAAOA;QACJ,SAASM;QACT,uBACI,oBAACH,QAAMA;YACH,SAAS;YACT,MAAM;YACN,oBAAM,oBAACI,wCAAsBA;YAC7B,UAAU,CAACX;YACX,SAAS,IAAMC,UAAU,YAAY;;;AAKzD"}
@@ -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 AddToColumnMenuProps {
5
+ widget: DrawerWidget;
6
+ columnCount: number;
7
+ presenter: DashboardLayoutPresenter.Interface;
8
+ }
9
+ export declare const AddToColumnMenu: ({ widget, columnCount, presenter }: AddToColumnMenuProps) => React.JSX.Element;
10
+ export {};
@@ -0,0 +1,30 @@
1
+ import react from "react";
2
+ import { Button, DropdownMenu } from "@webiny/admin-ui";
3
+ import { ReactComponent } from "@webiny/icons/expand_more.svg";
4
+ const AddToColumnMenu = ({ widget, columnCount, presenter })=>{
5
+ const columns = Array.from({
6
+ length: columnCount
7
+ }, (_, index)=>index);
8
+ return /*#__PURE__*/ react.createElement(DropdownMenu, {
9
+ trigger: /*#__PURE__*/ react.createElement(Button, {
10
+ size: "sm",
11
+ variant: "tertiary",
12
+ text: "Add",
13
+ icon: /*#__PURE__*/ react.createElement(ReactComponent, null),
14
+ iconPosition: "end"
15
+ })
16
+ }, /*#__PURE__*/ react.createElement(DropdownMenu.Label, {
17
+ text: "Add to"
18
+ }), columns.map((index)=>{
19
+ let text = `Column ${index + 1}`;
20
+ if (index === widget.defaultColumn) text = `${text} (default)`;
21
+ return /*#__PURE__*/ react.createElement(DropdownMenu.Item, {
22
+ key: index,
23
+ text: text,
24
+ onClick: ()=>presenter.addWidget(widget.name, index)
25
+ });
26
+ }));
27
+ };
28
+ export { AddToColumnMenu };
29
+
30
+ //# sourceMappingURL=AddToColumnMenu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dashboard/components/addWidgetDrawer/AddToColumnMenu.js","sources":["../../../../src/Dashboard/components/addWidgetDrawer/AddToColumnMenu.tsx"],"sourcesContent":["import React from \"react\";\nimport { Button } from \"@webiny/admin-ui\";\nimport { DropdownMenu } from \"@webiny/admin-ui\";\nimport { ReactComponent as ExpandMoreIcon } from \"@webiny/icons/expand_more.svg\";\nimport type { DashboardLayoutPresenter } from \"../../dashboardLayout/presenter/abstractions.js\";\nimport type { DrawerWidget } from \"./types.js\";\n\ninterface AddToColumnMenuProps {\n widget: DrawerWidget;\n columnCount: number;\n presenter: DashboardLayoutPresenter.Interface;\n}\n\n// One item per current column; the widget lands at the bottom of the chosen one.\nexport const AddToColumnMenu = ({ widget, columnCount, presenter }: AddToColumnMenuProps) => {\n const columns = Array.from({ length: columnCount }, (_, index) => index);\n\n return (\n <DropdownMenu\n trigger={\n <Button\n size={\"sm\"}\n variant={\"tertiary\"}\n text={\"Add\"}\n icon={<ExpandMoreIcon />}\n iconPosition={\"end\"}\n />\n }\n >\n <DropdownMenu.Label text={\"Add to\"} />\n {columns.map(index => {\n let text = `Column ${index + 1}`;\n if (index === widget.defaultColumn) {\n text = `${text} (default)`;\n }\n return (\n <DropdownMenu.Item\n key={index}\n text={text}\n onClick={() => presenter.addWidget(widget.name, index)}\n />\n );\n })}\n </DropdownMenu>\n );\n};\n"],"names":["AddToColumnMenu","widget","columnCount","presenter","columns","Array","_","index","DropdownMenu","Button","ExpandMoreIcon","text"],"mappings":";;;AAcO,MAAMA,kBAAkB,CAAC,EAAEC,MAAM,EAAEC,WAAW,EAAEC,SAAS,EAAwB;IACpF,MAAMC,UAAUC,MAAM,IAAI,CAAC;QAAE,QAAQH;IAAY,GAAG,CAACI,GAAGC,QAAUA;IAElE,OAAO,WAAP,GACI,oBAACC,cAAYA;QACT,uBACI,oBAACC,QAAMA;YACH,MAAM;YACN,SAAS;YACT,MAAM;YACN,oBAAM,oBAACC,gBAAcA;YACrB,cAAc;;qBAItB,oBAACF,aAAa,KAAK;QAAC,MAAM;QACzBJ,QAAQ,GAAG,CAACG,CAAAA;QACT,IAAII,OAAO,CAAC,OAAO,EAAEJ,QAAQ,GAAG;QAChC,IAAIA,UAAUN,OAAO,aAAa,EAC9BU,OAAO,GAAGA,KAAK,UAAU,CAAC;QAE9B,OAAO,WAAP,GACI,oBAACH,aAAa,IAAI;YACd,KAAKD;YACL,MAAMI;YACN,SAAS,IAAMR,UAAU,SAAS,CAACF,OAAO,IAAI,EAAEM;;IAG5D;AAGZ"}
@@ -0,0 +1,12 @@
1
+ import React from "react";
2
+ import type { DashboardLayoutPresenter } from "../../dashboardLayout/presenter/abstractions.js";
3
+ import type { DrawerWidget } from "./types.js";
4
+ interface AddWidgetDrawerProps {
5
+ open: boolean;
6
+ onOpenChange: (open: boolean) => void;
7
+ widgets: DrawerWidget[];
8
+ columnCount: number;
9
+ presenter: DashboardLayoutPresenter.Interface;
10
+ }
11
+ export declare const AddWidgetDrawer: ({ open, onOpenChange, widgets, columnCount, presenter }: AddWidgetDrawerProps) => React.JSX.Element;
12
+ export {};
@@ -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 {};