@alpaca-editor/core 1.0.3938 → 1.0.3941
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.
- package/dist/components/ActionButton.d.ts +1 -0
- package/dist/components/ActionButton.js +2 -2
- package/dist/components/ActionButton.js.map +1 -1
- package/dist/editor/ContentTree.js +12 -8
- package/dist/editor/ContentTree.js.map +1 -1
- package/dist/editor/ContextMenu.d.ts +1 -1
- package/dist/editor/ContextMenu.js +17 -3
- package/dist/editor/ContextMenu.js.map +1 -1
- package/dist/editor/FieldActionsOverlay.d.ts +18 -0
- package/dist/editor/FieldActionsOverlay.js +139 -0
- package/dist/editor/FieldActionsOverlay.js.map +1 -0
- package/dist/editor/FieldHistory.d.ts +2 -1
- package/dist/editor/FieldHistory.js +11 -8
- package/dist/editor/FieldHistory.js.map +1 -1
- package/dist/editor/FieldListField.js +14 -17
- package/dist/editor/FieldListField.js.map +1 -1
- package/dist/editor/PictureCropper.js +65 -23
- package/dist/editor/PictureCropper.js.map +1 -1
- package/dist/editor/PictureEditor.js +43 -3
- package/dist/editor/PictureEditor.js.map +1 -1
- package/dist/editor/Titlebar.js +19 -10
- package/dist/editor/Titlebar.js.map +1 -1
- package/dist/editor/ai/AiTerminal.js +27 -41
- package/dist/editor/ai/AiTerminal.js.map +1 -1
- package/dist/editor/ai/GhostWriter.js +21 -2
- package/dist/editor/ai/GhostWriter.js.map +1 -1
- package/dist/editor/client/EditorClient.js +48 -18
- package/dist/editor/client/EditorClient.js.map +1 -1
- package/dist/editor/client/editContext.d.ts +1 -1
- package/dist/editor/client/editContext.js.map +1 -1
- package/dist/editor/client/itemsRepository.js +126 -90
- package/dist/editor/client/itemsRepository.js.map +1 -1
- package/dist/editor/commands/componentCommands.js +7 -3
- package/dist/editor/commands/componentCommands.js.map +1 -1
- package/dist/editor/media-selector/MediaFolderBrowser.d.ts +5 -0
- package/dist/editor/media-selector/MediaFolderBrowser.js +77 -0
- package/dist/editor/media-selector/MediaFolderBrowser.js.map +1 -0
- package/dist/editor/media-selector/MediaSelector.js +1 -1
- package/dist/editor/media-selector/MediaSelector.js.map +1 -1
- package/dist/editor/media-selector/Thumbnails.js +2 -2
- package/dist/editor/media-selector/index.d.ts +8 -0
- package/dist/editor/media-selector/index.js +9 -0
- package/dist/editor/media-selector/index.js.map +1 -0
- package/dist/editor/menubar/BrowseHistory.js +3 -4
- package/dist/editor/menubar/BrowseHistory.js.map +1 -1
- package/dist/editor/menubar/PageSelector.js +62 -10
- package/dist/editor/menubar/PageSelector.js.map +1 -1
- package/dist/editor/page-editor-chrome/FieldActionIndicator.js +1 -1
- package/dist/editor/page-editor-chrome/FieldActionIndicator.js.map +1 -1
- package/dist/editor/page-editor-chrome/useInlineAICompletion.js +37 -11
- package/dist/editor/page-editor-chrome/useInlineAICompletion.js.map +1 -1
- package/dist/editor/page-viewer/PageViewerFrame.js +98 -2
- package/dist/editor/page-viewer/PageViewerFrame.js.map +1 -1
- package/dist/editor/pageModel.d.ts +14 -0
- package/dist/editor/reviews/Comment.js +3 -2
- package/dist/editor/reviews/Comment.js.map +1 -1
- package/dist/editor/services/aiService.js +0 -1
- package/dist/editor/services/aiService.js.map +1 -1
- package/dist/editor/services/editService.d.ts +1 -1
- package/dist/editor/services/editService.js +2 -1
- package/dist/editor/services/editService.js.map +1 -1
- package/dist/editor/sidebar/ComponentTree.js +3 -4
- package/dist/editor/sidebar/ComponentTree.js.map +1 -1
- package/dist/editor/ui/Icons.js +1 -1
- package/dist/editor/ui/Icons.js.map +1 -1
- package/dist/editor/ui/ItemList.d.ts +16 -0
- package/dist/editor/ui/ItemList.js +19 -0
- package/dist/editor/ui/ItemList.js.map +1 -0
- package/dist/editor/ui/ItemSearch.js +2 -12
- package/dist/editor/ui/ItemSearch.js.map +1 -1
- package/dist/editor/ui/SimpleTabs.d.ts +1 -0
- package/dist/editor/ui/SimpleTabs.js +3 -3
- package/dist/editor/ui/SimpleTabs.js.map +1 -1
- package/dist/editor/ui/Splitter.js +61 -6
- package/dist/editor/ui/Splitter.js.map +1 -1
- package/dist/editor/views/MediaFolderEditView.d.ts +4 -0
- package/dist/editor/views/MediaFolderEditView.js +40 -0
- package/dist/editor/views/MediaFolderEditView.js.map +1 -0
- package/dist/editor/views/SingleEditView.js +9 -1
- package/dist/editor/views/SingleEditView.js.map +1 -1
- package/dist/revision.d.ts +2 -2
- package/dist/revision.js +2 -2
- package/dist/styles.css +64 -13
- package/package.json +8 -2
- package/.prettierrc +0 -3
- package/build.css +0 -3
- package/components.json +0 -21
- package/eslint.config.mjs +0 -4
- package/images/bg-shape-black.webp +0 -0
- package/images/wizard-bg.png +0 -0
- package/images/wizard-tour.png +0 -0
- package/images/wizard.png +0 -0
- package/src/client-components/api.ts +0 -6
- package/src/client-components/index.ts +0 -19
- package/src/components/ActionButton.tsx +0 -41
- package/src/components/Error.tsx +0 -57
- package/src/components/ui/CardConnector.tsx +0 -56
- package/src/components/ui/button.tsx +0 -62
- package/src/components/ui/card.tsx +0 -372
- package/src/components/ui/context-menu.tsx +0 -250
- package/src/config/config.tsx +0 -917
- package/src/config/types.ts +0 -286
- package/src/editor/ComponentInfo.tsx +0 -90
- package/src/editor/ConfirmationDialog.tsx +0 -103
- package/src/editor/ContentTree.tsx +0 -727
- package/src/editor/ContextMenu.tsx +0 -212
- package/src/editor/Editor.tsx +0 -90
- package/src/editor/EditorWarning.tsx +0 -34
- package/src/editor/EditorWarnings.tsx +0 -33
- package/src/editor/FieldEditorPopup.tsx +0 -65
- package/src/editor/FieldHistory.tsx +0 -74
- package/src/editor/FieldList.tsx +0 -190
- package/src/editor/FieldListField.tsx +0 -391
- package/src/editor/FieldListFieldWithFallbacks.tsx +0 -217
- package/src/editor/FloatingToolbar.tsx +0 -163
- package/src/editor/ImageEditor.tsx +0 -128
- package/src/editor/ItemInfo.tsx +0 -90
- package/src/editor/LinkEditorDialog.tsx +0 -196
- package/src/editor/MainLayout.tsx +0 -95
- package/src/editor/MobileLayout.tsx +0 -68
- package/src/editor/NewEditorClient.tsx +0 -11
- package/src/editor/PictureCropper.tsx +0 -503
- package/src/editor/PictureEditor.tsx +0 -212
- package/src/editor/PictureEditorDialog.tsx +0 -381
- package/src/editor/PublishDialog.ignore +0 -74
- package/src/editor/ScrollingContentTree.tsx +0 -67
- package/src/editor/Terminal.tsx +0 -227
- package/src/editor/Titlebar.tsx +0 -93
- package/src/editor/ai/AiPopup.tsx +0 -59
- package/src/editor/ai/AiResponseMessage.tsx +0 -106
- package/src/editor/ai/AiTerminal.tsx +0 -514
- package/src/editor/ai/AiToolCall.tsx +0 -61
- package/src/editor/ai/EditorAiTerminal.tsx +0 -20
- package/src/editor/ai/GhostWriter.tsx +0 -432
- package/src/editor/ai/aiPageModel.ts +0 -108
- package/src/editor/ai/editorAiContext.ts +0 -18
- package/src/editor/client/AboutDialog.tsx +0 -44
- package/src/editor/client/EditorClient.tsx +0 -2197
- package/src/editor/client/GenericDialog.tsx +0 -50
- package/src/editor/client/editContext.ts +0 -412
- package/src/editor/client/helpers.ts +0 -44
- package/src/editor/client/itemsRepository.ts +0 -538
- package/src/editor/client/operations.ts +0 -768
- package/src/editor/client/pageModelBuilder.ts +0 -219
- package/src/editor/commands/commands.ts +0 -22
- package/src/editor/commands/componentCommands.tsx +0 -424
- package/src/editor/commands/createVersionCommand.ts +0 -33
- package/src/editor/commands/deleteVersionCommand.ts +0 -71
- package/src/editor/commands/itemCommands.tsx +0 -351
- package/src/editor/commands/localizeItem/LocalizeItemDialog.tsx +0 -201
- package/src/editor/commands/localizeItem/LocalizeItemUtils.ts +0 -27
- package/src/editor/commands/undo.ts +0 -39
- package/src/editor/component-designer/ComponentDesigner.tsx +0 -70
- package/src/editor/component-designer/ComponentDesignerAiTerminal.tsx +0 -11
- package/src/editor/component-designer/ComponentDesignerMenu.tsx +0 -91
- package/src/editor/component-designer/ComponentEditor.tsx +0 -97
- package/src/editor/component-designer/ComponentRenderingCodeEditor.tsx +0 -31
- package/src/editor/component-designer/ComponentRenderingEditor.tsx +0 -104
- package/src/editor/component-designer/ComponentsDropdown.tsx +0 -39
- package/src/editor/component-designer/PlaceholdersEditor.tsx +0 -179
- package/src/editor/component-designer/RenderingsDropdown.tsx +0 -36
- package/src/editor/component-designer/TemplateEditor.tsx +0 -236
- package/src/editor/component-designer/aiContext.ts +0 -23
- package/src/editor/componentTreeHelper.tsx +0 -116
- package/src/editor/context-menu/CopyMoveMenu.tsx +0 -103
- package/src/editor/context-menu/InsertMenu.tsx +0 -347
- package/src/editor/control-center/About.tsx +0 -342
- package/src/editor/control-center/ControlCenterMenu.tsx +0 -76
- package/src/editor/control-center/IndexOverview.tsx +0 -50
- package/src/editor/control-center/IndexSettings.tsx +0 -266
- package/src/editor/control-center/Info.tsx +0 -104
- package/src/editor/control-center/QuotaInfo.tsx +0 -301
- package/src/editor/control-center/Status.tsx +0 -113
- package/src/editor/control-center/WebSocketMessages.tsx +0 -155
- package/src/editor/editor-warnings/ItemLocked.tsx +0 -63
- package/src/editor/editor-warnings/NoLanguageWriteAccess.tsx +0 -22
- package/src/editor/editor-warnings/NoWorkflowWriteAccess.tsx +0 -23
- package/src/editor/editor-warnings/NoWriteAccess.tsx +0 -16
- package/src/editor/editor-warnings/ValidationErrors.tsx +0 -54
- package/src/editor/field-types/AttachmentEditor.tsx +0 -9
- package/src/editor/field-types/CheckboxEditor.tsx +0 -47
- package/src/editor/field-types/DropLinkEditor.tsx +0 -80
- package/src/editor/field-types/DropListEditor.tsx +0 -84
- package/src/editor/field-types/ImageFieldEditor.tsx +0 -65
- package/src/editor/field-types/InternalLinkFieldEditor.tsx +0 -117
- package/src/editor/field-types/LinkFieldEditor.tsx +0 -85
- package/src/editor/field-types/MultiLineText.tsx +0 -82
- package/src/editor/field-types/PictureFieldEditor.tsx +0 -121
- package/src/editor/field-types/RawEditor.tsx +0 -53
- package/src/editor/field-types/ReactQuill.tsx +0 -580
- package/src/editor/field-types/RichTextEditor.tsx +0 -22
- package/src/editor/field-types/RichTextEditorComponent.tsx +0 -127
- package/src/editor/field-types/SingleLineText.tsx +0 -174
- package/src/editor/field-types/TreeListEditor.tsx +0 -261
- package/src/editor/fieldTypes.ts +0 -140
- package/src/editor/media-selector/AiImageSearch.tsx +0 -185
- package/src/editor/media-selector/AiImageSearchPrompt.tsx +0 -94
- package/src/editor/media-selector/MediaSelector.tsx +0 -42
- package/src/editor/media-selector/Preview.tsx +0 -14
- package/src/editor/media-selector/Thumbnails.tsx +0 -48
- package/src/editor/media-selector/TreeSelector.tsx +0 -292
- package/src/editor/media-selector/UploadZone.tsx +0 -137
- package/src/editor/menubar/ActionsMenu.tsx +0 -94
- package/src/editor/menubar/ActiveUsers.tsx +0 -17
- package/src/editor/menubar/ApproveAndPublish.tsx +0 -18
- package/src/editor/menubar/BrowseHistory.tsx +0 -37
- package/src/editor/menubar/ItemLanguageVersion.tsx +0 -76
- package/src/editor/menubar/LanguageSelector.tsx +0 -226
- package/src/editor/menubar/Menu.tsx +0 -83
- package/src/editor/menubar/NavButtons.tsx +0 -74
- package/src/editor/menubar/PageSelector.tsx +0 -141
- package/src/editor/menubar/PageViewerControls.tsx +0 -120
- package/src/editor/menubar/PreviewSecondaryControls.tsx +0 -18
- package/src/editor/menubar/SecondaryControls.tsx +0 -45
- package/src/editor/menubar/Separator.tsx +0 -12
- package/src/editor/menubar/SiteInfo.tsx +0 -53
- package/src/editor/menubar/User.tsx +0 -27
- package/src/editor/menubar/VersionSelector.tsx +0 -142
- package/src/editor/page-editor-chrome/CommentHighlighting.tsx +0 -307
- package/src/editor/page-editor-chrome/CommentHighlightings.tsx +0 -35
- package/src/editor/page-editor-chrome/FieldActionIndicator.tsx +0 -59
- package/src/editor/page-editor-chrome/FieldActionIndicators.tsx +0 -23
- package/src/editor/page-editor-chrome/FieldEditedIndicator.tsx +0 -64
- package/src/editor/page-editor-chrome/FieldEditedIndicators.tsx +0 -35
- package/src/editor/page-editor-chrome/FrameMenu.tsx +0 -338
- package/src/editor/page-editor-chrome/FrameMenus.tsx +0 -48
- package/src/editor/page-editor-chrome/InlineEditor.tsx +0 -765
- package/src/editor/page-editor-chrome/LockedFieldIndicator.tsx +0 -61
- package/src/editor/page-editor-chrome/NoLayout.tsx +0 -36
- package/src/editor/page-editor-chrome/PageEditorChrome.tsx +0 -122
- package/src/editor/page-editor-chrome/PictureEditorOverlay.tsx +0 -161
- package/src/editor/page-editor-chrome/PlaceholderDropZone.tsx +0 -169
- package/src/editor/page-editor-chrome/PlaceholderDropZones.tsx +0 -315
- package/src/editor/page-editor-chrome/SuggestionHighlighting.tsx +0 -300
- package/src/editor/page-editor-chrome/SuggestionHighlightings.tsx +0 -40
- package/src/editor/page-editor-chrome/useInlineAICompletion.tsx +0 -791
- package/src/editor/page-viewer/DeviceToolbar.tsx +0 -70
- package/src/editor/page-viewer/EditorForm.tsx +0 -258
- package/src/editor/page-viewer/MiniMap.tsx +0 -362
- package/src/editor/page-viewer/PageViewer.tsx +0 -169
- package/src/editor/page-viewer/PageViewerFrame.tsx +0 -879
- package/src/editor/page-viewer/pageModelSkeletonBuilder.ts +0 -412
- package/src/editor/page-viewer/pageViewContext.ts +0 -186
- package/src/editor/pageModel.ts +0 -208
- package/src/editor/picture-shared.tsx +0 -53
- package/src/editor/reviews/Comment.tsx +0 -308
- package/src/editor/reviews/Comments.tsx +0 -125
- package/src/editor/reviews/DiffView.tsx +0 -109
- package/src/editor/reviews/PreviewInfo.tsx +0 -35
- package/src/editor/reviews/Reviews.tsx +0 -280
- package/src/editor/reviews/SuggestedEdit.tsx +0 -316
- package/src/editor/reviews/reviewCommands.tsx +0 -47
- package/src/editor/reviews/useReviews.tsx +0 -70
- package/src/editor/services/aiService.ts +0 -174
- package/src/editor/services/componentDesignerService.ts +0 -151
- package/src/editor/services/contentService.ts +0 -180
- package/src/editor/services/editService.ts +0 -486
- package/src/editor/services/indexService.ts +0 -24
- package/src/editor/services/reviewsService.ts +0 -53
- package/src/editor/services/serviceHelper.ts +0 -95
- package/src/editor/services/suggestedEditsService.ts +0 -39
- package/src/editor/services/systemService.ts +0 -5
- package/src/editor/services/translationService.ts +0 -21
- package/src/editor/services-server/api.ts +0 -150
- package/src/editor/services-server/graphQL.ts +0 -106
- package/src/editor/sidebar/ComponentPalette.tsx +0 -161
- package/src/editor/sidebar/ComponentTree.tsx +0 -548
- package/src/editor/sidebar/ComponentTree2.tsxx +0 -490
- package/src/editor/sidebar/Debug.tsx +0 -111
- package/src/editor/sidebar/DictionaryEditor.tsx +0 -261
- package/src/editor/sidebar/EditHistory.tsx +0 -134
- package/src/editor/sidebar/GraphQL.tsx +0 -164
- package/src/editor/sidebar/Insert.tsx +0 -35
- package/src/editor/sidebar/MainContentTree.tsx +0 -102
- package/src/editor/sidebar/Performance.tsx +0 -53
- package/src/editor/sidebar/Sessions.tsx +0 -35
- package/src/editor/sidebar/Sidebar.tsx +0 -20
- package/src/editor/sidebar/SidebarView.tsx +0 -152
- package/src/editor/sidebar/Translations.tsx +0 -295
- package/src/editor/sidebar/Validation.tsx +0 -102
- package/src/editor/sidebar/ViewSelector.tsx +0 -60
- package/src/editor/sidebar/Workbox.tsx +0 -209
- package/src/editor/ui/CenteredMessage.tsx +0 -7
- package/src/editor/ui/CopyMoveTargetSelectorDialog.tsx +0 -81
- package/src/editor/ui/CopyToClipboardButton.tsx +0 -24
- package/src/editor/ui/DialogButtons.tsx +0 -11
- package/src/editor/ui/Icons.tsx +0 -708
- package/src/editor/ui/ItemNameDialogNew.tsx +0 -118
- package/src/editor/ui/ItemSearch.tsx +0 -190
- package/src/editor/ui/PerfectTree.tsx +0 -571
- package/src/editor/ui/Section.tsx +0 -35
- package/src/editor/ui/SimpleIconButton.tsx +0 -54
- package/src/editor/ui/SimpleMenu.tsx +0 -40
- package/src/editor/ui/SimpleTable.tsx +0 -60
- package/src/editor/ui/SimpleTabs.tsx +0 -55
- package/src/editor/ui/SimpleToolbar.tsx +0 -7
- package/src/editor/ui/Spinner.tsx +0 -9
- package/src/editor/ui/Splitter.tsx +0 -314
- package/src/editor/ui/StackedPanels.tsx +0 -134
- package/src/editor/ui/Toolbar.tsx +0 -7
- package/src/editor/utils/id-helper.ts +0 -3
- package/src/editor/utils/insertOptions.ts +0 -69
- package/src/editor/utils/itemutils.ts +0 -29
- package/src/editor/utils/useMemoDebug.ts +0 -28
- package/src/editor/utils.ts +0 -486
- package/src/editor/views/CompareView.tsx +0 -245
- package/src/editor/views/EditView.tsx +0 -27
- package/src/editor/views/ItemEditor.tsx +0 -58
- package/src/editor/views/SingleEditView.tsx +0 -46
- package/src/fonts/Geist-Black.woff2 +0 -0
- package/src/fonts/Geist-Bold.woff2 +0 -0
- package/src/fonts/Geist-ExtraBold.woff2 +0 -0
- package/src/fonts/Geist-ExtraLight.woff2 +0 -0
- package/src/fonts/Geist-Light.woff2 +0 -0
- package/src/fonts/Geist-Medium.woff2 +0 -0
- package/src/fonts/Geist-Regular.woff2 +0 -0
- package/src/fonts/Geist-SemiBold.woff2 +0 -0
- package/src/fonts/Geist-Thin.woff2 +0 -0
- package/src/fonts/Geist[wght].woff2 +0 -0
- package/src/fonts/index.ts +0 -10
- package/src/index.ts +0 -23
- package/src/lib/safelist.tsx +0 -16
- package/src/lib/utils.ts +0 -6
- package/src/page-wizard/PageWizard.tsx +0 -139
- package/src/page-wizard/WizardBox.tsx +0 -4
- package/src/page-wizard/WizardBoxConnector.tsx +0 -56
- package/src/page-wizard/WizardSteps.tsx +0 -458
- package/src/page-wizard/service.ts +0 -35
- package/src/page-wizard/startPageWizardCommand.ts +0 -26
- package/src/page-wizard/steps/BuildPageStep.tsx +0 -259
- package/src/page-wizard/steps/CollectStep.tsx +0 -296
- package/src/page-wizard/steps/ComponentTypesSelector.tsx +0 -454
- package/src/page-wizard/steps/Components.tsx +0 -193
- package/src/page-wizard/steps/ContentStep.tsx +0 -890
- package/src/page-wizard/steps/EditButton.tsx +0 -34
- package/src/page-wizard/steps/FieldEditor.tsx +0 -102
- package/src/page-wizard/steps/Generate.tsx +0 -60
- package/src/page-wizard/steps/ImagesStep.tsx +0 -382
- package/src/page-wizard/steps/LayoutStep.tsx +0 -227
- package/src/page-wizard/steps/MetaDataStep.tsx +0 -173
- package/src/page-wizard/steps/SelectStep.tsx +0 -281
- package/src/page-wizard/steps/schema.ts +0 -180
- package/src/page-wizard/steps/usePageCreator.ts +0 -325
- package/src/page-wizard/usePageWizard.ts +0 -79
- package/src/revision.ts +0 -2
- package/src/splash-screen/NewPage.tsx +0 -294
- package/src/splash-screen/OpenPage.tsx +0 -113
- package/src/splash-screen/RecentPages.tsx +0 -123
- package/src/splash-screen/SectionHeadline.tsx +0 -21
- package/src/splash-screen/SplashScreen.tsx +0 -195
- package/src/tour/Tour.tsx +0 -566
- package/src/tour/default-tour.tsx +0 -301
- package/src/tour/preview-tour.tsx +0 -128
- package/src/types.ts +0 -335
- package/styles.css +0 -765
- package/tsconfig.build.json +0 -31
- package/tsconfig.json +0 -14
|
@@ -1,432 +0,0 @@
|
|
|
1
|
-
import { useState, useEffect, useRef, useCallback } from "react";
|
|
2
|
-
import { useEditContext } from "../client/editContext";
|
|
3
|
-
import { AiResponseMessage } from "./AiResponseMessage";
|
|
4
|
-
import { createEditorAiContext } from "./editorAiContext";
|
|
5
|
-
|
|
6
|
-
import { ToolCall, Message as AiTerminalMessage } from "./AiTerminal";
|
|
7
|
-
import { executePrompt } from "../services/aiService";
|
|
8
|
-
import { EditOperation } from "../../types";
|
|
9
|
-
import { useDebouncedCallback } from "use-debounce";
|
|
10
|
-
// Simple debounce function
|
|
11
|
-
function debounce<F extends (...args: any[]) => any>(
|
|
12
|
-
func: F,
|
|
13
|
-
waitFor: number,
|
|
14
|
-
): (...args: Parameters<F>) => void {
|
|
15
|
-
let timeoutId: ReturnType<typeof setTimeout> | null = null;
|
|
16
|
-
|
|
17
|
-
return (...args: Parameters<F>): void => {
|
|
18
|
-
if (timeoutId !== null) {
|
|
19
|
-
clearTimeout(timeoutId);
|
|
20
|
-
}
|
|
21
|
-
timeoutId = setTimeout(() => func(...args), waitFor);
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
// This matches the Message type in aiService.ts which is used by executePrompt
|
|
26
|
-
type Message = {
|
|
27
|
-
content: string;
|
|
28
|
-
name: string;
|
|
29
|
-
role: string;
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
type Response = {
|
|
33
|
-
responseText: string;
|
|
34
|
-
editOperations: EditOperation[];
|
|
35
|
-
numInputTokens: number;
|
|
36
|
-
numOutputTokens: number;
|
|
37
|
-
numCachedTokens: number;
|
|
38
|
-
messages: AiTerminalMessage[];
|
|
39
|
-
toolCalls?: ToolCall[];
|
|
40
|
-
state: string;
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
const GHOST_WRITER_CONTEXT_FIELD_ID =
|
|
44
|
-
"5B14129E-E14F-4C17-A7D2-0FCB27601A18".toLowerCase();
|
|
45
|
-
|
|
46
|
-
export function GhostWriter() {
|
|
47
|
-
const editContext = useEditContext();
|
|
48
|
-
const [context, setContext] = useState("");
|
|
49
|
-
const [messages, setMessages] = useState<AiTerminalMessage[]>([]);
|
|
50
|
-
const [thinking, setThinking] = useState<Response | null>(null);
|
|
51
|
-
const [isMonitoring, setIsMonitoring] = useState(false);
|
|
52
|
-
const [isThinking, setIsThinking] = useState(false);
|
|
53
|
-
const lastOpIndexRef = useRef(0);
|
|
54
|
-
const isMountedRef = useRef(false); // To prevent running on initial mount
|
|
55
|
-
const [newMessages, setNewMessages] = useState<AiTerminalMessage[]>([]);
|
|
56
|
-
const newMessagesRef = useRef<AiTerminalMessage[]>([]);
|
|
57
|
-
|
|
58
|
-
useEffect(() => {
|
|
59
|
-
newMessagesRef.current = newMessages;
|
|
60
|
-
}, [newMessages]);
|
|
61
|
-
|
|
62
|
-
// Memoized debounced function
|
|
63
|
-
const debouncedCheckIfAiCanHelp = useDebouncedCallback(() => {
|
|
64
|
-
// Check if component is still mounted and conditions are met
|
|
65
|
-
if (isMountedRef.current && isMonitoring && !isThinking && editContext) {
|
|
66
|
-
console.log("Debounced check triggered");
|
|
67
|
-
checkIfAiCanHelp();
|
|
68
|
-
}
|
|
69
|
-
}, 3000); // Wait 3 seconds
|
|
70
|
-
|
|
71
|
-
// Effect to monitor edit history length for changes
|
|
72
|
-
useEffect(() => {
|
|
73
|
-
if (!editContext || !isMonitoring) {
|
|
74
|
-
isMountedRef.current = false; // Reset mount status if disabled/no context
|
|
75
|
-
return;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
// Set mounted status only after initial render and when enabled
|
|
79
|
-
isMountedRef.current = true;
|
|
80
|
-
|
|
81
|
-
// Trigger debounce when edit history changes *after* initial mount
|
|
82
|
-
// Only trigger if the last edit was NOT made by the AI
|
|
83
|
-
if (isMountedRef.current && editContext?.editHistory) {
|
|
84
|
-
const history = editContext.editHistory;
|
|
85
|
-
if (history.length > 0) {
|
|
86
|
-
const lastOp = history[0];
|
|
87
|
-
// Ensure lastOp exists and check the user.ai flag
|
|
88
|
-
if (lastOp && !lastOp.user?.ai) {
|
|
89
|
-
console.log(
|
|
90
|
-
"User edit detected, calling debounce for Ghost Writer check",
|
|
91
|
-
);
|
|
92
|
-
debouncedCheckIfAiCanHelp();
|
|
93
|
-
} else {
|
|
94
|
-
console.log("AI edit detected, skipping Ghost Writer check");
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
// Cleanup function to set mounted status to false
|
|
100
|
-
return () => {
|
|
101
|
-
isMountedRef.current = false;
|
|
102
|
-
};
|
|
103
|
-
}, [editContext?.editHistory, isMonitoring, debouncedCheckIfAiCanHelp]); // Watch history length and monitoring status
|
|
104
|
-
|
|
105
|
-
// Load initial context from Sitecore field
|
|
106
|
-
useEffect(() => {
|
|
107
|
-
if (
|
|
108
|
-
!editContext ||
|
|
109
|
-
!editContext.currentItemDescriptor ||
|
|
110
|
-
!editContext.itemsRepository
|
|
111
|
-
) {
|
|
112
|
-
return;
|
|
113
|
-
}
|
|
114
|
-
const { currentItemDescriptor, itemsRepository } = editContext;
|
|
115
|
-
|
|
116
|
-
const loadContext = async () => {
|
|
117
|
-
try {
|
|
118
|
-
// Get the full item first
|
|
119
|
-
const item = await itemsRepository.getItem(currentItemDescriptor);
|
|
120
|
-
if (!item?.fields) {
|
|
121
|
-
console.warn(
|
|
122
|
-
"Could not load item or fields for Ghost Writer context",
|
|
123
|
-
);
|
|
124
|
-
return;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
// Find the specific field
|
|
128
|
-
const contextField = item.fields.find(
|
|
129
|
-
(f) => f.id === GHOST_WRITER_CONTEXT_FIELD_ID,
|
|
130
|
-
);
|
|
131
|
-
const initialContext = contextField?.value; // Or contextField?.rawValue
|
|
132
|
-
|
|
133
|
-
if (initialContext && typeof initialContext === "string") {
|
|
134
|
-
setContext(initialContext);
|
|
135
|
-
} else {
|
|
136
|
-
// Set to empty if field doesn't exist or is not a string
|
|
137
|
-
setContext("");
|
|
138
|
-
}
|
|
139
|
-
} catch (error) {
|
|
140
|
-
console.error("Error loading Ghost Writer context:", error);
|
|
141
|
-
setContext(""); // Reset context on error
|
|
142
|
-
}
|
|
143
|
-
};
|
|
144
|
-
|
|
145
|
-
loadContext();
|
|
146
|
-
// Depend on the item descriptor and the repository instance
|
|
147
|
-
}, [editContext?.currentItemDescriptor, editContext?.itemsRepository]);
|
|
148
|
-
|
|
149
|
-
// Debounced function to save context to Sitecore
|
|
150
|
-
const debouncedSaveContext = useDebouncedCallback((newContext: string) => {
|
|
151
|
-
if (
|
|
152
|
-
!editContext ||
|
|
153
|
-
!editContext.currentItemDescriptor ||
|
|
154
|
-
!editContext.operations
|
|
155
|
-
) {
|
|
156
|
-
return;
|
|
157
|
-
}
|
|
158
|
-
const { currentItemDescriptor, operations } = editContext;
|
|
159
|
-
|
|
160
|
-
console.log("Debounced save triggered for context:", newContext);
|
|
161
|
-
try {
|
|
162
|
-
operations.editField({
|
|
163
|
-
field: {
|
|
164
|
-
item: currentItemDescriptor,
|
|
165
|
-
fieldId: GHOST_WRITER_CONTEXT_FIELD_ID,
|
|
166
|
-
},
|
|
167
|
-
value: newContext,
|
|
168
|
-
});
|
|
169
|
-
} catch (error) {
|
|
170
|
-
console.error("Error saving Ghost Writer context:", error);
|
|
171
|
-
}
|
|
172
|
-
}, 1000);
|
|
173
|
-
|
|
174
|
-
// Handle context change and trigger debounced save
|
|
175
|
-
const handleContextChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {
|
|
176
|
-
const newContext = e.target.value;
|
|
177
|
-
setContext(newContext);
|
|
178
|
-
debouncedSaveContext(newContext);
|
|
179
|
-
};
|
|
180
|
-
|
|
181
|
-
// Function to check if AI can help
|
|
182
|
-
const checkIfAiCanHelp = async () => {
|
|
183
|
-
if (!editContext) return;
|
|
184
|
-
|
|
185
|
-
console.log("Starting AI check");
|
|
186
|
-
setIsThinking(true);
|
|
187
|
-
|
|
188
|
-
// Create a new user message for the current context
|
|
189
|
-
const userMessage: AiTerminalMessage = {
|
|
190
|
-
id: Date.now(),
|
|
191
|
-
content: context,
|
|
192
|
-
role: "user",
|
|
193
|
-
name: "user",
|
|
194
|
-
tool_calls: [],
|
|
195
|
-
};
|
|
196
|
-
|
|
197
|
-
// Add user message to our history display
|
|
198
|
-
const updatedMessages = [...messages, userMessage];
|
|
199
|
-
setMessages(updatedMessages);
|
|
200
|
-
|
|
201
|
-
setThinking({
|
|
202
|
-
responseText: "Your Ghost Writer is thinking...",
|
|
203
|
-
editOperations: [],
|
|
204
|
-
numInputTokens: 0,
|
|
205
|
-
numOutputTokens: 0,
|
|
206
|
-
numCachedTokens: 0,
|
|
207
|
-
messages: updatedMessages,
|
|
208
|
-
state: "thinking",
|
|
209
|
-
});
|
|
210
|
-
|
|
211
|
-
lastOpIndexRef.current = 0;
|
|
212
|
-
setNewMessages([]);
|
|
213
|
-
|
|
214
|
-
try {
|
|
215
|
-
// Only send the current context as a message to executePrompt
|
|
216
|
-
const response = await executePrompt(
|
|
217
|
-
[
|
|
218
|
-
{
|
|
219
|
-
content: context,
|
|
220
|
-
role: "user",
|
|
221
|
-
name: "user",
|
|
222
|
-
},
|
|
223
|
-
],
|
|
224
|
-
editContext,
|
|
225
|
-
createEditorAiContext,
|
|
226
|
-
{
|
|
227
|
-
addAllContent: true,
|
|
228
|
-
profile: "ghostwriter",
|
|
229
|
-
},
|
|
230
|
-
undefined,
|
|
231
|
-
"gpt-4.1-mini",
|
|
232
|
-
handleAiResponse,
|
|
233
|
-
);
|
|
234
|
-
|
|
235
|
-
if (response) {
|
|
236
|
-
handleAiResponse(response);
|
|
237
|
-
}
|
|
238
|
-
} catch (error) {
|
|
239
|
-
console.error("Error executing Ghost Writer AI prompt:", error);
|
|
240
|
-
if (isMountedRef.current) {
|
|
241
|
-
// Check if still mounted before setting state
|
|
242
|
-
setThinking({
|
|
243
|
-
responseText: "Error occurred while thinking.",
|
|
244
|
-
editOperations: [],
|
|
245
|
-
numInputTokens: 0,
|
|
246
|
-
numOutputTokens: 0,
|
|
247
|
-
numCachedTokens: 0,
|
|
248
|
-
messages: updatedMessages,
|
|
249
|
-
state: "error",
|
|
250
|
-
toolCalls: [],
|
|
251
|
-
});
|
|
252
|
-
}
|
|
253
|
-
} finally {
|
|
254
|
-
if (isMountedRef.current) {
|
|
255
|
-
setIsThinking(false);
|
|
256
|
-
console.log("AI check finished");
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
};
|
|
260
|
-
|
|
261
|
-
// Handle AI response as it streams in
|
|
262
|
-
const handleAiResponse = (response: Response) => {
|
|
263
|
-
if (!isMountedRef.current) return; // Don't update state if unmounted
|
|
264
|
-
|
|
265
|
-
// Merge new messages from the response with newMessagesRef.current based on message ID
|
|
266
|
-
const currentNewMessages = [...newMessagesRef.current];
|
|
267
|
-
|
|
268
|
-
if (response.messages && response.messages.length > 0) {
|
|
269
|
-
response.messages.forEach((newMsg) => {
|
|
270
|
-
// Check if message with this ID already exists in newMessages
|
|
271
|
-
const existingMsgIndex = currentNewMessages.findIndex(
|
|
272
|
-
(m) => m.id === newMsg.id,
|
|
273
|
-
);
|
|
274
|
-
|
|
275
|
-
if (existingMsgIndex >= 0) {
|
|
276
|
-
// Update existing message
|
|
277
|
-
currentNewMessages[existingMsgIndex] = newMsg;
|
|
278
|
-
} else {
|
|
279
|
-
// Add new message
|
|
280
|
-
currentNewMessages.push(newMsg);
|
|
281
|
-
}
|
|
282
|
-
});
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
// Update newMessages state and ref
|
|
286
|
-
setNewMessages(currentNewMessages);
|
|
287
|
-
setMessages([...messages, ...currentNewMessages]);
|
|
288
|
-
|
|
289
|
-
// Merge the new response messages with our existing messages
|
|
290
|
-
const updatedMessages = [...messages];
|
|
291
|
-
if (response.messages && response.messages.length > 0) {
|
|
292
|
-
response.messages.forEach((msg) => {
|
|
293
|
-
updatedMessages.push(msg);
|
|
294
|
-
});
|
|
295
|
-
}
|
|
296
|
-
console.log("Updated messages:", updatedMessages);
|
|
297
|
-
setMessages(updatedMessages);
|
|
298
|
-
|
|
299
|
-
// Update the response with our combined messages
|
|
300
|
-
const updatedResponse = {
|
|
301
|
-
...response,
|
|
302
|
-
messages: updatedMessages,
|
|
303
|
-
};
|
|
304
|
-
|
|
305
|
-
setThinking(updatedResponse); // Update the displayed thinking state
|
|
306
|
-
|
|
307
|
-
// Apply new operations incrementally
|
|
308
|
-
if (
|
|
309
|
-
editContext &&
|
|
310
|
-
response.editOperations &&
|
|
311
|
-
response.editOperations.length > lastOpIndexRef.current
|
|
312
|
-
) {
|
|
313
|
-
const newOps = response.editOperations.slice(lastOpIndexRef.current);
|
|
314
|
-
// applyAiOperations(newOps);
|
|
315
|
-
lastOpIndexRef.current = response.editOperations.length;
|
|
316
|
-
}
|
|
317
|
-
};
|
|
318
|
-
|
|
319
|
-
// // Apply operations suggested by the AI
|
|
320
|
-
// const applyAiOperations = (operations: EditOperation[]) => {
|
|
321
|
-
// if (!editContext || !isMountedRef.current) return;
|
|
322
|
-
|
|
323
|
-
// const isEditTextFieldOp = (op: EditOperation): op is EditFieldOperation => {
|
|
324
|
-
// if (op.type !== "edit-field") return false;
|
|
325
|
-
// const editFieldOp = op as EditFieldOperation;
|
|
326
|
-
// return (
|
|
327
|
-
// !!editFieldOp.fieldType && editFieldOp.fieldType.indexOf("text") !== -1
|
|
328
|
-
// );
|
|
329
|
-
// };
|
|
330
|
-
|
|
331
|
-
// operations.forEach((op: EditOperation) => {
|
|
332
|
-
// console.log("Applying AI operation:", op.type, op);
|
|
333
|
-
// if (isEditTextFieldOp(op)) {
|
|
334
|
-
// if (op.itemId && op.mainItem) {
|
|
335
|
-
// // Check mainItem exists
|
|
336
|
-
// const fieldDescriptor = {
|
|
337
|
-
// item: {
|
|
338
|
-
// ...op.mainItem,
|
|
339
|
-
// id: op.itemId,
|
|
340
|
-
// },
|
|
341
|
-
// fieldId: op.fieldId,
|
|
342
|
-
// };
|
|
343
|
-
// try {
|
|
344
|
-
// editContext.itemsRepository.updateFieldValue(
|
|
345
|
-
// fieldDescriptor,
|
|
346
|
-
// op.user ?? { name: "GhostWriter", ai: true },
|
|
347
|
-
// false,
|
|
348
|
-
// op.value,
|
|
349
|
-
// );
|
|
350
|
-
// } catch (error) {
|
|
351
|
-
// console.error(
|
|
352
|
-
// "Error applying updateFieldValue:",
|
|
353
|
-
// error,
|
|
354
|
-
// fieldDescriptor,
|
|
355
|
-
// op.value,
|
|
356
|
-
// );
|
|
357
|
-
// }
|
|
358
|
-
// } else {
|
|
359
|
-
// console.warn(
|
|
360
|
-
// "Skipping edit-field op due to missing itemId or mainItem:",
|
|
361
|
-
// op,
|
|
362
|
-
// );
|
|
363
|
-
// }
|
|
364
|
-
// } else if (op.type === "add-component") {
|
|
365
|
-
// // Add component logic might need more details from the operation
|
|
366
|
-
// // Example: editContext.operations.addComponent(...)
|
|
367
|
-
// console.warn(
|
|
368
|
-
// "Add-component operation application not fully implemented.",
|
|
369
|
-
// );
|
|
370
|
-
// }
|
|
371
|
-
// });
|
|
372
|
-
|
|
373
|
-
// // Debounce refresh request if needed
|
|
374
|
-
// editContext.requestRefresh("immediate");
|
|
375
|
-
// };
|
|
376
|
-
|
|
377
|
-
return (
|
|
378
|
-
<div className="ghost-writer flex h-full flex-col gap-4 p-4">
|
|
379
|
-
<div className="flex items-center justify-between">
|
|
380
|
-
<h2 className="text-lg font-semibold">Ghost Writer</h2>
|
|
381
|
-
<label className="flex cursor-pointer items-center">
|
|
382
|
-
<input
|
|
383
|
-
type="checkbox"
|
|
384
|
-
checked={isMonitoring}
|
|
385
|
-
onChange={() => setIsMonitoring(!isMonitoring)}
|
|
386
|
-
className="mr-2"
|
|
387
|
-
/>
|
|
388
|
-
<span>Enable Ghost Writer</span>
|
|
389
|
-
</label>
|
|
390
|
-
</div>
|
|
391
|
-
|
|
392
|
-
<div className="background-context">
|
|
393
|
-
<label className="mb-2 block font-medium">Background Context</label>
|
|
394
|
-
<textarea
|
|
395
|
-
value={context}
|
|
396
|
-
onChange={handleContextChange}
|
|
397
|
-
placeholder="Provide some background context about this page to help the AI understand its purpose..."
|
|
398
|
-
className="h-32 w-full resize-none rounded border p-2"
|
|
399
|
-
disabled={isThinking}
|
|
400
|
-
/>
|
|
401
|
-
</div>
|
|
402
|
-
|
|
403
|
-
<div className="ai-thinking flex-1 overflow-auto text-sm">
|
|
404
|
-
<label className="mb-2 block font-medium">AI Thinking</label>
|
|
405
|
-
<div className="max-h-[400px] min-h-[200px] overflow-y-auto rounded border bg-gray-50 p-3">
|
|
406
|
-
{messages.length > 0 ? (
|
|
407
|
-
<AiResponseMessage
|
|
408
|
-
messages={messages}
|
|
409
|
-
editOperations={thinking?.editOperations || []}
|
|
410
|
-
finished={
|
|
411
|
-
!thinking ||
|
|
412
|
-
thinking.state === "finished" ||
|
|
413
|
-
thinking.state === "error"
|
|
414
|
-
}
|
|
415
|
-
/>
|
|
416
|
-
) : (
|
|
417
|
-
<div className="text-gray-500 italic">
|
|
418
|
-
{isMonitoring
|
|
419
|
-
? "Ghost Writer is active and monitoring for changes..."
|
|
420
|
-
: "Enable Ghost Writer to get AI assistance while you edit"}
|
|
421
|
-
</div>
|
|
422
|
-
)}
|
|
423
|
-
{thinking && thinking.state === "thinking" && (
|
|
424
|
-
<div className="mt-2 text-blue-500">
|
|
425
|
-
Your Ghost Writer is thinking...
|
|
426
|
-
</div>
|
|
427
|
-
)}
|
|
428
|
-
</div>
|
|
429
|
-
</div>
|
|
430
|
-
</div>
|
|
431
|
-
);
|
|
432
|
-
}
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
import { EditContextType } from "../client/editContext";
|
|
2
|
-
import {
|
|
3
|
-
Component,
|
|
4
|
-
FullItem,
|
|
5
|
-
ItemDescriptor,
|
|
6
|
-
Page,
|
|
7
|
-
Placeholder,
|
|
8
|
-
} from "../pageModel";
|
|
9
|
-
|
|
10
|
-
export type AiPageModel = {
|
|
11
|
-
components: AiComponent[];
|
|
12
|
-
message?: string;
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
export type AiComponent = {
|
|
16
|
-
id: string;
|
|
17
|
-
name: string;
|
|
18
|
-
type: string;
|
|
19
|
-
fields: AiField[];
|
|
20
|
-
placeholder?: string;
|
|
21
|
-
children?: AiComponent[];
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
export type AiField = {
|
|
25
|
-
name: string;
|
|
26
|
-
value: string;
|
|
27
|
-
type: string;
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
const collectDatasourceItemDescriptors = (
|
|
31
|
-
component: Component,
|
|
32
|
-
allDatasourceItemDescriptors: ItemDescriptor[],
|
|
33
|
-
): void => {
|
|
34
|
-
if (component.datasourceItem) {
|
|
35
|
-
allDatasourceItemDescriptors.push(component.datasourceItem);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
component.placeholders.forEach((placeholder) => {
|
|
39
|
-
if (placeholder.components) {
|
|
40
|
-
placeholder.components.forEach((c) => {
|
|
41
|
-
collectDatasourceItemDescriptors(c, allDatasourceItemDescriptors);
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
});
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
const mapComponent = (allDatasourceItems: FullItem[], component: Component) => {
|
|
48
|
-
const item = allDatasourceItems.find((item) => item.id === component.id);
|
|
49
|
-
console.log("Map component: ", component, allDatasourceItems);
|
|
50
|
-
|
|
51
|
-
const fields: AiField[] =
|
|
52
|
-
item?.fields
|
|
53
|
-
.filter((x) =>
|
|
54
|
-
component.datasourceItem?.renderedFieldIds.find((y) => y === x.id),
|
|
55
|
-
)
|
|
56
|
-
.map((field) => ({
|
|
57
|
-
name: field.name || "unknown",
|
|
58
|
-
value: field.rawValue as string,
|
|
59
|
-
type: field.type,
|
|
60
|
-
})) ?? [];
|
|
61
|
-
|
|
62
|
-
return {
|
|
63
|
-
id: component.id,
|
|
64
|
-
name: component.name || "unknown",
|
|
65
|
-
type: component.type,
|
|
66
|
-
fields: fields,
|
|
67
|
-
children: mapPlaceholders(component, allDatasourceItems),
|
|
68
|
-
};
|
|
69
|
-
};
|
|
70
|
-
|
|
71
|
-
const mapPlaceholders = (
|
|
72
|
-
component: Component,
|
|
73
|
-
allDatasourceItems: FullItem[],
|
|
74
|
-
) => {
|
|
75
|
-
let components: AiComponent[] = [];
|
|
76
|
-
component.placeholders.forEach((p) => {
|
|
77
|
-
const placeholderComponents = mapPlaceholder(p, allDatasourceItems);
|
|
78
|
-
components = [...components, ...placeholderComponents];
|
|
79
|
-
});
|
|
80
|
-
return components;
|
|
81
|
-
};
|
|
82
|
-
|
|
83
|
-
const mapPlaceholder = (
|
|
84
|
-
placeholder: Placeholder,
|
|
85
|
-
allDatasourceItems: FullItem[],
|
|
86
|
-
) => {
|
|
87
|
-
return placeholder.components.map((c) => mapComponent(allDatasourceItems, c));
|
|
88
|
-
};
|
|
89
|
-
|
|
90
|
-
export const convertToAiPageModel = async (
|
|
91
|
-
page: Page,
|
|
92
|
-
editContext: EditContextType,
|
|
93
|
-
): Promise<AiPageModel> => {
|
|
94
|
-
const allDatasourceItemDescriptors: ItemDescriptor[] = [];
|
|
95
|
-
|
|
96
|
-
collectDatasourceItemDescriptors(
|
|
97
|
-
page.rootComponent,
|
|
98
|
-
allDatasourceItemDescriptors,
|
|
99
|
-
);
|
|
100
|
-
|
|
101
|
-
const allDatasourceItems = await editContext.itemsRepository.getItems(
|
|
102
|
-
allDatasourceItemDescriptors,
|
|
103
|
-
);
|
|
104
|
-
|
|
105
|
-
return {
|
|
106
|
-
components: mapPlaceholders(page.rootComponent, allDatasourceItems),
|
|
107
|
-
};
|
|
108
|
-
};
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { EditContextType } from "../client/editContext";
|
|
2
|
-
|
|
3
|
-
export function createEditorAiContext({
|
|
4
|
-
editContext,
|
|
5
|
-
}: {
|
|
6
|
-
editContext: EditContextType;
|
|
7
|
-
}) {
|
|
8
|
-
const aiPromptUrl = editContext.configuration.services.aiService.promptUrl;
|
|
9
|
-
|
|
10
|
-
return {
|
|
11
|
-
endpoint: aiPromptUrl,
|
|
12
|
-
promptData: {
|
|
13
|
-
itemid: editContext.currentItemDescriptor?.id,
|
|
14
|
-
language: editContext.currentItemDescriptor?.language,
|
|
15
|
-
version: editContext.currentItemDescriptor?.version,
|
|
16
|
-
},
|
|
17
|
-
};
|
|
18
|
-
}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { Dialog } from "primereact/dialog";
|
|
2
|
-
import { DialogProps } from "./editContext";
|
|
3
|
-
import { useImperativeHandle, useState, forwardRef, useEffect } from "react";
|
|
4
|
-
import { buildDate, version } from "../../revision";
|
|
5
|
-
|
|
6
|
-
export const AboutDialog = forwardRef<DialogProps<void>, DialogProps<void>>(
|
|
7
|
-
(props, ref) => {
|
|
8
|
-
const [visible, setVisible] = useState(false);
|
|
9
|
-
|
|
10
|
-
useImperativeHandle(ref, () => ({
|
|
11
|
-
onClose: (result: any) => {
|
|
12
|
-
setVisible(false);
|
|
13
|
-
props.onClose(result);
|
|
14
|
-
},
|
|
15
|
-
}));
|
|
16
|
-
|
|
17
|
-
useEffect(() => {
|
|
18
|
-
setVisible(true);
|
|
19
|
-
}, []);
|
|
20
|
-
|
|
21
|
-
return (
|
|
22
|
-
<Dialog
|
|
23
|
-
visible={visible}
|
|
24
|
-
onHide={() => {
|
|
25
|
-
setVisible(false);
|
|
26
|
-
props.onClose(null);
|
|
27
|
-
}}
|
|
28
|
-
header="About AI Workbench"
|
|
29
|
-
style={{ width: "400px" }}
|
|
30
|
-
>
|
|
31
|
-
<div className="flex flex-col gap-4 p-2">
|
|
32
|
-
<div>
|
|
33
|
-
Build: <span className="font-bold"> {version}</span> from{" "}
|
|
34
|
-
<span className="font-bold">{buildDate}</span>
|
|
35
|
-
</div>
|
|
36
|
-
<div className="mt-4 text-sm text-gray-600">
|
|
37
|
-
© {new Date().getFullYear()} canvas Reply GmbH. All rights
|
|
38
|
-
reserved.
|
|
39
|
-
</div>
|
|
40
|
-
</div>
|
|
41
|
-
</Dialog>
|
|
42
|
-
);
|
|
43
|
-
},
|
|
44
|
-
);
|