@strapi/content-type-builder 5.25.0 → 5.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (328) hide show
  1. package/dist/admin/components/AIChat/Chat.js +431 -0
  2. package/dist/admin/components/AIChat/Chat.js.map +1 -0
  3. package/dist/admin/components/AIChat/Chat.mjs +429 -0
  4. package/dist/admin/components/AIChat/Chat.mjs.map +1 -0
  5. package/dist/admin/components/AIChat/FeedbackModal.js +237 -0
  6. package/dist/admin/components/AIChat/FeedbackModal.js.map +1 -0
  7. package/dist/admin/components/AIChat/FeedbackModal.mjs +233 -0
  8. package/dist/admin/components/AIChat/FeedbackModal.mjs.map +1 -0
  9. package/dist/admin/components/AIChat/UploadCodeModal.js +427 -0
  10. package/dist/admin/components/AIChat/UploadCodeModal.js.map +1 -0
  11. package/dist/admin/components/AIChat/UploadCodeModal.mjs +423 -0
  12. package/dist/admin/components/AIChat/UploadCodeModal.mjs.map +1 -0
  13. package/dist/admin/components/AIChat/UploadFigmaModal.js +377 -0
  14. package/dist/admin/components/AIChat/UploadFigmaModal.js.map +1 -0
  15. package/dist/admin/components/AIChat/UploadFigmaModal.mjs +373 -0
  16. package/dist/admin/components/AIChat/UploadFigmaModal.mjs.map +1 -0
  17. package/dist/admin/components/AIChat/components/Alert.js +46 -0
  18. package/dist/admin/components/AIChat/components/Alert.js.map +1 -0
  19. package/dist/admin/components/AIChat/components/Alert.mjs +44 -0
  20. package/dist/admin/components/AIChat/components/Alert.mjs.map +1 -0
  21. package/dist/admin/components/AIChat/components/AnimatedBox.js +34 -0
  22. package/dist/admin/components/AIChat/components/AnimatedBox.js.map +1 -0
  23. package/dist/admin/components/AIChat/components/AnimatedBox.mjs +32 -0
  24. package/dist/admin/components/AIChat/components/AnimatedBox.mjs.map +1 -0
  25. package/dist/admin/components/AIChat/components/Attachments/AttachmentPreview.js +92 -0
  26. package/dist/admin/components/AIChat/components/Attachments/AttachmentPreview.js.map +1 -0
  27. package/dist/admin/components/AIChat/components/Attachments/AttachmentPreview.mjs +90 -0
  28. package/dist/admin/components/AIChat/components/Attachments/AttachmentPreview.mjs.map +1 -0
  29. package/dist/admin/components/AIChat/components/Attachments/components/Attachment.js +100 -0
  30. package/dist/admin/components/AIChat/components/Attachments/components/Attachment.js.map +1 -0
  31. package/dist/admin/components/AIChat/components/Attachments/components/Attachment.mjs +97 -0
  32. package/dist/admin/components/AIChat/components/Attachments/components/Attachment.mjs.map +1 -0
  33. package/dist/admin/components/AIChat/components/Base64Image.js +127 -0
  34. package/dist/admin/components/AIChat/components/Base64Image.js.map +1 -0
  35. package/dist/admin/components/AIChat/components/Base64Image.mjs +125 -0
  36. package/dist/admin/components/AIChat/components/Base64Image.mjs.map +1 -0
  37. package/dist/admin/components/AIChat/components/Collapsible.js +71 -0
  38. package/dist/admin/components/AIChat/components/Collapsible.js.map +1 -0
  39. package/dist/admin/components/AIChat/components/Collapsible.mjs +66 -0
  40. package/dist/admin/components/AIChat/components/Collapsible.mjs.map +1 -0
  41. package/dist/admin/components/AIChat/components/Dropzone.js +172 -0
  42. package/dist/admin/components/AIChat/components/Dropzone.js.map +1 -0
  43. package/dist/admin/components/AIChat/components/Dropzone.mjs +167 -0
  44. package/dist/admin/components/AIChat/components/Dropzone.mjs.map +1 -0
  45. package/dist/admin/components/AIChat/components/FloatingPanel.js +166 -0
  46. package/dist/admin/components/AIChat/components/FloatingPanel.js.map +1 -0
  47. package/dist/admin/components/AIChat/components/FloatingPanel.mjs +163 -0
  48. package/dist/admin/components/AIChat/components/FloatingPanel.mjs.map +1 -0
  49. package/dist/admin/components/AIChat/components/FullScreenImage.js +190 -0
  50. package/dist/admin/components/AIChat/components/FullScreenImage.js.map +1 -0
  51. package/dist/admin/components/AIChat/components/FullScreenImage.mjs +187 -0
  52. package/dist/admin/components/AIChat/components/FullScreenImage.mjs.map +1 -0
  53. package/dist/admin/components/AIChat/components/ImagePreview.js +87 -0
  54. package/dist/admin/components/AIChat/components/ImagePreview.js.map +1 -0
  55. package/dist/admin/components/AIChat/components/ImagePreview.mjs +85 -0
  56. package/dist/admin/components/AIChat/components/ImagePreview.mjs.map +1 -0
  57. package/dist/admin/components/AIChat/components/Input.js +126 -0
  58. package/dist/admin/components/AIChat/components/Input.js.map +1 -0
  59. package/dist/admin/components/AIChat/components/Input.mjs +121 -0
  60. package/dist/admin/components/AIChat/components/Input.mjs.map +1 -0
  61. package/dist/admin/components/AIChat/components/Messages/Marker.js +138 -0
  62. package/dist/admin/components/AIChat/components/Messages/Marker.js.map +1 -0
  63. package/dist/admin/components/AIChat/components/Messages/Marker.mjs +136 -0
  64. package/dist/admin/components/AIChat/components/Messages/Marker.mjs.map +1 -0
  65. package/dist/admin/components/AIChat/components/Messages/Message.js +214 -0
  66. package/dist/admin/components/AIChat/components/Messages/Message.js.map +1 -0
  67. package/dist/admin/components/AIChat/components/Messages/Message.mjs +212 -0
  68. package/dist/admin/components/AIChat/components/Messages/Message.mjs.map +1 -0
  69. package/dist/admin/components/AIChat/components/ResizableTextArea.js +78 -0
  70. package/dist/admin/components/AIChat/components/ResizableTextArea.js.map +1 -0
  71. package/dist/admin/components/AIChat/components/ResizableTextArea.mjs +76 -0
  72. package/dist/admin/components/AIChat/components/ResizableTextArea.mjs.map +1 -0
  73. package/dist/admin/components/AIChat/components/SimpleMenu.js +60 -0
  74. package/dist/admin/components/AIChat/components/SimpleMenu.js.map +1 -0
  75. package/dist/admin/components/AIChat/components/SimpleMenu.mjs +35 -0
  76. package/dist/admin/components/AIChat/components/SimpleMenu.mjs.map +1 -0
  77. package/dist/admin/components/AIChat/components/StepModal.js +175 -0
  78. package/dist/admin/components/AIChat/components/StepModal.js.map +1 -0
  79. package/dist/admin/components/AIChat/components/StepModal.mjs +171 -0
  80. package/dist/admin/components/AIChat/components/StepModal.mjs.map +1 -0
  81. package/dist/admin/components/AIChat/components/animations.js +67 -0
  82. package/dist/admin/components/AIChat/components/animations.js.map +1 -0
  83. package/dist/admin/components/AIChat/components/animations.mjs +65 -0
  84. package/dist/admin/components/AIChat/components/animations.mjs.map +1 -0
  85. package/dist/admin/components/AIChat/components/icons/FigmaIcon.js +50 -0
  86. package/dist/admin/components/AIChat/components/icons/FigmaIcon.js.map +1 -0
  87. package/dist/admin/components/AIChat/components/icons/FigmaIcon.mjs +48 -0
  88. package/dist/admin/components/AIChat/components/icons/FigmaIcon.mjs.map +1 -0
  89. package/dist/admin/components/AIChat/components/icons/StopIcon.js +25 -0
  90. package/dist/admin/components/AIChat/components/icons/StopIcon.js.map +1 -0
  91. package/dist/admin/components/AIChat/components/icons/StopIcon.mjs +23 -0
  92. package/dist/admin/components/AIChat/components/icons/StopIcon.mjs.map +1 -0
  93. package/dist/admin/components/AIChat/hooks/useAIFetch.js +107 -0
  94. package/dist/admin/components/AIChat/hooks/useAIFetch.js.map +1 -0
  95. package/dist/admin/components/AIChat/hooks/useAIFetch.mjs +96 -0
  96. package/dist/admin/components/AIChat/hooks/useAIFetch.mjs.map +1 -0
  97. package/dist/admin/components/AIChat/hooks/useAttachments.js +152 -0
  98. package/dist/admin/components/AIChat/hooks/useAttachments.js.map +1 -0
  99. package/dist/admin/components/AIChat/hooks/useAttachments.mjs +150 -0
  100. package/dist/admin/components/AIChat/hooks/useAttachments.mjs.map +1 -0
  101. package/dist/admin/components/AIChat/hooks/useChatTitle.js +47 -0
  102. package/dist/admin/components/AIChat/hooks/useChatTitle.js.map +1 -0
  103. package/dist/admin/components/AIChat/hooks/useChatTitle.mjs +45 -0
  104. package/dist/admin/components/AIChat/hooks/useChatTitle.mjs.map +1 -0
  105. package/dist/admin/components/AIChat/hooks/useCodeUpload.js +212 -0
  106. package/dist/admin/components/AIChat/hooks/useCodeUpload.js.map +1 -0
  107. package/dist/admin/components/AIChat/hooks/useCodeUpload.mjs +207 -0
  108. package/dist/admin/components/AIChat/hooks/useCodeUpload.mjs.map +1 -0
  109. package/dist/admin/components/AIChat/hooks/useFeedback.js +76 -0
  110. package/dist/admin/components/AIChat/hooks/useFeedback.js.map +1 -0
  111. package/dist/admin/components/AIChat/hooks/useFeedback.mjs +74 -0
  112. package/dist/admin/components/AIChat/hooks/useFeedback.mjs.map +1 -0
  113. package/dist/admin/components/AIChat/hooks/useFigmaUpload.js +206 -0
  114. package/dist/admin/components/AIChat/hooks/useFigmaUpload.js.map +1 -0
  115. package/dist/admin/components/AIChat/hooks/useFigmaUpload.mjs +200 -0
  116. package/dist/admin/components/AIChat/hooks/useFigmaUpload.mjs.map +1 -0
  117. package/dist/admin/components/AIChat/hooks/useLastSeenSchemas.js +115 -0
  118. package/dist/admin/components/AIChat/hooks/useLastSeenSchemas.js.map +1 -0
  119. package/dist/admin/components/AIChat/hooks/useLastSeenSchemas.mjs +113 -0
  120. package/dist/admin/components/AIChat/hooks/useLastSeenSchemas.mjs.map +1 -0
  121. package/dist/admin/components/AIChat/hooks/useTranslations.js +19 -0
  122. package/dist/admin/components/AIChat/hooks/useTranslations.js.map +1 -0
  123. package/dist/admin/components/AIChat/hooks/useTranslations.mjs +17 -0
  124. package/dist/admin/components/AIChat/hooks/useTranslations.mjs.map +1 -0
  125. package/dist/admin/components/AIChat/lib/aiClient.js +168 -0
  126. package/dist/admin/components/AIChat/lib/aiClient.js.map +1 -0
  127. package/dist/admin/components/AIChat/lib/aiClient.mjs +161 -0
  128. package/dist/admin/components/AIChat/lib/aiClient.mjs.map +1 -0
  129. package/dist/admin/components/AIChat/lib/constants.js +16 -0
  130. package/dist/admin/components/AIChat/lib/constants.js.map +1 -0
  131. package/dist/admin/components/AIChat/lib/constants.mjs +10 -0
  132. package/dist/admin/components/AIChat/lib/constants.mjs.map +1 -0
  133. package/dist/admin/components/AIChat/lib/misc.js +8 -0
  134. package/dist/admin/components/AIChat/lib/misc.js.map +1 -0
  135. package/dist/admin/components/AIChat/lib/misc.mjs +6 -0
  136. package/dist/admin/components/AIChat/lib/misc.mjs.map +1 -0
  137. package/dist/admin/components/AIChat/lib/transforms/schemas/fromCTB.js +46 -0
  138. package/dist/admin/components/AIChat/lib/transforms/schemas/fromCTB.js.map +1 -0
  139. package/dist/admin/components/AIChat/lib/transforms/schemas/fromCTB.mjs +44 -0
  140. package/dist/admin/components/AIChat/lib/transforms/schemas/fromCTB.mjs.map +1 -0
  141. package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.js +151 -0
  142. package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.js.map +1 -0
  143. package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.mjs +148 -0
  144. package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.mjs.map +1 -0
  145. package/dist/admin/components/AIChat/providers/ChatProvider.js +191 -0
  146. package/dist/admin/components/AIChat/providers/ChatProvider.js.map +1 -0
  147. package/dist/admin/components/AIChat/providers/ChatProvider.mjs +187 -0
  148. package/dist/admin/components/AIChat/providers/ChatProvider.mjs.map +1 -0
  149. package/dist/admin/components/AIChat/providers/SchemaProvider.js +90 -0
  150. package/dist/admin/components/AIChat/providers/SchemaProvider.js.map +1 -0
  151. package/dist/admin/components/AIChat/providers/SchemaProvider.mjs +88 -0
  152. package/dist/admin/components/AIChat/providers/SchemaProvider.mjs.map +1 -0
  153. package/dist/admin/components/ComponentList.js +1 -0
  154. package/dist/admin/components/ComponentList.js.map +1 -1
  155. package/dist/admin/components/ComponentList.mjs +1 -0
  156. package/dist/admin/components/ComponentList.mjs.map +1 -1
  157. package/dist/admin/components/DataManager/DataManagerContext.js.map +1 -1
  158. package/dist/admin/components/DataManager/DataManagerContext.mjs.map +1 -1
  159. package/dist/admin/components/DataManager/reducer.js +48 -6
  160. package/dist/admin/components/DataManager/reducer.js.map +1 -1
  161. package/dist/admin/components/DataManager/reducer.mjs +48 -6
  162. package/dist/admin/components/DataManager/reducer.mjs.map +1 -1
  163. package/dist/admin/components/FormModal/utils/canEditContentType.js.map +1 -1
  164. package/dist/admin/components/FormModal/utils/canEditContentType.mjs.map +1 -1
  165. package/dist/admin/pages/App/index.js +60 -29
  166. package/dist/admin/pages/App/index.js.map +1 -1
  167. package/dist/admin/pages/App/index.mjs +62 -31
  168. package/dist/admin/pages/App/index.mjs.map +1 -1
  169. package/dist/admin/pages/ListView/EmptyState.js +75 -9
  170. package/dist/admin/pages/ListView/EmptyState.js.map +1 -1
  171. package/dist/admin/pages/ListView/EmptyState.mjs +77 -11
  172. package/dist/admin/pages/ListView/EmptyState.mjs.map +1 -1
  173. package/dist/admin/src/components/AIChat/Chat.d.ts +2 -0
  174. package/dist/admin/src/components/AIChat/FeedbackModal.d.ts +13 -0
  175. package/dist/admin/src/components/AIChat/UploadCodeModal.d.ts +12 -0
  176. package/dist/admin/src/components/AIChat/UploadFigmaModal.d.ts +12 -0
  177. package/dist/admin/src/components/AIChat/components/Alert.d.ts +6 -0
  178. package/dist/admin/src/components/AIChat/components/AnimatedBox.d.ts +13 -0
  179. package/dist/admin/src/components/AIChat/components/Attachments/AttachmentPreview.d.ts +9 -0
  180. package/dist/admin/src/components/AIChat/components/Attachments/components/Attachment.d.ts +27 -0
  181. package/dist/admin/src/components/AIChat/components/Base64Image.d.ts +9 -0
  182. package/dist/admin/src/components/AIChat/components/Collapsible.d.ts +18 -0
  183. package/dist/admin/src/components/AIChat/components/Dropzone.d.ts +35 -0
  184. package/dist/admin/src/components/AIChat/components/FloatingPanel.d.ts +34 -0
  185. package/dist/admin/src/components/AIChat/components/FullScreenImage.d.ts +20 -0
  186. package/dist/admin/src/components/AIChat/components/ImagePreview.d.ts +8 -0
  187. package/dist/admin/src/components/AIChat/components/ImagePreviewGroup.d.ts +7 -0
  188. package/dist/admin/src/components/AIChat/components/Input.d.ts +43 -0
  189. package/dist/admin/src/components/AIChat/components/Messages/Marker.d.ts +2 -0
  190. package/dist/admin/src/components/AIChat/components/Messages/Message.d.ts +5 -0
  191. package/dist/admin/src/components/AIChat/components/ResizableTextArea.d.ts +9 -0
  192. package/dist/admin/src/components/AIChat/components/SimpleMenu.d.ts +32 -0
  193. package/dist/admin/src/components/AIChat/components/StepModal.d.ts +37 -0
  194. package/dist/admin/src/components/AIChat/components/animations.d.ts +8 -0
  195. package/dist/admin/src/components/AIChat/components/icons/FigmaIcon.d.ts +5 -0
  196. package/dist/admin/src/components/AIChat/components/icons/StopIcon.d.ts +5 -0
  197. package/dist/admin/src/components/AIChat/hooks/useAIFetch.d.ts +147 -0
  198. package/dist/admin/src/components/AIChat/hooks/useAttachments.d.ts +8 -0
  199. package/dist/admin/src/components/AIChat/hooks/useChatTitle.d.ts +13 -0
  200. package/dist/admin/src/components/AIChat/hooks/useCodeUpload.d.ts +31 -0
  201. package/dist/admin/src/components/AIChat/hooks/useFeedback.d.ts +7 -0
  202. package/dist/admin/src/components/AIChat/hooks/useFigmaUpload.d.ts +61 -0
  203. package/dist/admin/src/components/AIChat/hooks/useLastSeenSchemas.d.ts +10 -0
  204. package/dist/admin/src/components/AIChat/hooks/useTranslations.d.ts +3 -0
  205. package/dist/admin/src/components/AIChat/lib/aiClient.d.ts +32 -0
  206. package/dist/admin/src/components/AIChat/lib/constants.d.ts +12 -0
  207. package/dist/admin/src/components/AIChat/lib/fileToAttachment.d.ts +2 -0
  208. package/dist/admin/src/components/AIChat/lib/misc.d.ts +1 -0
  209. package/dist/admin/src/components/AIChat/lib/transforms/schemas/fromCTB.d.ts +3 -0
  210. package/dist/admin/src/components/AIChat/lib/transforms/schemas/toCTB.d.ts +16 -0
  211. package/dist/admin/src/components/AIChat/lib/types/annotations.d.ts +19 -0
  212. package/dist/admin/src/components/AIChat/lib/types/attachments.d.ts +15 -0
  213. package/dist/admin/src/components/AIChat/lib/types/feedback.d.ts +1 -0
  214. package/dist/admin/src/components/AIChat/lib/types/messages.d.ts +26 -0
  215. package/dist/admin/src/components/AIChat/lib/types/schema.d.ts +20 -0
  216. package/dist/admin/src/components/AIChat/providers/ChatProvider.d.ts +30 -0
  217. package/dist/admin/src/components/AIChat/providers/SchemaProvider.d.ts +10 -0
  218. package/dist/admin/src/components/ComponentList.d.ts +1 -1
  219. package/dist/admin/src/components/DataManager/DataManagerContext.d.ts +1 -1
  220. package/dist/admin/translations/ar.json.js +187 -2
  221. package/dist/admin/translations/ar.json.js.map +1 -1
  222. package/dist/admin/translations/ar.json.mjs +187 -3
  223. package/dist/admin/translations/ar.json.mjs.map +1 -1
  224. package/dist/admin/translations/de.json.js +42 -7
  225. package/dist/admin/translations/de.json.js.map +1 -1
  226. package/dist/admin/translations/de.json.mjs +42 -7
  227. package/dist/admin/translations/de.json.mjs.map +1 -1
  228. package/dist/admin/translations/en.json.js +53 -2
  229. package/dist/admin/translations/en.json.js.map +1 -1
  230. package/dist/admin/translations/en.json.mjs +53 -2
  231. package/dist/admin/translations/en.json.mjs.map +1 -1
  232. package/dist/admin/translations/es.json.js +37 -15
  233. package/dist/admin/translations/es.json.js.map +1 -1
  234. package/dist/admin/translations/es.json.mjs +37 -15
  235. package/dist/admin/translations/es.json.mjs.map +1 -1
  236. package/dist/admin/translations/fr.json.js +165 -3
  237. package/dist/admin/translations/fr.json.js.map +1 -1
  238. package/dist/admin/translations/fr.json.mjs +165 -4
  239. package/dist/admin/translations/fr.json.mjs.map +1 -1
  240. package/dist/admin/translations/id.json.js +93 -23
  241. package/dist/admin/translations/id.json.js.map +1 -1
  242. package/dist/admin/translations/id.json.mjs +93 -23
  243. package/dist/admin/translations/id.json.mjs.map +1 -1
  244. package/dist/admin/translations/it.json.js +75 -6
  245. package/dist/admin/translations/it.json.js.map +1 -1
  246. package/dist/admin/translations/it.json.mjs +75 -6
  247. package/dist/admin/translations/it.json.mjs.map +1 -1
  248. package/dist/admin/translations/ja.json.js +191 -5
  249. package/dist/admin/translations/ja.json.js.map +1 -1
  250. package/dist/admin/translations/ja.json.mjs +191 -6
  251. package/dist/admin/translations/ja.json.mjs.map +1 -1
  252. package/dist/admin/translations/ko.json.js +70 -16
  253. package/dist/admin/translations/ko.json.js.map +1 -1
  254. package/dist/admin/translations/ko.json.mjs +70 -16
  255. package/dist/admin/translations/ko.json.mjs.map +1 -1
  256. package/dist/admin/translations/ms.json.js +104 -31
  257. package/dist/admin/translations/ms.json.js.map +1 -1
  258. package/dist/admin/translations/ms.json.mjs +104 -31
  259. package/dist/admin/translations/ms.json.mjs.map +1 -1
  260. package/dist/admin/translations/nl.json.js +95 -15
  261. package/dist/admin/translations/nl.json.js.map +1 -1
  262. package/dist/admin/translations/nl.json.mjs +95 -15
  263. package/dist/admin/translations/nl.json.mjs.map +1 -1
  264. package/dist/admin/translations/pl.json.js +55 -11
  265. package/dist/admin/translations/pl.json.js.map +1 -1
  266. package/dist/admin/translations/pl.json.mjs +55 -11
  267. package/dist/admin/translations/pl.json.mjs.map +1 -1
  268. package/dist/admin/translations/pt-BR.json.js +54 -10
  269. package/dist/admin/translations/pt-BR.json.js.map +1 -1
  270. package/dist/admin/translations/pt-BR.json.mjs +54 -10
  271. package/dist/admin/translations/pt-BR.json.mjs.map +1 -1
  272. package/dist/admin/translations/pt.json.js +187 -2
  273. package/dist/admin/translations/pt.json.js.map +1 -1
  274. package/dist/admin/translations/pt.json.mjs +187 -3
  275. package/dist/admin/translations/pt.json.mjs.map +1 -1
  276. package/dist/admin/translations/ru.json.js +26 -1
  277. package/dist/admin/translations/ru.json.js.map +1 -1
  278. package/dist/admin/translations/ru.json.mjs +26 -1
  279. package/dist/admin/translations/ru.json.mjs.map +1 -1
  280. package/dist/admin/translations/sk.json.js +21 -1
  281. package/dist/admin/translations/sk.json.js.map +1 -1
  282. package/dist/admin/translations/sk.json.mjs +21 -1
  283. package/dist/admin/translations/sk.json.mjs.map +1 -1
  284. package/dist/admin/translations/sv.json.js +21 -1
  285. package/dist/admin/translations/sv.json.js.map +1 -1
  286. package/dist/admin/translations/sv.json.mjs +21 -1
  287. package/dist/admin/translations/sv.json.mjs.map +1 -1
  288. package/dist/admin/translations/th.json.js +21 -1
  289. package/dist/admin/translations/th.json.js.map +1 -1
  290. package/dist/admin/translations/th.json.mjs +21 -1
  291. package/dist/admin/translations/th.json.mjs.map +1 -1
  292. package/dist/admin/translations/tr.json.js +21 -1
  293. package/dist/admin/translations/tr.json.js.map +1 -1
  294. package/dist/admin/translations/tr.json.mjs +21 -1
  295. package/dist/admin/translations/tr.json.mjs.map +1 -1
  296. package/dist/admin/translations/uk.json.js +21 -2
  297. package/dist/admin/translations/uk.json.js.map +1 -1
  298. package/dist/admin/translations/uk.json.mjs +21 -2
  299. package/dist/admin/translations/uk.json.mjs.map +1 -1
  300. package/dist/admin/translations/zh-Hans.json.js +222 -133
  301. package/dist/admin/translations/zh-Hans.json.js.map +1 -1
  302. package/dist/admin/translations/zh-Hans.json.mjs +222 -133
  303. package/dist/admin/translations/zh-Hans.json.mjs.map +1 -1
  304. package/dist/admin/translations/zh.json.js +21 -1
  305. package/dist/admin/translations/zh.json.js.map +1 -1
  306. package/dist/admin/translations/zh.json.mjs +21 -1
  307. package/dist/admin/translations/zh.json.mjs.map +1 -1
  308. package/dist/server/index.js +2 -0
  309. package/dist/server/index.js.map +1 -1
  310. package/dist/server/index.mjs +2 -0
  311. package/dist/server/index.mjs.map +1 -1
  312. package/dist/server/register.js +98 -0
  313. package/dist/server/register.js.map +1 -0
  314. package/dist/server/register.mjs +96 -0
  315. package/dist/server/register.mjs.map +1 -0
  316. package/dist/server/src/controllers/ai/auth.d.ts +1 -0
  317. package/dist/server/src/controllers/ai/auth.d.ts.map +1 -0
  318. package/dist/server/src/controllers/ai/index.d.ts +1 -0
  319. package/dist/server/src/controllers/ai/index.d.ts.map +1 -0
  320. package/dist/server/src/index.d.ts +1 -0
  321. package/dist/server/src/index.d.ts.map +1 -1
  322. package/dist/server/src/register.d.ts +11 -0
  323. package/dist/server/src/register.d.ts.map +1 -0
  324. package/package.json +12 -5
  325. package/dist/admin/components/DataManager/utils/formatSchemas.js +0 -21
  326. package/dist/admin/components/DataManager/utils/formatSchemas.js.map +0 -1
  327. package/dist/admin/components/DataManager/utils/formatSchemas.mjs +0 -18
  328. package/dist/admin/components/DataManager/utils/formatSchemas.mjs.map +0 -1
