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

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
@@ -1,56 +0,0 @@
1
- /**
2
- * Resuelve una plantilla de texto reemplazando marcadores `{key}` o `{nested.key}`
3
- * con los valores presentes en el objeto `data` o en el contexto adicional `extraContext`.
4
- *
5
- * Si un valor es `null` o `undefined`, se reemplaza por una cadena vacía.
6
- * No arroja excepciones ante claves no encontradas ni ante objetos nulos.
7
- */
8
- export function interpolateTemplate(
9
- template: string,
10
- data: Record<string, unknown> = {},
11
- extraContext: Record<string, unknown> = {},
12
- ): string {
13
- if (!template) return '';
14
-
15
- return template.replace(/\{([a-zA-Z0-9_.]+)\}/g, (match, key: string) => {
16
- const val = getDeepValue(data, key) ?? getDeepValue(extraContext, key);
17
- if (val === null || val === undefined) {
18
- return '';
19
- }
20
- return String(val);
21
- });
22
- }
23
-
24
- function getDeepValue(obj: Record<string, unknown>, path: string): unknown {
25
- if (!obj || typeof obj !== 'object') return undefined;
26
- const parts = path.split('.');
27
- let current: unknown = obj;
28
- for (const part of parts) {
29
- if (current === null || current === undefined || typeof current !== 'object') {
30
- return undefined;
31
- }
32
- current = (current as Record<string, unknown>)[part];
33
- }
34
- return current;
35
- }
36
-
37
- export interface ParsedRoute {
38
- path: string;
39
- queryParams: Record<string, string>;
40
- }
41
-
42
- /**
43
- * Descompone una ruta relativa o absoluta en path y queryParams para routerLink.
44
- */
45
- export function parseNavigationUrl(url: string): ParsedRoute {
46
- if (!url) return { path: '', queryParams: {} };
47
- const [path, queryString] = url.split('?');
48
- const queryParams: Record<string, string> = {};
49
- if (queryString) {
50
- const params = new URLSearchParams(queryString);
51
- params.forEach((value, key) => {
52
- queryParams[key] = value;
53
- });
54
- }
55
- return { path: path || '', queryParams };
56
- }
@@ -1,207 +0,0 @@
1
- import { setSchemaCatalog } from '../registry/schema-catalog';
2
- import { testCatalog } from '../testing/test-catalog';
3
-
4
- setSchemaCatalog(testCatalog);
5
-
6
- import { Component } from '@angular/core';
7
- import { TestBed } from '@angular/core/testing';
8
- import { provideRouter, Router } from '@angular/router';
9
- import { describe, expect, it, vi } from 'vitest';
10
-
11
- import { roleGuard } from '../guards/auth.guard';
12
- import type { NavigationTarget, SelectionBinding } from '../models/schema.model';
13
- import { AuthService } from '../services/auth.service';
14
- import {
15
- buildSegments,
16
- targetRoutePattern,
17
- ViewNavigationService,
18
- } from './view-navigation.service';
19
-
20
- @Component({ standalone: true, template: 'lista' })
21
- class ListaStub {}
22
-
23
- @Component({ standalone: true, template: 'detalle' })
24
- class DetalleStub {}
25
-
26
- /** Target declarado sobre el schema real `orders` (registry front). */
27
- const target: NavigationTarget = { resource: 'orders', view: 'detail', params: ['key'] };
28
-
29
- function rutaBinding(mode: 'route'): SelectionBinding {
30
- return { on: 'open', mode, target };
31
- }
32
-
33
- describe('buildSegments (key-only, sin concat de strings)', () => {
34
- it('sustituye :key por la clave COMPLETA sin partirla (clave A/B)', () => {
35
- expect(buildSegments(['orders', ':key'], 'A/B')).toEqual(['orders', 'A/B']);
36
- });
37
-
38
- it('sustituye params en posición media y mantiene literales', () => {
39
- expect(buildSegments(['orders', ':key', 'edit'], '7')).toEqual(['orders', '7', 'edit']);
40
- });
41
-
42
- it('param distinto de :key ⇒ falla ruido (sin fuente declarada)', () => {
43
- expect(() => buildSegments(['orders', ':otro'], 'x')).toThrow('sin fuente declarada');
44
- });
45
- });
46
-
47
- describe('targetRoutePattern (misma fuente que el validador)', () => {
48
- it('resuelve el patrón de la ruta destino desde la registry', () => {
49
- expect(targetRoutePattern({ resource: 'orders', view: 'detail', params: ['key'] })).toEqual([
50
- 'orders',
51
- ':key',
52
- ]);
53
- });
54
-
55
- it('recurso o vista destino inexistente ⇒ undefined (nada navega)', () => {
56
- expect(targetRoutePattern({ resource: 'nope', view: 'detail' })).toBeUndefined();
57
- expect(targetRoutePattern({ resource: 'orders', view: 'nope' })).toBeUndefined();
58
- });
59
- });
60
-
61
- describe('ViewNavigationService.dispatch', () => {
62
- function servicio(auth = { isAuthenticated: () => true, canAccess: () => true }) {
63
- TestBed.configureTestingModule({
64
- providers: [
65
- provideRouter([
66
- {
67
- path: 'orders',
68
- component: ListaStub,
69
- data: { resourceId: 'orders' },
70
- canActivate: [roleGuard],
71
- },
72
- {
73
- path: 'orders/:key',
74
- component: DetalleStub,
75
- data: { resourceId: 'orders' },
76
- canActivate: [roleGuard],
77
- },
78
- ]),
79
- { provide: AuthService, useValue: auth },
80
- ],
81
- });
82
- return {
83
- nav: TestBed.inject(ViewNavigationService),
84
- router: TestBed.inject(Router),
85
- };
86
- }
87
-
88
- it('target declarado ⇒ navega con la clave codificada y el guard corre', async () => {
89
- const { nav, router } = servicio();
90
- const ok = await nav.dispatch(rutaBinding('route'), {
91
- resource: 'orders',
92
- key: 'A/B',
93
- action: 'open',
94
- });
95
- expect(ok).toBe(true);
96
- // El router serializa :key ⇒ '/' de la clave queda codificado, sin partir
97
- expect(router.url).toBe('/orders/A%2FB');
98
- });
99
-
100
- it('patrón sin params navega a los segmentos literales', async () => {
101
- const { nav, router } = servicio();
102
- const ok = await nav.dispatch(
103
- { on: 'open', mode: 'route', target: { resource: 'orders', view: 'create' } },
104
- { resource: 'orders', key: 'ignorada', action: 'open' },
105
- );
106
- expect(ok).toBe(true);
107
- expect(router.url).toBe('/orders/new');
108
- });
109
-
110
- it('acción que no es la declarada ⇒ sin navegación (scope del target)', async () => {
111
- const { nav, router } = servicio();
112
- const espia = vi.spyOn(router, 'navigate');
113
- await nav.dispatch(rutaBinding('route'), { resource: 'orders', key: '1', action: 'select' });
114
- expect(espia).not.toHaveBeenCalled();
115
- expect(router.url).toBe('/');
116
- });
117
-
118
- it('sin binding declarado ⇒ inerte aunque el evento pida mutar', async () => {
119
- const { nav, router } = servicio();
120
- const espia = vi.spyOn(router, 'navigate');
121
- await nav.dispatch(undefined, { resource: 'orders', key: '1', action: 'move' });
122
- expect(espia).not.toHaveBeenCalled();
123
- });
124
-
125
- it('mode inline/none ⇒ sin navegación (comportamiento local del leaf)', async () => {
126
- const { nav, router } = servicio();
127
- const espia = vi.spyOn(router, 'navigate');
128
- await nav.dispatch(
129
- { on: 'open', mode: 'inline' },
130
- { resource: 'orders', key: '1', action: 'open' },
131
- );
132
- await nav.dispatch(
133
- { on: 'open', mode: 'none' },
134
- { resource: 'orders', key: '1', action: 'open' },
135
- );
136
- expect(espia).not.toHaveBeenCalled();
137
- });
138
-
139
- it('target sin recurso/vista declarado en el registry ⇒ falla ruido, no navega', async () => {
140
- const { nav, router } = servicio();
141
- const espia = vi.spyOn(router, 'navigate');
142
- await expect(
143
- nav.dispatch(
144
- { on: 'open', mode: 'route', target: { resource: 'no-existe', view: 'x' } },
145
- { resource: 'no-existe', key: '1', action: 'open' },
146
- ),
147
- ).rejects.toThrow('no existe');
148
- expect(espia).not.toHaveBeenCalled();
149
- });
150
-
151
- it('guard bloquea (sin permiso) ⇒ URL intacta y sin payload del registro', async () => {
152
- const { nav, router } = servicio({ isAuthenticated: () => true, canAccess: () => false });
153
- const espia = vi.spyOn(router, 'navigate');
154
- const ok = await nav.dispatch(rutaBinding('route'), {
155
- resource: 'orders',
156
- key: 'A/B',
157
- action: 'open',
158
- });
159
- expect(ok).toBe(false);
160
- expect(espia).toHaveBeenCalledWith(['/', 'orders', 'A/B']);
161
- expect(router.url).toBe('/'); // ningún dato del registro llegó a la URL
162
- // guard bloqueado ⇒ el origen NO queda registrado (nada que volver a ver)
163
- await nav.back();
164
- expect(router.url).toBe('/');
165
- });
166
- });
167
-
168
- describe('ViewNavigationService.back (D4)', () => {
169
- function servicio() {
170
- TestBed.configureTestingModule({
171
- providers: [
172
- provideRouter([
173
- { path: 'orders', component: ListaStub, data: { resourceId: 'orders' } },
174
- { path: 'orders/:key', component: DetalleStub, data: { resourceId: 'orders' } },
175
- ]),
176
- { provide: AuthService, useValue: { isAuthenticated: () => true, canAccess: () => true } },
177
- ],
178
- });
179
- return {
180
- nav: TestBed.inject(ViewNavigationService),
181
- router: TestBed.inject(Router),
182
- };
183
- }
184
-
185
- it('con dispatch previo ⇒ vuelve al origen registrado', async () => {
186
- const { nav, router } = servicio();
187
- await nav.dispatch(rutaBinding('route'), { resource: 'orders', key: '9', action: 'open' });
188
- expect(router.url).toBe('/orders/9');
189
- await nav.back();
190
- expect(router.url).toBe('/');
191
- });
192
-
193
- it('returnPath declarado ⇒ navega ahí (gana sobre el origen)', async () => {
194
- const { nav, router } = servicio();
195
- await nav.dispatch(rutaBinding('route'), { resource: 'orders', key: '9', action: 'open' });
196
- await nav.back('orders');
197
- expect(router.url).toBe('/orders');
198
- });
199
-
200
- it('deep link sin dispatch ⇒ cae a la raíz del recurso de la ruta', async () => {
201
- const { nav, router } = servicio();
202
- await router.navigate(['/orders/XYZ']); // entrada directa: no hay origen en memoria
203
- expect(router.url).toBe('/orders/XYZ');
204
- await nav.back();
205
- expect(router.url).toBe('/orders'); // raíz declarada del resourceId de la ruta
206
- });
207
- });
@@ -1,132 +0,0 @@
1
- import { Injectable, inject } from '@angular/core';
2
- import { Router, type ActivatedRouteSnapshot } from '@angular/router';
3
-
4
- import type { NavigationTarget, SelectionBinding } from '../models/schema.model';
5
- import { getSchema } from '../registry/schema-catalog';
6
- import type { SelectionEvent } from '../../views/composer/view-context';
7
-
8
- /**
9
- * R9.9 · D4 — Servicio de navegación declarativa.
10
- *
11
- * Un leaf (hoja) sólo NAVEGA cuando hay `select` declarado; el motor vive
12
- * aquí, no en cada hoja. El flujo completo es:
13
- *
14
- * `ctx.emit/leaf → dispatch → buildSegments(pattern, {key}) →
15
- * router.navigate(matriz de comandos) → roleGuard`
16
- *
17
- * Invariantes:
18
- *
19
- * - **key-only**: la ÚNICA identidad que viaja es `event.key`. Los comandos
20
- * son una matriz de segmentos (nunca concat de strings) ⇒ el Router
21
- * codifica la clave (una clave `A/B` queda `A%2FB` en la URL) y ningún
22
- * dato del registro llega a la URL.
23
- * - **Fail closed**: sin binding, con acción distinta a la declarada o con
24
- * `mode` distinto de `route`, NO hay navegación — simplemente no ocurre.
25
- * - **Fail loud**: un target que el registry no declara lanza ruido antes de
26
- * navegar (el validador pre-render ya lo garantiza; esto es defensa en
27
- * profundidad).
28
- * - **Guards reales**: `router.navigate` ⇒ `roleGuard` corre igual que en
29
- * cualquier navegación declarada. Si el guard bloquea, no se registra
30
- * origen (no hay «atrás» que una sesión sin permiso deba volver a ver).
31
- */
32
-
33
- /**
34
- * Patrón de segmentos de la ruta destino (`['orders', ':key']`). Usa la
35
- * MISMA fuente que el validador (`getSchema`) para que lo validado en build
36
- * sea exactamente lo navegado en runtime. Inexistente ⇒ `undefined` (la
37
- * defensa en profundidad: el validador pre-render garantiza que esto no
38
- * ocurre en schemas válidos).
39
- */
40
- export function targetRoutePattern(target: NavigationTarget): string[] | undefined {
41
- const destino = getSchema(target.resource);
42
- const vista = destino?.uiViews?.[target.view];
43
- if (!destino || !vista) return undefined;
44
- const relativa = vista.path ?? '';
45
- return [destino.id, ...(relativa === '' ? [] : relativa.split('/'))];
46
- }
47
-
48
- /**
49
- * Segmentos de la ruta destino con la clave sustituida. La clave es SIEMPRE
50
- * un segmento completo (no se parte en `/`); un param distinto de `:key` no
51
- * tiene fuente declarada ⇒ falla ruido, no navega a medias.
52
- */
53
- export function buildSegments(pattern: readonly string[], key: string): string[] {
54
- const commands: string[] = [];
55
- for (const segmento of pattern) {
56
- if (segmento.startsWith(':')) {
57
- const nombre = segmento.slice(1);
58
- if (nombre !== 'key') {
59
- throw new Error(`Destino ':${nombre}' sin fuente declarada en SelectionEvent`);
60
- }
61
- commands.push(key);
62
- } else {
63
- commands.push(segmento);
64
- }
65
- }
66
- return commands;
67
- }
68
-
69
- @Injectable({ providedIn: 'root' })
70
- export class ViewNavigationService {
71
- private readonly router = inject(Router);
72
-
73
- /** URL desde la que se navegó la última selección válida (origen del «atrás»). */
74
- private origen: string | undefined;
75
-
76
- /**
77
- * Transición declarada de un leaf. Inerte si no hay binding, si la acción
78
- * no es la declarada o si el modo no es `route`; falla ruido si el target
79
- * no existe en el registry.
80
- *
81
- * @returns `true` si el Router completó la navegación (guards aceptados).
82
- */
83
- async dispatch(binding: SelectionBinding | undefined, event: SelectionEvent): Promise<boolean> {
84
- if (binding === undefined) return false; // sin declaración ⇒ inerte
85
- if (binding.on !== event.action) return false; // fuera del scope declarado
86
- if (binding.mode !== 'route') return false; // comportamiento local del leaf
87
-
88
- const pattern = targetRoutePattern(binding.target);
89
- if (pattern === undefined) {
90
- throw new Error(
91
- `Destino '${binding.target.resource}/${binding.target.view}' no existe en el registry`,
92
- );
93
- }
94
-
95
- const urlOrigen = this.router.url;
96
- const ok = await this.router.navigate(['/', ...buildSegments(pattern, event.key)]);
97
- if (ok) this.origen = urlOrigen;
98
- return ok;
99
- }
100
-
101
- /**
102
- * Forma de volver (D4). Orden: `returnPath` declarado por el leaf ⇒
103
- * origen registrado por `dispatch` ⇒ raíz del recurso declarado en la ruta
104
- * actual (entrada directa a la URL: no hay origen en memoria). Fallback
105
- * final: la raíz de la aplicación.
106
- */
107
- async back(returnPath?: string): Promise<boolean> {
108
- if (returnPath !== undefined) return this.router.navigate([returnPath]);
109
-
110
- if (this.origen !== undefined) {
111
- const destino = this.origen;
112
- this.origen = undefined;
113
- return this.router.navigateByUrl(destino);
114
- }
115
-
116
- const recurso = this.recursoActual();
117
- return recurso === undefined
118
- ? this.router.navigate(['/'])
119
- : this.router.navigate(['/', recurso]);
120
- }
121
-
122
- /** Primer `resourceId` declarado en el árbol de rutas activo. */
123
- private recursoActual(): string | undefined {
124
- let nodo: ActivatedRouteSnapshot | null = this.router.routerState.snapshot.root;
125
- while (nodo !== null) {
126
- const id = nodo.data?.['resourceId'];
127
- if (id !== undefined) return String(id);
128
- nodo = nodo.firstChild;
129
- }
130
- return undefined;
131
- }
132
- }
@@ -1,11 +0,0 @@
1
- import type { RenderDescriptor } from '../../core/registry/render-registry';
2
-
3
- /** Descriptor del campo `boolean` (R3.3). */
4
- export const descriptor: RenderDescriptor = {
5
- kind: 'field',
6
- type: 'boolean',
7
- since: '1.0',
8
- load: () => import('./boolean').then((module) => module.FieldBoolean),
9
- seed: 'boolean',
10
- surfaces: ['form', 'display'],
11
- };
@@ -1,40 +0,0 @@
1
- import { Component, computed, input } from '@angular/core';
2
- import { FormField } from '@angular/forms/signals';
3
-
4
- import type { BooleanField } from '../../core/models/schema.model';
5
- import { FieldAria } from '../field-aria';
6
- import { childTree, type RootTree } from '../field-node';
7
-
8
- /**
9
- * Interruptor booleano (base.md §5.1) con `trueLabel`/`falseLabel`.
10
- * Checkbox nativo + `formField` (se estiliza como switch con `peer-checked`).
11
- */
12
- @Component({
13
- selector: 'app-field-boolean',
14
- imports: [FieldAria, FormField],
15
- template: `
16
- <label class="inline-flex cursor-pointer items-center gap-2">
17
- <input type="checkbox" class="peer sr-only" [id]="state().name()" [formField]="node()" />
18
- <span
19
- class="relative h-5 w-9 shrink-0 rounded-full bg-neutral/30 transition-colors peer-checked:bg-primary after:absolute after:top-0.5 after:left-0.5 after:h-4 after:w-4 after:rounded-full after:bg-white after:transition-transform after:content-[''] peer-checked:after:translate-x-4"
20
- ></span>
21
- <span class="text-sm">{{ currentLabel() }}</span>
22
- </label>
23
- `,
24
- })
25
- export class FieldBoolean {
26
- readonly field = input.required<BooleanField>();
27
- readonly tree = input.required<RootTree>();
28
-
29
- protected readonly node = computed(() => childTree<boolean>(this.tree(), this.field().key));
30
- protected readonly state = computed(() => this.node()());
31
-
32
- protected readonly currentLabel = computed(() => {
33
- const on = this.state().value() === true;
34
- const field = this.field();
35
- if (on) {
36
- return field.trueLabel ?? 'Sí';
37
- }
38
- return field.falseLabel ?? 'No';
39
- });
40
- }
@@ -1,12 +0,0 @@
1
- import type { RenderDescriptor } from '../../core/registry/render-registry';
2
-
3
- /** Descriptor del campo `color` (selector de color). */
4
- export const descriptor: RenderDescriptor = {
5
- kind: 'field',
6
- type: 'color',
7
- since: '1.0',
8
- load: () => import('./color').then((module) => module.FieldColor),
9
- // Nace como cadena (hexadecimal #RRGGBB).
10
- seed: 'string',
11
- surfaces: ['form', 'display'],
12
- };
@@ -1,34 +0,0 @@
1
- import { Component, computed, input } from '@angular/core';
2
- import { FormField } from '@angular/forms/signals';
3
-
4
- import type { ColorField } from '../../core/models/schema.model';
5
- import { FieldAria } from '../field-aria';
6
- import { childTree, type RootTree } from '../field-node';
7
-
8
- /**
9
- * Selector de color (`<input type="color">`, base.md §5.1 `color`).
10
- *
11
- * Devuelve un string hexadecimal `#RRGGBB`. El navegador muestra su propia
12
- * paleta de colores; no hay validación de formato extra porque el input
13
- * `type="color"` ya garantiza el formato válido.
14
- */
15
- @Component({
16
- selector: 'app-field-color',
17
- imports: [FieldAria, FormField],
18
- template: `
19
- <input
20
- type="color"
21
- class="field-input h-10 w-full p-0 border-0 bg-transparent focus-visible:outline-0 cursor-pointer"
22
- [id]="state().name()"
23
- [formField]="node()"
24
- [title]="field().label"
25
- />
26
- `,
27
- })
28
- export class FieldColor {
29
- readonly field = input.required<ColorField>();
30
- readonly tree = input.required<RootTree>();
31
-
32
- protected readonly node = computed(() => childTree<string>(this.tree(), this.field().key));
33
- protected readonly state = computed(() => this.node()());
34
- }
@@ -1,12 +0,0 @@
1
- import type { RenderDescriptor } from '../../core/registry/render-registry';
2
-
3
- /** Descriptor del campo `currency` (R3.3). */
4
- export const descriptor: RenderDescriptor = {
5
- kind: 'field',
6
- type: 'currency',
7
- since: '1.0',
8
- load: () => import('./currency').then((module) => module.FieldCurrency),
9
- // Nace como `null`: no puede ser `0`, que sería un valor ya cargado.
10
- seed: 'number',
11
- surfaces: ['form', 'display'],
12
- };
@@ -1,67 +0,0 @@
1
- import { Component, computed, input } from '@angular/core';
2
- import { FormField } from '@angular/forms/signals';
3
-
4
- import type { CurrencyField } from '../../core/models/schema.model';
5
- import { FieldAria } from '../field-aria';
6
- import { childTree, type RootTree } from '../field-node';
7
-
8
- /**
9
- * Número con prefijo de moneda (base.md §5.1). El valor sigue siendo número
10
- * puro; el prefijo sale del campo `currencyFrom` (código ISO, ej. `PEN`)
11
- * traducido a símbolo con Intl.
12
- */
13
- @Component({
14
- selector: 'app-field-currency',
15
- imports: [FieldAria, FormField],
16
- template: `
17
- <div class="flex items-center gap-2">
18
- @if (symbol(); as symbol) {
19
- <span class="shrink-0 text-sm text-neutral" data-testid="currency-symbol">{{
20
- symbol
21
- }}</span>
22
- }
23
- <input
24
- type="number"
25
- step="any"
26
- class="field-input"
27
- [id]="state().name()"
28
- [formField]="node()"
29
- [placeholder]="field().placeholder ?? ''"
30
- />
31
- </div>
32
- `,
33
- })
34
- export class FieldCurrency {
35
- readonly field = input.required<CurrencyField>();
36
- readonly tree = input.required<RootTree>();
37
-
38
- protected readonly node = computed(() => childTree<number>(this.tree(), this.field().key));
39
- protected readonly state = computed(() => this.node()());
40
-
41
- /** Código ISO de la moneda desde el campo hermano (`currencyFrom`). */
42
- private readonly currencyCode = computed(() => {
43
- const from = this.field().currencyFrom;
44
- if (!from) {
45
- return null;
46
- }
47
- const value = childTree<unknown>(this.tree(), from)().value();
48
- return typeof value === 'string' && value !== '' ? value : null;
49
- });
50
-
51
- /** Símbolo localizado (`S/` para PEN); el código crudo si Intl lo rechaza. */
52
- protected readonly symbol = computed(() => {
53
- const code = this.currencyCode();
54
- if (code === null) {
55
- return null;
56
- }
57
- try {
58
- const parts = new Intl.NumberFormat('es-PE', {
59
- style: 'currency',
60
- currency: code,
61
- }).formatToParts(0);
62
- return parts.find((part) => part.type === 'currency')?.value ?? code;
63
- } catch {
64
- return code;
65
- }
66
- });
67
- }
@@ -1,12 +0,0 @@
1
- import type { RenderDescriptor } from '../../core/registry/render-registry';
2
-
3
- /** Descriptor del campo `date` (R3.3). */
4
- export const descriptor: RenderDescriptor = {
5
- kind: 'field',
6
- type: 'date',
7
- since: '1.0',
8
- load: () => import('./date').then((module) => module.FieldDate),
9
- // Nace como cadena: los textos, fechas, urls, selects y relacionales.
10
- seed: 'string',
11
- surfaces: ['form', 'display'],
12
- };
@@ -1,36 +0,0 @@
1
- import { Component, computed, input } from '@angular/core';
2
- import { FormField } from '@angular/forms/signals';
3
-
4
- import type { DateField } from '../../core/models/schema.model';
5
- import { FieldAria } from '../field-aria';
6
- import { childTree, type RootTree } from '../field-node';
7
-
8
- /**
9
- * Selector de fecha ISO `YYYY-MM-DD` (base.md §5.1).
10
- *
11
- * `min`/`max` del schema se validan con reglas propias en
12
- * `pages/form-view/form-schema.ts`: `minDate`/`maxDate` de Signal Forms
13
- * exigen valores `Date` y este modelo guarda strings. `FormField` solo setea
14
- * los atributos nativos `min`/`max` cuando existen las reglas `min()`/`max()`
15
- * (que aplican a números).
16
- */
17
- @Component({
18
- selector: 'app-field-date',
19
- imports: [FieldAria, FormField],
20
- template: `
21
- <input
22
- type="date"
23
- class="field-input"
24
- [id]="state().name()"
25
- [formField]="node()"
26
- [placeholder]="field().placeholder ?? ''"
27
- />
28
- `,
29
- })
30
- export class FieldDate {
31
- readonly field = input.required<DateField>();
32
- readonly tree = input.required<RootTree>();
33
-
34
- protected readonly node = computed(() => childTree<string>(this.tree(), this.field().key));
35
- protected readonly state = computed(() => this.node()());
36
- }