@alpaca-editor/core 1.0.0 → 1.0.3764-editor-mono

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 (223) hide show
  1. package/dist/client-components/api.js +6 -0
  2. package/dist/client-components/index.js +36 -0
  3. package/dist/components/ActionButton.js +9 -0
  4. package/dist/components/Error.js +28 -0
  5. package/dist/config/config.js +654 -0
  6. package/dist/config/types.js +2 -0
  7. package/dist/editor/ComponentInfo.js +31 -0
  8. package/dist/editor/ConfirmationDialog.js +32 -0
  9. package/dist/editor/ContentTree.js +406 -0
  10. package/dist/editor/ContextMenu.js +117 -0
  11. package/dist/editor/Editor.js +55 -0
  12. package/dist/editor/EditorWarning.js +13 -0
  13. package/dist/editor/EditorWarnings.js +24 -0
  14. package/dist/editor/FieldEditorPopup.js +24 -0
  15. package/dist/editor/FieldHistory.js +40 -0
  16. package/dist/editor/FieldList.js +63 -0
  17. package/dist/editor/FieldListField.js +164 -0
  18. package/dist/editor/FieldListFieldWithFallbacks.js +114 -0
  19. package/dist/editor/FloatingToolbar.js +92 -0
  20. package/dist/editor/ImageEditor.js +55 -0
  21. package/dist/editor/InsertMenu.js +164 -0
  22. package/dist/editor/ItemInfo.js +30 -0
  23. package/dist/editor/LinkEditorDialog.js +89 -0
  24. package/dist/editor/MainLayout.js +46 -0
  25. package/dist/editor/NewEditorClient.js +9 -0
  26. package/dist/editor/PictureCropper.js +332 -0
  27. package/dist/editor/PictureEditor.js +104 -0
  28. package/dist/editor/PictureEditorDialog.js +194 -0
  29. package/dist/editor/ScrollingContentTree.js +30 -0
  30. package/dist/editor/Terminal.js +109 -0
  31. package/dist/editor/Titlebar.js +11 -0
  32. package/dist/editor/ai/AiPopup.js +25 -0
  33. package/dist/editor/ai/AiResponseMessage.js +24 -0
  34. package/dist/editor/ai/AiTerminal.js +241 -0
  35. package/dist/editor/ai/AiToolCall.js +18 -0
  36. package/dist/editor/ai/EditorAiTerminal.js +9 -0
  37. package/dist/editor/ai/editorAiContext.js +14 -0
  38. package/dist/editor/client/DialogContext.js +29 -0
  39. package/dist/editor/client/EditorClient.js +1336 -0
  40. package/dist/editor/client/GenericDialog.js +27 -0
  41. package/dist/editor/client/editContext.js +59 -0
  42. package/dist/editor/client/helpers.js +31 -0
  43. package/dist/editor/client/itemsRepository.js +255 -0
  44. package/dist/editor/client/operations.js +398 -0
  45. package/dist/editor/client/pageModelBuilder.js +129 -0
  46. package/dist/editor/commands/commands.js +2 -0
  47. package/dist/editor/commands/componentCommands.js +277 -0
  48. package/dist/editor/commands/createVersionCommand.js +26 -0
  49. package/dist/editor/commands/deleteVersionCommand.js +55 -0
  50. package/dist/editor/commands/itemCommands.js +134 -0
  51. package/dist/editor/commands/localizeItem/LocalizeItemDialog.js +94 -0
  52. package/dist/editor/commands/undo.js +32 -0
  53. package/dist/editor/component-designer/ComponentDesigner.js +58 -0
  54. package/dist/editor/component-designer/ComponentDesignerAiTerminal.js +9 -0
  55. package/dist/editor/component-designer/ComponentDesignerMenu.js +67 -0
  56. package/dist/editor/component-designer/ComponentEditor.js +59 -0
  57. package/dist/editor/component-designer/ComponentRenderingCodeEditor.js +16 -0
  58. package/dist/editor/component-designer/ComponentRenderingEditor.js +71 -0
  59. package/dist/editor/component-designer/ComponentsDropdown.js +22 -0
  60. package/dist/editor/component-designer/PlaceholdersEditor.js +70 -0
  61. package/dist/editor/component-designer/RenderingsDropdown.js +25 -0
  62. package/dist/editor/component-designer/TemplateEditor.js +144 -0
  63. package/dist/editor/component-designer/aiContext.js +18 -0
  64. package/dist/editor/componentTreeHelper.js +97 -0
  65. package/dist/editor/control-center/ControlCenterMenu.js +59 -0
  66. package/dist/editor/control-center/IndexOverview.js +27 -0
  67. package/dist/editor/control-center/IndexSettings.js +106 -0
  68. package/dist/editor/control-center/Status.js +7 -0
  69. package/dist/editor/editor-warnings/ItemLocked.js +40 -0
  70. package/dist/editor/editor-warnings/NoLanguageWriteAccess.js +16 -0
  71. package/dist/editor/editor-warnings/NoWorkflowWriteAccess.js +16 -0
  72. package/dist/editor/editor-warnings/NoWriteAccess.js +14 -0
  73. package/dist/editor/editor-warnings/ValidationErrors.js +27 -0
  74. package/dist/editor/field-types/AttachmentEditor.js +7 -0
  75. package/dist/editor/field-types/CheckboxEditor.js +32 -0
  76. package/dist/editor/field-types/DropLinkEditor.js +51 -0
  77. package/dist/editor/field-types/DropListEditor.js +58 -0
  78. package/dist/editor/field-types/ImageFieldEditor.js +36 -0
  79. package/dist/editor/field-types/InternalLinkFieldEditor.js +64 -0
  80. package/dist/editor/field-types/LinkFieldEditor.js +58 -0
  81. package/dist/editor/field-types/MultiLineText.js +35 -0
  82. package/dist/editor/field-types/PictureFieldEditor.js +59 -0
  83. package/dist/editor/field-types/RawEditor.js +33 -0
  84. package/dist/editor/field-types/ReactQuill.js +366 -0
  85. package/dist/editor/field-types/RichTextEditor.js +46 -0
  86. package/dist/editor/field-types/RichTextEditorComponent.js +72 -0
  87. package/dist/editor/field-types/SingleLineText.js +92 -0
  88. package/dist/editor/field-types/TreeListEditor.js +137 -0
  89. package/dist/editor/fieldTypes.js +2 -0
  90. package/dist/editor/media-selector/AiImageSearch.js +110 -0
  91. package/dist/editor/media-selector/AiImageSearchPrompt.js +58 -0
  92. package/dist/editor/media-selector/MediaSelector.js +11 -0
  93. package/dist/editor/media-selector/Preview.js +9 -0
  94. package/dist/editor/media-selector/Thumbnails.js +11 -0
  95. package/dist/editor/media-selector/TreeSelector.js +171 -0
  96. package/dist/editor/media-selector/UploadZone.js +80 -0
  97. package/dist/editor/menubar/ActionsMenu.js +33 -0
  98. package/dist/editor/menubar/ActiveUsers.js +13 -0
  99. package/dist/editor/menubar/ApproveAndPublish.js +13 -0
  100. package/dist/editor/menubar/BrowseHistory.js +14 -0
  101. package/dist/editor/menubar/ItemLanguageVersion.js +36 -0
  102. package/dist/editor/menubar/LanguageSelector.js +33 -0
  103. package/dist/editor/menubar/Menu.js +65 -0
  104. package/dist/editor/menubar/NavButtons.js +43 -0
  105. package/dist/editor/menubar/PageSelector.js +50 -0
  106. package/dist/editor/menubar/PageViewerControls.js +37 -0
  107. package/dist/editor/menubar/Separator.js +8 -0
  108. package/dist/editor/menubar/SiteInfo.js +26 -0
  109. package/dist/editor/menubar/User.js +18 -0
  110. package/dist/editor/menubar/VersionSelector.js +49 -0
  111. package/dist/editor/page-editor-chrome/CommentHighlighting.js +214 -0
  112. package/dist/editor/page-editor-chrome/CommentHighlightings.js +17 -0
  113. package/dist/editor/page-editor-chrome/FieldActionIndicator.js +27 -0
  114. package/dist/editor/page-editor-chrome/FieldActionIndicators.js +15 -0
  115. package/dist/editor/page-editor-chrome/FieldEditedIndicator.js +27 -0
  116. package/dist/editor/page-editor-chrome/FieldEditedIndicators.js +15 -0
  117. package/dist/editor/page-editor-chrome/FrameMenu.js +178 -0
  118. package/dist/editor/page-editor-chrome/FrameMenus.js +24 -0
  119. package/dist/editor/page-editor-chrome/InlineEditor.js +101 -0
  120. package/dist/editor/page-editor-chrome/LockedFieldIndicator.js +35 -0
  121. package/dist/editor/page-editor-chrome/NoLayout.js +21 -0
  122. package/dist/editor/page-editor-chrome/PageEditorChrome.js +65 -0
  123. package/dist/editor/page-editor-chrome/PictureEditorOverlay.js +109 -0
  124. package/dist/editor/page-editor-chrome/PlaceholderDropZone.js +82 -0
  125. package/dist/editor/page-editor-chrome/PlaceholderDropZones.js +147 -0
  126. package/dist/editor/page-viewer/DeviceToolbar.js +21 -0
  127. package/dist/editor/page-viewer/EditorForm.js +130 -0
  128. package/dist/editor/page-viewer/MiniMap.js +257 -0
  129. package/dist/editor/page-viewer/PageViewer.js +64 -0
  130. package/dist/editor/page-viewer/PageViewerFrame.js +696 -0
  131. package/dist/editor/page-viewer/pageViewContext.js +117 -0
  132. package/dist/editor/pageModel.js +2 -0
  133. package/dist/editor/picture-shared.js +28 -0
  134. package/dist/editor/reviews/Comment.js +112 -0
  135. package/dist/editor/reviews/Comments.js +24 -0
  136. package/dist/editor/reviews/PreviewInfo.js +13 -0
  137. package/dist/editor/reviews/Reviews.js +165 -0
  138. package/dist/editor/reviews/reviewCommands.js +44 -0
  139. package/dist/editor/reviews/useReviews.js +48 -0
  140. package/dist/editor/services/aiService.js +99 -0
  141. package/dist/editor/services/componentDesignerService.js +79 -0
  142. package/dist/editor/services/contentService.js +104 -0
  143. package/dist/editor/services/editService.js +322 -0
  144. package/dist/editor/services/indexService.js +25 -0
  145. package/dist/editor/services/reviewsService.js +43 -0
  146. package/dist/editor/services/serviceHelper.js +67 -0
  147. package/dist/editor/services/systemService.js +7 -0
  148. package/dist/editor/services/translationService.js +15 -0
  149. package/dist/editor/services-server/api.js +119 -0
  150. package/dist/editor/services-server/graphQL.js +56 -0
  151. package/dist/editor/sidebar/ComponentPalette.js +55 -0
  152. package/dist/editor/sidebar/ComponentTree.js +362 -0
  153. package/dist/editor/sidebar/Debug.js +60 -0
  154. package/dist/editor/sidebar/DictionaryEditor.js +160 -0
  155. package/dist/editor/sidebar/EditHistory.js +74 -0
  156. package/dist/editor/sidebar/GraphQL.js +115 -0
  157. package/dist/editor/sidebar/Insert.js +24 -0
  158. package/dist/editor/sidebar/MainContentTree.js +52 -0
  159. package/dist/editor/sidebar/Performance.js +34 -0
  160. package/dist/editor/sidebar/Sessions.js +31 -0
  161. package/dist/editor/sidebar/Sidebar.js +15 -0
  162. package/dist/editor/sidebar/SidebarView.js +76 -0
  163. package/dist/editor/sidebar/Translations.js +160 -0
  164. package/dist/editor/sidebar/Validation.js +52 -0
  165. package/dist/editor/sidebar/ViewSelector.js +15 -0
  166. package/dist/editor/sidebar/Workbox.js +80 -0
  167. package/dist/editor/ui/CenteredMessage.js +7 -0
  168. package/dist/editor/ui/CopyToClipboardButton.js +17 -0
  169. package/dist/editor/ui/DialogButtons.js +7 -0
  170. package/dist/editor/ui/Icons.js +75 -0
  171. package/dist/editor/ui/ItemNameDialog.js +45 -0
  172. package/dist/editor/ui/ItemNameDialogNew.js +61 -0
  173. package/dist/editor/ui/ItemSearch.js +93 -0
  174. package/dist/editor/ui/PerfectTree.js +223 -0
  175. package/dist/editor/ui/Section.js +12 -0
  176. package/dist/editor/ui/SimpleIconButton.js +11 -0
  177. package/dist/editor/ui/SimpleMenu.js +9 -0
  178. package/dist/editor/ui/SimpleTable.js +11 -0
  179. package/dist/editor/ui/SimpleTabs.js +21 -0
  180. package/dist/editor/ui/SimpleToolbar.js +7 -0
  181. package/dist/editor/ui/Spinner.js +7 -0
  182. package/dist/editor/ui/Splitter.js +187 -0
  183. package/dist/editor/ui/StackedPanels.js +69 -0
  184. package/dist/editor/ui/Toolbar.js +7 -0
  185. package/dist/editor/utils/id-helper.js +7 -0
  186. package/dist/editor/utils/insertOptions.js +45 -0
  187. package/dist/editor/utils/itemutils.js +25 -0
  188. package/dist/editor/utils/useMemoDebug.js +20 -0
  189. package/dist/editor/utils.js +328 -0
  190. package/dist/editor/views/CompareView.js +147 -0
  191. package/dist/editor/views/EditView.js +17 -0
  192. package/dist/editor/views/ItemEditor.js +24 -0
  193. package/dist/editor/views/SingleEditView.js +25 -0
  194. package/dist/index.js +22 -0
  195. package/dist/page-wizard/PageWizard.js +62 -0
  196. package/dist/page-wizard/SelectWizard.js +43 -0
  197. package/dist/page-wizard/WizardSteps.js +71 -0
  198. package/dist/page-wizard/service.js +26 -0
  199. package/dist/page-wizard/startPageWizardCommand.js +23 -0
  200. package/dist/page-wizard/steps/BuildPageStep.js +138 -0
  201. package/dist/page-wizard/steps/CollectStep.js +124 -0
  202. package/dist/page-wizard/steps/ComponentTypesSelector.js +211 -0
  203. package/dist/page-wizard/steps/Components.js +94 -0
  204. package/dist/page-wizard/steps/CreatePage.js +142 -0
  205. package/dist/page-wizard/steps/CreatePageAndLayoutStep.js +230 -0
  206. package/dist/page-wizard/steps/EditButton.js +7 -0
  207. package/dist/page-wizard/steps/FieldEditor.js +30 -0
  208. package/dist/page-wizard/steps/Generate.js +11 -0
  209. package/dist/page-wizard/steps/ImagesStep.js +159 -0
  210. package/dist/page-wizard/steps/LayoutStep.js +120 -0
  211. package/dist/page-wizard/steps/SelectStep.js +150 -0
  212. package/dist/page-wizard/steps/schema.js +140 -0
  213. package/dist/page-wizard/steps/usePageCreator.js +194 -0
  214. package/dist/splash-screen/NewPage.js +131 -0
  215. package/dist/splash-screen/SectionHeadline.js +9 -0
  216. package/dist/splash-screen/SplashScreen.js +81 -0
  217. package/dist/tour/Tour.js +321 -0
  218. package/dist/tour/default-tour.js +231 -0
  219. package/dist/tour/preview-tour.js +93 -0
  220. package/dist/tsconfig.build.tsbuildinfo +1 -0
  221. package/dist/types.js +2 -0
  222. package/package.json +1 -1
  223. package/src/editor/sidebar/ComponentTree.tsx +512 -512
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StackedPanels = StackedPanels;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ require("allotment/dist/style.css");
6
+ const allotment_1 = require("allotment");
7
+ const react_1 = require("react");
8
+ const utils_1 = require("primereact/utils");
9
+ function StackedPanels({ panels }) {
10
+ const splitter = (0, react_1.useRef)(null);
11
+ const [sizes, setSizes] = (0, react_1.useState)([]);
12
+ const [preferredSizes, setPreferredSizes] = (0, react_1.useState)(undefined);
13
+ const [panelsExpanded, setPanelsExpanded] = (0, react_1.useState)([]);
14
+ const [sizeToSet, setSizeToSet] = (0, react_1.useState)();
15
+ const panelHeaderSize = 30;
16
+ const toggle = (panelIndex) => {
17
+ const newSize = panelsExpanded[panelIndex]
18
+ ? panelHeaderSize
19
+ : (preferredSizes || sizes)[panelIndex];
20
+ resizePanel(panelIndex, newSize);
21
+ setPanelsExpanded((x) => {
22
+ const newState = [...x];
23
+ newState[panelIndex] = !newState[panelIndex];
24
+ return newState;
25
+ });
26
+ };
27
+ (0, react_1.useEffect)(() => {
28
+ setPanelsExpanded(panels.map(() => true));
29
+ setPreferredSizes(() => panels.map((x) => x.initialSize));
30
+ }, [panels]);
31
+ const resizePanel = (panelIndex, newSize) => {
32
+ const totalSize = sizes.reduce((a, b) => a + b, 0);
33
+ const totalOther = totalSize - sizes[panelIndex];
34
+ const tmpSizes = [...sizes];
35
+ tmpSizes[panelIndex] = newSize;
36
+ const percentages = tmpSizes.map((x) => x / totalOther);
37
+ percentages[panelIndex] = 0;
38
+ const remaining = totalSize - newSize;
39
+ const newSizes = percentages.map((x) => x * remaining);
40
+ newSizes[panelIndex] = newSize;
41
+ setSizes(newSizes);
42
+ setSizeToSet(newSizes);
43
+ };
44
+ (0, react_1.useEffect)(() => {
45
+ if (sizeToSet)
46
+ splitter.current?.resize(sizeToSet);
47
+ }, [sizeToSet]);
48
+ const getHeader = (panel, index) => {
49
+ if (panel.header)
50
+ return panel.header({ panel, index });
51
+ return ((0, jsx_runtime_1.jsxs)("div", { className: (0, utils_1.classNames)("p-1.5 bg-gray-50 uppercase text-gray-500 text-xs flex justify items-center cursor-pointer", panelsExpanded[index] ? "border-b" : ""), onClick: () => toggle(index), children: [panel.icon &&
52
+ (typeof panel.icon === "string" ? ((0, jsx_runtime_1.jsx)("i", { className: (0, utils_1.classNames)(panel.icon, "pi mr-1.5") })) : ((0, jsx_runtime_1.jsx)("div", { className: "w-4 h-4 mr-1.5", children: panel.icon }))), (0, jsx_runtime_1.jsx)("div", { className: "mr-auto", children: panel.title }), (0, jsx_runtime_1.jsx)("i", { className: (0, utils_1.classNames)(panelsExpanded[index] ? "pi-chevron-up" : "pi-chevron-down", "pi text-sm") })] }));
53
+ };
54
+ const initalSizes = panels.map((x) => x.initialSize);
55
+ return ((0, jsx_runtime_1.jsx)(allotment_1.Allotment, { vertical: true, snap: true, ref: splitter, defaultSizes: initalSizes, onChange: (s) => {
56
+ if (sizes.join(",") != s.join(","))
57
+ setSizes(s);
58
+ const newPreferred = [...(preferredSizes || s)];
59
+ s.forEach((x, i) => {
60
+ if (x > panelHeaderSize)
61
+ newPreferred[i] = x;
62
+ });
63
+ setPreferredSizes(newPreferred);
64
+ }, children: panels.map((panel, index) => ((0, jsx_runtime_1.jsx)(allotment_1.Allotment.Pane, {
65
+ // preferredSize={(preferredSizes || initalSizes)[index] + "%"}
66
+ maxSize: panelsExpanded.length <= index || panelsExpanded[index]
67
+ ? 10000
68
+ : panelHeaderSize, children: (0, jsx_runtime_1.jsxs)("div", { className: "flex flex-col h-full", children: [getHeader(panel, index), panelsExpanded[index] && ((0, jsx_runtime_1.jsx)("div", { className: "overflow-hidden relative flex-1", children: (0, jsx_runtime_1.jsx)("div", { className: (0, utils_1.classNames)("inset-0 absolute", panel.noOverflow ? "" : "overflow-y-auto"), children: panel.content }) }))] }) }, index))) }));
69
+ }
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Toolbar = Toolbar;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ function Toolbar({ children }) {
6
+ return ((0, jsx_runtime_1.jsx)("div", { className: "bg-gray-50 flex gap-1 p-0.5 border-b items-center", children: children }));
7
+ }
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.cleanId = cleanId;
4
+ function cleanId(id) {
5
+ if (id)
6
+ return id.replace(/[^a-zA-Z0-9_-]/g, "").toLowerCase();
7
+ }
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getInsertOptionsForCurrentSelection = getInsertOptionsForCurrentSelection;
4
+ const componentTreeHelper_1 = require("../componentTreeHelper");
5
+ function getInsertOptionsForCurrentSelection(editContext) {
6
+ const page = editContext.page;
7
+ if (!page)
8
+ return [];
9
+ const insertingPlaceholderKeys = [editContext.selectedForInsertion]
10
+ .map((x) => (0, componentTreeHelper_1.getComponentById)(x, editContext.page))
11
+ .filter((x) => x)
12
+ .reduce((a, x) => a.concat(x.placeholders?.map((y) => y.key) || []), []);
13
+ const selectedPlaceholderKeys = [
14
+ //...selection.filter((x) => x.indexOf("_") > 0),
15
+ ...insertingPlaceholderKeys,
16
+ ];
17
+ function collectInsertOptions(page, placeholderKeys) {
18
+ const insertOptionsMap = new Map();
19
+ function traverse(placeholders) {
20
+ for (const placeholder of placeholders) {
21
+ if (placeholder &&
22
+ (placeholderKeys.length === 0 ||
23
+ placeholderKeys.includes(placeholder.key))) {
24
+ for (const option of placeholder.insertOptions) {
25
+ insertOptionsMap.set(option.typeId, option);
26
+ }
27
+ }
28
+ for (const component of placeholder.components) {
29
+ if (component.placeholders)
30
+ traverse(component.placeholders);
31
+ }
32
+ }
33
+ }
34
+ traverse(page.rootComponent.placeholders);
35
+ // Convert the map back into an array of objects
36
+ const insertOptionsArray = Array.from(insertOptionsMap.values());
37
+ insertOptionsArray.sort((a, b) => a.name.localeCompare(b.name));
38
+ return insertOptionsArray;
39
+ }
40
+ const currentInsertOptions = page
41
+ ? collectInsertOptions(page, selectedPlaceholderKeys)
42
+ : [];
43
+ // console.log(currentInsertOptions, selectedPlaceholderKeys, page);
44
+ return currentInsertOptions;
45
+ }
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.confirmCreateVersion = void 0;
4
+ const createVersionCommand_1 = require("../commands/createVersionCommand");
5
+ const confirmCreateVersion = (editContext, language) => {
6
+ editContext.confirm({
7
+ message: "This page has no version in language " +
8
+ language.name +
9
+ " (" +
10
+ language.languageCode +
11
+ "). Do you want to create a new version?",
12
+ header: "Create Language Version?",
13
+ icon: "pi pi-exclamation-triangle",
14
+ acceptLabel: "Yes, create version",
15
+ rejectLabel: "No",
16
+ accept: async () => {
17
+ await editContext?.executeCommand({
18
+ command: (0, createVersionCommand_1.getCreateAndSwitchToNewVersionCommand)({
19
+ language: language.languageCode,
20
+ }),
21
+ });
22
+ },
23
+ });
24
+ };
25
+ exports.confirmCreateVersion = confirmCreateVersion;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useMemoWithDebug = useMemoWithDebug;
4
+ const react_1 = require("react");
5
+ // Generic type for the return value of the memoized factory
6
+ function useMemoWithDebug(factory, dependencies) {
7
+ const previousDependenciesRef = (0, react_1.useRef)([]);
8
+ const hasChanged = dependencies.some((dep, index) => {
9
+ return dep !== previousDependenciesRef.current[index];
10
+ });
11
+ if (hasChanged) {
12
+ dependencies.forEach((dep, index) => {
13
+ if (dep !== previousDependenciesRef.current[index]) {
14
+ console.log(`Dependency at index ${index} changed:`, "\nPrevious:", previousDependenciesRef.current[index], "\nCurrent:", dep);
15
+ }
16
+ });
17
+ }
18
+ previousDependenciesRef.current = dependencies;
19
+ return (0, react_1.useMemo)(factory, dependencies);
20
+ }
@@ -0,0 +1,328 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getAbsolutePosition = exports.useLocalStorage = void 0;
4
+ exports.useEventListenerExt = useEventListenerExt;
5
+ exports.isFieldActionExecuting = isFieldActionExecuting;
6
+ exports.getItemDescriptor = getItemDescriptor;
7
+ exports.getAbsoluteIconUrl = getAbsoluteIconUrl;
8
+ exports.findParentWithAttribute = findParentWithAttribute;
9
+ exports.parsePlaceholderKey = parsePlaceholderKey;
10
+ exports.hasFieldLock = hasFieldLock;
11
+ exports.getSessionWithFieldLock = getSessionWithFieldLock;
12
+ exports.getFieldDescriptorFromElement = getFieldDescriptorFromElement;
13
+ exports.findNearestComponentId = findNearestComponentId;
14
+ exports.findFieldElement = findFieldElement;
15
+ exports.findComponentRect = findComponentRect;
16
+ exports.findParentComponentId = findParentComponentId;
17
+ exports.normalizeGuid = normalizeGuid;
18
+ exports.formatDate = formatDate;
19
+ exports.findClosestFieldElement = findClosestFieldElement;
20
+ const react_1 = require("react");
21
+ const react_2 = require("react");
22
+ // Hook
23
+ function useEventListenerExt(eventName, handler, element, capture = false) {
24
+ // Create a ref that stores handler
25
+ const savedHandler = (0, react_2.useRef)(undefined);
26
+ // Update ref.current value if handler changes.
27
+ // This allows our effect below to always get latest handler ...
28
+ // ... without us needing to pass it in effect deps array ...
29
+ // ... and potentially cause effect to re-run every render.
30
+ (0, react_2.useEffect)(() => {
31
+ savedHandler.current = handler;
32
+ }, [handler]);
33
+ (0, react_2.useEffect)(() => {
34
+ // Make sure element supports addEventListener
35
+ // On
36
+ const isSupported = element && element.addEventListener;
37
+ if (!isSupported)
38
+ return;
39
+ // Create event listener that calls handler function stored in ref
40
+ const eventListener = (event) => savedHandler.current(event);
41
+ // Add event listener
42
+ element.addEventListener(eventName, eventListener, { capture: capture });
43
+ // Remove event listener on cleanup
44
+ return () => {
45
+ element.removeEventListener(eventName, eventListener);
46
+ };
47
+ }, [eventName, element] // Re-run if eventName or element changes
48
+ );
49
+ }
50
+ const useLocalStorage = (storageKey, fallbackState) => {
51
+ const [value, setValue] = (0, react_1.useState)(JSON.parse(typeof window !== "undefined"
52
+ ? localStorage.getItem(storageKey) ?? JSON.stringify(fallbackState)
53
+ : JSON.stringify(fallbackState)));
54
+ (0, react_2.useEffect)(() => {
55
+ if (typeof window !== "undefined")
56
+ localStorage.setItem(storageKey, JSON.stringify(value));
57
+ }, [value, storageKey]);
58
+ return [value, setValue];
59
+ };
60
+ exports.useLocalStorage = useLocalStorage;
61
+ function isFieldActionExecuting(field, editContext) {
62
+ const fieldItem = field.descriptor.item;
63
+ if (!fieldItem) {
64
+ return false;
65
+ }
66
+ var action = editContext.activeFieldActions.find((x) => x.field.fieldId == field.id &&
67
+ x.field.item?.id == fieldItem.id &&
68
+ x.field.item?.language == fieldItem.language &&
69
+ x.field.item?.version == fieldItem.version);
70
+ return action?.state == "running";
71
+ }
72
+ function getItemDescriptor(item) {
73
+ if (!item)
74
+ throw new Error("Item is null");
75
+ if ("descriptor" in item) {
76
+ return item.descriptor;
77
+ }
78
+ return {
79
+ id: item.id,
80
+ language: item.language,
81
+ version: item.version,
82
+ name: item.name,
83
+ };
84
+ }
85
+ function getAbsoluteIconUrl(url) {
86
+ //return configuration.services.editorService.baseUrl + url;
87
+ return url;
88
+ }
89
+ function findParentWithAttribute(element, attr) {
90
+ while (element && element !== document.documentElement) {
91
+ if (element.hasAttribute(attr)) {
92
+ return element;
93
+ }
94
+ element = element.parentElement;
95
+ }
96
+ return null;
97
+ }
98
+ function parsePlaceholderKey(key) {
99
+ const placeholderKeyComponents = key.split("_");
100
+ const placeholderName = placeholderKeyComponents.length === 1
101
+ ? placeholderKeyComponents[0]
102
+ : placeholderKeyComponents[1];
103
+ const parentId = placeholderKeyComponents.length === 1
104
+ ? undefined
105
+ : placeholderKeyComponents[0];
106
+ return {
107
+ name: placeholderName,
108
+ componentId: parentId,
109
+ };
110
+ }
111
+ // export function getFieldRawValue(field: Field, editContext: EditContextType) {
112
+ // return (
113
+ // getModifiedField(field.descriptor, editContext)?.rawValue ??
114
+ // field.rawValue ??
115
+ // field.value
116
+ // );
117
+ // }
118
+ // export function getFieldValue(field: Field, editContext: EditContextType) {
119
+ // return getModifiedField(field.descriptor, editContext)?.value ?? field.value;
120
+ // }
121
+ // export function getModifiedField(
122
+ // field: FieldDescriptor,
123
+ // editContext: EditContextType
124
+ // ) {
125
+ // const modifiedField = editContext.modifiedFields.find(
126
+ // (x) =>
127
+ // x.field.fieldId === field.fieldId &&
128
+ // x.field.item.id === field.item.id &&
129
+ // x.field.item.language === field.item.language &&
130
+ // x.field.item.version === field.item.version
131
+ // );
132
+ // return modifiedField;
133
+ // }
134
+ // export function getModifiedFieldValue(
135
+ // field: FieldDescriptor,
136
+ // editContext: EditContextType
137
+ // ) {
138
+ // return getModifiedField(field, editContext)?.value;
139
+ // }
140
+ // export function setModifiedFieldValue(
141
+ // field: FieldDescriptor,
142
+ // value: string,
143
+ // editContext: EditContextType
144
+ // ) {
145
+ // const modifiedValue = editContext.modifiedFields.find(
146
+ // (x) =>
147
+ // x.field.fieldId === field.fieldId &&
148
+ // x.field.item.id === field.item.id &&
149
+ // x.field.item.language === field.item.language &&
150
+ // x.field.item.version === field.item.version
151
+ // );
152
+ // if (modifiedValue) {
153
+ // modifiedValue.value = value;
154
+ // } else {
155
+ // editContext.modifiedFields.push({
156
+ // field: field,
157
+ // value: value,
158
+ // });
159
+ // }
160
+ // editContext.setModifiedFields([...editContext.modifiedFields]);
161
+ // }
162
+ function hasFieldLock(field, editContext) {
163
+ if (!editContext.lockedField) {
164
+ return false;
165
+ }
166
+ return (editContext.lockedField.fieldId === field.fieldId &&
167
+ editContext.lockedField.item.id === field.item.id &&
168
+ editContext.lockedField.item.language === field.item.language &&
169
+ editContext.lockedField.item.version === field.item.version);
170
+ }
171
+ function getSessionWithFieldLock(field, editContext) {
172
+ return editContext.activeSessions.find((s) => s.fieldLock?.fieldId === field.fieldId &&
173
+ s.fieldLock?.fieldId === field.fieldId &&
174
+ s.fieldLock?.item.id === field.item.id &&
175
+ s.fieldLock?.item.language === field.item.language &&
176
+ s.fieldLock?.item.version === field.item.version);
177
+ }
178
+ function getFieldDescriptorFromElement(element) {
179
+ return {
180
+ item: {
181
+ id: element.getAttribute("data-itemid"),
182
+ version: parseInt(element.getAttribute("data-version")),
183
+ language: element.getAttribute("data-language"),
184
+ },
185
+ fieldId: element.getAttribute("data-fieldid"),
186
+ };
187
+ }
188
+ function findNearestComponentId(startElement) {
189
+ let element = startElement;
190
+ while (element) {
191
+ if (element.hasAttribute("data-component-start")) {
192
+ return element.getAttribute("data-component-start") ?? undefined;
193
+ }
194
+ const prev = element.previousElementSibling;
195
+ if (!prev) {
196
+ element = element.parentElement;
197
+ }
198
+ else
199
+ element = prev;
200
+ }
201
+ return;
202
+ }
203
+ function findFieldElement(iframe, fieldDescriptor) {
204
+ if (!iframe.contentWindow?.document.body)
205
+ return undefined;
206
+ const fieldElement = iframe.contentWindow?.document.body.querySelector("[data-itemid='" +
207
+ fieldDescriptor.item.id +
208
+ "'][data-language='" +
209
+ fieldDescriptor.item.language +
210
+ "'][data-version='" +
211
+ fieldDescriptor.item.version +
212
+ "'][data-fieldid='" +
213
+ fieldDescriptor.fieldId +
214
+ "']");
215
+ return fieldElement;
216
+ }
217
+ function findComponentRect(iframe, componentId, takeScrollPositionIntoAccount = false) {
218
+ if (!iframe.contentWindow?.document.body)
219
+ return undefined;
220
+ const componentStart = iframe.contentWindow?.document.body.querySelector("[data-component-start='" + componentId + "']");
221
+ const componentEnd = iframe?.contentWindow?.document.body.querySelector("[data-component-end='" + componentId + "']");
222
+ if (!componentStart || !componentEnd) {
223
+ return null;
224
+ }
225
+ let startElement = componentStart.nextElementSibling;
226
+ while (startElement && startElement.tagName === "SCRIPT") {
227
+ startElement = startElement.nextElementSibling;
228
+ }
229
+ if (!startElement) {
230
+ console.error("No start element found for component " + componentId);
231
+ return null;
232
+ }
233
+ const startRect = takeScrollPositionIntoAccount
234
+ ? (0, exports.getAbsolutePosition)(startElement, iframe)
235
+ : startElement.getBoundingClientRect();
236
+ let endElement = componentEnd.previousElementSibling;
237
+ while (endElement && endElement.tagName === "SCRIPT") {
238
+ endElement = endElement.previousElementSibling;
239
+ }
240
+ if (!endElement)
241
+ return null;
242
+ const endRect = takeScrollPositionIntoAccount
243
+ ? (0, exports.getAbsolutePosition)(endElement, iframe)
244
+ : endElement.getBoundingClientRect();
245
+ const elements = startElement === endElement ? [startElement] : [startElement, endElement];
246
+ // console.log(
247
+ // "start rect",
248
+ // startRect,
249
+ // startElement,
250
+ // iframe.contentWindow?.scrollY,
251
+ // takeScrollPositionIntoAccount
252
+ // );
253
+ return {
254
+ rect: {
255
+ x: startRect.x,
256
+ y: startRect.y,
257
+ width: endRect.x + endRect.width - startRect.x,
258
+ height: endRect.y + endRect.height - startRect.y,
259
+ },
260
+ elements: elements,
261
+ };
262
+ }
263
+ const getAbsolutePosition = (element, iframe) => {
264
+ const rect = element.getBoundingClientRect();
265
+ const scrollLeft = iframe.contentWindow?.scrollX ||
266
+ iframe.contentDocument?.documentElement.scrollLeft || 0;
267
+ const scrollTop = iframe.contentWindow?.scrollY ||
268
+ iframe.contentDocument?.documentElement.scrollTop || 0;
269
+ return {
270
+ x: rect.left + scrollLeft,
271
+ y: rect.top + scrollTop,
272
+ width: rect.width,
273
+ height: rect.height,
274
+ };
275
+ };
276
+ exports.getAbsolutePosition = getAbsolutePosition;
277
+ function findParentComponentId(element) {
278
+ while (element && element !== document.documentElement) {
279
+ const startElement = findStartElement(element);
280
+ if (startElement) {
281
+ return startElement.getAttribute("data-component-start");
282
+ }
283
+ element = element.parentElement;
284
+ }
285
+ return null;
286
+ }
287
+ function findStartElement(element) {
288
+ let prev = element;
289
+ while (prev) {
290
+ prev = prev.previousElementSibling;
291
+ if (prev?.getAttribute("data-component-start")) {
292
+ return prev;
293
+ }
294
+ }
295
+ return null;
296
+ }
297
+ function normalizeGuid(id) {
298
+ id = id.toUpperCase();
299
+ if (id.length && id[0] === "{")
300
+ return id;
301
+ return "{" + id + "}";
302
+ }
303
+ const dateOptions = {
304
+ year: "numeric",
305
+ month: "numeric",
306
+ day: "numeric",
307
+ hour: "numeric",
308
+ minute: "numeric",
309
+ second: "numeric",
310
+ hour12: false,
311
+ };
312
+ const dateFormat = Intl.DateTimeFormat(typeof navigator !== 'undefined' ? navigator.language : 'en', dateOptions);
313
+ function formatDate(date) {
314
+ return dateFormat.format(date);
315
+ }
316
+ function findClosestFieldElement(node) {
317
+ let current = node;
318
+ while (current) {
319
+ if (current.nodeType === Node.ELEMENT_NODE) {
320
+ const element = current;
321
+ if (element.hasAttribute("data-fieldid")) {
322
+ return element;
323
+ }
324
+ }
325
+ current = current.parentNode;
326
+ }
327
+ return null;
328
+ }
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CompareView = CompareView;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const editContext_1 = require("../client/editContext");
7
+ const LanguageSelector_1 = require("../menubar/LanguageSelector");
8
+ const VersionSelector_1 = require("../menubar/VersionSelector");
9
+ const pageViewContext_1 = require("../page-viewer/pageViewContext");
10
+ const navigation_1 = require("next/navigation");
11
+ const navigation_2 = require("next/navigation");
12
+ const SingleEditView_1 = require("./SingleEditView");
13
+ const contentService_1 = require("../services/contentService");
14
+ const allotment_1 = require("allotment");
15
+ const ItemEditor_1 = require("./ItemEditor");
16
+ function CompareView() {
17
+ const editContext = (0, editContext_1.useEditContext)();
18
+ const searchParams = (0, navigation_1.useSearchParams)();
19
+ const router = (0, navigation_2.useRouter)();
20
+ if (!editContext)
21
+ return;
22
+ const [compareToItem, setCompareToItem] = (0, react_1.useState)();
23
+ const [compareToVersions, setCompareToVersions] = (0, react_1.useState)([]);
24
+ const compareTo = editContext.compareTo;
25
+ const setCompareTo = editContext.setCompareTo;
26
+ const comparePageViewContext = (0, pageViewContext_1.usePageViewContext)({
27
+ pageItemDescriptor: compareToItem?.descriptor,
28
+ itemsRepository: editContext.itemsRepository,
29
+ configuration: editContext.configuration,
30
+ });
31
+ (0, react_1.useEffect)(() => {
32
+ comparePageViewContext.setDevice(editContext.pageView.device);
33
+ }, [editContext.pageView.device]);
34
+ const updateCompareToVersions = async () => {
35
+ if (!compareTo || !compareTo.id || !compareTo.language) {
36
+ setCompareToVersions([]);
37
+ return;
38
+ }
39
+ const result = await (0, contentService_1.getLanguagesAndVersions)(compareTo);
40
+ if (result?.data) {
41
+ const versions = result.data.versions.reverse();
42
+ setCompareToVersions(versions);
43
+ }
44
+ };
45
+ (0, react_1.useEffect)(() => {
46
+ const updateCompareTo = async () => {
47
+ if (!editContext)
48
+ return;
49
+ if (editContext.contentEditorItem) {
50
+ let urlLanguage = searchParams.get("compareLanguage") ||
51
+ editContext.contentEditorItem.descriptor.language;
52
+ let urlVersion = parseInt(searchParams.get("compareVersion") || "0") ||
53
+ editContext.currentItemDescriptor?.version;
54
+ const language = editContext.itemLanguages.find((x) => x.languageCode === urlLanguage);
55
+ if (!language || !language.versions) {
56
+ urlLanguage = "";
57
+ }
58
+ if (!editContext.currentItemDescriptor?.id || !language) {
59
+ setCompareTo(undefined);
60
+ return;
61
+ }
62
+ const result = await (0, contentService_1.getLanguagesAndVersions)({
63
+ id: editContext.currentItemDescriptor?.id,
64
+ language: language.languageCode,
65
+ version: 0,
66
+ });
67
+ if (result?.data) {
68
+ const versions = [...result.data.versions].reverse();
69
+ const version = versions.find((x) => x.version === urlVersion);
70
+ setCompareTo({
71
+ id: editContext.contentEditorItem.descriptor.id,
72
+ language: urlLanguage,
73
+ version: version?.version || 0,
74
+ });
75
+ }
76
+ }
77
+ };
78
+ updateCompareTo();
79
+ }, [searchParams, editContext?.itemLanguages]);
80
+ (0, react_1.useEffect)(() => {
81
+ const updateCompareToItem = async () => {
82
+ if (!compareTo || !compareTo.id || !compareTo.language) {
83
+ setCompareToItem(undefined);
84
+ return;
85
+ }
86
+ const item = await editContext?.itemsRepository.getItem(compareTo);
87
+ setCompareToItem(item);
88
+ };
89
+ updateCompareToItem();
90
+ updateCompareToVersions();
91
+ }, [compareTo]);
92
+ function updateCompareTo(compareToItemDescriptor) {
93
+ if (compareToItemDescriptor) {
94
+ const newParams = new URLSearchParams(searchParams.toString());
95
+ newParams.set("compareLanguage", compareToItemDescriptor.language);
96
+ newParams.set("compareVersion", compareToItemDescriptor.version.toString());
97
+ router.push(`?${newParams.toString()}`);
98
+ }
99
+ }
100
+ const originalSelector = ((0, jsx_runtime_1.jsxs)("div", { className: "flex-1 bg-gray-100 border-b flex items-center justify-center flex-shrink-0 text-sm text-gray-600 p-1", children: [(0, jsx_runtime_1.jsx)(LanguageSelector_1.LanguageSelector, { selectedLanguage: editContext.contentEditorItem?.descriptor?.language, showAllLanguagesSwitch: false, darkMode: true, onLanguageSelected: (language) => {
101
+ if (!editContext.contentEditorItem)
102
+ return;
103
+ editContext.loadItem({
104
+ id: editContext.contentEditorItem.descriptor.id,
105
+ language: language.languageCode,
106
+ version: 0,
107
+ });
108
+ } }), compareTo?.language && ((0, jsx_runtime_1.jsx)(VersionSelector_1.VersionSelector, { darkMode: true, readOnly: true, versions: editContext.itemVersions, itemDescriptor: editContext.currentItemDescriptor, actualVersion: editContext.contentEditorItem?.version, onVersionSelected: (version) => {
109
+ if (!editContext.contentEditorItem)
110
+ return;
111
+ editContext.loadItem({
112
+ id: editContext.contentEditorItem.descriptor.id,
113
+ language: editContext.contentEditorItem.descriptor.language,
114
+ version,
115
+ });
116
+ } }))] }));
117
+ const compareToSelector = ((0, jsx_runtime_1.jsxs)("div", { className: "flex-1 bg-gray-100 border-b flex items-center justify-center flex-shrink-0 text-sm text-gray-600 p-1", children: [(0, jsx_runtime_1.jsx)(LanguageSelector_1.LanguageSelector, { selectedLanguage: compareTo?.language, showAllLanguagesSwitch: false, darkMode: true, onLanguageSelected: (language) => {
118
+ if (!compareTo?.id)
119
+ return;
120
+ updateCompareTo({
121
+ id: compareTo.id,
122
+ language: language.languageCode,
123
+ version: compareTo.version,
124
+ });
125
+ } }), compareTo?.language && ((0, jsx_runtime_1.jsx)(VersionSelector_1.VersionSelector, { darkMode: true, readOnly: true, versions: compareToVersions, itemDescriptor: compareTo, actualVersion: compareToItem?.version, onVersionSelected: (version) => {
126
+ if (!compareTo?.id)
127
+ return;
128
+ updateCompareTo({
129
+ id: compareTo.id,
130
+ language: compareTo.language,
131
+ version,
132
+ });
133
+ } }))] }));
134
+ if ((compareToItem && !compareToItem.hasLayout) ||
135
+ comparePageViewContext.device === "")
136
+ return ((0, jsx_runtime_1.jsxs)("div", { className: "flex flex-col h-full w-full items-stretch", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex w-full", children: [originalSelector, compareToSelector] }), (0, jsx_runtime_1.jsx)("div", { className: "flex-1 relative", children: (0, jsx_runtime_1.jsx)("div", { className: "absolute w-full h-full", children: (0, jsx_runtime_1.jsx)(ItemEditor_1.ItemEditor, { pageViewContext: editContext.pageView, compareToItem: compareToItem }) }) })] }));
137
+ return ((0, jsx_runtime_1.jsxs)(allotment_1.Allotment, { className: "flex h-full w-full", children: [(0, jsx_runtime_1.jsx)(allotment_1.Allotment.Pane, { children: (0, jsx_runtime_1.jsxs)("div", { className: "flex flex-col h-full w-full items-stretch", children: [originalSelector, (0, jsx_runtime_1.jsx)(SingleEditView_1.SingleEditView, { name: "original", mode: editContext?.previewMode ? "view" : "edit", pageViewContext: editContext.pageView, itemDescriptor: editContext.contentEditorItem?.descriptor }, "original")] }) }), (0, jsx_runtime_1.jsx)(allotment_1.Allotment.Pane, { children: (0, jsx_runtime_1.jsxs)("div", { className: "flex flex-col h-full w-full items-stretch", children: [compareToSelector, compareTo?.language && ((0, jsx_runtime_1.jsx)(SingleEditView_1.SingleEditView, { name: "compareTo", mode: compareToItem?.id ===
138
+ editContext.contentEditorItem?.descriptor.id &&
139
+ compareToItem?.language ===
140
+ editContext.contentEditorItem?.descriptor.language &&
141
+ compareToItem?.version ===
142
+ editContext.contentEditorItem?.descriptor.version
143
+ ? editContext?.previewMode
144
+ ? "view"
145
+ : "edit"
146
+ : "compare", pageViewContext: comparePageViewContext, itemDescriptor: compareTo }, "compareTo")), !compareTo?.language && ((0, jsx_runtime_1.jsx)("div", { className: "flex flex-col h-full w-full items-center justify-center", children: (0, jsx_runtime_1.jsx)("div", { className: "text-gray-400", children: "Select a language and version to compare" }) }))] }) })] }));
147
+ }
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EditView = EditView;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const editContext_1 = require("../client/editContext");
6
+ const CompareView_1 = require("./CompareView");
7
+ const SingleEditView_1 = require("./SingleEditView");
8
+ function EditView() {
9
+ const editContext = (0, editContext_1.useEditContext)();
10
+ if (!editContext)
11
+ return null;
12
+ if (!editContext.contentEditorItem?.descriptor)
13
+ return ((0, jsx_runtime_1.jsx)("div", { className: "grid items-center justify-center h-full w-full", children: (0, jsx_runtime_1.jsx)("div", { className: "text-sm text-gray-500", children: "Not item selected" }) }));
14
+ if (editContext.compareMode)
15
+ return (0, jsx_runtime_1.jsx)(CompareView_1.CompareView, {});
16
+ return ((0, jsx_runtime_1.jsx)(SingleEditView_1.SingleEditView, { name: "single", mode: editContext?.previewMode ? "view" : "edit", pageViewContext: editContext.pageView, itemDescriptor: editContext.contentEditorItem?.descriptor }, "single"));
17
+ }