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

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/fesm2022/tinya-code-gas-admin-ui-badge-EeCA_l-o.mjs +84 -0
  2. package/fesm2022/tinya-code-gas-admin-ui-badge-EeCA_l-o.mjs.map +1 -0
  3. package/fesm2022/tinya-code-gas-admin-ui-bar-chart-G7sEMSBY.mjs +140 -0
  4. package/fesm2022/tinya-code-gas-admin-ui-bar-chart-G7sEMSBY.mjs.map +1 -0
  5. package/fesm2022/tinya-code-gas-admin-ui-boolean-B2ASKL0E.mjs +113 -0
  6. package/fesm2022/tinya-code-gas-admin-ui-boolean-B2ASKL0E.mjs.map +1 -0
  7. package/fesm2022/tinya-code-gas-admin-ui-button-BQjNW8KB.mjs +163 -0
  8. package/fesm2022/tinya-code-gas-admin-ui-button-BQjNW8KB.mjs.map +1 -0
  9. package/fesm2022/tinya-code-gas-admin-ui-calendar-view-DCY8bj2V.mjs +1027 -0
  10. package/fesm2022/tinya-code-gas-admin-ui-calendar-view-DCY8bj2V.mjs.map +1 -0
  11. package/fesm2022/tinya-code-gas-admin-ui-chart-line-BjdlKHoH.mjs +278 -0
  12. package/fesm2022/tinya-code-gas-admin-ui-chart-line-BjdlKHoH.mjs.map +1 -0
  13. package/fesm2022/tinya-code-gas-admin-ui-color-Dljh_By3.mjs +107 -0
  14. package/fesm2022/tinya-code-gas-admin-ui-color-Dljh_By3.mjs.map +1 -0
  15. package/fesm2022/tinya-code-gas-admin-ui-condition-evaluator-DY2k1M3C.mjs +101 -0
  16. package/fesm2022/tinya-code-gas-admin-ui-condition-evaluator-DY2k1M3C.mjs.map +1 -0
  17. package/fesm2022/tinya-code-gas-admin-ui-currency-BvuF3Z63.mjs +141 -0
  18. package/fesm2022/tinya-code-gas-admin-ui-currency-BvuF3Z63.mjs.map +1 -0
  19. package/fesm2022/tinya-code-gas-admin-ui-data-source.service-96FSbN72.mjs +88 -0
  20. package/fesm2022/tinya-code-gas-admin-ui-data-source.service-96FSbN72.mjs.map +1 -0
  21. package/fesm2022/tinya-code-gas-admin-ui-date-1SJGXZrd.mjs +107 -0
  22. package/fesm2022/tinya-code-gas-admin-ui-date-1SJGXZrd.mjs.map +1 -0
  23. package/fesm2022/tinya-code-gas-admin-ui-display-badge-fwk6sDU7.mjs +140 -0
  24. package/fesm2022/tinya-code-gas-admin-ui-display-badge-fwk6sDU7.mjs.map +1 -0
  25. package/fesm2022/tinya-code-gas-admin-ui-display-date-D7zLiDiG.mjs +119 -0
  26. package/fesm2022/tinya-code-gas-admin-ui-display-date-D7zLiDiG.mjs.map +1 -0
  27. package/fesm2022/tinya-code-gas-admin-ui-display-file-BiIhqvQC.mjs +125 -0
  28. package/fesm2022/tinya-code-gas-admin-ui-display-file-BiIhqvQC.mjs.map +1 -0
  29. package/fesm2022/tinya-code-gas-admin-ui-display-image-C1dhnZi1.mjs +152 -0
  30. package/fesm2022/tinya-code-gas-admin-ui-display-image-C1dhnZi1.mjs.map +1 -0
  31. package/fesm2022/tinya-code-gas-admin-ui-display-list-DOEuUbGe.mjs +211 -0
  32. package/fesm2022/tinya-code-gas-admin-ui-display-list-DOEuUbGe.mjs.map +1 -0
  33. package/fesm2022/tinya-code-gas-admin-ui-display-number-DDMzr4Hn.mjs +116 -0
  34. package/fesm2022/tinya-code-gas-admin-ui-display-number-DDMzr4Hn.mjs.map +1 -0
  35. package/fesm2022/tinya-code-gas-admin-ui-display-text-B8CdVNpv.mjs +111 -0
  36. package/fesm2022/tinya-code-gas-admin-ui-display-text-B8CdVNpv.mjs.map +1 -0
  37. package/fesm2022/tinya-code-gas-admin-ui-dropdown-C3blvmE1.mjs +122 -0
  38. package/fesm2022/tinya-code-gas-admin-ui-dropdown-C3blvmE1.mjs.map +1 -0
  39. package/fesm2022/tinya-code-gas-admin-ui-email-CT_O5ihA.mjs +107 -0
  40. package/fesm2022/tinya-code-gas-admin-ui-email-CT_O5ihA.mjs.map +1 -0
  41. package/fesm2022/tinya-code-gas-admin-ui-empty-state-BMc0QtoT.mjs +109 -0
  42. package/fesm2022/tinya-code-gas-admin-ui-empty-state-BMc0QtoT.mjs.map +1 -0
  43. package/fesm2022/tinya-code-gas-admin-ui-error-mapper.service-DY5y1FjE.mjs +45 -0
  44. package/fesm2022/tinya-code-gas-admin-ui-error-mapper.service-DY5y1FjE.mjs.map +1 -0
  45. package/fesm2022/tinya-code-gas-admin-ui-field-aria-BD1Wiggc.mjs +50 -0
  46. package/fesm2022/tinya-code-gas-admin-ui-field-aria-BD1Wiggc.mjs.map +1 -0
  47. package/fesm2022/tinya-code-gas-admin-ui-field-node-CIK6KNN_.mjs +24 -0
  48. package/fesm2022/tinya-code-gas-admin-ui-field-node-CIK6KNN_.mjs.map +1 -0
  49. package/fesm2022/tinya-code-gas-admin-ui-field-path-B4-FTBGZ.mjs +27 -0
  50. package/fesm2022/tinya-code-gas-admin-ui-field-path-B4-FTBGZ.mjs.map +1 -0
  51. package/fesm2022/tinya-code-gas-admin-ui-file-Dmxioog7.mjs +408 -0
  52. package/fesm2022/tinya-code-gas-admin-ui-file-Dmxioog7.mjs.map +1 -0
  53. package/fesm2022/tinya-code-gas-admin-ui-form-view-CEe7aZ4m.mjs +4516 -0
  54. package/fesm2022/tinya-code-gas-admin-ui-form-view-CEe7aZ4m.mjs.map +1 -0
  55. package/fesm2022/tinya-code-gas-admin-ui-format-badge-CK8ct5Wk.mjs +82 -0
  56. package/fesm2022/tinya-code-gas-admin-ui-format-badge-CK8ct5Wk.mjs.map +1 -0
  57. package/fesm2022/tinya-code-gas-admin-ui-format-boolean-ClzezZz-.mjs +105 -0
  58. package/fesm2022/tinya-code-gas-admin-ui-format-boolean-ClzezZz-.mjs.map +1 -0
  59. package/fesm2022/tinya-code-gas-admin-ui-format-currency-CVmniKml.mjs +65 -0
  60. package/fesm2022/tinya-code-gas-admin-ui-format-currency-CVmniKml.mjs.map +1 -0
  61. package/fesm2022/tinya-code-gas-admin-ui-format-date-Dr1YsDd_.mjs +65 -0
  62. package/fesm2022/tinya-code-gas-admin-ui-format-date-Dr1YsDd_.mjs.map +1 -0
  63. package/fesm2022/tinya-code-gas-admin-ui-format-number-CWCjpI4n.mjs +65 -0
  64. package/fesm2022/tinya-code-gas-admin-ui-format-number-CWCjpI4n.mjs.map +1 -0
  65. package/fesm2022/tinya-code-gas-admin-ui-format-text-DBOgJkH0.mjs +59 -0
  66. package/fesm2022/tinya-code-gas-admin-ui-format-text-DBOgJkH0.mjs.map +1 -0
  67. package/fesm2022/tinya-code-gas-admin-ui-format-thumbnail-PCRvxWKt.mjs +94 -0
  68. package/fesm2022/tinya-code-gas-admin-ui-format-thumbnail-PCRvxWKt.mjs.map +1 -0
  69. package/fesm2022/tinya-code-gas-admin-ui-gap-sorting-iTdy_DYG.mjs +72 -0
  70. package/fesm2022/tinya-code-gas-admin-ui-gap-sorting-iTdy_DYG.mjs.map +1 -0
  71. package/fesm2022/tinya-code-gas-admin-ui-group-h7-O8tt4.mjs +238 -0
  72. package/fesm2022/tinya-code-gas-admin-ui-group-h7-O8tt4.mjs.map +1 -0
  73. package/fesm2022/tinya-code-gas-admin-ui-image-7UhJ7nqI.mjs +416 -0
  74. package/fesm2022/tinya-code-gas-admin-ui-image-7UhJ7nqI.mjs.map +1 -0
  75. package/fesm2022/tinya-code-gas-admin-ui-kanban-view-Dl0Ol5Kb.mjs +439 -0
  76. package/fesm2022/tinya-code-gas-admin-ui-kanban-view-Dl0Ol5Kb.mjs.map +1 -0
  77. package/fesm2022/tinya-code-gas-admin-ui-key-value-nVdgg5at.mjs +513 -0
  78. package/fesm2022/tinya-code-gas-admin-ui-key-value-nVdgg5at.mjs.map +1 -0
  79. package/fesm2022/tinya-code-gas-admin-ui-list-DTtCYS4d.mjs +637 -0
  80. package/fesm2022/tinya-code-gas-admin-ui-list-DTtCYS4d.mjs.map +1 -0
  81. package/fesm2022/tinya-code-gas-admin-ui-metric-card-DnGMQL8l.mjs +127 -0
  82. package/fesm2022/tinya-code-gas-admin-ui-metric-card-DnGMQL8l.mjs.map +1 -0
  83. package/fesm2022/tinya-code-gas-admin-ui-multiselect-PB28e-jl.mjs +251 -0
  84. package/fesm2022/tinya-code-gas-admin-ui-multiselect-PB28e-jl.mjs.map +1 -0
  85. package/fesm2022/tinya-code-gas-admin-ui-notification.service-LjSULER6.mjs +66 -0
  86. package/fesm2022/tinya-code-gas-admin-ui-notification.service-LjSULER6.mjs.map +1 -0
  87. package/fesm2022/tinya-code-gas-admin-ui-number-JNr7glc8.mjs +114 -0
  88. package/fesm2022/tinya-code-gas-admin-ui-number-JNr7glc8.mjs.map +1 -0
  89. package/fesm2022/tinya-code-gas-admin-ui-phone-jR417hPf.mjs +116 -0
  90. package/fesm2022/tinya-code-gas-admin-ui-phone-jR417hPf.mjs.map +1 -0
  91. package/fesm2022/tinya-code-gas-admin-ui-quick-actions-DCQ6emmF.mjs +235 -0
  92. package/fesm2022/tinya-code-gas-admin-ui-quick-actions-DCQ6emmF.mjs.map +1 -0
  93. package/fesm2022/tinya-code-gas-admin-ui-radio-mode-DxvN07DY.mjs +8 -0
  94. package/fesm2022/tinya-code-gas-admin-ui-radio-mode-DxvN07DY.mjs.map +1 -0
  95. package/fesm2022/tinya-code-gas-admin-ui-readonly-text-BL7-4qie.mjs +124 -0
  96. package/fesm2022/tinya-code-gas-admin-ui-readonly-text-BL7-4qie.mjs.map +1 -0
  97. package/fesm2022/tinya-code-gas-admin-ui-record-list-BiZfnd_7.mjs +249 -0
  98. package/fesm2022/tinya-code-gas-admin-ui-record-list-BiZfnd_7.mjs.map +1 -0
  99. package/fesm2022/tinya-code-gas-admin-ui-relation-drawer.service-B0kT8EiW.mjs +39 -0
  100. package/fesm2022/tinya-code-gas-admin-ui-relation-drawer.service-B0kT8EiW.mjs.map +1 -0
  101. package/fesm2022/tinya-code-gas-admin-ui-relation-ykpJ3PYl.mjs +309 -0
  102. package/fesm2022/tinya-code-gas-admin-ui-relation-ykpJ3PYl.mjs.map +1 -0
  103. package/fesm2022/tinya-code-gas-admin-ui-render-registry-B88Pme-y.mjs +576 -0
  104. package/fesm2022/tinya-code-gas-admin-ui-render-registry-B88Pme-y.mjs.map +1 -0
  105. package/fesm2022/tinya-code-gas-admin-ui-rich-select-CIHaOrbU.mjs +161 -0
  106. package/fesm2022/tinya-code-gas-admin-ui-rich-select-CIHaOrbU.mjs.map +1 -0
  107. package/fesm2022/tinya-code-gas-admin-ui-rolldown-runtime-DpJrqANO.mjs +11 -0
  108. package/fesm2022/tinya-code-gas-admin-ui-schema-catalog-D0Pk0wAN.mjs +685 -0
  109. package/fesm2022/tinya-code-gas-admin-ui-schema-catalog-D0Pk0wAN.mjs.map +1 -0
  110. package/fesm2022/tinya-code-gas-admin-ui-seed-DkVZbxPP.mjs +80 -0
  111. package/fesm2022/tinya-code-gas-admin-ui-seed-DkVZbxPP.mjs.map +1 -0
  112. package/fesm2022/tinya-code-gas-admin-ui-select-CDwX9yNO.mjs +296 -0
  113. package/fesm2022/tinya-code-gas-admin-ui-select-CDwX9yNO.mjs.map +1 -0
  114. package/fesm2022/tinya-code-gas-admin-ui-skeleton-DnWK0tcZ.mjs +119 -0
  115. package/fesm2022/tinya-code-gas-admin-ui-skeleton-DnWK0tcZ.mjs.map +1 -0
  116. package/fesm2022/tinya-code-gas-admin-ui-slug-DU58cbiY.mjs +158 -0
  117. package/fesm2022/tinya-code-gas-admin-ui-slug-DU58cbiY.mjs.map +1 -0
  118. package/fesm2022/tinya-code-gas-admin-ui-source-options-B9R4mw8-.mjs +26 -0
  119. package/fesm2022/tinya-code-gas-admin-ui-source-options-B9R4mw8-.mjs.map +1 -0
  120. package/fesm2022/tinya-code-gas-admin-ui-status-progress-DmeG8htE.mjs +205 -0
  121. package/fesm2022/tinya-code-gas-admin-ui-status-progress-DmeG8htE.mjs.map +1 -0
  122. package/fesm2022/tinya-code-gas-admin-ui-string-list-gleasqzD.mjs +432 -0
  123. package/fesm2022/tinya-code-gas-admin-ui-string-list-gleasqzD.mjs.map +1 -0
  124. package/fesm2022/tinya-code-gas-admin-ui-template-interpolator-ewv7CkNX.mjs +36 -0
  125. package/fesm2022/tinya-code-gas-admin-ui-template-interpolator-ewv7CkNX.mjs.map +1 -0
  126. package/fesm2022/tinya-code-gas-admin-ui-text-CUPmL7W_.mjs +107 -0
  127. package/fesm2022/tinya-code-gas-admin-ui-text-CUPmL7W_.mjs.map +1 -0
  128. package/fesm2022/tinya-code-gas-admin-ui-textarea-CGLSIW13.mjs +223 -0
  129. package/fesm2022/tinya-code-gas-admin-ui-textarea-CGLSIW13.mjs.map +1 -0
  130. package/fesm2022/tinya-code-gas-admin-ui-time-BcHzsTWf.mjs +107 -0
  131. package/fesm2022/tinya-code-gas-admin-ui-time-BcHzsTWf.mjs.map +1 -0
  132. package/fesm2022/tinya-code-gas-admin-ui-upload.service-CZPEPCeN.mjs +60 -0
  133. package/fesm2022/tinya-code-gas-admin-ui-upload.service-CZPEPCeN.mjs.map +1 -0
  134. package/fesm2022/tinya-code-gas-admin-ui-url-GO4LZi__.mjs +141 -0
  135. package/fesm2022/tinya-code-gas-admin-ui-url-GO4LZi__.mjs.map +1 -0
  136. package/fesm2022/tinya-code-gas-admin-ui.mjs +4738 -0
  137. package/fesm2022/tinya-code-gas-admin-ui.mjs.map +1 -0
  138. package/package.json +15 -3
  139. package/types/tinya-code-gas-admin-ui.d.ts +3634 -0
  140. package/ng-package.json +0 -7
  141. package/src/lib/actions/action-registry.spec.ts +0 -52
  142. package/src/lib/actions/action-registry.ts +0 -126
  143. package/src/lib/actions/action-service.spec.ts +0 -215
  144. package/src/lib/actions/action-service.ts +0 -87
  145. package/src/lib/actions/descriptors.spec.ts +0 -155
  146. package/src/lib/actions/descriptors.ts +0 -154
  147. package/src/lib/columns/column-cell.ts +0 -33
  148. package/src/lib/columns/column-defaults.spec.ts +0 -99
  149. package/src/lib/columns/column-defaults.ts +0 -84
  150. package/src/lib/columns/column-format.spec.ts +0 -274
  151. package/src/lib/columns/descriptors.ts +0 -113
  152. package/src/lib/columns/format-badge.ts +0 -51
  153. package/src/lib/columns/format-boolean.ts +0 -58
  154. package/src/lib/columns/format-currency.ts +0 -30
  155. package/src/lib/columns/format-date.ts +0 -35
  156. package/src/lib/columns/format-number.ts +0 -32
  157. package/src/lib/columns/format-text.ts +0 -23
  158. package/src/lib/columns/format-thumbnail.ts +0 -63
  159. package/src/lib/core/adapters/firebase-auth.adapter.ts +0 -6
  160. package/src/lib/core/guards/auth.guard.spec.ts +0 -88
  161. package/src/lib/core/guards/auth.guard.ts +0 -48
  162. package/src/lib/core/guards/unsaved-changes.guard.ts +0 -16
  163. package/src/lib/core/interceptors/api-error.interceptor.spec.ts +0 -182
  164. package/src/lib/core/interceptors/api-error.interceptor.ts +0 -87
  165. package/src/lib/core/models/api.model.ts +0 -104
  166. package/src/lib/core/models/schema-descriptions.ts +0 -118
  167. package/src/lib/core/models/schema.model.ts +0 -1097
  168. package/src/lib/core/registry/composition-validator.spec.ts +0 -358
  169. package/src/lib/core/registry/composition-validator.ts +0 -270
  170. package/src/lib/core/registry/field-validators.spec.ts +0 -199
  171. package/src/lib/core/registry/field-validators.ts +0 -440
  172. package/src/lib/core/registry/render-host.spec.ts +0 -208
  173. package/src/lib/core/registry/render-host.ts +0 -646
  174. package/src/lib/core/registry/render-registry.spec.ts +0 -96
  175. package/src/lib/core/registry/render-registry.ts +0 -312
  176. package/src/lib/core/registry/schema-catalog.ts +0 -156
  177. package/src/lib/core/services/api.service.spec.ts +0 -1142
  178. package/src/lib/core/services/api.service.ts +0 -371
  179. package/src/lib/core/services/auth.service.spec.ts +0 -653
  180. package/src/lib/core/services/auth.service.ts +0 -503
  181. package/src/lib/core/services/config.service.spec.ts +0 -121
  182. package/src/lib/core/services/config.service.ts +0 -119
  183. package/src/lib/core/services/data-source.service.spec.ts +0 -179
  184. package/src/lib/core/services/data-source.service.ts +0 -142
  185. package/src/lib/core/services/error-mapper.service.spec.ts +0 -50
  186. package/src/lib/core/services/error-mapper.service.ts +0 -49
  187. package/src/lib/core/services/notification.service.ts +0 -73
  188. package/src/lib/core/services/relation-drawer.service.ts +0 -41
  189. package/src/lib/core/services/theme.service.spec.ts +0 -106
  190. package/src/lib/core/services/theme.service.ts +0 -86
  191. package/src/lib/core/services/transport.spec.ts +0 -198
  192. package/src/lib/core/services/transport.ts +0 -164
  193. package/src/lib/core/services/upload.service.ts +0 -81
  194. package/src/lib/core/testing/categories.schema.ts +0 -125
  195. package/src/lib/core/testing/orders.schema.ts +0 -372
  196. package/src/lib/core/testing/products.schema.ts +0 -258
  197. package/src/lib/core/testing/site.schema.ts +0 -195
  198. package/src/lib/core/testing/test-catalog.ts +0 -21
  199. package/src/lib/core/tokens.ts +0 -112
  200. package/src/lib/core/utils/clipboard.spec.ts +0 -55
  201. package/src/lib/core/utils/clipboard.ts +0 -90
  202. package/src/lib/core/utils/context-resolver.spec.ts +0 -95
  203. package/src/lib/core/utils/context-resolver.ts +0 -101
  204. package/src/lib/core/utils/response-unwrapper.spec.ts +0 -70
  205. package/src/lib/core/utils/response-unwrapper.ts +0 -103
  206. package/src/lib/core/utils/source-options.spec.ts +0 -96
  207. package/src/lib/core/utils/source-options.ts +0 -54
  208. package/src/lib/core/utils/template-interpolator.spec.ts +0 -59
  209. package/src/lib/core/utils/template-interpolator.ts +0 -56
  210. package/src/lib/core/view-navigation/view-navigation.service.spec.ts +0 -207
  211. package/src/lib/core/view-navigation/view-navigation.service.ts +0 -132
  212. package/src/lib/fields/boolean/boolean.descriptor.ts +0 -11
  213. package/src/lib/fields/boolean/boolean.ts +0 -40
  214. package/src/lib/fields/color/color.descriptor.ts +0 -12
  215. package/src/lib/fields/color/color.ts +0 -34
  216. package/src/lib/fields/currency/currency.descriptor.ts +0 -12
  217. package/src/lib/fields/currency/currency.ts +0 -67
  218. package/src/lib/fields/date/date.descriptor.ts +0 -12
  219. package/src/lib/fields/date/date.ts +0 -36
  220. package/src/lib/fields/descriptors.ts +0 -122
  221. package/src/lib/fields/display/display-badge.ts +0 -65
  222. package/src/lib/fields/display/display-date.ts +0 -39
  223. package/src/lib/fields/display/display-defaults.ts +0 -84
  224. package/src/lib/fields/display/display-file.ts +0 -41
  225. package/src/lib/fields/display/display-image.ts +0 -54
  226. package/src/lib/fields/display/display-list.ts +0 -107
  227. package/src/lib/fields/display/display-number.ts +0 -41
  228. package/src/lib/fields/display/display-text.ts +0 -42
  229. package/src/lib/fields/display/display.spec.ts +0 -242
  230. package/src/lib/fields/dropdown/dropdown.descriptor.ts +0 -12
  231. package/src/lib/fields/dropdown/dropdown.ts +0 -45
  232. package/src/lib/fields/email/email.descriptor.ts +0 -12
  233. package/src/lib/fields/email/email.ts +0 -28
  234. package/src/lib/fields/field-aria.ts +0 -60
  235. package/src/lib/fields/field-host/field-host.spec.ts +0 -118
  236. package/src/lib/fields/field-host/field-host.ts +0 -47
  237. package/src/lib/fields/field-node.ts +0 -88
  238. package/src/lib/fields/file/file.descriptor.ts +0 -14
  239. package/src/lib/fields/file/file.spec.ts +0 -134
  240. package/src/lib/fields/file/file.ts +0 -281
  241. package/src/lib/fields/group/group.descriptor.ts +0 -21
  242. package/src/lib/fields/group/group.ts +0 -110
  243. package/src/lib/fields/image/image.descriptor.ts +0 -12
  244. package/src/lib/fields/image/image.spec.ts +0 -117
  245. package/src/lib/fields/image/image.ts +0 -281
  246. package/src/lib/fields/key-value/key-value.descriptor.ts +0 -11
  247. package/src/lib/fields/key-value/key-value.ts +0 -283
  248. package/src/lib/fields/list/list.descriptor.ts +0 -21
  249. package/src/lib/fields/list/list.ts +0 -376
  250. package/src/lib/fields/multiselect/multiselect.descriptor.ts +0 -11
  251. package/src/lib/fields/multiselect/multiselect.spec.ts +0 -142
  252. package/src/lib/fields/multiselect/multiselect.ts +0 -152
  253. package/src/lib/fields/number/number.descriptor.ts +0 -12
  254. package/src/lib/fields/number/number.ts +0 -40
  255. package/src/lib/fields/phone/phone.descriptor.ts +0 -12
  256. package/src/lib/fields/phone/phone.ts +0 -46
  257. package/src/lib/fields/readonly-text/readonly-text.descriptor.ts +0 -12
  258. package/src/lib/fields/readonly-text/readonly-text.ts +0 -58
  259. package/src/lib/fields/relation/relation.descriptor.ts +0 -12
  260. package/src/lib/fields/relation/relation.spec.ts +0 -193
  261. package/src/lib/fields/relation/relation.ts +0 -224
  262. package/src/lib/fields/rich-select/rich-select.descriptor.ts +0 -12
  263. package/src/lib/fields/rich-select/rich-select.ts +0 -175
  264. package/src/lib/fields/select/radio-mode.ts +0 -25
  265. package/src/lib/fields/select/select.descriptor.ts +0 -12
  266. package/src/lib/fields/select/select.spec.ts +0 -162
  267. package/src/lib/fields/select/select.ts +0 -210
  268. package/src/lib/fields/slug/slug.descriptor.ts +0 -19
  269. package/src/lib/fields/slug/slug.ts +0 -67
  270. package/src/lib/fields/string-list/string-list.descriptor.ts +0 -11
  271. package/src/lib/fields/string-list/string-list.ts +0 -222
  272. package/src/lib/fields/text/text.descriptor.ts +0 -12
  273. package/src/lib/fields/text/text.ts +0 -35
  274. package/src/lib/fields/textarea/textarea.descriptor.ts +0 -12
  275. package/src/lib/fields/textarea/textarea.spec.ts +0 -117
  276. package/src/lib/fields/textarea/textarea.ts +0 -126
  277. package/src/lib/fields/time/time.descriptor.ts +0 -12
  278. package/src/lib/fields/time/time.ts +0 -28
  279. package/src/lib/fields/unknown-render/unknown-render.ts +0 -49
  280. package/src/lib/fields/url/url.descriptor.ts +0 -12
  281. package/src/lib/fields/url/url.ts +0 -53
  282. package/src/lib/gas-admin-ui.spec.ts +0 -21
  283. package/src/lib/gas-admin-ui.ts +0 -9
  284. package/src/lib/layouts/descriptors.ts +0 -9
  285. package/src/lib/pages/dashboard/dashboard.ts +0 -167
  286. package/src/lib/pages/detail-view/detail-view.spec.ts +0 -333
  287. package/src/lib/pages/detail-view/detail-view.ts +0 -570
  288. package/src/lib/pages/drawer-form/drawer-form.ts +0 -228
  289. package/src/lib/pages/form-view/form-model.ts +0 -88
  290. package/src/lib/pages/form-view/form-schema.ts +0 -255
  291. package/src/lib/pages/form-view/form-view.ts +0 -1622
  292. package/src/lib/pages/list-view/list-view.formats.spec.ts +0 -214
  293. package/src/lib/pages/list-view/list-view.ts +0 -882
  294. package/src/lib/pages/login/login.spec.ts +0 -109
  295. package/src/lib/pages/login/login.ts +0 -227
  296. package/src/lib/pages/resource-page/resource-page.ts +0 -234
  297. package/src/lib/shared/components/badge/badge.ts +0 -35
  298. package/src/lib/shared/components/button/button.ts +0 -65
  299. package/src/lib/shared/components/confirm-dialog/confirm-dialog.ts +0 -48
  300. package/src/lib/shared/components/copy-button/copy-button.ts +0 -56
  301. package/src/lib/shared/components/copy-share/copy-share.spec.ts +0 -122
  302. package/src/lib/shared/components/copy-share/copy-share.ts +0 -107
  303. package/src/lib/shared/components/drawer/drawer.spec.ts +0 -127
  304. package/src/lib/shared/components/drawer/drawer.ts +0 -172
  305. package/src/lib/shared/components/empty-state/empty-state.ts +0 -30
  306. package/src/lib/shared/components/modal/modal.spec.ts +0 -149
  307. package/src/lib/shared/components/modal/modal.ts +0 -145
  308. package/src/lib/shared/components/post-create-modal/post-create-modal.spec.ts +0 -165
  309. package/src/lib/shared/components/post-create-modal/post-create-modal.ts +0 -159
  310. package/src/lib/shared/components/skeleton/skeleton.ts +0 -31
  311. package/src/lib/shared/components/toast/toast.ts +0 -58
  312. package/src/lib/shared/utils/col-span.ts +0 -25
  313. package/src/lib/shared/utils/condition-evaluator.ts +0 -53
  314. package/src/lib/shared/utils/depends-on.ts +0 -48
  315. package/src/lib/shared/utils/dialog-focus.ts +0 -28
  316. package/src/lib/shared/utils/field-path.ts +0 -49
  317. package/src/lib/shared/utils/gap-sorting.ts +0 -144
  318. package/src/lib/shared/utils/seed.spec.ts +0 -64
  319. package/src/lib/shared/utils/seed.ts +0 -149
  320. package/src/lib/shared/utils/slugify.ts +0 -13
  321. package/src/lib/shared/utils/validators.ts +0 -41
  322. package/src/lib/shell/layout/layout.ts +0 -63
  323. package/src/lib/shell/shell.routes.spec.ts +0 -59
  324. package/src/lib/shell/shell.routes.ts +0 -122
  325. package/src/lib/shell/sidebar/sidebar.ts +0 -139
  326. package/src/lib/shell/theme-toggle/theme-toggle.ts +0 -74
  327. package/src/lib/views/calendar-view/calendar-model.ts +0 -426
  328. package/src/lib/views/calendar-view/calendar-view.spec.ts +0 -557
  329. package/src/lib/views/calendar-view/calendar-view.ts +0 -568
  330. package/src/lib/views/composer/composer-host.spec.ts +0 -301
  331. package/src/lib/views/composer/composer-host.ts +0 -248
  332. package/src/lib/views/composer/composer-imports.spec.ts +0 -54
  333. package/src/lib/views/composer/view-context.spec.ts +0 -117
  334. package/src/lib/views/composer/view-context.ts +0 -109
  335. package/src/lib/views/composer/view-slot.spec.ts +0 -130
  336. package/src/lib/views/composer/view-slot.ts +0 -178
  337. package/src/lib/views/descriptors.ts +0 -46
  338. package/src/lib/views/kanban-view/kanban-model.ts +0 -173
  339. package/src/lib/views/kanban-view/kanban-view.spec.ts +0 -540
  340. package/src/lib/views/kanban-view/kanban-view.ts +0 -327
  341. package/src/lib/widgets/bar-chart/bar-chart.descriptor.ts +0 -17
  342. package/src/lib/widgets/bar-chart/bar-chart.spec.ts +0 -66
  343. package/src/lib/widgets/bar-chart/bar-chart.ts +0 -76
  344. package/src/lib/widgets/chart-line/chart-line.descriptor.ts +0 -17
  345. package/src/lib/widgets/chart-line/chart-line.spec.ts +0 -113
  346. package/src/lib/widgets/chart-line/chart-line.ts +0 -219
  347. package/src/lib/widgets/descriptors.ts +0 -29
  348. package/src/lib/widgets/metric-card/metric-card.descriptor.ts +0 -41
  349. package/src/lib/widgets/metric-card/metric-card.spec.ts +0 -52
  350. package/src/lib/widgets/metric-card/metric-card.ts +0 -48
  351. package/src/lib/widgets/quick-actions/quick-actions.descriptor.ts +0 -13
  352. package/src/lib/widgets/quick-actions/quick-actions.spec.ts +0 -61
  353. package/src/lib/widgets/quick-actions/quick-actions.ts +0 -100
  354. package/src/lib/widgets/record-list/record-list.descriptor.ts +0 -16
  355. package/src/lib/widgets/record-list/record-list.spec.ts +0 -79
  356. package/src/lib/widgets/record-list/record-list.ts +0 -115
  357. package/src/lib/widgets/series.spec.ts +0 -42
  358. package/src/lib/widgets/series.ts +0 -56
  359. package/src/lib/widgets/status-progress/status-progress.descriptor.ts +0 -19
  360. package/src/lib/widgets/status-progress/status-progress.spec.ts +0 -63
  361. package/src/lib/widgets/status-progress/status-progress.ts +0 -104
  362. package/src/lib/widgets/widget-host/widget-host.spec.ts +0 -179
  363. package/src/lib/widgets/widget-host/widget-host.ts +0 -99
  364. package/src/public-api.ts +0 -104
  365. package/tinya-code-gas-admin-ui-0.2.0-alpha.15.tgz +0 -0
  366. package/tsconfig.lib.json +0 -13
  367. package/tsconfig.lib.prod.json +0 -11
  368. package/tsconfig.spec.json +0 -10
@@ -0,0 +1 @@
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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"}
@@ -0,0 +1,119 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,158 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,26 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,205 @@
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
@@ -0,0 +1 @@
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"}