@masterkeymaterial/ui 0.0.1 → 0.0.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 (141) hide show
  1. package/README.md +9 -59
  2. package/ng-package.json +10 -0
  3. package/package.json +5 -14
  4. package/src/elements/ui-button/ui-button.css +229 -0
  5. package/src/elements/ui-button/ui-button.html +12 -0
  6. package/src/elements/ui-button/ui-button.ts +133 -0
  7. package/src/elements/ui-check-box/ui-check-box.css +66 -0
  8. package/src/elements/ui-check-box/ui-check-box.html +5 -0
  9. package/src/elements/ui-check-box/ui-check-box.ts +65 -0
  10. package/src/elements/ui-chip/ui-chip.css +24 -0
  11. package/src/elements/ui-chip/ui-chip.html +3 -0
  12. package/src/elements/ui-chip/ui-chip.ts +25 -0
  13. package/src/elements/ui-drop-zone/ui-drop-zone.css +91 -0
  14. package/src/elements/ui-drop-zone/ui-drop-zone.html +8 -0
  15. package/src/elements/ui-drop-zone/ui-drop-zone.ts +153 -0
  16. package/src/elements/ui-file-list/ui-file-list.css +43 -0
  17. package/src/elements/ui-file-list/ui-file-list.html +17 -0
  18. package/src/elements/ui-file-list/ui-file-list.ts +22 -0
  19. package/src/elements/ui-list-errors/ui-list-errors.css +30 -0
  20. package/src/elements/ui-list-errors/ui-list-errors.html +10 -0
  21. package/src/elements/ui-list-errors/ui-list-errors.ts +14 -0
  22. package/src/elements/ui-loading/ui-loading.css +13 -0
  23. package/src/elements/ui-loading/ui-loading.html +1 -0
  24. package/src/elements/ui-loading/ui-loading.ts +10 -0
  25. package/src/elements/ui-menu/ui-menu.css +69 -0
  26. package/src/elements/ui-menu/ui-menu.html +20 -0
  27. package/src/elements/ui-menu/ui-menu.ts +267 -0
  28. package/src/elements/ui-procurar/ui-procurar.css +48 -0
  29. package/src/elements/ui-procurar/ui-procurar.html +14 -0
  30. package/src/elements/ui-procurar/ui-procurar.ts +82 -0
  31. package/src/elements/ui-progress/ui-progress.css +0 -0
  32. package/src/elements/ui-progress/ui-progress.html +1 -0
  33. package/src/elements/ui-progress/ui-progress.ts +15 -0
  34. package/src/elements/ui-select/ui-select.css +211 -0
  35. package/src/elements/ui-select/ui-select.html +46 -0
  36. package/src/elements/ui-select/ui-select.ts +482 -0
  37. package/src/elements/ui-slide/ui-slide.css +75 -0
  38. package/src/elements/ui-slide/ui-slide.html +7 -0
  39. package/src/elements/ui-slide/ui-slide.ts +61 -0
  40. package/src/fields/Base/BaseFieldsForm/BaseFieldsForm.component.ts +113 -0
  41. package/src/fields/Base/BaseFieldsValues/BaseFieldsValues.ts +112 -0
  42. package/src/fields/Formulario/Formulario.ts +1056 -0
  43. package/src/fields/Formulario/form-action/form-action.css +98 -0
  44. package/src/fields/Formulario/form-action/form-action.html +75 -0
  45. package/src/fields/Formulario/form-action/form-action.ts +187 -0
  46. package/src/fields/Formulario/form-controls/form-controls.css +108 -0
  47. package/src/fields/Formulario/form-controls/form-controls.html +105 -0
  48. package/src/fields/Formulario/form-controls/form-controls.ts +122 -0
  49. package/src/fields/Formulario/form-fase/form-fase.css +84 -0
  50. package/src/fields/Formulario/form-fase/form-fase.html +24 -0
  51. package/src/fields/Formulario/form-fase/form-fase.ts +157 -0
  52. package/src/fields/Formulario/form-filter/form-filter.css +50 -0
  53. package/src/fields/Formulario/form-filter/form-filter.html +25 -0
  54. package/src/fields/Formulario/form-filter/form-filter.ts +53 -0
  55. package/src/fields/Formulario/form-no-action/form-no-action.css +32 -0
  56. package/src/fields/Formulario/form-no-action/form-no-action.html +12 -0
  57. package/src/fields/Formulario/form-no-action/form-no-action.ts +21 -0
  58. package/src/fields/Formulario/formated-values/formated-values.css +104 -0
  59. package/src/fields/Formulario/formated-values/formated-values.html +15 -0
  60. package/src/fields/Formulario/formated-values/formated-values.ts +186 -0
  61. package/src/fields/Formulario/single-values/single-values.css +88 -0
  62. package/src/fields/Formulario/single-values/single-values.html +11 -0
  63. package/src/fields/Formulario/single-values/single-values.ts +65 -0
  64. package/src/fields/autocomplete/autocomplete.css +94 -0
  65. package/src/fields/autocomplete/autocomplete.html +38 -0
  66. package/src/fields/autocomplete/autocomplete.ts +294 -0
  67. package/src/fields/button/button.css +7 -0
  68. package/src/fields/button/button.html +19 -0
  69. package/src/fields/button/button.ts +38 -0
  70. package/src/fields/checkbox/checkbox.css +27 -0
  71. package/src/fields/checkbox/checkbox.html +20 -0
  72. package/src/fields/checkbox/checkbox.ts +44 -0
  73. package/src/fields/color/CirculoColorido/circulocolorido.css +50 -0
  74. package/src/fields/color/CirculoColorido/circulocolorido.html +8 -0
  75. package/src/fields/color/CirculoColorido/circulocolorido.ts +24 -0
  76. package/src/fields/color/color.css +15 -0
  77. package/src/fields/color/color.html +24 -0
  78. package/src/fields/color/color.ts +47 -0
  79. package/src/fields/date/date.html +19 -0
  80. package/src/fields/date/date.ts +29 -0
  81. package/src/fields/datetime/datetime.html +19 -0
  82. package/src/fields/datetime/datetime.ts +29 -0
  83. package/src/fields/display/display.css +7 -0
  84. package/src/fields/display/display.html +20 -0
  85. package/src/fields/display/display.ts +43 -0
  86. package/src/fields/editor/editor.css +51 -0
  87. package/src/fields/editor/editor.html +37 -0
  88. package/src/fields/editor/editor.ts +218 -0
  89. package/src/fields/email/email.html +19 -0
  90. package/src/fields/email/email.ts +29 -0
  91. package/src/fields/fields.css +180 -0
  92. package/src/fields/generic/generic.html +3 -0
  93. package/src/fields/generic/generic.ts +91 -0
  94. package/src/fields/hidden/hidden.html +3 -0
  95. package/src/fields/hidden/hidden.ts +20 -0
  96. package/src/fields/icon/icon.css +19 -0
  97. package/src/fields/icon/icon.html +27 -0
  98. package/src/fields/icon/icon.ts +31 -0
  99. package/src/fields/multifactor/multifactor.css +21 -0
  100. package/src/fields/multifactor/multifactor.html +39 -0
  101. package/src/fields/multifactor/multifactor.ts +106 -0
  102. package/src/fields/multikv/multikv.css +43 -0
  103. package/src/fields/multikv/multikv.html +47 -0
  104. package/src/fields/multikv/multikv.ts +88 -0
  105. package/src/fields/multitext/multitext.css +36 -0
  106. package/src/fields/multitext/multitext.html +38 -0
  107. package/src/fields/multitext/multitext.ts +75 -0
  108. package/src/fields/number/number.html +20 -0
  109. package/src/fields/number/number.ts +35 -0
  110. package/src/fields/password/password.html +23 -0
  111. package/src/fields/password/password.ts +37 -0
  112. package/src/fields/search/search.css +0 -0
  113. package/src/fields/search/search.html +19 -0
  114. package/src/fields/search/search.ts +54 -0
  115. package/src/fields/select/select.css +15 -0
  116. package/src/fields/select/select.html +18 -0
  117. package/src/fields/select/select.ts +52 -0
  118. package/src/fields/slide/slide.css +27 -0
  119. package/src/fields/slide/slide.html +20 -0
  120. package/src/fields/slide/slide.ts +45 -0
  121. package/src/fields/text/text.html +19 -0
  122. package/src/fields/text/text.ts +30 -0
  123. package/src/fields/textarea/textarea.css +4 -0
  124. package/src/fields/textarea/textarea.html +20 -0
  125. package/src/fields/textarea/textarea.ts +31 -0
  126. package/src/fields/time/time.html +19 -0
  127. package/src/fields/time/time.ts +29 -0
  128. package/src/fields/upload/upload.css +24 -0
  129. package/src/fields/upload/upload.html +41 -0
  130. package/src/fields/upload/upload.ts +137 -0
  131. package/src/interfaces/interfaces.ts +61 -0
  132. package/src/public-api.ts +38 -0
  133. package/src/util/ClassOf.pipe.ts +11 -0
  134. package/src/util/JsonColorido.pipe.ts +11 -0
  135. package/src/util/util.ts +2151 -0
  136. package/tsconfig.lib.json +16 -0
  137. package/tsconfig.lib.prod.json +9 -0
  138. package/tsconfig.spec.json +13 -0
  139. package/fesm2022/masterkeymaterial-ui.mjs +0 -6457
  140. package/fesm2022/masterkeymaterial-ui.mjs.map +0 -1
  141. package/types/masterkeymaterial-ui.d.ts +0 -928
