@alpaca-editor/core 1.0.0

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 (239) hide show
  1. package/.prettierrc +3 -0
  2. package/eslint.config.mjs +4 -0
  3. package/images/bg-shape-black.webp +0 -0
  4. package/package.json +52 -0
  5. package/src/client-components/api.ts +6 -0
  6. package/src/client-components/index.ts +19 -0
  7. package/src/components/ActionButton.tsx +43 -0
  8. package/src/components/Error.tsx +57 -0
  9. package/src/config/config.tsx +737 -0
  10. package/src/config/types.ts +263 -0
  11. package/src/editor/ComponentInfo.tsx +77 -0
  12. package/src/editor/ConfirmationDialog.tsx +103 -0
  13. package/src/editor/ContentTree.tsx +654 -0
  14. package/src/editor/ContextMenu.tsx +155 -0
  15. package/src/editor/Editor.tsx +91 -0
  16. package/src/editor/EditorWarning.tsx +34 -0
  17. package/src/editor/EditorWarnings.tsx +33 -0
  18. package/src/editor/FieldEditorPopup.tsx +65 -0
  19. package/src/editor/FieldHistory.tsx +74 -0
  20. package/src/editor/FieldList.tsx +190 -0
  21. package/src/editor/FieldListField.tsx +387 -0
  22. package/src/editor/FieldListFieldWithFallbacks.tsx +211 -0
  23. package/src/editor/FloatingToolbar.tsx +163 -0
  24. package/src/editor/ImageEditor.tsx +129 -0
  25. package/src/editor/InsertMenu.tsx +332 -0
  26. package/src/editor/ItemInfo.tsx +90 -0
  27. package/src/editor/LinkEditorDialog.tsx +192 -0
  28. package/src/editor/MainLayout.tsx +94 -0
  29. package/src/editor/NewEditorClient.tsx +11 -0
  30. package/src/editor/PictureCropper.tsx +505 -0
  31. package/src/editor/PictureEditor.tsx +206 -0
  32. package/src/editor/PictureEditorDialog.tsx +381 -0
  33. package/src/editor/PublishDialog.ignore +74 -0
  34. package/src/editor/ScrollingContentTree.tsx +47 -0
  35. package/src/editor/Terminal.tsx +215 -0
  36. package/src/editor/Titlebar.tsx +23 -0
  37. package/src/editor/ai/AiPopup.tsx +59 -0
  38. package/src/editor/ai/AiResponseMessage.tsx +82 -0
  39. package/src/editor/ai/AiTerminal.tsx +450 -0
  40. package/src/editor/ai/AiToolCall.tsx +46 -0
  41. package/src/editor/ai/EditorAiTerminal.tsx +20 -0
  42. package/src/editor/ai/editorAiContext.ts +18 -0
  43. package/src/editor/client/DialogContext.tsx +49 -0
  44. package/src/editor/client/EditorClient.tsx +1831 -0
  45. package/src/editor/client/GenericDialog.tsx +50 -0
  46. package/src/editor/client/editContext.ts +330 -0
  47. package/src/editor/client/helpers.ts +44 -0
  48. package/src/editor/client/itemsRepository.ts +391 -0
  49. package/src/editor/client/operations.ts +610 -0
  50. package/src/editor/client/pageModelBuilder.ts +182 -0
  51. package/src/editor/commands/commands.ts +23 -0
  52. package/src/editor/commands/componentCommands.tsx +408 -0
  53. package/src/editor/commands/createVersionCommand.ts +33 -0
  54. package/src/editor/commands/deleteVersionCommand.ts +71 -0
  55. package/src/editor/commands/itemCommands.tsx +186 -0
  56. package/src/editor/commands/localizeItem/LocalizeItemDialog.tsx +201 -0
  57. package/src/editor/commands/undo.ts +39 -0
  58. package/src/editor/component-designer/ComponentDesigner.tsx +70 -0
  59. package/src/editor/component-designer/ComponentDesignerAiTerminal.tsx +11 -0
  60. package/src/editor/component-designer/ComponentDesignerMenu.tsx +91 -0
  61. package/src/editor/component-designer/ComponentEditor.tsx +97 -0
  62. package/src/editor/component-designer/ComponentRenderingCodeEditor.tsx +31 -0
  63. package/src/editor/component-designer/ComponentRenderingEditor.tsx +104 -0
  64. package/src/editor/component-designer/ComponentsDropdown.tsx +39 -0
  65. package/src/editor/component-designer/PlaceholdersEditor.tsx +183 -0
  66. package/src/editor/component-designer/RenderingsDropdown.tsx +36 -0
  67. package/src/editor/component-designer/TemplateEditor.tsx +236 -0
  68. package/src/editor/component-designer/aiContext.ts +23 -0
  69. package/src/editor/componentTreeHelper.tsx +114 -0
  70. package/src/editor/control-center/ControlCenterMenu.tsx +71 -0
  71. package/src/editor/control-center/IndexOverview.tsx +50 -0
  72. package/src/editor/control-center/IndexSettings.tsx +266 -0
  73. package/src/editor/control-center/Status.tsx +7 -0
  74. package/src/editor/editor-warnings/ItemLocked.tsx +63 -0
  75. package/src/editor/editor-warnings/NoLanguageWriteAccess.tsx +22 -0
  76. package/src/editor/editor-warnings/NoWorkflowWriteAccess.tsx +23 -0
  77. package/src/editor/editor-warnings/NoWriteAccess.tsx +15 -0
  78. package/src/editor/editor-warnings/ValidationErrors.tsx +54 -0
  79. package/src/editor/field-types/AttachmentEditor.tsx +9 -0
  80. package/src/editor/field-types/CheckboxEditor.tsx +47 -0
  81. package/src/editor/field-types/DropLinkEditor.tsx +75 -0
  82. package/src/editor/field-types/DropListEditor.tsx +84 -0
  83. package/src/editor/field-types/ImageFieldEditor.tsx +65 -0
  84. package/src/editor/field-types/InternalLinkFieldEditor.tsx +112 -0
  85. package/src/editor/field-types/LinkFieldEditor.tsx +85 -0
  86. package/src/editor/field-types/MultiLineText.tsx +63 -0
  87. package/src/editor/field-types/PictureFieldEditor.tsx +121 -0
  88. package/src/editor/field-types/RawEditor.tsx +53 -0
  89. package/src/editor/field-types/ReactQuill.tsx +580 -0
  90. package/src/editor/field-types/RichTextEditor.tsx +22 -0
  91. package/src/editor/field-types/RichTextEditorComponent.tsx +108 -0
  92. package/src/editor/field-types/SingleLineText.tsx +150 -0
  93. package/src/editor/field-types/TreeListEditor.tsx +261 -0
  94. package/src/editor/fieldTypes.ts +140 -0
  95. package/src/editor/media-selector/AiImageSearch.tsx +186 -0
  96. package/src/editor/media-selector/AiImageSearchPrompt.tsx +95 -0
  97. package/src/editor/media-selector/MediaSelector.tsx +42 -0
  98. package/src/editor/media-selector/Preview.tsx +14 -0
  99. package/src/editor/media-selector/Thumbnails.tsx +48 -0
  100. package/src/editor/media-selector/TreeSelector.tsx +292 -0
  101. package/src/editor/media-selector/UploadZone.tsx +137 -0
  102. package/src/editor/menubar/ActionsMenu.tsx +47 -0
  103. package/src/editor/menubar/ActiveUsers.tsx +17 -0
  104. package/src/editor/menubar/ApproveAndPublish.tsx +18 -0
  105. package/src/editor/menubar/BrowseHistory.tsx +37 -0
  106. package/src/editor/menubar/ItemLanguageVersion.tsx +52 -0
  107. package/src/editor/menubar/LanguageSelector.tsx +152 -0
  108. package/src/editor/menubar/Menu.tsx +83 -0
  109. package/src/editor/menubar/NavButtons.tsx +74 -0
  110. package/src/editor/menubar/PageSelector.tsx +139 -0
  111. package/src/editor/menubar/PageViewerControls.tsx +99 -0
  112. package/src/editor/menubar/Separator.tsx +12 -0
  113. package/src/editor/menubar/SiteInfo.tsx +53 -0
  114. package/src/editor/menubar/User.tsx +27 -0
  115. package/src/editor/menubar/VersionSelector.tsx +143 -0
  116. package/src/editor/page-editor-chrome/CommentHighlighting.tsx +287 -0
  117. package/src/editor/page-editor-chrome/CommentHighlightings.tsx +35 -0
  118. package/src/editor/page-editor-chrome/FieldActionIndicator.tsx +44 -0
  119. package/src/editor/page-editor-chrome/FieldActionIndicators.tsx +23 -0
  120. package/src/editor/page-editor-chrome/FieldEditedIndicator.tsx +64 -0
  121. package/src/editor/page-editor-chrome/FieldEditedIndicators.tsx +35 -0
  122. package/src/editor/page-editor-chrome/FrameMenu.tsx +263 -0
  123. package/src/editor/page-editor-chrome/FrameMenus.tsx +48 -0
  124. package/src/editor/page-editor-chrome/InlineEditor.tsx +147 -0
  125. package/src/editor/page-editor-chrome/LockedFieldIndicator.tsx +61 -0
  126. package/src/editor/page-editor-chrome/NoLayout.tsx +36 -0
  127. package/src/editor/page-editor-chrome/PageEditorChrome.tsx +119 -0
  128. package/src/editor/page-editor-chrome/PictureEditorOverlay.tsx +154 -0
  129. package/src/editor/page-editor-chrome/PlaceholderDropZone.tsx +171 -0
  130. package/src/editor/page-editor-chrome/PlaceholderDropZones.tsx +233 -0
  131. package/src/editor/page-viewer/DeviceToolbar.tsx +70 -0
  132. package/src/editor/page-viewer/EditorForm.tsx +247 -0
  133. package/src/editor/page-viewer/MiniMap.tsx +351 -0
  134. package/src/editor/page-viewer/PageViewer.tsx +127 -0
  135. package/src/editor/page-viewer/PageViewerFrame.tsx +1030 -0
  136. package/src/editor/page-viewer/pageViewContext.ts +186 -0
  137. package/src/editor/pageModel.ts +191 -0
  138. package/src/editor/picture-shared.tsx +53 -0
  139. package/src/editor/reviews/Comment.tsx +265 -0
  140. package/src/editor/reviews/Comments.tsx +50 -0
  141. package/src/editor/reviews/PreviewInfo.tsx +35 -0
  142. package/src/editor/reviews/Reviews.tsx +280 -0
  143. package/src/editor/reviews/reviewCommands.tsx +47 -0
  144. package/src/editor/reviews/useReviews.tsx +70 -0
  145. package/src/editor/services/aiService.ts +155 -0
  146. package/src/editor/services/componentDesignerService.ts +151 -0
  147. package/src/editor/services/contentService.ts +159 -0
  148. package/src/editor/services/editService.ts +462 -0
  149. package/src/editor/services/indexService.ts +24 -0
  150. package/src/editor/services/reviewsService.ts +45 -0
  151. package/src/editor/services/serviceHelper.ts +95 -0
  152. package/src/editor/services/systemService.ts +5 -0
  153. package/src/editor/services/translationService.ts +21 -0
  154. package/src/editor/services-server/api.ts +150 -0
  155. package/src/editor/services-server/graphQL.ts +106 -0
  156. package/src/editor/sidebar/ComponentPalette.tsx +146 -0
  157. package/src/editor/sidebar/ComponentTree.tsx +512 -0
  158. package/src/editor/sidebar/ComponentTree2.tsxx +490 -0
  159. package/src/editor/sidebar/Debug.tsx +105 -0
  160. package/src/editor/sidebar/DictionaryEditor.tsx +261 -0
  161. package/src/editor/sidebar/EditHistory.tsx +134 -0
  162. package/src/editor/sidebar/GraphQL.tsx +164 -0
  163. package/src/editor/sidebar/Insert.tsx +35 -0
  164. package/src/editor/sidebar/MainContentTree.tsx +95 -0
  165. package/src/editor/sidebar/Performance.tsx +53 -0
  166. package/src/editor/sidebar/Sessions.tsx +35 -0
  167. package/src/editor/sidebar/Sidebar.tsx +20 -0
  168. package/src/editor/sidebar/SidebarView.tsx +150 -0
  169. package/src/editor/sidebar/Translations.tsx +276 -0
  170. package/src/editor/sidebar/Validation.tsx +102 -0
  171. package/src/editor/sidebar/ViewSelector.tsx +49 -0
  172. package/src/editor/sidebar/Workbox.tsx +209 -0
  173. package/src/editor/ui/CenteredMessage.tsx +7 -0
  174. package/src/editor/ui/CopyToClipboardButton.tsx +23 -0
  175. package/src/editor/ui/DialogButtons.tsx +11 -0
  176. package/src/editor/ui/Icons.tsx +585 -0
  177. package/src/editor/ui/ItemNameDialog.tsx +94 -0
  178. package/src/editor/ui/ItemNameDialogNew.tsx +118 -0
  179. package/src/editor/ui/ItemSearch.tsx +173 -0
  180. package/src/editor/ui/PerfectTree.tsx +550 -0
  181. package/src/editor/ui/Section.tsx +35 -0
  182. package/src/editor/ui/SimpleIconButton.tsx +43 -0
  183. package/src/editor/ui/SimpleMenu.tsx +48 -0
  184. package/src/editor/ui/SimpleTable.tsx +63 -0
  185. package/src/editor/ui/SimpleTabs.tsx +55 -0
  186. package/src/editor/ui/SimpleToolbar.tsx +7 -0
  187. package/src/editor/ui/Spinner.tsx +7 -0
  188. package/src/editor/ui/Splitter.tsx +247 -0
  189. package/src/editor/ui/StackedPanels.tsx +134 -0
  190. package/src/editor/ui/Toolbar.tsx +7 -0
  191. package/src/editor/utils/id-helper.ts +3 -0
  192. package/src/editor/utils/insertOptions.ts +69 -0
  193. package/src/editor/utils/itemutils.ts +29 -0
  194. package/src/editor/utils/useMemoDebug.ts +28 -0
  195. package/src/editor/utils.ts +435 -0
  196. package/src/editor/views/CompareView.tsx +256 -0
  197. package/src/editor/views/EditView.tsx +27 -0
  198. package/src/editor/views/ItemEditor.tsx +58 -0
  199. package/src/editor/views/SingleEditView.tsx +44 -0
  200. package/src/fonts/Geist-Black.woff2 +0 -0
  201. package/src/fonts/Geist-Bold.woff2 +0 -0
  202. package/src/fonts/Geist-ExtraBold.woff2 +0 -0
  203. package/src/fonts/Geist-ExtraLight.woff2 +0 -0
  204. package/src/fonts/Geist-Light.woff2 +0 -0
  205. package/src/fonts/Geist-Medium.woff2 +0 -0
  206. package/src/fonts/Geist-Regular.woff2 +0 -0
  207. package/src/fonts/Geist-SemiBold.woff2 +0 -0
  208. package/src/fonts/Geist-Thin.woff2 +0 -0
  209. package/src/fonts/Geist[wght].woff2 +0 -0
  210. package/src/index.ts +7 -0
  211. package/src/page-wizard/PageWizard.tsx +163 -0
  212. package/src/page-wizard/SelectWizard.tsx +109 -0
  213. package/src/page-wizard/WizardSteps.tsx +207 -0
  214. package/src/page-wizard/service.ts +35 -0
  215. package/src/page-wizard/startPageWizardCommand.ts +27 -0
  216. package/src/page-wizard/steps/BuildPageStep.tsx +266 -0
  217. package/src/page-wizard/steps/CollectStep.tsx +233 -0
  218. package/src/page-wizard/steps/ComponentTypesSelector.tsx +443 -0
  219. package/src/page-wizard/steps/Components.tsx +193 -0
  220. package/src/page-wizard/steps/CreatePage.tsx +285 -0
  221. package/src/page-wizard/steps/CreatePageAndLayoutStep.tsx +384 -0
  222. package/src/page-wizard/steps/EditButton.tsx +34 -0
  223. package/src/page-wizard/steps/FieldEditor.tsx +102 -0
  224. package/src/page-wizard/steps/Generate.tsx +32 -0
  225. package/src/page-wizard/steps/ImagesStep.tsx +318 -0
  226. package/src/page-wizard/steps/LayoutStep.tsx +228 -0
  227. package/src/page-wizard/steps/SelectStep.tsx +256 -0
  228. package/src/page-wizard/steps/schema.ts +180 -0
  229. package/src/page-wizard/steps/usePageCreator.ts +279 -0
  230. package/src/splash-screen/NewPage.tsx +232 -0
  231. package/src/splash-screen/SectionHeadline.tsx +21 -0
  232. package/src/splash-screen/SplashScreen.tsx +156 -0
  233. package/src/tour/Tour.tsx +558 -0
  234. package/src/tour/default-tour.tsx +300 -0
  235. package/src/tour/preview-tour.tsx +127 -0
  236. package/src/types.ts +302 -0
  237. package/styles.css +476 -0
  238. package/tsconfig.build.json +21 -0
  239. package/tsconfig.json +11 -0
