@baseplate-dev/project-builder-web 0.2.6 → 0.3.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 (194) hide show
  1. package/dist/assets/-constants-C0cnDlAn.js +4 -0
  2. package/dist/assets/-constants-C0cnDlAn.js.map +1 -0
  3. package/dist/assets/__federation_shared_@baseplate-dev/project-builder-lib/web-BCejYgPM.js +2 -0
  4. package/dist/assets/__federation_shared_@baseplate-dev/project-builder-lib/{web-CEscUEnR.js.map → web-BCejYgPM.js.map} +1 -1
  5. package/dist/assets/__federation_shared_@baseplate-dev/project-builder-lib-BxDAWgq7.js +2 -0
  6. package/dist/assets/__federation_shared_@baseplate-dev/project-builder-lib-BxDAWgq7.js.map +1 -0
  7. package/dist/assets/__federation_shared_@baseplate-dev/ui-components-D6OnTPTN.js +46 -0
  8. package/dist/assets/__federation_shared_@baseplate-dev/ui-components-D6OnTPTN.js.map +1 -0
  9. package/dist/assets/__federation_shared_@baseplate-dev/utils-DvvrgoSE.js +5 -0
  10. package/dist/assets/__federation_shared_@baseplate-dev/utils-DvvrgoSE.js.map +1 -0
  11. package/dist/assets/__federation_shared_@tanstack/react-router-B5c6YNeC.js +19 -0
  12. package/dist/assets/__federation_shared_@tanstack/react-router-B5c6YNeC.js.map +1 -0
  13. package/dist/assets/__federation_shared_react-WURrSs1p.js +2 -0
  14. package/dist/assets/{__federation_shared_react-CTQ9xfiH.js.map → __federation_shared_react-WURrSs1p.js.map} +1 -1
  15. package/dist/assets/__federation_shared_react-dom-CWagDEjd.js +2 -0
  16. package/dist/assets/{__federation_shared_react-dom-DPv53nVg.js.map → __federation_shared_react-dom-CWagDEjd.js.map} +1 -1
  17. package/dist/assets/_commonjsHelpers-CqkleIqs.js +2 -0
  18. package/dist/assets/_commonjsHelpers-CqkleIqs.js.map +1 -0
  19. package/dist/assets/_virtual___federation_fn_import-DXu2m-ZE.js +2 -0
  20. package/dist/assets/{_virtual___federation_fn_import-BLYgPlMt.js.map → _virtual___federation_fn_import-DXu2m-ZE.js.map} +1 -1
  21. package/dist/assets/admin-Bw70Pql0.js +2 -0
  22. package/dist/assets/admin-Bw70Pql0.js.map +1 -0
  23. package/dist/assets/backend-CoqSwiCt.js +2 -0
  24. package/dist/assets/{backend-hJNcdERv.js.map → backend-CoqSwiCt.js.map} +1 -1
  25. package/dist/assets/badge-with-type-label-BXoSRTRE.js +2 -0
  26. package/dist/assets/{badge-with-type-label-CezAtjFy.js.map → badge-with-type-label-BXoSRTRE.js.map} +1 -1
  27. package/dist/assets/edit._key-CtMMGDWu.js +2 -0
  28. package/dist/assets/edit._key-CtMMGDWu.js.map +1 -0
  29. package/dist/assets/edit._sectionKey-CTX9L0j4.js +3 -0
  30. package/dist/assets/edit._sectionKey-CTX9L0j4.js.map +1 -0
  31. package/dist/assets/enum-info-form-D5bAsvPH.js +2 -0
  32. package/dist/assets/{enum-info-form-xlZ2HO8I.js.map → enum-info-form-D5bAsvPH.js.map} +1 -1
  33. package/dist/assets/graphql-BmA-sAqU.js +2 -0
  34. package/dist/assets/{graphql-D3J4ZWXL.js.map → graphql-BmA-sAqU.js.map} +1 -1
  35. package/dist/assets/hierarchy-CZorhmS7.js +2 -0
  36. package/dist/assets/{hierarchy-DF9lzUjz.js.map → hierarchy-CZorhmS7.js.map} +1 -1
  37. package/dist/assets/immer-B7fdkLVi.js +2 -0
  38. package/dist/assets/immer-B7fdkLVi.js.map +1 -0
  39. package/dist/assets/index-BABen-rU.js +2 -0
  40. package/dist/assets/index-BABen-rU.js.map +1 -0
  41. package/dist/assets/index-BGLRovL6.js +2 -0
  42. package/dist/assets/index-BGLRovL6.js.map +1 -0
  43. package/dist/assets/index-BPzqpd9P.js +2 -0
  44. package/dist/assets/{index-DJsZccoO.js.map → index-BPzqpd9P.js.map} +1 -1
  45. package/dist/assets/index-BUYA3Tes.js +40 -0
  46. package/dist/assets/index-BUYA3Tes.js.map +1 -0
  47. package/dist/assets/index-Bl_iRlKL.js +2 -0
  48. package/dist/assets/index-Bl_iRlKL.js.map +1 -0
  49. package/dist/assets/index-BpDkQSTy.js +2 -0
  50. package/dist/assets/{index-BdmJimiZ.js.map → index-BpDkQSTy.js.map} +1 -1
  51. package/dist/assets/index-CaiaVpxa.js +2 -0
  52. package/dist/assets/index-CaiaVpxa.js.map +1 -0
  53. package/dist/assets/index-CsGKSjOd.js +2 -0
  54. package/dist/assets/index-CsGKSjOd.js.map +1 -0
  55. package/dist/assets/index-D-dbw3Qx.js +2 -0
  56. package/dist/assets/{index-1ErFJbDw.js.map → index-D-dbw3Qx.js.map} +1 -1
  57. package/dist/assets/index-DCiH936w.js +2 -0
  58. package/dist/assets/{index-Bv8hyN9u.js.map → index-DCiH936w.js.map} +1 -1
  59. package/dist/assets/index-DDivWD4R.js +2 -0
  60. package/dist/assets/index-DDivWD4R.js.map +1 -0
  61. package/dist/assets/index-DpJKJe06.js +2 -0
  62. package/dist/assets/index-DpJKJe06.js.map +1 -0
  63. package/dist/assets/{index-B0D_rfGi.js → index-DqHVrEeL.js} +2 -2
  64. package/dist/assets/{index-B0D_rfGi.js.map → index-DqHVrEeL.js.map} +1 -1
  65. package/dist/assets/index-PlVWOW99.css +1 -0
  66. package/dist/assets/index-_mf2naQd.js +2 -0
  67. package/dist/assets/index-_mf2naQd.js.map +1 -0
  68. package/dist/assets/{index-9Ra4Lmds.js → index-c0qeY2gs.js} +3 -3
  69. package/dist/assets/{index-9Ra4Lmds.js.map → index-c0qeY2gs.js.map} +1 -1
  70. package/dist/assets/index-p--SDqro.js +2 -0
  71. package/dist/assets/{index-B5-Qczd9.js.map → index-p--SDqro.js.map} +1 -1
  72. package/dist/assets/index.esm-CTDJ8Wko.js +2 -0
  73. package/dist/assets/index.esm-CTDJ8Wko.js.map +1 -0
  74. package/dist/assets/jsx-runtime-D_zvdyIk.js +10 -0
  75. package/dist/assets/jsx-runtime-D_zvdyIk.js.map +1 -0
  76. package/dist/assets/model-info-form-pKQBCJu4.js +2 -0
  77. package/dist/assets/{model-info-form-VtbYsjrH.js.map → model-info-form-pKQBCJu4.js.map} +1 -1
  78. package/dist/assets/model-merger-vEOkdVdS.js +2 -0
  79. package/dist/assets/model-merger-vEOkdVdS.js.map +1 -0
  80. package/dist/assets/new-admin-section-dialog-F58HZ0yO.js +2 -0
  81. package/dist/assets/new-admin-section-dialog-F58HZ0yO.js.map +1 -0
  82. package/dist/assets/new-app-dialog-DPQv-mvi.js +2 -0
  83. package/dist/assets/new-app-dialog-DPQv-mvi.js.map +1 -0
  84. package/dist/assets/new-enum-dialog-xVvneRQN.js +2 -0
  85. package/dist/assets/{new-enum-dialog-B0QcIWdY.js.map → new-enum-dialog-xVvneRQN.js.map} +1 -1
  86. package/dist/assets/new-model-dialog-ApenxGWq.js +2 -0
  87. package/dist/assets/{new-model-dialog-CM2dJ8Iv.js.map → new-model-dialog-ApenxGWq.js.map} +1 -1
  88. package/dist/assets/route-1RLqcpwJ.js +2 -0
  89. package/dist/assets/{route-DmdFbZkw.js.map → route-1RLqcpwJ.js.map} +1 -1
  90. package/dist/assets/route-9nRSk82v.js +2 -0
  91. package/dist/assets/route-9nRSk82v.js.map +1 -0
  92. package/dist/assets/route-B5_zLW88.js +2 -0
  93. package/dist/assets/{route-CAp89B2q.js.map → route-B5_zLW88.js.map} +1 -1
  94. package/dist/assets/route-BPsno3Cl.js +2 -0
  95. package/dist/assets/route-BPsno3Cl.js.map +1 -0
  96. package/dist/assets/route-BW0F_EH4.js +2 -0
  97. package/dist/assets/{route-DcsVxxui.js.map → route-BW0F_EH4.js.map} +1 -1
  98. package/dist/assets/route-C1hyfOXp.js +2 -0
  99. package/dist/assets/route-C1hyfOXp.js.map +1 -0
  100. package/dist/assets/route-CH7VQVwb.js +2 -0
  101. package/dist/assets/route-CH7VQVwb.js.map +1 -0
  102. package/dist/assets/route-CpoiDvOD.js +2 -0
  103. package/dist/assets/route-CpoiDvOD.js.map +1 -0
  104. package/dist/assets/route-Dq2UgkxS.js +2 -0
  105. package/dist/assets/{route-BsIUCKz1.js.map → route-Dq2UgkxS.js.map} +1 -1
  106. package/dist/assets/route-z54yq2nP.js +2 -0
  107. package/dist/assets/route-z54yq2nP.js.map +1 -0
  108. package/dist/assets/service-Cv-U7NUv.js +2 -0
  109. package/dist/assets/service-Cv-U7NUv.js.map +1 -0
  110. package/dist/assets/sortBy-C9bvycg5.js +2 -0
  111. package/dist/assets/sortBy-C9bvycg5.js.map +1 -0
  112. package/dist/assets/template-extractor-ElrbBsVj.js +2 -0
  113. package/dist/assets/{template-extractor-DEU0CX0Y.js.map → template-extractor-ElrbBsVj.js.map} +1 -1
  114. package/dist/assets/{theme-builder-La1nKR0K.js → theme-builder-Butjmy7L.js} +6 -6
  115. package/dist/assets/{theme-builder-La1nKR0K.js.map → theme-builder-Butjmy7L.js.map} +1 -1
  116. package/dist/assets/{use-definition-schema-CuFFJIzk.js → use-definition-schema-e7us6WfR.js} +2 -2
  117. package/dist/assets/{use-definition-schema-CuFFJIzk.js.map → use-definition-schema-e7us6WfR.js.map} +1 -1
  118. package/dist/assets/use-enum-form-CEyTBPQn.js +2 -0
  119. package/dist/assets/{use-enum-form-DKD2EDHZ.js.map → use-enum-form-CEyTBPQn.js.map} +1 -1
  120. package/dist/assets/use-model-form-Ch_tz0Rd.js +2 -0
  121. package/dist/assets/{use-model-form-BQa-PiE_.js.map → use-model-form-Ch_tz0Rd.js.map} +1 -1
  122. package/dist/assets/words-Cs2RBKRm.js +2 -0
  123. package/dist/assets/words-Cs2RBKRm.js.map +1 -0
  124. package/dist/index.html +11 -8
  125. package/package.json +11 -11
  126. package/dist/assets/-constants-CqYT9Sad.js +0 -4
  127. package/dist/assets/-constants-CqYT9Sad.js.map +0 -1
  128. package/dist/assets/__federation_shared_@baseplate-dev/project-builder-lib/web-CEscUEnR.js +0 -2
  129. package/dist/assets/__federation_shared_@baseplate-dev/project-builder-lib-CzpSl25Z.js +0 -5
  130. package/dist/assets/__federation_shared_@baseplate-dev/project-builder-lib-CzpSl25Z.js.map +0 -1
  131. package/dist/assets/__federation_shared_@baseplate-dev/ui-components-Bpztr-cx.js +0 -46
  132. package/dist/assets/__federation_shared_@baseplate-dev/ui-components-Bpztr-cx.js.map +0 -1
  133. package/dist/assets/__federation_shared_react-CTQ9xfiH.js +0 -2
  134. package/dist/assets/__federation_shared_react-dom-DPv53nVg.js +0 -2
  135. package/dist/assets/_virtual___federation_fn_import-BLYgPlMt.js +0 -2
  136. package/dist/assets/backend-hJNcdERv.js +0 -2
  137. package/dist/assets/badge-with-type-label-CezAtjFy.js +0 -2
  138. package/dist/assets/edit._id-bMpe6S3O.js +0 -2
  139. package/dist/assets/edit._id-bMpe6S3O.js.map +0 -1
  140. package/dist/assets/enum-info-form-xlZ2HO8I.js +0 -2
  141. package/dist/assets/graphql-D3J4ZWXL.js +0 -2
  142. package/dist/assets/hierarchy-DF9lzUjz.js +0 -2
  143. package/dist/assets/immer-BOh2djD_.js +0 -2
  144. package/dist/assets/immer-BOh2djD_.js.map +0 -1
  145. package/dist/assets/index-1ErFJbDw.js +0 -2
  146. package/dist/assets/index-37eYMUXo.js +0 -2
  147. package/dist/assets/index-37eYMUXo.js.map +0 -1
  148. package/dist/assets/index-B5-Qczd9.js +0 -2
  149. package/dist/assets/index-BLuLGksP.js +0 -2
  150. package/dist/assets/index-BLuLGksP.js.map +0 -1
  151. package/dist/assets/index-BPK2SbiO.js +0 -2
  152. package/dist/assets/index-BPK2SbiO.js.map +0 -1
  153. package/dist/assets/index-BdmJimiZ.js +0 -2
  154. package/dist/assets/index-Bv8hyN9u.js +0 -2
  155. package/dist/assets/index-C15I7WFi.js +0 -2
  156. package/dist/assets/index-C15I7WFi.js.map +0 -1
  157. package/dist/assets/index-C_wN4CIq.js +0 -58
  158. package/dist/assets/index-C_wN4CIq.js.map +0 -1
  159. package/dist/assets/index-DBOJRz5n.css +0 -1
  160. package/dist/assets/index-DJsZccoO.js +0 -2
  161. package/dist/assets/index-DwyYddxl.js +0 -2
  162. package/dist/assets/index-DwyYddxl.js.map +0 -1
  163. package/dist/assets/index-P-wtG1LL.js +0 -2
  164. package/dist/assets/index-P-wtG1LL.js.map +0 -1
  165. package/dist/assets/index.esm-DcyGeCKA.js +0 -10
  166. package/dist/assets/index.esm-DcyGeCKA.js.map +0 -1
  167. package/dist/assets/model-info-form-VtbYsjrH.js +0 -2
  168. package/dist/assets/model-merger-qJqD9I2_.js +0 -2
  169. package/dist/assets/model-merger-qJqD9I2_.js.map +0 -1
  170. package/dist/assets/new-app-dialog-CTtQ52jO.js +0 -2
  171. package/dist/assets/new-app-dialog-CTtQ52jO.js.map +0 -1
  172. package/dist/assets/new-enum-dialog-B0QcIWdY.js +0 -2
  173. package/dist/assets/new-model-dialog-CM2dJ8Iv.js +0 -2
  174. package/dist/assets/route-B34jnFQF.js +0 -2
  175. package/dist/assets/route-B34jnFQF.js.map +0 -1
  176. package/dist/assets/route-BRBmSLMi.js +0 -2
  177. package/dist/assets/route-BRBmSLMi.js.map +0 -1
  178. package/dist/assets/route-BsIUCKz1.js +0 -2
  179. package/dist/assets/route-CAp89B2q.js +0 -2
  180. package/dist/assets/route-DcsVxxui.js +0 -2
  181. package/dist/assets/route-DmdFbZkw.js +0 -2
  182. package/dist/assets/route-Dpmx4lrA.js +0 -2
  183. package/dist/assets/route-Dpmx4lrA.js.map +0 -1
  184. package/dist/assets/route-T4J_Uk-9.js +0 -2
  185. package/dist/assets/route-T4J_Uk-9.js.map +0 -1
  186. package/dist/assets/route-w8_2x1VY.js +0 -2
  187. package/dist/assets/route-w8_2x1VY.js.map +0 -1
  188. package/dist/assets/service-Bgm1ICPI.js +0 -2
  189. package/dist/assets/service-Bgm1ICPI.js.map +0 -1
  190. package/dist/assets/template-extractor-DEU0CX0Y.js +0 -2
  191. package/dist/assets/use-enum-form-DKD2EDHZ.js +0 -2
  192. package/dist/assets/use-model-form-BQa-PiE_.js +0 -2
  193. package/dist/assets/utils-BYjOwi1b.js +0 -2
  194. package/dist/assets/utils-BYjOwi1b.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-BLuLGksP.js","sources":["../../../../node_modules/.pnpm/es-toolkit@1.31.0/node_modules/es-toolkit/dist/string/words.mjs","../../../../node_modules/.pnpm/es-toolkit@1.31.0/node_modules/es-toolkit/dist/string/camelCase.mjs","../../src/routes/data/models/edit.$key/-components/fields/model-add-field-button.tsx","../../src/routes/data/models/edit.$key/-components/fields/primary-key/model-primary-key-form.tsx","../../src/routes/data/models/edit.$key/-components/fields/primary-key/model-primary-key-dialog.tsx","../../src/routes/data/models/edit.$key/-components/fields/primary-key/model-primary-key-badge.tsx","../../src/routes/data/models/edit.$key/-components/fields/relations/model-relation-form.tsx","../../src/routes/data/models/edit.$key/-components/fields/relations/model-relation-dialog.tsx","../../src/routes/data/models/edit.$key/-components/fields/relations/model-relation-badge.tsx","../../src/routes/data/models/edit.$key/-components/fields/unique-constraints/model-unique-constraint-form.tsx","../../src/routes/data/models/edit.$key/-components/fields/unique-constraints/model-unique-constraint-dialog.tsx","../../src/routes/data/models/edit.$key/-components/fields/unique-constraints/model-unique-constraint-badge.tsx","../../src/routes/data/models/edit.$key/-components/fields/badges/model-field-badges.tsx","../../src/routes/data/models/edit.$key/-components/fields/model-field-default-value-input.tsx","../../src/routes/data/models/edit.$key/-components/fields/model-field-type-input.tsx","../../src/routes/data/models/edit.$key/-components/fields/model-field-form.tsx","../../src/routes/data/models/edit.$key/-components/fields/model-fields-form.tsx","../../src/routes/data/models/edit.$key/-components/model-relations-section.tsx","../../src/routes/data/models/edit.$key/-components/model-unique-constraints-section.tsx","../../src/routes/data/models/edit.$key/index.tsx?tsr-split=component"],"sourcesContent":["const CASE_SPLIT_PATTERN = /\\p{Lu}?\\p{Ll}+|[0-9]+|\\p{Lu}+(?!\\p{Ll})|\\p{Emoji_Presentation}|\\p{Extended_Pictographic}|\\p{L}+/gu;\nfunction words(str) {\n return Array.from(str.match(CASE_SPLIT_PATTERN) ?? []);\n}\n\nexport { CASE_SPLIT_PATTERN, words };\n","import { capitalize } from './capitalize.mjs';\nimport { words } from './words.mjs';\n\nfunction camelCase(str) {\n const words$1 = words(str);\n if (words$1.length === 0) {\n return '';\n }\n const [first, ...rest] = words$1;\n return `${first.toLowerCase()}${rest.map(word => capitalize(word)).join('')}`;\n}\n\nexport { camelCase };\n","import type {\n ModelConfigInput,\n ModelScalarFieldConfig,\n ModelScalarFieldConfigInput,\n} from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { UseFieldArrayAppend, UseFormSetValue } from 'react-hook-form';\n\nimport { modelScalarFieldEntityType } from '@baseplate-dev/project-builder-lib';\nimport {\n Button,\n ButtonGroup,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@baseplate-dev/ui-components';\nimport { useMemo } from 'react';\nimport { MdExpandMore } from 'react-icons/md';\n\nimport { useEditedModelConfig } from '../../../-hooks/use-edited-model-config.js';\n\ninterface ModelAddFieldButtonProps {\n className?: string;\n appendField: UseFieldArrayAppend<ModelConfigInput, 'model.fields'>;\n setValue: UseFormSetValue<ModelConfigInput>;\n}\n\ninterface AutoAddField {\n name: string;\n fields: (Omit<ModelScalarFieldConfigInput, 'id'> & {\n isPrimaryKey?: boolean;\n })[];\n}\n\nexport function ModelAddFieldButton({\n className,\n appendField,\n setValue,\n}: ModelAddFieldButtonProps): React.JSX.Element {\n const fieldNames = useEditedModelConfig((model) =>\n model.model.fields.map((f) => f.name),\n );\n const primaryKeyFieldLength = useEditedModelConfig(\n (model) => model.model.primaryKeyFieldRefs.length,\n );\n const availableAutoFields = useMemo(() => {\n const autoFields: AutoAddField[] = [];\n if (!primaryKeyFieldLength) {\n autoFields.push({\n name: 'ID (uuid)',\n fields: [\n {\n name: 'id',\n type: 'uuid',\n options: {\n genUuid: true,\n },\n isPrimaryKey: true,\n },\n ],\n });\n }\n const hasCreatedAt = fieldNames.includes('createdAt');\n const hasUpdatedAt = fieldNames.includes('updatedAt');\n if (!hasCreatedAt || !hasUpdatedAt) {\n autoFields.push({\n name: 'Timestamps',\n fields: [\n {\n name: 'createdAt',\n type: 'dateTime',\n options: {\n defaultToNow: true,\n },\n },\n {\n name: 'updatedAt',\n type: 'dateTime',\n options: {\n updatedAt: true,\n defaultToNow: true,\n },\n },\n ],\n });\n }\n return autoFields;\n }, [fieldNames, primaryKeyFieldLength]);\n\n const applyAutoField = (autoField: AutoAddField): void => {\n for (const { isPrimaryKey, ...field } of autoField.fields) {\n const fieldId = modelScalarFieldEntityType.generateNewId();\n if (!fieldNames.includes(field.name)) {\n appendField({\n id: fieldId,\n ...field,\n });\n }\n if (isPrimaryKey) {\n setValue('model.primaryKeyFieldRefs', [fieldId], { shouldDirty: true });\n }\n }\n };\n return (\n <ButtonGroup className={className}>\n <Button\n variant=\"secondary\"\n onClick={() => {\n appendField({\n id: modelScalarFieldEntityType.generateNewId(),\n name: '',\n type: 'string',\n isOptional: true,\n options: {\n default: '',\n },\n } satisfies ModelScalarFieldConfig);\n }}\n size=\"sm\"\n >\n Add Field\n </Button>\n <DropdownMenu>\n <DropdownMenuTrigger\n disabled={availableAutoFields.length === 0}\n asChild\n >\n <Button variant=\"secondary\" size=\"sm\">\n <MdExpandMore />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent>\n {availableAutoFields.map((field) => (\n <DropdownMenuItem\n key={field.name}\n onClick={() => {\n applyAutoField(field);\n }}\n >\n {field.name}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </ButtonGroup>\n );\n}\n","import type { ModelConfigInput } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { Control } from 'react-hook-form';\n\nimport {\n Button,\n DialogClose,\n DialogFooter,\n MultiComboboxFieldController,\n} from '@baseplate-dev/ui-components';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { clsx } from 'clsx';\nimport { useId } from 'react';\nimport { useController, useForm } from 'react-hook-form';\nimport { z } from 'zod';\n\nimport { useEditedModelConfig } from '../../../../-hooks/use-edited-model-config.js';\n\ninterface ModelPrimaryKeyFormProps {\n className?: string;\n control: Control<ModelConfigInput>;\n onSubmitSuccess?: () => void;\n}\n\nconst primaryKeychema = z.object({\n fields: z.array(z.string()).min(1, 'At least one primary key is required'),\n});\n\ntype FormValues = z.infer<typeof primaryKeychema>;\n\nexport function ModelPrimaryKeyForm({\n className,\n control: modelControl,\n onSubmitSuccess,\n}: ModelPrimaryKeyFormProps): React.JSX.Element {\n const fields = useEditedModelConfig((model) => model.model.fields);\n const {\n field: { value: modelValue = [], onChange: onModelChange },\n } = useController({\n name: 'model.primaryKeyFieldRefs',\n control: modelControl,\n });\n\n const { control, handleSubmit } = useForm<FormValues>({\n resolver: zodResolver(primaryKeychema),\n values: { fields: modelValue },\n });\n\n const onSubmit = handleSubmit((data) => {\n onModelChange(data.fields);\n onSubmitSuccess?.();\n });\n\n const formId = useId();\n\n return (\n <form\n className={clsx('space-y-4', className)}\n onSubmit={(e) => {\n e.stopPropagation();\n return onSubmit(e);\n }}\n id={formId}\n >\n <MultiComboboxFieldController\n control={control}\n name=\"fields\"\n options={fields.map((f) => ({ value: f.id, label: f.name }))}\n placeholder=\"Select fields to use as primary keys\"\n />\n <DialogFooter>\n <DialogClose asChild>\n <Button variant=\"secondary\">Cancel</Button>\n </DialogClose>\n <Button type=\"submit\" form={formId}>\n Save\n </Button>\n </DialogFooter>\n </form>\n );\n}\n","import type { ModelConfigInput } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { Control } from 'react-hook-form';\n\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n useControlledState,\n} from '@baseplate-dev/ui-components';\n\nimport { ModelPrimaryKeyForm } from './model-primary-key-form.js';\n\ninterface ModelPrimaryKeyDialogProps {\n control: Control<ModelConfigInput>;\n asChild?: boolean;\n open?: boolean;\n onOpenChange?: (isOpen: boolean) => void;\n children?: React.ReactNode;\n}\n\nexport function ModelPrimaryKeyDialog({\n control,\n children,\n asChild,\n open,\n onOpenChange,\n}: ModelPrimaryKeyDialogProps): React.JSX.Element {\n const [isOpen, setIsOpen] = useControlledState(open, onOpenChange, false);\n return (\n <Dialog open={isOpen} onOpenChange={setIsOpen}>\n {children && <DialogTrigger asChild={asChild}>{children}</DialogTrigger>}\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Primary Keys</DialogTitle>\n <DialogDescription>\n Select the fields that will be used as the primary key for this\n model\n </DialogDescription>\n </DialogHeader>\n <ModelPrimaryKeyForm\n control={control}\n onSubmitSuccess={() => {\n setIsOpen(false);\n }}\n />\n </DialogContent>\n </Dialog>\n );\n}\n","import type { ModelConfigInput } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { Control } from 'react-hook-form';\n\nimport { BadgeWithIcon } from '@baseplate-dev/ui-components';\nimport { useState } from 'react';\nimport { MdKey } from 'react-icons/md';\n\nimport { ModelPrimaryKeyDialog } from './model-primary-key-dialog.js';\n\ninterface ModelPrimaryKeyBadgeProps {\n className?: string;\n control: Control<ModelConfigInput>;\n autoCollapse?: boolean;\n}\n\nexport function ModelPrimaryKeyBadge({\n className,\n control,\n autoCollapse,\n}: ModelPrimaryKeyBadgeProps): React.JSX.Element {\n const [isHovered, setIsHovered] = useState(false);\n const shouldShowText = !autoCollapse || isHovered;\n return (\n <ModelPrimaryKeyDialog control={control}>\n <BadgeWithIcon\n icon={MdKey}\n variant=\"secondary\"\n className={className}\n onMouseEnter={() => {\n setIsHovered(true);\n }}\n onMouseLeave={() => {\n setIsHovered(false);\n }}\n aria-label=\"Primary Key\"\n title=\"Primary Key\"\n >\n {shouldShowText && 'Primary'}\n </BadgeWithIcon>\n </ModelPrimaryKeyDialog>\n );\n}\n","import type {\n ModelConfig,\n ModelConfigInput,\n ModelRelationFieldConfig,\n ModelRelationFieldConfigInput,\n ProjectDefinition,\n} from '@baseplate-dev/project-builder-lib';\nimport type { Control } from 'react-hook-form';\n\nimport {\n createModelRelationFieldSchema,\n ModelFieldUtils,\n modelForeignRelationEntityType,\n modelLocalRelationEntityType,\n ModelUtils,\n} from '@baseplate-dev/project-builder-lib';\nimport {\n useDefinitionSchema,\n useProjectDefinition,\n} from '@baseplate-dev/project-builder-lib/web';\nimport {\n Button,\n ComboboxField,\n ComboboxFieldController,\n DialogClose,\n DialogFooter,\n InputFieldController,\n SelectFieldController,\n toast,\n} from '@baseplate-dev/ui-components';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { clsx } from 'clsx';\nimport { camelCase } from 'es-toolkit';\nimport { pluralize } from 'inflection';\nimport React, { useId, useMemo } from 'react';\nimport { useController, useForm } from 'react-hook-form';\n\nimport { useEditedModelConfig } from '../../../../-hooks/use-edited-model-config.js';\n\ninterface ModelRelationFormProps {\n className?: string;\n control: Control<ModelConfigInput>;\n onSubmitSuccess?: () => void;\n relationId?: string;\n defaultFieldName?: string;\n}\n\n/**\n * Tries to guess the model type from the field name\n */\nfunction guessModelTypeFromFieldName(\n definition: ProjectDefinition,\n editedModel: ModelConfigInput,\n fieldName: string | undefined,\n): string | undefined {\n if (!fieldName) return;\n\n const name = fieldName.replace(/Id$/, '');\n\n const tryFindModel = (\n condition: (m: ModelConfig) => boolean,\n ): string | undefined =>\n definition.models.find((m) => m.id !== editedModel.id && condition(m))?.id;\n\n // try to find a model with the exact name first\n const modelWithName = tryFindModel(\n (m) => m.name.toLowerCase() === name.toLowerCase(),\n );\n if (modelWithName) return modelWithName;\n\n // try to find a model with the same feature and a similar name\n const modelWithFeature = tryFindModel(\n (m) =>\n m.featureRef === m.featureRef &&\n m.name.toLowerCase().includes(name.toLowerCase()),\n );\n if (modelWithFeature) return modelWithFeature;\n\n // try to find a model with a similar name\n const modelWithSimilarName = tryFindModel((m) =>\n m.name.toLowerCase().includes(name.toLowerCase()),\n );\n return modelWithSimilarName;\n}\n\n/**\n * Tries to guess the default values for a relation field based on the model\n */\nfunction getRelationDefaultsFromModel(\n definition: ProjectDefinition,\n editedModel: ModelConfigInput,\n editedRelation: Partial<ModelRelationFieldConfigInput>,\n defaultFieldName?: string,\n): Pick<\n ModelRelationFieldConfig,\n 'foreignRelationName' | 'name' | 'references'\n> {\n // default the name to the local field name if it ends with Id\n const name = (() => {\n if (editedRelation.name) return editedRelation.name;\n if (editedRelation.modelRef) {\n const model = ModelUtils.byIdOrThrow(definition, editedRelation.modelRef);\n return camelCase(model.name);\n }\n return;\n })();\n\n const references = (() => {\n if (!editedRelation.modelRef) return;\n const {\n model: { fields, primaryKeyFieldRefs },\n name: foreignName,\n } = ModelUtils.byIdOrThrow(definition, editedRelation.modelRef);\n const primaryKeys = fields.filter((f) =>\n primaryKeyFieldRefs.includes(f.id),\n );\n const existingReferences = editedRelation.references ?? [];\n return primaryKeys.map((primaryKey, i) => {\n const bestGuessLocalName = (() => {\n if (i === 0 && defaultFieldName) return defaultFieldName;\n if (primaryKeys.length === 1) return `${camelCase(foreignName)}Id`;\n return primaryKey.name;\n })();\n const bestGuessLocal =\n existingReferences[i]?.localRef ??\n editedModel.model.fields.find((f) => f.name === bestGuessLocalName)?.id;\n return {\n localRef: bestGuessLocal,\n foreignRef: primaryKey.id,\n };\n });\n })();\n\n const foreignRelationName = (() => {\n if (!references) return;\n if (editedRelation.foreignRelationName) {\n return editedRelation.foreignRelationName;\n }\n const isOneToOne =\n references.every((ref) => ref.localRef) &&\n ModelFieldUtils.areScalarsUnique(\n editedModel,\n references.map((r) => r.localRef),\n );\n return camelCase(\n isOneToOne ? editedModel.name : pluralize(editedModel.name),\n );\n })();\n\n return {\n name: name ?? '',\n foreignRelationName: foreignRelationName ?? '',\n references: references ?? [],\n };\n}\n\nexport function ModelRelationForm({\n className,\n control: modelControl,\n onSubmitSuccess,\n relationId,\n defaultFieldName,\n}: ModelRelationFormProps): React.JSX.Element {\n const { definition } = useProjectDefinition();\n const editedModel = useEditedModelConfig((model) => model);\n const modelName = editedModel.name;\n const { fields } = editedModel.model;\n const {\n field: { value: modelRelations = [], onChange: onModelRelationsChange },\n } = useController({\n name: `model.relations`,\n control: modelControl,\n });\n\n const foreignModelOptions = definition.models.map((type) => ({\n label: type.name,\n value: type.id,\n }));\n\n const modelRelation =\n relationId === undefined\n ? undefined\n : modelRelations.find((item) => item.id === relationId);\n\n const defaultValues = useMemo((): ModelRelationFieldConfigInput => {\n if (modelRelation) return modelRelation;\n const modelRef = guessModelTypeFromFieldName(\n definition,\n editedModel,\n defaultFieldName,\n );\n return {\n id: modelLocalRelationEntityType.generateNewId(),\n foreignId: modelForeignRelationEntityType.generateNewId(),\n modelRef: modelRef ?? '',\n onDelete: 'Restrict',\n onUpdate: 'Restrict',\n ...getRelationDefaultsFromModel(\n definition,\n editedModel,\n {\n modelRef,\n },\n defaultFieldName,\n ),\n };\n }, [modelRelation, defaultFieldName, definition, editedModel]);\n\n const modelRelationFieldSchema = useDefinitionSchema(\n createModelRelationFieldSchema,\n );\n\n const { control, handleSubmit, setError, watch, setValue } = useForm({\n resolver: zodResolver(modelRelationFieldSchema),\n defaultValues,\n });\n\n const relation = watch();\n\n const foreignModel = relation.modelRef\n ? definition.models.find((m) => m.id === relation.modelRef)\n : undefined;\n\n const foreignFields = foreignModel?.model.fields;\n\n const localFieldOptions = fields.map((f) => ({\n label: f.name,\n value: f.id,\n }));\n\n const foreignFieldOptions =\n foreignFields?.map((f) => ({\n label: f.name,\n value: f.id,\n })) ?? [];\n\n const isRelationOptional = relation.references.some(\n (ref) => fields.find((f) => f.id === ref.localRef)?.isOptional,\n );\n\n const onDelete = (): void => {\n onModelRelationsChange(\n modelRelations.filter((relation) => relation.id !== relationId),\n );\n onSubmitSuccess?.();\n };\n\n const onSubmit = handleSubmit((data): void => {\n const { id } = data;\n\n if (\n fields.some((field) => field.name === data.name) ||\n modelRelations.some(\n (relation) => relation.name === data.name && relation.id !== data.id,\n )\n ) {\n setError('name', {\n message:\n 'The relation name cannot be the same as a field/relation name',\n });\n return;\n }\n\n // look for duplicate local fields\n const localFields = data.references.map((ref) => ref.localRef);\n if (new Set(localFields).size !== localFields.length) {\n toast.error('Local fields must be unique');\n return;\n }\n\n const foreignFields = data.references.map((ref) => ref.foreignRef);\n if (new Set(foreignFields).size !== foreignFields.length) {\n toast.error('Foreign fields must be unique');\n return;\n }\n\n // replace the existing relation with the new one if it exists\n if (modelRelations.some((relation) => relation.id === id)) {\n onModelRelationsChange(\n modelRelations.map((relation) =>\n relation.id === id ? data : relation,\n ),\n );\n } else {\n onModelRelationsChange([...modelRelations, data]);\n }\n onSubmitSuccess?.();\n });\n\n const formId = useId();\n\n const hasSelectedForeignModel = !!foreignModel;\n\n return (\n <form\n className={clsx('space-y-4', className)}\n onSubmit={(e) => {\n e.stopPropagation();\n return onSubmit(e);\n }}\n id={formId}\n >\n <div className=\"grid grid-cols-2 gap-x-8 gap-y-2\">\n <ComboboxField\n options={[{ label: modelName, value: modelName }]}\n value={modelName}\n disabled\n label=\"Local Model\"\n />\n <ComboboxFieldController\n control={control}\n name=\"modelRef\"\n options={foreignModelOptions}\n label=\"Foreign Model\"\n onChange={(value) => {\n if (!value) return;\n const { foreignRelationName, name, references } =\n getRelationDefaultsFromModel(\n definition,\n editedModel,\n {\n ...relation,\n modelRef: value,\n },\n defaultFieldName,\n );\n if (foreignRelationName) {\n setValue('foreignRelationName', foreignRelationName);\n }\n if (name) {\n setValue('name', name);\n }\n setValue('references', references);\n }}\n />\n </div>\n <div\n className={clsx(\n 'grid grid-cols-2 gap-x-8 gap-y-2',\n !hasSelectedForeignModel && 'pointer-events-none opacity-50',\n )}\n >\n <InputFieldController\n control={control}\n disabled={!hasSelectedForeignModel}\n name=\"name\"\n label=\"Local Relation Name\"\n description={\n <span>\n Name of the relation, e.g. {camelCase(modelName)}.\n <strong>\n {foreignModel?.name ? camelCase(foreignModel.name) : 'user'}\n </strong>\n </span>\n }\n />\n <InputFieldController\n control={control}\n disabled={!hasSelectedForeignModel}\n name=\"foreignRelationName\"\n label=\"Foreign Relation Name\"\n description={\n <span>\n Name of the relation on the foreign model, e.g.{' '}\n {camelCase(foreignModel?.name ?? 'post')}.\n <strong>{defaultValues.foreignRelationName || 'user'}</strong>\n </span>\n }\n />\n <div className=\"text-sm font-medium\">Local Field</div>\n <div className=\"text-sm font-medium\">Foreign Field</div>\n {relation.references.map((_, i) => (\n <React.Fragment key={i}>\n <ComboboxFieldController\n disabled={!hasSelectedForeignModel}\n control={control}\n name={`references.${i}.localRef`}\n options={localFieldOptions}\n />\n <ComboboxFieldController\n control={control}\n name={`references.${i}.foreignRef`}\n options={foreignFieldOptions}\n disabled\n />\n </React.Fragment>\n ))}\n </div>\n <div className=\"grid grid-cols-2 gap-x-8 gap-y-2 border-t pt-4\">\n <SelectFieldController\n label=\"On Delete\"\n control={control}\n options={[\n { label: 'Cascade (delete entire local row)', value: 'Cascade' },\n { label: 'Restrict (throw error)', value: 'Restrict' },\n ...(isRelationOptional\n ? [\n {\n label: 'Set Null (set local field to null)',\n value: 'SetNull',\n },\n ]\n : []),\n ]}\n name=\"onDelete\"\n description=\"What to do when the foreign row is deleted\"\n />\n </div>\n <DialogFooter>\n <div className=\"flex w-full justify-between\">\n {relationId && (\n <Button\n variant=\"secondary\"\n onClick={(e) => {\n e.preventDefault();\n onDelete();\n }}\n >\n Delete\n </Button>\n )}\n <div className=\"flex gap-4\">\n <DialogClose asChild>\n <Button variant=\"secondary\">Cancel</Button>\n </DialogClose>\n <Button\n type=\"submit\"\n form={formId}\n disabled={!hasSelectedForeignModel}\n >\n Save\n </Button>\n </div>\n </div>\n </DialogFooter>\n </form>\n );\n}\n","import type { ModelConfigInput } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { Control } from 'react-hook-form';\n\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n useControlledState,\n} from '@baseplate-dev/ui-components';\n\nimport { ModelRelationForm } from './model-relation-form.js';\n\ninterface ModelRelationDialogProps {\n control: Control<ModelConfigInput>;\n asChild?: boolean;\n open?: boolean;\n onOpenChange?: (isOpen: boolean) => void;\n children?: React.ReactNode;\n relationId?: string;\n defaultFieldName?: string;\n}\n\nexport function ModelRelationDialog({\n control,\n children,\n asChild,\n open,\n onOpenChange,\n relationId,\n defaultFieldName,\n}: ModelRelationDialogProps): React.JSX.Element {\n const [isOpen, setIsOpen] = useControlledState(open, onOpenChange, false);\n return (\n <Dialog open={isOpen} onOpenChange={setIsOpen}>\n {children && <DialogTrigger asChild={asChild}>{children}</DialogTrigger>}\n <DialogContent width=\"lg\">\n <DialogHeader>\n <DialogTitle>\n {relationId ? 'Edit Relation' : 'Create Relation'}\n </DialogTitle>\n <DialogDescription>\n Set up the relation between this model and another model\n </DialogDescription>\n </DialogHeader>\n <ModelRelationForm\n control={control}\n onSubmitSuccess={() => {\n setIsOpen(false);\n }}\n relationId={relationId}\n defaultFieldName={defaultFieldName}\n />\n </DialogContent>\n </Dialog>\n );\n}\n","import type {\n ModelConfigInput,\n ModelRelationFieldConfigInput,\n} from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { Control } from 'react-hook-form';\n\nimport { useProjectDefinition } from '@baseplate-dev/project-builder-lib/web';\nimport { BadgeWithIcon } from '@baseplate-dev/ui-components';\nimport clsx from 'clsx';\nimport { useState } from 'react';\nimport { MdLink } from 'react-icons/md';\n\nimport { ModelRelationDialog } from './model-relation-dialog.js';\n\ninterface ModelRelationBadgeProps {\n className?: string;\n control: Control<ModelConfigInput>;\n relation: ModelRelationFieldConfigInput;\n autoCollapse?: boolean;\n}\n\nexport function ModelRelationsBadge({\n className,\n control,\n relation,\n autoCollapse,\n}: ModelRelationBadgeProps): React.JSX.Element {\n const { definitionContainer } = useProjectDefinition();\n const [isHovered, setIsHovered] = useState(false);\n const shouldShowText = !autoCollapse || isHovered;\n return (\n <ModelRelationDialog control={control} relationId={relation.id}>\n <BadgeWithIcon\n icon={MdLink}\n variant=\"secondary\"\n className={clsx('max-w-[100px]', className)}\n onMouseEnter={() => {\n setIsHovered(true);\n }}\n onMouseLeave={() => {\n setIsHovered(false);\n }}\n aria-label=\"Relation\"\n title=\"Relation\"\n >\n {shouldShowText &&\n `${definitionContainer.nameFromId(relation.modelRef)} ${\n relation.references.length > 1\n ? `(${relation.references.length})`\n : ''\n }`}\n </BadgeWithIcon>\n </ModelRelationDialog>\n );\n}\n","import type { ModelConfigInput } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { Control } from 'react-hook-form';\n\nimport { modelUniqueConstraintEntityType } from '@baseplate-dev/project-builder-lib';\nimport {\n Button,\n DialogClose,\n DialogFooter,\n MultiComboboxFieldController,\n} from '@baseplate-dev/ui-components';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { clsx } from 'clsx';\nimport { useId } from 'react';\nimport { useController, useForm } from 'react-hook-form';\nimport { z } from 'zod';\n\nimport { useEditedModelConfig } from '../../../../-hooks/use-edited-model-config.js';\n\ninterface ModelUniqueConstraintFormProps {\n className?: string;\n control: Control<ModelConfigInput>;\n onSubmitSuccess?: () => void;\n constraintId?: string;\n}\n\nconst formSchema = z.object({\n id: z.string().optional(),\n fields: z.array(z.string()).min(1, 'At least one field is required'),\n});\n\ntype FormValues = z.infer<typeof formSchema>;\n\nexport function ModelUniqueConstraintForm({\n className,\n control: modelControl,\n onSubmitSuccess,\n constraintId,\n}: ModelUniqueConstraintFormProps): React.JSX.Element {\n const fields = useEditedModelConfig((model) => model.model.fields);\n const {\n field: { value: modelValue = [], onChange: onModelChange },\n } = useController({\n name: `model.uniqueConstraints`,\n control: modelControl,\n });\n\n const modelUniqueConstraint =\n constraintId === undefined\n ? undefined\n : modelValue.find((uc) => uc.id === constraintId);\n\n const { control, handleSubmit } = useForm<FormValues>({\n resolver: zodResolver(formSchema),\n values: modelUniqueConstraint\n ? {\n id: modelUniqueConstraint.id,\n fields: modelUniqueConstraint.fields.map((f) => f.fieldRef),\n }\n : { fields: [] },\n });\n\n const onDelete = (): void => {\n onModelChange(modelValue.filter((uc) => uc.id !== constraintId));\n onSubmitSuccess?.();\n };\n\n const onSubmit = handleSubmit((data) => {\n const dataWithId = {\n id: data.id ?? modelUniqueConstraintEntityType.generateNewId(),\n fields: data.fields.map((fieldRef) => ({\n fieldRef,\n })),\n };\n const { id } = dataWithId;\n // replace the existing unique constraint with the new one if it exists\n if (modelValue.some((uc) => uc.id === id)) {\n onModelChange(modelValue.map((uc) => (uc.id === id ? dataWithId : uc)));\n } else {\n onModelChange([...modelValue, dataWithId]);\n }\n onSubmitSuccess?.();\n });\n\n const formId = useId();\n\n return (\n <form\n className={clsx('space-y-4', className)}\n onSubmit={(e) => {\n e.stopPropagation();\n return onSubmit(e);\n }}\n id={formId}\n >\n <MultiComboboxFieldController\n control={control}\n name=\"fields\"\n options={fields.map((f) => ({ value: f.id, label: f.name }))}\n placeholder=\"Select fields to use as primary keys\"\n />\n <DialogFooter>\n <div className=\"flex w-full justify-between\">\n {constraintId && (\n <Button\n variant=\"secondary\"\n onClick={(e) => {\n e.preventDefault();\n onDelete();\n }}\n >\n Delete\n </Button>\n )}\n <div className=\"flex gap-4\">\n <DialogClose asChild>\n <Button variant=\"secondary\">Cancel</Button>\n </DialogClose>\n <Button type=\"submit\" form={formId}>\n Save\n </Button>\n </div>\n </div>\n </DialogFooter>\n </form>\n );\n}\n","import type { ModelConfigInput } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { Control } from 'react-hook-form';\n\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n useControlledState,\n} from '@baseplate-dev/ui-components';\n\nimport { ModelUniqueConstraintForm } from './model-unique-constraint-form.js';\n\ninterface ModelUniqueConstraintDialogProps {\n control: Control<ModelConfigInput>;\n asChild?: boolean;\n open?: boolean;\n onOpenChange?: (isOpen: boolean) => void;\n children?: React.ReactNode;\n constraintId?: string;\n}\n\nexport function ModelUniqueConstraintDialog({\n control,\n children,\n asChild,\n open,\n onOpenChange,\n constraintId,\n}: ModelUniqueConstraintDialogProps): React.JSX.Element {\n const [isOpen, setIsOpen] = useControlledState(open, onOpenChange, false);\n return (\n <Dialog open={isOpen} onOpenChange={setIsOpen}>\n {children && <DialogTrigger asChild={asChild}>{children}</DialogTrigger>}\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Unique Constraint</DialogTitle>\n <DialogDescription>\n Select the fields that will be part of this unique constraint.\n </DialogDescription>\n </DialogHeader>\n <ModelUniqueConstraintForm\n control={control}\n onSubmitSuccess={() => {\n setIsOpen(false);\n }}\n constraintId={constraintId}\n />\n </DialogContent>\n </Dialog>\n );\n}\n","import type { ModelConfigInput } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { Control } from 'react-hook-form';\n\nimport { BadgeWithIcon } from '@baseplate-dev/ui-components';\nimport { clsx } from 'clsx';\nimport { useState } from 'react';\nimport { MdStar } from 'react-icons/md';\n\nimport { useEditedModelConfig } from '../../../../-hooks/use-edited-model-config.js';\nimport { ModelUniqueConstraintDialog } from './model-unique-constraint-dialog.js';\n\ninterface ModelFieldUniqueBadgeProps {\n className?: string;\n control: Control<ModelConfigInput>;\n constraintId: string;\n autoCollapse?: boolean;\n}\n\nexport function ModelFieldUniqueBadge({\n className,\n control,\n constraintId,\n autoCollapse,\n}: ModelFieldUniqueBadgeProps): React.JSX.Element {\n const [isHovered, setIsHovered] = useState(false);\n const shouldShowText = !autoCollapse || isHovered;\n const fieldsLength = useEditedModelConfig(\n (model) =>\n model.model.uniqueConstraints?.find((uc) => uc.id === constraintId)\n ?.fields.length ?? 0,\n );\n return (\n <ModelUniqueConstraintDialog control={control} constraintId={constraintId}>\n <BadgeWithIcon\n variant=\"secondary\"\n icon={MdStar}\n className={clsx('', className)}\n onMouseEnter={() => {\n setIsHovered(true);\n }}\n onMouseLeave={() => {\n setIsHovered(false);\n }}\n aria-label=\"Unique Constraint\"\n title=\"Unique Constraint\"\n >\n {shouldShowText &&\n `Unique ${fieldsLength > 1 ? `(${fieldsLength})` : ''}`}\n </BadgeWithIcon>\n </ModelUniqueConstraintDialog>\n );\n}\n","import type { ModelConfigInput } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { Control } from 'react-hook-form';\n\nimport { clsx } from 'clsx';\n\nimport { useEditedModelConfig } from '../../../../-hooks/use-edited-model-config.js';\nimport { ModelPrimaryKeyBadge } from '../primary-key/model-primary-key-badge.js';\nimport { ModelRelationsBadge } from '../relations/model-relation-badge.js';\nimport { ModelFieldUniqueBadge } from '../unique-constraints/model-unique-constraint-badge.js';\n\ninterface ModelFieldBadgesProps {\n className?: string;\n control: Control<ModelConfigInput>;\n idx: number;\n}\n\nexport function ModelFieldBadges({\n className,\n control,\n idx,\n}: ModelFieldBadgesProps): React.JSX.Element {\n const field = useEditedModelConfig((model) => model.model.fields[idx]);\n const isPrimary = useEditedModelConfig((model) =>\n model.model.primaryKeyFieldRefs.includes(field.id),\n );\n const uniqueConstraints = useEditedModelConfig(\n (model) =>\n model.model.uniqueConstraints\n ?.filter((constraint) =>\n constraint.fields.some((f) => f.fieldRef === field.id),\n )\n .map((uc) => uc.id) ?? [],\n );\n const modelFieldRelations = useEditedModelConfig(({ model }) => {\n const field = model.fields[idx];\n return (\n model.relations?.filter((r) =>\n r.references.some((ref) => ref.localRef === field.id),\n ) ?? []\n );\n });\n\n const totalBadges =\n (isPrimary ? 1 : 0) + uniqueConstraints.length + modelFieldRelations.length;\n const autoCollapse = totalBadges > 2;\n\n const badges = [\n isPrimary && (\n <ModelPrimaryKeyBadge\n key={'primary'}\n control={control}\n autoCollapse={autoCollapse}\n />\n ),\n ...uniqueConstraints.map((uc) => (\n <ModelFieldUniqueBadge\n key={uc}\n control={control}\n constraintId={uc}\n autoCollapse={autoCollapse}\n />\n )),\n ...modelFieldRelations.map((relation) => (\n <ModelRelationsBadge\n key={relation.id}\n control={control}\n relation={relation}\n autoCollapse={autoCollapse}\n />\n )),\n ];\n\n return <div className={clsx('flex gap-4', className)}>{badges}</div>;\n}\n","import type { ModelConfigInput } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { Control, UseFormSetValue } from 'react-hook-form';\n\nimport { EnumUtils } from '@baseplate-dev/project-builder-lib';\nimport { useProjectDefinition } from '@baseplate-dev/project-builder-lib/web';\nimport {\n Button,\n ComboboxField,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuTrigger,\n InputField,\n InputFieldController,\n SelectFieldController,\n} from '@baseplate-dev/ui-components';\nimport { useController, useWatch } from 'react-hook-form';\nimport { HiDotsVertical, HiOutlineX } from 'react-icons/hi';\n\ninterface ModelFieldDefaultValueInputProps {\n control: Control<ModelConfigInput>;\n setValue: UseFormSetValue<ModelConfigInput>;\n idx: number;\n}\n\nexport function ModelFieldDefaultValueInput({\n control,\n idx,\n setValue,\n}: ModelFieldDefaultValueInputProps): React.JSX.Element {\n const { definition } = useProjectDefinition();\n const type = useWatch({\n control,\n name: `model.fields.${idx}.type`,\n });\n\n const {\n field: { value: optionsValue, onChange: onOptionsChange },\n } = useController({\n name: `model.fields.${idx}.options`,\n control,\n });\n\n const defaultValue = useWatch({\n control,\n name: `model.fields.${idx}.options.default`,\n });\n\n if (type === 'boolean') {\n return (\n <div className=\"flex items-center gap-1\">\n <SelectFieldController\n control={control}\n className=\"flex-1\"\n name={`model.fields.${idx}.options.default`}\n options={[\n { label: 'True', value: 'true' },\n { label: 'False', value: 'false' },\n ]}\n placeholder=\"NULL\"\n />\n {defaultValue && (\n <Button\n title=\"Reset\"\n onClick={() => {\n setValue(`model.fields.${idx}.options.default`, '', {\n shouldDirty: true,\n });\n }}\n variant=\"ghost\"\n size=\"icon\"\n >\n <HiOutlineX />\n </Button>\n )}\n </div>\n );\n }\n\n if (['string', 'int', 'float'].includes(type)) {\n return (\n <div className=\"flex items-center gap-1\">\n <InputFieldController\n control={control}\n placeholder=\"NULL\"\n name={`model.fields.${idx}.options.default`}\n className=\"flex-1\"\n />\n {defaultValue && (\n <Button\n title=\"Reset\"\n onClick={() => {\n setValue(`model.fields.${idx}.options.default`, undefined, {\n shouldDirty: true,\n });\n }}\n variant=\"ghost\"\n size=\"icon\"\n >\n <HiOutlineX />\n </Button>\n )}\n </div>\n );\n }\n\n if (type === 'uuid') {\n if (optionsValue?.genUuid) {\n return (\n <div className=\"flex items-center gap-1\">\n <InputField disabled value=\"Random UUID v4\" className=\"flex-1\" />\n <Button\n title=\"Reset\"\n onClick={() => {\n onOptionsChange({ ...optionsValue, genUuid: false });\n }}\n variant=\"ghost\"\n size=\"icon\"\n >\n <HiOutlineX />\n </Button>\n </div>\n );\n }\n return (\n <div className=\"flex items-center gap-1\">\n <InputFieldController\n control={control}\n placeholder=\"NULL\"\n name={`model.fields.${idx}.options.default`}\n className=\"flex-1\"\n />\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button title=\"Options\" variant=\"ghost\" size=\"icon\">\n <HiDotsVertical />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent>\n <DropdownMenuGroup>\n <DropdownMenuItem\n onSelect={() => {\n onOptionsChange({\n ...optionsValue,\n genUuid: true,\n });\n }}\n >\n Random UUID v4\n </DropdownMenuItem>\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n );\n }\n\n if (type === 'dateTime' || type === 'date') {\n const { defaultToNow, updatedAt } = optionsValue ?? {};\n\n if (defaultToNow ?? updatedAt) {\n return (\n <div className=\"flex items-center gap-1\">\n <InputField\n disabled\n value={updatedAt ? 'Last Updated' : 'Now'}\n className=\"flex-1\"\n />\n <Button\n title=\"Reset\"\n onClick={() => {\n onOptionsChange({\n ...optionsValue,\n defaultToNow: false,\n updatedAt: false,\n });\n }}\n variant=\"ghost\"\n size=\"icon\"\n >\n <HiOutlineX />\n </Button>\n </div>\n );\n }\n return (\n <div className=\"flex items-center space-x-1\">\n <InputFieldController\n placeholder=\"NULL\"\n control={control}\n name={`model.fields.${idx}.options.default`}\n className=\"flex-1\"\n />\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button title=\"Options\" variant=\"ghost\" size=\"icon\">\n <HiDotsVertical />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent>\n <DropdownMenuGroup>\n <DropdownMenuItem\n onSelect={() => {\n onOptionsChange({\n ...optionsValue,\n defaultToNow: true,\n updatedAt: false,\n });\n }}\n >\n Now\n </DropdownMenuItem>\n <DropdownMenuItem\n onSelect={() => {\n onOptionsChange({\n ...optionsValue,\n defaultToNow: true,\n updatedAt: true,\n });\n }}\n >\n Last Updated At\n </DropdownMenuItem>\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n );\n }\n\n if (type === 'enum' && optionsValue?.enumRef) {\n const fieldEnum = EnumUtils.byIdOrThrow(definition, optionsValue.enumRef);\n const enumValues = fieldEnum.values.map((v) => ({\n label: v.friendlyName,\n value: v.id,\n }));\n return (\n <div className=\"flex items-center space-x-1\">\n <ComboboxField\n placeholder=\"NULL\"\n value={optionsValue.defaultEnumValueRef ?? null}\n onChange={(value) => {\n onOptionsChange({\n ...optionsValue,\n defaultEnumValueRef: value ? value : undefined,\n });\n }}\n options={enumValues}\n className=\"flex-1\"\n />\n {optionsValue.defaultEnumValueRef && (\n <Button\n title=\"Reset\"\n onClick={() => {\n onOptionsChange({\n ...optionsValue,\n defaultEnumValueRef: '',\n });\n }}\n variant=\"ghost\"\n size=\"icon\"\n >\n <HiOutlineX />\n </Button>\n )}\n </div>\n );\n }\n\n return <div />;\n}\n","import type {\n ModelConfigInput,\n ScalarFieldType,\n} from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { Control } from 'react-hook-form';\n\nimport { SCALAR_FIELD_TYPES } from '@baseplate-dev/project-builder-lib';\nimport { useProjectDefinition } from '@baseplate-dev/project-builder-lib/web';\nimport { ComboboxField } from '@baseplate-dev/ui-components';\nimport { useController } from 'react-hook-form';\n\nimport type { ScalarFieldTypeOption } from '../../../-constants.js';\n\nimport { SCALAR_FIELD_TYPE_OPTIONS } from '../../../-constants.js';\n\ninterface ModelFieldTypeInputProps {\n control: Control<ModelConfigInput>;\n idx: number;\n}\n\nexport function ModelFieldTypeInput({\n control,\n idx,\n}: ModelFieldTypeInputProps): React.JSX.Element {\n const { definition } = useProjectDefinition();\n\n const enumOptions: ScalarFieldTypeOption[] = (definition.enums ?? []).map(\n (config) => ({\n label: config.name,\n value: `enum-${config.id}`,\n description: 'Enum type',\n }),\n );\n\n const typeOptions = [\n ...SCALAR_FIELD_TYPES.filter((t) => t !== 'enum').map(\n (fieldType) => SCALAR_FIELD_TYPE_OPTIONS[fieldType],\n ),\n ...enumOptions,\n ];\n\n const {\n field: { value: typeValue, onChange: onTypeChange },\n } = useController({\n name: `model.fields.${idx}.type`,\n control,\n });\n\n const {\n field: { value: fieldOptions, onChange: onFieldOptionsChange },\n } = useController({\n name: `model.fields.${idx}.options`,\n control,\n });\n\n const handleChange = (value: string | null): void => {\n if (value?.startsWith('enum-')) {\n const enumRef = value.replace('enum-', '');\n onFieldOptionsChange({\n enumRef,\n });\n onTypeChange('enum');\n } else {\n onTypeChange(value as ScalarFieldType);\n }\n };\n\n const enumRef = fieldOptions?.enumRef;\n\n return (\n <div className=\"space-y-2\">\n <ComboboxField\n value={typeValue === 'enum' && enumRef ? `enum-${enumRef}` : typeValue}\n onChange={handleChange}\n options={typeOptions}\n renderItemLabel={(option) => (\n <div className=\"flex flex-col\">\n <div>{option.label}</div>\n <div className=\"text-xs text-muted-foreground\">\n {option.description}\n </div>\n </div>\n )}\n />\n </div>\n );\n}\n","import type { ModelConfigInput } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { Control, UseFormSetValue } from 'react-hook-form';\n\nimport { modelUniqueConstraintEntityType } from '@baseplate-dev/project-builder-lib';\nimport {\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuTrigger,\n InputFieldController,\n SwitchFieldController,\n toast,\n} from '@baseplate-dev/ui-components';\nimport clsx from 'clsx';\nimport { useState } from 'react';\nimport { HiDotsVertical } from 'react-icons/hi';\nimport { MdOutlineDelete } from 'react-icons/md';\n\nimport { useEditedModelConfig } from '../../../-hooks/use-edited-model-config.js';\nimport { ModelFieldBadges } from './badges/model-field-badges.js';\nimport { ModelFieldDefaultValueInput } from './model-field-default-value-input.js';\nimport { ModelFieldTypeInput } from './model-field-type-input.js';\nimport { ModelPrimaryKeyDialog } from './primary-key/model-primary-key-dialog.js';\nimport { ModelRelationDialog } from './relations/model-relation-dialog.js';\nimport { ModelUniqueConstraintDialog } from './unique-constraints/model-unique-constraint-dialog.js';\n\ninterface Props {\n className?: string;\n control: Control<ModelConfigInput>;\n setValue: UseFormSetValue<ModelConfigInput>;\n idx: number;\n onRemove: (idx: number) => void;\n}\n\nfunction ModelFieldForm({\n className,\n control,\n idx,\n setValue,\n onRemove,\n}: Props): React.JSX.Element {\n const watchedField = useEditedModelConfig((model) => model.model.fields[idx]);\n\n const watchedRelations = useEditedModelConfig(\n (model) => model.model.relations,\n );\n\n const primaryKeyFieldRefs = useEditedModelConfig(\n (model) => model.model.primaryKeyFieldRefs,\n );\n const uniqueConstraints =\n useEditedModelConfig((model) => model.model.uniqueConstraints) ?? [];\n const isPartOfPrimaryKey = primaryKeyFieldRefs.includes(watchedField.id);\n const hasCompositePrimaryKey = primaryKeyFieldRefs.length > 1;\n\n const ownUniqueConstraints = uniqueConstraints.filter((uc) =>\n uc.fields.some((f) => f.fieldRef === watchedField.id),\n );\n const usedRelations =\n watchedRelations?.filter((relation) =>\n relation.references.some((r) => r.localRef === watchedField.id),\n ) ?? [];\n\n const removeError = (() => {\n // check local references\n if (usedRelations.length > 0) {\n return `Unable to remove field as it is being used in relations ${usedRelations\n .map((r) => r.name)\n .join(', ')}`;\n }\n // check primary keys\n if (isPartOfPrimaryKey && hasCompositePrimaryKey) {\n return `Unable to remove field as it is being used in in the primary key`;\n }\n // check unique constraints\n if (\n uniqueConstraints.some((constraint) =>\n constraint.fields.some((f) => f.fieldRef === watchedField.id),\n )\n ) {\n return `Unable to remove field as it is being used in in a unique constraint`;\n }\n return;\n })();\n\n function handleRemove(): void {\n if (removeError) {\n toast.error(removeError);\n return;\n }\n\n onRemove(idx);\n\n if (isPartOfPrimaryKey && !hasCompositePrimaryKey) {\n setValue('model.primaryKeyFieldRefs', [], { shouldDirty: true });\n }\n }\n\n const [isPrimaryKeyDialogOpen, setIsPrimaryKeyDialogOpen] = useState(false);\n\n const [isUniqueConstraintDialogOpen, setIsUniqueConstraintDialogOpen] =\n useState(false);\n const [uniqueConstriantId, setUniqueConstraintId] = useState<\n string | undefined\n >();\n\n const [isRelationDialogOpen, setIsRelationDialogOpen] = useState(false);\n const [relationId, setRelationId] = useState<string | undefined>();\n\n return (\n <div className={clsx('items-center', className)}>\n <div>\n <InputFieldController\n control={control}\n name={`model.fields.${idx}.name`}\n />\n </div>\n <div>\n <ModelFieldTypeInput control={control} idx={idx} />\n </div>\n <div>\n <SwitchFieldController\n control={control}\n name={`model.fields.${idx}.isOptional`}\n />\n </div>\n <div className=\"mr-4\">\n <ModelFieldDefaultValueInput\n control={control}\n idx={idx}\n setValue={setValue}\n />\n </div>\n <div>\n <ModelFieldBadges control={control} idx={idx} />\n </div>\n <div>\n <div className=\"flex items-center gap-2\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\">\n <HiDotsVertical />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent>\n <DropdownMenuGroup>\n {usedRelations.length === 0 && (\n <DropdownMenuItem\n onSelect={() => {\n setIsRelationDialogOpen(true);\n setRelationId(undefined);\n }}\n >\n Add Relation\n </DropdownMenuItem>\n )}\n {usedRelations.length > 0 &&\n usedRelations.map((relation) => (\n <DropdownMenuItem\n key={relation.id}\n onSelect={() => {\n setIsRelationDialogOpen(true);\n setRelationId(relation.id);\n }}\n >\n Edit Relation {usedRelations.length > 1 && relation.name}\n </DropdownMenuItem>\n ))}\n {!hasCompositePrimaryKey && !isPartOfPrimaryKey && (\n <DropdownMenuItem\n onSelect={() => {\n setValue('model.primaryKeyFieldRefs', [watchedField.id], {\n shouldDirty: true,\n });\n }}\n >\n Set as Primary Key\n </DropdownMenuItem>\n )}\n {isPartOfPrimaryKey && (\n <DropdownMenuItem\n onSelect={() => {\n setIsPrimaryKeyDialogOpen(true);\n }}\n >\n Edit Primary Key\n </DropdownMenuItem>\n )}\n {ownUniqueConstraints.length === 0 &&\n (hasCompositePrimaryKey || !isPartOfPrimaryKey) && (\n <DropdownMenuItem\n onSelect={() => {\n setValue(\n 'model.uniqueConstraints',\n [\n ...uniqueConstraints,\n {\n id: modelUniqueConstraintEntityType.generateNewId(),\n fields: [{ fieldRef: watchedField.id }],\n },\n ],\n { shouldDirty: true },\n );\n }}\n >\n Make Unique\n </DropdownMenuItem>\n )}\n {ownUniqueConstraints.length > 0 &&\n ownUniqueConstraints.map((uc, idx) => (\n <DropdownMenuItem\n key={uc.id}\n onSelect={() => {\n setUniqueConstraintId(uc.id);\n setIsUniqueConstraintDialogOpen(true);\n }}\n >\n Edit Unique Constraint{' '}\n {ownUniqueConstraints.length > 1 && idx + 1}\n </DropdownMenuItem>\n ))}\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n <ModelPrimaryKeyDialog\n control={control}\n open={isPrimaryKeyDialogOpen}\n onOpenChange={setIsPrimaryKeyDialogOpen}\n />\n <ModelUniqueConstraintDialog\n control={control}\n open={isUniqueConstraintDialogOpen}\n onOpenChange={setIsUniqueConstraintDialogOpen}\n constraintId={uniqueConstriantId}\n />\n <ModelRelationDialog\n control={control}\n open={isRelationDialogOpen}\n onOpenChange={setIsRelationDialogOpen}\n relationId={relationId}\n defaultFieldName={watchedField.name}\n />\n <Button\n variant=\"ghost\"\n onClick={() => {\n handleRemove();\n }}\n size=\"icon\"\n >\n <MdOutlineDelete />\n </Button>\n </div>\n </div>\n </div>\n );\n}\n\nexport default ModelFieldForm;\n","import type { ModelConfigInput } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type {\n Control,\n FieldArrayWithId,\n UseFormSetValue,\n} from 'react-hook-form';\n\nimport { clsx } from 'clsx';\nimport { useFieldArray } from 'react-hook-form';\n\nimport { SortableList } from '#src/components/index.js';\n\nimport { ModelAddFieldButton } from './model-add-field-button.js';\nimport ModelFieldForm from './model-field-form.js';\n\ninterface ModelFieldsFormProps {\n className?: string;\n control: Control<ModelConfigInput>;\n setValue: UseFormSetValue<ModelConfigInput>;\n}\n\nexport function ModelFieldsForm({\n className,\n control,\n setValue,\n}: ModelFieldsFormProps): React.JSX.Element {\n const {\n fields: fieldFields,\n remove: removeField,\n append: appendField,\n move: sortFields,\n } = useFieldArray({\n control,\n name: 'model.fields',\n });\n\n const gridClassNames =\n 'grid grid-cols-[repeat(2,minmax(130px,1fr))_60px_minmax(130px,1fr)_minmax(100px,1fr)_80px] gap-3';\n\n const fieldListItems = fieldFields.map((f: FieldArrayWithId, i: number) => ({\n id: f.id,\n element: (\n <ModelFieldForm\n className={gridClassNames}\n key={f.id}\n control={control}\n setValue={setValue}\n idx={i}\n onRemove={removeField}\n />\n ),\n }));\n\n return (\n <div className={clsx('space-y-4', className)}>\n {fieldFields.length === 0 ? (\n <p className=\"pt-4 text-style-muted\">Add some fields to get started</p>\n ) : (\n <div className=\"flex w-full flex-col gap-2 bg-white\">\n <div\n className={clsx(\n gridClassNames,\n 'sticky -top-0 z-10 bg-white py-2 text-sm font-semibold',\n // account for handle in sortable list\n 'pl-12',\n )}\n >\n <div>Name</div>\n <div>Type</div>\n <div>Optional</div>\n <div>Default Value</div>\n <div className=\"sr-only\">Badges</div>\n <div className=\"sr-only\">Actions</div>\n </div>\n <SortableList listItems={fieldListItems} sortItems={sortFields} />\n </div>\n )}\n <ModelAddFieldButton appendField={appendField} setValue={setValue} />\n </div>\n );\n}\n","import type { ModelConfigInput } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { Control, UseFormSetValue } from 'react-hook-form';\n\nimport { useProjectDefinition } from '@baseplate-dev/project-builder-lib/web';\nimport {\n Button,\n RecordView,\n RecordViewActions,\n RecordViewItem,\n RecordViewItemList,\n SectionListSection,\n SectionListSectionContent,\n SectionListSectionDescription,\n SectionListSectionHeader,\n SectionListSectionTitle,\n useConfirmDialog,\n} from '@baseplate-dev/ui-components';\nimport { MdAdd, MdDeleteOutline, MdEdit } from 'react-icons/md';\n\nimport { useEditedModelConfig } from '../../-hooks/use-edited-model-config.js';\nimport { ModelRelationDialog } from './fields/relations/model-relation-dialog.js';\n\ninterface Props {\n control: Control<ModelConfigInput>;\n setValue: UseFormSetValue<ModelConfigInput>;\n}\n\nexport function ModelRelationsSection({\n control,\n setValue,\n}: Props): React.JSX.Element {\n const { requestConfirm } = useConfirmDialog();\n const { definitionContainer } = useProjectDefinition();\n const relations = useEditedModelConfig(({ model }) => model.relations ?? []);\n const fieldIdsToNames = useEditedModelConfig(({ model }) =>\n Object.fromEntries(model.fields.map((field) => [field.id, field.name])),\n );\n\n function handleDeleteRelation(relationId: string): void {\n const relation = relations.find((relation) => relation.id === relationId);\n requestConfirm({\n title: 'Delete Relation',\n content: `Are you sure you want to delete the relation \"${relation?.name ?? '<invalid>'}\"?`,\n onConfirm: () => {\n setValue(\n 'model.relations',\n relations.filter((relation) => relation.id !== relationId),\n );\n },\n });\n }\n\n return (\n <SectionListSection>\n <SectionListSectionHeader>\n <SectionListSectionTitle>Relations</SectionListSectionTitle>\n <SectionListSectionDescription>\n Define relations to enforce uniqueness on one or more fields.\n </SectionListSectionDescription>\n </SectionListSectionHeader>\n <SectionListSectionContent className=\"space-y-4\">\n {relations.map((relation) => (\n <RecordView key={relation.id}>\n <RecordViewItemList>\n <RecordViewItem title=\"Name\">{relation.name}</RecordViewItem>\n <RecordViewItem title=\"Local Field\">\n {relation.references\n .map((r) => fieldIdsToNames[r.localRef])\n .join(', ')}\n </RecordViewItem>\n <RecordViewItem title=\"Foreign Model\">\n {definitionContainer.nameFromId(relation.modelRef)}\n </RecordViewItem>\n <RecordViewItem title=\"On Delete\">\n {relation.onDelete}\n </RecordViewItem>\n </RecordViewItemList>\n <RecordViewActions>\n <ModelRelationDialog\n relationId={relation.id}\n control={control}\n asChild\n >\n <Button variant=\"ghost\" size=\"icon\" title=\"Edit\">\n <MdEdit />\n </Button>\n </ModelRelationDialog>\n <Button\n variant=\"ghostDestructive\"\n size=\"icon\"\n title=\"Delete\"\n onClick={() => {\n handleDeleteRelation(relation.id);\n }}\n >\n <MdDeleteOutline />\n </Button>\n </RecordViewActions>\n </RecordView>\n ))}\n <ModelRelationDialog control={control} asChild>\n <Button variant=\"secondary\" size=\"sm\">\n <MdAdd />\n Add Relation\n </Button>\n </ModelRelationDialog>\n </SectionListSectionContent>\n </SectionListSection>\n );\n}\n","import type { ModelConfigInput } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { Control, UseFormSetValue } from 'react-hook-form';\n\nimport {\n Button,\n RecordView,\n RecordViewActions,\n RecordViewItem,\n RecordViewItemList,\n SectionListSection,\n SectionListSectionContent,\n SectionListSectionDescription,\n SectionListSectionHeader,\n SectionListSectionTitle,\n useConfirmDialog,\n} from '@baseplate-dev/ui-components';\nimport { MdAdd, MdDeleteOutline, MdEdit } from 'react-icons/md';\n\nimport { useEditedModelConfig } from '../../-hooks/use-edited-model-config.js';\nimport { ModelUniqueConstraintDialog } from './fields/unique-constraints/model-unique-constraint-dialog.js';\n\ninterface Props {\n control: Control<ModelConfigInput>;\n setValue: UseFormSetValue<ModelConfigInput>;\n}\n\nexport function ModelUniqueConstraintsSection({\n control,\n setValue,\n}: Props): React.JSX.Element {\n const { requestConfirm } = useConfirmDialog();\n const uniqueConstraints = useEditedModelConfig(\n ({ model }) => model.uniqueConstraints ?? [],\n );\n const fieldIdsToNames = useEditedModelConfig(({ model }) =>\n Object.fromEntries(model.fields.map((field) => [field.id, field.name])),\n );\n\n function handleDeleteConstraint(constraintId: string): void {\n requestConfirm({\n title: 'Delete Unique Constraint',\n content: 'Are you sure you want to delete this unique constraint?',\n onConfirm: () => {\n setValue(\n 'model.uniqueConstraints',\n uniqueConstraints.filter(\n (constraint) => constraint.id !== constraintId,\n ),\n );\n },\n });\n }\n\n return (\n <SectionListSection>\n <SectionListSectionHeader>\n <SectionListSectionTitle>Unique Constraints</SectionListSectionTitle>\n <SectionListSectionDescription>\n Define unique constraints to enforce uniqueness on one or more fields.\n </SectionListSectionDescription>\n </SectionListSectionHeader>\n <SectionListSectionContent className=\"space-y-4\">\n {uniqueConstraints.map((constraint) => (\n <RecordView key={constraint.id}>\n <RecordViewItemList>\n <RecordViewItem title=\"Fields\">\n {constraint.fields\n .map(\n (field) => fieldIdsToNames[field.fieldRef] ?? '<invalid>',\n )\n .join(', ')}\n </RecordViewItem>\n </RecordViewItemList>\n <RecordViewActions>\n <ModelUniqueConstraintDialog\n constraintId={constraint.id}\n control={control}\n asChild\n >\n <Button variant=\"ghost\" size=\"icon\" title=\"Edit\">\n <MdEdit />\n </Button>\n </ModelUniqueConstraintDialog>\n <Button\n variant=\"ghostDestructive\"\n size=\"icon\"\n title=\"Delete\"\n onClick={() => {\n handleDeleteConstraint(constraint.id);\n }}\n >\n <MdDeleteOutline />\n </Button>\n </RecordViewActions>\n </RecordView>\n ))}\n <ModelUniqueConstraintDialog control={control} asChild>\n <Button variant=\"secondary\" size=\"sm\">\n <MdAdd />\n Add Unique Constraint\n </Button>\n </ModelUniqueConstraintDialog>\n </SectionListSectionContent>\n </SectionListSection>\n );\n}\n","import type React from 'react';\n\nimport {\n modelEntityType,\n modelLocalRelationEntityType,\n modelScalarFieldEntityType,\n} from '@baseplate-dev/project-builder-lib';\nimport { useBlockUnsavedChangesNavigate } from '@baseplate-dev/project-builder-lib/web';\nimport { FormActionBar, SectionList } from '@baseplate-dev/ui-components';\nimport { createFileRoute } from '@tanstack/react-router';\n\nimport { ErrorBoundary } from '#src/components/index.js';\nimport { registerEntityTypeUrl } from '#src/services/entity-type.js';\n\nimport { EditedModelContextProvider } from '../-hooks/use-edited-model-config.js';\nimport { useModelForm } from '../-hooks/use-model-form.js';\nimport { ModelFieldsForm } from './-components/fields/model-fields-form.js';\nimport { ModelRelationsSection } from './-components/model-relations-section.js';\nimport { ModelUniqueConstraintsSection } from './-components/model-unique-constraints-section.js';\n\nregisterEntityTypeUrl(modelEntityType, `/data/models/edit/{key}`);\nregisterEntityTypeUrl(\n modelScalarFieldEntityType,\n `/data/models/edit/{parentKey}`,\n);\nregisterEntityTypeUrl(\n modelLocalRelationEntityType,\n `/data/models/edit/{parentKey}`,\n);\n\nexport const Route = createFileRoute('/data/models/edit/$key/')({\n component: ModelEditModelPage,\n});\n\nfunction ModelEditModelPage(): React.JSX.Element {\n const { key } = Route.useParams();\n const { form, onSubmit, originalModel } = useModelForm({\n omit: ['name', 'featureRef'],\n modelKey: key,\n });\n const { control, watch, getValues, setValue, reset } = form;\n\n useBlockUnsavedChangesNavigate({ control, reset, onSubmit });\n\n // TODO: Add validation for fields form where:\n // - referenced type does not match field type\n // - SET NULL is on non-optional fields\n\n return (\n <ErrorBoundary>\n <EditedModelContextProvider\n originalModel={originalModel}\n getValues={getValues}\n watch={watch}\n >\n <form\n onSubmit={onSubmit}\n className=\"max-w-7xl min-w-[700px] flex-1 space-y-4 px-4 pb-4\"\n >\n <ModelFieldsForm control={control} setValue={setValue} />\n <SectionList>\n <ModelRelationsSection control={control} setValue={setValue} />\n <ModelUniqueConstraintsSection\n control={control}\n setValue={setValue}\n />\n </SectionList>\n <FormActionBar form={form} />\n </form>\n </EditedModelContextProvider>\n </ErrorBoundary>\n );\n}\n"],"names":["CASE_SPLIT_PATTERN","words","str","camelCase","words$1","first","rest","word","capitalize","modelScalarFieldEntityType","importShared","Button","ButtonGroup","DropdownMenu","DropdownMenuContent","DropdownMenuItem","DropdownMenuTrigger","useMemo","ModelAddFieldButton","className","appendField","setValue","fieldNames","useEditedModelConfig","model","f","primaryKeyFieldLength","availableAutoFields","autoFields","hasCreatedAt","hasUpdatedAt","applyAutoField","autoField","isPrimaryKey","field","fieldId","jsxs","jsx","MdExpandMore","DialogClose","DialogFooter","MultiComboboxFieldController","useId","z","primaryKeychema","ModelPrimaryKeyForm","modelControl","onSubmitSuccess","fields","modelValue","onModelChange","useController","control","handleSubmit","useForm","zodResolver","onSubmit","data","formId","clsx","e","Dialog","DialogContent","DialogDescription","DialogHeader","DialogTitle","DialogTrigger","useControlledState","ModelPrimaryKeyDialog","children","asChild","open","onOpenChange","isOpen","setIsOpen","BadgeWithIcon","useState","ModelPrimaryKeyBadge","autoCollapse","isHovered","setIsHovered","shouldShowText","MdKey","createModelRelationFieldSchema","ModelFieldUtils","modelForeignRelationEntityType","modelLocalRelationEntityType","ModelUtils","useDefinitionSchema","useProjectDefinition","ComboboxField","ComboboxFieldController","InputFieldController","SelectFieldController","toast","React","guessModelTypeFromFieldName","definition","editedModel","fieldName","name","tryFindModel","condition","modelWithName","m","modelWithFeature","getRelationDefaultsFromModel","editedRelation","defaultFieldName","references","primaryKeyFieldRefs","foreignName","primaryKeys","existingReferences","primaryKey","i","bestGuessLocalName","foreignRelationName","isOneToOne","ref","r","pluralize","ModelRelationForm","relationId","modelName","modelRelations","onModelRelationsChange","foreignModelOptions","type","modelRelation","item","defaultValues","modelRef","modelRelationFieldSchema","setError","watch","relation","foreignModel","foreignFields","localFieldOptions","foreignFieldOptions","isRelationOptional","onDelete","id","localFields","hasSelectedForeignModel","value","_","ModelRelationDialog","ModelRelationsBadge","definitionContainer","MdLink","modelUniqueConstraintEntityType","formSchema","ModelUniqueConstraintForm","constraintId","modelUniqueConstraint","uc","dataWithId","fieldRef","ModelUniqueConstraintDialog","ModelFieldUniqueBadge","fieldsLength","MdStar","ModelFieldBadges","idx","isPrimary","uniqueConstraints","constraint","modelFieldRelations","badges","EnumUtils","DropdownMenuGroup","InputField","ModelFieldDefaultValueInput","useWatch","optionsValue","onOptionsChange","defaultValue","HiOutlineX","HiDotsVertical","defaultToNow","updatedAt","enumValues","v","SCALAR_FIELD_TYPES","ModelFieldTypeInput","enumOptions","config","typeOptions","t","fieldType","SCALAR_FIELD_TYPE_OPTIONS","typeValue","onTypeChange","fieldOptions","onFieldOptionsChange","handleChange","enumRef","option","SwitchFieldController","ModelFieldForm","onRemove","watchedField","watchedRelations","isPartOfPrimaryKey","hasCompositePrimaryKey","ownUniqueConstraints","usedRelations","removeError","handleRemove","isPrimaryKeyDialogOpen","setIsPrimaryKeyDialogOpen","isUniqueConstraintDialogOpen","setIsUniqueConstraintDialogOpen","uniqueConstriantId","setUniqueConstraintId","isRelationDialogOpen","setIsRelationDialogOpen","setRelationId","MdOutlineDelete","ModelFieldsForm","fieldFields","removeField","sortFields","useFieldArray","gridClassNames","fieldListItems","SortableList","RecordView","RecordViewActions","RecordViewItem","RecordViewItemList","SectionListSection","SectionListSectionContent","SectionListSectionDescription","SectionListSectionHeader","SectionListSectionTitle","useConfirmDialog","ModelRelationsSection","requestConfirm","relations","fieldIdsToNames","handleDeleteRelation","MdEdit","MdDeleteOutline","MdAdd","ModelUniqueConstraintsSection","handleDeleteConstraint","modelEntityType","useBlockUnsavedChangesNavigate","FormActionBar","SectionList","registerEntityTypeUrl","SplitComponent","key","Route","useParams","form","originalModel","useModelForm","omit","modelKey","getValues","reset","ErrorBoundary","EditedModelContextProvider"],"mappings":"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","x_google_ignoreList":[0,1]}
@@ -1,2 +0,0 @@
1
- import{i as c}from"./_virtual___federation_fn_import-BLYgPlMt.js";import{j as e,f as ne,e as S,b as ce}from"./index.esm-DcyGeCKA.js";import{C as te,s as D,l as me,x as pe,y as ue}from"./index-C_wN4CIq.js";import{c as P,I as be,K as fe,B as xe}from"./index-C15I7WFi.js";import{u as U}from"./use-definition-schema-CuFFJIzk.js";import{s as je}from"./immer-BOh2djD_.js";const{ModelUtils:Ce}=await c("@baseplate-dev/project-builder-lib"),{createAdminCrudInputWebConfig:he,useProjectDefinition:Fe}=await c("@baseplate-dev/project-builder-lib/web"),{SelectFieldController:V}=await c("@baseplate-dev/ui-components");function ve({formProps:l,name:t,model:i,embeddedFormOptions:s}){const{definition:a}=Fe(),o=Ce.getRelationsToModel(a,i.id).map(p=>({label:`${p.relation.foreignRelationName} (${p.model.name})`,value:p.relation.foreignId})),n=t,d=l.control;return e.jsxs(e.Fragment,{children:[e.jsx(V,{label:"Relation Name",control:d,name:`${n}.modelRelationRef`,options:o}),e.jsx(V,{label:"Embedded Form",control:d,name:`${n}.embeddedFormRef`,options:s})]})}const ge=he({name:"embedded",pluginId:void 0,label:"Embedded",getNewInput:()=>({label:"",type:"embedded",modelRelationRef:"",embeddedFormRef:""}),Form:ve}),{createAdminCrudInputWebConfig:ye,useProjectDefinition:Se}=await c("@baseplate-dev/project-builder-lib/web"),{SelectFieldController:z}=await c("@baseplate-dev/ui-components");function Ie({formProps:l,name:t,model:i,embeddedFormOptions:s}){const{definitionContainer:a}=Se(),o=i.model.relations?.map(p=>({label:`${p.name} (${a.nameFromId(p.modelRef)})`,value:p.id}))??[],n=t,d=l.control;return e.jsxs(e.Fragment,{children:[e.jsx(z,{label:"Relation Name",control:d,name:`${n}.localRelationRef`,options:o}),e.jsx(z,{label:"Embedded Form",control:d,name:`${n}.embeddedFormRef`,options:s})]})}const we=ye({name:"embeddedLocal",pluginId:void 0,label:"Embedded Local",getNewInput:()=>({label:"",type:"embeddedLocal",embeddedFormRef:"",localRelationRef:""}),Form:Ie}),{createAdminCrudInputWebConfig:Re}=await c("@baseplate-dev/project-builder-lib/web"),{SelectFieldController:$e}=await c("@baseplate-dev/ui-components");function Ae({formProps:l,name:t,model:i}){const s=i.model.fields.filter(n=>n.type==="enum").map(n=>({label:n.name,value:n.id})),a=t,o=l.control;return e.jsx($e,{label:"Enum Field",control:o,name:`${a}.modelFieldRef`,options:s})}const Ee=Re({name:"enum",pluginId:void 0,label:"Enum",getNewInput:()=>({label:"",type:"enum",modelFieldRef:""}),Form:Ae}),{createAdminCrudInputWebConfig:Ne,useProjectDefinition:Te}=await c("@baseplate-dev/project-builder-lib/web"),{InputFieldController:I,SelectFieldController:De}=await c("@baseplate-dev/ui-components");function Le({formProps:l,name:t,model:i}){const{definitionContainer:s}=Te(),a=i.model.relations?.map(d=>({label:`${d.name} (${s.nameFromId(d.modelRef)})`,value:d.id}))??[],o=t,n=l.control;return e.jsxs(e.Fragment,{children:[e.jsx(De,{label:"Local Relation Name",control:n,name:`${o}.localRelationRef`,options:a}),e.jsx(I,{label:"Label Expression (e.g. name)",control:n,name:`${o}.labelExpression`}),e.jsx(I,{label:"Value Expression (e.g. id)",control:n,name:`${o}.valueExpression`}),e.jsx(I,{label:"Default Label (optional)",control:n,name:`${o}.defaultLabel`}),e.jsx(I,{label:"Empty Label (optional) - only if field is nullable",control:n,name:`${o}.nullLabel`})]})}const Pe=Ne({name:"foreign",pluginId:void 0,label:"Foreign",getNewInput:()=>({label:"",type:"foreign",localRelationRef:"",labelExpression:"",valueExpression:"",defaultLabel:"",nullLabel:""}),Form:Le}),{createAdminCrudInputWebConfig:We}=await c("@baseplate-dev/project-builder-lib/web"),{InputFieldController:Oe,SelectFieldController:ke}=await c("@baseplate-dev/ui-components");function Be({formProps:l,name:t,model:i}){const s=i.model.fields.map(n=>({label:n.name,value:n.id})),a=t,o=l.control;return e.jsxs(e.Fragment,{children:[e.jsx(ke,{label:"Field",control:o,name:`${a}.modelFieldRef`,options:s}),e.jsx(Oe,{label:"Validation (zod), e.g. z.string().min(1) (optional)",control:o,name:`${a}.validation`})]})}const Me=We({name:"text",pluginId:void 0,label:"Text",getNewInput:()=>({label:"",type:"text",modelFieldRef:""}),Form:Be}),_=[ge,we,Ee,Pe,Me],{ModelUtils:Ue}=await c("@baseplate-dev/project-builder-lib"),{adminCrudInputWebSpec:Ve,useProjectDefinition:ze}=await c("@baseplate-dev/project-builder-lib/web"),{Button:_e,InputFieldController:He,SelectFieldController:qe}=await c("@baseplate-dev/ui-components");function Ge({idx:l,formProps:t,embeddedFormOptions:i}){const{control:s}=t,a=S({control:s,name:"modelRef"}),{definition:o,pluginContainer:n}=ze(),d=a?Ue.byIdOrThrow(o,a):void 0,p=n.getPluginSpec(Ve),x=p.getInputWebConfigs(_).map(j=>({label:j.label,value:j.name})),F=S({control:s,name:`form.fields.${l}.type`}),m=p.getInputWebConfig(F,_),u=m.Form;return e.jsxs("div",{className:"space-y-4",children:[e.jsx(qe,{label:"Type",control:s,options:x,name:`form.fields.${l}.type`}),e.jsx(He,{label:"Label",control:s,name:`form.fields.${l}.label`}),u&&d&&e.jsx(u,{formProps:t,name:`form.fields.${l}`,model:d,embeddedFormOptions:i,pluginId:m.pluginId})]})}function oe({className:l,formProps:t,embeddedFormOptions:i}){const{control:s}=t,{fields:a,append:o,remove:n}=ne({control:s,name:"form.fields"});return e.jsxs("div",{className:P("space-y-4",l),children:[a.map((d,p)=>e.jsx(te,{collapsedContents:e.jsxs("div",{children:[d.label," (",d.type,")"]}),onRemove:()=>{n(p)},defaultOpen:!d.label,children:e.jsx(Ge,{idx:p,formProps:t,embeddedFormOptions:i},d.id)},d.id)),e.jsx(_e,{onClick:()=>{o({type:"text",label:""})},children:"Add Field"})]})}const{adminCrudDisplayTypes:Ke,ModelUtils:Ye}=await c("@baseplate-dev/project-builder-lib"),{useProjectDefinition:Je}=await c("@baseplate-dev/project-builder-lib/web"),{Button:Qe,InputFieldController:A,SelectFieldController:E}=await c("@baseplate-dev/ui-components");function Xe({idx:l,control:t,fieldOptions:i,localRelationOptions:s}){const a=Ke.map(n=>({label:n,value:n})),o=S({control:t,name:`table.columns.${l}.display.type`});return e.jsxs("div",{className:"space-y-4",children:[e.jsx(E,{label:"Type",control:t,options:a,name:`table.columns.${l}.display.type`}),e.jsx(A,{label:"Label",control:t,name:`table.columns.${l}.label`}),o==="text"&&e.jsx(E,{label:"Field",control:t,name:`table.columns.${l}.display.modelFieldRef`,options:i}),o==="foreign"&&e.jsxs(e.Fragment,{children:[e.jsx(E,{label:"Local Relation Name",control:t,name:`table.columns.${l}.display.localRelationRef`,options:s}),e.jsx(A,{label:"Label Expression (e.g. name)",control:t,name:`table.columns.${l}.display.labelExpression`}),e.jsx(A,{label:"Value Expression (e.g. id)",control:t,name:`table.columns.${l}.display.valueExpression`})]})]})}function le({className:l,control:t}){const i=S({control:t,name:"modelRef"}),{definition:s,definitionContainer:a}=Je(),o=i?Ye.byIdOrThrow(s,i):void 0,{fields:n,append:d,remove:p}=ne({control:t,name:"table.columns"}),x=o?.model.relations?.map(m=>({label:`${m.name} (${a.nameFromId(m.modelRef)})`,value:m.id}))??[],F=o?.model.fields.map(m=>({label:m.name,value:m.id}))??[];return e.jsxs("div",{className:P("space-y-4",l),children:[n.map((m,u)=>e.jsx(te,{collapsedContents:e.jsxs("div",{children:[m.label," (",m.display.type,")"]}),onRemove:()=>{p(u)},defaultOpen:!m.label,children:e.jsx(Xe,{idx:u,control:t,fieldOptions:F,localRelationOptions:x},m.id)},m.id)),e.jsx(Qe,{onClick:()=>{d({display:{type:"text",modelFieldRef:""},label:""})},children:"Add Column"})]})}const{createAdminCrudEmbeddedFormSchema:Ze}=await c("@baseplate-dev/project-builder-lib"),{useDefinitionSchema:en,useProjectDefinition:ie}=await c("@baseplate-dev/project-builder-lib/web"),{Button:L,CheckboxFieldController:nn,InputFieldController:tn,SelectFieldController:H,Table:on,TableBody:ln,TableCell:w,TableHead:R,TableHeader:an,TableRow:q,toast:sn}=await c("@baseplate-dev/ui-components"),{useId:dn}=await c("react");function rn({items:l,edit:t,remove:i}){const{definitionContainer:s}=ie();return e.jsxs(on,{className:"max-w-6xl",children:[e.jsx(an,{children:e.jsxs(q,{children:[e.jsx(R,{children:"Form Name"}),e.jsx(R,{children:"Model Name"}),e.jsx(R,{children:"Type"}),e.jsx(R,{children:"Actions"})]})}),e.jsx(ln,{children:l.map((a,o)=>e.jsxs(q,{children:[e.jsx(w,{children:a.name}),e.jsx(w,{children:s.nameFromId(a.modelRef)}),e.jsx(w,{children:a.type}),e.jsxs(w,{className:"space-x-4",children:[e.jsx(L,{variant:"link",size:"none",onClick:()=>{t(o)},children:"Edit"}),e.jsx(L,{variant:"linkDestructive",size:"none",onClick:()=>{i(o)},children:"Remove"})]})]},a.id))})]})}const cn=[{label:"Object",value:"object"},{label:"List",value:"list"}];function mn({initialData:l,onSubmit:t,embeddedFormOptions:i}){const{definition:s}=ie(),a=en(Ze),o=ce({resolver:D(a),defaultValues:l}),{handleSubmit:n,control:d,watch:p}=o,x=s.models.map(u=>({label:u.name,value:u.id})),F=p("type"),m=dn();return e.jsxs("form",{onSubmit:u=>{u.stopPropagation(),n(t)(u).catch(j=>{sn.error(me(j))})},id:m,className:"space-y-4",children:[e.jsx(tn,{label:"Name",control:d,name:"name"}),e.jsx(H,{label:"Type",control:d,name:"type",options:cn}),e.jsx(nn,{label:"Include ID Field? (useful for list types)",control:d,name:"includeIdField"}),e.jsx(H,{label:"Model",control:d,options:x,name:"modelRef"}),F==="list"&&e.jsxs(e.Fragment,{children:[e.jsx("h2",{children:"Table"}),e.jsx(le,{control:d})]}),e.jsx("h2",{children:"Form"}),e.jsx(oe,{formProps:o,embeddedFormOptions:i}),e.jsx(L,{type:"submit",form:m,children:"Save"})]})}const{useProjectDefinition:pn}=await c("@baseplate-dev/project-builder-lib/web"),{CheckboxFieldController:un,SelectFieldController:bn}=await c("@baseplate-dev/ui-components");function fn({className:l,formProps:t}){const{control:i}=t,{definition:s}=pn(),a=s.models.map(n=>({label:n.name,value:n.id})),o=S({control:i,name:"embeddedForms"})?.map(n=>({label:n.name,value:n.id}))??[];return e.jsxs("div",{className:P("space-y-4",l),children:[e.jsx(bn,{label:"Model",control:i,options:a,name:"modelRef"}),e.jsx(un,{label:"Disable Create?",control:i,name:"disableCreate"}),e.jsx("h2",{children:"Table"}),e.jsx(le,{control:i}),e.jsx("h2",{children:"Form"}),e.jsx(oe,{formProps:t,embeddedFormOptions:o}),e.jsx("h2",{children:"Embedded Forms"}),e.jsx(pe.LabelledController,{control:i,name:"embeddedForms",renderForm:n=>e.jsx(mn,{...n,embeddedFormOptions:o}),renderTable:n=>e.jsx(rn,{...n}),defaultValue:{type:"object"}})]})}const{adminSectionEntityType:G,authConfigSpec:xn,createWebAdminSectionSchema:jn,createWebAppSchema:Cn}=await c("@baseplate-dev/project-builder-lib"),{useBlockUnsavedChangesNavigate:hn,useProjectDefinition:Fn,useResettableForm:K}=await c("@baseplate-dev/project-builder-lib/web"),{Badge:vn,Button:y,ComboboxFieldController:gn,FormActionBar:yn,InputFieldController:N,MultiComboboxFieldController:Sn,RecordView:In,RecordViewActions:wn,RecordViewItem:T,RecordViewItemList:Rn,SectionList:$n,SectionListSection:Y,SectionListSectionContent:J,SectionListSectionDescription:Q,SectionListSectionHeader:X,SectionListSectionTitle:Z,SelectFieldController:An,Sheet:En,SheetContent:Nn,SheetDescription:Tn,SheetFooter:Dn,SheetHeader:Ln,SheetTitle:Pn,SwitchFieldController:Wn,useConfirmDialog:On}=await c("@baseplate-dev/ui-components"),{useState:ee}=await c("react"),_n=function(){const{requestConfirm:t}=On(),{webDefinition:i}=ue.useRouteContext(),{definition:s,saveDefinitionWithFeedback:a,pluginContainer:o}=Fn(),n=U(Cn),d=U(jn),[p,x]=ee(),[F,m]=ee(!1),u=K({resolver:D(n),values:i}),{control:j,handleSubmit:ae,reset:se,watch:W}=u,C=K({resolver:D(d),values:p,defaultValues:{type:"crud"}}),O=ae(r=>a(f=>{f.apps=f.apps.map(h=>h.id===i.id?r:h)})),de=C.handleSubmit(r=>{const f=r.id||G.generateNewId();a(h=>{const b=h.apps.find(g=>g.id===i.id);if(b?.type!=="web")return;b.adminApp??={enabled:!0,pathPrefix:"/admin",sections:[]};const v=b.adminApp.sections?.findIndex(g=>g.id===r.id);v!==void 0&&v>=0&&b.adminApp.sections?b.adminApp.sections[v]={...r,id:f}:b.adminApp.sections=je([...b.adminApp.sections??[],{...r,id:f}],[g=>g.name])}).then(()=>{m(!1),x(void 0)}).catch(()=>{})});hn({control:j,reset:se,onSubmit:O});const k=o.getPluginSpecOptional(xn)?.getAuthRoles(s).map(r=>({label:r.name,value:r.id})),B=W("adminApp.enabled"),$=W("adminApp.sections")??[];function re(r){const f=$.find(h=>h.id===r);t({title:"Delete Admin Section",content:`Are you sure you want to delete the section "${f?.name??"Unknown"}"?`,onConfirm:()=>{a(h=>{const b=h.apps.find(v=>v.id===i.id);b?.type!=="web"||!b.adminApp||(b.adminApp.sections=b.adminApp.sections?.filter(v=>v.id!==r))})}})}const M=s.features.map(r=>({label:r.name,value:r.id}));return e.jsxs(e.Fragment,{children:[e.jsxs("form",{className:"w-full max-w-7xl space-y-4 p-4",onSubmit:O,children:[e.jsxs($n,{children:[e.jsxs(Y,{children:[e.jsxs(X,{children:[e.jsx(Z,{children:"Admin Configuration"}),e.jsx(Q,{children:"Configure administrative features for your web application."})]}),e.jsxs(J,{className:"space-y-6",children:[e.jsx(Wn,{label:"Enable Admin Panel",description:"Add administrative interface to your web application",control:j,name:"adminApp.enabled"}),B&&e.jsxs(e.Fragment,{children:[e.jsx(N,{label:"Admin Path Prefix",placeholder:"/admin",description:"URL prefix for admin routes (e.g. /admin)",control:j,name:"adminApp.pathPrefix"}),k&&e.jsx(Sn,{label:"Admin Access Roles",description:"Which roles can access the admin panel",control:j,options:k,name:"adminApp.allowedRoles"})]})]})]}),B&&e.jsxs(Y,{children:[e.jsxs(X,{children:[e.jsx(Z,{children:"Admin Sections"}),e.jsx(Q,{children:"Configure CRUD interfaces for your data models."})]}),e.jsxs(J,{className:"space-y-4",children:[$.map(r=>e.jsxs(In,{children:[e.jsxs(Rn,{children:[e.jsx(T,{title:"Name",children:e.jsx("div",{className:"flex items-center gap-2",children:e.jsx("span",{children:r.name})})}),e.jsx(T,{title:"Type",children:e.jsx(vn,{variant:"secondary",children:r.type})}),e.jsx(T,{title:"Icon",children:r.icon??e.jsx("span",{className:"text-muted-foreground",children:"No icon"})})]}),e.jsxs(wn,{children:[e.jsx(y,{variant:"ghost",size:"icon",title:"Edit","aria-label":"Edit section",onClick:()=>{x(r),C.reset(r),m(!0)},children:e.jsx(be,{})}),e.jsx(y,{variant:"ghostDestructive",size:"icon",title:"Delete","aria-label":"Delete section",onClick:()=>{re(r.id??"")},children:e.jsx(fe,{})})]})]},r.id)),e.jsxs(y,{variant:"secondary",size:"sm",onClick:()=>{const r=M[0]?.value??"",f={id:G.generateNewId(),name:"",type:"crud",featureRef:r,icon:"",modelRef:"",form:{fields:[]},table:{columns:[]}};x(f),C.reset(f),m(!0)},children:[e.jsx(xe,{}),"Add Section"]})]})]})]}),e.jsx(yn,{form:u})]}),e.jsx(En,{open:F,onOpenChange:m,children:e.jsxs(Nn,{className:"overflow-y-auto sm:max-w-2xl",children:[e.jsxs(Ln,{children:[e.jsx(Pn,{children:p?.id&&$.some(r=>r.id===p.id)?"Edit Admin Section":"Add Admin Section"}),e.jsx(Tn,{children:"Configure a CRUD interface for managing your data."})]}),e.jsxs("form",{onSubmit:de,className:"mt-6",children:[e.jsxs("div",{className:"flex flex-col gap-4 px-4",children:[e.jsx(N,{label:"Name",control:C.control,name:"name"}),e.jsx(gn,{label:"Feature",control:C.control,options:M,name:"featureRef"}),e.jsx(N,{label:"Icon",control:C.control,name:"icon"}),e.jsx(An,{label:"Type",control:C.control,name:"type",options:[{label:"Crud",value:"crud"}]}),e.jsx(fn,{formProps:C})]}),e.jsx(Dn,{children:e.jsxs("div",{className:"flex gap-2 pt-4",children:[e.jsx(y,{type:"submit",children:"Save Section"}),e.jsx(y,{type:"button",variant:"outline",onClick:()=>{m(!1)},children:"Cancel"})]})})]})]})})]})};export{_n as component};
2
- //# sourceMappingURL=index-BPK2SbiO.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-BPK2SbiO.js","sources":["../../src/routes/apps/edit.$key/web/admin/-components/inputs/embedded-input-config.tsx","../../src/routes/apps/edit.$key/web/admin/-components/inputs/embedded-local-input-config.tsx","../../src/routes/apps/edit.$key/web/admin/-components/inputs/enum-input-config.tsx","../../src/routes/apps/edit.$key/web/admin/-components/inputs/foreign-input-config.tsx","../../src/routes/apps/edit.$key/web/admin/-components/inputs/text-input-config.tsx","../../src/routes/apps/edit.$key/web/admin/-components/inputs/index.ts","../../src/routes/apps/edit.$key/web/admin/-components/crud-form-fields-form.tsx","../../src/routes/apps/edit.$key/web/admin/-components/crud-table-columns-form.tsx","../../src/routes/apps/edit.$key/web/admin/-components/admin-crud-embedded-form.tsx","../../src/routes/apps/edit.$key/web/admin/-components/admin-crud-section-form.tsx","../../src/routes/apps/edit.$key/web/admin/index.tsx?tsr-split=component"],"sourcesContent":["import type { AdminCrudEmbeddedInputConfig } from '@baseplate-dev/project-builder-lib';\nimport type { AdminCrudInputWebFormProps } from '@baseplate-dev/project-builder-lib/web';\nimport type React from 'react';\nimport type { Control } from 'react-hook-form';\n\nimport { ModelUtils } from '@baseplate-dev/project-builder-lib';\nimport {\n createAdminCrudInputWebConfig,\n useProjectDefinition,\n} from '@baseplate-dev/project-builder-lib/web';\nimport { SelectFieldController } from '@baseplate-dev/ui-components';\n\nfunction AdminCrudEmbeddedInputForm({\n formProps,\n name,\n model,\n embeddedFormOptions,\n}: AdminCrudInputWebFormProps): React.JSX.Element {\n const { definition } = useProjectDefinition();\n\n const foreignRelationOptions = ModelUtils.getRelationsToModel(\n definition,\n model.id,\n ).map((r) => ({\n label: `${r.relation.foreignRelationName} (${r.model.name})`,\n value: r.relation.foreignId,\n }));\n const prefix = name as 'prefix';\n const controlTyped = formProps.control as Control<{\n prefix: AdminCrudEmbeddedInputConfig;\n }>;\n\n return (\n <>\n <SelectFieldController\n label=\"Relation Name\"\n control={controlTyped}\n name={`${prefix}.modelRelationRef`}\n options={foreignRelationOptions}\n />\n <SelectFieldController\n label=\"Embedded Form\"\n control={controlTyped}\n name={`${prefix}.embeddedFormRef`}\n options={embeddedFormOptions}\n />\n </>\n );\n}\n\nexport const adminCrudEmbeddedInputWebConfig =\n createAdminCrudInputWebConfig<AdminCrudEmbeddedInputConfig>({\n name: 'embedded',\n pluginId: undefined,\n label: 'Embedded',\n getNewInput: () => ({\n label: '',\n type: 'embedded',\n modelRelationRef: '',\n embeddedFormRef: '',\n }),\n Form: AdminCrudEmbeddedInputForm,\n });\n","import type { AdminCrudEmbeddedLocalInputConfig } from '@baseplate-dev/project-builder-lib';\nimport type { AdminCrudInputWebFormProps } from '@baseplate-dev/project-builder-lib/web';\nimport type React from 'react';\nimport type { Control } from 'react-hook-form';\n\nimport {\n createAdminCrudInputWebConfig,\n useProjectDefinition,\n} from '@baseplate-dev/project-builder-lib/web';\nimport { SelectFieldController } from '@baseplate-dev/ui-components';\n\nfunction AdminCrudEmbeddedLocalInputForm({\n formProps,\n name,\n model,\n embeddedFormOptions,\n}: AdminCrudInputWebFormProps): React.JSX.Element {\n const { definitionContainer } = useProjectDefinition();\n const localRelationOptions =\n model.model.relations?.map((relation) => ({\n label: `${relation.name} (${definitionContainer.nameFromId(relation.modelRef)})`,\n value: relation.id,\n })) ?? [];\n const prefix = name as 'prefix';\n const controlTyped = formProps.control as Control<{\n prefix: AdminCrudEmbeddedLocalInputConfig;\n }>;\n\n return (\n <>\n <SelectFieldController\n label=\"Relation Name\"\n control={controlTyped}\n name={`${prefix}.localRelationRef`}\n options={localRelationOptions}\n />\n <SelectFieldController\n label=\"Embedded Form\"\n control={controlTyped}\n name={`${prefix}.embeddedFormRef`}\n options={embeddedFormOptions}\n />\n </>\n );\n}\n\nexport const adminCrudEmbeddedLocalInputWebConfig =\n createAdminCrudInputWebConfig<AdminCrudEmbeddedLocalInputConfig>({\n name: 'embeddedLocal',\n pluginId: undefined,\n label: 'Embedded Local',\n getNewInput: () => ({\n label: '',\n type: 'embeddedLocal',\n embeddedFormRef: '',\n localRelationRef: '',\n }),\n Form: AdminCrudEmbeddedLocalInputForm,\n });\n","import type { AdminCrudEnumInputConfig } from '@baseplate-dev/project-builder-lib';\nimport type { AdminCrudInputWebFormProps } from '@baseplate-dev/project-builder-lib/web';\nimport type React from 'react';\nimport type { Control } from 'react-hook-form';\n\nimport { createAdminCrudInputWebConfig } from '@baseplate-dev/project-builder-lib/web';\nimport { SelectFieldController } from '@baseplate-dev/ui-components';\n\nfunction AdminCrudEnumInputForm({\n formProps,\n name,\n model,\n}: AdminCrudInputWebFormProps): React.JSX.Element {\n const enumFieldOptions = model.model.fields\n .filter((f) => f.type === 'enum')\n .map((field) => ({\n label: field.name,\n value: field.id,\n }));\n const prefix = name as 'prefix';\n const controlTyped = formProps.control as Control<{\n prefix: AdminCrudEnumInputConfig;\n }>;\n\n return (\n <SelectFieldController\n label=\"Enum Field\"\n control={controlTyped}\n name={`${prefix}.modelFieldRef`}\n options={enumFieldOptions}\n />\n );\n}\n\nexport const adminCrudEnumInputWebConfig =\n createAdminCrudInputWebConfig<AdminCrudEnumInputConfig>({\n name: 'enum',\n pluginId: undefined,\n label: 'Enum',\n getNewInput: () => ({ label: '', type: 'enum', modelFieldRef: '' }),\n Form: AdminCrudEnumInputForm,\n });\n","import type { AdminCrudForeignInputConfig } from '@baseplate-dev/project-builder-lib';\nimport type { AdminCrudInputWebFormProps } from '@baseplate-dev/project-builder-lib/web';\nimport type React from 'react';\nimport type { Control } from 'react-hook-form';\n\nimport {\n createAdminCrudInputWebConfig,\n useProjectDefinition,\n} from '@baseplate-dev/project-builder-lib/web';\nimport {\n InputFieldController,\n SelectFieldController,\n} from '@baseplate-dev/ui-components';\n\nfunction AdminCrudForeignInputForm({\n formProps,\n name,\n model,\n}: AdminCrudInputWebFormProps): React.JSX.Element {\n const { definitionContainer } = useProjectDefinition();\n const localRelationOptions =\n model.model.relations?.map((relation) => ({\n label: `${relation.name} (${definitionContainer.nameFromId(relation.modelRef)})`,\n value: relation.id,\n })) ?? [];\n const prefix = name as 'prefix';\n const controlTyped = formProps.control as Control<{\n prefix: AdminCrudForeignInputConfig;\n }>;\n\n return (\n <>\n <SelectFieldController\n label=\"Local Relation Name\"\n control={controlTyped}\n name={`${prefix}.localRelationRef`}\n options={localRelationOptions}\n />\n <InputFieldController\n label=\"Label Expression (e.g. name)\"\n control={controlTyped}\n name={`${prefix}.labelExpression`}\n />\n <InputFieldController\n label=\"Value Expression (e.g. id)\"\n control={controlTyped}\n name={`${prefix}.valueExpression`}\n />\n <InputFieldController\n label=\"Default Label (optional)\"\n control={controlTyped}\n name={`${prefix}.defaultLabel`}\n />\n <InputFieldController\n label=\"Empty Label (optional) - only if field is nullable\"\n control={controlTyped}\n name={`${prefix}.nullLabel`}\n />\n </>\n );\n}\n\nexport const adminCrudForeignInputWebConfig =\n createAdminCrudInputWebConfig<AdminCrudForeignInputConfig>({\n name: 'foreign',\n pluginId: undefined,\n label: 'Foreign',\n getNewInput: () => ({\n label: '',\n type: 'foreign',\n localRelationRef: '',\n labelExpression: '',\n valueExpression: '',\n defaultLabel: '',\n nullLabel: '',\n }),\n Form: AdminCrudForeignInputForm,\n });\n","import type { AdminCrudTextInputConfig } from '@baseplate-dev/project-builder-lib';\nimport type { AdminCrudInputWebFormProps } from '@baseplate-dev/project-builder-lib/web';\nimport type React from 'react';\nimport type { Control } from 'react-hook-form';\n\nimport { createAdminCrudInputWebConfig } from '@baseplate-dev/project-builder-lib/web';\nimport {\n InputFieldController,\n SelectFieldController,\n} from '@baseplate-dev/ui-components';\n\nfunction AdminCrudTextInputForm({\n formProps,\n name,\n model,\n}: AdminCrudInputWebFormProps): React.JSX.Element {\n const fieldOptions = model.model.fields.map((field) => ({\n label: field.name,\n value: field.id,\n }));\n const prefix = name as 'prefix';\n const controlTyped = formProps.control as Control<{\n prefix: AdminCrudTextInputConfig;\n }>;\n\n return (\n <>\n <SelectFieldController\n label=\"Field\"\n control={controlTyped}\n name={`${prefix}.modelFieldRef`}\n options={fieldOptions}\n />\n <InputFieldController\n label=\"Validation (zod), e.g. z.string().min(1) (optional)\"\n control={controlTyped}\n name={`${prefix}.validation`}\n />\n </>\n );\n}\n\nexport const adminCrudTextInputWebConfig =\n createAdminCrudInputWebConfig<AdminCrudTextInputConfig>({\n name: 'text',\n pluginId: undefined,\n label: 'Text',\n getNewInput: () => ({ label: '', type: 'text', modelFieldRef: '' }),\n Form: AdminCrudTextInputForm,\n });\n","import { adminCrudEmbeddedInputWebConfig } from './embedded-input-config.js';\nimport { adminCrudEmbeddedLocalInputWebConfig } from './embedded-local-input-config.js';\nimport { adminCrudEnumInputWebConfig } from './enum-input-config.js';\nimport { adminCrudForeignInputWebConfig } from './foreign-input-config.js';\nimport { adminCrudTextInputWebConfig } from './text-input-config.js';\n\nexport const BUILT_IN_ADMIN_CRUD_INPUT_WEB_CONFIGS = [\n adminCrudEmbeddedInputWebConfig,\n adminCrudEmbeddedLocalInputWebConfig,\n adminCrudEnumInputWebConfig,\n adminCrudForeignInputWebConfig,\n adminCrudTextInputWebConfig,\n];\n","import type { AdminCrudSectionConfigInput } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { UseFormReturn } from 'react-hook-form';\n\nimport { ModelUtils } from '@baseplate-dev/project-builder-lib';\nimport {\n adminCrudInputWebSpec,\n useProjectDefinition,\n} from '@baseplate-dev/project-builder-lib/web';\nimport {\n Button,\n InputFieldController,\n SelectFieldController,\n} from '@baseplate-dev/ui-components';\nimport clsx from 'clsx';\nimport { useFieldArray, useWatch } from 'react-hook-form';\n\nimport { CollapsibleRow } from '#src/components/index.js';\n\nimport { BUILT_IN_ADMIN_CRUD_INPUT_WEB_CONFIGS } from './inputs/index.js';\n\nexport type AdminCrudFormConfigInput = Pick<\n AdminCrudSectionConfigInput,\n 'form' | 'modelRef'\n>;\n\ninterface Props {\n className?: string;\n formProps: UseFormReturn<AdminCrudFormConfigInput>;\n embeddedFormOptions: { label: string; value: string }[];\n}\n\nfunction FieldForm({\n idx,\n formProps,\n embeddedFormOptions,\n}: {\n idx: number;\n formProps: UseFormReturn<AdminCrudFormConfigInput>;\n embeddedFormOptions: { label: string; value: string }[];\n}): React.JSX.Element {\n const { control } = formProps;\n const modelRef = useWatch({ control, name: 'modelRef' });\n const { definition, pluginContainer } = useProjectDefinition();\n const model = modelRef\n ? ModelUtils.byIdOrThrow(definition, modelRef)\n : undefined;\n\n const inputWeb = pluginContainer.getPluginSpec(adminCrudInputWebSpec);\n\n const fieldTypeOptions = inputWeb\n .getInputWebConfigs(BUILT_IN_ADMIN_CRUD_INPUT_WEB_CONFIGS)\n .map((config) => ({\n label: config.label,\n value: config.name,\n }));\n\n const type = useWatch({\n control,\n name: `form.fields.${idx}.type`,\n });\n const inputWebConfig = inputWeb.getInputWebConfig(\n type,\n BUILT_IN_ADMIN_CRUD_INPUT_WEB_CONFIGS,\n );\n const WebForm = inputWebConfig.Form;\n\n return (\n <div className=\"space-y-4\">\n <SelectFieldController\n label=\"Type\"\n control={control}\n options={fieldTypeOptions}\n name={`form.fields.${idx}.type`}\n />\n <InputFieldController\n label=\"Label\"\n control={control}\n name={`form.fields.${idx}.label`}\n />\n {WebForm && model && (\n <WebForm\n formProps={formProps}\n name={`form.fields.${idx}`}\n model={model}\n embeddedFormOptions={embeddedFormOptions}\n pluginId={inputWebConfig.pluginId}\n />\n )}\n </div>\n );\n}\n\nfunction CrudFormFieldsForm({\n className,\n formProps,\n embeddedFormOptions,\n}: Props): React.JSX.Element {\n const { control } = formProps;\n const { fields, append, remove } = useFieldArray({\n control,\n name: 'form.fields',\n });\n\n return (\n <div className={clsx('space-y-4', className)}>\n {fields.map((field, idx) => (\n <CollapsibleRow\n key={field.id}\n collapsedContents={\n <div>\n {field.label} ({field.type})\n </div>\n }\n onRemove={() => {\n remove(idx);\n }}\n defaultOpen={!field.label}\n >\n <FieldForm\n key={field.id}\n idx={idx}\n formProps={formProps}\n embeddedFormOptions={embeddedFormOptions}\n />\n </CollapsibleRow>\n ))}\n <Button\n onClick={() => {\n append({ type: 'text', label: '' });\n }}\n >\n Add Field\n </Button>\n </div>\n );\n}\n\nexport default CrudFormFieldsForm;\n","import type { AdminCrudSectionConfig } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { Control } from 'react-hook-form';\n\nimport {\n adminCrudDisplayTypes,\n ModelUtils,\n} from '@baseplate-dev/project-builder-lib';\nimport { useProjectDefinition } from '@baseplate-dev/project-builder-lib/web';\nimport {\n Button,\n InputFieldController,\n SelectFieldController,\n} from '@baseplate-dev/ui-components';\nimport clsx from 'clsx';\nimport { useFieldArray, useWatch } from 'react-hook-form';\n\nimport { CollapsibleRow } from '#src/components/index.js';\n\nexport type AdminCrudTableConfig = Pick<\n AdminCrudSectionConfig,\n 'table' | 'modelRef'\n>;\n\ninterface Props {\n className?: string;\n control: Control<AdminCrudTableConfig>;\n}\n\nfunction ColumnForm({\n idx,\n control,\n fieldOptions,\n localRelationOptions,\n}: {\n idx: number;\n control: Control<AdminCrudTableConfig>;\n fieldOptions: { label: string; value: string }[];\n localRelationOptions: { label: string; value: string }[];\n}): React.JSX.Element {\n const displayTypeOptions = adminCrudDisplayTypes.map((t) => ({\n label: t,\n value: t,\n }));\n const type = useWatch({ control, name: `table.columns.${idx}.display.type` });\n return (\n <div className=\"space-y-4\">\n <SelectFieldController\n label=\"Type\"\n control={control}\n options={displayTypeOptions}\n name={`table.columns.${idx}.display.type`}\n />\n <InputFieldController\n label=\"Label\"\n control={control}\n name={`table.columns.${idx}.label`}\n />\n\n {type === 'text' && (\n <SelectFieldController\n label=\"Field\"\n control={control}\n name={`table.columns.${idx}.display.modelFieldRef`}\n options={fieldOptions}\n />\n )}\n {type === 'foreign' && (\n <>\n <SelectFieldController\n label=\"Local Relation Name\"\n control={control}\n name={`table.columns.${idx}.display.localRelationRef`}\n options={localRelationOptions}\n />\n <InputFieldController\n label=\"Label Expression (e.g. name)\"\n control={control}\n name={`table.columns.${idx}.display.labelExpression`}\n />\n <InputFieldController\n label=\"Value Expression (e.g. id)\"\n control={control}\n name={`table.columns.${idx}.display.valueExpression`}\n />\n </>\n )}\n </div>\n );\n}\n\nfunction CrudTableColumnsForm({\n className,\n control,\n}: Props): React.JSX.Element {\n const modelRef = useWatch({ control, name: 'modelRef' });\n const { definition, definitionContainer } = useProjectDefinition();\n const model = modelRef\n ? ModelUtils.byIdOrThrow(definition, modelRef)\n : undefined;\n const { fields, append, remove } = useFieldArray({\n control,\n name: 'table.columns',\n });\n\n const localRelationOptions =\n model?.model.relations?.map((relation) => ({\n label: `${relation.name} (${definitionContainer.nameFromId(relation.modelRef)})`,\n value: relation.id,\n })) ?? [];\n\n const fieldOptions =\n model?.model.fields.map((field) => ({\n label: field.name,\n value: field.id,\n })) ?? [];\n\n return (\n <div className={clsx('space-y-4', className)}>\n {fields.map((field, idx) => (\n <CollapsibleRow\n key={field.id}\n collapsedContents={\n <div>\n {field.label} ({field.display.type})\n </div>\n }\n onRemove={() => {\n remove(idx);\n }}\n defaultOpen={!field.label}\n >\n <ColumnForm\n key={field.id}\n idx={idx}\n control={control}\n fieldOptions={fieldOptions}\n localRelationOptions={localRelationOptions}\n />\n </CollapsibleRow>\n ))}\n <Button\n onClick={() => {\n append({ display: { type: 'text', modelFieldRef: '' }, label: '' });\n }}\n >\n Add Column\n </Button>\n </div>\n );\n}\n\nexport default CrudTableColumnsForm;\n","import type { AdminCrudEmbeddedFormConfigInput } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { Control, UseFormReturn } from 'react-hook-form';\n\nimport { createAdminCrudEmbeddedFormSchema } from '@baseplate-dev/project-builder-lib';\nimport {\n useDefinitionSchema,\n useProjectDefinition,\n} from '@baseplate-dev/project-builder-lib/web';\nimport {\n Button,\n CheckboxFieldController,\n InputFieldController,\n SelectFieldController,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n toast,\n} from '@baseplate-dev/ui-components';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { useId } from 'react';\nimport { useForm } from 'react-hook-form';\n\nimport type {\n EmbeddedListFormProps,\n EmbeddedListTableProps,\n} from '#src/components/index.js';\n\nimport { logAndFormatError } from '#src/services/error-formatter.js';\n\nimport type { AdminCrudFormConfigInput } from './crud-form-fields-form.js';\nimport type { AdminCrudTableConfig } from './crud-table-columns-form.js';\n\nimport CrudFormFieldsForm from './crud-form-fields-form.js';\nimport CrudTableColumnsForm from './crud-table-columns-form.js';\n\nexport function AdminCrudEmbeddedTable({\n items,\n edit,\n remove,\n}: EmbeddedListTableProps<AdminCrudEmbeddedFormConfigInput>): React.JSX.Element {\n const { definitionContainer } = useProjectDefinition();\n return (\n <Table className=\"max-w-6xl\">\n <TableHeader>\n <TableRow>\n <TableHead>Form Name</TableHead>\n <TableHead>Model Name</TableHead>\n <TableHead>Type</TableHead>\n <TableHead>Actions</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {items.map((item, idx) => (\n <TableRow key={item.id}>\n <TableCell>{item.name}</TableCell>\n <TableCell>\n {definitionContainer.nameFromId(item.modelRef)}\n </TableCell>\n <TableCell>{item.type}</TableCell>\n <TableCell className=\"space-x-4\">\n <Button\n variant=\"link\"\n size=\"none\"\n onClick={() => {\n edit(idx);\n }}\n >\n Edit\n </Button>\n <Button\n variant=\"linkDestructive\"\n size=\"none\"\n onClick={() => {\n remove(idx);\n }}\n >\n Remove\n </Button>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n );\n}\n\nconst TYPE_OPTIONS = [\n { label: 'Object', value: 'object' },\n { label: 'List', value: 'list' },\n];\n\ninterface Props\n extends EmbeddedListFormProps<AdminCrudEmbeddedFormConfigInput> {\n embeddedFormOptions: { label: string; value: string }[];\n}\n\nfunction AdminCrudEmbeddedForm({\n initialData,\n onSubmit,\n embeddedFormOptions,\n}: Props): React.JSX.Element {\n const { definition } = useProjectDefinition();\n const adminCrudEmbeddedFormSchema = useDefinitionSchema(\n createAdminCrudEmbeddedFormSchema,\n );\n const formProps = useForm<AdminCrudEmbeddedFormConfigInput>({\n resolver: zodResolver(adminCrudEmbeddedFormSchema),\n defaultValues: initialData,\n });\n const { handleSubmit, control, watch } = formProps;\n\n const modelOptions = definition.models.map((model) => ({\n label: model.name,\n value: model.id,\n }));\n\n const type = watch('type');\n\n const formId = useId();\n\n return (\n <form\n onSubmit={(e) => {\n e.stopPropagation();\n handleSubmit(onSubmit)(e).catch((error: unknown) => {\n toast.error(logAndFormatError(error));\n });\n }}\n id={formId}\n className=\"space-y-4\"\n >\n <InputFieldController label=\"Name\" control={control} name=\"name\" />\n <SelectFieldController\n label=\"Type\"\n control={control}\n name=\"type\"\n options={TYPE_OPTIONS}\n />\n <CheckboxFieldController\n label=\"Include ID Field? (useful for list types)\"\n control={control}\n name=\"includeIdField\"\n />\n <SelectFieldController\n label=\"Model\"\n control={control}\n options={modelOptions}\n name=\"modelRef\"\n />\n {type === 'list' && (\n <>\n <h2>Table</h2>\n <CrudTableColumnsForm\n control={control as unknown as Control<AdminCrudTableConfig>}\n />\n </>\n )}\n <h2>Form</h2>\n <CrudFormFieldsForm\n formProps={\n formProps as unknown as UseFormReturn<AdminCrudFormConfigInput>\n }\n embeddedFormOptions={embeddedFormOptions}\n />\n <Button type=\"submit\" form={formId}>\n Save\n </Button>\n </form>\n );\n}\n\nexport default AdminCrudEmbeddedForm;\n","import type { WebAdminSectionConfigInput } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { Control, UseFormReturn } from 'react-hook-form';\n\nimport { useProjectDefinition } from '@baseplate-dev/project-builder-lib/web';\nimport {\n CheckboxFieldController,\n SelectFieldController,\n} from '@baseplate-dev/ui-components';\nimport clsx from 'clsx';\nimport { useWatch } from 'react-hook-form';\n\nimport { EmbeddedListInput } from '#src/components/index.js';\n\nimport type { AdminCrudFormConfigInput } from './crud-form-fields-form.js';\nimport type { AdminCrudTableConfig } from './crud-table-columns-form.js';\n\nimport AdminCrudEmbeddedForm, {\n AdminCrudEmbeddedTable,\n} from './admin-crud-embedded-form.js';\nimport CrudFormFieldsForm from './crud-form-fields-form.js';\nimport CrudTableColumnsForm from './crud-table-columns-form.js';\n\ninterface Props {\n className?: string;\n formProps: UseFormReturn<WebAdminSectionConfigInput>;\n}\n\nfunction AdminCrudSectionForm({\n className,\n formProps,\n}: Props): React.JSX.Element {\n const { control } = formProps;\n const { definition } = useProjectDefinition();\n\n const modelOptions = definition.models.map((model) => ({\n label: model.name,\n value: model.id,\n }));\n\n // TODO: struggles with https://github.com/react-hook-form/react-hook-form/discussions/7354\n\n const embeddedFormOptions =\n useWatch({\n control,\n name: 'embeddedForms',\n })?.map((form) => ({\n label: form.name,\n value: form.id,\n })) ?? [];\n\n // TODO: Update embedded form names when form is added/removed\n\n return (\n <div className={clsx('space-y-4', className)}>\n <SelectFieldController\n label=\"Model\"\n control={control}\n options={modelOptions}\n name=\"modelRef\"\n />\n <CheckboxFieldController\n label=\"Disable Create?\"\n control={control}\n name=\"disableCreate\"\n />\n <h2>Table</h2>\n <CrudTableColumnsForm\n control={control as unknown as Control<AdminCrudTableConfig>}\n />\n <h2>Form</h2>\n <CrudFormFieldsForm\n formProps={\n formProps as unknown as UseFormReturn<AdminCrudFormConfigInput>\n }\n embeddedFormOptions={embeddedFormOptions}\n />\n <h2>Embedded Forms</h2>\n <EmbeddedListInput.LabelledController\n control={control}\n name=\"embeddedForms\"\n renderForm={(formProps) => (\n <AdminCrudEmbeddedForm\n {...formProps}\n embeddedFormOptions={embeddedFormOptions}\n />\n )}\n renderTable={(tableProps) => <AdminCrudEmbeddedTable {...tableProps} />}\n defaultValue={{ type: 'object' }}\n />\n </div>\n );\n}\n\nexport default AdminCrudSectionForm;\n","import type { WebAdminSectionConfig } from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\n\nimport {\n adminSectionEntityType,\n authConfigSpec,\n createWebAdminSectionSchema,\n createWebAppSchema,\n} from '@baseplate-dev/project-builder-lib';\nimport {\n useBlockUnsavedChangesNavigate,\n useProjectDefinition,\n useResettableForm,\n} from '@baseplate-dev/project-builder-lib/web';\nimport {\n Badge,\n Button,\n ComboboxFieldController,\n FormActionBar,\n InputFieldController,\n MultiComboboxFieldController,\n RecordView,\n RecordViewActions,\n RecordViewItem,\n RecordViewItemList,\n SectionList,\n SectionListSection,\n SectionListSectionContent,\n SectionListSectionDescription,\n SectionListSectionHeader,\n SectionListSectionTitle,\n SelectFieldController,\n Sheet,\n SheetContent,\n SheetDescription,\n SheetFooter,\n SheetHeader,\n SheetTitle,\n SwitchFieldController,\n useConfirmDialog,\n} from '@baseplate-dev/ui-components';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { createFileRoute } from '@tanstack/react-router';\nimport { sortBy } from 'es-toolkit';\nimport { useState } from 'react';\nimport { MdAdd, MdDeleteOutline, MdEdit } from 'react-icons/md';\n\nimport { useDefinitionSchema } from '#src/hooks/use-definition-schema.js';\n\nimport AdminCrudSectionForm from './-components/admin-crud-section-form.js';\n\nexport const Route = createFileRoute('/apps/edit/$key/web/admin/')({\n component: WebAdminPage,\n});\n\nfunction WebAdminPage(): React.JSX.Element {\n const { requestConfirm } = useConfirmDialog();\n const { webDefinition } = Route.useRouteContext();\n const { definition, saveDefinitionWithFeedback, pluginContainer } =\n useProjectDefinition();\n const webAppSchema = useDefinitionSchema(createWebAppSchema);\n const adminSectionSchema = useDefinitionSchema(createWebAdminSectionSchema);\n\n const [sectionToEdit, setSectionToEdit] = useState<\n WebAdminSectionConfig | undefined\n >();\n const [isEditingSection, setIsEditingSection] = useState(false);\n\n const formProps = useResettableForm({\n resolver: zodResolver(webAppSchema),\n values: webDefinition,\n });\n const { control, handleSubmit, reset, watch } = formProps;\n\n const sectionFormProps = useResettableForm({\n resolver: zodResolver(adminSectionSchema),\n values: sectionToEdit,\n defaultValues: { type: 'crud' },\n });\n\n const onSubmit = handleSubmit((data) =>\n saveDefinitionWithFeedback((draftConfig) => {\n draftConfig.apps = draftConfig.apps.map((app) =>\n app.id === webDefinition.id ? data : app,\n );\n }),\n );\n\n const onSectionSubmit = sectionFormProps.handleSubmit((data) => {\n const id = data.id || adminSectionEntityType.generateNewId();\n saveDefinitionWithFeedback((draftConfig) => {\n const webApp = draftConfig.apps.find(\n (app) => app.id === webDefinition.id,\n );\n if (webApp?.type !== 'web') return;\n\n webApp.adminApp ??= {\n enabled: true,\n pathPrefix: '/admin',\n sections: [],\n };\n\n const existingIndex = webApp.adminApp.sections?.findIndex(\n (section) => section.id === data.id,\n );\n\n if (\n existingIndex !== undefined &&\n existingIndex >= 0 &&\n webApp.adminApp.sections\n ) {\n webApp.adminApp.sections[existingIndex] = { ...data, id };\n } else {\n webApp.adminApp.sections = sortBy(\n [...(webApp.adminApp.sections ?? []), { ...data, id }],\n [(section) => section.name],\n );\n }\n })\n .then(() => {\n setIsEditingSection(false);\n setSectionToEdit(undefined);\n })\n .catch(() => {\n // Error handling is done by saveDefinitionWithFeedback\n });\n });\n\n useBlockUnsavedChangesNavigate({ control, reset, onSubmit });\n\n const roleOptions = pluginContainer\n .getPluginSpecOptional(authConfigSpec)\n ?.getAuthRoles(definition)\n .map((role) => ({\n label: role.name,\n value: role.id,\n }));\n\n const adminEnabled = watch('adminApp.enabled');\n const sections = watch('adminApp.sections') ?? [];\n\n function handleDeleteSection(sectionId: string): void {\n const section = sections.find((s) => s.id === sectionId);\n requestConfirm({\n title: 'Delete Admin Section',\n content: `Are you sure you want to delete the section \"${section?.name ?? 'Unknown'}\"?`,\n onConfirm: () => {\n void saveDefinitionWithFeedback((draftConfig) => {\n const webApp = draftConfig.apps.find(\n (app) => app.id === webDefinition.id,\n );\n if (webApp?.type !== 'web' || !webApp.adminApp) return;\n\n webApp.adminApp.sections = webApp.adminApp.sections?.filter(\n (s) => s.id !== sectionId,\n );\n });\n },\n });\n }\n\n const featureOptions = definition.features.map((f) => ({\n label: f.name,\n value: f.id,\n }));\n\n return (\n <>\n <form className=\"w-full max-w-7xl space-y-4 p-4\" onSubmit={onSubmit}>\n <SectionList>\n <SectionListSection>\n <SectionListSectionHeader>\n <SectionListSectionTitle>\n Admin Configuration\n </SectionListSectionTitle>\n <SectionListSectionDescription>\n Configure administrative features for your web application.\n </SectionListSectionDescription>\n </SectionListSectionHeader>\n <SectionListSectionContent className=\"space-y-6\">\n <SwitchFieldController\n label=\"Enable Admin Panel\"\n description=\"Add administrative interface to your web application\"\n control={control}\n name=\"adminApp.enabled\"\n />\n\n {adminEnabled && (\n <>\n <InputFieldController\n label=\"Admin Path Prefix\"\n placeholder=\"/admin\"\n description=\"URL prefix for admin routes (e.g. /admin)\"\n control={control}\n name=\"adminApp.pathPrefix\"\n />\n\n {roleOptions && (\n <MultiComboboxFieldController\n label=\"Admin Access Roles\"\n description=\"Which roles can access the admin panel\"\n control={control}\n options={roleOptions}\n name=\"adminApp.allowedRoles\"\n />\n )}\n </>\n )}\n </SectionListSectionContent>\n </SectionListSection>\n\n {adminEnabled && (\n <SectionListSection>\n <SectionListSectionHeader>\n <SectionListSectionTitle>\n Admin Sections\n </SectionListSectionTitle>\n <SectionListSectionDescription>\n Configure CRUD interfaces for your data models.\n </SectionListSectionDescription>\n </SectionListSectionHeader>\n <SectionListSectionContent className=\"space-y-4\">\n {sections.map((section) => (\n <RecordView key={section.id}>\n <RecordViewItemList>\n <RecordViewItem title=\"Name\">\n <div className=\"flex items-center gap-2\">\n <span>{section.name}</span>\n </div>\n </RecordViewItem>\n <RecordViewItem title=\"Type\">\n <Badge variant=\"secondary\">{section.type}</Badge>\n </RecordViewItem>\n <RecordViewItem title=\"Icon\">\n {section.icon ?? (\n <span className=\"text-muted-foreground\">No icon</span>\n )}\n </RecordViewItem>\n </RecordViewItemList>\n <RecordViewActions>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n title=\"Edit\"\n aria-label=\"Edit section\"\n onClick={() => {\n setSectionToEdit(section as WebAdminSectionConfig);\n sectionFormProps.reset(\n section as WebAdminSectionConfig,\n );\n setIsEditingSection(true);\n }}\n >\n <MdEdit />\n </Button>\n <Button\n variant=\"ghostDestructive\"\n size=\"icon\"\n title=\"Delete\"\n aria-label=\"Delete section\"\n onClick={() => {\n handleDeleteSection(section.id ?? '');\n }}\n >\n <MdDeleteOutline />\n </Button>\n </RecordViewActions>\n </RecordView>\n ))}\n\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => {\n const defaultFeature = featureOptions[0]?.value ?? '';\n const defaultSection: WebAdminSectionConfig = {\n id: adminSectionEntityType.generateNewId(),\n name: '',\n type: 'crud',\n featureRef: defaultFeature,\n icon: '',\n modelRef: '',\n form: { fields: [] },\n table: { columns: [] },\n };\n setSectionToEdit(defaultSection);\n sectionFormProps.reset(defaultSection);\n setIsEditingSection(true);\n }}\n >\n <MdAdd />\n Add Section\n </Button>\n </SectionListSectionContent>\n </SectionListSection>\n )}\n </SectionList>\n <FormActionBar form={formProps} />\n </form>\n\n <Sheet open={isEditingSection} onOpenChange={setIsEditingSection}>\n <SheetContent className=\"overflow-y-auto sm:max-w-2xl\">\n <SheetHeader>\n <SheetTitle>\n {sectionToEdit?.id &&\n sections.some((s) => s.id === sectionToEdit.id)\n ? 'Edit Admin Section'\n : 'Add Admin Section'}\n </SheetTitle>\n <SheetDescription>\n Configure a CRUD interface for managing your data.\n </SheetDescription>\n </SheetHeader>\n <form onSubmit={onSectionSubmit} className=\"mt-6\">\n <div className=\"flex flex-col gap-4 px-4\">\n <InputFieldController\n label=\"Name\"\n control={sectionFormProps.control}\n name=\"name\"\n />\n <ComboboxFieldController\n label=\"Feature\"\n control={sectionFormProps.control}\n options={featureOptions}\n name=\"featureRef\"\n />\n <InputFieldController\n label=\"Icon\"\n control={sectionFormProps.control}\n name=\"icon\"\n />\n <SelectFieldController\n label=\"Type\"\n control={sectionFormProps.control}\n name=\"type\"\n options={[{ label: 'Crud', value: 'crud' }]}\n />\n <AdminCrudSectionForm formProps={sectionFormProps} />\n </div>\n <SheetFooter>\n <div className=\"flex gap-2 pt-4\">\n <Button type=\"submit\">Save Section</Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => {\n setIsEditingSection(false);\n }}\n >\n Cancel\n </Button>\n </div>\n </SheetFooter>\n </form>\n </SheetContent>\n </Sheet>\n </>\n );\n}\n"],"names":["ModelUtils","importShared","createAdminCrudInputWebConfig","useProjectDefinition","SelectFieldController","AdminCrudEmbeddedInputForm","formProps","name","model","embeddedFormOptions","definition","foreignRelationOptions","r","prefix","controlTyped","jsxs","Fragment","jsx","adminCrudEmbeddedInputWebConfig","AdminCrudEmbeddedLocalInputForm","definitionContainer","localRelationOptions","relation","adminCrudEmbeddedLocalInputWebConfig","AdminCrudEnumInputForm","enumFieldOptions","f","field","adminCrudEnumInputWebConfig","InputFieldController","AdminCrudForeignInputForm","adminCrudForeignInputWebConfig","AdminCrudTextInputForm","fieldOptions","adminCrudTextInputWebConfig","BUILT_IN_ADMIN_CRUD_INPUT_WEB_CONFIGS","adminCrudInputWebSpec","Button","FieldForm","idx","control","modelRef","useWatch","pluginContainer","inputWeb","fieldTypeOptions","config","type","inputWebConfig","WebForm","CrudFormFieldsForm","className","fields","append","remove","useFieldArray","clsx","CollapsibleRow","adminCrudDisplayTypes","ColumnForm","displayTypeOptions","t","CrudTableColumnsForm","createAdminCrudEmbeddedFormSchema","useDefinitionSchema","CheckboxFieldController","Table","TableBody","TableCell","TableHead","TableHeader","TableRow","toast","useId","AdminCrudEmbeddedTable","items","edit","item","TYPE_OPTIONS","AdminCrudEmbeddedForm","initialData","onSubmit","adminCrudEmbeddedFormSchema","useForm","zodResolver","handleSubmit","watch","modelOptions","formId","e","error","logAndFormatError","AdminCrudSectionForm","form","EmbeddedListInput","tableProps","adminSectionEntityType","authConfigSpec","createWebAdminSectionSchema","createWebAppSchema","useBlockUnsavedChangesNavigate","useResettableForm","Badge","ComboboxFieldController","FormActionBar","MultiComboboxFieldController","RecordView","RecordViewActions","RecordViewItem","RecordViewItemList","SectionList","SectionListSection","SectionListSectionContent","SectionListSectionDescription","SectionListSectionHeader","SectionListSectionTitle","Sheet","SheetContent","SheetDescription","SheetFooter","SheetHeader","SheetTitle","SwitchFieldController","useConfirmDialog","useState","SplitComponent","requestConfirm","webDefinition","Route","useRouteContext","saveDefinitionWithFeedback","webAppSchema","adminSectionSchema","sectionToEdit","setSectionToEdit","isEditingSection","setIsEditingSection","resolver","values","reset","sectionFormProps","defaultValues","draftConfig","apps","map","app","id","data","onSectionSubmit","generateNewId","webApp","find","adminApp","enabled","pathPrefix","sections","existingIndex","findIndex","section","undefined","sortBy","then","catch","roleOptions","getPluginSpecOptional","getAuthRoles","role","label","value","adminEnabled","handleDeleteSection","sectionId","s","title","content","onConfirm","filter","featureOptions","features","icon","MdEdit","MdDeleteOutline","defaultFeature","defaultSection","featureRef","table","columns","MdAdd","some"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{i as s}from"./_virtual___federation_fn_import-BLYgPlMt.js";import{j as e}from"./index.esm-DcyGeCKA.js";import{H as r}from"./index-C_wN4CIq.js";import{N as o}from"./new-model-dialog-CM2dJ8Iv.js";const{useProjectDefinition:a}=await s("@baseplate-dev/project-builder-lib/web"),{Button:t,EmptyDisplay:n}=await s("@baseplate-dev/ui-components"),h=function(){const{definition:i}=a();return i.models.length===0?e.jsx(n,{icon:r,header:"No Models",subtitle:"Create a model to get started",actions:e.jsx(o,{children:e.jsx(t,{children:"New Model"})})}):e.jsxs("div",{className:"max-w-4xl space-y-4 p-4 text-style-prose",children:[e.jsx("h1",{children:"Models"}),e.jsx("p",{children:"Models are the building blocks of your app. They define the data structure of your app."}),e.jsxs("p",{children:["Choose a model to edit from the sidebar or"," ",e.jsx(o,{children:e.jsx(t,{variant:"link",size:"none",children:"create a new model"})}),"."]})]})};export{h as component};
2
- //# sourceMappingURL=index-BdmJimiZ.js.map
@@ -1,2 +0,0 @@
1
- import{i}from"./_virtual___federation_fn_import-BLYgPlMt.js";import{j as e}from"./index.esm-DcyGeCKA.js";import{L as p}from"./index-C_wN4CIq.js";import{h as c}from"./index-C15I7WFi.js";import{N as n}from"./new-app-dialog-CTtQ52jO.js";import{s as d}from"./immer-BOh2djD_.js";const{appEntityType:l}=await i("@baseplate-dev/project-builder-lib"),{useProjectDefinition:m}=await i("@baseplate-dev/project-builder-lib/web"),{Button:t,Card:h,EmptyDisplay:x}=await i("@baseplate-dev/ui-components"),v=function(){const{definition:r}=m(),{apps:o}=r,a=d(o,[s=>s.name]);return a.length===0?e.jsx(x,{icon:c,header:"No Apps",subtitle:"You haven't created any apps yet",actions:e.jsx(n,{children:e.jsx(t,{children:"New App"})})}):e.jsxs("div",{className:"space-y-4 p-4",children:[e.jsx("h1",{children:"Apps"}),e.jsx("p",{children:"These are the apps that are defined in your project. You can edit them here."}),e.jsx(n,{children:e.jsx(t,{children:"New App"})}),e.jsx("div",{className:"max-w-xl space-y-4",children:a.map(s=>e.jsxs(h,{className:"flex justify-between space-x-4 p-4",children:[e.jsxs("div",{children:[e.jsxs("h3",{children:[s.name," (",s.type,")"]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:s.packageLocation})]}),e.jsx(p,{to:"/apps/edit/$key",from:"/",params:{key:l.keyFromId(s.id)},className:"inline-block",children:e.jsx(t,{variant:"secondary",children:"Edit"})})]},s.id))})]})};export{v as component};
2
- //# sourceMappingURL=index-Bv8hyN9u.js.map
@@ -1,2 +0,0 @@
1
- import{i as M}from"./_virtual___federation_fn_import-BLYgPlMt.js";function s(t){var a,r,h="";if(typeof t=="string"||typeof t=="number")h+=t;else if(typeof t=="object")if(Array.isArray(t)){var n=t.length;for(a=0;a<n;a++)t[a]&&(r=s(t[a]))&&(h&&(h+=" "),h+=r)}else for(r in t)t[r]&&(h&&(h+=" "),h+=r);return h}function O(){for(var t,a,r=0,h="",n=arguments.length;r<n;r++)(t=arguments[r])&&(a=s(t))&&(h&&(h+=" "),h+=a);return h}function C(t){return t!=null}const u=await M("react");var p={color:void 0,size:void 0,className:void 0,style:void 0,attr:void 0},z=u.createContext&&u.createContext(p),H=["attr","size","title"];function w(t,a){if(t==null)return{};var r=x(t,a),h,n;if(Object.getOwnPropertySymbols){var e=Object.getOwnPropertySymbols(t);for(n=0;n<e.length;n++)h=e[n],!(a.indexOf(h)>=0)&&Object.prototype.propertyIsEnumerable.call(t,h)&&(r[h]=t[h])}return r}function x(t,a){if(t==null)return{};var r={};for(var h in t)if(Object.prototype.hasOwnProperty.call(t,h)){if(a.indexOf(h)>=0)continue;r[h]=t[h]}return r}function d(){return d=Object.assign?Object.assign.bind():function(t){for(var a=1;a<arguments.length;a++){var r=arguments[a];for(var h in r)Object.prototype.hasOwnProperty.call(r,h)&&(t[h]=r[h])}return t},d.apply(this,arguments)}function f(t,a){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var h=Object.getOwnPropertySymbols(t);a&&(h=h.filter(function(n){return Object.getOwnPropertyDescriptor(t,n).enumerable})),r.push.apply(r,h)}return r}function o(t){for(var a=1;a<arguments.length;a++){var r=arguments[a]!=null?arguments[a]:{};a%2?f(Object(r),!0).forEach(function(h){V(t,h,r[h])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):f(Object(r)).forEach(function(h){Object.defineProperty(t,h,Object.getOwnPropertyDescriptor(r,h))})}return t}function V(t,a,r){return a=B(a),a in t?Object.defineProperty(t,a,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[a]=r,t}function B(t){var a=y(t,"string");return typeof a=="symbol"?a:a+""}function y(t,a){if(typeof t!="object"||!t)return t;var r=t[Symbol.toPrimitive];if(r!==void 0){var h=r.call(t,a);if(typeof h!="object")return h;throw new TypeError("@@toPrimitive must return a primitive value.")}return(a==="string"?String:Number)(t)}const c=await M("react");function g(t){return t&&t.map((a,r)=>c.createElement(a.tag,o({key:r},a.attr),g(a.child)))}function l(t){return a=>c.createElement(b,d({attr:o({},t.attr)},a),g(t.child))}function b(t){var a=r=>{var{attr:h,size:n,title:e}=t,m=w(t,H),v=n||r.size||"1em",i;return r.className&&(i=r.className),t.className&&(i=(i?i+" ":"")+t.className),c.createElement("svg",d({stroke:"currentColor",fill:"currentColor",strokeWidth:"0"},r.attr,h,m,{className:i,style:o(o({color:t.color||r.color},r.style),t.style),height:v,width:v,xmlns:"http://www.w3.org/2000/svg"}),e&&c.createElement("title",null,e),t.children)};return z!==void 0?c.createElement(z.Consumer,null,r=>a(r)):a(p)}function S(t){return l({attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0z"},child:[]},{tag:"path",attr:{d:"M19 4h-1V2h-2v2H8V2H6v2H5c-1.11 0-1.99.9-1.99 2L3 20a2 2 0 0 0 2 2h14c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 16H5V10h14v10zM9 14H7v-2h2v2zm4 0h-2v-2h2v2zm4 0h-2v-2h2v2zm-8 4H7v-2h2v2zm4 0h-2v-2h2v2zm4 0h-2v-2h2v2z"},child:[]}]})(t)}function j(t){return l({attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0z"},child:[]},{tag:"path",attr:{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"},child:[]}]})(t)}function P(t){return l({attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0V0z"},child:[]},{tag:"path",attr:{d:"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM8 9h8v10H8V9zm7.5-5-1-1h-5l-1 1H5v2h14V4z"},child:[]}]})(t)}function E(t){return l({attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0z"},child:[]},{tag:"path",attr:{d:"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"},child:[]}]})(t)}function A(t){return l({attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0z"},child:[]},{tag:"path",attr:{d:"M20.5 11H19V7c0-1.1-.9-2-2-2h-4V3.5a2.5 2.5 0 0 0-5 0V5H4c-1.1 0-1.99.9-1.99 2v3.8H3.5c1.49 0 2.7 1.21 2.7 2.7s-1.21 2.7-2.7 2.7H2V20c0 1.1.9 2 2 2h3.8v-1.5c0-1.49 1.21-2.7 2.7-2.7 1.49 0 2.7 1.21 2.7 2.7V22H17c1.1 0 2-.9 2-2v-4h1.5a2.5 2.5 0 0 0 0-5z"},child:[]}]})(t)}function D(t){return l({attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0z"},child:[]},{tag:"path",attr:{d:"M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z"},child:[]}]})(t)}function N(t){return l({attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0V0z"},child:[]},{tag:"path",attr:{d:"M6 2v6h.01L6 8.01 10 12l-4 4 .01.01H6V22h12v-5.99h-.01L18 16l-4-4 4-3.99-.01-.01H18V2H6zm10 14.5V20H8v-3.5l4-4 4 4zm-4-5-4-4V4h8v3.5l-4 4z"},child:[]}]})(t)}function _(t){return l({attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0z"},child:[]},{tag:"path",attr:{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"},child:[]}]})(t)}function I(t){return l({attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0z"},child:[]},{tag:"path",attr:{d:"M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z"},child:[]},{tag:"path",attr:{d:"M12.5 7H11v6l5.25 3.15.75-1.23-4.5-2.67z"},child:[]}]})(t)}function K(t){return l({attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0z"},child:[]},{tag:"path",attr:{d:"M15.5 14h-.79l-.28-.27A6.471 6.471 0 0 0 16 9.5 6.5 6.5 0 1 0 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"},child:[]}]})(t)}function R(t){return l({attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0z"},child:[]},{tag:"path",attr:{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z"},child:[]}]})(t)}function W(t){return l({attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0z"},child:[]},{tag:"path",attr:{d:"M21 10h-8.35A5.99 5.99 0 0 0 7 6c-3.31 0-6 2.69-6 6s2.69 6 6 6a5.99 5.99 0 0 0 5.65-4H13l2 2 2-2 2 2 4-4.04L21 10zM7 15c-1.65 0-3-1.35-3-3s1.35-3 3-3 3 1.35 3 3-1.35 3-3 3z"},child:[]}]})(t)}function F(t){return l({attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0z"},child:[]},{tag:"path",attr:{d:"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"},child:[]}]})(t)}function G(t){return l({attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0z"},child:[]},{tag:"path",attr:{d:"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"},child:[]}]})(t)}function T(t){return l({attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0z"},child:[]},{tag:"path",attr:{d:"M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z"},child:[]}]})(t)}function q(t){return l({attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0V0z"},child:[]},{tag:"path",attr:{d:"M12 5V2L8 6l4 4V7c3.31 0 6 2.69 6 6 0 2.97-2.17 5.43-5 5.91v2.02c3.95-.49 7-3.85 7-7.93 0-4.42-3.58-8-8-8zM6 13c0-1.65.67-3.15 1.76-4.24L6.34 7.34A8.014 8.014 0 0 0 4 13c0 4.08 3.05 7.44 7 7.93v-2.02c-2.83-.48-5-2.94-5-5.91z"},child:[]}]})(t)}function J(t){return l({attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0z"},child:[]},{tag:"path",attr:{d:"M13 13v8h8v-8h-8zM3 21h8v-8H3v8zM3 3v8h8V3H3zm13.66-1.31L11 7.34 16.66 13l5.66-5.66-5.66-5.65z"},child:[]}]})(t)}function U(t){return l({attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0V0z"},child:[]},{tag:"path",attr:{d:"M4 10.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm0-6c-.83 0-1.5.67-1.5 1.5S3.17 7.5 4 7.5 5.5 6.83 5.5 6 4.83 4.5 4 4.5zm0 12c-.83 0-1.5.68-1.5 1.5s.68 1.5 1.5 1.5 1.5-.68 1.5-1.5-.67-1.5-1.5-1.5zM7 19h14v-2H7v2zm0-6h14v-2H7v2zm0-8v2h14V5H7z"},child:[]}]})(t)}function $(t){return l({attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0V0z"},child:[]},{tag:"path",attr:{d:"M7.41 8.59 12 13.17l4.59-4.58L18 10l-6 6-6-6 1.41-1.41z"},child:[]}]})(t)}function k(t){return l({attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0z"},child:[]},{tag:"path",attr:{d:"M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2z"},child:[]}]})(t)}function Q(t){return l({attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0z"},child:[]},{tag:"path",attr:{d:"M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04a.996.996 0 0 0 0-1.41l-2.34-2.34a.996.996 0 0 0-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z"},child:[]}]})(t)}function X(t){return l({attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0z"},child:[]},{tag:"path",attr:{d:"M4 8h4V4H4v4zm6 12h4v-4h-4v4zm-6 0h4v-4H4v4zm0-6h4v-4H4v4zm6 0h4v-4h-4v4zm6-10v4h4V4h-4zm-6 4h4V4h-4v4zm6 6h4v-4h-4v4zm0 6h4v-4h-4v4z"},child:[]}]})(t)}function Y(t){return l({attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0z"},child:[]},{tag:"path",attr:{d:"M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm5 13.59L15.59 17 12 13.41 8.41 17 7 15.59 10.59 12 7 8.41 8.41 7 12 10.59 15.59 7 17 8.41 13.41 12 17 15.59z"},child:[]}]})(t)}function Z(t){return l({attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0z"},child:[]},{tag:"path",attr:{d:"M9 16.17 4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"},child:[]}]})(t)}function t1(t){return l({attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0z"},child:[]},{tag:"path",attr:{d:"M15.41 7.41 14 6l-6 6 6 6 1.41-1.41L10.83 12z"},child:[]}]})(t)}function a1(t){return l({attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0z"},child:[]},{tag:"path",attr:{d:"M10 6 8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"},child:[]}]})(t)}function r1(t){return l({attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0z"},child:[]},{tag:"path",attr:{d:"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"},child:[]}]})(t)}function h1(t){return l({attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0z"},child:[]},{tag:"path",attr:{d:"M16.59 8.59 12 13.17 7.41 8.59 6 10l6 6 6-6z"},child:[]}]})(t)}function l1(t){return l({attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0z"},child:[]},{tag:"path",attr:{d:"M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z"},child:[]}]})(t)}function n1(t){return l({attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0z"},child:[]},{tag:"path",attr:{d:"M6 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm12 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-6 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"},child:[]}]})(t)}function e1(t){return l({attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0z"},child:[]},{tag:"path",attr:{d:"M12 5.83 15.17 9l1.41-1.41L12 3 7.41 7.59 8.83 9 12 5.83zm0 12.34L8.83 15l-1.41 1.41L12 21l4.59-4.59L15.17 15 12 18.17z"},child:[]}]})(t)}function i1(t){return l({attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0z"},child:[]},{tag:"path",attr:{d:"M3 12c0 2.21.91 4.2 2.36 5.64L3 20h6v-6l-2.24 2.24A6.003 6.003 0 0 1 5 12a5.99 5.99 0 0 1 4-5.65V4.26C5.55 5.15 3 8.27 3 12zm8 5h2v-2h-2v2zM21 4h-6v6l2.24-2.24A6.003 6.003 0 0 1 19 12a5.99 5.99 0 0 1-4 5.65v2.09c3.45-.89 6-4.01 6-7.74 0-2.21-.91-4.2-2.36-5.64L21 4zm-10 9h2V7h-2v6z"},child:[]}]})(t)}function c1(t){return l({attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0z"},child:[]},{tag:"path",attr:{d:"M12 4V1L8 5l4 4V6c3.31 0 6 2.69 6 6 0 1.01-.25 1.97-.7 2.8l1.46 1.46A7.93 7.93 0 0 0 20 12c0-4.42-3.58-8-8-8zm0 14c-3.31 0-6-2.69-6-6 0-1.01.25-1.97.7-2.8L5.24 7.74A7.93 7.93 0 0 0 4 12c0 4.42 3.58 8 8 8v3l4-4-4-4v3z"},child:[]}]})(t)}function d1(t){return l({attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0z"},child:[]},{tag:"path",attr:{d:"m13.783 15.172 2.121-2.121 5.996 5.996-2.121 2.121zM17.5 10c1.93 0 3.5-1.57 3.5-3.5 0-.58-.16-1.12-.41-1.6l-2.7 2.7-1.49-1.49 2.7-2.7c-.48-.25-1.02-.41-1.6-.41C15.57 3 14 4.57 14 6.5c0 .41.08.8.21 1.16l-1.85 1.85-1.78-1.78.71-.71-1.41-1.41L12 3.49a3 3 0 0 0-4.24 0L4.22 7.03l1.41 1.41H2.81l-.71.71 3.54 3.54.71-.71V9.15l1.41 1.41.71-.71 1.78 1.78-7.41 7.41 2.12 2.12L16.34 9.79c.36.13.75.21 1.16.21z"},child:[]}]})(t)}function o1(t){return l({attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0z"},child:[]},{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0z"},child:[]},{tag:"path",attr:{d:"M12 17.27 18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z"},child:[]}]})(t)}function v1(t){return l({attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0V0z"},child:[]},{tag:"path",attr:{d:"M16 9v10H8V9h8m-1.5-6h-5l-1 1H5v2h14V4h-3.5l-1-1zM18 7H6v12c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7z"},child:[]}]})(t)}function u1(t){return l({attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0V0z"},child:[]},{tag:"path",attr:{d:"M19.43 12.98c.04-.32.07-.64.07-.98 0-.34-.03-.66-.07-.98l2.11-1.65c.19-.15.24-.42.12-.64l-2-3.46a.5.5 0 0 0-.61-.22l-2.49 1c-.52-.4-1.08-.73-1.69-.98l-.38-2.65A.488.488 0 0 0 14 2h-4c-.25 0-.46.18-.49.42l-.38 2.65c-.61.25-1.17.59-1.69.98l-2.49-1a.566.566 0 0 0-.18-.03c-.17 0-.34.09-.43.25l-2 3.46c-.13.22-.07.49.12.64l2.11 1.65c-.04.32-.07.65-.07.98 0 .33.03.66.07.98l-2.11 1.65c-.19.15-.24.42-.12.64l2 3.46a.5.5 0 0 0 .61.22l2.49-1c.52.4 1.08.73 1.69.98l.38 2.65c.03.24.24.42.49.42h4c.25 0 .46-.18.49-.42l.38-2.65c.61-.25 1.17-.59 1.69-.98l2.49 1c.06.02.12.03.18.03.17 0 .34-.09.43-.25l2-3.46c.12-.22.07-.49-.12-.64l-2.11-1.65zm-1.98-1.71c.04.31.05.52.05.73 0 .21-.02.43-.05.73l-.14 1.13.89.7 1.08.84-.7 1.21-1.27-.51-1.04-.42-.9.68c-.43.32-.84.56-1.25.73l-1.06.43-.16 1.13-.2 1.35h-1.4l-.19-1.35-.16-1.13-1.06-.43c-.43-.18-.83-.41-1.23-.71l-.91-.7-1.06.43-1.27.51-.7-1.21 1.08-.84.89-.7-.14-1.13c-.03-.31-.05-.54-.05-.74s.02-.43.05-.73l.14-1.13-.89-.7-1.08-.84.7-1.21 1.27.51 1.04.42.9-.68c.43-.32.84-.56 1.25-.73l1.06-.43.16-1.13.2-1.35h1.39l.19 1.35.16 1.13 1.06.43c.43.18.83.41 1.23.71l.91.7 1.06-.43 1.27-.51.7 1.21-1.07.85-.89.7.14 1.13zM12 8c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm0 6c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z"},child:[]}]})(t)}function z1(t){return l({attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{d:"M11 15h2v2h-2v-2zm0-8h2v6h-2V7zm.99-5C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z"},child:[]}]})(t)}function f1(t){return l({attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0V0z"},child:[]},{tag:"path",attr:{d:"M17 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14c1.1 0 2-.9 2-2V7l-4-4zm2 16H5V5h11.17L19 7.83V19zm-7-7c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3zM6 6h9v4H6z"},child:[]}]})(t)}export{f1 as A,F as B,G as C,A as D,_ as E,q as F,l as G,d1 as H,Q as I,E as J,P as K,W as L,N as M,T as N,o1 as O,v1 as P,c1 as a,Y as b,O as c,i1 as d,R as e,j as f,$ as g,X as h,J as i,u1 as j,D as k,l1 as l,n1 as m,C as n,a1 as o,t1 as p,h1 as q,Z as r,e1 as s,r1 as t,K as u,S as v,I as w,k as x,U as y,z1 as z};
2
- //# sourceMappingURL=index-C15I7WFi.js.map