@webiny/ai-powerups 6.4.11 → 6.6.0-alpha.1

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 (239) hide show
  1. package/AiPowerups.js +2 -2
  2. package/AiPowerups.js.map +1 -1
  3. package/admin/Extension.js +11 -2
  4. package/admin/Extension.js.map +1 -1
  5. package/admin/features/compareEntryRevisions/CompareEntryRevisionsGateway.d.ts +12 -0
  6. package/admin/features/compareEntryRevisions/CompareEntryRevisionsGateway.js +46 -0
  7. package/admin/features/compareEntryRevisions/CompareEntryRevisionsGateway.js.map +1 -0
  8. package/admin/features/compareEntryRevisions/CompareEntryRevisionsRepository.d.ts +11 -0
  9. package/admin/features/compareEntryRevisions/CompareEntryRevisionsRepository.js +18 -0
  10. package/admin/features/compareEntryRevisions/CompareEntryRevisionsRepository.js.map +1 -0
  11. package/admin/features/compareEntryRevisions/CompareEntryRevisionsUseCase.d.ts +11 -0
  12. package/admin/features/compareEntryRevisions/CompareEntryRevisionsUseCase.js +18 -0
  13. package/admin/features/compareEntryRevisions/CompareEntryRevisionsUseCase.js.map +1 -0
  14. package/admin/features/compareEntryRevisions/abstractions.d.ts +32 -0
  15. package/admin/features/compareEntryRevisions/abstractions.js +7 -0
  16. package/admin/features/compareEntryRevisions/abstractions.js.map +1 -0
  17. package/admin/features/compareEntryRevisions/feature.d.ts +1 -0
  18. package/admin/features/compareEntryRevisions/feature.js +15 -0
  19. package/admin/features/compareEntryRevisions/feature.js.map +1 -0
  20. package/admin/features/compareEntryRevisions/index.d.ts +2 -0
  21. package/admin/features/compareEntryRevisions/index.js +2 -0
  22. package/admin/features/feature.js +2 -0
  23. package/admin/features/feature.js.map +1 -1
  24. package/admin/features/generateEntryContent/GenerateEntryContentGateway.d.ts +12 -0
  25. package/admin/features/generateEntryContent/GenerateEntryContentGateway.js +45 -0
  26. package/admin/features/generateEntryContent/GenerateEntryContentGateway.js.map +1 -0
  27. package/admin/features/generateEntryContent/GenerateEntryContentUseCase.d.ts +11 -0
  28. package/admin/features/generateEntryContent/GenerateEntryContentUseCase.js +18 -0
  29. package/admin/features/generateEntryContent/GenerateEntryContentUseCase.js.map +1 -0
  30. package/admin/features/generateEntryContent/abstractions.d.ts +24 -0
  31. package/admin/features/generateEntryContent/abstractions.js +6 -0
  32. package/admin/features/generateEntryContent/abstractions.js.map +1 -0
  33. package/admin/features/generateEntryContent/feature.d.ts +1 -0
  34. package/admin/features/generateEntryContent/feature.js +13 -0
  35. package/admin/features/generateEntryContent/feature.js.map +1 -0
  36. package/admin/features/generateEntryContent/index.d.ts +3 -0
  37. package/admin/features/generateEntryContent/index.js +2 -0
  38. package/admin/features/generatePageContent/GeneratePageContentGateway.js +2 -0
  39. package/admin/features/generatePageContent/GeneratePageContentGateway.js.map +1 -1
  40. package/admin/features/generatePageContent/abstractions.d.ts +1 -0
  41. package/admin/features/generatePageContent/abstractions.js.map +1 -1
  42. package/admin/presentation/AiPowerUpsSettings/AiPowerUpsSettingsPage.d.ts +2 -2
  43. package/admin/presentation/AiPowerUpsSettings/AiPowerUpsSettingsPage.js +3 -4
  44. package/admin/presentation/AiPowerUpsSettings/AiPowerUpsSettingsPage.js.map +1 -1
  45. package/admin/presentation/AiPromptFormFactory/AiPromptFormFactory.d.ts +20 -0
  46. package/admin/presentation/AiPromptFormFactory/AiPromptFormFactory.js +108 -0
  47. package/admin/presentation/AiPromptFormFactory/AiPromptFormFactory.js.map +1 -0
  48. package/admin/presentation/AiPromptFormFactory/abstractions.d.ts +14 -0
  49. package/admin/presentation/AiPromptFormFactory/abstractions.js +5 -0
  50. package/admin/presentation/AiPromptFormFactory/abstractions.js.map +1 -0
  51. package/admin/presentation/AiPromptFormFactory/feature.d.ts +1 -0
  52. package/admin/presentation/AiPromptFormFactory/feature.js +11 -0
  53. package/admin/presentation/AiPromptFormFactory/feature.js.map +1 -0
  54. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsDialog.d.ts +9 -0
  55. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsDialog.js +118 -0
  56. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsDialog.js.map +1 -0
  57. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsDrawer.d.ts +9 -0
  58. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsDrawer.js +72 -0
  59. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsDrawer.js.map +1 -0
  60. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsMenuItem.d.ts +4 -0
  61. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsMenuItem.js +21 -0
  62. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsMenuItem.js.map +1 -0
  63. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsOverlays.d.ts +2 -0
  64. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsOverlays.js +17 -0
  65. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsOverlays.js.map +1 -0
  66. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsPresenter.d.ts +25 -0
  67. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsPresenter.js +90 -0
  68. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsPresenter.js.map +1 -0
  69. package/admin/presentation/CmsCompareEntryRevisions/Extension.d.ts +2 -0
  70. package/admin/presentation/CmsCompareEntryRevisions/Extension.js +16 -0
  71. package/admin/presentation/CmsCompareEntryRevisions/Extension.js.map +1 -0
  72. package/admin/presentation/CmsCompareEntryRevisions/abstractions.d.ts +29 -0
  73. package/admin/presentation/CmsCompareEntryRevisions/abstractions.js +5 -0
  74. package/admin/presentation/CmsCompareEntryRevisions/abstractions.js.map +1 -0
  75. package/admin/presentation/CmsCompareEntryRevisions/feature.d.ts +3 -0
  76. package/admin/presentation/CmsCompareEntryRevisions/feature.js +17 -0
  77. package/admin/presentation/CmsCompareEntryRevisions/feature.js.map +1 -0
  78. package/admin/presentation/CmsContentGeneration/CmsGenerateContentButton.d.ts +4 -0
  79. package/admin/presentation/CmsContentGeneration/CmsGenerateContentButton.js +27 -0
  80. package/admin/presentation/CmsContentGeneration/CmsGenerateContentButton.js.map +1 -0
  81. package/admin/presentation/CmsContentGeneration/CmsGenerateContentDialog.d.ts +5 -0
  82. package/admin/presentation/CmsContentGeneration/CmsGenerateContentDialog.js +106 -0
  83. package/admin/presentation/CmsContentGeneration/CmsGenerateContentDialog.js.map +1 -0
  84. package/admin/presentation/CmsContentGeneration/CmsGenerateContentPresenter.d.ts +29 -0
  85. package/admin/presentation/CmsContentGeneration/CmsGenerateContentPresenter.js +120 -0
  86. package/admin/presentation/CmsContentGeneration/CmsGenerateContentPresenter.js.map +1 -0
  87. package/admin/presentation/CmsContentGeneration/Extension.d.ts +2 -0
  88. package/admin/presentation/CmsContentGeneration/Extension.js +27 -0
  89. package/admin/presentation/CmsContentGeneration/Extension.js.map +1 -0
  90. package/admin/presentation/CmsContentGeneration/abstractions.d.ts +20 -0
  91. package/admin/presentation/CmsContentGeneration/abstractions.js +5 -0
  92. package/admin/presentation/CmsContentGeneration/abstractions.js.map +1 -0
  93. package/admin/presentation/CmsContentGeneration/feature.d.ts +3 -0
  94. package/admin/presentation/CmsContentGeneration/feature.js +17 -0
  95. package/admin/presentation/CmsContentGeneration/feature.js.map +1 -0
  96. package/admin/presentation/CmsEntryWizard/CmsEntryWizard.d.ts +4 -0
  97. package/admin/presentation/CmsEntryWizard/CmsEntryWizard.js +113 -0
  98. package/admin/presentation/CmsEntryWizard/CmsEntryWizard.js.map +1 -0
  99. package/admin/presentation/CmsEntryWizard/CmsEntryWizardGate.d.ts +4 -0
  100. package/admin/presentation/CmsEntryWizard/CmsEntryWizardGate.js +19 -0
  101. package/admin/presentation/CmsEntryWizard/CmsEntryWizardGate.js.map +1 -0
  102. package/admin/presentation/CmsEntryWizard/Extension.d.ts +2 -0
  103. package/admin/presentation/CmsEntryWizard/Extension.js +10 -0
  104. package/admin/presentation/CmsEntryWizard/Extension.js.map +1 -0
  105. package/admin/presentation/ProjectsSettings.js +4 -4
  106. package/admin/presentation/ProjectsSettings.js.map +1 -1
  107. package/admin/presentation/ProvidersSettings.js +1 -1
  108. package/admin/presentation/ProvidersSettings.js.map +1 -1
  109. package/admin/presentation/WbContentGeneration/GenerateContentDialog.d.ts +2 -2
  110. package/admin/presentation/WbContentGeneration/GenerateContentDialog.js +2 -2
  111. package/admin/presentation/WbContentGeneration/GenerateContentDialog.js.map +1 -1
  112. package/admin/presentation/WbContentGeneration/GenerateContentPresenter.d.ts +4 -12
  113. package/admin/presentation/WbContentGeneration/GenerateContentPresenter.js +12 -94
  114. package/admin/presentation/WbContentGeneration/GenerateContentPresenter.js.map +1 -1
  115. package/api/Extension.js +13 -3
  116. package/api/Extension.js.map +1 -1
  117. package/api/features/AiChatProvider/PowerUpsAiChatProvider.d.ts +24 -0
  118. package/api/features/AiChatProvider/PowerUpsAiChatProvider.js +31 -0
  119. package/api/features/AiChatProvider/PowerUpsAiChatProvider.js.map +1 -0
  120. package/api/features/AiChatProvider/feature.d.ts +9 -0
  121. package/api/features/AiChatProvider/feature.js +11 -0
  122. package/api/features/AiChatProvider/feature.js.map +1 -0
  123. package/api/features/AiChatProvider/index.d.ts +2 -0
  124. package/api/features/AiChatProvider/index.js +2 -0
  125. package/api/features/AiImageEnrichment/AiImageEnrichmentStreamRoute.d.ts +36 -0
  126. package/api/features/AiImageEnrichment/AiImageEnrichmentStreamRoute.js +85 -0
  127. package/api/features/AiImageEnrichment/AiImageEnrichmentStreamRoute.js.map +1 -0
  128. package/api/features/AiImageEnrichment/AiImageEnrichmentTask.d.ts +10 -14
  129. package/api/features/AiImageEnrichment/AiImageEnrichmentTask.js +27 -100
  130. package/api/features/AiImageEnrichment/AiImageEnrichmentTask.js.map +1 -1
  131. package/api/features/AiImageEnrichment/ApplyImageEnrichmentUseCase.d.ts +18 -0
  132. package/api/features/AiImageEnrichment/ApplyImageEnrichmentUseCase.js +50 -0
  133. package/api/features/AiImageEnrichment/ApplyImageEnrichmentUseCase.js.map +1 -0
  134. package/api/features/AiImageEnrichment/PrepareImageEnrichmentUseCase.d.ts +19 -0
  135. package/api/features/AiImageEnrichment/PrepareImageEnrichmentUseCase.js +49 -0
  136. package/api/features/AiImageEnrichment/PrepareImageEnrichmentUseCase.js.map +1 -0
  137. package/api/features/AiImageEnrichment/abstractions.d.ts +60 -0
  138. package/api/features/AiImageEnrichment/abstractions.js +12 -0
  139. package/api/features/AiImageEnrichment/abstractions.js.map +1 -0
  140. package/api/features/AiImageEnrichment/buildEnrichmentAiRequest.d.ts +12 -0
  141. package/api/features/AiImageEnrichment/buildEnrichmentAiRequest.js +30 -0
  142. package/api/features/AiImageEnrichment/buildEnrichmentAiRequest.js.map +1 -0
  143. package/api/features/AiImageEnrichment/errors.d.ts +26 -0
  144. package/api/features/AiImageEnrichment/errors.js +28 -0
  145. package/api/features/AiImageEnrichment/errors.js.map +1 -0
  146. package/api/features/AiImageEnrichment/feature.js +9 -0
  147. package/api/features/AiImageEnrichment/feature.js.map +1 -1
  148. package/api/features/AiImageEnrichment/imageEnrichmentErrorStatusCode.d.ts +6 -0
  149. package/api/features/AiImageEnrichment/imageEnrichmentErrorStatusCode.js +9 -0
  150. package/api/features/AiImageEnrichment/imageEnrichmentErrorStatusCode.js.map +1 -0
  151. package/api/features/AiImageEnrichment/readEnrichmentPartial.d.ts +8 -0
  152. package/api/features/AiImageEnrichment/readEnrichmentPartial.js +16 -0
  153. package/api/features/AiImageEnrichment/readEnrichmentPartial.js.map +1 -0
  154. package/api/features/AiImageEnrichment/streamEvents.d.ts +36 -0
  155. package/api/features/AiImageEnrichment/streamEvents.js +0 -0
  156. package/api/features/AiPromptContext/AiPromptContextBuilder.d.ts +8 -1
  157. package/api/features/AiPromptContext/AiPromptContextBuilder.js +46 -2
  158. package/api/features/AiPromptContext/AiPromptContextBuilder.js.map +1 -1
  159. package/api/features/AiPromptContext/abstractions.d.ts +3 -0
  160. package/api/features/AiPromptContext/abstractions.js +9 -1
  161. package/api/features/AiPromptContext/abstractions.js.map +1 -1
  162. package/api/features/AiPromptContext/index.d.ts +1 -1
  163. package/api/features/AiPromptContext/index.js +1 -1
  164. package/api/features/CmsCompareEntryRevisions/CmsCompareEntryRevisionsUseCase.d.ts +22 -0
  165. package/api/features/CmsCompareEntryRevisions/CmsCompareEntryRevisionsUseCase.js +136 -0
  166. package/api/features/CmsCompareEntryRevisions/CmsCompareEntryRevisionsUseCase.js.map +1 -0
  167. package/api/features/CmsCompareEntryRevisions/abstractions.d.ts +18 -0
  168. package/api/features/CmsCompareEntryRevisions/abstractions.js +5 -0
  169. package/api/features/CmsCompareEntryRevisions/abstractions.js.map +1 -0
  170. package/api/features/CmsCompareEntryRevisions/feature.d.ts +4 -0
  171. package/api/features/CmsCompareEntryRevisions/feature.js +11 -0
  172. package/api/features/CmsCompareEntryRevisions/feature.js.map +1 -0
  173. package/api/features/CmsCompareEntryRevisions/index.d.ts +2 -0
  174. package/api/features/CmsCompareEntryRevisions/index.js +2 -0
  175. package/api/features/CmsGenerateEntryContent/CmsGenerateEntryContentTask.d.ts +33 -0
  176. package/api/features/CmsGenerateEntryContent/CmsGenerateEntryContentTask.js +84 -0
  177. package/api/features/CmsGenerateEntryContent/CmsGenerateEntryContentTask.js.map +1 -0
  178. package/api/features/CmsGenerateEntryContent/CmsGenerateEntryContentUseCase.d.ts +29 -0
  179. package/api/features/CmsGenerateEntryContent/CmsGenerateEntryContentUseCase.js +141 -0
  180. package/api/features/CmsGenerateEntryContent/CmsGenerateEntryContentUseCase.js.map +1 -0
  181. package/api/features/CmsGenerateEntryContent/abstractions.d.ts +36 -0
  182. package/api/features/CmsGenerateEntryContent/abstractions.js +5 -0
  183. package/api/features/CmsGenerateEntryContent/abstractions.js.map +1 -0
  184. package/api/features/CmsGenerateEntryContent/buildPrompt.d.ts +2 -0
  185. package/api/features/CmsGenerateEntryContent/buildPrompt.js +61 -0
  186. package/api/features/CmsGenerateEntryContent/buildPrompt.js.map +1 -0
  187. package/api/features/CmsGenerateEntryContent/feature.d.ts +4 -0
  188. package/api/features/CmsGenerateEntryContent/feature.js +13 -0
  189. package/api/features/CmsGenerateEntryContent/feature.js.map +1 -0
  190. package/api/features/CmsGenerateEntryContent/index.d.ts +1 -0
  191. package/api/features/CmsGenerateEntryContent/index.js +1 -0
  192. package/api/features/CmsGenerateEntryContent/injectDynamicZoneTypenames.d.ts +2 -0
  193. package/api/features/CmsGenerateEntryContent/injectDynamicZoneTypenames.js +30 -0
  194. package/api/features/CmsGenerateEntryContent/injectDynamicZoneTypenames.js.map +1 -0
  195. package/api/features/CmsResolveImageTool/CmsResolveImageTool.d.ts +14 -0
  196. package/api/features/CmsResolveImageTool/CmsResolveImageTool.js +27 -0
  197. package/api/features/CmsResolveImageTool/CmsResolveImageTool.js.map +1 -0
  198. package/api/features/CmsResolveImageTool/feature.d.ts +4 -0
  199. package/api/features/CmsResolveImageTool/feature.js +11 -0
  200. package/api/features/CmsResolveImageTool/feature.js.map +1 -0
  201. package/api/features/GetSettings/GetSettingsUseCase.d.ts +1 -1
  202. package/api/features/GetSettings/index.d.ts +1 -0
  203. package/api/features/GetSettings/index.js +1 -0
  204. package/api/features/Providers/ProvidersHandler.d.ts +1 -3
  205. package/api/features/Providers/ProvidersHandler.js +2 -15
  206. package/api/features/Providers/ProvidersHandler.js.map +1 -1
  207. package/api/features/Providers/types.d.ts +2 -2
  208. package/api/features/WbGeneratePageContent/WbGeneratePageContentTask.d.ts +4 -3
  209. package/api/features/WbGeneratePageContent/WbGeneratePageContentTask.js +25 -15
  210. package/api/features/WbGeneratePageContent/WbGeneratePageContentTask.js.map +1 -1
  211. package/api/features/WbGeneratePageContent/WbGeneratePageContentUseCase.js +4 -3
  212. package/api/features/WbGeneratePageContent/WbGeneratePageContentUseCase.js.map +1 -1
  213. package/api/features/WbGeneratePageContent/abstractions.d.ts +1 -0
  214. package/api/features/WbGeneratePageContent/abstractions.js.map +1 -1
  215. package/api/features/WbTranslatePage/LexicalParser.d.ts +10 -0
  216. package/api/features/WbTranslatePage/LexicalParser.js +37 -0
  217. package/api/features/WbTranslatePage/LexicalParser.js.map +1 -0
  218. package/api/features/WbTranslatePage/WbTranslatePageDecorator.d.ts +27 -0
  219. package/api/features/WbTranslatePage/WbTranslatePageDecorator.js +134 -0
  220. package/api/features/WbTranslatePage/WbTranslatePageDecorator.js.map +1 -0
  221. package/api/features/WbTranslatePage/abstractions/LexicalParser.d.ts +7 -0
  222. package/api/features/WbTranslatePage/abstractions/LexicalParser.js +5 -0
  223. package/api/features/WbTranslatePage/abstractions/LexicalParser.js.map +1 -0
  224. package/api/features/WbTranslatePage/feature.d.ts +4 -0
  225. package/api/features/WbTranslatePage/feature.js +13 -0
  226. package/api/features/WbTranslatePage/feature.js.map +1 -0
  227. package/api/features/WbTranslatePage/index.d.ts +2 -0
  228. package/api/features/WbTranslatePage/index.js +2 -0
  229. package/api/graphql/BaseGraphQLSchema.d.ts +2 -2
  230. package/api/graphql/BaseGraphQLSchema.js +45 -6
  231. package/api/graphql/BaseGraphQLSchema.js.map +1 -1
  232. package/api/graphql/CmsCompareEntryRevisionsSchema.d.ts +8 -0
  233. package/api/graphql/CmsCompareEntryRevisionsSchema.js +68 -0
  234. package/api/graphql/CmsCompareEntryRevisionsSchema.js.map +1 -0
  235. package/exports/admin/ai-powerups.d.ts +1 -0
  236. package/exports/admin/ai-powerups.js +1 -0
  237. package/exports/api/ai-powerups.d.ts +2 -0
  238. package/exports/api/ai-powerups.js +2 -0
  239. package/package.json +33 -25
