@tinya-code/gas-admin-ui 0.0.0-stage → 0.1.0-alpha.2

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 (136) hide show
  1. package/README.md +125 -2
  2. package/fesm2022/tinya-code-gas-admin-ui-api.service-CZrUeclM.mjs +281 -0
  3. package/fesm2022/tinya-code-gas-admin-ui-api.service-CZrUeclM.mjs.map +1 -0
  4. package/fesm2022/tinya-code-gas-admin-ui-badge-EeCA_l-o.mjs +84 -0
  5. package/fesm2022/tinya-code-gas-admin-ui-badge-EeCA_l-o.mjs.map +1 -0
  6. package/fesm2022/tinya-code-gas-admin-ui-bar-chart-G7sEMSBY.mjs +140 -0
  7. package/fesm2022/tinya-code-gas-admin-ui-bar-chart-G7sEMSBY.mjs.map +1 -0
  8. package/fesm2022/tinya-code-gas-admin-ui-boolean-B2ASKL0E.mjs +113 -0
  9. package/fesm2022/tinya-code-gas-admin-ui-boolean-B2ASKL0E.mjs.map +1 -0
  10. package/fesm2022/tinya-code-gas-admin-ui-button-BQjNW8KB.mjs +163 -0
  11. package/fesm2022/tinya-code-gas-admin-ui-button-BQjNW8KB.mjs.map +1 -0
  12. package/fesm2022/tinya-code-gas-admin-ui-calendar-view-r-RXDE37.mjs +1022 -0
  13. package/fesm2022/tinya-code-gas-admin-ui-calendar-view-r-RXDE37.mjs.map +1 -0
  14. package/fesm2022/tinya-code-gas-admin-ui-chart-line-BjdlKHoH.mjs +278 -0
  15. package/fesm2022/tinya-code-gas-admin-ui-chart-line-BjdlKHoH.mjs.map +1 -0
  16. package/fesm2022/tinya-code-gas-admin-ui-condition-evaluator-BBzWUuHl.mjs +101 -0
  17. package/fesm2022/tinya-code-gas-admin-ui-condition-evaluator-BBzWUuHl.mjs.map +1 -0
  18. package/fesm2022/tinya-code-gas-admin-ui-currency-BvuF3Z63.mjs +141 -0
  19. package/fesm2022/tinya-code-gas-admin-ui-currency-BvuF3Z63.mjs.map +1 -0
  20. package/fesm2022/tinya-code-gas-admin-ui-data-source.service-LD8AM3Rn.mjs +89 -0
  21. package/fesm2022/tinya-code-gas-admin-ui-data-source.service-LD8AM3Rn.mjs.map +1 -0
  22. package/fesm2022/tinya-code-gas-admin-ui-date-1SJGXZrd.mjs +107 -0
  23. package/fesm2022/tinya-code-gas-admin-ui-date-1SJGXZrd.mjs.map +1 -0
  24. package/fesm2022/tinya-code-gas-admin-ui-display-badge-fwk6sDU7.mjs +140 -0
  25. package/fesm2022/tinya-code-gas-admin-ui-display-badge-fwk6sDU7.mjs.map +1 -0
  26. package/fesm2022/tinya-code-gas-admin-ui-display-date-D7zLiDiG.mjs +119 -0
  27. package/fesm2022/tinya-code-gas-admin-ui-display-date-D7zLiDiG.mjs.map +1 -0
  28. package/fesm2022/tinya-code-gas-admin-ui-display-file-BiIhqvQC.mjs +125 -0
  29. package/fesm2022/tinya-code-gas-admin-ui-display-file-BiIhqvQC.mjs.map +1 -0
  30. package/fesm2022/tinya-code-gas-admin-ui-display-image-C1dhnZi1.mjs +152 -0
  31. package/fesm2022/tinya-code-gas-admin-ui-display-image-C1dhnZi1.mjs.map +1 -0
  32. package/fesm2022/tinya-code-gas-admin-ui-display-list-DOEuUbGe.mjs +211 -0
  33. package/fesm2022/tinya-code-gas-admin-ui-display-list-DOEuUbGe.mjs.map +1 -0
  34. package/fesm2022/tinya-code-gas-admin-ui-display-number-DDMzr4Hn.mjs +116 -0
  35. package/fesm2022/tinya-code-gas-admin-ui-display-number-DDMzr4Hn.mjs.map +1 -0
  36. package/fesm2022/tinya-code-gas-admin-ui-display-text-B8CdVNpv.mjs +111 -0
  37. package/fesm2022/tinya-code-gas-admin-ui-display-text-B8CdVNpv.mjs.map +1 -0
  38. package/fesm2022/tinya-code-gas-admin-ui-email-CT_O5ihA.mjs +107 -0
  39. package/fesm2022/tinya-code-gas-admin-ui-email-CT_O5ihA.mjs.map +1 -0
  40. package/fesm2022/tinya-code-gas-admin-ui-empty-state-BMc0QtoT.mjs +109 -0
  41. package/fesm2022/tinya-code-gas-admin-ui-empty-state-BMc0QtoT.mjs.map +1 -0
  42. package/fesm2022/tinya-code-gas-admin-ui-error-mapper.service-Ci0UpXtV.mjs +45 -0
  43. package/fesm2022/tinya-code-gas-admin-ui-error-mapper.service-Ci0UpXtV.mjs.map +1 -0
  44. package/fesm2022/tinya-code-gas-admin-ui-field-aria-BD1Wiggc.mjs +50 -0
  45. package/fesm2022/tinya-code-gas-admin-ui-field-aria-BD1Wiggc.mjs.map +1 -0
  46. package/fesm2022/tinya-code-gas-admin-ui-field-node-CIK6KNN_.mjs +24 -0
  47. package/fesm2022/tinya-code-gas-admin-ui-field-node-CIK6KNN_.mjs.map +1 -0
  48. package/fesm2022/tinya-code-gas-admin-ui-field-path-B4-FTBGZ.mjs +27 -0
  49. package/fesm2022/tinya-code-gas-admin-ui-field-path-B4-FTBGZ.mjs.map +1 -0
  50. package/fesm2022/tinya-code-gas-admin-ui-file-Dg2N3XQ2.mjs +408 -0
  51. package/fesm2022/tinya-code-gas-admin-ui-file-Dg2N3XQ2.mjs.map +1 -0
  52. package/fesm2022/tinya-code-gas-admin-ui-form-view-BwGupSbi.mjs +4514 -0
  53. package/fesm2022/tinya-code-gas-admin-ui-form-view-BwGupSbi.mjs.map +1 -0
  54. package/fesm2022/tinya-code-gas-admin-ui-format-badge-CK8ct5Wk.mjs +82 -0
  55. package/fesm2022/tinya-code-gas-admin-ui-format-badge-CK8ct5Wk.mjs.map +1 -0
  56. package/fesm2022/tinya-code-gas-admin-ui-format-boolean-ClzezZz-.mjs +105 -0
  57. package/fesm2022/tinya-code-gas-admin-ui-format-boolean-ClzezZz-.mjs.map +1 -0
  58. package/fesm2022/tinya-code-gas-admin-ui-format-currency-CVmniKml.mjs +65 -0
  59. package/fesm2022/tinya-code-gas-admin-ui-format-currency-CVmniKml.mjs.map +1 -0
  60. package/fesm2022/tinya-code-gas-admin-ui-format-date-Dr1YsDd_.mjs +65 -0
  61. package/fesm2022/tinya-code-gas-admin-ui-format-date-Dr1YsDd_.mjs.map +1 -0
  62. package/fesm2022/tinya-code-gas-admin-ui-format-number-CWCjpI4n.mjs +65 -0
  63. package/fesm2022/tinya-code-gas-admin-ui-format-number-CWCjpI4n.mjs.map +1 -0
  64. package/fesm2022/tinya-code-gas-admin-ui-format-text-DBOgJkH0.mjs +59 -0
  65. package/fesm2022/tinya-code-gas-admin-ui-format-text-DBOgJkH0.mjs.map +1 -0
  66. package/fesm2022/tinya-code-gas-admin-ui-format-thumbnail-PCRvxWKt.mjs +94 -0
  67. package/fesm2022/tinya-code-gas-admin-ui-format-thumbnail-PCRvxWKt.mjs.map +1 -0
  68. package/fesm2022/tinya-code-gas-admin-ui-gap-sorting-iTdy_DYG.mjs +72 -0
  69. package/fesm2022/tinya-code-gas-admin-ui-gap-sorting-iTdy_DYG.mjs.map +1 -0
  70. package/fesm2022/tinya-code-gas-admin-ui-group-h7-O8tt4.mjs +238 -0
  71. package/fesm2022/tinya-code-gas-admin-ui-group-h7-O8tt4.mjs.map +1 -0
  72. package/fesm2022/tinya-code-gas-admin-ui-image-Bjw9ImlS.mjs +416 -0
  73. package/fesm2022/tinya-code-gas-admin-ui-image-Bjw9ImlS.mjs.map +1 -0
  74. package/fesm2022/tinya-code-gas-admin-ui-kanban-view-CeGueI57.mjs +439 -0
  75. package/fesm2022/tinya-code-gas-admin-ui-kanban-view-CeGueI57.mjs.map +1 -0
  76. package/fesm2022/tinya-code-gas-admin-ui-key-value-nVdgg5at.mjs +513 -0
  77. package/fesm2022/tinya-code-gas-admin-ui-key-value-nVdgg5at.mjs.map +1 -0
  78. package/fesm2022/tinya-code-gas-admin-ui-list-CMzl9MkX.mjs +637 -0
  79. package/fesm2022/tinya-code-gas-admin-ui-list-CMzl9MkX.mjs.map +1 -0
  80. package/fesm2022/tinya-code-gas-admin-ui-metric-card-DnGMQL8l.mjs +127 -0
  81. package/fesm2022/tinya-code-gas-admin-ui-metric-card-DnGMQL8l.mjs.map +1 -0
  82. package/fesm2022/tinya-code-gas-admin-ui-multiselect-CuWwAfdY.mjs +251 -0
  83. package/fesm2022/tinya-code-gas-admin-ui-multiselect-CuWwAfdY.mjs.map +1 -0
  84. package/fesm2022/tinya-code-gas-admin-ui-notification.service-LjSULER6.mjs +66 -0
  85. package/fesm2022/tinya-code-gas-admin-ui-notification.service-LjSULER6.mjs.map +1 -0
  86. package/fesm2022/tinya-code-gas-admin-ui-number-JNr7glc8.mjs +114 -0
  87. package/fesm2022/tinya-code-gas-admin-ui-number-JNr7glc8.mjs.map +1 -0
  88. package/fesm2022/tinya-code-gas-admin-ui-phone-jR417hPf.mjs +116 -0
  89. package/fesm2022/tinya-code-gas-admin-ui-phone-jR417hPf.mjs.map +1 -0
  90. package/fesm2022/tinya-code-gas-admin-ui-quick-actions-DCQ6emmF.mjs +235 -0
  91. package/fesm2022/tinya-code-gas-admin-ui-quick-actions-DCQ6emmF.mjs.map +1 -0
  92. package/fesm2022/tinya-code-gas-admin-ui-radio-mode-DxvN07DY.mjs +8 -0
  93. package/fesm2022/tinya-code-gas-admin-ui-radio-mode-DxvN07DY.mjs.map +1 -0
  94. package/fesm2022/tinya-code-gas-admin-ui-readonly-text-BL7-4qie.mjs +124 -0
  95. package/fesm2022/tinya-code-gas-admin-ui-readonly-text-BL7-4qie.mjs.map +1 -0
  96. package/fesm2022/tinya-code-gas-admin-ui-record-list-BiZfnd_7.mjs +249 -0
  97. package/fesm2022/tinya-code-gas-admin-ui-record-list-BiZfnd_7.mjs.map +1 -0
  98. package/fesm2022/tinya-code-gas-admin-ui-relation-B3W3Ynsp.mjs +309 -0
  99. package/fesm2022/tinya-code-gas-admin-ui-relation-B3W3Ynsp.mjs.map +1 -0
  100. package/fesm2022/tinya-code-gas-admin-ui-relation-drawer.service-B0kT8EiW.mjs +39 -0
  101. package/fesm2022/tinya-code-gas-admin-ui-relation-drawer.service-B0kT8EiW.mjs.map +1 -0
  102. package/fesm2022/tinya-code-gas-admin-ui-render-registry-B_D5Jhp9.mjs +546 -0
  103. package/fesm2022/tinya-code-gas-admin-ui-render-registry-B_D5Jhp9.mjs.map +1 -0
  104. package/fesm2022/tinya-code-gas-admin-ui-rolldown-runtime-DpJrqANO.mjs +11 -0
  105. package/fesm2022/tinya-code-gas-admin-ui-schema-catalog-CDrz9pVN.mjs +131 -0
  106. package/fesm2022/tinya-code-gas-admin-ui-schema-catalog-CDrz9pVN.mjs.map +1 -0
  107. package/fesm2022/tinya-code-gas-admin-ui-seed-CNbQtREA.mjs +80 -0
  108. package/fesm2022/tinya-code-gas-admin-ui-seed-CNbQtREA.mjs.map +1 -0
  109. package/fesm2022/tinya-code-gas-admin-ui-select-DzaRfHXO.mjs +292 -0
  110. package/fesm2022/tinya-code-gas-admin-ui-select-DzaRfHXO.mjs.map +1 -0
  111. package/fesm2022/tinya-code-gas-admin-ui-skeleton-DnWK0tcZ.mjs +119 -0
  112. package/fesm2022/tinya-code-gas-admin-ui-skeleton-DnWK0tcZ.mjs.map +1 -0
  113. package/fesm2022/tinya-code-gas-admin-ui-slug-DU58cbiY.mjs +158 -0
  114. package/fesm2022/tinya-code-gas-admin-ui-slug-DU58cbiY.mjs.map +1 -0
  115. package/fesm2022/tinya-code-gas-admin-ui-source-options-B9R4mw8-.mjs +26 -0
  116. package/fesm2022/tinya-code-gas-admin-ui-source-options-B9R4mw8-.mjs.map +1 -0
  117. package/fesm2022/tinya-code-gas-admin-ui-status-progress-DmeG8htE.mjs +205 -0
  118. package/fesm2022/tinya-code-gas-admin-ui-status-progress-DmeG8htE.mjs.map +1 -0
  119. package/fesm2022/tinya-code-gas-admin-ui-string-list-gleasqzD.mjs +432 -0
  120. package/fesm2022/tinya-code-gas-admin-ui-string-list-gleasqzD.mjs.map +1 -0
  121. package/fesm2022/tinya-code-gas-admin-ui-template-interpolator-ewv7CkNX.mjs +36 -0
  122. package/fesm2022/tinya-code-gas-admin-ui-template-interpolator-ewv7CkNX.mjs.map +1 -0
  123. package/fesm2022/tinya-code-gas-admin-ui-text-CUPmL7W_.mjs +107 -0
  124. package/fesm2022/tinya-code-gas-admin-ui-text-CUPmL7W_.mjs.map +1 -0
  125. package/fesm2022/tinya-code-gas-admin-ui-textarea-CGLSIW13.mjs +223 -0
  126. package/fesm2022/tinya-code-gas-admin-ui-textarea-CGLSIW13.mjs.map +1 -0
  127. package/fesm2022/tinya-code-gas-admin-ui-time-BcHzsTWf.mjs +107 -0
  128. package/fesm2022/tinya-code-gas-admin-ui-time-BcHzsTWf.mjs.map +1 -0
  129. package/fesm2022/tinya-code-gas-admin-ui-upload.service-C1g545w5.mjs +60 -0
  130. package/fesm2022/tinya-code-gas-admin-ui-upload.service-C1g545w5.mjs.map +1 -0
  131. package/fesm2022/tinya-code-gas-admin-ui-url-GO4LZi__.mjs +141 -0
  132. package/fesm2022/tinya-code-gas-admin-ui-url-GO4LZi__.mjs.map +1 -0
  133. package/fesm2022/tinya-code-gas-admin-ui.mjs +4403 -0
  134. package/fesm2022/tinya-code-gas-admin-ui.mjs.map +1 -0
  135. package/package.json +31 -3
  136. package/types/tinya-code-gas-admin-ui.d.ts +3099 -0
