@alpaca-headless/alpaca-headless-nextjs 1.0.26 → 1.0.128

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 (238) hide show
  1. package/dist/cjs/client-components/ClientLink.js +36 -0
  2. package/dist/cjs/client-components/MultiComponentEditor.js +26 -0
  3. package/dist/cjs/client-components/index.js +19 -0
  4. package/dist/cjs/components/Link.js +1 -1
  5. package/dist/cjs/components/LinkEditor.js +47 -1
  6. package/dist/cjs/components/Picture.js +14 -12
  7. package/dist/cjs/components/PictureEditor.js +22 -18
  8. package/dist/cjs/components/Placeholder.js +51 -9
  9. package/dist/cjs/components/RichText.js +1 -1
  10. package/dist/cjs/components/RichTextEditor.js +17 -2
  11. package/dist/cjs/components/TextEditor.js +15 -3
  12. package/dist/cjs/components/Translate.js +1 -1
  13. package/dist/cjs/{editor → components}/TranslateEditor.js +5 -2
  14. package/dist/cjs/editor/AiPopup.js +33 -0
  15. package/dist/cjs/editor/AiTerminal.js +42 -18
  16. package/dist/cjs/editor/ComponentInfo.js +4 -3
  17. package/dist/cjs/editor/ComponentPalette.js +12 -68
  18. package/dist/cjs/editor/ComponentTree.js +76 -59
  19. package/dist/cjs/editor/ConfirmationDialog.js +31 -0
  20. package/dist/cjs/editor/ContentTree.js +144 -49
  21. package/dist/cjs/editor/Debug.js +12 -2
  22. package/dist/cjs/editor/DialogButtons.js +7 -0
  23. package/dist/cjs/editor/DictionaryEditor.js +14 -8
  24. package/dist/cjs/editor/EditFrame.js +88 -20
  25. package/dist/cjs/editor/EditHistory.js +17 -4
  26. package/dist/cjs/editor/Editor.js +1 -1
  27. package/dist/cjs/editor/EditorClient.js +506 -237
  28. package/dist/cjs/editor/EditorClientHost.js +2 -2
  29. package/dist/cjs/editor/FieldList.js +30 -43
  30. package/dist/cjs/editor/FieldListField.js +75 -0
  31. package/dist/cjs/editor/FloatingToolbar.js +92 -0
  32. package/dist/cjs/editor/GraphQL.js +4 -6
  33. package/dist/cjs/editor/ItemEditor.js +9 -0
  34. package/dist/cjs/editor/ItemInfo.js +17 -0
  35. package/dist/cjs/editor/ItemNameDialog.js +37 -0
  36. package/dist/cjs/editor/LanguageSelector.js +1 -1
  37. package/dist/cjs/editor/LinkEditorDialog.js +67 -0
  38. package/dist/cjs/editor/MainLayout.js +24 -0
  39. package/dist/cjs/editor/MediaSelector.js +44 -13
  40. package/dist/cjs/editor/PictureEditorDialog.js +93 -0
  41. package/dist/cjs/editor/PlaceholderDropZone.js +48 -9
  42. package/dist/cjs/editor/SidebarTabs.js +47 -0
  43. package/dist/cjs/editor/Terminal.js +21 -11
  44. package/dist/cjs/editor/Utils.js +43 -0
  45. package/dist/cjs/editor/VersionSelector.js +1 -1
  46. package/dist/cjs/editor/Workbox.js +41 -0
  47. package/dist/cjs/editor/componentCommands.js +141 -0
  48. package/dist/cjs/editor/contentService.js +45 -3
  49. package/dist/cjs/editor/editContext.js +9 -4
  50. package/dist/cjs/editor/editService.js +187 -3
  51. package/dist/cjs/editor/fieldTypes/CheckboxEditor.js +21 -0
  52. package/dist/cjs/editor/fieldTypes/InternalLinkFieldEditor.js +46 -0
  53. package/dist/cjs/editor/fieldTypes/LinkFieldEditor.js +55 -0
  54. package/dist/cjs/editor/fieldTypes/MultiLineText.js +25 -0
  55. package/dist/cjs/editor/fieldTypes/PictureFieldEditor.js +19 -0
  56. package/dist/cjs/editor/fieldTypes/RichTextEditor.js +9 -4
  57. package/dist/cjs/editor/fieldTypes/SingleLineText.js +12 -4
  58. package/dist/cjs/editor/fieldTypes/TreeListEditor.js +59 -0
  59. package/dist/cjs/editor/ui/Section.js +8 -0
  60. package/dist/cjs/loadRouteData.js +24 -14
  61. package/dist/cjs/middleware/authorization.js +52 -0
  62. package/dist/cjs/middleware/index.js +17 -0
  63. package/dist/editor.css +552 -74
  64. package/dist/primereact/resources/themes/arya-blue/theme.css +103 -91
  65. package/dist/primereact/resources/themes/arya-green/theme.css +103 -91
  66. package/dist/primereact/resources/themes/arya-orange/theme.css +103 -91
  67. package/dist/primereact/resources/themes/arya-purple/theme.css +103 -91
  68. package/dist/primereact/resources/themes/bootstrap4-dark-blue/theme.css +103 -91
  69. package/dist/primereact/resources/themes/bootstrap4-dark-purple/theme.css +103 -91
  70. package/dist/primereact/resources/themes/bootstrap4-light-blue/theme.css +102 -90
  71. package/dist/primereact/resources/themes/bootstrap4-light-purple/theme.css +102 -90
  72. package/dist/primereact/resources/themes/fluent-light/theme.css +103 -91
  73. package/dist/primereact/resources/themes/lara-dark-amber/fonts/Inter-italic.var.woff2 +0 -0
  74. package/dist/primereact/resources/themes/lara-dark-amber/fonts/Inter-roman.var.woff2 +0 -0
  75. package/dist/primereact/resources/themes/lara-dark-amber/theme.css +6049 -0
  76. package/dist/primereact/resources/themes/lara-dark-blue/theme.css +1006 -955
  77. package/dist/primereact/resources/themes/lara-dark-cyan/fonts/Inter-italic.var.woff2 +0 -0
  78. package/dist/primereact/resources/themes/lara-dark-cyan/fonts/Inter-roman.var.woff2 +0 -0
  79. package/dist/primereact/resources/themes/lara-dark-cyan/theme.css +6049 -0
  80. package/dist/primereact/resources/themes/lara-dark-green/fonts/Inter-italic.var.woff2 +0 -0
  81. package/dist/primereact/resources/themes/lara-dark-green/fonts/Inter-roman.var.woff2 +0 -0
  82. package/dist/primereact/resources/themes/lara-dark-green/theme.css +6049 -0
  83. package/dist/primereact/resources/themes/lara-dark-indigo/theme.css +1006 -955
  84. package/dist/primereact/resources/themes/lara-dark-pink/fonts/Inter-italic.var.woff2 +0 -0
  85. package/dist/primereact/resources/themes/lara-dark-pink/fonts/Inter-roman.var.woff2 +0 -0
  86. package/dist/primereact/resources/themes/lara-dark-pink/theme.css +6049 -0
  87. package/dist/primereact/resources/themes/lara-dark-purple/theme.css +1006 -955
  88. package/dist/primereact/resources/themes/lara-dark-teal/theme.css +1006 -955
  89. package/dist/primereact/resources/themes/lara-light-amber/fonts/Inter-italic.var.woff2 +0 -0
  90. package/dist/primereact/resources/themes/lara-light-amber/fonts/Inter-roman.var.woff2 +0 -0
  91. package/dist/primereact/resources/themes/lara-light-amber/theme.css +6041 -0
  92. package/dist/primereact/resources/themes/lara-light-blue/theme.css +842 -799
  93. package/dist/primereact/resources/themes/lara-light-cyan/fonts/Inter-italic.var.woff2 +0 -0
  94. package/dist/primereact/resources/themes/lara-light-cyan/fonts/Inter-roman.var.woff2 +0 -0
  95. package/dist/primereact/resources/themes/lara-light-cyan/theme.css +6041 -0
  96. package/dist/primereact/resources/themes/lara-light-green/fonts/Inter-italic.var.woff2 +0 -0
  97. package/dist/primereact/resources/themes/lara-light-green/fonts/Inter-roman.var.woff2 +0 -0
  98. package/dist/primereact/resources/themes/lara-light-green/theme.css +6041 -0
  99. package/dist/primereact/resources/themes/lara-light-indigo/theme.css +842 -799
  100. package/dist/primereact/resources/themes/lara-light-pink/fonts/Inter-italic.var.woff2 +0 -0
  101. package/dist/primereact/resources/themes/lara-light-pink/fonts/Inter-roman.var.woff2 +0 -0
  102. package/dist/primereact/resources/themes/lara-light-pink/theme.css +6041 -0
  103. package/dist/primereact/resources/themes/lara-light-purple/theme.css +842 -799
  104. package/dist/primereact/resources/themes/lara-light-teal/theme.css +1115 -1072
  105. package/dist/primereact/resources/themes/luna-amber/theme.css +103 -91
  106. package/dist/primereact/resources/themes/luna-blue/theme.css +103 -91
  107. package/dist/primereact/resources/themes/luna-green/theme.css +103 -91
  108. package/dist/primereact/resources/themes/luna-pink/theme.css +103 -91
  109. package/dist/primereact/resources/themes/md-dark-deeppurple/theme.css +147 -135
  110. package/dist/primereact/resources/themes/md-dark-indigo/theme.css +147 -135
  111. package/dist/primereact/resources/themes/md-light-deeppurple/theme.css +147 -135
  112. package/dist/primereact/resources/themes/md-light-indigo/theme.css +147 -135
  113. package/dist/primereact/resources/themes/mdc-dark-deeppurple/theme.css +147 -135
  114. package/dist/primereact/resources/themes/mdc-dark-indigo/theme.css +147 -135
  115. package/dist/primereact/resources/themes/mdc-light-deeppurple/theme.css +147 -135
  116. package/dist/primereact/resources/themes/mdc-light-indigo/theme.css +147 -135
  117. package/dist/primereact/resources/themes/mira/theme.css +108 -91
  118. package/dist/primereact/resources/themes/nano/theme.css +107 -91
  119. package/dist/primereact/resources/themes/nova/theme.css +103 -91
  120. package/dist/primereact/resources/themes/nova-accent/theme.css +103 -91
  121. package/dist/primereact/resources/themes/nova-alt/theme.css +103 -91
  122. package/dist/primereact/resources/themes/rhea/theme.css +103 -91
  123. package/dist/primereact/resources/themes/saga-blue/theme.css +103 -91
  124. package/dist/primereact/resources/themes/saga-green/theme.css +103 -91
  125. package/dist/primereact/resources/themes/saga-orange/theme.css +103 -91
  126. package/dist/primereact/resources/themes/saga-purple/theme.css +103 -91
  127. package/dist/primereact/resources/themes/soho-dark/theme.css +108 -91
  128. package/dist/primereact/resources/themes/soho-light/theme.css +108 -91
  129. package/dist/primereact/resources/themes/vela-blue/theme.css +103 -91
  130. package/dist/primereact/resources/themes/vela-green/theme.css +103 -91
  131. package/dist/primereact/resources/themes/vela-orange/theme.css +103 -91
  132. package/dist/primereact/resources/themes/vela-purple/theme.css +103 -91
  133. package/dist/primereact/resources/themes/viva-dark/theme.css +103 -91
  134. package/dist/primereact/resources/themes/viva-light/theme.css +103 -91
  135. package/package.json +29 -16
  136. package/tailwind.config.js +9 -2
  137. package/types/client-components/ClientLink.d.ts +6 -0
  138. package/types/client-components/MultiComponentEditor.d.ts +10 -0
  139. package/types/client-components/index.d.ts +2 -0
  140. package/types/components/Picture.d.ts +1 -0
  141. package/types/components/Placeholder.d.ts +16 -2
  142. package/types/components/RichTextEditor.d.ts +55 -55
  143. package/types/components/TextEditor.d.ts +54 -54
  144. package/types/editor/AiPopup.d.ts +10 -0
  145. package/types/editor/AiTerminal.d.ts +4 -3
  146. package/types/editor/ComponentPalette.d.ts +3 -4
  147. package/types/editor/ComponentTree.d.ts +1 -1
  148. package/types/editor/ConfirmationDialog.d.ts +19 -0
  149. package/types/editor/ContentTree.d.ts +7 -3
  150. package/types/editor/Debug.d.ts +1 -1
  151. package/types/editor/DialogButtons.d.ts +4 -0
  152. package/types/editor/DictionaryEditor.d.ts +3 -2
  153. package/types/editor/EditFrame.d.ts +4 -3
  154. package/types/editor/EditorClient.d.ts +4 -4
  155. package/types/editor/EditorClientHost.d.ts +4 -3
  156. package/types/editor/FieldListField.d.ts +4 -0
  157. package/types/editor/FloatingToolbar.d.ts +7 -0
  158. package/types/editor/ItemEditor.d.ts +4 -0
  159. package/types/editor/ItemInfo.d.ts +4 -0
  160. package/types/editor/ItemNameDialog.d.ts +10 -0
  161. package/types/editor/LinkEditorDialog.d.ts +15 -0
  162. package/types/editor/MainLayout.d.ts +6 -0
  163. package/types/editor/MediaSelector.d.ts +2 -1
  164. package/types/editor/PictureEditorDialog.d.ts +6 -0
  165. package/types/editor/SidebarTabs.d.ts +8 -0
  166. package/types/editor/Terminal.d.ts +3 -1
  167. package/types/editor/Utils.d.ts +3 -0
  168. package/types/editor/Workbox.d.ts +6 -0
  169. package/types/editor/componentCommands.d.ts +4 -0
  170. package/types/editor/contentService.d.ts +7 -1
  171. package/types/editor/editContext.d.ts +90 -19
  172. package/types/editor/editService.d.ts +9 -1
  173. package/types/editor/fieldTypes/CheckboxEditor.d.ts +4 -0
  174. package/types/editor/fieldTypes/InternalLinkFieldEditor.d.ts +4 -0
  175. package/types/editor/fieldTypes/LinkFieldEditor.d.ts +4 -0
  176. package/types/editor/fieldTypes/MultiLineText.d.ts +4 -0
  177. package/types/editor/fieldTypes/PictureFieldEditor.d.ts +4 -0
  178. package/types/editor/fieldTypes/TreeListEditor.d.ts +4 -0
  179. package/types/editor/ui/Section.d.ts +5 -0
  180. package/types/fieldTypes.d.ts +32 -17
  181. package/types/layoutData.d.ts +34 -9
  182. package/types/loadRouteData.d.ts +34 -5
  183. package/types/mediaProtection.d.ts +1 -0
  184. package/types/middleware/authorization.d.ts +2 -0
  185. package/types/middleware/index.d.ts +1 -0
  186. package/dist/cjs/editor/PageInfo.js +0 -12
  187. package/dist/esm/alpacaContext.js +0 -8
  188. package/dist/esm/components/Error.js +0 -10
  189. package/dist/esm/components/Image.js +0 -32
  190. package/dist/esm/components/Link.js +0 -29
  191. package/dist/esm/components/LinkEditor.js +0 -19
  192. package/dist/esm/components/Picture.js +0 -118
  193. package/dist/esm/components/PictureEditor.js +0 -41
  194. package/dist/esm/components/Placeholder.js +0 -69
  195. package/dist/esm/components/RichText.js +0 -40
  196. package/dist/esm/components/RichTextEditor.js +0 -52
  197. package/dist/esm/components/Slot.js +0 -5
  198. package/dist/esm/components/Text.js +0 -39
  199. package/dist/esm/components/TextEditor.js +0 -38
  200. package/dist/esm/components/Translate.js +0 -10
  201. package/dist/esm/components/index.js +0 -7
  202. package/dist/esm/editor/AiTerminal.js +0 -157
  203. package/dist/esm/editor/ComponentInfo.js +0 -10
  204. package/dist/esm/editor/ComponentPalette.js +0 -72
  205. package/dist/esm/editor/ComponentTree.js +0 -196
  206. package/dist/esm/editor/ContentTree.js +0 -117
  207. package/dist/esm/editor/Debug.js +0 -9
  208. package/dist/esm/editor/DictionaryEditor.js +0 -31
  209. package/dist/esm/editor/EditFrame.js +0 -57
  210. package/dist/esm/editor/EditHistory.js +0 -26
  211. package/dist/esm/editor/Editor.js +0 -23
  212. package/dist/esm/editor/EditorClient.js +0 -477
  213. package/dist/esm/editor/EditorClientHost.js +0 -7
  214. package/dist/esm/editor/FieldList.js +0 -60
  215. package/dist/esm/editor/GraphQL.js +0 -82
  216. package/dist/esm/editor/LanguageSelector.js +0 -17
  217. package/dist/esm/editor/MediaSelector.js +0 -54
  218. package/dist/esm/editor/PageInfo.js +0 -8
  219. package/dist/esm/editor/PlaceholderDropZone.js +0 -50
  220. package/dist/esm/editor/PlaceholderDropZoneHost.js +0 -7
  221. package/dist/esm/editor/Terminal.js +0 -47
  222. package/dist/esm/editor/TranslateEditor.js +0 -21
  223. package/dist/esm/editor/VersionSelector.js +0 -17
  224. package/dist/esm/editor/componentTreeHelper.js +0 -14
  225. package/dist/esm/editor/contentService.js +0 -31
  226. package/dist/esm/editor/editContext.js +0 -5
  227. package/dist/esm/editor/editService.js +0 -139
  228. package/dist/esm/editor/fieldTypes/RichTextEditor.js +0 -15
  229. package/dist/esm/editor/fieldTypes/SingleLineText.js +0 -13
  230. package/dist/esm/editor/index.js +0 -2
  231. package/dist/esm/fieldTypes.js +0 -1
  232. package/dist/esm/graphQLTypes.js +0 -1
  233. package/dist/esm/index.js +0 -7
  234. package/dist/esm/layoutData.js +0 -1
  235. package/dist/esm/loadRouteData.js +0 -123
  236. package/dist/esm/mediaProtection.js +0 -49
  237. package/types/editor/PageInfo.d.ts +0 -4
  238. /package/types/{editor → components}/TranslateEditor.d.ts +0 -0
