@webiny/app-website-builder 6.5.0-beta.4 → 6.5.0-beta.5

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 (55) hide show
  1. package/BaseEditor/config/Sidebar/Tab.d.ts +0 -4
  2. package/BaseEditor/config/Sidebar/Tab.js +5 -21
  3. package/BaseEditor/config/Sidebar/Tab.js.map +1 -1
  4. package/BaseEditor/defaultConfig/Content/Preview/DropZoneManager.js.map +1 -1
  5. package/BaseEditor/defaultConfig/Content/Preview/Iframe.d.ts +2 -2
  6. package/BaseEditor/defaultConfig/Content/Preview/Overlays/ElementOverlays.d.ts +2 -2
  7. package/BaseEditor/defaultConfig/DocumentStateEditor/DocumentStateEditor.d.ts +2 -2
  8. package/BaseEditor/defaultConfig/Sidebar/ElementSettings/ElementSettingsGroup.js +2 -5
  9. package/BaseEditor/defaultConfig/Sidebar/ElementSettings/ElementSettingsGroup.js.map +1 -1
  10. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Background/BackgroundColor.d.ts +6 -2
  11. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Background/BackgroundImage.d.ts +6 -2
  12. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Background/BackgroundImage.js +8 -1
  13. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Background/BackgroundImage.js.map +1 -1
  14. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Background/BackgroundPosition.d.ts +6 -2
  15. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Background/BackgroundScaling.d.ts +6 -2
  16. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Border/BorderColor.d.ts +2 -2
  17. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Border/BorderRadius.d.ts +2 -2
  18. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Border/BorderStyle.d.ts +2 -2
  19. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Border/BorderWidth.d.ts +2 -2
  20. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Layout/Alignment.d.ts +6 -2
  21. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Layout/LengthWithUnitInput.d.ts +2 -2
  22. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/MarginPadding/Margin.d.ts +2 -2
  23. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/MarginPadding/Padding.d.ts +2 -2
  24. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Visibility/Visibility.d.ts +2 -2
  25. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/SidebarRow.js +1 -1
  26. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/SidebarRow.js.map +1 -1
  27. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/StyleSettingsGroup.js +2 -5
  28. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/StyleSettingsGroup.js.map +1 -1
  29. package/BaseEditor/defaultConfig/Toolbar/Navigator/Navigator.d.ts +2 -2
  30. package/DocumentEditor/DocumentEditor.d.ts +2 -2
  31. package/DocumentEditor/StateInspector.d.ts +4 -2
  32. package/ecommerce/components/ResourcePage.d.ts +6 -2
  33. package/ecommerce/components/ResourcesList.d.ts +4 -4
  34. package/ecommerce/components/ResourcesPicker.d.ts +9 -4
  35. package/editorSdk/CommandBus.js.map +1 -1
  36. package/package.json +31 -31
  37. package/presentation/pages/CreatePage/CreatePageDialog.d.ts +2 -2
  38. package/presentation/pages/PageEditor/TopBar/PageSettingsDrawer.d.ts +2 -2
  39. package/presentation/pages/PageList/PageListPresenter.test.js.map +1 -1
  40. package/presentation/pages/PageList/components/BulkActions/BulkActionDelete.d.ts +2 -2
  41. package/presentation/pages/PageList/components/BulkActions/BulkActionDuplicate.d.ts +2 -2
  42. package/presentation/pages/PageList/components/BulkActions/BulkActionMovePage.d.ts +2 -2
  43. package/presentation/pages/PageList/components/BulkActions/BulkActionPublish.d.ts +2 -2
  44. package/presentation/pages/PageList/components/BulkActions/BulkActionUnpublish.d.ts +2 -2
  45. package/presentation/pages/PageList/components/DocumentList.d.ts +2 -2
  46. package/presentation/pages/PageList/components/Table/Table.d.ts +2 -2
  47. package/presentation/pages/TrashBin/WbTrashBin.d.ts +2 -2
  48. package/presentation/redirects/RedirectList/RedirectListPresenter.js.map +1 -1
  49. package/presentation/redirects/RedirectList/RedirectListPresenter.test.js.map +1 -1
  50. package/presentation/redirects/RedirectList/components/BulkActionDelete.d.ts +2 -2
  51. package/presentation/redirects/RedirectList/components/BulkActionMove.d.ts +2 -2
  52. package/presentation/redirects/RedirectList/components/CreateRedirectDialog.d.ts +2 -2
  53. package/presentation/redirects/RedirectList/components/DocumentList.d.ts +2 -2
  54. package/presentation/redirects/RedirectList/components/EditRedirectDialog.d.ts +2 -2
  55. package/presentation/redirects/RedirectList/components/Table/Table.d.ts +2 -2
@@ -1,8 +1,4 @@
1
1
  import React from "react";
2
- export declare const TabContainer: import("@emotion/styled").StyledComponent<{
3
- theme?: import("@emotion/react").Theme;
4
- as?: React.ElementType;
5
- }, React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
6
2
  export interface TabProps {
7
3
  name: string;
8
4
  label: string;
@@ -1,31 +1,15 @@
1
1
  import react from "react";
2
- import styled from "@emotion/styled";
3
- import { SegmentedControl } from "@webiny/admin-ui";
4
- const TabContainer = styled("div")({
5
- display: "flex",
6
- position: "relative",
7
- flexDirection: "column",
8
- height: "calc(100vh - 44px - 49px)",
9
- overflowY: "auto",
10
- "&::-webkit-scrollbar": {
11
- width: 1
12
- },
13
- "&::-webkit-scrollbar-track": {
14
- boxShadow: "inset 0 0 6px rgba(0, 0, 0, 0.3)"
15
- },
16
- "&::-webkit-scrollbar-thumb": {
17
- backgroundColor: "darkgrey",
18
- outline: "1px solid slategrey"
19
- }
20
- });
2
+ import { FillViewportHeight, ScrollArea, SegmentedControl } from "@webiny/admin-ui";
21
3
  const Tab = ({ name, label, icon, disabled, element, visible })=>/*#__PURE__*/ react.createElement(SegmentedControl.Tabs.Tab, {
22
4
  value: name,
23
5
  trigger: label,
24
6
  icon: icon,
25
7
  disabled: disabled,
26
8
  visible: visible,
27
- content: /*#__PURE__*/ react.createElement(TabContainer, null, element)
9
+ content: /*#__PURE__*/ react.createElement(FillViewportHeight, null, /*#__PURE__*/ react.createElement(ScrollArea, {
10
+ className: "h-full"
11
+ }, element))
28
12
  });
29
- export { Tab, TabContainer };
13
+ export { Tab };
30
14
 
31
15
  //# sourceMappingURL=Tab.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BaseEditor/config/Sidebar/Tab.js","sources":["../../../../src/BaseEditor/config/Sidebar/Tab.tsx"],"sourcesContent":["import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport { SegmentedControl } from \"@webiny/admin-ui\";\n\nexport const TabContainer = styled(\"div\")({\n display: \"flex\",\n position: \"relative\",\n flexDirection: \"column\",\n height: \"calc(100vh - 44px - 49px)\", // Subtract top-bar and tab-header height\n overflowY: \"auto\",\n // Style scrollbar\n \"&::-webkit-scrollbar\": {\n width: 1\n },\n \"&::-webkit-scrollbar-track\": {\n boxShadow: \"inset 0 0 6px rgba(0, 0, 0, 0.3)\"\n },\n \"&::-webkit-scrollbar-thumb\": {\n backgroundColor: \"darkgrey\",\n outline: \"1px solid slategrey\"\n }\n});\n\nexport interface TabProps {\n name: string;\n label: string;\n icon?: React.ReactElement;\n element: React.JSX.Element;\n disabled?: boolean;\n visible?: boolean;\n}\n\nexport const Tab = ({ name, label, icon, disabled, element, visible }: TabProps) => {\n return (\n <SegmentedControl.Tabs.Tab\n value={name}\n trigger={label}\n icon={icon}\n disabled={disabled}\n visible={visible}\n content={<TabContainer>{element}</TabContainer>}\n />\n );\n};\n"],"names":["TabContainer","styled","Tab","name","label","icon","disabled","element","visible","SegmentedControl"],"mappings":";;;AAIO,MAAMA,eAAeC,OAAO,OAAO;IACtC,SAAS;IACT,UAAU;IACV,eAAe;IACf,QAAQ;IACR,WAAW;IAEX,wBAAwB;QACpB,OAAO;IACX;IACA,8BAA8B;QAC1B,WAAW;IACf;IACA,8BAA8B;QAC1B,iBAAiB;QACjB,SAAS;IACb;AACJ;AAWO,MAAMC,MAAM,CAAC,EAAEC,IAAI,EAAEC,KAAK,EAAEC,IAAI,EAAEC,QAAQ,EAAEC,OAAO,EAAEC,OAAO,EAAY,GACpE,WAAP,GACI,oBAACC,iBAAiB,IAAI,CAAC,GAAG;QACtB,OAAON;QACP,SAASC;QACT,MAAMC;QACN,UAAUC;QACV,SAASE;QACT,uBAAS,oBAACR,cAAYA,MAAEO"}
1
+ {"version":3,"file":"BaseEditor/config/Sidebar/Tab.js","sources":["../../../../src/BaseEditor/config/Sidebar/Tab.tsx"],"sourcesContent":["import React from \"react\";\nimport { FillViewportHeight, ScrollArea, SegmentedControl } from \"@webiny/admin-ui\";\n\nexport interface TabProps {\n name: string;\n label: string;\n icon?: React.ReactElement;\n element: React.JSX.Element;\n disabled?: boolean;\n visible?: boolean;\n}\n\nexport const Tab = ({ name, label, icon, disabled, element, visible }: TabProps) => {\n return (\n <SegmentedControl.Tabs.Tab\n value={name}\n trigger={label}\n icon={icon}\n disabled={disabled}\n visible={visible}\n // Same pattern as the Insert panel: FillViewportHeight sizes the region to the space\n // from its own top edge down to the viewport bottom (no hardcoded offsets), and the\n // ScrollArea scrolls the content within it.\n content={\n <FillViewportHeight>\n <ScrollArea className={\"h-full\"}>{element}</ScrollArea>\n </FillViewportHeight>\n }\n />\n );\n};\n"],"names":["Tab","name","label","icon","disabled","element","visible","SegmentedControl","FillViewportHeight","ScrollArea"],"mappings":";;AAYO,MAAMA,MAAM,CAAC,EAAEC,IAAI,EAAEC,KAAK,EAAEC,IAAI,EAAEC,QAAQ,EAAEC,OAAO,EAAEC,OAAO,EAAY,GACpE,WAAP,GACI,oBAACC,iBAAiB,IAAI,CAAC,GAAG;QACtB,OAAON;QACP,SAASC;QACT,MAAMC;QACN,UAAUC;QACV,SAASE;QAIT,uBACI,oBAACE,oBAAkBA,MAAAA,WAAAA,GACf,oBAACC,YAAUA;YAAC,WAAW;WAAWJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"BaseEditor/defaultConfig/Content/Preview/DropZoneManager.js","sources":["../../../../../src/BaseEditor/defaultConfig/Content/Preview/DropZoneManager.ts"],"sourcesContent":["import type { Box } from \"./Box.js\";\n\ntype DropPosition = number | null;\ntype MatchChangeCallback = (hasMatch: boolean) => void;\n\nexport interface DropZoneProximity {\n box: Box;\n position: DropPosition;\n}\n\ninterface DropzoneEntry {\n id: string;\n box: Box;\n canAccept?: () => boolean;\n onProximityChange: (proximity: DropZoneProximity | null) => void;\n}\n\nexport class DropZoneManager {\n private zones = new Map<string, DropzoneEntry>();\n private currentTargetId: string | null = null;\n private currentPosition: DropPosition = null;\n private animationFrame: number | null = null;\n private currentBox: Box | null = null;\n private matchCallbacks = new Set<MatchChangeCallback>();\n\n constructor(private mouse: { x: number; y: number }) {}\n\n register(entry: DropzoneEntry) {\n if (entry.id === \"root\") {\n return;\n }\n\n this.zones.set(entry.id, entry);\n }\n\n unregister(id: string) {\n this.zones.delete(id);\n }\n\n subscribeToMatchChange(cb: MatchChangeCallback): () => void {\n this.matchCallbacks.add(cb);\n return () => this.matchCallbacks.delete(cb);\n }\n\n start() {\n const runDropzoneLoop = () => {\n this.tick();\n this.animationFrame = requestAnimationFrame(runDropzoneLoop);\n };\n this.animationFrame = requestAnimationFrame(runDropzoneLoop);\n }\n\n stop() {\n if (this.animationFrame) {\n cancelAnimationFrame(this.animationFrame);\n }\n }\n\n getLastMatchedPosition() {\n if (!this.currentBox) {\n return null;\n }\n\n return {\n parentId: this.currentBox.parentId,\n slot: this.currentBox.parentSlot,\n index: this.currentBox.parentIndex + (this.currentPosition ?? 0)\n };\n }\n\n tick() {\n const scrollYOffset = this.getScrollOffset();\n const threshold = 10;\n const mouseX = this.mouse.x;\n const mouseY = this.mouse.y + scrollYOffset;\n\n let matchedId: string | null = null;\n let matchedPosition: DropPosition = null;\n let matchedBox: Box | null = null;\n\n // Collect all candidate matches with their canAccept callback.\n const candidates: { id: string; box: Box; position: number; canAccept?: () => boolean }[] =\n [];\n\n for (const [id, { box, canAccept }] of this.zones) {\n const isWithinX = mouseX >= box.left && mouseX <= box.right;\n\n if (!isWithinX) {\n continue;\n }\n\n if (Math.abs(mouseY - box.top) <= threshold) {\n candidates.push({ id, box, position: 0, canAccept });\n }\n\n if (Math.abs(mouseY - box.bottom) <= threshold) {\n candidates.push({ id, box, position: 1, canAccept });\n }\n }\n\n if (candidates.length > 0) {\n // Filter to only eligible candidates.\n const eligible = candidates.filter(c => !c.canAccept || c.canAccept());\n\n if (eligible.length > 0) {\n const uniqueDepths = [...new Set(eligible.map(c => c.box.depth))].sort(\n (a, b) => b - a\n );\n\n if (uniqueDepths.length === 1) {\n const winner = eligible[0];\n matchedId = winner.id;\n matchedPosition = winner.position;\n matchedBox = winner.box;\n } else {\n // Use X position to select depth band among eligible candidates only.\n let rangeLeft = Infinity;\n let rangeRight = -Infinity;\n for (const c of eligible) {\n rangeLeft = Math.min(rangeLeft, c.box.left);\n rangeRight = Math.max(rangeRight, c.box.right);\n }\n\n const centerX = (rangeLeft + rangeRight) / 2;\n const halfWidth = (rangeRight - rangeLeft) / 2;\n\n // 0 at center, 1 at edges.\n const distFromCenter =\n halfWidth > 0 ? Math.abs(mouseX - centerX) / halfWidth : 0;\n\n // Map distance to depth index: center → 0 (deepest), edges → last (shallowest).\n const depthIndex = Math.min(\n Math.floor(distFromCenter * uniqueDepths.length),\n uniqueDepths.length - 1\n );\n\n const winner = eligible.find(c => c.box.depth === uniqueDepths[depthIndex]);\n if (winner) {\n matchedId = winner.id;\n matchedPosition = winner.position;\n matchedBox = winner.box;\n }\n }\n }\n }\n\n if (matchedId !== this.currentTargetId || matchedPosition !== this.currentPosition) {\n this.currentTargetId = matchedId;\n this.currentPosition = matchedPosition;\n this.currentBox = matchedBox;\n\n this.matchCallbacks.forEach(cb => cb(matchedId !== null));\n\n for (const [id, entry] of this.zones) {\n const isTarget = id === matchedId;\n entry.onProximityChange(\n isTarget ? { box: matchedBox!, position: matchedPosition } : null\n );\n }\n }\n }\n\n private getScrollOffset() {\n const container = document.getElementById(\"preview-container\");\n if (!container) {\n return 0;\n }\n\n return container.scrollTop;\n }\n}\n"],"names":["DropZoneManager","mouse","Map","Set","entry","id","cb","runDropzoneLoop","requestAnimationFrame","cancelAnimationFrame","scrollYOffset","threshold","mouseX","mouseY","matchedId","matchedPosition","matchedBox","candidates","box","canAccept","isWithinX","Math","eligible","c","uniqueDepths","a","b","winner","rangeLeft","Infinity","rangeRight","centerX","halfWidth","distFromCenter","depthIndex","isTarget","container","document"],"mappings":"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"}
1
+ {"version":3,"file":"BaseEditor/defaultConfig/Content/Preview/DropZoneManager.js","sources":["../../../../../src/BaseEditor/defaultConfig/Content/Preview/DropZoneManager.ts"],"sourcesContent":["import type { Box } from \"./Box.js\";\n\ntype DropPosition = number | null;\ntype MatchChangeCallback = (hasMatch: boolean) => void;\n\nexport interface DropZoneProximity {\n box: Box;\n position: DropPosition;\n}\n\ninterface DropzoneEntry {\n id: string;\n box: Box;\n canAccept?: () => boolean;\n onProximityChange: (proximity: DropZoneProximity | null) => void;\n}\n\nexport class DropZoneManager {\n private zones = new Map<string, DropzoneEntry>();\n private currentTargetId: string | null = null;\n private currentPosition: DropPosition = null;\n private animationFrame: number | null = null;\n private currentBox: Box | null = null;\n private matchCallbacks = new Set<MatchChangeCallback>();\n\n constructor(private mouse: { x: number; y: number }) {}\n\n register(entry: DropzoneEntry) {\n if (entry.id === \"root\") {\n return;\n }\n\n this.zones.set(entry.id, entry);\n }\n\n unregister(id: string) {\n this.zones.delete(id);\n }\n\n subscribeToMatchChange(cb: MatchChangeCallback): () => void {\n this.matchCallbacks.add(cb);\n return () => this.matchCallbacks.delete(cb);\n }\n\n start() {\n const runDropzoneLoop = () => {\n this.tick();\n this.animationFrame = requestAnimationFrame(runDropzoneLoop);\n };\n this.animationFrame = requestAnimationFrame(runDropzoneLoop);\n }\n\n stop() {\n if (this.animationFrame) {\n cancelAnimationFrame(this.animationFrame);\n }\n }\n\n getLastMatchedPosition() {\n if (!this.currentBox) {\n return null;\n }\n\n return {\n parentId: this.currentBox.parentId,\n slot: this.currentBox.parentSlot,\n index: this.currentBox.parentIndex + (this.currentPosition ?? 0)\n };\n }\n\n tick() {\n const scrollYOffset = this.getScrollOffset();\n const threshold = 10;\n const mouseX = this.mouse.x;\n const mouseY = this.mouse.y + scrollYOffset;\n\n let matchedId: string | null = null;\n let matchedPosition: DropPosition = null;\n let matchedBox: Box | null = null;\n\n // Collect all candidate matches with their canAccept callback.\n const candidates: { id: string; box: Box; position: number; canAccept?: () => boolean }[] =\n [];\n\n for (const [id, { box, canAccept }] of this.zones) {\n const isWithinX = mouseX >= box.left && mouseX <= box.right;\n\n if (!isWithinX) {\n continue;\n }\n\n if (Math.abs(mouseY - box.top) <= threshold) {\n candidates.push({ id, box, position: 0, canAccept });\n }\n\n if (Math.abs(mouseY - box.bottom) <= threshold) {\n candidates.push({ id, box, position: 1, canAccept });\n }\n }\n\n if (candidates.length > 0) {\n // Filter to only eligible candidates.\n const eligible = candidates.filter(c => !c.canAccept || c.canAccept());\n\n if (eligible.length > 0) {\n const uniqueDepths = [...new Set(eligible.map(c => c.box.depth))].sort(\n (a, b) => b - a\n );\n\n if (uniqueDepths.length === 1) {\n const winner = eligible[0];\n matchedId = winner.id;\n matchedPosition = winner.position;\n matchedBox = winner.box;\n } else {\n // Use X position to select depth band among eligible candidates only.\n let rangeLeft = Infinity;\n let rangeRight = -Infinity;\n for (const c of eligible) {\n rangeLeft = Math.min(rangeLeft, c.box.left);\n rangeRight = Math.max(rangeRight, c.box.right);\n }\n\n const centerX = (rangeLeft + rangeRight) / 2;\n const halfWidth = (rangeRight - rangeLeft) / 2;\n\n // 0 at center, 1 at edges.\n const distFromCenter =\n halfWidth > 0 ? Math.abs(mouseX - centerX) / halfWidth : 0;\n\n // Map distance to depth index: center → 0 (deepest), edges → last (shallowest).\n const depthIndex = Math.min(\n Math.floor(distFromCenter * uniqueDepths.length),\n uniqueDepths.length - 1\n );\n\n const winner = eligible.find(c => c.box.depth === uniqueDepths[depthIndex]);\n if (winner) {\n matchedId = winner.id;\n matchedPosition = winner.position;\n matchedBox = winner.box;\n }\n }\n }\n }\n\n if (matchedId !== this.currentTargetId || matchedPosition !== this.currentPosition) {\n this.currentTargetId = matchedId;\n this.currentPosition = matchedPosition;\n this.currentBox = matchedBox;\n\n this.matchCallbacks.forEach(cb => cb(matchedId !== null));\n\n for (const [id, entry] of this.zones) {\n const isTarget = id === matchedId;\n entry.onProximityChange(\n isTarget ? { box: matchedBox!, position: matchedPosition } : null\n );\n }\n }\n }\n\n private getScrollOffset() {\n const container = document.getElementById(\"preview-container\");\n if (!container) {\n return 0;\n }\n\n return container.scrollTop;\n }\n}\n"],"names":["DropZoneManager","mouse","Map","Set","entry","id","cb","runDropzoneLoop","requestAnimationFrame","cancelAnimationFrame","scrollYOffset","threshold","mouseX","mouseY","matchedId","matchedPosition","matchedBox","candidates","box","canAccept","isWithinX","Math","eligible","c","uniqueDepths","a","b","winner","rangeLeft","Infinity","rangeRight","centerX","halfWidth","distFromCenter","depthIndex","isTarget","container","document"],"mappings":"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"}
@@ -8,7 +8,7 @@ interface IframeProps {
8
8
  viewportManager: ViewportManager;
9
9
  onConnected: (messenger: Messenger) => void;
10
10
  }
