@strapi/content-type-builder 5.25.0 → 5.26.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.
- package/dist/admin/components/AIChat/Chat.js +431 -0
- package/dist/admin/components/AIChat/Chat.js.map +1 -0
- package/dist/admin/components/AIChat/Chat.mjs +429 -0
- package/dist/admin/components/AIChat/Chat.mjs.map +1 -0
- package/dist/admin/components/AIChat/FeedbackModal.js +237 -0
- package/dist/admin/components/AIChat/FeedbackModal.js.map +1 -0
- package/dist/admin/components/AIChat/FeedbackModal.mjs +233 -0
- package/dist/admin/components/AIChat/FeedbackModal.mjs.map +1 -0
- package/dist/admin/components/AIChat/UploadCodeModal.js +427 -0
- package/dist/admin/components/AIChat/UploadCodeModal.js.map +1 -0
- package/dist/admin/components/AIChat/UploadCodeModal.mjs +423 -0
- package/dist/admin/components/AIChat/UploadCodeModal.mjs.map +1 -0
- package/dist/admin/components/AIChat/UploadFigmaModal.js +377 -0
- package/dist/admin/components/AIChat/UploadFigmaModal.js.map +1 -0
- package/dist/admin/components/AIChat/UploadFigmaModal.mjs +373 -0
- package/dist/admin/components/AIChat/UploadFigmaModal.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/Alert.js +46 -0
- package/dist/admin/components/AIChat/components/Alert.js.map +1 -0
- package/dist/admin/components/AIChat/components/Alert.mjs +44 -0
- package/dist/admin/components/AIChat/components/Alert.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/AnimatedBox.js +34 -0
- package/dist/admin/components/AIChat/components/AnimatedBox.js.map +1 -0
- package/dist/admin/components/AIChat/components/AnimatedBox.mjs +32 -0
- package/dist/admin/components/AIChat/components/AnimatedBox.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/Attachments/AttachmentPreview.js +92 -0
- package/dist/admin/components/AIChat/components/Attachments/AttachmentPreview.js.map +1 -0
- package/dist/admin/components/AIChat/components/Attachments/AttachmentPreview.mjs +90 -0
- package/dist/admin/components/AIChat/components/Attachments/AttachmentPreview.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/Attachments/components/Attachment.js +100 -0
- package/dist/admin/components/AIChat/components/Attachments/components/Attachment.js.map +1 -0
- package/dist/admin/components/AIChat/components/Attachments/components/Attachment.mjs +97 -0
- package/dist/admin/components/AIChat/components/Attachments/components/Attachment.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/Base64Image.js +127 -0
- package/dist/admin/components/AIChat/components/Base64Image.js.map +1 -0
- package/dist/admin/components/AIChat/components/Base64Image.mjs +125 -0
- package/dist/admin/components/AIChat/components/Base64Image.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/Collapsible.js +71 -0
- package/dist/admin/components/AIChat/components/Collapsible.js.map +1 -0
- package/dist/admin/components/AIChat/components/Collapsible.mjs +66 -0
- package/dist/admin/components/AIChat/components/Collapsible.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/Dropzone.js +172 -0
- package/dist/admin/components/AIChat/components/Dropzone.js.map +1 -0
- package/dist/admin/components/AIChat/components/Dropzone.mjs +167 -0
- package/dist/admin/components/AIChat/components/Dropzone.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/FloatingPanel.js +166 -0
- package/dist/admin/components/AIChat/components/FloatingPanel.js.map +1 -0
- package/dist/admin/components/AIChat/components/FloatingPanel.mjs +163 -0
- package/dist/admin/components/AIChat/components/FloatingPanel.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/FullScreenImage.js +190 -0
- package/dist/admin/components/AIChat/components/FullScreenImage.js.map +1 -0
- package/dist/admin/components/AIChat/components/FullScreenImage.mjs +187 -0
- package/dist/admin/components/AIChat/components/FullScreenImage.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/ImagePreview.js +87 -0
- package/dist/admin/components/AIChat/components/ImagePreview.js.map +1 -0
- package/dist/admin/components/AIChat/components/ImagePreview.mjs +85 -0
- package/dist/admin/components/AIChat/components/ImagePreview.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/Input.js +126 -0
- package/dist/admin/components/AIChat/components/Input.js.map +1 -0
- package/dist/admin/components/AIChat/components/Input.mjs +121 -0
- package/dist/admin/components/AIChat/components/Input.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/Messages/Marker.js +138 -0
- package/dist/admin/components/AIChat/components/Messages/Marker.js.map +1 -0
- package/dist/admin/components/AIChat/components/Messages/Marker.mjs +136 -0
- package/dist/admin/components/AIChat/components/Messages/Marker.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/Messages/Message.js +214 -0
- package/dist/admin/components/AIChat/components/Messages/Message.js.map +1 -0
- package/dist/admin/components/AIChat/components/Messages/Message.mjs +212 -0
- package/dist/admin/components/AIChat/components/Messages/Message.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/ResizableTextArea.js +78 -0
- package/dist/admin/components/AIChat/components/ResizableTextArea.js.map +1 -0
- package/dist/admin/components/AIChat/components/ResizableTextArea.mjs +76 -0
- package/dist/admin/components/AIChat/components/ResizableTextArea.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/SimpleMenu.js +60 -0
- package/dist/admin/components/AIChat/components/SimpleMenu.js.map +1 -0
- package/dist/admin/components/AIChat/components/SimpleMenu.mjs +35 -0
- package/dist/admin/components/AIChat/components/SimpleMenu.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/StepModal.js +175 -0
- package/dist/admin/components/AIChat/components/StepModal.js.map +1 -0
- package/dist/admin/components/AIChat/components/StepModal.mjs +171 -0
- package/dist/admin/components/AIChat/components/StepModal.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/animations.js +67 -0
- package/dist/admin/components/AIChat/components/animations.js.map +1 -0
- package/dist/admin/components/AIChat/components/animations.mjs +65 -0
- package/dist/admin/components/AIChat/components/animations.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/icons/FigmaIcon.js +50 -0
- package/dist/admin/components/AIChat/components/icons/FigmaIcon.js.map +1 -0
- package/dist/admin/components/AIChat/components/icons/FigmaIcon.mjs +48 -0
- package/dist/admin/components/AIChat/components/icons/FigmaIcon.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/icons/StopIcon.js +25 -0
- package/dist/admin/components/AIChat/components/icons/StopIcon.js.map +1 -0
- package/dist/admin/components/AIChat/components/icons/StopIcon.mjs +23 -0
- package/dist/admin/components/AIChat/components/icons/StopIcon.mjs.map +1 -0
- package/dist/admin/components/AIChat/hooks/useAIFetch.js +107 -0
- package/dist/admin/components/AIChat/hooks/useAIFetch.js.map +1 -0
- package/dist/admin/components/AIChat/hooks/useAIFetch.mjs +96 -0
- package/dist/admin/components/AIChat/hooks/useAIFetch.mjs.map +1 -0
- package/dist/admin/components/AIChat/hooks/useAttachments.js +152 -0
- package/dist/admin/components/AIChat/hooks/useAttachments.js.map +1 -0
- package/dist/admin/components/AIChat/hooks/useAttachments.mjs +150 -0
- package/dist/admin/components/AIChat/hooks/useAttachments.mjs.map +1 -0
- package/dist/admin/components/AIChat/hooks/useChatTitle.js +47 -0
- package/dist/admin/components/AIChat/hooks/useChatTitle.js.map +1 -0
- package/dist/admin/components/AIChat/hooks/useChatTitle.mjs +45 -0
- package/dist/admin/components/AIChat/hooks/useChatTitle.mjs.map +1 -0
- package/dist/admin/components/AIChat/hooks/useCodeUpload.js +212 -0
- package/dist/admin/components/AIChat/hooks/useCodeUpload.js.map +1 -0
- package/dist/admin/components/AIChat/hooks/useCodeUpload.mjs +207 -0
- package/dist/admin/components/AIChat/hooks/useCodeUpload.mjs.map +1 -0
- package/dist/admin/components/AIChat/hooks/useFeedback.js +76 -0
- package/dist/admin/components/AIChat/hooks/useFeedback.js.map +1 -0
- package/dist/admin/components/AIChat/hooks/useFeedback.mjs +74 -0
- package/dist/admin/components/AIChat/hooks/useFeedback.mjs.map +1 -0
- package/dist/admin/components/AIChat/hooks/useFigmaUpload.js +206 -0
- package/dist/admin/components/AIChat/hooks/useFigmaUpload.js.map +1 -0
- package/dist/admin/components/AIChat/hooks/useFigmaUpload.mjs +200 -0
- package/dist/admin/components/AIChat/hooks/useFigmaUpload.mjs.map +1 -0
- package/dist/admin/components/AIChat/hooks/useLastSeenSchemas.js +115 -0
- package/dist/admin/components/AIChat/hooks/useLastSeenSchemas.js.map +1 -0
- package/dist/admin/components/AIChat/hooks/useLastSeenSchemas.mjs +113 -0
- package/dist/admin/components/AIChat/hooks/useLastSeenSchemas.mjs.map +1 -0
- package/dist/admin/components/AIChat/hooks/useTranslations.js +19 -0
- package/dist/admin/components/AIChat/hooks/useTranslations.js.map +1 -0
- package/dist/admin/components/AIChat/hooks/useTranslations.mjs +17 -0
- package/dist/admin/components/AIChat/hooks/useTranslations.mjs.map +1 -0
- package/dist/admin/components/AIChat/lib/aiClient.js +168 -0
- package/dist/admin/components/AIChat/lib/aiClient.js.map +1 -0
- package/dist/admin/components/AIChat/lib/aiClient.mjs +161 -0
- package/dist/admin/components/AIChat/lib/aiClient.mjs.map +1 -0
- package/dist/admin/components/AIChat/lib/constants.js +16 -0
- package/dist/admin/components/AIChat/lib/constants.js.map +1 -0
- package/dist/admin/components/AIChat/lib/constants.mjs +10 -0
- package/dist/admin/components/AIChat/lib/constants.mjs.map +1 -0
- package/dist/admin/components/AIChat/lib/misc.js +8 -0
- package/dist/admin/components/AIChat/lib/misc.js.map +1 -0
- package/dist/admin/components/AIChat/lib/misc.mjs +6 -0
- package/dist/admin/components/AIChat/lib/misc.mjs.map +1 -0
- package/dist/admin/components/AIChat/lib/transforms/schemas/fromCTB.js +46 -0
- package/dist/admin/components/AIChat/lib/transforms/schemas/fromCTB.js.map +1 -0
- package/dist/admin/components/AIChat/lib/transforms/schemas/fromCTB.mjs +44 -0
- package/dist/admin/components/AIChat/lib/transforms/schemas/fromCTB.mjs.map +1 -0
- package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.js +151 -0
- package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.js.map +1 -0
- package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.mjs +148 -0
- package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.mjs.map +1 -0
- package/dist/admin/components/AIChat/providers/ChatProvider.js +191 -0
- package/dist/admin/components/AIChat/providers/ChatProvider.js.map +1 -0
- package/dist/admin/components/AIChat/providers/ChatProvider.mjs +187 -0
- package/dist/admin/components/AIChat/providers/ChatProvider.mjs.map +1 -0
- package/dist/admin/components/AIChat/providers/SchemaProvider.js +90 -0
- package/dist/admin/components/AIChat/providers/SchemaProvider.js.map +1 -0
- package/dist/admin/components/AIChat/providers/SchemaProvider.mjs +88 -0
- package/dist/admin/components/AIChat/providers/SchemaProvider.mjs.map +1 -0
- package/dist/admin/components/ComponentList.js +1 -0
- package/dist/admin/components/ComponentList.js.map +1 -1
- package/dist/admin/components/ComponentList.mjs +1 -0
- package/dist/admin/components/ComponentList.mjs.map +1 -1
- package/dist/admin/components/DataManager/DataManagerContext.js.map +1 -1
- package/dist/admin/components/DataManager/DataManagerContext.mjs.map +1 -1
- package/dist/admin/components/DataManager/reducer.js +48 -6
- package/dist/admin/components/DataManager/reducer.js.map +1 -1
- package/dist/admin/components/DataManager/reducer.mjs +48 -6
- package/dist/admin/components/DataManager/reducer.mjs.map +1 -1
- package/dist/admin/components/FormModal/utils/canEditContentType.js.map +1 -1
- package/dist/admin/components/FormModal/utils/canEditContentType.mjs.map +1 -1
- package/dist/admin/pages/App/index.js +60 -29
- package/dist/admin/pages/App/index.js.map +1 -1
- package/dist/admin/pages/App/index.mjs +62 -31
- package/dist/admin/pages/App/index.mjs.map +1 -1
- package/dist/admin/pages/ListView/EmptyState.js +75 -9
- package/dist/admin/pages/ListView/EmptyState.js.map +1 -1
- package/dist/admin/pages/ListView/EmptyState.mjs +77 -11
- package/dist/admin/pages/ListView/EmptyState.mjs.map +1 -1
- package/dist/admin/src/components/AIChat/Chat.d.ts +2 -0
- package/dist/admin/src/components/AIChat/FeedbackModal.d.ts +13 -0
- package/dist/admin/src/components/AIChat/UploadCodeModal.d.ts +12 -0
- package/dist/admin/src/components/AIChat/UploadFigmaModal.d.ts +12 -0
- package/dist/admin/src/components/AIChat/components/Alert.d.ts +6 -0
- package/dist/admin/src/components/AIChat/components/AnimatedBox.d.ts +13 -0
- package/dist/admin/src/components/AIChat/components/Attachments/AttachmentPreview.d.ts +9 -0
- package/dist/admin/src/components/AIChat/components/Attachments/components/Attachment.d.ts +27 -0
- package/dist/admin/src/components/AIChat/components/Base64Image.d.ts +9 -0
- package/dist/admin/src/components/AIChat/components/Collapsible.d.ts +18 -0
- package/dist/admin/src/components/AIChat/components/Dropzone.d.ts +35 -0
- package/dist/admin/src/components/AIChat/components/FloatingPanel.d.ts +34 -0
- package/dist/admin/src/components/AIChat/components/FullScreenImage.d.ts +20 -0
- package/dist/admin/src/components/AIChat/components/ImagePreview.d.ts +8 -0
- package/dist/admin/src/components/AIChat/components/ImagePreviewGroup.d.ts +7 -0
- package/dist/admin/src/components/AIChat/components/Input.d.ts +43 -0
- package/dist/admin/src/components/AIChat/components/Messages/Marker.d.ts +2 -0
- package/dist/admin/src/components/AIChat/components/Messages/Message.d.ts +5 -0
- package/dist/admin/src/components/AIChat/components/ResizableTextArea.d.ts +9 -0
- package/dist/admin/src/components/AIChat/components/SimpleMenu.d.ts +32 -0
- package/dist/admin/src/components/AIChat/components/StepModal.d.ts +37 -0
- package/dist/admin/src/components/AIChat/components/animations.d.ts +8 -0
- package/dist/admin/src/components/AIChat/components/icons/FigmaIcon.d.ts +5 -0
- package/dist/admin/src/components/AIChat/components/icons/StopIcon.d.ts +5 -0
- package/dist/admin/src/components/AIChat/hooks/useAIFetch.d.ts +147 -0
- package/dist/admin/src/components/AIChat/hooks/useAttachments.d.ts +8 -0
- package/dist/admin/src/components/AIChat/hooks/useChatTitle.d.ts +13 -0
- package/dist/admin/src/components/AIChat/hooks/useCodeUpload.d.ts +31 -0
- package/dist/admin/src/components/AIChat/hooks/useFeedback.d.ts +7 -0
- package/dist/admin/src/components/AIChat/hooks/useFigmaUpload.d.ts +61 -0
- package/dist/admin/src/components/AIChat/hooks/useLastSeenSchemas.d.ts +10 -0
- package/dist/admin/src/components/AIChat/hooks/useTranslations.d.ts +3 -0
- package/dist/admin/src/components/AIChat/lib/aiClient.d.ts +32 -0
- package/dist/admin/src/components/AIChat/lib/constants.d.ts +12 -0
- package/dist/admin/src/components/AIChat/lib/fileToAttachment.d.ts +2 -0
- package/dist/admin/src/components/AIChat/lib/misc.d.ts +1 -0
- package/dist/admin/src/components/AIChat/lib/transforms/schemas/fromCTB.d.ts +3 -0
- package/dist/admin/src/components/AIChat/lib/transforms/schemas/toCTB.d.ts +16 -0
- package/dist/admin/src/components/AIChat/lib/types/annotations.d.ts +19 -0
- package/dist/admin/src/components/AIChat/lib/types/attachments.d.ts +15 -0
- package/dist/admin/src/components/AIChat/lib/types/feedback.d.ts +1 -0
- package/dist/admin/src/components/AIChat/lib/types/messages.d.ts +26 -0
- package/dist/admin/src/components/AIChat/lib/types/schema.d.ts +20 -0
- package/dist/admin/src/components/AIChat/providers/ChatProvider.d.ts +30 -0
- package/dist/admin/src/components/AIChat/providers/SchemaProvider.d.ts +10 -0
- package/dist/admin/src/components/ComponentList.d.ts +1 -1
- package/dist/admin/src/components/DataManager/DataManagerContext.d.ts +1 -1
- package/dist/admin/translations/ar.json.js +187 -2
- package/dist/admin/translations/ar.json.js.map +1 -1
- package/dist/admin/translations/ar.json.mjs +187 -3
- package/dist/admin/translations/ar.json.mjs.map +1 -1
- package/dist/admin/translations/de.json.js +42 -7
- package/dist/admin/translations/de.json.js.map +1 -1
- package/dist/admin/translations/de.json.mjs +42 -7
- package/dist/admin/translations/de.json.mjs.map +1 -1
- package/dist/admin/translations/en.json.js +53 -2
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +53 -2
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/admin/translations/es.json.js +37 -15
- package/dist/admin/translations/es.json.js.map +1 -1
- package/dist/admin/translations/es.json.mjs +37 -15
- package/dist/admin/translations/es.json.mjs.map +1 -1
- package/dist/admin/translations/fr.json.js +165 -3
- package/dist/admin/translations/fr.json.js.map +1 -1
- package/dist/admin/translations/fr.json.mjs +165 -4
- package/dist/admin/translations/fr.json.mjs.map +1 -1
- package/dist/admin/translations/id.json.js +93 -23
- package/dist/admin/translations/id.json.js.map +1 -1
- package/dist/admin/translations/id.json.mjs +93 -23
- package/dist/admin/translations/id.json.mjs.map +1 -1
- package/dist/admin/translations/it.json.js +75 -6
- package/dist/admin/translations/it.json.js.map +1 -1
- package/dist/admin/translations/it.json.mjs +75 -6
- package/dist/admin/translations/it.json.mjs.map +1 -1
- package/dist/admin/translations/ja.json.js +191 -5
- package/dist/admin/translations/ja.json.js.map +1 -1
- package/dist/admin/translations/ja.json.mjs +191 -6
- package/dist/admin/translations/ja.json.mjs.map +1 -1
- package/dist/admin/translations/ko.json.js +70 -16
- package/dist/admin/translations/ko.json.js.map +1 -1
- package/dist/admin/translations/ko.json.mjs +70 -16
- package/dist/admin/translations/ko.json.mjs.map +1 -1
- package/dist/admin/translations/ms.json.js +104 -31
- package/dist/admin/translations/ms.json.js.map +1 -1
- package/dist/admin/translations/ms.json.mjs +104 -31
- package/dist/admin/translations/ms.json.mjs.map +1 -1
- package/dist/admin/translations/nl.json.js +95 -15
- package/dist/admin/translations/nl.json.js.map +1 -1
- package/dist/admin/translations/nl.json.mjs +95 -15
- package/dist/admin/translations/nl.json.mjs.map +1 -1
- package/dist/admin/translations/pl.json.js +55 -11
- package/dist/admin/translations/pl.json.js.map +1 -1
- package/dist/admin/translations/pl.json.mjs +55 -11
- package/dist/admin/translations/pl.json.mjs.map +1 -1
- package/dist/admin/translations/pt-BR.json.js +54 -10
- package/dist/admin/translations/pt-BR.json.js.map +1 -1
- package/dist/admin/translations/pt-BR.json.mjs +54 -10
- package/dist/admin/translations/pt-BR.json.mjs.map +1 -1
- package/dist/admin/translations/pt.json.js +187 -2
- package/dist/admin/translations/pt.json.js.map +1 -1
- package/dist/admin/translations/pt.json.mjs +187 -3
- package/dist/admin/translations/pt.json.mjs.map +1 -1
- package/dist/admin/translations/ru.json.js +26 -1
- package/dist/admin/translations/ru.json.js.map +1 -1
- package/dist/admin/translations/ru.json.mjs +26 -1
- package/dist/admin/translations/ru.json.mjs.map +1 -1
- package/dist/admin/translations/sk.json.js +21 -1
- package/dist/admin/translations/sk.json.js.map +1 -1
- package/dist/admin/translations/sk.json.mjs +21 -1
- package/dist/admin/translations/sk.json.mjs.map +1 -1
- package/dist/admin/translations/sv.json.js +21 -1
- package/dist/admin/translations/sv.json.js.map +1 -1
- package/dist/admin/translations/sv.json.mjs +21 -1
- package/dist/admin/translations/sv.json.mjs.map +1 -1
- package/dist/admin/translations/th.json.js +21 -1
- package/dist/admin/translations/th.json.js.map +1 -1
- package/dist/admin/translations/th.json.mjs +21 -1
- package/dist/admin/translations/th.json.mjs.map +1 -1
- package/dist/admin/translations/tr.json.js +21 -1
- package/dist/admin/translations/tr.json.js.map +1 -1
- package/dist/admin/translations/tr.json.mjs +21 -1
- package/dist/admin/translations/tr.json.mjs.map +1 -1
- package/dist/admin/translations/uk.json.js +21 -2
- package/dist/admin/translations/uk.json.js.map +1 -1
- package/dist/admin/translations/uk.json.mjs +21 -2
- package/dist/admin/translations/uk.json.mjs.map +1 -1
- package/dist/admin/translations/zh-Hans.json.js +222 -133
- package/dist/admin/translations/zh-Hans.json.js.map +1 -1
- package/dist/admin/translations/zh-Hans.json.mjs +222 -133
- package/dist/admin/translations/zh-Hans.json.mjs.map +1 -1
- package/dist/admin/translations/zh.json.js +21 -1
- package/dist/admin/translations/zh.json.js.map +1 -1
- package/dist/admin/translations/zh.json.mjs +21 -1
- package/dist/admin/translations/zh.json.mjs.map +1 -1
- package/dist/server/index.js +2 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +2 -0
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/register.js +98 -0
- package/dist/server/register.js.map +1 -0
- package/dist/server/register.mjs +96 -0
- package/dist/server/register.mjs.map +1 -0
- package/dist/server/src/controllers/ai/auth.d.ts +1 -0
- package/dist/server/src/controllers/ai/auth.d.ts.map +1 -0
- package/dist/server/src/controllers/ai/index.d.ts +1 -0
- package/dist/server/src/controllers/ai/index.d.ts.map +1 -0
- package/dist/server/src/index.d.ts +1 -0
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/register.d.ts +11 -0
- package/dist/server/src/register.d.ts.map +1 -0
- package/package.json +12 -5
- package/dist/admin/components/DataManager/utils/formatSchemas.js +0 -21
- package/dist/admin/components/DataManager/utils/formatSchemas.js.map +0 -1
- package/dist/admin/components/DataManager/utils/formatSchemas.mjs +0 -18
- package/dist/admin/components/DataManager/utils/formatSchemas.mjs.map +0 -1
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useState, useMemo, useEffect, useContext, createContext } from 'react';
|
|
3
|
+
import { useTracking } from '@strapi/admin/strapi-admin';
|
|
4
|
+
import { useAIAvailability } from '@strapi/admin/strapi-admin/ee';
|
|
5
|
+
import { useDataManager } from '../../DataManager/useDataManager.mjs';
|
|
6
|
+
import { FeedbackProvider } from '../FeedbackModal.mjs';
|
|
7
|
+
import { useAIChat } from '../hooks/useAIFetch.mjs';
|
|
8
|
+
import { useChatTitle } from '../hooks/useChatTitle.mjs';
|
|
9
|
+
import { useLastSeenSchemas } from '../hooks/useLastSeenSchemas.mjs';
|
|
10
|
+
import { transformCTBToChat } from '../lib/transforms/schemas/fromCTB.mjs';
|
|
11
|
+
import { UploadProjectToChatProvider } from '../UploadCodeModal.mjs';
|
|
12
|
+
import { UploadFigmaToChatProvider } from '../UploadFigmaModal.mjs';
|
|
13
|
+
import { SchemaChatProvider } from './SchemaProvider.mjs';
|
|
14
|
+
|
|
15
|
+
const ChatContext = /*#__PURE__*/ createContext(undefined);
|
|
16
|
+
const generateRandomId = ()=>{
|
|
17
|
+
return Math.random().toString(36).substring(2, 15);
|
|
18
|
+
};
|
|
19
|
+
const BaseChatProvider = ({ children, defaultOpen = false })=>{
|
|
20
|
+
const [chatId, setChatId] = useState(generateRandomId());
|
|
21
|
+
const [isChatOpen, setIsChatOpen] = useState(defaultOpen);
|
|
22
|
+
const [openCount, setOpenCount] = useState(0);
|
|
23
|
+
const [input, setInput] = useState('');
|
|
24
|
+
// Files
|
|
25
|
+
const [attachments, setAttachments] = useState([]);
|
|
26
|
+
const { trackUsage } = useTracking();
|
|
27
|
+
// DataManager
|
|
28
|
+
const { components, contentTypes } = useDataManager();
|
|
29
|
+
// Last user seen schemas
|
|
30
|
+
const { lastSeenSchemas } = useLastSeenSchemas();
|
|
31
|
+
// Schemas to be sent to the chat
|
|
32
|
+
const schemas = useMemo(()=>{
|
|
33
|
+
return [
|
|
34
|
+
...Object.values(contentTypes).filter((schema)=>schema.status !== 'REMOVED')// Probably we should still keep this one, not sure
|
|
35
|
+
.filter((schema)=>schema.uid !== 'plugin::users-permissions.user').filter((schema)=>schema.visible).map(transformCTBToChat),
|
|
36
|
+
...Object.values(components).filter((schema)=>schema.status !== 'REMOVED').map(transformCTBToChat)
|
|
37
|
+
];
|
|
38
|
+
}, [
|
|
39
|
+
contentTypes,
|
|
40
|
+
components
|
|
41
|
+
]);
|
|
42
|
+
const { id, messages, sendMessage: _sendMessage, status, stop, ...chat } = useAIChat({
|
|
43
|
+
id: chatId?.toString(),
|
|
44
|
+
experimental_throttle: 100
|
|
45
|
+
});
|
|
46
|
+
/* -------------------------------------------------------------------------------------------------
|
|
47
|
+
* AI SDK chat overrides
|
|
48
|
+
* -----------------------------------------------------------------------------------------------*/ // NOTE: body is using state variables, so they can not be passed as a prop in useChat
|
|
49
|
+
const sendMessage = async (message, options)=>{
|
|
50
|
+
if (status === 'streaming' || status === 'submitted') {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
return _sendMessage(message, {
|
|
54
|
+
...options,
|
|
55
|
+
body: {
|
|
56
|
+
...options?.body,
|
|
57
|
+
schemas,
|
|
58
|
+
metadata: {
|
|
59
|
+
lastSeenSchemas: lastSeenSchemas.map((schema)=>schema.uid)
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
};
|
|
64
|
+
const handleSubmit = (e)=>{
|
|
65
|
+
e.preventDefault();
|
|
66
|
+
if (status === 'streaming' || status === 'submitted') {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const readyAttachments = attachments.filter((a)=>a.status !== 'loading');
|
|
70
|
+
if (input.trim().length === 0 && attachments.length === 0) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const files = readyAttachments.map((attachment)=>({
|
|
74
|
+
type: 'file',
|
|
75
|
+
filename: attachment.filename,
|
|
76
|
+
mediaType: attachment.mediaType,
|
|
77
|
+
url: attachment.url
|
|
78
|
+
}));
|
|
79
|
+
sendMessage({
|
|
80
|
+
text: input,
|
|
81
|
+
files
|
|
82
|
+
});
|
|
83
|
+
setInput('');
|
|
84
|
+
setAttachments([]);
|
|
85
|
+
};
|
|
86
|
+
/* -------------------------------------------------------------------------------------------------
|
|
87
|
+
* Chat title
|
|
88
|
+
* -----------------------------------------------------------------------------------------------*/ const { title, generateTitle, resetTitle } = useChatTitle({
|
|
89
|
+
chatId: id,
|
|
90
|
+
messages
|
|
91
|
+
});
|
|
92
|
+
// Automatically generate title when we have at least 1 message (user query)
|
|
93
|
+
useEffect(()=>{
|
|
94
|
+
if (messages.length >= 1 && !title) {
|
|
95
|
+
generateTitle();
|
|
96
|
+
}
|
|
97
|
+
}, [
|
|
98
|
+
messages.length,
|
|
99
|
+
title,
|
|
100
|
+
generateTitle
|
|
101
|
+
]);
|
|
102
|
+
useEffect(()=>{
|
|
103
|
+
if (status === 'error') {
|
|
104
|
+
trackUsage('didAnswerMessage', {
|
|
105
|
+
successful: false
|
|
106
|
+
});
|
|
107
|
+
} else if (status === 'ready' && messages.length > 0 && messages[messages.length - 1]?.role === 'assistant') {
|
|
108
|
+
trackUsage('didAnswerMessage', {
|
|
109
|
+
successful: true
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
}, [
|
|
113
|
+
status,
|
|
114
|
+
messages,
|
|
115
|
+
trackUsage
|
|
116
|
+
]);
|
|
117
|
+
const isChatAvailable = useAIAvailability();
|
|
118
|
+
return /*#__PURE__*/ jsx(ChatContext.Provider, {
|
|
119
|
+
value: {
|
|
120
|
+
isChatEnabled: isChatAvailable,
|
|
121
|
+
id,
|
|
122
|
+
status,
|
|
123
|
+
stop,
|
|
124
|
+
sendMessage,
|
|
125
|
+
...chat,
|
|
126
|
+
messages,
|
|
127
|
+
handleSubmit,
|
|
128
|
+
input,
|
|
129
|
+
setInput,
|
|
130
|
+
handleInputChange: (e)=>setInput(e.target.value),
|
|
131
|
+
reset: ()=>{
|
|
132
|
+
stop();
|
|
133
|
+
setChatId(generateRandomId());
|
|
134
|
+
trackUsage('didStartNewChat');
|
|
135
|
+
resetTitle();
|
|
136
|
+
},
|
|
137
|
+
schemas,
|
|
138
|
+
// Chat
|
|
139
|
+
title,
|
|
140
|
+
isChatOpen,
|
|
141
|
+
openChat: ()=>{
|
|
142
|
+
setIsChatOpen(true);
|
|
143
|
+
// if this is the first open, it's a new chat
|
|
144
|
+
if (openCount === 0) {
|
|
145
|
+
trackUsage('didStartNewChat');
|
|
146
|
+
}
|
|
147
|
+
setOpenCount((prev)=>prev + 1);
|
|
148
|
+
},
|
|
149
|
+
closeChat: ()=>setIsChatOpen(false),
|
|
150
|
+
// Attachments
|
|
151
|
+
attachments,
|
|
152
|
+
setAttachments
|
|
153
|
+
},
|
|
154
|
+
children: children
|
|
155
|
+
});
|
|
156
|
+
};
|
|
157
|
+
const ChatProvider = ({ children, defaultOpen = false })=>{
|
|
158
|
+
return /*#__PURE__*/ jsx(BaseChatProvider, {
|
|
159
|
+
defaultOpen: defaultOpen,
|
|
160
|
+
children: /*#__PURE__*/ jsx(SchemaChatProvider, {
|
|
161
|
+
children: /*#__PURE__*/ jsx(UploadProjectToChatProvider, {
|
|
162
|
+
children: /*#__PURE__*/ jsx(UploadFigmaToChatProvider, {
|
|
163
|
+
children: /*#__PURE__*/ jsx(FeedbackProvider, {
|
|
164
|
+
children: children
|
|
165
|
+
})
|
|
166
|
+
})
|
|
167
|
+
})
|
|
168
|
+
})
|
|
169
|
+
});
|
|
170
|
+
};
|
|
171
|
+
function useStrapiChat() {
|
|
172
|
+
const context = useContext(ChatContext);
|
|
173
|
+
if (process.env.NODE_ENV === 'development') {
|
|
174
|
+
// In development, provide a fallback to prevent crashes during hot reloading
|
|
175
|
+
// This allows the app to continue working during HMR updates
|
|
176
|
+
if (context === undefined) {
|
|
177
|
+
console.warn('useStrapiChat was called outside of ChatProvider. This is only allowed in development mode.');
|
|
178
|
+
return {};
|
|
179
|
+
}
|
|
180
|
+
} else if (context === undefined) {
|
|
181
|
+
throw new Error('useStrapiChat must be used within a ChatProvider');
|
|
182
|
+
}
|
|
183
|
+
return context;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
export { BaseChatProvider, ChatProvider, useStrapiChat };
|
|
187
|
+
//# sourceMappingURL=ChatProvider.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatProvider.mjs","sources":["../../../../../admin/src/components/AIChat/providers/ChatProvider.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n createContext,\n useContext,\n useMemo,\n useState,\n useEffect,\n type ReactNode,\n type ChangeEvent,\n} from 'react';\n\nimport { UIMessage, useChat } from '@ai-sdk/react';\nimport { useTracking } from '@strapi/admin/strapi-admin';\nimport { useAIAvailability } from '@strapi/admin/strapi-admin/ee';\n\nimport { useDataManager } from '../../DataManager/useDataManager';\nimport { FeedbackProvider } from '../FeedbackModal';\nimport { useAIChat } from '../hooks/useAIFetch';\nimport { useChatTitle } from '../hooks/useChatTitle';\nimport { useLastSeenSchemas } from '../hooks/useLastSeenSchemas';\nimport { transformCTBToChat } from '../lib/transforms/schemas/fromCTB';\nimport { Attachment } from '../lib/types/attachments';\nimport { Schema } from '../lib/types/schema';\nimport { UploadProjectToChatProvider } from '../UploadCodeModal';\nimport { UploadFigmaToChatProvider } from '../UploadFigmaModal';\n\nimport { SchemaChatProvider } from './SchemaProvider';\n\ninterface ChatContextType extends Omit<ReturnType<typeof useChat>, 'messages'> {\n isChatEnabled: boolean;\n title?: string;\n messages: UIMessage[];\n handleSubmit: (event: any) => void;\n input: string;\n setInput: React.Dispatch<React.SetStateAction<string>>;\n handleInputChange: (e: ChangeEvent<HTMLInputElement> | ChangeEvent<HTMLTextAreaElement>) => void;\n reset: () => void;\n schemas: Schema[];\n // Chat window\n isChatOpen: boolean;\n openChat: () => void;\n closeChat: () => void;\n // Attachments\n attachments: Attachment[];\n setAttachments: React.Dispatch<React.SetStateAction<Attachment[]>>;\n}\n\nconst ChatContext = createContext<ChatContextType | undefined>(undefined);\n\nconst generateRandomId = () => {\n return Math.random().toString(36).substring(2, 15);\n};\n\nexport const BaseChatProvider = ({\n children,\n defaultOpen = false,\n}: {\n children: ReactNode;\n defaultOpen?: boolean;\n}) => {\n const [chatId, setChatId] = useState<string | undefined>(generateRandomId());\n const [isChatOpen, setIsChatOpen] = useState(defaultOpen);\n const [openCount, setOpenCount] = useState(0);\n const [input, setInput] = useState('');\n\n // Files\n const [attachments, setAttachments] = useState<Attachment[]>([]);\n\n const { trackUsage } = useTracking();\n\n // DataManager\n const { components, contentTypes } = useDataManager();\n\n // Last user seen schemas\n const { lastSeenSchemas } = useLastSeenSchemas();\n\n // Schemas to be sent to the chat\n const schemas = useMemo(() => {\n return [\n ...Object.values(contentTypes)\n .filter((schema) => schema.status !== 'REMOVED')\n // Probably we should still keep this one, not sure\n .filter((schema) => schema.uid !== 'plugin::users-permissions.user')\n .filter((schema) => schema.visible)\n .map(transformCTBToChat as any),\n ...Object.values(components)\n .filter((schema) => schema.status !== 'REMOVED')\n .map(transformCTBToChat as any),\n ] as Schema[];\n }, [contentTypes, components]);\n\n const {\n id,\n messages,\n sendMessage: _sendMessage,\n status,\n stop,\n ...chat\n } = useAIChat({\n id: chatId?.toString(),\n experimental_throttle: 100,\n });\n\n /* -------------------------------------------------------------------------------------------------\n * AI SDK chat overrides\n * -----------------------------------------------------------------------------------------------*/\n\n // NOTE: body is using state variables, so they can not be passed as a prop in useChat\n const sendMessage: typeof _sendMessage = async (message, options) => {\n if (status === 'streaming' || status === 'submitted') {\n return;\n }\n\n return _sendMessage(message, {\n ...options,\n body: {\n ...options?.body,\n schemas,\n metadata: {\n lastSeenSchemas: lastSeenSchemas.map((schema) => schema.uid),\n },\n },\n });\n };\n\n const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n\n if (status === 'streaming' || status === 'submitted') {\n return;\n }\n\n const readyAttachments = attachments.filter((a) => a.status !== 'loading');\n if (input.trim().length === 0 && attachments.length === 0) {\n return;\n }\n\n const files = readyAttachments.map(\n (attachment) =>\n ({\n type: 'file',\n filename: attachment.filename,\n mediaType: attachment.mediaType,\n url: attachment.url,\n }) as const\n );\n sendMessage({ text: input, files });\n setInput('');\n setAttachments([]);\n };\n\n /* -------------------------------------------------------------------------------------------------\n * Chat title\n * -----------------------------------------------------------------------------------------------*/\n const { title, generateTitle, resetTitle } = useChatTitle({ chatId: id, messages });\n\n // Automatically generate title when we have at least 1 message (user query)\n useEffect(() => {\n if (messages.length >= 1 && !title) {\n generateTitle();\n }\n }, [messages.length, title, generateTitle]);\n\n useEffect(() => {\n if (status === 'error') {\n trackUsage('didAnswerMessage', {\n successful: false,\n });\n } else if (\n status === 'ready' &&\n messages.length > 0 &&\n messages[messages.length - 1]?.role === 'assistant'\n ) {\n trackUsage('didAnswerMessage', {\n successful: true,\n });\n }\n }, [status, messages, trackUsage]);\n\n const isChatAvailable = useAIAvailability();\n\n return (\n <ChatContext.Provider\n value={{\n isChatEnabled: isChatAvailable,\n id,\n status,\n stop,\n sendMessage,\n ...chat,\n messages,\n handleSubmit,\n input,\n setInput,\n handleInputChange: (e) => setInput(e.target.value),\n reset: () => {\n stop();\n setChatId(generateRandomId());\n trackUsage('didStartNewChat');\n resetTitle();\n },\n schemas,\n // Chat\n title,\n isChatOpen,\n openChat: () => {\n setIsChatOpen(true);\n // if this is the first open, it's a new chat\n if (openCount === 0) {\n trackUsage('didStartNewChat');\n }\n setOpenCount((prev) => prev + 1);\n },\n closeChat: () => setIsChatOpen(false),\n // Attachments\n attachments,\n setAttachments,\n }}\n >\n {children}\n </ChatContext.Provider>\n );\n};\n\nexport const ChatProvider = ({\n children,\n defaultOpen = false,\n}: {\n children: React.ReactNode;\n defaultOpen?: boolean;\n}) => {\n return (\n <BaseChatProvider defaultOpen={defaultOpen}>\n <SchemaChatProvider>\n <UploadProjectToChatProvider>\n <UploadFigmaToChatProvider>\n <FeedbackProvider>{children}</FeedbackProvider>\n </UploadFigmaToChatProvider>\n </UploadProjectToChatProvider>\n </SchemaChatProvider>\n </BaseChatProvider>\n );\n};\n\nexport function useStrapiChat() {\n const context = useContext(ChatContext);\n\n if (process.env.NODE_ENV === 'development') {\n // In development, provide a fallback to prevent crashes during hot reloading\n // This allows the app to continue working during HMR updates\n if (context === undefined) {\n console.warn(\n 'useStrapiChat was called outside of ChatProvider. This is only allowed in development mode.'\n );\n return {} as ChatContextType;\n }\n } else if (context === undefined) {\n throw new Error('useStrapiChat must be used within a ChatProvider');\n }\n return context;\n}\n"],"names":["ChatContext","createContext","undefined","generateRandomId","Math","random","toString","substring","BaseChatProvider","children","defaultOpen","chatId","setChatId","useState","isChatOpen","setIsChatOpen","openCount","setOpenCount","input","setInput","attachments","setAttachments","trackUsage","useTracking","components","contentTypes","useDataManager","lastSeenSchemas","useLastSeenSchemas","schemas","useMemo","Object","values","filter","schema","status","uid","visible","map","transformCTBToChat","id","messages","sendMessage","_sendMessage","stop","chat","useAIChat","experimental_throttle","message","options","body","metadata","handleSubmit","e","preventDefault","readyAttachments","a","trim","length","files","attachment","type","filename","mediaType","url","text","title","generateTitle","resetTitle","useChatTitle","useEffect","successful","role","isChatAvailable","useAIAvailability","_jsx","Provider","value","isChatEnabled","handleInputChange","target","reset","openChat","prev","closeChat","ChatProvider","SchemaChatProvider","UploadProjectToChatProvider","UploadFigmaToChatProvider","FeedbackProvider","useStrapiChat","context","useContext","process","env","NODE_ENV","console","warn","Error"],"mappings":"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"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
var strapiAdmin = require('@strapi/admin/strapi-admin');
|
|
6
|
+
var useDataManager = require('../../DataManager/useDataManager.js');
|
|
7
|
+
var toCTB = require('../lib/transforms/schemas/toCTB.js');
|
|
8
|
+
var ChatProvider = require('./ChatProvider.js');
|
|
9
|
+
|
|
10
|
+
const SchemaContext = /*#__PURE__*/ React.createContext(undefined);
|
|
11
|
+
const TYPE_TO_ACTION = {
|
|
12
|
+
create: 'add',
|
|
13
|
+
update: 'update',
|
|
14
|
+
remove: 'delete'
|
|
15
|
+
};
|
|
16
|
+
function extractSchemaChangesFromMessage(message) {
|
|
17
|
+
if (message.role !== 'assistant') return [];
|
|
18
|
+
const changes = [];
|
|
19
|
+
message.parts?.forEach((part, partIndex)=>{
|
|
20
|
+
// We only care about the schema generation tool
|
|
21
|
+
if (part && typeof part === 'object' && part.type === 'tool-schemaGenerationTool') {
|
|
22
|
+
// Prefer validated schemas from output; ignore if there's an error or no output yet
|
|
23
|
+
const output = part.output;
|
|
24
|
+
if (!output || output.error || !Array.isArray(output.schemas)) return;
|
|
25
|
+
const baseId = part.toolCallId ?? `${message.id}-${partIndex}`;
|
|
26
|
+
output.schemas.forEach((schema, schemaIndex)=>{
|
|
27
|
+
const revisionId = `${baseId}-${schema.uid ?? schema.name ?? schemaIndex}`;
|
|
28
|
+
const type = schema.action || 'update';
|
|
29
|
+
changes.push({
|
|
30
|
+
type,
|
|
31
|
+
schema,
|
|
32
|
+
revisionId
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
return changes;
|
|
38
|
+
}
|
|
39
|
+
const SchemaChatProvider = ({ children })=>{
|
|
40
|
+
const [lastRevisedId, setLastRevisedId] = React.useState(null);
|
|
41
|
+
const { messages, status } = ChatProvider.useStrapiChat();
|
|
42
|
+
const { contentTypes, components, applyChange } = useDataManager.useDataManager();
|
|
43
|
+
const dispatch = strapiAdmin.useGuidedTour('SchemaChatProvider', (s)=>s.dispatch);
|
|
44
|
+
const state = strapiAdmin.useGuidedTour('SchemaChatProvider', (s)=>s.state);
|
|
45
|
+
React.useEffect(()=>{
|
|
46
|
+
const latestMessage = messages[messages.length - 1];
|
|
47
|
+
if (!latestMessage) return;
|
|
48
|
+
if (latestMessage.role !== 'assistant') return;
|
|
49
|
+
// Wait until message streaming has finished
|
|
50
|
+
if (status !== 'ready') return;
|
|
51
|
+
// const schemaChanges = latestMessage.schemaChanges;
|
|
52
|
+
const schemaChanges = extractSchemaChangesFromMessage(latestMessage);
|
|
53
|
+
// Check if addField action is already completed
|
|
54
|
+
const isAddFieldCompleted = state.completedActions.includes(strapiAdmin.GUIDED_TOUR_REQUIRED_ACTIONS.contentTypeBuilder.addField);
|
|
55
|
+
schemaChanges.forEach((change)=>{
|
|
56
|
+
const oldSchema = contentTypes[change.schema.uid] || components[change.schema.uid];
|
|
57
|
+
const newSchema = toCTB.transformChatToCTB(change.schema, oldSchema);
|
|
58
|
+
// Check if any attributes/fields are being added to any schema (existing or new)
|
|
59
|
+
if (!isAddFieldCompleted && change.schema.attributes) {
|
|
60
|
+
// If a field is being added or updated, dispatch guided tour action to show Save tooltip
|
|
61
|
+
if (change.type !== 'remove' && Object.keys(change.schema.attributes).length > 0) {
|
|
62
|
+
dispatch({
|
|
63
|
+
type: 'set_completed_actions',
|
|
64
|
+
payload: [
|
|
65
|
+
strapiAdmin.GUIDED_TOUR_REQUIRED_ACTIONS.contentTypeBuilder.addField
|
|
66
|
+
]
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
applyChange({
|
|
71
|
+
action: TYPE_TO_ACTION[change.type],
|
|
72
|
+
schema: newSchema
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
setLastRevisedId(latestMessage.id);
|
|
76
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
77
|
+
}, [
|
|
78
|
+
messages
|
|
79
|
+
]);
|
|
80
|
+
return /*#__PURE__*/ jsxRuntime.jsx(SchemaContext.Provider, {
|
|
81
|
+
value: {
|
|
82
|
+
lastRevisedId,
|
|
83
|
+
setLastRevisedId
|
|
84
|
+
},
|
|
85
|
+
children: children
|
|
86
|
+
});
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
exports.SchemaChatProvider = SchemaChatProvider;
|
|
90
|
+
//# sourceMappingURL=SchemaProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SchemaProvider.js","sources":["../../../../../admin/src/components/AIChat/providers/SchemaProvider.tsx"],"sourcesContent":["import { createContext, useContext, ReactNode, useEffect, useState } from 'react';\n\nimport { GUIDED_TOUR_REQUIRED_ACTIONS, useGuidedTour } from '@strapi/admin/strapi-admin';\n\nimport { useDataManager } from '../../DataManager/useDataManager';\nimport { transformChatToCTB } from '../lib/transforms/schemas/toCTB';\nimport { SchemaChange } from '../lib/types/annotations';\nimport { AIMessage } from '../lib/types/messages';\n\nimport { useStrapiChat } from './ChatProvider';\n\ninterface SchemaContextType {\n lastRevisedId: string | null;\n setLastRevisedId: (id: string | null) => void;\n}\n\nconst SchemaContext = createContext<SchemaContextType | undefined>(undefined);\n\nconst TYPE_TO_ACTION: Record<string, 'add' | 'update' | 'delete'> = {\n create: 'add',\n update: 'update',\n remove: 'delete',\n};\n\nfunction extractSchemaChangesFromMessage(message: AIMessage): SchemaChange[] {\n if (message.role !== 'assistant') return [];\n\n const changes: SchemaChange[] = [];\n\n message.parts?.forEach((part, partIndex) => {\n // We only care about the schema generation tool\n if (part && typeof part === 'object' && part.type === 'tool-schemaGenerationTool') {\n // Prefer validated schemas from output; ignore if there's an error or no output yet\n const output = part.output as { schemas?: any[]; error?: unknown } | undefined;\n if (!output || output.error || !Array.isArray(output.schemas)) return;\n\n const baseId = part.toolCallId ?? `${message.id}-${partIndex}`;\n\n output.schemas.forEach((schema, schemaIndex) => {\n const revisionId = `${baseId}-${schema.uid ?? schema.name ?? schemaIndex}`;\n const type = (schema.action as SchemaChange['type']) || 'update';\n changes.push({ type, schema, revisionId });\n });\n }\n });\n\n return changes;\n}\n\nexport const SchemaChatProvider = ({ children }: { children: ReactNode }) => {\n const [lastRevisedId, setLastRevisedId] = useState<string | null>(null);\n const { messages, status } = useStrapiChat();\n const { contentTypes, components, applyChange } = useDataManager();\n const dispatch = useGuidedTour('SchemaChatProvider', (s) => s.dispatch);\n const state = useGuidedTour('SchemaChatProvider', (s) => s.state);\n\n useEffect(() => {\n const latestMessage = messages[messages.length - 1];\n if (!latestMessage) return;\n if (latestMessage.role !== 'assistant') return;\n // Wait until message streaming has finished\n if (status !== 'ready') return;\n\n // const schemaChanges = latestMessage.schemaChanges;\n const schemaChanges = extractSchemaChangesFromMessage(latestMessage);\n\n // Check if addField action is already completed\n const isAddFieldCompleted = state.completedActions.includes(\n GUIDED_TOUR_REQUIRED_ACTIONS.contentTypeBuilder.addField\n );\n\n schemaChanges.forEach((change: SchemaChange) => {\n const oldSchema =\n contentTypes[change.schema.uid as any] || components[change.schema.uid as any];\n const newSchema = transformChatToCTB(change.schema, oldSchema);\n\n // Check if any attributes/fields are being added to any schema (existing or new)\n if (!isAddFieldCompleted && change.schema.attributes) {\n // If a field is being added or updated, dispatch guided tour action to show Save tooltip\n if (change.type !== 'remove' && Object.keys(change.schema.attributes).length > 0) {\n dispatch({\n type: 'set_completed_actions',\n payload: [GUIDED_TOUR_REQUIRED_ACTIONS.contentTypeBuilder.addField],\n });\n }\n }\n\n applyChange({\n action: TYPE_TO_ACTION[change.type]!,\n schema: newSchema,\n });\n });\n setLastRevisedId(latestMessage.id);\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [messages]);\n\n return (\n <SchemaContext.Provider value={{ lastRevisedId, setLastRevisedId }}>\n {children}\n </SchemaContext.Provider>\n );\n};\n\nexport const useChatSchema = () => {\n const context = useContext(SchemaContext);\n if (context === undefined) {\n throw new Error('useSchema must be used within a SchemaProvider');\n }\n return context;\n};\n"],"names":["SchemaContext","createContext","undefined","TYPE_TO_ACTION","create","update","remove","extractSchemaChangesFromMessage","message","role","changes","parts","forEach","part","partIndex","type","output","error","Array","isArray","schemas","baseId","toolCallId","id","schema","schemaIndex","revisionId","uid","name","action","push","SchemaChatProvider","children","lastRevisedId","setLastRevisedId","useState","messages","status","useStrapiChat","contentTypes","components","applyChange","useDataManager","dispatch","useGuidedTour","s","state","useEffect","latestMessage","length","schemaChanges","isAddFieldCompleted","completedActions","includes","GUIDED_TOUR_REQUIRED_ACTIONS","contentTypeBuilder","addField","change","oldSchema","newSchema","transformChatToCTB","attributes","Object","keys","payload","_jsx","Provider","value"],"mappings":";;;;;;;;;AAgBA,MAAMA,8BAAgBC,mBAA6CC,CAAAA,SAAAA,CAAAA;AAEnE,MAAMC,cAA8D,GAAA;IAClEC,MAAQ,EAAA,KAAA;IACRC,MAAQ,EAAA,QAAA;IACRC,MAAQ,EAAA;AACV,CAAA;AAEA,SAASC,gCAAgCC,OAAkB,EAAA;AACzD,IAAA,IAAIA,OAAQC,CAAAA,IAAI,KAAK,WAAA,EAAa,OAAO,EAAE;AAE3C,IAAA,MAAMC,UAA0B,EAAE;AAElCF,IAAAA,OAAAA,CAAQG,KAAK,EAAEC,OAAQ,CAAA,CAACC,IAAMC,EAAAA,SAAAA,GAAAA;;AAE5B,QAAA,IAAID,QAAQ,OAAOA,IAAAA,KAAS,YAAYA,IAAKE,CAAAA,IAAI,KAAK,2BAA6B,EAAA;;YAEjF,MAAMC,MAAAA,GAASH,KAAKG,MAAM;YAC1B,IAAI,CAACA,MAAUA,IAAAA,MAAAA,CAAOC,KAAK,IAAI,CAACC,KAAAA,CAAMC,OAAO,CAACH,MAAOI,CAAAA,OAAO,CAAG,EAAA;AAE/D,YAAA,MAAMC,MAASR,GAAAA,IAAAA,CAAKS,UAAU,IAAI,CAAC,EAAEd,OAAQe,CAAAA,EAAE,CAAC,CAAC,EAAET,SAAAA,CAAU,CAAC;AAE9DE,YAAAA,MAAAA,CAAOI,OAAO,CAACR,OAAO,CAAC,CAACY,MAAQC,EAAAA,WAAAA,GAAAA;AAC9B,gBAAA,MAAMC,UAAa,GAAA,CAAC,EAAEL,MAAAA,CAAO,CAAC,EAAEG,MAAOG,CAAAA,GAAG,IAAIH,MAAAA,CAAOI,IAAI,IAAIH,YAAY,CAAC;AAC1E,gBAAA,MAAMV,IAAO,GAACS,MAAOK,CAAAA,MAAM,IAA6B,QAAA;AACxDnB,gBAAAA,OAAAA,CAAQoB,IAAI,CAAC;AAAEf,oBAAAA,IAAAA;AAAMS,oBAAAA,MAAAA;AAAQE,oBAAAA;AAAW,iBAAA,CAAA;AAC1C,aAAA,CAAA;AACF;AACF,KAAA,CAAA;IAEA,OAAOhB,OAAAA;AACT;AAEaqB,MAAAA,kBAAAA,GAAqB,CAAC,EAAEC,QAAQ,EAA2B,GAAA;AACtE,IAAA,MAAM,CAACC,aAAAA,EAAeC,gBAAiB,CAAA,GAAGC,cAAwB,CAAA,IAAA,CAAA;AAClE,IAAA,MAAM,EAAEC,QAAQ,EAAEC,MAAM,EAAE,GAAGC,0BAAAA,EAAAA;AAC7B,IAAA,MAAM,EAAEC,YAAY,EAAEC,UAAU,EAAEC,WAAW,EAAE,GAAGC,6BAAAA,EAAAA;AAClD,IAAA,MAAMC,WAAWC,yBAAc,CAAA,oBAAA,EAAsB,CAACC,CAAAA,GAAMA,EAAEF,QAAQ,CAAA;AACtE,IAAA,MAAMG,QAAQF,yBAAc,CAAA,oBAAA,EAAsB,CAACC,CAAAA,GAAMA,EAAEC,KAAK,CAAA;IAEhEC,eAAU,CAAA,IAAA;AACR,QAAA,MAAMC,gBAAgBZ,QAAQ,CAACA,QAASa,CAAAA,MAAM,GAAG,CAAE,CAAA;AACnD,QAAA,IAAI,CAACD,aAAe,EAAA;QACpB,IAAIA,aAAAA,CAAcvC,IAAI,KAAK,WAAa,EAAA;;AAExC,QAAA,IAAI4B,WAAW,OAAS,EAAA;;AAGxB,QAAA,MAAMa,gBAAgB3C,+BAAgCyC,CAAAA,aAAAA,CAAAA;;QAGtD,MAAMG,mBAAAA,GAAsBL,MAAMM,gBAAgB,CAACC,QAAQ,CACzDC,wCAAAA,CAA6BC,kBAAkB,CAACC,QAAQ,CAAA;QAG1DN,aAActC,CAAAA,OAAO,CAAC,CAAC6C,MAAAA,GAAAA;AACrB,YAAA,MAAMC,SACJnB,GAAAA,YAAY,CAACkB,MAAAA,CAAOjC,MAAM,CAACG,GAAG,CAAQ,IAAIa,UAAU,CAACiB,MAAAA,CAAOjC,MAAM,CAACG,GAAG,CAAQ;AAChF,YAAA,MAAMgC,SAAYC,GAAAA,wBAAAA,CAAmBH,MAAOjC,CAAAA,MAAM,EAAEkC,SAAAA,CAAAA;;AAGpD,YAAA,IAAI,CAACP,mBAAuBM,IAAAA,MAAAA,CAAOjC,MAAM,CAACqC,UAAU,EAAE;;AAEpD,gBAAA,IAAIJ,MAAO1C,CAAAA,IAAI,KAAK,QAAA,IAAY+C,OAAOC,IAAI,CAACN,MAAOjC,CAAAA,MAAM,CAACqC,UAAU,CAAEZ,CAAAA,MAAM,GAAG,CAAG,EAAA;oBAChFN,QAAS,CAAA;wBACP5B,IAAM,EAAA,uBAAA;wBACNiD,OAAS,EAAA;4BAACV,wCAA6BC,CAAAA,kBAAkB,CAACC;AAAS;AACrE,qBAAA,CAAA;AACF;AACF;YAEAf,WAAY,CAAA;AACVZ,gBAAAA,MAAAA,EAAQ1B,cAAc,CAACsD,MAAO1C,CAAAA,IAAI,CAAC;gBACnCS,MAAQmC,EAAAA;AACV,aAAA,CAAA;AACF,SAAA,CAAA;AACAzB,QAAAA,gBAAAA,CAAiBc,cAAczB,EAAE,CAAA;;KAGhC,EAAA;AAACa,QAAAA;AAAS,KAAA,CAAA;IAEb,qBACE6B,cAAA,CAACjE,cAAckE,QAAQ,EAAA;QAACC,KAAO,EAAA;AAAElC,YAAAA,aAAAA;AAAeC,YAAAA;AAAiB,SAAA;AAC9DF,QAAAA,QAAAA,EAAAA;;AAGP;;;;"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useState, useEffect, createContext } from 'react';
|
|
3
|
+
import { useGuidedTour, GUIDED_TOUR_REQUIRED_ACTIONS } from '@strapi/admin/strapi-admin';
|
|
4
|
+
import { useDataManager } from '../../DataManager/useDataManager.mjs';
|
|
5
|
+
import { transformChatToCTB } from '../lib/transforms/schemas/toCTB.mjs';
|
|
6
|
+
import { useStrapiChat } from './ChatProvider.mjs';
|
|
7
|
+
|
|
8
|
+
const SchemaContext = /*#__PURE__*/ createContext(undefined);
|
|
9
|
+
const TYPE_TO_ACTION = {
|
|
10
|
+
create: 'add',
|
|
11
|
+
update: 'update',
|
|
12
|
+
remove: 'delete'
|
|
13
|
+
};
|
|
14
|
+
function extractSchemaChangesFromMessage(message) {
|
|
15
|
+
if (message.role !== 'assistant') return [];
|
|
16
|
+
const changes = [];
|
|
17
|
+
message.parts?.forEach((part, partIndex)=>{
|
|
18
|
+
// We only care about the schema generation tool
|
|
19
|
+
if (part && typeof part === 'object' && part.type === 'tool-schemaGenerationTool') {
|
|
20
|
+
// Prefer validated schemas from output; ignore if there's an error or no output yet
|
|
21
|
+
const output = part.output;
|
|
22
|
+
if (!output || output.error || !Array.isArray(output.schemas)) return;
|
|
23
|
+
const baseId = part.toolCallId ?? `${message.id}-${partIndex}`;
|
|
24
|
+
output.schemas.forEach((schema, schemaIndex)=>{
|
|
25
|
+
const revisionId = `${baseId}-${schema.uid ?? schema.name ?? schemaIndex}`;
|
|
26
|
+
const type = schema.action || 'update';
|
|
27
|
+
changes.push({
|
|
28
|
+
type,
|
|
29
|
+
schema,
|
|
30
|
+
revisionId
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
return changes;
|
|
36
|
+
}
|
|
37
|
+
const SchemaChatProvider = ({ children })=>{
|
|
38
|
+
const [lastRevisedId, setLastRevisedId] = useState(null);
|
|
39
|
+
const { messages, status } = useStrapiChat();
|
|
40
|
+
const { contentTypes, components, applyChange } = useDataManager();
|
|
41
|
+
const dispatch = useGuidedTour('SchemaChatProvider', (s)=>s.dispatch);
|
|
42
|
+
const state = useGuidedTour('SchemaChatProvider', (s)=>s.state);
|
|
43
|
+
useEffect(()=>{
|
|
44
|
+
const latestMessage = messages[messages.length - 1];
|
|
45
|
+
if (!latestMessage) return;
|
|
46
|
+
if (latestMessage.role !== 'assistant') return;
|
|
47
|
+
// Wait until message streaming has finished
|
|
48
|
+
if (status !== 'ready') return;
|
|
49
|
+
// const schemaChanges = latestMessage.schemaChanges;
|
|
50
|
+
const schemaChanges = extractSchemaChangesFromMessage(latestMessage);
|
|
51
|
+
// Check if addField action is already completed
|
|
52
|
+
const isAddFieldCompleted = state.completedActions.includes(GUIDED_TOUR_REQUIRED_ACTIONS.contentTypeBuilder.addField);
|
|
53
|
+
schemaChanges.forEach((change)=>{
|
|
54
|
+
const oldSchema = contentTypes[change.schema.uid] || components[change.schema.uid];
|
|
55
|
+
const newSchema = transformChatToCTB(change.schema, oldSchema);
|
|
56
|
+
// Check if any attributes/fields are being added to any schema (existing or new)
|
|
57
|
+
if (!isAddFieldCompleted && change.schema.attributes) {
|
|
58
|
+
// If a field is being added or updated, dispatch guided tour action to show Save tooltip
|
|
59
|
+
if (change.type !== 'remove' && Object.keys(change.schema.attributes).length > 0) {
|
|
60
|
+
dispatch({
|
|
61
|
+
type: 'set_completed_actions',
|
|
62
|
+
payload: [
|
|
63
|
+
GUIDED_TOUR_REQUIRED_ACTIONS.contentTypeBuilder.addField
|
|
64
|
+
]
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
applyChange({
|
|
69
|
+
action: TYPE_TO_ACTION[change.type],
|
|
70
|
+
schema: newSchema
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
setLastRevisedId(latestMessage.id);
|
|
74
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
75
|
+
}, [
|
|
76
|
+
messages
|
|
77
|
+
]);
|
|
78
|
+
return /*#__PURE__*/ jsx(SchemaContext.Provider, {
|
|
79
|
+
value: {
|
|
80
|
+
lastRevisedId,
|
|
81
|
+
setLastRevisedId
|
|
82
|
+
},
|
|
83
|
+
children: children
|
|
84
|
+
});
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
export { SchemaChatProvider };
|
|
88
|
+
//# sourceMappingURL=SchemaProvider.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SchemaProvider.mjs","sources":["../../../../../admin/src/components/AIChat/providers/SchemaProvider.tsx"],"sourcesContent":["import { createContext, useContext, ReactNode, useEffect, useState } from 'react';\n\nimport { GUIDED_TOUR_REQUIRED_ACTIONS, useGuidedTour } from '@strapi/admin/strapi-admin';\n\nimport { useDataManager } from '../../DataManager/useDataManager';\nimport { transformChatToCTB } from '../lib/transforms/schemas/toCTB';\nimport { SchemaChange } from '../lib/types/annotations';\nimport { AIMessage } from '../lib/types/messages';\n\nimport { useStrapiChat } from './ChatProvider';\n\ninterface SchemaContextType {\n lastRevisedId: string | null;\n setLastRevisedId: (id: string | null) => void;\n}\n\nconst SchemaContext = createContext<SchemaContextType | undefined>(undefined);\n\nconst TYPE_TO_ACTION: Record<string, 'add' | 'update' | 'delete'> = {\n create: 'add',\n update: 'update',\n remove: 'delete',\n};\n\nfunction extractSchemaChangesFromMessage(message: AIMessage): SchemaChange[] {\n if (message.role !== 'assistant') return [];\n\n const changes: SchemaChange[] = [];\n\n message.parts?.forEach((part, partIndex) => {\n // We only care about the schema generation tool\n if (part && typeof part === 'object' && part.type === 'tool-schemaGenerationTool') {\n // Prefer validated schemas from output; ignore if there's an error or no output yet\n const output = part.output as { schemas?: any[]; error?: unknown } | undefined;\n if (!output || output.error || !Array.isArray(output.schemas)) return;\n\n const baseId = part.toolCallId ?? `${message.id}-${partIndex}`;\n\n output.schemas.forEach((schema, schemaIndex) => {\n const revisionId = `${baseId}-${schema.uid ?? schema.name ?? schemaIndex}`;\n const type = (schema.action as SchemaChange['type']) || 'update';\n changes.push({ type, schema, revisionId });\n });\n }\n });\n\n return changes;\n}\n\nexport const SchemaChatProvider = ({ children }: { children: ReactNode }) => {\n const [lastRevisedId, setLastRevisedId] = useState<string | null>(null);\n const { messages, status } = useStrapiChat();\n const { contentTypes, components, applyChange } = useDataManager();\n const dispatch = useGuidedTour('SchemaChatProvider', (s) => s.dispatch);\n const state = useGuidedTour('SchemaChatProvider', (s) => s.state);\n\n useEffect(() => {\n const latestMessage = messages[messages.length - 1];\n if (!latestMessage) return;\n if (latestMessage.role !== 'assistant') return;\n // Wait until message streaming has finished\n if (status !== 'ready') return;\n\n // const schemaChanges = latestMessage.schemaChanges;\n const schemaChanges = extractSchemaChangesFromMessage(latestMessage);\n\n // Check if addField action is already completed\n const isAddFieldCompleted = state.completedActions.includes(\n GUIDED_TOUR_REQUIRED_ACTIONS.contentTypeBuilder.addField\n );\n\n schemaChanges.forEach((change: SchemaChange) => {\n const oldSchema =\n contentTypes[change.schema.uid as any] || components[change.schema.uid as any];\n const newSchema = transformChatToCTB(change.schema, oldSchema);\n\n // Check if any attributes/fields are being added to any schema (existing or new)\n if (!isAddFieldCompleted && change.schema.attributes) {\n // If a field is being added or updated, dispatch guided tour action to show Save tooltip\n if (change.type !== 'remove' && Object.keys(change.schema.attributes).length > 0) {\n dispatch({\n type: 'set_completed_actions',\n payload: [GUIDED_TOUR_REQUIRED_ACTIONS.contentTypeBuilder.addField],\n });\n }\n }\n\n applyChange({\n action: TYPE_TO_ACTION[change.type]!,\n schema: newSchema,\n });\n });\n setLastRevisedId(latestMessage.id);\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [messages]);\n\n return (\n <SchemaContext.Provider value={{ lastRevisedId, setLastRevisedId }}>\n {children}\n </SchemaContext.Provider>\n );\n};\n\nexport const useChatSchema = () => {\n const context = useContext(SchemaContext);\n if (context === undefined) {\n throw new Error('useSchema must be used within a SchemaProvider');\n }\n return context;\n};\n"],"names":["SchemaContext","createContext","undefined","TYPE_TO_ACTION","create","update","remove","extractSchemaChangesFromMessage","message","role","changes","parts","forEach","part","partIndex","type","output","error","Array","isArray","schemas","baseId","toolCallId","id","schema","schemaIndex","revisionId","uid","name","action","push","SchemaChatProvider","children","lastRevisedId","setLastRevisedId","useState","messages","status","useStrapiChat","contentTypes","components","applyChange","useDataManager","dispatch","useGuidedTour","s","state","useEffect","latestMessage","length","schemaChanges","isAddFieldCompleted","completedActions","includes","GUIDED_TOUR_REQUIRED_ACTIONS","contentTypeBuilder","addField","change","oldSchema","newSchema","transformChatToCTB","attributes","Object","keys","payload","_jsx","Provider","value"],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@ var List = require('./List.js');
|
|
|
9
9
|
const ComponentList = ({ component, isFromDynamicZone = false, firstLoopComponentUid })=>{
|
|
10
10
|
const { components } = useDataManager.useDataManager();
|
|
11
11
|
const type = get(components, component);
|
|
12
|
+
if (!type) return;
|
|
12
13
|
return /*#__PURE__*/ jsxRuntime.jsx(ComponentRow.ComponentRow, {
|
|
13
14
|
$isChildOfDynamicZone: isFromDynamicZone,
|
|
14
15
|
className: "component-row",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComponentList.js","sources":["../../../admin/src/components/ComponentList.tsx"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"ComponentList.js","sources":["../../../admin/src/components/ComponentList.tsx"],"sourcesContent":["import get from 'lodash/get';\n\nimport { ComponentRow } from './ComponentRow';\nimport { useDataManager } from './DataManager/useDataManager';\nimport { List } from './List';\n\nimport type { UID } from '@strapi/types';\n\ninterface ComponentListProps {\n component: UID.Component;\n firstLoopComponentUid?: UID.Component | null;\n isFromDynamicZone?: boolean;\n}\n\nexport const ComponentList = ({\n component,\n isFromDynamicZone = false,\n firstLoopComponentUid,\n}: ComponentListProps) => {\n const { components } = useDataManager();\n const type = get(components, component);\n\n if (!type) return;\n\n return (\n <ComponentRow $isChildOfDynamicZone={isFromDynamicZone} className=\"component-row\">\n <List\n type={type}\n firstLoopComponentUid={firstLoopComponentUid || component}\n isFromDynamicZone={isFromDynamicZone}\n isSub\n secondLoopComponentUid={firstLoopComponentUid ? component : null}\n />\n </ComponentRow>\n );\n};\n"],"names":["ComponentList","component","isFromDynamicZone","firstLoopComponentUid","components","useDataManager","type","get","_jsx","ComponentRow","$isChildOfDynamicZone","className","List","isSub","secondLoopComponentUid"],"mappings":";;;;;;;;AAcO,MAAMA,aAAgB,GAAA,CAAC,EAC5BC,SAAS,EACTC,iBAAoB,GAAA,KAAK,EACzBC,qBAAqB,EACF,GAAA;IACnB,MAAM,EAAEC,UAAU,EAAE,GAAGC,6BAAAA,EAAAA;IACvB,MAAMC,IAAAA,GAAOC,IAAIH,UAAYH,EAAAA,SAAAA,CAAAA;AAE7B,IAAA,IAAI,CAACK,IAAM,EAAA;AAEX,IAAA,qBACEE,cAACC,CAAAA,yBAAAA,EAAAA;QAAaC,qBAAuBR,EAAAA,iBAAAA;QAAmBS,SAAU,EAAA,eAAA;AAChE,QAAA,QAAA,gBAAAH,cAACI,CAAAA,SAAAA,EAAAA;YACCN,IAAMA,EAAAA,IAAAA;AACNH,YAAAA,qBAAAA,EAAuBA,qBAAyBF,IAAAA,SAAAA;YAChDC,iBAAmBA,EAAAA,iBAAAA;YACnBW,KAAK,EAAA,IAAA;AACLC,YAAAA,sBAAAA,EAAwBX,wBAAwBF,SAAY,GAAA;;;AAIpE;;;;"}
|
|
@@ -7,6 +7,7 @@ import { List } from './List.mjs';
|
|
|
7
7
|
const ComponentList = ({ component, isFromDynamicZone = false, firstLoopComponentUid })=>{
|
|
8
8
|
const { components } = useDataManager();
|
|
9
9
|
const type = get(components, component);
|
|
10
|
+
if (!type) return;
|
|
10
11
|
return /*#__PURE__*/ jsx(ComponentRow, {
|
|
11
12
|
$isChildOfDynamicZone: isFromDynamicZone,
|
|
12
13
|
className: "component-row",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComponentList.mjs","sources":["../../../admin/src/components/ComponentList.tsx"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"ComponentList.mjs","sources":["../../../admin/src/components/ComponentList.tsx"],"sourcesContent":["import get from 'lodash/get';\n\nimport { ComponentRow } from './ComponentRow';\nimport { useDataManager } from './DataManager/useDataManager';\nimport { List } from './List';\n\nimport type { UID } from '@strapi/types';\n\ninterface ComponentListProps {\n component: UID.Component;\n firstLoopComponentUid?: UID.Component | null;\n isFromDynamicZone?: boolean;\n}\n\nexport const ComponentList = ({\n component,\n isFromDynamicZone = false,\n firstLoopComponentUid,\n}: ComponentListProps) => {\n const { components } = useDataManager();\n const type = get(components, component);\n\n if (!type) return;\n\n return (\n <ComponentRow $isChildOfDynamicZone={isFromDynamicZone} className=\"component-row\">\n <List\n type={type}\n firstLoopComponentUid={firstLoopComponentUid || component}\n isFromDynamicZone={isFromDynamicZone}\n isSub\n secondLoopComponentUid={firstLoopComponentUid ? component : null}\n />\n </ComponentRow>\n );\n};\n"],"names":["ComponentList","component","isFromDynamicZone","firstLoopComponentUid","components","useDataManager","type","get","_jsx","ComponentRow","$isChildOfDynamicZone","className","List","isSub","secondLoopComponentUid"],"mappings":";;;;;;AAcO,MAAMA,aAAgB,GAAA,CAAC,EAC5BC,SAAS,EACTC,iBAAoB,GAAA,KAAK,EACzBC,qBAAqB,EACF,GAAA;IACnB,MAAM,EAAEC,UAAU,EAAE,GAAGC,cAAAA,EAAAA;IACvB,MAAMC,IAAAA,GAAOC,IAAIH,UAAYH,EAAAA,SAAAA,CAAAA;AAE7B,IAAA,IAAI,CAACK,IAAM,EAAA;AAEX,IAAA,qBACEE,GAACC,CAAAA,YAAAA,EAAAA;QAAaC,qBAAuBR,EAAAA,iBAAAA;QAAmBS,SAAU,EAAA,eAAA;AAChE,QAAA,QAAA,gBAAAH,GAACI,CAAAA,IAAAA,EAAAA;YACCN,IAAMA,EAAAA,IAAAA;AACNH,YAAAA,qBAAAA,EAAuBA,qBAAyBF,IAAAA,SAAAA;YAChDC,iBAAmBA,EAAAA,iBAAAA;YACnBW,KAAK,EAAA,IAAA;AACLC,YAAAA,sBAAAA,EAAwBX,wBAAwBF,SAAY,GAAA;;;AAIpE;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataManagerContext.js","sources":["../../../../admin/src/components/DataManager/DataManagerContext.ts"],"sourcesContent":["/* eslint-disable check-file/filename-naming-convention */\nimport { createContext } from 'react';\n\nimport type { Component, ContentType } from '../../types';\nimport type { Internal, Struct } from '@strapi/types';\n\nexport interface DataManagerContextValue {\n isLoading: boolean;\n addAttribute: (opts: {\n attributeToSet: Record<string, any>;\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n }) => void;\n editAttribute: (opts: {\n attributeToSet: Record<string, any>;\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n name: string;\n }) => void;\n moveAttribute: (opts: {\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n from: number;\n to: number;\n }) => void;\n addCustomFieldAttribute: (params: {\n attributeToSet: Record<string, any>;\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n }) => void;\n editCustomFieldAttribute: (params: {\n attributeToSet: Record<string, any>;\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n name: string;\n }) => void;\n addCreatedComponentToDynamicZone: (opts: {\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n dynamicZoneTarget: string;\n componentsToAdd: Internal.UID.Component[];\n }) => void;\n createComponentSchema: (opts: {\n data: {\n icon: string;\n displayName: string;\n };\n componentCategory: string;\n uid: Internal.UID.Component;\n }) => void;\n createSchema: (opts: {\n data: {\n displayName: string;\n singularName: string;\n pluralName: string;\n kind: Struct.ContentTypeKind;\n draftAndPublish: boolean;\n pluginOptions: Record<string, any>;\n };\n uid: Internal.UID.Schema;\n }) => void;\n changeDynamicZoneComponents: (opts: {\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n dynamicZoneTarget: string;\n newComponents: Internal.UID.Component[];\n }) => void;\n removeAttribute: (opts: {\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n attributeToRemoveName: string;\n }) => void;\n deleteComponent(uid: Internal.UID.Component): void;\n deleteContentType(uid: Internal.UID.ContentType): void;\n removeComponentFromDynamicZone: (opts: {\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n dzName: string;\n componentToRemoveIndex: number;\n }) => void;\n sortedContentTypesList: {\n visible: ContentType['visible'];\n name: ContentType['uid'];\n title: ContentType['info']['displayName'];\n plugin: ContentType['plugin'];\n uid: ContentType['uid'];\n to: string;\n kind: ContentType['kind'];\n restrictRelationsTo: ContentType['restrictRelationsTo'];\n status: ContentType['status'];\n }[];\n updateComponentSchema: (opts: {\n data: {\n icon: string;\n displayName: string;\n };\n componentUID: Internal.UID.Component;\n }) => void;\n updateComponentUid: (opts: {\n newComponentUID: Internal.UID.Component;\n componentUID: Internal.UID.Component;\n }) => void;\n updateSchema: (opts: {\n data: {\n displayName: string;\n kind: Struct.ContentTypeKind;\n draftAndPublish: boolean;\n pluginOptions: Record<string, any>;\n };\n uid: Internal.UID.ContentType;\n }) => void;\n initialComponents: Record<Internal.UID.Component, Component>;\n components: Record<Internal.UID.Component, Component>;\n componentsGroupedByCategory: Record<string, Component[]>;\n componentsThatHaveOtherComponentInTheirAttributes: any[]; // Define the actual type\n initialContentTypes: Record<Internal.UID.ContentType, ContentType>;\n contentTypes: Record<Internal.UID.ContentType, ContentType>;\n isInDevelopmentMode?: boolean;\n nestedComponents: any[]; // Define the actual type\n reservedNames: {\n models: string[];\n attributes: string[];\n };\n allComponentsCategories: any[];\n saveSchema(): Promise<void>;\n isModified: boolean;\n isSaving: boolean;\n applyChange: (opts: {\n action: 'add' | 'update' | 'delete';\n schema:
|
|
1
|
+
{"version":3,"file":"DataManagerContext.js","sources":["../../../../admin/src/components/DataManager/DataManagerContext.ts"],"sourcesContent":["/* eslint-disable check-file/filename-naming-convention */\nimport { createContext } from 'react';\n\nimport type { Component, ContentType } from '../../types';\nimport type { Internal, Struct } from '@strapi/types';\n\nexport interface DataManagerContextValue {\n isLoading: boolean;\n addAttribute: (opts: {\n attributeToSet: Record<string, any>;\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n }) => void;\n editAttribute: (opts: {\n attributeToSet: Record<string, any>;\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n name: string;\n }) => void;\n moveAttribute: (opts: {\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n from: number;\n to: number;\n }) => void;\n addCustomFieldAttribute: (params: {\n attributeToSet: Record<string, any>;\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n }) => void;\n editCustomFieldAttribute: (params: {\n attributeToSet: Record<string, any>;\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n name: string;\n }) => void;\n addCreatedComponentToDynamicZone: (opts: {\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n dynamicZoneTarget: string;\n componentsToAdd: Internal.UID.Component[];\n }) => void;\n createComponentSchema: (opts: {\n data: {\n icon: string;\n displayName: string;\n };\n componentCategory: string;\n uid: Internal.UID.Component;\n }) => void;\n createSchema: (opts: {\n data: {\n displayName: string;\n singularName: string;\n pluralName: string;\n kind: Struct.ContentTypeKind;\n draftAndPublish: boolean;\n pluginOptions: Record<string, any>;\n };\n uid: Internal.UID.Schema;\n }) => void;\n changeDynamicZoneComponents: (opts: {\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n dynamicZoneTarget: string;\n newComponents: Internal.UID.Component[];\n }) => void;\n removeAttribute: (opts: {\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n attributeToRemoveName: string;\n }) => void;\n deleteComponent(uid: Internal.UID.Component): void;\n deleteContentType(uid: Internal.UID.ContentType): void;\n removeComponentFromDynamicZone: (opts: {\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n dzName: string;\n componentToRemoveIndex: number;\n }) => void;\n sortedContentTypesList: {\n visible: ContentType['visible'];\n name: ContentType['uid'];\n title: ContentType['info']['displayName'];\n plugin: ContentType['plugin'];\n uid: ContentType['uid'];\n to: string;\n kind: ContentType['kind'];\n restrictRelationsTo: ContentType['restrictRelationsTo'];\n status: ContentType['status'];\n }[];\n updateComponentSchema: (opts: {\n data: {\n icon: string;\n displayName: string;\n };\n componentUID: Internal.UID.Component;\n }) => void;\n updateComponentUid: (opts: {\n newComponentUID: Internal.UID.Component;\n componentUID: Internal.UID.Component;\n }) => void;\n updateSchema: (opts: {\n data: {\n displayName: string;\n kind: Struct.ContentTypeKind;\n draftAndPublish: boolean;\n pluginOptions: Record<string, any>;\n };\n uid: Internal.UID.ContentType;\n }) => void;\n initialComponents: Record<Internal.UID.Component, Component>;\n components: Record<Internal.UID.Component, Component>;\n componentsGroupedByCategory: Record<string, Component[]>;\n componentsThatHaveOtherComponentInTheirAttributes: any[]; // Define the actual type\n initialContentTypes: Record<Internal.UID.ContentType, ContentType>;\n contentTypes: Record<Internal.UID.ContentType, ContentType>;\n isInDevelopmentMode?: boolean;\n nestedComponents: any[]; // Define the actual type\n reservedNames: {\n models: string[];\n attributes: string[];\n };\n allComponentsCategories: any[];\n saveSchema(): Promise<void>;\n isModified: boolean;\n isSaving: boolean;\n applyChange: (opts: {\n action: 'add' | 'update' | 'delete';\n schema: ContentType | Component;\n }) => void;\n history: {\n undo(): void;\n redo(): void;\n discardAllChanges(): void;\n canUndo: boolean;\n canRedo: boolean;\n canDiscardAll: boolean;\n };\n}\n\n// @ts-expect-error need to pass initial value to params\nexport const DataManagerContext = createContext<DataManagerContextValue>();\n"],"names":["DataManagerContext","createContext"],"mappings":";;;;AA6IA;AACO,MAAMA,qBAAqBC,mBAAyC;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataManagerContext.mjs","sources":["../../../../admin/src/components/DataManager/DataManagerContext.ts"],"sourcesContent":["/* eslint-disable check-file/filename-naming-convention */\nimport { createContext } from 'react';\n\nimport type { Component, ContentType } from '../../types';\nimport type { Internal, Struct } from '@strapi/types';\n\nexport interface DataManagerContextValue {\n isLoading: boolean;\n addAttribute: (opts: {\n attributeToSet: Record<string, any>;\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n }) => void;\n editAttribute: (opts: {\n attributeToSet: Record<string, any>;\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n name: string;\n }) => void;\n moveAttribute: (opts: {\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n from: number;\n to: number;\n }) => void;\n addCustomFieldAttribute: (params: {\n attributeToSet: Record<string, any>;\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n }) => void;\n editCustomFieldAttribute: (params: {\n attributeToSet: Record<string, any>;\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n name: string;\n }) => void;\n addCreatedComponentToDynamicZone: (opts: {\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n dynamicZoneTarget: string;\n componentsToAdd: Internal.UID.Component[];\n }) => void;\n createComponentSchema: (opts: {\n data: {\n icon: string;\n displayName: string;\n };\n componentCategory: string;\n uid: Internal.UID.Component;\n }) => void;\n createSchema: (opts: {\n data: {\n displayName: string;\n singularName: string;\n pluralName: string;\n kind: Struct.ContentTypeKind;\n draftAndPublish: boolean;\n pluginOptions: Record<string, any>;\n };\n uid: Internal.UID.Schema;\n }) => void;\n changeDynamicZoneComponents: (opts: {\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n dynamicZoneTarget: string;\n newComponents: Internal.UID.Component[];\n }) => void;\n removeAttribute: (opts: {\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n attributeToRemoveName: string;\n }) => void;\n deleteComponent(uid: Internal.UID.Component): void;\n deleteContentType(uid: Internal.UID.ContentType): void;\n removeComponentFromDynamicZone: (opts: {\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n dzName: string;\n componentToRemoveIndex: number;\n }) => void;\n sortedContentTypesList: {\n visible: ContentType['visible'];\n name: ContentType['uid'];\n title: ContentType['info']['displayName'];\n plugin: ContentType['plugin'];\n uid: ContentType['uid'];\n to: string;\n kind: ContentType['kind'];\n restrictRelationsTo: ContentType['restrictRelationsTo'];\n status: ContentType['status'];\n }[];\n updateComponentSchema: (opts: {\n data: {\n icon: string;\n displayName: string;\n };\n componentUID: Internal.UID.Component;\n }) => void;\n updateComponentUid: (opts: {\n newComponentUID: Internal.UID.Component;\n componentUID: Internal.UID.Component;\n }) => void;\n updateSchema: (opts: {\n data: {\n displayName: string;\n kind: Struct.ContentTypeKind;\n draftAndPublish: boolean;\n pluginOptions: Record<string, any>;\n };\n uid: Internal.UID.ContentType;\n }) => void;\n initialComponents: Record<Internal.UID.Component, Component>;\n components: Record<Internal.UID.Component, Component>;\n componentsGroupedByCategory: Record<string, Component[]>;\n componentsThatHaveOtherComponentInTheirAttributes: any[]; // Define the actual type\n initialContentTypes: Record<Internal.UID.ContentType, ContentType>;\n contentTypes: Record<Internal.UID.ContentType, ContentType>;\n isInDevelopmentMode?: boolean;\n nestedComponents: any[]; // Define the actual type\n reservedNames: {\n models: string[];\n attributes: string[];\n };\n allComponentsCategories: any[];\n saveSchema(): Promise<void>;\n isModified: boolean;\n isSaving: boolean;\n applyChange: (opts: {\n action: 'add' | 'update' | 'delete';\n schema:
|
|
1
|
+
{"version":3,"file":"DataManagerContext.mjs","sources":["../../../../admin/src/components/DataManager/DataManagerContext.ts"],"sourcesContent":["/* eslint-disable check-file/filename-naming-convention */\nimport { createContext } from 'react';\n\nimport type { Component, ContentType } from '../../types';\nimport type { Internal, Struct } from '@strapi/types';\n\nexport interface DataManagerContextValue {\n isLoading: boolean;\n addAttribute: (opts: {\n attributeToSet: Record<string, any>;\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n }) => void;\n editAttribute: (opts: {\n attributeToSet: Record<string, any>;\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n name: string;\n }) => void;\n moveAttribute: (opts: {\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n from: number;\n to: number;\n }) => void;\n addCustomFieldAttribute: (params: {\n attributeToSet: Record<string, any>;\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n }) => void;\n editCustomFieldAttribute: (params: {\n attributeToSet: Record<string, any>;\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n name: string;\n }) => void;\n addCreatedComponentToDynamicZone: (opts: {\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n dynamicZoneTarget: string;\n componentsToAdd: Internal.UID.Component[];\n }) => void;\n createComponentSchema: (opts: {\n data: {\n icon: string;\n displayName: string;\n };\n componentCategory: string;\n uid: Internal.UID.Component;\n }) => void;\n createSchema: (opts: {\n data: {\n displayName: string;\n singularName: string;\n pluralName: string;\n kind: Struct.ContentTypeKind;\n draftAndPublish: boolean;\n pluginOptions: Record<string, any>;\n };\n uid: Internal.UID.Schema;\n }) => void;\n changeDynamicZoneComponents: (opts: {\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n dynamicZoneTarget: string;\n newComponents: Internal.UID.Component[];\n }) => void;\n removeAttribute: (opts: {\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n attributeToRemoveName: string;\n }) => void;\n deleteComponent(uid: Internal.UID.Component): void;\n deleteContentType(uid: Internal.UID.ContentType): void;\n removeComponentFromDynamicZone: (opts: {\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n dzName: string;\n componentToRemoveIndex: number;\n }) => void;\n sortedContentTypesList: {\n visible: ContentType['visible'];\n name: ContentType['uid'];\n title: ContentType['info']['displayName'];\n plugin: ContentType['plugin'];\n uid: ContentType['uid'];\n to: string;\n kind: ContentType['kind'];\n restrictRelationsTo: ContentType['restrictRelationsTo'];\n status: ContentType['status'];\n }[];\n updateComponentSchema: (opts: {\n data: {\n icon: string;\n displayName: string;\n };\n componentUID: Internal.UID.Component;\n }) => void;\n updateComponentUid: (opts: {\n newComponentUID: Internal.UID.Component;\n componentUID: Internal.UID.Component;\n }) => void;\n updateSchema: (opts: {\n data: {\n displayName: string;\n kind: Struct.ContentTypeKind;\n draftAndPublish: boolean;\n pluginOptions: Record<string, any>;\n };\n uid: Internal.UID.ContentType;\n }) => void;\n initialComponents: Record<Internal.UID.Component, Component>;\n components: Record<Internal.UID.Component, Component>;\n componentsGroupedByCategory: Record<string, Component[]>;\n componentsThatHaveOtherComponentInTheirAttributes: any[]; // Define the actual type\n initialContentTypes: Record<Internal.UID.ContentType, ContentType>;\n contentTypes: Record<Internal.UID.ContentType, ContentType>;\n isInDevelopmentMode?: boolean;\n nestedComponents: any[]; // Define the actual type\n reservedNames: {\n models: string[];\n attributes: string[];\n };\n allComponentsCategories: any[];\n saveSchema(): Promise<void>;\n isModified: boolean;\n isSaving: boolean;\n applyChange: (opts: {\n action: 'add' | 'update' | 'delete';\n schema: ContentType | Component;\n }) => void;\n history: {\n undo(): void;\n redo(): void;\n discardAllChanges(): void;\n canUndo: boolean;\n canRedo: boolean;\n canDiscardAll: boolean;\n };\n}\n\n// @ts-expect-error need to pass initial value to params\nexport const DataManagerContext = createContext<DataManagerContextValue>();\n"],"names":["DataManagerContext","createContext"],"mappings":";;AA6IA;AACO,MAAMA,qBAAqBC,aAAyC;;;;"}
|
|
@@ -5,7 +5,6 @@ var omit = require('lodash/omit');
|
|
|
5
5
|
var getRelationType = require('../../utils/getRelationType.js');
|
|
6
6
|
var makeUnique = require('../../utils/makeUnique.js');
|
|
7
7
|
var undoRedo = require('./undoRedo.js');
|
|
8
|
-
var formatSchemas = require('./utils/formatSchemas.js');
|
|
9
8
|
|
|
10
9
|
const initialState = {
|
|
11
10
|
components: {},
|
|
@@ -501,20 +500,63 @@ const slice = undoRedo.createUndoRedoSlice({
|
|
|
501
500
|
switch(action){
|
|
502
501
|
case 'add':
|
|
503
502
|
{
|
|
504
|
-
// generate a uid ?
|
|
505
503
|
const uid = schema.uid;
|
|
506
504
|
if (schema.modelType === 'component') {
|
|
505
|
+
state.components[uid] = schema;
|
|
506
|
+
} else {
|
|
507
|
+
state.contentTypes[uid] = schema;
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
break;
|
|
511
|
+
case 'update':
|
|
512
|
+
{
|
|
513
|
+
const uid = schema.uid;
|
|
514
|
+
// Find the schema, if the state was "create", we should keep it as it was before
|
|
515
|
+
if (schema.modelType === 'component') {
|
|
516
|
+
const component = state.components[uid];
|
|
507
517
|
state.components[uid] = {
|
|
508
|
-
...
|
|
509
|
-
status: 'NEW'
|
|
518
|
+
...schema,
|
|
519
|
+
status: component?.status === 'NEW' ? 'NEW' : schema.status
|
|
510
520
|
};
|
|
511
521
|
} else {
|
|
522
|
+
const contentType = state.contentTypes[uid];
|
|
512
523
|
state.contentTypes[uid] = {
|
|
513
|
-
...
|
|
514
|
-
status: 'NEW'
|
|
524
|
+
...schema,
|
|
525
|
+
status: contentType?.status === 'NEW' ? 'NEW' : schema.status
|
|
515
526
|
};
|
|
516
527
|
}
|
|
517
528
|
}
|
|
529
|
+
break;
|
|
530
|
+
case 'delete':
|
|
531
|
+
{
|
|
532
|
+
const uid = schema.uid;
|
|
533
|
+
const isComponent = schema.modelType === 'component';
|
|
534
|
+
// It's a component that has yet not been added
|
|
535
|
+
if (isComponent) {
|
|
536
|
+
const exists = state.components[uid];
|
|
537
|
+
if (!exists) {
|
|
538
|
+
return;
|
|
539
|
+
}
|
|
540
|
+
const isUnsaved = state.components[uid]?.status === 'NEW';
|
|
541
|
+
if (isUnsaved) {
|
|
542
|
+
delete state.components[uid];
|
|
543
|
+
} else {
|
|
544
|
+
state.components[uid].status = 'REMOVED';
|
|
545
|
+
}
|
|
546
|
+
} else {
|
|
547
|
+
const exists = state.contentTypes[uid];
|
|
548
|
+
if (!exists) {
|
|
549
|
+
return;
|
|
550
|
+
}
|
|
551
|
+
const isUnsaved = state.contentTypes[uid]?.status === 'NEW';
|
|
552
|
+
if (isUnsaved) {
|
|
553
|
+
delete state.contentTypes[uid];
|
|
554
|
+
} else {
|
|
555
|
+
state.contentTypes[uid].status = 'REMOVED';
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
break;
|
|
559
|
+
}
|
|
518
560
|
}
|
|
519
561
|
}
|
|
520
562
|
}
|