adminforth 1.3.54-next.9 → 1.3.55-next.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 (250) hide show
  1. package/dist/auth.d.ts +31 -0
  2. package/dist/auth.d.ts.map +1 -0
  3. package/dist/auth.js +42 -56
  4. package/dist/auth.js.map +1 -0
  5. package/dist/basePlugin.d.ts +18 -0
  6. package/dist/basePlugin.d.ts.map +1 -0
  7. package/dist/basePlugin.js +1 -0
  8. package/dist/basePlugin.js.map +1 -0
  9. package/dist/dataConnectors/baseConnector.d.ts +94 -0
  10. package/dist/dataConnectors/baseConnector.d.ts.map +1 -0
  11. package/dist/dataConnectors/baseConnector.js +108 -122
  12. package/dist/dataConnectors/baseConnector.js.map +1 -0
  13. package/dist/dataConnectors/clickhouse.d.ts +92 -0
  14. package/dist/dataConnectors/clickhouse.d.ts.map +1 -0
  15. package/dist/dataConnectors/clickhouse.js +132 -149
  16. package/dist/dataConnectors/clickhouse.js.map +1 -0
  17. package/dist/dataConnectors/mongo.d.ts +93 -0
  18. package/dist/dataConnectors/mongo.d.ts.map +1 -0
  19. package/dist/dataConnectors/mongo.js +75 -101
  20. package/dist/dataConnectors/mongo.js.map +1 -0
  21. package/dist/dataConnectors/postgres.d.ts +71 -0
  22. package/dist/dataConnectors/postgres.d.ts.map +1 -0
  23. package/dist/dataConnectors/postgres.js +124 -143
  24. package/dist/dataConnectors/postgres.js.map +1 -0
  25. package/dist/dataConnectors/sqlite.d.ts +67 -0
  26. package/dist/dataConnectors/sqlite.d.ts.map +1 -0
  27. package/dist/dataConnectors/sqlite.js +113 -130
  28. package/dist/dataConnectors/sqlite.js.map +1 -0
  29. package/dist/index.d.ts +92 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +197 -217
  32. package/dist/index.js.map +1 -0
  33. package/dist/modules/codeInjector.d.ts +35 -0
  34. package/dist/modules/codeInjector.d.ts.map +1 -0
  35. package/dist/modules/codeInjector.js +480 -486
  36. package/dist/modules/codeInjector.js.map +1 -0
  37. package/dist/modules/configValidator.d.ts +12 -0
  38. package/dist/modules/configValidator.d.ts.map +1 -0
  39. package/dist/modules/configValidator.js +31 -22
  40. package/dist/modules/configValidator.js.map +1 -0
  41. package/dist/modules/operationalResource.d.ts +17 -0
  42. package/dist/modules/operationalResource.d.ts.map +1 -0
  43. package/dist/modules/operationalResource.js +50 -70
  44. package/dist/modules/operationalResource.js.map +1 -0
  45. package/dist/modules/restApi.d.ts +10 -0
  46. package/dist/modules/restApi.d.ts.map +1 -0
  47. package/dist/modules/restApi.js +104 -116
  48. package/dist/modules/restApi.js.map +1 -0
  49. package/dist/modules/styleGenerator.d.ts +9 -0
  50. package/dist/modules/styleGenerator.d.ts.map +1 -0
  51. package/dist/modules/styleGenerator.js +1 -0
  52. package/dist/modules/styleGenerator.js.map +1 -0
  53. package/dist/modules/styles.d.ts +96 -0
  54. package/dist/modules/styles.d.ts.map +1 -0
  55. package/dist/modules/styles.js +1 -0
  56. package/dist/modules/styles.js.map +1 -0
  57. package/dist/modules/utils.d.ts +39 -0
  58. package/dist/modules/utils.d.ts.map +1 -0
  59. package/dist/modules/utils.js +1 -0
  60. package/dist/modules/utils.js.map +1 -0
  61. package/dist/plugins/audit-log/types.d.ts +35 -0
  62. package/dist/plugins/audit-log/types.d.ts.map +1 -0
  63. package/dist/plugins/audit-log/types.js +2 -0
  64. package/dist/plugins/audit-log/types.js.map +1 -0
  65. package/dist/plugins/chat-gpt/types.d.ts +82 -0
  66. package/dist/plugins/chat-gpt/types.d.ts.map +1 -0
  67. package/dist/plugins/chat-gpt/types.js +2 -0
  68. package/dist/plugins/chat-gpt/types.js.map +1 -0
  69. package/dist/plugins/email-password-reset/types.d.ts +28 -0
  70. package/dist/plugins/email-password-reset/types.d.ts.map +1 -0
  71. package/dist/plugins/email-password-reset/types.js +2 -0
  72. package/dist/plugins/email-password-reset/types.js.map +1 -0
  73. package/dist/plugins/foreign-inline-list/types.d.ts +19 -0
  74. package/dist/plugins/foreign-inline-list/types.d.ts.map +1 -0
  75. package/dist/plugins/foreign-inline-list/types.js +2 -0
  76. package/dist/plugins/foreign-inline-list/types.js.map +1 -0
  77. package/dist/plugins/import-export/types.d.ts +3 -0
  78. package/dist/plugins/import-export/types.d.ts.map +1 -0
  79. package/dist/plugins/import-export/types.js +2 -0
  80. package/dist/plugins/import-export/types.js.map +1 -0
  81. package/dist/plugins/rich-editor/custom/async-queue.d.ts +8 -0
  82. package/dist/plugins/rich-editor/custom/async-queue.d.ts.map +1 -0
  83. package/dist/plugins/rich-editor/custom/async-queue.js +29 -0
  84. package/dist/plugins/rich-editor/custom/async-queue.js.map +1 -0
  85. package/dist/plugins/rich-editor/dist/custom/async-queue.d.ts +8 -0
  86. package/dist/plugins/rich-editor/dist/custom/async-queue.d.ts.map +1 -0
  87. package/dist/plugins/rich-editor/dist/custom/async-queue.js +29 -0
  88. package/dist/plugins/rich-editor/dist/custom/async-queue.js.map +1 -0
  89. package/dist/plugins/rich-editor/types.d.ts +153 -0
  90. package/dist/plugins/rich-editor/types.d.ts.map +1 -0
  91. package/dist/plugins/rich-editor/types.js +16 -0
  92. package/dist/plugins/rich-editor/types.js.map +1 -0
  93. package/dist/plugins/two-factors-auth/types.d.ts +18 -0
  94. package/dist/plugins/two-factors-auth/types.d.ts.map +1 -0
  95. package/dist/plugins/two-factors-auth/types.js +2 -0
  96. package/dist/plugins/two-factors-auth/types.js.map +1 -0
  97. package/dist/plugins/upload/types.d.ts +132 -0
  98. package/dist/plugins/upload/types.d.ts.map +1 -0
  99. package/dist/plugins/upload/types.js +2 -0
  100. package/dist/plugins/upload/types.js.map +1 -0
  101. package/dist/servers/express.d.ts +18 -0
  102. package/dist/servers/express.d.ts.map +1 -0
  103. package/dist/servers/express.js +30 -42
  104. package/dist/servers/express.js.map +1 -0
  105. package/dist/types/AdminForthConfig.d.ts +1619 -0
  106. package/dist/types/AdminForthConfig.d.ts.map +1 -0
  107. package/dist/types/AdminForthConfig.js +1 -0
  108. package/dist/types/AdminForthConfig.js.map +1 -0
  109. package/{types/FrontendAPI.ts → dist/types/FrontendAPI.d.ts} +27 -52
  110. package/dist/types/FrontendAPI.d.ts.map +1 -0
  111. package/dist/types/FrontendAPI.js +1 -0
  112. package/dist/types/FrontendAPI.js.map +1 -0
  113. package/package.json +15 -5
  114. package/auth.ts +0 -140
  115. package/basePlugin.ts +0 -70
  116. package/dataConnectors/baseConnector.ts +0 -216
  117. package/dataConnectors/clickhouse.ts +0 -338
  118. package/dataConnectors/mongo.ts +0 -202
  119. package/dataConnectors/postgres.ts +0 -306
  120. package/dataConnectors/sqlite.ts +0 -254
  121. package/dist/spa/.eslintrc.cjs +0 -14
  122. package/dist/spa/README.md +0 -39
  123. package/dist/spa/env.d.ts +0 -1
  124. package/dist/spa/index.html +0 -23
  125. package/dist/spa/package-lock.json +0 -4573
  126. package/dist/spa/package.json +0 -49
  127. package/dist/spa/postcss.config.js +0 -6
  128. package/dist/spa/public/assets/favicon.png +0 -0
  129. package/dist/spa/src/App.vue +0 -314
  130. package/dist/spa/src/assets/base.css +0 -2
  131. package/dist/spa/src/assets/logo.svg +0 -19
  132. package/dist/spa/src/components/AcceptModal.vue +0 -45
  133. package/dist/spa/src/components/Breadcrumbs.vue +0 -41
  134. package/dist/spa/src/components/BreadcrumbsWithButtons.vue +0 -26
  135. package/dist/spa/src/components/CustomDatePicker.vue +0 -176
  136. package/dist/spa/src/components/CustomDateRangePicker.vue +0 -218
  137. package/dist/spa/src/components/CustomRangePicker.vue +0 -152
  138. package/dist/spa/src/components/Dropdown.vue +0 -168
  139. package/dist/spa/src/components/Filters.vue +0 -222
  140. package/dist/spa/src/components/HelloWorld.vue +0 -17
  141. package/dist/spa/src/components/MenuLink.vue +0 -24
  142. package/dist/spa/src/components/ResourceForm.vue +0 -294
  143. package/dist/spa/src/components/ResourceListTable.vue +0 -394
  144. package/dist/spa/src/components/SingleSkeletLoader.vue +0 -13
  145. package/dist/spa/src/components/SkeleteLoader.vue +0 -23
  146. package/dist/spa/src/components/Toast.vue +0 -77
  147. package/dist/spa/src/components/ValueRenderer.vue +0 -66
  148. package/dist/spa/src/components/icons/IconCalendar.vue +0 -5
  149. package/dist/spa/src/components/icons/IconCommunity.vue +0 -7
  150. package/dist/spa/src/components/icons/IconDocumentation.vue +0 -7
  151. package/dist/spa/src/components/icons/IconEcosystem.vue +0 -7
  152. package/dist/spa/src/components/icons/IconSupport.vue +0 -7
  153. package/dist/spa/src/components/icons/IconTime.vue +0 -5
  154. package/dist/spa/src/components/icons/IconTooling.vue +0 -19
  155. package/dist/spa/src/composables/useFrontendApi.ts +0 -26
  156. package/dist/spa/src/composables/useStores.ts +0 -127
  157. package/dist/spa/src/index.scss +0 -27
  158. package/dist/spa/src/main.ts +0 -18
  159. package/dist/spa/src/router/index.ts +0 -63
  160. package/dist/spa/src/spa_types/core.ts +0 -51
  161. package/dist/spa/src/stores/core.ts +0 -144
  162. package/dist/spa/src/stores/filters.ts +0 -22
  163. package/dist/spa/src/stores/modal.ts +0 -48
  164. package/dist/spa/src/stores/toast.ts +0 -15
  165. package/dist/spa/src/stores/user.ts +0 -72
  166. package/dist/spa/src/types/AdminForthConfig.ts +0 -1477
  167. package/dist/spa/src/types/FrontendAPI.ts +0 -121
  168. package/dist/spa/src/utils.ts +0 -103
  169. package/dist/spa/src/views/CreateView.vue +0 -156
  170. package/dist/spa/src/views/EditView.vue +0 -157
  171. package/dist/spa/src/views/ListView.vue +0 -258
  172. package/dist/spa/src/views/LoginView.vue +0 -160
  173. package/dist/spa/src/views/ResourceParent.vue +0 -17
  174. package/dist/spa/src/views/ShowView.vue +0 -184
  175. package/dist/spa/tailwind.config.js +0 -17
  176. package/dist/spa/tsconfig.app.json +0 -14
  177. package/dist/spa/tsconfig.json +0 -11
  178. package/dist/spa/tsconfig.node.json +0 -19
  179. package/dist/spa/vite.config.ts +0 -56
  180. package/index.ts +0 -428
  181. package/modules/codeInjector.ts +0 -736
  182. package/modules/configValidator.ts +0 -571
  183. package/modules/operationalResource.ts +0 -98
  184. package/modules/restApi.ts +0 -718
  185. package/modules/styleGenerator.ts +0 -55
  186. package/modules/styles.ts +0 -126
  187. package/modules/utils.ts +0 -472
  188. package/servers/express.ts +0 -259
  189. package/spa/.eslintrc.cjs +0 -14
  190. package/spa/README.md +0 -39
  191. package/spa/env.d.ts +0 -1
  192. package/spa/index.html +0 -23
  193. package/spa/package-lock.json +0 -4602
  194. package/spa/package.json +0 -51
  195. package/spa/postcss.config.js +0 -6
  196. package/spa/public/assets/favicon.png +0 -0
  197. package/spa/src/App.vue +0 -418
  198. package/spa/src/assets/base.css +0 -2
  199. package/spa/src/assets/logo.svg +0 -19
  200. package/spa/src/components/AcceptModal.vue +0 -45
  201. package/spa/src/components/Breadcrumbs.vue +0 -41
  202. package/spa/src/components/BreadcrumbsWithButtons.vue +0 -26
  203. package/spa/src/components/CustomDatePicker.vue +0 -176
  204. package/spa/src/components/CustomDateRangePicker.vue +0 -218
  205. package/spa/src/components/CustomRangePicker.vue +0 -156
  206. package/spa/src/components/Dropdown.vue +0 -168
  207. package/spa/src/components/Filters.vue +0 -222
  208. package/spa/src/components/HelloWorld.vue +0 -17
  209. package/spa/src/components/MenuLink.vue +0 -27
  210. package/spa/src/components/ResourceForm.vue +0 -290
  211. package/spa/src/components/ResourceListTable.vue +0 -466
  212. package/spa/src/components/SingleSkeletLoader.vue +0 -13
  213. package/spa/src/components/SkeleteLoader.vue +0 -23
  214. package/spa/src/components/ThreeDotsMenu.vue +0 -43
  215. package/spa/src/components/Toast.vue +0 -78
  216. package/spa/src/components/ValueRenderer.vue +0 -114
  217. package/spa/src/components/icons/IconCalendar.vue +0 -5
  218. package/spa/src/components/icons/IconCommunity.vue +0 -7
  219. package/spa/src/components/icons/IconDocumentation.vue +0 -7
  220. package/spa/src/components/icons/IconEcosystem.vue +0 -7
  221. package/spa/src/components/icons/IconSupport.vue +0 -7
  222. package/spa/src/components/icons/IconTime.vue +0 -5
  223. package/spa/src/components/icons/IconTooling.vue +0 -19
  224. package/spa/src/composables/useFrontendApi.ts +0 -26
  225. package/spa/src/composables/useStores.ts +0 -131
  226. package/spa/src/index.scss +0 -31
  227. package/spa/src/main.ts +0 -18
  228. package/spa/src/renderers/CompactUUID.vue +0 -48
  229. package/spa/src/renderers/CountryFlag.vue +0 -69
  230. package/spa/src/router/index.ts +0 -59
  231. package/spa/src/spa_types/core.ts +0 -53
  232. package/spa/src/stores/core.ts +0 -148
  233. package/spa/src/stores/filters.ts +0 -27
  234. package/spa/src/stores/modal.ts +0 -48
  235. package/spa/src/stores/toast.ts +0 -31
  236. package/spa/src/stores/user.ts +0 -72
  237. package/spa/src/utils.ts +0 -160
  238. package/spa/src/views/CreateView.vue +0 -167
  239. package/spa/src/views/EditView.vue +0 -170
  240. package/spa/src/views/ListView.vue +0 -352
  241. package/spa/src/views/LoginView.vue +0 -192
  242. package/spa/src/views/ResourceParent.vue +0 -17
  243. package/spa/src/views/ShowView.vue +0 -186
  244. package/spa/tailwind.config.js +0 -17
  245. package/spa/tsconfig.app.json +0 -14
  246. package/spa/tsconfig.json +0 -11
  247. package/spa/tsconfig.node.json +0 -19
  248. package/spa/vite.config.ts +0 -56
  249. package/tsconfig.json +0 -112
  250. package/types/AdminForthConfig.ts +0 -1762
