@strapi/content-type-builder 5.48.0 → 5.49.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 (115) hide show
  1. package/dist/admin/components/AIChat/components/Messages/Message.js +5 -1
  2. package/dist/admin/components/AIChat/components/Messages/Message.js.map +1 -1
  3. package/dist/admin/components/AIChat/components/SimpleMenu.js +3 -2
  4. package/dist/admin/components/AIChat/components/SimpleMenu.js.map +1 -1
  5. package/dist/admin/components/AIChat/hooks/useCodeUpload.js +7 -2
  6. package/dist/admin/components/AIChat/hooks/useCodeUpload.js.map +1 -1
  7. package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.js +11 -5
  8. package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.js.map +1 -1
  9. package/dist/admin/components/AllowedTypesSelect.js +5 -1
  10. package/dist/admin/components/AllowedTypesSelect.js.map +1 -1
  11. package/dist/admin/components/AttributeOptions/EmptyAttributes.js +3 -2
  12. package/dist/admin/components/AttributeOptions/EmptyAttributes.js.map +1 -1
  13. package/dist/admin/components/AttributeRow.js +10 -5
  14. package/dist/admin/components/AttributeRow.js.map +1 -1
  15. package/dist/admin/components/AutoReloadOverlayBlocker.js +3 -2
  16. package/dist/admin/components/AutoReloadOverlayBlocker.js.map +1 -1
  17. package/dist/admin/components/ComponentCard/ComponentCard.js +5 -1
  18. package/dist/admin/components/ComponentCard/ComponentCard.js.map +1 -1
  19. package/dist/admin/components/ComponentList.js +5 -1
  20. package/dist/admin/components/ComponentList.js.map +1 -1
  21. package/dist/admin/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.js +5 -1
  22. package/dist/admin/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.js.map +1 -1
  23. package/dist/admin/components/DataManager/DataManagerProvider.js +12 -6
  24. package/dist/admin/components/DataManager/DataManagerProvider.js.map +1 -1
  25. package/dist/admin/components/DataManager/reducer.js +7 -2
  26. package/dist/admin/components/DataManager/reducer.js.map +1 -1
  27. package/dist/admin/components/DataManager/utils/cleanData.js +10 -4
  28. package/dist/admin/components/DataManager/utils/cleanData.js.map +1 -1
  29. package/dist/admin/components/DataManager/utils/retrieveComponentsThatHaveComponents.js +5 -1
  30. package/dist/admin/components/DataManager/utils/retrieveComponentsThatHaveComponents.js.map +1 -1
  31. package/dist/admin/components/DataManager/utils/retrieveSpecificInfoFromComponents.js +5 -1
  32. package/dist/admin/components/DataManager/utils/retrieveSpecificInfoFromComponents.js.map +1 -1
  33. package/dist/admin/components/FormModal/FormModal.js +30 -22
  34. package/dist/admin/components/FormModal/FormModal.js.map +1 -1
  35. package/dist/admin/components/FormModal/attributes/ConditionForm.js +3 -2
  36. package/dist/admin/components/FormModal/attributes/ConditionForm.js.map +1 -1
  37. package/dist/admin/components/FormModal/attributes/types.js +7 -3
  38. package/dist/admin/components/FormModal/attributes/types.js.map +1 -1
  39. package/dist/admin/components/FormModal/attributes/validation/common.js +8 -4
  40. package/dist/admin/components/FormModal/attributes/validation/common.js.map +1 -1
  41. package/dist/admin/components/FormModal/component/createComponentSchema.js +3 -2
  42. package/dist/admin/components/FormModal/component/createComponentSchema.js.map +1 -1
  43. package/dist/admin/components/FormModal/contentType/createContentTypeSchema.js +3 -2
  44. package/dist/admin/components/FormModal/contentType/createContentTypeSchema.js.map +1 -1
  45. package/dist/admin/components/FormModal/forms/utils/createCollectionName.js +5 -1
  46. package/dist/admin/components/FormModal/forms/utils/createCollectionName.js.map +1 -1
  47. package/dist/admin/components/FormModal/reducer.js +32 -26
  48. package/dist/admin/components/FormModal/reducer.js.map +1 -1
  49. package/dist/admin/components/FormModalHeader.js +6 -2
  50. package/dist/admin/components/FormModalHeader.js.map +1 -1
  51. package/dist/admin/components/FormModalNavigation/FormModalNavigationContext.js +3 -2
  52. package/dist/admin/components/FormModalNavigation/FormModalNavigationContext.js.map +1 -1
  53. package/dist/admin/components/FormModalSubHeader.js +6 -2
  54. package/dist/admin/components/FormModalSubHeader.js.map +1 -1
  55. package/dist/admin/components/GenericInputs.js +9 -4
  56. package/dist/admin/components/GenericInputs.js.map +1 -1
  57. package/dist/admin/components/IconPicker/constants.js +4 -3
  58. package/dist/admin/components/IconPicker/constants.js.map +1 -1
  59. package/dist/admin/components/PluralName.js +5 -1
  60. package/dist/admin/components/PluralName.js.map +1 -1
  61. package/dist/admin/components/Relation/RelationNaturePicker/RelationNaturePicker.js +13 -7
  62. package/dist/admin/components/Relation/RelationNaturePicker/RelationNaturePicker.js.map +1 -1
  63. package/dist/admin/components/TabForm.js +7 -3
  64. package/dist/admin/components/TabForm.js.map +1 -1
  65. package/dist/admin/pages/ListView/ListView.js +5 -1
  66. package/dist/admin/pages/ListView/ListView.js.map +1 -1
  67. package/dist/admin/utils/formAPI.js +11 -6
  68. package/dist/admin/utils/formAPI.js.map +1 -1
  69. package/dist/admin/utils/getMaxDepth.js.map +1 -1
  70. package/dist/admin/utils/getMaxDepth.mjs.map +1 -1
  71. package/dist/admin/utils/nameToSlug.js +5 -1
  72. package/dist/admin/utils/nameToSlug.js.map +1 -1
  73. package/dist/admin/utils/toRegressedEnumValue.js +5 -1
  74. package/dist/admin/utils/toRegressedEnumValue.js.map +1 -1
  75. package/dist/server/controllers/components.js +6 -2
  76. package/dist/server/controllers/components.js.map +1 -1
  77. package/dist/server/controllers/content-types.js +8 -4
  78. package/dist/server/controllers/content-types.js.map +1 -1
  79. package/dist/server/controllers/validation/common.js +5 -1
  80. package/dist/server/controllers/validation/common.js.map +1 -1
  81. package/dist/server/controllers/validation/component.js +9 -5
  82. package/dist/server/controllers/validation/component.js.map +1 -1
  83. package/dist/server/controllers/validation/data-transform.js +6 -2
  84. package/dist/server/controllers/validation/data-transform.js.map +1 -1
  85. package/dist/server/controllers/validation/model-schema.js +6 -2
  86. package/dist/server/controllers/validation/model-schema.js.map +1 -1
  87. package/dist/server/controllers/validation/types.js +8 -4
  88. package/dist/server/controllers/validation/types.js.map +1 -1
  89. package/dist/server/routes/content-api.js +3 -2
  90. package/dist/server/routes/content-api.js.map +1 -1
  91. package/dist/server/services/api-handler.js +4 -3
  92. package/dist/server/services/api-handler.js.map +1 -1
  93. package/dist/server/services/api-handler.mjs.map +1 -1
  94. package/dist/server/services/components.js.map +1 -1
  95. package/dist/server/services/components.mjs.map +1 -1
  96. package/dist/server/services/content-types.js +8 -4
  97. package/dist/server/services/content-types.js.map +1 -1
  98. package/dist/server/services/schema-builder/component-builder.js +11 -5
  99. package/dist/server/services/schema-builder/component-builder.js.map +1 -1
  100. package/dist/server/services/schema-builder/content-type-builder.js +13 -8
  101. package/dist/server/services/schema-builder/content-type-builder.js.map +1 -1
  102. package/dist/server/services/schema-builder/index.js +5 -1
  103. package/dist/server/services/schema-builder/index.js.map +1 -1
  104. package/dist/server/services/schema-builder/schema-handler.js +35 -29
  105. package/dist/server/services/schema-builder/schema-handler.js.map +1 -1
  106. package/dist/server/services/schema-builder/schema-handler.mjs.map +1 -1
  107. package/dist/server/services/schema.js +5 -1
  108. package/dist/server/services/schema.js.map +1 -1
  109. package/dist/server/src/services/components.d.ts +3 -26
  110. package/dist/server/src/services/components.d.ts.map +1 -1
  111. package/dist/server/src/services/schema-builder/schema-handler.d.ts +1 -0
  112. package/dist/server/src/services/schema-builder/schema-handler.d.ts.map +1 -1
  113. package/dist/server/utils/attributes.js +12 -7
  114. package/dist/server/utils/attributes.js.map +1 -1
  115. package/package.json +6 -6
@@ -11,6 +11,10 @@ var AnimatedBox = require('../AnimatedBox.js');
11
11
  var AttachmentPreview = require('../Attachments/AttachmentPreview.js');
12
12
  var Marker = require('./Marker.js');
13
13
 