@@ -0,0 +1,263 @@
1
+ import { ComponentType, ReactNode, Dispatch, SetStateAction } from "react";
2
+ import { EditContextType } from "../editor/client/editContext";
3
+ import { Command, CommandData } from "../editor/commands/commands";
4
+ import { EditorWarningProps } from "../editor/EditorWarnings";
5
+ import {
6
+ Field,
7
+ FieldButton,
8
+ FullItem,
9
+ ItemDescriptor,
10
+ } from "../editor/pageModel";
11
+ import {
12
+ InsertItemCommand,
13
+ ItemCommand,
14
+ } from "../editor/commands/itemCommands";
15
+ import { User } from "../types";
16
+ import { WizardData, WizardPageModel } from "../page-wizard/PageWizard";
17
+ import { Wizard } from "../page-wizard/PageWizard";
18
+ import { DialogContextValue } from "../editor/client/DialogContext";
19
+
20
+ export type RichTextEditorProfile = {
21
+ toolbar: {
22
+ groups: RichTextEditorToolbarGroup[];
23
+ };
24
+ };
25
+
26
+ export type ClientFieldButton = FieldButton & {
27
+ clientAction?: FieldAction;
28
+ };
29
+
30
+ export type FieldAction = ({
31
+ editContext,
32
+ dialogContext,
33
+ }: FieldActionProps) => Promise<any> | void;
34
+
35
+ export type FieldActionProps = {
36
+ editContext: EditContextType;
37
+ dialogContext: DialogContextValue;
38
+ field: Field;
39
+ };
40
+
41
+ export type RichTextEditorToolbarGroup = {
42
+ items: RichTextEditorToolbarItem[];
43
+ };
44
+
45
+ export type RichTextEditorToolbarItem = string | {};
46
+
47
+ export type EditorClientBuilderProps = {
48
+ configuration: EditorConfiguration;
49
+ buildClient: (configuration: EditorConfiguration) => ReactNode;
50
+ user: User;
51
+ };
52
+
53
+ export type Panel = {
54
+ name: string;
55
+ title: string;
56
+ icon?: string | React.JSX.Element;
57
+ header?: ComponentType;
58
+ content: ReactNode;
59
+ initialSize: number;
60
+ noOverflow?: boolean;
61
+ };
62
+
63
+ export type PanelFactory = (editContext: EditContextType) => Panel;
64
+
65
+ export type Sidebar = { panels: (Panel | PanelFactory)[]; title?: string };
66
+ export type EditorView = {
67
+ name: string;
68
+ extends?: string;
69
+ title?: string;
70
+ icon?: string | React.JSX.Element;
71
+ defaultCenterPanelView?: ReactNode;
72
+ menuBar?: ReactNode;
73
+ leftSidebar?: Sidebar;
74
+ rightSidebar?: Sidebar;
75
+ hidden?: boolean;
76
+ primaryControls?: ReactNode;
77
+ secondaryControls?: ReactNode;
78
+ hideViewSelector?: boolean;
79
+ };
80
+
81
+ export type ViewPanel = {
82
+ name: string;
83
+ content: ReactNode;
84
+ };
85
+
86
+ export type MenuItem = {
87
+ id: string;
88
+ label: string;
89
+ icon: ReactNode;
90
+ items?: MenuItem[];
91
+ command?: (event: any) => Promise<void>;
92
+ };
93
+
94
+ export type EditorConfiguration = {
95
+ extensions: { [key: string]: unknown };
96
+ commands: {
97
+ renameItem: ItemCommand;
98
+ deleteItem: ItemCommand;
99
+ insertItem: InsertItemCommand;
100
+ publishItem: ItemCommand;
101
+ allItemCommands: ItemCommand[];
102
+ reviewcommands: Command<CommandData>[];
103
+ };
104
+ events: {
105
+ onUnauthorized?: () => void;
106
+ };
107
+ services: {
108
+ renderService: {
109
+ path?: string;
110
+ };
111
+ editorService: {
112
+ //baseUrl: string;
113
+ };
114
+ aiService: {
115
+ promptUrl: string;
116
+ };
117
+ };
118
+
119
+ editorWarnings: ComponentType<EditorWarningProps>[];
120
+ fieldTypes: {
121
+ [key: string]: FieldTypeConfiguration;
122
+ };
123
+ outline: {
124
+ width: number;
125
+ };
126
+ debounceFieldEditsInterval: number;
127
+ devices: Device[];
128
+ pageWizard: {
129
+ getWizards: (parentItem: ItemDescriptor) => Promise<Wizard[]>;
130
+ startWizardCommand: Command<{ wizard: Wizard; item: ItemDescriptor }>;
131
+ stepComponents: {
132
+ [key: string]: ComponentType<StepComponentProps>;
133
+ };
134
+ };
135
+
136
+ editor: {
137
+ defaultPanelSizes: [number, number];
138
+ dialogs: {
139
+ newPage: {
140
+ expandTreeNode?: string;
141
+ };
142
+ };
143
+ views: EditorView[];
144
+ actionsMenu?: {
145
+ itemsFactory: (editContext: EditContextType) => MenuItem[];
146
+ };
147
+ mainNavigation?: (MenuItem | Command<any>)[];
148
+ embedded?: boolean;
149
+ titlebar: ReactNode;
150
+ contentTree: {
151
+ contextMenu: {
152
+ factory: (props: {
153
+ items: FullItem[];
154
+ editContext: EditContextType;
155
+ commandCallback?: (command: ItemCommand, result: any) => void;
156
+ }) => Promise<MenuItem[] | undefined>;
157
+ };
158
+ };
159
+ };
160
+ controlCenter: {
161
+ groups: {
162
+ title: string;
163
+ icon: ReactNode;
164
+ panels: ControlCenterPanel[];
165
+ }[];
166
+ };
167
+
168
+ tours: {
169
+ default: Tour;
170
+ preview: Tour;
171
+ };
172
+ activeTour: string;
173
+ };
174
+
175
+ export type Tour = {
176
+ getSteps: (params: GetEditorTourStepsParams) => Record<string, TourStep>;
177
+ };
178
+
179
+ export type ControlCenterPanel = {
180
+ id: string;
181
+ title: string;
182
+ icon?: ReactNode;
183
+ content: ReactNode;
184
+ };
185
+
186
+ export type Device = {
187
+ name: string;
188
+ width: number | undefined;
189
+ height: number | undefined;
190
+ };
191
+
192
+ export type FieldTypeConfiguration = {
193
+ editor: React.ComponentType<any>;
194
+ buttons?: FieldButton[];
195
+ custom?: any;
196
+ };
197
+
198
+ export type TourButton = {
199
+ label: ReactNode;
200
+ onClick: () => void;
201
+ className?: string;
202
+ };
203
+
204
+ export type TourStep = {
205
+ title?: ReactNode;
206
+ description?: ReactNode;
207
+ focusElement?: string;
208
+ extendFocus?: number;
209
+ prepareAction?: () => Promise<void>;
210
+ action?: () => Promise<void>;
211
+ bubblePosition?: "left" | "right" | "bottom" | "top-right";
212
+ flipArrow?: boolean;
213
+ waitForUserInput?: () => Promise<string | void>;
214
+ buttons?: TourButton[];
215
+ nextStep?: string;
216
+ waitForElement?: string;
217
+ getPointTo?: () => DOMRect | undefined;
218
+ pointToElement?: string;
219
+ };
220
+
221
+ export type GetEditorTourStepsParams = {
222
+ editContext: EditContextType;
223
+ nextStep: (stepId: string) => void;
224
+ stopTour: () => void;
225
+ waitForElement: (
226
+ selector: string,
227
+ timeout?: number,
228
+ ) => Promise<DOMRect | undefined>;
229
+ waitForElementToDisappear: (selector: string) => Promise<void>;
230
+ setFocusRect: (rect: DOMRect) => void;
231
+ delay: (ms: number) => Promise<void>;
232
+ waitForInput: (
233
+ selector: string,
234
+ minNumberOfCharacters: number,
235
+ ) => Promise<void>;
236
+ simulateTyping: (
237
+ element: HTMLInputElement | HTMLTextAreaElement,
238
+ text: string,
239
+ interval?: number,
240
+ ) => Promise<void>;
241
+ };
242
+
243
+ export type TranslationStatus = {
244
+ itemId: string;
245
+ targetLanguage: string;
246
+ sourceLanguage: string;
247
+ status: string;
248
+ timestamp: string;
249
+ message?: string;
250
+ };
251
+
252
+ export interface StepComponentProps {
253
+ step: any;
254
+ data: WizardData;
255
+ setData: React.Dispatch<React.SetStateAction<WizardData>>;
256
+ wizard: Wizard;
257
+ parentItem?: ItemDescriptor;
258
+ setStepCompleted: (completed: boolean) => void;
259
+ internalState: any;
260
+ setInternalState: Dispatch<SetStateAction<any>>;
261
+ pageModel: WizardPageModel;
262
+ setPageModel: Dispatch<SetStateAction<WizardPageModel>>;
263
+ }
@@ -0,0 +1,77 @@
1
+ "use client";
2
+
3
+ import { useEffect, useState } from "react";
4
+ import { Component, FullItem } from "./pageModel";
5
+ import { CopyToClipboardButton } from "./ui/CopyToClipboardButton";
6
+ import { Section } from "./ui/Section";
7
+ import { useEditContext } from "./client/editContext";
8
+
9
+ export function ComponentInfo({ component }: { component: Component | null }) {
10
+ if (!component) return null;
11
+
12
+ const editContext = useEditContext();
13
+
14
+ const [layoutItem, setLayoutItem] = useState<FullItem>();
15
+
16
+ useEffect(() => {
17
+ if (!component.layoutId) {
18
+ setLayoutItem(undefined);
19
+ return;
20
+ }
21
+ editContext!.itemsRepository
22
+ .getItem({
23
+ id: component.layoutId,
24
+ language: editContext!.currentItemDescriptor!.language,
25
+ version: 0,
26
+ })
27
+ .then(setLayoutItem);
28
+ }, [component.layoutId]);
29
+
30
+ const hostingPageItem = layoutItem ? (
31
+ <>
32
+ <div className="font-bold">Source:</div>
33
+ <div>
34
+ {layoutItem.path} ID: {layoutItem.id}
35
+ </div>
36
+ </>
37
+ ) : null;
38
+
39
+ const linkedComponent = component.datasourceItem ? (
40
+ <>
41
+ <div className="font-bold">Source:</div>
42
+ <div>
43
+ {component.datasourceItem.path} ({component.datasourceItem.id})
44
+ </div>
45
+ </>
46
+ ) : null;
47
+
48
+ return (
49
+ <div>
50
+ <h2 className="py-3 px-3 text-l font-bold my-2">
51
+ {component.name}
52
+ </h2>
53
+ <Section title="Info">
54
+ <div className="grid grid-cols-[min-content_1fr] gap-3 text-xs bg-gray-100">
55
+ <div className="font-bold">ID:</div>
56
+ <div>
57
+ {component.id} <CopyToClipboardButton text={component.id} />
58
+ </div>
59
+ <div className="font-bold">Template</div>
60
+ <div>
61
+ ({component.datasourceItem?.templateId}
62
+ {component.datasourceItem && (
63
+ <CopyToClipboardButton
64
+ text={component.datasourceItem.templateId}
65
+ />
66
+ )}
67
+ )
68
+ </div>
69
+ <div className="font-bold">Languages</div>
70
+ <div>{component.datasourceItem?.translations?.join(", ")}</div>
71
+ {hostingPageItem}
72
+ {linkedComponent}
73
+ </div>
74
+ </Section>
75
+ </div>
76
+ );
77
+ }
@@ -0,0 +1,103 @@
1
+ import { useState, forwardRef, useImperativeHandle } from "react";
2
+ import { Dialog } from "primereact/dialog";
3
+ import { Button } from "primereact/button";
4
+
5
+ export type ConfirmationDialogProps = {};
6
+
7
+ export type ConfirmationProps = {
8
+ message: React.ReactNode;
9
+ acceptIcon?: string;
10
+ rejectIcon?: string;
11
+ header?: React.ReactNode;
12
+ acceptLabel?: string;
13
+ rejectLabel?: string;
14
+ icon?: string;
15
+ accept: () => void;
16
+ reject?: () => void;
17
+ showCancel?: boolean;
18
+ showAccept?: boolean;
19
+ };
20
+
21
+ export interface ConfirmationDialogHandle {
22
+ confirm: (props: ConfirmationProps) => void;
23
+ }
24
+
25
+ const ConfirmationDialog = forwardRef<
26
+ ConfirmationDialogHandle,
27
+ ConfirmationDialogProps
28
+ >((_props, ref) => {
29
+ const [visible, setVisible] = useState(false);
30
+
31
+ const [props, setProps] = useState<ConfirmationProps>();
32
+
33
+ const showAccept = props?.accept === undefined ? true : props.accept;
34
+
35
+ useImperativeHandle(ref, () => ({
36
+ confirm: (props: ConfirmationProps) => {
37
+ setVisible(true);
38
+ setProps(props);
39
+ },
40
+ }));
41
+
42
+ const handleAccept = () => {
43
+ props?.accept();
44
+ setVisible(false);
45
+ };
46
+
47
+ const handleReject = () => {
48
+ if (props?.reject) props.reject();
49
+ setVisible(false);
50
+ };
51
+
52
+ const handleCancel = () => {
53
+ setVisible(false);
54
+ };
55
+
56
+ const dialogFooter = (
57
+ <div>
58
+ {showAccept && (
59
+ <Button
60
+ label={props?.acceptLabel || "Yes"}
61
+ icon={props?.acceptIcon || "pi pi-check"}
62
+ onClick={handleAccept}
63
+ className="p-button-text"
64
+ />
65
+ )}
66
+ {props?.rejectLabel && (
67
+ <Button
68
+ label={props?.rejectLabel}
69
+ icon={props?.rejectIcon || "pi pi-times"}
70
+ onClick={handleReject}
71
+ className="p-button-text"
72
+ />
73
+ )}
74
+ {props?.showCancel && (
75
+ <Button
76
+ label="Cancel"
77
+ icon="pi pi-ban"
78
+ onClick={handleCancel}
79
+ className="p-button-text"
80
+ />
81
+ )}
82
+ </div>
83
+ );
84
+
85
+ return (
86
+ visible && (
87
+ <Dialog
88
+ header={props?.header || "Confirm"}
89
+ visible={visible}
90
+ style={{ maxWidth: "50vw" }}
91
+ footer={dialogFooter}
92
+ onHide={handleCancel}
93
+ >
94
+ <div className="flex items-center gap-2 p-3">
95
+ {props?.icon && <i className={props.icon + " text-3xl"}></i>}
96
+ {props?.message}
97
+ </div>
98
+ </Dialog>
99
+ )
100
+ );
101
+ });
102
+
103
+ export default ConfirmationDialog;