@tinya-code/gas-admin-ui 0.2.0-alpha.13 → 0.2.0-alpha.15

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 (368) hide show
  1. package/ng-package.json +7 -0
  2. package/package.json +3 -15
  3. package/src/lib/actions/action-registry.spec.ts +52 -0
  4. package/src/lib/actions/action-registry.ts +126 -0
  5. package/src/lib/actions/action-service.spec.ts +215 -0
  6. package/src/lib/actions/action-service.ts +87 -0
  7. package/src/lib/actions/descriptors.spec.ts +155 -0
  8. package/src/lib/actions/descriptors.ts +154 -0
  9. package/src/lib/columns/column-cell.ts +33 -0
  10. package/src/lib/columns/column-defaults.spec.ts +99 -0
  11. package/src/lib/columns/column-defaults.ts +84 -0
  12. package/src/lib/columns/column-format.spec.ts +274 -0
  13. package/src/lib/columns/descriptors.ts +113 -0
  14. package/src/lib/columns/format-badge.ts +51 -0
  15. package/src/lib/columns/format-boolean.ts +58 -0
  16. package/src/lib/columns/format-currency.ts +30 -0
  17. package/src/lib/columns/format-date.ts +35 -0
  18. package/src/lib/columns/format-number.ts +32 -0
  19. package/src/lib/columns/format-text.ts +23 -0
  20. package/src/lib/columns/format-thumbnail.ts +63 -0
  21. package/src/lib/core/adapters/firebase-auth.adapter.ts +6 -0
  22. package/src/lib/core/guards/auth.guard.spec.ts +88 -0
  23. package/src/lib/core/guards/auth.guard.ts +48 -0
  24. package/src/lib/core/guards/unsaved-changes.guard.ts +16 -0
  25. package/src/lib/core/interceptors/api-error.interceptor.spec.ts +182 -0
  26. package/src/lib/core/interceptors/api-error.interceptor.ts +87 -0
  27. package/src/lib/core/models/api.model.ts +104 -0
  28. package/src/lib/core/models/schema-descriptions.ts +118 -0
  29. package/src/lib/core/models/schema.model.ts +1097 -0
  30. package/src/lib/core/registry/composition-validator.spec.ts +358 -0
  31. package/src/lib/core/registry/composition-validator.ts +270 -0
  32. package/src/lib/core/registry/field-validators.spec.ts +199 -0
  33. package/src/lib/core/registry/field-validators.ts +440 -0
  34. package/src/lib/core/registry/render-host.spec.ts +208 -0
  35. package/src/lib/core/registry/render-host.ts +646 -0
  36. package/src/lib/core/registry/render-registry.spec.ts +96 -0
  37. package/src/lib/core/registry/render-registry.ts +312 -0
  38. package/src/lib/core/registry/schema-catalog.ts +156 -0
  39. package/src/lib/core/services/api.service.spec.ts +1142 -0
  40. package/src/lib/core/services/api.service.ts +371 -0
  41. package/src/lib/core/services/auth.service.spec.ts +653 -0
  42. package/src/lib/core/services/auth.service.ts +503 -0
  43. package/src/lib/core/services/config.service.spec.ts +121 -0
  44. package/src/lib/core/services/config.service.ts +119 -0
  45. package/src/lib/core/services/data-source.service.spec.ts +179 -0
  46. package/src/lib/core/services/data-source.service.ts +142 -0
  47. package/src/lib/core/services/error-mapper.service.spec.ts +50 -0
  48. package/src/lib/core/services/error-mapper.service.ts +49 -0
  49. package/src/lib/core/services/notification.service.ts +73 -0
  50. package/src/lib/core/services/relation-drawer.service.ts +41 -0
  51. package/src/lib/core/services/theme.service.spec.ts +106 -0
  52. package/src/lib/core/services/theme.service.ts +86 -0
  53. package/src/lib/core/services/transport.spec.ts +198 -0
  54. package/src/lib/core/services/transport.ts +164 -0
  55. package/src/lib/core/services/upload.service.ts +81 -0
  56. package/src/lib/core/testing/categories.schema.ts +125 -0
  57. package/src/lib/core/testing/orders.schema.ts +372 -0
  58. package/src/lib/core/testing/products.schema.ts +258 -0
  59. package/src/lib/core/testing/site.schema.ts +195 -0
  60. package/src/lib/core/testing/test-catalog.ts +21 -0
  61. package/src/lib/core/tokens.ts +112 -0
  62. package/src/lib/core/utils/clipboard.spec.ts +55 -0
  63. package/src/lib/core/utils/clipboard.ts +90 -0
  64. package/src/lib/core/utils/context-resolver.spec.ts +95 -0
  65. package/src/lib/core/utils/context-resolver.ts +101 -0
  66. package/src/lib/core/utils/response-unwrapper.spec.ts +70 -0
  67. package/src/lib/core/utils/response-unwrapper.ts +103 -0
  68. package/src/lib/core/utils/source-options.spec.ts +96 -0
  69. package/src/lib/core/utils/source-options.ts +54 -0
  70. package/src/lib/core/utils/template-interpolator.spec.ts +59 -0
  71. package/src/lib/core/utils/template-interpolator.ts +56 -0
  72. package/src/lib/core/view-navigation/view-navigation.service.spec.ts +207 -0
  73. package/src/lib/core/view-navigation/view-navigation.service.ts +132 -0
  74. package/src/lib/fields/boolean/boolean.descriptor.ts +11 -0
  75. package/src/lib/fields/boolean/boolean.ts +40 -0
  76. package/src/lib/fields/color/color.descriptor.ts +12 -0
  77. package/src/lib/fields/color/color.ts +34 -0
  78. package/src/lib/fields/currency/currency.descriptor.ts +12 -0
  79. package/src/lib/fields/currency/currency.ts +67 -0
  80. package/src/lib/fields/date/date.descriptor.ts +12 -0
  81. package/src/lib/fields/date/date.ts +36 -0
  82. package/src/lib/fields/descriptors.ts +122 -0
  83. package/src/lib/fields/display/display-badge.ts +65 -0
  84. package/src/lib/fields/display/display-date.ts +39 -0
  85. package/src/lib/fields/display/display-defaults.ts +84 -0
  86. package/src/lib/fields/display/display-file.ts +41 -0
  87. package/src/lib/fields/display/display-image.ts +54 -0
  88. package/src/lib/fields/display/display-list.ts +107 -0
  89. package/src/lib/fields/display/display-number.ts +41 -0
  90. package/src/lib/fields/display/display-text.ts +42 -0
  91. package/src/lib/fields/display/display.spec.ts +242 -0
  92. package/src/lib/fields/dropdown/dropdown.descriptor.ts +12 -0
  93. package/src/lib/fields/dropdown/dropdown.ts +45 -0
  94. package/src/lib/fields/email/email.descriptor.ts +12 -0
  95. package/src/lib/fields/email/email.ts +28 -0
  96. package/src/lib/fields/field-aria.ts +60 -0
  97. package/src/lib/fields/field-host/field-host.spec.ts +118 -0
  98. package/src/lib/fields/field-host/field-host.ts +47 -0
  99. package/src/lib/fields/field-node.ts +88 -0
  100. package/src/lib/fields/file/file.descriptor.ts +14 -0
  101. package/src/lib/fields/file/file.spec.ts +134 -0
  102. package/src/lib/fields/file/file.ts +281 -0
  103. package/src/lib/fields/group/group.descriptor.ts +21 -0
  104. package/src/lib/fields/group/group.ts +110 -0
  105. package/src/lib/fields/image/image.descriptor.ts +12 -0
  106. package/src/lib/fields/image/image.spec.ts +117 -0
  107. package/src/lib/fields/image/image.ts +281 -0
  108. package/src/lib/fields/key-value/key-value.descriptor.ts +11 -0
  109. package/src/lib/fields/key-value/key-value.ts +283 -0
  110. package/src/lib/fields/list/list.descriptor.ts +21 -0
  111. package/src/lib/fields/list/list.ts +376 -0
  112. package/src/lib/fields/multiselect/multiselect.descriptor.ts +11 -0
  113. package/src/lib/fields/multiselect/multiselect.spec.ts +142 -0
  114. package/src/lib/fields/multiselect/multiselect.ts +152 -0
  115. package/src/lib/fields/number/number.descriptor.ts +12 -0
  116. package/src/lib/fields/number/number.ts +40 -0
  117. package/src/lib/fields/phone/phone.descriptor.ts +12 -0
  118. package/src/lib/fields/phone/phone.ts +46 -0
  119. package/src/lib/fields/readonly-text/readonly-text.descriptor.ts +12 -0
  120. package/src/lib/fields/readonly-text/readonly-text.ts +58 -0
  121. package/src/lib/fields/relation/relation.descriptor.ts +12 -0
  122. package/src/lib/fields/relation/relation.spec.ts +193 -0
  123. package/src/lib/fields/relation/relation.ts +224 -0
  124. package/src/lib/fields/rich-select/rich-select.descriptor.ts +12 -0
  125. package/src/lib/fields/rich-select/rich-select.ts +175 -0
  126. package/src/lib/fields/select/radio-mode.ts +25 -0
  127. package/src/lib/fields/select/select.descriptor.ts +12 -0
  128. package/src/lib/fields/select/select.spec.ts +162 -0
  129. package/src/lib/fields/select/select.ts +210 -0
  130. package/src/lib/fields/slug/slug.descriptor.ts +19 -0
  131. package/src/lib/fields/slug/slug.ts +67 -0
  132. package/src/lib/fields/string-list/string-list.descriptor.ts +11 -0
  133. package/src/lib/fields/string-list/string-list.ts +222 -0
  134. package/src/lib/fields/text/text.descriptor.ts +12 -0
  135. package/src/lib/fields/text/text.ts +35 -0
  136. package/src/lib/fields/textarea/textarea.descriptor.ts +12 -0
  137. package/src/lib/fields/textarea/textarea.spec.ts +117 -0
  138. package/src/lib/fields/textarea/textarea.ts +126 -0
  139. package/src/lib/fields/time/time.descriptor.ts +12 -0
  140. package/src/lib/fields/time/time.ts +28 -0
  141. package/src/lib/fields/unknown-render/unknown-render.ts +49 -0
  142. package/src/lib/fields/url/url.descriptor.ts +12 -0
  143. package/src/lib/fields/url/url.ts +53 -0
  144. package/src/lib/gas-admin-ui.spec.ts +21 -0
  145. package/src/lib/gas-admin-ui.ts +9 -0
  146. package/src/lib/layouts/descriptors.ts +9 -0
  147. package/src/lib/pages/dashboard/dashboard.ts +167 -0
  148. package/src/lib/pages/detail-view/detail-view.spec.ts +333 -0
  149. package/src/lib/pages/detail-view/detail-view.ts +570 -0
  150. package/src/lib/pages/drawer-form/drawer-form.ts +228 -0
  151. package/src/lib/pages/form-view/form-model.ts +88 -0
  152. package/src/lib/pages/form-view/form-schema.ts +255 -0
  153. package/src/lib/pages/form-view/form-view.ts +1622 -0
  154. package/src/lib/pages/list-view/list-view.formats.spec.ts +214 -0
  155. package/src/lib/pages/list-view/list-view.ts +882 -0
  156. package/src/lib/pages/login/login.spec.ts +109 -0
  157. package/src/lib/pages/login/login.ts +227 -0
  158. package/src/lib/pages/resource-page/resource-page.ts +234 -0
  159. package/src/lib/shared/components/badge/badge.ts +35 -0
  160. package/src/lib/shared/components/button/button.ts +65 -0
  161. package/src/lib/shared/components/confirm-dialog/confirm-dialog.ts +48 -0
  162. package/src/lib/shared/components/copy-button/copy-button.ts +56 -0
  163. package/src/lib/shared/components/copy-share/copy-share.spec.ts +122 -0
  164. package/src/lib/shared/components/copy-share/copy-share.ts +107 -0
  165. package/src/lib/shared/components/drawer/drawer.spec.ts +127 -0
  166. package/src/lib/shared/components/drawer/drawer.ts +172 -0
  167. package/src/lib/shared/components/empty-state/empty-state.ts +30 -0
  168. package/src/lib/shared/components/modal/modal.spec.ts +149 -0
  169. package/src/lib/shared/components/modal/modal.ts +145 -0
  170. package/src/lib/shared/components/post-create-modal/post-create-modal.spec.ts +165 -0
  171. package/src/lib/shared/components/post-create-modal/post-create-modal.ts +159 -0
  172. package/src/lib/shared/components/skeleton/skeleton.ts +31 -0
  173. package/src/lib/shared/components/toast/toast.ts +58 -0
  174. package/src/lib/shared/utils/col-span.ts +25 -0
  175. package/src/lib/shared/utils/condition-evaluator.ts +53 -0
  176. package/src/lib/shared/utils/depends-on.ts +48 -0
  177. package/src/lib/shared/utils/dialog-focus.ts +28 -0
  178. package/src/lib/shared/utils/field-path.ts +49 -0
  179. package/src/lib/shared/utils/gap-sorting.ts +144 -0
  180. package/src/lib/shared/utils/seed.spec.ts +64 -0
  181. package/src/lib/shared/utils/seed.ts +149 -0
  182. package/src/lib/shared/utils/slugify.ts +13 -0
  183. package/src/lib/shared/utils/validators.ts +41 -0
  184. package/src/lib/shell/layout/layout.ts +63 -0
  185. package/src/lib/shell/shell.routes.spec.ts +59 -0
  186. package/src/lib/shell/shell.routes.ts +122 -0
  187. package/src/lib/shell/sidebar/sidebar.ts +139 -0
  188. package/src/lib/shell/theme-toggle/theme-toggle.ts +74 -0
  189. package/src/lib/views/calendar-view/calendar-model.ts +426 -0
  190. package/src/lib/views/calendar-view/calendar-view.spec.ts +557 -0
  191. package/src/lib/views/calendar-view/calendar-view.ts +568 -0
  192. package/src/lib/views/composer/composer-host.spec.ts +301 -0
  193. package/src/lib/views/composer/composer-host.ts +248 -0
  194. package/src/lib/views/composer/composer-imports.spec.ts +54 -0
  195. package/src/lib/views/composer/view-context.spec.ts +117 -0
  196. package/src/lib/views/composer/view-context.ts +109 -0
  197. package/src/lib/views/composer/view-slot.spec.ts +130 -0
  198. package/src/lib/views/composer/view-slot.ts +178 -0
  199. package/src/lib/views/descriptors.ts +46 -0
  200. package/src/lib/views/kanban-view/kanban-model.ts +173 -0
  201. package/src/lib/views/kanban-view/kanban-view.spec.ts +540 -0
  202. package/src/lib/views/kanban-view/kanban-view.ts +327 -0
  203. package/src/lib/widgets/bar-chart/bar-chart.descriptor.ts +17 -0
  204. package/src/lib/widgets/bar-chart/bar-chart.spec.ts +66 -0
  205. package/src/lib/widgets/bar-chart/bar-chart.ts +76 -0
  206. package/src/lib/widgets/chart-line/chart-line.descriptor.ts +17 -0
  207. package/src/lib/widgets/chart-line/chart-line.spec.ts +113 -0
  208. package/src/lib/widgets/chart-line/chart-line.ts +219 -0
  209. package/src/lib/widgets/descriptors.ts +29 -0
  210. package/src/lib/widgets/metric-card/metric-card.descriptor.ts +41 -0
  211. package/src/lib/widgets/metric-card/metric-card.spec.ts +52 -0
  212. package/src/lib/widgets/metric-card/metric-card.ts +48 -0
  213. package/src/lib/widgets/quick-actions/quick-actions.descriptor.ts +13 -0
  214. package/src/lib/widgets/quick-actions/quick-actions.spec.ts +61 -0
  215. package/src/lib/widgets/quick-actions/quick-actions.ts +100 -0
  216. package/src/lib/widgets/record-list/record-list.descriptor.ts +16 -0
  217. package/src/lib/widgets/record-list/record-list.spec.ts +79 -0
  218. package/src/lib/widgets/record-list/record-list.ts +115 -0
  219. package/src/lib/widgets/series.spec.ts +42 -0
  220. package/src/lib/widgets/series.ts +56 -0
  221. package/src/lib/widgets/status-progress/status-progress.descriptor.ts +19 -0
  222. package/src/lib/widgets/status-progress/status-progress.spec.ts +63 -0
  223. package/src/lib/widgets/status-progress/status-progress.ts +104 -0
  224. package/src/lib/widgets/widget-host/widget-host.spec.ts +179 -0
  225. package/src/lib/widgets/widget-host/widget-host.ts +99 -0
  226. package/src/public-api.ts +104 -0
  227. package/tinya-code-gas-admin-ui-0.2.0-alpha.15.tgz +0 -0
  228. package/tsconfig.lib.json +13 -0
  229. package/tsconfig.lib.prod.json +11 -0
  230. package/tsconfig.spec.json +10 -0
  231. package/fesm2022/tinya-code-gas-admin-ui-badge-EeCA_l-o.mjs +0 -84
  232. package/fesm2022/tinya-code-gas-admin-ui-badge-EeCA_l-o.mjs.map +0 -1
  233. package/fesm2022/tinya-code-gas-admin-ui-bar-chart-G7sEMSBY.mjs +0 -140
  234. package/fesm2022/tinya-code-gas-admin-ui-bar-chart-G7sEMSBY.mjs.map +0 -1
  235. package/fesm2022/tinya-code-gas-admin-ui-boolean-B2ASKL0E.mjs +0 -113
  236. package/fesm2022/tinya-code-gas-admin-ui-boolean-B2ASKL0E.mjs.map +0 -1
  237. package/fesm2022/tinya-code-gas-admin-ui-button-BQjNW8KB.mjs +0 -163
  238. package/fesm2022/tinya-code-gas-admin-ui-button-BQjNW8KB.mjs.map +0 -1
  239. package/fesm2022/tinya-code-gas-admin-ui-calendar-view-DCY8bj2V.mjs +0 -1027
  240. package/fesm2022/tinya-code-gas-admin-ui-calendar-view-DCY8bj2V.mjs.map +0 -1
  241. package/fesm2022/tinya-code-gas-admin-ui-chart-line-BjdlKHoH.mjs +0 -278
  242. package/fesm2022/tinya-code-gas-admin-ui-chart-line-BjdlKHoH.mjs.map +0 -1
  243. package/fesm2022/tinya-code-gas-admin-ui-color-Dljh_By3.mjs +0 -107
  244. package/fesm2022/tinya-code-gas-admin-ui-color-Dljh_By3.mjs.map +0 -1
  245. package/fesm2022/tinya-code-gas-admin-ui-condition-evaluator-DY2k1M3C.mjs +0 -101
  246. package/fesm2022/tinya-code-gas-admin-ui-condition-evaluator-DY2k1M3C.mjs.map +0 -1
  247. package/fesm2022/tinya-code-gas-admin-ui-currency-BvuF3Z63.mjs +0 -141
  248. package/fesm2022/tinya-code-gas-admin-ui-currency-BvuF3Z63.mjs.map +0 -1
  249. package/fesm2022/tinya-code-gas-admin-ui-data-source.service-96FSbN72.mjs +0 -88
  250. package/fesm2022/tinya-code-gas-admin-ui-data-source.service-96FSbN72.mjs.map +0 -1
  251. package/fesm2022/tinya-code-gas-admin-ui-date-1SJGXZrd.mjs +0 -107
  252. package/fesm2022/tinya-code-gas-admin-ui-date-1SJGXZrd.mjs.map +0 -1
  253. package/fesm2022/tinya-code-gas-admin-ui-display-badge-fwk6sDU7.mjs +0 -140
  254. package/fesm2022/tinya-code-gas-admin-ui-display-badge-fwk6sDU7.mjs.map +0 -1
  255. package/fesm2022/tinya-code-gas-admin-ui-display-date-D7zLiDiG.mjs +0 -119
  256. package/fesm2022/tinya-code-gas-admin-ui-display-date-D7zLiDiG.mjs.map +0 -1
  257. package/fesm2022/tinya-code-gas-admin-ui-display-file-BiIhqvQC.mjs +0 -125
  258. package/fesm2022/tinya-code-gas-admin-ui-display-file-BiIhqvQC.mjs.map +0 -1
  259. package/fesm2022/tinya-code-gas-admin-ui-display-image-C1dhnZi1.mjs +0 -152
  260. package/fesm2022/tinya-code-gas-admin-ui-display-image-C1dhnZi1.mjs.map +0 -1
  261. package/fesm2022/tinya-code-gas-admin-ui-display-list-DOEuUbGe.mjs +0 -211
  262. package/fesm2022/tinya-code-gas-admin-ui-display-list-DOEuUbGe.mjs.map +0 -1
  263. package/fesm2022/tinya-code-gas-admin-ui-display-number-DDMzr4Hn.mjs +0 -116
  264. package/fesm2022/tinya-code-gas-admin-ui-display-number-DDMzr4Hn.mjs.map +0 -1
  265. package/fesm2022/tinya-code-gas-admin-ui-display-text-B8CdVNpv.mjs +0 -111
  266. package/fesm2022/tinya-code-gas-admin-ui-display-text-B8CdVNpv.mjs.map +0 -1
  267. package/fesm2022/tinya-code-gas-admin-ui-dropdown-C3blvmE1.mjs +0 -122
  268. package/fesm2022/tinya-code-gas-admin-ui-dropdown-C3blvmE1.mjs.map +0 -1
  269. package/fesm2022/tinya-code-gas-admin-ui-email-CT_O5ihA.mjs +0 -107
  270. package/fesm2022/tinya-code-gas-admin-ui-email-CT_O5ihA.mjs.map +0 -1
  271. package/fesm2022/tinya-code-gas-admin-ui-empty-state-BMc0QtoT.mjs +0 -109
  272. package/fesm2022/tinya-code-gas-admin-ui-empty-state-BMc0QtoT.mjs.map +0 -1
  273. package/fesm2022/tinya-code-gas-admin-ui-error-mapper.service-DY5y1FjE.mjs +0 -45
  274. package/fesm2022/tinya-code-gas-admin-ui-error-mapper.service-DY5y1FjE.mjs.map +0 -1
  275. package/fesm2022/tinya-code-gas-admin-ui-field-aria-BD1Wiggc.mjs +0 -50
  276. package/fesm2022/tinya-code-gas-admin-ui-field-aria-BD1Wiggc.mjs.map +0 -1
  277. package/fesm2022/tinya-code-gas-admin-ui-field-node-CIK6KNN_.mjs +0 -24
  278. package/fesm2022/tinya-code-gas-admin-ui-field-node-CIK6KNN_.mjs.map +0 -1
  279. package/fesm2022/tinya-code-gas-admin-ui-field-path-B4-FTBGZ.mjs +0 -27
  280. package/fesm2022/tinya-code-gas-admin-ui-field-path-B4-FTBGZ.mjs.map +0 -1
  281. package/fesm2022/tinya-code-gas-admin-ui-file-Dmxioog7.mjs +0 -408
  282. package/fesm2022/tinya-code-gas-admin-ui-file-Dmxioog7.mjs.map +0 -1
  283. package/fesm2022/tinya-code-gas-admin-ui-form-view-C709rc57.mjs +0 -4516
  284. package/fesm2022/tinya-code-gas-admin-ui-form-view-C709rc57.mjs.map +0 -1
  285. package/fesm2022/tinya-code-gas-admin-ui-format-badge-CK8ct5Wk.mjs +0 -82
  286. package/fesm2022/tinya-code-gas-admin-ui-format-badge-CK8ct5Wk.mjs.map +0 -1
  287. package/fesm2022/tinya-code-gas-admin-ui-format-boolean-ClzezZz-.mjs +0 -105
  288. package/fesm2022/tinya-code-gas-admin-ui-format-boolean-ClzezZz-.mjs.map +0 -1
  289. package/fesm2022/tinya-code-gas-admin-ui-format-currency-CVmniKml.mjs +0 -65
  290. package/fesm2022/tinya-code-gas-admin-ui-format-currency-CVmniKml.mjs.map +0 -1
  291. package/fesm2022/tinya-code-gas-admin-ui-format-date-Dr1YsDd_.mjs +0 -65
  292. package/fesm2022/tinya-code-gas-admin-ui-format-date-Dr1YsDd_.mjs.map +0 -1
  293. package/fesm2022/tinya-code-gas-admin-ui-format-number-CWCjpI4n.mjs +0 -65
  294. package/fesm2022/tinya-code-gas-admin-ui-format-number-CWCjpI4n.mjs.map +0 -1
  295. package/fesm2022/tinya-code-gas-admin-ui-format-text-DBOgJkH0.mjs +0 -59
  296. package/fesm2022/tinya-code-gas-admin-ui-format-text-DBOgJkH0.mjs.map +0 -1
  297. package/fesm2022/tinya-code-gas-admin-ui-format-thumbnail-PCRvxWKt.mjs +0 -94
  298. package/fesm2022/tinya-code-gas-admin-ui-format-thumbnail-PCRvxWKt.mjs.map +0 -1
  299. package/fesm2022/tinya-code-gas-admin-ui-gap-sorting-iTdy_DYG.mjs +0 -72
  300. package/fesm2022/tinya-code-gas-admin-ui-gap-sorting-iTdy_DYG.mjs.map +0 -1
  301. package/fesm2022/tinya-code-gas-admin-ui-group-h7-O8tt4.mjs +0 -238
  302. package/fesm2022/tinya-code-gas-admin-ui-group-h7-O8tt4.mjs.map +0 -1
  303. package/fesm2022/tinya-code-gas-admin-ui-image-7UhJ7nqI.mjs +0 -416
  304. package/fesm2022/tinya-code-gas-admin-ui-image-7UhJ7nqI.mjs.map +0 -1
  305. package/fesm2022/tinya-code-gas-admin-ui-kanban-view-Dl0Ol5Kb.mjs +0 -439
  306. package/fesm2022/tinya-code-gas-admin-ui-kanban-view-Dl0Ol5Kb.mjs.map +0 -1
  307. package/fesm2022/tinya-code-gas-admin-ui-key-value-nVdgg5at.mjs +0 -513
  308. package/fesm2022/tinya-code-gas-admin-ui-key-value-nVdgg5at.mjs.map +0 -1
  309. package/fesm2022/tinya-code-gas-admin-ui-list-C8ijJHAx.mjs +0 -637
  310. package/fesm2022/tinya-code-gas-admin-ui-list-C8ijJHAx.mjs.map +0 -1
  311. package/fesm2022/tinya-code-gas-admin-ui-metric-card-DnGMQL8l.mjs +0 -127
  312. package/fesm2022/tinya-code-gas-admin-ui-metric-card-DnGMQL8l.mjs.map +0 -1
  313. package/fesm2022/tinya-code-gas-admin-ui-multiselect-PB28e-jl.mjs +0 -251
  314. package/fesm2022/tinya-code-gas-admin-ui-multiselect-PB28e-jl.mjs.map +0 -1
  315. package/fesm2022/tinya-code-gas-admin-ui-notification.service-LjSULER6.mjs +0 -66
  316. package/fesm2022/tinya-code-gas-admin-ui-notification.service-LjSULER6.mjs.map +0 -1
  317. package/fesm2022/tinya-code-gas-admin-ui-number-JNr7glc8.mjs +0 -114
  318. package/fesm2022/tinya-code-gas-admin-ui-number-JNr7glc8.mjs.map +0 -1
  319. package/fesm2022/tinya-code-gas-admin-ui-phone-jR417hPf.mjs +0 -116
  320. package/fesm2022/tinya-code-gas-admin-ui-phone-jR417hPf.mjs.map +0 -1
  321. package/fesm2022/tinya-code-gas-admin-ui-quick-actions-DCQ6emmF.mjs +0 -235
  322. package/fesm2022/tinya-code-gas-admin-ui-quick-actions-DCQ6emmF.mjs.map +0 -1
  323. package/fesm2022/tinya-code-gas-admin-ui-radio-mode-DxvN07DY.mjs +0 -8
  324. package/fesm2022/tinya-code-gas-admin-ui-radio-mode-DxvN07DY.mjs.map +0 -1
  325. package/fesm2022/tinya-code-gas-admin-ui-readonly-text-BL7-4qie.mjs +0 -124
  326. package/fesm2022/tinya-code-gas-admin-ui-readonly-text-BL7-4qie.mjs.map +0 -1
  327. package/fesm2022/tinya-code-gas-admin-ui-record-list-BiZfnd_7.mjs +0 -249
  328. package/fesm2022/tinya-code-gas-admin-ui-record-list-BiZfnd_7.mjs.map +0 -1
  329. package/fesm2022/tinya-code-gas-admin-ui-relation-drawer.service-B0kT8EiW.mjs +0 -39
  330. package/fesm2022/tinya-code-gas-admin-ui-relation-drawer.service-B0kT8EiW.mjs.map +0 -1
  331. package/fesm2022/tinya-code-gas-admin-ui-relation-ykpJ3PYl.mjs +0 -309
  332. package/fesm2022/tinya-code-gas-admin-ui-relation-ykpJ3PYl.mjs.map +0 -1
  333. package/fesm2022/tinya-code-gas-admin-ui-render-registry-CULkxrSt.mjs +0 -576
  334. package/fesm2022/tinya-code-gas-admin-ui-render-registry-CULkxrSt.mjs.map +0 -1
  335. package/fesm2022/tinya-code-gas-admin-ui-rich-select-CIHaOrbU.mjs +0 -161
  336. package/fesm2022/tinya-code-gas-admin-ui-rich-select-CIHaOrbU.mjs.map +0 -1
  337. package/fesm2022/tinya-code-gas-admin-ui-rolldown-runtime-DpJrqANO.mjs +0 -11
  338. package/fesm2022/tinya-code-gas-admin-ui-schema-catalog-D0Pk0wAN.mjs +0 -685
  339. package/fesm2022/tinya-code-gas-admin-ui-schema-catalog-D0Pk0wAN.mjs.map +0 -1
  340. package/fesm2022/tinya-code-gas-admin-ui-seed-CcCA3FdQ.mjs +0 -80
  341. package/fesm2022/tinya-code-gas-admin-ui-seed-CcCA3FdQ.mjs.map +0 -1
  342. package/fesm2022/tinya-code-gas-admin-ui-select-CDwX9yNO.mjs +0 -296
  343. package/fesm2022/tinya-code-gas-admin-ui-select-CDwX9yNO.mjs.map +0 -1
  344. package/fesm2022/tinya-code-gas-admin-ui-skeleton-DnWK0tcZ.mjs +0 -119
  345. package/fesm2022/tinya-code-gas-admin-ui-skeleton-DnWK0tcZ.mjs.map +0 -1
  346. package/fesm2022/tinya-code-gas-admin-ui-slug-DU58cbiY.mjs +0 -158
  347. package/fesm2022/tinya-code-gas-admin-ui-slug-DU58cbiY.mjs.map +0 -1
  348. package/fesm2022/tinya-code-gas-admin-ui-source-options-B9R4mw8-.mjs +0 -26
  349. package/fesm2022/tinya-code-gas-admin-ui-source-options-B9R4mw8-.mjs.map +0 -1
  350. package/fesm2022/tinya-code-gas-admin-ui-status-progress-DmeG8htE.mjs +0 -205
  351. package/fesm2022/tinya-code-gas-admin-ui-status-progress-DmeG8htE.mjs.map +0 -1
  352. package/fesm2022/tinya-code-gas-admin-ui-string-list-gleasqzD.mjs +0 -432
  353. package/fesm2022/tinya-code-gas-admin-ui-string-list-gleasqzD.mjs.map +0 -1
  354. package/fesm2022/tinya-code-gas-admin-ui-template-interpolator-ewv7CkNX.mjs +0 -36
  355. package/fesm2022/tinya-code-gas-admin-ui-template-interpolator-ewv7CkNX.mjs.map +0 -1
  356. package/fesm2022/tinya-code-gas-admin-ui-text-CUPmL7W_.mjs +0 -107
  357. package/fesm2022/tinya-code-gas-admin-ui-text-CUPmL7W_.mjs.map +0 -1
  358. package/fesm2022/tinya-code-gas-admin-ui-textarea-CGLSIW13.mjs +0 -223
  359. package/fesm2022/tinya-code-gas-admin-ui-textarea-CGLSIW13.mjs.map +0 -1
  360. package/fesm2022/tinya-code-gas-admin-ui-time-BcHzsTWf.mjs +0 -107
  361. package/fesm2022/tinya-code-gas-admin-ui-time-BcHzsTWf.mjs.map +0 -1
  362. package/fesm2022/tinya-code-gas-admin-ui-upload.service-CZPEPCeN.mjs +0 -60
  363. package/fesm2022/tinya-code-gas-admin-ui-upload.service-CZPEPCeN.mjs.map +0 -1
  364. package/fesm2022/tinya-code-gas-admin-ui-url-GO4LZi__.mjs +0 -141
  365. package/fesm2022/tinya-code-gas-admin-ui-url-GO4LZi__.mjs.map +0 -1
  366. package/fesm2022/tinya-code-gas-admin-ui.mjs +0 -4599
  367. package/fesm2022/tinya-code-gas-admin-ui.mjs.map +0 -1
  368. package/types/tinya-code-gas-admin-ui.d.ts +0 -3632
