@baseplate-dev/project-builder-web 0.3.2 → 0.3.3

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 (78) hide show
  1. package/dist/assets/{-constants-PTFWy9Gi.js → -constants-Bo-HMfkg.js} +2 -2
  2. package/dist/assets/{-constants-PTFWy9Gi.js.map → -constants-Bo-HMfkg.js.map} +1 -1
  3. package/dist/assets/{admin-kAGVS9JZ.js → admin-BfRT8oJm.js} +2 -2
  4. package/dist/assets/{admin-kAGVS9JZ.js.map → admin-BfRT8oJm.js.map} +1 -1
  5. package/dist/assets/{backend-SutzTn7D.js → backend-DrT1hDB6.js} +2 -2
  6. package/dist/assets/{backend-SutzTn7D.js.map → backend-DrT1hDB6.js.map} +1 -1
  7. package/dist/assets/{edit._key-D8cMXeo4.js → edit._key-CbUXCYlN.js} +2 -2
  8. package/dist/assets/{edit._key-D8cMXeo4.js.map → edit._key-CbUXCYlN.js.map} +1 -1
  9. package/dist/assets/{edit._sectionKey-CzUa0VJQ.js → edit._sectionKey-BMO2TE-N.js} +3 -3
  10. package/dist/assets/edit._sectionKey-BMO2TE-N.js.map +1 -0
  11. package/dist/assets/{graphql-DdfXEHeY.js → graphql-CmbxpGwL.js} +2 -2
  12. package/dist/assets/{graphql-DdfXEHeY.js.map → graphql-CmbxpGwL.js.map} +1 -1
  13. package/dist/assets/{hierarchy-CDzI93co.js → hierarchy-Bpe_B9GF.js} +2 -2
  14. package/dist/assets/{hierarchy-CDzI93co.js.map → hierarchy-Bpe_B9GF.js.map} +1 -1
  15. package/dist/assets/{index-B4FH7LFi.js → index-BHnPEV23.js} +2 -2
  16. package/dist/assets/{index-B4FH7LFi.js.map → index-BHnPEV23.js.map} +1 -1
  17. package/dist/assets/{index-CY44kpDb.js → index-BVQyr3Nx.js} +2 -2
  18. package/dist/assets/{index-CY44kpDb.js.map → index-BVQyr3Nx.js.map} +1 -1
  19. package/dist/assets/{index-CrqdIwuI.js → index-BWWtHwOB.js} +2 -2
  20. package/dist/assets/{index-CrqdIwuI.js.map → index-BWWtHwOB.js.map} +1 -1
  21. package/dist/assets/{index-Dqz6Um4q.js → index-Bzqwlp87.js} +2 -2
  22. package/dist/assets/{index-Dqz6Um4q.js.map → index-Bzqwlp87.js.map} +1 -1
  23. package/dist/assets/{index-J647aRqJ.js → index-CcwjSjSF.js} +2 -2
  24. package/dist/assets/{index-J647aRqJ.js.map → index-CcwjSjSF.js.map} +1 -1
  25. package/dist/assets/{index-DPSszaVo.js → index-DGB_wag0.js} +2 -2
  26. package/dist/assets/{index-DPSszaVo.js.map → index-DGB_wag0.js.map} +1 -1
  27. package/dist/assets/{index-BX3bI2pu.js → index-DYXfePdM.js} +2 -2
  28. package/dist/assets/{index-BX3bI2pu.js.map → index-DYXfePdM.js.map} +1 -1
  29. package/dist/assets/{index-CbWKfUJC.js → index-D_oO4W9-.js} +3 -3
  30. package/dist/assets/{index-CbWKfUJC.js.map → index-D_oO4W9-.js.map} +1 -1
  31. package/dist/assets/{index-CnjpKwrb.js → index-Dy6-62Gh.js} +2 -2
  32. package/dist/assets/{index-CnjpKwrb.js.map → index-Dy6-62Gh.js.map} +1 -1
  33. package/dist/assets/{index-Du_dKa1V.js → index-se7yDVhq.js} +2 -2
  34. package/dist/assets/{index-Du_dKa1V.js.map → index-se7yDVhq.js.map} +1 -1
  35. package/dist/assets/new-admin-section-dialog-CSdEVfng.js +2 -0
  36. package/dist/assets/new-admin-section-dialog-CSdEVfng.js.map +1 -0
  37. package/dist/assets/{new-app-dialog-Cq8PNS8v.js → new-app-dialog-BbdhVL-K.js} +2 -2
  38. package/dist/assets/{new-app-dialog-Cq8PNS8v.js.map → new-app-dialog-BbdhVL-K.js.map} +1 -1
  39. package/dist/assets/{new-enum-dialog-BWIaNTlE.js → new-enum-dialog-DBsZ31Qk.js} +2 -2
  40. package/dist/assets/{new-enum-dialog-BWIaNTlE.js.map → new-enum-dialog-DBsZ31Qk.js.map} +1 -1
  41. package/dist/assets/{new-model-dialog-Dmjtg093.js → new-model-dialog-D7GR7RYc.js} +2 -2
  42. package/dist/assets/{new-model-dialog-Dmjtg093.js.map → new-model-dialog-D7GR7RYc.js.map} +1 -1
  43. package/dist/assets/{route-CHzFreT1.js → route-BAWVfLAO.js} +2 -2
  44. package/dist/assets/{route-CHzFreT1.js.map → route-BAWVfLAO.js.map} +1 -1
  45. package/dist/assets/{route-CJt9Kcj2.js → route-C-Q8OXV_.js} +2 -2
  46. package/dist/assets/{route-CJt9Kcj2.js.map → route-C-Q8OXV_.js.map} +1 -1
  47. package/dist/assets/{route-CcnDgWSF.js → route-C4bxAHlh.js} +2 -2
  48. package/dist/assets/{route-CcnDgWSF.js.map → route-C4bxAHlh.js.map} +1 -1
  49. package/dist/assets/{route-BtOjnFqC.js → route-C50RIYiW.js} +2 -2
  50. package/dist/assets/{route-BtOjnFqC.js.map → route-C50RIYiW.js.map} +1 -1
  51. package/dist/assets/{route-0OUHvfVW.js → route-CQL0eFxq.js} +2 -2
  52. package/dist/assets/{route-0OUHvfVW.js.map → route-CQL0eFxq.js.map} +1 -1
  53. package/dist/assets/{route-DCltd14u.js → route-CbQuaf1D.js} +2 -2
  54. package/dist/assets/{route-DCltd14u.js.map → route-CbQuaf1D.js.map} +1 -1
  55. package/dist/assets/{route-Ba6FCjmw.js → route-CxZgbEF9.js} +2 -2
  56. package/dist/assets/{route-Ba6FCjmw.js.map → route-CxZgbEF9.js.map} +1 -1
  57. package/dist/assets/{route-Dtm2QvWW.js → route-D3d4wtgj.js} +2 -2
  58. package/dist/assets/{route-Dtm2QvWW.js.map → route-D3d4wtgj.js.map} +1 -1
  59. package/dist/assets/{route-DPE1Borc.js → route-QaYF1pZz.js} +2 -2
  60. package/dist/assets/{route-DPE1Borc.js.map → route-QaYF1pZz.js.map} +1 -1
  61. package/dist/assets/route-aXTz8_pd.js +2 -0
  62. package/dist/assets/{route-Fld55OGo.js.map → route-aXTz8_pd.js.map} +1 -1
  63. package/dist/assets/{service-Coa_-vZM.js → service-Dm83TP3v.js} +2 -2
  64. package/dist/assets/{service-Coa_-vZM.js.map → service-Dm83TP3v.js.map} +1 -1
  65. package/dist/assets/{template-extractor-CBtzqlLB.js → template-extractor-CNC2N5ui.js} +2 -2
  66. package/dist/assets/{template-extractor-CBtzqlLB.js.map → template-extractor-CNC2N5ui.js.map} +1 -1
  67. package/dist/assets/{theme-builder-CaB_l2dA.js → theme-builder-DkvYEnNa.js} +2 -2
  68. package/dist/assets/{theme-builder-CaB_l2dA.js.map → theme-builder-DkvYEnNa.js.map} +1 -1
  69. package/dist/assets/{use-enum-form-noNDSWbe.js → use-enum-form-JpYvWXon.js} +2 -2
  70. package/dist/assets/{use-enum-form-noNDSWbe.js.map → use-enum-form-JpYvWXon.js.map} +1 -1
  71. package/dist/assets/{use-model-form-B32BYlq7.js → use-model-form-DMJkeWdJ.js} +2 -2
  72. package/dist/assets/{use-model-form-B32BYlq7.js.map → use-model-form-DMJkeWdJ.js.map} +1 -1
  73. package/dist/index.html +1 -1
  74. package/package.json +6 -6
  75. package/dist/assets/edit._sectionKey-CzUa0VJQ.js.map +0 -1
  76. package/dist/assets/new-admin-section-dialog-Ct76iG3g.js +0 -2
  77. package/dist/assets/new-admin-section-dialog-Ct76iG3g.js.map +0 -1
  78. package/dist/assets/route-Fld55OGo.js +0 -2
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@baseplate-dev/project-builder-web",
3
- "version": "0.3.2",
3
+ "version": "0.3.3",
4
4
  "description": "Web interface for constructing project builder JSON",
5
5
  "keywords": [
6
6
  "react",
@@ -71,9 +71,9 @@
71
71
  "semver": "^7.5.4",
72
72
  "zod": "3.24.1",
73
73
  "zustand": "5.0.3",
74
- "@baseplate-dev/project-builder-lib": "0.3.2",
75
- "@baseplate-dev/ui-components": "0.3.2",
76
- "@baseplate-dev/utils": "0.3.2"
74
+ "@baseplate-dev/project-builder-lib": "0.3.3",
75
+ "@baseplate-dev/ui-components": "0.3.3",
76
+ "@baseplate-dev/utils": "0.3.3"
77
77
  },
