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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. package/dist/client-components/api.js +6 -0
  2. package/dist/client-components/index.js +36 -0
  3. package/dist/components/ActionButton.js +9 -0
  4. package/dist/components/Error.js +28 -0
  5. package/dist/config/config.js +654 -0
  6. package/dist/config/types.js +2 -0
  7. package/dist/editor/ComponentInfo.js +31 -0
  8. package/dist/editor/ConfirmationDialog.js +32 -0
  9. package/dist/editor/ContentTree.js +406 -0
  10. package/dist/editor/ContextMenu.js +117 -0
  11. package/dist/editor/Editor.js +55 -0
  12. package/dist/editor/EditorWarning.js +13 -0
  13. package/dist/editor/EditorWarnings.js +24 -0
  14. package/dist/editor/FieldEditorPopup.js +24 -0
  15. package/dist/editor/FieldHistory.js +40 -0
  16. package/dist/editor/FieldList.js +63 -0
  17. package/dist/editor/FieldListField.js +164 -0
  18. package/dist/editor/FieldListFieldWithFallbacks.js +114 -0
  19. package/dist/editor/FloatingToolbar.js +92 -0
  20. package/dist/editor/ImageEditor.js +55 -0
  21. package/dist/editor/InsertMenu.js +164 -0
  22. package/dist/editor/ItemInfo.js +30 -0
  23. package/dist/editor/LinkEditorDialog.js +89 -0
  24. package/dist/editor/MainLayout.js +46 -0
  25. package/dist/editor/NewEditorClient.js +9 -0
  26. package/dist/editor/PictureCropper.js +332 -0
  27. package/dist/editor/PictureEditor.js +104 -0
  28. package/dist/editor/PictureEditorDialog.js +194 -0
  29. package/dist/editor/ScrollingContentTree.js +30 -0
  30. package/dist/editor/Terminal.js +109 -0
  31. package/dist/editor/Titlebar.js +11 -0
  32. package/dist/editor/ai/AiPopup.js +25 -0
  33. package/dist/editor/ai/AiResponseMessage.js +24 -0
  34. package/dist/editor/ai/AiTerminal.js +241 -0
  35. package/dist/editor/ai/AiToolCall.js +18 -0
  36. package/dist/editor/ai/EditorAiTerminal.js +9 -0
  37. package/dist/editor/ai/editorAiContext.js +14 -0
  38. package/dist/editor/client/DialogContext.js +29 -0
  39. package/dist/editor/client/EditorClient.js +1336 -0
  40. package/dist/editor/client/GenericDialog.js +27 -0
  41. package/dist/editor/client/editContext.js +59 -0
  42. package/dist/editor/client/helpers.js +31 -0
  43. package/dist/editor/client/itemsRepository.js +255 -0
  44. package/dist/editor/client/operations.js +398 -0
  45. package/dist/editor/client/pageModelBuilder.js +129 -0
  46. package/dist/editor/commands/commands.js +2 -0
  47. package/dist/editor/commands/componentCommands.js +277 -0
  48. package/dist/editor/commands/createVersionCommand.js +26 -0
  49. package/dist/editor/commands/deleteVersionCommand.js +55 -0
  50. package/dist/editor/commands/itemCommands.js +134 -0
  51. package/dist/editor/commands/localizeItem/LocalizeItemDialog.js +94 -0
  52. package/dist/editor/commands/undo.js +32 -0
  53. package/dist/editor/component-designer/ComponentDesigner.js +58 -0
  54. package/dist/editor/component-designer/ComponentDesignerAiTerminal.js +9 -0
  55. package/dist/editor/component-designer/ComponentDesignerMenu.js +67 -0
  56. package/dist/editor/component-designer/ComponentEditor.js +59 -0
  57. package/dist/editor/component-designer/ComponentRenderingCodeEditor.js +16 -0
  58. package/dist/editor/component-designer/ComponentRenderingEditor.js +71 -0
  59. package/dist/editor/component-designer/ComponentsDropdown.js +22 -0
  60. package/dist/editor/component-designer/PlaceholdersEditor.js +70 -0
  61. package/dist/editor/component-designer/RenderingsDropdown.js +25 -0
  62. package/dist/editor/component-designer/TemplateEditor.js +144 -0
  63. package/dist/editor/component-designer/aiContext.js +18 -0
  64. package/dist/editor/componentTreeHelper.js +97 -0
  65. package/dist/editor/control-center/ControlCenterMenu.js +59 -0
  66. package/dist/editor/control-center/IndexOverview.js +27 -0
  67. package/dist/editor/control-center/IndexSettings.js +106 -0
  68. package/dist/editor/control-center/Status.js +7 -0
  69. package/dist/editor/editor-warnings/ItemLocked.js +40 -0
  70. package/dist/editor/editor-warnings/NoLanguageWriteAccess.js +16 -0
  71. package/dist/editor/editor-warnings/NoWorkflowWriteAccess.js +16 -0
  72. package/dist/editor/editor-warnings/NoWriteAccess.js +14 -0
  73. package/dist/editor/editor-warnings/ValidationErrors.js +27 -0
  74. package/dist/editor/field-types/AttachmentEditor.js +7 -0
  75. package/dist/editor/field-types/CheckboxEditor.js +32 -0
  76. package/dist/editor/field-types/DropLinkEditor.js +51 -0
  77. package/dist/editor/field-types/DropListEditor.js +58 -0
  78. package/dist/editor/field-types/ImageFieldEditor.js +36 -0
  79. package/dist/editor/field-types/InternalLinkFieldEditor.js +64 -0
  80. package/dist/editor/field-types/LinkFieldEditor.js +58 -0
  81. package/dist/editor/field-types/MultiLineText.js +35 -0
  82. package/dist/editor/field-types/PictureFieldEditor.js +59 -0
  83. package/dist/editor/field-types/RawEditor.js +33 -0
  84. package/dist/editor/field-types/ReactQuill.js +366 -0
  85. package/dist/editor/field-types/RichTextEditor.js +46 -0
  86. package/dist/editor/field-types/RichTextEditorComponent.js +72 -0
  87. package/dist/editor/field-types/SingleLineText.js +92 -0
  88. package/dist/editor/field-types/TreeListEditor.js +137 -0
  89. package/dist/editor/fieldTypes.js +2 -0
  90. package/dist/editor/media-selector/AiImageSearch.js +110 -0
  91. package/dist/editor/media-selector/AiImageSearchPrompt.js +58 -0
  92. package/dist/editor/media-selector/MediaSelector.js +11 -0
  93. package/dist/editor/media-selector/Preview.js +9 -0
  94. package/dist/editor/media-selector/Thumbnails.js +11 -0
  95. package/dist/editor/media-selector/TreeSelector.js +171 -0
  96. package/dist/editor/media-selector/UploadZone.js +80 -0
  97. package/dist/editor/menubar/ActionsMenu.js +33 -0
  98. package/dist/editor/menubar/ActiveUsers.js +13 -0
  99. package/dist/editor/menubar/ApproveAndPublish.js +13 -0
  100. package/dist/editor/menubar/BrowseHistory.js +14 -0
  101. package/dist/editor/menubar/ItemLanguageVersion.js +36 -0
  102. package/dist/editor/menubar/LanguageSelector.js +33 -0
  103. package/dist/editor/menubar/Menu.js +65 -0
  104. package/dist/editor/menubar/NavButtons.js +43 -0
  105. package/dist/editor/menubar/PageSelector.js +50 -0
  106. package/dist/editor/menubar/PageViewerControls.js +37 -0
  107. package/dist/editor/menubar/Separator.js +8 -0
  108. package/dist/editor/menubar/SiteInfo.js +26 -0
  109. package/dist/editor/menubar/User.js +18 -0
  110. package/dist/editor/menubar/VersionSelector.js +49 -0
  111. package/dist/editor/page-editor-chrome/CommentHighlighting.js +214 -0
  112. package/dist/editor/page-editor-chrome/CommentHighlightings.js +17 -0
  113. package/dist/editor/page-editor-chrome/FieldActionIndicator.js +27 -0
  114. package/dist/editor/page-editor-chrome/FieldActionIndicators.js +15 -0
  115. package/dist/editor/page-editor-chrome/FieldEditedIndicator.js +27 -0
  116. package/dist/editor/page-editor-chrome/FieldEditedIndicators.js +15 -0
  117. package/dist/editor/page-editor-chrome/FrameMenu.js +178 -0
  118. package/dist/editor/page-editor-chrome/FrameMenus.js +24 -0
  119. package/dist/editor/page-editor-chrome/InlineEditor.js +101 -0
  120. package/dist/editor/page-editor-chrome/LockedFieldIndicator.js +35 -0
  121. package/dist/editor/page-editor-chrome/NoLayout.js +21 -0
  122. package/dist/editor/page-editor-chrome/PageEditorChrome.js +65 -0
  123. package/dist/editor/page-editor-chrome/PictureEditorOverlay.js +109 -0
  124. package/dist/editor/page-editor-chrome/PlaceholderDropZone.js +82 -0
  125. package/dist/editor/page-editor-chrome/PlaceholderDropZones.js +147 -0
  126. package/dist/editor/page-viewer/DeviceToolbar.js +21 -0
  127. package/dist/editor/page-viewer/EditorForm.js +130 -0
  128. package/dist/editor/page-viewer/MiniMap.js +257 -0
  129. package/dist/editor/page-viewer/PageViewer.js +64 -0
  130. package/dist/editor/page-viewer/PageViewerFrame.js +696 -0
  131. package/dist/editor/page-viewer/pageViewContext.js +117 -0
  132. package/dist/editor/pageModel.js +2 -0
  133. package/dist/editor/picture-shared.js +28 -0
  134. package/dist/editor/reviews/Comment.js +112 -0
  135. package/dist/editor/reviews/Comments.js +24 -0
  136. package/dist/editor/reviews/PreviewInfo.js +13 -0
  137. package/dist/editor/reviews/Reviews.js +165 -0
  138. package/dist/editor/reviews/reviewCommands.js +44 -0
  139. package/dist/editor/reviews/useReviews.js +48 -0
  140. package/dist/editor/services/aiService.js +99 -0
  141. package/dist/editor/services/componentDesignerService.js +79 -0
  142. package/dist/editor/services/contentService.js +104 -0
  143. package/dist/editor/services/editService.js +322 -0
  144. package/dist/editor/services/indexService.js +25 -0
  145. package/dist/editor/services/reviewsService.js +43 -0
  146. package/dist/editor/services/serviceHelper.js +67 -0
  147. package/dist/editor/services/systemService.js +7 -0
  148. package/dist/editor/services/translationService.js +15 -0
  149. package/dist/editor/services-server/api.js +119 -0
  150. package/dist/editor/services-server/graphQL.js +56 -0
  151. package/dist/editor/sidebar/ComponentPalette.js +55 -0
  152. package/dist/editor/sidebar/ComponentTree.js +362 -0
  153. package/dist/editor/sidebar/Debug.js +60 -0
  154. package/dist/editor/sidebar/DictionaryEditor.js +160 -0
  155. package/dist/editor/sidebar/EditHistory.js +74 -0
  156. package/dist/editor/sidebar/GraphQL.js +115 -0
  157. package/dist/editor/sidebar/Insert.js +24 -0
  158. package/dist/editor/sidebar/MainContentTree.js +52 -0
  159. package/dist/editor/sidebar/Performance.js +34 -0
  160. package/dist/editor/sidebar/Sessions.js +31 -0
  161. package/dist/editor/sidebar/Sidebar.js +15 -0
  162. package/dist/editor/sidebar/SidebarView.js +76 -0
  163. package/dist/editor/sidebar/Translations.js +160 -0
  164. package/dist/editor/sidebar/Validation.js +52 -0
  165. package/dist/editor/sidebar/ViewSelector.js +15 -0
  166. package/dist/editor/sidebar/Workbox.js +80 -0
  167. package/dist/editor/ui/CenteredMessage.js +7 -0
  168. package/dist/editor/ui/CopyToClipboardButton.js +17 -0
  169. package/dist/editor/ui/DialogButtons.js +7 -0
  170. package/dist/editor/ui/Icons.js +75 -0
  171. package/dist/editor/ui/ItemNameDialog.js +45 -0
  172. package/dist/editor/ui/ItemNameDialogNew.js +61 -0
  173. package/dist/editor/ui/ItemSearch.js +93 -0
  174. package/dist/editor/ui/PerfectTree.js +223 -0
  175. package/dist/editor/ui/Section.js +12 -0
  176. package/dist/editor/ui/SimpleIconButton.js +11 -0
  177. package/dist/editor/ui/SimpleMenu.js +9 -0
  178. package/dist/editor/ui/SimpleTable.js +11 -0
  179. package/dist/editor/ui/SimpleTabs.js +21 -0
  180. package/dist/editor/ui/SimpleToolbar.js +7 -0
  181. package/dist/editor/ui/Spinner.js +7 -0
  182. package/dist/editor/ui/Splitter.js +187 -0
  183. package/dist/editor/ui/StackedPanels.js +69 -0
  184. package/dist/editor/ui/Toolbar.js +7 -0
  185. package/dist/editor/utils/id-helper.js +7 -0
  186. package/dist/editor/utils/insertOptions.js +45 -0
  187. package/dist/editor/utils/itemutils.js +25 -0
  188. package/dist/editor/utils/useMemoDebug.js +20 -0
  189. package/dist/editor/utils.js +328 -0
  190. package/dist/editor/views/CompareView.js +147 -0
  191. package/dist/editor/views/EditView.js +17 -0
  192. package/dist/editor/views/ItemEditor.js +24 -0
  193. package/dist/editor/views/SingleEditView.js +25 -0
  194. package/dist/index.js +22 -0
  195. package/dist/page-wizard/PageWizard.js +62 -0
  196. package/dist/page-wizard/SelectWizard.js +43 -0
  197. package/dist/page-wizard/WizardSteps.js +71 -0
  198. package/dist/page-wizard/service.js +26 -0
  199. package/dist/page-wizard/startPageWizardCommand.js +23 -0
  200. package/dist/page-wizard/steps/BuildPageStep.js +138 -0
  201. package/dist/page-wizard/steps/CollectStep.js +124 -0
  202. package/dist/page-wizard/steps/ComponentTypesSelector.js +211 -0
  203. package/dist/page-wizard/steps/Components.js +94 -0
  204. package/dist/page-wizard/steps/CreatePage.js +142 -0
  205. package/dist/page-wizard/steps/CreatePageAndLayoutStep.js +230 -0
  206. package/dist/page-wizard/steps/EditButton.js +7 -0
  207. package/dist/page-wizard/steps/FieldEditor.js +30 -0
  208. package/dist/page-wizard/steps/Generate.js +11 -0
  209. package/dist/page-wizard/steps/ImagesStep.js +159 -0
  210. package/dist/page-wizard/steps/LayoutStep.js +120 -0
  211. package/dist/page-wizard/steps/SelectStep.js +150 -0
  212. package/dist/page-wizard/steps/schema.js +140 -0
  213. package/dist/page-wizard/steps/usePageCreator.js +194 -0
  214. package/dist/splash-screen/NewPage.js +131 -0
  215. package/dist/splash-screen/SectionHeadline.js +9 -0
  216. package/dist/splash-screen/SplashScreen.js +81 -0
  217. package/dist/tour/Tour.js +321 -0
  218. package/dist/tour/default-tour.js +231 -0
  219. package/dist/tour/preview-tour.js +93 -0
  220. package/dist/tsconfig.build.tsbuildinfo +1 -0
  221. package/dist/types.js +2 -0
  222. package/package.json +1 -1
  223. package/src/editor/sidebar/ComponentTree.tsx +512 -512