@@ -20,61 +20,36 @@ const react_uuid_1 = __importDefault(require("react-uuid"));
20
20
  const api_1 = require("primereact/api");
21
21
  const menubar_1 = require("primereact/menubar");
22
22
  const progressspinner_1 = require("primereact/progressspinner");
23
- const tabview_1 = require("primereact/tabview");
24
23
  const toast_1 = require("primereact/toast");
25
24
  const splitter_1 = require("primereact/splitter");
26
25
  const blockui_1 = require("primereact/blockui");
27
26
  const confirmdialog_1 = require("primereact/confirmdialog");
28
- const sidebar_1 = require("primereact/sidebar");
29
27
  const __1 = require("..");
30
28
  const navigation_1 = require("next/navigation");
31
- const FieldList_1 = require("./FieldList");
32
- const GraphQL_1 = require("./GraphQL");
33
29
  const ComponentTree_1 = require("./ComponentTree");
34
- const ComponentInfo_1 = require("./ComponentInfo");
35
30
  const LanguageSelector_1 = require("./LanguageSelector");
36
31
  const componentTreeHelper_1 = require("./componentTreeHelper");
37
32
  const ComponentPalette_1 = require("./ComponentPalette");
38
- const DictionaryEditor_1 = require("./DictionaryEditor");
39
33
  const AiTerminal_1 = require("./AiTerminal");
