@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,454 +0,0 @@
|
|
|
1
|
-
import { Dispatch, SetStateAction, useEffect, useState, useRef } from "react";
|
|
2
|
-
import { WizardStep } from "../PageWizard";
|
|
3
|
-
import {
|
|
4
|
-
PageSchema,
|
|
5
|
-
SchemaComponent,
|
|
6
|
-
SchemaPlaceholder,
|
|
7
|
-
WizardData,
|
|
8
|
-
} from "../PageWizard";
|
|
9
|
-
|
|
10
|
-
// Component Type and Placeholder Selection UI
|
|
11
|
-
export function ComponentTypeSelector({
|
|
12
|
-
selectedComponentTypes,
|
|
13
|
-
setSelectedComponentTypes,
|
|
14
|
-
schema,
|
|
15
|
-
data,
|
|
16
|
-
setData,
|
|
17
|
-
step,
|
|
18
|
-
}: {
|
|
19
|
-
selectedComponentTypes?: string[];
|
|
20
|
-
setSelectedComponentTypes: Dispatch<SetStateAction<string[]>>;
|
|
21
|
-
schema: PageSchema | string;
|
|
22
|
-
data: WizardData;
|
|
23
|
-
setData: (data: WizardData) => void;
|
|
24
|
-
step: WizardStep;
|
|
25
|
-
}) {
|
|
26
|
-
const [availableComponentTypes, setAvailableComponentTypes] = useState<
|
|
27
|
-
string[]
|
|
28
|
-
>([]);
|
|
29
|
-
const [preselectedTypes, setPreselectedTypes] = useState<string[]>([]);
|
|
30
|
-
const [searchFilter, setSearchFilter] = useState<string>("");
|
|
31
|
-
|
|
32
|
-
// Ensure selectedComponentTypes is always an array
|
|
33
|
-
useEffect(() => {
|
|
34
|
-
if (!selectedComponentTypes || !Array.isArray(selectedComponentTypes)) {
|
|
35
|
-
setSelectedComponentTypes([]);
|
|
36
|
-
}
|
|
37
|
-
}, [selectedComponentTypes]);
|
|
38
|
-
|
|
39
|
-
// Handle select all component types
|
|
40
|
-
const handleSelectAllComponents = () => {
|
|
41
|
-
setSelectedComponentTypes(availableComponentTypes);
|
|
42
|
-
setData({
|
|
43
|
-
...data,
|
|
44
|
-
selectedComponentTypes: availableComponentTypes,
|
|
45
|
-
});
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
// Handle clear all component types
|
|
49
|
-
const handleClearAllComponents = () => {
|
|
50
|
-
setSelectedComponentTypes([]);
|
|
51
|
-
setData({
|
|
52
|
-
...data,
|
|
53
|
-
selectedComponentTypes: [],
|
|
54
|
-
});
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
// Toggle component type selection
|
|
58
|
-
const toggleComponentType = (type: string) => {
|
|
59
|
-
if (!setSelectedComponentTypes) {
|
|
60
|
-
console.error("setSelectedComponentTypes is not defined");
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
try {
|
|
65
|
-
// Get the current selected types safely
|
|
66
|
-
const currentSelected = Array.isArray(selectedComponentTypes)
|
|
67
|
-
? selectedComponentTypes
|
|
68
|
-
: [];
|
|
69
|
-
|
|
70
|
-
// Calculate the new selection
|
|
71
|
-
const newSelected = currentSelected.includes(type)
|
|
72
|
-
? currentSelected.filter((t: string) => t !== type)
|
|
73
|
-
: [...currentSelected, type];
|
|
74
|
-
|
|
75
|
-
// Update the state
|
|
76
|
-
setSelectedComponentTypes(newSelected);
|
|
77
|
-
|
|
78
|
-
// Save selected types to wizard data
|
|
79
|
-
setData({
|
|
80
|
-
...data,
|
|
81
|
-
selectedComponentTypes: newSelected,
|
|
82
|
-
});
|
|
83
|
-
} catch (error) {
|
|
84
|
-
console.error("Error in toggleComponentType:", error);
|
|
85
|
-
}
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
// Filter available components by search term
|
|
89
|
-
const filteredComponentTypes = availableComponentTypes.filter((type) =>
|
|
90
|
-
type.toLowerCase().includes(searchFilter.toLowerCase()),
|
|
91
|
-
);
|
|
92
|
-
|
|
93
|
-
// Helper function to recursively extract component types
|
|
94
|
-
const extractComponentTypes = (
|
|
95
|
-
items: PageSchema | SchemaComponent[],
|
|
96
|
-
): string[] => {
|
|
97
|
-
if (!items || !Array.isArray(items)) return [];
|
|
98
|
-
|
|
99
|
-
let types: string[] = [];
|
|
100
|
-
|
|
101
|
-
for (const item of items) {
|
|
102
|
-
// Add the current component type if it exists
|
|
103
|
-
if ("type" in item) {
|
|
104
|
-
types.push(item.type);
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
// Process components in placeholders recursively
|
|
108
|
-
if ("placeholders" in item && Array.isArray(item.placeholders)) {
|
|
109
|
-
for (const placeholder of item.placeholders) {
|
|
110
|
-
if (placeholder.components && Array.isArray(placeholder.components)) {
|
|
111
|
-
types = [
|
|
112
|
-
...types,
|
|
113
|
-
...extractComponentTypes(placeholder.components),
|
|
114
|
-
];
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
// Process components directly (for top-level structure)
|
|
120
|
-
if ("components" in item && Array.isArray(item.components)) {
|
|
121
|
-
types = [...types, ...extractComponentTypes(item.components)];
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
return types;
|
|
126
|
-
};
|
|
127
|
-
|
|
128
|
-
// Helper function to extract placeholders from the schema
|
|
129
|
-
const extractPlaceholders = (
|
|
130
|
-
items: PageSchema | SchemaComponent[],
|
|
131
|
-
): string[] => {
|
|
132
|
-
if (!items || !Array.isArray(items)) return [];
|
|
133
|
-
|
|
134
|
-
let placeholders: string[] = [];
|
|
135
|
-
|
|
136
|
-
for (const item of items) {
|
|
137
|
-
// Add the current placeholder name if it exists
|
|
138
|
-
if ("name" in item) {
|
|
139
|
-
placeholders.push(item.name);
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
// Handle SchemaComponent objects
|
|
143
|
-
if ("placeholders" in item && Array.isArray(item.placeholders)) {
|
|
144
|
-
// Extract names from each placeholder
|
|
145
|
-
item.placeholders.forEach((placeholder: SchemaPlaceholder) => {
|
|
146
|
-
placeholders.push(placeholder.name);
|
|
147
|
-
|
|
148
|
-
// Recursively process components in this placeholder
|
|
149
|
-
if (placeholder.components && Array.isArray(placeholder.components)) {
|
|
150
|
-
placeholders = [
|
|
151
|
-
...placeholders,
|
|
152
|
-
...extractPlaceholders(placeholder.components),
|
|
153
|
-
];
|
|
154
|
-
}
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
// Handle SchemaPlaceholder objects
|
|
159
|
-
if ("components" in item && Array.isArray(item.components)) {
|
|
160
|
-
placeholders = [
|
|
161
|
-
...placeholders,
|
|
162
|
-
...extractPlaceholders(item.components),
|
|
163
|
-
];
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
return placeholders;
|
|
168
|
-
};
|
|
169
|
-
|
|
170
|
-
// Initialize selections based on data or preselected values
|
|
171
|
-
const initializeSelections = (
|
|
172
|
-
uniqueTypes: string[],
|
|
173
|
-
stepPreselectedTypes: string[],
|
|
174
|
-
) => {
|
|
175
|
-
// Initialize selected types from data (parent component should have already initialized this)
|
|
176
|
-
if (
|
|
177
|
-
data.selectedComponentTypes &&
|
|
178
|
-
Array.isArray(data.selectedComponentTypes)
|
|
179
|
-
) {
|
|
180
|
-
// Filter out any types that are no longer available
|
|
181
|
-
const validSelectedTypes = data.selectedComponentTypes.filter((type) =>
|
|
182
|
-
uniqueTypes.includes(type),
|
|
183
|
-
);
|
|
184
|
-
setSelectedComponentTypes(validSelectedTypes);
|
|
185
|
-
} else {
|
|
186
|
-
// Fallback initialization if parent didn't handle it
|
|
187
|
-
const initialSelection =
|
|
188
|
-
stepPreselectedTypes.length > 0 ? stepPreselectedTypes : uniqueTypes;
|
|
189
|
-
setSelectedComponentTypes(initialSelection);
|
|
190
|
-
setData({
|
|
191
|
-
...data,
|
|
192
|
-
selectedComponentTypes: initialSelection,
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
};
|
|
196
|
-
|
|
197
|
-
// Extract component types and placeholders from wizard schema when available
|
|
198
|
-
useEffect(() => {
|
|
199
|
-
if (schema) {
|
|
200
|
-
try {
|
|
201
|
-
// Parse schema if it's a string
|
|
202
|
-
schema =
|
|
203
|
-
typeof schema === "string"
|
|
204
|
-
? (JSON.parse(schema) as PageSchema)
|
|
205
|
-
: schema;
|
|
206
|
-
|
|
207
|
-
// Extract component types
|
|
208
|
-
const componentTypes = extractComponentTypes(schema);
|
|
209
|
-
|
|
210
|
-
// Remove duplicates and sort alphabetically
|
|
211
|
-
const uniqueTypes = Array.from(
|
|
212
|
-
new Set(componentTypes),
|
|
213
|
-
).sort() as string[];
|
|
214
|
-
|
|
215
|
-
setAvailableComponentTypes(uniqueTypes);
|
|
216
|
-
|
|
217
|
-
// Parse preselected components from step if available
|
|
218
|
-
let stepPreselectedTypes: string[] = [];
|
|
219
|
-
if (step.fields["preselectedComponents"]) {
|
|
220
|
-
// Split by comma or newline and trim whitespace
|
|
221
|
-
stepPreselectedTypes = step.fields["preselectedComponents"]
|
|
222
|
-
.split(/[,\n\r]+/)
|
|
223
|
-
.map((type: string) => type.trim())
|
|
224
|
-
.filter((type: string) => type && uniqueTypes.includes(type)); // Only include valid types
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
// Set preselected types for UI differentiation
|
|
228
|
-
setPreselectedTypes(stepPreselectedTypes);
|
|
229
|
-
|
|
230
|
-
// Parse preselected placeholders from step if available
|
|
231
|
-
|
|
232
|
-
// Initialize component types and placeholders
|
|
233
|
-
initializeSelections(uniqueTypes, stepPreselectedTypes);
|
|
234
|
-
} catch (error) {
|
|
235
|
-
console.error("Error processing schema:", error);
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
}, [schema, step]);
|
|
239
|
-
|
|
240
|
-
return (
|
|
241
|
-
<div className="space-y-4">
|
|
242
|
-
<div className="mb-2">
|
|
243
|
-
<input
|
|
244
|
-
type="text"
|
|
245
|
-
value={searchFilter}
|
|
246
|
-
onChange={(e) => setSearchFilter(e.target.value)}
|
|
247
|
-
placeholder="Search components..."
|
|
248
|
-
className="focus:ring-theme-secondary w-full rounded border border-gray-300 px-3 py-1 text-sm focus:ring-1 focus:outline-none"
|
|
249
|
-
/>
|
|
250
|
-
</div>
|
|
251
|
-
|
|
252
|
-
<div className="mb-3 flex flex-col gap-3 py-2">
|
|
253
|
-
{/* Component Types Section */}
|
|
254
|
-
<div className="min-w-0 flex-1 rounded">
|
|
255
|
-
<div className="mb-2 flex items-center justify-between">
|
|
256
|
-
<h4 className="text-sm font-bold">Component Types</h4>
|
|
257
|
-
</div>
|
|
258
|
-
|
|
259
|
-
{/* Selected component tags */}
|
|
260
|
-
{/* <div className="mb-2">
|
|
261
|
-
<div className="mb-2 flex flex-wrap gap-1">
|
|
262
|
-
{selectedComponentTypes &&
|
|
263
|
-
Array.isArray(selectedComponentTypes) &&
|
|
264
|
-
selectedComponentTypes.length > 0 ? (
|
|
265
|
-
selectedComponentTypes.map((type) => (
|
|
266
|
-
<div
|
|
267
|
-
key={type}
|
|
268
|
-
className={`flex items-center rounded-full px-2 py-1 text-xs ${
|
|
269
|
-
preselectedTypes.includes(type)
|
|
270
|
-
? "bg-green-100 text-green-800"
|
|
271
|
-
: "bg-blue-100 text-blue-800"
|
|
272
|
-
}`}
|
|
273
|
-
>
|
|
274
|
-
{type}
|
|
275
|
-
<button
|
|
276
|
-
onClick={() => toggleComponentType(type)}
|
|
277
|
-
className={`ml-1 ${
|
|
278
|
-
preselectedTypes.includes(type)
|
|
279
|
-
? "text-green-600 hover:text-green-800"
|
|
280
|
-
: "text-blue-600 hover:text-blue-800"
|
|
281
|
-
}`}
|
|
282
|
-
aria-label={`Remove ${type}`}
|
|
283
|
-
>
|
|
284
|
-
×
|
|
285
|
-
</button>
|
|
286
|
-
</div>
|
|
287
|
-
))
|
|
288
|
-
) : (
|
|
289
|
-
<div className="text-xs text-gray-500 italic">
|
|
290
|
-
No component types selected
|
|
291
|
-
</div>
|
|
292
|
-
)}
|
|
293
|
-
</div>
|
|
294
|
-
</div> */}
|
|
295
|
-
|
|
296
|
-
{/* Component list */}
|
|
297
|
-
<div
|
|
298
|
-
className={`mb-2 max-h-96 space-y-2 overflow-y-auto ${
|
|
299
|
-
filteredComponentTypes.length === 0
|
|
300
|
-
? "flex items-center justify-center"
|
|
301
|
-
: ""
|
|
302
|
-
}`}
|
|
303
|
-
>
|
|
304
|
-
{filteredComponentTypes.length > 0 ? (
|
|
305
|
-
filteredComponentTypes.map((type) => {
|
|
306
|
-
const isSelected =
|
|
307
|
-
selectedComponentTypes &&
|
|
308
|
-
Array.isArray(selectedComponentTypes) &&
|
|
309
|
-
selectedComponentTypes.includes(type);
|
|
310
|
-
const isPreselected = preselectedTypes.includes(type);
|
|
311
|
-
|
|
312
|
-
// Generate a description for each component type
|
|
313
|
-
const getComponentDescription = (componentType: string) => {
|
|
314
|
-
return `${componentType} component for your page layout`;
|
|
315
|
-
};
|
|
316
|
-
|
|
317
|
-
return (
|
|
318
|
-
<div
|
|
319
|
-
key={type}
|
|
320
|
-
className={`relative cursor-pointer rounded-lg border p-2 transition-all ${
|
|
321
|
-
isSelected
|
|
322
|
-
? "border-theme-secondary bg-theme-secondary-50"
|
|
323
|
-
: "border-gray-200 bg-white hover:border-gray-300 hover:bg-gray-50"
|
|
324
|
-
}`}
|
|
325
|
-
onClick={() => toggleComponentType(type)}
|
|
326
|
-
>
|
|
327
|
-
<div className="flex items-start justify-between">
|
|
328
|
-
<div className="min-w-0 flex-1">
|
|
329
|
-
<div className="mb-1 flex items-center gap-2">
|
|
330
|
-
<div className="flex items-center gap-2">
|
|
331
|
-
<h3 className="text-sm text-gray-900">{type}</h3>
|
|
332
|
-
{isPreselected && (
|
|
333
|
-
<span
|
|
334
|
-
className="text-theme-secondary text-sm"
|
|
335
|
-
title="Recommended by template"
|
|
336
|
-
>
|
|
337
|
-
★
|
|
338
|
-
</span>
|
|
339
|
-
)}
|
|
340
|
-
</div>
|
|
341
|
-
</div>
|
|
342
|
-
{/* <p className="text-sm leading-relaxed text-gray-600">
|
|
343
|
-
{getComponentDescription(type)}
|
|
344
|
-
</p> */}
|
|
345
|
-
</div>
|
|
346
|
-
<div className="ml-4 flex-shrink-0">
|
|
347
|
-
<div
|
|
348
|
-
className={`flex h-6 w-6 items-center justify-center rounded-full border-2 ${
|
|
349
|
-
isSelected
|
|
350
|
-
? "border-theme-secondary bg-theme-secondary"
|
|
351
|
-
: "border-gray-300 bg-white"
|
|
352
|
-
}`}
|
|
353
|
-
>
|
|
354
|
-
{isSelected && (
|
|
355
|
-
<svg
|
|
356
|
-
className="h-3 w-3 text-white"
|
|
357
|
-
fill="currentColor"
|
|
358
|
-
viewBox="0 0 20 20"
|
|
359
|
-
>
|
|
360
|
-
<path
|
|
361
|
-
fillRule="evenodd"
|
|
362
|
-
d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z"
|
|
363
|
-
clipRule="evenodd"
|
|
364
|
-
/>
|
|
365
|
-
</svg>
|
|
366
|
-
)}
|
|
367
|
-
</div>
|
|
368
|
-
</div>
|
|
369
|
-
</div>
|
|
370
|
-
</div>
|
|
371
|
-
);
|
|
372
|
-
})
|
|
373
|
-
) : (
|
|
374
|
-
<div className="p-8 text-center text-gray-500">
|
|
375
|
-
{searchFilter
|
|
376
|
-
? "No matching component types found"
|
|
377
|
-
: "No component types available"}
|
|
378
|
-
</div>
|
|
379
|
-
)}
|
|
380
|
-
</div>
|
|
381
|
-
|
|
382
|
-
{/* Component type action buttons */}
|
|
383
|
-
<div className="flex gap-1">
|
|
384
|
-
<button
|
|
385
|
-
onClick={handleSelectAllComponents}
|
|
386
|
-
disabled={
|
|
387
|
-
selectedComponentTypes &&
|
|
388
|
-
Array.isArray(selectedComponentTypes) &&
|
|
389
|
-
selectedComponentTypes.length === availableComponentTypes.length
|
|
390
|
-
}
|
|
391
|
-
className="flex-1 rounded bg-gray-200 px-2 py-1 text-xs text-gray-700 hover:bg-gray-300 disabled:cursor-not-allowed disabled:bg-gray-100 disabled:text-gray-400"
|
|
392
|
-
>
|
|
393
|
-
Select All
|
|
394
|
-
</button>
|
|
395
|
-
<button
|
|
396
|
-
onClick={handleClearAllComponents}
|
|
397
|
-
disabled={
|
|
398
|
-
!selectedComponentTypes ||
|
|
399
|
-
!Array.isArray(selectedComponentTypes) ||
|
|
400
|
-
selectedComponentTypes.length === 0
|
|
401
|
-
}
|
|
402
|
-
className="flex-1 rounded bg-gray-200 px-2 py-1 text-xs text-gray-700 hover:bg-gray-300 disabled:cursor-not-allowed disabled:bg-gray-100 disabled:text-gray-400"
|
|
403
|
-
>
|
|
404
|
-
Clear All
|
|
405
|
-
</button>
|
|
406
|
-
</div>
|
|
407
|
-
|
|
408
|
-
{/* Use recommended components button */}
|
|
409
|
-
{preselectedTypes.length > 0 && (
|
|
410
|
-
<div className="mt-2">
|
|
411
|
-
<button
|
|
412
|
-
onClick={() => {
|
|
413
|
-
setSelectedComponentTypes(preselectedTypes);
|
|
414
|
-
setData({
|
|
415
|
-
...data,
|
|
416
|
-
selectedComponentTypes: preselectedTypes,
|
|
417
|
-
});
|
|
418
|
-
}}
|
|
419
|
-
disabled={
|
|
420
|
-
selectedComponentTypes &&
|
|
421
|
-
Array.isArray(selectedComponentTypes) &&
|
|
422
|
-
preselectedTypes.length === selectedComponentTypes.length &&
|
|
423
|
-
preselectedTypes.every((type) =>
|
|
424
|
-
selectedComponentTypes.includes(type),
|
|
425
|
-
)
|
|
426
|
-
}
|
|
427
|
-
className="w-full rounded bg-green-500 px-2 py-1 text-xs text-white hover:bg-green-600 disabled:cursor-not-allowed disabled:bg-gray-100 disabled:text-gray-400"
|
|
428
|
-
>
|
|
429
|
-
Use Recommended Components
|
|
430
|
-
</button>
|
|
431
|
-
</div>
|
|
432
|
-
)}
|
|
433
|
-
</div>
|
|
434
|
-
</div>
|
|
435
|
-
</div>
|
|
436
|
-
);
|
|
437
|
-
}
|
|
438
|
-
|
|
439
|
-
// Helper function to get summary for parent card
|
|
440
|
-
export function getComponentTypeSelectorSummary(
|
|
441
|
-
selectedComponentTypes?: string[],
|
|
442
|
-
availableComponentTypes?: string[],
|
|
443
|
-
): string {
|
|
444
|
-
if (!selectedComponentTypes || !Array.isArray(selectedComponentTypes)) {
|
|
445
|
-
return "Configure what the AI will use to generate the layout";
|
|
446
|
-
}
|
|
447
|
-
|
|
448
|
-
if (selectedComponentTypes.length === 0) {
|
|
449
|
-
return "No component types selected";
|
|
450
|
-
}
|
|
451
|
-
|
|
452
|
-
const total = availableComponentTypes?.length || 0;
|
|
453
|
-
return `${selectedComponentTypes.length} of ${total} component types selected`;
|
|
454
|
-
}
|
|
@@ -1,193 +0,0 @@
|
|
|
1
|
-
import { useEditContext } from "../../editor/client/editContext";
|
|
2
|
-
import { Thumbnail } from "../../editor/media-selector/Thumbnails";
|
|
3
|
-
import { SimpleIconButton } from "../../editor/ui/SimpleIconButton";
|
|
4
|
-
import {
|
|
5
|
-
WizardField,
|
|
6
|
-
WizardPageComponent,
|
|
7
|
-
WizardPageModel,
|
|
8
|
-
} from "../PageWizard";
|
|
9
|
-
import { FieldEditor } from "./FieldEditor";
|
|
10
|
-
import React from "react";
|
|
11
|
-
|
|
12
|
-
export function Components({
|
|
13
|
-
pageModel,
|
|
14
|
-
onFieldEdited,
|
|
15
|
-
onComponentRemoved,
|
|
16
|
-
thumbnails,
|
|
17
|
-
setInternalState,
|
|
18
|
-
}: {
|
|
19
|
-
pageModel?: WizardPageModel;
|
|
20
|
-
onFieldEdited: () => void;
|
|
21
|
-
onComponentRemoved: (component: WizardPageComponent) => void;
|
|
22
|
-
thumbnails: Thumbnail[];
|
|
23
|
-
setInternalState: (state: any) => void;
|
|
24
|
-
}) {
|
|
25
|
-
const editContext = useEditContext();
|
|
26
|
-
if (!pageModel) return <div>No layout generated yet</div>;
|
|
27
|
-
|
|
28
|
-
// Simplified component to only render component hierarchy
|
|
29
|
-
const SimpleLayoutItem = ({
|
|
30
|
-
components,
|
|
31
|
-
depth = 0,
|
|
32
|
-
}: {
|
|
33
|
-
components: WizardPageComponent[];
|
|
34
|
-
depth?: number;
|
|
35
|
-
}) => {
|
|
36
|
-
if (!components) return null;
|
|
37
|
-
|
|
38
|
-
// Generate a random pastel background color based on component type
|
|
39
|
-
const getColorForType = (type: string) => {
|
|
40
|
-
// Simple hash function to generate consistent colors for the same type
|
|
41
|
-
const hash = type
|
|
42
|
-
.split("")
|
|
43
|
-
.reduce((acc, char) => acc + char.charCodeAt(0), 0);
|
|
44
|
-
const hue = hash % 360;
|
|
45
|
-
return `hsl(${hue}, 70%, 90%)`;
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
const getThumbnailUrl = (mediaId: string) => {
|
|
49
|
-
if (!thumbnails) return;
|
|
50
|
-
return thumbnails.find((thumbnail) => thumbnail.id === mediaId)?.thumbUrl;
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
const getImage = (field: WizardField) => {
|
|
54
|
-
const url = getThumbnailUrl(field.value);
|
|
55
|
-
if (url) {
|
|
56
|
-
return <img src={url} alt={field.name} className="mb-2" />;
|
|
57
|
-
}
|
|
58
|
-
return field.value;
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
// Handle component with placeholders
|
|
62
|
-
const renderComponent = (
|
|
63
|
-
component: WizardPageComponent,
|
|
64
|
-
collection: WizardPageComponent[]
|
|
65
|
-
) => {
|
|
66
|
-
const indent = depth * 20;
|
|
67
|
-
const componentType = component.type || "Unknown";
|
|
68
|
-
const borderColor = component.type
|
|
69
|
-
? getColorForType(componentType)
|
|
70
|
-
: "#f0f0f0";
|
|
71
|
-
|
|
72
|
-
return (
|
|
73
|
-
<div
|
|
74
|
-
key={component.id}
|
|
75
|
-
className="relative"
|
|
76
|
-
style={{
|
|
77
|
-
marginBottom: "8px",
|
|
78
|
-
marginLeft: indent,
|
|
79
|
-
}}
|
|
80
|
-
>
|
|
81
|
-
<div className="absolute top-0 right-0">
|
|
82
|
-
<SimpleIconButton
|
|
83
|
-
icon="pi pi-times"
|
|
84
|
-
label="Remove"
|
|
85
|
-
onClick={() => {
|
|
86
|
-
// Remove component from its collection
|
|
87
|
-
const index = collection.findIndex(
|
|
88
|
-
(c) => c.id === component.id
|
|
89
|
-
);
|
|
90
|
-
if (index !== -1) {
|
|
91
|
-
collection.splice(index, 1);
|
|
92
|
-
}
|
|
93
|
-
onComponentRemoved(component);
|
|
94
|
-
}}
|
|
95
|
-
/>
|
|
96
|
-
</div>
|
|
97
|
-
<div
|
|
98
|
-
className="mb-2 px-2 py-1 rounded-md bg-white border-2"
|
|
99
|
-
style={{
|
|
100
|
-
borderColor,
|
|
101
|
-
}}
|
|
102
|
-
>
|
|
103
|
-
<div className="mb-2">
|
|
104
|
-
<span className="text-gray-600">{component.type}</span>:{" "}
|
|
105
|
-
{component.name}
|
|
106
|
-
</div>
|
|
107
|
-
<div className="text-xs text-gray-500">
|
|
108
|
-
{component.fields?.map((field, index) =>
|
|
109
|
-
field.type === "Picture" || field.type === "Image" ? (
|
|
110
|
-
<div
|
|
111
|
-
key={index}
|
|
112
|
-
className="cursor-pointer"
|
|
113
|
-
onClick={async () => {
|
|
114
|
-
const currentImage =
|
|
115
|
-
await editContext?.itemsRepository.getItem({
|
|
116
|
-
id: field.value,
|
|
117
|
-
language: "en",
|
|
118
|
-
version: 1,
|
|
119
|
-
});
|
|
120
|
-
const selectedImageId = await editContext?.selectMedia({
|
|
121
|
-
selectedIdPath: currentImage?.idPath || "",
|
|
122
|
-
mode: "images",
|
|
123
|
-
});
|
|
124
|
-
if (selectedImageId) {
|
|
125
|
-
const newImage =
|
|
126
|
-
await editContext?.itemsRepository.getItem({
|
|
127
|
-
id: selectedImageId,
|
|
128
|
-
language: "en",
|
|
129
|
-
version: 1,
|
|
130
|
-
});
|
|
131
|
-
const newThumb: Thumbnail = {
|
|
132
|
-
id: newImage?.id || "",
|
|
133
|
-
name: newImage?.name || "",
|
|
134
|
-
thumbUrl: newImage?.thumbnail || "",
|
|
135
|
-
previewUrl: newImage?.thumbnail || "",
|
|
136
|
-
};
|
|
137
|
-
field.value = selectedImageId;
|
|
138
|
-
setInternalState((state: any) => ({
|
|
139
|
-
...state,
|
|
140
|
-
thumbnails: [...(state.thumbnails || []), newThumb],
|
|
141
|
-
}));
|
|
142
|
-
onFieldEdited();
|
|
143
|
-
}
|
|
144
|
-
}}
|
|
145
|
-
>
|
|
146
|
-
<div className="font-bold text-gray-900">
|
|
147
|
-
{field.name}:
|
|
148
|
-
</div>
|
|
149
|
-
<div>{getImage(field)}</div>
|
|
150
|
-
</div>
|
|
151
|
-
) : (
|
|
152
|
-
<FieldEditor
|
|
153
|
-
key={index}
|
|
154
|
-
field={field}
|
|
155
|
-
onFieldEdited={onFieldEdited}
|
|
156
|
-
/>
|
|
157
|
-
)
|
|
158
|
-
)}
|
|
159
|
-
</div>
|
|
160
|
-
</div>
|
|
161
|
-
|
|
162
|
-
{/* Recursively render child components in placeholders */}
|
|
163
|
-
{component.children && (
|
|
164
|
-
<SimpleLayoutItem
|
|
165
|
-
components={component.children}
|
|
166
|
-
depth={depth + 1}
|
|
167
|
-
/>
|
|
168
|
-
)}
|
|
169
|
-
</div>
|
|
170
|
-
);
|
|
171
|
-
};
|
|
172
|
-
|
|
173
|
-
return components.map((component, index) => (
|
|
174
|
-
<React.Fragment key={component.id || index}>
|
|
175
|
-
{renderComponent(component, components)}
|
|
176
|
-
</React.Fragment>
|
|
177
|
-
));
|
|
178
|
-
};
|
|
179
|
-
|
|
180
|
-
return (
|
|
181
|
-
<>
|
|
182
|
-
<div className="relative flex-1 w-full">
|
|
183
|
-
<div className="overflow-y-auto inset-0 absolute">
|
|
184
|
-
{pageModel ? (
|
|
185
|
-
<SimpleLayoutItem components={pageModel.components} />
|
|
186
|
-
) : (
|
|
187
|
-
<div>No layout generated yet</div>
|
|
188
|
-
)}
|
|
189
|
-
</div>
|
|
190
|
-
</div>
|
|
191
|
-
</>
|
|
192
|
-
);
|
|
193
|
-
}
|