@@ -0,0 +1,92 @@
1
+ "use client";
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.SingleLineText = SingleLineText;
5
+ const jsx_runtime_1 = require("react/jsx-runtime");
6
+ const inputtext_1 = require("primereact/inputtext");
7
+ const editContext_1 = require("../client/editContext");
8
+ const react_1 = require("react");
9
+ function SingleLineText({ field, readOnly, updateFieldValue, }) {
10
+ const editContextRef = (0, editContext_1.useEditContextRef)();
11
+ const editContext = (0, editContext_1.useEditContext)();
12
+ const modifiedFieldsContext = (0, editContext_1.useModifiedFieldsContext)();
13
+ const inputRef = (0, react_1.useRef)(null);
14
+ // const [selectionStart, setSelectionStart] = useState(0);
15
+ // const [selectionEnd, setSelectionEnd] = useState(0);
16
+ if (!editContextRef.current)
17
+ return;
18
+ const fieldItem = field.descriptor.item;
19
+ const [value, setValue] = (0, react_1.useState)(undefined);
20
+ const modifiedField = modifiedFieldsContext?.modifiedFields.find((x) => x.fieldId === field.id &&
21
+ x.item.id === fieldItem.id &&
22
+ x.item.language === fieldItem.language &&
23
+ x.item.version === fieldItem.version);
24
+ (0, react_1.useEffect)(() => {
25
+ if (inputRef.current !== document.activeElement) {
26
+ if (field.isHistoric)
27
+ setValue(field.value);
28
+ else {
29
+ setValue(modifiedField?.value ?? field.value);
30
+ }
31
+ }
32
+ }, [field.value, modifiedFieldsContext?.modifiedFields]);
33
+ if (!fieldItem)
34
+ return;
35
+ const handleChange = (e) => {
36
+ if (editContextRef.current?.operations.undoing) {
37
+ return;
38
+ }
39
+ const newValue = e.target.value;
40
+ if (newValue !== value) {
41
+ setValue(newValue);
42
+ updateFieldValue(newValue);
43
+ }
44
+ };
45
+ const handleSelect = (e) => {
46
+ const target = e.target;
47
+ const range = {
48
+ fieldId: field.id,
49
+ startOffset: target.selectionStart || 0,
50
+ endOffset: target.selectionEnd || 0,
51
+ text: target.value.slice(target.selectionStart || 0, target.selectionEnd || 0),
52
+ };
53
+ editContextRef.current?.setSelectedRange(range);
54
+ };
55
+ (0, react_1.useEffect)(() => {
56
+ if (editContextRef.current?.focusedField?.fieldId === field.id &&
57
+ editContextRef.current?.focusedField?.item.id === fieldItem.id &&
58
+ editContextRef.current?.focusedField?.item.language ===
59
+ fieldItem.language &&
60
+ editContextRef.current?.focusedField?.item.version === fieldItem.version) {
61
+ const range = editContextRef.current.selectedRange;
62
+ if (range && inputRef.current) {
63
+ inputRef.current.setSelectionRange(range.startOffset, range.endOffset);
64
+ // setSelectionStart(range.startOffset);
65
+ // setSelectionEnd(range.endOffset);
66
+ }
67
+ }
68
+ }, [editContext?.selectedRange]);
69
+ // // Calculate the position of the highlight
70
+ // const getHighlightStyle = () => {
71
+ // if (!inputRef.current || selectionStart === selectionEnd) return {};
72
+ // const text = value || "";
73
+ // const beforeSelection = text.slice(0, selectionStart);
74
+ // const selection = text.slice(selectionStart, selectionEnd);
75
+ // // Use a temporary span to measure text width
76
+ // const temp = document.createElement("span");
77
+ // temp.style.font = window.getComputedStyle(inputRef.current).font;
78
+ // temp.style.visibility = "hidden";
79
+ // temp.style.position = "absolute";
80
+ // document.body.appendChild(temp);
81
+ // temp.textContent = beforeSelection;
82
+ // const startPos = temp.getBoundingClientRect().width + 5; // padding
83
+ // temp.textContent = selection;
84
+ // const width = temp.getBoundingClientRect().width;
85
+ // document.body.removeChild(temp);
86
+ // return {
87
+ // left: `${startPos}px`,
88
+ // width: `${width}px`,
89
+ // };
90
+ // };
91
+ return ((0, jsx_runtime_1.jsx)("div", { className: "relative", children: (0, jsx_runtime_1.jsx)(inputtext_1.InputText, { ref: inputRef, value: value || "", disabled: readOnly, className: "p-1.5 focus-shadow text-sm", style: { width: "100%" }, onChange: handleChange, onSelect: handleSelect }, fieldItem.id + field.id + fieldItem.language + fieldItem.version) }));
92
+ }
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.default = TreeListEditor;
7
+ const jsx_runtime_1 = require("react/jsx-runtime");
8
+ const splitter_1 = require("primereact/splitter");
9
+ const editContext_1 = require("../client/editContext");
10
+ const react_1 = require("react");
11
+ const overlaypanel_1 = require("primereact/overlaypanel");
12
+ const listbox_1 = require("primereact/listbox");
13
+ const editService_1 = require("../services/editService");
14
+ const SimpleIconButton_1 = require("../ui/SimpleIconButton");
15
+ const utils_1 = require("../utils");
16
+ const ItemSearch_1 = __importDefault(require("../ui/ItemSearch"));
17
+ const button_1 = require("primereact/button");
18
+ const ContentTree_1 = __importDefault(require("../ContentTree"));
19
+ function TreeListEditor({ field, readOnly, }) {
20
+ const editContext = (0, editContext_1.useEditContext)();
21
+ const [selectedItemNodesInTree, setSelectedItemNodesInTree] = (0, react_1.useState)([]);
22
+ const [selectedFromList, setSelectedFromList] = (0, react_1.useState)([]);
23
+ const overlayPanelRef = (0, react_1.useRef)(null);
24
+ const [currentItemId, setCurrentItemId] = (0, react_1.useState)("");
25
+ const [rootItemIds, setRootItemIds] = (0, react_1.useState)([]);
26
+ const [values, setValues] = (0, react_1.useState)([]);
27
+ const [hoveredItemId, setHoveredItemId] = (0, react_1.useState)();
28
+ const [hoveredItem, setHoveredItem] = (0, react_1.useState)();
29
+ if (!editContext)
30
+ return;
31
+ (0, react_1.useEffect)(() => {
32
+ const loadItem = async () => {
33
+ if (!hoveredItemId)
34
+ return;
35
+ const item = await editContext.itemsRepository.getItem({
36
+ id: hoveredItemId,
37
+ language: editContext.currentItemDescriptor?.language ?? "en",
38
+ version: 0,
39
+ });
40
+ if (item)
41
+ setHoveredItem(item);
42
+ };
43
+ loadItem();
44
+ }, [hoveredItemId]);
45
+ (0, react_1.useEffect)(() => {
46
+ if (editContext.lockedField?.fieldId === field.descriptor.fieldId &&
47
+ editContext.lockedField.item.id == field.descriptor.item.id &&
48
+ editContext.lockedField.item.language == field.descriptor.item.language &&
49
+ editContext.lockedField.item.version == field.descriptor.item.version)
50
+ return;
51
+ setValues(field.value || []);
52
+ }, [field.value]);
53
+ (0, react_1.useEffect)(() => {
54
+ const loadLookupSources = async () => {
55
+ const datasources = await (0, editService_1.getLookupSources)(field, editContext.sessionId);
56
+ if (datasources.length) {
57
+ setRootItemIds(datasources.map((x) => x.id));
58
+ }
59
+ else
60
+ setRootItemIds(["{11111111-1111-1111-1111-111111111111}"]);
61
+ };
62
+ loadLookupSources();
63
+ }, [field.id, field.descriptor.item.id]);
64
+ const trimPath = (path) => {
65
+ const splitPath = path.split("/");
66
+ if (splitPath.length > 2) {
67
+ return (splitPath[splitPath.length - 2] + "/" + splitPath[splitPath.length - 1]);
68
+ }
69
+ return path;
70
+ };
71
+ async function removeFromList(items) {
72
+ const newValues = values.filter((x) => !items.find((i) => x.id == i.id));
73
+ setValues(newValues);
74
+ await editContext?.operations.editField({
75
+ field: field.descriptor,
76
+ value: newValues,
77
+ rawValue: newValues.map((x) => (0, utils_1.normalizeGuid)(x.id)).join("|"),
78
+ refresh: "waitForQuietPeriod",
79
+ });
80
+ }
81
+ async function addToList(itemNodes) {
82
+ setSelectedItemNodesInTree([]);
83
+ const newValues = [...values];
84
+ itemNodes.forEach((node) => {
85
+ if (!newValues.find((x) => x.id == node.id)) {
86
+ newValues.push({
87
+ id: node.id,
88
+ path: node.path || node.name,
89
+ name: node.name,
90
+ icon: node.icon,
91
+ idPath: node.idPath,
92
+ });
93
+ }
94
+ });
95
+ setValues(newValues);
96
+ await editContext?.operations.editField({
97
+ field: field.descriptor,
98
+ value: newValues,
99
+ rawValue: newValues.map((x) => (0, utils_1.normalizeGuid)(x.id)).join("|"),
100
+ refresh: "waitForQuietPeriod",
101
+ });
102
+ }
103
+ return ((0, jsx_runtime_1.jsxs)("div", { className: "border focus-shadow border-gray-200", children: [(0, jsx_runtime_1.jsx)("div", { className: "bg-white mb-1 p-2 border-b border-gray-200", children: (0, jsx_runtime_1.jsx)(ItemSearch_1.default, { rootItemIds: rootItemIds.map((x) => (0, utils_1.normalizeGuid)(x)), itemSelected: async (item) => {
104
+ addToList([
105
+ {
106
+ id: item.id,
107
+ path: item.path || item.name,
108
+ idPath: item.idPath,
109
+ name: item.name || "",
110
+ icon: item.icon,
111
+ },
112
+ ]);
113
+ } }) }), (0, jsx_runtime_1.jsxs)(splitter_1.Splitter, { className: "h-60", children: [(0, jsx_runtime_1.jsx)(splitter_1.SplitterPanel, { size: 50, className: "relative", children: (0, jsx_runtime_1.jsx)("div", { className: "absolute inset-0 overflow-auto", children: (0, jsx_runtime_1.jsx)(ContentTree_1.default, { expandIdPath: hoveredItem?.idPath, language: editContext.currentItemDescriptor?.language ?? "en", onDoubleClick: (node) => {
114
+ if (!readOnly)
115
+ addToList([node]);
116
+ }, selectionMode: "multiple", selectedItemIds: selectedItemNodesInTree.length
117
+ ? selectedItemNodesInTree.map((x) => x.id)
118
+ : hoveredItemId
119
+ ? [hoveredItemId]
120
+ : [], onSelectionChange: (e) => {
121
+ setSelectedItemNodesInTree(e);
122
+ }, rootItemIds: rootItemIds, includeItemPath: true }) }) }), (0, jsx_runtime_1.jsx)(splitter_1.SplitterPanel, { children: (0, jsx_runtime_1.jsx)("div", { className: "h-full w-full relative", children: (0, jsx_runtime_1.jsxs)("div", { className: "absolute inset-0 flex", children: [(0, jsx_runtime_1.jsxs)("div", { className: "bg-gray-100 flex flex-col justify-center gap-1 p-1", children: [(0, jsx_runtime_1.jsx)(SimpleIconButton_1.SimpleIconButton, { label: "Add", icon: "pi pi-angle-right", onClick: () => addToList(selectedItemNodesInTree), disabled: readOnly }), (0, jsx_runtime_1.jsx)(SimpleIconButton_1.SimpleIconButton, { label: "Remove", icon: "pi pi-angle-left", onClick: () => removeFromList(selectedFromList), disabled: readOnly })] }), (0, jsx_runtime_1.jsx)("div", { className: "flex-1 h-full relative", children: (0, jsx_runtime_1.jsx)(listbox_1.ListBox, { className: "absolute inset-0 overflow-auto text-xs", options: values, optionLabel: "path", metaKeySelection: true, emptyMessage: "None selected", multiple: true, value: selectedFromList, onChange: (e) => setSelectedFromList(e.value), itemTemplate: (option) => ((0, jsx_runtime_1.jsxs)("div", { className: "select-none hover:bg-gray-50 relative group flex items-center gap-1", onMouseEnter: async () => {
123
+ setHoveredItemId(option.id);
124
+ // setExpandIdPath(option.idPath || "");
125
+ setSelectedItemNodesInTree([option]);
126
+ }, onDoubleClick: () => {
127
+ if (!readOnly)
128
+ removeFromList([option]);
129
+ }, children: [(0, jsx_runtime_1.jsx)("img", { src: option.icon, className: "w-4 h-4 mr-2" }), trimPath(option.path), " ", (0, jsx_runtime_1.jsx)("button", { className: "opacity-0 group-hover:opacity-100 transition-opacity", onClick: (e) => {
130
+ e.stopPropagation();
131
+ setCurrentItemId(option.id);
132
+ overlayPanelRef.current?.toggle(e);
133
+ }, title: "Open", children: (0, jsx_runtime_1.jsx)("i", { className: "pi pi-arrow-up-right text-xs text-gray-500" }) })] })) }) })] }) }) })] }), (0, jsx_runtime_1.jsx)(overlaypanel_1.OverlayPanel, { ref: overlayPanelRef, className: "p-0", showCloseIcon: true, children: (0, jsx_runtime_1.jsx)("div", { className: "p-3", children: (0, jsx_runtime_1.jsx)("div", { className: "flex justify-end gap-2", children: (0, jsx_runtime_1.jsx)(button_1.Button, { className: "px-3 py-1 bg-blue-500 text-white rounded text-sm", onClick: () => {
134
+ editContext.loadItem(currentItemId);
135
+ overlayPanelRef.current?.hide();
136
+ }, children: "Open" }) }) }) })] }));
137
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.AiImageSearch = AiImageSearch;
7
+ const jsx_runtime_1 = require("react/jsx-runtime");
8
+ const react_1 = require("react");
9
+ const use_debounce_1 = require("use-debounce");
10
+ const editorAiContext_1 = require("../ai/editorAiContext");
11
+ const aiService_1 = require("../services/aiService");
12
+ const editContext_1 = require("../client/editContext");
13
+ const progressspinner_1 = require("primereact/progressspinner");
14
+ const inputtext_1 = require("primereact/inputtext");
15
+ const Thumbnails_1 = require("./Thumbnails");
16
+ const splitter_1 = require("primereact/splitter");
17
+ const Preview_1 = require("./Preview");
18
+ const DialogButtons_1 = __importDefault(require("../ui/DialogButtons"));
19
+ const button_1 = require("primereact/button");
20
+ function AiImageSearch({ onMediaSelected, onHide, }) {
21
+ const [prompt, setPrompt] = (0, react_1.useState)("");
22
+ const [loadingPrompt, setLoadingPrompt] = (0, react_1.useState)(false);
23
+ const [loadingThumbnails, setLoadingThumbnails] = (0, react_1.useState)(false);
24
+ const [images, setImages] = (0, react_1.useState)([]);
25
+ const [selectedImage, setSelectedImage] = (0, react_1.useState)();
26
+ const editContext = (0, editContext_1.useEditContext)();
27
+ const currentSuggestionRequest = (0, react_1.useRef)(null);
28
+ const inputRef = (0, react_1.useRef)(null);
29
+ (0, react_1.useEffect)(() => {
30
+ suggestPrompt();
31
+ if (inputRef.current) {
32
+ inputRef.current.focus();
33
+ }
34
+ }, []);
35
+ const suggestPrompt = async () => {
36
+ if (editContext) {
37
+ setPrompt("");
38
+ setLoadingPrompt(true);
39
+ if (currentSuggestionRequest.current) {
40
+ currentSuggestionRequest.current.abort();
41
+ }
42
+ const abortController = new AbortController();
43
+ currentSuggestionRequest.current = abortController;
44
+ try {
45
+ const result = await (0, aiService_1.executePrompt)([
46
+ {
47
+ content: "Please extract search terms from the field context that can be used to find a matching image. " +
48
+ "I will use the search terms to find an image and populate the image field. If the component does not provide enough context, " +
49
+ "also get content from the parent component using the get-content function. " +
50
+ "Do not consider current image field contents. " +
51
+ "Reply with search terms only!",
52
+ name: "user",
53
+ role: "user",
54
+ },
55
+ ], editContext, editorAiContext_1.createEditorAiContext, ["get-content"], true, { signal: abortController.signal });
56
+ setLoadingPrompt(false);
57
+ const newPrompt = result.responseText.replaceAll("\n", "");
58
+ setPrompt(newPrompt);
59
+ }
60
+ catch (error) {
61
+ if (error instanceof Error && error.name !== "AbortError") {
62
+ console.error("Failed to fetch prompt:", error);
63
+ }
64
+ setLoadingPrompt(false);
65
+ }
66
+ finally {
67
+ currentSuggestionRequest.current = null;
68
+ }
69
+ }
70
+ };
71
+ const handleSearch = (0, use_debounce_1.useDebouncedCallback)(async (searchPrompt) => {
72
+ if (!editContext)
73
+ return;
74
+ setLoadingThumbnails(true);
75
+ const result = await (0, aiService_1.executeSearch)({
76
+ query: searchPrompt,
77
+ editContext,
78
+ maxResults: 50,
79
+ index: "media",
80
+ skipValidation: true,
81
+ });
82
+ if (result.type == "success") {
83
+ setImages(result.data);
84
+ }
85
+ else {
86
+ editContext.showToast({
87
+ severity: "error",
88
+ summary: "Error searching",
89
+ detail: result.response.statusText,
90
+ });
91
+ }
92
+ setLoadingThumbnails(false);
93
+ }, 300);
94
+ const onPromptChange = (e) => {
95
+ const newPrompt = e.target.value;
96
+ setPrompt(newPrompt);
97
+ if (currentSuggestionRequest.current) {
98
+ currentSuggestionRequest.current.abort();
99
+ }
100
+ };
101
+ (0, react_1.useEffect)(() => {
102
+ if (prompt) {
103
+ handleSearch(prompt);
104
+ }
105
+ }, [prompt]);
106
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)(splitter_1.Splitter, { className: "flex-1 border-0", children: [(0, jsx_runtime_1.jsx)(splitter_1.SplitterPanel, { size: 50, className: "flex flex-col pt-4", children: (0, jsx_runtime_1.jsxs)("div", { className: "flex flex-col gap-2 text-sm pt-2 px-2 flex-1", children: [(0, jsx_runtime_1.jsxs)("div", { children: ["Search prompt", (0, jsx_runtime_1.jsxs)("div", { className: "flex gap-2 items-center", children: [(0, jsx_runtime_1.jsx)(inputtext_1.InputText, { ref: inputRef, value: prompt, onChange: onPromptChange, className: "flex-1" }), loadingPrompt && ((0, jsx_runtime_1.jsx)("div", { className: "flex items-center h-10", children: (0, jsx_runtime_1.jsx)(progressspinner_1.ProgressSpinner, { style: { width: "24px", height: "24px" } }) })), !loadingPrompt && ((0, jsx_runtime_1.jsx)(button_1.Button, { icon: "pi pi-sparkles", onClick: () => suggestPrompt(), label: "Suggest", size: "small" }))] })] }), (0, jsx_runtime_1.jsxs)("div", { className: "flex-1 relative", children: [loadingThumbnails && ((0, jsx_runtime_1.jsx)("div", { className: "flex items-center h-full", children: (0, jsx_runtime_1.jsx)(progressspinner_1.ProgressSpinner, { style: { width: "24px", height: "24px" } }) })), (0, jsx_runtime_1.jsx)(Thumbnails_1.Thumbnails, { images: images, selectedImage: selectedImage, setSelectedImage: setSelectedImage, onMediaSelected: onMediaSelected, onHide: onHide })] })] }) }), (0, jsx_runtime_1.jsx)(splitter_1.SplitterPanel, { size: 50, className: " relative", children: (0, jsx_runtime_1.jsx)(Preview_1.Preview, { selectedImage: selectedImage }) })] }), (0, jsx_runtime_1.jsxs)(DialogButtons_1.default, { children: [(0, jsx_runtime_1.jsx)(button_1.Button, { disabled: !selectedImage, onClick: () => {
107
+ onMediaSelected(selectedImage.id);
108
+ onHide();
109
+ }, children: "Select" }), (0, jsx_runtime_1.jsx)(button_1.Button, { onClick: () => onHide(), children: "Cancel" })] })] }));
110
+ }
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AiImageSearchPrompt = AiImageSearchPrompt;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const button_1 = require("primereact/button");
6
+ const inputtext_1 = require("primereact/inputtext");
7
+ const react_1 = require("react");
8
+ const editContext_1 = require("../client/editContext");
9
+ const aiService_1 = require("../services/aiService");
10
+ const editorAiContext_1 = require("../ai/editorAiContext");
11
+ const progressspinner_1 = require("primereact/progressspinner");
12
+ function AiImageSearchPrompt({ onSearchPromptChange, }) {
13
+ const editContext = (0, editContext_1.useEditContext)();
14
+ const inputRef = (0, react_1.useRef)(null);
15
+ const [prompt, setPrompt] = (0, react_1.useState)("");
16
+ const [loadingPrompt, setLoadingPrompt] = (0, react_1.useState)(false);
17
+ const currentSuggestionRequest = (0, react_1.useRef)(null);
18
+ (0, react_1.useEffect)(() => {
19
+ onSearchPromptChange(prompt);
20
+ }, [prompt]);
21
+ const suggestPrompt = async () => {
22
+ if (editContext) {
23
+ setPrompt("");
24
+ setLoadingPrompt(true);
25
+ if (currentSuggestionRequest.current) {
26
+ currentSuggestionRequest.current.abort();
27
+ }
28
+ const abortController = new AbortController();
29
+ currentSuggestionRequest.current = abortController;
30
+ try {
31
+ const result = await (0, aiService_1.executePrompt)([
32
+ {
33
+ content: "Please extract search terms from the field context that can be used to find a matching image. " +
34
+ "I will use the search terms to find an image and populate the image field. If the component does not provide enough context, " +
35
+ "also get content from the parent component using the get-content function. " +
36
+ "Do not consider current image field contents. " +
37
+ "Reply with search terms only!",
38
+ name: "user",
39
+ role: "user",
40
+ },
41
+ ], editContext, editorAiContext_1.createEditorAiContext, ["get-content"], true, { signal: abortController.signal });
42
+ setLoadingPrompt(false);
43
+ const newPrompt = result.responseText.replaceAll("\n", "");
44
+ setPrompt(newPrompt);
45
+ }
46
+ catch (error) {
47
+ if (error instanceof Error && error.name !== "AbortError") {
48
+ console.error("Failed to fetch prompt:", error);
49
+ }
50
+ setLoadingPrompt(false);
51
+ }
52
+ finally {
53
+ currentSuggestionRequest.current = null;
54
+ }
55
+ }
56
+ };
57
+ return ((0, jsx_runtime_1.jsxs)("div", { className: "flex gap-2 items-center m-2", children: [(0, jsx_runtime_1.jsx)("i", { className: "pi pi-search text-gray-500" }), (0, jsx_runtime_1.jsx)(inputtext_1.InputText, { ref: inputRef, value: prompt, onChange: (e) => setPrompt(e.target.value), className: "flex-1" }), loadingPrompt && ((0, jsx_runtime_1.jsx)("div", { className: "flex items-center h-10", children: (0, jsx_runtime_1.jsx)(progressspinner_1.ProgressSpinner, { style: { width: "24px", height: "24px" } }) })), !loadingPrompt && ((0, jsx_runtime_1.jsx)(button_1.Button, { icon: "pi pi-sparkles", onClick: () => suggestPrompt(), label: "Suggest", size: "small" }))] }));
58
+ }
@@ -0,0 +1,11 @@
1
+ "use client";
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.MediaSelector = void 0;
5
+ const jsx_runtime_1 = require("react/jsx-runtime");
6
+ const dialog_1 = require("primereact/dialog");
7
+ const TreeSelector_1 = require("./TreeSelector");
8
+ const MediaSelector = ({ visible, onHide, onMediaSelected, selectedIdPath, mode, language, }) => {
9
+ return ((0, jsx_runtime_1.jsx)(dialog_1.Dialog, { style: { width: "80%", height: "80%" }, visible: visible, onHide: onHide, header: mode === "video" ? "Select Video" : "Select Image", "data-testid": "media-selector-dialog", children: (0, jsx_runtime_1.jsx)("div", { className: "flex flex-col h-full ", children: (0, jsx_runtime_1.jsx)(TreeSelector_1.TreeSelector, { language: language, selectedIdPath: selectedIdPath, onHide: onHide, onMediaSelected: onMediaSelected, mode: mode === "video" ? "video" : "image" }) }) }));
10
+ };
11
+ exports.MediaSelector = MediaSelector;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Preview = Preview;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ function Preview({ selectedImage }) {
6
+ if (!selectedImage)
7
+ return null;
8
+ return ((0, jsx_runtime_1.jsx)("div", { className: "m-4 flex justify-center align-center absolute inset-0", children: (0, jsx_runtime_1.jsx)("img", { src: selectedImage?.previewUrl, className: "object-contain", fetchPriority: "high" }) }));
9
+ }
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Thumbnails = Thumbnails;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const utils_1 = require("primereact/utils");
6
+ function Thumbnails({ images, selectedImage, setSelectedImage, onMediaSelected, onHide, }) {
7
+ return ((0, jsx_runtime_1.jsx)("div", { className: "flex flex-col absolute inset-0 overflow-auto p-2", children: (0, jsx_runtime_1.jsx)("div", { className: "flex flex-wrap content-start items-start gap-2", children: images?.map((t) => ((0, jsx_runtime_1.jsxs)("div", { className: (0, utils_1.classNames)(selectedImage?.id == t.id ? "shadow-md" : "", "w-24 flex flex-col justify-between hover:shadow-md cursor-pointer p-1"), onDoubleClick: () => {
8
+ onMediaSelected(t.id);
9
+ onHide();
10
+ }, onClick: () => setSelectedImage(t), children: [(0, jsx_runtime_1.jsx)("div", { className: "h-24 w-24 flex justify-center items-center", children: (0, jsx_runtime_1.jsx)("img", { src: t.thumbUrl }) }), (0, jsx_runtime_1.jsx)("div", { className: "text-xs break-all", children: t.name })] }, t.id))) }) }));
11
+ }
@@ -0,0 +1,171 @@
1
+ "use client";
2
+ "use strict";
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.TreeSelector = void 0;
8
+ const jsx_runtime_1 = require("react/jsx-runtime");
9
+ const ContentTree_1 = __importDefault(require("../ContentTree"));
10
+ const splitter_1 = require("primereact/splitter");
11
+ const react_1 = require("react");
12
+ const contentService_1 = require("../services/contentService");
13
+ const editContext_1 = require("../client/editContext");
14
+ const button_1 = require("primereact/button");
15
+ const aiService_1 = require("../services/aiService");
16
+ const fileupload_1 = require("primereact/fileupload");
17
+ const DialogButtons_1 = __importDefault(require("../ui/DialogButtons"));
18
+ const Icons_1 = require("../ui/Icons");
19
+ const Thumbnails_1 = require("./Thumbnails");
20
+ const Preview_1 = require("./Preview");
21
+ const UploadZone_1 = require("./UploadZone");
22
+ const AiImageSearchPrompt_1 = require("./AiImageSearchPrompt");
23
+ const use_debounce_1 = require("use-debounce");
24
+ const progressspinner_1 = require("primereact/progressspinner");
25
+ const TreeSelector = ({ onHide, onMediaSelected, selectedIdPath, language, mode, }) => {
26
+ const [selectedFolderId, setSelectedFolderId] = (0, react_1.useState)();
27
+ const [images, setImages] = (0, react_1.useState)();
28
+ const [selectedImage, setSelectedImage] = (0, react_1.useState)();
29
+ const [selectedImageId, setSelectedImageId] = (0, react_1.useState)();
30
+ const [expandedIdPath, setExpandedIdPath] = (0, react_1.useState)();
31
+ const [searchPrompt, setSearchPrompt] = (0, react_1.useState)();
32
+ const [loadingThumbnails, setLoadingThumbnails] = (0, react_1.useState)(false);
33
+ const selection = selectedFolderId ? [selectedFolderId] : [];
34
+ const editContext = (0, editContext_1.useEditContext)();
35
+ const [history, setHistory] = (0, react_1.useState)(() => {
36
+ const savedHistory = localStorage.getItem("editor.mediahistory");
37
+ return savedHistory ? JSON.parse(savedHistory) : [];
38
+ });
39
+ (0, react_1.useEffect)(() => {
40
+ if (selectedIdPath) {
41
+ const path = selectedIdPath.split("/");
42
+ if (path.length > 1) {
43
+ setSelectedFolderId(path[path.length - 2]);
44
+ setSelectedImageId(path[path.length - 1]?.toLowerCase().substring(1, 37));
45
+ }
46
+ setExpandedIdPath(selectedIdPath);
47
+ }
48
+ if (!selectedIdPath) {
49
+ setExpandedIdPath(history[0]?.idPath);
50
+ setSelectedFolderId(history[0]?.id);
51
+ setSelectedImageId(undefined);
52
+ }
53
+ }, [selectedIdPath]);
54
+ (0, react_1.useEffect)(() => {
55
+ loadThumbnailsAndSelectImage();
56
+ }, [selectedFolderId]);
57
+ const updateHistory = async () => {
58
+ if (!selectedFolderId)
59
+ return;
60
+ const item = await editContext?.itemsRepository.getItem({
61
+ id: selectedFolderId,
62
+ language: "en",
63
+ version: 0,
64
+ });
65
+ setHistory((history) => {
66
+ if (!item?.idPath || !item.name)
67
+ return history;
68
+ const newEntry = {
69
+ name: item.name,
70
+ id: item.id,
71
+ idPath: item?.idPath,
72
+ };
73
+ const newHistory = [
74
+ newEntry,
75
+ ...history.filter((x) => x.idPath !== newEntry.idPath).slice(0, 4),
76
+ ];
77
+ if (typeof window !== "undefined")
78
+ localStorage.setItem("editor.mediahistory", JSON.stringify(newHistory));
79
+ return newHistory;
80
+ });
81
+ };
82
+ async function loadThumbnailsAndSelectImage() {
83
+ setSelectedImage(undefined);
84
+ setImages([]);
85
+ const images = await loadThumbnails(selectedFolderId);
86
+ if (selectedImageId)
87
+ setSelectedImage(images?.find((x) => x.id === selectedImageId));
88
+ }
89
+ async function loadThumbnails(selectedFolderId) {
90
+ if (searchPrompt) {
91
+ await search(searchPrompt);
92
+ return;
93
+ }
94
+ if (!selectedFolderId)
95
+ setImages([]);
96
+ else {
97
+ setLoadingThumbnails(true);
98
+ const children = await (0, contentService_1.getChildren)(selectedFolderId, editContext.sessionId, mode === "video"
99
+ ? [
100
+ "e76adbdf-87d1-4fcb-ba71-274f7dbf5670",
101
+ "374d3a99-c098-4cd2-8fbc-dc2d1ca1c904",
102
+ ]
103
+ : [
104
+ "C97BA923-8009-4858-BDD5-D8BE5FCCECF7",
105
+ "F1828A2C-7E5D-4BBD-98CA-320474871548",
106
+ ], false, language);
107
+ setImages(children);
108
+ setLoadingThumbnails(false);
109
+ return children;
110
+ }
111
+ }
112
+ const searchDebounced = (0, use_debounce_1.useDebouncedCallback)(async (searchPrompt) => {
113
+ return search(searchPrompt);
114
+ }, 300);
115
+ const search = async (searchPrompt) => {
116
+ if (!editContext)
117
+ return;
118
+ setSearchPrompt(searchPrompt);
119
+ if (searchPrompt.length == 0)
120
+ return;
121
+ setLoadingThumbnails(true);
122
+ const result = await (0, aiService_1.executeSearch)({
123
+ query: searchPrompt,
124
+ rootItemIds: selectedFolderId ? [selectedFolderId] : undefined,
125
+ editContext,
126
+ maxResults: 50,
127
+ index: "media",
128
+ skipValidation: true,
129
+ });
130
+ if (result.type == "success") {
131
+ setImages(result.data);
132
+ }
133
+ else {
134
+ editContext.showToast({
135
+ severity: "error",
136
+ summary: "Error searching",
137
+ detail: result.response.statusText,
138
+ });
139
+ }
140
+ setLoadingThumbnails(false);
141
+ };
142
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)(splitter_1.Splitter, { className: "flex-1 border-0", children: [(0, jsx_runtime_1.jsxs)(splitter_1.SplitterPanel, { size: 25, className: "flex flex-col", children: [(0, jsx_runtime_1.jsx)("div", { className: "relative flex-1", children: (0, jsx_runtime_1.jsx)("div", { className: "absolute inset-0 overflow-auto p-2", children: (0, jsx_runtime_1.jsx)(ContentTree_1.default, { rootItemIds: ["3D6658D8-A0BF-4E75-B3E2-D050FABCF4E1"], selectionMode: "single", selectedItemIds: selection, templateIds: ["FE5DD826-48C6-436D-B87A-7C4210C7413B"], onItemInserted: (item) => {
143
+ setSelectedFolderId(item.id);
144
+ }, expandIdPath: expandedIdPath ?? "3D6658D8-A0BF-4E75-B3E2-D050FABCF4E1", onSelectionChange: (selection) => {
145
+ const selectedNode = selection[0];
146
+ if (selectedNode)
147
+ setSelectedFolderId(selectedNode.id);
148
+ else
149
+ setSelectedFolderId(undefined);
150
+ }, language: language }) }) }), history.length > 0 && ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsxs)("div", { className: "my-2 flex items-center gap-1 border-t border-gray-300 px-2 pt-2 text-xs text-gray-500", children: [(0, jsx_runtime_1.jsx)(Icons_1.ArrowDownIcon, {}), " Recent Locations"] }), history.map((x) => ((0, jsx_runtime_1.jsx)("div", { className: "mx-5 flex cursor-pointer gap-1 text-xs hover:text-gray-400", onClick: () => {
151
+ setSelectedFolderId(x.id);
152
+ setExpandedIdPath(x.idPath);
153
+ }, children: x.name }, x.idPath)))] }))] }), (0, jsx_runtime_1.jsx)(splitter_1.SplitterPanel, { className: "relative", children: (0, jsx_runtime_1.jsxs)("div", { className: "flex h-full w-full flex-col gap-2", children: [(0, jsx_runtime_1.jsx)(AiImageSearchPrompt_1.AiImageSearchPrompt, { onSearchPromptChange: searchDebounced }), (0, jsx_runtime_1.jsxs)("div", { className: "relative flex-1", children: [loadingThumbnails && ((0, jsx_runtime_1.jsx)("div", { className: "flex h-full items-center", children: (0, jsx_runtime_1.jsx)(progressspinner_1.ProgressSpinner, { style: { width: "24px", height: "24px" } }) })), !loadingThumbnails && ((0, jsx_runtime_1.jsx)(Thumbnails_1.Thumbnails, { images: images ?? [], selectedImage: selectedImage, setSelectedImage: setSelectedImage, onMediaSelected: () => {
154
+ updateHistory();
155
+ onMediaSelected(selectedImage.id);
156
+ }, onHide: onHide }))] }), selectedFolderId && ((0, jsx_runtime_1.jsx)(UploadZone_1.UploadZone, { selectedFolderId: selectedFolderId, uploadCompleted: () => {
157
+ loadThumbnailsAndSelectImage();
158
+ } }))] }) }), (0, jsx_runtime_1.jsx)(splitter_1.SplitterPanel, { className: "relative", children: (0, jsx_runtime_1.jsx)(Preview_1.Preview, { selectedImage: selectedImage }) })] }), (0, jsx_runtime_1.jsxs)(DialogButtons_1.default, { children: [(0, jsx_runtime_1.jsx)(fileupload_1.FileUpload, { mode: "basic",
159
+ // disabled={electedFolderId}
160
+ auto: true, chooseLabel: "Upload", accept: "image/*,video/*", url: "/alpaca/editor/upload?folder=" + selection[0], onUpload: async ({ xhr }) => {
161
+ updateHistory();
162
+ const response = JSON.parse(xhr.responseText);
163
+ const thumbs = await loadThumbnails(selectedFolderId);
164
+ setSelectedImage(thumbs?.find((x) => x.id === response.id));
165
+ } }), (0, jsx_runtime_1.jsx)(button_1.Button, { disabled: !selectedImage, onClick: () => {
166
+ updateHistory();
167
+ onMediaSelected(selectedImage.id);
168
+ onHide();
169
+ }, children: "Select" }), (0, jsx_runtime_1.jsx)(button_1.Button, { onClick: () => onHide(), children: "Cancel" })] })] }));
170
+ };
171
+ exports.TreeSelector = TreeSelector;