@@ -1,294 +0,0 @@
1
- <template>
2
- <div class="rounded-default">
3
- <div
4
- class="relative shadow-resourseFormShadow dark:shadow-darkResourseFormShadow sm:rounded-lg dark:shadow-2xl rounded-default"
5
- >
6
- <form autocomplete="off" @submit.prevent>
7
- <table class="w-full text-sm text-left rtl:text-right text-gray-500 dark:text-gray-400 ">
8
- <thead class="text-xs text-gray-700 uppercase bg-lightFormHeading dark:bg-gray-700 dark:text-gray-400 block md:table-row-group">
9
- <tr>
10
- <th scope="col" class="px-6 py-3 hidden md:table-cell">
11
- Field
12
- </th>
13
- <th scope="col" class="px-6 py-3 w-5/6 hidden md:table-cell">
14
- Value
15
- </th>
16
-
17
-
18
- </tr>
19
- </thead>
20
- <tbody>
21
- <tr v-for="column, i in editableColumns" :key="column.name"
22
- v-if="currentValues !== null"
23
- class="bg-ligftForm dark:bg-gray-800 border-b dark:border-gray-700 block md:table-row"
24
- >
25
- <td class="px-6 py-4 sm:pb-0 whitespace-nowrap flex items-center block md:table-cell"> <!--align-top-->
26
- {{ column.label }}
27
- <span :data-tooltip-target="`tooltip-show-${i}`" class="ml-1 relative inline-block">
28
- <IconExclamationCircleSolid v-if="column.required[mode]" class="w-4 h-4"
29
- :class="(columnError(column) && validating) ? 'text-red-500 dark:text-red-400' : 'text-gray-400 dark:text-gray-500'"
30
- />
31
- </span>
32
- <div :id="`tooltip-show-${i}`"
33
- role="tooltip"
34
- class="ml-1 absolute z-10 invisible inline-block px-3 py-2 text-sm font-medium text-white transition-opacity duration-300 bg-gray-900 rounded-lg shadow-sm opacity-0 tooltip dark:bg-gray-700">
35
- Required field
36
- <div class="tooltip-arrow" data-popper-arrow></div>
37
- </div>
38
- </td>
39
- <td class="px-6 py-4 whitespace-nowrap whitespace-pre-wrap relative block md:table-cell">
40
- <template v-if="column?.components?.[props.source]?.file">
41
- <component
42
- :is="getCustomComponent(column.components[props.source])"
43
- :column="column"
44
- :value="currentValues[column.name]"
45
- @update:value="setCurrentValue(column.name, $event)"
46
- :meta="column.components[props.source].meta"
47
- :record="currentValues"
48
- @update:inValidity="customComponentsInValidity[column.name] = $event"
49
- @update:emptiness="customComponentsEmptiness[column.name] = $event"
50
- />
51
- </template>
52
- <template v-else>
53
- <Dropdown
54
- single
55
- v-if="column.foreignResource"
56
- :options="columnOptions[column.name] || []"
57
- :placeholder = "columnOptions[column.name]?.length ?'Select...': 'There are no options available'"
58
- :modelValue="currentValues[column.name]"
59
- @update:modelValue="setCurrentValue(column.name, $event)"
60
- ></Dropdown>
61
- <Dropdown
62
- single
63
- v-else-if="column.enum"
64
- :options="column.enum"
65
- :modelValue="currentValues[column.name]"
66
- @update:modelValue="setCurrentValue(column.name, $event)"
67
- />
68
- <Dropdown
69
- single
70
- v-else-if="column.type === 'boolean'"
71
- :options="[{ label: 'Yes', value: true }, { label: 'No', value: false }, { label: 'Unset', value: null }]"
72
- :modelValue="currentValues[column.name]"
73
- @update:modelValue="setCurrentValue(column.name, $event)"
74
- />
75
- <input
76
- v-else-if="['integer'].includes(column.type)"
77
- type="number"
78
- step="1"
79
- class="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-40 p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
80
- placeholder="0"
81
- :value="currentValues[column.name]"
82
- @input="setCurrentValue(column.name, $event.target.value)"
83
- >
84
- <CustomDatePicker
85
- v-else-if="['datetime'].includes(column.type)"
86
- :column="column"
87
- :valueStart="currentValues[column.name]"
88
- auto-hide
89
- @update:valueStart="setCurrentValue(column.name, $event)"
90
- />
91
- <input
92
- v-else-if="['decimal', 'float'].includes(column.type)"
93
- type="number"
94
- step="0.1"
95
- class="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-40 p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
96
- placeholder="0.0"
97
- :value="currentValues[column.name]"
98
- @input="setCurrentValue(column.name, $event.target.value)"
99
- />
100
- <textarea
101
- v-else-if="['text', 'richtext'].includes(column.type)"
102
- class="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
103
- placeholder="Text"
104
- :value="currentValues[column.name]"
105
- @input="setCurrentValue(column.name, $event.target.value)"
106
- >
107
- </textarea>
108
- <input
109
- v-else
110
- :type="!column.masked || unmasked[column.name] ? 'text' : 'password'"
111
- class="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
112
- placeholder="Text"
113
- :value="currentValues[column.name]"
114
- @input="setCurrentValue(column.name, $event.target.value)"
115
- autocomplete="false"
116
- data-lpignore="true"
117
- readonly
118
- onfocus="this.removeAttribute('readonly');"
119
- >
120
-
121
- <button
122
- v-if="column.masked"
123
- type="button"
124
- @click="unmasked[column.name] = !unmasked[column.name]"
125
- class="h-6 absolute inset-y-2 top-6 right-6 flex items-center pr-2 z-index-100 focus:outline-none"
126
- >
127
- <IconEyeSolid class="w-6 h-6 text-gray-400" v-if="!unmasked[column.name]" />
128
- <IconEyeSlashSolid class="w-6 h-6 text-gray-400" v-else />
129
- </button>
130
- </template>
131
- <div v-if="columnError(column) && validating" class="mt-1 text-xs text-red-500 dark:text-red-400">{{ columnError(column) }}</div>
132
-
133
- <div v-if="column.editingNote && column.editingNote[mode]" class="mt-1 text-xs text-gray-400 dark:text-gray-500">{{ column.editingNote[mode] }}</div>
134
-
135
- </td>
136
- </tr>
137
-
138
- </tbody>
139
- </table>
140
- </form>
141
- </div>
142
- </div>
143
-
144
- </template>
145
-
146
- <script setup>
147
-
148
- import CustomDatePicker from "@/components/CustomDatePicker.vue";
149
- import Dropdown from '@/components/Dropdown.vue';
150
- import { useCoreStore } from '@/stores/core';
151
- import { callAdminForthApi, getCustomComponent } from '@/utils';
152
- import { IconExclamationCircleSolid, IconEyeSlashSolid, IconEyeSolid } from '@iconify-prerendered/vue-flowbite';
153
- import { computedAsync } from '@vueuse/core';
154
- import { initFlowbite } from 'flowbite';
155
- import { computed, onMounted, ref, watch } from 'vue';
156
- import { useRouter } from 'vue-router';
157
-
158
- const router = useRouter();
159
-
160
- const props = defineProps({
161
- loading: Boolean,
162
- resource: Object,
163
- record: Object,
164
- validating: Boolean,
165
- source: String,
166
- });
167
-
168
- const unmasked = ref({});
169
-
170
- const mode = computed(() => props.record && Object.keys(props.record).length ? 'edit' : 'create');
171
-
172
- const emit = defineEmits(['update:record', 'update:isValid']);
173
-
174
- const currentValues = ref(null);
175
-
176
- const customComponentsInValidity = ref({});
177
- const customComponentsEmptiness = ref({});
178
-
179
-
180
- const columnError = (column) => {
181
- const val = computed(() => {
182
- if (!currentValues.value) {
183
- return null;
184
- }
185
- if (customComponentsInValidity.value[column.name]) {
186
- return customComponentsInValidity.value[column.name];
187
- }
188
-
189
- if (
190
- column.required[mode.value] &&
191
- (currentValues.value[column.name] === undefined || currentValues.value[column.name] === null || currentValues.value[column.name] === '') &&
192
- // if component is custum it might tell other criteria for emptiness by emitting 'update:emptiness'
193
- // components which do not emit 'update:emptiness' will have undefined value in customComponentsEmptiness
194
- (customComponentsEmptiness.value[column.name] !== false)
195
-
196
- ) {
197
- return 'This field is required';
198
- }
199
- if ( column.type === 'string' || column.type === 'text' ) {
200
- if ( column.maxLength && currentValues.value[column.name]?.length > column.maxLength ) {
201
- return `This field must be shorter than ${column.maxLength} characters`;
202
- }
203
- if ( column.minLength && currentValues.value[column.name]?.length < column.minLength ) {
204
- return `This field must be longer than ${column.minLength} characters`;
205
- }
206
- }
207
- if ( ['integer', 'decimal', 'float'].includes(column.type) ) {
208
- if ( column.minValue !== undefined
209
- && currentValues.value[column.name] !== null
210
- && currentValues.value[column.name] < column.minValue
211
- ) {
212
- return `This field must be greater than ${column.minValue}`;
213
- }
214
- if ( column.maxValue !== undefined && currentValues.value[column.name] > column.maxValue ) {
215
- return `This field must be less than ${column.maxValue}`;
216
- }
217
- }
218
- if ( column.validation && column.validation.length ) {
219
- const validationArray = column.validation;
220
- for (let i = 0; i < validationArray.length; i++) {
221
- if (validationArray[i].regExp) {
222
- const regExp = new RegExp(validationArray[i].regExp);
223
- let value = currentValues.value[column.name];
224
- if (value === undefined || value === null) {
225
- value = '';
226
- }
227
- if (!regExp.test(value)) {
228
- return validationArray[i].message;
229
- }
230
- }
231
- }
232
-
233
- }
234
- return null;
235
- });
236
- return val.value;
237
- };
238
-
239
-
240
- const setCurrentValue = (key, value) => {
241
- const col = props.resource.columns.find((column) => column.name === key);
242
- if (['integer', 'float'].includes(col.type) && (value || value === 0)) {
243
- currentValues.value[key] = +value;
244
- } else {
245
- currentValues.value[key] = value;
246
- }
247
- currentValues.value = { ...currentValues.value };
248
- console.log('3️⃣ setCurrentValue', key, value);
249
- emit('update:record', currentValues.value);
250
- };
251
-
252
- onMounted(() => {
253
- currentValues.value = Object.assign({}, props.record);
254
- console.log('2️⃣ currentValues', JSON.stringify(currentValues.value));
255
- initFlowbite();
256
- emit('update:isValid', isValid.value);
257
- });
258
-
259
- const columnOptions = computedAsync(async () => {
260
- return (await Promise.all(
261
- Object.values(props.resource.columns).map(async (column) => {
262
- if (column.foreignResource) {
263
- const list = await callAdminForthApi({
264
- method: 'POST',
265
- path: `/get_resource_foreign_data`,
266
- body: {
267
- resourceId: router.currentRoute.value.params.resourceId,
268
- column: column.name,
269
- limit: 1000,
270
- offset: 0,
271
- },
272
- });
273
- return { [column.name]: list.items };
274
- }
275
- })
276
- )).reduce((acc, val) => Object.assign(acc, val), {})
277
-
278
- }, {});
279
-
280
-
281
- const editableColumns = computed(() => {
282
- const mode = props.record ? 'edit' : 'create';
283
- return props.resource?.columns?.filter(column => column.showIn.includes(mode));
284
- });
285
-
286
- const isValid = computed(() => {
287
- return editableColumns.value?.every(column => !columnError(column));
288
- });
289
-
290
- watch(() => isValid.value, (value) => {
291
- emit('update:isValid', value);
292
- });
293
-
294
- </script>