11
- export declare const Iframe: (({ url, timestamp, ...props }: IframeProps) => React.JSX.Element) & {
12
- displayName: string;
11
+ export declare const Iframe: (({ url, timestamp, ...props }: IframeProps) => React.JSX.Element) & React.NamedExoticComponent<IframeProps> & {
12
+ readonly type: ({ url, timestamp, ...props }: IframeProps) => React.JSX.Element;
13
13
  };
14
14
  export {};
@@ -1,4 +1,4 @@
1
1
  import React from "react";
2
- export declare const ElementOverlays: (() => React.JSX.Element) & {
3
- displayName: string;
2
+ export declare const ElementOverlays: (() => React.JSX.Element) & React.NamedExoticComponent<unknown> & {
3
+ readonly type: () => React.JSX.Element;
4
4
  };
@@ -1,4 +1,4 @@
1
1
  import React from "react";
2
- export declare const DocumentStateEditor: (() => React.JSX.Element) & {
3
- displayName: string;
2
+ export declare const DocumentStateEditor: (() => React.JSX.Element) & React.NamedExoticComponent<unknown> & {
3
+ readonly type: () => React.JSX.Element;
4
4
  };
@@ -2,10 +2,7 @@ import react from "react";
2
2
  import { Icon } from "@webiny/admin-ui";
3
3
  import { ReactComponent } from "@webiny/icons/notes.svg";
4
4
  import { Sidebar } from "../../../config/Sidebar/Sidebar.js";
5
- import { ScrollableContainer } from "../../../config/Sidebar/ScrollableContainer.js";
6
- const ElementSettingsGroup = ()=>/*#__PURE__*/ react.createElement(ScrollableContainer, {
7
- tabIndex: -1
8
- }, /*#__PURE__*/ react.createElement(Sidebar.Group.Tab, {
5
+ const ElementSettingsGroup = ()=>/*#__PURE__*/ react.createElement(Sidebar.Group.Tab, {
9
6
  name: "element",
10
7
  label: "Element",
11
8
  icon: /*#__PURE__*/ react.createElement(Icon, {
@@ -15,7 +12,7 @@ const ElementSettingsGroup = ()=>/*#__PURE__*/ react.createElement(ScrollableCon
15
12
  element: /*#__PURE__*/ react.createElement(Sidebar.Elements, {
16
13
  group: "element"
17
14
  })
18
- }));
15
+ });
19
16
  export { ElementSettingsGroup };
20
17
 
21
18
  //# sourceMappingURL=ElementSettingsGroup.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BaseEditor/defaultConfig/Sidebar/ElementSettings/ElementSettingsGroup.js","sources":["../../../../../src/BaseEditor/defaultConfig/Sidebar/ElementSettings/ElementSettingsGroup.tsx"],"sourcesContent":["import React from \"react\";\nimport { Icon } from \"@webiny/admin-ui\";\nimport { ReactComponent as NotesIcon } from \"@webiny/icons/notes.svg\";\nimport { Sidebar } from \"~/BaseEditor/config/Sidebar/Sidebar.js\";\nimport { ScrollableContainer } from \"~/BaseEditor/config/Sidebar/ScrollableContainer.js\";\n\nexport const ElementSettingsGroup = () => (\n <ScrollableContainer tabIndex={-1}>\n <Sidebar.Group.Tab\n name={\"element\"}\n label={\"Element\"}\n icon={<Icon icon={<NotesIcon />} label={\"Element\"} />}\n element={<Sidebar.Elements group={\"element\"} />}\n />\n </ScrollableContainer>\n);\n"],"names":["ElementSettingsGroup","ScrollableContainer","Sidebar","Icon","NotesIcon"],"mappings":";;;;;AAMO,MAAMA,uBAAuB,kBAChC,oBAACC,qBAAmBA;QAAC,UAAU;qBAC3B,oBAACC,QAAQ,KAAK,CAAC,GAAG;QACd,MAAM;QACN,OAAO;QACP,oBAAM,oBAACC,MAAIA;YAAC,oBAAM,oBAACC,gBAASA;YAAK,OAAO;;QACxC,uBAAS,oBAACF,QAAQ,QAAQ;YAAC,OAAO"}
1
+ {"version":3,"file":"BaseEditor/defaultConfig/Sidebar/ElementSettings/ElementSettingsGroup.js","sources":["../../../../../src/BaseEditor/defaultConfig/Sidebar/ElementSettings/ElementSettingsGroup.tsx"],"sourcesContent":["import React from \"react\";\nimport { Icon } from \"@webiny/admin-ui\";\nimport { ReactComponent as NotesIcon } from \"@webiny/icons/notes.svg\";\nimport { Sidebar } from \"~/BaseEditor/config/Sidebar/Sidebar.js\";\n\nexport const ElementSettingsGroup = () => (\n <Sidebar.Group.Tab\n name={\"element\"}\n label={\"Element\"}\n icon={<Icon icon={<NotesIcon />} label={\"Element\"} />}\n element={<Sidebar.Elements group={\"element\"} />}\n />\n);\n"],"names":["ElementSettingsGroup","Sidebar","Icon","NotesIcon"],"mappings":";;;;AAKO,MAAMA,uBAAuB,kBAChC,oBAACC,QAAQ,KAAK,CAAC,GAAG;QACd,MAAM;QACN,OAAO;QACP,oBAAM,oBAACC,MAAIA;YAAC,oBAAM,oBAACC,gBAASA;YAAK,OAAO;;QACxC,uBAAS,oBAACF,QAAQ,QAAQ;YAAC,OAAO"}
@@ -1,6 +1,10 @@
1
1
  import React from "react";
2
2
  export declare const BackgroundColor: (({ elementId }: {
3
3
  elementId: string;
4
- }) => React.JSX.Element) & {
5
- displayName: string;
4
+ }) => React.JSX.Element) & React.NamedExoticComponent<{
5
+ elementId: string;
6
+ }> & {
7
+ readonly type: ({ elementId }: {
8
+ elementId: string;
9
+ }) => React.JSX.Element;
6
10
  };
@@ -2,6 +2,10 @@ import React from "react";
2
2
  export declare const parseValue: (value: string) => undefined;
3
3
  export declare const BackgroundImage: (({ elementId }: {
4
4
  elementId: string;
5
- }) => React.JSX.Element) & {
6
- displayName: string;
5
+ }) => React.JSX.Element) & React.NamedExoticComponent<{
6
+ elementId: string;
7
+ }> & {
8
+ readonly type: ({ elementId }: {
9
+ elementId: string;
10
+ }) => React.JSX.Element;
7
11
  };
@@ -65,6 +65,13 @@ const BackgroundImage = observer(({ elementId })=>{
65
65
  };
66
66
  const inheritance = inheritanceMap?.backgroundImage ?? {};
67
67
  const fileInfo = metadata.get("backgroundImage");
68
+ const pickerValue = url && fileInfo ? {
69
+ id: fileInfo.id,
70
+ name: fileInfo.name,
71
+ size: fileInfo.size,
72
+ mimeType: fileInfo.type,
73
+ src: fileInfo.url
74
+ } : void 0;
68
75
  return /*#__PURE__*/ react.createElement(SidebarRow, {
69
76
  label: /*#__PURE__*/ react.createElement(InheritanceLabel, {
70
77
  onReset: onReset,
@@ -78,7 +85,7 @@ const BackgroundImage = observer(({ elementId })=>{
78
85
  render: ({ showFileManager })=>/*#__PURE__*/ react.createElement(FilePicker, {
79
86
  variant: "secondary",
80
87
  type: "compact",
81
- value: url ? fileInfo : void 0,
88
+ value: pickerValue,
82
89
  onSelectItem: ()=>showFileManager(),
83
90
  onRemoveItem: onRemove
84
91
  })
@@ -1 +1 @@
1
- {"version":3,"file":"BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Background/BackgroundImage.js","sources":["../../../../../../../src/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Background/BackgroundImage.tsx"],"sourcesContent":["import React, { useEffect, useState, useMemo } from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport { FileManager, type FileManagerFileItem } from \"@webiny/app-admin\";\nimport { FilePicker } from \"@webiny/admin-ui\";\nimport { useStyles } from \"~/BaseEditor/defaultConfig/Sidebar/StyleSettings/useStyles.js\";\nimport { BackgroundImageParser } from \"./BackgroundImageParser.js\";\nimport { useBreakpoint } from \"~/BaseEditor/hooks/useBreakpoint.js\";\nimport { InheritanceLabel } from \"../../../InheritanceLabel.js\";\nimport { SidebarRow } from \"~/BaseEditor/defaultConfig/Sidebar/StyleSettings/SidebarRow.js\";\n\ntype FileInfo = {\n id: string;\n name: string;\n size: number;\n type: string;\n url: string;\n};\n\nconst DEFAULT_POSITION = \"center\";\nconst DEFAULT_SCALING = {\n backgroundSize: \"cover\",\n backgroundRepeat: \"no-repeat\"\n};\n\nexport const parseValue = (value: string) => {\n if (!value) {\n return undefined;\n }\n\n return;\n};\n\nexport const BackgroundImage = observer(({ elementId }: { elementId: string }) => {\n const { isBaseBreakpoint } = useBreakpoint();\n const { styles, metadata, onChange, inheritanceMap } = useStyles(elementId);\n const [localValue, setLocalValue] = useState<string | null>(styles.backgroundImage);\n const url = useMemo(() => {\n const parser = new BackgroundImageParser(styles.backgroundImage);\n const rules = parser.getRules();\n const urlRule = rules.find(r => r.type === \"url\");\n if (urlRule && urlRule.type === \"url\") {\n return urlRule.parsed.url;\n }\n return null;\n }, [styles.backgroundImage]);\n\n useEffect(() => {\n if (styles.backgroundImage !== localValue) {\n setLocalValue(styles.backgroundImage);\n }\n }, [styles.backgroundImage]);\n\n const onFileChange = (file: FileManagerFileItem) => {\n onChange(({ styles, metadata }) => {\n styles.set(\"backgroundPosition\", DEFAULT_POSITION);\n styles.set(\"backgroundSize\", DEFAULT_SCALING.backgroundSize);\n styles.set(\"backgroundRepeat\", DEFAULT_SCALING.backgroundRepeat);\n styles.set(\"backgroundImage\", `url(\"${file.src}\")`);\n\n metadata.set(\"backgroundImage\", {\n id: file.id,\n name: file.name,\n size: file.size,\n type: file.type,\n url: file.src || \"\"\n });\n });\n };\n\n const onRemove = () => {\n onChange(({ styles, metadata }) => {\n // On base breakpoint, we unset the image and all styles related to it.\n if (isBaseBreakpoint) {\n styles.unset(\"backgroundImage\");\n styles.unset(\"backgroundPosition\");\n styles.unset(\"backgroundSize\");\n styles.unset(\"backgroundRepeat\");\n } else {\n styles.set(\"backgroundImage\", \"none\");\n }\n\n metadata.unset(\"backgroundImage\");\n });\n };\n\n const onReset = () => {\n onChange(({ styles }) => {\n styles.unset(\"backgroundImage\");\n\n metadata.unset(\"backgroundImage\");\n });\n };\n\n const inheritance = inheritanceMap?.backgroundImage ?? {};\n\n const fileInfo = metadata.get<FileInfo>(\"backgroundImage\");\n\n return (\n <SidebarRow\n label={\n <InheritanceLabel\n onReset={onReset}\n isOverridden={inheritance?.overridden ?? false}\n inheritedFrom={inheritance?.inheritedFrom}\n text={\"Image\"}\n />\n }\n >\n <FileManager\n images={true}\n onChange={onFileChange}\n render={({ showFileManager }) => (\n <FilePicker\n variant={\"secondary\"}\n type=\"compact\"\n value={url ? fileInfo : undefined}\n onSelectItem={() => showFileManager()}\n onRemoveItem={onRemove}\n />\n )}\n />\n </SidebarRow>\n );\n});\n"],"names":["DEFAULT_POSITION","DEFAULT_SCALING","parseValue","value","BackgroundImage","observer","elementId","isBaseBreakpoint","useBreakpoint","styles","metadata","onChange","inheritanceMap","useStyles","localValue","setLocalValue","useState","url","useMemo","parser","BackgroundImageParser","rules","urlRule","r","useEffect","onFileChange","file","onRemove","onReset","inheritance","fileInfo","SidebarRow","InheritanceLabel","FileManager","showFileManager","FilePicker","undefined"],"mappings":";;;;;;;;;AAkBA,MAAMA,mBAAmB;AACzB,MAAMC,kBAAkB;IACpB,gBAAgB;IAChB,kBAAkB;AACtB;AAEO,MAAMC,aAAa,CAACC,SAM3B;AAEO,MAAMC,kBAAkBC,SAAS,CAAC,EAAEC,SAAS,EAAyB;IACzE,MAAM,EAAEC,gBAAgB,EAAE,GAAGC;IAC7B,MAAM,EAAEC,MAAM,EAAEC,QAAQ,EAAEC,QAAQ,EAAEC,cAAc,EAAE,GAAGC,UAAUP;IACjE,MAAM,CAACQ,YAAYC,cAAc,GAAGC,SAAwBP,OAAO,eAAe;IAClF,MAAMQ,MAAMC,QAAQ;QAChB,MAAMC,SAAS,IAAIC,sBAAsBX,OAAO,eAAe;QAC/D,MAAMY,QAAQF,OAAO,QAAQ;QAC7B,MAAMG,UAAUD,MAAM,IAAI,CAACE,CAAAA,IAAKA,AAAW,UAAXA,EAAE,IAAI;QACtC,IAAID,WAAWA,AAAiB,UAAjBA,QAAQ,IAAI,EACvB,OAAOA,QAAQ,MAAM,CAAC,GAAG;QAE7B,OAAO;IACX,GAAG;QAACb,OAAO,eAAe;KAAC;IAE3Be,UAAU;QACN,IAAIf,OAAO,eAAe,KAAKK,YAC3BC,cAAcN,OAAO,eAAe;IAE5C,GAAG;QAACA,OAAO,eAAe;KAAC;IAE3B,MAAMgB,eAAe,CAACC;QAClBf,SAAS,CAAC,EAAEF,MAAM,EAAEC,QAAQ,EAAE;YAC1BD,OAAO,GAAG,CAAC,sBAAsBT;YACjCS,OAAO,GAAG,CAAC,kBAAkBR,gBAAgB,cAAc;YAC3DQ,OAAO,GAAG,CAAC,oBAAoBR,gBAAgB,gBAAgB;YAC/DQ,OAAO,GAAG,CAAC,mBAAmB,CAAC,KAAK,EAAEiB,KAAK,GAAG,CAAC,EAAE,CAAC;YAElDhB,SAAS,GAAG,CAAC,mBAAmB;gBAC5B,IAAIgB,KAAK,EAAE;gBACX,MAAMA,KAAK,IAAI;gBACf,MAAMA,KAAK,IAAI;gBACf,MAAMA,KAAK,IAAI;gBACf,KAAKA,KAAK,GAAG,IAAI;YACrB;QACJ;IACJ;IAEA,MAAMC,WAAW;QACbhB,SAAS,CAAC,EAAEF,MAAM,EAAEC,QAAQ,EAAE;YAE1B,IAAIH,kBAAkB;gBAClBE,OAAO,KAAK,CAAC;gBACbA,OAAO,KAAK,CAAC;gBACbA,OAAO,KAAK,CAAC;gBACbA,OAAO,KAAK,CAAC;YACjB,OACIA,OAAO,GAAG,CAAC,mBAAmB;YAGlCC,SAAS,KAAK,CAAC;QACnB;IACJ;IAEA,MAAMkB,UAAU;QACZjB,SAAS,CAAC,EAAEF,MAAM,EAAE;YAChBA,OAAO,KAAK,CAAC;YAEbC,SAAS,KAAK,CAAC;QACnB;IACJ;IAEA,MAAMmB,cAAcjB,gBAAgB,mBAAmB,CAAC;IAExD,MAAMkB,WAAWpB,SAAS,GAAG,CAAW;IAExC,OAAO,WAAP,GACI,oBAACqB,YAAUA;QACP,qBACI,oBAACC,kBAAgBA;YACb,SAASJ;YACT,cAAcC,aAAa,cAAc;YACzC,eAAeA,aAAa;YAC5B,MAAM;;qBAId,oBAACI,aAAWA;QACR,QAAQ;QACR,UAAUR;QACV,QAAQ,CAAC,EAAES,eAAe,EAAE,iBACxB,oBAACC,YAAUA;gBACP,SAAS;gBACT,MAAK;gBACL,OAAOlB,MAAMa,WAAWM;gBACxB,cAAc,IAAMF;gBACpB,cAAcP;;;AAMtC"}
1
+ {"version":3,"file":"BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Background/BackgroundImage.js","sources":["../../../../../../../src/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Background/BackgroundImage.tsx"],"sourcesContent":["import React, { useEffect, useState, useMemo } from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport { FileManager, type FileManagerFileItem } from \"@webiny/app-admin\";\nimport { FilePicker } from \"@webiny/admin-ui\";\nimport { useStyles } from \"~/BaseEditor/defaultConfig/Sidebar/StyleSettings/useStyles.js\";\nimport { BackgroundImageParser } from \"./BackgroundImageParser.js\";\nimport { useBreakpoint } from \"~/BaseEditor/hooks/useBreakpoint.js\";\nimport { InheritanceLabel } from \"../../../InheritanceLabel.js\";\nimport { SidebarRow } from \"~/BaseEditor/defaultConfig/Sidebar/StyleSettings/SidebarRow.js\";\n\ntype FileInfo = {\n id: string;\n name: string;\n size: number;\n type: string;\n url: string;\n};\n\nconst DEFAULT_POSITION = \"center\";\nconst DEFAULT_SCALING = {\n backgroundSize: \"cover\",\n backgroundRepeat: \"no-repeat\"\n};\n\nexport const parseValue = (value: string) => {\n if (!value) {\n return undefined;\n }\n\n return;\n};\n\nexport const BackgroundImage = observer(({ elementId }: { elementId: string }) => {\n const { isBaseBreakpoint } = useBreakpoint();\n const { styles, metadata, onChange, inheritanceMap } = useStyles(elementId);\n const [localValue, setLocalValue] = useState<string | null>(styles.backgroundImage);\n const url = useMemo(() => {\n const parser = new BackgroundImageParser(styles.backgroundImage);\n const rules = parser.getRules();\n const urlRule = rules.find(r => r.type === \"url\");\n if (urlRule && urlRule.type === \"url\") {\n return urlRule.parsed.url;\n }\n return null;\n }, [styles.backgroundImage]);\n\n useEffect(() => {\n if (styles.backgroundImage !== localValue) {\n setLocalValue(styles.backgroundImage);\n }\n }, [styles.backgroundImage]);\n\n const onFileChange = (file: FileManagerFileItem) => {\n onChange(({ styles, metadata }) => {\n styles.set(\"backgroundPosition\", DEFAULT_POSITION);\n styles.set(\"backgroundSize\", DEFAULT_SCALING.backgroundSize);\n styles.set(\"backgroundRepeat\", DEFAULT_SCALING.backgroundRepeat);\n styles.set(\"backgroundImage\", `url(\"${file.src}\")`);\n\n metadata.set(\"backgroundImage\", {\n id: file.id,\n name: file.name,\n size: file.size,\n type: file.type,\n url: file.src || \"\"\n });\n });\n };\n\n const onRemove = () => {\n onChange(({ styles, metadata }) => {\n // On base breakpoint, we unset the image and all styles related to it.\n if (isBaseBreakpoint) {\n styles.unset(\"backgroundImage\");\n styles.unset(\"backgroundPosition\");\n styles.unset(\"backgroundSize\");\n styles.unset(\"backgroundRepeat\");\n } else {\n styles.set(\"backgroundImage\", \"none\");\n }\n\n metadata.unset(\"backgroundImage\");\n });\n };\n\n const onReset = () => {\n onChange(({ styles }) => {\n styles.unset(\"backgroundImage\");\n\n metadata.unset(\"backgroundImage\");\n });\n };\n\n const inheritance = inheritanceMap?.backgroundImage ?? {};\n\n const fileInfo = metadata.get<FileInfo>(\"backgroundImage\");\n\n // The FilePicker expects a FileItemDto (`mimeType`, `src`), but our metadata stores the\n // legacy shape (`type`, `url`). Map it across so the picker can detect an image and render\n // the thumbnail (otherwise `mimeType` is undefined and it shows the generic file icon).\n const pickerValue =\n url && fileInfo\n ? {\n id: fileInfo.id,\n name: fileInfo.name,\n size: fileInfo.size,\n mimeType: fileInfo.type,\n src: fileInfo.url\n }\n : undefined;\n\n return (\n <SidebarRow\n label={\n <InheritanceLabel\n onReset={onReset}\n isOverridden={inheritance?.overridden ?? false}\n inheritedFrom={inheritance?.inheritedFrom}\n text={\"Image\"}\n />\n }\n >\n <FileManager\n images={true}\n onChange={onFileChange}\n render={({ showFileManager }) => (\n <FilePicker\n variant={\"secondary\"}\n type=\"compact\"\n value={pickerValue}\n onSelectItem={() => showFileManager()}\n onRemoveItem={onRemove}\n />\n )}\n />\n </SidebarRow>\n );\n});\n"],"names":["DEFAULT_POSITION","DEFAULT_SCALING","parseValue","value","BackgroundImage","observer","elementId","isBaseBreakpoint","useBreakpoint","styles","metadata","onChange","inheritanceMap","useStyles","localValue","setLocalValue","useState","url","useMemo","parser","BackgroundImageParser","rules","urlRule","r","useEffect","onFileChange","file","onRemove","onReset","inheritance","fileInfo","pickerValue","undefined","SidebarRow","InheritanceLabel","FileManager","showFileManager","FilePicker"],"mappings":";;;;;;;;;AAkBA,MAAMA,mBAAmB;AACzB,MAAMC,kBAAkB;IACpB,gBAAgB;IAChB,kBAAkB;AACtB;AAEO,MAAMC,aAAa,CAACC,SAM3B;AAEO,MAAMC,kBAAkBC,SAAS,CAAC,EAAEC,SAAS,EAAyB;IACzE,MAAM,EAAEC,gBAAgB,EAAE,GAAGC;IAC7B,MAAM,EAAEC,MAAM,EAAEC,QAAQ,EAAEC,QAAQ,EAAEC,cAAc,EAAE,GAAGC,UAAUP;IACjE,MAAM,CAACQ,YAAYC,cAAc,GAAGC,SAAwBP,OAAO,eAAe;IAClF,MAAMQ,MAAMC,QAAQ;QAChB,MAAMC,SAAS,IAAIC,sBAAsBX,OAAO,eAAe;QAC/D,MAAMY,QAAQF,OAAO,QAAQ;QAC7B,MAAMG,UAAUD,MAAM,IAAI,CAACE,CAAAA,IAAKA,AAAW,UAAXA,EAAE,IAAI;QACtC,IAAID,WAAWA,AAAiB,UAAjBA,QAAQ,IAAI,EACvB,OAAOA,QAAQ,MAAM,CAAC,GAAG;QAE7B,OAAO;IACX,GAAG;QAACb,OAAO,eAAe;KAAC;IAE3Be,UAAU;QACN,IAAIf,OAAO,eAAe,KAAKK,YAC3BC,cAAcN,OAAO,eAAe;IAE5C,GAAG;QAACA,OAAO,eAAe;KAAC;IAE3B,MAAMgB,eAAe,CAACC;QAClBf,SAAS,CAAC,EAAEF,MAAM,EAAEC,QAAQ,EAAE;YAC1BD,OAAO,GAAG,CAAC,sBAAsBT;YACjCS,OAAO,GAAG,CAAC,kBAAkBR,gBAAgB,cAAc;YAC3DQ,OAAO,GAAG,CAAC,oBAAoBR,gBAAgB,gBAAgB;YAC/DQ,OAAO,GAAG,CAAC,mBAAmB,CAAC,KAAK,EAAEiB,KAAK,GAAG,CAAC,EAAE,CAAC;YAElDhB,SAAS,GAAG,CAAC,mBAAmB;gBAC5B,IAAIgB,KAAK,EAAE;gBACX,MAAMA,KAAK,IAAI;gBACf,MAAMA,KAAK,IAAI;gBACf,MAAMA,KAAK,IAAI;gBACf,KAAKA,KAAK,GAAG,IAAI;YACrB;QACJ;IACJ;IAEA,MAAMC,WAAW;QACbhB,SAAS,CAAC,EAAEF,MAAM,EAAEC,QAAQ,EAAE;YAE1B,IAAIH,kBAAkB;gBAClBE,OAAO,KAAK,CAAC;gBACbA,OAAO,KAAK,CAAC;gBACbA,OAAO,KAAK,CAAC;gBACbA,OAAO,KAAK,CAAC;YACjB,OACIA,OAAO,GAAG,CAAC,mBAAmB;YAGlCC,SAAS,KAAK,CAAC;QACnB;IACJ;IAEA,MAAMkB,UAAU;QACZjB,SAAS,CAAC,EAAEF,MAAM,EAAE;YAChBA,OAAO,KAAK,CAAC;YAEbC,SAAS,KAAK,CAAC;QACnB;IACJ;IAEA,MAAMmB,cAAcjB,gBAAgB,mBAAmB,CAAC;IAExD,MAAMkB,WAAWpB,SAAS,GAAG,CAAW;IAKxC,MAAMqB,cACFd,OAAOa,WACD;QACI,IAAIA,SAAS,EAAE;QACf,MAAMA,SAAS,IAAI;QACnB,MAAMA,SAAS,IAAI;QACnB,UAAUA,SAAS,IAAI;QACvB,KAAKA,SAAS,GAAG;IACrB,IACAE;IAEV,OAAO,WAAP,GACI,oBAACC,YAAUA;QACP,qBACI,oBAACC,kBAAgBA;YACb,SAASN;YACT,cAAcC,aAAa,cAAc;YACzC,eAAeA,aAAa;YAC5B,MAAM;;qBAId,oBAACM,aAAWA;QACR,QAAQ;QACR,UAAUV;QACV,QAAQ,CAAC,EAAEW,eAAe,EAAE,iBACxB,oBAACC,YAAUA;gBACP,SAAS;gBACT,MAAK;gBACL,OAAON;gBACP,cAAc,IAAMK;gBACpB,cAAcT;;;AAMtC"}
@@ -1,6 +1,10 @@
1
1
  import React from "react";
2
2
  export declare const BackgroundPosition: (({ elementId }: {
3
3
  elementId: string;
4
- }) => React.JSX.Element) & {
5
- displayName: string;
4
+ }) => React.JSX.Element) & React.NamedExoticComponent<{
5
+ elementId: string;
6
+ }> & {
7
+ readonly type: ({ elementId }: {
8
+ elementId: string;
9
+ }) => React.JSX.Element;
6
10
  };
@@ -1,6 +1,10 @@
1
1
  import React from "react";
2
2
  export declare const BackgroundScaling: (({ elementId }: {
3
3
  elementId: string;
4
- }) => React.JSX.Element) & {
5
- displayName: string;
4
+ }) => React.JSX.Element) & React.NamedExoticComponent<{
5
+ elementId: string;
6
+ }> & {
7
+ readonly type: ({ elementId }: {
8
+ elementId: string;
9
+ }) => React.JSX.Element;
6
10
  };
@@ -2,7 +2,7 @@ import React from "react";
2
2
  interface BorderColorProps {
3
3
  elementId: string;
4
4
  }
5
- export declare const BorderColor: (({ elementId }: BorderColorProps) => React.JSX.Element) & {
6
- displayName: string;
5
+ export declare const BorderColor: (({ elementId }: BorderColorProps) => React.JSX.Element) & React.NamedExoticComponent<BorderColorProps> & {
6
+ readonly type: ({ elementId }: BorderColorProps) => React.JSX.Element;
7
7
  };
8
8
  export {};
@@ -2,7 +2,7 @@ import React from "react";
2
2
  interface BorderRadiusProps {
3
3
  elementId: string;
4
4
  }
5
- export declare const BorderRadius: (({ elementId }: BorderRadiusProps) => React.JSX.Element) & {
6
- displayName: string;
5
+ export declare const BorderRadius: (({ elementId }: BorderRadiusProps) => React.JSX.Element) & React.NamedExoticComponent<BorderRadiusProps> & {
6
+ readonly type: ({ elementId }: BorderRadiusProps) => React.JSX.Element;
7
7
  };
8
8
  export {};
@@ -2,7 +2,7 @@ import React from "react";
2
2
  interface BorderStyleProps {
3
3
  elementId: string;
4
4
  }
5
- export declare const BorderStyle: (({ elementId }: BorderStyleProps) => React.JSX.Element) & {
6
- displayName: string;
5
+ export declare const BorderStyle: (({ elementId }: BorderStyleProps) => React.JSX.Element) & React.NamedExoticComponent<BorderStyleProps> & {
6
+ readonly type: ({ elementId }: BorderStyleProps) => React.JSX.Element;
7
7
  };
8
8
  export {};
@@ -2,7 +2,7 @@ import React from "react";
2
2
  interface BorderWidthProps {
3
3
  elementId: string;
4
4
  }
5
- export declare const BorderWidth: (({ elementId }: BorderWidthProps) => React.JSX.Element) & {
6
- displayName: string;
5
+ export declare const BorderWidth: (({ elementId }: BorderWidthProps) => React.JSX.Element) & React.NamedExoticComponent<BorderWidthProps> & {
6
+ readonly type: ({ elementId }: BorderWidthProps) => React.JSX.Element;
7
7
  };
8
8
  export {};
@@ -13,6 +13,10 @@ import React from "react";
13
13
  */
14
14
  export declare const Alignment: (({ elementId }: {
15
15
  elementId: string;
16
- }) => React.JSX.Element) & {
17
- displayName: string;
16
+ }) => React.JSX.Element) & React.NamedExoticComponent<{
17
+ elementId: string;
18
+ }> & {
19
+ readonly type: ({ elementId }: {
20
+ elementId: string;
21
+ }) => React.JSX.Element;
18
22
  };
@@ -7,7 +7,7 @@ interface LengthWithUnitInputProps {
7
7
  unitOptions: UnitOption[];
8
8
  defaultValue?: string;
9
9
  }
10
- export declare const LengthWithUnitInput: (({ elementId, label, propertyName, defaultValue, unitOptions }: LengthWithUnitInputProps) => React.JSX.Element) & {
11
- displayName: string;
10
+ export declare const LengthWithUnitInput: (({ elementId, label, propertyName, defaultValue, unitOptions }: LengthWithUnitInputProps) => React.JSX.Element) & React.NamedExoticComponent<LengthWithUnitInputProps> & {
11
+ readonly type: ({ elementId, label, propertyName, defaultValue, unitOptions }: LengthWithUnitInputProps) => React.JSX.Element;
12
12
  };
13
13
  export {};
@@ -3,7 +3,7 @@ interface MarginProps {
3
3
  elementId: string;
4
4
  children: React.ReactNode;
5
5
  }
6
- export declare const Margin: (({ elementId, children }: MarginProps) => React.JSX.Element) & {
7
- displayName: string;
6
+ export declare const Margin: (({ elementId, children }: MarginProps) => React.JSX.Element) & React.NamedExoticComponent<MarginProps> & {
7
+ readonly type: ({ elementId, children }: MarginProps) => React.JSX.Element;
8
8
  };
9
9
  export {};
@@ -2,7 +2,7 @@ import React from "react";
2
2
  interface PaddingProps {
3
3
  elementId: string;
4
4
  }
5
- export declare const Padding: (({ elementId }: PaddingProps) => React.JSX.Element) & {
6
- displayName: string;
5
+ export declare const Padding: (({ elementId }: PaddingProps) => React.JSX.Element) & React.NamedExoticComponent<PaddingProps> & {
6
+ readonly type: ({ elementId }: PaddingProps) => React.JSX.Element;
7
7
  };
8
8
  export {};
@@ -2,6 +2,6 @@ import React from "react";
2
2
  export interface VisibilityProps {
3
3
  elementId: string;
4
4
  }
5
- export declare const Visibility: (({ elementId }: VisibilityProps) => React.JSX.Element) & {
6
- displayName: string;
5
+ export declare const Visibility: (({ elementId }: VisibilityProps) => React.JSX.Element) & React.NamedExoticComponent<VisibilityProps> & {
6
+ readonly type: ({ elementId }: VisibilityProps) => React.JSX.Element;
7
7
  };
@@ -17,7 +17,7 @@ const SidebarRow = ({ label, tooltip, children })=>/*#__PURE__*/ react.createEle
17
17
  }) : /*#__PURE__*/ react.createElement("div", {
18
18
  className: "w-xs shrink-0"
19
19
  })), /*#__PURE__*/ react.createElement("div", {
20
- className: "flex-1"
20
+ className: "flex-1 min-w-0"
21
21
  }, children));
22
22
  export { SidebarRow };
23
23
 
@@ -1 +1 @@
1
- {"version":3,"file":"BaseEditor/defaultConfig/Sidebar/StyleSettings/SidebarRow.js","sources":["../../../../../src/BaseEditor/defaultConfig/Sidebar/StyleSettings/SidebarRow.tsx"],"sourcesContent":["import React from \"react\";\nimport { Icon, Tooltip } from \"@webiny/admin-ui\";\nimport { ReactComponent as InfoIcon } from \"@webiny/icons/info.svg\";\n\ninterface SidebarRowProps {\n label: React.ReactNode;\n tooltip?: React.ReactNode;\n children: React.ReactNode;\n}\n\nexport const SidebarRow = ({ label, tooltip, children }: SidebarRowProps) => {\n return (\n <div className={\"flex items-start gap-xxs\"}>\n <div\n className={\n \"w-[80px] pt-sm flex flex-row items-center gap-xxs shrink-0 text-sm text-neutral-strong\"\n }\n >\n {label}\n\n {tooltip ? (\n <Tooltip\n trigger={\n <Icon\n icon={<InfoIcon />}\n size={\"xs\"}\n label={\"More information\"}\n color={\"neutral-light\"}\n />\n }\n content={tooltip}\n side={\"left\"}\n />\n ) : (\n <div className={\"w-xs shrink-0\"} />\n )}\n </div>\n <div className={\"flex-1\"}>{children}</div>\n </div>\n );\n};\n"],"names":["SidebarRow","label","tooltip","children","Tooltip","Icon","InfoIcon"],"mappings":";;;AAUO,MAAMA,aAAa,CAAC,EAAEC,KAAK,EAAEC,OAAO,EAAEC,QAAQ,EAAmB,GAC7D,WAAP,GACI,oBAAC;QAAI,WAAW;qBACZ,oBAAC;QACG,WACI;OAGHF,OAEAC,UAAU,WAAVA,GACG,oBAACE,SAAOA;QACJ,uBACI,oBAACC,MAAIA;YACD,oBAAM,oBAACC,gBAAQA;YACf,MAAM;YACN,OAAO;YACP,OAAO;;QAGf,SAASJ;QACT,MAAM;uBAGV,oBAAC;QAAI,WAAW;uBAGxB,oBAAC;QAAI,WAAW;OAAWC"}
1
+ {"version":3,"file":"BaseEditor/defaultConfig/Sidebar/StyleSettings/SidebarRow.js","sources":["../../../../../src/BaseEditor/defaultConfig/Sidebar/StyleSettings/SidebarRow.tsx"],"sourcesContent":["import React from \"react\";\nimport { Icon, Tooltip } from \"@webiny/admin-ui\";\nimport { ReactComponent as InfoIcon } from \"@webiny/icons/info.svg\";\n\ninterface SidebarRowProps {\n label: React.ReactNode;\n tooltip?: React.ReactNode;\n children: React.ReactNode;\n}\n\nexport const SidebarRow = ({ label, tooltip, children }: SidebarRowProps) => {\n return (\n <div className={\"flex items-start gap-xxs\"}>\n <div\n className={\n \"w-[80px] pt-sm flex flex-row items-center gap-xxs shrink-0 text-sm text-neutral-strong\"\n }\n >\n {label}\n\n {tooltip ? (\n <Tooltip\n trigger={\n <Icon\n icon={<InfoIcon />}\n size={\"xs\"}\n label={\"More information\"}\n color={\"neutral-light\"}\n />\n }\n content={tooltip}\n side={\"left\"}\n />\n ) : (\n <div className={\"w-xs shrink-0\"} />\n )}\n </div>\n {/* min-w-0 lets the cell shrink below its content's intrinsic width, so long\n unbroken values (e.g. a hashed file name) truncate instead of widening the\n row and pushing controls past the sidebar edge. */}\n <div className={\"flex-1 min-w-0\"}>{children}</div>\n </div>\n );\n};\n"],"names":["SidebarRow","label","tooltip","children","Tooltip","Icon","InfoIcon"],"mappings":";;;AAUO,MAAMA,aAAa,CAAC,EAAEC,KAAK,EAAEC,OAAO,EAAEC,QAAQ,EAAmB,GAC7D,WAAP,GACI,oBAAC;QAAI,WAAW;qBACZ,oBAAC;QACG,WACI;OAGHF,OAEAC,UAAU,WAAVA,GACG,oBAACE,SAAOA;QACJ,uBACI,oBAACC,MAAIA;YACD,oBAAM,oBAACC,gBAAQA;YACf,MAAM;YACN,OAAO;YACP,OAAO;;QAGf,SAASJ;QACT,MAAM;uBAGV,oBAAC;QAAI,WAAW;uBAMxB,oBAAC;QAAI,WAAW;OAAmBC"}
@@ -2,10 +2,7 @@ import react from "react";
2
2
  import { Icon } from "@webiny/admin-ui";
3
3
  import { ReactComponent } from "@webiny/icons/select_all.svg";
4
4
  import { Sidebar } from "../../../config/Sidebar/Sidebar.js";
5
- import { ScrollableContainer } from "../../../config/Sidebar/ScrollableContainer.js";
6
- const StyleSettingsGroup = ()=>/*#__PURE__*/ react.createElement(ScrollableContainer, {
7
- tabIndex: -1
8
- }, /*#__PURE__*/ react.createElement(Sidebar.Group.Tab, {
5
+ const StyleSettingsGroup = ()=>/*#__PURE__*/ react.createElement(Sidebar.Group.Tab, {
9
6
  name: "style",
10
7
  label: "Style",
11
8
  icon: /*#__PURE__*/ react.createElement(Icon, {
@@ -15,7 +12,7 @@ const StyleSettingsGroup = ()=>/*#__PURE__*/ react.createElement(ScrollableConta
15
12
  element: /*#__PURE__*/ react.createElement(Sidebar.Elements, {
16
13
  group: "style"
17
14
  })
18
- }));
15
+ });
19
16
  export { StyleSettingsGroup };
20
17
 
21
18
  //# sourceMappingURL=StyleSettingsGroup.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BaseEditor/defaultConfig/Sidebar/StyleSettings/StyleSettingsGroup.js","sources":["../../../../../src/BaseEditor/defaultConfig/Sidebar/StyleSettings/StyleSettingsGroup.tsx"],"sourcesContent":["import React from \"react\";\nimport { Icon } from \"@webiny/admin-ui\";\nimport { ReactComponent as SelectAllIcon } from \"@webiny/icons/select_all.svg\";\nimport { Sidebar } from \"~/BaseEditor/config/Sidebar/Sidebar.js\";\nimport { ScrollableContainer } from \"~/BaseEditor/config/Sidebar/ScrollableContainer.js\";\n\nexport const StyleSettingsGroup = () => {\n return (\n <ScrollableContainer tabIndex={-1}>\n <Sidebar.Group.Tab\n name={\"style\"}\n label={\"Style\"}\n icon={<Icon icon={<SelectAllIcon />} label={\"Style\"} />}\n element={<Sidebar.Elements group={\"style\"} />}\n />\n </ScrollableContainer>\n );\n};\n"],"names":["StyleSettingsGroup","ScrollableContainer","Sidebar","Icon","SelectAllIcon"],"mappings":";;;;;AAMO,MAAMA,qBAAqB,IACvB,WAAP,GACI,oBAACC,qBAAmBA;QAAC,UAAU;qBAC3B,oBAACC,QAAQ,KAAK,CAAC,GAAG;QACd,MAAM;QACN,OAAO;QACP,oBAAM,oBAACC,MAAIA;YAAC,oBAAM,oBAACC,gBAAaA;YAAK,OAAO;;QAC5C,uBAAS,oBAACF,QAAQ,QAAQ;YAAC,OAAO"}
1
+ {"version":3,"file":"BaseEditor/defaultConfig/Sidebar/StyleSettings/StyleSettingsGroup.js","sources":["../../../../../src/BaseEditor/defaultConfig/Sidebar/StyleSettings/StyleSettingsGroup.tsx"],"sourcesContent":["import React from \"react\";\nimport { Icon } from \"@webiny/admin-ui\";\nimport { ReactComponent as SelectAllIcon } from \"@webiny/icons/select_all.svg\";\nimport { Sidebar } from \"~/BaseEditor/config/Sidebar/Sidebar.js\";\n\nexport const StyleSettingsGroup = () => {\n return (\n <Sidebar.Group.Tab\n name={\"style\"}\n label={\"Style\"}\n icon={<Icon icon={<SelectAllIcon />} label={\"Style\"} />}\n element={<Sidebar.Elements group={\"style\"} />}\n />\n );\n};\n"],"names":["StyleSettingsGroup","Sidebar","Icon","SelectAllIcon"],"mappings":";;;;AAKO,MAAMA,qBAAqB,IACvB,WAAP,GACI,oBAACC,QAAQ,KAAK,CAAC,GAAG;QACd,MAAM;QACN,OAAO;QACP,oBAAM,oBAACC,MAAIA;YAAC,oBAAM,oBAACC,gBAAaA;YAAK,OAAO;;QAC5C,uBAAS,oBAACF,QAAQ,QAAQ;YAAC,OAAO"}
@@ -1,4 +1,4 @@
1
1
  import React from "react";
2
- export declare const Navigator: (() => React.JSX.Element) & {
3
- displayName: string;
2
+ export declare const Navigator: (() => React.JSX.Element) & React.NamedExoticComponent<unknown> & {
3
+ readonly type: () => React.JSX.Element;
4
4
  };
@@ -10,7 +10,7 @@ interface DocumentEditorProps<TDocument> {
10
10
  readOnly: boolean;
11
11
  }
12
12
  declare function BaseDocumentEditor<TDocument extends EditorDocument>({ document, name, children, readOnly }: DocumentEditorProps<TDocument>): React.JSX.Element;
13
- export declare const DocumentEditor: typeof BaseDocumentEditor & {
14
- displayName: string;
13
+ export declare const DocumentEditor: typeof BaseDocumentEditor & React.NamedExoticComponent<DocumentEditorProps<import("@webiny/website-builder-sdk").Document>> & {
14
+ readonly type: typeof BaseDocumentEditor;
15
15
  };
16
16
  export {};
@@ -4,7 +4,9 @@ import type { Editor } from "../editorSdk/Editor.js";
4
4
  declare function BaseStateInspector<TDocument extends EditorDocument>({ editor }: {
5
5
  editor: Editor<TDocument>;
6
6
  }): React.JSX.Element;
7
- export declare const StateInspector: typeof BaseStateInspector & {
8
- displayName: string;
7
+ export declare const StateInspector: typeof BaseStateInspector & React.NamedExoticComponent<{
8
+ editor: Editor<import("@webiny/website-builder-sdk").Document>;
9
+ }> & {
10
+ readonly type: typeof BaseStateInspector;
9
11
  };
10
12
  export {};
@@ -20,8 +20,12 @@ interface ResourcePickerRendererConfig {
20
20
  }
21
21
  export declare function createResourcePickerRenderer(config: ResourcePickerRendererConfig): (({ field }: {
22
22
  field: IFieldVM;
23
- }) => React.JSX.Element) & {
24
- displayName: string;
23
+ }) => React.JSX.Element) & React.NamedExoticComponent<{
24
+ field: IFieldVM;
25
+ }> & {
26
+ readonly type: ({ field }: {
27
+ field: IFieldVM;
28
+ }) => React.JSX.Element;
25
29
  };
26
30
  export interface EcommerceResourcePageTypeConfig {
27
31
  name: string;
@@ -9,9 +9,9 @@ export type PickResourceListProps = {
9
9
  resourceName: string;
10
10
  pluginName: string;
11
11
  };
12
- export declare const PickResourceList: ((props: PickResourceListProps) => React.JSX.Element) & {
13
- displayName: string;
12
+ export declare const PickResourceList: ((props: PickResourceListProps) => React.JSX.Element) & React.NamedExoticComponent<PickResourceListProps> & {
13
+ readonly type: (props: PickResourceListProps) => React.JSX.Element;
14
14
  };
15
- export declare const PickResourcesListButton: ((props: Omit<PickResourceListProps, "onDone">) => React.JSX.Element) & {
16
- displayName: string;
15
+ export declare const PickResourcesListButton: ((props: Omit<PickResourceListProps, "onDone">) => React.JSX.Element) & React.NamedExoticComponent<Omit<PickResourceListProps, "onDone">> & {
16
+ readonly type: (props: Omit<PickResourceListProps, "onDone">) => React.JSX.Element;
17
17
  };
@@ -24,8 +24,8 @@ export interface ResourcePreviewCellProps {
24
24
  onClick?: () => void;
25
25
  style?: Partial<CSSStyleDeclaration>;
26
26
  }
27
- export declare const ResourcePreviewCell: ((props: ResourcePreviewCellProps) => React.JSX.Element) & {
28
- displayName: string;
27
+ export declare const ResourcePreviewCell: ((props: ResourcePreviewCellProps) => React.JSX.Element) & React.NamedExoticComponent<ResourcePreviewCellProps> & {
28
+ readonly type: (props: ResourcePreviewCellProps) => React.JSX.Element;
29
29
  };
30
30
  export type ResourcePickerProps = CustomResourcePickerProps<Resource> & {
31
31
  api: CommerceAPIOperations;
@@ -33,7 +33,12 @@ export type ResourcePickerProps = CustomResourcePickerProps<Resource> & {
33
33
  omitIds?: string[];
34
34
  title?: string;
35
35
  };
36
- export declare const ResourcePicker: ((props: ResourcePickerProps) => React.JSX.Element) & {
37
- displayName: string;
36
+ export declare const ResourcePicker: ((props: ResourcePickerProps) => React.JSX.Element) & React.NamedExoticComponent<CustomResourcePickerProps<Resource> & {
37
+ api: CommerceAPIOperations;
38
+ resourceName: string;
39
+ omitIds?: string[];
40
+ title?: string;
41
+ }> & {
42
+ readonly type: (props: ResourcePickerProps) => React.JSX.Element;
38
43
  };
39
44
  export declare const ResourcesPickerButton: React.FC<ResourcesPickerButtonProps>;
@@ -1 +1 @@
1
- {"version":3,"file":"editorSdk/CommandBus.js","sources":["../../src/editorSdk/CommandBus.ts"],"sourcesContent":["import type { Command } from \"./createCommand.js\";\nexport * from \"./createCommand.js\";\n\nconst INTERNAL_STOP = Symbol(\"INTERNAL_STOP\");\n\nexport type CommandHandler<T> = (\n payload: T,\n control: CommandHandlerControl\n) => void | typeof INTERNAL_STOP | Promise<void | typeof INTERNAL_STOP>;\n\nexport type CommandHandlerControl = {\n stop: () => typeof INTERNAL_STOP;\n};\n\nexport enum CommandPriority {\n LOW = -100,\n NORMAL = 0,\n HIGH = 100,\n CRITICAL = 1000\n}\n\nexport class CommandBus {\n private handlers = new Map<\n string,\n { priority: number; handler: (payload: any, control: CommandHandlerControl) => any }[]\n >();\n\n private middleware: ((\n type: string,\n payload: any,\n next: (payload: any) => Promise<void>\n ) => Promise<void>)[] = [];\n\n register<T>(\n command: Command<T>,\n handler: CommandHandler<T>,\n priority: CommandPriority = CommandPriority.NORMAL\n ): () => void {\n const list = this.handlers.get(command.type) ?? [];\n\n const entry = { handler, priority };\n list.push(entry);\n list.sort((a, b) => b.priority - a.priority);\n this.handlers.set(command.type, list);\n\n // Return an unregister function\n return () => {\n const current = this.handlers.get(command.type);\n if (!current) {\n return;\n }\n\n const index = current.indexOf(entry);\n\n if (index !== -1) {\n current.splice(index, 1);\n }\n\n if (current.length === 0) {\n this.handlers.delete(command.type);\n }\n };\n }\n\n use(mw: (type: string, payload: any, next: (payload: any) => Promise<void>) => Promise<void>) {\n this.middleware.push(mw);\n }\n\n async execute<T>(command: Command<T>, payload?: T) {\n const list = this.handlers.get(command.type) ?? [];\n\n const runHandlers = async (p?: T) => {\n const control: CommandHandlerControl = {\n stop: () => INTERNAL_STOP\n };\n\n for (const entry of list) {\n const result = await entry.handler(p, control);\n if (result === INTERNAL_STOP) {\n break;\n }\n }\n };\n\n const composed = this.middleware.reduceRight(\n (next, mw) => async (p?: T) => mw(command.type, p, next),\n runHandlers\n );\n\n // console.log(\"[Execute Command]\", command.type, payload);\n await composed(payload);\n }\n}\n"],"names":["INTERNAL_STOP","Symbol","CommandPriority","CommandBus","command","handler","priority","list","entry","a","b","current","index","mw","payload","runHandlers","p","control","result","composed","next","Map"],"mappings":";AAGA,MAAMA,gBAAgBC,OAAO;AAWtB,IAAKC,6BAAeA,WAAAA,GAAAA,SAAfA,eAAe;;;;;WAAfA;;AAOL,MAAMC;IAYT,SACIC,OAAmB,EACnBC,OAA0B,EAC1BC,WAAAA,CAAkD,EACxC;QACV,MAAMC,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAACH,QAAQ,IAAI,KAAK,EAAE;QAElD,MAAMI,QAAQ;YAAEH;YAASC;QAAS;QAClCC,KAAK,IAAI,CAACC;QACVD,KAAK,IAAI,CAAC,CAACE,GAAGC,IAAMA,EAAE,QAAQ,GAAGD,EAAE,QAAQ;QAC3C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAACL,QAAQ,IAAI,EAAEG;QAGhC,OAAO;YACH,MAAMI,UAAU,IAAI,CAAC,QAAQ,CAAC,GAAG,CAACP,QAAQ,IAAI;YAC9C,IAAI,CAACO,SACD;YAGJ,MAAMC,QAAQD,QAAQ,OAAO,CAACH;YAE9B,IAAII,AAAU,OAAVA,OACAD,QAAQ,MAAM,CAACC,OAAO;YAG1B,IAAID,AAAmB,MAAnBA,QAAQ,MAAM,EACd,IAAI,CAAC,QAAQ,CAAC,MAAM,CAACP,QAAQ,IAAI;QAEzC;IACJ;IAEA,IAAIS,EAAwF,EAAE;QAC1F,IAAI,CAAC,UAAU,CAAC,IAAI,CAACA;IACzB;IAEA,MAAM,QAAWT,OAAmB,EAAEU,OAAW,EAAE;QAC/C,MAAMP,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAACH,QAAQ,IAAI,KAAK,EAAE;QAElD,MAAMW,cAAc,OAAOC;YACvB,MAAMC,UAAiC;gBACnC,MAAM,IAAMjB;YAChB;YAEA,KAAK,MAAMQ,SAASD,KAAM;gBACtB,MAAMW,SAAS,MAAMV,MAAM,OAAO,CAACQ,GAAGC;gBACtC,IAAIC,WAAWlB,eACX;YAER;QACJ;QAEA,MAAMmB,WAAW,IAAI,CAAC,UAAU,CAAC,WAAW,CACxC,CAACC,MAAMP,KAAO,OAAOG,IAAUH,GAAGT,QAAQ,IAAI,EAAEY,GAAGI,OACnDL;QAIJ,MAAMI,SAASL;IACnB;;aArEQ,QAAQ,GAAG,IAAIO;aAKf,UAAU,GAIM,EAAE;;AA6D9B"}
1
+ {"version":3,"file":"editorSdk/CommandBus.js","sources":["../../src/editorSdk/CommandBus.ts"],"sourcesContent":["import type { Command } from \"./createCommand.js\";\nexport * from \"./createCommand.js\";\n\nconst INTERNAL_STOP = Symbol(\"INTERNAL_STOP\");\n\nexport type CommandHandler<T> = (\n payload: T,\n control: CommandHandlerControl\n) => void | typeof INTERNAL_STOP | Promise<void | typeof INTERNAL_STOP>;\n\nexport type CommandHandlerControl = {\n stop: () => typeof INTERNAL_STOP;\n};\n\nexport enum CommandPriority {\n LOW = -100,\n NORMAL = 0,\n HIGH = 100,\n CRITICAL = 1000\n}\n\nexport class CommandBus {\n private handlers = new Map<\n string,\n { priority: number; handler: (payload: any, control: CommandHandlerControl) => any }[]\n >();\n\n private middleware: ((\n type: string,\n payload: any,\n next: (payload: any) => Promise<void>\n ) => Promise<void>)[] = [];\n\n register<T>(\n command: Command<T>,\n handler: CommandHandler<T>,\n priority: CommandPriority = CommandPriority.NORMAL\n ): () => void {\n const list = this.handlers.get(command.type) ?? [];\n\n const entry = { handler, priority };\n list.push(entry);\n list.sort((a, b) => b.priority - a.priority);\n this.handlers.set(command.type, list);\n\n // Return an unregister function\n return () => {\n const current = this.handlers.get(command.type);\n if (!current) {\n return;\n }\n\n const index = current.indexOf(entry);\n\n if (index !== -1) {\n current.splice(index, 1);\n }\n\n if (current.length === 0) {\n this.handlers.delete(command.type);\n }\n };\n }\n\n use(mw: (type: string, payload: any, next: (payload: any) => Promise<void>) => Promise<void>) {\n this.middleware.push(mw);\n }\n\n async execute<T>(command: Command<T>, payload?: T) {\n const list = this.handlers.get(command.type) ?? [];\n\n const runHandlers = async (p?: T) => {\n const control: CommandHandlerControl = {\n stop: () => INTERNAL_STOP\n };\n\n for (const entry of list) {\n const result = await entry.handler(p, control);\n if (result === INTERNAL_STOP) {\n break;\n }\n }\n };\n\n const composed = this.middleware.reduceRight(\n (next, mw) => async (p?: T) => mw(command.type, p, next),\n runHandlers\n );\n\n // console.log(\"[Execute Command]\", command.type, payload);\n await composed(payload);\n }\n}\n"],"names":["INTERNAL_STOP","Symbol","CommandPriority","CommandBus","command","handler","priority","list","entry","a","b","current","index","mw","payload","runHandlers","p","control","result","composed","next","Map"],"mappings":";AAGA,MAAMA,gBAAgBC,OAAO;AAWtB,IAAKC,6BAAeA,WAAAA,GAAAA,SAAfA,eAAe;;gDAEd;8CACF;kDACI;WAJHA;;AAOL,MAAMC;IAYT,SACIC,OAAmB,EACnBC,OAA0B,EAC1BC,WApBK,CAoB6C,EACxC;QACV,MAAMC,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAACH,QAAQ,IAAI,KAAK,EAAE;QAElD,MAAMI,QAAQ;YAAEH;YAASC;QAAS;QAClCC,KAAK,IAAI,CAACC;QACVD,KAAK,IAAI,CAAC,CAACE,GAAGC,IAAMA,EAAE,QAAQ,GAAGD,EAAE,QAAQ;QAC3C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAACL,QAAQ,IAAI,EAAEG;QAGhC,OAAO;YACH,MAAMI,UAAU,IAAI,CAAC,QAAQ,CAAC,GAAG,CAACP,QAAQ,IAAI;YAC9C,IAAI,CAACO,SACD;YAGJ,MAAMC,QAAQD,QAAQ,OAAO,CAACH;YAE9B,IAAII,AAAU,OAAVA,OACAD,QAAQ,MAAM,CAACC,OAAO;YAG1B,IAAID,AAAmB,MAAnBA,QAAQ,MAAM,EACd,IAAI,CAAC,QAAQ,CAAC,MAAM,CAACP,QAAQ,IAAI;QAEzC;IACJ;IAEA,IAAIS,EAAwF,EAAE;QAC1F,IAAI,CAAC,UAAU,CAAC,IAAI,CAACA;IACzB;IAEA,MAAM,QAAWT,OAAmB,EAAEU,OAAW,EAAE;QAC/C,MAAMP,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAACH,QAAQ,IAAI,KAAK,EAAE;QAElD,MAAMW,cAAc,OAAOC;YACvB,MAAMC,UAAiC;gBACnC,MAAM,IAAMjB;YAChB;YAEA,KAAK,MAAMQ,SAASD,KAAM;gBACtB,MAAMW,SAAS,MAAMV,MAAM,OAAO,CAACQ,GAAGC;gBACtC,IAAIC,WAAWlB,eACX;YAER;QACJ;QAEA,MAAMmB,WAAW,IAAI,CAAC,UAAU,CAAC,WAAW,CACxC,CAACC,MAAMP,KAAO,OAAOG,IAAUH,GAAGT,QAAQ,IAAI,EAAEY,GAAGI,OACnDL;QAIJ,MAAMI,SAASL;IACnB;;aArEQ,QAAQ,GAAG,IAAIO;aAKf,UAAU,GAIM,EAAE;;AA6D9B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webiny/app-website-builder",
3
- "version": "6.5.0-beta.4",
3
+ "version": "6.5.0-beta.5",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./index.js",
@@ -16,56 +16,56 @@
16
16
  "@emotion/css": "11.13.5",
17
17
  "@emotion/react": "11.14.0",
18
18
  "@emotion/styled": "11.14.1",
19
- "@lexical/utils": "0.48.0",
19
+ "@lexical/utils": "0.51.0",
20
20
  "@monaco-editor/react": "4.7.0",
21
21
  "@types/react": "18.3.31",
22
- "@webiny/admin-ui": "6.5.0-beta.4",
23
- "@webiny/app": "6.5.0-beta.4",
24
- "@webiny/app-aco": "6.5.0-beta.4",
25
- "@webiny/app-admin": "6.5.0-beta.4",
26
- "@webiny/app-headless-cms": "6.5.0-beta.4",
27
- "@webiny/app-headless-cms-common": "6.5.0-beta.4",
28
- "@webiny/app-utils": "6.5.0-beta.4",
29
- "@webiny/di": "1.0.2",
30
- "@webiny/feature": "6.5.0-beta.4",
31
- "@webiny/form": "6.5.0-beta.4",
32
- "@webiny/frontend-settings": "6.5.0-beta.4",
33
- "@webiny/icons": "6.5.0-beta.4",
34
- "@webiny/languages": "6.5.0-beta.4",
35
- "@webiny/lexical-converter": "6.5.0-beta.4",
36
- "@webiny/lexical-editor": "6.5.0-beta.4",
37
- "@webiny/lexical-nodes": "6.5.0-beta.4",
38
- "@webiny/lexical-theme": "6.5.0-beta.4",
39
- "@webiny/react-composition": "6.5.0-beta.4",
40
- "@webiny/react-properties": "6.5.0-beta.4",
41
- "@webiny/utils": "6.5.0-beta.4",
42
- "@webiny/validation": "6.5.0-beta.4",
43
- "@webiny/website-builder-sdk": "6.5.0-beta.4",
22
+ "@webiny/admin-ui": "6.5.0-beta.5",
23
+ "@webiny/app": "6.5.0-beta.5",
24
+ "@webiny/app-aco": "6.5.0-beta.5",
25
+ "@webiny/app-admin": "6.5.0-beta.5",
26
+ "@webiny/app-headless-cms": "6.5.0-beta.5",
27
+ "@webiny/app-headless-cms-common": "6.5.0-beta.5",
28
+ "@webiny/app-utils": "6.5.0-beta.5",
29
+ "@webiny/di": "1.1.0",
30
+ "@webiny/feature": "6.5.0-beta.5",
31
+ "@webiny/form": "6.5.0-beta.5",
32
+ "@webiny/frontend-settings": "6.5.0-beta.5",
33
+ "@webiny/icons": "6.5.0-beta.5",
34
+ "@webiny/languages": "6.5.0-beta.5",
35
+ "@webiny/lexical-converter": "6.5.0-beta.5",
36
+ "@webiny/lexical-editor": "6.5.0-beta.5",
37
+ "@webiny/lexical-nodes": "6.5.0-beta.5",
38
+ "@webiny/lexical-theme": "6.5.0-beta.5",
39
+ "@webiny/react-composition": "6.5.0-beta.5",
40
+ "@webiny/react-properties": "6.5.0-beta.5",
41
+ "@webiny/utils": "6.5.0-beta.5",
42
+ "@webiny/validation": "6.5.0-beta.5",
43
+ "@webiny/website-builder-sdk": "6.5.0-beta.5",
44
44
  "classnames": "2.5.1",
45
45
  "deep-equal": "2.2.3",
46
46
  "graphql": "16.14.2",
47
47
  "is-hotkey": "0.2.0",
48
48
  "lodash": "4.18.1",
49
- "matcher": "6.0.0",
50
- "mobx": "6.16.1",
51
- "mobx-react-lite": "4.1.1",
49
+ "matcher": "7.0.0",
50
+ "mobx": "7.0.5",
51
+ "mobx-react-lite": "5.1.0",
52
52
  "pluralize": "8.0.0",
53
- "radix-ui": "1.6.4",
53
+ "radix-ui": "1.6.7",
54
54
  "react": "18.3.1",
55
55
  "react-dnd": "16.0.1",
56
56
  "react-dnd-html5-backend": "16.0.1",
57
57
  "react-dom": "18.3.1",
58
58
  "slugify": "1.6.9",
59
- "zod": "4.4.3"
59
+ "zod": "4.6.5"
60
60
  },
61
61
  "devDependencies": {
62
62
  "@types/deep-equal": "1.0.4",
63
63
  "@types/is-hotkey": "0.1.10",
64
- "@webiny/build-tools": "6.5.0-beta.4",
64
+ "@webiny/build-tools": "6.5.0-beta.5",
65
65
  "execa": "5.1.1",
66
66
  "rimraf": "6.1.3",
67
67
  "typescript": "7.0.2",
68
- "vitest": "4.1.10"
68
+ "vitest": "5.0.2"
69
69
  },
70
70
  "publishConfig": {
71
71
  "access": "public"
@@ -1,6 +1,6 @@
1
1
  import React from "react";
2
2
  export declare const CREATE_PAGE_DIALOG = "createPage";
3
3
  export declare const useCreatePageDialog: () => (folderId: string) => void;
4
- export declare const CreatePageDialog: (() => React.JSX.Element) & {
5
- displayName: string;
4
+ export declare const CreatePageDialog: (() => React.JSX.Element) & React.NamedExoticComponent<unknown> & {
5
+ readonly type: () => React.JSX.Element;
6
6
  };
@@ -6,6 +6,6 @@ export interface PageSettingsDrawerProps {
6
6
  onClose: () => void;
7
7
  onSave: () => void;
8
8
  }
9
- export declare const PageSettingsDrawer: (({ presenter, open, onClose, onSave }: PageSettingsDrawerProps) => React.JSX.Element) & {
10
- displayName: string;
9
+ export declare const PageSettingsDrawer: (({ presenter, open, onClose, onSave }: PageSettingsDrawerProps) => React.JSX.Element) & React.NamedExoticComponent<PageSettingsDrawerProps> & {
10
+ readonly type: ({ presenter, open, onClose, onSave }: PageSettingsDrawerProps) => React.JSX.Element;
11
11
  };
@@ -1 +1 @@
1
- {"version":3,"file":"presentation/pages/PageList/PageListPresenter.test.js","sources":["../../../../src/presentation/pages/PageList/PageListPresenter.test.ts"],"sourcesContent":["import { describe, it, expect, vi, beforeEach } from \"vitest\";\nimport { observable } from \"mobx\";\nimport { Container } from \"@webiny/di\";\nimport { ListCache } from \"@webiny/app-admin/features/listCache/index.js\";\nimport { ListPresenter } from \"@webiny/app-admin/presentation/listPresenter/ListPresenter.js\";\nimport { FolderTreePresenter } from \"@webiny/app-aco/presentation/folderTree/abstractions.js\";\nimport { GetDescendantFoldersUseCase } from \"@webiny/app-aco/features/folders/getDescendantFolders/abstractions.js\";\nimport { Confirmation } from \"@webiny/app-admin/features/confirmation/abstractions.js\";\nimport { Page } from \"~/domain/Page/Page.js\";\nimport { pageRevisionsCacheFactory } from \"~/domain/PageRevision/index.js\";\nimport {\n ListPagesGateway,\n type IListPagesGatewayParams,\n type IListPagesGatewayResult\n} from \"~/features/pages/listPages/abstractions.js\";\nimport { ListPagesUseCase } from \"~/features/pages/listPages/ListPagesUseCase.js\";\nimport { ListPagesRepository } from \"~/features/pages/listPages/ListPagesRepository.js\";\nimport {\n FullPageCache,\n PageListCache,\n PageRevisionsCache\n} from \"~/features/pages/shared/abstractions.js\";\nimport { PublishPageGateway } from \"~/features/pages/publishPage/abstractions.js\";\nimport { PublishPageUseCase as PublishPageUseCaseImpl } from \"~/features/pages/publishPage/PublishPageUseCase.js\";\nimport { PublishPageRepository } from \"~/features/pages/publishPage/PublishPageRepository.js\";\nimport { DeletePageUseCase } from \"~/features/pages/deletePage/abstractions.js\";\nimport { UnpublishPageUseCase } from \"~/features/pages/unpublishPage/abstractions.js\";\nimport { MovePageUseCase } from \"~/features/pages/movePage/abstractions.js\";\nimport { DuplicatePageUseCase } from \"~/features/pages/duplicatePage/abstractions.js\";\nimport { PageListPresenter as Abstraction } from \"./abstractions.js\";\nimport { PageListPresenter } from \"./PageListPresenter.js\";\n\nconst TOTAL_PAGES = 300;\nconst PAGE_SIZE = 50;\nconst BASE_TIME = Date.UTC(2026, 0, 1);\n\nconst minutes = (n: number) => new Date(BASE_TIME + n * 60_000).toISOString();\n\n/**\n * A higher index means a more recently *saved* page, but a less recently *created* one,\n * so sorting by `savedOn` and by `createdOn` produce opposite orders.\n */\nfunction createPages(count: number): Page[] {\n return Array.from({ length: count }, (_, i) =>\n Page.create({\n id: `page-${i}#0001`,\n entryId: `page-${i}`,\n location: { folderId: \"root\" },\n properties: { title: `Page ${i}` },\n createdOn: minutes(count - i),\n savedOn: minutes(i)\n })\n );\n}\n\n/**\n * Simulates the API: filters by folder, sorts by the requested field, and paginates\n * with an offset-based cursor.\n */\nfunction createGateway(pages: Page[]): ListPagesGateway.Interface {\n return {\n execute: vi.fn(\n async (params: IListPagesGatewayParams): Promise<IListPagesGatewayResult> => {\n const [sort = \"savedOn_DESC\"] = params.sort ?? [];\n const [field, direction] = sort.split(\"_\") as [keyof Page, \"ASC\" | \"DESC\"];\n const multiplier = direction === \"ASC\" ? 1 : -1;\n\n const folderId = (params.where?.location as { folderId?: string })?.folderId;\n const sorted = pages\n .filter(page => !folderId || page.location.folderId === folderId)\n .sort((a, b) => multiplier * String(a[field]).localeCompare(String(b[field])));\n\n const offset = params.after ? Number(params.after) : 0;\n const limit = params.limit ?? PAGE_SIZE;\n const data = sorted.slice(offset, offset + limit);\n const next = offset + data.length;\n const hasMoreItems = next < sorted.length;\n\n return {\n data,\n meta: {\n cursor: hasMoreItems ? String(next) : null,\n hasMoreItems,\n totalCount: sorted.length\n }\n };\n }\n )\n };\n}\n\nfunction createFolderTreePresenter(): FolderTreePresenter.Interface {\n const vm = observable({\n folders: [],\n tree: [],\n currentFolderId: null as string | null,\n currentFolder: null,\n loading: false,\n operation: { active: false, mode: null },\n isRootFolder: true,\n currentFolderTitle: \"All pages\",\n childFolders: [],\n loadingNodeIds: []\n });\n\n return {\n get vm() {\n return vm as unknown as FolderTreePresenter.Interface[\"vm\"];\n },\n selectFolder: vi.fn(),\n createFolder: vi.fn(),\n editFolder: vi.fn(),\n deleteFolder: vi.fn().mockResolvedValue(undefined),\n moveFolder: vi.fn().mockResolvedValue(undefined),\n loadChildFolders: vi.fn().mockResolvedValue(undefined),\n canManageStructure: vi.fn().mockReturnValue(true),\n getAncestorIds: vi.fn().mockReturnValue([]),\n submitOperation: vi.fn().mockResolvedValue(true),\n cancelOperation: vi.fn(),\n onFolderChange: vi.fn().mockReturnValue(() => {})\n };\n}\n\nconst noopUseCase = { execute: vi.fn() };\n\n/**\n * Expected entry IDs for a contiguous range of page indexes, in the given order.\n */\nfunction range(from: number, to: number): string[] {\n const step = from <= to ? 1 : -1;\n const ids: string[] = [];\n for (let i = from; step > 0 ? i <= to : i >= to; i += step) {\n ids.push(`page-${i}`);\n }\n return ids;\n}\n\ndescribe(\"PageListPresenter\", () => {\n let presenter: Abstraction.Interface;\n let cache: ListCache<Page>;\n\n /**\n * Simulates the publish API: publishing is not a content modification, so the page\n * comes back with its `savedOn` unchanged.\n */\n const publishGateway: PublishPageGateway.Interface = {\n execute: vi.fn(async (id: string) => {\n const page = cache.getItem(p => p.id === id)!;\n return { ...page, status: \"published\" } as any;\n })\n };\n\n const rowIds = () => presenter.list.vm.rows.map(row => row.entryId);\n\n const waitForQuery = async (field: string, direction: \"ASC\" | \"DESC\") => {\n await vi.waitFor(() => {\n const sort = presenter.list.vm.appliedQuery?.sort;\n expect(sort).toEqual({ field, direction });\n expect(presenter.list.vm.pagination.loading).toBe(false);\n });\n };\n\n const initAndWait = async () => {\n presenter.init();\n await waitForQuery(\"savedOn\", \"DESC\");\n };\n\n const loadAll = async () => {\n while (presenter.list.vm.pagination.hasMore) {\n await presenter.list.actions.loadMore();\n }\n };\n\n beforeEach(() => {\n const container = new Container();\n\n cache = new ListCache<Page>(\"entryId\");\n container.registerInstance(PageListCache, cache);\n container.registerInstance(ListPagesGateway, createGateway(createPages(TOTAL_PAGES)));\n container.register(ListPagesRepository).inSingletonScope();\n container.register(ListPagesUseCase);\n\n container.register(ListPresenter);\n container.registerInstance(FolderTreePresenter, createFolderTreePresenter());\n container.registerInstance(Confirmation, { confirm: vi.fn() } as Confirmation.Interface);\n container.registerInstance(GetDescendantFoldersUseCase, { execute: () => [] });\n container.registerInstance(DeletePageUseCase, noopUseCase as any);\n container.registerInstance(FullPageCache, new ListCache<Page>(\"id\"));\n container.registerInstance(PageRevisionsCache, pageRevisionsCacheFactory.getCache());\n container.registerInstance(PublishPageGateway, publishGateway);\n container.register(PublishPageRepository).inSingletonScope();\n container.register(PublishPageUseCaseImpl);\n container.registerInstance(UnpublishPageUseCase, noopUseCase as any);\n container.registerInstance(MovePageUseCase, noopUseCase as any);\n container.registerInstance(DuplicatePageUseCase, noopUseCase as any);\n\n container.register(PageListPresenter);\n\n presenter = container.resolve(Abstraction);\n });\n\n describe(\"pagination\", () => {\n it(\"should show the most recently saved pages first\", async () => {\n await initAndWait();\n\n expect(rowIds()).toEqual(range(299, 250));\n });\n\n it(\"should append the next batch of pages to the bottom of the list\", async () => {\n await initAndWait();\n\n await presenter.list.actions.loadMore();\n\n expect(rowIds()).toEqual(range(299, 200));\n });\n\n it(\"should keep all pages in order after loading everything\", async () => {\n await initAndWait();\n\n await loadAll();\n\n expect(rowIds()).toEqual(range(299, 0));\n });\n });\n\n describe(\"changing the sort\", () => {\n it(\"should show only the first batch, in the new direction\", async () => {\n await initAndWait();\n\n presenter.list.actions.sort.set(\"savedOn\", \"ASC\");\n await waitForQuery(\"savedOn\", \"ASC\");\n\n expect(rowIds()).toEqual(range(0, 49));\n });\n\n it(\"should show only the first batch, sorted by the new field\", async () => {\n await initAndWait();\n\n presenter.list.actions.sort.set(\"createdOn\", \"DESC\");\n await waitForQuery(\"createdOn\", \"DESC\");\n\n // `createdOn` runs opposite to `savedOn`, so the newest created page is page-0.\n expect(rowIds()).toEqual(range(0, 49));\n });\n\n it(\"should paginate in the new order\", async () => {\n await initAndWait();\n\n presenter.list.actions.sort.set(\"savedOn\", \"ASC\");\n await waitForQuery(\"savedOn\", \"ASC\");\n await presenter.list.actions.loadMore();\n\n expect(rowIds()).toEqual(range(0, 99));\n });\n\n it(\"should restore the original order when switching back\", async () => {\n await initAndWait();\n await presenter.list.actions.loadMore();\n\n presenter.list.actions.sort.set(\"savedOn\", \"ASC\");\n await waitForQuery(\"savedOn\", \"ASC\");\n\n presenter.list.actions.sort.set(\"savedOn\", \"DESC\");\n await waitForQuery(\"savedOn\", \"DESC\");\n\n expect(rowIds()).toEqual(range(299, 250));\n });\n });\n\n describe(\"local cache changes\", () => {\n const newPage = () =>\n Page.create({\n id: \"page-new#0001\",\n entryId: \"page-new\",\n location: { folderId: \"root\" },\n properties: { title: \"New page\" },\n createdOn: minutes(TOTAL_PAGES + 1),\n savedOn: minutes(TOTAL_PAGES + 1)\n });\n\n it(\"should show a created page at the top when it sorts first\", async () => {\n await initAndWait();\n\n cache.addItems([newPage()]);\n\n expect(rowIds()).toEqual([\"page-new\", ...range(299, 250)]);\n });\n\n it(\"should not show a created page that sorts past the loaded pages\", async () => {\n await initAndWait();\n presenter.list.actions.sort.set(\"savedOn\", \"ASC\");\n await waitForQuery(\"savedOn\", \"ASC\");\n\n cache.addItems([newPage()]);\n\n // The new page is the most recently saved, so in ASC order it belongs at the very\n // end, after 250 pages that are not loaded yet.\n expect(rowIds()).toEqual(range(0, 49));\n });\n\n it(\"should show a created page in its sort position once everything is loaded\", async () => {\n await initAndWait();\n presenter.list.actions.sort.set(\"savedOn\", \"ASC\");\n await waitForQuery(\"savedOn\", \"ASC\");\n await loadAll();\n\n cache.addItems([newPage()]);\n\n expect(rowIds()).toEqual([...range(0, 299), \"page-new\"]);\n });\n\n it(\"should move an updated page to its new sort position\", async () => {\n await initAndWait();\n\n const page = cache.getItem(p => p.entryId === \"page-260\")!;\n cache.addItems([Page.create({ ...page, savedOn: minutes(TOTAL_PAGES + 1) })]);\n\n expect(rowIds()).toEqual([\"page-260\", ...range(299, 261), ...range(259, 250)]);\n });\n });\n\n describe(\"publishing\", () => {\n it(\"should keep a published page in its position\", async () => {\n await initAndWait();\n const before = rowIds();\n\n await presenter.publishPage(\"page-260#0001\");\n\n expect(rowIds()).toEqual(before);\n const published = presenter.list.vm.rows.find(row => row.entryId === \"page-260\");\n expect(published?.status).toBe(\"published\");\n });\n\n it(\"should keep a published page in its position after loading more pages\", async () => {\n await initAndWait();\n await presenter.list.actions.loadMore();\n const before = rowIds();\n\n await presenter.publishPage(\"page-210#0001\");\n\n expect(rowIds()).toEqual(before);\n });\n });\n});\n"],"names":["TOTAL_PAGES","PAGE_SIZE","BASE_TIME","Date","minutes","n","createPages","count","Array","_","i","Page","createGateway","pages","vi","params","sort","field","direction","multiplier","folderId","sorted","page","a","b","String","offset","Number","limit","data","next","hasMoreItems","createFolderTreePresenter","vm","observable","undefined","noopUseCase","range","from","to","step","ids","describe","presenter","cache","publishGateway","id","p","rowIds","row","waitForQuery","expect","initAndWait","loadAll","beforeEach","container","Container","ListCache","PageListCache","ListPagesGateway","ListPagesRepository","ListPagesUseCase","ListPresenter","FolderTreePresenter","Confirmation","GetDescendantFoldersUseCase","DeletePageUseCase","FullPageCache","PageRevisionsCache","pageRevisionsCacheFactory","PublishPageGateway","PublishPageRepository","PublishPageUseCaseImpl","UnpublishPageUseCase","MovePageUseCase","DuplicatePageUseCase","PageListPresenter","Abstraction","it","newPage","before","published"],"mappings":"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"}
1
+ {"version":3,"file":"presentation/pages/PageList/PageListPresenter.test.js","sources":["../../../../src/presentation/pages/PageList/PageListPresenter.test.ts"],"sourcesContent":["import { describe, it, expect, vi, beforeEach } from \"vitest\";\nimport { observable } from \"mobx\";\nimport { Container } from \"@webiny/di\";\nimport { ListCache } from \"@webiny/app-admin/features/listCache/index.js\";\nimport { ListPresenter } from \"@webiny/app-admin/presentation/listPresenter/ListPresenter.js\";\nimport { FolderTreePresenter } from \"@webiny/app-aco/presentation/folderTree/abstractions.js\";\nimport { GetDescendantFoldersUseCase } from \"@webiny/app-aco/features/folders/getDescendantFolders/abstractions.js\";\nimport { Confirmation } from \"@webiny/app-admin/features/confirmation/abstractions.js\";\nimport { Page } from \"~/domain/Page/Page.js\";\nimport { pageRevisionsCacheFactory } from \"~/domain/PageRevision/index.js\";\nimport {\n ListPagesGateway,\n type IListPagesGatewayParams,\n type IListPagesGatewayResult\n} from \"~/features/pages/listPages/abstractions.js\";\nimport { ListPagesUseCase } from \"~/features/pages/listPages/ListPagesUseCase.js\";\nimport { ListPagesRepository } from \"~/features/pages/listPages/ListPagesRepository.js\";\nimport {\n FullPageCache,\n PageListCache,\n PageRevisionsCache\n} from \"~/features/pages/shared/abstractions.js\";\nimport { PublishPageGateway } from \"~/features/pages/publishPage/abstractions.js\";\nimport { PublishPageUseCase as PublishPageUseCaseImpl } from \"~/features/pages/publishPage/PublishPageUseCase.js\";\nimport { PublishPageRepository } from \"~/features/pages/publishPage/PublishPageRepository.js\";\nimport { DeletePageUseCase } from \"~/features/pages/deletePage/abstractions.js\";\nimport { UnpublishPageUseCase } from \"~/features/pages/unpublishPage/abstractions.js\";\nimport { MovePageUseCase } from \"~/features/pages/movePage/abstractions.js\";\nimport { DuplicatePageUseCase } from \"~/features/pages/duplicatePage/abstractions.js\";\nimport { PageListPresenter as Abstraction } from \"./abstractions.js\";\nimport { PageListPresenter } from \"./PageListPresenter.js\";\n\nconst TOTAL_PAGES = 300;\nconst PAGE_SIZE = 50;\nconst BASE_TIME = Date.UTC(2026, 0, 1);\n\nconst minutes = (n: number) => new Date(BASE_TIME + n * 60_000).toISOString();\n\n/**\n * A higher index means a more recently *saved* page, but a less recently *created* one,\n * so sorting by `savedOn` and by `createdOn` produce opposite orders.\n */\nfunction createPages(count: number): Page[] {\n return Array.from({ length: count }, (_, i) =>\n Page.create({\n id: `page-${i}#0001`,\n entryId: `page-${i}`,\n location: { folderId: \"root\" },\n properties: { title: `Page ${i}` },\n createdOn: minutes(count - i),\n savedOn: minutes(i)\n })\n );\n}\n\n/**\n * Simulates the API: filters by folder, sorts by the requested field, and paginates\n * with an offset-based cursor.\n */\nfunction createGateway(pages: Page[]): ListPagesGateway.Interface {\n return {\n execute: vi.fn(\n async (params: IListPagesGatewayParams): Promise<IListPagesGatewayResult> => {\n const [sort = \"savedOn_DESC\"] = params.sort ?? [];\n const [field, direction] = sort.split(\"_\") as [keyof Page, \"ASC\" | \"DESC\"];\n const multiplier = direction === \"ASC\" ? 1 : -1;\n\n const folderId = (params.where?.location as { folderId?: string })?.folderId;\n const sorted = pages\n .filter(page => !folderId || page.location.folderId === folderId)\n .sort((a, b) => multiplier * String(a[field]).localeCompare(String(b[field])));\n\n const offset = params.after ? Number(params.after) : 0;\n const limit = params.limit ?? PAGE_SIZE;\n const data = sorted.slice(offset, offset + limit);\n const next = offset + data.length;\n const hasMoreItems = next < sorted.length;\n\n return {\n data,\n meta: {\n cursor: hasMoreItems ? String(next) : null,\n hasMoreItems,\n totalCount: sorted.length\n }\n };\n }\n )\n };\n}\n\nfunction createFolderTreePresenter(): FolderTreePresenter.Interface {\n const vm = observable({\n folders: [],\n tree: [],\n currentFolderId: null as string | null,\n currentFolder: null,\n loading: false,\n operation: { active: false, mode: null },\n isRootFolder: true,\n currentFolderTitle: \"All pages\",\n childFolders: [],\n loadingNodeIds: []\n });\n\n return {\n get vm() {\n return vm as unknown as FolderTreePresenter.Interface[\"vm\"];\n },\n selectFolder: vi.fn(),\n createFolder: vi.fn(),\n editFolder: vi.fn(),\n deleteFolder: vi.fn().mockResolvedValue(undefined),\n moveFolder: vi.fn().mockResolvedValue(undefined),\n loadChildFolders: vi.fn().mockResolvedValue(undefined),\n canManageStructure: vi.fn().mockReturnValue(true),\n getAncestorIds: vi.fn().mockReturnValue([]),\n submitOperation: vi.fn().mockResolvedValue(true),\n cancelOperation: vi.fn(),\n onFolderChange: vi.fn().mockReturnValue(() => {})\n };\n}\n\nconst noopUseCase = { execute: vi.fn() };\n\n/**\n * Expected entry IDs for a contiguous range of page indexes, in the given order.\n */\nfunction range(from: number, to: number): string[] {\n const step = from <= to ? 1 : -1;\n const ids: string[] = [];\n for (let i = from; step > 0 ? i <= to : i >= to; i += step) {\n ids.push(`page-${i}`);\n }\n return ids;\n}\n\ndescribe(\"PageListPresenter\", () => {\n let presenter: Abstraction.Interface;\n let cache: ListCache<Page>;\n\n /**\n * Simulates the publish API: publishing is not a content modification, so the page\n * comes back with its `savedOn` unchanged.\n */\n const publishGateway: PublishPageGateway.Interface = {\n execute: vi.fn(async (id: string) => {\n const page = cache.getItem(p => p.id === id)!;\n return { ...page, status: \"published\" } as any;\n })\n };\n\n const rowIds = () => presenter.list.vm.rows.map(row => row.entryId);\n\n const waitForQuery = async (field: string, direction: \"ASC\" | \"DESC\") => {\n await vi.waitFor(() => {\n const sort = presenter.list.vm.appliedQuery?.sort;\n expect(sort).toEqual({ field, direction });\n expect(presenter.list.vm.pagination.loading).toBe(false);\n });\n };\n\n const initAndWait = async () => {\n presenter.init();\n await waitForQuery(\"savedOn\", \"DESC\");\n };\n\n const loadAll = async () => {\n while (presenter.list.vm.pagination.hasMore) {\n await presenter.list.actions.loadMore();\n }\n };\n\n beforeEach(() => {\n const container = new Container();\n\n cache = new ListCache<Page>(\"entryId\");\n container.registerInstance(PageListCache, cache);\n container.registerInstance(ListPagesGateway, createGateway(createPages(TOTAL_PAGES)));\n container.register(ListPagesRepository).inSingletonScope();\n container.register(ListPagesUseCase);\n\n container.register(ListPresenter);\n container.registerInstance(FolderTreePresenter, createFolderTreePresenter());\n container.registerInstance(Confirmation, { confirm: vi.fn() } as Confirmation.Interface);\n container.registerInstance(GetDescendantFoldersUseCase, { execute: () => [] });\n container.registerInstance(DeletePageUseCase, noopUseCase as any);\n container.registerInstance(FullPageCache, new ListCache<Page>(\"id\"));\n container.registerInstance(PageRevisionsCache, pageRevisionsCacheFactory.getCache());\n container.registerInstance(PublishPageGateway, publishGateway);\n container.register(PublishPageRepository).inSingletonScope();\n container.register(PublishPageUseCaseImpl);\n container.registerInstance(UnpublishPageUseCase, noopUseCase as any);\n container.registerInstance(MovePageUseCase, noopUseCase as any);\n container.registerInstance(DuplicatePageUseCase, noopUseCase as any);\n\n container.register(PageListPresenter);\n\n presenter = container.resolve(Abstraction);\n });\n\n describe(\"pagination\", () => {\n it(\"should show the most recently saved pages first\", async () => {\n await initAndWait();\n\n expect(rowIds()).toEqual(range(299, 250));\n });\n\n it(\"should append the next batch of pages to the bottom of the list\", async () => {\n await initAndWait();\n\n await presenter.list.actions.loadMore();\n\n expect(rowIds()).toEqual(range(299, 200));\n });\n\n it(\"should keep all pages in order after loading everything\", async () => {\n await initAndWait();\n\n await loadAll();\n\n expect(rowIds()).toEqual(range(299, 0));\n });\n });\n\n describe(\"changing the sort\", () => {\n it(\"should show only the first batch, in the new direction\", async () => {\n await initAndWait();\n\n presenter.list.actions.sort.set(\"savedOn\", \"ASC\");\n await waitForQuery(\"savedOn\", \"ASC\");\n\n expect(rowIds()).toEqual(range(0, 49));\n });\n\n it(\"should show only the first batch, sorted by the new field\", async () => {\n await initAndWait();\n\n presenter.list.actions.sort.set(\"createdOn\", \"DESC\");\n await waitForQuery(\"createdOn\", \"DESC\");\n\n // `createdOn` runs opposite to `savedOn`, so the newest created page is page-0.\n expect(rowIds()).toEqual(range(0, 49));\n });\n\n it(\"should paginate in the new order\", async () => {\n await initAndWait();\n\n presenter.list.actions.sort.set(\"savedOn\", \"ASC\");\n await waitForQuery(\"savedOn\", \"ASC\");\n await presenter.list.actions.loadMore();\n\n expect(rowIds()).toEqual(range(0, 99));\n });\n\n it(\"should restore the original order when switching back\", async () => {\n await initAndWait();\n await presenter.list.actions.loadMore();\n\n presenter.list.actions.sort.set(\"savedOn\", \"ASC\");\n await waitForQuery(\"savedOn\", \"ASC\");\n\n presenter.list.actions.sort.set(\"savedOn\", \"DESC\");\n await waitForQuery(\"savedOn\", \"DESC\");\n\n expect(rowIds()).toEqual(range(299, 250));\n });\n });\n\n describe(\"local cache changes\", () => {\n const newPage = () =>\n Page.create({\n id: \"page-new#0001\",\n entryId: \"page-new\",\n location: { folderId: \"root\" },\n properties: { title: \"New page\" },\n createdOn: minutes(TOTAL_PAGES + 1),\n savedOn: minutes(TOTAL_PAGES + 1)\n });\n\n it(\"should show a created page at the top when it sorts first\", async () => {\n await initAndWait();\n\n cache.addItems([newPage()]);\n\n expect(rowIds()).toEqual([\"page-new\", ...range(299, 250)]);\n });\n\n it(\"should not show a created page that sorts past the loaded pages\", async () => {\n await initAndWait();\n presenter.list.actions.sort.set(\"savedOn\", \"ASC\");\n await waitForQuery(\"savedOn\", \"ASC\");\n\n cache.addItems([newPage()]);\n\n // The new page is the most recently saved, so in ASC order it belongs at the very\n // end, after 250 pages that are not loaded yet.\n expect(rowIds()).toEqual(range(0, 49));\n });\n\n it(\"should show a created page in its sort position once everything is loaded\", async () => {\n await initAndWait();\n presenter.list.actions.sort.set(\"savedOn\", \"ASC\");\n await waitForQuery(\"savedOn\", \"ASC\");\n await loadAll();\n\n cache.addItems([newPage()]);\n\n expect(rowIds()).toEqual([...range(0, 299), \"page-new\"]);\n });\n\n it(\"should move an updated page to its new sort position\", async () => {\n await initAndWait();\n\n const page = cache.getItem(p => p.entryId === \"page-260\")!;\n cache.addItems([Page.create({ ...page, savedOn: minutes(TOTAL_PAGES + 1) })]);\n\n expect(rowIds()).toEqual([\"page-260\", ...range(299, 261), ...range(259, 250)]);\n });\n });\n\n describe(\"publishing\", () => {\n it(\"should keep a published page in its position\", async () => {\n await initAndWait();\n const before = rowIds();\n\n await presenter.publishPage(\"page-260#0001\");\n\n expect(rowIds()).toEqual(before);\n const published = presenter.list.vm.rows.find(row => row.entryId === \"page-260\");\n expect(published?.status).toBe(\"published\");\n });\n\n it(\"should keep a published page in its position after loading more pages\", async () => {\n await initAndWait();\n await presenter.list.actions.loadMore();\n const before = rowIds();\n\n await presenter.publishPage(\"page-210#0001\");\n\n expect(rowIds()).toEqual(before);\n });\n });\n});\n"],"names":["TOTAL_PAGES","PAGE_SIZE","BASE_TIME","Date","minutes","n","createPages","count","Array","_","i","Page","createGateway","pages","vi","params","sort","field","direction","multiplier","folderId","sorted","page","a","b","String","offset","Number","limit","data","next","hasMoreItems","createFolderTreePresenter","vm","observable","undefined","noopUseCase","range","from","to","step","ids","describe","presenter","cache","publishGateway","id","p","rowIds","row","waitForQuery","expect","initAndWait","loadAll","beforeEach","container","Container","ListCache","PageListCache","ListPagesGateway","ListPagesRepository","ListPagesUseCase","ListPresenter","FolderTreePresenter","Confirmation","GetDescendantFoldersUseCase","DeletePageUseCase","FullPageCache","PageRevisionsCache","pageRevisionsCacheFactory","PublishPageGateway","PublishPageRepository","PublishPageUseCaseImpl","UnpublishPageUseCase","MovePageUseCase","DuplicatePageUseCase","PageListPresenter","Abstraction","it","newPage","before","published"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  import React from "react";
2
- export declare const BulkActionDelete: (() => React.JSX.Element) & {
3
- displayName: string;
2
+ export declare const BulkActionDelete: (() => React.JSX.Element) & React.NamedExoticComponent<unknown> & {
3
+ readonly type: () => React.JSX.Element;
4
4
  };
@@ -1,4 +1,4 @@
1
1
  import React from "react";
2
- export declare const BulkActionDuplicate: (() => React.JSX.Element) & {
3
- displayName: string;
2
+ export declare const BulkActionDuplicate: (() => React.JSX.Element) & React.NamedExoticComponent<unknown> & {
3
+ readonly type: () => React.JSX.Element;
4
4
  };
@@ -1,4 +1,4 @@
1
1
  import React from "react";
2
- export declare const BulkActionMovePage: (() => React.JSX.Element) & {
3
- displayName: string;
2
+ export declare const BulkActionMovePage: (() => React.JSX.Element) & React.NamedExoticComponent<unknown> & {
3
+ readonly type: () => React.JSX.Element;
4
4
  };
@@ -1,4 +1,4 @@
1
1
  import React from "react";
2
- export declare const BulkActionPublish: (() => React.JSX.Element) & {
3
- displayName: string;
2
+ export declare const BulkActionPublish: (() => React.JSX.Element) & React.NamedExoticComponent<unknown> & {
3
+ readonly type: () => React.JSX.Element;
4
4
  };
@@ -1,4 +1,4 @@
1
1
  import React from "react";
2
- export declare const BulkActionUnpublish: (() => React.JSX.Element) & {
3
- displayName: string;
2
+ export declare const BulkActionUnpublish: (() => React.JSX.Element) & React.NamedExoticComponent<unknown> & {
3
+ readonly type: () => React.JSX.Element;
4
4
  };
@@ -1,4 +1,4 @@
1
1
  import React from "react";
2
- export declare const DocumentList: (() => React.JSX.Element) & {
3
- displayName: string;
2
+ export declare const DocumentList: (() => React.JSX.Element) & React.NamedExoticComponent<unknown> & {
3
+ readonly type: () => React.JSX.Element;
4
4
  };
@@ -1,4 +1,4 @@
1
1
  import React from "react";
2
- export declare const Table: (() => React.JSX.Element) & {
3
- displayName: string;
2
+ export declare const Table: (() => React.JSX.Element) & React.NamedExoticComponent<unknown> & {
3
+ readonly type: () => React.JSX.Element;
4
4
  };
@@ -1,4 +1,4 @@
1
1
  import React from "react";
2
- export declare const WbTrashBin: (() => React.JSX.Element | null) & {
3
- displayName: string;
2
+ export declare const WbTrashBin: (() => React.JSX.Element | null) & React.NamedExoticComponent<unknown> & {
3
+ readonly type: () => React.JSX.Element | null;
4
4
  };
@@ -1 +1 @@
1
- {"version":3,"file":"presentation/redirects/RedirectList/RedirectListPresenter.js","sources":["../../../../src/presentation/redirects/RedirectList/RedirectListPresenter.ts"],"sourcesContent":["import { makeAutoObservable, reaction, computed } from \"mobx\";\nimport { Worker } from \"@webiny/app-admin\";\nimport { ListPresenter } from \"@webiny/app-admin/presentation/listPresenter/abstractions.js\";\nimport { FolderTreePresenter } from \"@webiny/app-aco/presentation/folderTree/abstractions.js\";\nimport { sortFolders } from \"@webiny/app-aco\";\nimport { GetDescendantFoldersUseCase } from \"@webiny/app-aco/features/folders/getDescendantFolders/abstractions.js\";\nimport { ListRedirectsUseCase } from \"~/features/redirects/listRedirects/abstractions.js\";\nimport { RedirectsListCache } from \"~/features/redirects/shared/abstractions.js\";\nimport {\n RedirectListPresenter as Abstraction,\n type IRedirectListPresenter,\n type IRedirectListViewModel,\n type IRedirectListActions,\n type IRedirectListInitConfig,\n CreateRedirectPresenter\n} from \"./abstractions.js\";\nimport { RedirectListDataSource } from \"./RedirectListDataSource.js\";\nimport type { Redirect } from \"~/domain/Redirect/Redirect.js\";\nimport { EditRedirectPresenter } from \"./abstractions.js\";\n\nclass RedirectListPresenterImpl implements IRedirectListPresenter {\n public readonly actions: IRedirectListActions;\n private _showingFilters = false;\n private _disposeReaction: (() => void) | null = null;\n private _createRedirect: CreateRedirectPresenter.Interface | null = null;\n private _editRedirect: EditRedirectPresenter.Interface | null = null;\n private _worker = new Worker<Redirect>();\n\n constructor(\n private listPresenter: ListPresenter.Interface<Redirect>,\n private folderTreePresenter: FolderTreePresenter.Interface,\n private createRedirectPresenter: CreateRedirectPresenter.Interface,\n private editRedirectPresenter: EditRedirectPresenter.Interface,\n private listRedirectsUseCase: ListRedirectsUseCase.Interface,\n private redirectsListCache: RedirectsListCache.Interface,\n private getDescendantFoldersUseCase: GetDescendantFoldersUseCase.Interface\n ) {\n this.actions = this.createActions();\n makeAutoObservable<RedirectListPresenterImpl, \"_disposeReaction\">(this, {\n _disposeReaction: false,\n vm: computed\n });\n }\n\n get vm(): IRedirectListViewModel {\n return {\n list: this.listPresenter.vm,\n folders: this.folderTreePresenter.vm,\n createRedirect: this._createRedirect,\n editRedirect: this._editRedirect,\n showFolders: this.shouldShowFolders(),\n childFolders: this.getSortedChildFolders(),\n showingFilters: this._showingFilters\n };\n }\n\n init(config?: IRedirectListInitConfig): void {\n const initialFolderId = config?.initialFolderId ?? \"root\";\n\n const dataSource = new RedirectListDataSource(\n this.listRedirectsUseCase,\n this.redirectsListCache,\n this.getDescendantFoldersUseCase\n );\n\n this.listPresenter.init({\n dataSource,\n initialSort: { field: \"createdOn\", direction: \"DESC\" },\n initialFilters: { folderId: initialFolderId },\n limit: 50\n });\n\n if (initialFolderId !== \"root\") {\n this.folderTreePresenter.selectFolder(initialFolderId);\n }\n\n this._disposeReaction = reaction(\n () => this.folderTreePresenter.vm.currentFolderId,\n folderId => {\n const effectiveFolderId = folderId ?? \"root\";\n this.listPresenter.actions.filter.set(\"folderId\", effectiveFolderId);\n }\n );\n }\n\n dispose(): void {\n if (this._disposeReaction) {\n this._disposeReaction();\n this._disposeReaction = null;\n }\n }\n\n private createActions(): IRedirectListActions {\n return {\n search: {\n set: (query: string) => this.listPresenter.actions.search.set(query),\n clear: () => this.listPresenter.actions.search.clear()\n },\n sort: {\n set: (field: string, direction: \"ASC\" | \"DESC\") =>\n this.listPresenter.actions.sort.set(field, direction),\n toggle: (field: string) => this.listPresenter.actions.sort.toggle(field)\n },\n filter: {\n show: () => this.listPresenter.actions.filter.show(),\n hide: () => this.listPresenter.actions.filter.hide(),\n set: (key: string, value: unknown) =>\n this.listPresenter.actions.filter.set(key, value),\n clear: (key: string) => this.listPresenter.actions.filter.clear(key),\n clearAll: () => this.listPresenter.actions.filter.clearAll()\n },\n selection: {\n toggle: (id: string) => this.listPresenter.actions.selection.toggle(id),\n selectRangeTo: (id: string) =>\n this.listPresenter.actions.selection.selectRangeTo(id),\n selectAll: () => this.listPresenter.actions.selection.selectAll(),\n deselectAll: () => this.listPresenter.actions.selection.deselectAll(),\n selectRows: (ids: string[]) => this.listPresenter.actions.selection.selectRows(ids),\n isSelected: (id: string) => this.listPresenter.actions.selection.isSelected(id)\n },\n worker: this.createWorkerActions(),\n loadMore: () => this.listPresenter.actions.loadMore(),\n refresh: () => this.listPresenter.actions.refresh(),\n showFilters: () => {\n this._showingFilters = true;\n },\n hideFilters: () => {\n this._showingFilters = false;\n },\n showCreateDialog: (folderId: string) => {\n this._createRedirect = this.createRedirectPresenter;\n this.createRedirectPresenter.init(folderId);\n },\n showEditDialog: (redirectId: string) => {\n this._editRedirect = this.editRedirectPresenter;\n void this.editRedirectPresenter.loadRedirect(redirectId);\n },\n hideCreateDialog: () => {\n this._createRedirect = null;\n },\n hideEditDialog: () => {\n this._editRedirect = null;\n },\n folders: {\n selectFolder: (folderId: string | null) => {\n this.listPresenter.actions.search.clear();\n this.folderTreePresenter.selectFolder(folderId);\n },\n createFolder: (parentFolderId?: string) =>\n this.folderTreePresenter.createFolder(parentFolderId),\n editFolder: (folderId: string) => this.folderTreePresenter.editFolder(folderId),\n deleteFolder: (folderId: string) => this.folderTreePresenter.deleteFolder(folderId),\n moveFolder: (folderId: string, targetParentId: string | null) =>\n this.folderTreePresenter.moveFolder(folderId, targetParentId),\n loadChildFolders: (parentIds: string[]) =>\n this.folderTreePresenter.loadChildFolders(parentIds),\n canManageStructure: (folderId: string) =>\n this.folderTreePresenter.canManageStructure(folderId),\n getAncestorIds: (folderId: string) =>\n this.folderTreePresenter.getAncestorIds(folderId),\n submitOperation: () => this.folderTreePresenter.submitOperation(),\n cancelOperation: () => this.folderTreePresenter.cancelOperation()\n }\n };\n }\n\n private getSelectedRows(): Redirect[] {\n const ids = this.listPresenter.vm.selection.selectedIds;\n return this.listPresenter.vm.rows.filter(r => ids.has(r.id));\n }\n\n private createWorkerActions(): IRedirectListActions[\"worker\"] {\n const worker = this._worker;\n return {\n process: (callback: (items: Redirect[]) => void) => {\n worker.process(this.getSelectedRows(), callback);\n },\n processInSeries: async (callback, chunkSize?) => {\n await worker.processInSeries(this.getSelectedRows(), callback, chunkSize);\n },\n get results() {\n return worker.results;\n },\n resetResults: () => worker.resetResults()\n };\n }\n\n private getSortedChildFolders() {\n if (!this.shouldShowFolders()) {\n return [];\n }\n return sortFolders(\n this.folderTreePresenter.vm.childFolders ?? [],\n this.listPresenter.vm.appliedQuery?.sort\n );\n }\n\n private shouldShowFolders(): boolean {\n const { appliedQuery } = this.listPresenter.vm;\n if (!appliedQuery) {\n return true;\n }\n\n if (appliedQuery.search) {\n return false;\n }\n\n const filterKeys = Object.keys(appliedQuery.filters ?? {}).filter(k => k !== \"folderId\");\n if (filterKeys.length > 0) {\n return false;\n }\n\n return true;\n }\n}\n\nexport const RedirectListPresenter = Abstraction.createImplementation({\n implementation: RedirectListPresenterImpl,\n dependencies: [\n ListPresenter,\n FolderTreePresenter,\n CreateRedirectPresenter,\n EditRedirectPresenter,\n ListRedirectsUseCase,\n RedirectsListCache,\n GetDescendantFoldersUseCase\n ]\n});\n"],"names":["RedirectListPresenterImpl","listPresenter","folderTreePresenter","createRedirectPresenter","editRedirectPresenter","listRedirectsUseCase","redirectsListCache","getDescendantFoldersUseCase","Worker","makeAutoObservable","computed","config","initialFolderId","dataSource","RedirectListDataSource","reaction","folderId","effectiveFolderId","query","field","direction","key","value","id","ids","redirectId","parentFolderId","targetParentId","parentIds","r","worker","callback","chunkSize","sortFolders","appliedQuery","filterKeys","Object","k","RedirectListPresenter","Abstraction","ListPresenter","FolderTreePresenter","CreateRedirectPresenter","EditRedirectPresenter","ListRedirectsUseCase","RedirectsListCache","GetDescendantFoldersUseCase"],"mappings":"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"}
1
+ {"version":3,"file":"presentation/redirects/RedirectList/RedirectListPresenter.js","sources":["../../../../src/presentation/redirects/RedirectList/RedirectListPresenter.ts"],"sourcesContent":["import { makeAutoObservable, reaction, computed } from \"mobx\";\nimport { Worker } from \"@webiny/app-admin\";\nimport { ListPresenter } from \"@webiny/app-admin/presentation/listPresenter/abstractions.js\";\nimport { FolderTreePresenter } from \"@webiny/app-aco/presentation/folderTree/abstractions.js\";\nimport { sortFolders } from \"@webiny/app-aco\";\nimport { GetDescendantFoldersUseCase } from \"@webiny/app-aco/features/folders/getDescendantFolders/abstractions.js\";\nimport { ListRedirectsUseCase } from \"~/features/redirects/listRedirects/abstractions.js\";\nimport { RedirectsListCache } from \"~/features/redirects/shared/abstractions.js\";\nimport {\n RedirectListPresenter as Abstraction,\n type IRedirectListPresenter,\n type IRedirectListViewModel,\n type IRedirectListActions,\n type IRedirectListInitConfig,\n CreateRedirectPresenter\n} from \"./abstractions.js\";\nimport { RedirectListDataSource } from \"./RedirectListDataSource.js\";\nimport type { Redirect } from \"~/domain/Redirect/Redirect.js\";\nimport { EditRedirectPresenter } from \"./abstractions.js\";\n\nclass RedirectListPresenterImpl implements IRedirectListPresenter {\n public readonly actions: IRedirectListActions;\n private _showingFilters = false;\n private _disposeReaction: (() => void) | null = null;\n private _createRedirect: CreateRedirectPresenter.Interface | null = null;\n private _editRedirect: EditRedirectPresenter.Interface | null = null;\n private _worker = new Worker<Redirect>();\n\n constructor(\n private listPresenter: ListPresenter.Interface<Redirect>,\n private folderTreePresenter: FolderTreePresenter.Interface,\n private createRedirectPresenter: CreateRedirectPresenter.Interface,\n private editRedirectPresenter: EditRedirectPresenter.Interface,\n private listRedirectsUseCase: ListRedirectsUseCase.Interface,\n private redirectsListCache: RedirectsListCache.Interface,\n private getDescendantFoldersUseCase: GetDescendantFoldersUseCase.Interface\n ) {\n this.actions = this.createActions();\n makeAutoObservable<RedirectListPresenterImpl, \"_disposeReaction\">(this, {\n _disposeReaction: false,\n vm: computed\n });\n }\n\n get vm(): IRedirectListViewModel {\n return {\n list: this.listPresenter.vm,\n folders: this.folderTreePresenter.vm,\n createRedirect: this._createRedirect,\n editRedirect: this._editRedirect,\n showFolders: this.shouldShowFolders(),\n childFolders: this.getSortedChildFolders(),\n showingFilters: this._showingFilters\n };\n }\n\n init(config?: IRedirectListInitConfig): void {\n const initialFolderId = config?.initialFolderId ?? \"root\";\n\n const dataSource = new RedirectListDataSource(\n this.listRedirectsUseCase,\n this.redirectsListCache,\n this.getDescendantFoldersUseCase\n );\n\n this.listPresenter.init({\n dataSource,\n initialSort: { field: \"createdOn\", direction: \"DESC\" },\n initialFilters: { folderId: initialFolderId },\n limit: 50\n });\n\n if (initialFolderId !== \"root\") {\n this.folderTreePresenter.selectFolder(initialFolderId);\n }\n\n this._disposeReaction = reaction(\n () => this.folderTreePresenter.vm.currentFolderId,\n folderId => {\n const effectiveFolderId = folderId ?? \"root\";\n this.listPresenter.actions.filter.set(\"folderId\", effectiveFolderId);\n }\n );\n }\n\n dispose(): void {\n if (this._disposeReaction) {\n this._disposeReaction();\n this._disposeReaction = null;\n }\n }\n\n private createActions(): IRedirectListActions {\n return {\n search: {\n set: (query: string) => this.listPresenter.actions.search.set(query),\n clear: () => this.listPresenter.actions.search.clear()\n },\n sort: {\n set: (field: string, direction: \"ASC\" | \"DESC\") =>\n this.listPresenter.actions.sort.set(field, direction),\n toggle: (field: string) => this.listPresenter.actions.sort.toggle(field)\n },\n filter: {\n show: () => this.listPresenter.actions.filter.show(),\n hide: () => this.listPresenter.actions.filter.hide(),\n set: (key: string, value: unknown) =>\n this.listPresenter.actions.filter.set(key, value),\n clear: (key: string) => this.listPresenter.actions.filter.clear(key),\n clearAll: () => this.listPresenter.actions.filter.clearAll()\n },\n selection: {\n toggle: (id: string) => this.listPresenter.actions.selection.toggle(id),\n selectRangeTo: (id: string) =>\n this.listPresenter.actions.selection.selectRangeTo(id),\n selectAll: () => this.listPresenter.actions.selection.selectAll(),\n deselectAll: () => this.listPresenter.actions.selection.deselectAll(),\n selectRows: (ids: string[]) => this.listPresenter.actions.selection.selectRows(ids),\n isSelected: (id: string) => this.listPresenter.actions.selection.isSelected(id)\n },\n worker: this.createWorkerActions(),\n loadMore: () => this.listPresenter.actions.loadMore(),\n refresh: () => this.listPresenter.actions.refresh(),\n showFilters: () => {\n this._showingFilters = true;\n },\n hideFilters: () => {\n this._showingFilters = false;\n },\n showCreateDialog: (folderId: string) => {\n this._createRedirect = this.createRedirectPresenter;\n this.createRedirectPresenter.init(folderId);\n },\n showEditDialog: (redirectId: string) => {\n this._editRedirect = this.editRedirectPresenter;\n void this.editRedirectPresenter.loadRedirect(redirectId);\n },\n hideCreateDialog: () => {\n this._createRedirect = null;\n },\n hideEditDialog: () => {\n this._editRedirect = null;\n },\n folders: {\n selectFolder: (folderId: string | null) => {\n this.listPresenter.actions.search.clear();\n this.folderTreePresenter.selectFolder(folderId);\n },\n createFolder: (parentFolderId?: string) =>\n this.folderTreePresenter.createFolder(parentFolderId),\n editFolder: (folderId: string) => this.folderTreePresenter.editFolder(folderId),\n deleteFolder: (folderId: string) => this.folderTreePresenter.deleteFolder(folderId),\n moveFolder: (folderId: string, targetParentId: string | null) =>\n this.folderTreePresenter.moveFolder(folderId, targetParentId),\n loadChildFolders: (parentIds: string[]) =>\n this.folderTreePresenter.loadChildFolders(parentIds),\n canManageStructure: (folderId: string) =>\n this.folderTreePresenter.canManageStructure(folderId),\n getAncestorIds: (folderId: string) =>\n this.folderTreePresenter.getAncestorIds(folderId),\n submitOperation: () => this.folderTreePresenter.submitOperation(),\n cancelOperation: () => this.folderTreePresenter.cancelOperation()\n }\n };\n }\n\n private getSelectedRows(): Redirect[] {\n const ids = this.listPresenter.vm.selection.selectedIds;\n return this.listPresenter.vm.rows.filter(r => ids.has(r.id));\n }\n\n private createWorkerActions(): IRedirectListActions[\"worker\"] {\n const worker = this._worker;\n return {\n process: (callback: (items: Redirect[]) => void) => {\n worker.process(this.getSelectedRows(), callback);\n },\n processInSeries: async (callback, chunkSize?) => {\n await worker.processInSeries(this.getSelectedRows(), callback, chunkSize);\n },\n get results() {\n return worker.results;\n },\n resetResults: () => worker.resetResults()\n };\n }\n\n private getSortedChildFolders() {\n if (!this.shouldShowFolders()) {\n return [];\n }\n return sortFolders(\n this.folderTreePresenter.vm.childFolders ?? [],\n this.listPresenter.vm.appliedQuery?.sort\n );\n }\n\n private shouldShowFolders(): boolean {\n const { appliedQuery } = this.listPresenter.vm;\n if (!appliedQuery) {\n return true;\n }\n\n if (appliedQuery.search) {\n return false;\n }\n\n const filterKeys = Object.keys(appliedQuery.filters ?? {}).filter(k => k !== \"folderId\");\n if (filterKeys.length > 0) {\n return false;\n }\n\n return true;\n }\n}\n\nexport const RedirectListPresenter = Abstraction.createImplementation({\n implementation: RedirectListPresenterImpl,\n dependencies: [\n ListPresenter,\n FolderTreePresenter,\n CreateRedirectPresenter,\n EditRedirectPresenter,\n ListRedirectsUseCase,\n RedirectsListCache,\n GetDescendantFoldersUseCase\n ]\n});\n"],"names":["RedirectListPresenterImpl","listPresenter","folderTreePresenter","createRedirectPresenter","editRedirectPresenter","listRedirectsUseCase","redirectsListCache","getDescendantFoldersUseCase","Worker","makeAutoObservable","computed","config","initialFolderId","dataSource","RedirectListDataSource","reaction","folderId","effectiveFolderId","query","field","direction","key","value","id","ids","redirectId","parentFolderId","targetParentId","parentIds","r","worker","callback","chunkSize","sortFolders","appliedQuery","filterKeys","Object","k","RedirectListPresenter","Abstraction","ListPresenter","FolderTreePresenter","CreateRedirectPresenter","EditRedirectPresenter","ListRedirectsUseCase","RedirectsListCache","GetDescendantFoldersUseCase"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"presentation/redirects/RedirectList/RedirectListPresenter.test.js","sources":["../../../../src/presentation/redirects/RedirectList/RedirectListPresenter.test.ts"],"sourcesContent":["import { describe, it, expect, vi, beforeEach } from \"vitest\";\nimport { observable } from \"mobx\";\nimport { Container } from \"@webiny/di\";\nimport { ListCache } from \"@webiny/app-admin/features/listCache/index.js\";\nimport { ListPresenter } from \"@webiny/app-admin/presentation/listPresenter/ListPresenter.js\";\nimport { FolderTreePresenter } from \"@webiny/app-aco/presentation/folderTree/abstractions.js\";\nimport { GetDescendantFoldersUseCase } from \"@webiny/app-aco/features/folders/getDescendantFolders/abstractions.js\";\nimport { Redirect } from \"~/domain/Redirect/Redirect.js\";\nimport { RedirectsListCache } from \"~/features/redirects/shared/abstractions.js\";\nimport {\n ListRedirectsGateway,\n type ListRedirectsGatewayParams,\n type ListRedirectsGatewayResult\n} from \"~/features/redirects/listRedirects/abstractions.js\";\nimport { ListRedirectsUseCase } from \"~/features/redirects/listRedirects/ListRedirectsUseCase.js\";\nimport { ListRedirectsRepository } from \"~/features/redirects/listRedirects/ListRedirectsRepository.js\";\nimport {\n CreateRedirectGateway,\n CreateRedirectUseCase as CreateRedirectUseCaseAbstraction\n} from \"~/features/redirects/createRedirect/abstractions.js\";\nimport { CreateRedirectUseCase } from \"~/features/redirects/createRedirect/CreateRedirectUseCase.js\";\nimport { CreateRedirectRepository } from \"~/features/redirects/createRedirect/CreateRedirectRepository.js\";\nimport {\n UpdateRedirectGateway,\n UpdateRedirectUseCase as UpdateRedirectUseCaseAbstraction,\n type UpdateRedirectParams\n} from \"~/features/redirects/updateRedirect/abstractions.js\";\nimport { UpdateRedirectUseCase } from \"~/features/redirects/updateRedirect/UpdateRedirectUseCase.js\";\nimport { UpdateRedirectRepository } from \"~/features/redirects/updateRedirect/UpdateRedirectRepository.js\";\nimport {\n CreateRedirectPresenter,\n EditRedirectPresenter,\n RedirectListPresenter as Abstraction\n} from \"./abstractions.js\";\nimport { RedirectListPresenter } from \"./RedirectListPresenter.js\";\n\nconst TOTAL_REDIRECTS = 120;\nconst PAGE_SIZE = 50;\nconst BASE_TIME = Date.UTC(2026, 0, 1);\n\nconst minutes = (n: number) => new Date(BASE_TIME + n * 60_000).toISOString();\n\n/**\n * A higher index means a more recently *created* redirect, but a less recently *saved* one,\n * so sorting by `createdOn` and by `savedOn` produce opposite orders.\n */\nfunction createRedirects(count: number): Redirect[] {\n return Array.from({ length: count }, (_, i) =>\n Redirect.create({\n id: `redirect-${i}`,\n location: { folderId: \"root\" },\n redirectFrom: `/from-${i}`,\n redirectTo: `/to-${i}`,\n redirectType: \"permanent\",\n isEnabled: i % 2 === 0,\n createdOn: minutes(i),\n savedOn: minutes(count - i)\n })\n );\n}\n\n/**\n * Sorts like the API: by the requested field, ties keep the original (id) order.\n */\nfunction sortRedirects(redirects: Redirect[], sort = \"createdOn_DESC\"): Redirect[] {\n const [field, direction] = sort.split(\"_\") as [keyof Redirect, \"ASC\" | \"DESC\"];\n const multiplier = direction === \"ASC\" ? 1 : -1;\n return [...redirects].sort((a, b) => {\n const left = String(a[field]);\n const right = String(b[field]);\n return left === right ? 0 : multiplier * (left < right ? -1 : 1);\n });\n}\n\nfunction createListGateway(redirects: Redirect[]): ListRedirectsGateway.Interface {\n return {\n execute: vi.fn(\n async (params: ListRedirectsGatewayParams): Promise<ListRedirectsGatewayResult> => {\n const sorted = sortRedirects(redirects, params.sort?.[0]);\n const offset = params.after ? Number(params.after) : 0;\n const limit = params.limit ?? PAGE_SIZE;\n const data = sorted.slice(offset, offset + limit);\n const next = offset + data.length;\n const hasMoreItems = next < sorted.length;\n return {\n data,\n meta: {\n cursor: hasMoreItems ? String(next) : null,\n hasMoreItems,\n totalCount: sorted.length\n }\n };\n }\n )\n };\n}\n\nfunction createFolderTreePresenter(): FolderTreePresenter.Interface {\n const vm = observable({\n folders: [],\n tree: [],\n currentFolderId: null as string | null,\n currentFolder: null,\n loading: false,\n operation: { active: false, mode: null },\n isRootFolder: true,\n currentFolderTitle: \"All redirects\",\n childFolders: [],\n loadingNodeIds: []\n });\n\n return {\n get vm() {\n return vm as unknown as FolderTreePresenter.Interface[\"vm\"];\n },\n selectFolder: vi.fn(),\n createFolder: vi.fn(),\n editFolder: vi.fn(),\n deleteFolder: vi.fn().mockResolvedValue(undefined),\n moveFolder: vi.fn().mockResolvedValue(undefined),\n loadChildFolders: vi.fn().mockResolvedValue(undefined),\n canManageStructure: vi.fn().mockReturnValue(true),\n getAncestorIds: vi.fn().mockReturnValue([]),\n submitOperation: vi.fn().mockResolvedValue(true),\n cancelOperation: vi.fn(),\n onFolderChange: vi.fn().mockReturnValue(() => {})\n };\n}\n\n/**\n * Expected redirect IDs for a contiguous range of indexes, in the given order.\n */\nfunction range(from: number, to: number): string[] {\n const step = from <= to ? 1 : -1;\n const ids: string[] = [];\n for (let i = from; step > 0 ? i <= to : i >= to; i += step) {\n ids.push(`redirect-${i}`);\n }\n return ids;\n}\n\ndescribe(\"RedirectListPresenter\", () => {\n let presenter: Abstraction.Interface;\n let container: Container;\n let redirects: Redirect[];\n\n const rowIds = () => presenter.vm.list.rows.map(row => row.id);\n\n const waitForQuery = async (field: string, direction: \"ASC\" | \"DESC\") => {\n await vi.waitFor(() => {\n expect(presenter.vm.list.appliedQuery?.sort).toEqual({ field, direction });\n expect(presenter.vm.list.pagination.loading).toBe(false);\n });\n };\n\n const initAndWait = async () => {\n presenter.init();\n await waitForQuery(\"createdOn\", \"DESC\");\n };\n\n const sortAndWait = async (field: string, direction: \"ASC\" | \"DESC\") => {\n presenter.actions.sort.set(field, direction);\n await waitForQuery(field, direction);\n };\n\n const loadAll = async () => {\n while (presenter.vm.list.pagination.hasMore) {\n await presenter.actions.loadMore();\n }\n };\n\n beforeEach(() => {\n container = new Container();\n redirects = createRedirects(TOTAL_REDIRECTS);\n\n container.registerInstance(RedirectsListCache, new ListCache<Redirect>(\"id\"));\n\n container.registerInstance(ListRedirectsGateway, createListGateway(redirects));\n container.register(ListRedirectsRepository).inSingletonScope();\n container.register(ListRedirectsUseCase);\n\n container.registerInstance(CreateRedirectGateway, {\n execute: vi.fn(async params =>\n Redirect.create({\n ...params,\n id: \"redirect-new\",\n createdOn: minutes(TOTAL_REDIRECTS + 1),\n savedOn: minutes(TOTAL_REDIRECTS + 1)\n })\n )\n });\n container.register(CreateRedirectRepository).inSingletonScope();\n container.register(CreateRedirectUseCase);\n\n container.registerInstance(UpdateRedirectGateway, {\n execute: vi.fn(async (params: UpdateRedirectParams) => {\n const existing = redirects.find(r => r.id === params.id)!;\n return Redirect.create({\n ...existing,\n ...params,\n savedOn: minutes(TOTAL_REDIRECTS + 1)\n });\n })\n });\n container.register(UpdateRedirectRepository).inSingletonScope();\n container.register(UpdateRedirectUseCase);\n\n container.register(ListPresenter);\n container.registerInstance(FolderTreePresenter, createFolderTreePresenter());\n container.registerInstance(GetDescendantFoldersUseCase, { execute: () => [] });\n container.registerInstance(CreateRedirectPresenter, {\n vm: {},\n init: vi.fn(),\n save: vi.fn()\n } as unknown as CreateRedirectPresenter.Interface);\n container.registerInstance(EditRedirectPresenter, {\n vm: {},\n loadRedirect: vi.fn(),\n save: vi.fn()\n } as unknown as EditRedirectPresenter.Interface);\n\n container.register(RedirectListPresenter);\n\n presenter = container.resolve(Abstraction);\n });\n\n describe(\"pagination\", () => {\n it(\"should show the most recently created redirects first\", async () => {\n await initAndWait();\n\n expect(rowIds()).toEqual(range(119, 70));\n });\n\n it(\"should append the next batch of redirects to the bottom of the list\", async () => {\n await initAndWait();\n\n await presenter.actions.loadMore();\n\n expect(rowIds()).toEqual(range(119, 20));\n });\n\n it(\"should keep all redirects in order after loading everything\", async () => {\n await initAndWait();\n\n await loadAll();\n\n expect(rowIds()).toEqual(range(119, 0));\n });\n });\n\n describe(\"changing the sort\", () => {\n it(\"should show only the first batch, sorted by the new field\", async () => {\n await initAndWait();\n\n await sortAndWait(\"savedOn\", \"DESC\");\n\n // `savedOn` runs opposite to `createdOn`, so the most recently saved is redirect-0.\n expect(rowIds()).toEqual(range(0, 49));\n });\n\n it(\"should show only the first batch when sorting by a boolean field\", async () => {\n await initAndWait();\n\n await sortAndWait(\"isEnabled\", \"DESC\");\n\n const expected = sortRedirects(redirects, \"isEnabled_DESC\")\n .slice(0, PAGE_SIZE)\n .map(r => r.id);\n expect(rowIds()).toEqual(expected);\n });\n\n it(\"should restore the original order when switching back\", async () => {\n await initAndWait();\n await presenter.actions.loadMore();\n\n await sortAndWait(\"createdOn\", \"ASC\");\n await sortAndWait(\"createdOn\", \"DESC\");\n\n expect(rowIds()).toEqual(range(119, 70));\n });\n });\n\n describe(\"local cache changes\", () => {\n const createRedirect = () =>\n container.resolve(CreateRedirectUseCaseAbstraction).execute({\n location: { folderId: \"root\" },\n redirectFrom: \"/new\",\n redirectTo: \"/target\",\n redirectType: \"permanent\",\n isEnabled: true\n });\n\n const updateRedirect = (id: string) => {\n const existing = redirects.find(r => r.id === id)!;\n return container.resolve(UpdateRedirectUseCaseAbstraction).execute({\n id,\n redirectFrom: existing.redirectFrom,\n redirectTo: \"/changed\",\n redirectType: existing.redirectType,\n isEnabled: existing.isEnabled\n });\n };\n\n it(\"should show a created redirect at the top when it sorts first\", async () => {\n await initAndWait();\n\n await createRedirect();\n\n expect(rowIds()).toEqual([\"redirect-new\", ...range(119, 70)]);\n });\n\n it(\"should not show a created redirect that sorts past the loaded redirects\", async () => {\n await initAndWait();\n await sortAndWait(\"createdOn\", \"ASC\");\n\n await createRedirect();\n\n // The new redirect is the most recently created, so in ASC order it belongs at the\n // very end, after redirects that are not loaded yet.\n expect(rowIds()).toEqual(range(0, 49));\n });\n\n it(\"should keep an updated redirect in its position when sorted by createdOn\", async () => {\n await initAndWait();\n\n await updateRedirect(\"redirect-100\");\n\n expect(rowIds()).toEqual(range(119, 70));\n const updated = presenter.vm.list.rows.find(row => row.id === \"redirect-100\");\n expect(updated?.redirectTo).toBe(\"/changed\");\n });\n\n it(\"should move an updated redirect to the top when sorted by savedOn\", async () => {\n await initAndWait();\n await sortAndWait(\"savedOn\", \"DESC\");\n\n await updateRedirect(\"redirect-30\");\n\n expect(rowIds()).toEqual([\"redirect-30\", ...range(0, 29), ...range(31, 49)]);\n });\n });\n});\n"],"names":["TOTAL_REDIRECTS","PAGE_SIZE","BASE_TIME","Date","minutes","n","createRedirects","count","Array","_","i","Redirect","sortRedirects","redirects","sort","field","direction","multiplier","a","b","left","String","right","createListGateway","vi","params","sorted","offset","Number","limit","data","next","hasMoreItems","createFolderTreePresenter","vm","observable","undefined","range","from","to","step","ids","describe","presenter","container","rowIds","row","waitForQuery","expect","initAndWait","sortAndWait","loadAll","beforeEach","Container","RedirectsListCache","ListCache","ListRedirectsGateway","ListRedirectsRepository","ListRedirectsUseCase","CreateRedirectGateway","CreateRedirectRepository","CreateRedirectUseCase","UpdateRedirectGateway","existing","r","UpdateRedirectRepository","UpdateRedirectUseCase","ListPresenter","FolderTreePresenter","GetDescendantFoldersUseCase","CreateRedirectPresenter","EditRedirectPresenter","RedirectListPresenter","Abstraction","it","expected","createRedirect","CreateRedirectUseCaseAbstraction","updateRedirect","id","UpdateRedirectUseCaseAbstraction","updated"],"mappings":";;;;;;;;;;;;;;;;;;;;AAoCA,MAAMA,kBAAkB;AACxB,MAAMC,YAAY;AAClB,MAAMC,YAAYC,KAAK,GAAG,CAAC,MAAM,GAAG;AAEpC,MAAMC,UAAU,CAACC,IAAc,IAAIF,KAAKD,YAAYG,AAAI,QAAJA,GAAY,WAAW;AAM3E,SAASC,gBAAgBC,KAAa;IAClC,OAAOC,MAAM,IAAI,CAAC;QAAE,QAAQD;IAAM,GAAG,CAACE,GAAGC,IACrCC,SAAS,MAAM,CAAC;YACZ,IAAI,CAAC,SAAS,EAAED,GAAG;YACnB,UAAU;gBAAE,UAAU;YAAO;YAC7B,cAAc,CAAC,MAAM,EAAEA,GAAG;YAC1B,YAAY,CAAC,IAAI,EAAEA,GAAG;YACtB,cAAc;YACd,WAAWA,IAAI,MAAM;YACrB,WAAWN,QAAQM;YACnB,SAASN,QAAQG,QAAQG;QAC7B;AAER;AAKA,SAASE,cAAcC,SAAqB,EAAEC,OAAO,gBAAgB;IACjE,MAAM,CAACC,OAAOC,UAAU,GAAGF,KAAK,KAAK,CAAC;IACtC,MAAMG,aAAaD,AAAc,UAAdA,YAAsB,IAAI;IAC7C,OAAO;WAAIH;KAAU,CAAC,IAAI,CAAC,CAACK,GAAGC;QAC3B,MAAMC,OAAOC,OAAOH,CAAC,CAACH,MAAM;QAC5B,MAAMO,QAAQD,OAAOF,CAAC,CAACJ,MAAM;QAC7B,OAAOK,SAASE,QAAQ,IAAIL,aAAcG,CAAAA,OAAOE,QAAQ,KAAK;IAClE;AACJ;AAEA,SAASC,kBAAkBV,SAAqB;IAC5C,OAAO;QACH,SAASW,GAAG,EAAE,CACV,OAAOC;YACH,MAAMC,SAASd,cAAcC,WAAWY,OAAO,IAAI,EAAE,CAAC,EAAE;YACxD,MAAME,SAASF,OAAO,KAAK,GAAGG,OAAOH,OAAO,KAAK,IAAI;YACrD,MAAMI,QAAQJ,OAAO,KAAK,IAAIxB;YAC9B,MAAM6B,OAAOJ,OAAO,KAAK,CAACC,QAAQA,SAASE;YAC3C,MAAME,OAAOJ,SAASG,KAAK,MAAM;YACjC,MAAME,eAAeD,OAAOL,OAAO,MAAM;YACzC,OAAO;gBACHI;gBACA,MAAM;oBACF,QAAQE,eAAeX,OAAOU,QAAQ;oBACtCC;oBACA,YAAYN,OAAO,MAAM;gBAC7B;YACJ;QACJ;IAER;AACJ;AAEA,SAASO;IACL,MAAMC,KAAKC,WAAW;QAClB,SAAS,EAAE;QACX,MAAM,EAAE;QACR,iBAAiB;QACjB,eAAe;QACf,SAAS;QACT,WAAW;YAAE,QAAQ;YAAO,MAAM;QAAK;QACvC,cAAc;QACd,oBAAoB;QACpB,cAAc,EAAE;QAChB,gBAAgB,EAAE;IACtB;IAEA,OAAO;QACH,IAAI,MAAK;YACL,OAAOD;QACX;QACA,cAAcV,GAAG,EAAE;QACnB,cAAcA,GAAG,EAAE;QACnB,YAAYA,GAAG,EAAE;QACjB,cAAcA,GAAG,EAAE,GAAG,iBAAiB,CAACY;QACxC,YAAYZ,GAAG,EAAE,GAAG,iBAAiB,CAACY;QACtC,kBAAkBZ,GAAG,EAAE,GAAG,iBAAiB,CAACY;QAC5C,oBAAoBZ,GAAG,EAAE,GAAG,eAAe,CAAC;QAC5C,gBAAgBA,GAAG,EAAE,GAAG,eAAe,CAAC,EAAE;QAC1C,iBAAiBA,GAAG,EAAE,GAAG,iBAAiB,CAAC;QAC3C,iBAAiBA,GAAG,EAAE;QACtB,gBAAgBA,GAAG,EAAE,GAAG,eAAe,CAAC,KAAO;IACnD;AACJ;AAKA,SAASa,MAAMC,IAAY,EAAEC,EAAU;IACnC,MAAMC,OAAOF,QAAQC,KAAK,IAAI;IAC9B,MAAME,MAAgB,EAAE;IACxB,IAAK,IAAI/B,IAAI4B,MAAME,OAAO,IAAI9B,KAAK6B,KAAK7B,KAAK6B,IAAI7B,KAAK8B,KAClDC,IAAI,IAAI,CAAC,CAAC,SAAS,EAAE/B,GAAG;IAE5B,OAAO+B;AACX;AAEAC,SAAS,yBAAyB;IAC9B,IAAIC;IACJ,IAAIC;IACJ,IAAI/B;IAEJ,MAAMgC,SAAS,IAAMF,UAAU,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAACG,CAAAA,MAAOA,IAAI,EAAE;IAE7D,MAAMC,eAAe,OAAOhC,OAAeC;QACvC,MAAMQ,GAAG,OAAO,CAAC;YACbwB,OAAOL,UAAU,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,OAAO,CAAC;gBAAE5B;gBAAOC;YAAU;YACxEgC,OAAOL,UAAU,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC;QACtD;IACJ;IAEA,MAAMM,cAAc;QAChBN,UAAU,IAAI;QACd,MAAMI,aAAa,aAAa;IACpC;IAEA,MAAMG,cAAc,OAAOnC,OAAeC;QACtC2B,UAAU,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC5B,OAAOC;QAClC,MAAM+B,aAAahC,OAAOC;IAC9B;IAEA,MAAMmC,UAAU;QACZ,MAAOR,UAAU,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CACvC,MAAMA,UAAU,OAAO,CAAC,QAAQ;IAExC;IAEAS,WAAW;QACPR,YAAY,IAAIS;QAChBxC,YAAYP,gBAAgBN;QAE5B4C,UAAU,gBAAgB,CAACU,oBAAoB,IAAIC,UAAoB;QAEvEX,UAAU,gBAAgB,CAACY,sBAAsBjC,kBAAkBV;QACnE+B,UAAU,QAAQ,CAACa,yBAAyB,gBAAgB;QAC5Db,UAAU,QAAQ,CAACc;QAEnBd,UAAU,gBAAgB,CAACe,uBAAuB;YAC9C,SAASnC,GAAG,EAAE,CAAC,OAAMC,SACjBd,SAAS,MAAM,CAAC;oBACZ,GAAGc,MAAM;oBACT,IAAI;oBACJ,WAAWrB,QAAQJ,kBAAkB;oBACrC,SAASI,QAAQJ,kBAAkB;gBACvC;QAER;QACA4C,UAAU,QAAQ,CAACgB,0BAA0B,gBAAgB;QAC7DhB,UAAU,QAAQ,CAACiB;QAEnBjB,UAAU,gBAAgB,CAACkB,uBAAuB;YAC9C,SAAStC,GAAG,EAAE,CAAC,OAAOC;gBAClB,MAAMsC,WAAWlD,UAAU,IAAI,CAACmD,CAAAA,IAAKA,EAAE,EAAE,KAAKvC,OAAO,EAAE;gBACvD,OAAOd,SAAS,MAAM,CAAC;oBACnB,GAAGoD,QAAQ;oBACX,GAAGtC,MAAM;oBACT,SAASrB,QAAQJ,kBAAkB;gBACvC;YACJ;QACJ;QACA4C,UAAU,QAAQ,CAACqB,0BAA0B,gBAAgB;QAC7DrB,UAAU,QAAQ,CAACsB;QAEnBtB,UAAU,QAAQ,CAACuB;QACnBvB,UAAU,gBAAgB,CAACwB,qBAAqBnC;QAChDW,UAAU,gBAAgB,CAACyB,6BAA6B;YAAE,SAAS,IAAM,EAAE;QAAC;QAC5EzB,UAAU,gBAAgB,CAAC0B,yBAAyB;YAChD,IAAI,CAAC;YACL,MAAM9C,GAAG,EAAE;YACX,MAAMA,GAAG,EAAE;QACf;QACAoB,UAAU,gBAAgB,CAAC2B,uBAAuB;YAC9C,IAAI,CAAC;YACL,cAAc/C,GAAG,EAAE;YACnB,MAAMA,GAAG,EAAE;QACf;QAEAoB,UAAU,QAAQ,CAAC4B;QAEnB7B,YAAYC,UAAU,OAAO,CAAC6B;IAClC;IAEA/B,SAAS,cAAc;QACnBgC,GAAG,yDAAyD;YACxD,MAAMzB;YAEND,OAAOH,UAAU,OAAO,CAACR,MAAM,KAAK;QACxC;QAEAqC,GAAG,uEAAuE;YACtE,MAAMzB;YAEN,MAAMN,UAAU,OAAO,CAAC,QAAQ;YAEhCK,OAAOH,UAAU,OAAO,CAACR,MAAM,KAAK;QACxC;QAEAqC,GAAG,+DAA+D;YAC9D,MAAMzB;YAEN,MAAME;YAENH,OAAOH,UAAU,OAAO,CAACR,MAAM,KAAK;QACxC;IACJ;IAEAK,SAAS,qBAAqB;QAC1BgC,GAAG,6DAA6D;YAC5D,MAAMzB;YAEN,MAAMC,YAAY,WAAW;YAG7BF,OAAOH,UAAU,OAAO,CAACR,MAAM,GAAG;QACtC;QAEAqC,GAAG,oEAAoE;YACnE,MAAMzB;YAEN,MAAMC,YAAY,aAAa;YAE/B,MAAMyB,WAAW/D,cAAcC,WAAW,kBACrC,KAAK,CAAC,GAAGZ,WACT,GAAG,CAAC+D,CAAAA,IAAKA,EAAE,EAAE;YAClBhB,OAAOH,UAAU,OAAO,CAAC8B;QAC7B;QAEAD,GAAG,yDAAyD;YACxD,MAAMzB;YACN,MAAMN,UAAU,OAAO,CAAC,QAAQ;YAEhC,MAAMO,YAAY,aAAa;YAC/B,MAAMA,YAAY,aAAa;YAE/BF,OAAOH,UAAU,OAAO,CAACR,MAAM,KAAK;QACxC;IACJ;IAEAK,SAAS,uBAAuB;QAC5B,MAAMkC,iBAAiB,IACnBhC,UAAU,OAAO,CAACiC,uBAAkC,OAAO,CAAC;gBACxD,UAAU;oBAAE,UAAU;gBAAO;gBAC7B,cAAc;gBACd,YAAY;gBACZ,cAAc;gBACd,WAAW;YACf;QAEJ,MAAMC,iBAAiB,CAACC;YACpB,MAAMhB,WAAWlD,UAAU,IAAI,CAACmD,CAAAA,IAAKA,EAAE,EAAE,KAAKe;YAC9C,OAAOnC,UAAU,OAAO,CAACoC,uBAAkC,OAAO,CAAC;gBAC/DD;gBACA,cAAchB,SAAS,YAAY;gBACnC,YAAY;gBACZ,cAAcA,SAAS,YAAY;gBACnC,WAAWA,SAAS,SAAS;YACjC;QACJ;QAEAW,GAAG,iEAAiE;YAChE,MAAMzB;YAEN,MAAM2B;YAEN5B,OAAOH,UAAU,OAAO,CAAC;gBAAC;mBAAmBR,MAAM,KAAK;aAAI;QAChE;QAEAqC,GAAG,2EAA2E;YAC1E,MAAMzB;YACN,MAAMC,YAAY,aAAa;YAE/B,MAAM0B;YAIN5B,OAAOH,UAAU,OAAO,CAACR,MAAM,GAAG;QACtC;QAEAqC,GAAG,4EAA4E;YAC3E,MAAMzB;YAEN,MAAM6B,eAAe;YAErB9B,OAAOH,UAAU,OAAO,CAACR,MAAM,KAAK;YACpC,MAAM4C,UAAUtC,UAAU,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAACG,CAAAA,MAAOA,AAAW,mBAAXA,IAAI,EAAE;YACzDE,OAAOiC,SAAS,YAAY,IAAI,CAAC;QACrC;QAEAP,GAAG,qEAAqE;YACpE,MAAMzB;YACN,MAAMC,YAAY,WAAW;YAE7B,MAAM4B,eAAe;YAErB9B,OAAOH,UAAU,OAAO,CAAC;gBAAC;mBAAkBR,MAAM,GAAG;mBAAQA,MAAM,IAAI;aAAI;QAC/E;IACJ;AACJ"}
1
+ {"version":3,"file":"presentation/redirects/RedirectList/RedirectListPresenter.test.js","sources":["../../../../src/presentation/redirects/RedirectList/RedirectListPresenter.test.ts"],"sourcesContent":["import { describe, it, expect, vi, beforeEach } from \"vitest\";\nimport { observable } from \"mobx\";\nimport { Container } from \"@webiny/di\";\nimport { ListCache } from \"@webiny/app-admin/features/listCache/index.js\";\nimport { ListPresenter } from \"@webiny/app-admin/presentation/listPresenter/ListPresenter.js\";\nimport { FolderTreePresenter } from \"@webiny/app-aco/presentation/folderTree/abstractions.js\";\nimport { GetDescendantFoldersUseCase } from \"@webiny/app-aco/features/folders/getDescendantFolders/abstractions.js\";\nimport { Redirect } from \"~/domain/Redirect/Redirect.js\";\nimport { RedirectsListCache } from \"~/features/redirects/shared/abstractions.js\";\nimport {\n ListRedirectsGateway,\n type ListRedirectsGatewayParams,\n type ListRedirectsGatewayResult\n} from \"~/features/redirects/listRedirects/abstractions.js\";\nimport { ListRedirectsUseCase } from \"~/features/redirects/listRedirects/ListRedirectsUseCase.js\";\nimport { ListRedirectsRepository } from \"~/features/redirects/listRedirects/ListRedirectsRepository.js\";\nimport {\n CreateRedirectGateway,\n CreateRedirectUseCase as CreateRedirectUseCaseAbstraction\n} from \"~/features/redirects/createRedirect/abstractions.js\";\nimport { CreateRedirectUseCase } from \"~/features/redirects/createRedirect/CreateRedirectUseCase.js\";\nimport { CreateRedirectRepository } from \"~/features/redirects/createRedirect/CreateRedirectRepository.js\";\nimport {\n UpdateRedirectGateway,\n UpdateRedirectUseCase as UpdateRedirectUseCaseAbstraction,\n type UpdateRedirectParams\n} from \"~/features/redirects/updateRedirect/abstractions.js\";\nimport { UpdateRedirectUseCase } from \"~/features/redirects/updateRedirect/UpdateRedirectUseCase.js\";\nimport { UpdateRedirectRepository } from \"~/features/redirects/updateRedirect/UpdateRedirectRepository.js\";\nimport {\n CreateRedirectPresenter,\n EditRedirectPresenter,\n RedirectListPresenter as Abstraction\n} from \"./abstractions.js\";\nimport { RedirectListPresenter } from \"./RedirectListPresenter.js\";\n\nconst TOTAL_REDIRECTS = 120;\nconst PAGE_SIZE = 50;\nconst BASE_TIME = Date.UTC(2026, 0, 1);\n\nconst minutes = (n: number) => new Date(BASE_TIME + n * 60_000).toISOString();\n\n/**\n * A higher index means a more recently *created* redirect, but a less recently *saved* one,\n * so sorting by `createdOn` and by `savedOn` produce opposite orders.\n */\nfunction createRedirects(count: number): Redirect[] {\n return Array.from({ length: count }, (_, i) =>\n Redirect.create({\n id: `redirect-${i}`,\n location: { folderId: \"root\" },\n redirectFrom: `/from-${i}`,\n redirectTo: `/to-${i}`,\n redirectType: \"permanent\",\n isEnabled: i % 2 === 0,\n createdOn: minutes(i),\n savedOn: minutes(count - i)\n })\n );\n}\n\n/**\n * Sorts like the API: by the requested field, ties keep the original (id) order.\n */\nfunction sortRedirects(redirects: Redirect[], sort = \"createdOn_DESC\"): Redirect[] {\n const [field, direction] = sort.split(\"_\") as [keyof Redirect, \"ASC\" | \"DESC\"];\n const multiplier = direction === \"ASC\" ? 1 : -1;\n return [...redirects].sort((a, b) => {\n const left = String(a[field]);\n const right = String(b[field]);\n return left === right ? 0 : multiplier * (left < right ? -1 : 1);\n });\n}\n\nfunction createListGateway(redirects: Redirect[]): ListRedirectsGateway.Interface {\n return {\n execute: vi.fn(\n async (params: ListRedirectsGatewayParams): Promise<ListRedirectsGatewayResult> => {\n const sorted = sortRedirects(redirects, params.sort?.[0]);\n const offset = params.after ? Number(params.after) : 0;\n const limit = params.limit ?? PAGE_SIZE;\n const data = sorted.slice(offset, offset + limit);\n const next = offset + data.length;\n const hasMoreItems = next < sorted.length;\n return {\n data,\n meta: {\n cursor: hasMoreItems ? String(next) : null,\n hasMoreItems,\n totalCount: sorted.length\n }\n };\n }\n )\n };\n}\n\nfunction createFolderTreePresenter(): FolderTreePresenter.Interface {\n const vm = observable({\n folders: [],\n tree: [],\n currentFolderId: null as string | null,\n currentFolder: null,\n loading: false,\n operation: { active: false, mode: null },\n isRootFolder: true,\n currentFolderTitle: \"All redirects\",\n childFolders: [],\n loadingNodeIds: []\n });\n\n return {\n get vm() {\n return vm as unknown as FolderTreePresenter.Interface[\"vm\"];\n },\n selectFolder: vi.fn(),\n createFolder: vi.fn(),\n editFolder: vi.fn(),\n deleteFolder: vi.fn().mockResolvedValue(undefined),\n moveFolder: vi.fn().mockResolvedValue(undefined),\n loadChildFolders: vi.fn().mockResolvedValue(undefined),\n canManageStructure: vi.fn().mockReturnValue(true),\n getAncestorIds: vi.fn().mockReturnValue([]),\n submitOperation: vi.fn().mockResolvedValue(true),\n cancelOperation: vi.fn(),\n onFolderChange: vi.fn().mockReturnValue(() => {})\n };\n}\n\n/**\n * Expected redirect IDs for a contiguous range of indexes, in the given order.\n */\nfunction range(from: number, to: number): string[] {\n const step = from <= to ? 1 : -1;\n const ids: string[] = [];\n for (let i = from; step > 0 ? i <= to : i >= to; i += step) {\n ids.push(`redirect-${i}`);\n }\n return ids;\n}\n\ndescribe(\"RedirectListPresenter\", () => {\n let presenter: Abstraction.Interface;\n let container: Container;\n let redirects: Redirect[];\n\n const rowIds = () => presenter.vm.list.rows.map(row => row.id);\n\n const waitForQuery = async (field: string, direction: \"ASC\" | \"DESC\") => {\n await vi.waitFor(() => {\n expect(presenter.vm.list.appliedQuery?.sort).toEqual({ field, direction });\n expect(presenter.vm.list.pagination.loading).toBe(false);\n });\n };\n\n const initAndWait = async () => {\n presenter.init();\n await waitForQuery(\"createdOn\", \"DESC\");\n };\n\n const sortAndWait = async (field: string, direction: \"ASC\" | \"DESC\") => {\n presenter.actions.sort.set(field, direction);\n await waitForQuery(field, direction);\n };\n\n const loadAll = async () => {\n while (presenter.vm.list.pagination.hasMore) {\n await presenter.actions.loadMore();\n }\n };\n\n beforeEach(() => {\n container = new Container();\n redirects = createRedirects(TOTAL_REDIRECTS);\n\n container.registerInstance(RedirectsListCache, new ListCache<Redirect>(\"id\"));\n\n container.registerInstance(ListRedirectsGateway, createListGateway(redirects));\n container.register(ListRedirectsRepository).inSingletonScope();\n container.register(ListRedirectsUseCase);\n\n container.registerInstance(CreateRedirectGateway, {\n execute: vi.fn(async params =>\n Redirect.create({\n ...params,\n id: \"redirect-new\",\n createdOn: minutes(TOTAL_REDIRECTS + 1),\n savedOn: minutes(TOTAL_REDIRECTS + 1)\n })\n )\n });\n container.register(CreateRedirectRepository).inSingletonScope();\n container.register(CreateRedirectUseCase);\n\n container.registerInstance(UpdateRedirectGateway, {\n execute: vi.fn(async (params: UpdateRedirectParams) => {\n const existing = redirects.find(r => r.id === params.id)!;\n return Redirect.create({\n ...existing,\n ...params,\n savedOn: minutes(TOTAL_REDIRECTS + 1)\n });\n })\n });\n container.register(UpdateRedirectRepository).inSingletonScope();\n container.register(UpdateRedirectUseCase);\n\n container.register(ListPresenter);\n container.registerInstance(FolderTreePresenter, createFolderTreePresenter());\n container.registerInstance(GetDescendantFoldersUseCase, { execute: () => [] });\n container.registerInstance(CreateRedirectPresenter, {\n vm: {},\n init: vi.fn(),\n save: vi.fn()\n } as unknown as CreateRedirectPresenter.Interface);\n container.registerInstance(EditRedirectPresenter, {\n vm: {},\n loadRedirect: vi.fn(),\n save: vi.fn()\n } as unknown as EditRedirectPresenter.Interface);\n\n container.register(RedirectListPresenter);\n\n presenter = container.resolve(Abstraction);\n });\n\n describe(\"pagination\", () => {\n it(\"should show the most recently created redirects first\", async () => {\n await initAndWait();\n\n expect(rowIds()).toEqual(range(119, 70));\n });\n\n it(\"should append the next batch of redirects to the bottom of the list\", async () => {\n await initAndWait();\n\n await presenter.actions.loadMore();\n\n expect(rowIds()).toEqual(range(119, 20));\n });\n\n it(\"should keep all redirects in order after loading everything\", async () => {\n await initAndWait();\n\n await loadAll();\n\n expect(rowIds()).toEqual(range(119, 0));\n });\n });\n\n describe(\"changing the sort\", () => {\n it(\"should show only the first batch, sorted by the new field\", async () => {\n await initAndWait();\n\n await sortAndWait(\"savedOn\", \"DESC\");\n\n // `savedOn` runs opposite to `createdOn`, so the most recently saved is redirect-0.\n expect(rowIds()).toEqual(range(0, 49));\n });\n\n it(\"should show only the first batch when sorting by a boolean field\", async () => {\n await initAndWait();\n\n await sortAndWait(\"isEnabled\", \"DESC\");\n\n const expected = sortRedirects(redirects, \"isEnabled_DESC\")\n .slice(0, PAGE_SIZE)\n .map(r => r.id);\n expect(rowIds()).toEqual(expected);\n });\n\n it(\"should restore the original order when switching back\", async () => {\n await initAndWait();\n await presenter.actions.loadMore();\n\n await sortAndWait(\"createdOn\", \"ASC\");\n await sortAndWait(\"createdOn\", \"DESC\");\n\n expect(rowIds()).toEqual(range(119, 70));\n });\n });\n\n describe(\"local cache changes\", () => {\n const createRedirect = () =>\n container.resolve(CreateRedirectUseCaseAbstraction).execute({\n location: { folderId: \"root\" },\n redirectFrom: \"/new\",\n redirectTo: \"/target\",\n redirectType: \"permanent\",\n isEnabled: true\n });\n\n const updateRedirect = (id: string) => {\n const existing = redirects.find(r => r.id === id)!;\n return container.resolve(UpdateRedirectUseCaseAbstraction).execute({\n id,\n redirectFrom: existing.redirectFrom,\n redirectTo: \"/changed\",\n redirectType: existing.redirectType,\n isEnabled: existing.isEnabled\n });\n };\n\n it(\"should show a created redirect at the top when it sorts first\", async () => {\n await initAndWait();\n\n await createRedirect();\n\n expect(rowIds()).toEqual([\"redirect-new\", ...range(119, 70)]);\n });\n\n it(\"should not show a created redirect that sorts past the loaded redirects\", async () => {\n await initAndWait();\n await sortAndWait(\"createdOn\", \"ASC\");\n\n await createRedirect();\n\n // The new redirect is the most recently created, so in ASC order it belongs at the\n // very end, after redirects that are not loaded yet.\n expect(rowIds()).toEqual(range(0, 49));\n });\n\n it(\"should keep an updated redirect in its position when sorted by createdOn\", async () => {\n await initAndWait();\n\n await updateRedirect(\"redirect-100\");\n\n expect(rowIds()).toEqual(range(119, 70));\n const updated = presenter.vm.list.rows.find(row => row.id === \"redirect-100\");\n expect(updated?.redirectTo).toBe(\"/changed\");\n });\n\n it(\"should move an updated redirect to the top when sorted by savedOn\", async () => {\n await initAndWait();\n await sortAndWait(\"savedOn\", \"DESC\");\n\n await updateRedirect(\"redirect-30\");\n\n expect(rowIds()).toEqual([\"redirect-30\", ...range(0, 29), ...range(31, 49)]);\n });\n });\n});\n"],"names":["TOTAL_REDIRECTS","PAGE_SIZE","BASE_TIME","Date","minutes","n","createRedirects","count","Array","_","i","Redirect","sortRedirects","redirects","sort","field","direction","multiplier","a","b","left","String","right","createListGateway","vi","params","sorted","offset","Number","limit","data","next","hasMoreItems","createFolderTreePresenter","vm","observable","undefined","range","from","to","step","ids","describe","presenter","container","rowIds","row","waitForQuery","expect","initAndWait","sortAndWait","loadAll","beforeEach","Container","RedirectsListCache","ListCache","ListRedirectsGateway","ListRedirectsRepository","ListRedirectsUseCase","CreateRedirectGateway","CreateRedirectRepository","CreateRedirectUseCase","UpdateRedirectGateway","existing","r","UpdateRedirectRepository","UpdateRedirectUseCase","ListPresenter","FolderTreePresenter","GetDescendantFoldersUseCase","CreateRedirectPresenter","EditRedirectPresenter","RedirectListPresenter","Abstraction","it","expected","createRedirect","CreateRedirectUseCaseAbstraction","updateRedirect","id","UpdateRedirectUseCaseAbstraction","updated"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  import React from "react";
2
- export declare const BulkActionDelete: (() => React.JSX.Element) & {
3
- displayName: string;
2
+ export declare const BulkActionDelete: (() => React.JSX.Element) & React.NamedExoticComponent<unknown> & {
3
+ readonly type: () => React.JSX.Element;
4
4
  };
@@ -1,4 +1,4 @@
1
1
  import React from "react";
2
- export declare const BulkActionMove: (() => React.JSX.Element) & {
3
- displayName: string;
2
+ export declare const BulkActionMove: (() => React.JSX.Element) & React.NamedExoticComponent<unknown> & {
3
+ readonly type: () => React.JSX.Element;
4
4
  };
@@ -1,4 +1,4 @@
1
1
  import React from "react";
2
- export declare const CreateRedirectDialog: (() => React.JSX.Element | null) & {
3
- displayName: string;
2
+ export declare const CreateRedirectDialog: (() => React.JSX.Element | null) & React.NamedExoticComponent<unknown> & {
3
+ readonly type: () => React.JSX.Element | null;
4
4
  };
@@ -1,4 +1,4 @@
1
1
  import React from "react";
2
- export declare const DocumentList: (() => React.JSX.Element) & {
3
- displayName: string;
2
+ export declare const DocumentList: (() => React.JSX.Element) & React.NamedExoticComponent<unknown> & {
3
+ readonly type: () => React.JSX.Element;
4
4
  };
@@ -1,4 +1,4 @@
1
1
  import React from "react";
2
- export declare const EditRedirectDialog: (() => React.JSX.Element | null) & {
3
- displayName: string;
2
+ export declare const EditRedirectDialog: (() => React.JSX.Element | null) & React.NamedExoticComponent<unknown> & {
3
+ readonly type: () => React.JSX.Element | null;
4
4
  };
@@ -1,4 +1,4 @@
1
1
  import React from "react";
2
- export declare const Table: (() => React.JSX.Element) & {
3
- displayName: string;
2
+ export declare const Table: (() => React.JSX.Element) & React.NamedExoticComponent<unknown> & {
3
+ readonly type: () => React.JSX.Element;
4
4
  };