@tinya-code/gas-admin-ui 0.2.0-alpha.12 → 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 (369) hide show
  1. package/README.md +222 -0
  2. package/ng-package.json +7 -0
  3. package/package.json +3 -15
  4. package/src/lib/actions/action-registry.spec.ts +52 -0
  5. package/src/lib/actions/action-registry.ts +126 -0
  6. package/src/lib/actions/action-service.spec.ts +215 -0
  7. package/src/lib/actions/action-service.ts +87 -0
  8. package/src/lib/actions/descriptors.spec.ts +155 -0
  9. package/src/lib/actions/descriptors.ts +154 -0
  10. package/src/lib/columns/column-cell.ts +33 -0
  11. package/src/lib/columns/column-defaults.spec.ts +99 -0
  12. package/src/lib/columns/column-defaults.ts +84 -0
  13. package/src/lib/columns/column-format.spec.ts +274 -0
  14. package/src/lib/columns/descriptors.ts +113 -0
  15. package/src/lib/columns/format-badge.ts +51 -0
  16. package/src/lib/columns/format-boolean.ts +58 -0
  17. package/src/lib/columns/format-currency.ts +30 -0
  18. package/src/lib/columns/format-date.ts +35 -0
  19. package/src/lib/columns/format-number.ts +32 -0
  20. package/src/lib/columns/format-text.ts +23 -0
  21. package/src/lib/columns/format-thumbnail.ts +63 -0
  22. package/src/lib/core/adapters/firebase-auth.adapter.ts +6 -0
  23. package/src/lib/core/guards/auth.guard.spec.ts +88 -0
  24. package/src/lib/core/guards/auth.guard.ts +48 -0
  25. package/src/lib/core/guards/unsaved-changes.guard.ts +16 -0
  26. package/src/lib/core/interceptors/api-error.interceptor.spec.ts +182 -0
  27. package/src/lib/core/interceptors/api-error.interceptor.ts +87 -0
  28. package/src/lib/core/models/api.model.ts +104 -0
  29. package/src/lib/core/models/schema-descriptions.ts +118 -0
  30. package/src/lib/core/models/schema.model.ts +1097 -0
  31. package/src/lib/core/registry/composition-validator.spec.ts +358 -0
  32. package/src/lib/core/registry/composition-validator.ts +270 -0
  33. package/src/lib/core/registry/field-validators.spec.ts +199 -0
  34. package/src/lib/core/registry/field-validators.ts +440 -0
  35. package/src/lib/core/registry/render-host.spec.ts +208 -0
  36. package/src/lib/core/registry/render-host.ts +646 -0
  37. package/src/lib/core/registry/render-registry.spec.ts +96 -0
  38. package/src/lib/core/registry/render-registry.ts +312 -0
  39. package/src/lib/core/registry/schema-catalog.ts +156 -0
  40. package/src/lib/core/services/api.service.spec.ts +1142 -0
  41. package/src/lib/core/services/api.service.ts +371 -0
  42. package/src/lib/core/services/auth.service.spec.ts +653 -0
  43. package/src/lib/core/services/auth.service.ts +503 -0
  44. package/src/lib/core/services/config.service.spec.ts +121 -0
  45. package/src/lib/core/services/config.service.ts +119 -0
  46. package/src/lib/core/services/data-source.service.spec.ts +179 -0
  47. package/src/lib/core/services/data-source.service.ts +142 -0
  48. package/src/lib/core/services/error-mapper.service.spec.ts +50 -0
  49. package/src/lib/core/services/error-mapper.service.ts +49 -0
  50. package/src/lib/core/services/notification.service.ts +73 -0
  51. package/src/lib/core/services/relation-drawer.service.ts +41 -0
  52. package/src/lib/core/services/theme.service.spec.ts +106 -0
  53. package/src/lib/core/services/theme.service.ts +86 -0
  54. package/src/lib/core/services/transport.spec.ts +198 -0
  55. package/src/lib/core/services/transport.ts +164 -0
  56. package/src/lib/core/services/upload.service.ts +81 -0
  57. package/src/lib/core/testing/categories.schema.ts +125 -0
  58. package/src/lib/core/testing/orders.schema.ts +372 -0
  59. package/src/lib/core/testing/products.schema.ts +258 -0
  60. package/src/lib/core/testing/site.schema.ts +195 -0
  61. package/src/lib/core/testing/test-catalog.ts +21 -0
  62. package/src/lib/core/tokens.ts +112 -0
  63. package/src/lib/core/utils/clipboard.spec.ts +55 -0
  64. package/src/lib/core/utils/clipboard.ts +90 -0
  65. package/src/lib/core/utils/context-resolver.spec.ts +95 -0
  66. package/src/lib/core/utils/context-resolver.ts +101 -0
  67. package/src/lib/core/utils/response-unwrapper.spec.ts +70 -0
  68. package/src/lib/core/utils/response-unwrapper.ts +103 -0
  69. package/src/lib/core/utils/source-options.spec.ts +96 -0
  70. package/src/lib/core/utils/source-options.ts +54 -0
  71. package/src/lib/core/utils/template-interpolator.spec.ts +59 -0
  72. package/src/lib/core/utils/template-interpolator.ts +56 -0
  73. package/src/lib/core/view-navigation/view-navigation.service.spec.ts +207 -0
  74. package/src/lib/core/view-navigation/view-navigation.service.ts +132 -0
  75. package/src/lib/fields/boolean/boolean.descriptor.ts +11 -0
  76. package/src/lib/fields/boolean/boolean.ts +40 -0
  77. package/src/lib/fields/color/color.descriptor.ts +12 -0
  78. package/src/lib/fields/color/color.ts +34 -0
  79. package/src/lib/fields/currency/currency.descriptor.ts +12 -0
  80. package/src/lib/fields/currency/currency.ts +67 -0
  81. package/src/lib/fields/date/date.descriptor.ts +12 -0
  82. package/src/lib/fields/date/date.ts +36 -0
  83. package/src/lib/fields/descriptors.ts +122 -0
  84. package/src/lib/fields/display/display-badge.ts +65 -0
  85. package/src/lib/fields/display/display-date.ts +39 -0
  86. package/src/lib/fields/display/display-defaults.ts +84 -0
  87. package/src/lib/fields/display/display-file.ts +41 -0
  88. package/src/lib/fields/display/display-image.ts +54 -0
  89. package/src/lib/fields/display/display-list.ts +107 -0
  90. package/src/lib/fields/display/display-number.ts +41 -0
  91. package/src/lib/fields/display/display-text.ts +42 -0
  92. package/src/lib/fields/display/display.spec.ts +242 -0
  93. package/src/lib/fields/dropdown/dropdown.descriptor.ts +12 -0
  94. package/src/lib/fields/dropdown/dropdown.ts +45 -0
  95. package/src/lib/fields/email/email.descriptor.ts +12 -0
  96. package/src/lib/fields/email/email.ts +28 -0
  97. package/src/lib/fields/field-aria.ts +60 -0
  98. package/src/lib/fields/field-host/field-host.spec.ts +118 -0
  99. package/src/lib/fields/field-host/field-host.ts +47 -0
  100. package/src/lib/fields/field-node.ts +88 -0
  101. package/src/lib/fields/file/file.descriptor.ts +14 -0
  102. package/src/lib/fields/file/file.spec.ts +134 -0
  103. package/src/lib/fields/file/file.ts +281 -0
  104. package/src/lib/fields/group/group.descriptor.ts +21 -0
  105. package/src/lib/fields/group/group.ts +110 -0
  106. package/src/lib/fields/image/image.descriptor.ts +12 -0
  107. package/src/lib/fields/image/image.spec.ts +117 -0
  108. package/src/lib/fields/image/image.ts +281 -0
  109. package/src/lib/fields/key-value/key-value.descriptor.ts +11 -0
  110. package/src/lib/fields/key-value/key-value.ts +283 -0
  111. package/src/lib/fields/list/list.descriptor.ts +21 -0
  112. package/src/lib/fields/list/list.ts +376 -0
  113. package/src/lib/fields/multiselect/multiselect.descriptor.ts +11 -0
  114. package/src/lib/fields/multiselect/multiselect.spec.ts +142 -0
  115. package/src/lib/fields/multiselect/multiselect.ts +152 -0
  116. package/src/lib/fields/number/number.descriptor.ts +12 -0
  117. package/src/lib/fields/number/number.ts +40 -0
  118. package/src/lib/fields/phone/phone.descriptor.ts +12 -0
  119. package/src/lib/fields/phone/phone.ts +46 -0
  120. package/src/lib/fields/readonly-text/readonly-text.descriptor.ts +12 -0
  121. package/src/lib/fields/readonly-text/readonly-text.ts +58 -0
  122. package/src/lib/fields/relation/relation.descriptor.ts +12 -0
  123. package/src/lib/fields/relation/relation.spec.ts +193 -0
  124. package/src/lib/fields/relation/relation.ts +224 -0
  125. package/src/lib/fields/rich-select/rich-select.descriptor.ts +12 -0
  126. package/src/lib/fields/rich-select/rich-select.ts +175 -0
  127. package/src/lib/fields/select/radio-mode.ts +25 -0
  128. package/src/lib/fields/select/select.descriptor.ts +12 -0
  129. package/src/lib/fields/select/select.spec.ts +162 -0
  130. package/src/lib/fields/select/select.ts +210 -0
  131. package/src/lib/fields/slug/slug.descriptor.ts +19 -0
  132. package/src/lib/fields/slug/slug.ts +67 -0
  133. package/src/lib/fields/string-list/string-list.descriptor.ts +11 -0
  134. package/src/lib/fields/string-list/string-list.ts +222 -0
  135. package/src/lib/fields/text/text.descriptor.ts +12 -0
  136. package/src/lib/fields/text/text.ts +35 -0
  137. package/src/lib/fields/textarea/textarea.descriptor.ts +12 -0
  138. package/src/lib/fields/textarea/textarea.spec.ts +117 -0
  139. package/src/lib/fields/textarea/textarea.ts +126 -0
  140. package/src/lib/fields/time/time.descriptor.ts +12 -0
  141. package/src/lib/fields/time/time.ts +28 -0
  142. package/src/lib/fields/unknown-render/unknown-render.ts +49 -0
  143. package/src/lib/fields/url/url.descriptor.ts +12 -0
  144. package/src/lib/fields/url/url.ts +53 -0
  145. package/src/lib/gas-admin-ui.spec.ts +21 -0
  146. package/src/lib/gas-admin-ui.ts +9 -0
  147. package/src/lib/layouts/descriptors.ts +9 -0
  148. package/src/lib/pages/dashboard/dashboard.ts +167 -0
  149. package/src/lib/pages/detail-view/detail-view.spec.ts +333 -0
  150. package/src/lib/pages/detail-view/detail-view.ts +570 -0
  151. package/src/lib/pages/drawer-form/drawer-form.ts +228 -0
  152. package/src/lib/pages/form-view/form-model.ts +88 -0
  153. package/src/lib/pages/form-view/form-schema.ts +255 -0
  154. package/src/lib/pages/form-view/form-view.ts +1622 -0
  155. package/src/lib/pages/list-view/list-view.formats.spec.ts +214 -0
  156. package/src/lib/pages/list-view/list-view.ts +882 -0
  157. package/src/lib/pages/login/login.spec.ts +109 -0
  158. package/src/lib/pages/login/login.ts +227 -0
  159. package/src/lib/pages/resource-page/resource-page.ts +234 -0
  160. package/src/lib/shared/components/badge/badge.ts +35 -0
  161. package/src/lib/shared/components/button/button.ts +65 -0
  162. package/src/lib/shared/components/confirm-dialog/confirm-dialog.ts +48 -0
  163. package/src/lib/shared/components/copy-button/copy-button.ts +56 -0
  164. package/src/lib/shared/components/copy-share/copy-share.spec.ts +122 -0
  165. package/src/lib/shared/components/copy-share/copy-share.ts +107 -0
  166. package/src/lib/shared/components/drawer/drawer.spec.ts +127 -0
  167. package/src/lib/shared/components/drawer/drawer.ts +172 -0
  168. package/src/lib/shared/components/empty-state/empty-state.ts +30 -0
  169. package/src/lib/shared/components/modal/modal.spec.ts +149 -0
  170. package/src/lib/shared/components/modal/modal.ts +145 -0
  171. package/src/lib/shared/components/post-create-modal/post-create-modal.spec.ts +165 -0
  172. package/src/lib/shared/components/post-create-modal/post-create-modal.ts +159 -0
  173. package/src/lib/shared/components/skeleton/skeleton.ts +31 -0
  174. package/src/lib/shared/components/toast/toast.ts +58 -0
  175. package/src/lib/shared/utils/col-span.ts +25 -0
  176. package/src/lib/shared/utils/condition-evaluator.ts +53 -0
  177. package/src/lib/shared/utils/depends-on.ts +48 -0
  178. package/src/lib/shared/utils/dialog-focus.ts +28 -0
  179. package/src/lib/shared/utils/field-path.ts +49 -0
  180. package/src/lib/shared/utils/gap-sorting.ts +144 -0
  181. package/src/lib/shared/utils/seed.spec.ts +64 -0
  182. package/src/lib/shared/utils/seed.ts +149 -0
  183. package/src/lib/shared/utils/slugify.ts +13 -0
  184. package/src/lib/shared/utils/validators.ts +41 -0
  185. package/src/lib/shell/layout/layout.ts +63 -0
  186. package/src/lib/shell/shell.routes.spec.ts +59 -0
  187. package/src/lib/shell/shell.routes.ts +122 -0
  188. package/src/lib/shell/sidebar/sidebar.ts +139 -0
  189. package/src/lib/shell/theme-toggle/theme-toggle.ts +74 -0
  190. package/src/lib/views/calendar-view/calendar-model.ts +426 -0
  191. package/src/lib/views/calendar-view/calendar-view.spec.ts +557 -0
  192. package/src/lib/views/calendar-view/calendar-view.ts +568 -0
  193. package/src/lib/views/composer/composer-host.spec.ts +301 -0
  194. package/src/lib/views/composer/composer-host.ts +248 -0
  195. package/src/lib/views/composer/composer-imports.spec.ts +54 -0
  196. package/src/lib/views/composer/view-context.spec.ts +117 -0
  197. package/src/lib/views/composer/view-context.ts +109 -0
  198. package/src/lib/views/composer/view-slot.spec.ts +130 -0
  199. package/src/lib/views/composer/view-slot.ts +178 -0
  200. package/src/lib/views/descriptors.ts +46 -0
  201. package/src/lib/views/kanban-view/kanban-model.ts +173 -0
  202. package/src/lib/views/kanban-view/kanban-view.spec.ts +540 -0
  203. package/src/lib/views/kanban-view/kanban-view.ts +327 -0
  204. package/src/lib/widgets/bar-chart/bar-chart.descriptor.ts +17 -0
  205. package/src/lib/widgets/bar-chart/bar-chart.spec.ts +66 -0
  206. package/src/lib/widgets/bar-chart/bar-chart.ts +76 -0
  207. package/src/lib/widgets/chart-line/chart-line.descriptor.ts +17 -0
  208. package/src/lib/widgets/chart-line/chart-line.spec.ts +113 -0
  209. package/src/lib/widgets/chart-line/chart-line.ts +219 -0
  210. package/src/lib/widgets/descriptors.ts +29 -0
  211. package/src/lib/widgets/metric-card/metric-card.descriptor.ts +41 -0
  212. package/src/lib/widgets/metric-card/metric-card.spec.ts +52 -0
  213. package/src/lib/widgets/metric-card/metric-card.ts +48 -0
  214. package/src/lib/widgets/quick-actions/quick-actions.descriptor.ts +13 -0
  215. package/src/lib/widgets/quick-actions/quick-actions.spec.ts +61 -0
  216. package/src/lib/widgets/quick-actions/quick-actions.ts +100 -0
  217. package/src/lib/widgets/record-list/record-list.descriptor.ts +16 -0
  218. package/src/lib/widgets/record-list/record-list.spec.ts +79 -0
  219. package/src/lib/widgets/record-list/record-list.ts +115 -0
  220. package/src/lib/widgets/series.spec.ts +42 -0
  221. package/src/lib/widgets/series.ts +56 -0
  222. package/src/lib/widgets/status-progress/status-progress.descriptor.ts +19 -0
  223. package/src/lib/widgets/status-progress/status-progress.spec.ts +63 -0
  224. package/src/lib/widgets/status-progress/status-progress.ts +104 -0
  225. package/src/lib/widgets/widget-host/widget-host.spec.ts +179 -0
  226. package/src/lib/widgets/widget-host/widget-host.ts +99 -0
  227. package/src/public-api.ts +104 -0
  228. package/tinya-code-gas-admin-ui-0.2.0-alpha.15.tgz +0 -0
  229. package/tsconfig.lib.json +13 -0
  230. package/tsconfig.lib.prod.json +11 -0
  231. package/tsconfig.spec.json +10 -0
  232. package/fesm2022/tinya-code-gas-admin-ui-badge-EeCA_l-o.mjs +0 -84
  233. package/fesm2022/tinya-code-gas-admin-ui-badge-EeCA_l-o.mjs.map +0 -1
  234. package/fesm2022/tinya-code-gas-admin-ui-bar-chart-G7sEMSBY.mjs +0 -140
  235. package/fesm2022/tinya-code-gas-admin-ui-bar-chart-G7sEMSBY.mjs.map +0 -1
  236. package/fesm2022/tinya-code-gas-admin-ui-boolean-B2ASKL0E.mjs +0 -113
  237. package/fesm2022/tinya-code-gas-admin-ui-boolean-B2ASKL0E.mjs.map +0 -1
  238. package/fesm2022/tinya-code-gas-admin-ui-button-BQjNW8KB.mjs +0 -163
  239. package/fesm2022/tinya-code-gas-admin-ui-button-BQjNW8KB.mjs.map +0 -1
  240. package/fesm2022/tinya-code-gas-admin-ui-calendar-view-DCY8bj2V.mjs +0 -1027
  241. package/fesm2022/tinya-code-gas-admin-ui-calendar-view-DCY8bj2V.mjs.map +0 -1
  242. package/fesm2022/tinya-code-gas-admin-ui-chart-line-BjdlKHoH.mjs +0 -278
  243. package/fesm2022/tinya-code-gas-admin-ui-chart-line-BjdlKHoH.mjs.map +0 -1
  244. package/fesm2022/tinya-code-gas-admin-ui-color-Dljh_By3.mjs +0 -107
  245. package/fesm2022/tinya-code-gas-admin-ui-color-Dljh_By3.mjs.map +0 -1
  246. package/fesm2022/tinya-code-gas-admin-ui-condition-evaluator-DY2k1M3C.mjs +0 -101
  247. package/fesm2022/tinya-code-gas-admin-ui-condition-evaluator-DY2k1M3C.mjs.map +0 -1
  248. package/fesm2022/tinya-code-gas-admin-ui-currency-BvuF3Z63.mjs +0 -141
  249. package/fesm2022/tinya-code-gas-admin-ui-currency-BvuF3Z63.mjs.map +0 -1
  250. package/fesm2022/tinya-code-gas-admin-ui-data-source.service-96FSbN72.mjs +0 -88
  251. package/fesm2022/tinya-code-gas-admin-ui-data-source.service-96FSbN72.mjs.map +0 -1
  252. package/fesm2022/tinya-code-gas-admin-ui-date-1SJGXZrd.mjs +0 -107
  253. package/fesm2022/tinya-code-gas-admin-ui-date-1SJGXZrd.mjs.map +0 -1
  254. package/fesm2022/tinya-code-gas-admin-ui-display-badge-fwk6sDU7.mjs +0 -140
  255. package/fesm2022/tinya-code-gas-admin-ui-display-badge-fwk6sDU7.mjs.map +0 -1
  256. package/fesm2022/tinya-code-gas-admin-ui-display-date-D7zLiDiG.mjs +0 -119
  257. package/fesm2022/tinya-code-gas-admin-ui-display-date-D7zLiDiG.mjs.map +0 -1
  258. package/fesm2022/tinya-code-gas-admin-ui-display-file-BiIhqvQC.mjs +0 -125
  259. package/fesm2022/tinya-code-gas-admin-ui-display-file-BiIhqvQC.mjs.map +0 -1
  260. package/fesm2022/tinya-code-gas-admin-ui-display-image-C1dhnZi1.mjs +0 -152
  261. package/fesm2022/tinya-code-gas-admin-ui-display-image-C1dhnZi1.mjs.map +0 -1
  262. package/fesm2022/tinya-code-gas-admin-ui-display-list-DOEuUbGe.mjs +0 -211
  263. package/fesm2022/tinya-code-gas-admin-ui-display-list-DOEuUbGe.mjs.map +0 -1
  264. package/fesm2022/tinya-code-gas-admin-ui-display-number-DDMzr4Hn.mjs +0 -116
  265. package/fesm2022/tinya-code-gas-admin-ui-display-number-DDMzr4Hn.mjs.map +0 -1
  266. package/fesm2022/tinya-code-gas-admin-ui-display-text-B8CdVNpv.mjs +0 -111
  267. package/fesm2022/tinya-code-gas-admin-ui-display-text-B8CdVNpv.mjs.map +0 -1
  268. package/fesm2022/tinya-code-gas-admin-ui-dropdown-C3blvmE1.mjs +0 -122
  269. package/fesm2022/tinya-code-gas-admin-ui-dropdown-C3blvmE1.mjs.map +0 -1
  270. package/fesm2022/tinya-code-gas-admin-ui-email-CT_O5ihA.mjs +0 -107
  271. package/fesm2022/tinya-code-gas-admin-ui-email-CT_O5ihA.mjs.map +0 -1
  272. package/fesm2022/tinya-code-gas-admin-ui-empty-state-BMc0QtoT.mjs +0 -109
  273. package/fesm2022/tinya-code-gas-admin-ui-empty-state-BMc0QtoT.mjs.map +0 -1
  274. package/fesm2022/tinya-code-gas-admin-ui-error-mapper.service-DY5y1FjE.mjs +0 -45
  275. package/fesm2022/tinya-code-gas-admin-ui-error-mapper.service-DY5y1FjE.mjs.map +0 -1
  276. package/fesm2022/tinya-code-gas-admin-ui-field-aria-BD1Wiggc.mjs +0 -50
  277. package/fesm2022/tinya-code-gas-admin-ui-field-aria-BD1Wiggc.mjs.map +0 -1
  278. package/fesm2022/tinya-code-gas-admin-ui-field-node-CIK6KNN_.mjs +0 -24
  279. package/fesm2022/tinya-code-gas-admin-ui-field-node-CIK6KNN_.mjs.map +0 -1
  280. package/fesm2022/tinya-code-gas-admin-ui-field-path-B4-FTBGZ.mjs +0 -27
  281. package/fesm2022/tinya-code-gas-admin-ui-field-path-B4-FTBGZ.mjs.map +0 -1
  282. package/fesm2022/tinya-code-gas-admin-ui-file-Dmxioog7.mjs +0 -408
  283. package/fesm2022/tinya-code-gas-admin-ui-file-Dmxioog7.mjs.map +0 -1
  284. package/fesm2022/tinya-code-gas-admin-ui-form-view-C709rc57.mjs +0 -4516
  285. package/fesm2022/tinya-code-gas-admin-ui-form-view-C709rc57.mjs.map +0 -1
  286. package/fesm2022/tinya-code-gas-admin-ui-format-badge-CK8ct5Wk.mjs +0 -82
  287. package/fesm2022/tinya-code-gas-admin-ui-format-badge-CK8ct5Wk.mjs.map +0 -1
  288. package/fesm2022/tinya-code-gas-admin-ui-format-boolean-ClzezZz-.mjs +0 -105
  289. package/fesm2022/tinya-code-gas-admin-ui-format-boolean-ClzezZz-.mjs.map +0 -1
  290. package/fesm2022/tinya-code-gas-admin-ui-format-currency-CVmniKml.mjs +0 -65
  291. package/fesm2022/tinya-code-gas-admin-ui-format-currency-CVmniKml.mjs.map +0 -1
  292. package/fesm2022/tinya-code-gas-admin-ui-format-date-Dr1YsDd_.mjs +0 -65
  293. package/fesm2022/tinya-code-gas-admin-ui-format-date-Dr1YsDd_.mjs.map +0 -1
  294. package/fesm2022/tinya-code-gas-admin-ui-format-number-CWCjpI4n.mjs +0 -65
  295. package/fesm2022/tinya-code-gas-admin-ui-format-number-CWCjpI4n.mjs.map +0 -1
  296. package/fesm2022/tinya-code-gas-admin-ui-format-text-DBOgJkH0.mjs +0 -59
  297. package/fesm2022/tinya-code-gas-admin-ui-format-text-DBOgJkH0.mjs.map +0 -1
  298. package/fesm2022/tinya-code-gas-admin-ui-format-thumbnail-PCRvxWKt.mjs +0 -94
  299. package/fesm2022/tinya-code-gas-admin-ui-format-thumbnail-PCRvxWKt.mjs.map +0 -1
  300. package/fesm2022/tinya-code-gas-admin-ui-gap-sorting-iTdy_DYG.mjs +0 -72
  301. package/fesm2022/tinya-code-gas-admin-ui-gap-sorting-iTdy_DYG.mjs.map +0 -1
  302. package/fesm2022/tinya-code-gas-admin-ui-group-h7-O8tt4.mjs +0 -238
  303. package/fesm2022/tinya-code-gas-admin-ui-group-h7-O8tt4.mjs.map +0 -1
  304. package/fesm2022/tinya-code-gas-admin-ui-image-7UhJ7nqI.mjs +0 -416
  305. package/fesm2022/tinya-code-gas-admin-ui-image-7UhJ7nqI.mjs.map +0 -1
  306. package/fesm2022/tinya-code-gas-admin-ui-kanban-view-Dl0Ol5Kb.mjs +0 -439
  307. package/fesm2022/tinya-code-gas-admin-ui-kanban-view-Dl0Ol5Kb.mjs.map +0 -1
  308. package/fesm2022/tinya-code-gas-admin-ui-key-value-nVdgg5at.mjs +0 -513
  309. package/fesm2022/tinya-code-gas-admin-ui-key-value-nVdgg5at.mjs.map +0 -1
  310. package/fesm2022/tinya-code-gas-admin-ui-list-C8ijJHAx.mjs +0 -637
  311. package/fesm2022/tinya-code-gas-admin-ui-list-C8ijJHAx.mjs.map +0 -1
  312. package/fesm2022/tinya-code-gas-admin-ui-metric-card-DnGMQL8l.mjs +0 -127
  313. package/fesm2022/tinya-code-gas-admin-ui-metric-card-DnGMQL8l.mjs.map +0 -1
  314. package/fesm2022/tinya-code-gas-admin-ui-multiselect-PB28e-jl.mjs +0 -251
  315. package/fesm2022/tinya-code-gas-admin-ui-multiselect-PB28e-jl.mjs.map +0 -1
  316. package/fesm2022/tinya-code-gas-admin-ui-notification.service-LjSULER6.mjs +0 -66
  317. package/fesm2022/tinya-code-gas-admin-ui-notification.service-LjSULER6.mjs.map +0 -1
  318. package/fesm2022/tinya-code-gas-admin-ui-number-JNr7glc8.mjs +0 -114
  319. package/fesm2022/tinya-code-gas-admin-ui-number-JNr7glc8.mjs.map +0 -1
  320. package/fesm2022/tinya-code-gas-admin-ui-phone-jR417hPf.mjs +0 -116
  321. package/fesm2022/tinya-code-gas-admin-ui-phone-jR417hPf.mjs.map +0 -1
  322. package/fesm2022/tinya-code-gas-admin-ui-quick-actions-DCQ6emmF.mjs +0 -235
  323. package/fesm2022/tinya-code-gas-admin-ui-quick-actions-DCQ6emmF.mjs.map +0 -1
  324. package/fesm2022/tinya-code-gas-admin-ui-radio-mode-DxvN07DY.mjs +0 -8
  325. package/fesm2022/tinya-code-gas-admin-ui-radio-mode-DxvN07DY.mjs.map +0 -1
  326. package/fesm2022/tinya-code-gas-admin-ui-readonly-text-BL7-4qie.mjs +0 -124
  327. package/fesm2022/tinya-code-gas-admin-ui-readonly-text-BL7-4qie.mjs.map +0 -1
  328. package/fesm2022/tinya-code-gas-admin-ui-record-list-BiZfnd_7.mjs +0 -249
  329. package/fesm2022/tinya-code-gas-admin-ui-record-list-BiZfnd_7.mjs.map +0 -1
  330. package/fesm2022/tinya-code-gas-admin-ui-relation-drawer.service-B0kT8EiW.mjs +0 -39
  331. package/fesm2022/tinya-code-gas-admin-ui-relation-drawer.service-B0kT8EiW.mjs.map +0 -1
  332. package/fesm2022/tinya-code-gas-admin-ui-relation-ykpJ3PYl.mjs +0 -309
  333. package/fesm2022/tinya-code-gas-admin-ui-relation-ykpJ3PYl.mjs.map +0 -1
  334. package/fesm2022/tinya-code-gas-admin-ui-render-registry-CULkxrSt.mjs +0 -576
  335. package/fesm2022/tinya-code-gas-admin-ui-render-registry-CULkxrSt.mjs.map +0 -1
  336. package/fesm2022/tinya-code-gas-admin-ui-rich-select-CIHaOrbU.mjs +0 -161
  337. package/fesm2022/tinya-code-gas-admin-ui-rich-select-CIHaOrbU.mjs.map +0 -1
  338. package/fesm2022/tinya-code-gas-admin-ui-rolldown-runtime-DpJrqANO.mjs +0 -11
  339. package/fesm2022/tinya-code-gas-admin-ui-schema-catalog-D0Pk0wAN.mjs +0 -685
  340. package/fesm2022/tinya-code-gas-admin-ui-schema-catalog-D0Pk0wAN.mjs.map +0 -1
  341. package/fesm2022/tinya-code-gas-admin-ui-seed-CcCA3FdQ.mjs +0 -80
  342. package/fesm2022/tinya-code-gas-admin-ui-seed-CcCA3FdQ.mjs.map +0 -1
  343. package/fesm2022/tinya-code-gas-admin-ui-select-CDwX9yNO.mjs +0 -296
  344. package/fesm2022/tinya-code-gas-admin-ui-select-CDwX9yNO.mjs.map +0 -1
  345. package/fesm2022/tinya-code-gas-admin-ui-skeleton-DnWK0tcZ.mjs +0 -119
  346. package/fesm2022/tinya-code-gas-admin-ui-skeleton-DnWK0tcZ.mjs.map +0 -1
  347. package/fesm2022/tinya-code-gas-admin-ui-slug-DU58cbiY.mjs +0 -158
  348. package/fesm2022/tinya-code-gas-admin-ui-slug-DU58cbiY.mjs.map +0 -1
  349. package/fesm2022/tinya-code-gas-admin-ui-source-options-B9R4mw8-.mjs +0 -26
  350. package/fesm2022/tinya-code-gas-admin-ui-source-options-B9R4mw8-.mjs.map +0 -1
  351. package/fesm2022/tinya-code-gas-admin-ui-status-progress-DmeG8htE.mjs +0 -205
  352. package/fesm2022/tinya-code-gas-admin-ui-status-progress-DmeG8htE.mjs.map +0 -1
  353. package/fesm2022/tinya-code-gas-admin-ui-string-list-gleasqzD.mjs +0 -432
  354. package/fesm2022/tinya-code-gas-admin-ui-string-list-gleasqzD.mjs.map +0 -1
  355. package/fesm2022/tinya-code-gas-admin-ui-template-interpolator-ewv7CkNX.mjs +0 -36
  356. package/fesm2022/tinya-code-gas-admin-ui-template-interpolator-ewv7CkNX.mjs.map +0 -1
  357. package/fesm2022/tinya-code-gas-admin-ui-text-CUPmL7W_.mjs +0 -107
  358. package/fesm2022/tinya-code-gas-admin-ui-text-CUPmL7W_.mjs.map +0 -1
  359. package/fesm2022/tinya-code-gas-admin-ui-textarea-CGLSIW13.mjs +0 -223
  360. package/fesm2022/tinya-code-gas-admin-ui-textarea-CGLSIW13.mjs.map +0 -1
  361. package/fesm2022/tinya-code-gas-admin-ui-time-BcHzsTWf.mjs +0 -107
  362. package/fesm2022/tinya-code-gas-admin-ui-time-BcHzsTWf.mjs.map +0 -1
  363. package/fesm2022/tinya-code-gas-admin-ui-upload.service-CZPEPCeN.mjs +0 -60
  364. package/fesm2022/tinya-code-gas-admin-ui-upload.service-CZPEPCeN.mjs.map +0 -1
  365. package/fesm2022/tinya-code-gas-admin-ui-url-GO4LZi__.mjs +0 -141
  366. package/fesm2022/tinya-code-gas-admin-ui-url-GO4LZi__.mjs.map +0 -1
  367. package/fesm2022/tinya-code-gas-admin-ui.mjs +0 -4599
  368. package/fesm2022/tinya-code-gas-admin-ui.mjs.map +0 -1
  369. package/types/tinya-code-gas-admin-ui.d.ts +0 -3632