78
78
  "devDependencies": {
79
79
  "@originjs/vite-plugin-federation": "1.3.6",
@@ -92,8 +92,8 @@
92
92
  "vite": "6.3.5",
93
93
  "vite-plugin-svgr": "4.3.0",
94
94
  "vitest": "3.2.4",
95
- "@baseplate-dev/project-builder-server": "0.3.2",
96
- "@baseplate-dev/tools": "0.3.2"
95
+ "@baseplate-dev/project-builder-server": "0.3.3",
96
+ "@baseplate-dev/tools": "0.3.3"
97
97
  },
98
98
  "engines": {
99
99
  "node": "^22.0.0"
@@ -1 +0,0 @@
1
- {"version":3,"mappings":"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","names":["LensCore","_LensCore","control","path","cache","prop","_a","_b","_c","_d","_e","_f","propString","nestedPath","fromCache","template","result2","overriddenLens","get","arrayItemNestedPath","result","getter","dictionary","target","override","fields","mapper","value","index","array","item","cb","newValue","key","valueTemplate","restructuredLens","v","set","value2","LensesStorage","name","complexKey","cached","lens","useMemo","importShared","useLens","props","deps","ModelUtils","createAdminCrudInputWebConfig","useProjectDefinition","SelectFieldController","AdminCrudEmbeddedInputForm","formProps","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","createAdminCrudInputSchema","adminCrudInputWebSpec","useDefinitionSchema","Button","Dialog","DialogContent","DialogDescription","DialogFooter","DialogHeader","DialogTitle","useId","FieldDialog","open","onOpenChange","modelRef","isNew","onSave","pluginContainer","fieldSchema","inputWeb","fieldTypeOptions","config","form","useForm","zodResolver","handleSubmit","isDirty","fieldType","useWatch","inputWebConfig","WebForm","onSubmit","data","formId","e","RecordView","RecordViewActions","RecordViewItem","RecordViewItemList","useConfirmDialog","useState","CrudFormFieldsForm","className","requestConfirm","append","remove","update","useFieldArray","editingField","setEditingField","isEditing","setIsEditing","isCreating","setIsCreating","formFields","handleDeleteField","fieldIdx","handleEditField","handleCreateField","handleSaveField","fieldData","existingIndex","clsx","idx","MdEdit","MdDeleteOutline","MdAdd","original","useFieldArrayOriginal","options","adminCrudColumnEntityType","createAdminCrudColumnWebConfig","ForeignColumnForm","adminCrudForeignColumnWebConfig","modelId","m","TextColumnForm","adminCrudTextColumnWebConfig","BUILT_IN_ADMIN_CRUD_COLUMN_WEB_CONFIGS","createAdminCrudColumnSchema","adminCrudColumnWebSpec","ColumnDialog","column","columnSchema","columnWeb","columnTypeOptions","columnType","columnWebConfig","CrudTableColumnsForm","move","editingColumn","setEditingColumn","handleDeleteColumn","columnIdx","columns","handleEditColumn","handleCreateColumn","handleSaveColumn","columnData","columnListItems","SortableList","createAdminCrudEmbeddedFormSchema","CheckboxFieldController","Table","TableBody","TableCell","TableHead","TableHeader","TableRow","toast","AdminCrudEmbeddedTable","items","edit","TYPE_OPTIONS","AdminCrudEmbeddedForm","initialData","adminCrudEmbeddedFormSchema","watch","modelOptions","type","error","logAndFormatError","createAdminCrudActionWebConfig","adminCrudDeleteActionWebConfig","adminCrudEditActionWebConfig","BUILT_IN_ADMIN_CRUD_ACTION_WEB_CONFIGS","createAdminCrudActionSchema","adminCrudActionWebSpec","ActionDialog","action","actionSchema","actionWeb","actionTypeOptions","actionType","actionWebConfig","CrudTableActionsForm","editingAction","setEditingAction","handleDeleteAction","actionIdx","actions","handleEditAction","handleCreateAction","handleSaveAction","actionData","actionListItems","ComboboxFieldController","SectionListSection","SectionListSectionContent","SectionListSectionDescription","SectionListSectionHeader","SectionListSectionTitle","AdminCrudSectionForm","nameFieldOptions","EmbeddedListInput","tableProps","AsyncComboboxField","useControllerMerged","fetchIcons","hiIcons","__vitePreload","n","faIcons","mdIcons","bsIcons","icons","ReactIconCombobox","rest","query","option","a","b","ReactIconComboboxController","restProps","adminSectionEntityType","createWebAdminSectionSchema","useBlockUnsavedChangesNavigate","useResettableForm","DialogClose","DialogTrigger","FormActionBar","SectionList","useNavigate","SplitComponent","app","section","Route","useLoaderData","appKey","sectionKey","useParams","navigate","from","fullPath","saveDefinitionWithFeedback","isSavingDefinition","adminSectionSchema","featureOptions","features","map","label","id","resolver","values","defaultValues","reset","_dataId","sectionData","draftConfig","webApp","apps","find","adminApp","sections","findIndex","s","idFromKey","undefined","handleDelete","filter","successMessage","onSuccess","to","params","catch"],"ignoreList":[0,9],"sources":["../../../../node_modules/.pnpm/@hookform+lenses@0.8.1_react-hook-form@7.60.0_react@19.1.0__react@19.1.0/node_modules/@hookform/lenses/dist/index.js","../../src/routes/admin-sections.$appKey/-components/inputs/embedded-input-config.tsx","../../src/routes/admin-sections.$appKey/-components/inputs/embedded-local-input-config.tsx","../../src/routes/admin-sections.$appKey/-components/inputs/enum-input-config.tsx","../../src/routes/admin-sections.$appKey/-components/inputs/foreign-input-config.tsx","../../src/routes/admin-sections.$appKey/-components/inputs/text-input-config.tsx","../../src/routes/admin-sections.$appKey/-components/inputs/index.ts","../../src/routes/admin-sections.$appKey/-components/field-dialog.tsx","../../src/routes/admin-sections.$appKey/-components/crud-form-fields-form.tsx","../../../../node_modules/.pnpm/@hookform+lenses@0.8.1_react-hook-form@7.60.0_react@19.1.0__react@19.1.0/node_modules/@hookform/lenses/dist/rhf/index.js","../../src/routes/admin-sections.$appKey/-components/columns/foreign-column-form.tsx","../../src/routes/admin-sections.$appKey/-components/columns/text-column-form.tsx","../../src/routes/admin-sections.$appKey/-components/columns/column-configs.ts","../../src/routes/admin-sections.$appKey/-components/column-dialog.tsx","../../src/routes/admin-sections.$appKey/-components/crud-table-columns-form.tsx","../../src/routes/admin-sections.$appKey/-components/admin-crud-embedded-form.tsx","../../src/routes/admin-sections.$appKey/-components/actions/delete-action-config.tsx","../../src/routes/admin-sections.$appKey/-components/actions/edit-action-config.tsx","../../src/routes/admin-sections.$appKey/-components/actions/index.ts","../../src/routes/admin-sections.$appKey/-components/action-dialog.tsx","../../src/routes/admin-sections.$appKey/-components/crud-table-actions-form.tsx","../../src/routes/admin-sections.$appKey/-components/admin-crud-section-form.tsx","../../src/routes/admin-sections.$appKey/-components/react-icon-combobox.tsx","../../src/routes/admin-sections.$appKey/edit.$sectionKey.tsx?tsr-split=component"],"sourcesContent":["// src/LensCore.ts\nimport { get, set } from \"react-hook-form\";\nvar LensCore = class _LensCore {\n constructor(control, path, cache) {\n this.control = control;\n this.path = path;\n this.cache = cache;\n }\n static create(control, cache) {\n return new _LensCore(control, \"\", cache);\n }\n focus(prop) {\n var _a, _b, _c, _d, _e, _f;\n const propString = prop.toString();\n const nestedPath = this.path ? `${this.path}.${propString}` : propString;\n const fromCache = (_a = this.cache) == null ? void 0 : _a.get(nestedPath, this.reflectedKey);\n if (fromCache) {\n return fromCache;\n }\n if (Array.isArray(this.override)) {\n const [template] = this.override;\n const result2 = new _LensCore(this.control, nestedPath, this.cache);\n result2.isArrayItemReflection = true;\n result2.override = template;\n (_b = this.cache) == null ? void 0 : _b.set(result2, nestedPath);\n return result2;\n } else if (this.override) {\n const overriddenLens = get(this.override, propString);\n if (!overriddenLens) {\n const result2 = new _LensCore(this.control, nestedPath, this.cache);\n (_c = this.cache) == null ? void 0 : _c.set(result2, nestedPath);\n return result2;\n }\n if (this.isArrayItemReflection) {\n const arrayItemNestedPath = `${this.path}.${overriddenLens.path}`;\n const result2 = new _LensCore(this.control, arrayItemNestedPath, this.cache);\n (_d = this.cache) == null ? void 0 : _d.set(result2, arrayItemNestedPath);\n return result2;\n } else {\n (_e = this.cache) == null ? void 0 : _e.set(overriddenLens, nestedPath);\n return overriddenLens;\n }\n }\n const result = new _LensCore(this.control, nestedPath, this.cache);\n (_f = this.cache) == null ? void 0 : _f.set(result, nestedPath);\n return result;\n }\n reflect(getter) {\n var _a, _b, _c;\n const fromCache = (_a = this.cache) == null ? void 0 : _a.get(this.path, getter);\n if (fromCache) {\n return fromCache;\n }\n const template = new _LensCore(this.control, this.path, this.cache);\n const dictionary = new Proxy(\n {},\n {\n get: (target, prop) => {\n if (typeof prop === \"string\") {\n return template.focus(prop);\n }\n return target;\n }\n }\n );\n const override = getter(dictionary, template);\n if (Array.isArray(override)) {\n const result = new _LensCore(this.control, this.path, this.cache);\n template.path = \"\";\n result.override = getter(dictionary, template);\n result.reflectedKey = getter;\n (_b = this.cache) == null ? void 0 : _b.set(result, this.path, getter);\n return result;\n } else {\n template.override = override;\n template.path = this.path;\n template.reflectedKey = getter;\n (_c = this.cache) == null ? void 0 : _c.set(template, this.path, getter);\n return template;\n }\n }\n map(fields, mapper) {\n return fields.map((value, index, array) => {\n const item = this.focus(index.toString());\n const res = mapper(value, item, index, array, this);\n return res;\n });\n }\n interop(cb) {\n var _a;\n if (cb) {\n return cb(this.control, this.path);\n }\n (_a = this.interopCache) != null ? _a : this.interopCache = {\n control: this.control,\n name: this.path || void 0,\n ...this.override ? { getTransformer: this.getTransformer.bind(this), setTransformer: this.setTransformer.bind(this) } : {}\n };\n return this.interopCache;\n }\n narrow() {\n return this;\n }\n assert() {\n return this;\n }\n defined() {\n return this;\n }\n cast() {\n return this;\n }\n getTransformer(value) {\n const [template] = Array.isArray(this.override) ? this.override : [this.override];\n if (!value || !template) {\n return value;\n }\n const newValue = {};\n Object.entries(template).forEach(([key, valueTemplate]) => {\n const restructuredLens = valueTemplate;\n if (!restructuredLens) {\n return;\n }\n const v = get(value, restructuredLens.path);\n set(newValue, key, v);\n });\n return newValue;\n }\n setTransformer(value) {\n const [template] = Array.isArray(this.override) ? this.override : [this.override];\n if (!value || !template) {\n return value;\n }\n const newValue = {};\n Object.entries(value).forEach(([key, value2]) => {\n const restructuredLens = template[key];\n if (!restructuredLens) {\n return;\n }\n set(newValue, restructuredLens.path, value2);\n });\n return newValue;\n }\n};\n\n// src/LensesStorage.ts\nvar LensesStorage = class {\n constructor(control) {\n this.cache = /* @__PURE__ */ new Map();\n control._subscribe({\n formState: {\n values: true\n },\n exact: true,\n callback: () => {\n control._names.unMount.forEach((name) => {\n this.delete(name);\n });\n }\n });\n }\n get(path, complexKey) {\n const cached = this.cache.get(path);\n if (cached) {\n if (complexKey) {\n return cached.complex.get(complexKey);\n }\n return cached.plain;\n }\n return void 0;\n }\n set(lens, path, complexKey) {\n let cached = this.cache.get(path);\n if (!cached) {\n cached = {\n complex: /* @__PURE__ */ new WeakMap()\n };\n this.cache.set(path, cached);\n }\n if (complexKey) {\n cached.complex.set(complexKey, lens);\n } else {\n cached.plain = lens;\n }\n }\n has(path, complexKey) {\n var _a, _b;\n if (complexKey) {\n return (_b = (_a = this.cache.get(path)) == null ? void 0 : _a.complex.has(complexKey)) != null ? _b : false;\n }\n return this.cache.has(path);\n }\n delete(path) {\n for (const key of this.cache.keys()) {\n if (key.startsWith(path)) {\n this.cache.delete(key);\n }\n }\n }\n clear() {\n this.cache.clear();\n }\n};\n\n// src/useLens.ts\nimport { useMemo } from \"react\";\nfunction useLens(props, deps = []) {\n return useMemo(() => {\n const cache = new LensesStorage(props.control);\n const lens = LensCore.create(props.control, cache);\n return lens;\n }, [props.control, ...deps]);\n}\nexport {\n LensCore,\n LensesStorage,\n useLens\n};\n//# sourceMappingURL=index.js.map","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 pluginKey: 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 pluginKey: 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 pluginKey: 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 pluginKey: 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 pluginKey: 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 {\n AdminCrudInputDefinition,\n AdminCrudInputInput,\n} from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\n\nimport {\n createAdminCrudInputSchema,\n ModelUtils,\n} from '@baseplate-dev/project-builder-lib';\nimport {\n adminCrudInputWebSpec,\n useDefinitionSchema,\n useProjectDefinition,\n} from '@baseplate-dev/project-builder-lib/web';\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n InputFieldController,\n SelectFieldController,\n} from '@baseplate-dev/ui-components';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { useId } from 'react';\nimport { useForm, useWatch } from 'react-hook-form';\n\nimport { BUILT_IN_ADMIN_CRUD_INPUT_WEB_CONFIGS } from './inputs/index.js';\n\ninterface Props {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n field?: AdminCrudInputInput;\n modelRef: string;\n embeddedFormOptions: { label: string; value: string }[];\n isNew?: boolean;\n onSave: (field: AdminCrudInputDefinition) => void;\n}\n\nexport function FieldDialog({\n open,\n onOpenChange,\n field,\n modelRef,\n embeddedFormOptions,\n isNew = false,\n onSave,\n}: Props): React.JSX.Element {\n const { definition, pluginContainer } = useProjectDefinition();\n const fieldSchema = useDefinitionSchema(createAdminCrudInputSchema);\n\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 form = useForm({\n resolver: zodResolver(fieldSchema),\n values: field ?? {\n type: 'text',\n label: '',\n },\n });\n\n const {\n control,\n handleSubmit,\n formState: { isDirty },\n } = form;\n\n const fieldType = useWatch({ control, name: 'type' });\n\n const inputWebConfig = fieldType\n ? inputWeb.getInputWebConfig(\n fieldType,\n BUILT_IN_ADMIN_CRUD_INPUT_WEB_CONFIGS,\n )\n : undefined;\n\n const WebForm = inputWebConfig?.Form;\n\n const onSubmit = handleSubmit((data) => {\n onSave(data);\n onOpenChange(false);\n });\n\n const formId = useId();\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-[500px]\">\n <form\n id={formId}\n onSubmit={(e) => {\n e.stopPropagation();\n return onSubmit(e);\n }}\n >\n <DialogHeader>\n <DialogTitle>{isNew ? 'Add Field' : 'Edit Field'}</DialogTitle>\n <DialogDescription>\n {isNew\n ? 'Configure the new form field settings.'\n : 'Update the field settings below.'}\n </DialogDescription>\n </DialogHeader>\n <div className=\"space-y-4 py-4\">\n <SelectFieldController\n label=\"Type\"\n control={control}\n options={fieldTypeOptions}\n name=\"type\"\n />\n <InputFieldController\n label=\"Label\"\n control={control}\n name=\"label\"\n placeholder=\"Enter field label\"\n />\n {/* Render field-specific configuration */}\n {WebForm && model && (\n <WebForm\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-explicit-any\n formProps={form as any}\n name=\"\"\n model={model}\n embeddedFormOptions={embeddedFormOptions}\n pluginKey={inputWebConfig.pluginKey}\n />\n )}\n </div>\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => {\n onOpenChange(false);\n }}\n >\n Cancel\n </Button>\n <Button form={formId} type=\"submit\" disabled={!isDirty}>\n {isNew ? 'Add' : 'Update'} Field\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n","import type {\n AdminCrudInputDefinition,\n AdminCrudInputInput,\n AdminCrudSectionConfigInput,\n} from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { UseFormReturn } from 'react-hook-form';\n\nimport {\n Button,\n RecordView,\n RecordViewActions,\n RecordViewItem,\n RecordViewItemList,\n useConfirmDialog,\n} from '@baseplate-dev/ui-components';\nimport clsx from 'clsx';\nimport { useState } from 'react';\nimport { useFieldArray, useWatch } from 'react-hook-form';\nimport { MdAdd, MdDeleteOutline, MdEdit } from 'react-icons/md';\n\nimport { FieldDialog } from './field-dialog.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 CrudFormFieldsForm({\n className,\n formProps,\n embeddedFormOptions,\n}: Props): React.JSX.Element {\n const { control } = formProps;\n const { requestConfirm } = useConfirmDialog();\n\n const { fields, append, remove, update } = useFieldArray({\n control,\n name: 'form.fields',\n });\n const [editingField, setEditingField] = useState<\n AdminCrudInputInput | undefined\n >(undefined);\n const [isEditing, setIsEditing] = useState(false);\n const [isCreating, setIsCreating] = useState(false);\n\n const formFields = useWatch({ control, name: 'form.fields' });\n\n function handleDeleteField(fieldIdx: number): void {\n const field = formFields[fieldIdx];\n requestConfirm({\n title: 'Delete Field',\n content: `Are you sure you want to delete the field \"${field.label || 'Untitled'}\"?`,\n onConfirm: () => {\n remove(fieldIdx);\n },\n });\n }\n\n function handleEditField(fieldIdx: number): void {\n setEditingField(formFields[fieldIdx]);\n setIsEditing(true);\n }\n\n function handleCreateField(): void {\n setEditingField(undefined);\n setIsCreating(true);\n }\n\n function handleSaveField(fieldData: AdminCrudInputDefinition): void {\n if (editingField) {\n const existingIndex = formFields.findIndex(\n (field) => field.id === editingField.id,\n );\n if (existingIndex !== -1) {\n update(existingIndex, fieldData);\n }\n } else {\n append(fieldData);\n }\n }\n\n return (\n <div className={clsx('space-y-4', className)}>\n {fields.map((field, idx) => (\n <RecordView key={field.id}>\n <RecordViewItemList>\n <RecordViewItem title=\"Label\">\n <div className=\"flex items-center gap-2\">{field.label}</div>\n </RecordViewItem>\n <RecordViewItem title=\"Type\">{field.type}</RecordViewItem>\n </RecordViewItemList>\n <RecordViewActions>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n title=\"Edit\"\n aria-label=\"Edit field\"\n onClick={() => {\n handleEditField(idx);\n }}\n >\n <MdEdit />\n </Button>\n <Button\n variant=\"ghostDestructive\"\n size=\"icon\"\n title=\"Delete\"\n aria-label=\"Delete field\"\n onClick={() => {\n handleDeleteField(idx);\n }}\n >\n <MdDeleteOutline />\n </Button>\n </RecordViewActions>\n </RecordView>\n ))}\n <FieldDialog\n open={isEditing || isCreating}\n onOpenChange={(open) => {\n if (!open) {\n setIsEditing(false);\n setIsCreating(false);\n setEditingField(undefined);\n }\n }}\n field={editingField}\n modelRef={useWatch({ control, name: 'modelRef' }) || ''}\n embeddedFormOptions={embeddedFormOptions}\n isNew={isCreating}\n onSave={handleSaveField}\n />\n <Button variant=\"secondary\" size=\"sm\" onClick={handleCreateField}>\n <MdAdd />\n Add Field\n </Button>\n </div>\n );\n}\n\nexport default CrudFormFieldsForm;\n","// src/rhf/useFieldArray.ts\nimport { useMemo } from \"react\";\nimport {\n useFieldArray as useFieldArrayOriginal\n} from \"react-hook-form\";\nfunction useFieldArray(props) {\n const original = useFieldArrayOriginal(props);\n const newFields = useMemo(() => {\n if (!props.getTransformer) {\n return original.fields;\n }\n return original.fields.map(props.getTransformer);\n }, [original.fields, props.getTransformer]);\n return {\n fields: newFields,\n move: original.move,\n remove: original.remove,\n swap: original.swap,\n prepend: (value, options) => {\n if (!props.setTransformer) {\n return original.prepend(value, options);\n }\n const newValue = Array.isArray(value) ? value.map(props.setTransformer) : props.setTransformer(value);\n original.prepend(newValue, options);\n },\n append: (value, options) => {\n if (!props.setTransformer) {\n return original.append(value, options);\n }\n const newValue = Array.isArray(value) ? value.map(props.setTransformer) : props.setTransformer(value);\n original.append(newValue, options);\n },\n insert: (index, value, options) => {\n if (!props.setTransformer) {\n return original.insert(index, value, options);\n }\n const newValue = Array.isArray(value) ? value.map(props.setTransformer) : props.setTransformer(value);\n original.insert(index, newValue, options);\n },\n update: (index, value) => {\n if (!props.setTransformer) {\n return original.update(index, value);\n }\n const newValue = props.setTransformer(value);\n original.update(index, newValue);\n },\n replace: (value) => {\n if (!props.setTransformer) {\n return original.replace(value);\n }\n const newValue = props.setTransformer(value);\n original.replace(newValue);\n }\n };\n}\nexport {\n useFieldArray\n};\n//# sourceMappingURL=index.js.map","import type { AdminCrudForeignColumnInput } from '@baseplate-dev/project-builder-lib';\nimport type { AdminCrudColumnWebFormProps } from '@baseplate-dev/project-builder-lib/web';\nimport type React from 'react';\n\nimport { adminCrudColumnEntityType } from '@baseplate-dev/project-builder-lib';\nimport {\n createAdminCrudColumnWebConfig,\n useProjectDefinition,\n} from '@baseplate-dev/project-builder-lib/web';\nimport {\n InputFieldController,\n SelectFieldController,\n} from '@baseplate-dev/ui-components';\n\nfunction ForeignColumnForm({\n formProps,\n model,\n}: AdminCrudColumnWebFormProps<AdminCrudForeignColumnInput>): React.JSX.Element {\n const { control } = formProps;\n const { definitionContainer } = useProjectDefinition();\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 return (\n <>\n <SelectFieldController\n label=\"Local Relation\"\n control={control}\n name=\"localRelationRef\"\n options={localRelationOptions}\n placeholder=\"Select a relation\"\n />\n <InputFieldController\n label=\"Label Expression\"\n control={control}\n name=\"labelExpression\"\n placeholder=\"e.g. name\"\n description=\"Field to display from the related model\"\n />\n <InputFieldController\n label=\"Value Expression\"\n control={control}\n name=\"valueExpression\"\n placeholder=\"e.g. id\"\n description=\"Field to use for matching the relation\"\n />\n </>\n );\n}\n\nexport const adminCrudForeignColumnWebConfig =\n createAdminCrudColumnWebConfig<AdminCrudForeignColumnInput>({\n name: 'foreign',\n pluginKey: undefined,\n label: 'Foreign Column',\n isAvailableForModel: (definition, modelId) => {\n // Foreign columns are available if the model has relations\n const model = definition.models.find((m) => m.id === modelId);\n return (model?.model.relations?.length ?? 0) > 0;\n },\n Form: ForeignColumnForm,\n getNewColumn: () => ({\n id: adminCrudColumnEntityType.generateNewId(),\n type: 'foreign' as const,\n label: '',\n localRelationRef: '',\n labelExpression: '',\n valueExpression: '',\n }),\n });\n","import type { AdminCrudTextColumnInput } from '@baseplate-dev/project-builder-lib';\nimport type { AdminCrudColumnWebFormProps } from '@baseplate-dev/project-builder-lib/web';\nimport type React from 'react';\n\nimport { adminCrudColumnEntityType } from '@baseplate-dev/project-builder-lib';\nimport { createAdminCrudColumnWebConfig } from '@baseplate-dev/project-builder-lib/web';\nimport { SelectFieldController } from '@baseplate-dev/ui-components';\n\nfunction TextColumnForm({\n formProps,\n model,\n}: AdminCrudColumnWebFormProps<AdminCrudTextColumnInput>): React.JSX.Element {\n const { control } = formProps;\n\n const fieldOptions = model.model.fields.map((field) => ({\n label: field.name,\n value: field.id,\n }));\n\n return (\n <SelectFieldController\n label=\"Field\"\n control={control}\n name=\"modelFieldRef\"\n options={fieldOptions}\n placeholder=\"Select a field\"\n />\n );\n}\n\nexport const adminCrudTextColumnWebConfig =\n createAdminCrudColumnWebConfig<AdminCrudTextColumnInput>({\n name: 'text',\n pluginKey: undefined,\n label: 'Text Column',\n Form: TextColumnForm,\n isAvailableForModel: () => true,\n getNewColumn: () => ({\n id: adminCrudColumnEntityType.generateNewId(),\n type: 'text' as const,\n label: '',\n modelFieldRef: '',\n }),\n });\n","import { adminCrudForeignColumnWebConfig } from './foreign-column-form';\nimport { adminCrudTextColumnWebConfig } from './text-column-form';\n\nexport const BUILT_IN_ADMIN_CRUD_COLUMN_WEB_CONFIGS = [\n adminCrudForeignColumnWebConfig,\n adminCrudTextColumnWebConfig,\n];\n","import type {\n AdminCrudColumnDefinition,\n AdminCrudColumnInput,\n} from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\n\nimport {\n createAdminCrudColumnSchema,\n ModelUtils,\n} from '@baseplate-dev/project-builder-lib';\nimport {\n adminCrudColumnWebSpec,\n useDefinitionSchema,\n useProjectDefinition,\n} from '@baseplate-dev/project-builder-lib/web';\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n InputFieldController,\n SelectFieldController,\n} from '@baseplate-dev/ui-components';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { useId } from 'react';\nimport { useForm, useWatch } from 'react-hook-form';\n\nimport { BUILT_IN_ADMIN_CRUD_COLUMN_WEB_CONFIGS } from './columns/index.js';\n\ninterface Props {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n column?: AdminCrudColumnInput;\n modelRef: string;\n isNew?: boolean;\n onSave: (column: AdminCrudColumnDefinition) => void;\n}\n\nexport function ColumnDialog({\n open,\n onOpenChange,\n column,\n modelRef,\n isNew = false,\n onSave,\n}: Props): React.JSX.Element {\n const { definition, pluginContainer } = useProjectDefinition();\n const columnSchema = useDefinitionSchema(createAdminCrudColumnSchema);\n\n const model = modelRef\n ? ModelUtils.byIdOrThrow(definition, modelRef)\n : undefined;\n\n const columnWeb = pluginContainer.getPluginSpec(adminCrudColumnWebSpec);\n\n const columnTypeOptions = columnWeb\n .getColumnWebConfigs(BUILT_IN_ADMIN_CRUD_COLUMN_WEB_CONFIGS)\n .filter((config) => config.isAvailableForModel(definition, modelRef))\n .map((config) => ({\n label: config.label,\n value: config.name,\n }));\n\n const form = useForm({\n resolver: zodResolver(columnSchema),\n values: column ?? {\n type: 'text',\n label: '',\n },\n });\n\n const {\n control,\n handleSubmit,\n formState: { isDirty },\n } = form;\n\n const columnType = useWatch({ control, name: 'type' });\n\n const columnWebConfig = columnType\n ? columnWeb.getColumnWebConfig(\n columnType,\n BUILT_IN_ADMIN_CRUD_COLUMN_WEB_CONFIGS,\n )\n : undefined;\n\n const WebForm = columnWebConfig?.Form;\n\n const onSubmit = handleSubmit((data) => {\n onSave(data);\n onOpenChange(false);\n });\n\n const formId = useId();\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-[425px]\">\n <form\n id={formId}\n onSubmit={(e) => {\n e.stopPropagation();\n return onSubmit(e);\n }}\n >\n <DialogHeader>\n <DialogTitle>{isNew ? 'Add Column' : 'Edit Column'}</DialogTitle>\n <DialogDescription>\n {isNew\n ? 'Configure the new table column settings.'\n : 'Update the column settings below.'}\n </DialogDescription>\n </DialogHeader>\n <div className=\"space-y-4 py-4\">\n <SelectFieldController\n label=\"Type\"\n control={control}\n options={columnTypeOptions}\n name=\"type\"\n />\n <InputFieldController\n label=\"Label\"\n control={control}\n name=\"label\"\n placeholder=\"Enter column label\"\n />\n {/* Render column-specific configuration */}\n {WebForm && model && (\n <WebForm\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-explicit-any\n formProps={form as any}\n model={model}\n pluginKey={columnWebConfig.pluginKey}\n />\n )}\n </div>\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => {\n onOpenChange(false);\n }}\n >\n Cancel\n </Button>\n <Button form={formId} type=\"submit\" disabled={!isDirty}>\n {isNew ? 'Add' : 'Update'} Column\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n","import type {\n AdminCrudColumnDefinition,\n AdminCrudColumnInput,\n} from '@baseplate-dev/project-builder-lib';\nimport type { Lens } from '@hookform/lenses';\nimport type React from 'react';\n\nimport {\n Button,\n RecordView,\n RecordViewActions,\n RecordViewItem,\n RecordViewItemList,\n useConfirmDialog,\n} from '@baseplate-dev/ui-components';\nimport { useFieldArray } from '@hookform/lenses/rhf';\nimport clsx from 'clsx';\nimport { useState } from 'react';\nimport { useWatch } from 'react-hook-form';\nimport { MdAdd, MdDeleteOutline, MdEdit } from 'react-icons/md';\n\nimport { SortableList } from '#src/components/index.js';\n\nimport { ColumnDialog } from './column-dialog.js';\n\ninterface Props {\n className?: string;\n lens: Lens<AdminCrudColumnInput[]>;\n modelRef: string;\n}\n\nfunction CrudTableColumnsForm({\n className,\n lens,\n modelRef,\n}: Props): React.JSX.Element {\n const { requestConfirm } = useConfirmDialog();\n\n const { fields, append, remove, update, move } = useFieldArray(\n lens.interop(),\n );\n const [editingColumn, setEditingColumn] = useState<\n AdminCrudColumnInput | undefined\n >(undefined);\n const [isEditing, setIsEditing] = useState(false);\n const [isCreating, setIsCreating] = useState(false);\n\n function handleDeleteColumn(columnIdx: number): void {\n const column = fields[columnIdx];\n requestConfirm({\n title: 'Delete Column',\n content: `Are you sure you want to delete the column \"${column.label || 'Untitled'}\"?`,\n onConfirm: () => {\n remove(columnIdx);\n },\n });\n }\n\n const columns = useWatch(lens.interop());\n\n function handleEditColumn(columnIdx: number): void {\n setEditingColumn(columns[columnIdx]);\n setIsEditing(true);\n }\n\n function handleCreateColumn(): void {\n setEditingColumn(undefined);\n setIsCreating(true);\n }\n\n function handleSaveColumn(columnData: AdminCrudColumnDefinition): void {\n if (editingColumn) {\n const existingIndex = columns.findIndex(\n (field) => field.id === editingColumn.id,\n );\n if (existingIndex !== -1) {\n update(existingIndex, columnData);\n }\n } else {\n append(columnData);\n }\n }\n\n const columnListItems = fields.map((field, idx) => ({\n id: field.id,\n element: (\n <RecordView key={field.id}>\n <RecordViewItemList>\n <RecordViewItem title=\"Label\">\n <div className=\"flex items-center gap-2\">\n <span>\n {field.label || (\n <span className=\"text-muted-foreground\">Untitled Column</span>\n )}\n </span>\n </div>\n </RecordViewItem>\n <RecordViewItem title=\"Type\">{field.type}</RecordViewItem>\n </RecordViewItemList>\n <RecordViewActions>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n title=\"Edit\"\n aria-label=\"Edit column\"\n onClick={() => {\n handleEditColumn(idx);\n }}\n >\n <MdEdit />\n </Button>\n <Button\n variant=\"ghostDestructive\"\n size=\"icon\"\n title=\"Delete\"\n aria-label=\"Delete column\"\n onClick={() => {\n handleDeleteColumn(idx);\n }}\n >\n <MdDeleteOutline />\n </Button>\n </RecordViewActions>\n </RecordView>\n ),\n }));\n\n return (\n <div className={clsx('space-y-4', className)}>\n {fields.length === 0 ? (\n <p className=\"pt-4 text-style-muted\">\n No columns configured. Add columns to display data in your table.\n </p>\n ) : (\n <div className=\"flex w-full flex-col gap-2\">\n <SortableList listItems={columnListItems} sortItems={move} />\n </div>\n )}\n <ColumnDialog\n open={isEditing || isCreating}\n onOpenChange={(open) => {\n if (!open) {\n setIsEditing(false);\n setIsCreating(false);\n setEditingColumn(undefined);\n }\n }}\n column={editingColumn}\n modelRef={modelRef}\n isNew={isCreating}\n onSave={handleSaveColumn}\n />\n <Button variant=\"secondary\" size=\"sm\" onClick={handleCreateColumn}>\n <MdAdd />\n Add Column\n </Button>\n </div>\n );\n}\n\nexport default CrudTableColumnsForm;\n","import type {\n AdminCrudColumnInput,\n AdminCrudEmbeddedFormConfigInput,\n} from '@baseplate-dev/project-builder-lib';\nimport type { Lens } from '@hookform/lenses';\nimport type React from 'react';\nimport type { 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 { useLens } from '@hookform/lenses';\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';\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 const modelRef = watch('modelRef');\n const lens = useLens({ control });\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 lens={\n // not sure why but the typings don't work as expected\n lens.focus('table.columns') as unknown as Lens<\n AdminCrudColumnInput[]\n >\n }\n modelRef={modelRef}\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 { AdminCrudDeleteActionConfig } from '@baseplate-dev/project-builder-lib';\n\nimport { createAdminCrudActionWebConfig } from '@baseplate-dev/project-builder-lib/web';\n\nexport const adminCrudDeleteActionWebConfig =\n createAdminCrudActionWebConfig<AdminCrudDeleteActionConfig>({\n name: 'delete',\n pluginKey: undefined,\n label: 'Delete',\n isAvailableForModel: () => true,\n getNewAction: () => ({ type: 'delete', position: 'dropdown' }),\n });\n","import type { AdminCrudEditActionConfig } from '@baseplate-dev/project-builder-lib';\n\nimport { createAdminCrudActionWebConfig } from '@baseplate-dev/project-builder-lib/web';\n\nexport const adminCrudEditActionWebConfig =\n createAdminCrudActionWebConfig<AdminCrudEditActionConfig>({\n name: 'edit',\n pluginKey: undefined,\n label: 'Edit',\n isAvailableForModel: () => true,\n getNewAction: () => ({ type: 'edit', position: 'inline' }),\n });\n","import { adminCrudDeleteActionWebConfig } from './delete-action-config.js';\nimport { adminCrudEditActionWebConfig } from './edit-action-config.js';\n\nexport const BUILT_IN_ADMIN_CRUD_ACTION_WEB_CONFIGS = [\n adminCrudEditActionWebConfig,\n adminCrudDeleteActionWebConfig,\n];\n","import type {\n AdminCrudActionDefinition,\n AdminCrudActionInput,\n} from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\n\nimport {\n createAdminCrudActionSchema,\n ModelUtils,\n} from '@baseplate-dev/project-builder-lib';\nimport {\n adminCrudActionWebSpec,\n useDefinitionSchema,\n useProjectDefinition,\n} from '@baseplate-dev/project-builder-lib/web';\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n SelectFieldController,\n} from '@baseplate-dev/ui-components';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { useId } from 'react';\nimport { useForm, useWatch } from 'react-hook-form';\n\nimport { BUILT_IN_ADMIN_CRUD_ACTION_WEB_CONFIGS } from './actions/index.js';\n\ninterface Props {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n action?: AdminCrudActionInput;\n modelRef: string;\n isNew?: boolean;\n onSave: (action: AdminCrudActionDefinition) => void;\n}\n\nexport function ActionDialog({\n open,\n onOpenChange,\n action,\n modelRef,\n isNew = false,\n onSave,\n}: Props): React.JSX.Element {\n const { definition, pluginContainer } = useProjectDefinition();\n const actionSchema = useDefinitionSchema(createAdminCrudActionSchema);\n\n const model = modelRef\n ? ModelUtils.byIdOrThrow(definition, modelRef)\n : undefined;\n\n const actionWeb = pluginContainer.getPluginSpec(adminCrudActionWebSpec);\n\n const actionTypeOptions = actionWeb\n .getActionWebConfigs(BUILT_IN_ADMIN_CRUD_ACTION_WEB_CONFIGS)\n .filter((config) => config.isAvailableForModel(definition, modelRef))\n .map((config) => ({\n label: config.label,\n value: config.name,\n }));\n\n const form = useForm({\n resolver: zodResolver(actionSchema),\n values: action ?? {\n type: 'edit',\n position: 'inline' as const,\n },\n });\n\n const {\n control,\n handleSubmit,\n formState: { isDirty },\n } = form;\n\n const actionType = useWatch({ control, name: 'type' });\n\n const actionWebConfig = actionType\n ? actionWeb.getActionWebConfig(\n actionType,\n BUILT_IN_ADMIN_CRUD_ACTION_WEB_CONFIGS,\n )\n : undefined;\n\n const WebForm = actionWebConfig?.Form;\n\n const onSubmit = handleSubmit((data) => {\n onSave(data);\n onOpenChange(false);\n });\n\n const formId = useId();\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-[500px]\">\n <form\n id={formId}\n onSubmit={(e) => {\n e.stopPropagation();\n return onSubmit(e);\n }}\n >\n <DialogHeader>\n <DialogTitle>{isNew ? 'Add Action' : 'Edit Action'}</DialogTitle>\n <DialogDescription>\n {isNew\n ? 'Configure the new table action settings.'\n : 'Update the action settings below.'}\n </DialogDescription>\n </DialogHeader>\n <div className=\"space-y-4 py-4\">\n <SelectFieldController\n label=\"Type\"\n control={control}\n options={actionTypeOptions}\n name=\"type\"\n />\n <SelectFieldController\n label=\"Position\"\n control={control}\n options={[\n { label: 'Inline', value: 'inline' },\n { label: 'Dropdown', value: 'dropdown' },\n ]}\n name=\"position\"\n />\n {/* Render action-specific configuration */}\n {WebForm && model && (\n <WebForm\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-explicit-any\n formProps={form as any}\n model={model}\n pluginKey={actionWebConfig.pluginKey}\n />\n )}\n </div>\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => {\n onOpenChange(false);\n }}\n >\n Cancel\n </Button>\n <Button form={formId} type=\"submit\" disabled={!isDirty}>\n {isNew ? 'Add' : 'Update'} Action\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n","import type {\n AdminCrudActionDefinition,\n AdminCrudSectionConfig,\n} from '@baseplate-dev/project-builder-lib';\nimport type React from 'react';\nimport type { Control } from 'react-hook-form';\n\nimport {\n Button,\n RecordView,\n RecordViewActions,\n RecordViewItem,\n RecordViewItemList,\n useConfirmDialog,\n} from '@baseplate-dev/ui-components';\nimport clsx from 'clsx';\nimport { useState } from 'react';\nimport { useFieldArray, useWatch } from 'react-hook-form';\nimport { MdAdd, MdDeleteOutline, MdEdit } from 'react-icons/md';\n\nimport { SortableList } from '#src/components/index.js';\n\nimport { ActionDialog } from './action-dialog.js';\n\nexport type AdminCrudActionsConfig = Pick<\n AdminCrudSectionConfig,\n 'table' | 'modelRef'\n>;\n\ninterface Props {\n className?: string;\n control: Control<AdminCrudActionsConfig>;\n modelRef: string | undefined;\n}\n\nfunction CrudTableActionsForm({\n className,\n control,\n modelRef,\n}: Props): React.JSX.Element {\n const { requestConfirm } = useConfirmDialog();\n\n const { fields, append, remove, update, move } = useFieldArray({\n control,\n name: 'table.actions',\n });\n\n const [editingAction, setEditingAction] = useState<\n AdminCrudActionDefinition | undefined\n >(undefined);\n const [isEditing, setIsEditing] = useState(false);\n const [isCreating, setIsCreating] = useState(false);\n\n function handleDeleteAction(actionIdx: number): void {\n const action = fields[actionIdx];\n requestConfirm({\n title: 'Delete Action',\n content: `Are you sure you want to delete the \"${action.type}\" action?`,\n onConfirm: () => {\n remove(actionIdx);\n },\n });\n }\n\n const actions = useWatch({ control, name: 'table.actions' });\n\n function handleEditAction(actionIdx: number): void {\n setEditingAction(actions?.[actionIdx]);\n setIsEditing(true);\n }\n\n function handleCreateAction(): void {\n setEditingAction(undefined);\n setIsCreating(true);\n }\n\n function handleSaveAction(actionData: AdminCrudActionDefinition): void {\n if (editingAction) {\n const existingIndex = (actions ?? []).findIndex(\n (action) => action.id === editingAction.id,\n );\n if (existingIndex !== -1) {\n update(existingIndex, actionData);\n }\n } else {\n append(actionData);\n }\n }\n\n const actionListItems = fields.map((field, idx) => ({\n id: field.id,\n element: (\n <RecordView key={field.id}>\n <RecordViewItemList>\n <RecordViewItem title=\"Type\">\n <div className=\"flex items-center gap-2\">\n <span className=\"capitalize\">{field.type}</span>\n </div>\n </RecordViewItem>\n <RecordViewItem title=\"Position\">{field.position}</RecordViewItem>\n </RecordViewItemList>\n <RecordViewActions>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n title=\"Edit\"\n aria-label=\"Edit action\"\n onClick={() => {\n handleEditAction(idx);\n }}\n >\n <MdEdit />\n </Button>\n <Button\n variant=\"ghostDestructive\"\n size=\"icon\"\n title=\"Delete\"\n aria-label=\"Delete action\"\n onClick={() => {\n handleDeleteAction(idx);\n }}\n >\n <MdDeleteOutline />\n </Button>\n </RecordViewActions>\n </RecordView>\n ),\n }));\n\n return (\n <div className={clsx('space-y-4', className)}>\n {fields.length === 0 ? (\n <p className=\"pt-4 text-style-muted\">\n No actions configured. Add actions to enable row operations.\n </p>\n ) : (\n <div className=\"flex w-full flex-col gap-2\">\n <SortableList listItems={actionListItems} sortItems={move} />\n </div>\n )}\n <ActionDialog\n open={isEditing || isCreating}\n onOpenChange={(open) => {\n if (!open) {\n setIsEditing(false);\n setIsCreating(false);\n setEditingAction(undefined);\n }\n }}\n action={editingAction}\n modelRef={modelRef ?? ''}\n isNew={isCreating}\n onSave={handleSaveAction}\n />\n <Button variant=\"secondary\" size=\"sm\" onClick={handleCreateAction}>\n <MdAdd />\n Add Action\n </Button>\n </div>\n );\n}\n\nexport default CrudTableActionsForm;\n","import type {\n AdminCrudColumnInput,\n AdminCrudSectionConfigInput,\n} from '@baseplate-dev/project-builder-lib';\nimport type { Lens } from '@hookform/lenses';\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 ComboboxFieldController,\n SectionListSection,\n SectionListSectionContent,\n SectionListSectionDescription,\n SectionListSectionHeader,\n SectionListSectionTitle,\n} from '@baseplate-dev/ui-components';\nimport { useLens } from '@hookform/lenses';\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 { AdminCrudActionsConfig } from './crud-table-actions-form.js';\n\nimport AdminCrudEmbeddedForm, {\n AdminCrudEmbeddedTable,\n} from './admin-crud-embedded-form.js';\nimport CrudFormFieldsForm from './crud-form-fields-form.js';\nimport CrudTableActionsForm from './crud-table-actions-form.js';\nimport CrudTableColumnsForm from './crud-table-columns-form.js';\n\ninterface Props {\n formProps: UseFormReturn<AdminCrudSectionConfigInput>;\n}\n\nfunction AdminCrudSectionForm({ formProps }: Props): React.JSX.Element {\n const { control } = formProps;\n const { definition } = useProjectDefinition();\n const lens = useLens({ control });\n\n const modelOptions = definition.models.map((model) => ({\n label: model.name,\n value: model.id,\n }));\n\n const modelId = useWatch({\n control,\n name: 'modelRef',\n });\n\n const nameFieldOptions =\n definition.models\n .find((m) => m.id === modelId)\n ?.model.fields.map((field) => ({\n label: field.name,\n value: field.id,\n })) ?? [];\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 <>\n <SectionListSection>\n <SectionListSectionHeader>\n <SectionListSectionTitle>Model Configuration</SectionListSectionTitle>\n <SectionListSectionDescription>\n Configure the data model and basic settings for this CRUD section.\n </SectionListSectionDescription>\n </SectionListSectionHeader>\n <SectionListSectionContent className=\"space-y-6\">\n <ComboboxFieldController\n label=\"Model\"\n control={control}\n options={modelOptions}\n name=\"modelRef\"\n />\n <ComboboxFieldController\n label=\"Name Field\"\n control={control}\n options={nameFieldOptions}\n description=\"The field to use as the name of the record (used in breadcrumbs/title of edit page)\"\n name=\"nameFieldRef\"\n />\n <CheckboxFieldController\n label=\"Disable Create?\"\n control={control}\n name=\"disableCreate\"\n />\n </SectionListSectionContent>\n </SectionListSection>\n\n <SectionListSection>\n <SectionListSectionHeader>\n <SectionListSectionTitle>Table Configuration</SectionListSectionTitle>\n <SectionListSectionDescription>\n Configure which columns to display in the data table.\n </SectionListSectionDescription>\n </SectionListSectionHeader>\n <SectionListSectionContent>\n <CrudTableColumnsForm\n lens={\n // not sure why but the typings don't work as expected\n lens.focus('table.columns') as unknown as Lens<\n AdminCrudColumnInput[]\n >\n }\n modelRef={modelId}\n />\n </SectionListSectionContent>\n </SectionListSection>\n\n <SectionListSection>\n <SectionListSectionHeader>\n <SectionListSectionTitle>Table Actions</SectionListSectionTitle>\n <SectionListSectionDescription>\n Configure actions available for each row in the table. Drag to\n reorder.\n </SectionListSectionDescription>\n </SectionListSectionHeader>\n <SectionListSectionContent>\n <CrudTableActionsForm\n control={control as unknown as Control<AdminCrudActionsConfig>}\n modelRef={modelId}\n />\n </SectionListSectionContent>\n </SectionListSection>\n\n <SectionListSection>\n <SectionListSectionHeader>\n <SectionListSectionTitle>Form Configuration</SectionListSectionTitle>\n <SectionListSectionDescription>\n Configure the form fields for creating and editing records.\n </SectionListSectionDescription>\n </SectionListSectionHeader>\n <SectionListSectionContent>\n <CrudFormFieldsForm\n formProps={\n formProps as unknown as UseFormReturn<AdminCrudFormConfigInput>\n }\n embeddedFormOptions={embeddedFormOptions}\n />\n </SectionListSectionContent>\n </SectionListSection>\n\n <SectionListSection>\n <SectionListSectionHeader>\n <SectionListSectionTitle>Embedded Forms</SectionListSectionTitle>\n <SectionListSectionDescription>\n Configure embedded forms for related data objects.\n </SectionListSectionDescription>\n </SectionListSectionHeader>\n <SectionListSectionContent>\n <EmbeddedListInput.LabelledController\n control={control}\n name=\"embeddedForms\"\n renderForm={(formProps) => (\n <AdminCrudEmbeddedForm\n {...formProps}\n embeddedFormOptions={embeddedFormOptions}\n />\n )}\n renderTable={(tableProps) => (\n <AdminCrudEmbeddedTable {...tableProps} />\n )}\n defaultValue={{ type: 'object' }}\n />\n </SectionListSectionContent>\n </SectionListSection>\n </>\n );\n}\n\nexport default AdminCrudSectionForm;\n","import type { ComboboxFieldProps } from '@baseplate-dev/ui-components';\nimport type React from 'react';\nimport type { Control, FieldPath, FieldValues } from 'react-hook-form';\nimport type { IconType } from 'react-icons/lib';\n\nimport {\n AsyncComboboxField,\n useControllerMerged,\n} from '@baseplate-dev/ui-components';\n\ninterface IconOption {\n label: string;\n value: string;\n icon: IconType;\n}\n\ntype ReactIconComboboxProps = Omit<\n ComboboxFieldProps<IconOption>,\n 'options' | 'renderText'\n>;\n\nasync function fetchIcons(): Promise<IconOption[]> {\n const hiIcons = await import('react-icons/hi');\n const faIcons = await import('react-icons/fa');\n const mdIcons = await import('react-icons/md');\n const bsIcons = await import('react-icons/bs');\n\n const icons = [hiIcons, faIcons, mdIcons, bsIcons].map((icons) =>\n Object.entries(icons)\n .filter(([, value]) => typeof value === 'function')\n .map(([key, value]) => ({\n label: key,\n value: key,\n icon: value as IconType,\n })),\n );\n\n return icons.flat();\n}\n\nfunction ReactIconCombobox({\n ...rest\n}: ReactIconComboboxProps): React.ReactElement {\n return (\n <AsyncComboboxField\n placeholder=\"Select an icon\"\n {...rest}\n loadOptions={(query) =>\n fetchIcons().then((options) =>\n options\n .filter(\n (option) =>\n !query ||\n option.label.toLowerCase().includes(query.toLowerCase()),\n )\n .sort((a, b) => a.label.localeCompare(b.label))\n .slice(0, 20),\n )\n }\n renderItemLabel={(option) => (\n <div className=\"flex items-center gap-2\">\n <option.icon className=\"size-4\" />\n {option.label}\n </div>\n )}\n />\n );\n}\n\ninterface ReactIconComboboxControllerProps<\n TFieldValues extends FieldValues = FieldValues,\n TFieldName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> extends Omit<ReactIconComboboxProps, 'value'> {\n control: Control<TFieldValues>;\n name: TFieldName;\n}\n\nfunction ReactIconComboboxController<\n TFieldValues extends FieldValues = FieldValues,\n TFieldName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>({\n name,\n control,\n ...rest\n}: ReactIconComboboxControllerProps<\n TFieldValues,\n TFieldName\n>): React.JSX.Element {\n const {\n field,\n fieldState: { error },\n } = useControllerMerged({ name, control }, rest);\n\n const restProps = rest;\n\n return (\n <ReactIconCombobox\n error={error?.message}\n {...restProps}\n {...field}\n value={field.value ?? null}\n />\n );\n}\n\nexport { ReactIconComboboxController };\n","import type React from 'react';\n\nimport {\n adminSectionEntityType,\n createWebAdminSectionSchema,\n} from '@baseplate-dev/project-builder-lib';\nimport {\n useBlockUnsavedChangesNavigate,\n useProjectDefinition,\n useResettableForm,\n} from '@baseplate-dev/project-builder-lib/web';\nimport {\n Button,\n ComboboxFieldController,\n Dialog,\n DialogClose,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n FormActionBar,\n InputFieldController,\n SectionList,\n SectionListSection,\n SectionListSectionContent,\n SectionListSectionDescription,\n SectionListSectionHeader,\n SectionListSectionTitle,\n} from '@baseplate-dev/ui-components';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { createFileRoute, notFound, useNavigate } from '@tanstack/react-router';\n\nimport { useDefinitionSchema } from '#src/hooks/use-definition-schema.js';\nimport { logAndFormatError } from '#src/services/error-formatter.js';\n\nimport AdminCrudSectionForm from './-components/admin-crud-section-form.js';\nimport { ReactIconComboboxController } from './-components/react-icon-combobox.js';\n\nexport const Route = createFileRoute(\n '/admin-sections/$appKey/edit/$sectionKey',\n)({\n component: EditAdminSectionPage,\n beforeLoad: ({ params: { sectionKey }, context: { adminApp } }) => {\n if (!adminApp) return {};\n\n const section = adminApp.sections?.find(\n (s) => adminSectionEntityType.idFromKey(sectionKey) === s.id,\n );\n\n if (!section) return {};\n\n return {\n getTitle: () => section.name,\n section,\n };\n },\n loader: ({ context: { section, app } }) => {\n if (!section || !app) throw notFound();\n return { section, app };\n },\n});\n\nfunction EditAdminSectionPage(): React.JSX.Element {\n const { app, section } = Route.useLoaderData();\n const { appKey, sectionKey } = Route.useParams();\n const navigate = useNavigate({ from: Route.fullPath });\n\n const { definition, saveDefinitionWithFeedback, isSavingDefinition } =\n useProjectDefinition();\n const adminSectionSchema = useDefinitionSchema(createWebAdminSectionSchema);\n\n const featureOptions = definition.features.map((f) => ({\n label: f.name,\n value: f.id,\n }));\n\n const formProps = useResettableForm({\n resolver: zodResolver(adminSectionSchema),\n values: section,\n defaultValues: { type: 'crud' },\n });\n\n const { control, handleSubmit, reset } = formProps;\n\n const onSubmit = handleSubmit((data) => {\n const { id: _dataId, ...sectionData } = data;\n return saveDefinitionWithFeedback((draftConfig) => {\n const webApp = draftConfig.apps.find((a) => a.id === app.id);\n if (webApp?.type !== 'web' || !webApp.adminApp) return;\n\n const existingIndex = webApp.adminApp.sections?.findIndex(\n (s) => s.id === adminSectionEntityType.idFromKey(sectionKey),\n );\n\n if (\n existingIndex !== undefined &&\n existingIndex >= 0 &&\n webApp.adminApp.sections\n ) {\n webApp.adminApp.sections[existingIndex] = {\n ...sectionData,\n id: section.id,\n };\n }\n });\n });\n\n const handleDelete = (): void => {\n void saveDefinitionWithFeedback(\n (draftConfig) => {\n const webApp = draftConfig.apps.find((a) => a.id === app.id);\n if (webApp?.type !== 'web' || !webApp.adminApp) return;\n\n webApp.adminApp.sections = webApp.adminApp.sections?.filter(\n (s) => s.id !== section.id,\n );\n },\n {\n successMessage: `Successfully deleted section \"${section.name}\"!`,\n onSuccess: () => {\n navigate({\n to: '/admin-sections/$appKey',\n params: { appKey },\n }).catch(logAndFormatError);\n },\n },\n );\n };\n\n useBlockUnsavedChangesNavigate({ control, reset, onSubmit });\n\n return (\n <div\n className=\"relative flex h-full flex-1 flex-col overflow-hidden\"\n key={section.id}\n >\n <div className=\"max-w-7xl space-y-4 border-b p-4\">\n <div className=\"flex items-center justify-between space-x-4\">\n <div>\n <h2>{section.name}</h2>\n <p className=\"text-base text-muted-foreground\">\n {section.type} section\n </p>\n </div>\n <Dialog>\n <DialogTrigger asChild>\n <Button variant=\"secondary\">Delete</Button>\n </DialogTrigger>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Delete {section.name}</DialogTitle>\n </DialogHeader>\n <p>\n Are you sure you want to delete <strong>{section.name}</strong>?\n </p>\n <p className=\"text-style-muted\">\n This action will permanently remove the admin section from your\n application. This cannot be undone.\n </p>\n <DialogFooter>\n <DialogClose>\n <Button variant=\"secondary\">Cancel</Button>\n </DialogClose>\n <Button\n variant=\"destructive\"\n onClick={handleDelete}\n disabled={isSavingDefinition}\n >\n Delete Section\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </div>\n </div>\n <div\n className=\"mb-(--action-bar-height) flex flex-1 overflow-y-auto\"\n style={\n {\n '--action-bar-height': '52px',\n } as React.CSSProperties\n }\n >\n <form onSubmit={onSubmit} className=\"w-full max-w-7xl space-y-4 p-4\">\n <SectionList>\n <SectionListSection>\n <SectionListSectionHeader>\n <SectionListSectionTitle>General</SectionListSectionTitle>\n <SectionListSectionDescription>\n Basic configuration for your admin section.\n </SectionListSectionDescription>\n </SectionListSectionHeader>\n <SectionListSectionContent className=\"space-y-6\">\n <InputFieldController\n label=\"Name\"\n control={control}\n name=\"name\"\n autoComplete=\"off\"\n />\n <ComboboxFieldController\n label=\"Feature\"\n control={control}\n options={featureOptions}\n name=\"featureRef\"\n />\n <ReactIconComboboxController\n label=\"Icon\"\n control={control}\n name=\"icon\"\n description=\"Choose an icon to represent this section\"\n />\n </SectionListSectionContent>\n </SectionListSection>\n\n <AdminCrudSectionForm formProps={formProps} />\n </SectionList>\n <FormActionBar form={formProps} />\n </form>\n </div>\n </div>\n );\n}\n"],"file":"assets/edit._sectionKey-CzUa0VJQ.js"}
@@ -1,2 +0,0 @@
1
- import{i}from"./_virtual___federation_fn_import-o6aKHb82.js";import{j as e}from"./jsx-runtime-D_zvdyIk.js";import{s as T}from"./index-CbWKfUJC.js";import{u as I}from"./use-definition-schema-Bxe6QzcW.js";const{adminSectionEntityType:p,createWebAdminSectionSchema:P}=await i("@baseplate-dev/project-builder-lib"),{useProjectDefinition:k,useResettableForm:O}=await i("@baseplate-dev/project-builder-lib/web"),{Button:u,ComboboxFieldController:K,Dialog:M,DialogContent:U,DialogDescription:$,DialogFooter:E,DialogHeader:W,DialogTitle:B,DialogTrigger:H,InputFieldController:f,SelectFieldController:V,useControlledState:q}=await i("@baseplate-dev/ui-components"),{useNavigate:z}=await i("@tanstack/react-router");function X({children:b,appId:h,appKey:g,open:x,onOpenChange:C}){const[j,s]=q(x,C,!1),S=z(),{definition:y,saveDefinitionWithFeedback:D,isSavingDefinition:r}=k(),v=I(P),l=y.features.map(t=>({label:t.name,value:t.id})),w=O({resolver:T(v),defaultValues:{name:"",type:"crud",featureRef:l[0]?.value??"",icon:"",modelRef:"",form:{fields:[]},table:{columns:[]}}}),{control:n,handleSubmit:A,reset:c}=w,F=A(t=>{const m=p.generateNewId();return D(N=>{const o=N.apps.find(a=>a.id===h);o?.type==="web"&&(o.adminApp??={enabled:!0,pathPrefix:"/admin",sections:[]},o.adminApp.sections=[...o.adminApp.sections??[],{...t,id:m}].sort((a,R)=>a.name.localeCompare(R.name)))},{successMessage:`Successfully created section "${t.name}"!`,onSuccess:()=>{s(!1),c(),S({to:"/admin-sections/$appKey/edit/$sectionKey",params:{appKey:g,sectionKey:p.keyFromId(m)}})}})}),d=t=>{s(t),t||c()};return e.jsxs(M,{open:j,onOpenChange:d,children:[e.jsx(H,{asChild:!0,children:b}),e.jsxs(U,{className:"sm:max-w-md",children:[e.jsxs(W,{children:[e.jsx(B,{children:"Create New Admin Section"}),e.jsx($,{children:"Create a new CRUD interface for managing your data models."})]}),e.jsxs("form",{onSubmit:t=>(t.stopPropagation(),F(t)),className:"space-y-4",children:[e.jsx(f,{label:"Name",control:n,name:"name",placeholder:"e.g. Users, Posts, Categories",description:"The display name for this admin section",autoComplete:"off"}),e.jsx(K,{label:"Feature",control:n,options:l,name:"featureRef",description:"The feature this section belongs to"}),e.jsx(f,{label:"Icon",control:n,name:"icon",placeholder:"e.g. MdPeople, MdArticle",description:"React icon component name (optional)"}),e.jsx(V,{label:"Type",control:n,name:"type",options:[{label:"CRUD",value:"crud"}],description:"The type of admin interface"}),e.jsxs(E,{children:[e.jsx(u,{type:"button",variant:"outline",onClick:()=>{d(!1)},children:"Cancel"}),e.jsx(u,{type:"submit",disabled:r,children:r?"Creating...":"Create Section"})]})]})]})]})}export{X as N};
2
- //# sourceMappingURL=new-admin-section-dialog-Ct76iG3g.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"new-admin-section-dialog-Ct76iG3g.js","sources":["../../src/routes/admin-sections.$appKey/-components/new-admin-section-dialog.tsx"],"sourcesContent":["import type React from 'react';\n\nimport {\n adminSectionEntityType,\n createWebAdminSectionSchema,\n} from '@baseplate-dev/project-builder-lib';\nimport {\n useProjectDefinition,\n useResettableForm,\n} from '@baseplate-dev/project-builder-lib/web';\nimport {\n Button,\n ComboboxFieldController,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n InputFieldController,\n SelectFieldController,\n useControlledState,\n} from '@baseplate-dev/ui-components';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { useNavigate } from '@tanstack/react-router';\n\nimport { useDefinitionSchema } from '#src/hooks/use-definition-schema.js';\n\ninterface NewAdminSectionDialogProps {\n children: React.ReactNode;\n appId: string;\n appKey: string;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\nfunction NewAdminSectionDialog({\n children,\n appId,\n appKey,\n open,\n onOpenChange,\n}: NewAdminSectionDialogProps): React.JSX.Element {\n const [isOpen, setIsOpen] = useControlledState(open, onOpenChange, false);\n const navigate = useNavigate();\n\n const { definition, saveDefinitionWithFeedback, isSavingDefinition } =\n useProjectDefinition();\n const adminSectionSchema = useDefinitionSchema(createWebAdminSectionSchema);\n\n const featureOptions = definition.features.map((f) => ({\n label: f.name,\n value: f.id,\n }));\n\n const formProps = useResettableForm({\n resolver: zodResolver(adminSectionSchema),\n defaultValues: {\n name: '',\n type: 'crud' as const,\n featureRef: featureOptions[0]?.value ?? '',\n icon: '',\n modelRef: '',\n form: { fields: [] },\n table: { columns: [] },\n },\n });\n\n const { control, handleSubmit, reset } = formProps;\n\n const onSubmit = handleSubmit((data) => {\n const newId = adminSectionEntityType.generateNewId();\n return saveDefinitionWithFeedback(\n (draftConfig) => {\n const webApp = draftConfig.apps.find((a) => a.id === appId);\n if (webApp?.type !== 'web') return;\n\n webApp.adminApp ??= {\n enabled: true,\n pathPrefix: '/admin',\n sections: [],\n };\n\n webApp.adminApp.sections = [\n ...(webApp.adminApp.sections ?? []),\n { ...data, id: newId },\n ].sort((a, b) => a.name.localeCompare(b.name));\n },\n {\n successMessage: `Successfully created section \"${data.name}\"!`,\n onSuccess: () => {\n setIsOpen(false);\n reset();\n // Navigate to the newly created section\n navigate({\n to: '/admin-sections/$appKey/edit/$sectionKey',\n params: {\n appKey,\n sectionKey: adminSectionEntityType.keyFromId(newId),\n },\n });\n },\n },\n );\n });\n\n const handleOpenChange = (newOpen: boolean): void => {\n setIsOpen(newOpen);\n if (!newOpen) {\n reset();\n }\n };\n\n return (\n <Dialog open={isOpen} onOpenChange={handleOpenChange}>\n <DialogTrigger asChild>{children}</DialogTrigger>\n <DialogContent className=\"sm:max-w-md\">\n <DialogHeader>\n <DialogTitle>Create New Admin Section</DialogTitle>\n <DialogDescription>\n Create a new CRUD interface for managing your data models.\n </DialogDescription>\n </DialogHeader>\n <form\n onSubmit={(e) => {\n e.stopPropagation();\n return onSubmit(e);\n }}\n className=\"space-y-4\"\n >\n <InputFieldController\n label=\"Name\"\n control={control}\n name=\"name\"\n placeholder=\"e.g. Users, Posts, Categories\"\n description=\"The display name for this admin section\"\n autoComplete=\"off\"\n />\n <ComboboxFieldController\n label=\"Feature\"\n control={control}\n options={featureOptions}\n name=\"featureRef\"\n description=\"The feature this section belongs to\"\n />\n <InputFieldController\n label=\"Icon\"\n control={control}\n name=\"icon\"\n placeholder=\"e.g. MdPeople, MdArticle\"\n description=\"React icon component name (optional)\"\n />\n <SelectFieldController\n label=\"Type\"\n control={control}\n name=\"type\"\n options={[{ label: 'CRUD', value: 'crud' }]}\n description=\"The type of admin interface\"\n />\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => {\n handleOpenChange(false);\n }}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={isSavingDefinition}>\n {isSavingDefinition ? 'Creating...' : 'Create Section'}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n\nexport default NewAdminSectionDialog;\n"],"names":["adminSectionEntityType","createWebAdminSectionSchema","importShared","useProjectDefinition","useResettableForm","Button","ComboboxFieldController","Dialog","DialogContent","DialogDescription","DialogFooter","DialogHeader","DialogTitle","DialogTrigger","InputFieldController","SelectFieldController","useControlledState","useNavigate","NewAdminSectionDialog","children","appId","appKey","open","onOpenChange","isOpen","setIsOpen","navigate","definition","saveDefinitionWithFeedback","isSavingDefinition","adminSectionSchema","useDefinitionSchema","featureOptions","f","formProps","zodResolver","control","handleSubmit","reset","onSubmit","data","newId","draftConfig","webApp","b","handleOpenChange","newOpen","jsxs","jsx","e"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import"./jsx-runtime-D_zvdyIk.js";import{N as o}from"./index-CbWKfUJC.js";const p=o;export{p as notFoundComponent};
2
- //# sourceMappingURL=route-Fld55OGo.js.map