@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,685 +0,0 @@
1
- import * as i0 from "@angular/core";
2
- import { InjectionToken, Injector, Service, computed, inject, provideAppInitializer, signal } from "@angular/core";
3
- import { HttpClient, HttpErrorResponse, HttpHeaders, HttpParams, HttpResponse, provideHttpClient, withInterceptors } from "@angular/common/http";
4
- import { catchError, firstValueFrom, forkJoin, from, map, of, switchMap, tap, throwError } from "rxjs";
5
- import { Router } from "@angular/router";
6
- var ApiError = class extends Error {
7
- status;
8
- fieldPath;
9
- code;
10
- issues;
11
- constructor(status, message, fieldPath, code, issues = []) {
12
- super(message);
13
- this.name = "ApiError";
14
- this.status = status;
15
- this.fieldPath = fieldPath;
16
- this.code = code;
17
- this.issues = issues;
18
- }
19
- };
20
- function renewedTokenOf(body) {
21
- if (body === null || typeof body !== "object") return null;
22
- const meta = body.meta;
23
- if (meta === null || typeof meta !== "object") return null;
24
- const token = meta.renewedToken;
25
- return typeof token === "string" && token !== "" ? token : null;
26
- }
27
- const API_URL = new InjectionToken("API_URL");
28
- const FIREBASE_AUTH_ADAPTER = new InjectionToken("gas.admin.firebaseAuthAdapter");
29
- const API_DRIVER = new InjectionToken("gas.admin.driver");
30
- const VALUE_SOURCES = new InjectionToken("gas.admin.valueSources");
31
- const DEFAULT_RESPONSE_UNWRAP = new InjectionToken("gas.admin.defaultResponseUnwrap");
32
- const LOGIN_PATH = "/login";
33
- const SESSION_TOKEN_KEY = "admin.session.token";
34
- const SESSION_USER_KEY = "admin.session.user";
35
- var AuthService = class AuthService {
36
- http = inject(HttpClient);
37
- apiUrl = inject(API_URL);
38
- router = inject(Router);
39
- firebaseAdapter = inject(FIREBASE_AUTH_ADAPTER, { optional: true });
40
- driver = inject(API_DRIVER, { optional: true }) ?? "gas";
41
- storage = sessionStorage;
42
- _user = signal(null, ...ngDevMode ? [{ debugName: "_user" }] : /* istanbul ignore next */ []);
43
- _token = signal(null, ...ngDevMode ? [{ debugName: "_token" }] : /* istanbul ignore next */ []);
44
- _returnUrl = signal(null, ...ngDevMode ? [{ debugName: "_returnUrl" }] : /* istanbul ignore next */ []);
45
- user = this._user.asReadonly();
46
- token = this._token.asReadonly();
47
- returnUrl = this._returnUrl.asReadonly();
48
- isAuthenticated = computed(() => this._token() !== null && this._user() !== null, ...ngDevMode ? [{ debugName: "isAuthenticated" }] : /* istanbul ignore next */ []);
49
- role = computed(() => this._user()?.role ?? "", ...ngDevMode ? [{ debugName: "role" }] : /* istanbul ignore next */ []);
50
- constructor() {
51
- const token = this.storage.getItem(SESSION_TOKEN_KEY);
52
- if (token !== null && token !== "") this._token.set(token);
53
- const raw = this.storage.getItem(SESSION_USER_KEY);
54
- if (raw !== null && raw !== "") try {
55
- this._user.set(JSON.parse(raw));
56
- } catch {
57
- this.storage.removeItem(SESSION_USER_KEY);
58
- this.storage.removeItem(SESSION_TOKEN_KEY);
59
- this._token.set(null);
60
- }
61
- }
62
- login(email, password) {
63
- return this.post("/auth/login", {
64
- email,
65
- password
66
- }).pipe(map((res) => {
67
- this.open(res.token, res.user);
68
- const renewed = renewedTokenOf(res);
69
- if (renewed !== null) this.applyRenewedToken(renewed);
70
- return res.user;
71
- }));
72
- }
73
- loginWithGoogle() {
74
- if (!this.firebaseAdapter) return throwError(() => /* @__PURE__ */ new Error("[gas-admin-ui] FIREBASE_AUTH_ADAPTER is not provided."));
75
- return from(this.firebaseAdapter.signInWithGoogle()).pipe(switchMap((idToken) => this.exchangeFirebaseToken(idToken)));
76
- }
77
- loginWithFirebasePassword(email, password) {
78
- if (!this.firebaseAdapter) return throwError(() => /* @__PURE__ */ new Error("[gas-admin-ui] FIREBASE_AUTH_ADAPTER is not provided."));
79
- return from(this.firebaseAdapter.signInWithEmailAndPassword(email, password)).pipe(switchMap((idToken) => this.exchangeFirebaseToken(idToken)));
80
- }
81
- exchangeFirebaseToken(idToken) {
82
- const endpoint = getAuth()?.firebase?.exchangeEndpoint ?? "/auth/firebase";
83
- return this.post(endpoint, { idToken }).pipe(map((res) => {
84
- this.open(res.token, res.user);
85
- const renewed = renewedTokenOf(res);
86
- if (renewed !== null) this.applyRenewedToken(renewed);
87
- return res.user;
88
- }));
89
- }
90
- logout() {
91
- return this.post("/auth/logout").pipe(tap({
92
- next: () => {
93
- this.clear();
94
- this.firebaseAdapter?.signOut();
95
- this.goLogin();
96
- },
97
- error: () => {
98
- this.clear();
99
- this.firebaseAdapter?.signOut();
100
- this.goLogin();
101
- }
102
- }), map(() => void 0));
103
- }
104
- restore() {
105
- if (this._token() === null) return of(void 0);
106
- return this.post("/auth/me").pipe(tap((res) => {
107
- this.open(this._token(), res.user);
108
- }), catchError(() => of(void 0)), map(() => void 0));
109
- }
110
- applyRenewedToken(token) {
111
- if (token === "" || this._token() === null) return;
112
- this._token.set(token);
113
- this.storage.setItem(SESSION_TOKEN_KEY, token);
114
- }
115
- applyAuthCode(code) {
116
- switch (code) {
117
- case "AUTH_EXPIRED":
118
- this._returnUrl.set(this.currentUrl());
119
- this.clear();
120
- this.goLogin();
121
- break;
122
- case "AUTH_REQUIRED":
123
- case "AUTH_INVALID":
124
- this.clear();
125
- this.goLogin();
126
- }
127
- }
128
- hasRole(required) {
129
- if (required === "" || required === "session") return this.isAuthenticated();
130
- const role = this.role();
131
- if (role === "admin") return true;
132
- return role !== "" && role === required;
133
- }
134
- canAccess(access) {
135
- const requires = access?.requires ?? "session";
136
- if (requires === "public") return true;
137
- if (!this.isAuthenticated()) return false;
138
- const role = requires.startsWith("role:") ? requires.slice(5) : "";
139
- const required = role === "" ? access?.roles ?? [] : [role];
140
- if (required.length === 0) return true;
141
- return required.some((one) => this.hasRole(one));
142
- }
143
- canDoOperation(schema, operation) {
144
- if (operation === "create" || operation === "update" || operation === "remove") {
145
- const ep = schema.endpoint;
146
- if (!!ep && Object.keys(ep).length > 0 && !ep[operation]) return false;
147
- }
148
- const ops = schema.policies?.access?.operations;
149
- if (ops && ops[operation]) return this.meetsLevel(ops[operation]);
150
- if (schema.policies?.access) {
151
- const groupLevel = operation === "create" || operation === "update" || operation === "remove" ? schema.policies.access.write : schema.policies.access.read;
152
- return this.meetsLevel(groupLevel ?? "admin");
153
- }
154
- const perms = schema.permissions;
155
- if (perms) return {
156
- list: true,
157
- get: true,
158
- create: perms.create,
159
- update: perms.update,
160
- remove: perms.remove
161
- }[operation] !== false;
162
- return true;
163
- }
164
- canReadField(field) {
165
- if (!field.access || !field.access.read) return true;
166
- return this.meetsLevel(field.access.read);
167
- }
168
- canWriteField(field) {
169
- if (!field.access || !field.access.write) return true;
170
- return this.meetsLevel(field.access.write);
171
- }
172
- meetsLevel(level) {
173
- if (level === "public") return true;
174
- if (level === "session") return this.isAuthenticated();
175
- if (level.startsWith("role:")) {
176
- const requiredRole = level.slice(5);
177
- return this.hasRole(requiredRole);
178
- }
179
- return this.hasRole("admin");
180
- }
181
- open(token, user) {
182
- if (token !== null && token !== "") this._token.set(token);
183
- this._user.set(user);
184
- if (token !== null && token !== "") this.storage.setItem(SESSION_TOKEN_KEY, token);
185
- if (user !== null) this.storage.setItem(SESSION_USER_KEY, JSON.stringify(user));
186
- }
187
- consumeReturnUrl() {
188
- const url = this._returnUrl();
189
- this._returnUrl.set(null);
190
- return url;
191
- }
192
- clear() {
193
- this._token.set(null);
194
- this._user.set(null);
195
- this.storage.removeItem(SESSION_TOKEN_KEY);
196
- this.storage.removeItem(SESSION_USER_KEY);
197
- }
198
- goLogin() {
199
- if (this.currentUrl().startsWith("/login")) return;
200
- this.router.navigate([LOGIN_PATH]).catch(() => void 0);
201
- }
202
- currentUrl() {
203
- return this.router.url;
204
- }
205
- buildUrl(path) {
206
- return `${this.apiUrl ? this.apiUrl.replace(/\/+$/, "") : ""}${path.startsWith("/") ? path : `/${path}`}`;
207
- }
208
- envelope(path, payload = {}) {
209
- return {
210
- token: this._token(),
211
- method: "POST",
212
- path,
213
- payload
214
- };
215
- }
216
- buildAuthRequest(path, payload = {}) {
217
- if (this.driver === "rest") {
218
- const url = this.buildUrl(path);
219
- let headers = new HttpHeaders();
220
- const token = this._token();
221
- if (token) headers = headers.set("Authorization", `Bearer ${token}`);
222
- if (path === "/auth/me") return this.http.get(url, { headers });
223
- headers = headers.set("Content-Type", "application/json");
224
- return this.http.post(url, payload, { headers });
225
- }
226
- return this.http.post(this.apiUrl, this.envelope(path, payload), { headers: { "Content-Type": "text/plain" } });
227
- }
228
- post(path, payload = {}) {
229
- return this.buildAuthRequest(path, payload).pipe(map((res) => res && typeof res === "object" && !Array.isArray(res) && "data" in res ? res["data"] : res));
230
- }
231
- static ɵfac = i0.ɵɵngDeclareFactory({
232
- minVersion: "12.0.0",
233
- version: "22.2.3",
234
- ngImport: i0,
235
- type: AuthService,
236
- deps: [],
237
- target: i0.ɵɵFactoryTarget.Service
238
- });
239
- static ɵprov = i0.ɵɵngDeclareService({
240
- minVersion: "22.0.0",
241
- version: "22.2.3",
242
- ngImport: i0,
243
- type: AuthService
244
- });
245
- };
246
- i0.ɵɵngDeclareClassMetadata({
247
- minVersion: "12.0.0",
248
- version: "22.2.3",
249
- ngImport: i0,
250
- type: AuthService,
251
- decorators: [{ type: Service }],
252
- ctorParameters: () => []
253
- });
254
- function httpMessage(status) {
255
- switch (status) {
256
- case 0: return "No se pudo conectar con el servidor. Revisa tu conexión.";
257
- case 401: return "Tu sesión ha expirado. Vuelve a iniciar sesión.";
258
- case 403: return "No tienes permisos para realizar esta acción.";
259
- case 404: return "No se encontró el recurso solicitado.";
260
- case 409: return "El registro cambió o ya existe. Recarga la página y vuelve a intentarlo.";
261
- case 413: return "El archivo es demasiado grande.";
262
- case 422: return "Los datos enviados no son válidos.";
263
- default:
264
- if (status >= 500) return "El servidor tuvo un problema. Vuelve a intentarlo en unos segundos.";
265
- return status >= 400 ? "No se pudo completar la operación." : "Error inesperado.";
266
- }
267
- }
268
- function isErrorBody(body) {
269
- if (typeof body !== "object" || body === null) return false;
270
- const error = body.error;
271
- return typeof error === "object" && error !== null && typeof error.message === "string";
272
- }
273
- const apiErrorInterceptor = (req, next) => {
274
- const auth = inject(AuthService);
275
- return next(req).pipe(map((event) => {
276
- if (event instanceof HttpResponse && isErrorBody(event.body)) {
277
- const { status, message, path, code, errors } = event.body.error;
278
- auth.applyAuthCode(code);
279
- throw new ApiError(status, message, path, code, errors ?? []);
280
- }
281
- return event;
282
- }), catchError((err) => {
283
- if (err instanceof ApiError) return throwError(() => err);
284
- if (err instanceof HttpErrorResponse) return throwError(() => new ApiError(err.status, httpMessage(err.status)));
285
- return throwError(() => err);
286
- }));
287
- };
288
- function appliesTo(unwrap, operation) {
289
- const apply = unwrap.apply ?? "all";
290
- return apply === "all" || apply === operation;
291
- }
292
- function unwrapResponse(raw, unwrap, operation) {
293
- if (!unwrap || !appliesTo(unwrap, operation)) return raw;
294
- if (raw !== null && typeof raw === "object" && !Array.isArray(raw)) {
295
- const record = raw;
296
- if (Object.prototype.hasOwnProperty.call(record, unwrap.dataKey)) return record[unwrap.dataKey];
297
- }
298
- throw new Error(`Response unwrap declared dataKey '${unwrap.dataKey}' but it is missing in the response for operation '${operation}'`);
299
- }
300
- const NO_PAGINATION = {
301
- nextCursor: null,
302
- total: 0,
303
- hasMore: false
304
- };
305
- function extractPagination(raw, unwrap) {
306
- if (raw === null || typeof raw !== "object" || Array.isArray(raw)) return { ...NO_PAGINATION };
307
- const body = raw;
308
- let source = body;
309
- const metaKey = unwrap?.metaKey;
310
- if (metaKey) {
311
- const meta = body[metaKey];
312
- if (meta !== null && typeof meta === "object" && !Array.isArray(meta)) source = meta;
313
- }
314
- const cursorKey = unwrap?.pagination?.cursorKey ?? "nextCursor";
315
- const totalKey = unwrap?.pagination?.totalKey ?? "total";
316
- const hasMoreKey = unwrap?.pagination?.hasMoreKey ?? "hasMore";
317
- const cursorValue = source[cursorKey] ?? body[cursorKey];
318
- const nextCursor = typeof cursorValue === "string" && cursorValue !== "" ? cursorValue : null;
319
- const totalValue = source[totalKey] ?? body[totalKey];
320
- const total = typeof totalValue === "number" ? totalValue : 0;
321
- const hasMoreValue = source[hasMoreKey] ?? body[hasMoreKey];
322
- return {
323
- nextCursor,
324
- total,
325
- hasMore: typeof hasMoreValue === "boolean" ? hasMoreValue : nextCursor !== null
326
- };
327
- }
328
- const MARKER = /\{([a-zA-Z0-9_.]+)\}/g;
329
- function resolveEndpointPath(path, sources) {
330
- if (!path.includes("{")) return path;
331
- return path.replace(MARKER, (marker, nombre) => sustituir(path, marker, nombre, sources));
332
- }
333
- function sustituir(path, marker, nombre, sources) {
334
- if (nombre === "key") throw new Error(`[gas-admin-ui] path '${path}': ${marker} llegó sin resolver — la clave sólo la sustituyen get/update/remove antes de resolver el contexto.`);
335
- const punto = nombre.indexOf(".");
336
- const fuente = punto === -1 ? nombre : nombre.slice(0, punto);
337
- const getter = sources[fuente];
338
- if (typeof getter !== "function") throw new Error(`[gas-admin-ui] path '${path}': no se pudo resolver ${marker} — la fuente '${fuente}' no está registrada.`);
339
- const valor = punto === -1 ? getter() : leerRuta(getter(), nombre.slice(punto + 1));
340
- if (valor === void 0 || valor === null) throw new Error(`[gas-admin-ui] path '${path}': no se pudo resolver ${marker} — sin valor para '${nombre}'.`);
341
- if (typeof valor === "object") throw new Error(`[gas-admin-ui] path '${path}': no se pudo resolver ${marker} — el valor de '${fuente}' no es un segmento de URL (no es escalar).`);
342
- const texto = String(valor);
343
- if (texto === "") throw new Error(`[gas-admin-ui] path '${path}': no se pudo resolver ${marker} — valor vacío en '${fuente}'.`);
344
- return encodeURIComponent(texto);
345
- }
346
- function leerRuta(valor, ruta) {
347
- let actual = valor;
348
- for (const paso of ruta.split(".")) {
349
- if (actual === null || typeof actual !== "object") return void 0;
350
- actual = actual[paso];
351
- }
352
- return actual;
353
- }
354
- function sendGas(deps, path, method, payload, multipart = false) {
355
- if (multipart) throw new Error("Multipart payload mode is only supported with the REST driver");
356
- const body = {
357
- token: deps.sessionToken(),
358
- method,
359
- path,
360
- payload: payload ?? {}
361
- };
362
- return deps.http.post(deps.apiUrl, body, { headers: { "Content-Type": "text/plain" } });
363
- }
364
- function sendRest(deps, path, method, payload, multipart = false) {
365
- const url = buildUrl(deps.apiUrl, path);
366
- const headers = new HttpHeaders();
367
- if (deps.getIdToken) return from(deps.getIdToken()).pipe(switchMap((freshToken) => doRestRequest(deps, url, method, payload, headers.set("Authorization", `Bearer ${freshToken}`), multipart)));
368
- const token = deps.sessionToken();
369
- return doRestRequest(deps, url, method, payload, token ? headers.set("Authorization", `Bearer ${token}`) : headers, multipart);
370
- }
371
- function doRestRequest(deps, url, method, payload, headers = new HttpHeaders(), multipart = false) {
372
- if (method === "GET" || method === "DELETE") {
373
- const params = toHttpParams(payload instanceof FormData ? void 0 : payload);
374
- return deps.http.request(method, url, {
375
- headers,
376
- params
377
- });
378
- }
379
- if (multipart || payload instanceof FormData) return deps.http.request(method, url, {
380
- headers,
381
- body: payload ?? {}
382
- });
383
- return deps.http.request(method, url, {
384
- headers: headers.set("Content-Type", "application/json"),
385
- body: payload ?? {}
386
- });
387
- }
388
- function buildUrl(apiUrl, path) {
389
- return `${apiUrl ? apiUrl.replace(/\/+$/, "") : ""}${path.startsWith("/") ? path : `/${path}`}`;
390
- }
391
- function toHttpParams(payload) {
392
- let params = new HttpParams();
393
- if (!payload) return params;
394
- for (const [key, value] of Object.entries(payload)) {
395
- if (value === void 0 || value === null) continue;
396
- if (typeof value === "object" && !Array.isArray(value)) {
397
- for (const [nestedKey, nestedValue] of Object.entries(value)) if (nestedValue !== void 0 && nestedValue !== null) params = params.set(nestedKey, String(nestedValue));
398
- } else if (Array.isArray(value)) {
399
- for (const item of value) if (item !== void 0 && item !== null) params = params.append(key, String(item));
400
- } else params = params.set(key, String(value));
401
- }
402
- return params;
403
- }
404
- var ApiService = class ApiService {
405
- http = inject(HttpClient);
406
- apiUrl = inject(API_URL);
407
- auth = inject(AuthService);
408
- driver = inject(API_DRIVER, { optional: true }) ?? "gas";
409
- valueSources = inject(VALUE_SOURCES, { optional: true }) ?? {};
410
- firebaseAuthAdapter = inject(FIREBASE_AUTH_ADAPTER, { optional: true });
411
- injector = inject(Injector);
412
- defaultUnwrap = inject(DEFAULT_RESPONSE_UNWRAP, { optional: true }) ?? void 0;
413
- effectiveUnwrap(endpoint) {
414
- const global = this.defaultUnwrap;
415
- const local = endpoint.responseUnwrap;
416
- if (!global) return local;
417
- if (!local) return global;
418
- return {
419
- ...global,
420
- ...local
421
- };
422
- }
423
- list(endpoint, payload) {
424
- const unwrap = this.effectiveUnwrap(endpoint);
425
- return this.send(endpoint.list, "GET", payload).pipe(map((raw) => {
426
- if (unwrap && (unwrap.apply === "list" || unwrap.apply === "all" || !unwrap.apply)) return unwrapResponse(raw, unwrap, "list");
427
- return unwrapList(raw);
428
- }));
429
- }
430
- listPage(endpoint, payload) {
431
- const unwrap = this.effectiveUnwrap(endpoint);
432
- const applies = !unwrap || unwrap.apply === "list" || unwrap.apply === "all" || !unwrap.apply;
433
- return this.send(endpoint.list, "GET", payload).pipe(map((raw) => {
434
- return {
435
- items: unwrap && applies ? unwrapResponse(raw, unwrap, "list") : unwrapList(raw),
436
- ...extractPagination(raw, unwrap)
437
- };
438
- }));
439
- }
440
- get(endpoint, key) {
441
- const unwrap = this.effectiveUnwrap(endpoint);
442
- return this.send(this.withKey(endpoint.get, key), "GET").pipe(map((raw) => {
443
- if (unwrap && (unwrap.apply === "get" || unwrap.apply === "all" || !unwrap.apply)) return unwrapResponse(raw, unwrap, "get");
444
- return raw;
445
- }));
446
- }
447
- create(endpoint, payload) {
448
- const unwrap = this.effectiveUnwrap(endpoint);
449
- return this.send(endpoint.create, "POST", payload).pipe(map((raw) => {
450
- if (unwrap && (unwrap.apply === "create" || unwrap.apply === "all" || !unwrap.apply)) return unwrapResponse(raw, unwrap, "create");
451
- return raw;
452
- }));
453
- }
454
- update(endpoint, key, payload) {
455
- const unwrap = this.effectiveUnwrap(endpoint);
456
- return this.send(this.withKey(endpoint.update, key), "PUT", payload).pipe(map((raw) => {
457
- if (unwrap && (unwrap.apply === "update" || unwrap.apply === "all" || !unwrap.apply)) return unwrapResponse(raw, unwrap, "update");
458
- return raw;
459
- }));
460
- }
461
- remove(endpoint, key) {
462
- endpoint.responseUnwrap;
463
- return this.send(this.withKey(endpoint.remove, key), "DELETE").pipe(map(() => void 0));
464
- }
465
- request(method, path, payload) {
466
- const dataKey = this.defaultUnwrap?.dataKey ?? "data";
467
- return this.send(path, method, payload).pipe(map((raw) => {
468
- if (raw !== null && typeof raw === "object" && !Array.isArray(raw)) {
469
- const rec = raw;
470
- if (Object.prototype.hasOwnProperty.call(rec, dataKey)) return rec[dataKey];
471
- }
472
- return raw;
473
- }));
474
- }
475
- invokeCustomEndpoint(definitionOrSchema, nameOrPayload, payload, key) {
476
- let definition;
477
- let actualPayload;
478
- let actualKey = key;
479
- if (isResourceSchema(definitionOrSchema)) {
480
- const name = typeof nameOrPayload === "string" ? nameOrPayload : void 0;
481
- if (!name) throw new Error("invokeCustomEndpoint requires an endpoint name when given a schema");
482
- definition = definitionOrSchema.customEndpoints?.[name];
483
- if (!definition) throw new Error(`Custom endpoint '${name}' is not declared for resource '${definitionOrSchema.id}'`);
484
- actualPayload = (typeof nameOrPayload === "string" ? payload : nameOrPayload) ?? payload;
485
- } else {
486
- definition = definitionOrSchema;
487
- actualPayload = nameOrPayload ?? payload;
488
- }
489
- if (!definition) return throwError(() => /* @__PURE__ */ new Error("Custom endpoint definition is required"));
490
- const multipart = definition.payloadMode === "multipart" || actualPayload instanceof FormData;
491
- const path = this.withKey(definition.path, actualKey);
492
- const method = definition.method;
493
- const unwrap = definition.responseUnwrap;
494
- return this.send(path, method, actualPayload, multipart).pipe(map((raw) => {
495
- if (unwrap) return unwrapResponse(raw, unwrap, "get");
496
- return raw;
497
- }));
498
- }
499
- invokeCustom(schemaOrDefinition, nameOrPayload, payload, key) {
500
- return this.invokeCustomEndpoint(schemaOrDefinition, nameOrPayload, payload, key);
501
- }
502
- custom(schemaOrDefinition, nameOrPayload, payload, key) {
503
- return this.invokeCustomEndpoint(schemaOrDefinition, nameOrPayload, payload, key);
504
- }
505
- send(path, method, payload, multipart = false) {
506
- if (!path) return throwError(() => /* @__PURE__ */ new Error("Operación no disponible para este recurso"));
507
- let resolvedPath;
508
- try {
509
- resolvedPath = resolveEndpointPath(path, this.buildSources());
510
- } catch (error) {
511
- return throwError(() => error);
512
- }
513
- const deps = this.transportDeps();
514
- return (this.driver === "rest" ? sendRest(deps, resolvedPath, method, payload, multipart) : sendGas(deps, resolvedPath, method, payload, multipart)).pipe(tap((res) => {
515
- const renewed = renewedTokenOf(res);
516
- if (renewed !== null) this.auth.applyRenewedToken(renewed);
517
- }));
518
- }
519
- transportDeps() {
520
- const adapter = this.firebaseAuthAdapter;
521
- return {
522
- http: this.http,
523
- apiUrl: this.apiUrl,
524
- sessionToken: () => this.auth.token(),
525
- getIdToken: adapter?.getIdToken ? () => adapter.getIdToken() : void 0
526
- };
527
- }
528
- buildSources() {
529
- return {
530
- ...this.valueSources,
531
- auth: () => ({
532
- user: this.auth.user(),
533
- token: this.auth.token()
534
- }),
535
- config: () => this.injector.get(ConfigService, null)?.globalConfig() ?? null
536
- };
537
- }
538
- withKey(path, key) {
539
- if (!path) return;
540
- return path.includes("{key}") ? path.replace("{key}", encodeURIComponent(key ?? "")) : path;
541
- }
542
- static ɵfac = i0.ɵɵngDeclareFactory({
543
- minVersion: "12.0.0",
544
- version: "22.2.3",
545
- ngImport: i0,
546
- type: ApiService,
547
- deps: [],
548
- target: i0.ɵɵFactoryTarget.Service
549
- });
550
- static ɵprov = i0.ɵɵngDeclareService({
551
- minVersion: "22.0.0",
552
- version: "22.2.3",
553
- ngImport: i0,
554
- type: ApiService
555
- });
556
- };
557
- i0.ɵɵngDeclareClassMetadata({
558
- minVersion: "12.0.0",
559
- version: "22.2.3",
560
- ngImport: i0,
561
- type: ApiService,
562
- decorators: [{ type: Service }]
563
- });
564
- function isResourceSchema(value) {
565
- return typeof value === "object" && value !== null && "endpoint" in value && "fields" in value;
566
- }
567
- function unwrapList(raw) {
568
- if (Array.isArray(raw)) return raw;
569
- if (raw !== null && typeof raw === "object") {
570
- const items = raw.items;
571
- if (Array.isArray(items)) return items;
572
- return [];
573
- }
574
- throw new Error(`List response must be an array or an object with an 'items' array; received ${raw === null ? "null" : typeof raw}`);
575
- }
576
- var ConfigService = class ConfigService {
577
- api = inject(ApiService, { optional: true });
578
- globalConfig = signal({ public_base_url: typeof window !== "undefined" ? window.location.origin : "" }, ...ngDevMode ? [{ debugName: "globalConfig" }] : /* istanbul ignore next */ []);
579
- endpoints = [];
580
- loaded = false;
581
- inFlight = null;
582
- load(endpoints) {
583
- this.endpoints = endpoints;
584
- this.ensure();
585
- }
586
- ensureLoaded() {
587
- return this.ensure();
588
- }
589
- ensure() {
590
- if (this.loaded) return Promise.resolve();
591
- if (this.inFlight) return this.inFlight;
592
- if (!this.api || typeof this.api.get !== "function" || this.endpoints.length === 0) return Promise.resolve();
593
- this.inFlight = firstValueFrom(forkJoin(this.endpoints.map((endpoint) => this.api.get(endpoint).pipe(catchError(() => of(null)))))).then((blocks) => {
594
- this.inFlight = null;
595
- blocks.forEach((data) => {
596
- if (data && typeof data === "object" && Object.keys(data).length > 0) this.globalConfig.update((current) => ({
597
- ...current,
598
- ...data
599
- }));
600
- });
601
- this.loaded = blocks.every((data) => data !== null);
602
- });
603
- return this.inFlight;
604
- }
605
- buildInterpolationContext(record) {
606
- const config = this.globalConfig();
607
- const baseUrl = String(config["public_base_url"] || window.location.origin).replace(/\/+$/, "");
608
- return {
609
- ...config,
610
- ...record,
611
- public_base_url: baseUrl
612
- };
613
- }
614
- static ɵfac = i0.ɵɵngDeclareFactory({
615
- minVersion: "12.0.0",
616
- version: "22.2.3",
617
- ngImport: i0,
618
- type: ConfigService,
619
- deps: [],
620
- target: i0.ɵɵFactoryTarget.Service
621
- });
622
- static ɵprov = i0.ɵɵngDeclareService({
623
- minVersion: "22.0.0",
624
- version: "22.2.3",
625
- ngImport: i0,
626
- type: ConfigService
627
- });
628
- };
629
- i0.ɵɵngDeclareClassMetadata({
630
- minVersion: "12.0.0",
631
- version: "22.2.3",
632
- ngImport: i0,
633
- type: ConfigService,
634
- decorators: [{ type: Service }]
635
- });
636
- let catalog = [];
637
- let authCatalog;
638
- function setSchemaCatalog(schemas, auth) {
639
- catalog = schemas;
640
- authCatalog = auth;
641
- }
642
- function getSchema(id) {
643
- return catalog.find((schema) => schema.id === id);
644
- }
645
- function allSchemas() {
646
- return catalog;
647
- }
648
- function getAuth() {
649
- return authCatalog;
650
- }
651
- const GAS_SCHEMAS = new InjectionToken("gas.admin.schemas");
652
- function provideGasAdmin(config) {
653
- setSchemaCatalog(config.schemas, config.auth);
654
- const configEndpoints = () => config.schemas.flatMap((schema) => schema.kind === "singleton" && schema.endpoint?.get ? [{ get: schema.endpoint.get }] : []);
655
- return [
656
- {
657
- provide: GAS_SCHEMAS,
658
- useValue: config.schemas
659
- },
660
- {
661
- provide: API_DRIVER,
662
- useValue: config.driver ?? "gas"
663
- },
664
- {
665
- provide: VALUE_SOURCES,
666
- useValue: config.valueSources ?? {}
667
- },
668
- {
669
- provide: DEFAULT_RESPONSE_UNWRAP,
670
- useValue: config.defaultResponseUnwrap
671
- },
672
- provideHttpClient(withInterceptors([apiErrorInterceptor])),
673
- provideAppInitializer(() => inject(ConfigService).load(configEndpoints())),
674
- provideAppInitializer(() => inject(AuthService).restore())
675
- ];
676
- }
677
- function provideFirebaseAdapter(adapter) {
678
- return {
679
- provide: FIREBASE_AUTH_ADAPTER,
680
- useValue: adapter
681
- };
682
- }
683
- export { DEFAULT_RESPONSE_UNWRAP as _, provideFirebaseAdapter as a, ApiError as b, ConfigService as c, AuthService as d, LOGIN_PATH as f, API_URL as g, API_DRIVER as h, getSchema as i, ApiService as l, SESSION_USER_KEY as m, allSchemas as n, provideGasAdmin as o, SESSION_TOKEN_KEY as p, getAuth as r, setSchemaCatalog as s, GAS_SCHEMAS as t, apiErrorInterceptor as u, FIREBASE_AUTH_ADAPTER as v, renewedTokenOf as x, VALUE_SOURCES as y };
684
-
685
- //# sourceMappingURL=tinya-code-gas-admin-ui-schema-catalog-D0Pk0wAN.mjs.map