@@ -1 +0,0 @@
1
- {"version":3,"file":"tinya-code-gas-admin-ui-select-CDwX9yNO.mjs","names":[],"sources":["../../../projects/gas-admin-ui/src/lib/fields/select/select.ts"],"sourcesContent":["import { Component, computed, inject, input, resource, signal } from '@angular/core';\nimport { FormField } from '@angular/forms/signals';\n\nimport type { SelectField, SelectOption } from '../../core/models/schema.model';\nimport { DataSourceService, dataSourceKey } from '../../core/services/data-source.service';\nimport { optionsFromRows } from '../../core/utils/source-options';\nimport { getSchema } from '../../core/registry/schema-catalog';\nimport { FieldAria } from '../field-aria';\nimport { childTree, type RootTree } from '../field-node';\nimport { esGrupoRadio } from './radio-mode';\n\n/**\n * Desplegable de un solo valor (base.md §5.1).\n *\n * Sus opciones se declaran de dos formas y **exactamente una** (XOR, D62):\n * `options` estáticas en el schema o `source` — una fuente declarada que\n * pide `DataSourceService` con la misma caché que usan las relaciones y los\n * widgets (F8 · R6.5). Mientras la vuelta no llega se anuncia; sin anuncio\n * un desplegable vacío se confundiría con «esto no tiene opciones».\n */\n@Component({\n selector: 'app-field-select',\n imports: [FieldAria, FormField],\n template: `\n @if (fallo()) {\n <p class=\"mb-1 text-xs text-danger\" role=\"alert\">No se pudieron cargar las opciones.</p>\n } @else if (cargando()) {\n <p class=\"mb-1 text-xs text-neutral\" role=\"status\">Cargando opciones…</p>\n }\n @if (useRadio()) {\n <!-- Guía de control: 2–4 opciones estáticas → radio buttons, no un\n desplegable. Cada opción es un label implícito (texto y control\n juntos) y el grupo se nombra con aria-label: el rótulo del host\n se dibuja como texto porque un grupo no es un único control con\n el que emparejar un for. formField va en CADA input: Signal\n Forms soporta radio (checked = value === element.value) y setea\n name/disabled del grupo por estado de campo. -->\n <div\n class=\"mt-1 flex flex-col gap-1\"\n role=\"radiogroup\"\n [attr.aria-label]=\"field().label\"\n data-testid=\"select-radios\"\n >\n @if (!field().required) {\n <label class=\"flex w-fit items-center gap-2 text-sm\">\n <input\n type=\"radio\"\n class=\"accent-primary\"\n [id]=\"state().name() + '-__vacio'\"\n value=\"\"\n [formField]=\"node()\"\n />\n <span class=\"text-neutral\">{{ field().placeholder ?? '— Seleccionar —' }}</span>\n </label>\n }\n @for (option of options(); track option.value) {\n <label class=\"flex w-fit items-center gap-2 text-sm\">\n <input\n type=\"radio\"\n class=\"accent-primary\"\n [id]=\"state().name() + '-' + option.value\"\n [value]=\"option.value\"\n [formField]=\"node()\"\n />\n <span>{{ option.label }}</span>\n </label>\n }\n </div>\n } @else {\n @if (useSearch()) {\n <!-- Guía §1: más de 7 opciones → dropdown con búsqueda. Se filtra el\n select nativo en vez de construir un combobox: el teclado, el\n anuncio de la opción activa y el valor elegido siguen siendo los\n del navegador. -->\n <input\n type=\"search\"\n class=\"mb-1 w-full rounded-lg border border-neutral/30 bg-surface px-2 py-1 text-sm focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary\"\n placeholder=\"Buscar…\"\n aria-label=\"Buscar entre las opciones\"\n [attr.aria-controls]=\"state().name()\"\n [value]=\"query()\"\n (input)=\"onQuery($event)\"\n />\n }\n <select class=\"field-input\" [id]=\"state().name()\" [formField]=\"node()\">\n @if (!field().required) {\n <option value=\"\">{{ field().placeholder ?? '— Seleccionar —' }}</option>\n }\n @for (option of visibleOptions(); track option.value) {\n <option [value]=\"option.value\" [disabled]=\"option.disabled ?? false\">\n {{ option.label }}\n </option>\n }\n </select>\n @if (noMatches()) {\n <p class=\"mt-1 text-xs text-neutral\" role=\"status\">Sin resultados para «{{ query() }}».</p>\n }\n }\n `,\n})\nexport class FieldSelect {\n readonly field = input.required<SelectField>();\n readonly tree = input.required<RootTree>();\n\n private readonly ds = inject(DataSourceService);\n\n protected readonly node = computed(() => childTree<string>(this.tree(), this.field().key));\n protected readonly state = computed(() => this.node()());\n\n /** Texto escrito en el buscador (sólo se usa si supera el umbral). */\n protected readonly query = signal('');\n\n /**\n * Registro del formulario, sólo para resolver `{campo}` en `source.params`.\n * Sin parámetros declarados no se lee: el campo no depende del formulario.\n */\n private readonly registro = computed<Record<string, unknown> | undefined>(() => {\n const source = this.field().source;\n if (source === undefined || source.params === undefined) return undefined;\n return this.tree()().value();\n });\n\n /** `undefined` sin fuente ⇒ `resource` queda idle y jamás llama al loader. */\n private readonly claveFuente = computed(() => {\n const source = this.field().source;\n return source === undefined ? undefined : dataSourceKey(source, this.registro());\n });\n\n private readonly fuenteResource = resource({\n params: () => this.claveFuente(),\n loader: async () => {\n const source = this.field().source;\n if (source === undefined) return [];\n return this.ds.rows(source, this.registro());\n },\n });\n\n /**\n * Opciones efectivas: las estáticas del schema o las filas de la fuente\n * declarada, mapeadas con la misma regla que una relación (F8 · R6.5).\n */\n protected readonly options = computed<SelectOption[]>(() => {\n const field = this.field();\n if (field.source === undefined) return field.options ?? [];\n // `value()` del resource TIRA en estado error (contract de Angular):\n // se mira el estado antes de leerlo, o el propio render rompe en vez\n // de pintar el aviso de fallo.\n if (this.fuenteResource.status() === 'error') return [];\n return optionsFromRows(this.fuenteResource.value() ?? [], {\n source: field.source,\n target: getSchema(field.source.resource),\n });\n });\n\n /** Sólo aplica con `source`: una lista estática no tiene vuelta que esperar. */\n protected readonly cargando = computed(\n () => this.claveFuente() !== undefined && this.fuenteResource.status() === 'loading',\n );\n\n protected readonly fallo = computed(\n () => this.claveFuente() !== undefined && this.fuenteResource.status() === 'error',\n );\n\n /** Umbral de la guía §1: 5–7 opciones dropdown simple, más de 7 con búsqueda. */\n protected readonly useSearch = computed(() => this.options().length > 7);\n\n /** Guía §1: 2–4 opciones estáticas → radio buttons (ver `radio-mode.ts`). */\n protected readonly useRadio = computed(() => esGrupoRadio(this.field()));\n\n protected onQuery(event: Event): void {\n this.query.set((event.target as HTMLInputElement).value);\n }\n\n /**\n * Opciones que coinciden con el término, SIN conservar la elegida: es la\n * base del mensaje «Sin resultados».\n */\n protected readonly matches = computed<SelectOption[]>(() => {\n const all = this.options();\n const term = this.query().trim().toLowerCase();\n if (term === '') {\n return all;\n }\n return all.filter((option) => option.label.toLowerCase().includes(term));\n });\n\n /** El buscador está activo y no encontró nada nuevo (el elegido no cuenta). */\n protected readonly noMatches = computed(\n () => this.useSearch() && this.query().trim() !== '' && this.matches().length === 0,\n );\n\n /**\n * Opciones que se dibujan. Con búsqueda activa se acotan por etiqueta, pero\n * la opción elegida se conserva siempre aunque no coincida con el término:\n * si desapareciera del DOM, el select dejaría de mostrar el valor actual\n * (guía §1: «valor seleccionado siempre visible»).\n */\n protected readonly visibleOptions = computed<SelectOption[]>(() => {\n const filtered = this.matches();\n if (this.query().trim() === '') {\n return filtered;\n }\n const selected = String(this.state().value() ?? '');\n if (filtered.some((option) => option.value === selected)) {\n return filtered;\n }\n const kept = this.options().find((option) => option.value === selected);\n return kept === undefined ? filtered : [...filtered, kept];\n });\n}\n"],"mappings":"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"}
@@ -1,119 +0,0 @@
1
- import * as i0 from "@angular/core";
2
- import { Component, computed, input } from "@angular/core";
3
- var Skeleton = class Skeleton {
4
- lines = input(1, ...ngDevMode ? [{ debugName: "lines" }] : /* istanbul ignore next */ []);
5
- height = input(16, ...ngDevMode ? [{ debugName: "height" }] : /* istanbul ignore next */ []);
6
- width = input("100%", ...ngDevMode ? [{ debugName: "width" }] : /* istanbul ignore next */ []);
7
- lineCount = computed(() => {
8
- const lines = Math.floor(this.lines());
9
- const count = Number.isFinite(lines) && lines > 0 ? lines : 1;
10
- return Array.from({ length: count }, (_, index) => index);
11
- }, ...ngDevMode ? [{ debugName: "lineCount" }] : /* istanbul ignore next */ []);
12
- static ɵfac = i0.ɵɵngDeclareFactory({
13
- minVersion: "12.0.0",
14
- version: "22.2.3",
15
- ngImport: i0,
16
- type: Skeleton,
17
- deps: [],
18
- target: i0.ɵɵFactoryTarget.Component
19
- });
20
- static ɵcmp = i0.ɵɵngDeclareComponent({
21
- minVersion: "17.0.0",
22
- version: "22.2.3",
23
- type: Skeleton,
24
- isStandalone: true,
25
- selector: "app-skeleton",
26
- inputs: {
27
- lines: {
28
- classPropertyName: "lines",
29
- publicName: "lines",
30
- isSignal: true,
31
- isRequired: false,
32
- transformFunction: null
33
- },
34
- height: {
35
- classPropertyName: "height",
36
- publicName: "height",
37
- isSignal: true,
38
- isRequired: false,
39
- transformFunction: null
40
- },
41
- width: {
42
- classPropertyName: "width",
43
- publicName: "width",
44
- isSignal: true,
45
- isRequired: false,
46
- transformFunction: null
47
- }
48
- },
49
- host: {
50
- attributes: { "aria-hidden": "true" },
51
- classAttribute: "block space-y-2"
52
- },
53
- ngImport: i0,
54
- template: `
55
- @for (line of lineCount(); track line) {
56
- <div
57
- class="animate-pulse rounded bg-neutral/15"
58
- [style.height.px]="height()"
59
- [style.width]="width()"
60
- ></div>
61
- }
62
- `,
63
- isInline: true
64
- });
65
- };
66
- i0.ɵɵngDeclareClassMetadata({
67
- minVersion: "12.0.0",
68
- version: "22.2.3",
69
- ngImport: i0,
70
- type: Skeleton,
71
- decorators: [{
72
- type: Component,
73
- args: [{
74
- selector: "app-skeleton",
75
- host: {
76
- class: "block space-y-2",
77
- "aria-hidden": "true"
78
- },
79
- template: `
80
- @for (line of lineCount(); track line) {
81
- <div
82
- class="animate-pulse rounded bg-neutral/15"
83
- [style.height.px]="height()"
84
- [style.width]="width()"
85
- ></div>
86
- }
87
- `
88
- }]
89
- }],
90
- propDecorators: {
91
- lines: [{
92
- type: i0.Input,
93
- args: [{
94
- isSignal: true,
95
- alias: "lines",
96
- required: false
97
- }]
98
- }],
99
- height: [{
100
- type: i0.Input,
101
- args: [{
102
- isSignal: true,
103
- alias: "height",
104
- required: false
105
- }]
106
- }],
107
- width: [{
108
- type: i0.Input,
109
- args: [{
110
- isSignal: true,
111
- alias: "width",
112
- required: false
113
- }]
114
- }]
115
- }
116
- });
117
- export { Skeleton as t };
118
-
119
- //# sourceMappingURL=tinya-code-gas-admin-ui-skeleton-DnWK0tcZ.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tinya-code-gas-admin-ui-skeleton-DnWK0tcZ.mjs","names":[],"sources":["../../../projects/gas-admin-ui/src/lib/shared/components/skeleton/skeleton.ts"],"sourcesContent":["import { Component, computed, input } from '@angular/core';\n\n/**\n * Bloque de carga decorativo: oculto para lectores (`aria-hidden`); la\n * región que lo contiene debe exponer `aria-busy=\"true\"`.\n */\n@Component({\n selector: 'app-skeleton',\n host: { class: 'block space-y-2', 'aria-hidden': 'true' },\n template: `\n @for (line of lineCount(); track line) {\n <div\n class=\"animate-pulse rounded bg-neutral/15\"\n [style.height.px]=\"height()\"\n [style.width]=\"width()\"\n ></div>\n }\n `,\n})\nexport class Skeleton {\n /** Cantidad de barras (mínimo 1). */\n readonly lines = input(1);\n readonly height = input(16);\n readonly width = input('100%');\n\n readonly lineCount = computed(() => {\n const lines = Math.floor(this.lines());\n const count = Number.isFinite(lines) && lines > 0 ? lines : 1;\n return Array.from({ length: count }, (_, index) => index);\n });\n}\n"],"mappings":";;AAmBA,IAAa,WAAb,MAAa,SAAQ;CAEV,QAAQ,MAAM,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAChB,SAAS,MAAM,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAClB,QAAQ,MAAM,QAAO,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAErB,YAAY,eAAc;EACjC,MAAM,QAAQ,KAAK,MAAM,KAAK,MAAK,CAAE;EACrC,MAAM,QAAQ,OAAO,SAAS,KAAK,KAAK,QAAQ,IAAI,QAAQ;EAC5D,OAAO,MAAM,KAAK,EAAE,QAAQ,MAAK,IAAK,GAAG,UAAU,KAAK;CAC1D,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAVS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAQ,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAR,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAQ,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,MAAA;GAAA,YAAA,EAAA,eAAA,OAAA;GAAA,gBAAA;EAAA;EAAA,UAAA;EAAA,UAVT;;;;;;;;;EAQT,UAAA;CAAA,CAAA;;AAEU,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAQ,YAAA,CAAA;EAbpB,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,MAAM;IAAE,OAAO;IAAmB,eAAe;GAAM;GACvD,UAAU;;;;;;;;;EASX,CAAA"}
@@ -1,158 +0,0 @@
1
- import { n as FieldAria } from "./tinya-code-gas-admin-ui-field-aria-BD1Wiggc.mjs";
2
- import { t as childTree } from "./tinya-code-gas-admin-ui-field-node-CIK6KNN_.mjs";
3
- import * as i0 from "@angular/core";
4
- import { Component, computed, effect, input, signal } from "@angular/core";
5
- import { FormField } from "@angular/forms/signals";
6
- function slugify(value) {
7
- return value.normalize("NFD").replace(/[\u0300-\u036f]/g, "").toLowerCase().trim().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
8
- }
9
- var FieldSlug = class FieldSlug {
10
- field = input.required(...ngDevMode ? [{ debugName: "field" }] : /* istanbul ignore next */ []);
11
- tree = input.required(...ngDevMode ? [{ debugName: "tree" }] : /* istanbul ignore next */ []);
12
- exists = input(false, ...ngDevMode ? [{ debugName: "exists" }] : /* istanbul ignore next */ []);
13
- manual = signal(false, ...ngDevMode ? [{ debugName: "manual" }] : /* istanbul ignore next */ []);
14
- node = computed(() => childTree(this.tree(), this.field().key), ...ngDevMode ? [{ debugName: "node" }] : /* istanbul ignore next */ []);
15
- state = computed(() => this.node()(), ...ngDevMode ? [{ debugName: "state" }] : /* istanbul ignore next */ []);
16
- locked = computed(() => this.field().lockAfterCreate !== false && this.exists(), ...ngDevMode ? [{ debugName: "locked" }] : /* istanbul ignore next */ []);
17
- sourceValue = computed(() => childTree(this.tree(), this.field().from)().value(), ...ngDevMode ? [{ debugName: "sourceValue" }] : /* istanbul ignore next */ []);
18
- constructor() {
19
- effect(() => {
20
- if (this.locked() || this.manual()) return;
21
- this.state().value.set(slugify(String(this.sourceValue() ?? "")));
22
- });
23
- }
24
- static ɵfac = i0.ɵɵngDeclareFactory({
25
- minVersion: "12.0.0",
26
- version: "22.2.3",
27
- ngImport: i0,
28
- type: FieldSlug,
29
- deps: [],
30
- target: i0.ɵɵFactoryTarget.Component
31
- });
32
- static ɵcmp = i0.ɵɵngDeclareComponent({
33
- minVersion: "17.0.0",
34
- version: "22.2.3",
35
- type: FieldSlug,
36
- isStandalone: true,
37
- selector: "app-field-slug",
38
- inputs: {
39
- field: {
40
- classPropertyName: "field",
41
- publicName: "field",
42
- isSignal: true,
43
- isRequired: true,
44
- transformFunction: null
45
- },
46
- tree: {
47
- classPropertyName: "tree",
48
- publicName: "tree",
49
- isSignal: true,
50
- isRequired: true,
51
- transformFunction: null
52
- },
53
- exists: {
54
- classPropertyName: "exists",
55
- publicName: "exists",
56
- isSignal: true,
57
- isRequired: false,
58
- transformFunction: null
59
- }
60
- },
61
- ngImport: i0,
62
- template: `
63
- @if (locked()) {
64
- <input
65
- type="text"
66
- class="field-input"
67
- [id]="state().name()"
68
- [value]="state().value()"
69
- readonly
70
- />
71
- } @else {
72
- <input
73
- type="text"
74
- class="field-input"
75
- [id]="state().name()"
76
- [formField]="node()"
77
- [placeholder]="field().placeholder ?? ''"
78
- (input)="manual.set(true)"
79
- />
80
- }
81
- `,
82
- isInline: true,
83
- dependencies: [{
84
- kind: "directive",
85
- type: FieldAria,
86
- selector: "input[id], select[id], textarea[id], output[id]"
87
- }, {
88
- kind: "directive",
89
- type: FormField,
90
- selector: "[formField]",
91
- inputs: ["formField"],
92
- exportAs: ["formField"]
93
- }]
94
- });
95
- };
96
- i0.ɵɵngDeclareClassMetadata({
97
- minVersion: "12.0.0",
98
- version: "22.2.3",
99
- ngImport: i0,
100
- type: FieldSlug,
101
- decorators: [{
102
- type: Component,
103
- args: [{
104
- selector: "app-field-slug",
105
- imports: [FieldAria, FormField],
106
- template: `
107
- @if (locked()) {
108
- <input
109
- type="text"
110
- class="field-input"
111
- [id]="state().name()"
112
- [value]="state().value()"
113
- readonly
114
- />
115
- } @else {
116
- <input
117
- type="text"
118
- class="field-input"
119
- [id]="state().name()"
120
- [formField]="node()"
121
- [placeholder]="field().placeholder ?? ''"
122
- (input)="manual.set(true)"
123
- />
124
- }
125
- `
126
- }]
127
- }],
128
- ctorParameters: () => [],
129
- propDecorators: {
130
- field: [{
131
- type: i0.Input,
132
- args: [{
133
- isSignal: true,
134
- alias: "field",
135
- required: true
136
- }]
137
- }],
138
- tree: [{
139
- type: i0.Input,
140
- args: [{
141
- isSignal: true,
142
- alias: "tree",
143
- required: true
144
- }]
145
- }],
146
- exists: [{
147
- type: i0.Input,
148
- args: [{
149
- isSignal: true,
150
- alias: "exists",
151
- required: false
152
- }]
153
- }]
154
- }
155
- });
156
- export { FieldSlug };
157
-
158
- //# sourceMappingURL=tinya-code-gas-admin-ui-slug-DU58cbiY.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tinya-code-gas-admin-ui-slug-DU58cbiY.mjs","names":[],"sources":["../../../projects/gas-admin-ui/src/lib/shared/utils/slugify.ts","../../../projects/gas-admin-ui/src/lib/fields/slug/slug.ts"],"sourcesContent":["/**\n * Normaliza texto a slug: minúsculas, sin acentos, separados por guiones.\n * Ej.: `Lomo Saltado Ñoño` → `lomo-saltado-nonio`.\n */\nexport function slugify(value: string): string {\n return value\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n","import { Component, computed, effect, input, signal } from '@angular/core';\nimport { FormField } from '@angular/forms/signals';\n\nimport type { SlugField } from '../../core/models/schema.model';\nimport { slugify } from '../../shared/utils/slugify';\nimport { FieldAria } from '../field-aria';\nimport { childTree, type RootTree } from '../field-node';\n\n/**\n * Slug autogenerado desde otro campo (base.md §5.1). Se regenera mientras el\n * usuario no lo edite a mano; queda bloqueado tras crear el registro si\n * `lockAfterCreate` no es `false`. La rama bloqueada no usa `formField`\n * (atributo `readonly` estático y sin sincronización).\n */\n@Component({\n selector: 'app-field-slug',\n imports: [FieldAria, FormField],\n template: `\n @if (locked()) {\n <input\n type=\"text\"\n class=\"field-input\"\n [id]=\"state().name()\"\n [value]=\"state().value()\"\n readonly\n />\n } @else {\n <input\n type=\"text\"\n class=\"field-input\"\n [id]=\"state().name()\"\n [formField]=\"node()\"\n [placeholder]=\"field().placeholder ?? ''\"\n (input)=\"manual.set(true)\"\n />\n }\n `,\n})\nexport class FieldSlug {\n readonly field = input.required<SlugField>();\n readonly tree = input.required<RootTree>();\n /** Si el registro ya existe (lo informa form-view, Fase 10). */\n readonly exists = input(false);\n\n /** Edición manual del usuario: corta la autogeneración. */\n protected readonly manual = signal(false);\n\n protected readonly node = computed(() => childTree<string>(this.tree(), this.field().key));\n protected readonly state = computed(() => this.node()());\n\n protected readonly locked = computed(\n () => this.field().lockAfterCreate !== false && this.exists(),\n );\n\n private readonly sourceValue = computed(() =>\n childTree<unknown>(this.tree(), this.field().from)().value(),\n );\n\n constructor() {\n effect(() => {\n if (this.locked() || this.manual()) {\n return;\n }\n this.state().value.set(slugify(String(this.sourceValue() ?? '')));\n });\n }\n}\n"],"mappings":";;;;;AAIA,SAAgB,QAAQ,OAAa;CACnC,OAAO,MACJ,UAAU,KAAK,CAAC,CAChB,QAAQ,oBAAoB,EAAE,CAAC,CAC/B,YAAW,CAAE,CACb,KAAI,CAAE,CACN,QAAQ,eAAe,GAAG,CAAC,CAC3B,QAAQ,YAAY,EAAE;AAC3B;AC0BA,IAAa,YAAb,MAAa,UAAS;CACX,QAAQ,MAAM,SAAqB,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CACnC,OAAO,MAAM,SAAoB,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAEjC,SAAS,MAAM,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAGX,SAAS,OAAO,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAEtB,OAAO,eAAe,UAAkB,KAAK,KAAI,GAAI,KAAK,MAAK,CAAE,CAAC,GAAG,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CACvE,QAAQ,eAAe,KAAK,KAAI,CAAE,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAErC,SAAS,eACpB,KAAK,MAAK,CAAE,CAAC,oBAAoB,SAAS,KAAK,OAAM,GAC5D,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAEgB,cAAc,eAC7B,UAAmB,KAAK,KAAI,GAAI,KAAK,MAAK,CAAE,CAAC,IAAI,CAAC,CAAA,CAAE,CAAC,MAAK,GAC3D,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAED,cAAA;EACE,aAAY;GACV,IAAI,KAAK,OAAM,KAAM,KAAK,OAAM,GAC9B;GAEF,KAAK,MAAK,CAAE,CAAC,MAAM,IAAI,QAAQ,OAAO,KAAK,YAAW,KAAM,EAAE,CAAC,CAAC;EAClE,CAAC;CACH;CA3BW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAS,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAT,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAS,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,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,UAAA;EAAA,UArBV;;;;;;;;;;;;;;;;;;;;EAmBT,UAAA;EAAA,cAAA,CAAA;GAAA,MAAA;GAAA,MApBS;GAAS,UAAA;EAAA,GAAA;GAAA,MAAA;GAAA,MAAE;GAAS,UAAA;GAAA,QAAA,CAAA,WAAA;GAAA,UAAA,CAAA,WAAA;EAAA,CAAA;CAAA,CAAA;;AAsBnB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAS,YAAA,CAAA;EAxBrB,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,SAAS,CAAC,WAAW,SAAS;GAC9B,UAAU;;;;;;;;;;;;;;;;;;;;EAoBX,CAAA"}
@@ -1,26 +0,0 @@
1
- function optionsFromRows(rows, { source, target, onlyActive, secondaryField }) {
2
- const valueKey = source.valueField ?? target?.keyField ?? "id";
3
- const labelKey = source.labelField ?? target?.titleField ?? valueKey;
4
- const options = [];
5
- for (const row of rows) {
6
- if (onlyActive === true && row["active"] === false) continue;
7
- const value = row[valueKey];
8
- if (value === void 0 || value === null || value === "") continue;
9
- const label = row[labelKey];
10
- const primary = typeof label === "string" && label !== "" ? label : String(value);
11
- options.push({
12
- value: String(value),
13
- label: withSecondary(primary, row, secondaryField)
14
- });
15
- }
16
- return options;
17
- }
18
- function withSecondary(primary, row, key) {
19
- if (key === void 0) return primary;
20
- const secondary = row[key];
21
- if (secondary === void 0 || secondary === null || secondary === "") return primary;
22
- return `${primary} · ${String(secondary)}`;
23
- }
24
- export { optionsFromRows as t };
25
-
26
- //# sourceMappingURL=tinya-code-gas-admin-ui-source-options-B9R4mw8-.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tinya-code-gas-admin-ui-source-options-B9R4mw8-.mjs","names":[],"sources":["../../../projects/gas-admin-ui/src/lib/core/utils/source-options.ts"],"sourcesContent":["import type { DataSource, ResourceSchema, SelectOption } from '../models/schema.model';\n\n/** Contexto de mapeo: la fuente declarada más las particularidades del campo. */\nexport interface RowsToOptions {\n /** Fuente de la que salieron las filas (F8 · R6.5). */\n source: DataSource;\n /** Schema del recurso destino: aporta `keyField`/`titleField` por defecto. */\n target: ResourceSchema | undefined;\n /** Descarta filas con `active: false` (`relation.onlyActive`). */\n onlyActive?: boolean;\n /** Dato secundario junto a la etiqueta («Juan Pérez · DNI 123»). */\n secondaryField?: string;\n}\n\n/**\n * Filas de una fuente declarada → opciones de desplegable (F8 · R6.5).\n *\n * Es el ÚNICO punto que traduce filas a `SelectOption`: antes esa regla\n * estaba escrita dos veces (en `relation` y cada consumidor montaba su\n * propia petición). Con `source` compartido, relaciones y desplegables con\n * datos remotos pasan por acá.\n *\n * Reglas, en orden:\n * - valor: `source.valueField` → `target.keyField` → `id`;\n * - etiqueta: `source.labelField` → `target.titleField` → el valor;\n * - fila sin valor (vacío o inexistente) no es opción: no hay qué seleccionar;\n * - `onlyActive` descarta las inactivas en el cliente — el back ya las excluye\n * de su FK, pero una lista cacheada puede traer una fila vieja.\n */\nexport function optionsFromRows(\n rows: readonly Record<string, unknown>[],\n { source, target, onlyActive, secondaryField }: RowsToOptions,\n): SelectOption[] {\n const valueKey = source.valueField ?? target?.keyField ?? 'id';\n const labelKey = source.labelField ?? target?.titleField ?? valueKey;\n const options: SelectOption[] = [];\n for (const row of rows) {\n if (onlyActive === true && row['active'] === false) continue;\n const value = row[valueKey];\n if (value === undefined || value === null || value === '') continue;\n const label = row[labelKey];\n const primary = typeof label === 'string' && label !== '' ? label : String(value);\n options.push({ value: String(value), label: withSecondary(primary, row, secondaryField) });\n }\n return options;\n}\n\n/** Etiqueta con su dato secundario, o la etiqueta tal cual si no hay. */\nfunction withSecondary(primary: string, row: Record<string, unknown>, key?: string): string {\n if (key === undefined) return primary;\n const secondary = row[key];\n if (secondary === undefined || secondary === null || secondary === '') return primary;\n return `${primary} · ${String(secondary)}`;\n}\n"],"mappings":"AA6BA,SAAgB,gBACd,MACA,EAAE,QAAQ,QAAQ,YAAY,kBAA+B;CAE7D,MAAM,WAAW,OAAO,cAAc,QAAQ,YAAY;CAC1D,MAAM,WAAW,OAAO,cAAc,QAAQ,cAAc;CAC5D,MAAM,UAA0B,CAAA;CAChC,KAAK,MAAM,OAAO,MAAM;EACtB,IAAI,eAAe,QAAQ,IAAI,cAAc,OAAO;EACpD,MAAM,QAAQ,IAAI;EAClB,IAAI,UAAU,UAAa,UAAU,QAAQ,UAAU,IAAI;EAC3D,MAAM,QAAQ,IAAI;EAClB,MAAM,UAAU,OAAO,UAAU,YAAY,UAAU,KAAK,QAAQ,OAAO,KAAK;EAChF,QAAQ,KAAK;GAAE,OAAO,OAAO,KAAK;GAAG,OAAO,cAAc,SAAS,KAAK,cAAc;EAAC,CAAE;CAC3F;CACA,OAAO;AACT;AAGA,SAAS,cAAc,SAAiB,KAA8B,KAAY;CAChF,IAAI,QAAQ,QAAW,OAAO;CAC9B,MAAM,YAAY,IAAI;CACtB,IAAI,cAAc,UAAa,cAAc,QAAQ,cAAc,IAAI,OAAO;CAC9E,OAAO,GAAG,QAAO,KAAM,OAAO,SAAS;AACzC"}
@@ -1,205 +0,0 @@
1
- import * as i0 from "@angular/core";
2
- import { Component, computed, input } from "@angular/core";
3
- const COLOR_MAP = {
4
- success: {
5
- bar: "bg-emerald-500",
6
- dot: "bg-emerald-500"
7
- },
8
- warning: {
9
- bar: "bg-amber-500",
10
- dot: "bg-amber-500"
11
- },
12
- danger: {
13
- bar: "bg-rose-500",
14
- dot: "bg-rose-500"
15
- },
16
- neutral: {
17
- bar: "bg-neutral/40",
18
- dot: "bg-neutral/40"
19
- }
20
- };
21
- var StatusProgress = class StatusProgress {
22
- widget = input.required(...ngDevMode ? [{ debugName: "widget" }] : /* istanbul ignore next */ []);
23
- data = input(null, ...ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []);
24
- totalCount = computed(() => {
25
- const d = this.data() || {};
26
- return this.widget().segments.reduce((acc, seg) => {
27
- const val = Number(d[seg.key]);
28
- return acc + (isNaN(val) ? 0 : Math.max(0, val));
29
- }, 0);
30
- }, ...ngDevMode ? [{ debugName: "totalCount" }] : /* istanbul ignore next */ []);
31
- calculatedSegments = computed(() => {
32
- const d = this.data() || {};
33
- const total = this.totalCount();
34
- return this.widget().segments.map((seg) => {
35
- const raw = Number(d[seg.key]);
36
- const value = isNaN(raw) ? 0 : Math.max(0, raw);
37
- const percentage = total > 0 ? value / total * 100 : 0;
38
- const colors = COLOR_MAP[seg.color] || COLOR_MAP["neutral"];
39
- return {
40
- key: seg.key,
41
- label: seg.label,
42
- value,
43
- percentage,
44
- barClass: colors.bar,
45
- dotClass: colors.dot
46
- };
47
- });
48
- }, ...ngDevMode ? [{ debugName: "calculatedSegments" }] : /* istanbul ignore next */ []);
49
- static ɵfac = i0.ɵɵngDeclareFactory({
50
- minVersion: "12.0.0",
51
- version: "22.2.3",
52
- ngImport: i0,
53
- type: StatusProgress,
54
- deps: [],
55
- target: i0.ɵɵFactoryTarget.Component
56
- });
57
- static ɵcmp = i0.ɵɵngDeclareComponent({
58
- minVersion: "17.0.0",
59
- version: "22.2.3",
60
- type: StatusProgress,
61
- isStandalone: true,
62
- selector: "app-status-progress",
63
- inputs: {
64
- widget: {
65
- classPropertyName: "widget",
66
- publicName: "widget",
67
- isSignal: true,
68
- isRequired: true,
69
- transformFunction: null
70
- },
71
- data: {
72
- classPropertyName: "data",
73
- publicName: "data",
74
- isSignal: true,
75
- isRequired: false,
76
- transformFunction: null
77
- }
78
- },
79
- ngImport: i0,
80
- template: `
81
- <article class="flex h-full flex-col rounded-xl border border-neutral/20 bg-surface p-4">
82
- <header class="mb-3 flex items-center justify-between">
83
- <h2 class="text-sm font-semibold text-neutral-light">{{ widget().label }}</h2>
84
- <span class="text-xs text-neutral" data-testid="total-count">
85
- Total: {{ totalCount() }}
86
- </span>
87
- </header>
88
-
89
- <!-- Barra segmentada -->
90
- <div
91
- class="flex h-3 w-full overflow-hidden rounded-full bg-neutral/10"
92
- role="progressbar"
93
- [attr.aria-valuenow]="totalCount()"
94
- [attr.aria-valuemin]="0"
95
- [attr.aria-valuemax]="totalCount()"
96
- [attr.aria-label]="widget().label"
97
- >
98
- @if (totalCount() === 0) {
99
- <div class="h-full w-full bg-neutral/20"></div>
100
- } @else {
101
- @for (seg of calculatedSegments(); track seg.key) {
102
- @if (seg.percentage > 0) {
103
- <div
104
- [class]="seg.barClass"
105
- [style.width.%]="seg.percentage"
106
- [title]="seg.label + ': ' + seg.value + ' (' + seg.percentage.toFixed(1) + '%)'"
107
- ></div>
108
- }
109
- }
110
- }
111
- </div>
112
-
113
- <!-- Leyenda -->
114
- <div class="mt-3.5 flex flex-wrap items-center gap-x-4 gap-y-2 text-xs">
115
- @for (seg of calculatedSegments(); track seg.key) {
116
- <div class="flex items-center gap-1.5 text-neutral-light">
117
- <span class="h-2 w-2 rounded-full" [class]="seg.dotClass"></span>
118
- <span class="font-medium">{{ seg.label }}:</span>
119
- <span class="text-neutral">{{ seg.value }} ({{ seg.percentage.toFixed(0) }}%)</span>
120
- </div>
121
- }
122
- </div>
123
- </article>
124
- `,
125
- isInline: true
126
- });
127
- };
128
- i0.ɵɵngDeclareClassMetadata({
129
- minVersion: "12.0.0",
130
- version: "22.2.3",
131
- ngImport: i0,
132
- type: StatusProgress,
133
- decorators: [{
134
- type: Component,
135
- args: [{
136
- selector: "app-status-progress",
137
- template: `
138
- <article class="flex h-full flex-col rounded-xl border border-neutral/20 bg-surface p-4">
139
- <header class="mb-3 flex items-center justify-between">
140
- <h2 class="text-sm font-semibold text-neutral-light">{{ widget().label }}</h2>
141
- <span class="text-xs text-neutral" data-testid="total-count">
142
- Total: {{ totalCount() }}
143
- </span>
144
- </header>
145
-
146
- <!-- Barra segmentada -->
147
- <div
148
- class="flex h-3 w-full overflow-hidden rounded-full bg-neutral/10"
149
- role="progressbar"
150
- [attr.aria-valuenow]="totalCount()"
151
- [attr.aria-valuemin]="0"
152
- [attr.aria-valuemax]="totalCount()"
153
- [attr.aria-label]="widget().label"
154
- >
155
- @if (totalCount() === 0) {
156
- <div class="h-full w-full bg-neutral/20"></div>
157
- } @else {
158
- @for (seg of calculatedSegments(); track seg.key) {
159
- @if (seg.percentage > 0) {
160
- <div
161
- [class]="seg.barClass"
162
- [style.width.%]="seg.percentage"
163
- [title]="seg.label + ': ' + seg.value + ' (' + seg.percentage.toFixed(1) + '%)'"
164
- ></div>
165
- }
166
- }
167
- }
168
- </div>
169
-
170
- <!-- Leyenda -->
171
- <div class="mt-3.5 flex flex-wrap items-center gap-x-4 gap-y-2 text-xs">
172
- @for (seg of calculatedSegments(); track seg.key) {
173
- <div class="flex items-center gap-1.5 text-neutral-light">
174
- <span class="h-2 w-2 rounded-full" [class]="seg.dotClass"></span>
175
- <span class="font-medium">{{ seg.label }}:</span>
176
- <span class="text-neutral">{{ seg.value }} ({{ seg.percentage.toFixed(0) }}%)</span>
177
- </div>
178
- }
179
- </div>
180
- </article>
181
- `
182
- }]
183
- }],
184
- propDecorators: {
185
- widget: [{
186
- type: i0.Input,
187
- args: [{
188
- isSignal: true,
189
- alias: "widget",
190
- required: true
191
- }]
192
- }],
193
- data: [{
194
- type: i0.Input,
195
- args: [{
196
- isSignal: true,
197
- alias: "data",
198
- required: false
199
- }]
200
- }]
201
- }
202
- });
203
- export { StatusProgress };
204
-
205
- //# sourceMappingURL=tinya-code-gas-admin-ui-status-progress-DmeG8htE.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tinya-code-gas-admin-ui-status-progress-DmeG8htE.mjs","names":[],"sources":["../../../projects/gas-admin-ui/src/lib/widgets/status-progress/status-progress.ts"],"sourcesContent":["import { Component, computed, input } from '@angular/core';\n\nimport type { StatusProgressWidget } from '../../core/models/schema.model';\n\ninterface SegmentDisplay {\n key: string;\n label: string;\n value: number;\n percentage: number;\n barClass: string;\n dotClass: string;\n}\n\nconst COLOR_MAP: Record<string, { bar: string; dot: string }> = {\n success: { bar: 'bg-emerald-500', dot: 'bg-emerald-500' },\n warning: { bar: 'bg-amber-500', dot: 'bg-amber-500' },\n danger: { bar: 'bg-rose-500', dot: 'bg-rose-500' },\n neutral: { bar: 'bg-neutral/40', dot: 'bg-neutral/40' },\n};\n\n/**\n * Barra de distribución porcentual de estados operativos.\n */\n@Component({\n selector: 'app-status-progress',\n template: `\n <article class=\"flex h-full flex-col rounded-xl border border-neutral/20 bg-surface p-4\">\n <header class=\"mb-3 flex items-center justify-between\">\n <h2 class=\"text-sm font-semibold text-neutral-light\">{{ widget().label }}</h2>\n <span class=\"text-xs text-neutral\" data-testid=\"total-count\">\n Total: {{ totalCount() }}\n </span>\n </header>\n\n <!-- Barra segmentada -->\n <div\n class=\"flex h-3 w-full overflow-hidden rounded-full bg-neutral/10\"\n role=\"progressbar\"\n [attr.aria-valuenow]=\"totalCount()\"\n [attr.aria-valuemin]=\"0\"\n [attr.aria-valuemax]=\"totalCount()\"\n [attr.aria-label]=\"widget().label\"\n >\n @if (totalCount() === 0) {\n <div class=\"h-full w-full bg-neutral/20\"></div>\n } @else {\n @for (seg of calculatedSegments(); track seg.key) {\n @if (seg.percentage > 0) {\n <div\n [class]=\"seg.barClass\"\n [style.width.%]=\"seg.percentage\"\n [title]=\"seg.label + ': ' + seg.value + ' (' + seg.percentage.toFixed(1) + '%)'\"\n ></div>\n }\n }\n }\n </div>\n\n <!-- Leyenda -->\n <div class=\"mt-3.5 flex flex-wrap items-center gap-x-4 gap-y-2 text-xs\">\n @for (seg of calculatedSegments(); track seg.key) {\n <div class=\"flex items-center gap-1.5 text-neutral-light\">\n <span class=\"h-2 w-2 rounded-full\" [class]=\"seg.dotClass\"></span>\n <span class=\"font-medium\">{{ seg.label }}:</span>\n <span class=\"text-neutral\">{{ seg.value }} ({{ seg.percentage.toFixed(0) }}%)</span>\n </div>\n }\n </div>\n </article>\n `,\n})\nexport class StatusProgress {\n readonly widget = input.required<StatusProgressWidget>();\n readonly data = input<Record<string, unknown> | null>(null);\n\n protected readonly totalCount = computed(() => {\n const d = this.data() || {};\n return this.widget().segments.reduce((acc, seg) => {\n const val = Number(d[seg.key]);\n return acc + (isNaN(val) ? 0 : Math.max(0, val));\n }, 0);\n });\n\n protected readonly calculatedSegments = computed<SegmentDisplay[]>(() => {\n const d = this.data() || {};\n const total = this.totalCount();\n\n return this.widget().segments.map((seg) => {\n const raw = Number(d[seg.key]);\n const value = isNaN(raw) ? 0 : Math.max(0, raw);\n const percentage = total > 0 ? (value / total) * 100 : 0;\n const colors = COLOR_MAP[seg.color] || COLOR_MAP['neutral'];\n\n return {\n key: seg.key,\n label: seg.label,\n value,\n percentage,\n barClass: colors.bar,\n dotClass: colors.dot,\n };\n });\n });\n}\n"],"mappings":";;AAaA,MAAM,YAA0D;CAC9D,SAAS;EAAE,KAAK;EAAkB,KAAK;CAAgB;CACvD,SAAS;EAAE,KAAK;EAAgB,KAAK;CAAc;CACnD,QAAQ;EAAE,KAAK;EAAe,KAAK;CAAa;CAChD,SAAS;EAAE,KAAK;EAAiB,KAAK;CAAe;AACtD;AAqDD,IAAa,iBAAb,MAAa,eAAc;CAChB,SAAS,MAAM,SAAgC,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAC/C,OAAO,MAAsC,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAExC,aAAa,eAAc;EAC5C,MAAM,IAAI,KAAK,KAAI,KAAM,CAAA;EACzB,OAAO,KAAK,OAAM,CAAE,CAAC,SAAS,QAAQ,KAAK,QAAO;GAChD,MAAM,MAAM,OAAO,EAAE,IAAI,IAAI;GAC7B,OAAO,OAAO,MAAM,GAAG,IAAI,IAAI,KAAK,IAAI,GAAG,GAAG;EAChD,GAAG,CAAC;CACN,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAEiB,qBAAqB,eAAgC;EACtE,MAAM,IAAI,KAAK,KAAI,KAAM,CAAA;EACzB,MAAM,QAAQ,KAAK,WAAU;EAE7B,OAAO,KAAK,OAAM,CAAE,CAAC,SAAS,KAAK,QAAO;GACxC,MAAM,MAAM,OAAO,EAAE,IAAI,IAAI;GAC7B,MAAM,QAAQ,MAAM,GAAG,IAAI,IAAI,KAAK,IAAI,GAAG,GAAG;GAC9C,MAAM,aAAa,QAAQ,IAAK,QAAQ,QAAS,MAAM;GACvD,MAAM,SAAS,UAAU,IAAI,UAAU,UAAU;GAEjD,OAAO;IACL,KAAK,IAAI;IACT,OAAO,IAAI;IACX;IACA;IACA,UAAU,OAAO;IACjB,UAAU,OAAO;GAClB;EACH,CAAC;CACH,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,qBAAA,CAAA,+BAAA,CAAA,CAAA;CA/BS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAc,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAd,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAc,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,UAAA;EAAA,UA9Cf;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4CT,UAAA;CAAA,CAAA;;AAEU,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAc,YAAA,CAAA;EAhD1B,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6CX,CAAA"}