@@ -1 +1 @@
1
- {"version":3,"file":"admin/presentation/AiPowerUpsSettings/AiPowerUpsSettingsPage.js","sources":["../../../../src/admin/presentation/AiPowerUpsSettings/AiPowerUpsSettingsPage.tsx"],"sourcesContent":["import React, { useEffect } from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport {\n FormView,\n FormErrors,\n PresenterErrors,\n SimpleForm,\n SimpleFormContent,\n SimpleFormFooter,\n SimpleFormHeader\n} from \"@webiny/app-admin\";\nimport { Button, OverlayLoader, useToast } from \"@webiny/admin-ui\";\nimport { useFeature } from \"@webiny/app\";\nimport { AiPowerUpsSettingsFeature } from \"./feature.js\";\n\nexport const AiPowerUpsSettingsPage = observer(() => {\n const toast = useToast();\n const { presenter } = useFeature(AiPowerUpsSettingsFeature);\n const vm = presenter.vm;\n\n useEffect(() => {\n presenter.init();\n }, []);\n\n const handleSave = async () => {\n const success = await presenter.save();\n if (success) {\n toast.showSuccessToast({\n title: \"AI power-ups settings saved successfully!\"\n });\n }\n };\n\n return (\n <div>\n <SimpleForm size={\"xl\"}>\n {vm.errors.length > 0 ? (\n <div className={\"mb-lg\"}>\n <PresenterErrors errors={vm.errors} />\n </div>\n ) : null}\n {vm.form && vm.form.errors.length > 0 ? (\n <div className={\"mb-lg\"}>\n <FormErrors form={vm.form} />\n </div>\n ) : null}\n {vm.loading || vm.saving ? (\n <OverlayLoader text={vm.saving ? \"Saving...\" : \"Loading...\"} />\n ) : null}\n <SimpleFormHeader title=\"AI Power-Ups\" />\n <SimpleFormContent className={\"p-0\"}>\n <div className=\"flex flex-col gap-4\">\n {vm.form ? <FormView name=\"AI Power-Ups\" form={vm.form} /> : null}\n </div>\n </SimpleFormContent>\n <SimpleFormFooter className={\"border-t-sm border-t-neutral-dimmed pt-lg\"}>\n <Button text=\"Save Settings\" onClick={handleSave} />\n </SimpleFormFooter>\n </SimpleForm>\n </div>\n );\n});\n"],"names":["AiPowerUpsSettingsPage","observer","toast","useToast","presenter","useFeature","AiPowerUpsSettingsFeature","vm","useEffect","handleSave","success","SimpleForm","PresenterErrors","FormErrors","OverlayLoader","SimpleFormHeader","SimpleFormContent","FormView","SimpleFormFooter","Button"],"mappings":";;;;;;AAeO,MAAMA,yBAAyBC,SAAS;IAC3C,MAAMC,QAAQC;IACd,MAAM,EAAEC,SAAS,EAAE,GAAGC,WAAWC;IACjC,MAAMC,KAAKH,UAAU,EAAE;IAEvBI,UAAU;QACNJ,UAAU,IAAI;IAClB,GAAG,EAAE;IAEL,MAAMK,aAAa;QACf,MAAMC,UAAU,MAAMN,UAAU,IAAI;QACpC,IAAIM,SACAR,MAAM,gBAAgB,CAAC;YACnB,OAAO;QACX;IAER;IAEA,OAAO,WAAP,GACI,oBAAC,2BACG,oBAACS,YAAUA;QAAC,MAAM;OACbJ,GAAG,MAAM,CAAC,MAAM,GAAG,IAAI,WAAJ,GAChB,oBAAC;QAAI,WAAW;qBACZ,oBAACK,iBAAeA;QAAC,QAAQL,GAAG,MAAM;UAEtC,MACHA,GAAG,IAAI,IAAIA,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,WAAJ,GAChC,oBAAC;QAAI,WAAW;qBACZ,oBAACM,YAAUA;QAAC,MAAMN,GAAG,IAAI;UAE7B,MACHA,GAAG,OAAO,IAAIA,GAAG,MAAM,GAAG,WAAH,GACpB,oBAACO,eAAaA;QAAC,MAAMP,GAAG,MAAM,GAAG,cAAc;SAC/C,oBACJ,oBAACQ,kBAAgBA;QAAC,OAAM;sBACxB,oBAACC,mBAAiBA;QAAC,WAAW;qBAC1B,oBAAC;QAAI,WAAU;OACVT,GAAG,IAAI,GAAG,WAAH,GAAG,oBAACU,UAAQA;QAAC,MAAK;QAAe,MAAMV,GAAG,IAAI;SAAO,sBAGrE,oBAACW,kBAAgBA;QAAC,WAAW;qBACzB,oBAACC,QAAMA;QAAC,MAAK;QAAgB,SAASV;;AAK1D"}
1
+ {"version":3,"file":"admin/presentation/AiPowerUpsSettings/AiPowerUpsSettingsPage.js","sources":["../../../../src/admin/presentation/AiPowerUpsSettings/AiPowerUpsSettingsPage.tsx"],"sourcesContent":["import React, { useEffect } from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport {\n FormView,\n FormErrors,\n PresenterErrors,\n SimpleForm,\n SimpleFormContent,\n SimpleFormFooter,\n SimpleFormHeader\n} from \"@webiny/app-admin\";\nimport { Button, OverlayLoader, useToast } from \"@webiny/admin-ui\";\nimport { useFeature } from \"@webiny/app\";\nimport { AiPowerUpsSettingsFeature } from \"./feature.js\";\n\nexport const AiPowerUpsSettingsPage = observer(() => {\n const toast = useToast();\n const { presenter } = useFeature(AiPowerUpsSettingsFeature);\n const vm = presenter.vm;\n\n useEffect(() => {\n presenter.init();\n }, []);\n\n const handleSave = async () => {\n const success = await presenter.save();\n if (success) {\n toast.showSuccessToast({\n title: \"AI power-ups settings saved successfully!\"\n });\n }\n };\n\n return (\n <div>\n <SimpleForm size={\"xl\"}>\n {vm.errors.length > 0 ? (\n <div className={\"mb-lg\"}>\n <PresenterErrors errors={vm.errors} />\n </div>\n ) : null}\n {vm.form ? <FormErrors form={vm.form} className={\"mb-lg\"} /> : null}\n {vm.loading || vm.saving ? (\n <OverlayLoader text={vm.saving ? \"Saving...\" : \"Loading...\"} />\n ) : null}\n <SimpleFormHeader title=\"AI Power-Ups\" />\n <SimpleFormContent className={\"p-0\"}>\n <div className=\"flex flex-col gap-4\">\n {vm.form ? <FormView name=\"AI Power-Ups\" form={vm.form} /> : null}\n </div>\n </SimpleFormContent>\n <SimpleFormFooter className={\"border-t-sm border-t-neutral-dimmed pt-lg\"}>\n <Button text=\"Save Settings\" onClick={handleSave} />\n </SimpleFormFooter>\n </SimpleForm>\n </div>\n );\n});\n"],"names":["AiPowerUpsSettingsPage","observer","toast","useToast","presenter","useFeature","AiPowerUpsSettingsFeature","vm","useEffect","handleSave","success","SimpleForm","PresenterErrors","FormErrors","OverlayLoader","SimpleFormHeader","SimpleFormContent","FormView","SimpleFormFooter","Button"],"mappings":";;;;;;AAeO,MAAMA,yBAAyBC,SAAS;IAC3C,MAAMC,QAAQC;IACd,MAAM,EAAEC,SAAS,EAAE,GAAGC,WAAWC;IACjC,MAAMC,KAAKH,UAAU,EAAE;IAEvBI,UAAU;QACNJ,UAAU,IAAI;IAClB,GAAG,EAAE;IAEL,MAAMK,aAAa;QACf,MAAMC,UAAU,MAAMN,UAAU,IAAI;QACpC,IAAIM,SACAR,MAAM,gBAAgB,CAAC;YACnB,OAAO;QACX;IAER;IAEA,OAAO,WAAP,GACI,oBAAC,2BACG,oBAACS,YAAUA;QAAC,MAAM;OACbJ,GAAG,MAAM,CAAC,MAAM,GAAG,IAAI,WAAJ,GAChB,oBAAC;QAAI,WAAW;qBACZ,oBAACK,iBAAeA;QAAC,QAAQL,GAAG,MAAM;UAEtC,MACHA,GAAG,IAAI,GAAG,WAAH,GAAG,oBAACM,YAAUA;QAAC,MAAMN,GAAG,IAAI;QAAE,WAAW;SAAc,MAC9DA,GAAG,OAAO,IAAIA,GAAG,MAAM,GAAG,WAAH,GACpB,oBAACO,eAAaA;QAAC,MAAMP,GAAG,MAAM,GAAG,cAAc;SAC/C,oBACJ,oBAACQ,kBAAgBA;QAAC,OAAM;sBACxB,oBAACC,mBAAiBA;QAAC,WAAW;qBAC1B,oBAAC;QAAI,WAAU;OACVT,GAAG,IAAI,GAAG,WAAH,GAAG,oBAACU,UAAQA;QAAC,MAAK;QAAe,MAAMV,GAAG,IAAI;SAAO,sBAGrE,oBAACW,kBAAgBA;QAAC,WAAW;qBACzB,oBAACC,QAAMA;QAAC,MAAK;QAAgB,SAASV;;AAK1D"}
@@ -0,0 +1,20 @@
1
+ import { FormModelFactory } from "@webiny/app-admin";
2
+ import type { FormModel } from "@webiny/app-admin";
3
+ import { AiPromptFormFactory as Abstraction, type AiPromptFormConfig } from "./abstractions.js";
4
+ import { GetSettingsUseCase } from "../../../admin/features/settings/getSettings/abstractions.js";
5
+ declare class AiPromptFormFactoryImpl implements Abstraction.Interface {
6
+ private formModelFactory;
7
+ private getSettings;
8
+ private _settings;
9
+ constructor(formModelFactory: FormModelFactory.Interface, getSettings: GetSettingsUseCase.Interface);
10
+ createForm(config?: AiPromptFormConfig): FormModel.Interface;
11
+ computeExcludedFileIds(form: FormModel.Interface): string[] | null;
12
+ private getProjectOptions;
13
+ private getPersonaOptions;
14
+ private loadSettings;
15
+ private getProjectFileOptions;
16
+ }
17
+ export declare const AiPromptFormFactory: typeof AiPromptFormFactoryImpl & {
18
+ __abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").IAiPromptFormFactory>;
19
+ };
20
+ export {};
@@ -0,0 +1,108 @@
1
+ import { makeAutoObservable, runInAction } from "mobx";
2
+ import { FormModelFactory } from "@webiny/app-admin";
3
+ import { AiPromptFormFactory } from "./abstractions.js";
4
+ import { GetSettingsUseCase } from "../../features/settings/getSettings/abstractions.js";
5
+ class AiPromptFormFactoryImpl {
6
+ constructor(formModelFactory, getSettings){
7
+ this.formModelFactory = formModelFactory;
8
+ this.getSettings = getSettings;
9
+ this._settings = null;
10
+ makeAutoObservable(this, {}, {
11
+ autoBind: true
12
+ });
13
+ }
14
+ createForm(config) {
15
+ this.loadSettings();
16
+ return this.formModelFactory.create({
17
+ fields: (fields)=>({
18
+ project: fields.text().label("Project").description("Select a predefined context to attach.").options(()=>this.getProjectOptions()).afterChange((value, { form })=>{
19
+ const projectId = value;
20
+ const project = projectId ? this._settings?.projects?.presets?.find((p)=>p.id === projectId) : void 0;
21
+ if (project?.defaultReaderPersonaId) form.field("readerPersona").setValue(project.defaultReaderPersonaId);
22
+ if (project?.defaultWriterPersonaId) form.field("writerPersona").setValue(project.defaultWriterPersonaId);
23
+ const fileIds = (project?.files ?? []).map((f)=>f.id);
24
+ form.field("includedFiles").setValue(fileIds);
25
+ }),
26
+ includedFiles: fields.text().label("Files included").description("Uncheck files to exclude them from this generation only.").options(({ form })=>this.getProjectFileOptions(form)).renderer("multiSelect", {
27
+ showSelectionCount: true
28
+ }).list().hiddenWhen(({ form })=>{
29
+ const projectId = form.field("project").as("text").getValue();
30
+ if (!projectId) return true;
31
+ const project = this._settings?.projects?.presets?.find((p)=>p.id === projectId);
32
+ return !project?.files || 0 === project.files.length;
33
+ }),
34
+ readerPersona: fields.text().label("Reader Persona").description("Select the target audience for the generated content.").options(()=>this.getPersonaOptions("reader")),
35
+ writerPersona: fields.text().label("Writer Persona").description("Select the writing style for the generated content.").options(()=>this.getPersonaOptions("writer")),
36
+ prompt: fields.text().label("Prompt").description(config?.promptDescription ?? "Describe the content you want to generate.").required("Prompt is required").renderer("textarea", {
37
+ rows: 6
38
+ }).defaultValue(config?.promptDefaultValue ?? ""),
39
+ additionalFiles: fields.file().list().accept([
40
+ "text/*",
41
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
42
+ ]).label("Additional files").description("Attach files as one-off context for this generation.")
43
+ }),
44
+ layout: (layout)=>[
45
+ layout.row("project"),
46
+ layout.row("includedFiles"),
47
+ layout.row("readerPersona"),
48
+ layout.row("writerPersona"),
49
+ layout.row("prompt"),
50
+ layout.row("additionalFiles")
51
+ ]
52
+ });
53
+ }
54
+ computeExcludedFileIds(form) {
55
+ const projectId = form.field("project").getValue();
56
+ if (!projectId) return null;
57
+ const project = this._settings?.projects?.presets?.find((p)=>p.id === projectId);
58
+ const allFileIds = (project?.files ?? []).map((f)=>f.id);
59
+ if (0 === allFileIds.length) return null;
60
+ const includedFiles = form.field("includedFiles").getValue() ?? [];
61
+ const included = new Set(includedFiles);
62
+ const excluded = allFileIds.filter((id)=>!included.has(id));
63
+ return excluded.length > 0 ? excluded : null;
64
+ }
65
+ getProjectOptions() {
66
+ const presets = this._settings?.projects?.presets;
67
+ if (!presets || 0 === presets.length) return [];
68
+ return presets.map((preset)=>({
69
+ label: preset.name,
70
+ value: preset.id
71
+ }));
72
+ }
73
+ getPersonaOptions(type) {
74
+ const presets = "reader" === type ? this._settings?.readerPersonas?.presets : this._settings?.writerPersonas?.presets;
75
+ if (!presets || 0 === presets.length) return [];
76
+ return presets.map((preset)=>({
77
+ label: preset.name,
78
+ value: preset.id
79
+ }));
80
+ }
81
+ async loadSettings() {
82
+ const settings = await this.getSettings.execute();
83
+ runInAction(()=>{
84
+ this._settings = settings;
85
+ });
86
+ }
87
+ getProjectFileOptions(form) {
88
+ const projectId = form.field("project").getValue();
89
+ if (!projectId) return [];
90
+ const project = this._settings?.projects?.presets?.find((p)=>p.id === projectId);
91
+ const files = project?.files;
92
+ if (!files || 0 === files.length) return [];
93
+ return files.map((f)=>({
94
+ label: f.name,
95
+ value: f.id
96
+ }));
97
+ }
98
+ }
99
+ const AiPromptFormFactory_AiPromptFormFactory = AiPromptFormFactory.createImplementation({
100
+ implementation: AiPromptFormFactoryImpl,
101
+ dependencies: [
102
+ FormModelFactory,
103
+ GetSettingsUseCase
104
+ ]
105
+ });
106
+ export { AiPromptFormFactory_AiPromptFormFactory as AiPromptFormFactory };
107
+
108
+ //# sourceMappingURL=AiPromptFormFactory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin/presentation/AiPromptFormFactory/AiPromptFormFactory.js","sources":["../../../../src/admin/presentation/AiPromptFormFactory/AiPromptFormFactory.ts"],"sourcesContent":["import { makeAutoObservable, runInAction } from \"mobx\";\nimport { FormModelFactory } from \"@webiny/app-admin\";\nimport type { FormModel } from \"@webiny/app-admin\";\nimport { AiPromptFormFactory as Abstraction, type AiPromptFormConfig } from \"./abstractions.js\";\nimport { GetSettingsUseCase } from \"~/admin/features/settings/getSettings/abstractions.js\";\nimport type { IAiPowerUpsSettings } from \"~/admin/features/settings/shared/abstractions.js\";\n\nclass AiPromptFormFactoryImpl implements Abstraction.Interface {\n private _settings: IAiPowerUpsSettings | null = null;\n\n constructor(\n private formModelFactory: FormModelFactory.Interface,\n private getSettings: GetSettingsUseCase.Interface\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n createForm(config?: AiPromptFormConfig): FormModel.Interface {\n this.loadSettings();\n\n return this.formModelFactory.create({\n fields: fields => ({\n project: fields\n .text()\n .label(\"Project\")\n .description(\"Select a predefined context to attach.\")\n .options(() => this.getProjectOptions())\n .afterChange((value, { form }) => {\n const projectId = value as string | undefined;\n const project = projectId\n ? this._settings?.projects?.presets?.find(p => p.id === projectId)\n : undefined;\n\n if (project?.defaultReaderPersonaId) {\n form.field(\"readerPersona\").setValue(project.defaultReaderPersonaId);\n }\n if (project?.defaultWriterPersonaId) {\n form.field(\"writerPersona\").setValue(project.defaultWriterPersonaId);\n }\n\n const fileIds = (project?.files ?? []).map((f: { id: string }) => f.id);\n form.field(\"includedFiles\").setValue(fileIds);\n }),\n includedFiles: fields\n .text()\n .label(\"Files included\")\n .description(\"Uncheck files to exclude them from this generation only.\")\n .options(({ form }) => this.getProjectFileOptions(form))\n .renderer(\"multiSelect\", { showSelectionCount: true })\n .list()\n .hiddenWhen(({ form }) => {\n const projectId = form.field(\"project\").as(\"text\").getValue();\n if (!projectId) {\n return true;\n }\n const project = this._settings?.projects?.presets?.find(\n p => p.id === projectId\n );\n return !project?.files || project.files.length === 0;\n }),\n readerPersona: fields\n .text()\n .label(\"Reader Persona\")\n .description(\"Select the target audience for the generated content.\")\n .options(() => this.getPersonaOptions(\"reader\")),\n writerPersona: fields\n .text()\n .label(\"Writer Persona\")\n .description(\"Select the writing style for the generated content.\")\n .options(() => this.getPersonaOptions(\"writer\")),\n prompt: fields\n .text()\n .label(\"Prompt\")\n .description(\n config?.promptDescription ?? \"Describe the content you want to generate.\"\n )\n .required(\"Prompt is required\")\n .renderer(\"textarea\", { rows: 6 })\n .defaultValue(config?.promptDefaultValue ?? \"\"),\n additionalFiles: fields\n .file()\n .list()\n .accept([\n \"text/*\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\"\n ])\n .label(\"Additional files\")\n .description(\"Attach files as one-off context for this generation.\")\n }),\n layout: layout => [\n layout.row(\"project\"),\n layout.row(\"includedFiles\"),\n layout.row(\"readerPersona\"),\n layout.row(\"writerPersona\"),\n layout.row(\"prompt\"),\n layout.row(\"additionalFiles\")\n ]\n });\n }\n\n computeExcludedFileIds(form: FormModel.Interface): string[] | null {\n const projectId = form.field(\"project\").getValue<string>();\n if (!projectId) {\n return null;\n }\n const project = this._settings?.projects?.presets?.find(p => p.id === projectId);\n const allFileIds = (project?.files ?? []).map((f: { id: string }) => f.id);\n if (allFileIds.length === 0) {\n return null;\n }\n const includedFiles = form.field(\"includedFiles\").getValue<string[]>() ?? [];\n const included = new Set(includedFiles);\n const excluded = allFileIds.filter((id: string) => !included.has(id));\n return excluded.length > 0 ? excluded : null;\n }\n\n private getProjectOptions() {\n const presets = this._settings?.projects?.presets;\n if (!presets || presets.length === 0) {\n return [];\n }\n return presets.map(preset => ({\n label: preset.name,\n value: preset.id\n }));\n }\n\n private getPersonaOptions(type: \"reader\" | \"writer\") {\n const presets =\n type === \"reader\"\n ? this._settings?.readerPersonas?.presets\n : this._settings?.writerPersonas?.presets;\n\n if (!presets || presets.length === 0) {\n return [];\n }\n\n return presets.map(preset => ({\n label: preset.name,\n value: preset.id\n }));\n }\n\n private async loadSettings(): Promise<void> {\n const settings = await this.getSettings.execute();\n runInAction(() => {\n this._settings = settings;\n });\n }\n\n private getProjectFileOptions(form: FormModel.Interface) {\n const projectId = form.field(\"project\").getValue<string>();\n if (!projectId) {\n return [];\n }\n const project = this._settings?.projects?.presets?.find(p => p.id === projectId);\n const files = project?.files;\n if (!files || files.length === 0) {\n return [];\n }\n return files.map((f: { id: string; name: string }) => ({\n label: f.name,\n value: f.id\n }));\n }\n}\n\nexport const AiPromptFormFactory = Abstraction.createImplementation({\n implementation: AiPromptFormFactoryImpl,\n dependencies: [FormModelFactory, GetSettingsUseCase]\n});\n"],"names":["AiPromptFormFactoryImpl","formModelFactory","getSettings","makeAutoObservable","config","fields","value","form","projectId","project","p","undefined","fileIds","f","layout","allFileIds","includedFiles","included","Set","excluded","id","presets","preset","type","settings","runInAction","files","AiPromptFormFactory","Abstraction","FormModelFactory","GetSettingsUseCase"],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { FormModel } from "@webiny/app-admin";
2
+ export interface AiPromptFormConfig {
3
+ promptDescription?: string;
4
+ promptDefaultValue?: string;
5
+ }
6
+ export interface IAiPromptFormFactory {
7
+ createForm(config?: AiPromptFormConfig): FormModel.Interface;
8
+ computeExcludedFileIds(form: FormModel.Interface): string[] | null;
9
+ }
10
+ export declare const AiPromptFormFactory: import("@webiny/di").Abstraction<IAiPromptFormFactory>;
11
+ export declare namespace AiPromptFormFactory {
12
+ type Interface = IAiPromptFormFactory;
13
+ type Config = AiPromptFormConfig;
14
+ }
@@ -0,0 +1,5 @@
1
+ import { createAbstraction } from "@webiny/feature/admin";
2
+ const AiPromptFormFactory = createAbstraction("AiPromptFormFactory");
3
+ export { AiPromptFormFactory };
4
+
5
+ //# sourceMappingURL=abstractions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin/presentation/AiPromptFormFactory/abstractions.js","sources":["../../../../src/admin/presentation/AiPromptFormFactory/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/admin\";\nimport type { FormModel } from \"@webiny/app-admin\";\n\nexport interface AiPromptFormConfig {\n promptDescription?: string;\n promptDefaultValue?: string;\n}\n\nexport interface IAiPromptFormFactory {\n createForm(config?: AiPromptFormConfig): FormModel.Interface;\n computeExcludedFileIds(form: FormModel.Interface): string[] | null;\n}\n\nexport const AiPromptFormFactory = createAbstraction<IAiPromptFormFactory>(\"AiPromptFormFactory\");\n\nexport namespace AiPromptFormFactory {\n export type Interface = IAiPromptFormFactory;\n export type Config = AiPromptFormConfig;\n}\n"],"names":["AiPromptFormFactory","createAbstraction"],"mappings":";AAaO,MAAMA,sBAAsBC,kBAAwC"}
@@ -0,0 +1 @@
1
+ export declare const AiPromptFormFeature: import("@webiny/feature/admin").FeatureDefinition<any, []>;
@@ -0,0 +1,11 @@
1
+ import { createFeature } from "@webiny/feature/admin";
2
+ import { AiPromptFormFactory } from "./AiPromptFormFactory.js";
3
+ const AiPromptFormFeature = createFeature({
4
+ name: "AiPowerUps/PromptFormFactory",
5
+ register (container) {
6
+ container.register(AiPromptFormFactory);
7
+ }
8
+ });
9
+ export { AiPromptFormFeature };
10
+
11
+ //# sourceMappingURL=feature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin/presentation/AiPromptFormFactory/feature.js","sources":["../../../../src/admin/presentation/AiPromptFormFactory/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/admin\";\nimport { AiPromptFormFactory } from \"./AiPromptFormFactory.js\";\n\nexport const AiPromptFormFeature = createFeature({\n name: \"AiPowerUps/PromptFormFactory\",\n register(container) {\n container.register(AiPromptFormFactory);\n }\n});\n"],"names":["AiPromptFormFeature","createFeature","container","AiPromptFormFactory"],"mappings":";;AAGO,MAAMA,sBAAsBC,cAAc;IAC7C,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC;IACvB;AACJ"}
@@ -0,0 +1,9 @@
1
+ import React from "react";
2
+ import type { CmsCompareEntryRevisionsPresenter } from "./abstractions.js";
3
+ interface CmsCompareEntryRevisionsDialogProps {
4
+ presenter: CmsCompareEntryRevisionsPresenter.Interface;
5
+ }
6
+ export declare const CmsCompareEntryRevisionsDialog: (({ presenter }: CmsCompareEntryRevisionsDialogProps) => React.JSX.Element) & React.NamedExoticComponent<CmsCompareEntryRevisionsDialogProps> & {
7
+ readonly type: ({ presenter }: CmsCompareEntryRevisionsDialogProps) => React.JSX.Element;
8
+ };
9
+ export {};
@@ -0,0 +1,118 @@
1
+ import react from "react";
2
+ import { createReactiveComponent } from "@webiny/app-admin";
3
+ import { Alert, Button, Dialog } from "@webiny/admin-ui";
4
+ const COMPARISON_STYLES = `
5
+ .comparison-report {
6
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
7
+ line-height: 1.6;
8
+ color: #333;
9
+ max-width: 100%;
10
+ overflow-x: auto;
11
+ }
12
+ .comparison-report h2 {
13
+ color: #2563eb;
14
+ border-bottom: 2px solid #e5e7eb;
15
+ padding-bottom: 0.5rem;
16
+ margin-bottom: 1.5rem;
17
+ font-size: 1.5rem;
18
+ font-weight: 700;
19
+ }
20
+ .comparison-table {
21
+ width: 100%;
22
+ border-collapse: collapse;
23
+ margin-top: 1rem;
24
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
25
+ border-radius: 0.5rem;
26
+ overflow: hidden;
27
+ table-layout: fixed;
28
+ }
29
+ .comparison-table thead {
30
+ background-color: #f8fafc;
31
+ position: sticky;
32
+ top: 0;
33
+ z-index: 10;
34
+ }
35
+ .comparison-table th {
36
+ padding: 0.75rem 0.5rem;
37
+ text-align: left;
38
+ font-weight: 600;
39
+ color: #374151;
40
+ border-bottom: 2px solid #e5e7eb;
41
+ font-size: 0.875rem;
42
+ white-space: nowrap;
43
+ }
44
+ .comparison-table th:first-child { width: 15%; min-width: 120px; }
45
+ .comparison-table th:nth-child(2),
46
+ .comparison-table th:nth-child(3) { width: 30%; min-width: 200px; }
47
+ .comparison-table th:last-child { width: 25%; min-width: 180px; }
48
+ .comparison-table td {
49
+ padding: 0.75rem 0.5rem;
50
+ border-bottom: 1px solid #f3f4f6;
51
+ vertical-align: top;
52
+ word-wrap: break-word;
53
+ overflow-wrap: break-word;
54
+ max-width: 0;
55
+ }
56
+ .comparison-table tr:hover { background-color: #f9fafb; }
57
+ .comparison-table tr:last-child td { border-bottom: none; }
58
+ .comparison-table strong {
59
+ color: #1f2937;
60
+ font-weight: 600;
61
+ display: block;
62
+ margin-bottom: 0.25rem;
63
+ }
64
+ .comparison-table .field-changed { background-color: #fef3c7; }
65
+ .comparison-table .field-added { background-color: #d1fae5; }
66
+ .comparison-table .field-removed { background-color: #fee2e2; }
67
+ .comparison-table .value-old { color: #dc2626; text-decoration: line-through; }
68
+ .comparison-table .value-new { color: #059669; font-weight: 500; }
69
+ .comparison-table .change-summary { font-style: italic; color: #4b5563; }
70
+ .no-changes {
71
+ text-align: center;
72
+ padding: 2rem;
73
+ color: #6b7280;
74
+ font-style: italic;
75
+ background-color: #f9fafb;
76
+ border-radius: 0.5rem;
77
+ border: 1px dashed #d1d5db;
78
+ }
79
+ `;
80
+ const CmsCompareEntryRevisionsDialog = createReactiveComponent(({ presenter })=>{
81
+ const { dialogVisible, comparing, error, result } = presenter.vm;
82
+ const renderContent = ()=>{
83
+ if (error) return /*#__PURE__*/ react.createElement(Alert, {
84
+ type: "danger",
85
+ title: "Comparison Error"
86
+ }, error);
87
+ if (result) return /*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement("style", null, COMPARISON_STYLES), /*#__PURE__*/ react.createElement("div", {
88
+ className: "wby-prose wby-max-w-none",
89
+ dangerouslySetInnerHTML: {
90
+ __html: result.html
91
+ }
92
+ }));
93
+ if (!comparing) return /*#__PURE__*/ react.createElement("div", {
94
+ className: "wby-text-center wby-py-lg wby-text-neutral-subtle"
95
+ }, "No comparison data available.");
96
+ return null;
97
+ };
98
+ return /*#__PURE__*/ react.createElement(Dialog, {
99
+ open: dialogVisible,
100
+ onOpenChange: (open)=>{
101
+ if (!open) presenter.hideDialog();
102
+ },
103
+ title: "Compare Revisions",
104
+ size: "full",
105
+ loading: comparing ? {
106
+ text: "Comparing revisions with AI..."
107
+ } : false,
108
+ actions: /*#__PURE__*/ react.createElement(Button, {
109
+ variant: "secondary",
110
+ onClick: ()=>presenter.hideDialog(),
111
+ text: "Close"
112
+ }),
113
+ "data-testid": "cms.compare-revisions.dialog"
114
+ }, renderContent());
115
+ });
116
+ export { CmsCompareEntryRevisionsDialog };
117
+
118
+ //# sourceMappingURL=CmsCompareEntryRevisionsDialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsDialog.js","sources":["../../../../src/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsDialog.tsx"],"sourcesContent":["import React from \"react\";\nimport { createReactiveComponent } from \"@webiny/app-admin\";\nimport { Dialog, Button, Alert } from \"@webiny/admin-ui\";\nimport type { CmsCompareEntryRevisionsPresenter } from \"./abstractions.js\";\n\ninterface CmsCompareEntryRevisionsDialogProps {\n presenter: CmsCompareEntryRevisionsPresenter.Interface;\n}\n\nconst COMPARISON_STYLES = `\n .comparison-report {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n line-height: 1.6;\n color: #333;\n max-width: 100%;\n overflow-x: auto;\n }\n .comparison-report h2 {\n color: #2563eb;\n border-bottom: 2px solid #e5e7eb;\n padding-bottom: 0.5rem;\n margin-bottom: 1.5rem;\n font-size: 1.5rem;\n font-weight: 700;\n }\n .comparison-table {\n width: 100%;\n border-collapse: collapse;\n margin-top: 1rem;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n border-radius: 0.5rem;\n overflow: hidden;\n table-layout: fixed;\n }\n .comparison-table thead {\n background-color: #f8fafc;\n position: sticky;\n top: 0;\n z-index: 10;\n }\n .comparison-table th {\n padding: 0.75rem 0.5rem;\n text-align: left;\n font-weight: 600;\n color: #374151;\n border-bottom: 2px solid #e5e7eb;\n font-size: 0.875rem;\n white-space: nowrap;\n }\n .comparison-table th:first-child { width: 15%; min-width: 120px; }\n .comparison-table th:nth-child(2),\n .comparison-table th:nth-child(3) { width: 30%; min-width: 200px; }\n .comparison-table th:last-child { width: 25%; min-width: 180px; }\n .comparison-table td {\n padding: 0.75rem 0.5rem;\n border-bottom: 1px solid #f3f4f6;\n vertical-align: top;\n word-wrap: break-word;\n overflow-wrap: break-word;\n max-width: 0;\n }\n .comparison-table tr:hover { background-color: #f9fafb; }\n .comparison-table tr:last-child td { border-bottom: none; }\n .comparison-table strong {\n color: #1f2937;\n font-weight: 600;\n display: block;\n margin-bottom: 0.25rem;\n }\n .comparison-table .field-changed { background-color: #fef3c7; }\n .comparison-table .field-added { background-color: #d1fae5; }\n .comparison-table .field-removed { background-color: #fee2e2; }\n .comparison-table .value-old { color: #dc2626; text-decoration: line-through; }\n .comparison-table .value-new { color: #059669; font-weight: 500; }\n .comparison-table .change-summary { font-style: italic; color: #4b5563; }\n .no-changes {\n text-align: center;\n padding: 2rem;\n color: #6b7280;\n font-style: italic;\n background-color: #f9fafb;\n border-radius: 0.5rem;\n border: 1px dashed #d1d5db;\n }\n`;\n\nexport const CmsCompareEntryRevisionsDialog = createReactiveComponent(\n ({ presenter }: CmsCompareEntryRevisionsDialogProps) => {\n const { dialogVisible, comparing, error, result } = presenter.vm;\n\n const renderContent = () => {\n if (error) {\n return (\n <Alert type={\"danger\"} title={\"Comparison Error\"}>\n {error}\n </Alert>\n );\n }\n\n if (result) {\n return (\n <>\n <style>{COMPARISON_STYLES}</style>\n <div\n className={\"wby-prose wby-max-w-none\"}\n dangerouslySetInnerHTML={{\n __html: result.html\n }}\n />\n </>\n );\n }\n\n if (!comparing) {\n return (\n <div className={\"wby-text-center wby-py-lg wby-text-neutral-subtle\"}>\n No comparison data available.\n </div>\n );\n }\n\n return null;\n };\n\n return (\n <Dialog\n open={dialogVisible}\n onOpenChange={open => {\n if (!open) {\n presenter.hideDialog();\n }\n }}\n title={\"Compare Revisions\"}\n size={\"full\"}\n loading={comparing ? { text: \"Comparing revisions with AI...\" } : false}\n actions={\n <Button\n variant={\"secondary\"}\n onClick={() => presenter.hideDialog()}\n text={\"Close\"}\n />\n }\n data-testid={\"cms.compare-revisions.dialog\"}\n >\n {renderContent()}\n </Dialog>\n );\n }\n);\n"],"names":["COMPARISON_STYLES","CmsCompareEntryRevisionsDialog","createReactiveComponent","presenter","dialogVisible","comparing","error","result","renderContent","Alert","Dialog","open","Button"],"mappings":";;;AASA,MAAMA,oBAAoB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2E3B,CAAC;AAEM,MAAMC,iCAAiCC,wBAC1C,CAAC,EAAEC,SAAS,EAAuC;IAC/C,MAAM,EAAEC,aAAa,EAAEC,SAAS,EAAEC,KAAK,EAAEC,MAAM,EAAE,GAAGJ,UAAU,EAAE;IAEhE,MAAMK,gBAAgB;QAClB,IAAIF,OACA,OAAO,WAAP,GACI,oBAACG,OAAKA;YAAC,MAAM;YAAU,OAAO;WACzBH;QAKb,IAAIC,QACA,OAAO,WAAP,GACI,wDACI,oBAAC,eAAOP,oBAAiBA,WAAAA,GACzB,oBAAC;YACG,WAAW;YACX,yBAAyB;gBACrB,QAAQO,OAAO,IAAI;YACvB;;QAMhB,IAAI,CAACF,WACD,OAAO,WAAP,GACI,oBAAC;YAAI,WAAW;WAAqD;QAM7E,OAAO;IACX;IAEA,OAAO,WAAP,GACI,oBAACK,QAAMA;QACH,MAAMN;QACN,cAAcO,CAAAA;YACV,IAAI,CAACA,MACDR,UAAU,UAAU;QAE5B;QACA,OAAO;QACP,MAAM;QACN,SAASE,YAAY;YAAE,MAAM;QAAiC,IAAI;QAClE,uBACI,oBAACO,QAAMA;YACH,SAAS;YACT,SAAS,IAAMT,UAAU,UAAU;YACnC,MAAM;;QAGd,eAAa;OAEZK;AAGb"}
@@ -0,0 +1,9 @@
1
+ import React from "react";
2
+ import type { CmsCompareEntryRevisionsPresenter } from "./abstractions.js";
3
+ interface CmsCompareEntryRevisionsDrawerProps {
4
+ presenter: CmsCompareEntryRevisionsPresenter.Interface;
5
+ }
6
+ export declare const CmsCompareEntryRevisionsDrawer: (({ presenter }: CmsCompareEntryRevisionsDrawerProps) => React.JSX.Element) & React.NamedExoticComponent<CmsCompareEntryRevisionsDrawerProps> & {
7
+ readonly type: ({ presenter }: CmsCompareEntryRevisionsDrawerProps) => React.JSX.Element;
8
+ };
9
+ export {};
@@ -0,0 +1,72 @@
1
+ import react from "react";
2
+ import { createReactiveComponent } from "@webiny/app-admin";
3
+ import { Button, Checkbox, Drawer, List, Text } from "@webiny/admin-ui";
4
+ import { useContentEntryFormPresenter } from "@webiny/app-headless-cms/exports/admin/cms/entry/editor.js";
5
+ const DateDisplay = ({ date })=>{
6
+ const formatted = react.useMemo(()=>{
7
+ const d = new globalThis.Date(date);
8
+ if (isNaN(d.getTime())) return "";
9
+ return new Intl.DateTimeFormat(navigator.language, {
10
+ day: "numeric",
11
+ month: "long",
12
+ year: "numeric"
13
+ }).format(d);
14
+ }, [
15
+ date
16
+ ]);
17
+ return /*#__PURE__*/ react.createElement(react.Fragment, null, formatted);
18
+ };
19
+ const CmsCompareEntryRevisionsDrawer = createReactiveComponent(({ presenter })=>{
20
+ const formPresenter = useContentEntryFormPresenter();
21
+ const { revisions, selectedIds, canCompare, drawerVisible } = presenter.vm;
22
+ const modelId = formPresenter.vm.model.modelId;
23
+ return /*#__PURE__*/ react.createElement(Drawer, {
24
+ title: "Compare entry revisions",
25
+ description: "Select two revisions to compare their content using AI",
26
+ open: drawerVisible,
27
+ onOpenChange: (open)=>{
28
+ if (!open) presenter.hideDrawer();
29
+ },
30
+ modal: true,
31
+ bodyPadding: false,
32
+ headerSeparator: true,
33
+ width: 800,
34
+ actions: /*#__PURE__*/ react.createElement(Button, {
35
+ variant: "primary",
36
+ disabled: !canCompare,
37
+ onClick: ()=>presenter.compare(modelId),
38
+ text: canCompare ? "Compare" : `Select ${2 - selectedIds.length} revision${1 === selectedIds.length ? "" : "s"}`,
39
+ "data-testid": "cms.compare-revisions.compare-button"
40
+ })
41
+ }, revisions.length > 0 ? /*#__PURE__*/ react.createElement(List, {
42
+ "data-testid": "cms.compare-revisions.list"
43
+ }, revisions.map((revision)=>{
44
+ const isSelected = selectedIds.includes(revision.id);
45
+ const isDisabled = selectedIds.length >= 2 && !isSelected;
46
+ return /*#__PURE__*/ react.createElement(List.Item, {
47
+ key: revision.id,
48
+ icon: /*#__PURE__*/ react.createElement("div", {
49
+ onClick: (e)=>e.stopPropagation()
50
+ }, /*#__PURE__*/ react.createElement(Checkbox, {
51
+ checked: isSelected,
52
+ onChange: ()=>presenter.toggleRevision(revision.id),
53
+ disabled: isDisabled,
54
+ "data-testid": `cms.compare-revisions.select-${revision.meta.version}`
55
+ })),
56
+ title: revision.meta.title || "N/A",
57
+ description: /*#__PURE__*/ react.createElement(Text, {
58
+ as: "div",
59
+ size: "sm"
60
+ }, "Last modified by", " ", revision.revisionCreatedBy ? revision.revisionCreatedBy.displayName : "Unknown", " ", "on ", /*#__PURE__*/ react.createElement(DateDisplay, {
61
+ date: revision.revisionSavedOn
62
+ }), " (#", revision.meta.version, ")"),
63
+ onClick: ()=>presenter.toggleRevision(revision.id),
64
+ "data-testid": `cms.compare-revisions.item-${revision.meta.version}`
65
+ });
66
+ })) : /*#__PURE__*/ react.createElement("div", {
67
+ className: "p-lg"
68
+ }, "No revisions to compare."));
69
+ });
70
+ export { CmsCompareEntryRevisionsDrawer };
71
+
72
+ //# sourceMappingURL=CmsCompareEntryRevisionsDrawer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsDrawer.js","sources":["../../../../src/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsDrawer.tsx"],"sourcesContent":["import React from \"react\";\nimport { createReactiveComponent } from \"@webiny/app-admin\";\nimport { Drawer, Button, Checkbox, List, Text } from \"@webiny/admin-ui\";\nimport { useContentEntryFormPresenter } from \"@webiny/app-headless-cms/exports/admin/cms/entry/editor.js\";\nimport type { CmsCompareEntryRevisionsPresenter } from \"./abstractions.js\";\n\ninterface CmsCompareEntryRevisionsDrawerProps {\n presenter: CmsCompareEntryRevisionsPresenter.Interface;\n}\n\nconst DateDisplay = ({ date }: { date: string }) => {\n const formatted = React.useMemo(() => {\n const d = new globalThis.Date(date);\n if (isNaN(d.getTime())) {\n return \"\";\n }\n return new Intl.DateTimeFormat(navigator.language, {\n day: \"numeric\",\n month: \"long\",\n year: \"numeric\"\n }).format(d);\n }, [date]);\n return <>{formatted}</>;\n};\n\nexport const CmsCompareEntryRevisionsDrawer = createReactiveComponent(\n ({ presenter }: CmsCompareEntryRevisionsDrawerProps) => {\n const formPresenter = useContentEntryFormPresenter();\n const { revisions, selectedIds, canCompare, drawerVisible } = presenter.vm;\n const modelId = formPresenter.vm.model.modelId;\n\n return (\n <Drawer\n title={\"Compare entry revisions\"}\n description={\"Select two revisions to compare their content using AI\"}\n open={drawerVisible}\n onOpenChange={open => {\n if (!open) {\n presenter.hideDrawer();\n }\n }}\n modal\n bodyPadding={false}\n headerSeparator\n width={800}\n actions={\n <Button\n variant={\"primary\"}\n disabled={!canCompare}\n onClick={() => presenter.compare(modelId)}\n text={\n canCompare\n ? \"Compare\"\n : `Select ${2 - selectedIds.length} revision${selectedIds.length === 1 ? \"\" : \"s\"}`\n }\n data-testid={\"cms.compare-revisions.compare-button\"}\n />\n }\n >\n {revisions.length > 0 ? (\n <List data-testid={\"cms.compare-revisions.list\"}>\n {revisions.map(revision => {\n const isSelected = selectedIds.includes(revision.id);\n const isDisabled = selectedIds.length >= 2 && !isSelected;\n\n return (\n <List.Item\n key={revision.id}\n icon={\n <div onClick={e => e.stopPropagation()}>\n <Checkbox\n checked={isSelected}\n onChange={() =>\n presenter.toggleRevision(revision.id)\n }\n disabled={isDisabled}\n data-testid={`cms.compare-revisions.select-${revision.meta.version}`}\n />\n </div>\n }\n title={revision.meta.title || \"N/A\"}\n description={\n <Text as={\"div\"} size={\"sm\"}>\n Last modified by{\" \"}\n {revision.revisionCreatedBy\n ? revision.revisionCreatedBy.displayName\n : \"Unknown\"}{\" \"}\n on <DateDisplay date={revision.revisionSavedOn} /> (#\n {revision.meta.version})\n </Text>\n }\n onClick={() => presenter.toggleRevision(revision.id)}\n data-testid={`cms.compare-revisions.item-${revision.meta.version}`}\n />\n );\n })}\n </List>\n ) : (\n <div className={\"p-lg\"}>No revisions to compare.</div>\n )}\n </Drawer>\n );\n }\n);\n"],"names":["DateDisplay","date","formatted","React","d","globalThis","isNaN","Intl","navigator","CmsCompareEntryRevisionsDrawer","createReactiveComponent","presenter","formPresenter","useContentEntryFormPresenter","revisions","selectedIds","canCompare","drawerVisible","modelId","Drawer","open","Button","List","revision","isSelected","isDisabled","e","Checkbox","Text"],"mappings":";;;;AAUA,MAAMA,cAAc,CAAC,EAAEC,IAAI,EAAoB;IAC3C,MAAMC,YAAYC,MAAAA,OAAa,CAAC;QAC5B,MAAMC,IAAI,IAAIC,WAAW,IAAI,CAACJ;QAC9B,IAAIK,MAAMF,EAAE,OAAO,KACf,OAAO;QAEX,OAAO,IAAIG,KAAK,cAAc,CAACC,UAAU,QAAQ,EAAE;YAC/C,KAAK;YACL,OAAO;YACP,MAAM;QACV,GAAG,MAAM,CAACJ;IACd,GAAG;QAACH;KAAK;IACT,OAAO,WAAP,GAAO,0CAAGC;AACd;AAEO,MAAMO,iCAAiCC,wBAC1C,CAAC,EAAEC,SAAS,EAAuC;IAC/C,MAAMC,gBAAgBC;IACtB,MAAM,EAAEC,SAAS,EAAEC,WAAW,EAAEC,UAAU,EAAEC,aAAa,EAAE,GAAGN,UAAU,EAAE;IAC1E,MAAMO,UAAUN,cAAc,EAAE,CAAC,KAAK,CAAC,OAAO;IAE9C,OAAO,WAAP,GACI,oBAACO,QAAMA;QACH,OAAO;QACP,aAAa;QACb,MAAMF;QACN,cAAcG,CAAAA;YACV,IAAI,CAACA,MACDT,UAAU,UAAU;QAE5B;QACA;QACA,aAAa;QACb;QACA,OAAO;QACP,uBACI,oBAACU,QAAMA;YACH,SAAS;YACT,UAAU,CAACL;YACX,SAAS,IAAML,UAAU,OAAO,CAACO;YACjC,MACIF,aACM,YACA,CAAC,OAAO,EAAE,IAAID,YAAY,MAAM,CAAC,SAAS,EAAEA,AAAuB,MAAvBA,YAAY,MAAM,GAAS,KAAK,KAAK;YAE3F,eAAa;;OAIpBD,UAAU,MAAM,GAAG,IAAI,WAAJ,GAChB,oBAACQ,MAAIA;QAAC,eAAa;OACdR,UAAU,GAAG,CAACS,CAAAA;QACX,MAAMC,aAAaT,YAAY,QAAQ,CAACQ,SAAS,EAAE;QACnD,MAAME,aAAaV,YAAY,MAAM,IAAI,KAAK,CAACS;QAE/C,OAAO,WAAP,GACI,oBAACF,KAAK,IAAI;YACN,KAAKC,SAAS,EAAE;YAChB,oBACI,oBAAC;gBAAI,SAASG,CAAAA,IAAKA,EAAE,eAAe;6BAChC,oBAACC,UAAQA;gBACL,SAASH;gBACT,UAAU,IACNb,UAAU,cAAc,CAACY,SAAS,EAAE;gBAExC,UAAUE;gBACV,eAAa,CAAC,6BAA6B,EAAEF,SAAS,IAAI,CAAC,OAAO,EAAE;;YAIhF,OAAOA,SAAS,IAAI,CAAC,KAAK,IAAI;YAC9B,2BACI,oBAACK,MAAIA;gBAAC,IAAI;gBAAO,MAAM;eAAM,oBACR,KAChBL,SAAS,iBAAiB,GACrBA,SAAS,iBAAiB,CAAC,WAAW,GACtC,WAAW,KAAI,qBAClB,oBAACvB,aAAWA;gBAAC,MAAMuB,SAAS,eAAe;gBAAI,OACjDA,SAAS,IAAI,CAAC,OAAO,EAAC;YAG/B,SAAS,IAAMZ,UAAU,cAAc,CAACY,SAAS,EAAE;YACnD,eAAa,CAAC,2BAA2B,EAAEA,SAAS,IAAI,CAAC,OAAO,EAAE;;IAG9E,oBAGJ,oBAAC;QAAI,WAAW;OAAQ;AAIxC"}
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ export declare const CmsCompareEntryRevisionsMenuItem: (() => React.JSX.Element) & React.NamedExoticComponent<unknown> & {
3
+ readonly type: () => React.JSX.Element;
4
+ };
@@ -0,0 +1,21 @@
1
+ import react from "react";
2
+ import { useFeature } from "@webiny/app";
3
+ import { createReactiveComponent } from "@webiny/app-admin";
4
+ import { OptionsMenuItem } from "@webiny/app-admin/components/OptionsMenu/index.js";
5
+ import { ReactComponent } from "@webiny/icons/compare_arrows.svg";
6
+ import { useContentEntryFormPresenter } from "@webiny/app-headless-cms/exports/admin/cms/entry/editor.js";
7
+ import { CmsCompareEntryRevisionsPresentationFeature } from "./feature.js";
8
+ const CmsCompareEntryRevisionsMenuItem = createReactiveComponent(()=>{
9
+ const formPresenter = useContentEntryFormPresenter();
10
+ const { presenter } = useFeature(CmsCompareEntryRevisionsPresentationFeature);
11
+ return /*#__PURE__*/ react.createElement(OptionsMenuItem, {
12
+ icon: /*#__PURE__*/ react.createElement(ReactComponent, null),
13
+ label: "Compare revisions",
14
+ disabled: !formPresenter.vm.entry,
15
+ onAction: ()=>presenter.showDrawer(),
16
+ "data-testid": "cms.content-form.header.compare-revisions"
17
+ });
18
+ });
19
+ export { CmsCompareEntryRevisionsMenuItem };
20
+
21
+ //# sourceMappingURL=CmsCompareEntryRevisionsMenuItem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsMenuItem.js","sources":["../../../../src/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsMenuItem.tsx"],"sourcesContent":["import React from \"react\";\nimport { useFeature } from \"@webiny/app\";\nimport { createReactiveComponent } from \"@webiny/app-admin\";\nimport { OptionsMenuItem } from \"@webiny/app-admin/components/OptionsMenu/index.js\";\nimport { ReactComponent as CompareIcon } from \"@webiny/icons/compare_arrows.svg\";\nimport { useContentEntryFormPresenter } from \"@webiny/app-headless-cms/exports/admin/cms/entry/editor.js\";\nimport { CmsCompareEntryRevisionsPresentationFeature } from \"./feature.js\";\n\nexport const CmsCompareEntryRevisionsMenuItem = createReactiveComponent(() => {\n const formPresenter = useContentEntryFormPresenter();\n const { presenter } = useFeature(CmsCompareEntryRevisionsPresentationFeature);\n\n return (\n <OptionsMenuItem\n icon={<CompareIcon />}\n label={\"Compare revisions\"}\n disabled={!formPresenter.vm.entry}\n onAction={() => presenter.showDrawer()}\n data-testid={\"cms.content-form.header.compare-revisions\"}\n />\n );\n});\n"],"names":["CmsCompareEntryRevisionsMenuItem","createReactiveComponent","formPresenter","useContentEntryFormPresenter","presenter","useFeature","CmsCompareEntryRevisionsPresentationFeature","OptionsMenuItem","CompareIcon"],"mappings":";;;;;;;AAQO,MAAMA,mCAAmCC,wBAAwB;IACpE,MAAMC,gBAAgBC;IACtB,MAAM,EAAEC,SAAS,EAAE,GAAGC,WAAWC;IAEjC,OAAO,WAAP,GACI,oBAACC,iBAAeA;QACZ,oBAAM,oBAACC,gBAAWA;QAClB,OAAO;QACP,UAAU,CAACN,cAAc,EAAE,CAAC,KAAK;QACjC,UAAU,IAAME,UAAU,UAAU;QACpC,eAAa;;AAGzB"}
@@ -0,0 +1,2 @@
1
+ import React from "react";
2
+ export declare const CmsCompareEntryRevisionsOverlays: (props: unknown) => React.JSX.Element;
@@ -0,0 +1,17 @@
1
+ import react from "react";
2
+ import { useFeature } from "@webiny/app";
3
+ import { ContentEntryFormContent } from "@webiny/app-headless-cms/exports/admin/cms/entry/editor.js";
4
+ import { CmsCompareEntryRevisionsPresentationFeature } from "./feature.js";
5
+ import { CmsCompareEntryRevisionsDrawer } from "./CmsCompareEntryRevisionsDrawer.js";
6
+ import { CmsCompareEntryRevisionsDialog } from "./CmsCompareEntryRevisionsDialog.js";
7
+ const CmsCompareEntryRevisionsOverlays = ContentEntryFormContent.createDecorator((Original)=>function(props) {
8
+ const { presenter } = useFeature(CmsCompareEntryRevisionsPresentationFeature);
9
+ return /*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement(Original, props), /*#__PURE__*/ react.createElement(CmsCompareEntryRevisionsDrawer, {
10
+ presenter: presenter
11
+ }), /*#__PURE__*/ react.createElement(CmsCompareEntryRevisionsDialog, {
12
+ presenter: presenter
13
+ }));
14
+ });
15
+ export { CmsCompareEntryRevisionsOverlays };
16
+
17
+ //# sourceMappingURL=CmsCompareEntryRevisionsOverlays.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsOverlays.js","sources":["../../../../src/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsOverlays.tsx"],"sourcesContent":["import React from \"react\";\nimport { useFeature } from \"@webiny/app\";\nimport { ContentEntryFormContent } from \"@webiny/app-headless-cms/exports/admin/cms/entry/editor.js\";\nimport { CmsCompareEntryRevisionsPresentationFeature } from \"./feature.js\";\nimport { CmsCompareEntryRevisionsDrawer } from \"./CmsCompareEntryRevisionsDrawer.js\";\nimport { CmsCompareEntryRevisionsDialog } from \"./CmsCompareEntryRevisionsDialog.js\";\n\nexport const CmsCompareEntryRevisionsOverlays = ContentEntryFormContent.createDecorator(\n Original => {\n return function ContentEntryFormContentWithCompareRevisions(props) {\n const { presenter } = useFeature(CmsCompareEntryRevisionsPresentationFeature);\n\n return (\n <>\n <Original {...props} />\n <CmsCompareEntryRevisionsDrawer presenter={presenter} />\n <CmsCompareEntryRevisionsDialog presenter={presenter} />\n </>\n );\n };\n }\n);\n"],"names":["CmsCompareEntryRevisionsOverlays","ContentEntryFormContent","Original","props","presenter","useFeature","CmsCompareEntryRevisionsPresentationFeature","CmsCompareEntryRevisionsDrawer","CmsCompareEntryRevisionsDialog"],"mappings":";;;;;;AAOO,MAAMA,mCAAmCC,wBAAwB,eAAe,CACnFC,CAAAA,WACW,SAAqDC,KAAK;QAC7D,MAAM,EAAEC,SAAS,EAAE,GAAGC,WAAWC;QAEjC,OAAO,WAAP,GACI,wDACI,oBAACJ,UAAaC,QAAAA,WAAAA,GACd,oBAACI,gCAA8BA;YAAC,WAAWH;0BAC3C,oBAACI,gCAA8BA;YAAC,WAAWJ;;IAGvD"}
@@ -0,0 +1,25 @@
1
+ import { RevisionsListPresenter } from "@webiny/app-headless-cms/exports/admin/cms/entry/editor.js";
2
+ import { CompareEntryRevisionsUseCase } from "../../../admin/features/compareEntryRevisions/abstractions.js";
3
+ import { CmsCompareEntryRevisionsPresenter } from "./abstractions.js";
4
+ import type { ICmsCompareEntryRevisionsViewModel } from "./abstractions.js";
5
+ declare class CmsCompareEntryRevisionsPresenterImpl implements CmsCompareEntryRevisionsPresenter.Interface {
6
+ private revisionsPresenter;
7
+ private useCase;
8
+ private drawerVisible;
9
+ private selectedIds;
10
+ private dialogVisible;
11
+ private comparing;
12
+ private error;
13
+ private result;
14
+ constructor(revisionsPresenter: RevisionsListPresenter.Interface, useCase: CompareEntryRevisionsUseCase.Interface);
15
+ get vm(): ICmsCompareEntryRevisionsViewModel;
16
+ showDrawer(): void;
17
+ hideDrawer(): void;
18
+ toggleRevision(revisionId: string): void;
19
+ compare(modelId: string): Promise<void>;
20
+ hideDialog(): void;
21
+ }
22
+ export declare const CmsCompareEntryRevisionsPresenterImplementation: typeof CmsCompareEntryRevisionsPresenterImpl & {
23
+ __abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").ICmsCompareEntryRevisionsPresenter>;
24
+ };
25
+ export {};