@@ -0,0 +1,186 @@
1
+ import { Component, computed, input, model } from '@angular/core';
2
+ import { LibUtil, LOG } from '../../../util/util';
3
+ import { IField, IFieldComponent } from '../Formulario';
4
+
5
+ export type IModeShowEntidade = "centro" | "cantos" | "esquerda" | "grid" | "wrap";
6
+
7
+ @Component({
8
+ selector: 'ui-formated-values',
9
+ templateUrl: './formated-values.html',
10
+ styleUrls: ['./formated-values.css'],
11
+ imports: [],
12
+ })
13
+ export class FormatedValues {
14
+
15
+ campos = input<IFieldComponent<any>[] | undefined>();
16
+ dados = input<any>();
17
+ modo = model<IModeShowEntidade>("centro");
18
+ especialKeys = input<string[] | undefined>();
19
+ ignoreKeys = input<string[] | undefined>([]);
20
+
21
+ camposFormatados = computed(() => {
22
+ let campos = this.campos();
23
+ let especialKeys = (this.especialKeys() ?? []).map(k => k.toLowerCase());
24
+
25
+ let listaDados = campos?.map(campo => {
26
+ let inputs: any = {};
27
+ // let isInner: boolean = this.getIsInner(campo, inputs);
28
+ let titulo = campo.titulo ?? campo.prop ?? "";
29
+ return {
30
+ ...campo,
31
+ label: titulo + ':',
32
+ value: this.getFormattedValue(campo) ?? "",
33
+ // isInner,
34
+ inputs,
35
+ isEspecial: especialKeys.includes(campo.prop?.toLowerCase()),
36
+ };
37
+ }).filter(campo => !this.ignoreKeys()?.includes(campo.prop));
38
+
39
+ // Ordena a lista colocando os isEspecial no final
40
+ listaDados = listaDados?.sort((a, b) => {
41
+ if (a.isEspecial && !b.isEspecial) return 1;
42
+ if (!a.isEspecial && b.isEspecial) return -1;
43
+ return 0;
44
+ });
45
+
46
+ // Retorna
47
+ return listaDados;
48
+ });
49
+
50
+ // changeModoTo(modo: IModeShowEntidade) {
51
+ // this.modo.set(modo);
52
+ // }
53
+
54
+ // getIsInner(campo: IFieldComponent<any>, inputs: any): boolean {
55
+ // switch (campo.tipo) {
56
+
57
+ // case IField.Upload:
58
+ // inputs["file"] = this.dados()?.[campo.prop];
59
+ // inputs["tipo"] = IMGTYPE.Generic;
60
+ // inputs["h"] = 45;
61
+ // return false;
62
+
63
+ // default:
64
+ // return true;
65
+
66
+ // }
67
+ // }
68
+
69
+ getFormattedValue(campo: IFieldComponent<any>) {
70
+ let value = this.dados()?.[campo.prop];
71
+ if (value == null || value == undefined) return "";
72
+
73
+ switch (campo.tipo) {
74
+
75
+ case IField.AutoComplete:
76
+ // A implementar...
77
+ break;
78
+
79
+
80
+ case IField.Button:
81
+ // A implementar...
82
+ break;
83
+
84
+ case IField.Checkbox:
85
+ value = value === true ? "Sim" : "Não";
86
+ break;
87
+
88
+ case IField.Color:
89
+ // A implementar...
90
+ break;
91
+
92
+ case IField.Custom:
93
+ LOG(1, "ShowEntidade: A exibição do custom não deve ser alterada por aqui. (Remover o aviso quando for implementar o custom)");
94
+ break;
95
+
96
+ case IField.Date:
97
+ value = LibUtil.stringToDataBR(value)?.split(" ")[0];
98
+ break;
99
+
100
+ case IField.DateTime:
101
+ value = LibUtil.stringToDataBR(value);
102
+ break;
103
+
104
+ case IField.Display:
105
+ // A implementar...
106
+ break;
107
+
108
+ case IField.Editor:
109
+ // A implementar...
110
+ break;
111
+
112
+ case IField.Email:
113
+ // A implementar...
114
+ break;
115
+
116
+ case IField.Hidden:
117
+ // A implementar...
118
+ break;
119
+
120
+ case IField.Icon:
121
+ value = `<i class="${value}"></i>&nbsp; ${value}`;
122
+ break;
123
+
124
+ case IField.MultiFactor:
125
+ // A implementar...
126
+ break;
127
+
128
+ case IField.MultiText:
129
+ // A implementar...
130
+ break;
131
+
132
+ case IField.Number:
133
+ // A implementar...
134
+ break;
135
+
136
+ case IField.Password:
137
+ value = "••••••••";
138
+ break;
139
+
140
+ case IField.Referencia:
141
+ if (campo.getDisplay) value = campo.getDisplay(value);
142
+ break;
143
+
144
+ case IField.Search:
145
+ // A implementar...
146
+ break;
147
+
148
+ case IField.Select:
149
+ let options = campo.options?.();
150
+ let optionValue = options?.find(o => o.k == value)?.v
151
+ optionValue ? value = `${optionValue}` : value = `${value}`;
152
+ break;
153
+
154
+ case IField.Slide:
155
+ value = value == true ? "Sim" : "Não";
156
+ break;
157
+
158
+ case IField.Text:
159
+ // A implementar...
160
+ break;
161
+
162
+ case IField.Upload:
163
+ // A implementar...
164
+ break;
165
+
166
+ }
167
+
168
+ // Estes abaixo só se aplicariam se o ShowEntidade fosse mais genérico.
169
+ // switch (Util.classof(value)) {
170
+ // case "boolean":
171
+ // if (value === true) value = "Sim";
172
+ // if (value === false) value = "Não";
173
+ // break;
174
+ // case "array":
175
+ // if (value.length && value.length > 0) {
176
+ // if (Util.classof(value[0]) == "object") {
177
+ // value = `Lista com ${value.length} registros`
178
+ // } else {
179
+ // value = value.join(", ");
180
+ // }
181
+ // }
182
+ // break;
183
+ // }
184
+ return value;
185
+ }
186
+ }
@@ -0,0 +1,88 @@
1
+ .showEntidade {
2
+ margin-top: 5px;
3
+ }
4
+
5
+ .linhaDado {
6
+ border: 1px solid transparent;
7
+ border-bottom: 1px dotted var(--sys-primary-15);
8
+ }
9
+
10
+ .titulo {
11
+ font-weight: 600;
12
+ }
13
+
14
+ .linhaDado.isEspecial .titulo {
15
+ color: var(--sys-secondary);
16
+ }
17
+
18
+ .conteudo {
19
+ color: color-mix(in srgb, var(--sys-secondary) 50%, var(--sys-on-background) 50%);
20
+ }
21
+
22
+ .linhaDado:hover {
23
+ border-bottom: 1px solid var(--sys-secondary);
24
+ }
25
+
26
+ .showEntidade.cantos .linhaDado {
27
+ display: flex;
28
+ flex-direction: row;
29
+ justify-content: space-between;
30
+ align-items: center;
31
+ flex-wrap: wrap;
32
+ gap: calc(var(--MasterGap) / 2);
33
+ }
34
+
35
+ .showEntidade.centro .linhaDado {
36
+ display: grid;
37
+ grid-template-columns: 1fr 1fr;
38
+ gap: calc(var(--MasterGap) / 2);
39
+ }
40
+
41
+ .showEntidade.centro .titulo {
42
+ text-align: end;
43
+ }
44
+
45
+ .showEntidade.esquerda .linhaDado {
46
+ display: grid;
47
+ grid-template-columns: auto 1fr;
48
+ gap: calc(var(--MasterGap) / 2);
49
+ }
50
+
51
+
52
+ .showEntidade.grid {
53
+ display: grid;
54
+ grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
55
+ gap: calc(var(--MasterGap) / 4);
56
+ }
57
+
58
+ .showEntidade.grid .linhaDado {
59
+ display: flex;
60
+ flex-direction: column;
61
+ flex-wrap: wrap;
62
+ border: 1px solid var(--sys-primary-15);
63
+ border-radius: var(--MasterRadius);
64
+ padding: calc(var(--MasterGap) / 2);
65
+ }
66
+
67
+ .showEntidade.grid .linhaDado:hover {
68
+ border: 1px solid var(--sys-secondary);
69
+ }
70
+
71
+ .showEntidade.wrap {
72
+ display: flex;
73
+ flex-wrap: wrap;
74
+ gap: calc(var(--MasterGap) / 2);
75
+ }
76
+
77
+ .showEntidade.wrap .linhaDado {
78
+ display: flex;
79
+ flex-direction: column;
80
+ flex-wrap: wrap;
81
+ border: 1px solid var(--sys-primary-15);
82
+ border-radius: var(--MasterRadius);
83
+ padding: calc(var(--MasterGap) / 2);
84
+ }
85
+
86
+ .showEntidade.wrap .linhaDado:hover {
87
+ border: 1px solid var(--sys-secondary);
88
+ }
@@ -0,0 +1,11 @@
1
+ <div [class]="modo()" [class.showEntidade]="true">
2
+
3
+
4
+ @for (dado of dadosAExibir(); track $index) {
5
+ <div class="linhaDado" [class.isEspecial]="dado.isEspecial">
6
+ <div class="titulo" [innerHTML]="dado.label"></div>
7
+ <div class="conteudo" [innerHTML]="dado.value"></div>
8
+ </div>
9
+ }
10
+
11
+ </div>
@@ -0,0 +1,65 @@
1
+ import { Component, computed, input, model } from '@angular/core';
2
+ import { LibUtil } from '../../../util/util';
3
+ import { IModeShowEntidade } from '../formated-values/formated-values';
4
+
5
+ @Component({
6
+ selector: 'ui-single-values',
7
+ templateUrl: './single-values.html',
8
+ styleUrls: ['./single-values.css'],
9
+ imports: [],
10
+ })
11
+ export class SingleValues {
12
+
13
+ dados = input<any>();
14
+ modo = model<IModeShowEntidade>("centro");
15
+ especialKeys = input<string[] | undefined>();
16
+
17
+ dadosAExibir = computed(() => {
18
+ let dados = this.dados();
19
+ let keys = Object.keys(dados ?? {}).sort();
20
+ let especialKeys = (this.especialKeys() ?? []).map(k => k.toLowerCase());
21
+
22
+ let listaDados = keys?.map(chave => {
23
+ return {
24
+ label: LibUtil.pascalCase(chave) + ':',
25
+ value: this.getNormalizedValue(dados[chave]) ?? "",
26
+ isEspecial: especialKeys.includes(chave.toLowerCase()),
27
+ };
28
+ });
29
+
30
+ // Ordena a lista colocando os isEspecial no final
31
+ listaDados = listaDados?.sort((a, b) => {
32
+ if (a.isEspecial && !b.isEspecial) return 1;
33
+ if (!a.isEspecial && b.isEspecial) return -1;
34
+ return 0;
35
+ });
36
+
37
+ // Retorna
38
+ return listaDados;
39
+ });
40
+
41
+ getNormalizedValue(value: any) {
42
+ if (value == null || value == undefined) return "";
43
+
44
+ let classofValue = LibUtil.classof(value);
45
+
46
+ switch (classofValue) {
47
+
48
+ case "object":
49
+ value = `{ ... Objeto com ${Object.keys(value).length} itens }`
50
+ break;
51
+
52
+ case "array":
53
+ if (value.length && value.length > 0) {
54
+ if (LibUtil.classof(value[0]) == "object") {
55
+ value = `[ ... Lista com ${value.length} registros ]`
56
+ } else {
57
+ value = value.join(", ");
58
+ }
59
+ }
60
+ break;
61
+
62
+ }
63
+ return value;
64
+ }
65
+ }
@@ -0,0 +1,94 @@
1
+ .FieldAutoComplete {
2
+ position: relative;
3
+ display: flex;
4
+ }
5
+
6
+ .FieldAutoComplete>div:first-child {
7
+ flex: 1;
8
+ display: flex;
9
+ align-items: center;
10
+ justify-content: space-between;
11
+ }
12
+
13
+ .FieldAutoComplete>div:first-child:focus {
14
+ outline: 2px solid var(--campoCor);
15
+ }
16
+
17
+ .menuTrigger {
18
+ width: 100%;
19
+ height: 0px;
20
+ }
21
+
22
+ .select-options-container {
23
+ width: max-content;
24
+ position: fixed;
25
+ z-index: 1000;
26
+ display: flex;
27
+ flex-direction: column;
28
+ border-radius: 10px;
29
+ overflow: hidden;
30
+ }
31
+
32
+ .select-options-container.open {
33
+ color: var(--sys-on-background);
34
+ background: var(--sys-background);
35
+ outline: 1px solid var(--sys-outline);
36
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
37
+ }
38
+
39
+ .options-list {
40
+ padding: 0;
41
+ max-height: 300px;
42
+ overflow-y: auto;
43
+ }
44
+
45
+ .option-item {
46
+ display: flex;
47
+ align-items: center;
48
+ justify-content: space-between;
49
+ padding: 15px 5px;
50
+ margin-top: 3px;
51
+ cursor: pointer;
52
+ transition: background-color 0.2s;
53
+ }
54
+
55
+ .option-item.selected {
56
+ background: color-mix(in srgb, var(--sys-primary) 50%, var(--sys-background) 50%);
57
+ color: var(--sys-on-background);
58
+ font-weight: 500;
59
+ }
60
+
61
+ .option-item.choosing {
62
+ outline: none;
63
+ background: color-mix(in srgb, var(--sys-primary) 20%, var(--sys-background) 80%);
64
+ color: var(--sys-on-background);
65
+ }
66
+
67
+ .option-item:hover {
68
+ background: color-mix(in srgb, var(--sys-primary) 20%, var(--sys-background) 80%);
69
+ color: var(--sys-on-background);
70
+ }
71
+
72
+ .option-item-text {
73
+ flex: 1;
74
+ overflow: hidden;
75
+ text-overflow: ellipsis;
76
+ white-space: nowrap;
77
+ user-select: none;
78
+ }
79
+
80
+ .option-item-check {
81
+ width: 16px;
82
+ height: 16px;
83
+ margin: auto 2px;
84
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23FFFFFF' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'/%3E%3C/svg%3E");
85
+ background-size: contain;
86
+ background-repeat: no-repeat;
87
+ background-position: center;
88
+ flex-shrink: 0;
89
+ visibility: hidden;
90
+ }
91
+
92
+ .option-item.selected .option-item-check {
93
+ visibility: visible;
94
+ }
@@ -0,0 +1,38 @@
1
+ <div class="fieldContainer" [class.isTouched]="campo()?.touched" [class.showTouched]="form().showTouched()"
2
+ [class.isInvalid]="campo()?.invalid" [class.isDisabled]="campo()?.disabled" [class.isReadonly]="campo()?.readonly"
3
+ [class.isNeed]="campo()?.need" [class.isPending]="campo()?.pending" [class.isEmpty]="campo()?.empty">
4
+ <div class="fieldLabel" (click)="onClickLabel()" [class.hideLabel]="campo()?.hideLabel">
5
+ @if(campo()?.icone){ <div class="fieldIcon"><i [class]="campo()?.icone"></i></div> }
6
+ {{ campo()?.titulo }}
7
+ </div>
8
+ <div class="fieldControl doCampo">
9
+ <div class="fieldEffect">
10
+ <div #triggerElement class="fieldField FieldAutoComplete">
11
+ <div [class]="campo()?.classe" [style]="campo()?.style">
12
+ <input type="text" [value]="value()" (input)="onInput($event.target.value)" (change)="onChangeEmit()"
13
+ [name]="campo()?.prop" [disabled]="campo()?.disabled" [placeholder]="campo()?.placeholder ?? ''"
14
+ [attr.maxLength]="campo()?.maxl" [attr.minLength]="campo()?.minl" [class]="campo()?.classe"
15
+ [style]="campo()?.style" (keyup)="markKey($event)" (keydown.tab)="closeOverlay()" [class.outlined]="true"
16
+ [class.input]="true" />
17
+ </div>
18
+ </div>
19
+ </div>
20
+ </div>
21
+ <ui-list-errors [errors]="campo()?.errors" [dica]="campo()?.dica" [show]="campo()?.touched"></ui-list-errors>
22
+ </div>
23
+
24
+ <div #optionsContainer class="select-options-container" [class.open]="isOpenedOptions()"
25
+ [style.left]="menuPosition().left" [style.top]="menuPosition().top">
26
+ @if(isOpenedOptions()) {
27
+ <div class="options-list">
28
+ @for(option of optionsFiltered(); track option.k) {
29
+ <div class="option-item" [class.selected]="option.selected" [style.width.px]="offsetWidth()" [title]="option.v"
30
+ (click)="onSelectOption(option)" (keyup.Enter)="onSelectOption(option)" tabindex="-1"
31
+ [class.choosing]="option.choosing">
32
+ <div class="option-item-check"></div>
33
+ <div class="option-item-text" [innerHTML]="option.html"></div>
34
+ </div>
35
+ }
36
+ </div>
37
+ }
38
+ </div>