@webiny/app-website-builder 6.5.0-beta.0 → 6.5.0-beta.10

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 (167) 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/AddressBar/PreviewDomain.js +6 -66
  5. package/BaseEditor/defaultConfig/Content/AddressBar/PreviewDomain.js.map +1 -1
  6. package/BaseEditor/defaultConfig/Content/Preview/DropZoneManager.js.map +1 -1
  7. package/BaseEditor/defaultConfig/Content/Preview/Iframe.d.ts +2 -2
  8. package/BaseEditor/defaultConfig/Content/Preview/Overlays/ElementOverlays.d.ts +2 -2
  9. package/BaseEditor/defaultConfig/Content/Preview/PreviewContainer.js +1 -1
  10. package/BaseEditor/defaultConfig/Content/Preview/PreviewContainer.js.map +1 -1
  11. package/BaseEditor/defaultConfig/Content/usePreviewDomain.d.ts +1 -6
  12. package/BaseEditor/defaultConfig/Content/usePreviewDomain.js +1 -26
  13. package/BaseEditor/defaultConfig/DocumentStateEditor/DocumentStateEditor.d.ts +2 -2
  14. package/BaseEditor/defaultConfig/ElementInputRenderers.js +12 -0
  15. package/BaseEditor/defaultConfig/ElementInputRenderers.js.map +1 -1
  16. package/BaseEditor/defaultConfig/Sidebar/ElementSettings/ElementSettingsGroup.js +2 -5
  17. package/BaseEditor/defaultConfig/Sidebar/ElementSettings/ElementSettingsGroup.js.map +1 -1
  18. package/BaseEditor/defaultConfig/Sidebar/ElementSettings/PreviewedBindings.d.ts +22 -0
  19. package/BaseEditor/defaultConfig/Sidebar/ElementSettings/PreviewedBindings.js +17 -0
  20. package/BaseEditor/defaultConfig/Sidebar/ElementSettings/PreviewedBindings.js.map +1 -0
  21. package/BaseEditor/defaultConfig/Sidebar/ElementSettings/PreviewedBindings.test.d.ts +1 -0
  22. package/BaseEditor/defaultConfig/Sidebar/ElementSettings/PreviewedBindings.test.js +64 -0
  23. package/BaseEditor/defaultConfig/Sidebar/ElementSettings/PreviewedBindings.test.js.map +1 -0
  24. package/BaseEditor/defaultConfig/Sidebar/ElementSettings/useInputValue.js +7 -2
  25. package/BaseEditor/defaultConfig/Sidebar/ElementSettings/useInputValue.js.map +1 -1
  26. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Background/BackgroundColor.d.ts +6 -2
  27. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Background/BackgroundImage.d.ts +6 -2
  28. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Background/BackgroundImage.js +8 -1
  29. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Background/BackgroundImage.js.map +1 -1
  30. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Background/BackgroundPosition.d.ts +6 -2
  31. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Background/BackgroundScaling.d.ts +6 -2
  32. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Border/BorderColor.d.ts +2 -2
  33. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Border/BorderRadius.d.ts +2 -2
  34. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Border/BorderStyle.d.ts +2 -2
  35. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Border/BorderWidth.d.ts +2 -2
  36. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Layout/Alignment.d.ts +6 -2
  37. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Layout/LengthWithUnitInput.d.ts +2 -2
  38. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/MarginPadding/Margin.d.ts +2 -2
  39. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/MarginPadding/Padding.d.ts +2 -2
  40. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Visibility/Visibility.d.ts +2 -2
  41. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/SidebarRow.js +1 -1
  42. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/SidebarRow.js.map +1 -1
  43. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/StyleSettingsGroup.js +2 -5
  44. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/StyleSettingsGroup.js.map +1 -1
  45. package/BaseEditor/defaultConfig/Toolbar/Navigator/Navigator.d.ts +2 -2
  46. package/DocumentEditor/DocumentEditor.d.ts +2 -2
  47. package/DocumentEditor/StateInspector.d.ts +4 -2
  48. package/Extension.js +3 -0
  49. package/Extension.js.map +1 -1
  50. package/domain/Page/Page.d.ts +2 -0
  51. package/domain/Page/Page.js +1 -0
  52. package/domain/Page/Page.js.map +1 -1
  53. package/domain/PageRevision/PageRevision.d.ts +11 -0
  54. package/domain/PageRevision/PageRevision.js +20 -0
  55. package/domain/PageRevision/PageRevision.js.map +1 -1
  56. package/ecommerce/components/ResourcePage.d.ts +6 -2
  57. package/ecommerce/components/ResourcesList.d.ts +4 -4
  58. package/ecommerce/components/ResourcesPicker.d.ts +9 -4
  59. package/editorSdk/CommandBus.js.map +1 -1
  60. package/features/pages/createPageRevisionFrom/CreatePageRevisionFrom.test.js +41 -1
  61. package/features/pages/createPageRevisionFrom/CreatePageRevisionFrom.test.js.map +1 -1
  62. package/features/pages/createPageRevisionFrom/CreatePageRevisionFromRepository.d.ts +3 -2
  63. package/features/pages/createPageRevisionFrom/CreatePageRevisionFromRepository.js +8 -2
  64. package/features/pages/createPageRevisionFrom/CreatePageRevisionFromRepository.js.map +1 -1
  65. package/features/pages/deletePageRevision/DeletePageRevision.test.d.ts +1 -0
  66. package/features/pages/deletePageRevision/DeletePageRevision.test.js +67 -0
  67. package/features/pages/deletePageRevision/DeletePageRevision.test.js.map +1 -0
  68. package/features/pages/deletePageRevision/DeletePageRevisionGateway.d.ts +1 -1
  69. package/features/pages/deletePageRevision/DeletePageRevisionGateway.js +2 -3
  70. package/features/pages/deletePageRevision/DeletePageRevisionGateway.js.map +1 -1
  71. package/features/pages/deletePageRevision/DeletePageRevisionRepository.d.ts +4 -2
  72. package/features/pages/deletePageRevision/DeletePageRevisionRepository.js +7 -3
  73. package/features/pages/deletePageRevision/DeletePageRevisionRepository.js.map +1 -1
  74. package/features/pages/deletePageRevision/DeletePageRevisionUseCase.js +1 -1
  75. package/features/pages/deletePageRevision/DeletePageRevisionUseCase.js.map +1 -1
  76. package/features/pages/deletePageRevision/abstractions.d.ts +2 -3
  77. package/features/pages/deletePageRevision/abstractions.js.map +1 -1
  78. package/features/pages/getPage/PageGatewayDto.d.ts +2 -0
  79. package/features/pages/publishPage/PublishPage.test.js +41 -1
  80. package/features/pages/publishPage/PublishPage.test.js.map +1 -1
  81. package/features/pages/publishPage/PublishPageRepository.d.ts +3 -2
  82. package/features/pages/publishPage/PublishPageRepository.js +15 -4
  83. package/features/pages/publishPage/PublishPageRepository.js.map +1 -1
  84. package/features/pages/shared/pageGraphQLFields.js +1 -0
  85. package/features/pages/shared/pageGraphQLFields.js.map +1 -1
  86. package/features/pages/unpublishPage/UnpublishPage.test.js +4 -1
  87. package/features/pages/unpublishPage/UnpublishPage.test.js.map +1 -1
  88. package/features/pages/unpublishPage/UnpublishPageRepository.d.ts +3 -2
  89. package/features/pages/unpublishPage/UnpublishPageRepository.js +12 -4
  90. package/features/pages/unpublishPage/UnpublishPageRepository.js.map +1 -1
  91. package/inputRenderers/DateTimeInput.d.ts +9 -0
  92. package/inputRenderers/DateTimeInput.js +21 -0
  93. package/inputRenderers/DateTimeInput.js.map +1 -0
  94. package/inputRenderers/DateTimeInput.test.d.ts +1 -0
  95. package/inputRenderers/DateTimeInput.test.js +27 -0
  96. package/inputRenderers/DateTimeInput.test.js.map +1 -0
  97. package/inputRenderers/FileInput.js +1 -1
  98. package/inputRenderers/FileInput.js.map +1 -1
  99. package/inputRenderers/RadioInput.d.ts +3 -0
  100. package/inputRenderers/RadioInput.js +20 -0
  101. package/inputRenderers/RadioInput.js.map +1 -0
  102. package/inputRenderers/TagsInput.d.ts +3 -0
  103. package/inputRenderers/TagsInput.js +22 -0
  104. package/inputRenderers/TagsInput.js.map +1 -0
  105. package/package.json +31 -31
  106. package/presentation/pages/CreatePage/CreatePageDialog.d.ts +2 -2
  107. package/presentation/pages/PageEditor/Revisions/RevisionListDrawer.js +4 -0
  108. package/presentation/pages/PageEditor/Revisions/RevisionListDrawer.js.map +1 -1
  109. package/presentation/pages/PageEditor/Revisions/RevisionListItem.d.ts +3 -3
  110. package/presentation/pages/PageEditor/Revisions/RevisionListItem.js +9 -20
  111. package/presentation/pages/PageEditor/Revisions/RevisionListItem.js.map +1 -1
  112. package/presentation/pages/PageEditor/Revisions/RevisionsList.js +7 -19
  113. package/presentation/pages/PageEditor/Revisions/RevisionsList.js.map +1 -1
  114. package/presentation/pages/PageEditor/Revisions/useRevision.d.ts +1 -1
  115. package/presentation/pages/PageEditor/Revisions/useRevision.js +84 -14
  116. package/presentation/pages/PageEditor/Revisions/useRevision.js.map +1 -1
  117. package/presentation/pages/PageEditor/Revisions/useRevisionList.d.ts +3 -0
  118. package/presentation/pages/PageEditor/Revisions/useRevisionList.js +31 -0
  119. package/presentation/pages/PageEditor/Revisions/useRevisionList.js.map +1 -0
  120. package/presentation/pages/PageEditor/TopBar/PageSettingsDrawer.d.ts +2 -2
  121. package/presentation/pages/PageEditor/TopBar/RevisionsMenu.js +7 -19
  122. package/presentation/pages/PageEditor/TopBar/RevisionsMenu.js.map +1 -1
  123. package/presentation/pages/PageList/PageListDataSource.js +1 -1
  124. package/presentation/pages/PageList/PageListDataSource.js.map +1 -1
  125. package/presentation/pages/PageList/PageListPresenter.test.d.ts +1 -0
  126. package/presentation/pages/PageList/PageListPresenter.test.js +293 -0
  127. package/presentation/pages/PageList/PageListPresenter.test.js.map +1 -0
  128. package/presentation/pages/PageList/components/BulkActions/BulkActionDelete.d.ts +2 -2
  129. package/presentation/pages/PageList/components/BulkActions/BulkActionDuplicate.d.ts +2 -2
  130. package/presentation/pages/PageList/components/BulkActions/BulkActionMovePage.d.ts +2 -2
  131. package/presentation/pages/PageList/components/BulkActions/BulkActionPublish.d.ts +2 -2
  132. package/presentation/pages/PageList/components/BulkActions/BulkActionUnpublish.d.ts +2 -2
  133. package/presentation/pages/PageList/components/DocumentList.d.ts +2 -2
  134. package/presentation/pages/PageList/components/Table/Table.d.ts +2 -2
  135. package/presentation/pages/RevisionList/RevisionListPresenter.d.ts +27 -0
  136. package/presentation/pages/RevisionList/RevisionListPresenter.js +73 -0
  137. package/presentation/pages/RevisionList/RevisionListPresenter.js.map +1 -0
  138. package/presentation/pages/RevisionList/RevisionListPresenter.test.d.ts +1 -0
  139. package/presentation/pages/RevisionList/RevisionListPresenter.test.js +219 -0
  140. package/presentation/pages/RevisionList/RevisionListPresenter.test.js.map +1 -0
  141. package/presentation/pages/RevisionList/abstractions.d.ts +34 -0
  142. package/presentation/pages/RevisionList/abstractions.js +5 -0
  143. package/presentation/pages/RevisionList/abstractions.js.map +1 -0
  144. package/presentation/pages/RevisionList/feature.d.ts +3 -0
  145. package/presentation/pages/RevisionList/feature.js +17 -0
  146. package/presentation/pages/RevisionList/feature.js.map +1 -0
  147. package/presentation/pages/RevisionList/index.d.ts +2 -0
  148. package/presentation/pages/RevisionList/index.js +1 -0
  149. package/presentation/pages/TrashBin/WbTrashBin.d.ts +2 -2
  150. package/presentation/redirects/RedirectList/RedirectListDataSource.js +1 -1
  151. package/presentation/redirects/RedirectList/RedirectListDataSource.js.map +1 -1
  152. package/presentation/redirects/RedirectList/RedirectListPresenter.js.map +1 -1
  153. package/presentation/redirects/RedirectList/RedirectListPresenter.test.d.ts +1 -0
  154. package/presentation/redirects/RedirectList/RedirectListPresenter.test.js +273 -0
  155. package/presentation/redirects/RedirectList/RedirectListPresenter.test.js.map +1 -0
  156. package/presentation/redirects/RedirectList/components/BulkActionDelete.d.ts +2 -2
  157. package/presentation/redirects/RedirectList/components/BulkActionMove.d.ts +2 -2
  158. package/presentation/redirects/RedirectList/components/CreateRedirectDialog.d.ts +2 -2
  159. package/presentation/redirects/RedirectList/components/DocumentList.d.ts +2 -2
  160. package/presentation/redirects/RedirectList/components/EditRedirectDialog.d.ts +2 -2
  161. package/presentation/redirects/RedirectList/components/Table/Table.d.ts +2 -2
  162. package/shared/fileManagerItemToValue.js +3 -1
  163. package/shared/fileManagerItemToValue.js.map +1 -1
  164. package/shared/fileManagerItemToValue.test.d.ts +1 -0
  165. package/shared/fileManagerItemToValue.test.js +73 -0
  166. package/shared/fileManagerItemToValue.test.js.map +1 -0
  167. package/BaseEditor/defaultConfig/Content/usePreviewDomain.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"features/pages/publishPage/PublishPage.test.js","sources":["../../../../src/features/pages/publishPage/PublishPage.test.ts"],"sourcesContent":["import { describe, it, expect, beforeEach, vi } from \"vitest\";\nimport { Container } from \"@webiny/di\";\nimport { WbPageStatus } from \"~/constants.js\";\nimport { Page, pageListCache, fullPageCache } from \"~/domain/Page/index.js\";\nimport {\n PublishPageUseCase as UseCaseAbstraction,\n PublishPageGateway as GatewayAbstraction\n} from \"./abstractions.js\";\nimport { PublishPageUseCase } from \"./PublishPageUseCase.js\";\nimport { PublishPageRepository } from \"./PublishPageRepository.js\";\nimport { PageListCache, FullPageCache } from \"~/features/pages/shared/abstractions.js\";\n\ndescribe(\"PublishPage\", () => {\n const gateway = {\n execute: vi.fn().mockResolvedValue({\n id: \"page-1#0001\",\n entryId: \"page-1\",\n status: WbPageStatus.Published,\n location: {\n folderId: \"folder-1\"\n },\n properties: {\n title: \"Page 1\"\n },\n metadata: {\n metadata: \"data-1\"\n },\n elements: {\n element1: \"element\"\n },\n bindings: {\n data: \"any-data\"\n },\n extensions: {\n ext1: \"ext-data\"\n }\n })\n };\n\n const pagesCache = pageListCache;\n const detailsCache = fullPageCache;\n\n beforeEach(() => {\n vi.clearAllMocks();\n pagesCache.clear();\n detailsCache.clear();\n pagesCache.addItems([\n Page.create({\n id: \"page-1#0001\",\n entryId: \"page-1\",\n status: WbPageStatus.Draft,\n location: {\n folderId: \"folder-1\"\n },\n properties: {\n title: \"Page 1\"\n },\n metadata: {\n metadata: \"data-1\"\n },\n elements: {\n element1: \"element\"\n },\n bindings: {\n data: \"any-data\"\n }\n })\n ]);\n detailsCache.addItems([\n Page.create({\n id: \"page-1#0001\",\n entryId: \"page-1\",\n status: WbPageStatus.Draft,\n location: {\n folderId: \"folder-1\"\n },\n properties: {\n title: \"Page 1\"\n },\n metadata: {\n metadata: \"data-1\"\n },\n elements: {\n element1: \"element\"\n },\n bindings: {\n data: \"any-data\"\n },\n extensions: {\n ext1: \"ext-data\"\n }\n })\n ]);\n });\n\n it(\"should be able to publish a page\", async () => {\n const container = new Container();\n container.registerInstance(PageListCache, pagesCache);\n container.registerInstance(FullPageCache, fullPageCache);\n container.registerInstance(GatewayAbstraction, gateway);\n container.register(PublishPageRepository).inSingletonScope();\n container.register(PublishPageUseCase);\n\n const publishPage = container.resolve(UseCaseAbstraction);\n\n expect(pagesCache.hasItems()).toBeTrue();\n const item = pagesCache.getItem(page => page.id === \"page-1#0001\");\n expect(item?.id).toEqual(\"page-1#0001\");\n\n await publishPage.execute({\n id: \"page-1#0001\"\n });\n\n expect(gateway.execute).toHaveBeenCalledTimes(1);\n expect(gateway.execute).toHaveBeenLastCalledWith(\"page-1#0001\");\n\n expect(pagesCache.hasItems()).toBeTrue();\n const publishedItem = pagesCache.getItem(page => page.entryId === \"page-1\");\n\n expect(publishedItem?.id).toEqual(\"page-1#0001\");\n expect(publishedItem?.status).toEqual(WbPageStatus.Published);\n\n // Details cache is updated with the full gateway result including document fields\n const detailItem = detailsCache.getItem(page => page.entryId === \"page-1\");\n expect(detailItem).toBeDefined();\n expect(detailItem?.id).toEqual(\"page-1#0001\");\n expect(detailItem?.status).toEqual(WbPageStatus.Published);\n expect(detailItem?.elements).toMatchObject({ element1: \"element\" });\n expect(detailItem?.bindings).toMatchObject({ data: \"any-data\" });\n expect(detailItem?.extensions).toMatchObject({ ext1: \"ext-data\" });\n });\n\n it(\"should not publish a page if id is missing\", async () => {\n const container = new Container();\n container.registerInstance(PageListCache, pagesCache);\n container.registerInstance(FullPageCache, fullPageCache);\n container.registerInstance(GatewayAbstraction, gateway);\n container.register(PublishPageRepository).inSingletonScope();\n container.register(PublishPageUseCase);\n\n const publishPage = container.resolve(UseCaseAbstraction);\n\n await publishPage.execute({\n id: \"\"\n });\n\n expect(gateway.execute).toHaveBeenCalledTimes(1);\n\n const publishedItem = pagesCache.getItem(page => page.entryId === \"page-1\");\n\n expect(publishedItem?.id).toEqual(\"page-1#0001\");\n expect(publishedItem?.status).toEqual(WbPageStatus.Draft);\n });\n});\n"],"names":["describe","gateway","vi","WbPageStatus","pagesCache","pageListCache","detailsCache","fullPageCache","beforeEach","Page","it","container","Container","PageListCache","FullPageCache","GatewayAbstraction","PublishPageRepository","PublishPageUseCase","publishPage","UseCaseAbstraction","expect","item","page","publishedItem","detailItem"],"mappings":"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"}