14
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
15
+
16
+ var Markdown__default = /*#__PURE__*/_interopDefault(Markdown);
17
+
14
18
  const MarkdownStyles = styledComponents.styled(designSystem.Typography)`
15
19
  max-width: 65ch;
16
20
  margin: 0 auto;
@@ -107,7 +111,7 @@ const toMarkerFromSchemaTool = (part)=>{
107
111
  const MessageContent = ({ part })=>{
108
112
  if (part.type === 'text') {
109
113
  return /*#__PURE__*/ jsxRuntime.jsx(MarkdownStyles, {
110
- children: /*#__PURE__*/ jsxRuntime.jsx(Markdown, {
114
+ children: /*#__PURE__*/ jsxRuntime.jsx(Markdown__default.default, {
111
115
  components: {
112
116
  a: ({ node, ...props })=>/*#__PURE__*/ jsxRuntime.jsx("a", {
113
117
  target: "_blank",
@@ -1 +1 @@
1
- {"version":3,"file":"Message.js","sources":["../../../../../../admin/src/components/AIChat/components/Messages/Message.tsx"],"sourcesContent":["import { Typography, Box, IconButton, Flex } from '@strapi/design-system';\nimport { ThumbUp, ThumbDown } from '@strapi/icons';\nimport Markdown from 'react-markdown';\nimport { styled } from 'styled-components';\n\nimport { useFeedbackModal } from '../../FeedbackModal';\nimport { useFeedback } from '../../hooks/useFeedback';\nimport {\n AIMessage,\n type UserMessage as UserMessageType,\n AssistantMessage as AssistantMessageType,\n type MarkerContent as MarkerContentType,\n} from '../../lib/types/messages';\nimport { AnimatedBox } from '../AnimatedBox';\nimport { AttachmentPreview } from '../Attachments/AttachmentPreview';\n\nimport { Marker } from './Marker';\n\nconst MarkdownStyles = styled(Typography)`\n max-width: 65ch;\n margin: 0 auto;\n overflow-wrap: anywhere;\n word-break: break-word;\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n margin-top: 1.25em;\n margin-bottom: 0.5em;\n font-weight: bold;\n }\n\n p {\n margin-bottom: 1em;\n }\n\n ul,\n ol {\n padding-left: 1.5em; /* indentation for bullet points */\n margin-bottom: 1em;\n }\n\n li {\n margin-bottom: 0.5em;\n list-style-type: disc; /* or whatever style you prefer */\n }\n\n strong {\n font-weight: bold;\n }\n\n /* code blocks, blockquotes, etc. */\n code {\n background-color: ${({ theme }) => theme.colors.neutral100};\n padding: 0.2em 0.4em;\n border-radius: ${({ theme }) => theme.borderRadius};\n border-color: ${({ theme }) => theme.colors.neutral150};\n border-style: solid;\n font-family: 'SF Mono', SFMono-Regular, ui-monospace, 'DejaVu Sans Mono', Menlo, Consolas,\n monospace;\n }\n\n /* links */\n a {\n color: ${({ theme }) => theme.colors.primary500};\n background-color: ${({ theme }) => theme.colors.neutral100};\n padding: 0.2em 0.4em;\n border-radius: ${({ theme }) => theme.borderRadius};\n border-color: ${({ theme }) => theme.colors.neutral150};\n border-style: solid;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n`;\n\nconst UserMessageTypography = styled(Typography)`\n overflow-wrap: anywhere;\n word-break: break-word;\n`;\n\n// ---------------------------\n// Tool: schemaGenerationTool helpers\n// ---------------------------\n\ntype SchemaToolSchema = {\n action?: 'create' | 'update' | 'remove';\n uid?: string;\n name?: string;\n category?: string;\n kind?: 'collectionType' | 'singleType' | 'component';\n modelType?: 'component' | 'collectionType' | 'singleType';\n};\n\ntype SchemaToolPart = {\n type: 'tool-schemaGenerationTool';\n input?: { schemas?: SchemaToolSchema[] };\n output?: { schemas?: SchemaToolSchema[]; error?: unknown };\n toolCallId?: string;\n};\n\nconst isSchemaToolPart = (part: any): part is SchemaToolPart =>\n part && typeof part === 'object' && part.type === 'tool-schemaGenerationTool';\n\nconst capitalize = (s?: string) => (s ? s.charAt(0).toUpperCase() + s.slice(1) : '');\n\nconst getSchemaLink = (schema: SchemaToolSchema): string | undefined => {\n const isComponent = (schema.kind ?? schema.modelType) === 'component';\n if (!schema.uid) return undefined;\n return isComponent\n ? `/plugins/content-type-builder/component-categories/${schema.category ?? ''}/${schema.uid}`\n : `/plugins/content-type-builder/content-types/${schema.uid}`;\n};\n\nconst toMarkerFromSchemaTool = (part: SchemaToolPart): MarkerContentType => {\n const outSchemas = part.output?.schemas ?? [];\n const inSchemas = part.input?.schemas ?? [];\n\n const schemas = (outSchemas.length ? outSchemas : inSchemas) as SchemaToolSchema[];\n const numSchemas = schemas.length;\n\n const state: 'loading' | 'success' | 'error' = part.output\n ? part.output.error\n ? 'error'\n : 'success'\n : 'loading';\n\n const steps = schemas.map((schema, index) => ({\n id: `${part.toolCallId ?? 'schemaGenerationTool'}-${schema.uid ?? schema.name ?? index}`,\n description: capitalize(schema.name ?? schema.uid ?? 'Schema'),\n status:\n schema.action === 'create' || schema.action === 'update' || schema.action === 'remove'\n ? schema.action\n : ('update' as const),\n link: getSchemaLink(schema),\n }));\n\n const title =\n state === 'success'\n ? `Updated ${numSchemas} schema${numSchemas === 1 ? '' : 's'}`\n : state === 'error'\n ? `Failed to update schema${numSchemas === 1 ? '' : 's'}`\n : 'Updating schemas';\n\n return {\n type: 'marker',\n title,\n state,\n steps,\n };\n};\n\nconst MessageContent = ({\n part,\n}: {\n part: AIMessage['parts'][number];\n status?: 'loading' | 'success' | 'error';\n}) => {\n if (part.type === 'text') {\n return (\n <MarkdownStyles>\n <Markdown\n components={{\n a: ({ node, ...props }) => <a target=\"_blank\" rel=\"noopener noreferrer\" {...props} />,\n }}\n >\n {part.text}\n </Markdown>\n </MarkdownStyles>\n );\n }\n\n if (isSchemaToolPart(part)) {\n const marker = toMarkerFromSchemaTool(part);\n return <Marker {...marker} />;\n }\n\n return null;\n};\n\nconst UserMessage = ({ message }: { message: UserMessageType }) => {\n const hasText = message.parts.some(\n (content) => content.type === 'text' && content.text.trim() !== ''\n );\n const attachments = message.parts.filter((content) => content.type === 'file');\n\n return (\n <AnimatedBox\n as={Flex}\n direction=\"column\"\n alignItems=\"flex-end\"\n style={{ alignSelf: 'flex-end' }}\n gap={2}\n maxWidth=\"80%\"\n >\n {hasText ? (\n <Box background=\"neutral150\" borderStyle=\"none\" padding={['10px', '16px']} hasRadius>\n {message.parts.map((content, index) => {\n if (content.type !== 'text') return null;\n return <UserMessageTypography key={index}>{content.text}</UserMessageTypography>;\n })}\n </Box>\n ) : null}\n\n {/* Attachments */}\n {attachments.map((attachment, idx) => (\n <AttachmentPreview\n key={`${attachment.type === 'file' ? attachment.filename : attachment.type}-${idx}`}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n attachment={{ ...attachment, status: 'ready' } as any}\n />\n ))}\n </AnimatedBox>\n );\n};\n\nconst AssistantMessage = ({\n message,\n isLoading,\n}: {\n message: AssistantMessageType;\n isLoading?: boolean;\n}) => {\n const { upvoteMessage } = useFeedback();\n const { openFeedbackModal } = useFeedbackModal();\n\n return (\n <Box style={{ alignSelf: 'flex-start' }} maxWidth=\"90%\">\n {message.parts.map((content, index) => (\n <MessageContent key={index} part={content} />\n ))}\n {isLoading ? (\n <Flex gap={1}>\n <IconButton\n label=\"Upvote\"\n size=\"XS\"\n variant=\"ghost\"\n onClick={() => upvoteMessage(message.id)}\n >\n <ThumbUp />\n </IconButton>\n <IconButton\n label=\"Downvote\"\n size=\"XS\"\n variant=\"ghost\"\n // For downvoting, user must provide specific feedback\n onClick={() => openFeedbackModal(message.id)}\n >\n <ThumbDown />\n </IconButton>\n </Flex>\n ) : null}\n </Box>\n );\n};\n\nexport const ChatMessage = ({\n message,\n isLoading,\n}: {\n message: AIMessage;\n isLoading?: boolean;\n}) => {\n /**\n * IMPORTANT: Messages are rendered using react-markdown (heavy compute)\n * Component re-renders on each message update, but AI SDK v5 provides\n * throttling (experimental_throttle: 100ms) which batches updates and reduces\n * re-render frequency during streaming.\n */\n if (message.role === 'user') {\n return <UserMessage message={message as UserMessageType} />;\n }\n return <AssistantMessage message={message as AssistantMessageType} />;\n};\n"],"names":["MarkdownStyles","styled","Typography","theme","colors","neutral100","borderRadius","neutral150","primary500","UserMessageTypography","isSchemaToolPart","part","type","capitalize","s","charAt","toUpperCase","slice","getSchemaLink","schema","isComponent","kind","modelType","uid","undefined","category","toMarkerFromSchemaTool","outSchemas","output","schemas","inSchemas","input","length","numSchemas","state","error","steps","map","index","id","toolCallId","name","description","status","action","link","title","MessageContent","_jsx","Markdown","components","a","node","props","target","rel","text","marker","Marker","UserMessage","message","hasText","parts","some","content","trim","attachments","filter","_jsxs","AnimatedBox","as","Flex","direction","alignItems","style","alignSelf","gap","maxWidth","Box","background","borderStyle","padding","hasRadius","attachment","idx","AttachmentPreview","filename","AssistantMessage","isLoading","upvoteMessage","useFeedback","openFeedbackModal","useFeedbackModal","IconButton","label","size","variant","onClick","ThumbUp","ThumbDown","ChatMessage","role"],"mappings":"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"}
1
+ {"version":3,"file":"Message.js","sources":["../../../../../../admin/src/components/AIChat/components/Messages/Message.tsx"],"sourcesContent":["import { Typography, Box, IconButton, Flex } from '@strapi/design-system';\nimport { ThumbUp, ThumbDown } from '@strapi/icons';\nimport Markdown from 'react-markdown';\nimport { styled } from 'styled-components';\n\nimport { useFeedbackModal } from '../../FeedbackModal';\nimport { useFeedback } from '../../hooks/useFeedback';\nimport {\n AIMessage,\n type UserMessage as UserMessageType,\n AssistantMessage as AssistantMessageType,\n type MarkerContent as MarkerContentType,\n} from '../../lib/types/messages';\nimport { AnimatedBox } from '../AnimatedBox';\nimport { AttachmentPreview } from '../Attachments/AttachmentPreview';\n\nimport { Marker } from './Marker';\n\nconst MarkdownStyles = styled(Typography)`\n max-width: 65ch;\n margin: 0 auto;\n overflow-wrap: anywhere;\n word-break: break-word;\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n margin-top: 1.25em;\n margin-bottom: 0.5em;\n font-weight: bold;\n }\n\n p {\n margin-bottom: 1em;\n }\n\n ul,\n ol {\n padding-left: 1.5em; /* indentation for bullet points */\n margin-bottom: 1em;\n }\n\n li {\n margin-bottom: 0.5em;\n list-style-type: disc; /* or whatever style you prefer */\n }\n\n strong {\n font-weight: bold;\n }\n\n /* code blocks, blockquotes, etc. */\n code {\n background-color: ${({ theme }) => theme.colors.neutral100};\n padding: 0.2em 0.4em;\n border-radius: ${({ theme }) => theme.borderRadius};\n border-color: ${({ theme }) => theme.colors.neutral150};\n border-style: solid;\n font-family: 'SF Mono', SFMono-Regular, ui-monospace, 'DejaVu Sans Mono', Menlo, Consolas,\n monospace;\n }\n\n /* links */\n a {\n color: ${({ theme }) => theme.colors.primary500};\n background-color: ${({ theme }) => theme.colors.neutral100};\n padding: 0.2em 0.4em;\n border-radius: ${({ theme }) => theme.borderRadius};\n border-color: ${({ theme }) => theme.colors.neutral150};\n border-style: solid;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n`;\n\nconst UserMessageTypography = styled(Typography)`\n overflow-wrap: anywhere;\n word-break: break-word;\n`;\n\n// ---------------------------\n// Tool: schemaGenerationTool helpers\n// ---------------------------\n\ntype SchemaToolSchema = {\n action?: 'create' | 'update' | 'remove';\n uid?: string;\n name?: string;\n category?: string;\n kind?: 'collectionType' | 'singleType' | 'component';\n modelType?: 'component' | 'collectionType' | 'singleType';\n};\n\ntype SchemaToolPart = {\n type: 'tool-schemaGenerationTool';\n input?: { schemas?: SchemaToolSchema[] };\n output?: { schemas?: SchemaToolSchema[]; error?: unknown };\n toolCallId?: string;\n};\n\nconst isSchemaToolPart = (part: any): part is SchemaToolPart =>\n part && typeof part === 'object' && part.type === 'tool-schemaGenerationTool';\n\nconst capitalize = (s?: string) => (s ? s.charAt(0).toUpperCase() + s.slice(1) : '');\n\nconst getSchemaLink = (schema: SchemaToolSchema): string | undefined => {\n const isComponent = (schema.kind ?? schema.modelType) === 'component';\n if (!schema.uid) return undefined;\n return isComponent\n ? `/plugins/content-type-builder/component-categories/${schema.category ?? ''}/${schema.uid}`\n : `/plugins/content-type-builder/content-types/${schema.uid}`;\n};\n\nconst toMarkerFromSchemaTool = (part: SchemaToolPart): MarkerContentType => {\n const outSchemas = part.output?.schemas ?? [];\n const inSchemas = part.input?.schemas ?? [];\n\n const schemas = (outSchemas.length ? outSchemas : inSchemas) as SchemaToolSchema[];\n const numSchemas = schemas.length;\n\n const state: 'loading' | 'success' | 'error' = part.output\n ? part.output.error\n ? 'error'\n : 'success'\n : 'loading';\n\n const steps = schemas.map((schema, index) => ({\n id: `${part.toolCallId ?? 'schemaGenerationTool'}-${schema.uid ?? schema.name ?? index}`,\n description: capitalize(schema.name ?? schema.uid ?? 'Schema'),\n status:\n schema.action === 'create' || schema.action === 'update' || schema.action === 'remove'\n ? schema.action\n : ('update' as const),\n link: getSchemaLink(schema),\n }));\n\n const title =\n state === 'success'\n ? `Updated ${numSchemas} schema${numSchemas === 1 ? '' : 's'}`\n : state === 'error'\n ? `Failed to update schema${numSchemas === 1 ? '' : 's'}`\n : 'Updating schemas';\n\n return {\n type: 'marker',\n title,\n state,\n steps,\n };\n};\n\nconst MessageContent = ({\n part,\n}: {\n part: AIMessage['parts'][number];\n status?: 'loading' | 'success' | 'error';\n}) => {\n if (part.type === 'text') {\n return (\n <MarkdownStyles>\n <Markdown\n components={{\n a: ({ node, ...props }) => <a target=\"_blank\" rel=\"noopener noreferrer\" {...props} />,\n }}\n >\n {part.text}\n </Markdown>\n </MarkdownStyles>\n );\n }\n\n if (isSchemaToolPart(part)) {\n const marker = toMarkerFromSchemaTool(part);\n return <Marker {...marker} />;\n }\n\n return null;\n};\n\nconst UserMessage = ({ message }: { message: UserMessageType }) => {\n const hasText = message.parts.some(\n (content) => content.type === 'text' && content.text.trim() !== ''\n );\n const attachments = message.parts.filter((content) => content.type === 'file');\n\n return (\n <AnimatedBox\n as={Flex}\n direction=\"column\"\n alignItems=\"flex-end\"\n style={{ alignSelf: 'flex-end' }}\n gap={2}\n maxWidth=\"80%\"\n >\n {hasText ? (\n <Box background=\"neutral150\" borderStyle=\"none\" padding={['10px', '16px']} hasRadius>\n {message.parts.map((content, index) => {\n if (content.type !== 'text') return null;\n return <UserMessageTypography key={index}>{content.text}</UserMessageTypography>;\n })}\n </Box>\n ) : null}\n\n {/* Attachments */}\n {attachments.map((attachment, idx) => (\n <AttachmentPreview\n key={`${attachment.type === 'file' ? attachment.filename : attachment.type}-${idx}`}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n attachment={{ ...attachment, status: 'ready' } as any}\n />\n ))}\n </AnimatedBox>\n );\n};\n\nconst AssistantMessage = ({\n message,\n isLoading,\n}: {\n message: AssistantMessageType;\n isLoading?: boolean;\n}) => {\n const { upvoteMessage } = useFeedback();\n const { openFeedbackModal } = useFeedbackModal();\n\n return (\n <Box style={{ alignSelf: 'flex-start' }} maxWidth=\"90%\">\n {message.parts.map((content, index) => (\n <MessageContent key={index} part={content} />\n ))}\n {isLoading ? (\n <Flex gap={1}>\n <IconButton\n label=\"Upvote\"\n size=\"XS\"\n variant=\"ghost\"\n onClick={() => upvoteMessage(message.id)}\n >\n <ThumbUp />\n </IconButton>\n <IconButton\n label=\"Downvote\"\n size=\"XS\"\n variant=\"ghost\"\n // For downvoting, user must provide specific feedback\n onClick={() => openFeedbackModal(message.id)}\n >\n <ThumbDown />\n </IconButton>\n </Flex>\n ) : null}\n </Box>\n );\n};\n\nexport const ChatMessage = ({\n message,\n isLoading,\n}: {\n message: AIMessage;\n isLoading?: boolean;\n}) => {\n /**\n * IMPORTANT: Messages are rendered using react-markdown (heavy compute)\n * Component re-renders on each message update, but AI SDK v5 provides\n * throttling (experimental_throttle: 100ms) which batches updates and reduces\n * re-render frequency during streaming.\n */\n if (message.role === 'user') {\n return <UserMessage message={message as UserMessageType} />;\n }\n return <AssistantMessage message={message as AssistantMessageType} />;\n};\n"],"names":["MarkdownStyles","styled","Typography","theme","colors","neutral100","borderRadius","neutral150","primary500","UserMessageTypography","isSchemaToolPart","part","type","capitalize","s","charAt","toUpperCase","slice","getSchemaLink","schema","isComponent","kind","modelType","uid","undefined","category","toMarkerFromSchemaTool","outSchemas","output","schemas","inSchemas","input","length","numSchemas","state","error","steps","map","index","id","toolCallId","name","description","status","action","link","title","MessageContent","_jsx","Markdown","components","a","node","props","target","rel","text","marker","Marker","UserMessage","message","hasText","parts","some","content","trim","attachments","filter","_jsxs","AnimatedBox","as","Flex","direction","alignItems","style","alignSelf","gap","maxWidth","Box","background","borderStyle","padding","hasRadius","attachment","idx","AttachmentPreview","filename","AssistantMessage","isLoading","upvoteMessage","useFeedback","openFeedbackModal","useFeedbackModal","IconButton","label","size","variant","onClick","ThumbUp","ThumbDown","ChatMessage","role"],"mappings":";;;;;;;;;;;;;;;;;AAkBA,MAAMA,cAAAA,GAAiBC,uBAAAA,CAAOC,uBAAAA,CAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAsCnB,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACC,UAAU,CAAC;;AAE5C,mBAAA,EAAE,CAAC,EAAEF,KAAK,EAAE,GAAKA,KAAAA,CAAMG,YAAY,CAAC;kBACrC,EAAE,CAAC,EAAEH,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACG,UAAU,CAAC;;;;;;;;WAQhD,EAAE,CAAC,EAAEJ,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACI,UAAU,CAAC;sBAC9B,EAAE,CAAC,EAAEL,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACC,UAAU,CAAC;;AAE5C,mBAAA,EAAE,CAAC,EAAEF,KAAK,EAAE,GAAKA,KAAAA,CAAMG,YAAY,CAAC;kBACrC,EAAE,CAAC,EAAEH,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACG,UAAU,CAAC;;;;;;;;AAQ3D,CAAC;AAED,MAAME,qBAAAA,GAAwBR,uBAAAA,CAAOC,uBAAAA,CAAW;;;AAGhD,CAAC;AAsBD,MAAMQ,gBAAAA,GAAmB,CAACC,IAAAA,GACxBA,IAAAA,IAAQ,OAAOA,IAAAA,KAAS,QAAA,IAAYA,IAAAA,CAAKC,IAAI,KAAK,2BAAA;AAEpD,MAAMC,UAAAA,GAAa,CAACC,CAAAA,GAAgBA,CAAAA,GAAIA,CAAAA,CAAEC,MAAM,CAAC,CAAA,CAAA,CAAGC,WAAW,EAAA,GAAKF,CAAAA,CAAEG,KAAK,CAAC,CAAA,CAAA,GAAK,EAAA;AAEjF,MAAMC,gBAAgB,CAACC,MAAAA,GAAAA;IACrB,MAAMC,WAAAA,GAAc,CAACD,MAAAA,CAAOE,IAAI,IAAIF,MAAAA,CAAOG,SAAQ,MAAO,WAAA;AAC1D,IAAA,IAAI,CAACH,MAAAA,CAAOI,GAAG,EAAE,OAAOC,SAAAA;AACxB,IAAA,OAAOJ,cACH,CAAC,mDAAmD,EAAED,MAAAA,CAAOM,QAAQ,IAAI,EAAA,CAAG,CAAC,EAAEN,MAAAA,CAAOI,GAAG,EAAE,GAC3F,CAAC,4CAA4C,EAAEJ,MAAAA,CAAOI,GAAG,CAAA,CAAE;AACjE,CAAA;AAEA,MAAMG,yBAAyB,CAACf,IAAAA,GAAAA;AAC9B,IAAA,MAAMgB,UAAAA,GAAahB,IAAAA,CAAKiB,MAAM,EAAEC,WAAW,EAAE;AAC7C,IAAA,MAAMC,SAAAA,GAAYnB,IAAAA,CAAKoB,KAAK,EAAEF,WAAW,EAAE;AAE3C,IAAA,MAAMA,OAAAA,GAAWF,UAAAA,CAAWK,MAAM,GAAGL,UAAAA,GAAaG,SAAAA;IAClD,MAAMG,UAAAA,GAAaJ,QAAQG,MAAM;IAEjC,MAAME,KAAAA,GAAyCvB,IAAAA,CAAKiB,MAAM,GACtDjB,IAAAA,CAAKiB,MAAM,CAACO,KAAK,GACf,OAAA,GACA,SAAA,GACF,SAAA;AAEJ,IAAA,MAAMC,QAAQP,OAAAA,CAAQQ,GAAG,CAAC,CAAClB,MAAAA,EAAQmB,SAAW;AAC5CC,YAAAA,EAAAA,EAAI,CAAA,EAAG5B,IAAAA,CAAK6B,UAAU,IAAI,sBAAA,CAAuB,CAAC,EAAErB,MAAAA,CAAOI,GAAG,IAAIJ,MAAAA,CAAOsB,IAAI,IAAIH,KAAAA,CAAAA,CAAO;AACxFI,YAAAA,WAAAA,EAAa7B,WAAWM,MAAAA,CAAOsB,IAAI,IAAItB,MAAAA,CAAOI,GAAG,IAAI,QAAA,CAAA;AACrDoB,YAAAA,MAAAA,EACExB,MAAAA,CAAOyB,MAAM,KAAK,QAAA,IAAYzB,OAAOyB,MAAM,KAAK,QAAA,IAAYzB,MAAAA,CAAOyB,MAAM,KAAK,QAAA,GAC1EzB,MAAAA,CAAOyB,MAAM,GACZ,QAAA;AACPC,YAAAA,IAAAA,EAAM3B,aAAAA,CAAcC,MAAAA;SACtB,CAAA,CAAA;IAEA,MAAM2B,KAAAA,GACJZ,UAAU,SAAA,GACN,CAAC,QAAQ,EAAED,UAAAA,CAAW,OAAO,EAAEA,UAAAA,KAAe,CAAA,GAAI,KAAK,GAAA,CAAA,CAAK,GAC5DC,KAAAA,KAAU,OAAA,GACR,CAAC,uBAAuB,EAAED,UAAAA,KAAe,CAAA,GAAI,EAAA,GAAK,GAAA,CAAA,CAAK,GACvD,kBAAA;IAER,OAAO;QACLrB,IAAAA,EAAM,QAAA;AACNkC,QAAAA,KAAAA;AACAZ,QAAAA,KAAAA;AACAE,QAAAA;AACF,KAAA;AACF,CAAA;AAEA,MAAMW,cAAAA,GAAiB,CAAC,EACtBpC,IAAI,EAIL,GAAA;IACC,IAAIA,IAAAA,CAAKC,IAAI,KAAK,MAAA,EAAQ;AACxB,QAAA,qBACEoC,cAAA,CAAChD,cAAAA,EAAAA;AACC,YAAA,QAAA,gBAAAgD,cAAA,CAACC,yBAAAA,EAAAA;gBACCC,UAAAA,EAAY;AACVC,oBAAAA,CAAAA,EAAG,CAAC,EAAEC,IAAI,EAAE,GAAGC,KAAAA,EAAO,iBAAKL,cAAA,CAACG,GAAAA,EAAAA;4BAAEG,MAAAA,EAAO,QAAA;4BAASC,GAAAA,EAAI,qBAAA;AAAuB,4BAAA,GAAGF;;AAC9E,iBAAA;AAEC1C,gBAAAA,QAAAA,EAAAA,IAAAA,CAAK6C;;;AAId,IAAA;AAEA,IAAA,IAAI9C,iBAAiBC,IAAAA,CAAAA,EAAO;AAC1B,QAAA,MAAM8C,SAAS/B,sBAAAA,CAAuBf,IAAAA,CAAAA;AACtC,QAAA,qBAAOqC,cAAA,CAACU,aAAAA,EAAAA;AAAQ,YAAA,GAAGD;;AACrB,IAAA;IAEA,OAAO,IAAA;AACT,CAAA;AAEA,MAAME,WAAAA,GAAc,CAAC,EAAEC,OAAO,EAAgC,GAAA;AAC5D,IAAA,MAAMC,UAAUD,OAAAA,CAAQE,KAAK,CAACC,IAAI,CAChC,CAACC,OAAAA,GAAYA,OAAAA,CAAQpD,IAAI,KAAK,MAAA,IAAUoD,OAAAA,CAAQR,IAAI,CAACS,IAAI,EAAA,KAAO,EAAA,CAAA;IAElE,MAAMC,WAAAA,GAAcN,OAAAA,CAAQE,KAAK,CAACK,MAAM,CAAC,CAACH,OAAAA,GAAYA,OAAAA,CAAQpD,IAAI,KAAK,MAAA,CAAA;AAEvE,IAAA,qBACEwD,eAAA,CAACC,uBAAAA,EAAAA;QACCC,EAAAA,EAAIC,iBAAAA;QACJC,SAAAA,EAAU,QAAA;QACVC,UAAAA,EAAW,UAAA;QACXC,KAAAA,EAAO;YAAEC,SAAAA,EAAW;AAAW,SAAA;QAC/BC,GAAAA,EAAK,CAAA;QACLC,QAAAA,EAAS,KAAA;;AAERhB,YAAAA,OAAAA,iBACCb,cAAA,CAAC8B,gBAAAA,EAAAA;gBAAIC,UAAAA,EAAW,YAAA;gBAAaC,WAAAA,EAAY,MAAA;gBAAOC,OAAAA,EAAS;AAAC,oBAAA,MAAA;AAAQ,oBAAA;AAAO,iBAAA;gBAAEC,SAAS,EAAA,IAAA;AACjFtB,gBAAAA,QAAAA,EAAAA,OAAAA,CAAQE,KAAK,CAACzB,GAAG,CAAC,CAAC2B,OAAAA,EAAS1B,KAAAA,GAAAA;AAC3B,oBAAA,IAAI0B,OAAAA,CAAQpD,IAAI,KAAK,MAAA,EAAQ,OAAO,IAAA;AACpC,oBAAA,qBAAOoC,cAAA,CAACvC,qBAAAA,EAAAA;AAAmCuD,wBAAAA,QAAAA,EAAAA,OAAAA,CAAQR;AAAhBlB,qBAAAA,EAAAA,KAAAA,CAAAA;AACrC,gBAAA,CAAA;AAEA,aAAA,CAAA,GAAA,IAAA;AAGH4B,YAAAA,WAAAA,CAAY7B,GAAG,CAAC,CAAC8C,UAAAA,EAAYC,oBAC5BpC,cAAA,CAACqC,mCAAAA,EAAAA;;oBAGCF,UAAAA,EAAY;AAAE,wBAAA,GAAGA,UAAU;wBAAExC,MAAAA,EAAQ;AAAQ;AAFxC,iBAAA,EAAA,CAAA,EAAGwC,UAAAA,CAAWvE,IAAI,KAAK,MAAA,GAASuE,UAAAA,CAAWG,QAAQ,GAAGH,UAAAA,CAAWvE,IAAI,CAAC,CAAC,EAAEwE,GAAAA,CAAAA,CAAK,CAAA;;;AAO7F,CAAA;AAEA,MAAMG,mBAAmB,CAAC,EACxB3B,OAAO,EACP4B,SAAS,EAIV,GAAA;IACC,MAAM,EAAEC,aAAa,EAAE,GAAGC,uBAAAA,EAAAA;IAC1B,MAAM,EAAEC,iBAAiB,EAAE,GAAGC,8BAAAA,EAAAA;AAE9B,IAAA,qBACExB,eAAA,CAACU,gBAAAA,EAAAA;QAAIJ,KAAAA,EAAO;YAAEC,SAAAA,EAAW;AAAa,SAAA;QAAGE,QAAAA,EAAS,KAAA;;AAC/CjB,YAAAA,OAAAA,CAAQE,KAAK,CAACzB,GAAG,CAAC,CAAC2B,OAAAA,EAAS1B,sBAC3BU,cAAA,CAACD,cAAAA,EAAAA;oBAA2BpC,IAAAA,EAAMqD;AAAb1B,iBAAAA,EAAAA,KAAAA,CAAAA,CAAAA;AAEtBkD,YAAAA,SAAAA,iBACCpB,eAAA,CAACG,iBAAAA,EAAAA;gBAAKK,GAAAA,EAAK,CAAA;;kCACT5B,cAAA,CAAC6C,uBAAAA,EAAAA;wBACCC,KAAAA,EAAM,QAAA;wBACNC,IAAAA,EAAK,IAAA;wBACLC,OAAAA,EAAQ,OAAA;wBACRC,OAAAA,EAAS,IAAMR,aAAAA,CAAc7B,OAAAA,CAAQrB,EAAE,CAAA;AAEvC,wBAAA,QAAA,gBAAAS,cAAA,CAACkD,aAAAA,EAAAA,EAAAA;;kCAEHlD,cAAA,CAAC6C,uBAAAA,EAAAA;wBACCC,KAAAA,EAAM,UAAA;wBACNC,IAAAA,EAAK,IAAA;wBACLC,OAAAA,EAAQ,OAAA;;wBAERC,OAAAA,EAAS,IAAMN,iBAAAA,CAAkB/B,OAAAA,CAAQrB,EAAE,CAAA;AAE3C,wBAAA,QAAA,gBAAAS,cAAA,CAACmD,eAAAA,EAAAA,EAAAA;;;AAGH,aAAA,CAAA,GAAA;;;AAGV,CAAA;MAEaC,WAAAA,GAAc,CAAC,EAC1BxC,OAAO,EACP4B,SAAS,EAIV,GAAA;AACC;;;;;AAKC,MACD,IAAI5B,OAAAA,CAAQyC,IAAI,KAAK,MAAA,EAAQ;AAC3B,QAAA,qBAAOrD,cAAA,CAACW,WAAAA,EAAAA;YAAYC,OAAAA,EAASA;;AAC/B,IAAA;AACA,IAAA,qBAAOZ,cAAA,CAACuC,gBAAAA,EAAAA;QAAiB3B,OAAAA,EAASA;;AACpC;;;;"}
@@ -4,7 +4,8 @@ var jsxRuntime = require('react/jsx-runtime');
4
4
  var React = require('react');
5
5
  var designSystem = require('@strapi/design-system');
6
6
 
7
- function _interopNamespaceDefault(e) {
7
+ function _interopNamespace(e) {
8
+ if (e && e.__esModule) return e;
8
9
  var n = Object.create(null);
9
10
  if (e) {
10
11
  Object.keys(e).forEach(function (k) {
@@ -21,7 +22,7 @@ function _interopNamespaceDefault(e) {
21
22
  return Object.freeze(n);
22
23
  }
23
24
 
24
- var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
25
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
25
26
 
26
27
  const SimpleMenu = /*#__PURE__*/ React__namespace.forwardRef(({ children, onOpen, onClose, popoverPlacement, ...props }, forwardedRef)=>{
27
28
  const triggerRef = React__namespace.useRef(null);
@@ -1 +1 @@
1
- {"version":3,"file":"SimpleMenu.js","sources":["../../../../../admin/src/components/AIChat/components/SimpleMenu.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Menu, useComposedRefs } from '@strapi/design-system';\n\n/* -------------------------------------------------------------------------------------------------\n * SimpleMenu\n * -----------------------------------------------------------------------------------------------*/\n\ntype SimpleMenuProps = Menu.TriggerProps &\n Pick<Menu.ContentProps, 'popoverPlacement' | 'intersectionId'> & {\n children?: React.ReactNode;\n onOpen?: () => void;\n onClose?: () => void;\n };\n\nconst SimpleMenu = React.forwardRef<HTMLButtonElement, SimpleMenuProps>(\n ({ children, onOpen, onClose, popoverPlacement, ...props }, forwardedRef) => {\n const triggerRef = React.useRef<HTMLButtonElement>(null);\n const composedRef = useComposedRefs(forwardedRef, triggerRef);\n\n const handleOpenChange = (isOpen: boolean) => {\n if (isOpen && typeof onOpen === 'function') {\n onOpen();\n } else if (!isOpen && typeof onClose === 'function') {\n onClose();\n }\n };\n\n return (\n <Menu.Root onOpenChange={handleOpenChange}>\n <Menu.Trigger ref={composedRef} {...props}>\n {props.label}\n </Menu.Trigger>\n <Menu.Content zIndex={10000} popoverPlacement={popoverPlacement}>\n {children}\n </Menu.Content>\n </Menu.Root>\n );\n }\n);\n\nconst MenuItem = Menu.Item;\ntype MenuItemProps = Menu.ItemProps;\n\nexport { SimpleMenu, MenuItem, Menu };\nexport type { SimpleMenuProps, MenuItemProps };\n"],"names":["SimpleMenu","React","forwardRef","children","onOpen","onClose","popoverPlacement","props","forwardedRef","triggerRef","useRef","composedRef","useComposedRefs","handleOpenChange","isOpen","_jsxs","Menu","Root","onOpenChange","_jsx","Trigger","ref","label","Content","zIndex","MenuItem","Item"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAeA,MAAMA,2BAAaC,gBAAAA,CAAMC,UAAU,CACjC,CAAC,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,OAAO,EAAEC,gBAAgB,EAAE,GAAGC,OAAO,EAAEC,YAAAA,GAAAA;IAC1D,MAAMC,UAAAA,GAAaR,gBAAAA,CAAMS,MAAM,CAAoB,IAAA,CAAA;IACnD,MAAMC,WAAAA,GAAcC,6BAAgBJ,YAAAA,EAAcC,UAAAA,CAAAA;AAElD,IAAA,MAAMI,mBAAmB,CAACC,MAAAA,GAAAA;QACxB,IAAIA,MAAAA,IAAU,OAAOV,MAAAA,KAAW,UAAA,EAAY;AAC1CA,YAAAA,MAAAA,EAAAA;AACF,QAAA,CAAA,MAAO,IAAI,CAACU,MAAAA,IAAU,OAAOT,YAAY,UAAA,EAAY;AACnDA,YAAAA,OAAAA,EAAAA;AACF,QAAA;AACF,IAAA,CAAA;IAEA,qBACEU,eAAA,CAACC,kBAAKC,IAAI,EAAA;QAACC,YAAAA,EAAcL,gBAAAA;;AACvB,0BAAAM,cAAA,CAACH,kBAAKI,OAAO,EAAA;gBAACC,GAAAA,EAAKV,WAAAA;AAAc,gBAAA,GAAGJ,KAAK;AACtCA,gBAAAA,QAAAA,EAAAA,KAAAA,CAAMe;;AAET,0BAAAH,cAAA,CAACH,kBAAKO,OAAO,EAAA;gBAACC,MAAAA,EAAQ,KAAA;gBAAOlB,gBAAAA,EAAkBA,gBAAAA;AAC5CH,gBAAAA,QAAAA,EAAAA;;;;AAIT,CAAA;AAGF,MAAMsB,QAAAA,GAAWT,kBAAKU;;;;;;;;;"}
1
+ {"version":3,"file":"SimpleMenu.js","sources":["../../../../../admin/src/components/AIChat/components/SimpleMenu.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Menu, useComposedRefs } from '@strapi/design-system';\n\n/* -------------------------------------------------------------------------------------------------\n * SimpleMenu\n * -----------------------------------------------------------------------------------------------*/\n\ntype SimpleMenuProps = Menu.TriggerProps &\n Pick<Menu.ContentProps, 'popoverPlacement' | 'intersectionId'> & {\n children?: React.ReactNode;\n onOpen?: () => void;\n onClose?: () => void;\n };\n\nconst SimpleMenu = React.forwardRef<HTMLButtonElement, SimpleMenuProps>(\n ({ children, onOpen, onClose, popoverPlacement, ...props }, forwardedRef) => {\n const triggerRef = React.useRef<HTMLButtonElement>(null);\n const composedRef = useComposedRefs(forwardedRef, triggerRef);\n\n const handleOpenChange = (isOpen: boolean) => {\n if (isOpen && typeof onOpen === 'function') {\n onOpen();\n } else if (!isOpen && typeof onClose === 'function') {\n onClose();\n }\n };\n\n return (\n <Menu.Root onOpenChange={handleOpenChange}>\n <Menu.Trigger ref={composedRef} {...props}>\n {props.label}\n </Menu.Trigger>\n <Menu.Content zIndex={10000} popoverPlacement={popoverPlacement}>\n {children}\n </Menu.Content>\n </Menu.Root>\n );\n }\n);\n\nconst MenuItem = Menu.Item;\ntype MenuItemProps = Menu.ItemProps;\n\nexport { SimpleMenu, MenuItem, Menu };\nexport type { SimpleMenuProps, MenuItemProps };\n"],"names":["SimpleMenu","React","forwardRef","children","onOpen","onClose","popoverPlacement","props","forwardedRef","triggerRef","useRef","composedRef","useComposedRefs","handleOpenChange","isOpen","_jsxs","Menu","Root","onOpenChange","_jsx","Trigger","ref","label","Content","zIndex","MenuItem","Item"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAeA,MAAMA,2BAAaC,gBAAAA,CAAMC,UAAU,CACjC,CAAC,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,OAAO,EAAEC,gBAAgB,EAAE,GAAGC,OAAO,EAAEC,YAAAA,GAAAA;IAC1D,MAAMC,UAAAA,GAAaR,gBAAAA,CAAMS,MAAM,CAAoB,IAAA,CAAA;IACnD,MAAMC,WAAAA,GAAcC,6BAAgBJ,YAAAA,EAAcC,UAAAA,CAAAA;AAElD,IAAA,MAAMI,mBAAmB,CAACC,MAAAA,GAAAA;QACxB,IAAIA,MAAAA,IAAU,OAAOV,MAAAA,KAAW,UAAA,EAAY;AAC1CA,YAAAA,MAAAA,EAAAA;AACF,QAAA,CAAA,MAAO,IAAI,CAACU,MAAAA,IAAU,OAAOT,YAAY,UAAA,EAAY;AACnDA,YAAAA,OAAAA,EAAAA;AACF,QAAA;AACF,IAAA,CAAA;IAEA,qBACEU,eAAA,CAACC,kBAAKC,IAAI,EAAA;QAACC,YAAAA,EAAcL,gBAAAA;;AACvB,0BAAAM,cAAA,CAACH,kBAAKI,OAAO,EAAA;gBAACC,GAAAA,EAAKV,WAAAA;AAAc,gBAAA,GAAGJ,KAAK;AACtCA,gBAAAA,QAAAA,EAAAA,KAAAA,CAAMe;;AAET,0BAAAH,cAAA,CAACH,kBAAKO,OAAO,EAAA;gBAACC,MAAAA,EAAQ,KAAA;gBAAOlB,gBAAAA,EAAkBA,gBAAAA;AAC5CH,gBAAAA,QAAAA,EAAAA;;;;AAIT,CAAA;AAGF,MAAMsB,QAAAA,GAAWT,kBAAKU;;;;;;;;;"}
@@ -7,6 +7,11 @@ var misc = require('../lib/misc.js');
7
7
  var ChatProvider = require('../providers/ChatProvider.js');
8
8
  var useAIFetch = require('./useAIFetch.js');
9
9
 
10
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
11
+
12
+ var JSZip__default = /*#__PURE__*/_interopDefault(JSZip);
13
+ var micromatch__default = /*#__PURE__*/_interopDefault(micromatch);
14
+
10
15
  const ALLOWED_EXTENSIONS = [
11
16
  '.ts',
12
17
  '.tsx',
@@ -32,7 +37,7 @@ const DEFAULT_IGNORE_PATTERNS = [
32
37
  ];
33
38
  const isAllowedFile = (filename, ignorePatterns = [])=>{
34
39
  // Check if file matches any ignore pattern
35
- if (micromatch.isMatch(filename, [
40
+ if (micromatch__default.default.isMatch(filename, [
36
41
  ...DEFAULT_IGNORE_PATTERNS,
37
42
  ...ignorePatterns
38
43
  ])) {
@@ -54,7 +59,7 @@ const isAllowedFile = (filename, ignorePatterns = [])=>{
54
59
  /* -------------------------------------------------------------------------------------------------
55
60
  * Zip file processing
56
61
  * -----------------------------------------------------------------------------------------------*/ async function openZipFile(file, options = {}) {
57
- const zip = new JSZip();
62
+ const zip = new JSZip__default.default();
58
63
  const contents = await zip.loadAsync(file);
59
64
  const processedFiles = [];
60
65
  // Process all files in parallel
@@ -1 +1 @@
1
- {"version":3,"file":"useCodeUpload.js","sources":["../../../../../admin/src/components/AIChat/hooks/useCodeUpload.ts"],"sourcesContent":["import { useState } from 'react';\n\nimport JSZip from 'jszip';\nimport micromatch from 'micromatch';\n\nimport { generateId } from '../lib/misc';\nimport { Attachment } from '../lib/types/attachments';\nimport { useStrapiChat } from '../providers/ChatProvider';\n\nimport { useFetchUploadProject } from './useAIFetch';\n\nexport interface ProjectFile {\n path: string;\n content: string;\n}\n\nconst ALLOWED_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx', '.md', '.json'];\nconst MAX_LINES_PER_FILE = 5000; // Maximum number of lines per file\n\n// Common patterns to ignore\nconst DEFAULT_IGNORE_PATTERNS = [\n '**/node_modules/**',\n '**/.git/**',\n '**/.next/**',\n '**/dist/**',\n '**/build/**',\n '**/.cache/**',\n '**/coverage/**',\n '**/test/**',\n '**/__tests__/**',\n '**/*.test.*',\n '**/*.spec.*',\n];\n\nconst isAllowedFile = (filename: string, ignorePatterns: string[] = []) => {\n // Check if file matches any ignore pattern\n if (micromatch.isMatch(filename, [...DEFAULT_IGNORE_PATTERNS, ...ignorePatterns])) {\n return false;\n }\n\n // Check if file has allowed extension\n return ALLOWED_EXTENSIONS.some((ext) => filename.toLowerCase().endsWith(ext));\n};\n\n/**\n * Prunes file content if it exceeds MAX_LINES\n */\nconst pruneFileContent = (content: string): string => {\n const lines = content.split('\\n');\n\n if (lines.length <= MAX_LINES_PER_FILE) {\n return content;\n }\n\n const truncated = lines.slice(0, MAX_LINES_PER_FILE).join('\\n');\n\n return `${truncated}\\n\\n// ... [${lines.length - MAX_LINES_PER_FILE} lines truncated, file too long] ...\\n\\n`;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * File processing options\n * -----------------------------------------------------------------------------------------------*/\nexport interface ProcessOptions {\n /**\n * Additional glob patterns to ignore\n */\n ignorePatterns?: string[];\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Zip file processing\n * -----------------------------------------------------------------------------------------------*/\nexport async function openZipFile(\n file: File,\n options: ProcessOptions = {}\n): Promise<ProjectFile[]> {\n const zip = new JSZip();\n const contents = await zip.loadAsync(file);\n const processedFiles: ProjectFile[] = [];\n\n // Process all files in parallel\n await Promise.all(\n Object.keys(contents.files).map(async (filename) => {\n const zipEntry = contents.files[filename];\n\n // Skip directories and non-allowed files\n if (zipEntry.dir || !isAllowedFile(filename, options.ignorePatterns)) {\n return;\n }\n\n try {\n const content = await zipEntry.async('string');\n processedFiles.push({\n path: filename,\n content: pruneFileContent(content),\n });\n } catch (err) {\n console.warn(`Failed to read file ${filename}:`, err);\n }\n })\n );\n\n // Sort files by path for consistency\n return processedFiles.sort((a, b) => a.path.localeCompare(b.path));\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Folder processing\n * -----------------------------------------------------------------------------------------------*/\nexport async function processFolder(\n files: FileList | File[],\n options: ProcessOptions = {}\n): Promise<{ files: ProjectFile[]; projectName: string }> {\n const processedFiles: ProjectFile[] = [];\n let folderName = 'Project';\n\n // Extract folder name from the first file's path\n if (files.length > 0) {\n const firstFile = files[0];\n const folderPath = firstFile.webkitRelativePath || '';\n const pathParts = folderPath.split('/');\n if (pathParts.length > 0 && pathParts[0]) {\n folderName = pathParts[0];\n }\n }\n\n // Process all files in parallel\n await Promise.all(\n Array.from(files).map(async (file) => {\n const filePath = file.webkitRelativePath || file.name;\n\n // Skip non-allowed files\n if (!isAllowedFile(filePath, options.ignorePatterns)) {\n return;\n }\n\n try {\n const content = await file.text();\n processedFiles.push({\n // Remove the root folder name from the path\n path: filePath.includes('/') ? filePath.substring(filePath.indexOf('/') + 1) : filePath,\n content: pruneFileContent(content),\n });\n } catch (err) {\n console.warn(`Failed to read file ${filePath}:`, err);\n }\n })\n );\n\n // Sort files by path for consistency\n return {\n files: processedFiles.sort((a, b) => a.path.localeCompare(b.path)),\n projectName: folderName,\n };\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Zip file processing\n * -----------------------------------------------------------------------------------------------*/\nexport async function processZipFile(\n file: File,\n options: ProcessOptions = {}\n): Promise<{ files: ProjectFile[]; projectName: string }> {\n const projectName = file.name.replace('.zip', '');\n const files = await openZipFile(file, options);\n\n return {\n files,\n projectName,\n };\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Upload files\n * -----------------------------------------------------------------------------------------------*/\n\ninterface UseCodeUploadOptions {\n onSuccess?: (attachment: Attachment, projectName: string) => void;\n onError?: (error: string) => void;\n}\n\nexport function useCodeUpload({ onSuccess, onError }: UseCodeUploadOptions = {}) {\n const [error, setError] = useState<string | null>(null);\n const [isProcessing, setIsProcessing] = useState(false);\n const {\n fetch: fetchUploadProject,\n isPending: isFetching,\n error: fetchError,\n } = useFetchUploadProject();\n const { id: chatId } = useStrapiChat();\n\n /**\n * Upload processed files to the server\n */\n const processFiles = async (projectName: string, processedFiles: ProjectFile[]) => {\n // Upload to server\n const result = await fetchUploadProject({\n body: {\n chatId,\n name: projectName,\n type: 'code',\n files: processedFiles,\n },\n });\n\n if (!result?.data) {\n throw new Error('Failed to upload project');\n }\n\n return result.data;\n };\n\n const handleZipFile = async (file: File) => {\n try {\n setError(null);\n setIsProcessing(true);\n\n const { files: processedFiles, projectName } = await processZipFile(file, {\n ignorePatterns: ['**/node_modules/**'],\n });\n\n const projectAttachment = await processFiles(projectName, processedFiles);\n\n onSuccess?.({ ...projectAttachment, id: generateId(), status: 'ready' }, projectName);\n return projectAttachment;\n } catch (err) {\n setError('Failed to process zip file');\n onError?.('Failed to process zip file');\n console.error('Error processing zip:', err);\n throw err;\n } finally {\n setIsProcessing(false);\n }\n };\n\n const handleFolder = async (files: FileList | File[]) => {\n try {\n setError(null);\n setIsProcessing(true);\n\n const { files: processedFiles, projectName } = await processFolder(files, {\n ignorePatterns: ['**/node_modules/**'],\n });\n\n const projectAttachment = await processFiles(projectName, processedFiles);\n\n onSuccess?.({ ...projectAttachment, id: generateId(), status: 'ready' }, projectName);\n return projectAttachment;\n } catch (err) {\n setError('Failed to process folder');\n onError?.('Failed to process folder');\n console.error('Error processing folder:', err);\n throw err;\n } finally {\n setIsProcessing(false);\n }\n };\n\n return {\n processZipFile: handleZipFile,\n processFolder: handleFolder,\n isLoading: isProcessing || isFetching,\n error: fetchError || error,\n };\n}\n"],"names":["ALLOWED_EXTENSIONS","MAX_LINES_PER_FILE","DEFAULT_IGNORE_PATTERNS","isAllowedFile","filename","ignorePatterns","micromatch","isMatch","some","ext","toLowerCase","endsWith","pruneFileContent","content","lines","split","length","truncated","slice","join","openZipFile","file","options","zip","JSZip","contents","loadAsync","processedFiles","Promise","all","Object","keys","files","map","zipEntry","dir","async","push","path","err","console","warn","sort","a","b","localeCompare","processFolder","folderName","firstFile","folderPath","webkitRelativePath","pathParts","Array","from","filePath","name","text","includes","substring","indexOf","projectName","processZipFile","replace","useCodeUpload","onSuccess","onError","error","setError","useState","isProcessing","setIsProcessing","fetch","fetchUploadProject","isPending","isFetching","fetchError","useFetchUploadProject","id","chatId","useStrapiChat","processFiles","result","body","type","data","Error","handleZipFile","projectAttachment","generateId","status","handleFolder","isLoading"],"mappings":"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"}
1
+ {"version":3,"file":"useCodeUpload.js","sources":["../../../../../admin/src/components/AIChat/hooks/useCodeUpload.ts"],"sourcesContent":["import { useState } from 'react';\n\nimport JSZip from 'jszip';\nimport micromatch from 'micromatch';\n\nimport { generateId } from '../lib/misc';\nimport { Attachment } from '../lib/types/attachments';\nimport { useStrapiChat } from '../providers/ChatProvider';\n\nimport { useFetchUploadProject } from './useAIFetch';\n\nexport interface ProjectFile {\n path: string;\n content: string;\n}\n\nconst ALLOWED_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx', '.md', '.json'];\nconst MAX_LINES_PER_FILE = 5000; // Maximum number of lines per file\n\n// Common patterns to ignore\nconst DEFAULT_IGNORE_PATTERNS = [\n '**/node_modules/**',\n '**/.git/**',\n '**/.next/**',\n '**/dist/**',\n '**/build/**',\n '**/.cache/**',\n '**/coverage/**',\n '**/test/**',\n '**/__tests__/**',\n '**/*.test.*',\n '**/*.spec.*',\n];\n\nconst isAllowedFile = (filename: string, ignorePatterns: string[] = []) => {\n // Check if file matches any ignore pattern\n if (micromatch.isMatch(filename, [...DEFAULT_IGNORE_PATTERNS, ...ignorePatterns])) {\n return false;\n }\n\n // Check if file has allowed extension\n return ALLOWED_EXTENSIONS.some((ext) => filename.toLowerCase().endsWith(ext));\n};\n\n/**\n * Prunes file content if it exceeds MAX_LINES\n */\nconst pruneFileContent = (content: string): string => {\n const lines = content.split('\\n');\n\n if (lines.length <= MAX_LINES_PER_FILE) {\n return content;\n }\n\n const truncated = lines.slice(0, MAX_LINES_PER_FILE).join('\\n');\n\n return `${truncated}\\n\\n// ... [${lines.length - MAX_LINES_PER_FILE} lines truncated, file too long] ...\\n\\n`;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * File processing options\n * -----------------------------------------------------------------------------------------------*/\nexport interface ProcessOptions {\n /**\n * Additional glob patterns to ignore\n */\n ignorePatterns?: string[];\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Zip file processing\n * -----------------------------------------------------------------------------------------------*/\nexport async function openZipFile(\n file: File,\n options: ProcessOptions = {}\n): Promise<ProjectFile[]> {\n const zip = new JSZip();\n const contents = await zip.loadAsync(file);\n const processedFiles: ProjectFile[] = [];\n\n // Process all files in parallel\n await Promise.all(\n Object.keys(contents.files).map(async (filename) => {\n const zipEntry = contents.files[filename];\n\n // Skip directories and non-allowed files\n if (zipEntry.dir || !isAllowedFile(filename, options.ignorePatterns)) {\n return;\n }\n\n try {\n const content = await zipEntry.async('string');\n processedFiles.push({\n path: filename,\n content: pruneFileContent(content),\n });\n } catch (err) {\n console.warn(`Failed to read file ${filename}:`, err);\n }\n })\n );\n\n // Sort files by path for consistency\n return processedFiles.sort((a, b) => a.path.localeCompare(b.path));\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Folder processing\n * -----------------------------------------------------------------------------------------------*/\nexport async function processFolder(\n files: FileList | File[],\n options: ProcessOptions = {}\n): Promise<{ files: ProjectFile[]; projectName: string }> {\n const processedFiles: ProjectFile[] = [];\n let folderName = 'Project';\n\n // Extract folder name from the first file's path\n if (files.length > 0) {\n const firstFile = files[0];\n const folderPath = firstFile.webkitRelativePath || '';\n const pathParts = folderPath.split('/');\n if (pathParts.length > 0 && pathParts[0]) {\n folderName = pathParts[0];\n }\n }\n\n // Process all files in parallel\n await Promise.all(\n Array.from(files).map(async (file) => {\n const filePath = file.webkitRelativePath || file.name;\n\n // Skip non-allowed files\n if (!isAllowedFile(filePath, options.ignorePatterns)) {\n return;\n }\n\n try {\n const content = await file.text();\n processedFiles.push({\n // Remove the root folder name from the path\n path: filePath.includes('/') ? filePath.substring(filePath.indexOf('/') + 1) : filePath,\n content: pruneFileContent(content),\n });\n } catch (err) {\n console.warn(`Failed to read file ${filePath}:`, err);\n }\n })\n );\n\n // Sort files by path for consistency\n return {\n files: processedFiles.sort((a, b) => a.path.localeCompare(b.path)),\n projectName: folderName,\n };\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Zip file processing\n * -----------------------------------------------------------------------------------------------*/\nexport async function processZipFile(\n file: File,\n options: ProcessOptions = {}\n): Promise<{ files: ProjectFile[]; projectName: string }> {\n const projectName = file.name.replace('.zip', '');\n const files = await openZipFile(file, options);\n\n return {\n files,\n projectName,\n };\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Upload files\n * -----------------------------------------------------------------------------------------------*/\n\ninterface UseCodeUploadOptions {\n onSuccess?: (attachment: Attachment, projectName: string) => void;\n onError?: (error: string) => void;\n}\n\nexport function useCodeUpload({ onSuccess, onError }: UseCodeUploadOptions = {}) {\n const [error, setError] = useState<string | null>(null);\n const [isProcessing, setIsProcessing] = useState(false);\n const {\n fetch: fetchUploadProject,\n isPending: isFetching,\n error: fetchError,\n } = useFetchUploadProject();\n const { id: chatId } = useStrapiChat();\n\n /**\n * Upload processed files to the server\n */\n const processFiles = async (projectName: string, processedFiles: ProjectFile[]) => {\n // Upload to server\n const result = await fetchUploadProject({\n body: {\n chatId,\n name: projectName,\n type: 'code',\n files: processedFiles,\n },\n });\n\n if (!result?.data) {\n throw new Error('Failed to upload project');\n }\n\n return result.data;\n };\n\n const handleZipFile = async (file: File) => {\n try {\n setError(null);\n setIsProcessing(true);\n\n const { files: processedFiles, projectName } = await processZipFile(file, {\n ignorePatterns: ['**/node_modules/**'],\n });\n\n const projectAttachment = await processFiles(projectName, processedFiles);\n\n onSuccess?.({ ...projectAttachment, id: generateId(), status: 'ready' }, projectName);\n return projectAttachment;\n } catch (err) {\n setError('Failed to process zip file');\n onError?.('Failed to process zip file');\n console.error('Error processing zip:', err);\n throw err;\n } finally {\n setIsProcessing(false);\n }\n };\n\n const handleFolder = async (files: FileList | File[]) => {\n try {\n setError(null);\n setIsProcessing(true);\n\n const { files: processedFiles, projectName } = await processFolder(files, {\n ignorePatterns: ['**/node_modules/**'],\n });\n\n const projectAttachment = await processFiles(projectName, processedFiles);\n\n onSuccess?.({ ...projectAttachment, id: generateId(), status: 'ready' }, projectName);\n return projectAttachment;\n } catch (err) {\n setError('Failed to process folder');\n onError?.('Failed to process folder');\n console.error('Error processing folder:', err);\n throw err;\n } finally {\n setIsProcessing(false);\n }\n };\n\n return {\n processZipFile: handleZipFile,\n processFolder: handleFolder,\n isLoading: isProcessing || isFetching,\n error: fetchError || error,\n };\n}\n"],"names":["ALLOWED_EXTENSIONS","MAX_LINES_PER_FILE","DEFAULT_IGNORE_PATTERNS","isAllowedFile","filename","ignorePatterns","micromatch","isMatch","some","ext","toLowerCase","endsWith","pruneFileContent","content","lines","split","length","truncated","slice","join","openZipFile","file","options","zip","JSZip","contents","loadAsync","processedFiles","Promise","all","Object","keys","files","map","zipEntry","dir","async","push","path","err","console","warn","sort","a","b","localeCompare","processFolder","folderName","firstFile","folderPath","webkitRelativePath","pathParts","Array","from","filePath","name","text","includes","substring","indexOf","projectName","processZipFile","replace","useCodeUpload","onSuccess","onError","error","setError","useState","isProcessing","setIsProcessing","fetch","fetchUploadProject","isPending","isFetching","fetchError","useFetchUploadProject","id","chatId","useStrapiChat","processFiles","result","body","type","data","Error","handleZipFile","projectAttachment","generateId","status","handleFolder","isLoading"],"mappings":"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"}
@@ -4,6 +4,12 @@ var isEqual = require('lodash/isEqual');
4
4
  var omit = require('lodash/omit');
5
5
  var pluralize = require('pluralize');
6
6
 
7
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
8
+
9
+ var isEqual__default = /*#__PURE__*/_interopDefault(isEqual);
10
+ var omit__default = /*#__PURE__*/_interopDefault(omit);
11
+ var pluralize__default = /*#__PURE__*/_interopDefault(pluralize);
12
+
7
13
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
8
14
  const isPluginContentTypeUid = (uid)=>uid.startsWith('plugin::');
9
15
  /**
@@ -42,13 +48,13 @@ const ACTION_TO_STATUS = {
42
48
  return 'NEW';
43
49
  }
44
50
  // Compare attributes without the status field to determine if they've changed
45
- const newAttrWithoutStatus = omit(newAttr, [
51
+ const newAttrWithoutStatus = omit__default.default(newAttr, [
46
52
  'status'
47
53
  ]);
48
- const oldAttrWithoutStatus = omit(oldAttr, [
54
+ const oldAttrWithoutStatus = omit__default.default(oldAttr, [
49
55
  'status'
50
56
  ]);
51
- if (!isEqual(newAttrWithoutStatus, oldAttrWithoutStatus)) {
57
+ if (!isEqual__default.default(newAttrWithoutStatus, oldAttrWithoutStatus)) {
52
58
  return 'CHANGED';
53
59
  }
54
60
  // If unchanged, keep the previous status
@@ -111,8 +117,8 @@ const ACTION_TO_STATUS = {
111
117
  *
112
118
  * We need to keep track of which changes have been made
113
119
  */ const transformChatToCTB = (schema, oldSchema)=>{
114
- const singularName = pluralize.singular(schema.name).toLowerCase().replace(/ /g, '-');
115
- const pluralName = pluralize.plural(schema.name).toLowerCase().replace(/ /g, '-');
120
+ const singularName = pluralize__default.default.singular(schema.name).toLowerCase().replace(/ /g, '-');
121
+ const pluralName = pluralize__default.default.plural(schema.name).toLowerCase().replace(/ /g, '-');
116
122
  if (schema.modelType === 'component') {
117
123
  return {
118
124
  category: schema.category || 'default',
@@ -1 +1 @@
1
- {"version":3,"file":"toCTB.js","sources":["../../../../../../../admin/src/components/AIChat/lib/transforms/schemas/toCTB.ts"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\nimport isEqual from 'lodash/isEqual';\nimport omit from 'lodash/omit';\nimport pluralize from 'pluralize';\n\nimport { Schema } from '../../types/schema';\n\nimport type { ContentType, Component, AnyAttribute } from '../../../../../types';\n\nconst isPluginContentTypeUid = (uid: string) => uid.startsWith('plugin::');\n\n/**\n * Plugin / extension content-types use server-derived identity (globalId, collectionName, …).\n * The AI chat uses a simplified shape that would otherwise overwrite those fields incorrectly.\n */\nconst isPluginContentType = (schema: Schema, oldSchema?: ContentType | Component): boolean => {\n if (schema.plugin || isPluginContentTypeUid(schema.uid)) {\n return true;\n }\n if (oldSchema && 'modelType' in oldSchema && oldSchema.modelType === 'contentType') {\n const ct = oldSchema as ContentType;\n return Boolean(ct.plugin) || isPluginContentTypeUid(String(ct.uid));\n }\n return false;\n};\n\nconst ACTION_TO_STATUS: Record<Schema['action'], ContentType['status']> = {\n create: 'NEW',\n remove: 'REMOVED',\n update: 'CHANGED',\n};\n\n/**\n * Creates a new attribute with the specified status\n */\nconst createAttributeWithStatus = (\n name: string,\n attributeData: Record<string, any>,\n status: AnyAttribute['status']\n): AnyAttribute =>\n ({\n ...attributeData,\n name,\n status,\n }) as AnyAttribute;\n\n/**\n * Determines the status of an attribute by comparing new and old versions\n */\nconst determineAttributeStatus = (\n newAttr: Record<string, any>,\n oldAttr?: AnyAttribute,\n oldSchema?: ContentType | Component\n): AnyAttribute['status'] => {\n if (!oldAttr) {\n return 'NEW';\n }\n\n // If the schema was already new, don't mark attributes as changed, keep them as new.\n if (oldSchema?.status === 'NEW') {\n return 'NEW';\n }\n\n // Compare attributes without the status field to determine if they've changed\n const newAttrWithoutStatus = omit(newAttr, ['status']);\n const oldAttrWithoutStatus = omit(oldAttr, ['status']);\n\n if (!isEqual(newAttrWithoutStatus, oldAttrWithoutStatus)) {\n return 'CHANGED';\n }\n\n // If unchanged, keep the previous status\n return oldAttr.status;\n};\n\n/**\n * Determines the status of a schema by comparing action and checking if oldSchema exists\n */\nconst transformStatusFromChatToCTB = (\n schema: Schema,\n oldSchema?: ContentType | Component\n): ContentType['status'] => {\n // If schema has an action, use the mapped status\n if (schema.action) {\n return ACTION_TO_STATUS[schema.action];\n }\n\n // If oldSchema doesn't exist, it's a new schema\n if (!oldSchema) {\n return 'NEW';\n }\n\n // If no action is specified and oldSchema exists, keep the existing status\n return oldSchema.status;\n};\n\n/**\n * Transform attributes from Chat format to CTB format\n * Also performs a diff to determine the status of each attribute\n */\nexport const transformAttributesFromChatToCTB = (\n { action, attributes }: Schema,\n oldSchema?: ContentType | Component\n): AnyAttribute[] => {\n // If it's a new schema or no oldAttributes provided, all attributes are NEW\n if (action === 'create' || !oldSchema) {\n return Object.entries(attributes).map(([name, attribute]) =>\n createAttributeWithStatus(name, attribute, 'NEW')\n );\n }\n\n // Convert old attributes array to a lookup map for faster access\n const oldAttributesMap = oldSchema.attributes.reduce(\n (acc, attr) => ({ ...acc, [attr.name]: attr }),\n {} as Record<string, AnyAttribute>\n );\n\n // Process current attributes (new and changed)\n const processedAttributes = Object.entries(attributes).map(([name, attr]) => {\n const oldAttr = oldAttributesMap[name];\n const status = determineAttributeStatus({ ...attr, name }, oldAttr, oldSchema);\n\n return createAttributeWithStatus(name, attr, status);\n });\n\n // No need to mark removed attributes if the old schema is new, just remove it from the list\n // TODO: Else a validation error occurs on the backend side.\n if (oldSchema?.status === 'NEW') {\n return processedAttributes;\n }\n\n // Find removed attributes (exist in old but not in new)\n const removedAttributes = Object.entries(oldAttributesMap)\n .filter(([name]) => !attributes[name])\n .map(([name, oldAttr]) => createAttributeWithStatus(name, oldAttr, 'REMOVED'));\n\n // Combine both sets of attributes\n return [...processedAttributes, ...removedAttributes];\n};\n\n/**\n * Transform schema format\n * AI chat -> CTB\n *\n * The AI chat returns a simplified format, and this layer transforms it to be compatible with the CTB reducer.\n *\n * We need to keep track of which changes have been made\n */\nexport const transformChatToCTB = (\n schema: Schema,\n oldSchema?: ContentType | Component\n): ContentType | Component => {\n const singularName = pluralize.singular(schema.name).toLowerCase().replace(/ /g, '-');\n const pluralName = pluralize.plural(schema.name).toLowerCase().replace(/ /g, '-');\n\n if (schema.modelType === 'component') {\n return {\n category: schema.category || 'default',\n modelName: singularName,\n attributes: transformAttributesFromChatToCTB(schema, oldSchema),\n info: {\n displayName: schema.name,\n description: schema.description,\n // TODO\n // icon: schema.icon,\n },\n modelType: schema.modelType,\n uid: schema.uid as any,\n collectionName: pluralName,\n status: transformStatusFromChatToCTB(schema, oldSchema),\n globalId: singularName,\n } satisfies Component;\n }\n\n const contentTypeBase = {\n uid: schema.uid as any,\n modelType: schema.modelType,\n modelName: singularName,\n kind: schema.kind!,\n info: {\n displayName: schema.name.charAt(0).toUpperCase() + schema.name.slice(1),\n // Always keep the old by default\n // @ts-expect-error - not in types\n singularName: oldSchema?.info?.singularName || singularName,\n // Always keep the old by default\n // @ts-expect-error - not in types\n pluralName: oldSchema?.info?.pluralName || pluralName,\n },\n collectionName: pluralName,\n attributes: transformAttributesFromChatToCTB(schema, oldSchema),\n options: {\n draftAndPublish: schema.options?.draftAndPublish ?? true,\n },\n pluginOptions: {\n i18n: {\n localized: schema.options?.localized ?? false,\n },\n },\n visible: true,\n status: transformStatusFromChatToCTB(schema, oldSchema),\n globalId: singularName,\n restrictRelationsTo: null, // TODO: not sure what this is about\n } satisfies ContentType;\n\n if (\n isPluginContentType(schema, oldSchema) &&\n oldSchema &&\n oldSchema.modelType === 'contentType'\n ) {\n const prev = oldSchema as ContentType;\n return {\n ...contentTypeBase,\n plugin: prev.plugin ?? schema.plugin,\n globalId: prev.globalId,\n modelName: prev.modelName,\n collectionName: prev.collectionName,\n info: {\n ...contentTypeBase.info,\n singularName: prev.info.singularName,\n pluralName: prev.info.pluralName,\n },\n options: {\n ...prev.options,\n ...contentTypeBase.options,\n draftAndPublish: schema.options?.draftAndPublish ?? prev.options?.draftAndPublish ?? true,\n },\n pluginOptions: {\n ...prev.pluginOptions,\n ...contentTypeBase.pluginOptions,\n i18n: {\n ...((prev.pluginOptions?.i18n as Record<string, unknown> | undefined) ?? {}),\n ...((contentTypeBase.pluginOptions?.i18n as Record<string, unknown> | undefined) ?? {}),\n localized:\n schema.options?.localized ??\n (prev.pluginOptions?.i18n as { localized?: boolean } | undefined)?.localized ??\n false,\n },\n },\n visible: prev.visible,\n restrictRelationsTo: prev.restrictRelationsTo,\n } satisfies ContentType;\n }\n\n if (isPluginContentType(schema, oldSchema) && schema.plugin) {\n return {\n ...contentTypeBase,\n plugin: schema.plugin,\n } satisfies ContentType;\n }\n\n return contentTypeBase;\n};\n"],"names":["isPluginContentTypeUid","uid","startsWith","isPluginContentType","schema","oldSchema","plugin","modelType","ct","Boolean","String","ACTION_TO_STATUS","create","remove","update","createAttributeWithStatus","name","attributeData","status","determineAttributeStatus","newAttr","oldAttr","newAttrWithoutStatus","omit","oldAttrWithoutStatus","isEqual","transformStatusFromChatToCTB","action","transformAttributesFromChatToCTB","attributes","Object","entries","map","attribute","oldAttributesMap","reduce","acc","attr","processedAttributes","removedAttributes","filter","transformChatToCTB","singularName","pluralize","singular","toLowerCase","replace","pluralName","plural","category","modelName","info","displayName","description","collectionName","globalId","contentTypeBase","kind","charAt","toUpperCase","slice","options","draftAndPublish","pluginOptions","i18n","localized","visible","restrictRelationsTo","prev"],"mappings":"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"}
1
+ {"version":3,"file":"toCTB.js","sources":["../../../../../../../admin/src/components/AIChat/lib/transforms/schemas/toCTB.ts"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\nimport isEqual from 'lodash/isEqual';\nimport omit from 'lodash/omit';\nimport pluralize from 'pluralize';\n\nimport { Schema } from '../../types/schema';\n\nimport type { ContentType, Component, AnyAttribute } from '../../../../../types';\n\nconst isPluginContentTypeUid = (uid: string) => uid.startsWith('plugin::');\n\n/**\n * Plugin / extension content-types use server-derived identity (globalId, collectionName, …).\n * The AI chat uses a simplified shape that would otherwise overwrite those fields incorrectly.\n */\nconst isPluginContentType = (schema: Schema, oldSchema?: ContentType | Component): boolean => {\n if (schema.plugin || isPluginContentTypeUid(schema.uid)) {\n return true;\n }\n if (oldSchema && 'modelType' in oldSchema && oldSchema.modelType === 'contentType') {\n const ct = oldSchema as ContentType;\n return Boolean(ct.plugin) || isPluginContentTypeUid(String(ct.uid));\n }\n return false;\n};\n\nconst ACTION_TO_STATUS: Record<Schema['action'], ContentType['status']> = {\n create: 'NEW',\n remove: 'REMOVED',\n update: 'CHANGED',\n};\n\n/**\n * Creates a new attribute with the specified status\n */\nconst createAttributeWithStatus = (\n name: string,\n attributeData: Record<string, any>,\n status: AnyAttribute['status']\n): AnyAttribute =>\n ({\n ...attributeData,\n name,\n status,\n }) as AnyAttribute;\n\n/**\n * Determines the status of an attribute by comparing new and old versions\n */\nconst determineAttributeStatus = (\n newAttr: Record<string, any>,\n oldAttr?: AnyAttribute,\n oldSchema?: ContentType | Component\n): AnyAttribute['status'] => {\n if (!oldAttr) {\n return 'NEW';\n }\n\n // If the schema was already new, don't mark attributes as changed, keep them as new.\n if (oldSchema?.status === 'NEW') {\n return 'NEW';\n }\n\n // Compare attributes without the status field to determine if they've changed\n const newAttrWithoutStatus = omit(newAttr, ['status']);\n const oldAttrWithoutStatus = omit(oldAttr, ['status']);\n\n if (!isEqual(newAttrWithoutStatus, oldAttrWithoutStatus)) {\n return 'CHANGED';\n }\n\n // If unchanged, keep the previous status\n return oldAttr.status;\n};\n\n/**\n * Determines the status of a schema by comparing action and checking if oldSchema exists\n */\nconst transformStatusFromChatToCTB = (\n schema: Schema,\n oldSchema?: ContentType | Component\n): ContentType['status'] => {\n // If schema has an action, use the mapped status\n if (schema.action) {\n return ACTION_TO_STATUS[schema.action];\n }\n\n // If oldSchema doesn't exist, it's a new schema\n if (!oldSchema) {\n return 'NEW';\n }\n\n // If no action is specified and oldSchema exists, keep the existing status\n return oldSchema.status;\n};\n\n/**\n * Transform attributes from Chat format to CTB format\n * Also performs a diff to determine the status of each attribute\n */\nexport const transformAttributesFromChatToCTB = (\n { action, attributes }: Schema,\n oldSchema?: ContentType | Component\n): AnyAttribute[] => {\n // If it's a new schema or no oldAttributes provided, all attributes are NEW\n if (action === 'create' || !oldSchema) {\n return Object.entries(attributes).map(([name, attribute]) =>\n createAttributeWithStatus(name, attribute, 'NEW')\n );\n }\n\n // Convert old attributes array to a lookup map for faster access\n const oldAttributesMap = oldSchema.attributes.reduce(\n (acc, attr) => ({ ...acc, [attr.name]: attr }),\n {} as Record<string, AnyAttribute>\n );\n\n // Process current attributes (new and changed)\n const processedAttributes = Object.entries(attributes).map(([name, attr]) => {\n const oldAttr = oldAttributesMap[name];\n const status = determineAttributeStatus({ ...attr, name }, oldAttr, oldSchema);\n\n return createAttributeWithStatus(name, attr, status);\n });\n\n // No need to mark removed attributes if the old schema is new, just remove it from the list\n // TODO: Else a validation error occurs on the backend side.\n if (oldSchema?.status === 'NEW') {\n return processedAttributes;\n }\n\n // Find removed attributes (exist in old but not in new)\n const removedAttributes = Object.entries(oldAttributesMap)\n .filter(([name]) => !attributes[name])\n .map(([name, oldAttr]) => createAttributeWithStatus(name, oldAttr, 'REMOVED'));\n\n // Combine both sets of attributes\n return [...processedAttributes, ...removedAttributes];\n};\n\n/**\n * Transform schema format\n * AI chat -> CTB\n *\n * The AI chat returns a simplified format, and this layer transforms it to be compatible with the CTB reducer.\n *\n * We need to keep track of which changes have been made\n */\nexport const transformChatToCTB = (\n schema: Schema,\n oldSchema?: ContentType | Component\n): ContentType | Component => {\n const singularName = pluralize.singular(schema.name).toLowerCase().replace(/ /g, '-');\n const pluralName = pluralize.plural(schema.name).toLowerCase().replace(/ /g, '-');\n\n if (schema.modelType === 'component') {\n return {\n category: schema.category || 'default',\n modelName: singularName,\n attributes: transformAttributesFromChatToCTB(schema, oldSchema),\n info: {\n displayName: schema.name,\n description: schema.description,\n // TODO\n // icon: schema.icon,\n },\n modelType: schema.modelType,\n uid: schema.uid as any,\n collectionName: pluralName,\n status: transformStatusFromChatToCTB(schema, oldSchema),\n globalId: singularName,\n } satisfies Component;\n }\n\n const contentTypeBase = {\n uid: schema.uid as any,\n modelType: schema.modelType,\n modelName: singularName,\n kind: schema.kind!,\n info: {\n displayName: schema.name.charAt(0).toUpperCase() + schema.name.slice(1),\n // Always keep the old by default\n // @ts-expect-error - not in types\n singularName: oldSchema?.info?.singularName || singularName,\n // Always keep the old by default\n // @ts-expect-error - not in types\n pluralName: oldSchema?.info?.pluralName || pluralName,\n },\n collectionName: pluralName,\n attributes: transformAttributesFromChatToCTB(schema, oldSchema),\n options: {\n draftAndPublish: schema.options?.draftAndPublish ?? true,\n },\n pluginOptions: {\n i18n: {\n localized: schema.options?.localized ?? false,\n },\n },\n visible: true,\n status: transformStatusFromChatToCTB(schema, oldSchema),\n globalId: singularName,\n restrictRelationsTo: null, // TODO: not sure what this is about\n } satisfies ContentType;\n\n if (\n isPluginContentType(schema, oldSchema) &&\n oldSchema &&\n oldSchema.modelType === 'contentType'\n ) {\n const prev = oldSchema as ContentType;\n return {\n ...contentTypeBase,\n plugin: prev.plugin ?? schema.plugin,\n globalId: prev.globalId,\n modelName: prev.modelName,\n collectionName: prev.collectionName,\n info: {\n ...contentTypeBase.info,\n singularName: prev.info.singularName,\n pluralName: prev.info.pluralName,\n },\n options: {\n ...prev.options,\n ...contentTypeBase.options,\n draftAndPublish: schema.options?.draftAndPublish ?? prev.options?.draftAndPublish ?? true,\n },\n pluginOptions: {\n ...prev.pluginOptions,\n ...contentTypeBase.pluginOptions,\n i18n: {\n ...((prev.pluginOptions?.i18n as Record<string, unknown> | undefined) ?? {}),\n ...((contentTypeBase.pluginOptions?.i18n as Record<string, unknown> | undefined) ?? {}),\n localized:\n schema.options?.localized ??\n (prev.pluginOptions?.i18n as { localized?: boolean } | undefined)?.localized ??\n false,\n },\n },\n visible: prev.visible,\n restrictRelationsTo: prev.restrictRelationsTo,\n } satisfies ContentType;\n }\n\n if (isPluginContentType(schema, oldSchema) && schema.plugin) {\n return {\n ...contentTypeBase,\n plugin: schema.plugin,\n } satisfies ContentType;\n }\n\n return contentTypeBase;\n};\n"],"names":["isPluginContentTypeUid","uid","startsWith","isPluginContentType","schema","oldSchema","plugin","modelType","ct","Boolean","String","ACTION_TO_STATUS","create","remove","update","createAttributeWithStatus","name","attributeData","status","determineAttributeStatus","newAttr","oldAttr","newAttrWithoutStatus","omit","oldAttrWithoutStatus","isEqual","transformStatusFromChatToCTB","action","transformAttributesFromChatToCTB","attributes","Object","entries","map","attribute","oldAttributesMap","reduce","acc","attr","processedAttributes","removedAttributes","filter","transformChatToCTB","singularName","pluralize","singular","toLowerCase","replace","pluralName","plural","category","modelName","info","displayName","description","collectionName","globalId","contentTypeBase","kind","charAt","toUpperCase","slice","options","draftAndPublish","pluginOptions","i18n","localized","visible","restrictRelationsTo","prev"],"mappings":";;;;;;;;;;;;AAAA;AASA,MAAMA,sBAAAA,GAAyB,CAACC,GAAAA,GAAgBA,GAAAA,CAAIC,UAAU,CAAC,UAAA,CAAA;AAE/D;;;IAIA,MAAMC,mBAAAA,GAAsB,CAACC,MAAAA,EAAgBC,SAAAA,GAAAA;AAC3C,IAAA,IAAID,OAAOE,MAAM,IAAIN,sBAAAA,CAAuBI,MAAAA,CAAOH,GAAG,CAAA,EAAG;QACvD,OAAO,IAAA;AACT,IAAA;AACA,IAAA,IAAII,aAAa,WAAA,IAAeA,SAAAA,IAAaA,SAAAA,CAAUE,SAAS,KAAK,aAAA,EAAe;AAClF,QAAA,MAAMC,EAAAA,GAAKH,SAAAA;AACX,QAAA,OAAOI,QAAQD,EAAAA,CAAGF,MAAM,KAAKN,sBAAAA,CAAuBU,MAAAA,CAAOF,GAAGP,GAAG,CAAA,CAAA;AACnE,IAAA;IACA,OAAO,KAAA;AACT,CAAA;AAEA,MAAMU,gBAAAA,GAAoE;IACxEC,MAAAA,EAAQ,KAAA;IACRC,MAAAA,EAAQ,SAAA;IACRC,MAAAA,EAAQ;AACV,CAAA;AAEA;;AAEC,IACD,MAAMC,yBAAAA,GAA4B,CAChCC,IAAAA,EACAC,aAAAA,EACAC,UAEC;AACC,QAAA,GAAGD,aAAa;AAChBD,QAAAA,IAAAA;AACAE,QAAAA;KACF,CAAA;AAEF;;AAEC,IACD,MAAMC,wBAAAA,GAA2B,CAC/BC,OAAAA,EACAC,OAAAA,EACAhB,SAAAA,GAAAA;AAEA,IAAA,IAAI,CAACgB,OAAAA,EAAS;QACZ,OAAO,KAAA;AACT,IAAA;;IAGA,IAAIhB,SAAAA,EAAWa,WAAW,KAAA,EAAO;QAC/B,OAAO,KAAA;AACT,IAAA;;IAGA,MAAMI,oBAAAA,GAAuBC,sBAAKH,OAAAA,EAAS;AAAC,QAAA;AAAS,KAAA,CAAA;IACrD,MAAMI,oBAAAA,GAAuBD,sBAAKF,OAAAA,EAAS;AAAC,QAAA;AAAS,KAAA,CAAA;IAErD,IAAI,CAACI,wBAAAA,CAAQH,oBAAAA,EAAsBE,oBAAAA,CAAAA,EAAuB;QACxD,OAAO,SAAA;AACT,IAAA;;AAGA,IAAA,OAAOH,QAAQH,MAAM;AACvB,CAAA;AAEA;;IAGA,MAAMQ,4BAAAA,GAA+B,CACnCtB,MAAAA,EACAC,SAAAA,GAAAA;;IAGA,IAAID,MAAAA,CAAOuB,MAAM,EAAE;AACjB,QAAA,OAAOhB,gBAAgB,CAACP,MAAAA,CAAOuB,MAAM,CAAC;AACxC,IAAA;;AAGA,IAAA,IAAI,CAACtB,SAAAA,EAAW;QACd,OAAO,KAAA;AACT,IAAA;;AAGA,IAAA,OAAOA,UAAUa,MAAM;AACzB,CAAA;AAEA;;;UAIaU,gCAAAA,GAAmC,CAC9C,EAAED,MAAM,EAAEE,UAAU,EAAU,EAC9BxB,SAAAA,GAAAA;;IAGA,IAAIsB,MAAAA,KAAW,QAAA,IAAY,CAACtB,SAAAA,EAAW;AACrC,QAAA,OAAOyB,MAAAA,CAAOC,OAAO,CAACF,UAAAA,CAAAA,CAAYG,GAAG,CAAC,CAAC,CAAChB,IAAAA,EAAMiB,SAAAA,CAAU,GACtDlB,yBAAAA,CAA0BC,MAAMiB,SAAAA,EAAW,KAAA,CAAA,CAAA;AAE/C,IAAA;;IAGA,MAAMC,gBAAAA,GAAmB7B,UAAUwB,UAAU,CAACM,MAAM,CAClD,CAACC,GAAAA,EAAKC,IAAAA,IAAU;AAAE,YAAA,GAAGD,GAAG;YAAE,CAACC,IAAAA,CAAKrB,IAAI,GAAGqB;AAAK,SAAA,GAC5C,EAAC,CAAA;;IAIH,MAAMC,mBAAAA,GAAsBR,MAAAA,CAAOC,OAAO,CAACF,UAAAA,CAAAA,CAAYG,GAAG,CAAC,CAAC,CAAChB,IAAAA,EAAMqB,IAAAA,CAAK,GAAA;QACtE,MAAMhB,OAAAA,GAAUa,gBAAgB,CAAClB,IAAAA,CAAK;AACtC,QAAA,MAAME,SAASC,wBAAAA,CAAyB;AAAE,YAAA,GAAGkB,IAAI;AAAErB,YAAAA;AAAK,SAAA,EAAGK,OAAAA,EAAShB,SAAAA,CAAAA;QAEpE,OAAOU,yBAAAA,CAA0BC,MAAMqB,IAAAA,EAAMnB,MAAAA,CAAAA;AAC/C,IAAA,CAAA,CAAA;;;IAIA,IAAIb,SAAAA,EAAWa,WAAW,KAAA,EAAO;QAC/B,OAAOoB,mBAAAA;AACT,IAAA;;IAGA,MAAMC,iBAAAA,GAAoBT,MAAAA,CAAOC,OAAO,CAACG,gBAAAA,CAAAA,CACtCM,MAAM,CAAC,CAAC,CAACxB,IAAAA,CAAK,GAAK,CAACa,UAAU,CAACb,IAAAA,CAAK,CAAA,CACpCgB,GAAG,CAAC,CAAC,CAAChB,IAAAA,EAAMK,OAAAA,CAAQ,GAAKN,yBAAAA,CAA0BC,IAAAA,EAAMK,OAAAA,EAAS,SAAA,CAAA,CAAA;;IAGrE,OAAO;AAAIiB,QAAAA,GAAAA,mBAAAA;AAAwBC,QAAAA,GAAAA;AAAkB,KAAA;AACvD;AAEA;;;;;;;AAOC,IACM,MAAME,kBAAAA,GAAqB,CAChCrC,MAAAA,EACAC,SAAAA,GAAAA;IAEA,MAAMqC,YAAAA,GAAeC,0BAAAA,CAAUC,QAAQ,CAACxC,MAAAA,CAAOY,IAAI,CAAA,CAAE6B,WAAW,EAAA,CAAGC,OAAO,CAAC,IAAA,EAAM,GAAA,CAAA;IACjF,MAAMC,UAAAA,GAAaJ,0BAAAA,CAAUK,MAAM,CAAC5C,MAAAA,CAAOY,IAAI,CAAA,CAAE6B,WAAW,EAAA,CAAGC,OAAO,CAAC,IAAA,EAAM,GAAA,CAAA;IAE7E,IAAI1C,MAAAA,CAAOG,SAAS,KAAK,WAAA,EAAa;QACpC,OAAO;YACL0C,QAAAA,EAAU7C,MAAAA,CAAO6C,QAAQ,IAAI,SAAA;YAC7BC,SAAAA,EAAWR,YAAAA;AACXb,YAAAA,UAAAA,EAAYD,iCAAiCxB,MAAAA,EAAQC,SAAAA,CAAAA;YACrD8C,IAAAA,EAAM;AACJC,gBAAAA,WAAAA,EAAahD,OAAOY,IAAI;AACxBqC,gBAAAA,WAAAA,EAAajD,OAAOiD;AAGtB,aAAA;AACA9C,YAAAA,SAAAA,EAAWH,OAAOG,SAAS;AAC3BN,YAAAA,GAAAA,EAAKG,OAAOH,GAAG;YACfqD,cAAAA,EAAgBP,UAAAA;AAChB7B,YAAAA,MAAAA,EAAQQ,6BAA6BtB,MAAAA,EAAQC,SAAAA,CAAAA;YAC7CkD,QAAAA,EAAUb;AACZ,SAAA;AACF,IAAA;AAEA,IAAA,MAAMc,eAAAA,GAAkB;AACtBvD,QAAAA,GAAAA,EAAKG,OAAOH,GAAG;AACfM,QAAAA,SAAAA,EAAWH,OAAOG,SAAS;QAC3B2C,SAAAA,EAAWR,YAAAA;AACXe,QAAAA,IAAAA,EAAMrD,OAAOqD,IAAI;QACjBN,IAAAA,EAAM;AACJC,YAAAA,WAAAA,EAAahD,MAAAA,CAAOY,IAAI,CAAC0C,MAAM,CAAC,CAAA,CAAA,CAAGC,WAAW,EAAA,GAAKvD,MAAAA,CAAOY,IAAI,CAAC4C,KAAK,CAAC,CAAA,CAAA;;;YAGrElB,YAAAA,EAAcrC,SAAAA,EAAW8C,MAAMT,YAAAA,IAAgBA,YAAAA;;;YAG/CK,UAAAA,EAAY1C,SAAAA,EAAW8C,MAAMJ,UAAAA,IAAcA;AAC7C,SAAA;QACAO,cAAAA,EAAgBP,UAAAA;AAChBlB,QAAAA,UAAAA,EAAYD,iCAAiCxB,MAAAA,EAAQC,SAAAA,CAAAA;QACrDwD,OAAAA,EAAS;YACPC,eAAAA,EAAiB1D,MAAAA,CAAOyD,OAAO,EAAEC,eAAAA,IAAmB;AACtD,SAAA;QACAC,aAAAA,EAAe;YACbC,IAAAA,EAAM;gBACJC,SAAAA,EAAW7D,MAAAA,CAAOyD,OAAO,EAAEI,SAAAA,IAAa;AAC1C;AACF,SAAA;QACAC,OAAAA,EAAS,IAAA;AACThD,QAAAA,MAAAA,EAAQQ,6BAA6BtB,MAAAA,EAAQC,SAAAA,CAAAA;QAC7CkD,QAAAA,EAAUb,YAAAA;QACVyB,mBAAAA,EAAqB;AACvB,KAAA;AAEA,IAAA,IACEhE,oBAAoBC,MAAAA,EAAQC,SAAAA,CAAAA,IAC5BA,aACAA,SAAAA,CAAUE,SAAS,KAAK,aAAA,EACxB;AACA,QAAA,MAAM6D,IAAAA,GAAO/D,SAAAA;QACb,OAAO;AACL,YAAA,GAAGmD,eAAe;AAClBlD,YAAAA,MAAAA,EAAQ8D,IAAAA,CAAK9D,MAAM,IAAIF,MAAAA,CAAOE,MAAM;AACpCiD,YAAAA,QAAAA,EAAUa,KAAKb,QAAQ;AACvBL,YAAAA,SAAAA,EAAWkB,KAAKlB,SAAS;AACzBI,YAAAA,cAAAA,EAAgBc,KAAKd,cAAc;YACnCH,IAAAA,EAAM;AACJ,gBAAA,GAAGK,gBAAgBL,IAAI;gBACvBT,YAAAA,EAAc0B,IAAAA,CAAKjB,IAAI,CAACT,YAAY;gBACpCK,UAAAA,EAAYqB,IAAAA,CAAKjB,IAAI,CAACJ;AACxB,aAAA;YACAc,OAAAA,EAAS;AACP,gBAAA,GAAGO,KAAKP,OAAO;AACf,gBAAA,GAAGL,gBAAgBK,OAAO;AAC1BC,gBAAAA,eAAAA,EAAiB1D,OAAOyD,OAAO,EAAEC,mBAAmBM,IAAAA,CAAKP,OAAO,EAAEC,eAAAA,IAAmB;AACvF,aAAA;YACAC,aAAAA,EAAe;AACb,gBAAA,GAAGK,KAAKL,aAAa;AACrB,gBAAA,GAAGP,gBAAgBO,aAAa;gBAChCC,IAAAA,EAAM;AACJ,oBAAA,GAAI,IAACI,CAAKL,aAAa,EAAEC,IAAAA,IAAgD,EAAE;AAC3E,oBAAA,GAAI,eAACR,CAAgBO,aAAa,EAAEC,IAAAA,IAAgD,EAAE;oBACtFC,SAAAA,EACE7D,MAAAA,CAAOyD,OAAO,EAAEI,SAAAA,IACfG,KAAKL,aAAa,EAAEC,MAA8CC,SAAAA,IACnE;AACJ;AACF,aAAA;AACAC,YAAAA,OAAAA,EAASE,KAAKF,OAAO;AACrBC,YAAAA,mBAAAA,EAAqBC,KAAKD;AAC5B,SAAA;AACF,IAAA;AAEA,IAAA,IAAIhE,mBAAAA,CAAoBC,MAAAA,EAAQC,SAAAA,CAAAA,IAAcD,MAAAA,CAAOE,MAAM,EAAE;QAC3D,OAAO;AACL,YAAA,GAAGkD,eAAe;AAClBlD,YAAAA,MAAAA,EAAQF,OAAOE;AACjB,SAAA;AACF,IAAA;IAEA,OAAOkD,eAAAA;AACT;;;;;"}
@@ -5,6 +5,10 @@ var designSystem = require('@strapi/design-system');
5
5
  var upperFirst = require('lodash/upperFirst');
6
6
  var reactIntl = require('react-intl');
7
7
 
8
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
9
+
10
+ var upperFirst__default = /*#__PURE__*/_interopDefault(upperFirst);
11
+
8
12
  const options = [
9
13
  {
10
14
  label: 'All',
@@ -35,7 +39,7 @@ const AllowedTypesSelect = ({ intlLabel, name, onChange, value = null })=>{
35
39
  defaultMessage: 'None'
36
40
  }) : [
37
41
  ...value
38
- ].sort().map((v)=>upperFirst(v)).join(', ');
42
+ ].sort().map((v)=>upperFirst__default.default(v)).join(', ');
39
43
  /* eslint-enable indent */ const label = intlLabel.id ? formatMessage({
40
44
  id: intlLabel.id,
41
45
  defaultMessage: intlLabel.defaultMessage
@@ -1 +1 @@
1
- {"version":3,"file":"AllowedTypesSelect.js","sources":["../../../admin/src/components/AllowedTypesSelect.tsx"],"sourcesContent":["import { Field, MultiSelectNested } from '@strapi/design-system';\nimport upperFirst from 'lodash/upperFirst';\nimport { useIntl } from 'react-intl';\n\nimport { IntlLabel } from '../types';\n\ninterface AllowedTypesSelectProps {\n intlLabel: IntlLabel;\n name: string;\n onChange: (value: any) => void;\n value?: any;\n}\n\nconst options = [\n {\n label: 'All',\n children: [\n { label: 'images (JPEG, PNG, GIF, SVG, TIFF, ICO, DVU)', value: 'images' },\n { label: 'videos (MPEG, MP4, Quicktime, WMV, AVI, FLV)', value: 'videos' },\n { label: 'audios (MP3, WAV, OGG)', value: 'audios' },\n { label: 'files (CSV, ZIP, PDF, Excel, JSON, ...)', value: 'files' },\n ],\n },\n];\n\nexport const AllowedTypesSelect = ({\n intlLabel,\n name,\n onChange,\n value = null,\n}: AllowedTypesSelectProps) => {\n const { formatMessage } = useIntl();\n\n /* eslint-disable indent */\n const displayedValue =\n value === null || value?.length === 0\n ? formatMessage({ id: 'global.none', defaultMessage: 'None' })\n : [...value]\n .sort()\n .map((v) => upperFirst(v))\n .join(', ');\n\n /* eslint-enable indent */\n\n const label = intlLabel.id\n ? formatMessage({ id: intlLabel.id, defaultMessage: intlLabel.defaultMessage })\n : name;\n\n return (\n <Field.Root name={name}>\n <Field.Label>{label}</Field.Label>\n <MultiSelectNested\n customizeContent={() => displayedValue}\n onChange={(values: any[]) => {\n if (values.length > 0) {\n onChange({ target: { name, value: values, type: 'allowed-types-select' } });\n } else {\n onChange({ target: { name, value: null, type: 'allowed-types-select' } });\n }\n }}\n options={options}\n value={value || []}\n />\n </Field.Root>\n );\n};\n"],"names":["options","label","children","value","AllowedTypesSelect","intlLabel","name","onChange","formatMessage","useIntl","displayedValue","length","id","defaultMessage","sort","map","v","upperFirst","join","_jsxs","Field","Root","_jsx","Label","MultiSelectNested","customizeContent","values","target","type"],"mappings":";;;;;;;AAaA,MAAMA,OAAAA,GAAU;AACd,IAAA;QACEC,KAAAA,EAAO,KAAA;QACPC,QAAAA,EAAU;AACR,YAAA;gBAAED,KAAAA,EAAO,8CAAA;gBAAgDE,KAAAA,EAAO;AAAS,aAAA;AACzE,YAAA;gBAAEF,KAAAA,EAAO,8CAAA;gBAAgDE,KAAAA,EAAO;AAAS,aAAA;AACzE,YAAA;gBAAEF,KAAAA,EAAO,wBAAA;gBAA0BE,KAAAA,EAAO;AAAS,aAAA;AACnD,YAAA;gBAAEF,KAAAA,EAAO,yCAAA;gBAA2CE,KAAAA,EAAO;AAAQ;AACpE;AACH;AACD,CAAA;AAEM,MAAMC,kBAAAA,GAAqB,CAAC,EACjCC,SAAS,EACTC,IAAI,EACJC,QAAQ,EACRJ,KAAAA,GAAQ,IAAI,EACY,GAAA;IACxB,MAAM,EAAEK,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;gCAG1B,MAAMC,cAAAA,GACJP,KAAAA,KAAU,QAAQA,KAAAA,EAAOQ,MAAAA,KAAW,IAChCH,aAAAA,CAAc;QAAEI,EAAAA,EAAI,aAAA;QAAeC,cAAAA,EAAgB;KAAO,CAAA,GAC1D;AAAIV,QAAAA,GAAAA;KAAM,CACPW,IAAI,GACJC,GAAG,CAAC,CAACC,CAAAA,GAAMC,UAAAA,CAAWD,CAAAA,CAAAA,CAAAA,CACtBE,IAAI,CAAC,IAAA,CAAA;AAEd,+BAEA,MAAMjB,KAAAA,GAAQI,SAAAA,CAAUO,EAAE,GACtBJ,aAAAA,CAAc;AAAEI,QAAAA,EAAAA,EAAIP,UAAUO,EAAE;AAAEC,QAAAA,cAAAA,EAAgBR,UAAUQ;KAAe,CAAA,GAC3EP,IAAAA;IAEJ,qBACEa,eAAA,CAACC,mBAAMC,IAAI,EAAA;QAACf,IAAAA,EAAMA,IAAAA;;AAChB,0BAAAgB,cAAA,CAACF,mBAAMG,KAAK,EAAA;AAAEtB,gBAAAA,QAAAA,EAAAA;;0BACdqB,cAAA,CAACE,8BAAAA,EAAAA;AACCC,gBAAAA,gBAAAA,EAAkB,IAAMf,cAAAA;AACxBH,gBAAAA,QAAAA,EAAU,CAACmB,MAAAA,GAAAA;oBACT,IAAIA,MAAAA,CAAOf,MAAM,GAAG,CAAA,EAAG;wBACrBJ,QAAAA,CAAS;4BAAEoB,MAAAA,EAAQ;AAAErB,gCAAAA,IAAAA;gCAAMH,KAAAA,EAAOuB,MAAAA;gCAAQE,IAAAA,EAAM;AAAuB;AAAE,yBAAA,CAAA;oBAC3E,CAAA,MAAO;wBACLrB,QAAAA,CAAS;4BAAEoB,MAAAA,EAAQ;AAAErB,gCAAAA,IAAAA;gCAAMH,KAAAA,EAAO,IAAA;gCAAMyB,IAAAA,EAAM;AAAuB;AAAE,yBAAA,CAAA;AACzE,oBAAA;AACF,gBAAA,CAAA;gBACA5B,OAAAA,EAASA,OAAAA;AACTG,gBAAAA,KAAAA,EAAOA,SAAS;;;;AAIxB;;;;"}
1
+ {"version":3,"file":"AllowedTypesSelect.js","sources":["../../../admin/src/components/AllowedTypesSelect.tsx"],"sourcesContent":["import { Field, MultiSelectNested } from '@strapi/design-system';\nimport upperFirst from 'lodash/upperFirst';\nimport { useIntl } from 'react-intl';\n\nimport { IntlLabel } from '../types';\n\ninterface AllowedTypesSelectProps {\n intlLabel: IntlLabel;\n name: string;\n onChange: (value: any) => void;\n value?: any;\n}\n\nconst options = [\n {\n label: 'All',\n children: [\n { label: 'images (JPEG, PNG, GIF, SVG, TIFF, ICO, DVU)', value: 'images' },\n { label: 'videos (MPEG, MP4, Quicktime, WMV, AVI, FLV)', value: 'videos' },\n { label: 'audios (MP3, WAV, OGG)', value: 'audios' },\n { label: 'files (CSV, ZIP, PDF, Excel, JSON, ...)', value: 'files' },\n ],\n },\n];\n\nexport const AllowedTypesSelect = ({\n intlLabel,\n name,\n onChange,\n value = null,\n}: AllowedTypesSelectProps) => {\n const { formatMessage } = useIntl();\n\n /* eslint-disable indent */\n const displayedValue =\n value === null || value?.length === 0\n ? formatMessage({ id: 'global.none', defaultMessage: 'None' })\n : [...value]\n .sort()\n .map((v) => upperFirst(v))\n .join(', ');\n\n /* eslint-enable indent */\n\n const label = intlLabel.id\n ? formatMessage({ id: intlLabel.id, defaultMessage: intlLabel.defaultMessage })\n : name;\n\n return (\n <Field.Root name={name}>\n <Field.Label>{label}</Field.Label>\n <MultiSelectNested\n customizeContent={() => displayedValue}\n onChange={(values: any[]) => {\n if (values.length > 0) {\n onChange({ target: { name, value: values, type: 'allowed-types-select' } });\n } else {\n onChange({ target: { name, value: null, type: 'allowed-types-select' } });\n }\n }}\n options={options}\n value={value || []}\n />\n </Field.Root>\n );\n};\n"],"names":["options","label","children","value","AllowedTypesSelect","intlLabel","name","onChange","formatMessage","useIntl","displayedValue","length","id","defaultMessage","sort","map","v","upperFirst","join","_jsxs","Field","Root","_jsx","Label","MultiSelectNested","customizeContent","values","target","type"],"mappings":";;;;;;;;;;;AAaA,MAAMA,OAAAA,GAAU;AACd,IAAA;QACEC,KAAAA,EAAO,KAAA;QACPC,QAAAA,EAAU;AACR,YAAA;gBAAED,KAAAA,EAAO,8CAAA;gBAAgDE,KAAAA,EAAO;AAAS,aAAA;AACzE,YAAA;gBAAEF,KAAAA,EAAO,8CAAA;gBAAgDE,KAAAA,EAAO;AAAS,aAAA;AACzE,YAAA;gBAAEF,KAAAA,EAAO,wBAAA;gBAA0BE,KAAAA,EAAO;AAAS,aAAA;AACnD,YAAA;gBAAEF,KAAAA,EAAO,yCAAA;gBAA2CE,KAAAA,EAAO;AAAQ;AACpE;AACH;AACD,CAAA;AAEM,MAAMC,kBAAAA,GAAqB,CAAC,EACjCC,SAAS,EACTC,IAAI,EACJC,QAAQ,EACRJ,KAAAA,GAAQ,IAAI,EACY,GAAA;IACxB,MAAM,EAAEK,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;gCAG1B,MAAMC,cAAAA,GACJP,KAAAA,KAAU,QAAQA,KAAAA,EAAOQ,MAAAA,KAAW,IAChCH,aAAAA,CAAc;QAAEI,EAAAA,EAAI,aAAA;QAAeC,cAAAA,EAAgB;KAAO,CAAA,GAC1D;AAAIV,QAAAA,GAAAA;KAAM,CACPW,IAAI,GACJC,GAAG,CAAC,CAACC,CAAAA,GAAMC,2BAAAA,CAAWD,CAAAA,CAAAA,CAAAA,CACtBE,IAAI,CAAC,IAAA,CAAA;AAEd,+BAEA,MAAMjB,KAAAA,GAAQI,SAAAA,CAAUO,EAAE,GACtBJ,aAAAA,CAAc;AAAEI,QAAAA,EAAAA,EAAIP,UAAUO,EAAE;AAAEC,QAAAA,cAAAA,EAAgBR,UAAUQ;KAAe,CAAA,GAC3EP,IAAAA;IAEJ,qBACEa,eAAA,CAACC,mBAAMC,IAAI,EAAA;QAACf,IAAAA,EAAMA,IAAAA;;AAChB,0BAAAgB,cAAA,CAACF,mBAAMG,KAAK,EAAA;AAAEtB,gBAAAA,QAAAA,EAAAA;;0BACdqB,cAAA,CAACE,8BAAAA,EAAAA;AACCC,gBAAAA,gBAAAA,EAAkB,IAAMf,cAAAA;AACxBH,gBAAAA,QAAAA,EAAU,CAACmB,MAAAA,GAAAA;oBACT,IAAIA,MAAAA,CAAOf,MAAM,GAAG,CAAA,EAAG;wBACrBJ,QAAAA,CAAS;4BAAEoB,MAAAA,EAAQ;AAAErB,gCAAAA,IAAAA;gCAAMH,KAAAA,EAAOuB,MAAAA;gCAAQE,IAAAA,EAAM;AAAuB;AAAE,yBAAA,CAAA;oBAC3E,CAAA,MAAO;wBACLrB,QAAAA,CAAS;4BAAEoB,MAAAA,EAAQ;AAAErB,gCAAAA,IAAAA;gCAAMH,KAAAA,EAAO,IAAA;gCAAMyB,IAAAA,EAAM;AAAuB;AAAE,yBAAA,CAAA;AACzE,oBAAA;AACF,gBAAA,CAAA;gBACA5B,OAAAA,EAASA,OAAAA;AACTG,gBAAAA,KAAAA,EAAOA,SAAS;;;;AAIxB;;;;"}
@@ -10,7 +10,8 @@ var reactRouterDom = require('react-router-dom');
10
10
  var styledComponents = require('styled-components');
11
11
  var getTrad = require('../../utils/getTrad.js');
12
12
 
13
- function _interopNamespaceDefault(e) {
13
+ function _interopNamespace(e) {
14
+ if (e && e.__esModule) return e;
14
15
  var n = Object.create(null);
15
16
  if (e) {
16
17
  Object.keys(e).forEach(function (k) {
@@ -27,7 +28,7 @@ function _interopNamespaceDefault(e) {
27
28
  return Object.freeze(n);
28
29
  }
29
30
 
30
- var qs__namespace = /*#__PURE__*/_interopNamespaceDefault(qs);
31
+ var qs__namespace = /*#__PURE__*/_interopNamespace(qs);
31
32
 
32
33
  const EmptyCard = styledComponents.styled(designSystem.Box)`
33
34
  background: ${({ theme })=>`linear-gradient(180deg, rgba(234, 234, 239, 0) 0%, ${theme.colors.neutral150} 100%)`};
@@ -1 +1 @@
1
- {"version":3,"file":"EmptyAttributes.js","sources":["../../../../admin/src/components/AttributeOptions/EmptyAttributes.tsx"],"sourcesContent":["import { Box, Flex, Typography, LinkButton } from '@strapi/design-system';\nimport { Plus } from '@strapi/icons';\nimport { EmptyDocuments } from '@strapi/icons/symbols';\nimport * as qs from 'qs';\nimport { useIntl } from 'react-intl';\nimport { Link } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { getTrad } from '../../utils';\n\nconst EmptyCard = styled(Box)`\n background: ${({ theme }) =>\n `linear-gradient(180deg, rgba(234, 234, 239, 0) 0%, ${theme.colors.neutral150} 100%)`};\n opacity: 0.33;\n`;\n\nexport const EmptyCardGrid = () => {\n return (\n <Flex wrap=\"wrap\" gap={4}>\n {[...Array(4)].map((_, idx) => {\n return (\n <EmptyCard\n // eslint-disable-next-line react/no-array-index-key\n key={`empty-card-${idx}`}\n height=\"138px\"\n width=\"375px\"\n hasRadius\n />\n );\n })}\n </Flex>\n );\n};\n\nexport const EmptyAttributes = () => {\n const { formatMessage } = useIntl();\n\n return (\n <Box position=\"relative\">\n <EmptyCardGrid />\n <Box position=\"absolute\" top={6} width=\"100%\">\n <Flex alignItems=\"center\" justifyContent=\"center\" direction=\"column\">\n <EmptyDocuments width=\"160px\" height=\"88px\" />\n <Box paddingTop={6} paddingBottom={4}>\n <Box textAlign=\"center\">\n <Typography variant=\"delta\" tag=\"p\" textColor=\"neutral600\">\n {formatMessage({\n id: getTrad('modalForm.empty.heading'),\n defaultMessage: 'Nothing in here yet.',\n })}\n </Typography>\n <Box paddingTop={4}>\n <Typography variant=\"delta\" tag=\"p\" textColor=\"neutral600\">\n {formatMessage({\n id: getTrad('modalForm.empty.sub-heading'),\n defaultMessage:\n 'Find what you are looking for through a wide range of extensions.',\n })}\n </Typography>\n </Box>\n </Box>\n </Box>\n <LinkButton\n tag={Link}\n to={`https://market.strapi.io?${qs.stringify({ categories: 'Custom fields' })}`}\n variant=\"secondary\"\n target=\"_blank\"\n startIcon={<Plus />}\n >\n {formatMessage({\n id: getTrad('modalForm.empty.button'),\n defaultMessage: 'Add custom fields',\n })}\n </LinkButton>\n </Flex>\n </Box>\n </Box>\n );\n};\n"],"names":["EmptyCard","styled","Box","theme","colors","neutral150","EmptyCardGrid","_jsx","Flex","wrap","gap","Array","map","_","idx","height","width","hasRadius","EmptyAttributes","formatMessage","useIntl","_jsxs","position","top","alignItems","justifyContent","direction","EmptyDocuments","paddingTop","paddingBottom","textAlign","Typography","variant","tag","textColor","id","getTrad","defaultMessage","LinkButton","Link","to","qs","stringify","categories","target","startIcon","Plus"],"mappings":"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"}
1
+ {"version":3,"file":"EmptyAttributes.js","sources":["../../../../admin/src/components/AttributeOptions/EmptyAttributes.tsx"],"sourcesContent":["import { Box, Flex, Typography, LinkButton } from '@strapi/design-system';\nimport { Plus } from '@strapi/icons';\nimport { EmptyDocuments } from '@strapi/icons/symbols';\nimport * as qs from 'qs';\nimport { useIntl } from 'react-intl';\nimport { Link } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { getTrad } from '../../utils';\n\nconst EmptyCard = styled(Box)`\n background: ${({ theme }) =>\n `linear-gradient(180deg, rgba(234, 234, 239, 0) 0%, ${theme.colors.neutral150} 100%)`};\n opacity: 0.33;\n`;\n\nexport const EmptyCardGrid = () => {\n return (\n <Flex wrap=\"wrap\" gap={4}>\n {[...Array(4)].map((_, idx) => {\n return (\n <EmptyCard\n // eslint-disable-next-line react/no-array-index-key\n key={`empty-card-${idx}`}\n height=\"138px\"\n width=\"375px\"\n hasRadius\n />\n );\n })}\n </Flex>\n );\n};\n\nexport const EmptyAttributes = () => {\n const { formatMessage } = useIntl();\n\n return (\n <Box position=\"relative\">\n <EmptyCardGrid />\n <Box position=\"absolute\" top={6} width=\"100%\">\n <Flex alignItems=\"center\" justifyContent=\"center\" direction=\"column\">\n <EmptyDocuments width=\"160px\" height=\"88px\" />\n <Box paddingTop={6} paddingBottom={4}>\n <Box textAlign=\"center\">\n <Typography variant=\"delta\" tag=\"p\" textColor=\"neutral600\">\n {formatMessage({\n id: getTrad('modalForm.empty.heading'),\n defaultMessage: 'Nothing in here yet.',\n })}\n </Typography>\n <Box paddingTop={4}>\n <Typography variant=\"delta\" tag=\"p\" textColor=\"neutral600\">\n {formatMessage({\n id: getTrad('modalForm.empty.sub-heading'),\n defaultMessage:\n 'Find what you are looking for through a wide range of extensions.',\n })}\n </Typography>\n </Box>\n </Box>\n </Box>\n <LinkButton\n tag={Link}\n to={`https://market.strapi.io?${qs.stringify({ categories: 'Custom fields' })}`}\n variant=\"secondary\"\n target=\"_blank\"\n startIcon={<Plus />}\n >\n {formatMessage({\n id: getTrad('modalForm.empty.button'),\n defaultMessage: 'Add custom fields',\n })}\n </LinkButton>\n </Flex>\n </Box>\n </Box>\n );\n};\n"],"names":["EmptyCard","styled","Box","theme","colors","neutral150","EmptyCardGrid","_jsx","Flex","wrap","gap","Array","map","_","idx","height","width","hasRadius","EmptyAttributes","formatMessage","useIntl","_jsxs","position","top","alignItems","justifyContent","direction","EmptyDocuments","paddingTop","paddingBottom","textAlign","Typography","variant","tag","textColor","id","getTrad","defaultMessage","LinkButton","Link","to","qs","stringify","categories","target","startIcon","Plus"],"mappings":"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"}
@@ -23,6 +23,11 @@ var DynamicZoneList = require('./DynamicZoneList.js');
23
23
  var useFormModalNavigation = require('./FormModalNavigation/useFormModalNavigation.js');
24
24
  var Status = require('./Status.js');
25
25
 
26
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
27
+
28
+ var get__default = /*#__PURE__*/_interopDefault(get);
29
+ var upperFirst__default = /*#__PURE__*/_interopDefault(upperFirst);
30
+
26
31
  const GridWrapper = styledComponents.styled(designSystem.Flex)`
27
32
  justify-content: space-between;
28
33
 
@@ -70,8 +75,8 @@ const MemoizedRow = /*#__PURE__*/ React.memo((props)=>{
70
75
  'float',
71
76
  'decimal'
72
77
  ].includes(item.type) ? 'number' : item.type;
73
- const targetContentType = item.type === 'relation' ? get(contentTypes, item.target) : null;
74
- const isPluginContentType = get(targetContentType, 'plugin');
78
+ const targetContentType = item.type === 'relation' ? get__default.default(contentTypes, item.target) : null;
79
+ const isPluginContentType = get__default.default(targetContentType, 'plugin');
75
80
  const src = 'target' in item && item.target ? 'relation' : ico;
76
81
  const handleDelete = (e)=>{
77
82
  e.stopPropagation();
@@ -228,7 +233,7 @@ const MemoizedRow = /*#__PURE__*/ React.memo((props)=>{
228
233
  onClick: (e)=>e.stopPropagation(),
229
234
  tag: reactRouterDom.Link,
230
235
  to: `/plugins/content-type-builder/content-types/${targetContentType.uid}`,
231
- children: upperFirst(targetContentType.info.displayName)
236
+ children: upperFirst__default.default(targetContentType.info.displayName)
232
237
  }),
233
238
  isPluginContentType && `(${formatMessage({
234
239
  id: getTrad.getTrad(`from`),
@@ -378,7 +383,7 @@ const SubRow = styledComponents.styled(designSystem.Box)`
378
383
  `;
379
384
  const ComponentLink = ({ uid })=>{
380
385
  const { components } = useDataManager.useDataManager();
381
- const type = get(components, uid);
386
+ const type = get__default.default(components, uid);
382
387
  return /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
383
388
  children: [
384
389
  " (",
@@ -386,7 +391,7 @@ const ComponentLink = ({ uid })=>{
386
391
  onClick: (e)=>e.stopPropagation(),
387
392
  tag: reactRouterDom.Link,
388
393
  to: `/plugins/content-type-builder/component-categories/${type.category}/${type.uid}`,
389
- children: upperFirst(type.info.displayName)
394
+ children: upperFirst__default.default(type.info.displayName)
390
395
  }),
391
396
  ")"
392
397
  ]