40
34
  const EditHistory_1 = require("./EditHistory");
41
- const Debug_1 = require("./Debug");
42
- const PageInfo_1 = require("./PageInfo");
43
35
  const VersionSelector_1 = require("./VersionSelector");
44
36
  const editService_1 = require("./editService");
45
37
  require("../../editor.css");
46
- require("../../primereact/resources/primereact.min.css");
47
38
  require("../../primeicons/primeicons.css");
48
- require("../../primereact/resources/themes/lara-light-indigo/theme.css");
49
- // Hook
50
- function useEventListener(eventName, handler, element) {
51
- // Create a ref that stores handler
52
- const savedHandler = (0, react_1.useRef)();
53
- // Update ref.current value if handler changes.
54
- // This allows our effect below to always get latest handler ...
55
- // ... without us needing to pass it in effect deps array ...
56
- // ... and potentially cause effect to re-run every render.
57
- (0, react_1.useEffect)(() => {
58
- savedHandler.current = handler;
59
- }, [handler]);
60
- (0, react_1.useEffect)(() => {
61
- // Make sure element supports addEventListener
62
- // On
63
- const isSupported = element && element.addEventListener;
64
- if (!isSupported)
65
- return;
66
- // Create event listener that calls handler function stored in ref
67
- const eventListener = (event) => savedHandler.current(event);
68
- // Add event listener
69
- element.addEventListener(eventName, eventListener);
70
- // Remove event listener on cleanup
71
- return () => {
72
- element.removeEventListener(eventName, eventListener);
73
- };
74
- }, [eventName, element] // Re-run if eventName or element changes
75
- );
76
- }
77
- function EditorClient({ content, dictionaryObject, edit, children, }) {
39
+ //import "../../primereact/resources/themes/lara-light-indigo/theme.css";
40
+ require("../../primereact/resources/themes/md-light-indigo/theme.css");
41
+ const MediaSelector_1 = require("./MediaSelector");
42
+ const componentCommands_1 = require("./componentCommands");
43
+ const contentService_1 = require("./contentService");
44
+ const ConfirmationDialog_1 = __importDefault(require("./ConfirmationDialog"));
45
+ const SidebarTabs_1 = __importDefault(require("./SidebarTabs"));
46
+ const MainLayout_1 = __importDefault(require("./MainLayout"));
47
+ const button_1 = require("primereact/button");
48
+ const Utils_1 = require("./Utils");
49
+ const utils_1 = require("primereact/utils");
50
+ const ContentTree_1 = __importDefault(require("./ContentTree"));
51
+ const Workbox_1 = __importDefault(require("./Workbox"));
52
+ function EditorClient({ page, dictionaryObject, edit, site, children, }) {
78
53
  const router = (0, navigation_1.useRouter)();
79
54
  const pathname = (0, navigation_1.usePathname)();
80
55
  const searchParams = (0, navigation_1.useSearchParams)();
@@ -86,35 +61,115 @@ function EditorClient({ content, dictionaryObject, edit, children, }) {
86
61
  const [unresolvedDictionaryKeys, setUnresolvedDictionaryKeys] = (0, react_1.useState)([]);
87
62
  const [editData, setEditData] = (0, react_1.useState)(edit);
88
63
  const [refreshCompletedFlag, setRefreshCompletedFlag] = (0, react_1.useState)(false);
64
+ const [refreshing, setRefreshing] = (0, react_1.useState)(false);
89
65
  const [updateContentEditingFields, setUpdateContentEditingFields] = (0, react_1.useState)(false);
90
- const [page, setPageData] = (0, react_1.useState)(null);
91
66
  const [uiBlocked, setUiBlocked] = (0, react_1.useState)(false);
92
- const [componentsPaletteVisible, setComponentsPaletteVisible] = (0, react_1.useState)(false);
93
67
  const [dragObject, setDragObject] = (0, react_1.useState)();
94
- const [hidePalette, setHidePalette] = (0, react_1.useState)(false);
95
68
  const [refreshTimer, setRefreshTimer] = (0, react_1.useState)();
69
+ const [mediaResolver, setMediaResolver] = (0, react_1.useState)();
70
+ const [mediaSelectorVisible, setMediaSelectorVisible] = (0, react_1.useState)(false);
71
+ const [selectedMediaIdPath, setSelectedMediaIdPath] = (0, react_1.useState)("");
72
+ const [scrollIntoView, setScrollIntoView] = (0, react_1.useState)();
73
+ const [nextSelection, setNextSelection] = (0, react_1.useState)();
74
+ const editorContainerRef = (0, react_1.useRef)(null);
75
+ const confirmationDialogRef = (0, react_1.useRef)(null);
76
+ const [showRightSidebar, setShowRightSidebar] = (0, Utils_1.useLocalStorage)("alpaca-headless-editor-show-right-sidebar", false);
77
+ const [showTabsCenter, setShowTabsCenter] = (0, react_1.useState)(false);
78
+ const [item, setItem] = (0, react_1.useState)();
79
+ const [focusedField, setFocusedField] = (0, react_1.useState)();
80
+ const [device, setDevice] = (0, react_1.useState)("desktop");
81
+ const [zoom, setZoom] = (0, react_1.useState)(1);
82
+ const [scroll, setScroll] = (0, react_1.useState)(0);
83
+ const [fullscreen, setFullscreen] = (0, react_1.useState)(false);
84
+ const [showFullscreenHint, setShowFullscreenHint] = (0, react_1.useState)(false);
96
85
  const sessionId = searchParams.get("session");
97
86
  if (!sessionId)
98
87
  return;
88
+ const hasUnsavedChanges = () => edit.operations.filter((op) => !op.isCommitted).length;
89
+ function ensureSavedBeforeLeaving(callback, title) {
90
+ var _a;
91
+ if (!hasUnsavedChanges()) {
92
+ callback();
93
+ return;
94
+ }
95
+ (_a = confirmationDialogRef.current) === null || _a === void 0 ? void 0 : _a.confirm({
96
+ message: "You have unsaved changes.",
97
+ header: title || "Close document",
98
+ icon: "pi pi-exclamation-triangle",
99
+ acceptLabel: "Save changes",
100
+ rejectLabel: "Discard changes",
101
+ showCancel: true,
102
+ accept: () => saveAndRefresh(callback),
103
+ reject: () => {
104
+ callback();
105
+ },
106
+ });
107
+ }
108
+ function loadUrl(url) {
109
+ setRefreshing(true);
110
+ router.push(url, { scroll: false });
111
+ }
112
+ function createAndSwitchToNewVersion() {
113
+ ensureSavedBeforeLeaving(() => __awaiter(this, void 0, void 0, function* () {
114
+ yield (0, editService_1.createVersion)(getPageItemDescriptor(), sessionId);
115
+ const current = new URLSearchParams(Array.from(searchParams.entries()));
116
+ current.delete("version");
117
+ current.set("session", (0, react_uuid_1.default)());
118
+ const newUrl = `${pathname}?${current.toString()}`;
119
+ router.push(newUrl, { scroll: false });
120
+ }), "Create version");
121
+ }
99
122
  function switchLanguage(language) {
100
- const current = new URLSearchParams(Array.from(searchParams.entries()));
101
- current.set("language", language);
102
- const newUrl = `${pathname}?${current.toString()}`;
103
- router.replace(newUrl, { scroll: false });
123
+ ensureSavedBeforeLeaving(() => __awaiter(this, void 0, void 0, function* () {
124
+ const current = new URLSearchParams(Array.from(searchParams.entries()));
125
+ current.set("language", language);
126
+ current.delete("version");
127
+ current.set("session", (0, react_uuid_1.default)());
128
+ const newUrl = `${pathname}?${current.toString()}`;
129
+ loadUrl(newUrl);
130
+ }));
104
131
  }
105
132
  function switchVersion(version) {
106
- const current = new URLSearchParams(Array.from(searchParams.entries()));
107
- current.set("version", version.toString());
108
- const newUrl = `${pathname}?${current.toString()}`;
109
- router.replace(newUrl, { scroll: false });
133
+ ensureSavedBeforeLeaving(() => __awaiter(this, void 0, void 0, function* () {
134
+ const current = new URLSearchParams(Array.from(searchParams.entries()));
135
+ current.set("version", version.toString());
136
+ current.set("session", (0, react_uuid_1.default)());
137
+ const newUrl = `${pathname}?${current.toString()}`;
138
+ loadUrl(newUrl);
139
+ }));
140
+ }
141
+ function navigateToPage(pageId) {
142
+ ensureSavedBeforeLeaving(() => __awaiter(this, void 0, void 0, function* () {
143
+ const current = new URLSearchParams(Array.from(searchParams.entries()));
144
+ current.set("itemid", pageId);
145
+ current.delete("version");
146
+ current.set("session", (0, react_uuid_1.default)());
147
+ const newUrl = `${pathname}?${current.toString()}`;
148
+ setNextSelection([]);
149
+ setItem(undefined);
150
+ loadUrl(newUrl);
151
+ }));
152
+ }
153
+ function loadItem(itemToLoad) {
154
+ return __awaiter(this, void 0, void 0, function* () {
155
+ const isNewItem = itemToLoad.id != (item === null || item === void 0 ? void 0 : item.id) ||
156
+ itemToLoad.language != (item === null || item === void 0 ? void 0 : item.language) ||
157
+ itemToLoad.version != (item === null || item === void 0 ? void 0 : item.version);
158
+ const isPageItem = itemToLoad.id == page.id && itemToLoad.language == page.language;
159
+ if (isNewItem && !isPageItem) {
160
+ const result = yield (0, contentService_1.getItem)(page, itemToLoad, sessionId);
161
+ setItem(result);
162
+ }
163
+ });
110
164
  }
111
165
  function handleErrorResult(result) {
166
+ var _a;
112
167
  if (result.type === "error") {
113
168
  showErrorToast(result);
114
169
  return true;
115
170
  }
116
171
  if (result.type === "unauthenticated") {
117
- (0, confirmdialog_1.confirmDialog)({
172
+ (_a = confirmationDialogRef.current) === null || _a === void 0 ? void 0 : _a.confirm({
118
173
  header: "Not logged in",
119
174
  message: "You are not logged in anymore. Proceed to login page?",
120
175
  accept: () => {
@@ -131,6 +186,7 @@ function EditorClient({ content, dictionaryObject, edit, children, }) {
131
186
  }, [selection]);
132
187
  (0, react_1.useEffect)(() => {
133
188
  const sync = () => __awaiter(this, void 0, void 0, function* () {
189
+ var _a;
134
190
  if (currentEditOperation) {
135
191
  const result = yield (0, editService_1.executeEditOperation)(currentEditOperation, sessionId);
136
192
  if (handleErrorResult(result))
@@ -140,12 +196,20 @@ function EditorClient({ content, dictionaryObject, edit, children, }) {
140
196
  result.id) {
141
197
  edit.operations = edit.operations.filter((x) => !x.undone);
142
198
  edit.operations.push(result);
143
- setEditData(Object.assign({}, edit));
144
199
  }
145
- if (result.type === "add-component" ||
200
+ else {
201
+ const lastOp = edit.operations.findLast((x) => x);
202
+ if (lastOp === null || lastOp === void 0 ? void 0 : lastOp.isCommitted) {
203
+ lastOp.isCommitted = false;
204
+ }
205
+ }
206
+ setEditData(Object.assign({}, edit));
207
+ if (result.type == "move-component" ||
208
+ result.type === "add-component" ||
146
209
  result.type === "link-component") {
147
- console.log("CURRENT: " + JSON.stringify(result));
148
- setSelection([result.componentId]);
210
+ setNextSelection([(_a = result.component) === null || _a === void 0 ? void 0 : _a.id]);
211
+ requestRefresh("immediate");
212
+ return;
149
213
  }
150
214
  if (!currentEditOperation.noRefresh)
151
215
  requestRefresh(currentEditOperation.refreshAfterQuietPeriod
@@ -155,12 +219,66 @@ function EditorClient({ content, dictionaryObject, edit, children, }) {
155
219
  });
156
220
  sync();
157
221
  }, [currentEditOperation]);
222
+ const ensureLock = (field) => __awaiter(this, void 0, void 0, function* () {
223
+ if (!field || !field.item)
224
+ return;
225
+ if (!field.hasLock) {
226
+ lockItemAndRefresh(field.item);
227
+ }
228
+ });
229
+ const lockItemAndRefresh = (item) => __awaiter(this, void 0, void 0, function* () {
230
+ yield (0, editService_1.lockItem)(item);
231
+ requestRefresh("immediate");
232
+ });
233
+ const executeWorkflowCommandAndRefresh = (item, commandId) => __awaiter(this, void 0, void 0, function* () {
234
+ yield (0, editService_1.executeWorkflowCommand)(item, commandId, "");
235
+ requestRefresh("immediate");
236
+ });
237
+ (0, react_1.useEffect)(() => {
238
+ if (focusedField === null || focusedField === void 0 ? void 0 : focusedField.item) {
239
+ if (!getComponentById(focusedField.item.id))
240
+ loadItem(focusedField.item);
241
+ ensureLock(focusedField);
242
+ }
243
+ }, [focusedField]);
244
+ const addParentComponentReferencesToPlaceholders = (component) => {
245
+ component.placeholders.forEach((p) => {
246
+ p.parentComponent = component;
247
+ });
248
+ };
249
+ (0, react_1.useEffect)(() => {
250
+ var _a;
251
+ setRefreshCompletedFlag(!refreshCompletedFlag);
252
+ if (nextSelection) {
253
+ setSelection(nextSelection);
254
+ setNextSelection(undefined);
255
+ }
256
+ setLiveUpdatingFields([]);
257
+ page === null || page === void 0 ? void 0 : page.placeholders.forEach((p) => {
258
+ p.components.forEach((c) => {
259
+ addParentComponentReferencesToPlaceholders(c);
260
+ });
261
+ });
262
+ if ((page === null || page === void 0 ? void 0 : page.versions.length) === 0) {
263
+ (_a = confirmationDialogRef.current) === null || _a === void 0 ? void 0 : _a.confirm({
264
+ message: "This page has no version in language " +
265
+ (page === null || page === void 0 ? void 0 : page.language) +
266
+ ". Do you want to create a new version?",
267
+ header: "Create Version?",
268
+ icon: "pi pi-exclamation-triangle",
269
+ acceptLabel: "Yes, create version",
270
+ rejectLabel: "No",
271
+ accept: () => createAndSwitchToNewVersion(),
272
+ });
273
+ }
274
+ setRefreshing(false);
275
+ }, [page]);
158
276
  const requestRefresh = (mode) => {
159
277
  if (mode === "immediate") {
160
278
  console.log("Immediate refresh requested");
161
279
  clearTimeout(refreshTimer);
280
+ setRefreshing(true);
162
281
  router.refresh();
163
- setRefreshCompletedFlag(!refreshCompletedFlag);
164
282
  setRefreshTimer(undefined);
165
283
  return;
166
284
  }
@@ -172,9 +290,9 @@ function EditorClient({ content, dictionaryObject, edit, children, }) {
172
290
  setRefreshTimer(setTimeout(() => {
173
291
  console.log("refreshing");
174
292
  router.refresh();
175
- setRefreshCompletedFlag(!refreshCompletedFlag);
293
+ setRefreshing(true);
176
294
  setRefreshTimer(undefined);
177
- }, mode === "waitForQuietPeriod" ? 2000 : 1000));
295
+ }, mode === "waitForQuietPeriod" ? 2000 : 700));
178
296
  }
179
297
  };
180
298
  const saveAndRefresh = (callback) => __awaiter(this, void 0, void 0, function* () {
@@ -188,7 +306,9 @@ function EditorClient({ content, dictionaryObject, edit, children, }) {
188
306
  setUiBlocked(false);
189
307
  return;
190
308
  }
309
+ setCurrentEditOperation(undefined);
191
310
  router.refresh();
311
+ setRefreshing(true);
192
312
  //setEditOperations([]);
193
313
  setUiBlocked(false);
194
314
  toast.current.show({
@@ -200,19 +320,10 @@ function EditorClient({ content, dictionaryObject, edit, children, }) {
200
320
  if (callback)
201
321
  callback();
202
322
  });
203
- // function ensureSaved(callback: () => void) {
204
- // if (!edit.operations.length) {
205
- // callback();
206
- // return;
207
- // }
208
- // confirmDialog({
209
- // message: "Save changes?",
210
- // header: "Save changes?",
211
- // icon: "pi pi-exclamation-triangle",
212
- // accept: () => saveAndRefresh(callback),
213
- // reject: callback,
214
- // });
215
- // }
323
+ (0, react_1.useEffect)(() => {
324
+ if (fullscreen)
325
+ setShowFullscreenHint(true);
326
+ }, [fullscreen]);
216
327
  function handleKeyDown(event) {
217
328
  return __awaiter(this, void 0, void 0, function* () {
218
329
  if (event.ctrlKey && event.key === "s") {
@@ -227,14 +338,16 @@ function EditorClient({ content, dictionaryObject, edit, children, }) {
227
338
  event.preventDefault();
228
339
  yield redo();
229
340
  }
341
+ if (event.ctrlKey && event.key === "F11") {
342
+ event.preventDefault();
343
+ console.log("toggle fullscreen");
344
+ setFullscreen(!fullscreen);
345
+ }
230
346
  });
231
347
  }
232
348
  if (typeof window !== "undefined")
233
- useEventListener("keydown", handleKeyDown, window);
349
+ (0, Utils_1.useEventListenerExt)("keydown", handleKeyDown, window);
234
350
  const toast = (0, react_1.useRef)();
235
- (0, react_1.useEffect)(() => {
236
- setPageData(content);
237
- }, [content]);
238
351
  (0, react_1.useEffect)(() => {
239
352
  setEditData(edit);
240
353
  }, [edit]);
@@ -249,6 +362,7 @@ function EditorClient({ content, dictionaryObject, edit, children, }) {
249
362
  let result = yield (0, editService_1.executeRedo)(sessionId);
250
363
  if (result.type === "success") {
251
364
  router.refresh();
365
+ setRefreshing(true);
252
366
  return true;
253
367
  }
254
368
  else {
@@ -265,12 +379,13 @@ function EditorClient({ content, dictionaryObject, edit, children, }) {
265
379
  life: 3000,
266
380
  });
267
381
  }
268
- function undo() {
382
+ function undo(numOperations) {
269
383
  return __awaiter(this, void 0, void 0, function* () {
270
384
  setUpdateContentEditingFields(!updateContentEditingFields);
271
- let result = yield (0, editService_1.executeUndo)(sessionId);
385
+ let result = yield (0, editService_1.executeUndo)(sessionId, numOperations);
272
386
  if (result.type === "success") {
273
387
  router.refresh();
388
+ setRefreshing(true);
274
389
  return true;
275
390
  }
276
391
  else {
@@ -279,206 +394,360 @@ function EditorClient({ content, dictionaryObject, edit, children, }) {
279
394
  }
280
395
  });
281
396
  }
397
+ const getLiveFieldIfExists = (field) => {
398
+ const existingField = liveUpdatingFields.find((f) => {
399
+ var _a, _b, _c, _d, _e, _f;
400
+ return f.id === field.id &&
401
+ ((_a = f.item) === null || _a === void 0 ? void 0 : _a.language) === ((_b = field.item) === null || _b === void 0 ? void 0 : _b.language) &&
402
+ ((_c = f.item) === null || _c === void 0 ? void 0 : _c.version) === ((_d = field.item) === null || _d === void 0 ? void 0 : _d.version) &&
403
+ ((_e = f.item) === null || _e === void 0 ? void 0 : _e.id) === ((_f = field.item) === null || _f === void 0 ? void 0 : _f.id);
404
+ });
405
+ if (existingField)
406
+ return existingField;
407
+ return null;
408
+ };
282
409
  const getLiveField = (field) => {
283
- const existingField = liveUpdatingFields.find((f) => f.id === field.id &&
284
- f.language === field.language &&
285
- f.version === field.version &&
286
- f.itemId === field.itemId);
410
+ const existingField = liveUpdatingFields.find((f) => {
411
+ var _a, _b, _c, _d, _e, _f;
412
+ return f.id === field.id &&
413
+ ((_a = f.item) === null || _a === void 0 ? void 0 : _a.language) === ((_b = field.item) === null || _b === void 0 ? void 0 : _b.language) &&
414
+ ((_c = f.item) === null || _c === void 0 ? void 0 : _c.version) === ((_d = field.item) === null || _d === void 0 ? void 0 : _d.version) &&
415
+ ((_e = f.item) === null || _e === void 0 ? void 0 : _e.id) === ((_f = field.item) === null || _f === void 0 ? void 0 : _f.id);
416
+ });
287
417
  if (existingField)
288
418
  return existingField;
289
- setLiveUpdatingFields([...liveUpdatingFields, field]);
419
+ liveUpdatingFields.push(field);
290
420
  return field;
291
421
  };
292
- const selectedComponent = selection.length === 1 && page ? getComponentById(selection[0]) : null;
293
- const editField = (field, value, noRefresh = true) => {
294
- var _a;
422
+ const editField = ({ field, value, rawValue, refresh = "immediate", }) => {
423
+ var _a, _b;
295
424
  if (!page)
296
425
  return;
297
- const component = (0, componentTreeHelper_1.findComponent)(field.itemId, page.placeholders);
426
+ const component = (0, componentTreeHelper_1.findComponent)(field.item.id, page.placeholders);
298
427
  let op = editService_1.currentOperation;
299
428
  if (!op ||
300
429
  op.type !== "edit-field" ||
301
- op.itemId !== field.itemId ||
430
+ op.itemId !== ((_a = field.item) === null || _a === void 0 ? void 0 : _a.id) ||
302
431
  op.fieldId !== field.id ||
303
- op.language !== field.language ||
304
- op.version !== field.version) {
432
+ op.language !== field.item.language ||
433
+ op.version !== field.item.version ||
434
+ op.isCommitted) {
305
435
  op = {
306
436
  type: "edit-field",
307
- itemId: field.itemId,
437
+ itemId: field.item.id,
308
438
  fieldId: field.id,
309
- version: field.version,
310
- language: field.language,
439
+ version: field.item.version,
440
+ language: field.item.language,
311
441
  fieldName: field.name,
312
- itemName: field.itemId == page.id ? "Page" : (_a = component === null || component === void 0 ? void 0 : component.name) !== null && _a !== void 0 ? _a : "<unknown>",
313
- pageItemId: page.id,
314
- pageItemLanguage: page.language,
315
- pageItemVersion: page.version,
442
+ itemName: field.item.id == page.id ? "Page" : (_b = component === null || component === void 0 ? void 0 : component.name) !== null && _b !== void 0 ? _b : "<unknown>",
443
+ pageItem: getPageItemDescriptor(),
316
444
  date: new Date(),
317
445
  id: (0, react_uuid_1.default)(),
318
446
  };
319
447
  }
320
448
  op.date = new Date();
321
- op.noRefresh = noRefresh;
322
- op.refreshAfterQuietPeriod = !noRefresh;
323
- op.value = value;
324
- getLiveField(field).value = value;
325
- function getField(fields, id) {
326
- return Object.values(fields).find((f) => f.id === id);
327
- }
328
- if (component) {
329
- const f = getField(component.fields, field.id);
330
- if (f && f.value != value) {
331
- f.value = value;
332
- }
333
- }
334
- else {
335
- const f = getField(page.fields, field.id);
336
- if (f && f.value != value)
337
- f.value = value;
449
+ op.noRefresh = refresh === "none" || refresh === "immediate";
450
+ op.refreshAfterQuietPeriod = refresh === "waitForQuietPeriod";
451
+ op.value = rawValue !== null && rawValue !== void 0 ? rawValue : value;
452
+ op.isCommitted = false;
453
+ const firstEditInheritedComponent = (component === null || component === void 0 ? void 0 : component.isInheritedFromMasterLanguage) && op.language != page.language;
454
+ if (firstEditInheritedComponent)
455
+ op.language = page.language;
456
+ if (value || value === "") {
457
+ const liveField = getLiveField(field);
458
+ liveField.value = value;
459
+ liveField.rawValue = op.value;
338
460
  }
339
461
  (0, editService_1.setCurrentOperation)(op);
340
462
  setCurrentEditOperation(Object.assign({}, op));
463
+ if (refresh == "immediate" || firstEditInheritedComponent)
464
+ requestRefresh("immediate");
341
465
  };
342
- const menuItems = [
343
- {
344
- label: "Save",
345
- icon: "pi pi-fw pi-save text-red",
346
- command: () => saveAndRefresh(),
466
+ const selectMedia = (0, react_1.useCallback)(({ selectedIdPath }) => {
467
+ setSelectedMediaIdPath(selectedIdPath);
468
+ setMediaSelectorVisible(true);
469
+ return new Promise((resolve) => {
470
+ setMediaResolver(() => resolve);
471
+ });
472
+ }, []);
473
+ const onMediaSelect = (0, react_1.useCallback)((mediaUrl) => {
474
+ mediaResolver === null || mediaResolver === void 0 ? void 0 : mediaResolver(mediaUrl);
475
+ setMediaSelectorVisible(false);
476
+ setMediaResolver(undefined);
477
+ }, [mediaResolver]);
478
+ function getPageItemDescriptor() {
479
+ return {
480
+ id: page.id,
481
+ language: page.language,
482
+ version: page.version,
483
+ };
484
+ }
485
+ const editContext = {
486
+ sessionId: sessionId,
487
+ editorContainerRef,
488
+ selection,
489
+ setSelection,
490
+ selectedForInsertion,
491
+ setSelectedForInsertion,
492
+ editField,
493
+ getComponentById,
494
+ dragObject,
495
+ dictionary,
496
+ setDictionary,
497
+ requestRefresh,
498
+ refreshCompletedFlag,
499
+ unresolvedDictionaryKeys,
500
+ setUnresolvedDictionaryKeys,
501
+ updateContentEditingFields,
502
+ getLiveField,
503
+ getLiveFieldIfExists,
504
+ selectMedia,
505
+ showToast: () => { },
506
+ scrollIntoView,
507
+ setScrollIntoView,
508
+ focusedField,
509
+ setFocusedField,
510
+ zoom,
511
+ fullscreen,
512
+ undo,
513
+ getPictureFieldValue: (field, rawValue) => __awaiter(this, void 0, void 0, function* () {
514
+ return (0, editService_1.getPictureValue)(field, rawValue, site, sessionId);
515
+ }),
516
+ // removeComponents: deleteComponents,
517
+ // removeSelectedComponents: deleteSelectedComponents,
518
+ getComponentCommands: (components) => {
519
+ return (0, componentCommands_1.getComponentCommands)(components, editContext);
347
520
  },
348
- {
349
- label: "Insert",
350
- icon: "pi pi-fw pi-sitemap",
351
- command: () => setComponentsPaletteVisible(true),
521
+ dragStart: (dragObject) => {
522
+ // console.log("dragging " + JSON.stringify(dragObject));
523
+ setDragObject(dragObject);
352
524
  },
353
- ];
354
- const spinner = (0, jsx_runtime_1.jsx)(progressspinner_1.ProgressSpinner, {});
355
- const endContent = ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(LanguageSelector_1.LanguageSelector, { page: page, onLanguageSelected: (language) => {
356
- if (!language)
357
- return;
358
- //ensureSaved(() => switchLanguage(language));
359
- switchLanguage(language);
360
- } }), (0, jsx_runtime_1.jsx)(VersionSelector_1.VersionSelector, { page: page, onVersionSelected: (version) => {
361
- switchVersion(version);
362
- } })] }));
363
- return ((0, jsx_runtime_1.jsxs)(__1.EditContextProvider, { value: {
364
- sessionId: sessionId,
365
- selection,
366
- setSelection,
367
- selectedForInsertion,
368
- setSelectedForInsertion,
369
- editField,
370
- getComponentById,
371
- dragObject,
372
- dictionary,
373
- setDictionary,
374
- requestRefresh,
375
- refreshCompletedFlag,
376
- unresolvedDictionaryKeys,
377
- setUnresolvedDictionaryKeys,
378
- updateContentEditingFields,
379
- getLiveField,
380
- showToast: () => { },
381
- removeComponent: (componentId, callback) => {
382
- (0, confirmdialog_1.confirmDialog)({
383
- message: "Are you sure you want to remove this component?",
384
- header: "Remove component",
385
- icon: "pi pi-exclamation-triangle",
386
- accept: () => {
387
- var _a;
388
- const op = {
389
- type: "remove-component",
390
- date: new Date(),
391
- id: (0, react_uuid_1.default)(),
392
- pageItemId: page.id,
393
- pageItemLanguage: page.language,
394
- pageItemVersion: page.version,
395
- componentId,
396
- componentName: (_a = getComponentById(componentId)) === null || _a === void 0 ? void 0 : _a.name,
397
- };
398
- setCurrentEditOperation(op);
399
- callback(true);
525
+ droppedInPlaceholder: (placeholderKey, index) => __awaiter(this, void 0, void 0, function* () {
526
+ if (!dragObject)
527
+ return;
528
+ console.log(dragObject.templateId + " dropped in " + placeholderKey + " " + index);
529
+ // console.log(JSON.stringify(page));
530
+ const placeholderKeyComponents = placeholderKey.split("_");
531
+ const parentId = placeholderKeyComponents.length === 1
532
+ ? null
533
+ : placeholderKeyComponents[0];
534
+ if (parentId)
535
+ setSelection([parentId]);
536
+ const placeholderName = placeholderKeyComponents.length === 1
537
+ ? placeholderKeyComponents[0]
538
+ : placeholderKeyComponents[1];
539
+ let op;
540
+ if (dragObject.type == "template") {
541
+ op = {
542
+ type: "add-component",
543
+ pageItem: getPageItemDescriptor(),
544
+ parent: parentId && {
545
+ id: parentId,
546
+ language: page.language,
547
+ version: page.version,
400
548
  },
401
- });
402
- },
403
- openComponentPalette: () => setComponentsPaletteVisible(true),
404
- dragStart: (dragObject) => {
405
- console.log("dragging " + JSON.stringify(dragObject));
406
- setDragObject(dragObject);
407
- },
408
- droppedInPlaceholder: (placeholderKey, index) => __awaiter(this, void 0, void 0, function* () {
409
- if (!dragObject)
410
- return;
411
- console.log(dragObject.templateId +
412
- " dropped in " +
413
- placeholderKey +
414
- " " +
415
- index);
416
- // console.log(JSON.stringify(page));
417
- const placeholderKeyComponents = placeholderKey.split("_");
418
- const parentId = placeholderKeyComponents.length === 1
419
- ? null
420
- : placeholderKeyComponents[0];
421
- const placeholderName = placeholderKeyComponents.length === 1
422
- ? placeholderKeyComponents[0]
423
- : placeholderKeyComponents[1];
424
- let op;
425
- if (dragObject.type == "template") {
549
+ placeholderName: placeholderName,
550
+ placeholderIndex: index,
551
+ templateId: dragObject === null || dragObject === void 0 ? void 0 : dragObject.templateId,
552
+ date: new Date(),
553
+ id: (0, react_uuid_1.default)(),
554
+ };
555
+ }
556
+ if (dragObject.type == "component" ||
557
+ (dragObject.type == "link-component" && dragObject.component)) {
558
+ const parentComponent = parentId ? getComponentById(parentId) : null;
559
+ if (dragObject.type == "link-component") {
426
560
  op = {
427
- type: "add-component",
428
- pageItemId: page.id,
429
- pageItemLanguage: page.language,
430
- pageItemVersion: page.version,
431
- parentItemId: parentId,
561
+ type: "link-component",
562
+ pageItem: getPageItemDescriptor(),
563
+ parent: parentId && {
564
+ id: parentId,
565
+ language: page.language,
566
+ version: page.version,
567
+ name: parentComponent === null || parentComponent === void 0 ? void 0 : parentComponent.name,
568
+ },
432
569
  placeholderName: placeholderName,
433
570
  placeholderIndex: index,
434
- templateId: dragObject === null || dragObject === void 0 ? void 0 : dragObject.templateId,
435
571
  date: new Date(),
436
572
  id: (0, react_uuid_1.default)(),
573
+ linkedComponentItem: dragObject.component,
437
574
  };
438
575
  }
439
- if (dragObject.type == "component" ||
440
- (dragObject.type == "link-component" && dragObject.componentId)) {
576
+ else {
441
577
  op = {
442
- type: dragObject.type == "link-component"
443
- ? "link-component"
444
- : "move-component",
445
- pageItemId: page.id,
446
- pageItemLanguage: page.language,
447
- pageItemVersion: page.version,
448
- parentItemId: parentId,
578
+ type: "move-component",
579
+ pageItem: getPageItemDescriptor(),
580
+ parent: parentId && {
581
+ id: parentId,
582
+ language: page.language,
583
+ version: page.version,
584
+ name: parentComponent === null || parentComponent === void 0 ? void 0 : parentComponent.name,
585
+ },
449
586
  placeholderName: placeholderName,
450
587
  placeholderIndex: index,
451
- componentId: dragObject.componentId,
588
+ component: dragObject.component,
452
589
  date: new Date(),
453
590
  id: (0, react_uuid_1.default)(),
454
591
  };
455
592
  }
456
- //const newOps = [...editOperations, op];
457
- //setEditOperations();
458
- // await sendEditOperationsToServer(newOps as EditOperation[]);
459
- // router.refresh();
460
- //setEditOperations(newOps);
461
- if (op)
462
- setCurrentEditOperation(op);
463
- setDragObject(undefined);
464
- }),
465
- }, children: [(0, jsx_runtime_1.jsx)(toast_1.Toast, { ref: toast }), (0, jsx_runtime_1.jsxs)(api_1.PrimeReactProvider, { children: [(0, jsx_runtime_1.jsx)(confirmdialog_1.ConfirmDialog, {}), (0, jsx_runtime_1.jsx)(sidebar_1.Sidebar, { style: { width: "40%" }, visible: componentsPaletteVisible, position: "right", onHide: () => setComponentsPaletteVisible(false), header: "Insert component", pt: {
466
- mask: {
467
- onDragOver: () => setHidePalette(true),
468
- style: {
469
- left: hidePalette || !componentsPaletteVisible ? "100vw" : 0,
470
- },
471
- },
472
- }, children: page && ((0, jsx_runtime_1.jsx)(ComponentPalette_1.ComponentPalette, { page: page, selection: selection, dragStart: (dragObject) => {
473
- //console.log("dragging " + JSON.stringify(dragObject));
474
- setDragObject(dragObject);
475
- }, dragEnd: () => {
476
- setDragObject(undefined);
477
- if (hidePalette) {
478
- setComponentsPaletteVisible(false);
479
- setHidePalette(false);
480
- }
481
- setSelectedForInsertion("");
482
- } })) }), (0, jsx_runtime_1.jsxs)(blockui_1.BlockUI, { blocked: uiBlocked, template: spinner, children: [(0, jsx_runtime_1.jsx)(menubar_1.Menubar, { model: menuItems, end: endContent }), (0, jsx_runtime_1.jsxs)(splitter_1.Splitter, { children: [(0, jsx_runtime_1.jsx)(splitter_1.SplitterPanel, { size: 30, className: "alpaca-overflow-scroll", children: (0, jsx_runtime_1.jsxs)(splitter_1.Splitter, { layout: "vertical", children: [(0, jsx_runtime_1.jsx)(splitter_1.SplitterPanel, { size: 30, className: "a-overflow-hidden a-relative", children: (0, jsx_runtime_1.jsx)("div", { className: "a-inset-0 a-absolute a-overflow-y-auto", children: (0, jsx_runtime_1.jsx)(ComponentTree_1.ComponentTree, { page: page, selection: selection }) }) }), (0, jsx_runtime_1.jsx)(splitter_1.SplitterPanel, { className: "alpaca-editor-tabs", children: (0, jsx_runtime_1.jsxs)(tabview_1.TabView, { className: "a-inset-0 a-absolute", scrollable: true, children: [selectedComponent && ((0, jsx_runtime_1.jsxs)(tabview_1.TabPanel, { header: "Fields", children: [(0, jsx_runtime_1.jsx)(ComponentInfo_1.ComponentInfo, { component: selectedComponent }), (0, jsx_runtime_1.jsx)(FieldList_1.FieldList, { fields: selectedComponent.fields })] })), selectedComponent && ((0, jsx_runtime_1.jsx)(tabview_1.TabPanel, { header: "GraphQL", style: { height: "100%" }, children: (0, jsx_runtime_1.jsx)(GraphQL_1.GraphQL, { component: selectedComponent }) })), (0, jsx_runtime_1.jsxs)(tabview_1.TabPanel, { header: "Page", children: [page && (0, jsx_runtime_1.jsx)(PageInfo_1.PageInfo, { page: page }), page && (0, jsx_runtime_1.jsx)(FieldList_1.FieldList, { fields: page.fields })] }), (0, jsx_runtime_1.jsx)(tabview_1.TabPanel, { header: "Dictionary", children: (0, jsx_runtime_1.jsx)(DictionaryEditor_1.DictionaryEditor, { dictionary: dictionary }) }), (0, jsx_runtime_1.jsx)(tabview_1.TabPanel, { header: "Debug", children: (0, jsx_runtime_1.jsx)(Debug_1.Debug, { component: selectedComponent, page: page }) })] }) })] }) }), (0, jsx_runtime_1.jsx)(splitter_1.SplitterPanel, { size: 55, className: "alpaca-overflow-scroll alpaca-editor-content", children: (0, jsx_runtime_1.jsx)("div", { onDragEndCapture: () => setDragObject(undefined), className: "alpaca-editor-container", children: children }) }), (0, jsx_runtime_1.jsx)(splitter_1.SplitterPanel, { size: 15, children: (0, jsx_runtime_1.jsxs)(splitter_1.Splitter, { layout: "vertical", className: "alpaca-editor", children: [(0, jsx_runtime_1.jsx)(splitter_1.SplitterPanel, { className: "overflow-hidden a-relative", children: (0, jsx_runtime_1.jsx)(EditHistory_1.EditHistory, { operations: editData === null || editData === void 0 ? void 0 : editData.operations }) }), (0, jsx_runtime_1.jsx)(splitter_1.SplitterPanel, { className: "overflow-hidden a-relative", children: (0, jsx_runtime_1.jsx)(AiTerminal_1.AiTerminal, { selection: selection, requestRefresh: requestRefresh }) })] }) })] })] })] })] }));
593
+ }
594
+ //const newOps = [...editOperations, op];
595
+ //setEditOperations();
596
+ // await sendEditOperationsToServer(newOps as EditOperation[]);
597
+ // router.refresh();
598
+ //setEditOperations(newOps);
599
+ if (op)
600
+ setCurrentEditOperation(op);
601
+ setDragObject(undefined);
602
+ }),
603
+ executeEditOperation: (op) => {
604
+ setCurrentEditOperation(op);
605
+ },
606
+ page,
607
+ scroll,
608
+ };
609
+ const selectedComponents = selection
610
+ .map((x) => getComponentById(x))
611
+ .filter((x) => x);
612
+ const selectedComponent = selectedComponents.length === 1 ? selectedComponents[0] : null;
613
+ const componentCommands = (0, componentCommands_1.getComponentCommands)(selectedComponents, editContext);
614
+ const insertingPlaceholderKeys = [editContext.selectedForInsertion]
615
+ .map((x) => editContext.getComponentById(x))
616
+ .filter((x) => x)
617
+ .reduce((a, x) => a.concat(x.placeholders.map((y) => y.key)), []);
618
+ const selectedPlaceholderKeys = [
619
+ //...selection.filter((x) => x.indexOf("_") > 0),
620
+ ...insertingPlaceholderKeys,
621
+ ];
622
+ const currentInsertOptions = collectInsertOptions(page, selectedPlaceholderKeys);
623
+ function collectInsertOptions(page, placeholderKeys) {
624
+ const insertOptionsMap = new Map();
625
+ function traverse(placeholders) {
626
+ for (const placeholder of placeholders) {
627
+ if (placeholder.insertOptions &&
628
+ (placeholderKeys.length === 0 ||
629
+ placeholderKeys.includes(placeholder.key))) {
630
+ for (const option of placeholder.insertOptions) {
631
+ insertOptionsMap.set(option.id, option);
632
+ }
633
+ }
634
+ for (const component of placeholder.components) {
635
+ traverse(component.placeholders);
636
+ }
637
+ }
638
+ }
639
+ traverse(page.placeholders);
640
+ // Convert the map back into an array of objects
641
+ const insertOptionsArray = Array.from(insertOptionsMap.values());
642
+ insertOptionsArray.sort((a, b) => a.name.localeCompare(b.name));
643
+ return insertOptionsArray;
644
+ }
645
+ const componentCommandMenuItems = componentCommands.map((x) => {
646
+ return {
647
+ label: x.label,
648
+ icon: x.icon,
649
+ command: () => x.execute(),
650
+ disabled: x.disabled,
651
+ };
652
+ });
653
+ const menuItems = [
654
+ {
655
+ label: "Save",
656
+ icon: "pi pi-fw pi-save text-red",
657
+ command: () => saveAndRefresh(),
658
+ disabled: !hasUnsavedChanges(),
659
+ },
660
+ {
661
+ label: "Undo",
662
+ icon: "pi pi-fw pi-undo",
663
+ command: () => undo(),
664
+ disabled: !editData.operations.filter((x) => !x.undone).length,
665
+ },
666
+ {
667
+ label: "Redo",
668
+ icon: "pi pi-fw pi-refresh",
669
+ command: () => redo(),
670
+ disabled: !editData.operations.filter((x) => x.undone).length,
671
+ },
672
+ {
673
+ label: "Selection",
674
+ icon: "pi pi-fw pi-bars",
675
+ items: componentCommandMenuItems,
676
+ },
677
+ {
678
+ label: "Create Version",
679
+ icon: "pi pi-fw pi-plus",
680
+ command: () => createAndSwitchToNewVersion(),
681
+ },
682
+ { separator: true },
683
+ {
684
+ label: "Preview",
685
+ icon: "pi pi-fw pi-external-link",
686
+ command: () => {
687
+ if (page)
688
+ window.open(page.previewUrl + "&session=" + sessionId, "_blank");
689
+ },
690
+ },
691
+ { label: "Publish", icon: "pi pi-fw pi-upload" },
692
+ { separator: true },
693
+ ];
694
+ const spinner = (0, jsx_runtime_1.jsx)(progressspinner_1.ProgressSpinner, {});
695
+ const endContent = ((0, jsx_runtime_1.jsxs)("div", { className: "a-flex a-gap-3 a-items-center", children: [(0, jsx_runtime_1.jsx)(LanguageSelector_1.LanguageSelector, { page: page, onLanguageSelected: (language) => {
696
+ if (!language)
697
+ return;
698
+ //ensureSaved(() => switchLanguage(language));
699
+ switchLanguage(language);
700
+ } }), (0, jsx_runtime_1.jsx)(VersionSelector_1.VersionSelector, { page: page, onVersionSelected: (version) => {
701
+ switchVersion(version);
702
+ } }), (0, jsx_runtime_1.jsx)(button_1.Button, { size: "small", icon: "pi pi-arrows-h", onClick: () => setShowTabsCenter(!showTabsCenter) }), (0, jsx_runtime_1.jsx)(button_1.Button, { size: "small", icon: showRightSidebar ? "pi pi-chevron-right " : "pi pi-chevron-left", onClick: () => setShowRightSidebar(!showRightSidebar) }), (0, jsx_runtime_1.jsx)("i", { className: (0, utils_1.classNames)("pi pi-cog a-flex a-items-center a-text-xl a-m-2", refreshing ? "pi-spin" : "") })] }));
703
+ const sidebarTabs = ((0, jsx_runtime_1.jsx)(SidebarTabs_1.default, { selectedComponent: selectedComponent, page: page, dictionary: dictionary, item: item }));
704
+ const renderedPage = ((0, jsx_runtime_1.jsxs)("div", { onDragEndCapture: () => setDragObject(undefined), className: "a-flex a-flex-col a-w-full a-h-full a-items-center a-bg-gray-100", ref: editorContainerRef, children: [(0, jsx_runtime_1.jsxs)("div", { className: "a-flex a-gap-1 a-bg-gray-50 a-w-full a-border-b a-items-center a-justify-between", children: [(0, jsx_runtime_1.jsxs)("div", { className: "a-flex a-p-1.5 a-items-center", children: [(0, jsx_runtime_1.jsx)("i", { className: "pi pi-search-plus a-p-2 a-cursor-pointer", onClick: () => {
705
+ if (zoom < 50)
706
+ setZoom(zoom * 1.2);
707
+ } }), (0, jsx_runtime_1.jsx)("i", { className: "pi pi-search-minus a-p-2 a-cursor-pointer", onClick: () => {
708
+ if (zoom > 0.1)
709
+ setZoom(zoom / 1.2);
710
+ } }), (0, jsx_runtime_1.jsx)("div", { className: "a-cursor-pointer a-text-xs a-p-1", onClick: () => {
711
+ setZoom(0.5);
712
+ }, children: "50%" }), (0, jsx_runtime_1.jsx)("div", { className: "a-cursor-pointer a-text-xs a-p-1", onClick: () => {
713
+ setZoom(1);
714
+ }, children: "1:1" })] }), (0, jsx_runtime_1.jsxs)("div", { className: "a-flex a-p-1.5 a-items-center", children: [(0, jsx_runtime_1.jsx)("i", { className: (0, utils_1.classNames)(device === "desktop" ? "a-bg-gray-100" : "", "pi pi-desktop a-p-2 a-cursor-pointer"), onClick: () => {
715
+ setDevice("desktop");
716
+ } }), (0, jsx_runtime_1.jsx)("i", { className: (0, utils_1.classNames)(device === "mobile" ? "a-bg-gray-100" : "", "pi pi-tablet a-p-2 a-cursor-pointer"), onClick: () => {
717
+ setDevice("mobile");
718
+ } }), (0, jsx_runtime_1.jsx)("i", { className: "pi pi-external-link a-p-2 a-cursor-pointer", onClick: () => setFullscreen(true) })] })] }), (0, jsx_runtime_1.jsx)("div", { className: "a-flex-1 a-relative a-h-full a-bg-white", style: { width: device == "desktop" ? "100%" : "640px" }, children: (0, jsx_runtime_1.jsx)("div", { className: "alpaca-editor-container a-absolute a-inset-0 a-overflow-auto", style: { zoom: zoom }, onScroll: (e) => {
719
+ setScroll(e.currentTarget.scrollTop);
720
+ }, children: children }) })] }));
721
+ return ((0, jsx_runtime_1.jsx)(__1.EditContextProvider, { value: editContext, children: fullscreen ? ((0, jsx_runtime_1.jsxs)("div", { onMouseMoveCapture: () => setTimeout(() => setShowFullscreenHint(false), 600), children: [children, showFullscreenHint && ((0, jsx_runtime_1.jsx)("div", { className: "a-fixed a-left-1/2 a-top-3 a-transform \r\n -a-translate-x-1/2 a-p-12 a-bg-gray-200", children: "Press Ctrl + F11 to exit fullscreen mode" }))] })) : ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(toast_1.Toast, { ref: toast }), (0, jsx_runtime_1.jsxs)(api_1.PrimeReactProvider, { children: [(0, jsx_runtime_1.jsx)(ConfirmationDialog_1.default, { ref: confirmationDialogRef }), (0, jsx_runtime_1.jsx)(confirmdialog_1.ConfirmDialog, {}), (0, jsx_runtime_1.jsxs)(blockui_1.BlockUI, { blocked: uiBlocked, template: spinner, children: [(0, jsx_runtime_1.jsx)(menubar_1.Menubar, { model: menuItems, end: endContent, className: "a-p-1 a-text-sm" }), (0, jsx_runtime_1.jsx)(MainLayout_1.default, { content: showTabsCenter ? sidebarTabs : renderedPage, rightSidebar: showRightSidebar && ((0, jsx_runtime_1.jsxs)(splitter_1.Splitter, { layout: "vertical", className: "alpaca-editor a-h-full", children: [(0, jsx_runtime_1.jsx)(splitter_1.SplitterPanel, { className: "a-overflow-hidden a-relative", children: (0, jsx_runtime_1.jsx)(EditHistory_1.EditHistory, { operations: edit.operations }) }), (0, jsx_runtime_1.jsx)(splitter_1.SplitterPanel, { className: "a-h-full a-flex a-flex-col", children: (0, jsx_runtime_1.jsx)(Workbox_1.default, { workbox: page.workbox, lockItem: lockItemAndRefresh, executeWorkflowCommand: executeWorkflowCommandAndRefresh }) }), (0, jsx_runtime_1.jsx)(splitter_1.SplitterPanel, { className: "a-overflow-hidden a-relative", children: (0, jsx_runtime_1.jsx)(AiTerminal_1.AiTerminal, { selection: selection }) })] })), leftSidebar: (0, jsx_runtime_1.jsxs)(splitter_1.Splitter, { layout: "vertical", className: "a-h-full", children: [(0, jsx_runtime_1.jsxs)(splitter_1.SplitterPanel, { size: 20, className: "a-h-full a-flex a-flex-col", children: [(0, jsx_runtime_1.jsx)("div", { className: "a-p-3 a-bg-gray-50 a-text-gray-600 a-text-sm a-border-b-2", children: "Content" }), (0, jsx_runtime_1.jsx)("div", { className: "a-overflow-hidden a-relative a-flex-1", children: (0, jsx_runtime_1.jsx)("div", { className: "a-inset-0 a-absolute a-overflow-y-auto", children: (0, jsx_runtime_1.jsx)(ContentTree_1.default, { rootItemId: "{11111111-1111-1111-1111-111111111111}", expandIdPath: page.idPath, className: "a-p-1", selectionMode: "single", selectedItemIds: [page.id], secondarySelectedItemId: item === null || item === void 0 ? void 0 : item.id, onSelectionChange: (selection) => {
722
+ const selectedItem = selection;
723
+ if (selectedItem.hasLayout)
724
+ navigateToPage(selectedItem.id);
725
+ else
726
+ loadItem({
727
+ id: selectedItem.id,
728
+ language: selectedItem.language,
729
+ version: selectedItem.version,
730
+ });
731
+ }, isDraggable: (x) => (currentInsertOptions === null || currentInsertOptions === void 0 ? void 0 : currentInsertOptions.find((insertOption) => {
732
+ var _a;
733
+ return insertOption.id == x.templateId ||
734
+ ((_a = insertOption.compatibleTemplates) === null || _a === void 0 ? void 0 : _a.find((compatibleTemplate) => compatibleTemplate == x.templateId)) !== undefined;
735
+ })) !== undefined, dragStart: (itemNode) => {
736
+ setDragObject({
737
+ type: "link-component",
738
+ templateId: itemNode.templateId,
739
+ component: {
740
+ id: itemNode.id,
741
+ language: itemNode.language,
742
+ version: itemNode.version,
743
+ },
744
+ });
745
+ } }) }) })] }), (0, jsx_runtime_1.jsxs)(splitter_1.SplitterPanel, { size: 15, className: "a-h-full a-flex a-flex-col", children: [(0, jsx_runtime_1.jsx)("div", { className: "a-p-3 a-bg-gray-50 a-text-gray-600 a-text-sm a-border-b-2", children: "Page Components" }), (0, jsx_runtime_1.jsx)("div", { className: "a-overflow-hidden a-relative a-flex-1", children: (0, jsx_runtime_1.jsx)("div", { className: "a-inset-0 a-absolute a-overflow-y-auto", children: (0, jsx_runtime_1.jsx)(ComponentTree_1.ComponentTree, { page: page, selection: selection }) }) })] }), (0, jsx_runtime_1.jsxs)(splitter_1.SplitterPanel, { size: 15, className: "a-h-full a-flex a-flex-col", children: [(0, jsx_runtime_1.jsx)("div", { className: "a-p-3 a-bg-gray-50 a-text-gray-600 a-text-sm a-border-b-2", children: "New Component" }), (0, jsx_runtime_1.jsx)("div", { className: "a-overflow-hidden a-relative a-flex-1", children: (0, jsx_runtime_1.jsx)("div", { className: "a-inset-0 a-absolute a-overflow-y-auto", children: (0, jsx_runtime_1.jsx)(ComponentPalette_1.ComponentPalette, { insertOptions: currentInsertOptions, dragStart: (dragObject) => {
746
+ //console.log("dragging " + JSON.stringify(dragObject));
747
+ setDragObject(dragObject);
748
+ }, dragEnd: () => {
749
+ setDragObject(undefined);
750
+ setSelectedForInsertion("");
751
+ } }) }) })] }), (0, jsx_runtime_1.jsx)(splitter_1.SplitterPanel, { size: 50, className: "a-overflow-hidden a-relative", children: !showTabsCenter ? sidebarTabs : renderedPage })] }) })] }), (0, jsx_runtime_1.jsx)(MediaSelector_1.MediaSelector, { visible: mediaSelectorVisible, onHide: () => setMediaSelectorVisible(false), onMediaSelected: onMediaSelect, selectedIdPath: selectedMediaIdPath })] })] })) }));
483
752
  }
484
753
  exports.EditorClient = EditorClient;