@@ -0,0 +1,187 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { useState, useMemo, useEffect, useContext, createContext } from 'react';
3
+ import { useTracking } from '@strapi/admin/strapi-admin';
4
+ import { useAIAvailability } from '@strapi/admin/strapi-admin/ee';
5
+ import { useDataManager } from '../../DataManager/useDataManager.mjs';
6
+ import { FeedbackProvider } from '../FeedbackModal.mjs';
7
+ import { useAIChat } from '../hooks/useAIFetch.mjs';
8
+ import { useChatTitle } from '../hooks/useChatTitle.mjs';
9
+ import { useLastSeenSchemas } from '../hooks/useLastSeenSchemas.mjs';
10
+ import { transformCTBToChat } from '../lib/transforms/schemas/fromCTB.mjs';
11
+ import { UploadProjectToChatProvider } from '../UploadCodeModal.mjs';
12
+ import { UploadFigmaToChatProvider } from '../UploadFigmaModal.mjs';
13
+ import { SchemaChatProvider } from './SchemaProvider.mjs';
14
+
15
+ const ChatContext = /*#__PURE__*/ createContext(undefined);
16
+ const generateRandomId = ()=>{
17
+ return Math.random().toString(36).substring(2, 15);
18
+ };
19
+ const BaseChatProvider = ({ children, defaultOpen = false })=>{
20
+ const [chatId, setChatId] = useState(generateRandomId());
21
+ const [isChatOpen, setIsChatOpen] = useState(defaultOpen);
22
+ const [openCount, setOpenCount] = useState(0);
23
+ const [input, setInput] = useState('');
24
+ // Files
25
+ const [attachments, setAttachments] = useState([]);
26
+ const { trackUsage } = useTracking();
27
+ // DataManager
28
+ const { components, contentTypes } = useDataManager();
29
+ // Last user seen schemas
30
+ const { lastSeenSchemas } = useLastSeenSchemas();
31
+ // Schemas to be sent to the chat
32
+ const schemas = useMemo(()=>{
33
+ return [
34
+ ...Object.values(contentTypes).filter((schema)=>schema.status !== 'REMOVED')// Probably we should still keep this one, not sure
35
+ .filter((schema)=>schema.uid !== 'plugin::users-permissions.user').filter((schema)=>schema.visible).map(transformCTBToChat),
36
+ ...Object.values(components).filter((schema)=>schema.status !== 'REMOVED').map(transformCTBToChat)
37
+ ];
38
+ }, [
39
+ contentTypes,
40
+ components
41
+ ]);
42
+ const { id, messages, sendMessage: _sendMessage, status, stop, ...chat } = useAIChat({
43
+ id: chatId?.toString(),
44
+ experimental_throttle: 100
45
+ });
46
+ /* -------------------------------------------------------------------------------------------------
47
+ * AI SDK chat overrides
48
+ * -----------------------------------------------------------------------------------------------*/ // NOTE: body is using state variables, so they can not be passed as a prop in useChat
49
+ const sendMessage = async (message, options)=>{
50
+ if (status === 'streaming' || status === 'submitted') {
51
+ return;
52
+ }
53
+ return _sendMessage(message, {
54
+ ...options,
55
+ body: {
56
+ ...options?.body,
57
+ schemas,
58
+ metadata: {
59
+ lastSeenSchemas: lastSeenSchemas.map((schema)=>schema.uid)
60
+ }
61
+ }
62
+ });
63
+ };
64
+ const handleSubmit = (e)=>{
65
+ e.preventDefault();
66
+ if (status === 'streaming' || status === 'submitted') {
67
+ return;
68
+ }
69
+ const readyAttachments = attachments.filter((a)=>a.status !== 'loading');
70
+ if (input.trim().length === 0 && attachments.length === 0) {
71
+ return;
72
+ }
73
+ const files = readyAttachments.map((attachment)=>({
74
+ type: 'file',
75
+ filename: attachment.filename,
76
+ mediaType: attachment.mediaType,
77
+ url: attachment.url
78
+ }));
79
+ sendMessage({
80
+ text: input,
81
+ files
82
+ });
83
+ setInput('');
84
+ setAttachments([]);
85
+ };
86
+ /* -------------------------------------------------------------------------------------------------
87
+ * Chat title
88
+ * -----------------------------------------------------------------------------------------------*/ const { title, generateTitle, resetTitle } = useChatTitle({
89
+ chatId: id,
90
+ messages
91
+ });
92
+ // Automatically generate title when we have at least 1 message (user query)
93
+ useEffect(()=>{
94
+ if (messages.length >= 1 && !title) {
95
+ generateTitle();
96
+ }
97
+ }, [
98
+ messages.length,
99
+ title,
100
+ generateTitle
101
+ ]);
102
+ useEffect(()=>{
103
+ if (status === 'error') {
104
+ trackUsage('didAnswerMessage', {
105
+ successful: false
106
+ });
107
+ } else if (status === 'ready' && messages.length > 0 && messages[messages.length - 1]?.role === 'assistant') {
108
+ trackUsage('didAnswerMessage', {
109
+ successful: true
110
+ });
111
+ }
112
+ }, [
113
+ status,
114
+ messages,
115
+ trackUsage
116
+ ]);
117
+ const isChatAvailable = useAIAvailability();
118
+ return /*#__PURE__*/ jsx(ChatContext.Provider, {
119
+ value: {
120
+ isChatEnabled: isChatAvailable,
121
+ id,
122
+ status,
123
+ stop,
124
+ sendMessage,
125
+ ...chat,
126
+ messages,
127
+ handleSubmit,
128
+ input,
129
+ setInput,
130
+ handleInputChange: (e)=>setInput(e.target.value),
131
+ reset: ()=>{
132
+ stop();
133
+ setChatId(generateRandomId());
134
+ trackUsage('didStartNewChat');
135
+ resetTitle();
136
+ },
137
+ schemas,
138
+ // Chat
139
+ title,
140
+ isChatOpen,
141
+ openChat: ()=>{
142
+ setIsChatOpen(true);
143
+ // if this is the first open, it's a new chat
144
+ if (openCount === 0) {
145
+ trackUsage('didStartNewChat');
146
+ }
147
+ setOpenCount((prev)=>prev + 1);
148
+ },
149
+ closeChat: ()=>setIsChatOpen(false),
150
+ // Attachments
151
+ attachments,
152
+ setAttachments
153
+ },
154
+ children: children
155
+ });
156
+ };
157
+ const ChatProvider = ({ children, defaultOpen = false })=>{
158
+ return /*#__PURE__*/ jsx(BaseChatProvider, {
159
+ defaultOpen: defaultOpen,
160
+ children: /*#__PURE__*/ jsx(SchemaChatProvider, {
161
+ children: /*#__PURE__*/ jsx(UploadProjectToChatProvider, {
162
+ children: /*#__PURE__*/ jsx(UploadFigmaToChatProvider, {
163
+ children: /*#__PURE__*/ jsx(FeedbackProvider, {
164
+ children: children
165
+ })
166
+ })
167
+ })
168
+ })
169
+ });
170
+ };
171
+ function useStrapiChat() {
172
+ const context = useContext(ChatContext);
173
+ if (process.env.NODE_ENV === 'development') {
174
+ // In development, provide a fallback to prevent crashes during hot reloading
175
+ // This allows the app to continue working during HMR updates
176
+ if (context === undefined) {
177
+ console.warn('useStrapiChat was called outside of ChatProvider. This is only allowed in development mode.');
178
+ return {};
179
+ }
180
+ } else if (context === undefined) {
181
+ throw new Error('useStrapiChat must be used within a ChatProvider');
182
+ }
183
+ return context;
184
+ }
185
+
186
+ export { BaseChatProvider, ChatProvider, useStrapiChat };
187
+ //# sourceMappingURL=ChatProvider.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatProvider.mjs","sources":["../../../../../admin/src/components/AIChat/providers/ChatProvider.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n createContext,\n useContext,\n useMemo,\n useState,\n useEffect,\n type ReactNode,\n type ChangeEvent,\n} from 'react';\n\nimport { UIMessage, useChat } from '@ai-sdk/react';\nimport { useTracking } from '@strapi/admin/strapi-admin';\nimport { useAIAvailability } from '@strapi/admin/strapi-admin/ee';\n\nimport { useDataManager } from '../../DataManager/useDataManager';\nimport { FeedbackProvider } from '../FeedbackModal';\nimport { useAIChat } from '../hooks/useAIFetch';\nimport { useChatTitle } from '../hooks/useChatTitle';\nimport { useLastSeenSchemas } from '../hooks/useLastSeenSchemas';\nimport { transformCTBToChat } from '../lib/transforms/schemas/fromCTB';\nimport { Attachment } from '../lib/types/attachments';\nimport { Schema } from '../lib/types/schema';\nimport { UploadProjectToChatProvider } from '../UploadCodeModal';\nimport { UploadFigmaToChatProvider } from '../UploadFigmaModal';\n\nimport { SchemaChatProvider } from './SchemaProvider';\n\ninterface ChatContextType extends Omit<ReturnType<typeof useChat>, 'messages'> {\n isChatEnabled: boolean;\n title?: string;\n messages: UIMessage[];\n handleSubmit: (event: any) => void;\n input: string;\n setInput: React.Dispatch<React.SetStateAction<string>>;\n handleInputChange: (e: ChangeEvent<HTMLInputElement> | ChangeEvent<HTMLTextAreaElement>) => void;\n reset: () => void;\n schemas: Schema[];\n // Chat window\n isChatOpen: boolean;\n openChat: () => void;\n closeChat: () => void;\n // Attachments\n attachments: Attachment[];\n setAttachments: React.Dispatch<React.SetStateAction<Attachment[]>>;\n}\n\nconst ChatContext = createContext<ChatContextType | undefined>(undefined);\n\nconst generateRandomId = () => {\n return Math.random().toString(36).substring(2, 15);\n};\n\nexport const BaseChatProvider = ({\n children,\n defaultOpen = false,\n}: {\n children: ReactNode;\n defaultOpen?: boolean;\n}) => {\n const [chatId, setChatId] = useState<string | undefined>(generateRandomId());\n const [isChatOpen, setIsChatOpen] = useState(defaultOpen);\n const [openCount, setOpenCount] = useState(0);\n const [input, setInput] = useState('');\n\n // Files\n const [attachments, setAttachments] = useState<Attachment[]>([]);\n\n const { trackUsage } = useTracking();\n\n // DataManager\n const { components, contentTypes } = useDataManager();\n\n // Last user seen schemas\n const { lastSeenSchemas } = useLastSeenSchemas();\n\n // Schemas to be sent to the chat\n const schemas = useMemo(() => {\n return [\n ...Object.values(contentTypes)\n .filter((schema) => schema.status !== 'REMOVED')\n // Probably we should still keep this one, not sure\n .filter((schema) => schema.uid !== 'plugin::users-permissions.user')\n .filter((schema) => schema.visible)\n .map(transformCTBToChat as any),\n ...Object.values(components)\n .filter((schema) => schema.status !== 'REMOVED')\n .map(transformCTBToChat as any),\n ] as Schema[];\n }, [contentTypes, components]);\n\n const {\n id,\n messages,\n sendMessage: _sendMessage,\n status,\n stop,\n ...chat\n } = useAIChat({\n id: chatId?.toString(),\n experimental_throttle: 100,\n });\n\n /* -------------------------------------------------------------------------------------------------\n * AI SDK chat overrides\n * -----------------------------------------------------------------------------------------------*/\n\n // NOTE: body is using state variables, so they can not be passed as a prop in useChat\n const sendMessage: typeof _sendMessage = async (message, options) => {\n if (status === 'streaming' || status === 'submitted') {\n return;\n }\n\n return _sendMessage(message, {\n ...options,\n body: {\n ...options?.body,\n schemas,\n metadata: {\n lastSeenSchemas: lastSeenSchemas.map((schema) => schema.uid),\n },\n },\n });\n };\n\n const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n\n if (status === 'streaming' || status === 'submitted') {\n return;\n }\n\n const readyAttachments = attachments.filter((a) => a.status !== 'loading');\n if (input.trim().length === 0 && attachments.length === 0) {\n return;\n }\n\n const files = readyAttachments.map(\n (attachment) =>\n ({\n type: 'file',\n filename: attachment.filename,\n mediaType: attachment.mediaType,\n url: attachment.url,\n }) as const\n );\n sendMessage({ text: input, files });\n setInput('');\n setAttachments([]);\n };\n\n /* -------------------------------------------------------------------------------------------------\n * Chat title\n * -----------------------------------------------------------------------------------------------*/\n const { title, generateTitle, resetTitle } = useChatTitle({ chatId: id, messages });\n\n // Automatically generate title when we have at least 1 message (user query)\n useEffect(() => {\n if (messages.length >= 1 && !title) {\n generateTitle();\n }\n }, [messages.length, title, generateTitle]);\n\n useEffect(() => {\n if (status === 'error') {\n trackUsage('didAnswerMessage', {\n successful: false,\n });\n } else if (\n status === 'ready' &&\n messages.length > 0 &&\n messages[messages.length - 1]?.role === 'assistant'\n ) {\n trackUsage('didAnswerMessage', {\n successful: true,\n });\n }\n }, [status, messages, trackUsage]);\n\n const isChatAvailable = useAIAvailability();\n\n return (\n <ChatContext.Provider\n value={{\n isChatEnabled: isChatAvailable,\n id,\n status,\n stop,\n sendMessage,\n ...chat,\n messages,\n handleSubmit,\n input,\n setInput,\n handleInputChange: (e) => setInput(e.target.value),\n reset: () => {\n stop();\n setChatId(generateRandomId());\n trackUsage('didStartNewChat');\n resetTitle();\n },\n schemas,\n // Chat\n title,\n isChatOpen,\n openChat: () => {\n setIsChatOpen(true);\n // if this is the first open, it's a new chat\n if (openCount === 0) {\n trackUsage('didStartNewChat');\n }\n setOpenCount((prev) => prev + 1);\n },\n closeChat: () => setIsChatOpen(false),\n // Attachments\n attachments,\n setAttachments,\n }}\n >\n {children}\n </ChatContext.Provider>\n );\n};\n\nexport const ChatProvider = ({\n children,\n defaultOpen = false,\n}: {\n children: React.ReactNode;\n defaultOpen?: boolean;\n}) => {\n return (\n <BaseChatProvider defaultOpen={defaultOpen}>\n <SchemaChatProvider>\n <UploadProjectToChatProvider>\n <UploadFigmaToChatProvider>\n <FeedbackProvider>{children}</FeedbackProvider>\n </UploadFigmaToChatProvider>\n </UploadProjectToChatProvider>\n </SchemaChatProvider>\n </BaseChatProvider>\n );\n};\n\nexport function useStrapiChat() {\n const context = useContext(ChatContext);\n\n if (process.env.NODE_ENV === 'development') {\n // In development, provide a fallback to prevent crashes during hot reloading\n // This allows the app to continue working during HMR updates\n if (context === undefined) {\n console.warn(\n 'useStrapiChat was called outside of ChatProvider. This is only allowed in development mode.'\n );\n return {} as ChatContextType;\n }\n } else if (context === undefined) {\n throw new Error('useStrapiChat must be used within a ChatProvider');\n }\n return context;\n}\n"],"names":["ChatContext","createContext","undefined","generateRandomId","Math","random","toString","substring","BaseChatProvider","children","defaultOpen","chatId","setChatId","useState","isChatOpen","setIsChatOpen","openCount","setOpenCount","input","setInput","attachments","setAttachments","trackUsage","useTracking","components","contentTypes","useDataManager","lastSeenSchemas","useLastSeenSchemas","schemas","useMemo","Object","values","filter","schema","status","uid","visible","map","transformCTBToChat","id","messages","sendMessage","_sendMessage","stop","chat","useAIChat","experimental_throttle","message","options","body","metadata","handleSubmit","e","preventDefault","readyAttachments","a","trim","length","files","attachment","type","filename","mediaType","url","text","title","generateTitle","resetTitle","useChatTitle","useEffect","successful","role","isChatAvailable","useAIAvailability","_jsx","Provider","value","isChatEnabled","handleInputChange","target","reset","openChat","prev","closeChat","ChatProvider","SchemaChatProvider","UploadProjectToChatProvider","UploadFigmaToChatProvider","FeedbackProvider","useStrapiChat","context","useContext","process","env","NODE_ENV","console","warn","Error"],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var React = require('react');
5
+ var strapiAdmin = require('@strapi/admin/strapi-admin');
6
+ var useDataManager = require('../../DataManager/useDataManager.js');
7
+ var toCTB = require('../lib/transforms/schemas/toCTB.js');
8
+ var ChatProvider = require('./ChatProvider.js');
9
+
10
+ const SchemaContext = /*#__PURE__*/ React.createContext(undefined);
11
+ const TYPE_TO_ACTION = {
12
+ create: 'add',
13
+ update: 'update',
14
+ remove: 'delete'
15
+ };
16
+ function extractSchemaChangesFromMessage(message) {
17
+ if (message.role !== 'assistant') return [];
18
+ const changes = [];
19
+ message.parts?.forEach((part, partIndex)=>{
20
+ // We only care about the schema generation tool
21
+ if (part && typeof part === 'object' && part.type === 'tool-schemaGenerationTool') {
22
+ // Prefer validated schemas from output; ignore if there's an error or no output yet
23
+ const output = part.output;
24
+ if (!output || output.error || !Array.isArray(output.schemas)) return;
25
+ const baseId = part.toolCallId ?? `${message.id}-${partIndex}`;
26
+ output.schemas.forEach((schema, schemaIndex)=>{
27
+ const revisionId = `${baseId}-${schema.uid ?? schema.name ?? schemaIndex}`;
28
+ const type = schema.action || 'update';
29
+ changes.push({
30
+ type,
31
+ schema,
32
+ revisionId
33
+ });
34
+ });
35
+ }
36
+ });
37
+ return changes;
38
+ }
39
+ const SchemaChatProvider = ({ children })=>{
40
+ const [lastRevisedId, setLastRevisedId] = React.useState(null);
41
+ const { messages, status } = ChatProvider.useStrapiChat();
42
+ const { contentTypes, components, applyChange } = useDataManager.useDataManager();
43
+ const dispatch = strapiAdmin.useGuidedTour('SchemaChatProvider', (s)=>s.dispatch);
44
+ const state = strapiAdmin.useGuidedTour('SchemaChatProvider', (s)=>s.state);
45
+ React.useEffect(()=>{
46
+ const latestMessage = messages[messages.length - 1];
47
+ if (!latestMessage) return;
48
+ if (latestMessage.role !== 'assistant') return;
49
+ // Wait until message streaming has finished
50
+ if (status !== 'ready') return;
51
+ // const schemaChanges = latestMessage.schemaChanges;
52
+ const schemaChanges = extractSchemaChangesFromMessage(latestMessage);
53
+ // Check if addField action is already completed
54
+ const isAddFieldCompleted = state.completedActions.includes(strapiAdmin.GUIDED_TOUR_REQUIRED_ACTIONS.contentTypeBuilder.addField);
55
+ schemaChanges.forEach((change)=>{
56
+ const oldSchema = contentTypes[change.schema.uid] || components[change.schema.uid];
57
+ const newSchema = toCTB.transformChatToCTB(change.schema, oldSchema);
58
+ // Check if any attributes/fields are being added to any schema (existing or new)
59
+ if (!isAddFieldCompleted && change.schema.attributes) {
60
+ // If a field is being added or updated, dispatch guided tour action to show Save tooltip
61
+ if (change.type !== 'remove' && Object.keys(change.schema.attributes).length > 0) {
62
+ dispatch({
63
+ type: 'set_completed_actions',
64
+ payload: [
65
+ strapiAdmin.GUIDED_TOUR_REQUIRED_ACTIONS.contentTypeBuilder.addField
66
+ ]
67
+ });
68
+ }
69
+ }
70
+ applyChange({
71
+ action: TYPE_TO_ACTION[change.type],
72
+ schema: newSchema
73
+ });
74
+ });
75
+ setLastRevisedId(latestMessage.id);
76
+ // eslint-disable-next-line react-hooks/exhaustive-deps
77
+ }, [
78
+ messages
79
+ ]);
80
+ return /*#__PURE__*/ jsxRuntime.jsx(SchemaContext.Provider, {
81
+ value: {
82
+ lastRevisedId,
83
+ setLastRevisedId
84
+ },
85
+ children: children
86
+ });
87
+ };
88
+
89
+ exports.SchemaChatProvider = SchemaChatProvider;
90
+ //# sourceMappingURL=SchemaProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SchemaProvider.js","sources":["../../../../../admin/src/components/AIChat/providers/SchemaProvider.tsx"],"sourcesContent":["import { createContext, useContext, ReactNode, useEffect, useState } from 'react';\n\nimport { GUIDED_TOUR_REQUIRED_ACTIONS, useGuidedTour } from '@strapi/admin/strapi-admin';\n\nimport { useDataManager } from '../../DataManager/useDataManager';\nimport { transformChatToCTB } from '../lib/transforms/schemas/toCTB';\nimport { SchemaChange } from '../lib/types/annotations';\nimport { AIMessage } from '../lib/types/messages';\n\nimport { useStrapiChat } from './ChatProvider';\n\ninterface SchemaContextType {\n lastRevisedId: string | null;\n setLastRevisedId: (id: string | null) => void;\n}\n\nconst SchemaContext = createContext<SchemaContextType | undefined>(undefined);\n\nconst TYPE_TO_ACTION: Record<string, 'add' | 'update' | 'delete'> = {\n create: 'add',\n update: 'update',\n remove: 'delete',\n};\n\nfunction extractSchemaChangesFromMessage(message: AIMessage): SchemaChange[] {\n if (message.role !== 'assistant') return [];\n\n const changes: SchemaChange[] = [];\n\n message.parts?.forEach((part, partIndex) => {\n // We only care about the schema generation tool\n if (part && typeof part === 'object' && part.type === 'tool-schemaGenerationTool') {\n // Prefer validated schemas from output; ignore if there's an error or no output yet\n const output = part.output as { schemas?: any[]; error?: unknown } | undefined;\n if (!output || output.error || !Array.isArray(output.schemas)) return;\n\n const baseId = part.toolCallId ?? `${message.id}-${partIndex}`;\n\n output.schemas.forEach((schema, schemaIndex) => {\n const revisionId = `${baseId}-${schema.uid ?? schema.name ?? schemaIndex}`;\n const type = (schema.action as SchemaChange['type']) || 'update';\n changes.push({ type, schema, revisionId });\n });\n }\n });\n\n return changes;\n}\n\nexport const SchemaChatProvider = ({ children }: { children: ReactNode }) => {\n const [lastRevisedId, setLastRevisedId] = useState<string | null>(null);\n const { messages, status } = useStrapiChat();\n const { contentTypes, components, applyChange } = useDataManager();\n const dispatch = useGuidedTour('SchemaChatProvider', (s) => s.dispatch);\n const state = useGuidedTour('SchemaChatProvider', (s) => s.state);\n\n useEffect(() => {\n const latestMessage = messages[messages.length - 1];\n if (!latestMessage) return;\n if (latestMessage.role !== 'assistant') return;\n // Wait until message streaming has finished\n if (status !== 'ready') return;\n\n // const schemaChanges = latestMessage.schemaChanges;\n const schemaChanges = extractSchemaChangesFromMessage(latestMessage);\n\n // Check if addField action is already completed\n const isAddFieldCompleted = state.completedActions.includes(\n GUIDED_TOUR_REQUIRED_ACTIONS.contentTypeBuilder.addField\n );\n\n schemaChanges.forEach((change: SchemaChange) => {\n const oldSchema =\n contentTypes[change.schema.uid as any] || components[change.schema.uid as any];\n const newSchema = transformChatToCTB(change.schema, oldSchema);\n\n // Check if any attributes/fields are being added to any schema (existing or new)\n if (!isAddFieldCompleted && change.schema.attributes) {\n // If a field is being added or updated, dispatch guided tour action to show Save tooltip\n if (change.type !== 'remove' && Object.keys(change.schema.attributes).length > 0) {\n dispatch({\n type: 'set_completed_actions',\n payload: [GUIDED_TOUR_REQUIRED_ACTIONS.contentTypeBuilder.addField],\n });\n }\n }\n\n applyChange({\n action: TYPE_TO_ACTION[change.type]!,\n schema: newSchema,\n });\n });\n setLastRevisedId(latestMessage.id);\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [messages]);\n\n return (\n <SchemaContext.Provider value={{ lastRevisedId, setLastRevisedId }}>\n {children}\n </SchemaContext.Provider>\n );\n};\n\nexport const useChatSchema = () => {\n const context = useContext(SchemaContext);\n if (context === undefined) {\n throw new Error('useSchema must be used within a SchemaProvider');\n }\n return context;\n};\n"],"names":["SchemaContext","createContext","undefined","TYPE_TO_ACTION","create","update","remove","extractSchemaChangesFromMessage","message","role","changes","parts","forEach","part","partIndex","type","output","error","Array","isArray","schemas","baseId","toolCallId","id","schema","schemaIndex","revisionId","uid","name","action","push","SchemaChatProvider","children","lastRevisedId","setLastRevisedId","useState","messages","status","useStrapiChat","contentTypes","components","applyChange","useDataManager","dispatch","useGuidedTour","s","state","useEffect","latestMessage","length","schemaChanges","isAddFieldCompleted","completedActions","includes","GUIDED_TOUR_REQUIRED_ACTIONS","contentTypeBuilder","addField","change","oldSchema","newSchema","transformChatToCTB","attributes","Object","keys","payload","_jsx","Provider","value"],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { useState, useEffect, createContext } from 'react';
3
+ import { useGuidedTour, GUIDED_TOUR_REQUIRED_ACTIONS } from '@strapi/admin/strapi-admin';
4
+ import { useDataManager } from '../../DataManager/useDataManager.mjs';
5
+ import { transformChatToCTB } from '../lib/transforms/schemas/toCTB.mjs';
6
+ import { useStrapiChat } from './ChatProvider.mjs';
7
+
8
+ const SchemaContext = /*#__PURE__*/ createContext(undefined);
9
+ const TYPE_TO_ACTION = {
10
+ create: 'add',
11
+ update: 'update',
12
+ remove: 'delete'
13
+ };
14
+ function extractSchemaChangesFromMessage(message) {
15
+ if (message.role !== 'assistant') return [];
16
+ const changes = [];
17
+ message.parts?.forEach((part, partIndex)=>{
18
+ // We only care about the schema generation tool
19
+ if (part && typeof part === 'object' && part.type === 'tool-schemaGenerationTool') {
20
+ // Prefer validated schemas from output; ignore if there's an error or no output yet
21
+ const output = part.output;
22
+ if (!output || output.error || !Array.isArray(output.schemas)) return;
23
+ const baseId = part.toolCallId ?? `${message.id}-${partIndex}`;
24
+ output.schemas.forEach((schema, schemaIndex)=>{
25
+ const revisionId = `${baseId}-${schema.uid ?? schema.name ?? schemaIndex}`;
26
+ const type = schema.action || 'update';
27
+ changes.push({
28
+ type,
29
+ schema,
30
+ revisionId
31
+ });
32
+ });
33
+ }
34
+ });
35
+ return changes;
36
+ }
37
+ const SchemaChatProvider = ({ children })=>{
38
+ const [lastRevisedId, setLastRevisedId] = useState(null);
39
+ const { messages, status } = useStrapiChat();
40
+ const { contentTypes, components, applyChange } = useDataManager();
41
+ const dispatch = useGuidedTour('SchemaChatProvider', (s)=>s.dispatch);
42
+ const state = useGuidedTour('SchemaChatProvider', (s)=>s.state);
43
+ useEffect(()=>{
44
+ const latestMessage = messages[messages.length - 1];
45
+ if (!latestMessage) return;
46
+ if (latestMessage.role !== 'assistant') return;
47
+ // Wait until message streaming has finished
48
+ if (status !== 'ready') return;
49
+ // const schemaChanges = latestMessage.schemaChanges;
50
+ const schemaChanges = extractSchemaChangesFromMessage(latestMessage);
51
+ // Check if addField action is already completed
52
+ const isAddFieldCompleted = state.completedActions.includes(GUIDED_TOUR_REQUIRED_ACTIONS.contentTypeBuilder.addField);
53
+ schemaChanges.forEach((change)=>{
54
+ const oldSchema = contentTypes[change.schema.uid] || components[change.schema.uid];
55
+ const newSchema = transformChatToCTB(change.schema, oldSchema);
56
+ // Check if any attributes/fields are being added to any schema (existing or new)
57
+ if (!isAddFieldCompleted && change.schema.attributes) {
58
+ // If a field is being added or updated, dispatch guided tour action to show Save tooltip
59
+ if (change.type !== 'remove' && Object.keys(change.schema.attributes).length > 0) {
60
+ dispatch({
61
+ type: 'set_completed_actions',
62
+ payload: [
63
+ GUIDED_TOUR_REQUIRED_ACTIONS.contentTypeBuilder.addField
64
+ ]
65
+ });
66
+ }
67
+ }
68
+ applyChange({
69
+ action: TYPE_TO_ACTION[change.type],
70
+ schema: newSchema
71
+ });
72
+ });
73
+ setLastRevisedId(latestMessage.id);
74
+ // eslint-disable-next-line react-hooks/exhaustive-deps
75
+ }, [
76
+ messages
77
+ ]);
78
+ return /*#__PURE__*/ jsx(SchemaContext.Provider, {
79
+ value: {
80
+ lastRevisedId,
81
+ setLastRevisedId
82
+ },
83
+ children: children
84
+ });
85
+ };
86
+
87
+ export { SchemaChatProvider };
88
+ //# sourceMappingURL=SchemaProvider.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SchemaProvider.mjs","sources":["../../../../../admin/src/components/AIChat/providers/SchemaProvider.tsx"],"sourcesContent":["import { createContext, useContext, ReactNode, useEffect, useState } from 'react';\n\nimport { GUIDED_TOUR_REQUIRED_ACTIONS, useGuidedTour } from '@strapi/admin/strapi-admin';\n\nimport { useDataManager } from '../../DataManager/useDataManager';\nimport { transformChatToCTB } from '../lib/transforms/schemas/toCTB';\nimport { SchemaChange } from '../lib/types/annotations';\nimport { AIMessage } from '../lib/types/messages';\n\nimport { useStrapiChat } from './ChatProvider';\n\ninterface SchemaContextType {\n lastRevisedId: string | null;\n setLastRevisedId: (id: string | null) => void;\n}\n\nconst SchemaContext = createContext<SchemaContextType | undefined>(undefined);\n\nconst TYPE_TO_ACTION: Record<string, 'add' | 'update' | 'delete'> = {\n create: 'add',\n update: 'update',\n remove: 'delete',\n};\n\nfunction extractSchemaChangesFromMessage(message: AIMessage): SchemaChange[] {\n if (message.role !== 'assistant') return [];\n\n const changes: SchemaChange[] = [];\n\n message.parts?.forEach((part, partIndex) => {\n // We only care about the schema generation tool\n if (part && typeof part === 'object' && part.type === 'tool-schemaGenerationTool') {\n // Prefer validated schemas from output; ignore if there's an error or no output yet\n const output = part.output as { schemas?: any[]; error?: unknown } | undefined;\n if (!output || output.error || !Array.isArray(output.schemas)) return;\n\n const baseId = part.toolCallId ?? `${message.id}-${partIndex}`;\n\n output.schemas.forEach((schema, schemaIndex) => {\n const revisionId = `${baseId}-${schema.uid ?? schema.name ?? schemaIndex}`;\n const type = (schema.action as SchemaChange['type']) || 'update';\n changes.push({ type, schema, revisionId });\n });\n }\n });\n\n return changes;\n}\n\nexport const SchemaChatProvider = ({ children }: { children: ReactNode }) => {\n const [lastRevisedId, setLastRevisedId] = useState<string | null>(null);\n const { messages, status } = useStrapiChat();\n const { contentTypes, components, applyChange } = useDataManager();\n const dispatch = useGuidedTour('SchemaChatProvider', (s) => s.dispatch);\n const state = useGuidedTour('SchemaChatProvider', (s) => s.state);\n\n useEffect(() => {\n const latestMessage = messages[messages.length - 1];\n if (!latestMessage) return;\n if (latestMessage.role !== 'assistant') return;\n // Wait until message streaming has finished\n if (status !== 'ready') return;\n\n // const schemaChanges = latestMessage.schemaChanges;\n const schemaChanges = extractSchemaChangesFromMessage(latestMessage);\n\n // Check if addField action is already completed\n const isAddFieldCompleted = state.completedActions.includes(\n GUIDED_TOUR_REQUIRED_ACTIONS.contentTypeBuilder.addField\n );\n\n schemaChanges.forEach((change: SchemaChange) => {\n const oldSchema =\n contentTypes[change.schema.uid as any] || components[change.schema.uid as any];\n const newSchema = transformChatToCTB(change.schema, oldSchema);\n\n // Check if any attributes/fields are being added to any schema (existing or new)\n if (!isAddFieldCompleted && change.schema.attributes) {\n // If a field is being added or updated, dispatch guided tour action to show Save tooltip\n if (change.type !== 'remove' && Object.keys(change.schema.attributes).length > 0) {\n dispatch({\n type: 'set_completed_actions',\n payload: [GUIDED_TOUR_REQUIRED_ACTIONS.contentTypeBuilder.addField],\n });\n }\n }\n\n applyChange({\n action: TYPE_TO_ACTION[change.type]!,\n schema: newSchema,\n });\n });\n setLastRevisedId(latestMessage.id);\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [messages]);\n\n return (\n <SchemaContext.Provider value={{ lastRevisedId, setLastRevisedId }}>\n {children}\n </SchemaContext.Provider>\n );\n};\n\nexport const useChatSchema = () => {\n const context = useContext(SchemaContext);\n if (context === undefined) {\n throw new Error('useSchema must be used within a SchemaProvider');\n }\n return context;\n};\n"],"names":["SchemaContext","createContext","undefined","TYPE_TO_ACTION","create","update","remove","extractSchemaChangesFromMessage","message","role","changes","parts","forEach","part","partIndex","type","output","error","Array","isArray","schemas","baseId","toolCallId","id","schema","schemaIndex","revisionId","uid","name","action","push","SchemaChatProvider","children","lastRevisedId","setLastRevisedId","useState","messages","status","useStrapiChat","contentTypes","components","applyChange","useDataManager","dispatch","useGuidedTour","s","state","useEffect","latestMessage","length","schemaChanges","isAddFieldCompleted","completedActions","includes","GUIDED_TOUR_REQUIRED_ACTIONS","contentTypeBuilder","addField","change","oldSchema","newSchema","transformChatToCTB","attributes","Object","keys","payload","_jsx","Provider","value"],"mappings":"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"}
@@ -9,6 +9,7 @@ var List = require('./List.js');
9
9
  const ComponentList = ({ component, isFromDynamicZone = false, firstLoopComponentUid })=>{
10
10
  const { components } = useDataManager.useDataManager();
11
11
  const type = get(components, component);
12
+ if (!type) return;
12
13
  return /*#__PURE__*/ jsxRuntime.jsx(ComponentRow.ComponentRow, {
13
14
  $isChildOfDynamicZone: isFromDynamicZone,
14
15
  className: "component-row",
@@ -1 +1 @@
1
- {"version":3,"file":"ComponentList.js","sources":["../../../admin/src/components/ComponentList.tsx"],"sourcesContent":["import { Box } from '@strapi/design-system';\nimport get from 'lodash/get';\n\nimport { ComponentRow } from './ComponentRow';\nimport { useDataManager } from './DataManager/useDataManager';\nimport { List } from './List';\n\nimport type { UID } from '@strapi/types';\n\ninterface ComponentListProps {\n component: UID.Component;\n firstLoopComponentUid?: UID.Component | null;\n isFromDynamicZone?: boolean;\n}\n\nexport const ComponentList = ({\n component,\n isFromDynamicZone = false,\n firstLoopComponentUid,\n}: ComponentListProps) => {\n const { components } = useDataManager();\n const type = get(components, component);\n\n return (\n <ComponentRow $isChildOfDynamicZone={isFromDynamicZone} className=\"component-row\">\n <List\n type={type}\n firstLoopComponentUid={firstLoopComponentUid || component}\n isFromDynamicZone={isFromDynamicZone}\n isSub\n secondLoopComponentUid={firstLoopComponentUid ? component : null}\n />\n </ComponentRow>\n );\n};\n"],"names":["ComponentList","component","isFromDynamicZone","firstLoopComponentUid","components","useDataManager","type","get","_jsx","ComponentRow","$isChildOfDynamicZone","className","List","isSub","secondLoopComponentUid"],"mappings":";;;;;;;;AAeO,MAAMA,aAAgB,GAAA,CAAC,EAC5BC,SAAS,EACTC,iBAAoB,GAAA,KAAK,EACzBC,qBAAqB,EACF,GAAA;IACnB,MAAM,EAAEC,UAAU,EAAE,GAAGC,6BAAAA,EAAAA;IACvB,MAAMC,IAAAA,GAAOC,IAAIH,UAAYH,EAAAA,SAAAA,CAAAA;AAE7B,IAAA,qBACEO,cAACC,CAAAA,yBAAAA,EAAAA;QAAaC,qBAAuBR,EAAAA,iBAAAA;QAAmBS,SAAU,EAAA,eAAA;AAChE,QAAA,QAAA,gBAAAH,cAACI,CAAAA,SAAAA,EAAAA;YACCN,IAAMA,EAAAA,IAAAA;AACNH,YAAAA,qBAAAA,EAAuBA,qBAAyBF,IAAAA,SAAAA;YAChDC,iBAAmBA,EAAAA,iBAAAA;YACnBW,KAAK,EAAA,IAAA;AACLC,YAAAA,sBAAAA,EAAwBX,wBAAwBF,SAAY,GAAA;;;AAIpE;;;;"}
1
+ {"version":3,"file":"ComponentList.js","sources":["../../../admin/src/components/ComponentList.tsx"],"sourcesContent":["import get from 'lodash/get';\n\nimport { ComponentRow } from './ComponentRow';\nimport { useDataManager } from './DataManager/useDataManager';\nimport { List } from './List';\n\nimport type { UID } from '@strapi/types';\n\ninterface ComponentListProps {\n component: UID.Component;\n firstLoopComponentUid?: UID.Component | null;\n isFromDynamicZone?: boolean;\n}\n\nexport const ComponentList = ({\n component,\n isFromDynamicZone = false,\n firstLoopComponentUid,\n}: ComponentListProps) => {\n const { components } = useDataManager();\n const type = get(components, component);\n\n if (!type) return;\n\n return (\n <ComponentRow $isChildOfDynamicZone={isFromDynamicZone} className=\"component-row\">\n <List\n type={type}\n firstLoopComponentUid={firstLoopComponentUid || component}\n isFromDynamicZone={isFromDynamicZone}\n isSub\n secondLoopComponentUid={firstLoopComponentUid ? component : null}\n />\n </ComponentRow>\n );\n};\n"],"names":["ComponentList","component","isFromDynamicZone","firstLoopComponentUid","components","useDataManager","type","get","_jsx","ComponentRow","$isChildOfDynamicZone","className","List","isSub","secondLoopComponentUid"],"mappings":";;;;;;;;AAcO,MAAMA,aAAgB,GAAA,CAAC,EAC5BC,SAAS,EACTC,iBAAoB,GAAA,KAAK,EACzBC,qBAAqB,EACF,GAAA;IACnB,MAAM,EAAEC,UAAU,EAAE,GAAGC,6BAAAA,EAAAA;IACvB,MAAMC,IAAAA,GAAOC,IAAIH,UAAYH,EAAAA,SAAAA,CAAAA;AAE7B,IAAA,IAAI,CAACK,IAAM,EAAA;AAEX,IAAA,qBACEE,cAACC,CAAAA,yBAAAA,EAAAA;QAAaC,qBAAuBR,EAAAA,iBAAAA;QAAmBS,SAAU,EAAA,eAAA;AAChE,QAAA,QAAA,gBAAAH,cAACI,CAAAA,SAAAA,EAAAA;YACCN,IAAMA,EAAAA,IAAAA;AACNH,YAAAA,qBAAAA,EAAuBA,qBAAyBF,IAAAA,SAAAA;YAChDC,iBAAmBA,EAAAA,iBAAAA;YACnBW,KAAK,EAAA,IAAA;AACLC,YAAAA,sBAAAA,EAAwBX,wBAAwBF,SAAY,GAAA;;;AAIpE;;;;"}
@@ -7,6 +7,7 @@ import { List } from './List.mjs';
7
7
  const ComponentList = ({ component, isFromDynamicZone = false, firstLoopComponentUid })=>{
8
8
  const { components } = useDataManager();
9
9
  const type = get(components, component);
10
+ if (!type) return;
10
11
  return /*#__PURE__*/ jsx(ComponentRow, {
11
12
  $isChildOfDynamicZone: isFromDynamicZone,
12
13
  className: "component-row",
@@ -1 +1 @@
1
- {"version":3,"file":"ComponentList.mjs","sources":["../../../admin/src/components/ComponentList.tsx"],"sourcesContent":["import { Box } from '@strapi/design-system';\nimport get from 'lodash/get';\n\nimport { ComponentRow } from './ComponentRow';\nimport { useDataManager } from './DataManager/useDataManager';\nimport { List } from './List';\n\nimport type { UID } from '@strapi/types';\n\ninterface ComponentListProps {\n component: UID.Component;\n firstLoopComponentUid?: UID.Component | null;\n isFromDynamicZone?: boolean;\n}\n\nexport const ComponentList = ({\n component,\n isFromDynamicZone = false,\n firstLoopComponentUid,\n}: ComponentListProps) => {\n const { components } = useDataManager();\n const type = get(components, component);\n\n return (\n <ComponentRow $isChildOfDynamicZone={isFromDynamicZone} className=\"component-row\">\n <List\n type={type}\n firstLoopComponentUid={firstLoopComponentUid || component}\n isFromDynamicZone={isFromDynamicZone}\n isSub\n secondLoopComponentUid={firstLoopComponentUid ? component : null}\n />\n </ComponentRow>\n );\n};\n"],"names":["ComponentList","component","isFromDynamicZone","firstLoopComponentUid","components","useDataManager","type","get","_jsx","ComponentRow","$isChildOfDynamicZone","className","List","isSub","secondLoopComponentUid"],"mappings":";;;;;;AAeO,MAAMA,aAAgB,GAAA,CAAC,EAC5BC,SAAS,EACTC,iBAAoB,GAAA,KAAK,EACzBC,qBAAqB,EACF,GAAA;IACnB,MAAM,EAAEC,UAAU,EAAE,GAAGC,cAAAA,EAAAA;IACvB,MAAMC,IAAAA,GAAOC,IAAIH,UAAYH,EAAAA,SAAAA,CAAAA;AAE7B,IAAA,qBACEO,GAACC,CAAAA,YAAAA,EAAAA;QAAaC,qBAAuBR,EAAAA,iBAAAA;QAAmBS,SAAU,EAAA,eAAA;AAChE,QAAA,QAAA,gBAAAH,GAACI,CAAAA,IAAAA,EAAAA;YACCN,IAAMA,EAAAA,IAAAA;AACNH,YAAAA,qBAAAA,EAAuBA,qBAAyBF,IAAAA,SAAAA;YAChDC,iBAAmBA,EAAAA,iBAAAA;YACnBW,KAAK,EAAA,IAAA;AACLC,YAAAA,sBAAAA,EAAwBX,wBAAwBF,SAAY,GAAA;;;AAIpE;;;;"}
1
+ {"version":3,"file":"ComponentList.mjs","sources":["../../../admin/src/components/ComponentList.tsx"],"sourcesContent":["import get from 'lodash/get';\n\nimport { ComponentRow } from './ComponentRow';\nimport { useDataManager } from './DataManager/useDataManager';\nimport { List } from './List';\n\nimport type { UID } from '@strapi/types';\n\ninterface ComponentListProps {\n component: UID.Component;\n firstLoopComponentUid?: UID.Component | null;\n isFromDynamicZone?: boolean;\n}\n\nexport const ComponentList = ({\n component,\n isFromDynamicZone = false,\n firstLoopComponentUid,\n}: ComponentListProps) => {\n const { components } = useDataManager();\n const type = get(components, component);\n\n if (!type) return;\n\n return (\n <ComponentRow $isChildOfDynamicZone={isFromDynamicZone} className=\"component-row\">\n <List\n type={type}\n firstLoopComponentUid={firstLoopComponentUid || component}\n isFromDynamicZone={isFromDynamicZone}\n isSub\n secondLoopComponentUid={firstLoopComponentUid ? component : null}\n />\n </ComponentRow>\n );\n};\n"],"names":["ComponentList","component","isFromDynamicZone","firstLoopComponentUid","components","useDataManager","type","get","_jsx","ComponentRow","$isChildOfDynamicZone","className","List","isSub","secondLoopComponentUid"],"mappings":";;;;;;AAcO,MAAMA,aAAgB,GAAA,CAAC,EAC5BC,SAAS,EACTC,iBAAoB,GAAA,KAAK,EACzBC,qBAAqB,EACF,GAAA;IACnB,MAAM,EAAEC,UAAU,EAAE,GAAGC,cAAAA,EAAAA;IACvB,MAAMC,IAAAA,GAAOC,IAAIH,UAAYH,EAAAA,SAAAA,CAAAA;AAE7B,IAAA,IAAI,CAACK,IAAM,EAAA;AAEX,IAAA,qBACEE,GAACC,CAAAA,YAAAA,EAAAA;QAAaC,qBAAuBR,EAAAA,iBAAAA;QAAmBS,SAAU,EAAA,eAAA;AAChE,QAAA,QAAA,gBAAAH,GAACI,CAAAA,IAAAA,EAAAA;YACCN,IAAMA,EAAAA,IAAAA;AACNH,YAAAA,qBAAAA,EAAuBA,qBAAyBF,IAAAA,SAAAA;YAChDC,iBAAmBA,EAAAA,iBAAAA;YACnBW,KAAK,EAAA,IAAA;AACLC,YAAAA,sBAAAA,EAAwBX,wBAAwBF,SAAY,GAAA;;;AAIpE;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"DataManagerContext.js","sources":["../../../../admin/src/components/DataManager/DataManagerContext.ts"],"sourcesContent":["/* eslint-disable check-file/filename-naming-convention */\nimport { createContext } from 'react';\n\nimport type { Component, ContentType } from '../../types';\nimport type { Internal, Struct } from '@strapi/types';\n\nexport interface DataManagerContextValue {\n isLoading: boolean;\n addAttribute: (opts: {\n attributeToSet: Record<string, any>;\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n }) => void;\n editAttribute: (opts: {\n attributeToSet: Record<string, any>;\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n name: string;\n }) => void;\n moveAttribute: (opts: {\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n from: number;\n to: number;\n }) => void;\n addCustomFieldAttribute: (params: {\n attributeToSet: Record<string, any>;\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n }) => void;\n editCustomFieldAttribute: (params: {\n attributeToSet: Record<string, any>;\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n name: string;\n }) => void;\n addCreatedComponentToDynamicZone: (opts: {\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n dynamicZoneTarget: string;\n componentsToAdd: Internal.UID.Component[];\n }) => void;\n createComponentSchema: (opts: {\n data: {\n icon: string;\n displayName: string;\n };\n componentCategory: string;\n uid: Internal.UID.Component;\n }) => void;\n createSchema: (opts: {\n data: {\n displayName: string;\n singularName: string;\n pluralName: string;\n kind: Struct.ContentTypeKind;\n draftAndPublish: boolean;\n pluginOptions: Record<string, any>;\n };\n uid: Internal.UID.Schema;\n }) => void;\n changeDynamicZoneComponents: (opts: {\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n dynamicZoneTarget: string;\n newComponents: Internal.UID.Component[];\n }) => void;\n removeAttribute: (opts: {\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n attributeToRemoveName: string;\n }) => void;\n deleteComponent(uid: Internal.UID.Component): void;\n deleteContentType(uid: Internal.UID.ContentType): void;\n removeComponentFromDynamicZone: (opts: {\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n dzName: string;\n componentToRemoveIndex: number;\n }) => void;\n sortedContentTypesList: {\n visible: ContentType['visible'];\n name: ContentType['uid'];\n title: ContentType['info']['displayName'];\n plugin: ContentType['plugin'];\n uid: ContentType['uid'];\n to: string;\n kind: ContentType['kind'];\n restrictRelationsTo: ContentType['restrictRelationsTo'];\n status: ContentType['status'];\n }[];\n updateComponentSchema: (opts: {\n data: {\n icon: string;\n displayName: string;\n };\n componentUID: Internal.UID.Component;\n }) => void;\n updateComponentUid: (opts: {\n newComponentUID: Internal.UID.Component;\n componentUID: Internal.UID.Component;\n }) => void;\n updateSchema: (opts: {\n data: {\n displayName: string;\n kind: Struct.ContentTypeKind;\n draftAndPublish: boolean;\n pluginOptions: Record<string, any>;\n };\n uid: Internal.UID.ContentType;\n }) => void;\n initialComponents: Record<Internal.UID.Component, Component>;\n components: Record<Internal.UID.Component, Component>;\n componentsGroupedByCategory: Record<string, Component[]>;\n componentsThatHaveOtherComponentInTheirAttributes: any[]; // Define the actual type\n initialContentTypes: Record<Internal.UID.ContentType, ContentType>;\n contentTypes: Record<Internal.UID.ContentType, ContentType>;\n isInDevelopmentMode?: boolean;\n nestedComponents: any[]; // Define the actual type\n reservedNames: {\n models: string[];\n attributes: string[];\n };\n allComponentsCategories: any[];\n saveSchema(): Promise<void>;\n isModified: boolean;\n isSaving: boolean;\n applyChange: (opts: {\n action: 'add' | 'update' | 'delete';\n schema: Component | ContentType;\n }) => void;\n history: {\n undo(): void;\n redo(): void;\n discardAllChanges(): void;\n canUndo: boolean;\n canRedo: boolean;\n canDiscardAll: boolean;\n };\n}\n\n// @ts-expect-error need to pass initial value to params\nexport const DataManagerContext = createContext<DataManagerContextValue>();\n"],"names":["DataManagerContext","createContext"],"mappings":";;;;AA6IA;AACO,MAAMA,qBAAqBC,mBAAyC;;;;"}
1
+ {"version":3,"file":"DataManagerContext.js","sources":["../../../../admin/src/components/DataManager/DataManagerContext.ts"],"sourcesContent":["/* eslint-disable check-file/filename-naming-convention */\nimport { createContext } from 'react';\n\nimport type { Component, ContentType } from '../../types';\nimport type { Internal, Struct } from '@strapi/types';\n\nexport interface DataManagerContextValue {\n isLoading: boolean;\n addAttribute: (opts: {\n attributeToSet: Record<string, any>;\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n }) => void;\n editAttribute: (opts: {\n attributeToSet: Record<string, any>;\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n name: string;\n }) => void;\n moveAttribute: (opts: {\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n from: number;\n to: number;\n }) => void;\n addCustomFieldAttribute: (params: {\n attributeToSet: Record<string, any>;\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n }) => void;\n editCustomFieldAttribute: (params: {\n attributeToSet: Record<string, any>;\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n name: string;\n }) => void;\n addCreatedComponentToDynamicZone: (opts: {\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n dynamicZoneTarget: string;\n componentsToAdd: Internal.UID.Component[];\n }) => void;\n createComponentSchema: (opts: {\n data: {\n icon: string;\n displayName: string;\n };\n componentCategory: string;\n uid: Internal.UID.Component;\n }) => void;\n createSchema: (opts: {\n data: {\n displayName: string;\n singularName: string;\n pluralName: string;\n kind: Struct.ContentTypeKind;\n draftAndPublish: boolean;\n pluginOptions: Record<string, any>;\n };\n uid: Internal.UID.Schema;\n }) => void;\n changeDynamicZoneComponents: (opts: {\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n dynamicZoneTarget: string;\n newComponents: Internal.UID.Component[];\n }) => void;\n removeAttribute: (opts: {\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n attributeToRemoveName: string;\n }) => void;\n deleteComponent(uid: Internal.UID.Component): void;\n deleteContentType(uid: Internal.UID.ContentType): void;\n removeComponentFromDynamicZone: (opts: {\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n dzName: string;\n componentToRemoveIndex: number;\n }) => void;\n sortedContentTypesList: {\n visible: ContentType['visible'];\n name: ContentType['uid'];\n title: ContentType['info']['displayName'];\n plugin: ContentType['plugin'];\n uid: ContentType['uid'];\n to: string;\n kind: ContentType['kind'];\n restrictRelationsTo: ContentType['restrictRelationsTo'];\n status: ContentType['status'];\n }[];\n updateComponentSchema: (opts: {\n data: {\n icon: string;\n displayName: string;\n };\n componentUID: Internal.UID.Component;\n }) => void;\n updateComponentUid: (opts: {\n newComponentUID: Internal.UID.Component;\n componentUID: Internal.UID.Component;\n }) => void;\n updateSchema: (opts: {\n data: {\n displayName: string;\n kind: Struct.ContentTypeKind;\n draftAndPublish: boolean;\n pluginOptions: Record<string, any>;\n };\n uid: Internal.UID.ContentType;\n }) => void;\n initialComponents: Record<Internal.UID.Component, Component>;\n components: Record<Internal.UID.Component, Component>;\n componentsGroupedByCategory: Record<string, Component[]>;\n componentsThatHaveOtherComponentInTheirAttributes: any[]; // Define the actual type\n initialContentTypes: Record<Internal.UID.ContentType, ContentType>;\n contentTypes: Record<Internal.UID.ContentType, ContentType>;\n isInDevelopmentMode?: boolean;\n nestedComponents: any[]; // Define the actual type\n reservedNames: {\n models: string[];\n attributes: string[];\n };\n allComponentsCategories: any[];\n saveSchema(): Promise<void>;\n isModified: boolean;\n isSaving: boolean;\n applyChange: (opts: {\n action: 'add' | 'update' | 'delete';\n schema: ContentType | Component;\n }) => void;\n history: {\n undo(): void;\n redo(): void;\n discardAllChanges(): void;\n canUndo: boolean;\n canRedo: boolean;\n canDiscardAll: boolean;\n };\n}\n\n// @ts-expect-error need to pass initial value to params\nexport const DataManagerContext = createContext<DataManagerContextValue>();\n"],"names":["DataManagerContext","createContext"],"mappings":";;;;AA6IA;AACO,MAAMA,qBAAqBC,mBAAyC;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"DataManagerContext.mjs","sources":["../../../../admin/src/components/DataManager/DataManagerContext.ts"],"sourcesContent":["/* eslint-disable check-file/filename-naming-convention */\nimport { createContext } from 'react';\n\nimport type { Component, ContentType } from '../../types';\nimport type { Internal, Struct } from '@strapi/types';\n\nexport interface DataManagerContextValue {\n isLoading: boolean;\n addAttribute: (opts: {\n attributeToSet: Record<string, any>;\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n }) => void;\n editAttribute: (opts: {\n attributeToSet: Record<string, any>;\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n name: string;\n }) => void;\n moveAttribute: (opts: {\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n from: number;\n to: number;\n }) => void;\n addCustomFieldAttribute: (params: {\n attributeToSet: Record<string, any>;\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n }) => void;\n editCustomFieldAttribute: (params: {\n attributeToSet: Record<string, any>;\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n name: string;\n }) => void;\n addCreatedComponentToDynamicZone: (opts: {\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n dynamicZoneTarget: string;\n componentsToAdd: Internal.UID.Component[];\n }) => void;\n createComponentSchema: (opts: {\n data: {\n icon: string;\n displayName: string;\n };\n componentCategory: string;\n uid: Internal.UID.Component;\n }) => void;\n createSchema: (opts: {\n data: {\n displayName: string;\n singularName: string;\n pluralName: string;\n kind: Struct.ContentTypeKind;\n draftAndPublish: boolean;\n pluginOptions: Record<string, any>;\n };\n uid: Internal.UID.Schema;\n }) => void;\n changeDynamicZoneComponents: (opts: {\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n dynamicZoneTarget: string;\n newComponents: Internal.UID.Component[];\n }) => void;\n removeAttribute: (opts: {\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n attributeToRemoveName: string;\n }) => void;\n deleteComponent(uid: Internal.UID.Component): void;\n deleteContentType(uid: Internal.UID.ContentType): void;\n removeComponentFromDynamicZone: (opts: {\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n dzName: string;\n componentToRemoveIndex: number;\n }) => void;\n sortedContentTypesList: {\n visible: ContentType['visible'];\n name: ContentType['uid'];\n title: ContentType['info']['displayName'];\n plugin: ContentType['plugin'];\n uid: ContentType['uid'];\n to: string;\n kind: ContentType['kind'];\n restrictRelationsTo: ContentType['restrictRelationsTo'];\n status: ContentType['status'];\n }[];\n updateComponentSchema: (opts: {\n data: {\n icon: string;\n displayName: string;\n };\n componentUID: Internal.UID.Component;\n }) => void;\n updateComponentUid: (opts: {\n newComponentUID: Internal.UID.Component;\n componentUID: Internal.UID.Component;\n }) => void;\n updateSchema: (opts: {\n data: {\n displayName: string;\n kind: Struct.ContentTypeKind;\n draftAndPublish: boolean;\n pluginOptions: Record<string, any>;\n };\n uid: Internal.UID.ContentType;\n }) => void;\n initialComponents: Record<Internal.UID.Component, Component>;\n components: Record<Internal.UID.Component, Component>;\n componentsGroupedByCategory: Record<string, Component[]>;\n componentsThatHaveOtherComponentInTheirAttributes: any[]; // Define the actual type\n initialContentTypes: Record<Internal.UID.ContentType, ContentType>;\n contentTypes: Record<Internal.UID.ContentType, ContentType>;\n isInDevelopmentMode?: boolean;\n nestedComponents: any[]; // Define the actual type\n reservedNames: {\n models: string[];\n attributes: string[];\n };\n allComponentsCategories: any[];\n saveSchema(): Promise<void>;\n isModified: boolean;\n isSaving: boolean;\n applyChange: (opts: {\n action: 'add' | 'update' | 'delete';\n schema: Component | ContentType;\n }) => void;\n history: {\n undo(): void;\n redo(): void;\n discardAllChanges(): void;\n canUndo: boolean;\n canRedo: boolean;\n canDiscardAll: boolean;\n };\n}\n\n// @ts-expect-error need to pass initial value to params\nexport const DataManagerContext = createContext<DataManagerContextValue>();\n"],"names":["DataManagerContext","createContext"],"mappings":";;AA6IA;AACO,MAAMA,qBAAqBC,aAAyC;;;;"}
1
+ {"version":3,"file":"DataManagerContext.mjs","sources":["../../../../admin/src/components/DataManager/DataManagerContext.ts"],"sourcesContent":["/* eslint-disable check-file/filename-naming-convention */\nimport { createContext } from 'react';\n\nimport type { Component, ContentType } from '../../types';\nimport type { Internal, Struct } from '@strapi/types';\n\nexport interface DataManagerContextValue {\n isLoading: boolean;\n addAttribute: (opts: {\n attributeToSet: Record<string, any>;\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n }) => void;\n editAttribute: (opts: {\n attributeToSet: Record<string, any>;\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n name: string;\n }) => void;\n moveAttribute: (opts: {\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n from: number;\n to: number;\n }) => void;\n addCustomFieldAttribute: (params: {\n attributeToSet: Record<string, any>;\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n }) => void;\n editCustomFieldAttribute: (params: {\n attributeToSet: Record<string, any>;\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n name: string;\n }) => void;\n addCreatedComponentToDynamicZone: (opts: {\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n dynamicZoneTarget: string;\n componentsToAdd: Internal.UID.Component[];\n }) => void;\n createComponentSchema: (opts: {\n data: {\n icon: string;\n displayName: string;\n };\n componentCategory: string;\n uid: Internal.UID.Component;\n }) => void;\n createSchema: (opts: {\n data: {\n displayName: string;\n singularName: string;\n pluralName: string;\n kind: Struct.ContentTypeKind;\n draftAndPublish: boolean;\n pluginOptions: Record<string, any>;\n };\n uid: Internal.UID.Schema;\n }) => void;\n changeDynamicZoneComponents: (opts: {\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n dynamicZoneTarget: string;\n newComponents: Internal.UID.Component[];\n }) => void;\n removeAttribute: (opts: {\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n attributeToRemoveName: string;\n }) => void;\n deleteComponent(uid: Internal.UID.Component): void;\n deleteContentType(uid: Internal.UID.ContentType): void;\n removeComponentFromDynamicZone: (opts: {\n forTarget: Struct.ModelType;\n targetUid: Internal.UID.Schema;\n dzName: string;\n componentToRemoveIndex: number;\n }) => void;\n sortedContentTypesList: {\n visible: ContentType['visible'];\n name: ContentType['uid'];\n title: ContentType['info']['displayName'];\n plugin: ContentType['plugin'];\n uid: ContentType['uid'];\n to: string;\n kind: ContentType['kind'];\n restrictRelationsTo: ContentType['restrictRelationsTo'];\n status: ContentType['status'];\n }[];\n updateComponentSchema: (opts: {\n data: {\n icon: string;\n displayName: string;\n };\n componentUID: Internal.UID.Component;\n }) => void;\n updateComponentUid: (opts: {\n newComponentUID: Internal.UID.Component;\n componentUID: Internal.UID.Component;\n }) => void;\n updateSchema: (opts: {\n data: {\n displayName: string;\n kind: Struct.ContentTypeKind;\n draftAndPublish: boolean;\n pluginOptions: Record<string, any>;\n };\n uid: Internal.UID.ContentType;\n }) => void;\n initialComponents: Record<Internal.UID.Component, Component>;\n components: Record<Internal.UID.Component, Component>;\n componentsGroupedByCategory: Record<string, Component[]>;\n componentsThatHaveOtherComponentInTheirAttributes: any[]; // Define the actual type\n initialContentTypes: Record<Internal.UID.ContentType, ContentType>;\n contentTypes: Record<Internal.UID.ContentType, ContentType>;\n isInDevelopmentMode?: boolean;\n nestedComponents: any[]; // Define the actual type\n reservedNames: {\n models: string[];\n attributes: string[];\n };\n allComponentsCategories: any[];\n saveSchema(): Promise<void>;\n isModified: boolean;\n isSaving: boolean;\n applyChange: (opts: {\n action: 'add' | 'update' | 'delete';\n schema: ContentType | Component;\n }) => void;\n history: {\n undo(): void;\n redo(): void;\n discardAllChanges(): void;\n canUndo: boolean;\n canRedo: boolean;\n canDiscardAll: boolean;\n };\n}\n\n// @ts-expect-error need to pass initial value to params\nexport const DataManagerContext = createContext<DataManagerContextValue>();\n"],"names":["DataManagerContext","createContext"],"mappings":";;AA6IA;AACO,MAAMA,qBAAqBC,aAAyC;;;;"}
@@ -5,7 +5,6 @@ var omit = require('lodash/omit');
5
5
  var getRelationType = require('../../utils/getRelationType.js');
6
6
  var makeUnique = require('../../utils/makeUnique.js');
7
7
  var undoRedo = require('./undoRedo.js');
8
- var formatSchemas = require('./utils/formatSchemas.js');
9
8
 
10
9
  const initialState = {
11
10
  components: {},
@@ -501,20 +500,63 @@ const slice = undoRedo.createUndoRedoSlice({
501
500
  switch(action){
502
501
  case 'add':
503
502
  {
504
- // generate a uid ?
505
503
  const uid = schema.uid;
506
504
  if (schema.modelType === 'component') {
505
+ state.components[uid] = schema;
506
+ } else {
507
+ state.contentTypes[uid] = schema;
508
+ }
509
+ }
510
+ break;
511
+ case 'update':
512
+ {
513
+ const uid = schema.uid;
514
+ // Find the schema, if the state was "create", we should keep it as it was before
515
+ if (schema.modelType === 'component') {
516
+ const component = state.components[uid];
507
517
  state.components[uid] = {
508
- ...formatSchemas.formatSchema(schema),
509
- status: 'NEW'
518
+ ...schema,
519
+ status: component?.status === 'NEW' ? 'NEW' : schema.status
510
520
  };
511
521
  } else {
522
+ const contentType = state.contentTypes[uid];
512
523
  state.contentTypes[uid] = {
513
- ...formatSchemas.formatSchema(schema),
514
- status: 'NEW'
524
+ ...schema,
525
+ status: contentType?.status === 'NEW' ? 'NEW' : schema.status
515
526
  };
516
527
  }
517
528
  }
529
+ break;
530
+ case 'delete':
531
+ {
532
+ const uid = schema.uid;
533
+ const isComponent = schema.modelType === 'component';
534
+ // It's a component that has yet not been added
535
+ if (isComponent) {
536
+ const exists = state.components[uid];
537
+ if (!exists) {
538
+ return;
539
+ }
540
+ const isUnsaved = state.components[uid]?.status === 'NEW';
541
+ if (isUnsaved) {
542
+ delete state.components[uid];
543
+ } else {
544
+ state.components[uid].status = 'REMOVED';
545
+ }
546
+ } else {
547
+ const exists = state.contentTypes[uid];
548
+ if (!exists) {
549
+ return;
550
+ }
551
+ const isUnsaved = state.contentTypes[uid]?.status === 'NEW';
552
+ if (isUnsaved) {
553
+ delete state.contentTypes[uid];
554
+ } else {
555
+ state.contentTypes[uid].status = 'REMOVED';
556
+ }
557
+ }
558
+ break;
559
+ }
518
560
  }
519
561
  }
520
562
  }