@alpaca-headless/alpaca-headless-nextjs 0.0.3 → 1.0.13

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 (143) hide show
  1. package/dist/cjs/alpacaContext.js +7 -6
  2. package/dist/cjs/components/Image.js +36 -0
  3. package/dist/cjs/components/Link.js +22 -0
  4. package/dist/cjs/components/Picture.js +119 -0
  5. package/dist/cjs/components/PictureEditor.js +43 -0
  6. package/dist/cjs/components/Placeholder.js +43 -5
  7. package/dist/cjs/components/RichText.js +44 -0
  8. package/dist/cjs/components/RichTextEditor.js +82 -0
  9. package/dist/cjs/components/Slot.js +8 -0
  10. package/dist/cjs/components/Text.js +24 -4
  11. package/dist/cjs/components/TextEditor.js +68 -0
  12. package/dist/cjs/components/Translate.js +14 -0
  13. package/dist/cjs/components/index.js +5 -0
  14. package/dist/cjs/editor/AiTerminal.js +150 -0
  15. package/dist/cjs/editor/ComponentInfo.js +14 -0
  16. package/dist/cjs/editor/ComponentPalette.js +78 -0
  17. package/dist/cjs/editor/ComponentTree.js +200 -0
  18. package/dist/cjs/editor/ContentTree.js +120 -0
  19. package/dist/cjs/editor/Debug.js +16 -0
  20. package/dist/cjs/editor/DictionaryEditor.js +35 -0
  21. package/dist/cjs/editor/EditFrame.js +61 -0
  22. package/dist/cjs/editor/EditHistory.js +30 -0
  23. package/dist/cjs/editor/Editor.js +27 -0
  24. package/dist/cjs/editor/EditorClient.js +457 -0
  25. package/dist/cjs/editor/EditorClientHost.js +37 -0
  26. package/dist/cjs/editor/FieldList.js +59 -0
  27. package/dist/cjs/editor/GraphQL.js +90 -0
  28. package/dist/cjs/editor/LanguageSelector.js +21 -0
  29. package/dist/cjs/editor/MediaSelector.js +61 -0
  30. package/dist/cjs/editor/PageInfo.js +12 -0
  31. package/dist/cjs/editor/PlaceholderDropZone.js +54 -0
  32. package/dist/cjs/editor/PlaceholderDropZoneHost.js +37 -0
  33. package/dist/cjs/editor/Terminal.js +51 -0
  34. package/dist/cjs/editor/TranslateEditor.js +25 -0
  35. package/dist/cjs/editor/VersionSelector.js +21 -0
  36. package/dist/cjs/editor/componentTreeHelper.js +18 -0
  37. package/dist/cjs/editor/contentService.js +38 -0
  38. package/dist/cjs/editor/editContext.js +35 -0
  39. package/dist/cjs/editor/editService.js +150 -0
  40. package/dist/cjs/editor/fieldTypes/RichTextEditor.js +19 -0
  41. package/dist/cjs/editor/fieldTypes/SingleLineText.js +17 -0
  42. package/dist/cjs/editor/index.js +18 -0
  43. package/dist/cjs/graphQLTypes.js +2 -0
  44. package/dist/cjs/index.js +17 -0
  45. package/dist/cjs/loadRouteData.js +102 -38
  46. package/dist/cjs/mediaProtection.js +56 -0
  47. package/dist/editor.css +120 -0
  48. package/dist/esm/alpacaContext.js +6 -4
  49. package/dist/esm/components/Image.js +32 -0
  50. package/dist/esm/components/Link.js +18 -0
  51. package/dist/esm/components/Picture.js +115 -0
  52. package/dist/esm/components/PictureEditor.js +39 -0
  53. package/dist/esm/components/Placeholder.js +41 -6
  54. package/dist/esm/components/RichText.js +37 -0
  55. package/dist/esm/components/RichTextEditor.js +55 -0
  56. package/dist/esm/components/Slot.js +5 -0
  57. package/dist/esm/components/Text.js +24 -4
  58. package/dist/esm/components/TextEditor.js +41 -0
  59. package/dist/esm/components/Translate.js +10 -0
  60. package/dist/esm/components/index.js +5 -0
  61. package/dist/esm/editor/AiTerminal.js +146 -0
  62. package/dist/esm/editor/ComponentInfo.js +10 -0
  63. package/dist/esm/editor/ComponentPalette.js +71 -0
  64. package/dist/esm/editor/ComponentTree.js +196 -0
  65. package/dist/esm/editor/ContentTree.js +117 -0
  66. package/dist/esm/editor/Debug.js +9 -0
  67. package/dist/esm/editor/DictionaryEditor.js +31 -0
  68. package/dist/esm/editor/EditFrame.js +57 -0
  69. package/dist/esm/editor/EditHistory.js +26 -0
  70. package/dist/esm/editor/Editor.js +23 -0
  71. package/dist/esm/editor/EditorClient.js +450 -0
  72. package/dist/esm/editor/EditorClientHost.js +7 -0
  73. package/dist/esm/editor/FieldList.js +55 -0
  74. package/dist/esm/editor/GraphQL.js +83 -0
  75. package/dist/esm/editor/LanguageSelector.js +17 -0
  76. package/dist/esm/editor/MediaSelector.js +54 -0
  77. package/dist/esm/editor/PageInfo.js +8 -0
  78. package/dist/esm/editor/PlaceholderDropZone.js +50 -0
  79. package/dist/esm/editor/PlaceholderDropZoneHost.js +7 -0
  80. package/dist/esm/editor/Terminal.js +47 -0
  81. package/dist/esm/editor/TranslateEditor.js +21 -0
  82. package/dist/esm/editor/VersionSelector.js +17 -0
  83. package/dist/esm/editor/componentTreeHelper.js +14 -0
  84. package/dist/esm/editor/contentService.js +31 -0
  85. package/dist/esm/editor/editContext.js +5 -0
  86. package/dist/esm/editor/editService.js +139 -0
  87. package/dist/esm/editor/fieldTypes/RichTextEditor.js +15 -0
  88. package/dist/esm/editor/fieldTypes/SingleLineText.js +13 -0
  89. package/dist/esm/editor/index.js +2 -0
  90. package/dist/esm/graphQLTypes.js +1 -0
  91. package/dist/esm/index.js +4 -0
  92. package/dist/esm/loadRouteData.js +102 -38
  93. package/dist/esm/mediaProtection.js +49 -0
  94. package/next-env.d.ts +5 -5
  95. package/package.json +51 -39
  96. package/types/alpacaContext.d.ts +20 -7
  97. package/types/components/Image.d.ts +10 -0
  98. package/types/components/Link.d.ts +6 -0
  99. package/types/components/Picture.d.ts +20 -0
  100. package/types/components/PictureEditor.d.ts +3 -0
  101. package/types/components/RichText.d.ts +7 -0
  102. package/types/components/RichTextEditor.d.ts +296 -0
  103. package/types/components/Slot.d.ts +4 -0
  104. package/types/components/Text.d.ts +3 -2
  105. package/types/components/TextEditor.d.ts +296 -0
  106. package/types/components/Translate.d.ts +3 -0
  107. package/types/components/index.d.ts +5 -0
  108. package/types/editor/AiTerminal.d.ts +4 -0
  109. package/types/editor/ComponentInfo.d.ts +4 -0
  110. package/types/editor/ComponentPalette.d.ts +7 -0
  111. package/types/editor/ComponentTree.d.ts +5 -0
  112. package/types/editor/ContentTree.d.ts +13 -0
  113. package/types/editor/Debug.d.ts +6 -0
  114. package/types/editor/DictionaryEditor.d.ts +3 -0
  115. package/types/editor/EditFrame.d.ts +6 -0
  116. package/types/editor/EditHistory.d.ts +4 -0
  117. package/types/editor/Editor.d.ts +6 -0
  118. package/types/editor/EditorClient.d.ts +9 -0
  119. package/types/editor/EditorClientHost.d.ts +8 -0
  120. package/types/editor/FieldList.d.ts +4 -0
  121. package/types/editor/GraphQL.d.ts +5 -0
  122. package/types/editor/LanguageSelector.d.ts +5 -0
  123. package/types/editor/MediaSelector.d.ts +5 -0
  124. package/types/editor/PageInfo.d.ts +4 -0
  125. package/types/editor/PlaceholderDropZone.d.ts +6 -0
  126. package/types/editor/PlaceholderDropZoneHost.d.ts +6 -0
  127. package/types/editor/Terminal.d.ts +4 -0
  128. package/types/editor/TranslateEditor.d.ts +3 -0
  129. package/types/editor/VersionSelector.d.ts +5 -0
  130. package/types/editor/componentTreeHelper.d.ts +2 -0
  131. package/types/editor/contentService.d.ts +14 -0
  132. package/types/editor/editContext.d.ts +81 -0
  133. package/types/editor/editService.d.ts +12 -0
  134. package/types/editor/fieldTypes/RichTextEditor.d.ts +4 -0
  135. package/types/editor/fieldTypes/SingleLineText.d.ts +4 -0
  136. package/types/editor/index.d.ts +2 -0
  137. package/types/fieldTypes.d.ts +63 -1
  138. package/types/graphQLTypes.d.ts +24 -0
  139. package/types/index.d.ts +4 -0
  140. package/types/layoutData.d.ts +56 -1
  141. package/types/loadRouteData.d.ts +34 -2
  142. package/types/mediaProtection.d.ts +2 -0
  143. package/types/AlpacaHeadless.d.ts +0 -37
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ "use client";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.EditFrame = void 0;
5
+ const jsx_runtime_1 = require("react/jsx-runtime");
6
+ const react_1 = require("react");
7
+ const __1 = require("..");
8
+ function EditFrame({ componentId, children, }) {
9
+ var _a, _b;
10
+ const editContext = (0, __1.useEditContext)();
11
+ if (!editContext)
12
+ return children;
13
+ const { getComponentById, selection, setSelection } = editContext;
14
+ const [isRemoved, setIsRemoved] = (0, react_1.useState)(false);
15
+ const clientComponent = getComponentById(componentId);
16
+ if (!clientComponent) {
17
+ return children;
18
+ }
19
+ function select(e) {
20
+ e.stopPropagation();
21
+ if (clientComponent)
22
+ setSelection([clientComponent.id]);
23
+ }
24
+ let classNames = "ap-editframe";
25
+ let color = clientComponent.linkItemId ? "orange-400" : "sky-400";
26
+ if (clientComponent.hostingPageItem)
27
+ color = "purple-400";
28
+ const isSelected = selection && selection.indexOf(clientComponent.id) >= 0;
29
+ if (isSelected)
30
+ classNames = `ap-editframe relative ring-2 ring-${color}`;
31
+ function handleDragStart(event) {
32
+ if (!clientComponent)
33
+ return;
34
+ event.dataTransfer.setData("text/plain", clientComponent.id);
35
+ event.dataTransfer.setData("alpaca", clientComponent.id);
36
+ setTimeout(() => {
37
+ editContext.dragStart({
38
+ type: "component",
39
+ templateId: clientComponent.templateId,
40
+ componentId: clientComponent.id,
41
+ });
42
+ }, 50);
43
+ event.stopPropagation();
44
+ }
45
+ const isDraggable = isSelected && !clientComponent.hostingPageItem;
46
+ if ((_a = children.props) === null || _a === void 0 ? void 0 : _a.className)
47
+ classNames += " " + ((_b = children === null || children === void 0 ? void 0 : children.props) === null || _b === void 0 ? void 0 : _b.className);
48
+ if (isRemoved)
49
+ classNames += " ap-removed";
50
+ return ((0, jsx_runtime_1.jsxs)("div", { className: classNames, onClick: select, draggable: isDraggable, onDragStart: handleDragStart, children: [isSelected && ((0, jsx_runtime_1.jsxs)("div", { className: `absolute top-0 right-0 text-white px-3 bg-${color} ${isDraggable ? "cursor-move" : ""}`, children: [clientComponent.name, (0, jsx_runtime_1.jsx)("button", { className: "ml-3", onClick: (ev) => {
51
+ ev.preventDefault();
52
+ ev.stopPropagation();
53
+ editContext.removeComponent(clientComponent.linkItemId || clientComponent.id, () => setIsRemoved(true));
54
+ }, children: (0, jsx_runtime_1.jsx)("i", { className: "pi pi-trash" }) }), clientComponent.placeholders.length > 0 && ((0, jsx_runtime_1.jsx)("button", { className: "ml-3", onClick: (ev) => {
55
+ editContext.setSelectedForInsertion(clientComponent.id);
56
+ editContext.openComponentPalette();
57
+ ev.stopPropagation();
58
+ ev.preventDefault();
59
+ }, children: (0, jsx_runtime_1.jsx)("i", { className: "pi pi-plus" }) }))] })), children] }));
60
+ }
61
+ exports.EditFrame = EditFrame;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ "use client";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.EditHistory = void 0;
5
+ const jsx_runtime_1 = require("react/jsx-runtime");
6
+ function EditHistory({ operations }) {
7
+ if (!operations)
8
+ return;
9
+ const description = (op) => {
10
+ if (op.type === "add-component")
11
+ return (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: ["Add ", op.itemName] });
12
+ if (op.type === "link-component")
13
+ return (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: ["Insert ", op.itemName] });
14
+ if (op.type === "remove-component")
15
+ return (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: ["Remove ", op.id] });
16
+ if (op.type === "edit-field") {
17
+ const editFieldOp = op;
18
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: ["Edit ", editFieldOp.fieldName, (0, jsx_runtime_1.jsxs)("span", { className: "text-gray-400 ml-1", children: ["(", editFieldOp.itemName, ", ", editFieldOp.language, ",", " ", editFieldOp.version, ")"] })] }));
19
+ }
20
+ return (0, jsx_runtime_1.jsx)("div", { children: op.type });
21
+ };
22
+ return ((0, jsx_runtime_1.jsxs)("div", { className: "inset-0 absolute", children: [(0, jsx_runtime_1.jsx)("div", { className: "p-2 bg-gray-100 m-1", children: "History" }), (0, jsx_runtime_1.jsx)("div", { className: "flex flex-col overflow-y-auto overflow-x-hidden", style: { height: "calc(100% - 45px)" }, children: operations.map((o, i) => singleOperation(i, o)) })] }));
23
+ function singleOperation(i, o) {
24
+ let className = "border-b p-2 flex justify-between";
25
+ if (o.undone)
26
+ className = className + " text-gray-300";
27
+ return ((0, jsx_runtime_1.jsxs)("div", { className: className, children: [(0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsx)("small", { className: "text-color-secondary", children: description(o) }) }), (0, jsx_runtime_1.jsx)("div", { className: "text-xs", children: o.user })] }, i));
28
+ }
29
+ }
30
+ exports.EditHistory = EditHistory;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.Editor = void 0;
13
+ const jsx_runtime_1 = require("react/jsx-runtime");
14
+ const __1 = require("..");
15
+ const EditorClientHost_1 = require("./EditorClientHost");
16
+ function Editor({ children, content, }) {
17
+ return __awaiter(this, void 0, void 0, function* () {
18
+ const data = yield content;
19
+ if (data.type !== "page")
20
+ return;
21
+ if (!data.editing)
22
+ return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: children });
23
+ var alpacaContext = (0, __1.useAlpacaContext)();
24
+ return ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: (0, jsx_runtime_1.jsx)(EditorClientHost_1.EditorClientHost, { content: data, dictionaryObject: alpacaContext.dictionary, edit: alpacaContext.edit, children: children }) }));
25
+ });
26
+ }
27
+ exports.Editor = Editor;
@@ -0,0 +1,457 @@
1
+ "use strict";
2
+ "use client";
3
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
4
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
5
+ return new (P || (P = Promise))(function (resolve, reject) {
6
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
7
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
8
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
9
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
10
+ });
11
+ };
12
+ var __importDefault = (this && this.__importDefault) || function (mod) {
13
+ return (mod && mod.__esModule) ? mod : { "default": mod };
14
+ };
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.EditorClient = void 0;
17
+ const jsx_runtime_1 = require("react/jsx-runtime");
18
+ const react_1 = require("react");
19
+ const react_uuid_1 = __importDefault(require("react-uuid"));
20
+ const api_1 = require("primereact/api");
21
+ const menubar_1 = require("primereact/menubar");
22
+ const progressspinner_1 = require("primereact/progressspinner");
23
+ const tabview_1 = require("primereact/tabview");
24
+ const toast_1 = require("primereact/toast");
25
+ const splitter_1 = require("primereact/splitter");
26
+ const blockui_1 = require("primereact/blockui");
27
+ const confirmdialog_1 = require("primereact/confirmdialog");
28
+ const sidebar_1 = require("primereact/sidebar");
29
+ const __1 = require("..");
30
+ const navigation_1 = require("next/navigation");
31
+ const FieldList_1 = require("./FieldList");
32
+ const GraphQL_1 = require("./GraphQL");
33
+ const ComponentTree_1 = require("./ComponentTree");
34
+ const ComponentInfo_1 = require("./ComponentInfo");
35
+ const LanguageSelector_1 = require("./LanguageSelector");
36
+ const componentTreeHelper_1 = require("./componentTreeHelper");
37
+ const ComponentPalette_1 = require("./ComponentPalette");
38
+ const DictionaryEditor_1 = require("./DictionaryEditor");
39
+ const AiTerminal_1 = require("./AiTerminal");
40
+ const EditHistory_1 = require("./EditHistory");
41
+ const Debug_1 = require("./Debug");
42
+ const PageInfo_1 = require("./PageInfo");
43
+ const VersionSelector_1 = require("./VersionSelector");
44
+ const editService_1 = require("./editService");
45
+ require("../../editor.css");
46
+ // Hook
47
+ function useEventListener(eventName, handler, element) {
48
+ // Create a ref that stores handler
49
+ const savedHandler = (0, react_1.useRef)();
50
+ // Update ref.current value if handler changes.
51
+ // This allows our effect below to always get latest handler ...
52
+ // ... without us needing to pass it in effect deps array ...
53
+ // ... and potentially cause effect to re-run every render.
54
+ (0, react_1.useEffect)(() => {
55
+ savedHandler.current = handler;
56
+ }, [handler]);
57
+ (0, react_1.useEffect)(() => {
58
+ // Make sure element supports addEventListener
59
+ // On
60
+ const isSupported = element && element.addEventListener;
61
+ if (!isSupported)
62
+ return;
63
+ // Create event listener that calls handler function stored in ref
64
+ const eventListener = (event) => savedHandler.current(event);
65
+ // Add event listener
66
+ element.addEventListener(eventName, eventListener);
67
+ // Remove event listener on cleanup
68
+ return () => {
69
+ element.removeEventListener(eventName, eventListener);
70
+ };
71
+ }, [eventName, element] // Re-run if eventName or element changes
72
+ );
73
+ }
74
+ function EditorClient({ content, dictionaryObject, edit, children, }) {
75
+ const router = (0, navigation_1.useRouter)();
76
+ const pathname = (0, navigation_1.usePathname)();
77
+ const searchParams = (0, navigation_1.useSearchParams)();
78
+ const [selection, setSelection] = (0, react_1.useState)([]);
79
+ const [selectedForInsertion, setSelectedForInsertion] = (0, react_1.useState)("");
80
+ const [currentEditOperation, setCurrentEditOperation] = (0, react_1.useState)();
81
+ const [dictionary, setDictionary] = (0, react_1.useState)(dictionaryObject);
82
+ const [unresolvedDictionaryKeys, setUnresolvedDictionaryKeys] = (0, react_1.useState)([]);
83
+ const [editData, setEditData] = (0, react_1.useState)(edit);
84
+ const [refreshCompletedFlag, setRefreshCompletedFlag] = (0, react_1.useState)(false);
85
+ const [updateContentEditingFields, setUpdateContentEditingFields] = (0, react_1.useState)(false);
86
+ const [page, setPageData] = (0, react_1.useState)(null);
87
+ const [uiBlocked, setUiBlocked] = (0, react_1.useState)(false);
88
+ const [componentsPaletteVisible, setComponentsPaletteVisible] = (0, react_1.useState)(false);
89
+ const [dragObject, setDragObject] = (0, react_1.useState)();
90
+ const [hidePalette, setHidePalette] = (0, react_1.useState)(false);
91
+ const [refreshTimer, setRefreshTimer] = (0, react_1.useState)();
92
+ const sessionId = searchParams.get("session");
93
+ if (!sessionId)
94
+ return;
95
+ function switchLanguage(language) {
96
+ const current = new URLSearchParams(Array.from(searchParams.entries()));
97
+ current.set("language", language);
98
+ const newUrl = `${pathname}?${current.toString()}`;
99
+ router.replace(newUrl, { scroll: false });
100
+ }
101
+ function switchVersion(version) {
102
+ const current = new URLSearchParams(Array.from(searchParams.entries()));
103
+ current.set("version", version.toString());
104
+ const newUrl = `${pathname}?${current.toString()}`;
105
+ router.replace(newUrl, { scroll: false });
106
+ }
107
+ function handleErrorResult(result) {
108
+ if (result.type === "error") {
109
+ showErrorToast(result);
110
+ return true;
111
+ }
112
+ if (result.type === "unauthenticated") {
113
+ (0, confirmdialog_1.confirmDialog)({
114
+ header: "Not logged in",
115
+ message: "You are not logged in anymore. Proceed to login page?",
116
+ accept: () => {
117
+ window.location.href = edit.loginUrl;
118
+ },
119
+ });
120
+ showErrorToast(result);
121
+ return true;
122
+ }
123
+ }
124
+ (0, react_1.useEffect)(() => {
125
+ if (selection.length)
126
+ setSelectedForInsertion("");
127
+ }, [selection]);
128
+ (0, react_1.useEffect)(() => {
129
+ const sync = () => __awaiter(this, void 0, void 0, function* () {
130
+ if (currentEditOperation) {
131
+ const result = yield (0, editService_1.executeEditOperation)(currentEditOperation, sessionId);
132
+ if (handleErrorResult(result))
133
+ return;
134
+ if ((result.id && edit.operations.length == 0) ||
135
+ edit.operations[edit.operations.length - 1].id !=
136
+ result.id) {
137
+ edit.operations = edit.operations.filter((x) => !x.undone);
138
+ edit.operations.push(result);
139
+ setEditData(Object.assign({}, edit));
140
+ }
141
+ if (result.type === "add-component" ||
142
+ result.type === "link-component") {
143
+ console.log("CURRENT: " + JSON.stringify(result));
144
+ setSelection([result.componentId]);
145
+ }
146
+ if (!currentEditOperation.noRefresh)
147
+ requestRefresh(currentEditOperation.refreshAfterQuietPeriod);
148
+ }
149
+ });
150
+ sync();
151
+ }, [currentEditOperation]);
152
+ const requestRefresh = (waitForQuietPeriod) => {
153
+ console.log("request refresh with " + waitForQuietPeriod);
154
+ if (waitForQuietPeriod && refreshTimer) {
155
+ clearTimeout(refreshTimer);
156
+ }
157
+ if (!refreshTimer || waitForQuietPeriod) {
158
+ setRefreshTimer(setTimeout(() => {
159
+ console.log("refreshing");
160
+ router.refresh();
161
+ setRefreshCompletedFlag(!refreshCompletedFlag);
162
+ setRefreshTimer(undefined);
163
+ }, waitForQuietPeriod ? 2000 : 1000));
164
+ }
165
+ };
166
+ const saveAndRefresh = (callback) => __awaiter(this, void 0, void 0, function* () {
167
+ if (!edit.operations.length) {
168
+ if (callback)
169
+ callback();
170
+ return;
171
+ }
172
+ setUiBlocked(true);
173
+ if (!(yield (0, editService_1.commitChanges)(sessionId))) {
174
+ setUiBlocked(false);
175
+ return;
176
+ }
177
+ router.refresh();
178
+ //setEditOperations([]);
179
+ setUiBlocked(false);
180
+ toast.current.show({
181
+ severity: "success",
182
+ summary: "Saved",
183
+ detail: "Your changes were saved successfully.",
184
+ life: 3000,
185
+ });
186
+ if (callback)
187
+ callback();
188
+ });
189
+ // function ensureSaved(callback: () => void) {
190
+ // if (!edit.operations.length) {
191
+ // callback();
192
+ // return;
193
+ // }
194
+ // confirmDialog({
195
+ // message: "Save changes?",
196
+ // header: "Save changes?",
197
+ // icon: "pi pi-exclamation-triangle",
198
+ // accept: () => saveAndRefresh(callback),
199
+ // reject: callback,
200
+ // });
201
+ // }
202
+ function handleKeyDown(event) {
203
+ return __awaiter(this, void 0, void 0, function* () {
204
+ if (event.ctrlKey && event.key === "s") {
205
+ event.preventDefault();
206
+ yield saveAndRefresh();
207
+ }
208
+ if (event.ctrlKey && event.key === "z") {
209
+ event.preventDefault();
210
+ yield undo();
211
+ }
212
+ if (event.ctrlKey && event.key === "y") {
213
+ event.preventDefault();
214
+ yield redo();
215
+ }
216
+ });
217
+ }
218
+ if (typeof window !== "undefined")
219
+ useEventListener("keydown", handleKeyDown, window);
220
+ const toast = (0, react_1.useRef)();
221
+ (0, react_1.useEffect)(() => {
222
+ setPageData(content);
223
+ }, [content]);
224
+ (0, react_1.useEffect)(() => {
225
+ setEditData(edit);
226
+ }, [edit]);
227
+ function getComponentById(id) {
228
+ if (!page)
229
+ return null;
230
+ return (0, componentTreeHelper_1.findComponent)(id, page.placeholders);
231
+ }
232
+ function redo() {
233
+ return __awaiter(this, void 0, void 0, function* () {
234
+ setUpdateContentEditingFields(!updateContentEditingFields);
235
+ let result = yield (0, editService_1.executeRedo)(sessionId);
236
+ if (result.type === "success") {
237
+ router.refresh();
238
+ return true;
239
+ }
240
+ else {
241
+ showErrorToast(result);
242
+ return false;
243
+ }
244
+ });
245
+ }
246
+ function showErrorToast(result) {
247
+ toast.current.show({
248
+ severity: "error",
249
+ summary: result.summary,
250
+ detail: result.details,
251
+ life: 3000,
252
+ });
253
+ }
254
+ function undo() {
255
+ return __awaiter(this, void 0, void 0, function* () {
256
+ setUpdateContentEditingFields(!updateContentEditingFields);
257
+ let result = yield (0, editService_1.executeUndo)(sessionId);
258
+ if (result.type === "success") {
259
+ router.refresh();
260
+ return true;
261
+ }
262
+ else {
263
+ showErrorToast(result);
264
+ return false;
265
+ }
266
+ });
267
+ }
268
+ const selectedComponent = selection.length === 1 && page ? getComponentById(selection[0]) : null;
269
+ const editField = (field, value, noRefresh = true) => {
270
+ var _a;
271
+ if (!page)
272
+ return;
273
+ const component = (0, componentTreeHelper_1.findComponent)(field.itemId, page.placeholders);
274
+ let op = editService_1.currentOperation;
275
+ if (!op ||
276
+ op.type !== "edit-field" ||
277
+ op.itemId !== field.itemId ||
278
+ op.fieldId !== field.id ||
279
+ op.language !== field.language ||
280
+ op.version !== field.version) {
281
+ op = {
282
+ type: "edit-field",
283
+ itemId: field.itemId,
284
+ fieldId: field.id,
285
+ version: field.version,
286
+ language: field.language,
287
+ fieldName: field.name,
288
+ itemName: field.itemId == page.id ? "Page" : (_a = component === null || component === void 0 ? void 0 : component.name) !== null && _a !== void 0 ? _a : "<unknown>",
289
+ pageItemId: page.id,
290
+ pageItemLanguage: page.language,
291
+ pageItemVersion: page.version,
292
+ date: new Date(),
293
+ id: (0, react_uuid_1.default)(),
294
+ };
295
+ }
296
+ op.date = new Date();
297
+ op.noRefresh = noRefresh;
298
+ op.refreshAfterQuietPeriod = !noRefresh;
299
+ op.value = value;
300
+ function getField(fields, id) {
301
+ return Object.values(fields).find((f) => f.id === id);
302
+ }
303
+ if (component) {
304
+ const f = getField(component.fields, field.id);
305
+ if (f && f.value != value) {
306
+ f.value = value;
307
+ }
308
+ }
309
+ else {
310
+ const f = getField(page.fields, field.id);
311
+ if (f && f.value != value)
312
+ f.value = value;
313
+ }
314
+ (0, editService_1.setCurrentOperation)(op);
315
+ setCurrentEditOperation(Object.assign({}, op));
316
+ };
317
+ const menuItems = [
318
+ {
319
+ label: "Save",
320
+ icon: "pi pi-fw pi-save text-red",
321
+ command: () => saveAndRefresh(),
322
+ },
323
+ {
324
+ label: "Insert",
325
+ icon: "pi pi-fw pi-sitemap",
326
+ command: () => setComponentsPaletteVisible(true),
327
+ },
328
+ ];
329
+ const spinner = (0, jsx_runtime_1.jsx)(progressspinner_1.ProgressSpinner, {});
330
+ const endContent = ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(LanguageSelector_1.LanguageSelector, { page: page, onLanguageSelected: (language) => {
331
+ if (!language)
332
+ return;
333
+ //ensureSaved(() => switchLanguage(language));
334
+ switchLanguage(language);
335
+ } }), (0, jsx_runtime_1.jsx)(VersionSelector_1.VersionSelector, { page: page, onVersionSelected: (version) => {
336
+ switchVersion(version);
337
+ } })] }));
338
+ return ((0, jsx_runtime_1.jsxs)(__1.EditContextProvider, { value: {
339
+ sessionId: sessionId,
340
+ selection,
341
+ setSelection,
342
+ selectedForInsertion,
343
+ setSelectedForInsertion,
344
+ editField,
345
+ getComponentById,
346
+ dragObject,
347
+ dictionary,
348
+ setDictionary,
349
+ refreshCompletedFlag,
350
+ unresolvedDictionaryKeys,
351
+ setUnresolvedDictionaryKeys,
352
+ updateContentEditingFields,
353
+ showToast: () => { },
354
+ removeComponent: (componentId, callback) => {
355
+ (0, confirmdialog_1.confirmDialog)({
356
+ message: "Are you sure you want to remove this component?",
357
+ header: "Remove component",
358
+ icon: "pi pi-exclamation-triangle",
359
+ accept: () => {
360
+ var _a;
361
+ const op = {
362
+ type: "remove-component",
363
+ date: new Date(),
364
+ id: (0, react_uuid_1.default)(),
365
+ pageItemId: page.id,
366
+ pageItemLanguage: page.language,
367
+ pageItemVersion: page.version,
368
+ componentId,
369
+ componentName: (_a = getComponentById(componentId)) === null || _a === void 0 ? void 0 : _a.name,
370
+ };
371
+ setCurrentEditOperation(op);
372
+ callback(true);
373
+ },
374
+ });
375
+ },
376
+ openComponentPalette: () => setComponentsPaletteVisible(true),
377
+ dragStart: (dragObject) => {
378
+ console.log("dragging " + JSON.stringify(dragObject));
379
+ setDragObject(dragObject);
380
+ },
381
+ droppedInPlaceholder: (placeholderKey, index) => __awaiter(this, void 0, void 0, function* () {
382
+ if (!dragObject)
383
+ return;
384
+ console.log(dragObject.templateId +
385
+ " dropped in " +
386
+ placeholderKey +
387
+ " " +
388
+ index);
389
+ // console.log(JSON.stringify(page));
390
+ const placeholderKeyComponents = placeholderKey.split("_");
391
+ const parentId = placeholderKeyComponents.length === 1
392
+ ? null
393
+ : placeholderKeyComponents[0];
394
+ const placeholderName = placeholderKeyComponents.length === 1
395
+ ? placeholderKeyComponents[0]
396
+ : placeholderKeyComponents[1];
397
+ let op;
398
+ if (dragObject.type == "template") {
399
+ op = {
400
+ type: "add-component",
401
+ pageItemId: page.id,
402
+ pageItemLanguage: page.language,
403
+ pageItemVersion: page.version,
404
+ parentItemId: parentId,
405
+ placeholderName: placeholderName,
406
+ placeholderIndex: index,
407
+ templateId: dragObject === null || dragObject === void 0 ? void 0 : dragObject.templateId,
408
+ date: new Date(),
409
+ id: (0, react_uuid_1.default)(),
410
+ };
411
+ }
412
+ if (dragObject.type == "component" ||
413
+ (dragObject.type == "link-component" && dragObject.componentId)) {
414
+ op = {
415
+ type: dragObject.type == "link-component"
416
+ ? "link-component"
417
+ : "move-component",
418
+ pageItemId: page.id,
419
+ pageItemLanguage: page.language,
420
+ pageItemVersion: page.version,
421
+ parentItemId: parentId,
422
+ placeholderName: placeholderName,
423
+ placeholderIndex: index,
424
+ componentId: dragObject.componentId,
425
+ date: new Date(),
426
+ id: (0, react_uuid_1.default)(),
427
+ };
428
+ }
429
+ //const newOps = [...editOperations, op];
430
+ //setEditOperations();
431
+ // await sendEditOperationsToServer(newOps as EditOperation[]);
432
+ // router.refresh();
433
+ //setEditOperations(newOps);
434
+ if (op)
435
+ setCurrentEditOperation(op);
436
+ setDragObject(undefined);
437
+ }),
438
+ }, 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), pt: {
439
+ mask: {
440
+ onDragOver: () => setHidePalette(true),
441
+ style: {
442
+ left: hidePalette || !componentsPaletteVisible ? "100vw" : 0,
443
+ },
444
+ },
445
+ }, children: page && ((0, jsx_runtime_1.jsx)(ComponentPalette_1.ComponentPalette, { page: page, selection: selection, dragStart: (dragObject) => {
446
+ //console.log("dragging " + JSON.stringify(dragObject));
447
+ setDragObject(dragObject);
448
+ }, dragEnd: () => {
449
+ setDragObject(undefined);
450
+ if (hidePalette) {
451
+ setComponentsPaletteVisible(false);
452
+ setHidePalette(false);
453
+ }
454
+ setSelectedForInsertion("");
455
+ } })) }), (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: 25, className: "alpaca-overflow-scroll", children: (0, jsx_runtime_1.jsxs)(splitter_1.Splitter, { layout: "vertical", children: [(0, jsx_runtime_1.jsx)(splitter_1.SplitterPanel, { className: "overflow-hidden relative", children: (0, jsx_runtime_1.jsx)("div", { className: "inset-0 absolute 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: "inset-0 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), children: children }) }), (0, jsx_runtime_1.jsx)(splitter_1.SplitterPanel, { size: 20, 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 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 relative", children: (0, jsx_runtime_1.jsx)(AiTerminal_1.AiTerminal, { selection: selection, requestRefresh: requestRefresh }) })] }) })] })] })] })] }));
456
+ }
457
+ exports.EditorClient = EditorClient;
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ "use client";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || function (mod) {
20
+ if (mod && mod.__esModule) return mod;
21
+ var result = {};
22
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
23
+ __setModuleDefault(result, mod);
24
+ return result;
25
+ };
26
+ var __importDefault = (this && this.__importDefault) || function (mod) {
27
+ return (mod && mod.__esModule) ? mod : { "default": mod };
28
+ };
29
+ Object.defineProperty(exports, "__esModule", { value: true });
30
+ exports.EditorClientHost = void 0;
31
+ const jsx_runtime_1 = require("react/jsx-runtime");
32
+ const dynamic_1 = __importDefault(require("next/dynamic"));
33
+ const EditorClient = (0, dynamic_1.default)(() => Promise.resolve().then(() => __importStar(require("./EditorClient"))).then((dnd) => dnd.EditorClient), { ssr: false });
34
+ function EditorClientHost({ content, dictionaryObject, children, edit, }) {
35
+ return ((0, jsx_runtime_1.jsx)(EditorClient, { content: content, dictionaryObject: dictionaryObject, edit: edit, children: children }));
36
+ }
37
+ exports.EditorClientHost = EditorClientHost;