@@ -1 +0,0 @@
1
- {"version":3,"file":"tinya-code-gas-admin-ui-gap-sorting-iTdy_DYG.mjs","names":[],"sources":["../../../projects/gas-admin-ui/src/lib/shared/utils/gap-sorting.ts"],"sourcesContent":["/**\n * Ordenamiento con huecos (base.md §8).\n *\n * Reglas:\n * - Posiciones enteras con separación fija (paso 1000: 1000, 2000, 3000…).\n * - Mover entre dos vecinos → punto medio; solo cambia ese elemento.\n * - Mover al inicio → la mitad de la posición del primero.\n * - Mover al final → la del último + paso.\n * - Lista vacía → el paso.\n * - Si los vecinos quedan sin espacio (diferencia < 2) → rebalanceo:\n * se renumera toda la lista con el paso original conservando el orden\n * y luego se aplica el movimiento.\n * - Nuevos elementos → última posición + paso.\n *\n * El usuario nunca ve los números; la UI ordena por `position` ascendente.\n */\n\n/** Separación fija entre posiciones. */\nexport const GAP = 1000;\n\nexport interface PositionedItem {\n key: string;\n position: number;\n}\n\nexport interface PositionChange {\n key: string;\n position: number;\n}\n\nexport interface ReorderResult {\n /** `true` → hubo rebalanceo: `changes` contiene el lote completo renumerado. */\n rebalanced: boolean;\n /** Cambios a enviar: solo el elemento movido, o el lote completo. */\n changes: PositionChange[];\n}\n\n/** Punto medio entre dos vecinos (solo el elemento movido cambia). */\nexport function moveBetween(prevPosition: number, nextPosition: number): number {\n return Math.floor((prevPosition + nextPosition) / 2);\n}\n\n/** Mover al inicio: la mitad de la posición del primero. */\nexport function moveToStart(firstPosition: number): number {\n return Math.floor(firstPosition / 2);\n}\n\n/** Mover al final: la del último + paso. */\nexport function moveToEnd(lastPosition: number): number {\n return lastPosition + GAP;\n}\n\n/** Posición de un elemento nuevo: al final (lista vacía → el paso). */\nexport function appendPosition(items: PositionedItem[]): number {\n const sorted = sortItems(items);\n if (sorted.length === 0) {\n return GAP;\n }\n return moveToEnd(sorted[sorted.length - 1].position);\n}\n\n/** ¿Falta espacio para insertar en `targetIndex`? (base.md §8) */\nexport function needsRebalance(\n items: PositionedItem[],\n movingKey: string,\n targetIndex: number,\n): boolean {\n const without = sortItems(items.filter((item) => item.key !== movingKey));\n if (without.length === 0) {\n return false; // lista vacía → el paso siempre cabe\n }\n const index = clamp(targetIndex, 0, without.length);\n if (index === without.length) {\n return false; // al final → +paso siempre cabe\n }\n if (index === 0) {\n const first = without[0];\n return first.position - moveToStart(first.position) < 2;\n }\n const prev = without[index - 1];\n const next = without[index];\n return next.position - prev.position < 2;\n}\n\n/** Renumera la lista completa con el paso original, conservando el orden. */\nexport function rebalance(items: PositionedItem[], gap: number = GAP): PositionChange[] {\n return sortItems(items).map((item, index) => ({\n key: item.key,\n position: (index + 1) * gap,\n }));\n}\n\n/**\n * Calcula el resultado de soltar `movingKey` en `targetIndex`\n * (índice que ocupará en la lista SIN el elemento movido, ya ordenada).\n */\nexport function computeMove(\n items: PositionedItem[],\n movingKey: string,\n targetIndex: number,\n): ReorderResult {\n const sorted = sortItems(items);\n if (!sorted.some((item) => item.key === movingKey)) {\n throw new Error(`Elemento no encontrado: ${movingKey}`);\n }\n const without = sorted.filter((item) => item.key !== movingKey);\n const index = clamp(targetIndex, 0, without.length);\n\n if (needsRebalance(sorted, movingKey, targetIndex)) {\n // Renumerar toda la lista y luego aplicar el movimiento.\n const renumbered = rebalance(without);\n const position = positionFor(renumbered, index);\n return {\n rebalanced: true,\n changes: [...renumbered, { key: movingKey, position }],\n };\n }\n\n return {\n rebalanced: false,\n changes: [{ key: movingKey, position: positionFor(without, index) }],\n };\n}\n\nfunction positionFor(without: PositionChange[], index: number): number {\n if (without.length === 0) {\n return GAP;\n }\n if (index === 0) {\n return moveToStart(without[0].position);\n }\n if (index === without.length) {\n return moveToEnd(without[without.length - 1].position);\n }\n return moveBetween(without[index - 1].position, without[index].position);\n}\n\nfunction sortItems(items: PositionedItem[]): PositionedItem[] {\n return [...items].sort((a, b) => a.position - b.position);\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n"],"mappings":"AAkBA,MAAa,MAAM;AAoBnB,SAAgB,YAAY,cAAsB,cAAoB;CACpE,OAAO,KAAK,OAAO,eAAe,gBAAgB,CAAC;AACrD;AAGA,SAAgB,YAAY,eAAqB;CAC/C,OAAO,KAAK,MAAM,gBAAgB,CAAC;AACrC;AAGA,SAAgB,UAAU,cAAoB;CAC5C,OAAO,eAAe;AACxB;AAGA,SAAgB,eAAe,OAAuB;CACpD,MAAM,SAAS,UAAU,KAAK;CAC9B,IAAI,OAAO,WAAW,GACpB,OAAO;CAET,OAAO,UAAU,OAAO,OAAO,SAAS,EAAE,CAAC,QAAQ;AACrD;AAGA,SAAgB,eACd,OACA,WACA,aAAmB;CAEnB,MAAM,UAAU,UAAU,MAAM,QAAQ,SAAS,KAAK,QAAQ,SAAS,CAAC;CACxE,IAAI,QAAQ,WAAW,GACrB,OAAO;CAET,MAAM,QAAQ,MAAM,aAAa,GAAG,QAAQ,MAAM;CAClD,IAAI,UAAU,QAAQ,QACpB,OAAO;CAET,IAAI,UAAU,GAAG;EACf,MAAM,QAAQ,QAAQ;EACtB,OAAO,MAAM,WAAW,YAAY,MAAM,QAAQ,IAAI;CACxD;CACA,MAAM,OAAO,QAAQ,QAAQ;CAE7B,OADa,QAAQ,MACd,CAAK,WAAW,KAAK,WAAW;AACzC;AAGA,SAAgB,UAAU,OAAyB,MAAc,KAAG;CAClE,OAAO,UAAU,KAAK,CAAC,CAAC,KAAK,MAAM,WAAW;EAC5C,KAAK,KAAK;EACV,WAAW,QAAQ,KAAK;CACzB,EAAC;AACJ;AAMA,SAAgB,YACd,OACA,WACA,aAAmB;CAEnB,MAAM,SAAS,UAAU,KAAK;CAC9B,IAAI,CAAC,OAAO,MAAM,SAAS,KAAK,QAAQ,SAAS,GAC/C,MAAM,IAAI,MAAM,2BAA2B,WAAW;CAExD,MAAM,UAAU,OAAO,QAAQ,SAAS,KAAK,QAAQ,SAAS;CAC9D,MAAM,QAAQ,MAAM,aAAa,GAAG,QAAQ,MAAM;CAElD,IAAI,eAAe,QAAQ,WAAW,WAAW,GAAG;EAElD,MAAM,aAAa,UAAU,OAAO;EACpC,MAAM,WAAW,YAAY,YAAY,KAAK;EAC9C,OAAO;GACL,YAAY;GACZ,SAAS,CAAC,GAAG,YAAY;IAAE,KAAK;IAAW;GAAQ,CAAE;EACtD;CACH;CAEA,OAAO;EACL,YAAY;EACZ,SAAS,CAAC;GAAE,KAAK;GAAW,UAAU,YAAY,SAAS,KAAK;EAAC,CAAE;CACpE;AACH;AAEA,SAAS,YAAY,SAA2B,OAAa;CAC3D,IAAI,QAAQ,WAAW,GACrB,OAAO;CAET,IAAI,UAAU,GACZ,OAAO,YAAY,QAAQ,EAAE,CAAC,QAAQ;CAExC,IAAI,UAAU,QAAQ,QACpB,OAAO,UAAU,QAAQ,QAAQ,SAAS,EAAE,CAAC,QAAQ;CAEvD,OAAO,YAAY,QAAQ,QAAQ,EAAE,CAAC,UAAU,QAAQ,MAAM,CAAC,QAAQ;AACzE;AAEA,SAAS,UAAU,OAAuB;CACxC,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,MAAM,GAAG,MAAM,EAAE,WAAW,EAAE,QAAQ;AAC1D;AAEA,SAAS,MAAM,OAAe,KAAa,KAAW;CACpD,OAAO,KAAK,IAAI,KAAK,IAAI,OAAO,GAAG,GAAG,GAAG;AAC3C"}
@@ -1,238 +0,0 @@
1
- import { t as childTree } from "./tinya-code-gas-admin-ui-field-node-CIK6KNN_.mjs";
2
- import * as i0 from "@angular/core";
3
- import { Component, computed, input, signal } from "@angular/core";
4
- import { NgTemplateOutlet } from "@angular/common";
5
- var FieldGroup = class FieldGroup {
6
- field = input.required(...ngDevMode ? [{ debugName: "field" }] : /* istanbul ignore next */ []);
7
- tree = input.required(...ngDevMode ? [{ debugName: "tree" }] : /* istanbul ignore next */ []);
8
- serverErrors = input({}, ...ngDevMode ? [{ debugName: "serverErrors" }] : /* istanbul ignore next */ []);
9
- pathPrefix = input("", ...ngDevMode ? [{ debugName: "pathPrefix" }] : /* istanbul ignore next */ []);
10
- content = input.required(...ngDevMode ? [{ debugName: "content" }] : /* istanbul ignore next */ []);
11
- display = computed(() => this.field().display ?? "card", ...ngDevMode ? [{ debugName: "display" }] : /* istanbul ignore next */ []);
12
- state = computed(() => childTree(this.tree(), this.field().key)(), ...ngDevMode ? [{ debugName: "state" }] : /* istanbul ignore next */ []);
13
- hasProblem = computed(() => this.state().invalid() && this.state().touched() || this.hasServerError(), ...ngDevMode ? [{ debugName: "hasProblem" }] : /* istanbul ignore next */ []);
14
- open = signal(false, ...ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []);
15
- onToggle(event) {
16
- this.open.set(event.currentTarget.open);
17
- }
18
- hasServerError() {
19
- const prefix = `${this.pathPrefix()}${this.field().key}.`;
20
- return Object.keys(this.serverErrors()).some((path) => path.startsWith(prefix));
21
- }
22
- static ɵfac = i0.ɵɵngDeclareFactory({
23
- minVersion: "12.0.0",
24
- version: "22.2.3",
25
- ngImport: i0,
26
- type: FieldGroup,
27
- deps: [],
28
- target: i0.ɵɵFactoryTarget.Component
29
- });
30
- static ɵcmp = i0.ɵɵngDeclareComponent({
31
- minVersion: "17.0.0",
32
- version: "22.2.3",
33
- type: FieldGroup,
34
- isStandalone: true,
35
- selector: "app-field-group",
36
- inputs: {
37
- field: {
38
- classPropertyName: "field",
39
- publicName: "field",
40
- isSignal: true,
41
- isRequired: true,
42
- transformFunction: null
43
- },
44
- tree: {
45
- classPropertyName: "tree",
46
- publicName: "tree",
47
- isSignal: true,
48
- isRequired: true,
49
- transformFunction: null
50
- },
51
- serverErrors: {
52
- classPropertyName: "serverErrors",
53
- publicName: "serverErrors",
54
- isSignal: true,
55
- isRequired: false,
56
- transformFunction: null
57
- },
58
- pathPrefix: {
59
- classPropertyName: "pathPrefix",
60
- publicName: "pathPrefix",
61
- isSignal: true,
62
- isRequired: false,
63
- transformFunction: null
64
- },
65
- content: {
66
- classPropertyName: "content",
67
- publicName: "content",
68
- isSignal: true,
69
- isRequired: true,
70
- transformFunction: null
71
- }
72
- },
73
- ngImport: i0,
74
- template: `
75
- @if (display() === 'collapsible') {
76
- <details
77
- class="rounded-xl border border-neutral/20 bg-surface"
78
- [open]="open() || hasProblem()"
79
- (toggle)="onToggle($event)"
80
- >
81
- <summary
82
- class="flex cursor-pointer items-center justify-between gap-2 rounded-xl px-4 py-3 text-section font-semibold hover:bg-neutral/5"
83
- >
84
- <span>
85
- {{ field().label }}
86
- @if (field().required) {
87
- <span class="text-danger" aria-hidden="true">*</span>
88
- }
89
- </span>
90
- @if (hasProblem()) {
91
- <span class="text-xs font-medium text-danger">Revisar</span>
92
- }
93
- </summary>
94
- <div class="px-4 pb-4">
95
- <div class="grid grid-cols-1 gap-x-4 sm:grid-cols-12">
96
- <ng-container [ngTemplateOutlet]="content()" />
97
- </div>
98
- </div>
99
- </details>
100
- } @else if (display() === 'inline') {
101
- <div class="grid grid-cols-1 gap-x-4 sm:grid-cols-12">
102
- <ng-container [ngTemplateOutlet]="content()" />
103
- </div>
104
- } @else {
105
- <section class="rounded-xl border border-neutral/20 bg-surface p-4">
106
- <h2 class="mb-3 text-section font-semibold">
107
- {{ field().label }}
108
- @if (field().required) {
109
- <span class="text-danger" aria-hidden="true">*</span>
110
- }
111
- @if (hasProblem()) {
112
- <span class="ml-2 text-xs font-medium text-danger">Revisar</span>
113
- }
114
- </h2>
115
- <div class="grid grid-cols-1 gap-x-4 sm:grid-cols-12">
116
- <ng-container [ngTemplateOutlet]="content()" />
117
- </div>
118
- </section>
119
- }
120
- `,
121
- isInline: true,
122
- dependencies: [{
123
- kind: "directive",
124
- type: NgTemplateOutlet,
125
- selector: "[ngTemplateOutlet]",
126
- inputs: [
127
- "ngTemplateOutletContext",
128
- "ngTemplateOutlet",
129
- "ngTemplateOutletInjector"
130
- ]
131
- }]
132
- });
133
- };
134
- i0.ɵɵngDeclareClassMetadata({
135
- minVersion: "12.0.0",
136
- version: "22.2.3",
137
- ngImport: i0,
138
- type: FieldGroup,
139
- decorators: [{
140
- type: Component,
141
- args: [{
142
- selector: "app-field-group",
143
- imports: [NgTemplateOutlet],
144
- template: `
145
- @if (display() === 'collapsible') {
146
- <details
147
- class="rounded-xl border border-neutral/20 bg-surface"
148
- [open]="open() || hasProblem()"
149
- (toggle)="onToggle($event)"
150
- >
151
- <summary
152
- class="flex cursor-pointer items-center justify-between gap-2 rounded-xl px-4 py-3 text-section font-semibold hover:bg-neutral/5"
153
- >
154
- <span>
155
- {{ field().label }}
156
- @if (field().required) {
157
- <span class="text-danger" aria-hidden="true">*</span>
158
- }
159
- </span>
160
- @if (hasProblem()) {
161
- <span class="text-xs font-medium text-danger">Revisar</span>
162
- }
163
- </summary>
164
- <div class="px-4 pb-4">
165
- <div class="grid grid-cols-1 gap-x-4 sm:grid-cols-12">
166
- <ng-container [ngTemplateOutlet]="content()" />
167
- </div>
168
- </div>
169
- </details>
170
- } @else if (display() === 'inline') {
171
- <div class="grid grid-cols-1 gap-x-4 sm:grid-cols-12">
172
- <ng-container [ngTemplateOutlet]="content()" />
173
- </div>
174
- } @else {
175
- <section class="rounded-xl border border-neutral/20 bg-surface p-4">
176
- <h2 class="mb-3 text-section font-semibold">
177
- {{ field().label }}
178
- @if (field().required) {
179
- <span class="text-danger" aria-hidden="true">*</span>
180
- }
181
- @if (hasProblem()) {
182
- <span class="ml-2 text-xs font-medium text-danger">Revisar</span>
183
- }
184
- </h2>
185
- <div class="grid grid-cols-1 gap-x-4 sm:grid-cols-12">
186
- <ng-container [ngTemplateOutlet]="content()" />
187
- </div>
188
- </section>
189
- }
190
- `
191
- }]
192
- }],
193
- propDecorators: {
194
- field: [{
195
- type: i0.Input,
196
- args: [{
197
- isSignal: true,
198
- alias: "field",
199
- required: true
200
- }]
201
- }],
202
- tree: [{
203
- type: i0.Input,
204
- args: [{
205
- isSignal: true,
206
- alias: "tree",
207
- required: true
208
- }]
209
- }],
210
- serverErrors: [{
211
- type: i0.Input,
212
- args: [{
213
- isSignal: true,
214
- alias: "serverErrors",
215
- required: false
216
- }]
217
- }],
218
- pathPrefix: [{
219
- type: i0.Input,
220
- args: [{
221
- isSignal: true,
222
- alias: "pathPrefix",
223
- required: false
224
- }]
225
- }],
226
- content: [{
227
- type: i0.Input,
228
- args: [{
229
- isSignal: true,
230
- alias: "content",
231
- required: true
232
- }]
233
- }]
234
- }
235
- });
236
- export { FieldGroup };
237
-
238
- //# sourceMappingURL=tinya-code-gas-admin-ui-group-h7-O8tt4.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tinya-code-gas-admin-ui-group-h7-O8tt4.mjs","names":[],"sources":["../../../projects/gas-admin-ui/src/lib/fields/group/group.ts"],"sourcesContent":["import { NgTemplateOutlet } from '@angular/common';\nimport { Component, computed, input, signal, type TemplateRef } from '@angular/core';\n\nimport type { GroupField } from '../../core/models/schema.model';\nimport { childTree, type RootTree } from '../field-node';\n\n/**\n * Grupo de campos (base.md §5.4).\n *\n * **Sin importar FieldHost**: los hijos los renderiza el despachador pasando\n * un `ng-template` (`content`) que este componente instancia con\n * `ngTemplateOutlet` en cada variante de chrome. Un import mutuo\n * `field-host ↔ group` rompe en runtime con `Cannot read properties of\n * undefined (reading 'ɵcmp')` y `ng build` NO lo detecta.\n *\n * **Por qué no `<ng-content>`**: con un `<ng-content>` por rama de display,\n * el compilador asigna slot secuencial a cada uno (`generateProjectionDefs`)\n * y el contenido del host cae sólo en el último slot — las ramas\n * `collapsible`/`inline` quedaban vacías. Un solo destino (`TemplateRef`)\n * evita los slots de proyección por completo.\n *\n * Presentaciones:\n * - `card` (por defecto): tarjeta con título.\n * - `collapsible`: `<details>` que se auto-abre si el grupo tiene problemas.\n * - `inline`: sólo la grilla, sin chrome.\n */\n@Component({\n selector: 'app-field-group',\n imports: [NgTemplateOutlet],\n template: `\n @if (display() === 'collapsible') {\n <details\n class=\"rounded-xl border border-neutral/20 bg-surface\"\n [open]=\"open() || hasProblem()\"\n (toggle)=\"onToggle($event)\"\n >\n <summary\n class=\"flex cursor-pointer items-center justify-between gap-2 rounded-xl px-4 py-3 text-section font-semibold hover:bg-neutral/5\"\n >\n <span>\n {{ field().label }}\n @if (field().required) {\n <span class=\"text-danger\" aria-hidden=\"true\">*</span>\n }\n </span>\n @if (hasProblem()) {\n <span class=\"text-xs font-medium text-danger\">Revisar</span>\n }\n </summary>\n <div class=\"px-4 pb-4\">\n <div class=\"grid grid-cols-1 gap-x-4 sm:grid-cols-12\">\n <ng-container [ngTemplateOutlet]=\"content()\" />\n </div>\n </div>\n </details>\n } @else if (display() === 'inline') {\n <div class=\"grid grid-cols-1 gap-x-4 sm:grid-cols-12\">\n <ng-container [ngTemplateOutlet]=\"content()\" />\n </div>\n } @else {\n <section class=\"rounded-xl border border-neutral/20 bg-surface p-4\">\n <h2 class=\"mb-3 text-section font-semibold\">\n {{ field().label }}\n @if (field().required) {\n <span class=\"text-danger\" aria-hidden=\"true\">*</span>\n }\n @if (hasProblem()) {\n <span class=\"ml-2 text-xs font-medium text-danger\">Revisar</span>\n }\n </h2>\n <div class=\"grid grid-cols-1 gap-x-4 sm:grid-cols-12\">\n <ng-container [ngTemplateOutlet]=\"content()\" />\n </div>\n </section>\n }\n `,\n})\nexport class FieldGroup {\n readonly field = input.required<GroupField>();\n readonly tree = input.required<RootTree>();\n /** Errores del backend: detecta rutas anidadas (`address.street`). */\n readonly serverErrors = input<Record<string, string>>({});\n /** Prefijo de ruta del grupo en el registro raíz (`address.`). */\n readonly pathPrefix = input('');\n /** Hijos: `ng-template` declarado en el case de grupo del FieldHost. */\n readonly content = input.required<TemplateRef<unknown>>();\n\n protected readonly display = computed(() => this.field().display ?? 'card');\n\n /** Estado del subárbol: `invalid()`/`touched()` agregan a los hijos. */\n private readonly state = computed(() =>\n childTree<Record<string, unknown>>(this.tree(), this.field().key)(),\n );\n\n protected readonly hasProblem = computed(\n () => (this.state().invalid() && this.state().touched()) || this.hasServerError(),\n );\n\n /** El usuario abrió/cerró el `<details>` a mano (se persiste en el binding). */\n protected readonly open = signal(false);\n\n protected onToggle(event: Event): void {\n this.open.set((event.currentTarget as HTMLDetailsElement).open);\n }\n\n private hasServerError(): boolean {\n const prefix = `${this.pathPrefix()}${this.field().key}.`;\n return Object.keys(this.serverErrors()).some((path) => path.startsWith(prefix));\n }\n}\n"],"mappings":";;;;AA6EA,IAAa,aAAb,MAAa,WAAU;CACZ,QAAQ,MAAM,SAAsB,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CACpC,OAAO,MAAM,SAAoB,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAEjC,eAAe,MAA8B,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CAEhD,aAAa,MAAM,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAEtB,UAAU,MAAM,SAAgC,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAEtC,UAAU,eAAe,KAAK,MAAK,CAAE,CAAC,WAAW,QAAO,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAG1D,QAAQ,eACvB,UAAmC,KAAK,KAAI,GAAI,KAAK,MAAK,CAAE,CAAC,GAAG,CAAC,CAAA,GAClE,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAEkB,aAAa,eACvB,KAAK,MAAK,CAAE,CAAC,QAAO,KAAM,KAAK,MAAK,CAAE,CAAC,QAAO,KAAO,KAAK,eAAc,GAChF,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAGkB,OAAO,OAAO,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAE7B,SAAS,OAAY;EAC7B,KAAK,KAAK,IAAK,MAAM,cAAqC,IAAI;CAChE;CAEQ,iBAAc;EACpB,MAAM,SAAS,GAAG,KAAK,WAAU,IAAK,KAAK,MAAK,CAAE,CAAC,IAAG;EACtD,OAAO,OAAO,KAAK,KAAK,aAAY,CAAE,CAAC,CAAC,MAAM,SAAS,KAAK,WAAW,MAAM,CAAC;CAChF;CA/BW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAU,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAV,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAU,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,cAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,YAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,UAAA;EAAA,UAhDX;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8CT,UAAA;EAAA,cAAA,CAAA;GAAA,MAAA;GAAA,MA/CS;GAAgB,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;GAAA;EAAA,CAAA;CAAA,CAAA;;AAiDf,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAU,YAAA,CAAA;EAnDtB,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,SAAS,CAAC,gBAAgB;GAC1B,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+CX,CAAA"}
@@ -1,416 +0,0 @@
1
- import { t as __exportAll } from "./tinya-code-gas-admin-ui-rolldown-runtime-DpJrqANO.mjs";
2
- import { b as ApiError } from "./tinya-code-gas-admin-ui-schema-catalog-D0Pk0wAN.mjs";
3
- import { t as Button } from "./tinya-code-gas-admin-ui-button-BQjNW8KB.mjs";
4
- import { t as NotificationService } from "./tinya-code-gas-admin-ui-notification.service-LjSULER6.mjs";
5
- import { t as UploadService } from "./tinya-code-gas-admin-ui-upload.service-CZPEPCeN.mjs";
6
- import * as i0 from "@angular/core";
7
- import { Component, DestroyRef, computed, inject, input, model, output, signal, viewChild } from "@angular/core";
8
- import { HttpEventType } from "@angular/common/http";
9
- var image_exports = /* @__PURE__ */ __exportAll({ FieldImage: () => FieldImage });
10
- var FieldImage = class FieldImage {
11
- field = input.required(...ngDevMode ? [{ debugName: "field" }] : /* istanbul ignore next */ []);
12
- resource = input("", ...ngDevMode ? [{ debugName: "resource" }] : /* istanbul ignore next */ []);
13
- value = model.required(...ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []);
14
- disabled = input(false, ...ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []);
15
- touch = output();
16
- upload = inject(UploadService);
17
- notifications = inject(NotificationService);
18
- destroyRef = inject(DestroyRef);
19
- uploading = signal(false, ...ngDevMode ? [{ debugName: "uploading" }] : /* istanbul ignore next */ []);
20
- progress = signal(0, ...ngDevMode ? [{ debugName: "progress" }] : /* istanbul ignore next */ []);
21
- error = signal(null, ...ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []);
22
- previewClass = computed(() => `${this.field().previewSize ?? "w-48"} rounded-lg object-cover`, ...ngDevMode ? [{ debugName: "previewClass" }] : /* istanbul ignore next */ []);
23
- aspectRatio = computed(() => this.field().aspectRatio ?? null, ...ngDevMode ? [{ debugName: "aspectRatio" }] : /* istanbul ignore next */ []);
24
- acceptAttr = computed(() => this.field().accept ?? "image/*", ...ngDevMode ? [{ debugName: "acceptAttr" }] : /* istanbul ignore next */ []);
25
- fileInput = viewChild.required("fileInput", ...ngDevMode ? [{ debugName: "fileInput" }] : /* istanbul ignore next */ []);
26
- uploadSub;
27
- pickFile() {
28
- this.fileInput().nativeElement.click();
29
- }
30
- clear() {
31
- this.value.set("");
32
- this.error.set(null);
33
- this.touch.emit();
34
- }
35
- onFileSelected(event) {
36
- const input = event.target;
37
- const file = input.files?.[0];
38
- input.value = "";
39
- if (file) this.startUpload(file);
40
- }
41
- onDrop(event) {
42
- event.preventDefault();
43
- const file = event.dataTransfer?.files?.[0];
44
- if (file) this.startUpload(file);
45
- }
46
- startUpload(file) {
47
- if (this.disabled()) return;
48
- const problem = this.validate(file);
49
- if (problem !== null) {
50
- this.error.set(problem);
51
- this.touch.emit();
52
- return;
53
- }
54
- this.error.set(null);
55
- this.uploading.set(true);
56
- this.progress.set(0);
57
- this.touch.emit();
58
- this.uploadSub?.unsubscribe();
59
- this.uploadSub = this.upload.uploadWithProgress(file, this.resource(), this.field().key).subscribe({
60
- next: (event) => {
61
- if (event.type === HttpEventType.UploadProgress) {
62
- if (event.total) this.progress.set(Math.round(event.loaded / event.total * 100));
63
- return;
64
- }
65
- if (event.type === HttpEventType.Response) {
66
- const url = event.body ?? "";
67
- this.uploading.set(false);
68
- if (url === "") {
69
- this.error.set("No se pudo subir la imagen.");
70
- return;
71
- }
72
- this.value.set(url);
73
- this.notifications.success("Imagen subida.");
74
- }
75
- },
76
- error: (err) => {
77
- this.uploading.set(false);
78
- this.error.set(err instanceof ApiError ? err.message : "No se pudo subir la imagen. Revisa la conexión e inténtalo de nuevo.");
79
- }
80
- });
81
- this.destroyRef.onDestroy(() => this.uploadSub?.unsubscribe());
82
- }
83
- validate(file) {
84
- if (!file.type.startsWith("image/")) return "El archivo debe ser una imagen.";
85
- const accept = this.field().accept;
86
- if (accept !== void 0 && !acceptMatches(accept, file)) return "Formato no permitido para este campo.";
87
- const maxSizeMB = this.field().maxSizeMB;
88
- if (maxSizeMB !== void 0 && file.size > maxSizeMB * 1024 * 1024) return `La imagen supera ${maxSizeMB} MB.`;
89
- return null;
90
- }
91
- static ɵfac = i0.ɵɵngDeclareFactory({
92
- minVersion: "12.0.0",
93
- version: "22.2.3",
94
- ngImport: i0,
95
- type: FieldImage,
96
- deps: [],
97
- target: i0.ɵɵFactoryTarget.Component
98
- });
99
- static ɵcmp = i0.ɵɵngDeclareComponent({
100
- minVersion: "17.0.0",
101
- version: "22.2.3",
102
- type: FieldImage,
103
- isStandalone: true,
104
- selector: "app-field-image",
105
- inputs: {
106
- field: {
107
- classPropertyName: "field",
108
- publicName: "field",
109
- isSignal: true,
110
- isRequired: true,
111
- transformFunction: null
112
- },
113
- resource: {
114
- classPropertyName: "resource",
115
- publicName: "resource",
116
- isSignal: true,
117
- isRequired: false,
118
- transformFunction: null
119
- },
120
- value: {
121
- classPropertyName: "value",
122
- publicName: "value",
123
- isSignal: true,
124
- isRequired: true,
125
- transformFunction: null
126
- },
127
- disabled: {
128
- classPropertyName: "disabled",
129
- publicName: "disabled",
130
- isSignal: true,
131
- isRequired: false,
132
- transformFunction: null
133
- }
134
- },
135
- outputs: {
136
- value: "valueChange",
137
- touch: "touch"
138
- },
139
- viewQueries: [{
140
- propertyName: "fileInput",
141
- first: true,
142
- predicate: ["fileInput"],
143
- descendants: true,
144
- isSignal: true
145
- }],
146
- ngImport: i0,
147
- template: ` @if (error(); as message) {
148
- <p
149
- class="mb-2 rounded-lg border border-danger/30 bg-danger/10 px-3 py-2 text-xs text-danger"
150
- role="alert"
151
- >
152
- {{ message }}
153
- </p>
154
- }
155
- @if (uploading()) {
156
- <div class="rounded-xl border border-neutral/20 bg-surface p-3" data-testid="image-uploading">
157
- <div class="h-1.5 w-full overflow-hidden rounded-full bg-neutral/20">
158
- <div
159
- class="h-full rounded-full bg-primary transition-all"
160
- [style.width.%]="progress()"
161
- ></div>
162
- </div>
163
- <p class="mt-1 text-xs text-neutral">Subiendo… {{ progress() }}%</p>
164
- </div>
165
- } @else if (value()) {
166
- <div
167
- class="rounded-xl border border-neutral/20 bg-surface p-3"
168
- data-testid="image-preview"
169
- (dragover)="$event.preventDefault()"
170
- (drop)="onDrop($event)"
171
- >
172
- <img
173
- [src]="value()"
174
- [alt]="''"
175
- [class]="previewClass()"
176
- [style.aspect-ratio]="aspectRatio()"
177
- />
178
- <div class="mt-2 flex flex-wrap items-center gap-2">
179
- <button
180
- type="button"
181
- app-button
182
- variant="outline"
183
- [disabled]="disabled()"
184
- (click)="pickFile()"
185
- >
186
- Reemplazar
187
- </button>
188
- @if (!field().required) {
189
- <button
190
- type="button"
191
- app-button
192
- variant="outline"
193
- [disabled]="disabled()"
194
- (click)="clear()"
195
- >
196
- Quitar
197
- </button>
198
- }
199
- <a
200
- class="text-sm font-medium text-primary hover:underline"
201
- [href]="value()"
202
- target="_blank"
203
- rel="noopener noreferrer"
204
- >
205
- Ver en grande
206
- </a>
207
- </div>
208
- </div>
209
- } @else {
210
- <div
211
- class="rounded-xl border-2 border-dashed border-neutral/30 p-6 text-center"
212
- data-testid="image-dropzone"
213
- (dragover)="$event.preventDefault()"
214
- (drop)="onDrop($event)"
215
- >
216
- <p class="text-sm text-neutral">Arrastrá una imagen acá</p>
217
- <button
218
- type="button"
219
- app-button
220
- variant="outline"
221
- class="mt-2"
222
- [disabled]="disabled()"
223
- (click)="pickFile()"
224
- >
225
- Subir imagen
226
- </button>
227
- </div>
228
- }
229
-
230
- <input
231
- #fileInput
232
- type="file"
233
- class="sr-only"
234
- [accept]="acceptAttr()"
235
- [disabled]="disabled()"
236
- (change)="onFileSelected($event)"
237
- />`,
238
- isInline: true,
239
- dependencies: [{
240
- kind: "component",
241
- type: Button,
242
- selector: "button[app-button]",
243
- inputs: [
244
- "variant",
245
- "size",
246
- "type",
247
- "disabled",
248
- "loading"
249
- ]
250
- }]
251
- });
252
- };
253
- i0.ɵɵngDeclareClassMetadata({
254
- minVersion: "12.0.0",
255
- version: "22.2.3",
256
- ngImport: i0,
257
- type: FieldImage,
258
- decorators: [{
259
- type: Component,
260
- args: [{
261
- selector: "app-field-image",
262
- imports: [Button],
263
- template: ` @if (error(); as message) {
264
- <p
265
- class="mb-2 rounded-lg border border-danger/30 bg-danger/10 px-3 py-2 text-xs text-danger"
266
- role="alert"
267
- >
268
- {{ message }}
269
- </p>
270
- }
271
- @if (uploading()) {
272
- <div class="rounded-xl border border-neutral/20 bg-surface p-3" data-testid="image-uploading">
273
- <div class="h-1.5 w-full overflow-hidden rounded-full bg-neutral/20">
274
- <div
275
- class="h-full rounded-full bg-primary transition-all"
276
- [style.width.%]="progress()"
277
- ></div>
278
- </div>
279
- <p class="mt-1 text-xs text-neutral">Subiendo… {{ progress() }}%</p>
280
- </div>
281
- } @else if (value()) {
282
- <div
283
- class="rounded-xl border border-neutral/20 bg-surface p-3"
284
- data-testid="image-preview"
285
- (dragover)="$event.preventDefault()"
286
- (drop)="onDrop($event)"
287
- >
288
- <img
289
- [src]="value()"
290
- [alt]="''"
291
- [class]="previewClass()"
292
- [style.aspect-ratio]="aspectRatio()"
293
- />
294
- <div class="mt-2 flex flex-wrap items-center gap-2">
295
- <button
296
- type="button"
297
- app-button
298
- variant="outline"
299
- [disabled]="disabled()"
300
- (click)="pickFile()"
301
- >
302
- Reemplazar
303
- </button>
304
- @if (!field().required) {
305
- <button
306
- type="button"
307
- app-button
308
- variant="outline"
309
- [disabled]="disabled()"
310
- (click)="clear()"
311
- >
312
- Quitar
313
- </button>
314
- }
315
- <a
316
- class="text-sm font-medium text-primary hover:underline"
317
- [href]="value()"
318
- target="_blank"
319
- rel="noopener noreferrer"
320
- >
321
- Ver en grande
322
- </a>
323
- </div>
324
- </div>
325
- } @else {
326
- <div
327
- class="rounded-xl border-2 border-dashed border-neutral/30 p-6 text-center"
328
- data-testid="image-dropzone"
329
- (dragover)="$event.preventDefault()"
330
- (drop)="onDrop($event)"
331
- >
332
- <p class="text-sm text-neutral">Arrastrá una imagen acá</p>
333
- <button
334
- type="button"
335
- app-button
336
- variant="outline"
337
- class="mt-2"
338
- [disabled]="disabled()"
339
- (click)="pickFile()"
340
- >
341
- Subir imagen
342
- </button>
343
- </div>
344
- }
345
-
346
- <input
347
- #fileInput
348
- type="file"
349
- class="sr-only"
350
- [accept]="acceptAttr()"
351
- [disabled]="disabled()"
352
- (change)="onFileSelected($event)"
353
- />`
354
- }]
355
- }],
356
- propDecorators: {
357
- field: [{
358
- type: i0.Input,
359
- args: [{
360
- isSignal: true,
361
- alias: "field",
362
- required: true
363
- }]
364
- }],
365
- resource: [{
366
- type: i0.Input,
367
- args: [{
368
- isSignal: true,
369
- alias: "resource",
370
- required: false
371
- }]
372
- }],
373
- value: [{
374
- type: i0.Input,
375
- args: [{
376
- isSignal: true,
377
- alias: "value",
378
- required: true
379
- }]
380
- }, {
381
- type: i0.Output,
382
- args: ["valueChange"]
383
- }],
384
- disabled: [{
385
- type: i0.Input,
386
- args: [{
387
- isSignal: true,
388
- alias: "disabled",
389
- required: false
390
- }]
391
- }],
392
- touch: [{
393
- type: i0.Output,
394
- args: ["touch"]
395
- }],
396
- fileInput: [{
397
- type: i0.ViewChild,
398
- args: ["fileInput", { isSignal: true }]
399
- }]
400
- }
401
- });
402
- function acceptMatches(accept, file) {
403
- for (const raw of accept.split(",")) {
404
- const entry = raw.trim().toLowerCase();
405
- if (entry === "") continue;
406
- if (entry.startsWith(".")) {
407
- if (file.name.toLowerCase().endsWith(entry)) return true;
408
- } else if (entry.endsWith("/*")) {
409
- if (file.type.startsWith(entry.slice(0, -1))) return true;
410
- } else if (file.type === entry) return true;
411
- }
412
- return false;
413
- }
414
- export { image_exports as n, FieldImage as t };
415
-
416
- //# sourceMappingURL=tinya-code-gas-admin-ui-image-7UhJ7nqI.mjs.map