1
+ {"version":3,"file":"features/pages/publishPage/PublishPage.test.js","sources":["../../../../src/features/pages/publishPage/PublishPage.test.ts"],"sourcesContent":["import { describe, it, expect, beforeEach, vi } from \"vitest\";\nimport { Container } from \"@webiny/di\";\nimport { WbPageStatus, type WbStatus } from \"~/constants.js\";\nimport { Page, pageListCache, fullPageCache } from \"~/domain/Page/index.js\";\nimport { PageRevision, pageRevisionsCacheFactory } from \"~/domain/PageRevision/index.js\";\nimport {\n PublishPageUseCase as UseCaseAbstraction,\n PublishPageGateway as GatewayAbstraction\n} from \"./abstractions.js\";\nimport { PublishPageUseCase } from \"./PublishPageUseCase.js\";\nimport { PublishPageRepository } from \"./PublishPageRepository.js\";\nimport {\n PageListCache,\n FullPageCache,\n PageRevisionsCache\n} from \"~/features/pages/shared/abstractions.js\";\n\ndescribe(\"PublishPage\", () => {\n const gateway = {\n execute: vi.fn().mockResolvedValue({\n id: \"page-1#0001\",\n entryId: \"page-1\",\n status: WbPageStatus.Published,\n location: {\n folderId: \"folder-1\"\n },\n properties: {\n title: \"Page 1\"\n },\n metadata: {\n metadata: \"data-1\"\n },\n elements: {\n element1: \"element\"\n },\n bindings: {\n data: \"any-data\"\n },\n extensions: {\n ext1: \"ext-data\"\n }\n })\n };\n\n const pagesCache = pageListCache;\n const detailsCache = fullPageCache;\n\n beforeEach(() => {\n vi.clearAllMocks();\n pagesCache.clear();\n detailsCache.clear();\n pagesCache.addItems([\n Page.create({\n id: \"page-1#0001\",\n entryId: \"page-1\",\n status: WbPageStatus.Draft,\n location: {\n folderId: \"folder-1\"\n },\n properties: {\n title: \"Page 1\"\n },\n metadata: {\n metadata: \"data-1\"\n },\n elements: {\n element1: \"element\"\n },\n bindings: {\n data: \"any-data\"\n }\n })\n ]);\n detailsCache.addItems([\n Page.create({\n id: \"page-1#0001\",\n entryId: \"page-1\",\n status: WbPageStatus.Draft,\n location: {\n folderId: \"folder-1\"\n },\n properties: {\n title: \"Page 1\"\n },\n metadata: {\n metadata: \"data-1\"\n },\n elements: {\n element1: \"element\"\n },\n bindings: {\n data: \"any-data\"\n },\n extensions: {\n ext1: \"ext-data\"\n }\n })\n ]);\n });\n\n it(\"should be able to publish a page\", async () => {\n const container = new Container();\n container.registerInstance(PageListCache, pagesCache);\n container.registerInstance(FullPageCache, fullPageCache);\n container.registerInstance(PageRevisionsCache, pageRevisionsCacheFactory.getCache());\n container.registerInstance(GatewayAbstraction, gateway);\n container.register(PublishPageRepository).inSingletonScope();\n container.register(PublishPageUseCase);\n\n const publishPage = container.resolve(UseCaseAbstraction);\n\n expect(pagesCache.hasItems()).toBeTrue();\n const item = pagesCache.getItem(page => page.id === \"page-1#0001\");\n expect(item?.id).toEqual(\"page-1#0001\");\n\n await publishPage.execute({\n id: \"page-1#0001\"\n });\n\n expect(gateway.execute).toHaveBeenCalledTimes(1);\n expect(gateway.execute).toHaveBeenLastCalledWith(\"page-1#0001\");\n\n expect(pagesCache.hasItems()).toBeTrue();\n const publishedItem = pagesCache.getItem(page => page.entryId === \"page-1\");\n\n expect(publishedItem?.id).toEqual(\"page-1#0001\");\n expect(publishedItem?.status).toEqual(WbPageStatus.Published);\n\n // Details cache is updated with the full gateway result including document fields\n const detailItem = detailsCache.getItem(page => page.entryId === \"page-1\");\n expect(detailItem).toBeDefined();\n expect(detailItem?.id).toEqual(\"page-1#0001\");\n expect(detailItem?.status).toEqual(WbPageStatus.Published);\n expect(detailItem?.elements).toMatchObject({ element1: \"element\" });\n expect(detailItem?.bindings).toMatchObject({ data: \"any-data\" });\n expect(detailItem?.extensions).toMatchObject({ ext1: \"ext-data\" });\n });\n\n it(\"should not publish a page if id is missing\", async () => {\n const container = new Container();\n container.registerInstance(PageListCache, pagesCache);\n container.registerInstance(FullPageCache, fullPageCache);\n container.registerInstance(PageRevisionsCache, pageRevisionsCacheFactory.getCache());\n container.registerInstance(GatewayAbstraction, gateway);\n container.register(PublishPageRepository).inSingletonScope();\n container.register(PublishPageUseCase);\n\n const publishPage = container.resolve(UseCaseAbstraction);\n\n await publishPage.execute({\n id: \"\"\n });\n\n expect(gateway.execute).toHaveBeenCalledTimes(1);\n\n const publishedItem = pagesCache.getItem(page => page.entryId === \"page-1\");\n\n expect(publishedItem?.id).toEqual(\"page-1#0001\");\n expect(publishedItem?.status).toEqual(WbPageStatus.Draft);\n });\n\n it(\"should publish the revision and unpublish the previously published one\", async () => {\n const revisionsCache = pageRevisionsCacheFactory.getCache();\n revisionsCache.clear();\n\n const makeRevision = (id: string, version: number, status: WbStatus) =>\n PageRevision.create({\n id,\n entryId: \"page-1\",\n version,\n status,\n savedOn: \"2026-09-21T00:00:00.000Z\",\n title: \"Page 1\",\n locked: false,\n createdBy: { id: \"admin\", displayName: \"Admin\", type: \"admin\" },\n createdOn: \"2026-09-21T00:00:00.000Z\",\n revisionDescription: undefined\n });\n\n revisionsCache.addItems([\n makeRevision(\"page-1#0001\", 1, WbPageStatus.Draft),\n makeRevision(\"page-1#0002\", 2, WbPageStatus.Published)\n ]);\n\n const container = new Container();\n container.registerInstance(PageListCache, pagesCache);\n container.registerInstance(FullPageCache, fullPageCache);\n container.registerInstance(PageRevisionsCache, revisionsCache);\n container.registerInstance(GatewayAbstraction, gateway);\n container.register(PublishPageRepository).inSingletonScope();\n container.register(PublishPageUseCase);\n\n const publishPage = container.resolve(UseCaseAbstraction);\n\n await publishPage.execute({ id: \"page-1#0001\" });\n\n expect(revisionsCache.getItem(r => r.id === \"page-1#0001\")?.status).toEqual(\n WbPageStatus.Published\n );\n expect(revisionsCache.getItem(r => r.id === \"page-1#0002\")?.status).toEqual(\n WbPageStatus.Unpublished\n );\n });\n});\n"],"names":["describe","gateway","vi","WbPageStatus","pagesCache","pageListCache","detailsCache","fullPageCache","beforeEach","Page","it","container","Container","PageListCache","FullPageCache","PageRevisionsCache","pageRevisionsCacheFactory","GatewayAbstraction","PublishPageRepository","PublishPageUseCase","publishPage","UseCaseAbstraction","expect","item","page","publishedItem","detailItem","revisionsCache","makeRevision","id","version","status","PageRevision","undefined","r"],"mappings":"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"}
@@ -1,11 +1,12 @@
1
1
  import { PublishPageRepository as RepositoryAbstraction, PublishPageGateway } from "./abstractions.js";
