@carlonicora/nextjs-jsonapi 1.2.0 → 1.3.1

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 (272) hide show
  1. package/dist/{BlockNoteEditor-CNXQ3WL3.js → BlockNoteEditor-7WYPN34K.js} +17 -17
  2. package/dist/{BlockNoteEditor-CNXQ3WL3.js.map → BlockNoteEditor-7WYPN34K.js.map} +1 -1
  3. package/dist/{BlockNoteEditor-DC33K4IF.mjs → BlockNoteEditor-V625C23O.mjs} +7 -7
  4. package/dist/{JsonApiRequest-O7BGUMFO.mjs → JsonApiRequest-6UR7DIAR.mjs} +4 -2
  5. package/dist/JsonApiRequest-UJ7FGIVI.js +25 -0
  6. package/dist/JsonApiRequest-UJ7FGIVI.js.map +1 -0
  7. package/dist/{chunk-EZK3H6EJ.js → chunk-5IET37O4.js} +206 -206
  8. package/dist/{chunk-EZK3H6EJ.js.map → chunk-5IET37O4.js.map} +1 -1
  9. package/dist/{chunk-Y4XI3AZR.mjs → chunk-5QC7A6BL.mjs} +32 -20
  10. package/dist/chunk-5QC7A6BL.mjs.map +1 -0
  11. package/dist/{chunk-LJRD4SRV.js → chunk-DEYKTLA3.js} +6 -6
  12. package/dist/{chunk-LJRD4SRV.js.map → chunk-DEYKTLA3.js.map} +1 -1
  13. package/dist/{chunk-NPPQNSXN.mjs → chunk-FMBQZAIP.mjs} +3 -3
  14. package/dist/{chunk-MHVXFWZY.mjs → chunk-HTLEKZND.mjs} +3 -3
  15. package/dist/{chunk-74F6BBHH.mjs → chunk-IKBA4AHN.mjs} +2 -1
  16. package/dist/chunk-IKBA4AHN.mjs.map +1 -0
  17. package/dist/{chunk-JLN6UWII.mjs → chunk-JGFWIT2E.mjs} +2 -2
  18. package/dist/{chunk-KDFDGXCX.js → chunk-K2ANOT66.js} +576 -564
  19. package/dist/chunk-K2ANOT66.js.map +1 -0
  20. package/dist/{chunk-X53MF5ZN.mjs → chunk-P2F54I7Q.mjs} +2 -2
  21. package/dist/{chunk-5ZEADNNP.js → chunk-PMXG5WBC.js} +3 -2
  22. package/dist/chunk-PMXG5WBC.js.map +1 -0
  23. package/dist/{chunk-L6LH7WA4.js → chunk-PO5Q3H5I.js} +190 -190
  24. package/dist/{chunk-L6LH7WA4.js.map → chunk-PO5Q3H5I.js.map} +1 -1
  25. package/dist/{chunk-WZJDLITG.js → chunk-Q4FXESVT.js} +3 -3
  26. package/dist/{chunk-WZJDLITG.js.map → chunk-Q4FXESVT.js.map} +1 -1
  27. package/dist/client/index.js +7 -7
  28. package/dist/client/index.mjs +6 -6
  29. package/dist/components/index.js +7 -7
  30. package/dist/components/index.mjs +6 -6
  31. package/dist/contexts/index.js +7 -7
  32. package/dist/contexts/index.mjs +6 -6
  33. package/dist/core/index.js +2 -2
  34. package/dist/core/index.mjs +1 -1
  35. package/dist/features/index.js +4 -4
  36. package/dist/features/index.mjs +3 -3
  37. package/dist/hooks/index.js +7 -7
  38. package/dist/hooks/index.mjs +6 -6
  39. package/dist/index.d.mts +2 -1
  40. package/dist/index.d.ts +2 -1
  41. package/dist/index.js +5 -3
  42. package/dist/index.js.map +1 -1
  43. package/dist/index.mjs +4 -2
  44. package/dist/scripts/generate-web-module/generator.d.ts +15 -0
  45. package/dist/scripts/generate-web-module/generator.d.ts.map +1 -0
  46. package/dist/scripts/generate-web-module/generator.js +320 -0
  47. package/dist/scripts/generate-web-module/generator.js.map +1 -0
  48. package/dist/scripts/generate-web-module/index.d.ts +16 -0
  49. package/dist/scripts/generate-web-module/index.d.ts.map +1 -0
  50. package/dist/scripts/generate-web-module/index.js +80 -0
  51. package/dist/scripts/generate-web-module/index.js.map +1 -0
  52. package/dist/scripts/generate-web-module/templates/components/container.template.d.ts +14 -0
  53. package/dist/scripts/generate-web-module/templates/components/container.template.d.ts.map +1 -0
  54. package/dist/scripts/generate-web-module/templates/components/container.template.js +124 -0
  55. package/dist/scripts/generate-web-module/templates/components/container.template.js.map +1 -0
  56. package/dist/scripts/generate-web-module/templates/components/content.template.d.ts +15 -0
  57. package/dist/scripts/generate-web-module/templates/components/content.template.d.ts.map +1 -0
  58. package/dist/scripts/generate-web-module/templates/components/content.template.js +39 -0
  59. package/dist/scripts/generate-web-module/templates/components/content.template.js.map +1 -0
  60. package/dist/scripts/generate-web-module/templates/components/deleter.template.d.ts +14 -0
  61. package/dist/scripts/generate-web-module/templates/components/deleter.template.d.ts.map +1 -0
  62. package/dist/scripts/generate-web-module/templates/components/deleter.template.js +51 -0
  63. package/dist/scripts/generate-web-module/templates/components/deleter.template.js.map +1 -0
  64. package/dist/scripts/generate-web-module/templates/components/details.template.d.ts +14 -0
  65. package/dist/scripts/generate-web-module/templates/components/details.template.d.ts.map +1 -0
  66. package/dist/scripts/generate-web-module/templates/components/details.template.js +109 -0
  67. package/dist/scripts/generate-web-module/templates/components/details.template.js.map +1 -0
  68. package/dist/scripts/generate-web-module/templates/components/editor.template.d.ts +14 -0
  69. package/dist/scripts/generate-web-module/templates/components/editor.template.d.ts.map +1 -0
  70. package/dist/scripts/generate-web-module/templates/components/editor.template.js +459 -0
  71. package/dist/scripts/generate-web-module/templates/components/editor.template.js.map +1 -0
  72. package/dist/scripts/generate-web-module/templates/components/index.d.ts +15 -0
  73. package/dist/scripts/generate-web-module/templates/components/index.d.ts.map +1 -0
  74. package/dist/scripts/generate-web-module/templates/components/index.js +29 -0
  75. package/dist/scripts/generate-web-module/templates/components/index.js.map +1 -0
  76. package/dist/scripts/generate-web-module/templates/components/list-container.template.d.ts +14 -0
  77. package/dist/scripts/generate-web-module/templates/components/list-container.template.d.ts.map +1 -0
  78. package/dist/scripts/generate-web-module/templates/components/list-container.template.js +30 -0
  79. package/dist/scripts/generate-web-module/templates/components/list-container.template.js.map +1 -0
  80. package/dist/scripts/generate-web-module/templates/components/list.template.d.ts +14 -0
  81. package/dist/scripts/generate-web-module/templates/components/list.template.d.ts.map +1 -0
  82. package/dist/scripts/generate-web-module/templates/components/list.template.js +84 -0
  83. package/dist/scripts/generate-web-module/templates/components/list.template.js.map +1 -0
  84. package/dist/scripts/generate-web-module/templates/components/multi-selector.template.d.ts +14 -0
  85. package/dist/scripts/generate-web-module/templates/components/multi-selector.template.d.ts.map +1 -0
  86. package/dist/scripts/generate-web-module/templates/components/multi-selector.template.js +184 -0
  87. package/dist/scripts/generate-web-module/templates/components/multi-selector.template.js.map +1 -0
  88. package/dist/scripts/generate-web-module/templates/components/selector.template.d.ts +14 -0
  89. package/dist/scripts/generate-web-module/templates/components/selector.template.d.ts.map +1 -0
  90. package/dist/scripts/generate-web-module/templates/components/selector.template.js +199 -0
  91. package/dist/scripts/generate-web-module/templates/components/selector.template.js.map +1 -0
  92. package/dist/scripts/generate-web-module/templates/context.template.d.ts +14 -0
  93. package/dist/scripts/generate-web-module/templates/context.template.d.ts.map +1 -0
  94. package/dist/scripts/generate-web-module/templates/context.template.js +121 -0
  95. package/dist/scripts/generate-web-module/templates/context.template.js.map +1 -0
  96. package/dist/scripts/generate-web-module/templates/data/fields.template.d.ts +14 -0
  97. package/dist/scripts/generate-web-module/templates/data/fields.template.d.ts.map +1 -0
  98. package/dist/scripts/generate-web-module/templates/data/fields.template.js +55 -0
  99. package/dist/scripts/generate-web-module/templates/data/fields.template.js.map +1 -0
  100. package/dist/scripts/generate-web-module/templates/data/index.d.ts +10 -0
  101. package/dist/scripts/generate-web-module/templates/data/index.d.ts.map +1 -0
  102. package/dist/scripts/generate-web-module/templates/data/index.js +26 -0
  103. package/dist/scripts/generate-web-module/templates/data/index.js.map +1 -0
  104. package/dist/scripts/generate-web-module/templates/data/interface.template.d.ts +14 -0
  105. package/dist/scripts/generate-web-module/templates/data/interface.template.d.ts.map +1 -0
  106. package/dist/scripts/generate-web-module/templates/data/interface.template.js +116 -0
  107. package/dist/scripts/generate-web-module/templates/data/interface.template.js.map +1 -0
  108. package/dist/scripts/generate-web-module/templates/data/model.template.d.ts +14 -0
  109. package/dist/scripts/generate-web-module/templates/data/model.template.d.ts.map +1 -0
  110. package/dist/scripts/generate-web-module/templates/data/model.template.js +274 -0
  111. package/dist/scripts/generate-web-module/templates/data/model.template.js.map +1 -0
  112. package/dist/scripts/generate-web-module/templates/data/service.template.d.ts +14 -0
  113. package/dist/scripts/generate-web-module/templates/data/service.template.d.ts.map +1 -0
  114. package/dist/scripts/generate-web-module/templates/data/service.template.js +168 -0
  115. package/dist/scripts/generate-web-module/templates/data/service.template.js.map +1 -0
  116. package/dist/scripts/generate-web-module/templates/index.d.ts +12 -0
  117. package/dist/scripts/generate-web-module/templates/index.d.ts.map +1 -0
  118. package/dist/scripts/generate-web-module/templates/index.js +37 -0
  119. package/dist/scripts/generate-web-module/templates/index.js.map +1 -0
  120. package/dist/scripts/generate-web-module/templates/module.template.d.ts +14 -0
  121. package/dist/scripts/generate-web-module/templates/module.template.d.ts.map +1 -0
  122. package/dist/scripts/generate-web-module/templates/module.template.js +64 -0
  123. package/dist/scripts/generate-web-module/templates/module.template.js.map +1 -0
  124. package/dist/scripts/generate-web-module/templates/pages/detail-page.template.d.ts +14 -0
  125. package/dist/scripts/generate-web-module/templates/pages/detail-page.template.d.ts.map +1 -0
  126. package/dist/scripts/generate-web-module/templates/pages/detail-page.template.js +65 -0
  127. package/dist/scripts/generate-web-module/templates/pages/detail-page.template.js.map +1 -0
  128. package/dist/scripts/generate-web-module/templates/pages/index.d.ts +8 -0
  129. package/dist/scripts/generate-web-module/templates/pages/index.d.ts.map +1 -0
  130. package/dist/scripts/generate-web-module/templates/pages/index.js +13 -0
  131. package/dist/scripts/generate-web-module/templates/pages/index.js.map +1 -0
  132. package/dist/scripts/generate-web-module/templates/pages/list-page.template.d.ts +14 -0
  133. package/dist/scripts/generate-web-module/templates/pages/list-page.template.d.ts.map +1 -0
  134. package/dist/scripts/generate-web-module/templates/pages/list-page.template.js +37 -0
  135. package/dist/scripts/generate-web-module/templates/pages/list-page.template.js.map +1 -0
  136. package/dist/scripts/generate-web-module/templates/table-hook.template.d.ts +14 -0
  137. package/dist/scripts/generate-web-module/templates/table-hook.template.d.ts.map +1 -0
  138. package/dist/scripts/generate-web-module/templates/table-hook.template.js +174 -0
  139. package/dist/scripts/generate-web-module/templates/table-hook.template.js.map +1 -0
  140. package/dist/scripts/generate-web-module/transformers/field-mapper.d.ts +55 -0
  141. package/dist/scripts/generate-web-module/transformers/field-mapper.d.ts.map +1 -0
  142. package/dist/scripts/generate-web-module/transformers/field-mapper.js +179 -0
  143. package/dist/scripts/generate-web-module/transformers/field-mapper.js.map +1 -0
  144. package/dist/scripts/generate-web-module/transformers/i18n-generator.d.ts +78 -0
  145. package/dist/scripts/generate-web-module/transformers/i18n-generator.d.ts.map +1 -0
  146. package/dist/scripts/generate-web-module/transformers/i18n-generator.js +182 -0
  147. package/dist/scripts/generate-web-module/transformers/i18n-generator.js.map +1 -0
  148. package/dist/scripts/generate-web-module/transformers/import-resolver.d.ts +106 -0
  149. package/dist/scripts/generate-web-module/transformers/import-resolver.d.ts.map +1 -0
  150. package/dist/scripts/generate-web-module/transformers/import-resolver.js +193 -0
  151. package/dist/scripts/generate-web-module/transformers/import-resolver.js.map +1 -0
  152. package/dist/scripts/generate-web-module/transformers/index.d.ts +12 -0
  153. package/dist/scripts/generate-web-module/transformers/index.d.ts.map +1 -0
  154. package/dist/scripts/generate-web-module/transformers/index.js +28 -0
  155. package/dist/scripts/generate-web-module/transformers/index.js.map +1 -0
  156. package/dist/scripts/generate-web-module/transformers/name-transformer.d.ts +60 -0
  157. package/dist/scripts/generate-web-module/transformers/name-transformer.d.ts.map +1 -0
  158. package/dist/scripts/generate-web-module/transformers/name-transformer.js +115 -0
  159. package/dist/scripts/generate-web-module/transformers/name-transformer.js.map +1 -0
  160. package/dist/scripts/generate-web-module/transformers/parent-detector.d.ts +57 -0
  161. package/dist/scripts/generate-web-module/transformers/parent-detector.d.ts.map +1 -0
  162. package/dist/scripts/generate-web-module/transformers/parent-detector.js +88 -0
  163. package/dist/scripts/generate-web-module/transformers/parent-detector.js.map +1 -0
  164. package/dist/scripts/generate-web-module/transformers/relationship-resolver.d.ts +68 -0
  165. package/dist/scripts/generate-web-module/transformers/relationship-resolver.d.ts.map +1 -0
  166. package/dist/scripts/generate-web-module/transformers/relationship-resolver.js +219 -0
  167. package/dist/scripts/generate-web-module/transformers/relationship-resolver.js.map +1 -0
  168. package/dist/scripts/generate-web-module/types/field-mapping.types.d.ts +68 -0
  169. package/dist/scripts/generate-web-module/types/field-mapping.types.d.ts.map +1 -0
  170. package/dist/scripts/generate-web-module/types/field-mapping.types.js +129 -0
  171. package/dist/scripts/generate-web-module/types/field-mapping.types.js.map +1 -0
  172. package/dist/scripts/generate-web-module/types/index.d.ts +9 -0
  173. package/dist/scripts/generate-web-module/types/index.d.ts.map +1 -0
  174. package/dist/scripts/generate-web-module/types/index.js +25 -0
  175. package/dist/scripts/generate-web-module/types/index.js.map +1 -0
  176. package/dist/scripts/generate-web-module/types/json-schema.interface.d.ts +40 -0
  177. package/dist/scripts/generate-web-module/types/json-schema.interface.d.ts.map +1 -0
  178. package/dist/scripts/generate-web-module/types/json-schema.interface.js +10 -0
  179. package/dist/scripts/generate-web-module/types/json-schema.interface.js.map +1 -0
  180. package/dist/scripts/generate-web-module/types/template-data.interface.d.ts +128 -0
  181. package/dist/scripts/generate-web-module/types/template-data.interface.d.ts.map +1 -0
  182. package/dist/scripts/generate-web-module/types/template-data.interface.js +9 -0
  183. package/dist/scripts/generate-web-module/types/template-data.interface.js.map +1 -0
  184. package/dist/scripts/generate-web-module/utils/bootstrapper-updater.d.ts +29 -0
  185. package/dist/scripts/generate-web-module/utils/bootstrapper-updater.d.ts.map +1 -0
  186. package/dist/scripts/generate-web-module/utils/bootstrapper-updater.js +153 -0
  187. package/dist/scripts/generate-web-module/utils/bootstrapper-updater.js.map +1 -0
  188. package/dist/scripts/generate-web-module/utils/file-writer.d.ts +38 -0
  189. package/dist/scripts/generate-web-module/utils/file-writer.d.ts.map +1 -0
  190. package/dist/scripts/generate-web-module/utils/file-writer.js +126 -0
  191. package/dist/scripts/generate-web-module/utils/file-writer.js.map +1 -0
  192. package/dist/scripts/generate-web-module/utils/i18n-updater.d.ts +28 -0
  193. package/dist/scripts/generate-web-module/utils/i18n-updater.d.ts.map +1 -0
  194. package/dist/scripts/generate-web-module/utils/i18n-updater.js +122 -0
  195. package/dist/scripts/generate-web-module/utils/i18n-updater.js.map +1 -0
  196. package/dist/scripts/generate-web-module/utils/index.d.ts +9 -0
  197. package/dist/scripts/generate-web-module/utils/index.d.ts.map +1 -0
  198. package/dist/scripts/generate-web-module/utils/index.js +20 -0
  199. package/dist/scripts/generate-web-module/utils/index.js.map +1 -0
  200. package/dist/scripts/generate-web-module/validators/json-schema-validator.d.ts +46 -0
  201. package/dist/scripts/generate-web-module/validators/json-schema-validator.d.ts.map +1 -0
  202. package/dist/scripts/generate-web-module/validators/json-schema-validator.js +265 -0
  203. package/dist/scripts/generate-web-module/validators/json-schema-validator.js.map +1 -0
  204. package/dist/shadcnui/index.js +4 -4
  205. package/dist/shadcnui/index.mjs +3 -3
  206. package/dist/utils/index.js +3 -3
  207. package/dist/utils/index.mjs +2 -2
  208. package/package.json +27 -21
  209. package/scripts/generate-web-module/generator.ts +363 -0
  210. package/scripts/generate-web-module/index.ts +49 -0
  211. package/scripts/generate-web-module/templates/components/container.template.ts +129 -0
  212. package/scripts/generate-web-module/templates/components/content.template.ts +40 -0
  213. package/scripts/generate-web-module/templates/components/deleter.template.ts +51 -0
  214. package/scripts/generate-web-module/templates/components/details.template.ts +115 -0
  215. package/scripts/generate-web-module/templates/components/editor.template.ts +495 -0
  216. package/scripts/generate-web-module/templates/components/index.ts +18 -0
  217. package/scripts/generate-web-module/templates/components/list-container.template.ts +30 -0
  218. package/scripts/generate-web-module/templates/components/list.template.ts +91 -0
  219. package/scripts/generate-web-module/templates/components/multi-selector.template.ts +184 -0
  220. package/scripts/generate-web-module/templates/components/selector.template.ts +199 -0
  221. package/scripts/generate-web-module/templates/context.template.ts +121 -0
  222. package/scripts/generate-web-module/templates/data/fields.template.ts +64 -0
  223. package/scripts/generate-web-module/templates/data/index.ts +10 -0
  224. package/scripts/generate-web-module/templates/data/interface.template.ts +136 -0
  225. package/scripts/generate-web-module/templates/data/model.template.ts +327 -0
  226. package/scripts/generate-web-module/templates/data/service.template.ts +185 -0
  227. package/scripts/generate-web-module/templates/index.ts +34 -0
  228. package/scripts/generate-web-module/templates/module.template.ts +69 -0
  229. package/scripts/generate-web-module/templates/pages/detail-page.template.ts +65 -0
  230. package/scripts/generate-web-module/templates/pages/index.ts +8 -0
  231. package/scripts/generate-web-module/templates/pages/list-page.template.ts +37 -0
  232. package/scripts/generate-web-module/templates/table-hook.template.ts +182 -0
  233. package/scripts/generate-web-module/transformers/field-mapper.ts +201 -0
  234. package/scripts/generate-web-module/transformers/i18n-generator.ts +199 -0
  235. package/scripts/generate-web-module/transformers/import-resolver.ts +250 -0
  236. package/scripts/generate-web-module/transformers/index.ts +12 -0
  237. package/scripts/generate-web-module/transformers/name-transformer.ts +115 -0
  238. package/scripts/generate-web-module/transformers/parent-detector.ts +87 -0
  239. package/scripts/generate-web-module/transformers/relationship-resolver.ts +221 -0
  240. package/scripts/generate-web-module/tsconfig.json +24 -0
  241. package/scripts/generate-web-module/types/field-mapping.types.ts +141 -0
  242. package/scripts/generate-web-module/types/index.ts +9 -0
  243. package/scripts/generate-web-module/types/json-schema.interface.ts +42 -0
  244. package/scripts/generate-web-module/types/template-data.interface.ts +164 -0
  245. package/scripts/generate-web-module/utils/bootstrapper-updater.ts +145 -0
  246. package/scripts/generate-web-module/utils/file-writer.ts +115 -0
  247. package/scripts/generate-web-module/utils/i18n-updater.ts +108 -0
  248. package/scripts/generate-web-module/utils/index.ts +9 -0
  249. package/scripts/generate-web-module/validators/json-schema-validator.ts +306 -0
  250. package/src/components/errors/ErrorDetails.tsx +2 -2
  251. package/src/features/auth/components/containers/AuthContainer.tsx +1 -1
  252. package/src/features/auth/components/details/LandingComponent.tsx +20 -1
  253. package/src/features/auth/components/forms/AcceptInvitation.tsx +1 -1
  254. package/src/features/auth/components/forms/ActivateAccount.tsx +1 -1
  255. package/src/features/auth/components/forms/ForgotPassword.tsx +1 -1
  256. package/src/features/auth/components/forms/Login.tsx +1 -1
  257. package/src/features/auth/components/forms/Register.tsx +1 -1
  258. package/src/features/auth/components/forms/ResetPassword.tsx +1 -1
  259. package/src/features/company/components/forms/CompanyLicense.tsx +1 -8
  260. package/src/unified/JsonApiRequest.ts +2 -2
  261. package/dist/JsonApiRequest-VARLNKAF.js +0 -23
  262. package/dist/JsonApiRequest-VARLNKAF.js.map +0 -1
  263. package/dist/chunk-5ZEADNNP.js.map +0 -1
  264. package/dist/chunk-74F6BBHH.mjs.map +0 -1
  265. package/dist/chunk-KDFDGXCX.js.map +0 -1
  266. package/dist/chunk-Y4XI3AZR.mjs.map +0 -1
  267. /package/dist/{BlockNoteEditor-DC33K4IF.mjs.map → BlockNoteEditor-V625C23O.mjs.map} +0 -0
  268. /package/dist/{JsonApiRequest-O7BGUMFO.mjs.map → JsonApiRequest-6UR7DIAR.mjs.map} +0 -0
  269. /package/dist/{chunk-NPPQNSXN.mjs.map → chunk-FMBQZAIP.mjs.map} +0 -0
  270. /package/dist/{chunk-MHVXFWZY.mjs.map → chunk-HTLEKZND.mjs.map} +0 -0
  271. /package/dist/{chunk-JLN6UWII.mjs.map → chunk-JGFWIT2E.mjs.map} +0 -0
  272. /package/dist/{chunk-X53MF5ZN.mjs.map → chunk-P2F54I7Q.mjs.map} +0 -0
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ /**
3
+ * List Template
4
+ *
5
+ * Generates {Module}List.tsx component for displaying a list of items.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.generateListTemplate = generateListTemplate;
9
+ const name_transformer_1 = require("../../transformers/name-transformer");
10
+ /**
11
+ * Generate the list component file content
12
+ *
13
+ * @param data - Frontend template data
14
+ * @returns Generated file content
15
+ */
16
+ function generateListTemplate(data) {
17
+ const { names, fields, relationships, extendsContent, tableFieldNames } = data;
18
+ // Build field list for the table - use name + first few fields + updatedAt
19
+ const displayFields = buildDisplayFields(data);
20
+ return `"use client";
21
+
22
+ import ${names.pascalCase}Editor from "@/features/${data.targetDir}/${names.kebabCase}/components/forms/${names.pascalCase}Editor";
23
+ import { ${names.pascalCase}Fields } from "@/features/${data.targetDir}/${names.kebabCase}/data/${names.pascalCase}Fields";
24
+ import { ${names.pascalCase}Interface } from "@/features/${data.targetDir}/${names.kebabCase}/data/${names.pascalCase}Interface";
25
+ import { ${names.pascalCase}Service } from "@/features/${data.targetDir}/${names.kebabCase}/data/${names.pascalCase}Service";
26
+ import "@/features/${data.targetDir}/${names.kebabCase}/hooks/use${names.pascalCase}TableStructure";
27
+ import { ContentListTable } from "@carlonicora/nextjs-jsonapi/components";
28
+ import { Modules } from "@carlonicora/nextjs-jsonapi/core";
29
+ import { DataListRetriever, useDataListRetriever } from "@carlonicora/nextjs-jsonapi/hooks";
30
+ import { useTranslations } from "next-intl";
31
+ import { ReactNode } from "react";
32
+
33
+ export default function ${names.pascalCase}List() {
34
+ const t = useTranslations();
35
+
36
+ const data: DataListRetriever<${names.pascalCase}Interface> = useDataListRetriever({
37
+ module: Modules.${names.pascalCase},
38
+ retriever: (params) => ${names.pascalCase}Service.findMany(params),
39
+ retrieverParams: {},
40
+ });
41
+
42
+ const functions: ReactNode[] = [<${names.pascalCase}Editor key="create-${names.kebabCase}" />];
43
+
44
+ return (
45
+ <ContentListTable
46
+ data={data}
47
+ fields={[${displayFields}]}
48
+ tableGeneratorType={Modules.${names.pascalCase}}
49
+ functions={functions}
50
+ title={t(\`types.${names.pluralKebab}\`, { count: 2 })}
51
+ />
52
+ );
53
+ }
54
+ `;
55
+ }
56
+ /**
57
+ * Build display fields array for the table
58
+ */
59
+ function buildDisplayFields(data) {
60
+ const { names, fields, relationships, extendsContent } = data;
61
+ const displayFields = [];
62
+ // Always include name if it exists
63
+ if (extendsContent || fields.some((f) => f.name === "name")) {
64
+ displayFields.push(`${names.pascalCase}Fields.name`);
65
+ }
66
+ // Add author if present
67
+ const authorRel = relationships.find((r) => r.variant === "Author");
68
+ if (authorRel) {
69
+ const authorFieldName = (0, name_transformer_1.toCamelCase)(authorRel.variant);
70
+ displayFields.push(`${names.pascalCase}Fields.${authorFieldName}`);
71
+ }
72
+ // Add first non-author relationship
73
+ const otherRel = relationships.find((r) => r.variant !== "Author");
74
+ if (otherRel) {
75
+ const relFieldName = otherRel.single
76
+ ? (0, name_transformer_1.toCamelCase)(otherRel.variant || otherRel.name)
77
+ : (0, name_transformer_1.pluralize)((0, name_transformer_1.toCamelCase)(otherRel.name));
78
+ displayFields.push(`${names.pascalCase}Fields.${relFieldName}`);
79
+ }
80
+ // Add updatedAt
81
+ displayFields.push(`${names.pascalCase}Fields.updatedAt`);
82
+ return displayFields.join(", ");
83
+ }
84
+ //# sourceMappingURL=list.template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.template.js","sourceRoot":"","sources":["../../../../../scripts/generate-web-module/templates/components/list.template.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAWH,oDAyCC;AAjDD,0EAA6E;AAE7E;;;;;GAKG;AACH,SAAgB,oBAAoB,CAAC,IAA0B;IAC7D,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC;IAE/E,2EAA2E;IAC3E,MAAM,aAAa,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAE/C,OAAO;;SAEA,KAAK,CAAC,UAAU,2BAA2B,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,qBAAqB,KAAK,CAAC,UAAU;WAC/G,KAAK,CAAC,UAAU,6BAA6B,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,SAAS,KAAK,CAAC,UAAU;WACvG,KAAK,CAAC,UAAU,gCAAgC,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,SAAS,KAAK,CAAC,UAAU;WAC1G,KAAK,CAAC,UAAU,8BAA8B,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,SAAS,KAAK,CAAC,UAAU;qBAC9F,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,aAAa,KAAK,CAAC,UAAU;;;;;;;0BAOzD,KAAK,CAAC,UAAU;;;kCAGR,KAAK,CAAC,UAAU;sBAC5B,KAAK,CAAC,UAAU;6BACT,KAAK,CAAC,UAAU;;;;qCAIR,KAAK,CAAC,UAAU,sBAAsB,KAAK,CAAC,SAAS;;;;;iBAKzE,aAAa;oCACM,KAAK,CAAC,UAAU;;yBAE3B,KAAK,CAAC,WAAW;;;;CAIzC,CAAC;AACF,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,IAA0B;IACpD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC;IAC9D,MAAM,aAAa,GAAa,EAAE,CAAC;IAEnC,mCAAmC;IACnC,IAAI,cAAc,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,CAAC;QAC5D,aAAa,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,UAAU,aAAa,CAAC,CAAC;IACvD,CAAC;IAED,wBAAwB;IACxB,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC;IACpE,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,eAAe,GAAG,IAAA,8BAAW,EAAC,SAAS,CAAC,OAAQ,CAAC,CAAC;QACxD,aAAa,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,UAAU,UAAU,eAAe,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,oCAAoC;IACpC,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC;IACnE,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM;YAClC,CAAC,CAAC,IAAA,8BAAW,EAAC,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC;YAChD,CAAC,CAAC,IAAA,4BAAS,EAAC,IAAA,8BAAW,EAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1C,aAAa,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,UAAU,UAAU,YAAY,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,gBAAgB;IAChB,aAAa,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,UAAU,kBAAkB,CAAC,CAAC;IAE1D,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * MultiSelector Template
3
+ *
4
+ * Generates {Module}MultiSelector.tsx multi-select component.
5
+ */
6
+ import { FrontendTemplateData } from "../../types/template-data.interface";
7
+ /**
8
+ * Generate the multi-selector component file content
9
+ *
10
+ * @param data - Frontend template data
11
+ * @returns Generated file content
12
+ */
13
+ export declare function generateMultiSelectorTemplate(data: FrontendTemplateData): string;
14
+ //# sourceMappingURL=multi-selector.template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-selector.template.d.ts","sourceRoot":"","sources":["../../../../../scripts/generate-web-module/templates/components/multi-selector.template.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAE3E;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,oBAAoB,GAAG,MAAM,CAyKhF"}
@@ -0,0 +1,184 @@
1
+ "use strict";
2
+ /**
3
+ * MultiSelector Template
4
+ *
5
+ * Generates {Module}MultiSelector.tsx multi-select component.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.generateMultiSelectorTemplate = generateMultiSelectorTemplate;
9
+ /**
10
+ * Generate the multi-selector component file content
11
+ *
12
+ * @param data - Frontend template data
13
+ * @returns Generated file content
14
+ */
15
+ function generateMultiSelectorTemplate(data) {
16
+ const { names } = data;
17
+ return `"use client";
18
+
19
+ import { FormControl, FormField, FormItem, FormLabel, FormMessage, MultiSelect } from "@carlonicora/nextjs-jsonapi/shadcnui";
20
+ import { ${names.pascalCase}Interface } from "@/features/${data.targetDir}/${names.kebabCase}/data/${names.pascalCase}Interface";
21
+ import { ${names.pascalCase}Service } from "@/features/${data.targetDir}/${names.kebabCase}/data/${names.pascalCase}Service";
22
+ import { DataListRetriever, useDataListRetriever } from "@carlonicora/nextjs-jsonapi/hooks";
23
+ import { useDebounce } from "@carlonicora/nextjs-jsonapi/hooks";
24
+ import { Modules } from "@carlonicora/nextjs-jsonapi/core";
25
+ import { useTranslations } from "next-intl";
26
+ import { useCallback, useEffect, useState } from "react";
27
+ import { useWatch } from "react-hook-form";
28
+
29
+ type ${names.pascalCase}MultiSelectType = {
30
+ id: string;
31
+ name: string;
32
+ };
33
+
34
+ type ${names.pascalCase}MultiSelectorProps = {
35
+ id: string;
36
+ form: any;
37
+ current${names.pascalCase}?: ${names.pascalCase}Interface;
38
+ label?: string;
39
+ placeholder?: string;
40
+ onChange?: (${names.pluralCamel}?: ${names.pascalCase}Interface[]) => void;
41
+ maxCount?: number;
42
+ isRequired?: boolean;
43
+ };
44
+
45
+ export default function ${names.pascalCase}MultiSelector({
46
+ id,
47
+ form,
48
+ current${names.pascalCase},
49
+ label,
50
+ placeholder,
51
+ onChange,
52
+ maxCount = 3,
53
+ isRequired = false,
54
+ }: ${names.pascalCase}MultiSelectorProps) {
55
+ const t = useTranslations("features.${names.camelCase}");
56
+ const [${names.camelCase}Options, set${names.pascalCase}Options] = useState<any[]>([]);
57
+ const [searchTerm, setSearchTerm] = useState<string>("");
58
+
59
+ const selected${names.pluralPascal}: ${names.pascalCase}MultiSelectType[] = useWatch({ control: form.control, name: id }) || [];
60
+
61
+ const data: DataListRetriever<${names.pascalCase}Interface> = useDataListRetriever({
62
+ retriever: (params) => ${names.pascalCase}Service.findMany(params),
63
+ retrieverParams: {},
64
+ ready: true,
65
+ module: Modules.${names.pascalCase},
66
+ });
67
+
68
+ const updateSearch = useCallback(
69
+ (searchedTerm: string) => {
70
+ if (searchedTerm.trim()) {
71
+ data.addAdditionalParameter("search", searchedTerm.trim());
72
+ } else {
73
+ data.removeAdditionalParameter("search");
74
+ }
75
+ },
76
+ [data],
77
+ );
78
+
79
+ const debouncedUpdateSearch = useDebounce(updateSearch, 500);
80
+
81
+ useEffect(() => {
82
+ debouncedUpdateSearch(searchTerm);
83
+ }, [debouncedUpdateSearch, searchTerm]);
84
+
85
+ useEffect(() => {
86
+ if (data.data && data.data.length > 0) {
87
+ const ${names.pluralCamel} = data.data as ${names.pascalCase}Interface[];
88
+ const filtered${names.pluralPascal} = ${names.pluralCamel}.filter((${names.camelCase}) => ${names.camelCase}.id !== current${names.pascalCase}?.id);
89
+
90
+ const options = filtered${names.pluralPascal}.map((${names.camelCase}) => ({
91
+ label: ${names.camelCase}.name,
92
+ value: ${names.camelCase}.id,
93
+ ${names.camelCase}Data: ${names.camelCase},
94
+ }));
95
+
96
+ set${names.pascalCase}Options(options);
97
+ }
98
+ }, [data.data, current${names.pascalCase}]);
99
+
100
+ // Add options for any already selected ${names.pluralCamel} that aren't in search results
101
+ useEffect(() => {
102
+ if (selected${names.pluralPascal}.length > 0) {
103
+ // Create a map of existing option IDs for quick lookup
104
+ const existingOptionIds = new Set(${names.camelCase}Options.map((option) => option.value));
105
+
106
+ // Find selected ${names.pluralCamel} that don't have an option yet
107
+ const missingOptions = selected${names.pluralPascal}
108
+ .filter((${names.camelCase}) => !existingOptionIds.has(${names.camelCase}.id))
109
+ .map((${names.camelCase}) => ({
110
+ label: ${names.camelCase}.name,
111
+ value: ${names.camelCase}.id,
112
+ ${names.camelCase}Data: ${names.camelCase},
113
+ }));
114
+
115
+ if (missingOptions.length > 0) {
116
+ set${names.pascalCase}Options((prev) => [...prev, ...missingOptions]);
117
+ }
118
+ }
119
+ }, [selected${names.pluralPascal}, ${names.camelCase}Options]);
120
+
121
+ const handleValueChange = (selectedIds: string[]) => {
122
+ const updatedSelected${names.pluralPascal} = selectedIds.map((id) => {
123
+ const existing${names.pascalCase} = selected${names.pluralPascal}.find((${names.camelCase}) => ${names.camelCase}.id === id);
124
+ if (existing${names.pascalCase}) {
125
+ return existing${names.pascalCase};
126
+ }
127
+
128
+ const option = ${names.camelCase}Options.find((option) => option.value === id);
129
+ if (option?.${names.camelCase}Data) {
130
+ return {
131
+ id: option.${names.camelCase}Data.id,
132
+ name: option.${names.camelCase}Data.name,
133
+ };
134
+ }
135
+
136
+ return { id, name: id };
137
+ });
138
+
139
+ form.setValue(id, updatedSelected${names.pluralPascal});
140
+
141
+ if (onChange) {
142
+ const fullSelected${names.pluralPascal} = selectedIds
143
+ .map((id) => ${names.camelCase}Options.find((option) => option.value === id)?.${names.camelCase}Data)
144
+ .filter(Boolean) as ${names.pascalCase}Interface[];
145
+ onChange(fullSelected${names.pluralPascal});
146
+ }
147
+ };
148
+
149
+ const selected${names.pascalCase}Ids = selected${names.pluralPascal}.map((${names.camelCase}: ${names.pascalCase}MultiSelectType) => ${names.camelCase}.id);
150
+
151
+ return (
152
+ <div className="flex w-full flex-col">
153
+ <FormField
154
+ control={form.control}
155
+ name={id}
156
+ render={({ field }) => (
157
+ <FormItem className={\`\${label ? "mb-5" : "mb-1"}\`}>
158
+ {label && (
159
+ <FormLabel className="flex items-center">
160
+ {label}
161
+ {isRequired && <span className="text-destructive ml-2 font-semibold">*</span>}
162
+ </FormLabel>
163
+ )}
164
+ <FormControl>
165
+ <MultiSelect
166
+ options={${names.camelCase}Options}
167
+ onValueChange={handleValueChange}
168
+ defaultValue={selected${names.pascalCase}Ids}
169
+ placeholder={placeholder}
170
+ maxCount={maxCount}
171
+ animation={0}
172
+ onSearchChange={setSearchTerm}
173
+ />
174
+ </FormControl>
175
+ <FormMessage />
176
+ </FormItem>
177
+ )}
178
+ />
179
+ </div>
180
+ );
181
+ }
182
+ `;
183
+ }
184
+ //# sourceMappingURL=multi-selector.template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-selector.template.js","sourceRoot":"","sources":["../../../../../scripts/generate-web-module/templates/components/multi-selector.template.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAUH,sEAyKC;AA/KD;;;;;GAKG;AACH,SAAgB,6BAA6B,CAAC,IAA0B;IACtE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IAEvB,OAAO;;;WAGE,KAAK,CAAC,UAAU,gCAAgC,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,SAAS,KAAK,CAAC,UAAU;WAC1G,KAAK,CAAC,UAAU,8BAA8B,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,SAAS,KAAK,CAAC,UAAU;;;;;;;;OAQ5G,KAAK,CAAC,UAAU;;;;;OAKhB,KAAK,CAAC,UAAU;;;WAGZ,KAAK,CAAC,UAAU,MAAM,KAAK,CAAC,UAAU;;;gBAGjC,KAAK,CAAC,WAAW,MAAM,KAAK,CAAC,UAAU;;;;;0BAK7B,KAAK,CAAC,UAAU;;;WAG/B,KAAK,CAAC,UAAU;;;;;;KAMtB,KAAK,CAAC,UAAU;wCACmB,KAAK,CAAC,SAAS;WAC5C,KAAK,CAAC,SAAS,eAAe,KAAK,CAAC,UAAU;;;kBAGvC,KAAK,CAAC,YAAY,KAAK,KAAK,CAAC,UAAU;;kCAEvB,KAAK,CAAC,UAAU;6BACrB,KAAK,CAAC,UAAU;;;sBAGvB,KAAK,CAAC,UAAU;;;;;;;;;;;;;;;;;;;;;;cAsBxB,KAAK,CAAC,WAAW,mBAAmB,KAAK,CAAC,UAAU;sBAC5C,KAAK,CAAC,YAAY,MAAM,KAAK,CAAC,WAAW,YAAY,KAAK,CAAC,SAAS,QAAQ,KAAK,CAAC,SAAS,kBAAkB,KAAK,CAAC,UAAU;;gCAEnH,KAAK,CAAC,YAAY,SAAS,KAAK,CAAC,SAAS;iBACzD,KAAK,CAAC,SAAS;iBACf,KAAK,CAAC,SAAS;UACtB,KAAK,CAAC,SAAS,SAAS,KAAK,CAAC,SAAS;;;WAGtC,KAAK,CAAC,UAAU;;0BAED,KAAK,CAAC,UAAU;;4CAEE,KAAK,CAAC,WAAW;;kBAE3C,KAAK,CAAC,YAAY;;0CAEM,KAAK,CAAC,SAAS;;yBAEhC,KAAK,CAAC,WAAW;uCACH,KAAK,CAAC,YAAY;mBACtC,KAAK,CAAC,SAAS,+BAA+B,KAAK,CAAC,SAAS;gBAChE,KAAK,CAAC,SAAS;mBACZ,KAAK,CAAC,SAAS;mBACf,KAAK,CAAC,SAAS;YACtB,KAAK,CAAC,SAAS,SAAS,KAAK,CAAC,SAAS;;;;aAItC,KAAK,CAAC,UAAU;;;gBAGb,KAAK,CAAC,YAAY,KAAK,KAAK,CAAC,SAAS;;;2BAG3B,KAAK,CAAC,YAAY;sBACvB,KAAK,CAAC,UAAU,cAAc,KAAK,CAAC,YAAY,UAAU,KAAK,CAAC,SAAS,QAAQ,KAAK,CAAC,SAAS;oBAClG,KAAK,CAAC,UAAU;yBACX,KAAK,CAAC,UAAU;;;uBAGlB,KAAK,CAAC,SAAS;oBAClB,KAAK,CAAC,SAAS;;uBAEZ,KAAK,CAAC,SAAS;yBACb,KAAK,CAAC,SAAS;;;;;;;uCAOD,KAAK,CAAC,YAAY;;;0BAG/B,KAAK,CAAC,YAAY;uBACrB,KAAK,CAAC,SAAS,kDAAkD,KAAK,CAAC,SAAS;8BACzE,KAAK,CAAC,UAAU;6BACjB,KAAK,CAAC,YAAY;;;;kBAI7B,KAAK,CAAC,UAAU,iBAAiB,KAAK,CAAC,YAAY,SAAS,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,UAAU,uBAAuB,KAAK,CAAC,SAAS;;;;;;;;;;;;;;;;;2BAiB7H,KAAK,CAAC,SAAS;;wCAEF,KAAK,CAAC,UAAU;;;;;;;;;;;;;;CAcvD,CAAC;AACF,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Selector Template
3
+ *
4
+ * Generates {Module}Selector.tsx searchable combobox component.
5
+ */
6
+ import { FrontendTemplateData } from "../../types/template-data.interface";
7
+ /**
8
+ * Generate the selector component file content
9
+ *
10
+ * @param data - Frontend template data
11
+ * @returns Generated file content
12
+ */
13
+ export declare function generateSelectorTemplate(data: FrontendTemplateData): string;
14
+ //# sourceMappingURL=selector.template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selector.template.d.ts","sourceRoot":"","sources":["../../../../../scripts/generate-web-module/templates/components/selector.template.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAE3E;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,oBAAoB,GAAG,MAAM,CAwL3E"}
@@ -0,0 +1,199 @@
1
+ "use strict";
2
+ /**
3
+ * Selector Template
4
+ *
5
+ * Generates {Module}Selector.tsx searchable combobox component.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.generateSelectorTemplate = generateSelectorTemplate;
9
+ /**
10
+ * Generate the selector component file content
11
+ *
12
+ * @param data - Frontend template data
13
+ * @returns Generated file content
14
+ */
15
+ function generateSelectorTemplate(data) {
16
+ const { names } = data;
17
+ return `"use client";
18
+
19
+ import {
20
+ Command,
21
+ CommandItem,
22
+ CommandList,
23
+ FormControl,
24
+ FormField,
25
+ FormItem,
26
+ FormLabel,
27
+ FormMessage,
28
+ Input,
29
+ Popover,
30
+ PopoverContent,
31
+ PopoverTrigger,
32
+ } from "@carlonicora/nextjs-jsonapi/shadcnui";
33
+ import { ${names.pascalCase}Interface } from "@/features/${data.targetDir}/${names.kebabCase}/data/${names.pascalCase}Interface";
34
+ import { ${names.pascalCase}Service } from "@/features/${data.targetDir}/${names.kebabCase}/data/${names.pascalCase}Service";
35
+ import { DataListRetriever, useDataListRetriever } from "@carlonicora/nextjs-jsonapi/hooks";
36
+ import { useDebounce } from "@carlonicora/nextjs-jsonapi/hooks";
37
+ import { Modules } from "@carlonicora/nextjs-jsonapi/core";
38
+
39
+ import { CircleX, RefreshCwIcon, SearchIcon, XIcon } from "lucide-react";
40
+ import { useTranslations } from "next-intl";
41
+ import { useCallback, useEffect, useRef, useState } from "react";
42
+
43
+ type ${names.pascalCase}SelectorProps = {
44
+ id: string;
45
+ form: any;
46
+ label?: string;
47
+ placeholder?: string;
48
+ onChange?: (${names.camelCase}?: ${names.pascalCase}Interface) => void;
49
+ isRequired?: boolean;
50
+ };
51
+
52
+ export default function ${names.pascalCase}Selector({
53
+ id,
54
+ form,
55
+ label,
56
+ placeholder,
57
+ onChange,
58
+ isRequired = false,
59
+ }: ${names.pascalCase}SelectorProps) {
60
+ const t = useTranslations();
61
+
62
+ const [open, setOpen] = useState<boolean>(false);
63
+
64
+ const searchTermRef = useRef<string>("");
65
+ const [searchTerm, setSearchTerm] = useState<string>("");
66
+
67
+ const [isSearching, setIsSearching] = useState<boolean>(false);
68
+
69
+ const data: DataListRetriever<${names.pascalCase}Interface> = useDataListRetriever({
70
+ retriever: (params) => {
71
+ return ${names.pascalCase}Service.findMany(params);
72
+ },
73
+ retrieverParams: {},
74
+ module: Modules.${names.pascalCase},
75
+ });
76
+
77
+ const search = useCallback(
78
+ async (searchedTerm: string) => {
79
+ try {
80
+ if (searchedTerm === searchTermRef.current) return;
81
+ setIsSearching(true);
82
+ searchTermRef.current = searchedTerm;
83
+ await data.search(searchedTerm);
84
+ } finally {
85
+ setIsSearching(false);
86
+ }
87
+ },
88
+ [searchTermRef, data],
89
+ );
90
+
91
+ const updateSearchTerm = useDebounce(search, 500);
92
+
93
+ useEffect(() => {
94
+ setIsSearching(true);
95
+ updateSearchTerm(searchTerm);
96
+ }, [updateSearchTerm, searchTerm]);
97
+
98
+ const set${names.pascalCase} = (${names.camelCase}?: ${names.pascalCase}Interface) => {
99
+ if (onChange) onChange(${names.camelCase});
100
+ if (!${names.camelCase}) {
101
+ form.setValue(id, undefined);
102
+ setOpen(false);
103
+ return;
104
+ }
105
+
106
+ form.setValue(id, { id: ${names.camelCase}.id, name: ${names.camelCase}.name });
107
+ setOpen(false);
108
+
109
+ setTimeout(() => {
110
+ setOpen(false);
111
+ }, 0);
112
+ };
113
+
114
+ return (
115
+ <div className="flex w-full flex-col">
116
+ <FormField
117
+ control={form.control}
118
+ name={id}
119
+ render={({ field }) => (
120
+ <FormItem className={\`\${label ? "mb-5" : "mb-1"}\`}>
121
+ {label && (
122
+ <FormLabel className="flex items-center">
123
+ {label}
124
+ {isRequired && <span className="text-destructive ml-2 font-semibold">*</span>}
125
+ </FormLabel>
126
+ )}
127
+ <FormControl>
128
+ <Popover open={open} onOpenChange={setOpen} modal={true}>
129
+ <div className="flex w-full flex-row items-center justify-between">
130
+ <PopoverTrigger className="w-full">
131
+ <div className="flex w-full flex-row items-center justify-start rounded-md text-sm">
132
+ {field.value ? (
133
+ <>
134
+ <div className="flex w-full flex-row items-center justify-start rounded-md border p-2">
135
+ <span className="">{field.value?.name ?? ""}</span>
136
+ </div>
137
+ </>
138
+ ) : (
139
+ <div className="text-muted-foreground mr-7 flex h-10 w-full flex-row items-center justify-start rounded-md border p-2 text-sm">
140
+ {placeholder ?? t(\`generic.search.placeholder\`, { type: t(\`types.${names.pluralKebab}\`, { count: 1 }) })}
141
+ </div>
142
+ )}
143
+ </div>
144
+ </PopoverTrigger>
145
+ {field.value && (
146
+ <CircleX
147
+ className="text-muted hover:text-destructive ml-2 h-6 w-6 cursor-pointer"
148
+ onClick={() => set${names.pascalCase}()}
149
+ />
150
+ )}
151
+ </div>
152
+ <PopoverContent>
153
+ <Command shouldFilter={false}>
154
+ <div className="relative mb-2 w-full">
155
+ <SearchIcon className="text-muted-foreground absolute left-2.5 top-2.5 h-4 w-4" />
156
+ <Input
157
+ placeholder={t(\`generic.search.placeholder\`, { type: t(\`types.${names.pluralKebab}\`, { count: 1 }) })}
158
+ type="text"
159
+ className="w-full pl-8 pr-8"
160
+ onChange={(e) => setSearchTerm(e.target.value)}
161
+ value={searchTerm}
162
+ />
163
+ {isSearching ? (
164
+ <RefreshCwIcon className="text-muted-foreground absolute right-2.5 top-2.5 h-4 w-4 animate-spin" />
165
+ ) : searchTermRef.current ? (
166
+ <XIcon
167
+ className={\`absolute right-2.5 top-2.5 h-4 w-4 \${searchTermRef.current ? "cursor-pointer" : "text-muted-foreground"}\`}
168
+ onClick={() => {
169
+ setSearchTerm("");
170
+ search("");
171
+ }}
172
+ />
173
+ ) : (
174
+ <></>
175
+ )}
176
+ </div>
177
+ <CommandList>
178
+ {data.data &&
179
+ data.data.length > 0 &&
180
+ (data.data as ${names.pascalCase}Interface[]).map((${names.camelCase}: ${names.pascalCase}Interface) => (
181
+ <CommandItem className="cursor-pointer" key={${names.camelCase}.id} onSelect={() => set${names.pascalCase}(${names.camelCase})}>
182
+ <span className="">{${names.camelCase}.name}</span>
183
+ </CommandItem>
184
+ ))}
185
+ </CommandList>
186
+ </Command>
187
+ </PopoverContent>
188
+ </Popover>
189
+ </FormControl>
190
+ <FormMessage />
191
+ </FormItem>
192
+ )}
193
+ />
194
+ </div>
195
+ );
196
+ }
197
+ `;
198
+ }
199
+ //# sourceMappingURL=selector.template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selector.template.js","sourceRoot":"","sources":["../../../../../scripts/generate-web-module/templates/components/selector.template.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAUH,4DAwLC;AA9LD;;;;;GAKG;AACH,SAAgB,wBAAwB,CAAC,IAA0B;IACjE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IAEvB,OAAO;;;;;;;;;;;;;;;;WAgBE,KAAK,CAAC,UAAU,gCAAgC,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,SAAS,KAAK,CAAC,UAAU;WAC1G,KAAK,CAAC,UAAU,8BAA8B,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,SAAS,KAAK,CAAC,UAAU;;;;;;;;;OAS5G,KAAK,CAAC,UAAU;;;;;gBAKP,KAAK,CAAC,SAAS,MAAM,KAAK,CAAC,UAAU;;;;0BAI3B,KAAK,CAAC,UAAU;;;;;;;KAOrC,KAAK,CAAC,UAAU;;;;;;;;;;kCAUa,KAAK,CAAC,UAAU;;eAEnC,KAAK,CAAC,UAAU;;;sBAGT,KAAK,CAAC,UAAU;;;;;;;;;;;;;;;;;;;;;;;;aAwBzB,KAAK,CAAC,UAAU,OAAO,KAAK,CAAC,SAAS,MAAM,KAAK,CAAC,UAAU;6BAC5C,KAAK,CAAC,SAAS;WACjC,KAAK,CAAC,SAAS;;;;;;8BAMI,KAAK,CAAC,SAAS,cAAc,KAAK,CAAC,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gGAkCsB,KAAK,CAAC,WAAW;;;;;;;;0CAQvE,KAAK,CAAC,UAAU;;;;;;;;;2FASiC,KAAK,CAAC,WAAW;;;;;;;;;;;;;;;;;;;;;;;wCAuBpE,KAAK,CAAC,UAAU,qBAAqB,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,UAAU;yEACxC,KAAK,CAAC,SAAS,2BAA2B,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,SAAS;kDACpG,KAAK,CAAC,SAAS;;;;;;;;;;;;;;;CAehE,CAAC;AACF,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Context Template
3
+ *
4
+ * Generates {Module}Context.tsx for module state management.
5
+ */
6
+ import { FrontendTemplateData } from "../types/template-data.interface";
7
+ /**
8
+ * Generate the context file content
9
+ *
10
+ * @param data - Frontend template data
11
+ * @returns Generated file content
12
+ */
13
+ export declare function generateContextTemplate(data: FrontendTemplateData): string;
14
+ //# sourceMappingURL=context.template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.template.d.ts","sourceRoot":"","sources":["../../../../scripts/generate-web-module/templates/context.template.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAExE;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,oBAAoB,GAAG,MAAM,CA0G1E"}
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ /**
3
+ * Context Template
4
+ *
5
+ * Generates {Module}Context.tsx for module state management.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.generateContextTemplate = generateContextTemplate;
9
+ /**
10
+ * Generate the context file content
11
+ *
12
+ * @param data - Frontend template data
13
+ * @returns Generated file content
14
+ */
15
+ function generateContextTemplate(data) {
16
+ const { names, extendsContent } = data;
17
+ return `"use client";
18
+
19
+ import ${names.pascalCase}Deleter from "@/features/${data.targetDir}/${names.kebabCase}/components/forms/${names.pascalCase}Deleter";
20
+ import ${names.pascalCase}Editor from "@/features/${data.targetDir}/${names.kebabCase}/components/forms/${names.pascalCase}Editor";
21
+ import { ${names.pascalCase}Interface } from "@/features/${data.targetDir}/${names.kebabCase}/data/${names.pascalCase}Interface";
22
+ import { ${names.pascalCase}Service } from "@/features/${data.targetDir}/${names.kebabCase}/data/${names.pascalCase}Service";
23
+ import { SharedProvider } from "@carlonicora/nextjs-jsonapi/contexts";
24
+ import { usePageUrlGenerator } from "@carlonicora/nextjs-jsonapi/hooks";
25
+ import { BreadcrumbItemData } from "@carlonicora/nextjs-jsonapi/interfaces";
26
+
27
+ import { JsonApiHydratedDataInterface, Modules, rehydrate } from "@carlonicora/nextjs-jsonapi/core";
28
+ import { useTranslations } from "next-intl";
29
+ import { createContext, ReactNode, useContext, useState } from "react";
30
+
31
+ interface ${names.pascalCase}ContextType {
32
+ ${names.camelCase}: ${names.pascalCase}Interface | undefined;
33
+ set${names.pascalCase}: (value: ${names.pascalCase}Interface | undefined) => void;
34
+ reload${names.pascalCase}: () => Promise<void>;
35
+ }
36
+
37
+ const ${names.pascalCase}Context = createContext<${names.pascalCase}ContextType | undefined>(undefined);
38
+
39
+ type ${names.pascalCase}ProviderProps = {
40
+ children: ReactNode;
41
+ dehydrated${names.pascalCase}?: JsonApiHydratedDataInterface;
42
+ };
43
+
44
+ export const ${names.pascalCase}Provider = ({ children, dehydrated${names.pascalCase} }: ${names.pascalCase}ProviderProps) => {
45
+ const generateUrl = usePageUrlGenerator();
46
+ const t = useTranslations();
47
+
48
+ const [${names.camelCase}, set${names.pascalCase}] = useState<${names.pascalCase}Interface | undefined>(
49
+ dehydrated${names.pascalCase} ? rehydrate<${names.pascalCase}Interface>(Modules.${names.pascalCase}, dehydrated${names.pascalCase}) : undefined,
50
+ );
51
+
52
+ const reload${names.pascalCase} = async () => {
53
+ if (!${names.camelCase}) return;
54
+
55
+ const fresh${names.pascalCase} = await ${names.pascalCase}Service.findOne({ id: ${names.camelCase}.id });
56
+ set${names.pascalCase}(fresh${names.pascalCase});
57
+ };
58
+
59
+ const breadcrumb = () => {
60
+ const response: BreadcrumbItemData[] = [];
61
+
62
+ response.push({
63
+ name: t(\`types.${names.pluralCamel}\`, { count: 2 }),
64
+ href: generateUrl({ page: Modules.${names.pascalCase} }),
65
+ });
66
+
67
+ if (${names.camelCase})
68
+ response.push({
69
+ name: ${names.camelCase}.name,
70
+ href: generateUrl({ page: Modules.${names.pascalCase}, id: ${names.camelCase}.id }),
71
+ });
72
+
73
+ return response;
74
+ };
75
+
76
+ const title = () => {
77
+ const response: any = {
78
+ type: t(\`types.${names.pluralCamel}\`, { count: ${names.camelCase} ? 1 : 2 }),
79
+ };
80
+
81
+ const functions: ReactNode[] = [];
82
+
83
+ if (${names.camelCase}) {
84
+ response.element = ${names.camelCase}.name;
85
+
86
+ functions.push(<${names.pascalCase}Deleter key={\`${names.pascalCase}Deleter\`} ${names.camelCase}={${names.camelCase}} />);
87
+ functions.push(<${names.pascalCase}Editor key={\`${names.pascalCase}Editor\`} ${names.camelCase}={${names.camelCase}} propagateChanges={set${names.pascalCase}} />);
88
+ } else {
89
+ functions.push(<${names.pascalCase}Editor key={\`${names.pascalCase}Editor\`} />);
90
+ }
91
+
92
+ if (functions.length > 0) response.functions = functions;
93
+
94
+ return response;
95
+ };
96
+
97
+ return (
98
+ <SharedProvider value={{ breadcrumbs: breadcrumb(), title: title() }}>
99
+ <${names.pascalCase}Context.Provider
100
+ value={{
101
+ ${names.camelCase}: ${names.camelCase},
102
+ set${names.pascalCase}: set${names.pascalCase},
103
+ reload${names.pascalCase}: reload${names.pascalCase},
104
+ }}
105
+ >
106
+ {children}
107
+ </${names.pascalCase}Context.Provider>
108
+ </SharedProvider>
109
+ );
110
+ };
111
+
112
+ export const use${names.pascalCase}Context = (): ${names.pascalCase}ContextType => {
113
+ const context = useContext(${names.pascalCase}Context);
114
+ if (context === undefined) {
115
+ throw new Error("use${names.pascalCase}Context must be used within a ${names.pascalCase}Provider");
116
+ }
117
+ return context;
118
+ };
119
+ `;
120
+ }
121
+ //# sourceMappingURL=context.template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.template.js","sourceRoot":"","sources":["../../../../scripts/generate-web-module/templates/context.template.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAUH,0DA0GC;AAhHD;;;;;GAKG;AACH,SAAgB,uBAAuB,CAAC,IAA0B;IAChE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC;IAEvC,OAAO;;SAEA,KAAK,CAAC,UAAU,4BAA4B,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,qBAAqB,KAAK,CAAC,UAAU;SAClH,KAAK,CAAC,UAAU,2BAA2B,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,qBAAqB,KAAK,CAAC,UAAU;WAC/G,KAAK,CAAC,UAAU,gCAAgC,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,SAAS,KAAK,CAAC,UAAU;WAC1G,KAAK,CAAC,UAAU,8BAA8B,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,SAAS,KAAK,CAAC,UAAU;;;;;;;;;YASvG,KAAK,CAAC,UAAU;IACxB,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,UAAU;OACjC,KAAK,CAAC,UAAU,aAAa,KAAK,CAAC,UAAU;UAC1C,KAAK,CAAC,UAAU;;;QAGlB,KAAK,CAAC,UAAU,2BAA2B,KAAK,CAAC,UAAU;;OAE5D,KAAK,CAAC,UAAU;;cAET,KAAK,CAAC,UAAU;;;eAGf,KAAK,CAAC,UAAU,qCAAqC,KAAK,CAAC,UAAU,OAAO,KAAK,CAAC,UAAU;;;;WAIhG,KAAK,CAAC,SAAS,QAAQ,KAAK,CAAC,UAAU,gBAAgB,KAAK,CAAC,UAAU;gBAClE,KAAK,CAAC,UAAU,gBAAgB,KAAK,CAAC,UAAU,sBAAsB,KAAK,CAAC,UAAU,eAAe,KAAK,CAAC,UAAU;;;gBAGrH,KAAK,CAAC,UAAU;WACrB,KAAK,CAAC,SAAS;;iBAET,KAAK,CAAC,UAAU,YAAY,KAAK,CAAC,UAAU,yBAAyB,KAAK,CAAC,SAAS;SAC5F,KAAK,CAAC,UAAU,SAAS,KAAK,CAAC,UAAU;;;;;;;wBAO1B,KAAK,CAAC,WAAW;0CACC,KAAK,CAAC,UAAU;;;UAGhD,KAAK,CAAC,SAAS;;gBAET,KAAK,CAAC,SAAS;4CACa,KAAK,CAAC,UAAU,SAAS,KAAK,CAAC,SAAS;;;;;;;;wBAQ5D,KAAK,CAAC,WAAW,gBAAgB,KAAK,CAAC,SAAS;;;;;UAK9D,KAAK,CAAC,SAAS;2BACE,KAAK,CAAC,SAAS;;wBAElB,KAAK,CAAC,UAAU,kBAAkB,KAAK,CAAC,UAAU,cAAc,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS;wBACnG,KAAK,CAAC,UAAU,iBAAiB,KAAK,CAAC,UAAU,aAAa,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,0BAA0B,KAAK,CAAC,UAAU;;wBAE3I,KAAK,CAAC,UAAU,iBAAiB,KAAK,CAAC,UAAU;;;;;;;;;;SAUhE,KAAK,CAAC,UAAU;;YAEb,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS;eAChC,KAAK,CAAC,UAAU,QAAQ,KAAK,CAAC,UAAU;kBACrC,KAAK,CAAC,UAAU,WAAW,KAAK,CAAC,UAAU;;;;UAInD,KAAK,CAAC,UAAU;;;;;kBAKR,KAAK,CAAC,UAAU,iBAAiB,KAAK,CAAC,UAAU;+BACpC,KAAK,CAAC,UAAU;;0BAErB,KAAK,CAAC,UAAU,iCAAiC,KAAK,CAAC,UAAU;;;;CAI1F,CAAC;AACF,CAAC"}