@@ -0,0 +1,141 @@
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, input } from "@angular/core";
5
+ import { FormField } from "@angular/forms/signals";
6
+ var FieldCurrency = class FieldCurrency {
7
+ field = input.required(...ngDevMode ? [{ debugName: "field" }] : /* istanbul ignore next */ []);
8
+ tree = input.required(...ngDevMode ? [{ debugName: "tree" }] : /* istanbul ignore next */ []);
9
+ node = computed(() => childTree(this.tree(), this.field().key), ...ngDevMode ? [{ debugName: "node" }] : /* istanbul ignore next */ []);
10
+ state = computed(() => this.node()(), ...ngDevMode ? [{ debugName: "state" }] : /* istanbul ignore next */ []);
11
+ currencyCode = computed(() => {
12
+ const from = this.field().currencyFrom;
13
+ if (!from) return null;
14
+ const value = childTree(this.tree(), from)().value();
15
+ return typeof value === "string" && value !== "" ? value : null;
16
+ }, ...ngDevMode ? [{ debugName: "currencyCode" }] : /* istanbul ignore next */ []);
17
+ symbol = computed(() => {
18
+ const code = this.currencyCode();
19
+ if (code === null) return null;
20
+ try {
21
+ return new Intl.NumberFormat("es-PE", {
22
+ style: "currency",
23
+ currency: code
24
+ }).formatToParts(0).find((part) => part.type === "currency")?.value ?? code;
25
+ } catch {
26
+ return code;
27
+ }
28
+ }, ...ngDevMode ? [{ debugName: "symbol" }] : /* istanbul ignore next */ []);
29
+ static ɵfac = i0.ɵɵngDeclareFactory({
30
+ minVersion: "12.0.0",
31
+ version: "22.2.3",
32
+ ngImport: i0,
33
+ type: FieldCurrency,
34
+ deps: [],
35
+ target: i0.ɵɵFactoryTarget.Component
36
+ });
37
+ static ɵcmp = i0.ɵɵngDeclareComponent({
38
+ minVersion: "17.0.0",
39
+ version: "22.2.3",
40
+ type: FieldCurrency,
41
+ isStandalone: true,
42
+ selector: "app-field-currency",
43
+ inputs: {
44
+ field: {
45
+ classPropertyName: "field",
46
+ publicName: "field",
47
+ isSignal: true,
48
+ isRequired: true,
49
+ transformFunction: null
50
+ },
51
+ tree: {
52
+ classPropertyName: "tree",
53
+ publicName: "tree",
54
+ isSignal: true,
55
+ isRequired: true,
56
+ transformFunction: null
57
+ }
58
+ },
59
+ ngImport: i0,
60
+ template: `
61
+ <div class="flex items-center gap-2">
62
+ @if (symbol(); as symbol) {
63
+ <span class="shrink-0 text-sm text-neutral" data-testid="currency-symbol">{{
64
+ symbol
65
+ }}</span>
66
+ }
67
+ <input
68
+ type="number"
69
+ step="any"
70
+ class="field-input"
71
+ [id]="state().name()"
72
+ [formField]="node()"
73
+ [placeholder]="field().placeholder ?? ''"
74
+ />
75
+ </div>
76
+ `,
77
+ isInline: true,
78
+ dependencies: [{
79
+ kind: "directive",
80
+ type: FieldAria,
81
+ selector: "input[id], select[id], textarea[id], output[id]"
82
+ }, {
83
+ kind: "directive",
84
+ type: FormField,
85
+ selector: "[formField]",
86
+ inputs: ["formField"],
87
+ exportAs: ["formField"]
88
+ }]
89
+ });
90
+ };
91
+ i0.ɵɵngDeclareClassMetadata({
92
+ minVersion: "12.0.0",
93
+ version: "22.2.3",
94
+ ngImport: i0,
95
+ type: FieldCurrency,
96
+ decorators: [{
97
+ type: Component,
98
+ args: [{
99
+ selector: "app-field-currency",
100
+ imports: [FieldAria, FormField],
101
+ template: `
102
+ <div class="flex items-center gap-2">
103
+ @if (symbol(); as symbol) {
104
+ <span class="shrink-0 text-sm text-neutral" data-testid="currency-symbol">{{
105
+ symbol
106
+ }}</span>
107
+ }
108
+ <input
109
+ type="number"
110
+ step="any"
111
+ class="field-input"
112
+ [id]="state().name()"
113
+ [formField]="node()"
114
+ [placeholder]="field().placeholder ?? ''"
115
+ />
116
+ </div>
117
+ `
118
+ }]
119
+ }],
120
+ propDecorators: {
121
+ field: [{
122
+ type: i0.Input,
123
+ args: [{
124
+ isSignal: true,
125
+ alias: "field",
126
+ required: true
127
+ }]
128
+ }],
129
+ tree: [{
130
+ type: i0.Input,
131
+ args: [{
132
+ isSignal: true,
133
+ alias: "tree",
134
+ required: true
135
+ }]
136
+ }]
137
+ }
138
+ });
139
+ export { FieldCurrency };
140
+
141
+ //# sourceMappingURL=tinya-code-gas-admin-ui-currency-BvuF3Z63.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tinya-code-gas-admin-ui-currency-BvuF3Z63.mjs","names":[],"sources":["../../../projects/gas-admin-ui/src/lib/fields/currency/currency.ts"],"sourcesContent":["import { Component, computed, input } from '@angular/core';\nimport { FormField } from '@angular/forms/signals';\n\nimport type { CurrencyField } from '../../core/models/schema.model';\nimport { FieldAria } from '../field-aria';\nimport { childTree, type RootTree } from '../field-node';\n\n/**\n * Número con prefijo de moneda (base.md §5.1). El valor sigue siendo número\n * puro; el prefijo sale del campo `currencyFrom` (código ISO, ej. `PEN`)\n * traducido a símbolo con Intl.\n */\n@Component({\n selector: 'app-field-currency',\n imports: [FieldAria, FormField],\n template: `\n <div class=\"flex items-center gap-2\">\n @if (symbol(); as symbol) {\n <span class=\"shrink-0 text-sm text-neutral\" data-testid=\"currency-symbol\">{{\n symbol\n }}</span>\n }\n <input\n type=\"number\"\n step=\"any\"\n class=\"field-input\"\n [id]=\"state().name()\"\n [formField]=\"node()\"\n [placeholder]=\"field().placeholder ?? ''\"\n />\n </div>\n `,\n})\nexport class FieldCurrency {\n readonly field = input.required<CurrencyField>();\n readonly tree = input.required<RootTree>();\n\n protected readonly node = computed(() => childTree<number>(this.tree(), this.field().key));\n protected readonly state = computed(() => this.node()());\n\n /** Código ISO de la moneda desde el campo hermano (`currencyFrom`). */\n private readonly currencyCode = computed(() => {\n const from = this.field().currencyFrom;\n if (!from) {\n return null;\n }\n const value = childTree<unknown>(this.tree(), from)().value();\n return typeof value === 'string' && value !== '' ? value : null;\n });\n\n /** Símbolo localizado (`S/` para PEN); el código crudo si Intl lo rechaza. */\n protected readonly symbol = computed(() => {\n const code = this.currencyCode();\n if (code === null) {\n return null;\n }\n try {\n const parts = new Intl.NumberFormat('es-PE', {\n style: 'currency',\n currency: code,\n }).formatToParts(0);\n return parts.find((part) => part.type === 'currency')?.value ?? code;\n } catch {\n return code;\n }\n });\n}\n"],"mappings":";;;;;AAiCA,IAAa,gBAAb,MAAa,cAAa;CACf,QAAQ,MAAM,SAAyB,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CACvC,OAAO,MAAM,SAAoB,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAEvB,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;CAGvC,eAAe,eAAc;EAC5C,MAAM,OAAO,KAAK,MAAK,CAAE,CAAC;EAC1B,IAAI,CAAC,MACH,OAAO;EAET,MAAM,QAAQ,UAAmB,KAAK,KAAI,GAAI,IAAI,CAAC,CAAA,CAAE,CAAC,MAAK;EAC3D,OAAO,OAAO,UAAU,YAAY,UAAU,KAAK,QAAQ;CAC7D,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CAGiB,SAAS,eAAc;EACxC,MAAM,OAAO,KAAK,aAAY;EAC9B,IAAI,SAAS,MACX,OAAO;EAET,IAAI;GAKF,OAJc,IAAI,KAAK,aAAa,SAAS;IAC3C,OAAO;IACP,UAAU;GACX,CAAA,CAAC,CAAC,cAAc,CACV,CAAA,CAAM,MAAM,SAAS,KAAK,SAAS,UAAU,CAAC,EAAE,SAAS;EAClE,QAAQ;GACN,OAAO;EACT;CACF,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAhCS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAa,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAb,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAa,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;EAAA;EAAA,UAAA;EAAA,UAlBd;;;;;;;;;;;;;;;;;EAgBT,UAAA;EAAA,cAAA,CAAA;GAAA,MAAA;GAAA,MAjBS;GAAS,UAAA;EAAA,GAAA;GAAA,MAAA;GAAA,MAAE;GAAS,UAAA;GAAA,QAAA,CAAA,WAAA;GAAA,UAAA,CAAA,WAAA;EAAA,CAAA;CAAA,CAAA;;AAmBnB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAa,YAAA,CAAA;EArBzB,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,SAAS,CAAC,WAAW,SAAS;GAC9B,UAAU;;;;;;;;;;;;;;;;;EAiBX,CAAA"}
@@ -0,0 +1,89 @@
1
+ import { t as ApiService } from "./tinya-code-gas-admin-ui-api.service-CZrUeclM.mjs";
2
+ import { i as getSchema } from "./tinya-code-gas-admin-ui-schema-catalog-CDrz9pVN.mjs";
3
+ import { t as interpolateTemplate } from "./tinya-code-gas-admin-ui-template-interpolator-ewv7CkNX.mjs";
4
+ import * as i0 from "@angular/core";
5
+ import { Service, inject } from "@angular/core";
6
+ import { firstValueFrom } from "rxjs";
7
+ const TTL_MS = 3e4;
8
+ const MAX_CLAVES = 100;
9
+ function interpolateParams(params, ctx) {
10
+ const out = {};
11
+ if (params === void 0) return out;
12
+ for (const name of Object.keys(params)) {
13
+ const raw = params[name];
14
+ const value = interpolateTemplate(raw, ctx ?? {});
15
+ if (value !== "") out[name] = value;
16
+ }
17
+ return out;
18
+ }
19
+ function dataSourceKey(source, ctx) {
20
+ const params = interpolateParams(source.params, ctx);
21
+ const query = Object.keys(params).sort().map((name) => `${encodeURIComponent(name)}=${encodeURIComponent(params[name])}`).join("&");
22
+ return `${source.resource}|${source.view ?? ""}|${query}`;
23
+ }
24
+ var DataSourceService = class DataSourceService {
25
+ api = inject(ApiService);
26
+ cache = /* @__PURE__ */ new Map();
27
+ async rows(source, ctx, fresh = false) {
28
+ const key = dataSourceKey(source, ctx);
29
+ if (!fresh) {
30
+ const hit = this.cache.get(key);
31
+ if (hit !== void 0 && Date.now() - hit.at < TTL_MS) return hit.promise;
32
+ }
33
+ const promise = this.fetch(source, ctx).catch((error) => {
34
+ this.cache.delete(key);
35
+ throw error;
36
+ });
37
+ this.cache.set(key, {
38
+ promise,
39
+ at: Date.now()
40
+ });
41
+ if (this.cache.size > MAX_CLAVES) {
42
+ const oldest = this.cache.keys().next();
43
+ if (!oldest.done) this.cache.delete(oldest.value);
44
+ }
45
+ return promise;
46
+ }
47
+ invalidate(resourceId) {
48
+ if (resourceId === void 0) {
49
+ this.cache.clear();
50
+ return;
51
+ }
52
+ const prefix = `${resourceId}|`;
53
+ for (const key of [...this.cache.keys()]) if (key.startsWith(prefix)) this.cache.delete(key);
54
+ }
55
+ async fetch(source, ctx) {
56
+ const target = getSchema(source.resource);
57
+ if (!target) throw new Error(`Recurso desconocido: ${source.resource}`);
58
+ const payload = {};
59
+ if (source.view !== void 0 && source.view !== "") payload["view"] = source.view;
60
+ const params = interpolateParams(source.params, ctx);
61
+ if (Object.keys(params).length > 0) payload["params"] = params;
62
+ const rows = await firstValueFrom(this.api.list(target.endpoint, payload));
63
+ return Array.isArray(rows) ? rows : [];
64
+ }
65
+ static ɵfac = i0.ɵɵngDeclareFactory({
66
+ minVersion: "12.0.0",
67
+ version: "22.2.3",
68
+ ngImport: i0,
69
+ type: DataSourceService,
70
+ deps: [],
71
+ target: i0.ɵɵFactoryTarget.Service
72
+ });
73
+ static ɵprov = i0.ɵɵngDeclareService({
74
+ minVersion: "22.0.0",
75
+ version: "22.2.3",
76
+ ngImport: i0,
77
+ type: DataSourceService
78
+ });
79
+ };
80
+ i0.ɵɵngDeclareClassMetadata({
81
+ minVersion: "12.0.0",
82
+ version: "22.2.3",
83
+ ngImport: i0,
84
+ type: DataSourceService,
85
+ decorators: [{ type: Service }]
86
+ });
87
+ export { dataSourceKey as n, DataSourceService as t };
88
+
89
+ //# sourceMappingURL=tinya-code-gas-admin-ui-data-source.service-LD8AM3Rn.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tinya-code-gas-admin-ui-data-source.service-LD8AM3Rn.mjs","names":[],"sources":["../../../projects/gas-admin-ui/src/lib/core/services/data-source.service.ts"],"sourcesContent":["import { inject, Service } from '@angular/core';\nimport { firstValueFrom } from 'rxjs';\n\nimport type { DataSource } from '../models/schema.model';\nimport { interpolateTemplate } from '../utils/template-interpolator';\nimport { getSchema } from '../registry/schema-catalog';\nimport { ApiService } from './api.service';\n\n/** Fila cruda de un listado: el motor no impone forma a las columnas. */\nexport type SourceRow = Record<string, unknown>;\n\n/**\n * Cuánto se reutiliza una respuesta pedida igual (F8 · R6.5).\n *\n * Un panel de administración lee mucho y escribe poco: medio minuto de\n * frescura cubre un recorrido por varios formularios sin repetir la misma\n * vuelta. Es una decisión de UX, no de contrato — `invalidate()` la salta\n * cuando el usuario acaba de crear lo que la fuente lista.\n */\nconst TTL_MS = 30_000;\n\n/** Techo de claves cacheadas: un Map sin límite es una fuga en una sesión larga. */\nconst MAX_CLAVES = 100;\n\n/**\n * `source.params` con cada `{campo}` resuelto contra `ctx`.\n *\n * - Un valor que se resuelve **vacío se OMITE** en vez de mandar `''`: el\n * back distingue «parámetro ausente» (fail-closed ⇒ sin filas) de un\n * `eq ''` que podría cruzarse con filas realmente vacías.\n * - Un parámetro sin marcador `{}` es literal y viaja tal cual.\n */\nexport function interpolateParams(\n params: Record<string, string> | undefined,\n ctx?: Record<string, unknown>,\n): Record<string, string> {\n const out: Record<string, string> = {};\n if (params === undefined) return out;\n for (const name of Object.keys(params)) {\n const raw = params[name];\n const value = interpolateTemplate(raw, ctx ?? {});\n if (value !== '') out[name] = value;\n }\n return out;\n}\n\n/**\n * Clave de caché de una fuente: `resource|view|params` (F8 · R6.5).\n *\n * Los parámetros van **resueltos** y ordenados, así que dos fuentes que\n * terminan pidiendo lo mismo comparten entrada, y un `{campo}` que cambia\n * es otra entrada. Pura: es también el valor que `resource({ params })` de\n * Angular compara para decidir si vuelve a cargar.\n */\nexport function dataSourceKey(source: DataSource, ctx?: Record<string, unknown>): string {\n const params = interpolateParams(source.params, ctx);\n const names = Object.keys(params).sort();\n const query = names\n .map((name) => `${encodeURIComponent(name)}=${encodeURIComponent(params[name])}`)\n .join('&');\n return `${source.resource}|${source.view ?? ''}|${query}`;\n}\n\n/**\n * Fetcher único de `source` (F8 · R6.5): relations, selects y widgets del\n * panel piden sus filas ACÁ y no cada uno desde su componente.\n *\n * - **Caché por `resource+view+params`** con TTL e invalidación explícita —\n * es la pieza que evita que seis widgets del panel disparen seis vueltas\n * iguales a la misma vista.\n * - **Deduplicación de vuelta en vuelo**: dos consumidores que pidan la misma\n * clave en el mismo ciclo comparten la promesa (no la respuesta, la vuelta).\n * - Un error **no queda cacheado**: se borra la entrada para que la recarga\n * del consumidor vuelva a intentarlo en vez de devolver siempre la misma\n * rechazada.\n */\n@Service()\nexport class DataSourceService {\n private readonly api = inject(ApiService);\n\n private readonly cache = new Map<string, { promise: Promise<SourceRow[]>; at: number }>();\n\n /**\n * Filas de la fuente declarada.\n *\n * `fresh` salta la caché (recarga tras una escritura); `ctx` sólo se usa\n * para resolver `{campo}` en `params` y no cambia la forma de la respuesta.\n */\n async rows(\n source: DataSource,\n ctx?: Record<string, unknown>,\n fresh = false,\n ): Promise<SourceRow[]> {\n const key = dataSourceKey(source, ctx);\n if (!fresh) {\n const hit = this.cache.get(key);\n if (hit !== undefined && Date.now() - hit.at < TTL_MS) return hit.promise;\n }\n const promise = this.fetch(source, ctx).catch((error: unknown) => {\n this.cache.delete(key);\n throw error;\n });\n this.cache.set(key, { promise, at: Date.now() });\n if (this.cache.size > MAX_CLAVES) {\n // El Map conserva el orden de inserción: sale la más vieja.\n const oldest = this.cache.keys().next();\n if (!oldest.done) this.cache.delete(oldest.value);\n }\n return promise;\n }\n\n /**\n * Vacía las filas ya pedidas. Sin argumento, todas; con un `resourceId`,\n * sólo las de ese recurso (lo que acaba de crear el drawer de relación).\n */\n invalidate(resourceId?: string): void {\n if (resourceId === undefined) {\n this.cache.clear();\n return;\n }\n const prefix = `${resourceId}|`;\n for (const key of [...this.cache.keys()]) {\n if (key.startsWith(prefix)) this.cache.delete(key);\n }\n }\n\n private async fetch(source: DataSource, ctx?: Record<string, unknown>): Promise<SourceRow[]> {\n const target = getSchema(source.resource);\n if (!target) {\n // Un id que ni siquiera existe en el registry es error de\n // configuración, no de red: el consumidor lo pinta como «no se\n // pudieron cargar» con este texto.\n throw new Error(`Recurso desconocido: ${source.resource}`);\n }\n const payload: Record<string, unknown> = {};\n if (source.view !== undefined && source.view !== '') payload['view'] = source.view;\n const params = interpolateParams(source.params, ctx);\n if (Object.keys(params).length > 0) payload['params'] = params;\n const rows = await firstValueFrom(this.api.list<SourceRow>(target.endpoint, payload));\n return Array.isArray(rows) ? rows : [];\n }\n}\n"],"mappings":";;;;;;AAmBA,MAAM,SAAS;AAGf,MAAM,aAAa;AAUnB,SAAgB,kBACd,QACA,KAA6B;CAE7B,MAAM,MAA8B,CAAA;CACpC,IAAI,WAAW,QAAW,OAAO;CACjC,KAAK,MAAM,QAAQ,OAAO,KAAK,MAAM,GAAG;EACtC,MAAM,MAAM,OAAO;EACnB,MAAM,QAAQ,oBAAoB,KAAK,OAAO,CAAA,CAAE;EAChD,IAAI,UAAU,IAAI,IAAI,QAAQ;CAChC;CACA,OAAO;AACT;AAUA,SAAgB,cAAc,QAAoB,KAA6B;CAC7E,MAAM,SAAS,kBAAkB,OAAO,QAAQ,GAAG;CAEnD,MAAM,QADQ,OAAO,KAAK,MAAM,CAAC,CAAC,KACpB,CAAA,CACX,KAAK,SAAS,GAAG,mBAAmB,IAAI,EAAC,GAAI,mBAAmB,OAAO,KAAK,GAAG,CAAC,CAChF,KAAK,GAAG;CACX,OAAO,GAAG,OAAO,SAAQ,GAAI,OAAO,QAAQ,GAAE,GAAI;AACpD;AAgBA,IAAa,oBAAb,MAAa,kBAAiB;CACX,MAAM,OAAO,UAAU;CAEvB,wBAAQ,IAAI,IAAG;CAQhC,MAAM,KACJ,QACA,KACA,QAAQ,OAAK;EAEb,MAAM,MAAM,cAAc,QAAQ,GAAG;EACrC,IAAI,CAAC,OAAO;GACV,MAAM,MAAM,KAAK,MAAM,IAAI,GAAG;GAC9B,IAAI,QAAQ,UAAa,KAAK,IAAG,IAAK,IAAI,KAAK,QAAQ,OAAO,IAAI;EACpE;EACA,MAAM,UAAU,KAAK,MAAM,QAAQ,GAAG,CAAC,CAAC,OAAO,UAAkB;GAC/D,KAAK,MAAM,OAAO,GAAG;GACrB,MAAM;EACR,CAAC;EACD,KAAK,MAAM,IAAI,KAAK;GAAE;GAAS,IAAI,KAAK,IAAG;EAAE,CAAE;EAC/C,IAAI,KAAK,MAAM,OAAO,YAAY;GAEhC,MAAM,SAAS,KAAK,MAAM,KAAI,CAAE,CAAC,KAAI;GACrC,IAAI,CAAC,OAAO,MAAM,KAAK,MAAM,OAAO,OAAO,KAAK;EAClD;EACA,OAAO;CACT;CAMA,WAAW,YAAmB;EAC5B,IAAI,eAAe,QAAW;GAC5B,KAAK,MAAM,MAAK;GAChB;EACF;EACA,MAAM,SAAS,GAAG,WAAU;EAC5B,KAAK,MAAM,OAAO,CAAC,GAAG,KAAK,MAAM,KAAI,CAAE,GACrC,IAAI,IAAI,WAAW,MAAM,GAAG,KAAK,MAAM,OAAO,GAAG;CAErD;CAEQ,MAAM,MAAM,QAAoB,KAA6B;EACnE,MAAM,SAAS,UAAU,OAAO,QAAQ;EACxC,IAAI,CAAC,QAIH,MAAM,IAAI,MAAM,wBAAwB,OAAO,UAAU;EAE3D,MAAM,UAAmC,CAAA;EACzC,IAAI,OAAO,SAAS,UAAa,OAAO,SAAS,IAAI,QAAQ,UAAU,OAAO;EAC9E,MAAM,SAAS,kBAAkB,OAAO,QAAQ,GAAG;EACnD,IAAI,OAAO,KAAK,MAAM,CAAC,CAAC,SAAS,GAAG,QAAQ,YAAY;EACxD,MAAM,OAAO,MAAM,eAAe,KAAK,IAAI,KAAgB,OAAO,UAAU,OAAO,CAAC;EACpF,OAAO,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAA;CACtC;CA/DW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAiB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAjB,OAAA,QAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;CAAiB,CAAA;;AAAjB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAiB,YAAA,CAAA,EAD7B,MAAA,QAAA,CAAA"}
@@ -0,0 +1,107 @@
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, input } from "@angular/core";
5
+ import { FormField } from "@angular/forms/signals";
6
+ var FieldDate = class FieldDate {
7
+ field = input.required(...ngDevMode ? [{ debugName: "field" }] : /* istanbul ignore next */ []);
8
+ tree = input.required(...ngDevMode ? [{ debugName: "tree" }] : /* istanbul ignore next */ []);
9
+ node = computed(() => childTree(this.tree(), this.field().key), ...ngDevMode ? [{ debugName: "node" }] : /* istanbul ignore next */ []);
10
+ state = computed(() => this.node()(), ...ngDevMode ? [{ debugName: "state" }] : /* istanbul ignore next */ []);
11
+ static ɵfac = i0.ɵɵngDeclareFactory({
12
+ minVersion: "12.0.0",
13
+ version: "22.2.3",
14
+ ngImport: i0,
15
+ type: FieldDate,
16
+ deps: [],
17
+ target: i0.ɵɵFactoryTarget.Component
18
+ });
19
+ static ɵcmp = i0.ɵɵngDeclareComponent({
20
+ minVersion: "17.1.0",
21
+ version: "22.2.3",
22
+ type: FieldDate,
23
+ isStandalone: true,
24
+ selector: "app-field-date",
25
+ inputs: {
26
+ field: {
27
+ classPropertyName: "field",
28
+ publicName: "field",
29
+ isSignal: true,
30
+ isRequired: true,
31
+ transformFunction: null
32
+ },
33
+ tree: {
34
+ classPropertyName: "tree",
35
+ publicName: "tree",
36
+ isSignal: true,
37
+ isRequired: true,
38
+ transformFunction: null
39
+ }
40
+ },
41
+ ngImport: i0,
42
+ template: `
43
+ <input
44
+ type="date"
45
+ class="field-input"
46
+ [id]="state().name()"
47
+ [formField]="node()"
48
+ [placeholder]="field().placeholder ?? ''"
49
+ />
50
+ `,
51
+ isInline: true,
52
+ dependencies: [{
53
+ kind: "directive",
54
+ type: FieldAria,
55
+ selector: "input[id], select[id], textarea[id], output[id]"
56
+ }, {
57
+ kind: "directive",
58
+ type: FormField,
59
+ selector: "[formField]",
60
+ inputs: ["formField"],
61
+ exportAs: ["formField"]
62
+ }]
63
+ });
64
+ };
65
+ i0.ɵɵngDeclareClassMetadata({
66
+ minVersion: "12.0.0",
67
+ version: "22.2.3",
68
+ ngImport: i0,
69
+ type: FieldDate,
70
+ decorators: [{
71
+ type: Component,
72
+ args: [{
73
+ selector: "app-field-date",
74
+ imports: [FieldAria, FormField],
75
+ template: `
76
+ <input
77
+ type="date"
78
+ class="field-input"
79
+ [id]="state().name()"
80
+ [formField]="node()"
81
+ [placeholder]="field().placeholder ?? ''"
82
+ />
83
+ `
84
+ }]
85
+ }],
86
+ propDecorators: {
87
+ field: [{
88
+ type: i0.Input,
89
+ args: [{
90
+ isSignal: true,
91
+ alias: "field",
92
+ required: true
93
+ }]
94
+ }],
95
+ tree: [{
96
+ type: i0.Input,
97
+ args: [{
98
+ isSignal: true,
99
+ alias: "tree",
100
+ required: true
101
+ }]
102
+ }]
103
+ }
104
+ });
105
+ export { FieldDate };
106
+
107
+ //# sourceMappingURL=tinya-code-gas-admin-ui-date-1SJGXZrd.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tinya-code-gas-admin-ui-date-1SJGXZrd.mjs","names":[],"sources":["../../../projects/gas-admin-ui/src/lib/fields/date/date.ts"],"sourcesContent":["import { Component, computed, input } from '@angular/core';\nimport { FormField } from '@angular/forms/signals';\n\nimport type { DateField } from '../../core/models/schema.model';\nimport { FieldAria } from '../field-aria';\nimport { childTree, type RootTree } from '../field-node';\n\n/**\n * Selector de fecha ISO `YYYY-MM-DD` (base.md §5.1).\n *\n * `min`/`max` del schema se validan con reglas propias en\n * `pages/form-view/form-schema.ts`: `minDate`/`maxDate` de Signal Forms\n * exigen valores `Date` y este modelo guarda strings. `FormField` solo setea\n * los atributos nativos `min`/`max` cuando existen las reglas `min()`/`max()`\n * (que aplican a números).\n */\n@Component({\n selector: 'app-field-date',\n imports: [FieldAria, FormField],\n template: `\n <input\n type=\"date\"\n class=\"field-input\"\n [id]=\"state().name()\"\n [formField]=\"node()\"\n [placeholder]=\"field().placeholder ?? ''\"\n />\n `,\n})\nexport class FieldDate {\n readonly field = input.required<DateField>();\n readonly tree = input.required<RootTree>();\n\n protected readonly node = computed(() => childTree<string>(this.tree(), this.field().key));\n protected readonly state = computed(() => this.node()());\n}\n"],"mappings":";;;;;AA6BA,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;CAEvB,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;CAL7C,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;EAAA;EAAA,UAAA;EAAA,UAVV;;;;;;;;;EAQT,UAAA;EAAA,cAAA,CAAA;GAAA,MAAA;GAAA,MATS;GAAS,UAAA;EAAA,GAAA;GAAA,MAAA;GAAA,MAAE;GAAS,UAAA;GAAA,QAAA,CAAA,WAAA;GAAA,UAAA,CAAA,WAAA;EAAA,CAAA;CAAA,CAAA;;AAWnB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAS,YAAA,CAAA;EAbrB,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,SAAS,CAAC,WAAW,SAAS;GAC9B,UAAU;;;;;;;;;EASX,CAAA"}
@@ -0,0 +1,140 @@
1
+ import { t as __exportAll } from "./tinya-code-gas-admin-ui-rolldown-runtime-DpJrqANO.mjs";
2
+ import { t as Badge } from "./tinya-code-gas-admin-ui-badge-EeCA_l-o.mjs";
3
+ import * as i0 from "@angular/core";
4
+ import { Component, computed, input } from "@angular/core";
5
+ var display_badge_exports = /* @__PURE__ */ __exportAll({
6
+ FieldDisplayBadge: () => FieldDisplayBadge,
7
+ resolveBadgeKind: () => resolveBadgeKind
8
+ });
9
+ var FieldDisplayBadge = class FieldDisplayBadge {
10
+ field = input.required(...ngDevMode ? [{ debugName: "field" }] : /* istanbul ignore next */ []);
11
+ value = input(null, ...ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []);
12
+ chip = input(false, ...ngDevMode ? [{ debugName: "chip" }] : /* istanbul ignore next */ []);
13
+ label = computed(() => {
14
+ if (this.field().type === "boolean") return this.value() ? "Sí" : "No";
15
+ const encontrada = (this.field().options ?? []).find((o) => o.value === String(this.value()));
16
+ return encontrada ? encontrada.label : String(this.value());
17
+ }, ...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
18
+ kind = computed(() => {
19
+ if (this.field().type === "boolean") return this.value() ? "success" : "neutral";
20
+ return resolveBadgeKind(String(this.value()));
21
+ }, ...ngDevMode ? [{ debugName: "kind" }] : /* istanbul ignore next */ []);
22
+ static ɵfac = i0.ɵɵngDeclareFactory({
23
+ minVersion: "12.0.0",
24
+ version: "22.2.3",
25
+ ngImport: i0,
26
+ type: FieldDisplayBadge,
27
+ deps: [],
28
+ target: i0.ɵɵFactoryTarget.Component
29
+ });
30
+ static ɵcmp = i0.ɵɵngDeclareComponent({
31
+ minVersion: "17.1.0",
32
+ version: "22.2.3",
33
+ type: FieldDisplayBadge,
34
+ isStandalone: true,
35
+ selector: "app-field-display-badge",
36
+ inputs: {
37
+ field: {
38
+ classPropertyName: "field",
39
+ publicName: "field",
40
+ isSignal: true,
41
+ isRequired: true,
42
+ transformFunction: null
43
+ },
44
+ value: {
45
+ classPropertyName: "value",
46
+ publicName: "value",
47
+ isSignal: true,
48
+ isRequired: false,
49
+ transformFunction: null
50
+ },
51
+ chip: {
52
+ classPropertyName: "chip",
53
+ publicName: "chip",
54
+ isSignal: true,
55
+ isRequired: false,
56
+ transformFunction: null
57
+ }
58
+ },
59
+ ngImport: i0,
60
+ template: `<app-badge [label]="label()" [kind]="kind()" />`,
61
+ isInline: true,
62
+ dependencies: [{
63
+ kind: "component",
64
+ type: Badge,
65
+ selector: "app-badge",
66
+ inputs: ["label", "kind"]
67
+ }]
68
+ });
69
+ };
70
+ i0.ɵɵngDeclareClassMetadata({
71
+ minVersion: "12.0.0",
72
+ version: "22.2.3",
73
+ ngImport: i0,
74
+ type: FieldDisplayBadge,
75
+ decorators: [{
76
+ type: Component,
77
+ args: [{
78
+ selector: "app-field-display-badge",
79
+ imports: [Badge],
80
+ template: `<app-badge [label]="label()" [kind]="kind()" />`
81
+ }]
82
+ }],
83
+ propDecorators: {
84
+ field: [{
85
+ type: i0.Input,
86
+ args: [{
87
+ isSignal: true,
88
+ alias: "field",
89
+ required: true
90
+ }]
91
+ }],
92
+ value: [{
93
+ type: i0.Input,
94
+ args: [{
95
+ isSignal: true,
96
+ alias: "value",
97
+ required: false
98
+ }]
99
+ }],
100
+ chip: [{
101
+ type: i0.Input,
102
+ args: [{
103
+ isSignal: true,
104
+ alias: "chip",
105
+ required: false
106
+ }]
107
+ }]
108
+ }
109
+ });
110
+ function resolveBadgeKind(valor) {
111
+ const upper = String(valor).toUpperCase();
112
+ if ([
113
+ "PENDIENTE",
114
+ "WAITING",
115
+ "EN_PROCESO",
116
+ "PROCESSING"
117
+ ].includes(upper)) return "warning";
118
+ if ([
119
+ "ENTREGADO",
120
+ "DELIVERED",
121
+ "ACTIVA",
122
+ "ACTIVE",
123
+ "COMPLETADO",
124
+ "SUCCESS",
125
+ "SI",
126
+ "SÍ"
127
+ ].includes(upper)) return "success";
128
+ if ([
129
+ "CANCELADO",
130
+ "CANCELLED",
131
+ "REVOCADA",
132
+ "REVOKED",
133
+ "ERROR",
134
+ "NO"
135
+ ].includes(upper)) return "danger";
136
+ return "neutral";
137
+ }
138
+ export { resolveBadgeKind as n, display_badge_exports as t };
139
+
140
+ //# sourceMappingURL=tinya-code-gas-admin-ui-display-badge-fwk6sDU7.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tinya-code-gas-admin-ui-display-badge-fwk6sDU7.mjs","names":[],"sources":["../../../projects/gas-admin-ui/src/lib/fields/display/display-badge.ts"],"sourcesContent":["import { Component, computed, input } from '@angular/core';\n\nimport { Badge, type BadgeKind } from '../../shared/components/badge/badge';\nimport type { FieldSchema, SelectField } from '../../core/models/schema.model';\n\n/**\n * Display por defecto de `boolean` y `select` (R4.1 · modo `display`).\n *\n * Absorbe `formatValue` + `resolveBadgeKind` de `detail-view` (R4.2): los\n * estados siguen clasificándose con el mismo vocabulario —\n * `PENDIENTE/WAITING/EN_PROCESO/PROCESSING` en `warning`,\n * `ENTREGADO/DELIVERED/…` en `success`, `CANCELADO/REVOCADA/ERROR/…` en\n * `danger` y el resto en `neutral` — porque es el criterio que el operador\n * ya reconoce en la cabecera de la ficha.\n *\n * `boolean` pinta `Sí`/`No` con `success`/`neutral` (la paridad de R4.2);\n * los `trueLabel`/`falseLabel` del schema siguen siendo cosa del control de\n * **edición**, y de la columna de lista (R4.3), que sí los usa.\n */\n@Component({\n selector: 'app-field-display-badge',\n imports: [Badge],\n template: `<app-badge [label]=\"label()\" [kind]=\"kind()\" />`,\n})\nexport class FieldDisplayBadge {\n readonly field = input.required<FieldSchema>();\n readonly value = input<unknown>(null);\n /** El chip de la cabecera ya es este componente: se ignora. */\n readonly chip = input(false);\n\n protected readonly label = computed(() => {\n if (this.field().type === 'boolean') {\n return this.value() ? 'Sí' : 'No';\n }\n const opciones = (this.field() as SelectField).options ?? [];\n const encontrada = opciones.find((o) => o.value === String(this.value()));\n return encontrada ? encontrada.label : String(this.value());\n });\n\n protected readonly kind = computed<BadgeKind>(() => {\n if (this.field().type === 'boolean') {\n return this.value() ? 'success' : 'neutral';\n }\n return resolveBadgeKind(String(this.value()));\n });\n}\n\n/**\n * Clasificación de estados, común al display de detalle (acá) y al\n * timeline del historial (`display-list`). Exportada para que R4.3 pueda\n * reusarla si la columna de lista decide alinearse con este criterio.\n */\nexport function resolveBadgeKind(valor: string): BadgeKind {\n const upper = String(valor).toUpperCase();\n if (['PENDIENTE', 'WAITING', 'EN_PROCESO', 'PROCESSING'].includes(upper)) return 'warning';\n if (\n ['ENTREGADO', 'DELIVERED', 'ACTIVA', 'ACTIVE', 'COMPLETADO', 'SUCCESS', 'SI', 'SÍ'].includes(\n upper,\n )\n )\n return 'success';\n if (['CANCELADO', 'CANCELLED', 'REVOCADA', 'REVOKED', 'ERROR', 'NO'].includes(upper))\n return 'danger';\n return 'neutral';\n}\n"],"mappings":";;;;;;;;AAwBA,IAAa,oBAAb,MAAa,kBAAiB;CACnB,QAAQ,MAAM,SAAuB,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CACrC,QAAQ,MAAe,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAE5B,OAAO,MAAM,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAET,QAAQ,eAAc;EACvC,IAAI,KAAK,MAAK,CAAE,CAAC,SAAS,WACxB,OAAO,KAAK,MAAK,IAAK,OAAO;EAG/B,MAAM,cADY,KAAK,MAAK,CAAkB,CAAC,WAAW,CAAA,EACvC,CAAS,MAAM,MAAM,EAAE,UAAU,OAAO,KAAK,MAAK,CAAE,CAAC;EACxE,OAAO,aAAa,WAAW,QAAQ,OAAO,KAAK,MAAK,CAAE;CAC5D,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAEiB,OAAO,eAAyB;EACjD,IAAI,KAAK,MAAK,CAAE,CAAC,SAAS,WACxB,OAAO,KAAK,MAAK,IAAK,YAAY;EAEpC,OAAO,iBAAiB,OAAO,KAAK,MAAK,CAAE,CAAC;CAC9C,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CApBS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAiB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAjB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAiB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;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;EAAA;EAAA,UAAA;EAAA,UAFlB;EAAiD,UAAA;EAAA,cAAA,CAAA;GAAA,MAAA;GAAA,MADjD;GAAK,UAAA;GAAA,QAAA,CAAA,SAAA,MAAA;EAAA,CAAA;CAAA,CAAA;;AAGJ,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAiB,YAAA,CAAA;EAL7B,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,SAAS,CAAC,KAAK;GACf,UAAU;EACX,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BD,SAAgB,iBAAiB,OAAa;CAC5C,MAAM,QAAQ,OAAO,KAAK,CAAC,CAAC,YAAW;CACvC,IAAI;EAAC;EAAa;EAAW;EAAc;CAAY,CAAC,CAAC,SAAS,KAAK,GAAG,OAAO;CACjF,IACE;EAAC;EAAa;EAAa;EAAU;EAAU;EAAc;EAAW;EAAM;CAAI,CAAC,CAAC,SAClF,KAAK,GAGP,OAAO;CACT,IAAI;EAAC;EAAa;EAAa;EAAY;EAAW;EAAS;CAAI,CAAC,CAAC,SAAS,KAAK,GACjF,OAAO;CACT,OAAO;AACT"}
@@ -0,0 +1,119 @@
1
+ import { t as Badge } from "./tinya-code-gas-admin-ui-badge-EeCA_l-o.mjs";
2
+ import * as i0 from "@angular/core";
3
+ import { Component, computed, input } from "@angular/core";
4
+ const FORMATO_FECHA = new Intl.DateTimeFormat("es-PE", {
5
+ dateStyle: "medium",
6
+ timeZone: "UTC"
7
+ });
8
+ var FieldDisplayDate = class FieldDisplayDate {
9
+ field = input.required(...ngDevMode ? [{ debugName: "field" }] : /* istanbul ignore next */ []);
10
+ value = input(null, ...ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []);
11
+ chip = input(false, ...ngDevMode ? [{ debugName: "chip" }] : /* istanbul ignore next */ []);
12
+ texto = computed(() => {
13
+ const d = new Date(String(this.value()));
14
+ if (Number.isNaN(d.getTime())) return String(this.value());
15
+ return FORMATO_FECHA.format(d);
16
+ }, ...ngDevMode ? [{ debugName: "texto" }] : /* istanbul ignore next */ []);
17
+ static ɵfac = i0.ɵɵngDeclareFactory({
18
+ minVersion: "12.0.0",
19
+ version: "22.2.3",
20
+ ngImport: i0,
21
+ type: FieldDisplayDate,
22
+ deps: [],
23
+ target: i0.ɵɵFactoryTarget.Component
24
+ });
25
+ static ɵcmp = i0.ɵɵngDeclareComponent({
26
+ minVersion: "17.0.0",
27
+ version: "22.2.3",
28
+ type: FieldDisplayDate,
29
+ isStandalone: true,
30
+ selector: "app-field-display-date",
31
+ inputs: {
32
+ field: {
33
+ classPropertyName: "field",
34
+ publicName: "field",
35
+ isSignal: true,
36
+ isRequired: true,
37
+ transformFunction: null
38
+ },
39
+ value: {
40
+ classPropertyName: "value",
41
+ publicName: "value",
42
+ isSignal: true,
43
+ isRequired: false,
44
+ transformFunction: null
45
+ },
46
+ chip: {
47
+ classPropertyName: "chip",
48
+ publicName: "chip",
49
+ isSignal: true,
50
+ isRequired: false,
51
+ transformFunction: null
52
+ }
53
+ },
54
+ ngImport: i0,
55
+ template: `
56
+ @if (chip()) {
57
+ <app-badge [label]="texto()" />
58
+ } @else {
59
+ {{ texto() }}
60
+ }
61
+ `,
62
+ isInline: true,
63
+ dependencies: [{
64
+ kind: "component",
65
+ type: Badge,
66
+ selector: "app-badge",
67
+ inputs: ["label", "kind"]
68
+ }]
69
+ });
70
+ };
71
+ i0.ɵɵngDeclareClassMetadata({
72
+ minVersion: "12.0.0",
73
+ version: "22.2.3",
74
+ ngImport: i0,
75
+ type: FieldDisplayDate,
76
+ decorators: [{
77
+ type: Component,
78
+ args: [{
79
+ selector: "app-field-display-date",
80
+ imports: [Badge],
81
+ template: `
82
+ @if (chip()) {
83
+ <app-badge [label]="texto()" />
84
+ } @else {
85
+ {{ texto() }}
86
+ }
87
+ `
88
+ }]
89
+ }],
90
+ propDecorators: {
91
+ field: [{
92
+ type: i0.Input,
93
+ args: [{
94
+ isSignal: true,
95
+ alias: "field",
96
+ required: true
97
+ }]
98
+ }],
99
+ value: [{
100
+ type: i0.Input,
101
+ args: [{
102
+ isSignal: true,
103
+ alias: "value",
104
+ required: false
105
+ }]
106
+ }],
107
+ chip: [{
108
+ type: i0.Input,
109
+ args: [{
110
+ isSignal: true,
111
+ alias: "chip",
112
+ required: false
113
+ }]
114
+ }]
115
+ }
116
+ });
117
+ export { FieldDisplayDate };
118
+
119
+ //# sourceMappingURL=tinya-code-gas-admin-ui-display-date-D7zLiDiG.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tinya-code-gas-admin-ui-display-date-D7zLiDiG.mjs","names":[],"sources":["../../../projects/gas-admin-ui/src/lib/fields/display/display-date.ts"],"sourcesContent":["import { Component, computed, input } from '@angular/core';\n\nimport { Badge } from '../../shared/components/badge/badge';\nimport type { FieldSchema } from '../../core/models/schema.model';\n\nconst FORMATO_FECHA = new Intl.DateTimeFormat('es-PE', { dateStyle: 'medium', timeZone: 'UTC' });\n\n/**\n * Display por defecto de `date` (R4.1 · modo `display`).\n *\n * Misma fórmula que `formatValue` de `detail-view` antes de R4.2: `es-PE`,\n * `dateStyle: 'medium'`, **UTC** para que la fecha no se corra un día según\n * el huso de quien abra la ficha, y texto crudo si no es parseable.\n */\n@Component({\n selector: 'app-field-display-date',\n imports: [Badge],\n template: `\n @if (chip()) {\n <app-badge [label]=\"texto()\" />\n } @else {\n {{ texto() }}\n }\n `,\n})\nexport class FieldDisplayDate {\n readonly field = input.required<FieldSchema>();\n readonly value = input<unknown>(null);\n /** `true` en la cabecera: la fecha se pinta como chip compacto. */\n readonly chip = input(false);\n\n protected readonly texto = computed(() => {\n const d = new Date(String(this.value()));\n if (Number.isNaN(d.getTime())) {\n return String(this.value());\n }\n return FORMATO_FECHA.format(d);\n });\n}\n"],"mappings":";;;AAKA,MAAM,gBAAgB,IAAI,KAAK,eAAe,SAAS;CAAE,WAAW;CAAU,UAAU;AAAK,CAAE;AAoB/F,IAAa,mBAAb,MAAa,iBAAgB;CAClB,QAAQ,MAAM,SAAuB,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CACrC,QAAQ,MAAe,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAE5B,OAAO,MAAM,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAET,QAAQ,eAAc;EACvC,MAAM,IAAI,IAAI,KAAK,OAAO,KAAK,MAAK,CAAE,CAAC;EACvC,IAAI,OAAO,MAAM,EAAE,QAAO,CAAE,GAC1B,OAAO,OAAO,KAAK,MAAK,CAAE;EAE5B,OAAO,cAAc,OAAO,CAAC;CAC/B,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAZS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAgB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAhB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAgB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;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;EAAA;EAAA,UAAA;EAAA,UARjB;;;;;;;EAMT,UAAA;EAAA,cAAA,CAAA;GAAA,MAAA;GAAA,MAPS;GAAK,UAAA;GAAA,QAAA,CAAA,SAAA,MAAA;EAAA,CAAA;CAAA,CAAA;;AASJ,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAgB,YAAA,CAAA;EAX5B,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,SAAS,CAAC,KAAK;GACf,UAAU;;;;;;;EAOX,CAAA"}