2
2
  import { Page } from "../../../domain/Page/Page.js";
3
- import { PageListCache, FullPageCache } from "../../../features/pages/shared/abstractions.js";
3
+ import { PageListCache, FullPageCache, PageRevisionsCache } from "../../../features/pages/shared/abstractions.js";
4
4
  declare class PublishPageRepositoryImpl implements RepositoryAbstraction.Interface {
5
5
  private listCache;
6
6
  private detailsCache;
7
+ private revisionsCache;
7
8
  private gateway;
8
- constructor(listCache: PageListCache.Interface, detailsCache: FullPageCache.Interface, gateway: PublishPageGateway.Interface);
9
+ constructor(listCache: PageListCache.Interface, detailsCache: FullPageCache.Interface, revisionsCache: PageRevisionsCache.Interface, gateway: PublishPageGateway.Interface);
9
10
  execute(page: Page): Promise<void>;
10
11
  }
11
12
  export declare const PublishPageRepository: typeof PublishPageRepositoryImpl & {
@@ -1,22 +1,32 @@
1
1
  import { PublishPageGateway, PublishPageRepository } from "./abstractions.js";
2
2
  import { Page } from "../../../domain/Page/Page.js";
3
- import { FullPageCache, PageListCache } from "../shared/abstractions.js";
3
+ import { PageRevision } from "../../../domain/PageRevision/PageRevision.js";
4
+ import { WbPageStatus } from "../../../constants.js";
5
+ import { FullPageCache, PageListCache, PageRevisionsCache } from "../shared/abstractions.js";
4
6
  class PublishPageRepositoryImpl {
5
- constructor(listCache, detailsCache, gateway){
7
+ constructor(listCache, detailsCache, revisionsCache, gateway){
6
8
  this.listCache = listCache;
7
9
  this.detailsCache = detailsCache;
10
+ this.revisionsCache = revisionsCache;
8
11
  this.gateway = gateway;
9
12
  }
10
13
  async execute(page) {
11
14
  const result = await this.gateway.execute(page.id);
15
+ const publishedPage = Page.create(result);
12
16
  this.listCache.updateItems((existingPage)=>{
13
- if (existingPage.id === page.id) return Page.create(result);
17
+ if (existingPage.id === page.id) return publishedPage;
14
18
  return existingPage;
15
19
  });
16
20
  this.detailsCache.updateItems((existingPage)=>{
17
- if (existingPage.id === page.id) return Page.create(result);
21
+ if (existingPage.id === page.id) return publishedPage;
18
22
  return existingPage;
19
23
  });
24
+ const publishedRevision = PageRevision.createFromPage(publishedPage);
25
+ this.revisionsCache.updateItems((revision)=>{
26
+ if (revision.id === publishedPage.id) return publishedRevision;
27
+ if (revision.entryId === publishedPage.entryId && revision.status === WbPageStatus.Published) return revision.withStatus(WbPageStatus.Unpublished);
28
+ return revision;
29
+ });
20
30
  }
21
31
  }
22
32
  const PublishPageRepository_PublishPageRepository = PublishPageRepository.createImplementation({
@@ -24,6 +34,7 @@ const PublishPageRepository_PublishPageRepository = PublishPageRepository.create
24
34
  dependencies: [
25
35
  PageListCache,
26
36
  FullPageCache,
37
+ PageRevisionsCache,
27
38
  PublishPageGateway
28
39
  ]
29
40
  });
@@ -1 +1 @@
1
- {"version":3,"file":"features/pages/publishPage/PublishPageRepository.js","sources":["../../../../src/features/pages/publishPage/PublishPageRepository.ts"],"sourcesContent":["import {\n PublishPageRepository as RepositoryAbstraction,\n PublishPageGateway\n} from \"./abstractions.js\";\nimport { Page } from \"~/domain/Page/Page.js\";\nimport { PageListCache, FullPageCache } from \"~/features/pages/shared/abstractions.js\";\n\nclass PublishPageRepositoryImpl implements RepositoryAbstraction.Interface {\n constructor(\n private listCache: PageListCache.Interface,\n private detailsCache: FullPageCache.Interface,\n private gateway: PublishPageGateway.Interface\n ) {}\n\n async execute(page: Page) {\n const result = await this.gateway.execute(page.id);\n\n this.listCache.updateItems(existingPage => {\n if (existingPage.id === page.id) {\n return Page.create(result);\n }\n return existingPage;\n });\n\n this.detailsCache.updateItems(existingPage => {\n if (existingPage.id === page.id) {\n return Page.create(result);\n }\n return existingPage;\n });\n }\n}\n\nexport const PublishPageRepository = RepositoryAbstraction.createImplementation({\n implementation: PublishPageRepositoryImpl,\n dependencies: [PageListCache, FullPageCache, PublishPageGateway]\n});\n"],"names":["PublishPageRepositoryImpl","listCache","detailsCache","gateway","page","result","existingPage","Page","PublishPageRepository","RepositoryAbstraction","PageListCache","FullPageCache","PublishPageGateway"],"mappings":";;;AAOA,MAAMA;IACF,YACYC,SAAkC,EAClCC,YAAqC,EACrCC,OAAqC,CAC/C;aAHUF,SAAS,GAATA;aACAC,YAAY,GAAZA;aACAC,OAAO,GAAPA;IACT;IAEH,MAAM,QAAQC,IAAU,EAAE;QACtB,MAAMC,SAAS,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAACD,KAAK,EAAE;QAEjD,IAAI,CAAC,SAAS,CAAC,WAAW,CAACE,CAAAA;YACvB,IAAIA,aAAa,EAAE,KAAKF,KAAK,EAAE,EAC3B,OAAOG,KAAK,MAAM,CAACF;YAEvB,OAAOC;QACX;QAEA,IAAI,CAAC,YAAY,CAAC,WAAW,CAACA,CAAAA;YAC1B,IAAIA,aAAa,EAAE,KAAKF,KAAK,EAAE,EAC3B,OAAOG,KAAK,MAAM,CAACF;YAEvB,OAAOC;QACX;IACJ;AACJ;AAEO,MAAME,8CAAwBC,sBAAAA,oBAA0C,CAAC;IAC5E,gBAAgBT;IAChB,cAAc;QAACU;QAAeC;QAAeC;KAAmB;AACpE"}
1
+ {"version":3,"file":"features/pages/publishPage/PublishPageRepository.js","sources":["../../../../src/features/pages/publishPage/PublishPageRepository.ts"],"sourcesContent":["import {\n PublishPageRepository as RepositoryAbstraction,\n PublishPageGateway\n} from \"./abstractions.js\";\nimport { Page } from \"~/domain/Page/Page.js\";\nimport { PageRevision } from \"~/domain/PageRevision/PageRevision.js\";\nimport { WbPageStatus } from \"~/constants.js\";\nimport {\n PageListCache,\n FullPageCache,\n PageRevisionsCache\n} from \"~/features/pages/shared/abstractions.js\";\n\nclass PublishPageRepositoryImpl implements RepositoryAbstraction.Interface {\n constructor(\n private listCache: PageListCache.Interface,\n private detailsCache: FullPageCache.Interface,\n private revisionsCache: PageRevisionsCache.Interface,\n private gateway: PublishPageGateway.Interface\n ) {}\n\n async execute(page: Page) {\n const result = await this.gateway.execute(page.id);\n const publishedPage = Page.create(result);\n\n this.listCache.updateItems(existingPage => {\n if (existingPage.id === page.id) {\n return publishedPage;\n }\n return existingPage;\n });\n\n this.detailsCache.updateItems(existingPage => {\n if (existingPage.id === page.id) {\n return publishedPage;\n }\n return existingPage;\n });\n\n const publishedRevision = PageRevision.createFromPage(publishedPage);\n\n this.revisionsCache.updateItems(revision => {\n if (revision.id === publishedPage.id) {\n return publishedRevision;\n }\n\n // Only one revision of an entry can be published, so the previous one is now unpublished.\n if (\n revision.entryId === publishedPage.entryId &&\n revision.status === WbPageStatus.Published\n ) {\n return revision.withStatus(WbPageStatus.Unpublished);\n }\n\n return revision;\n });\n }\n}\n\nexport const PublishPageRepository = RepositoryAbstraction.createImplementation({\n implementation: PublishPageRepositoryImpl,\n dependencies: [PageListCache, FullPageCache, PageRevisionsCache, PublishPageGateway]\n});\n"],"names":["PublishPageRepositoryImpl","listCache","detailsCache","revisionsCache","gateway","page","result","publishedPage","Page","existingPage","publishedRevision","PageRevision","revision","WbPageStatus","PublishPageRepository","RepositoryAbstraction","PageListCache","FullPageCache","PageRevisionsCache","PublishPageGateway"],"mappings":";;;;;AAaA,MAAMA;IACF,YACYC,SAAkC,EAClCC,YAAqC,EACrCC,cAA4C,EAC5CC,OAAqC,CAC/C;aAJUH,SAAS,GAATA;aACAC,YAAY,GAAZA;aACAC,cAAc,GAAdA;aACAC,OAAO,GAAPA;IACT;IAEH,MAAM,QAAQC,IAAU,EAAE;QACtB,MAAMC,SAAS,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAACD,KAAK,EAAE;QACjD,MAAME,gBAAgBC,KAAK,MAAM,CAACF;QAElC,IAAI,CAAC,SAAS,CAAC,WAAW,CAACG,CAAAA;YACvB,IAAIA,aAAa,EAAE,KAAKJ,KAAK,EAAE,EAC3B,OAAOE;YAEX,OAAOE;QACX;QAEA,IAAI,CAAC,YAAY,CAAC,WAAW,CAACA,CAAAA;YAC1B,IAAIA,aAAa,EAAE,KAAKJ,KAAK,EAAE,EAC3B,OAAOE;YAEX,OAAOE;QACX;QAEA,MAAMC,oBAAoBC,aAAa,cAAc,CAACJ;QAEtD,IAAI,CAAC,cAAc,CAAC,WAAW,CAACK,CAAAA;YAC5B,IAAIA,SAAS,EAAE,KAAKL,cAAc,EAAE,EAChC,OAAOG;YAIX,IACIE,SAAS,OAAO,KAAKL,cAAc,OAAO,IAC1CK,SAAS,MAAM,KAAKC,aAAa,SAAS,EAE1C,OAAOD,SAAS,UAAU,CAACC,aAAa,WAAW;YAGvD,OAAOD;QACX;IACJ;AACJ;AAEO,MAAME,8CAAwBC,sBAAAA,oBAA0C,CAAC;IAC5E,gBAAgBf;IAChB,cAAc;QAACgB;QAAeC;QAAeC;QAAoBC;KAAmB;AACxF"}
@@ -3,6 +3,7 @@ const getPageGraphQLBaseFields = ()=>[
3
3
  "entryId",
4
4
  "status",
5
5
  "version",
6
+ "locked",
6
7
  `location {
7
8
  folderId
8
9
  }`,
@@ -1 +1 @@
1
- {"version":3,"file":"features/pages/shared/pageGraphQLFields.js","sources":["../../../../src/features/pages/shared/pageGraphQLFields.ts"],"sourcesContent":["export const getPageGraphQLBaseFields = (): string[] => {\n return [\n `id`,\n `entryId`,\n `status`,\n `version`,\n `location {\n folderId\n }`,\n `createdOn`,\n `createdBy {\n id\n displayName\n }`,\n `savedOn`,\n `savedBy {\n id\n displayName\n }`,\n `modifiedOn`,\n `modifiedBy {\n id\n displayName\n }`,\n `live {\n version\n }\n `,\n `revisionDescription`\n ];\n};\n\nexport const getPageGraphQLFields = (extraFields: string[]): string[] => {\n return [...getPageGraphQLBaseFields(), ...extraFields];\n};\n"],"names":["getPageGraphQLBaseFields","getPageGraphQLFields","extraFields"],"mappings":"AAAO,MAAMA,2BAA2B,IAC7B;QACH;QACA;QACA;QACA;QACA,CAAC;;SAEA,CAAC;QACF;QACA,CAAC;;;SAGA,CAAC;QACF;QACA,CAAC;;;SAGA,CAAC;QACF;QACA,CAAC;;;SAGA,CAAC;QACF,CAAC;;;QAGD,CAAC;QACD;KACH;AAGE,MAAMC,uBAAuB,CAACC,cAC1B;WAAIF;WAA+BE;KAAY"}
1
+ {"version":3,"file":"features/pages/shared/pageGraphQLFields.js","sources":["../../../../src/features/pages/shared/pageGraphQLFields.ts"],"sourcesContent":["export const getPageGraphQLBaseFields = (): string[] => {\n return [\n `id`,\n `entryId`,\n `status`,\n `version`,\n `locked`,\n `location {\n folderId\n }`,\n `createdOn`,\n `createdBy {\n id\n displayName\n }`,\n `savedOn`,\n `savedBy {\n id\n displayName\n }`,\n `modifiedOn`,\n `modifiedBy {\n id\n displayName\n }`,\n `live {\n version\n }\n `,\n `revisionDescription`\n ];\n};\n\nexport const getPageGraphQLFields = (extraFields: string[]): string[] => {\n return [...getPageGraphQLBaseFields(), ...extraFields];\n};\n"],"names":["getPageGraphQLBaseFields","getPageGraphQLFields","extraFields"],"mappings":"AAAO,MAAMA,2BAA2B,IAC7B;QACH;QACA;QACA;QACA;QACA;QACA,CAAC;;SAEA,CAAC;QACF;QACA,CAAC;;;SAGA,CAAC;QACF;QACA,CAAC;;;SAGA,CAAC;QACF;QACA,CAAC;;;SAGA,CAAC;QACF,CAAC;;;QAGD,CAAC;QACD;KACH;AAGE,MAAMC,uBAAuB,CAACC,cAC1B;WAAIF;WAA+BE;KAAY"}
@@ -2,10 +2,11 @@ import { beforeEach, describe, expect, it, vi } from "vitest";
2
2
  import { Container } from "@webiny/di";
3
3
  import { WbPageStatus } from "../../../constants.js";
4
4
  import { Page, fullPageCache, pageListCache } from "../../../domain/Page/index.js";
5
+ import { pageRevisionsCacheFactory } from "../../../domain/PageRevision/index.js";
5
6
  import { UnpublishPageGateway, UnpublishPageUseCase } from "./abstractions.js";
6
7
  import { UnpublishPageUseCase as external_UnpublishPageUseCase_js_UnpublishPageUseCase } from "./UnpublishPageUseCase.js";
7
8
  import { UnpublishPageRepository } from "./UnpublishPageRepository.js";
8
- import { FullPageCache, PageListCache } from "../shared/abstractions.js";
9
+ import { FullPageCache, PageListCache, PageRevisionsCache } from "../shared/abstractions.js";
9
10
  describe("UnpublishPage", ()=>{
10
11
  const gateway = {
11
12
  execute: vi.fn().mockResolvedValue({
@@ -84,6 +85,7 @@ describe("UnpublishPage", ()=>{
84
85
  const container = new Container();
85
86
  container.registerInstance(PageListCache, pagesCache);
86
87
  container.registerInstance(FullPageCache, detailsCache);
88
+ container.registerInstance(PageRevisionsCache, pageRevisionsCacheFactory.getCache());
87
89
  container.registerInstance(UnpublishPageGateway, gateway);
88
90
  container.register(UnpublishPageRepository).inSingletonScope();
89
91
  container.register(external_UnpublishPageUseCase_js_UnpublishPageUseCase);
@@ -118,6 +120,7 @@ describe("UnpublishPage", ()=>{
118
120
  const container = new Container();
119
121
  container.registerInstance(PageListCache, pagesCache);
120
122
  container.registerInstance(FullPageCache, detailsCache);
123
+ container.registerInstance(PageRevisionsCache, pageRevisionsCacheFactory.getCache());
121
124
  container.registerInstance(UnpublishPageGateway, gateway);
122
125
  container.register(UnpublishPageRepository).inSingletonScope();
123
126
  container.register(external_UnpublishPageUseCase_js_UnpublishPageUseCase);
@@ -1 +1 @@
1
- {"version":3,"file":"features/pages/unpublishPage/UnpublishPage.test.js","sources":["../../../../src/features/pages/unpublishPage/UnpublishPage.test.ts"],"sourcesContent":["import { describe, it, expect, beforeEach, vi } from \"vitest\";\nimport { Container } from \"@webiny/di\";\nimport { WbPageStatus } from \"~/constants.js\";\nimport { Page, pageListCache, fullPageCache } from \"~/domain/Page/index.js\";\nimport {\n UnpublishPageUseCase as UseCaseAbstraction,\n UnpublishPageGateway as GatewayAbstraction\n} from \"./abstractions.js\";\nimport { UnpublishPageUseCase } from \"./UnpublishPageUseCase.js\";\nimport { UnpublishPageRepository } from \"./UnpublishPageRepository.js\";\nimport { PageListCache, FullPageCache } from \"~/features/pages/shared/abstractions.js\";\n\ndescribe(\"UnpublishPage\", () => {\n const gateway = {\n execute: vi.fn().mockResolvedValue({\n id: \"page-1#0001\",\n entryId: \"page-1\",\n status: WbPageStatus.Unpublished,\n location: {\n folderId: \"folder-1\"\n },\n properties: {\n title: \"Page 1\"\n },\n metadata: {\n metadata: \"data-1\"\n },\n elements: {\n element1: \"element\"\n },\n bindings: {\n data: \"any-data\"\n },\n extensions: {\n ext1: \"ext-data\"\n }\n })\n };\n\n const pagesCache = pageListCache;\n const detailsCache = fullPageCache;\n\n beforeEach(() => {\n vi.clearAllMocks();\n pagesCache.clear();\n detailsCache.clear();\n pagesCache.addItems([\n Page.create({\n id: \"page-1#0001\",\n entryId: \"page-1\",\n status: WbPageStatus.Published,\n location: {\n folderId: \"folder-1\"\n },\n properties: {\n title: \"Page 1\"\n },\n elements: {\n element1: \"element\"\n },\n bindings: {\n data: \"any-data\"\n }\n })\n ]);\n detailsCache.addItems([\n Page.create({\n id: \"page-1#0001\",\n entryId: \"page-1\",\n status: WbPageStatus.Published,\n location: {\n folderId: \"folder-1\"\n },\n properties: {\n title: \"Page 1\"\n },\n elements: {\n element1: \"element\"\n },\n bindings: {\n data: \"any-data\"\n },\n extensions: {\n ext1: \"ext-data\"\n }\n })\n ]);\n });\n\n it(\"should be able to unpublish a page\", async () => {\n const container = new Container();\n container.registerInstance(PageListCache, pagesCache);\n container.registerInstance(FullPageCache, detailsCache);\n container.registerInstance(GatewayAbstraction, gateway);\n container.register(UnpublishPageRepository).inSingletonScope();\n container.register(UnpublishPageUseCase);\n\n const unpublishPage = container.resolve(UseCaseAbstraction);\n\n expect(pagesCache.hasItems()).toBeTrue();\n const item = pagesCache.getItem(page => page.id === \"page-1#0001\");\n expect(item?.id).toEqual(\"page-1#0001\");\n\n await unpublishPage.execute({\n id: \"page-1#0001\"\n });\n\n expect(gateway.execute).toHaveBeenCalledTimes(1);\n expect(gateway.execute).toHaveBeenLastCalledWith(\"page-1#0001\");\n\n expect(pagesCache.hasItems()).toBeTrue();\n const publishedItem = pagesCache.getItem(page => page.entryId === \"page-1\");\n\n expect(publishedItem?.id).toEqual(\"page-1#0001\");\n expect(publishedItem?.status).toEqual(WbPageStatus.Unpublished);\n\n // Details cache is updated with the full gateway result including document fields\n const detailItem = detailsCache.getItem(page => page.entryId === \"page-1\");\n expect(detailItem).toBeDefined();\n expect(detailItem?.id).toEqual(\"page-1#0001\");\n expect(detailItem?.status).toEqual(WbPageStatus.Unpublished);\n expect(detailItem?.elements).toMatchObject({ element1: \"element\" });\n expect(detailItem?.bindings).toMatchObject({ data: \"any-data\" });\n expect(detailItem?.extensions).toMatchObject({ ext1: \"ext-data\" });\n });\n\n it(\"should not unpublish a page if id is missing\", async () => {\n const container = new Container();\n container.registerInstance(PageListCache, pagesCache);\n container.registerInstance(FullPageCache, detailsCache);\n container.registerInstance(GatewayAbstraction, gateway);\n container.register(UnpublishPageRepository).inSingletonScope();\n container.register(UnpublishPageUseCase);\n\n const unpublishPage = container.resolve(UseCaseAbstraction);\n\n await unpublishPage.execute({\n id: \"\"\n });\n\n expect(gateway.execute).toHaveBeenCalledTimes(1);\n\n const publishedItem = pagesCache.getItem(page => page.entryId === \"page-1\");\n\n expect(publishedItem?.id).toEqual(\"page-1#0001\");\n expect(publishedItem?.status).toEqual(WbPageStatus.Published);\n });\n});\n"],"names":["describe","gateway","vi","WbPageStatus","pagesCache","pageListCache","detailsCache","fullPageCache","beforeEach","Page","it","container","Container","PageListCache","FullPageCache","GatewayAbstraction","UnpublishPageRepository","UnpublishPageUseCase","unpublishPage","UseCaseAbstraction","expect","item","page","publishedItem","detailItem"],"mappings":"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"}
1
+ {"version":3,"file":"features/pages/unpublishPage/UnpublishPage.test.js","sources":["../../../../src/features/pages/unpublishPage/UnpublishPage.test.ts"],"sourcesContent":["import { describe, it, expect, beforeEach, vi } from \"vitest\";\nimport { Container } from \"@webiny/di\";\nimport { WbPageStatus } from \"~/constants.js\";\nimport { Page, pageListCache, fullPageCache } from \"~/domain/Page/index.js\";\nimport { pageRevisionsCacheFactory } from \"~/domain/PageRevision/index.js\";\nimport {\n UnpublishPageUseCase as UseCaseAbstraction,\n UnpublishPageGateway as GatewayAbstraction\n} from \"./abstractions.js\";\nimport { UnpublishPageUseCase } from \"./UnpublishPageUseCase.js\";\nimport { UnpublishPageRepository } from \"./UnpublishPageRepository.js\";\nimport {\n PageListCache,\n FullPageCache,\n PageRevisionsCache\n} from \"~/features/pages/shared/abstractions.js\";\n\ndescribe(\"UnpublishPage\", () => {\n const gateway = {\n execute: vi.fn().mockResolvedValue({\n id: \"page-1#0001\",\n entryId: \"page-1\",\n status: WbPageStatus.Unpublished,\n location: {\n folderId: \"folder-1\"\n },\n properties: {\n title: \"Page 1\"\n },\n metadata: {\n metadata: \"data-1\"\n },\n elements: {\n element1: \"element\"\n },\n bindings: {\n data: \"any-data\"\n },\n extensions: {\n ext1: \"ext-data\"\n }\n })\n };\n\n const pagesCache = pageListCache;\n const detailsCache = fullPageCache;\n\n beforeEach(() => {\n vi.clearAllMocks();\n pagesCache.clear();\n detailsCache.clear();\n pagesCache.addItems([\n Page.create({\n id: \"page-1#0001\",\n entryId: \"page-1\",\n status: WbPageStatus.Published,\n location: {\n folderId: \"folder-1\"\n },\n properties: {\n title: \"Page 1\"\n },\n elements: {\n element1: \"element\"\n },\n bindings: {\n data: \"any-data\"\n }\n })\n ]);\n detailsCache.addItems([\n Page.create({\n id: \"page-1#0001\",\n entryId: \"page-1\",\n status: WbPageStatus.Published,\n location: {\n folderId: \"folder-1\"\n },\n properties: {\n title: \"Page 1\"\n },\n elements: {\n element1: \"element\"\n },\n bindings: {\n data: \"any-data\"\n },\n extensions: {\n ext1: \"ext-data\"\n }\n })\n ]);\n });\n\n it(\"should be able to unpublish a page\", async () => {\n const container = new Container();\n container.registerInstance(PageListCache, pagesCache);\n container.registerInstance(FullPageCache, detailsCache);\n container.registerInstance(PageRevisionsCache, pageRevisionsCacheFactory.getCache());\n container.registerInstance(GatewayAbstraction, gateway);\n container.register(UnpublishPageRepository).inSingletonScope();\n container.register(UnpublishPageUseCase);\n\n const unpublishPage = container.resolve(UseCaseAbstraction);\n\n expect(pagesCache.hasItems()).toBeTrue();\n const item = pagesCache.getItem(page => page.id === \"page-1#0001\");\n expect(item?.id).toEqual(\"page-1#0001\");\n\n await unpublishPage.execute({\n id: \"page-1#0001\"\n });\n\n expect(gateway.execute).toHaveBeenCalledTimes(1);\n expect(gateway.execute).toHaveBeenLastCalledWith(\"page-1#0001\");\n\n expect(pagesCache.hasItems()).toBeTrue();\n const publishedItem = pagesCache.getItem(page => page.entryId === \"page-1\");\n\n expect(publishedItem?.id).toEqual(\"page-1#0001\");\n expect(publishedItem?.status).toEqual(WbPageStatus.Unpublished);\n\n // Details cache is updated with the full gateway result including document fields\n const detailItem = detailsCache.getItem(page => page.entryId === \"page-1\");\n expect(detailItem).toBeDefined();\n expect(detailItem?.id).toEqual(\"page-1#0001\");\n expect(detailItem?.status).toEqual(WbPageStatus.Unpublished);\n expect(detailItem?.elements).toMatchObject({ element1: \"element\" });\n expect(detailItem?.bindings).toMatchObject({ data: \"any-data\" });\n expect(detailItem?.extensions).toMatchObject({ ext1: \"ext-data\" });\n });\n\n it(\"should not unpublish a page if id is missing\", async () => {\n const container = new Container();\n container.registerInstance(PageListCache, pagesCache);\n container.registerInstance(FullPageCache, detailsCache);\n container.registerInstance(PageRevisionsCache, pageRevisionsCacheFactory.getCache());\n container.registerInstance(GatewayAbstraction, gateway);\n container.register(UnpublishPageRepository).inSingletonScope();\n container.register(UnpublishPageUseCase);\n\n const unpublishPage = container.resolve(UseCaseAbstraction);\n\n await unpublishPage.execute({\n id: \"\"\n });\n\n expect(gateway.execute).toHaveBeenCalledTimes(1);\n\n const publishedItem = pagesCache.getItem(page => page.entryId === \"page-1\");\n\n expect(publishedItem?.id).toEqual(\"page-1#0001\");\n expect(publishedItem?.status).toEqual(WbPageStatus.Published);\n });\n});\n"],"names":["describe","gateway","vi","WbPageStatus","pagesCache","pageListCache","detailsCache","fullPageCache","beforeEach","Page","it","container","Container","PageListCache","FullPageCache","PageRevisionsCache","pageRevisionsCacheFactory","GatewayAbstraction","UnpublishPageRepository","UnpublishPageUseCase","unpublishPage","UseCaseAbstraction","expect","item","page","publishedItem","detailItem"],"mappings":"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"}
@@ -1,11 +1,12 @@
1
1
  import { UnpublishPageRepository as RepositoryAbstraction, UnpublishPageGateway } from "./abstractions.js";
2
2
  import { Page } from "../../../domain/Page/Page.js";
3
- import { PageListCache, FullPageCache } from "../../../features/pages/shared/abstractions.js";
3
+ import { PageListCache, FullPageCache, PageRevisionsCache } from "../../../features/pages/shared/abstractions.js";
4
4
  declare class UnpublishPageRepositoryImpl implements RepositoryAbstraction.Interface {
5
5
  private listCache;
6
6
  private detailsCache;
7
+ private revisionsCache;
7
8
  private gateway;
8
- constructor(listCache: PageListCache.Interface, detailsCache: FullPageCache.Interface, gateway: UnpublishPageGateway.Interface);
9
+ constructor(listCache: PageListCache.Interface, detailsCache: FullPageCache.Interface, revisionsCache: PageRevisionsCache.Interface, gateway: UnpublishPageGateway.Interface);
9
10
  execute(page: Page): Promise<void>;
10
11
  }
11
12
  export declare const UnpublishPageRepository: typeof UnpublishPageRepositoryImpl & {
@@ -1,22 +1,29 @@
1
1
  import { UnpublishPageGateway, UnpublishPageRepository } from "./abstractions.js";
2
2
  import { Page } from "../../../domain/Page/Page.js";
3
- import { FullPageCache, PageListCache } from "../shared/abstractions.js";
3
+ import { PageRevision } from "../../../domain/PageRevision/PageRevision.js";
4
+ import { FullPageCache, PageListCache, PageRevisionsCache } from "../shared/abstractions.js";
4
5
  class UnpublishPageRepositoryImpl {
5
- constructor(listCache, detailsCache, gateway){
6
+ constructor(listCache, detailsCache, revisionsCache, gateway){
6
7
  this.listCache = listCache;
7
8
  this.detailsCache = detailsCache;
9
+ this.revisionsCache = revisionsCache;
8
10
  this.gateway = gateway;
9
11
  }
10
12
  async execute(page) {
11
13
  const result = await this.gateway.execute(page.id);
14
+ const unpublishedPage = Page.create(result);
12
15
  this.listCache.updateItems((existingPage)=>{
13
- if (existingPage.id === page.id) return Page.create(result);
16
+ if (existingPage.id === page.id) return unpublishedPage;
14
17
  return existingPage;
15
18
  });
16
19
  this.detailsCache.updateItems((existingPage)=>{
17
- if (existingPage.id === page.id) return Page.create(result);
20
+ if (existingPage.id === page.id) return unpublishedPage;
18
21
  return existingPage;
19
22
  });
23
+ this.revisionsCache.updateItems((revision)=>{
24
+ if (revision.id === unpublishedPage.id) return PageRevision.createFromPage(unpublishedPage);
25
+ return revision;
26
+ });
20
27
  }
21
28
  }
22
29
  const UnpublishPageRepository_UnpublishPageRepository = UnpublishPageRepository.createImplementation({
@@ -24,6 +31,7 @@ const UnpublishPageRepository_UnpublishPageRepository = UnpublishPageRepository.
24
31
  dependencies: [
25
32
  PageListCache,
26
33
  FullPageCache,
34
+ PageRevisionsCache,
27
35
  UnpublishPageGateway
28
36
  ]
29
37
  });
@@ -1 +1 @@
1
- {"version":3,"file":"features/pages/unpublishPage/UnpublishPageRepository.js","sources":["../../../../src/features/pages/unpublishPage/UnpublishPageRepository.ts"],"sourcesContent":["import {\n UnpublishPageRepository as RepositoryAbstraction,\n UnpublishPageGateway\n} from \"./abstractions.js\";\nimport { Page } from \"~/domain/Page/Page.js\";\nimport { PageListCache, FullPageCache } from \"~/features/pages/shared/abstractions.js\";\n\nclass UnpublishPageRepositoryImpl implements RepositoryAbstraction.Interface {\n constructor(\n private listCache: PageListCache.Interface,\n private detailsCache: FullPageCache.Interface,\n private gateway: UnpublishPageGateway.Interface\n ) {}\n\n async execute(page: Page) {\n const result = await this.gateway.execute(page.id);\n\n this.listCache.updateItems(existingPage => {\n if (existingPage.id === page.id) {\n return Page.create(result);\n }\n return existingPage;\n });\n\n this.detailsCache.updateItems(existingPage => {\n if (existingPage.id === page.id) {\n return Page.create(result);\n }\n return existingPage;\n });\n }\n}\n\nexport const UnpublishPageRepository = RepositoryAbstraction.createImplementation({\n implementation: UnpublishPageRepositoryImpl,\n dependencies: [PageListCache, FullPageCache, UnpublishPageGateway]\n});\n"],"names":["UnpublishPageRepositoryImpl","listCache","detailsCache","gateway","page","result","existingPage","Page","UnpublishPageRepository","RepositoryAbstraction","PageListCache","FullPageCache","UnpublishPageGateway"],"mappings":";;;AAOA,MAAMA;IACF,YACYC,SAAkC,EAClCC,YAAqC,EACrCC,OAAuC,CACjD;aAHUF,SAAS,GAATA;aACAC,YAAY,GAAZA;aACAC,OAAO,GAAPA;IACT;IAEH,MAAM,QAAQC,IAAU,EAAE;QACtB,MAAMC,SAAS,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAACD,KAAK,EAAE;QAEjD,IAAI,CAAC,SAAS,CAAC,WAAW,CAACE,CAAAA;YACvB,IAAIA,aAAa,EAAE,KAAKF,KAAK,EAAE,EAC3B,OAAOG,KAAK,MAAM,CAACF;YAEvB,OAAOC;QACX;QAEA,IAAI,CAAC,YAAY,CAAC,WAAW,CAACA,CAAAA;YAC1B,IAAIA,aAAa,EAAE,KAAKF,KAAK,EAAE,EAC3B,OAAOG,KAAK,MAAM,CAACF;YAEvB,OAAOC;QACX;IACJ;AACJ;AAEO,MAAME,kDAA0BC,wBAAAA,oBAA0C,CAAC;IAC9E,gBAAgBT;IAChB,cAAc;QAACU;QAAeC;QAAeC;KAAqB;AACtE"}
1
+ {"version":3,"file":"features/pages/unpublishPage/UnpublishPageRepository.js","sources":["../../../../src/features/pages/unpublishPage/UnpublishPageRepository.ts"],"sourcesContent":["import {\n UnpublishPageRepository as RepositoryAbstraction,\n UnpublishPageGateway\n} from \"./abstractions.js\";\nimport { Page } from \"~/domain/Page/Page.js\";\nimport { PageRevision } from \"~/domain/PageRevision/PageRevision.js\";\nimport {\n PageListCache,\n FullPageCache,\n PageRevisionsCache\n} from \"~/features/pages/shared/abstractions.js\";\n\nclass UnpublishPageRepositoryImpl implements RepositoryAbstraction.Interface {\n constructor(\n private listCache: PageListCache.Interface,\n private detailsCache: FullPageCache.Interface,\n private revisionsCache: PageRevisionsCache.Interface,\n private gateway: UnpublishPageGateway.Interface\n ) {}\n\n async execute(page: Page) {\n const result = await this.gateway.execute(page.id);\n const unpublishedPage = Page.create(result);\n\n this.listCache.updateItems(existingPage => {\n if (existingPage.id === page.id) {\n return unpublishedPage;\n }\n return existingPage;\n });\n\n this.detailsCache.updateItems(existingPage => {\n if (existingPage.id === page.id) {\n return unpublishedPage;\n }\n return existingPage;\n });\n\n this.revisionsCache.updateItems(revision => {\n if (revision.id === unpublishedPage.id) {\n return PageRevision.createFromPage(unpublishedPage);\n }\n return revision;\n });\n }\n}\n\nexport const UnpublishPageRepository = RepositoryAbstraction.createImplementation({\n implementation: UnpublishPageRepositoryImpl,\n dependencies: [PageListCache, FullPageCache, PageRevisionsCache, UnpublishPageGateway]\n});\n"],"names":["UnpublishPageRepositoryImpl","listCache","detailsCache","revisionsCache","gateway","page","result","unpublishedPage","Page","existingPage","revision","PageRevision","UnpublishPageRepository","RepositoryAbstraction","PageListCache","FullPageCache","PageRevisionsCache","UnpublishPageGateway"],"mappings":";;;;AAYA,MAAMA;IACF,YACYC,SAAkC,EAClCC,YAAqC,EACrCC,cAA4C,EAC5CC,OAAuC,CACjD;aAJUH,SAAS,GAATA;aACAC,YAAY,GAAZA;aACAC,cAAc,GAAdA;aACAC,OAAO,GAAPA;IACT;IAEH,MAAM,QAAQC,IAAU,EAAE;QACtB,MAAMC,SAAS,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAACD,KAAK,EAAE;QACjD,MAAME,kBAAkBC,KAAK,MAAM,CAACF;QAEpC,IAAI,CAAC,SAAS,CAAC,WAAW,CAACG,CAAAA;YACvB,IAAIA,aAAa,EAAE,KAAKJ,KAAK,EAAE,EAC3B,OAAOE;YAEX,OAAOE;QACX;QAEA,IAAI,CAAC,YAAY,CAAC,WAAW,CAACA,CAAAA;YAC1B,IAAIA,aAAa,EAAE,KAAKJ,KAAK,EAAE,EAC3B,OAAOE;YAEX,OAAOE;QACX;QAEA,IAAI,CAAC,cAAc,CAAC,WAAW,CAACC,CAAAA;YAC5B,IAAIA,SAAS,EAAE,KAAKH,gBAAgB,EAAE,EAClC,OAAOI,aAAa,cAAc,CAACJ;YAEvC,OAAOG;QACX;IACJ;AACJ;AAEO,MAAME,kDAA0BC,wBAAAA,oBAA0C,CAAC;IAC9E,gBAAgBb;IAChB,cAAc;QAACc;QAAeC;QAAeC;QAAoBC;KAAqB;AAC1F"}
@@ -0,0 +1,9 @@
1
+ import React from "react";
2
+ import type { ElementInputRendererProps } from "../BaseEditor/index.js";
3
+ /**
4
+ * The `dateTimeLocal` picker displays the stored ISO instant in local time, but emits the edited
5
+ * local wall-clock time with a `Z` suffix. Read that wall-clock time as local and convert it to a
6
+ * real UTC instant, so the stored value matches what the user picked.
7
+ */
8
+ export declare const toUtcIsoString: (pickerValue: string | undefined) => string | undefined;
9
+ export declare const DateTimeInputRenderer: ({ value, onChange, input, label }: ElementInputRendererProps) => React.JSX.Element;
@@ -0,0 +1,21 @@
1
+ import react from "react";
2
+ import { DatePicker } from "@webiny/admin-ui";
3
+ const toUtcIsoString = (pickerValue)=>{
4
+ if (!pickerValue) return;
5
+ return new Date(pickerValue.replace(/Z$/, "")).toISOString();
6
+ };
7
+ const DateTimeInputRenderer = ({ value, onChange, input, label })=>/*#__PURE__*/ react.createElement(DatePicker, {
8
+ type: "dateTimeLocal",
9
+ value: value || void 0,
10
+ onChange: (newValue)=>{
11
+ onChange(({ value })=>{
12
+ value.set(toUtcIsoString(newValue));
13
+ });
14
+ },
15
+ label: label,
16
+ description: input.description,
17
+ note: input.helperText
18
+ });
19
+ export { DateTimeInputRenderer, toUtcIsoString };
20
+
21
+ //# sourceMappingURL=DateTimeInput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inputRenderers/DateTimeInput.js","sources":["../../src/inputRenderers/DateTimeInput.tsx"],"sourcesContent":["import React from \"react\";\nimport { DatePicker } from \"@webiny/admin-ui\";\nimport type { ElementInputRendererProps } from \"~/BaseEditor/index.js\";\n\n/**\n * The `dateTimeLocal` picker displays the stored ISO instant in local time, but emits the edited\n * local wall-clock time with a `Z` suffix. Read that wall-clock time as local and convert it to a\n * real UTC instant, so the stored value matches what the user picked.\n */\nexport const toUtcIsoString = (pickerValue: string | undefined) => {\n if (!pickerValue) {\n return undefined;\n }\n return new Date(pickerValue.replace(/Z$/, \"\")).toISOString();\n};\n\nexport const DateTimeInputRenderer = ({\n value,\n onChange,\n input,\n label\n}: ElementInputRendererProps) => {\n return (\n <DatePicker\n type={\"dateTimeLocal\"}\n value={value || undefined}\n onChange={(newValue: string | undefined) => {\n onChange(({ value }) => {\n value.set(toUtcIsoString(newValue));\n });\n }}\n label={label}\n description={input.description}\n note={input.helperText}\n />\n );\n};\n"],"names":["toUtcIsoString","pickerValue","Date","DateTimeInputRenderer","value","onChange","input","label","DatePicker","undefined","newValue"],"mappings":";;AASO,MAAMA,iBAAiB,CAACC;IAC3B,IAAI,CAACA,aACD;IAEJ,OAAO,IAAIC,KAAKD,YAAY,OAAO,CAAC,MAAM,KAAK,WAAW;AAC9D;AAEO,MAAME,wBAAwB,CAAC,EAClCC,KAAK,EACLC,QAAQ,EACRC,KAAK,EACLC,KAAK,EACmB,GACjB,WAAP,GACI,oBAACC,YAAUA;QACP,MAAM;QACN,OAAOJ,SAASK;QAChB,UAAU,CAACC;YACPL,SAAS,CAAC,EAAED,KAAK,EAAE;gBACfA,MAAM,GAAG,CAACJ,eAAeU;YAC7B;QACJ;QACA,OAAOH;QACP,aAAaD,MAAM,WAAW;QAC9B,MAAMA,MAAM,UAAU"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,27 @@
1
+ import { afterAll, beforeAll, describe, expect, it } from "vitest";
2
+ import { toUtcIsoString } from "./DateTimeInput.js";
3
+ describe("toUtcIsoString", ()=>{
4
+ const originalTz = process.env.TZ;
5
+ beforeAll(()=>{
6
+ process.env.TZ = "America/New_York";
7
+ });
8
+ afterAll(()=>{
9
+ process.env.TZ = originalTz;
10
+ });
11
+ it("converts the picker's local wall-clock value to the matching UTC instant", ()=>{
12
+ expect(toUtcIsoString("2026-10-02T09:00:00.000Z")).toBe("2026-10-02T13:00:00.000Z");
13
+ });
14
+ it("round-trips: a stored instant shown in local time is saved back unchanged", ()=>{
15
+ const stored = "2026-10-02T14:00:00.000Z";
16
+ const shown = new Date(stored);
17
+ const pad = (n)=>String(n).padStart(2, "0");
18
+ const emitted = `${shown.getFullYear()}-${pad(shown.getMonth() + 1)}-${pad(shown.getDate())}T${pad(shown.getHours())}:${pad(shown.getMinutes())}:00.000Z`;
19
+ expect(toUtcIsoString(emitted)).toBe(stored);
20
+ });
21
+ it("keeps an empty value empty", ()=>{
22
+ expect(toUtcIsoString(void 0)).toBeUndefined();
23
+ expect(toUtcIsoString("")).toBeUndefined();
24
+ });
25
+ });
26
+
27
+ //# sourceMappingURL=DateTimeInput.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inputRenderers/DateTimeInput.test.js","sources":["../../src/inputRenderers/DateTimeInput.test.ts"],"sourcesContent":["import { describe, it, expect, beforeAll, afterAll } from \"vitest\";\nimport { toUtcIsoString } from \"./DateTimeInput.js\";\n\ndescribe(\"toUtcIsoString\", () => {\n const originalTz = process.env.TZ;\n\n beforeAll(() => {\n // UTC-04:00 on the dates below (EDT).\n process.env.TZ = \"America/New_York\";\n });\n\n afterAll(() => {\n process.env.TZ = originalTz;\n });\n\n it(\"converts the picker's local wall-clock value to the matching UTC instant\", () => {\n // The user picks 09:00 local time; the picker emits it as \"09:00Z\".\n expect(toUtcIsoString(\"2026-10-02T09:00:00.000Z\")).toBe(\"2026-10-02T13:00:00.000Z\");\n });\n\n it(\"round-trips: a stored instant shown in local time is saved back unchanged\", () => {\n const stored = \"2026-10-02T14:00:00.000Z\";\n // What the picker displays (local) and emits back with a \"Z\" suffix.\n const shown = new Date(stored);\n const pad = (n: number) => String(n).padStart(2, \"0\");\n const emitted = `${shown.getFullYear()}-${pad(shown.getMonth() + 1)}-${pad(\n shown.getDate()\n )}T${pad(shown.getHours())}:${pad(shown.getMinutes())}:00.000Z`;\n\n expect(toUtcIsoString(emitted)).toBe(stored);\n });\n\n it(\"keeps an empty value empty\", () => {\n expect(toUtcIsoString(undefined)).toBeUndefined();\n expect(toUtcIsoString(\"\")).toBeUndefined();\n });\n});\n"],"names":["describe","originalTz","process","beforeAll","afterAll","it","expect","toUtcIsoString","stored","shown","Date","pad","n","String","emitted","undefined"],"mappings":";;AAGAA,SAAS,kBAAkB;IACvB,MAAMC,aAAaC,QAAQ,GAAG,CAAC,EAAE;IAEjCC,UAAU;QAEND,QAAQ,GAAG,CAAC,EAAE,GAAG;IACrB;IAEAE,SAAS;QACLF,QAAQ,GAAG,CAAC,EAAE,GAAGD;IACrB;IAEAI,GAAG,4EAA4E;QAE3EC,OAAOC,eAAe,6BAA6B,IAAI,CAAC;IAC5D;IAEAF,GAAG,6EAA6E;QAC5E,MAAMG,SAAS;QAEf,MAAMC,QAAQ,IAAIC,KAAKF;QACvB,MAAMG,MAAM,CAACC,IAAcC,OAAOD,GAAG,QAAQ,CAAC,GAAG;QACjD,MAAME,UAAU,GAAGL,MAAM,WAAW,GAAG,CAAC,EAAEE,IAAIF,MAAM,QAAQ,KAAK,GAAG,CAAC,EAAEE,IACnEF,MAAM,OAAO,IACf,CAAC,EAAEE,IAAIF,MAAM,QAAQ,IAAI,CAAC,EAAEE,IAAIF,MAAM,UAAU,IAAI,QAAQ,CAAC;QAE/DH,OAAOC,eAAeO,UAAU,IAAI,CAACN;IACzC;IAEAH,GAAG,8BAA8B;QAC7BC,OAAOC,eAAeQ,SAAY,aAAa;QAC/CT,OAAOC,eAAe,KAAK,aAAa;IAC5C;AACJ"}
@@ -4,7 +4,7 @@ import { FileManager } from "@webiny/app-admin";
4
4
  import { useBreakpoint } from "../BaseEditor/hooks/useBreakpoint.js";
5
5
  import { getAssetCropParam, normalizeToAsset } from "@webiny/website-builder-sdk";
6
6
  import { fileManagerItemToValue } from "../shared/fileManagerItemToValue.js";
7
- const isEditableImage = (asset)=>!!asset?.src && "string" == typeof asset.type && asset.type.startsWith("image/") && "image/svg+xml" !== asset.type;
7
+ const isEditableImage = (asset)=>!!asset?.src && "string" == typeof asset.mimeType && asset.mimeType.startsWith("image/") && "image/svg+xml" !== asset.mimeType;
8
8
  const hasImageEdit = (image)=>{
9
9
  if (!image?.width || !image?.height) return false;
10
10
  const c = image.crop;
@@ -1 +1 @@
1
- {"version":3,"file":"inputRenderers/FileInput.js","sources":["../../src/inputRenderers/FileInput.tsx"],"sourcesContent":["import React, { useState } from \"react\";\nimport {\n FilePicker,\n ImageEditor,\n RichItemPreview,\n getCroppedImageRenderStyles,\n type ImageEditorValue\n} from \"@webiny/admin-ui\";\nimport type { ElementInputRendererProps } from \"~/BaseEditor/index.js\";\nimport { FileManager, type FileManagerFileItem } from \"@webiny/app-admin\";\nimport { useBreakpoint } from \"~/BaseEditor/hooks/useBreakpoint.js\";\nimport {\n normalizeToAsset,\n getAssetCropParam,\n type Asset,\n type AssetImage\n} from \"@webiny/website-builder-sdk\";\nimport type { FileInput } from \"@webiny/website-builder-sdk\";\nimport { fileManagerItemToValue } from \"~/shared/fileManagerItemToValue.js\";\n\nconst isEditableImage = (asset: Asset | undefined): asset is Asset => {\n return (\n !!asset?.src &&\n typeof asset.type === \"string\" &&\n asset.type.startsWith(\"image/\") &&\n asset.type !== \"image/svg+xml\"\n );\n};\n\n/** True when the image carries a non-trivial crop or focal point worth previewing. */\nconst hasImageEdit = (image: AssetImage | undefined): boolean => {\n if (!image?.width || !image?.height) {\n return false;\n }\n const c = image.crop;\n const fullCrop = !c || (c.top === 0 && c.left === 0 && c.bottom === 0 && c.right === 0);\n const fp = image.focalPoint;\n const centeredFocal = !fp || (fp.x === 0.5 && fp.y === 0.5);\n return !fullCrop || !centeredFocal;\n};\n\n/** Map the stored asset image into the shared `ImageEditor` value (focalPoint → hotspot). */\nconst toEditorValue = (image: AssetImage | undefined): ImageEditorValue | undefined => {\n if (!image) {\n return undefined;\n }\n return {\n crop: image.crop,\n hotspot: image.focalPoint\n ? { x: image.focalPoint.x, y: image.focalPoint.y, width: 1, height: 1 }\n : undefined,\n alt: image.alt,\n caption: image.caption\n };\n};\n\nexport const FileInputRenderer = ({\n value,\n onChange,\n label,\n ...props\n}: ElementInputRendererProps) => {\n const input = props.input as FileInput;\n const { isBaseBreakpoint } = useBreakpoint();\n const [editorOpen, setEditorOpen] = useState(false);\n\n const asset = normalizeToAsset(value) ?? undefined;\n const editable = isEditableImage(asset);\n\n const onFileChange = (file: FileManagerFileItem) => {\n onChange(({ value }) => {\n value.set(fileManagerItemToValue(file));\n });\n };\n\n const onRemove = () => {\n onChange(({ value }) => {\n if (isBaseBreakpoint) {\n value.set(undefined);\n } else {\n value.set(null);\n }\n });\n };\n\n // Save the per-usage crop / focal point / alt override onto the element value,\n // writing the unified asset shape (hotspot → focalPoint).\n const onSaveEdit = (edit: ImageEditorValue) => {\n onChange(({ value }) => {\n if (!asset) {\n return;\n }\n const image: AssetImage = {\n width: asset.image?.width,\n height: asset.image?.height,\n crop: edit.crop,\n focalPoint: edit.hotspot ? { x: edit.hotspot.x, y: edit.hotspot.y } : undefined,\n alt: edit.alt,\n caption: edit.caption\n };\n const updated = { ...asset, image };\n const cropParam = getAssetCropParam(updated);\n if (cropParam) {\n const sep = asset.src.includes(\"?\") ? \"&\" : \"?\";\n updated.url = `${asset.src}${sep}crop=${cropParam}`;\n } else {\n updated.url = asset.src;\n }\n value.set(updated);\n });\n };\n\n return (\n <FileManager\n accept={input.allowedFileTypes}\n onChange={onFileChange}\n render={({ showFileManager }) => (\n <>\n <FilePicker\n variant={\"secondary\"}\n label={label}\n description={input.description}\n type=\"compact\"\n value={asset?.src}\n // Reflect the per-usage crop + focal point in the thumbnail.\n renderFilePreview={\n editable && asset?.src && hasImageEdit(asset.image)\n ? previewProps => (\n <RichItemPreview\n {...previewProps}\n renderImage={({ name }) => {\n const { wrapper, image } =\n getCroppedImageRenderStyles(\n asset.image?.width ?? 0,\n asset.image?.height ?? 0,\n asset.image?.crop,\n asset.image?.focalPoint\n ? {\n x: asset.image.focalPoint.x,\n y: asset.image.focalPoint.y,\n width: 1,\n height: 1\n }\n : undefined,\n { boxWidth: 1, boxHeight: 1, fit: \"cover\" }\n );\n return (\n <div style={wrapper}>\n <img\n src={asset.src as string}\n alt={name}\n draggable={false}\n style={image}\n />\n </div>\n );\n }}\n />\n )\n : undefined\n }\n onSelectItem={() => showFileManager()}\n onRemoveItem={onRemove}\n // The \"Edit\" (pencil) action edits the image (crop / focal\n // point / alt). Replacing the file is done by clicking the\n // preview. For non-images there is nothing to edit, so the\n // pencil is hidden.\n onEditItem={editable ? () => setEditorOpen(true) : undefined}\n />\n {editable ? (\n <ImageEditor\n open={editorOpen}\n onClose={() => setEditorOpen(false)}\n image={{\n src: asset.src,\n width: asset.image?.width ?? 0,\n height: asset.image?.height ?? 0\n }}\n value={toEditorValue(asset.image)}\n onSave={onSaveEdit}\n />\n ) : null}\n </>\n )}\n />\n );\n};\n"],"names":["isEditableImage","asset","hasImageEdit","image","c","fullCrop","fp","centeredFocal","toEditorValue","undefined","FileInputRenderer","value","onChange","label","props","input","isBaseBreakpoint","useBreakpoint","editorOpen","setEditorOpen","useState","normalizeToAsset","editable","onFileChange","file","fileManagerItemToValue","onRemove","onSaveEdit","edit","updated","cropParam","getAssetCropParam","sep","FileManager","showFileManager","FilePicker","previewProps","RichItemPreview","name","wrapper","getCroppedImageRenderStyles","ImageEditor"],"mappings":"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"}
1
+ {"version":3,"file":"inputRenderers/FileInput.js","sources":["../../src/inputRenderers/FileInput.tsx"],"sourcesContent":["import React, { useState } from \"react\";\nimport {\n FilePicker,\n ImageEditor,\n RichItemPreview,\n getCroppedImageRenderStyles,\n type ImageEditorValue\n} from \"@webiny/admin-ui\";\nimport type { ElementInputRendererProps } from \"~/BaseEditor/index.js\";\nimport { FileManager, type FileManagerFileItem } from \"@webiny/app-admin\";\nimport { useBreakpoint } from \"~/BaseEditor/hooks/useBreakpoint.js\";\nimport {\n normalizeToAsset,\n getAssetCropParam,\n type Asset,\n type AssetImage\n} from \"@webiny/website-builder-sdk\";\nimport type { FileInput } from \"@webiny/website-builder-sdk\";\nimport { fileManagerItemToValue } from \"~/shared/fileManagerItemToValue.js\";\n\nconst isEditableImage = (asset: Asset | undefined): asset is Asset => {\n return (\n !!asset?.src &&\n typeof asset.mimeType === \"string\" &&\n asset.mimeType.startsWith(\"image/\") &&\n asset.mimeType !== \"image/svg+xml\"\n );\n};\n\n/** True when the image carries a non-trivial crop or focal point worth previewing. */\nconst hasImageEdit = (image: AssetImage | undefined): boolean => {\n if (!image?.width || !image?.height) {\n return false;\n }\n const c = image.crop;\n const fullCrop = !c || (c.top === 0 && c.left === 0 && c.bottom === 0 && c.right === 0);\n const fp = image.focalPoint;\n const centeredFocal = !fp || (fp.x === 0.5 && fp.y === 0.5);\n return !fullCrop || !centeredFocal;\n};\n\n/** Map the stored asset image into the shared `ImageEditor` value (focalPoint → hotspot). */\nconst toEditorValue = (image: AssetImage | undefined): ImageEditorValue | undefined => {\n if (!image) {\n return undefined;\n }\n return {\n crop: image.crop,\n hotspot: image.focalPoint\n ? { x: image.focalPoint.x, y: image.focalPoint.y, width: 1, height: 1 }\n : undefined,\n alt: image.alt,\n caption: image.caption\n };\n};\n\nexport const FileInputRenderer = ({\n value,\n onChange,\n label,\n ...props\n}: ElementInputRendererProps) => {\n const input = props.input as FileInput;\n const { isBaseBreakpoint } = useBreakpoint();\n const [editorOpen, setEditorOpen] = useState(false);\n\n const asset = normalizeToAsset(value) ?? undefined;\n const editable = isEditableImage(asset);\n\n const onFileChange = (file: FileManagerFileItem) => {\n onChange(({ value }) => {\n value.set(fileManagerItemToValue(file));\n });\n };\n\n const onRemove = () => {\n onChange(({ value }) => {\n if (isBaseBreakpoint) {\n value.set(undefined);\n } else {\n value.set(null);\n }\n });\n };\n\n // Save the per-usage crop / focal point / alt override onto the element value,\n // writing the unified asset shape (hotspot → focalPoint).\n const onSaveEdit = (edit: ImageEditorValue) => {\n onChange(({ value }) => {\n if (!asset) {\n return;\n }\n const image: AssetImage = {\n width: asset.image?.width,\n height: asset.image?.height,\n crop: edit.crop,\n focalPoint: edit.hotspot ? { x: edit.hotspot.x, y: edit.hotspot.y } : undefined,\n alt: edit.alt,\n caption: edit.caption\n };\n const updated = { ...asset, image };\n const cropParam = getAssetCropParam(updated);\n if (cropParam) {\n const sep = asset.src.includes(\"?\") ? \"&\" : \"?\";\n updated.url = `${asset.src}${sep}crop=${cropParam}`;\n } else {\n updated.url = asset.src;\n }\n value.set(updated);\n });\n };\n\n return (\n <FileManager\n accept={input.allowedFileTypes}\n onChange={onFileChange}\n render={({ showFileManager }) => (\n <>\n <FilePicker\n variant={\"secondary\"}\n label={label}\n description={input.description}\n type=\"compact\"\n value={asset?.src}\n // Reflect the per-usage crop + focal point in the thumbnail.\n renderFilePreview={\n editable && asset?.src && hasImageEdit(asset.image)\n ? previewProps => (\n <RichItemPreview\n {...previewProps}\n renderImage={({ name }) => {\n const { wrapper, image } =\n getCroppedImageRenderStyles(\n asset.image?.width ?? 0,\n asset.image?.height ?? 0,\n asset.image?.crop,\n asset.image?.focalPoint\n ? {\n x: asset.image.focalPoint.x,\n y: asset.image.focalPoint.y,\n width: 1,\n height: 1\n }\n : undefined,\n { boxWidth: 1, boxHeight: 1, fit: \"cover\" }\n );\n return (\n <div style={wrapper}>\n <img\n src={asset.src as string}\n alt={name}\n draggable={false}\n style={image}\n />\n </div>\n );\n }}\n />\n )\n : undefined\n }\n onSelectItem={() => showFileManager()}\n onRemoveItem={onRemove}\n // The \"Edit\" (pencil) action edits the image (crop / focal\n // point / alt). Replacing the file is done by clicking the\n // preview. For non-images there is nothing to edit, so the\n // pencil is hidden.\n onEditItem={editable ? () => setEditorOpen(true) : undefined}\n />\n {editable ? (\n <ImageEditor\n open={editorOpen}\n onClose={() => setEditorOpen(false)}\n image={{\n src: asset.src,\n width: asset.image?.width ?? 0,\n height: asset.image?.height ?? 0\n }}\n value={toEditorValue(asset.image)}\n onSave={onSaveEdit}\n />\n ) : null}\n </>\n )}\n />\n );\n};\n"],"names":["isEditableImage","asset","hasImageEdit","image","c","fullCrop","fp","centeredFocal","toEditorValue","undefined","FileInputRenderer","value","onChange","label","props","input","isBaseBreakpoint","useBreakpoint","editorOpen","setEditorOpen","useState","normalizeToAsset","editable","onFileChange","file","fileManagerItemToValue","onRemove","onSaveEdit","edit","updated","cropParam","getAssetCropParam","sep","FileManager","showFileManager","FilePicker","previewProps","RichItemPreview","name","wrapper","getCroppedImageRenderStyles","ImageEditor"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import React from "react";
2
+ import type { ElementInputRendererProps } from "../BaseEditor/index.js";
3
+ export declare const RadioInputRenderer: ({ value, onChange, label, ...props }: ElementInputRendererProps) => React.JSX.Element;
@@ -0,0 +1,20 @@
1
+ import react from "react";
2
+ import { RadioGroup } from "@webiny/admin-ui";
3
+ const RadioInputRenderer = ({ value, onChange, label, ...props })=>{
4
+ const input = props.input;
5
+ return /*#__PURE__*/ react.createElement(RadioGroup, {
6
+ value: value,
7
+ onChange: (newValue)=>{
8
+ onChange(({ value })=>{
9
+ value.set(newValue);
10
+ });
11
+ },
12
+ items: input.options,
13
+ label: label,
14
+ description: input.description,
15
+ note: input.helperText
16
+ });
17
+ };
18
+ export { RadioInputRenderer };
19
+
20
+ //# sourceMappingURL=RadioInput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inputRenderers/RadioInput.js","sources":["../../src/inputRenderers/RadioInput.tsx"],"sourcesContent":["import React from \"react\";\nimport { RadioGroup } from \"@webiny/admin-ui\";\nimport type { ElementInputRendererProps } from \"~/BaseEditor/index.js\";\nimport type { RadioInput } from \"@webiny/website-builder-sdk\";\n\nexport const RadioInputRenderer = ({\n value,\n onChange,\n label,\n ...props\n}: ElementInputRendererProps) => {\n const input = props.input as RadioInput;\n return (\n <RadioGroup\n value={value}\n onChange={newValue => {\n onChange(({ value }) => {\n value.set(newValue);\n });\n }}\n items={input.options}\n label={label}\n description={input.description}\n note={input.helperText}\n />\n );\n};\n"],"names":["RadioInputRenderer","value","onChange","label","props","input","RadioGroup","newValue"],"mappings":";;AAKO,MAAMA,qBAAqB,CAAC,EAC/BC,KAAK,EACLC,QAAQ,EACRC,KAAK,EACL,GAAGC,OACqB;IACxB,MAAMC,QAAQD,MAAM,KAAK;IACzB,OAAO,WAAP,GACI,oBAACE,YAAUA;QACP,OAAOL;QACP,UAAUM,CAAAA;YACNL,SAAS,CAAC,EAAED,KAAK,EAAE;gBACfA,MAAM,GAAG,CAACM;YACd;QACJ;QACA,OAAOF,MAAM,OAAO;QACpB,OAAOF;QACP,aAAaE,MAAM,WAAW;QAC9B,MAAMA,MAAM,UAAU;;AAGlC"}
@@ -0,0 +1,3 @@
1
+ import React from "react";
2
+ import type { ElementInputRendererProps } from "../BaseEditor/index.js";
3
+ export declare const TagsInputRenderer: ({ value, onChange, input, label }: ElementInputRendererProps) => React.JSX.Element;
@@ -0,0 +1,22 @@
1
+ import react from "react";
2
+ import { Tags } from "@webiny/admin-ui";
3
+ const TagsInputRenderer = ({ value, onChange, input, label })=>{
4
+ const commitValue = (newValue)=>{
5
+ onChange(({ value })=>{
6
+ value.set(newValue);
7
+ });
8
+ };
9
+ return /*#__PURE__*/ react.createElement(Tags, {
10
+ size: "md",
11
+ variant: "secondary",
12
+ value: Array.isArray(value) ? value : [],
13
+ onChange: commitValue,
14
+ placeholder: "Add values",
15
+ label: label,
16
+ description: input.description,
17
+ note: input.helperText
18
+ });
19
+ };
20
+ export { TagsInputRenderer };
21
+
22
+ //# sourceMappingURL=TagsInput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inputRenderers/TagsInput.js","sources":["../../src/inputRenderers/TagsInput.tsx"],"sourcesContent":["import React from \"react\";\nimport { Tags } from \"@webiny/admin-ui\";\nimport type { ElementInputRendererProps } from \"~/BaseEditor/index.js\";\n\nexport const TagsInputRenderer = ({ value, onChange, input, label }: ElementInputRendererProps) => {\n const commitValue = (newValue: string[]) => {\n onChange(({ value }) => {\n value.set(newValue);\n });\n };\n\n return (\n <Tags\n size={\"md\"}\n variant={\"secondary\"}\n value={Array.isArray(value) ? value : []}\n onChange={commitValue}\n placeholder={\"Add values\"}\n label={label}\n description={input.description}\n note={input.helperText}\n />\n );\n};\n"],"names":["TagsInputRenderer","value","onChange","input","label","commitValue","newValue","Tags","Array"],"mappings":";;AAIO,MAAMA,oBAAoB,CAAC,EAAEC,KAAK,EAAEC,QAAQ,EAAEC,KAAK,EAAEC,KAAK,EAA6B;IAC1F,MAAMC,cAAc,CAACC;QACjBJ,SAAS,CAAC,EAAED,KAAK,EAAE;YACfA,MAAM,GAAG,CAACK;QACd;IACJ;IAEA,OAAO,WAAP,GACI,oBAACC,MAAIA;QACD,MAAM;QACN,SAAS;QACT,OAAOC,MAAM,OAAO,CAACP,SAASA,QAAQ,EAAE;QACxC,UAAUI;QACV,aAAa;QACb,OAAOD;QACP,aAAaD,MAAM,WAAW;QAC9B,MAAMA,MAAM,UAAU;;AAGlC"}