@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,113 @@
1
+ import { Component, computed, HostBinding, input, OnDestroy, OnInit, output, Signal } from '@angular/core';
2
+ import { LibUtil, LOG } from '../../../util/util';
3
+ import { Formulario, IFieldComponent, IFields, Regra } from '../../Formulario/Formulario';
4
+
5
+ @Component({ selector: 'app-BaseFieldsForm', template: '' })
6
+ export class BaseFieldsForm implements OnInit, OnDestroy {
7
+
8
+ readonly form = input.required<Formulario>()
9
+ readonly name = input.required<keyof IFields<any>>();
10
+ change = output<string>();
11
+
12
+ readonly value = computed(() => this.form().values()[this.name()]);
13
+ readonly campo: Signal<IFieldComponent<any> | undefined> = computed(() => this.form().campos()[this.name()]);
14
+
15
+ ngOnInit(): void {
16
+ this.form().registredFields.update(old => ({ ...old, [this.name()]: this }));
17
+ }
18
+ ngOnDestroy(): void {
19
+ this.form().registredFields.update(old => {
20
+ const updated = { ...old };
21
+ delete updated[this.name()];
22
+ return updated;
23
+ });
24
+ }
25
+
26
+ updateCampo(newCampoData: Partial<IFieldComponent<any>>) {
27
+ this.form().updateCampo(this.name(), newCampoData);
28
+ }
29
+
30
+ updateValue(newValue: any, touch: boolean = true) {
31
+ if (touch) this.tocarCampo();
32
+ this.form().updateValues({ [this.name()]: newValue })
33
+ }
34
+
35
+ tocarCampo() {
36
+ this.updateCampo({ touched: true });
37
+ }
38
+
39
+ onClickLabel() {
40
+ LOG(2, "Valor:", this.value());
41
+ LOG(2, "Campo: ", this.campo());
42
+ LOG(2, "ClassOf: ", LibUtil.classof(this.value()));
43
+ LOG(2, "Opcoes: ", this.campo()?.options?.());
44
+ }
45
+
46
+ @HostBinding('style.grid-area')
47
+ get gridArea() {
48
+ return this.campo()?.area ?? 'auto';
49
+ }
50
+
51
+ onClickEmit() {
52
+ this.campo()?.onClick?.(this.form());
53
+ }
54
+
55
+ // Executa o onChange com delay para utilizar o valor após ter executado o effect do empty.
56
+ async onChangeEmit() {
57
+ setTimeout(async () => {
58
+ await this.executarValidacoes();
59
+ this.campo()?.onChange?.(this.form());
60
+ this.change.emit(this.value());
61
+ }, 1)
62
+ }
63
+
64
+ async executarValidacoes() {
65
+ // Padrão para todos os campos
66
+ this.validarRequired();
67
+ // Validações específicas
68
+ await this.validarRegrasDoCampo();
69
+
70
+ }
71
+
72
+ validarRequired() {
73
+ let isEmpty = this.campo()?.empty;
74
+ if (this.campo()?.need && isEmpty) {
75
+ LOG(1, `Campo '${this.name()}' é obrigatório e está vazio.`, this.campo());
76
+ this.adicionaErro(Regra.mensagens.obrigatorio);
77
+ } else {
78
+ this.removerErro(Regra.mensagens.obrigatorio);
79
+ }
80
+ }
81
+
82
+ async validarRegrasDoCampo() {
83
+ let regrasDefinidas = this.campo()?.regras ?? [];
84
+ if (!regrasDefinidas.length) return;
85
+ for (const regra of regrasDefinidas) {
86
+ if (regra) {
87
+ let isValid = await regra.validar(this.value());
88
+ if (!isValid) {
89
+ this.adicionaErro(regra.mensagem);
90
+ } else {
91
+ this.removerErro(regra.mensagem);
92
+ }
93
+ } else {
94
+ console.warn(`Regra de validação não encontrada para o campo "${this.name()}".`);
95
+ }
96
+ }
97
+ }
98
+
99
+ adicionaErro(erroNovo: string) {
100
+ let errosAtuais = this.campo()?.errors ?? [];
101
+ if (!errosAtuais.includes(erroNovo)) {
102
+ this.updateCampo({ errors: [...errosAtuais, erroNovo] });
103
+ }
104
+ }
105
+
106
+ removerErro(erroRemover: string) {
107
+ let errosAtuais = this.campo()?.errors ?? [];
108
+ if (errosAtuais.includes(erroRemover)) {
109
+ this.updateCampo({ errors: errosAtuais.filter(e => e !== erroRemover) });
110
+ }
111
+ }
112
+
113
+ }
@@ -0,0 +1,112 @@
1
+ import { Component, computed, effect, input, model, OnInit, output, signal } from '@angular/core';
2
+ import { Formulario, IFaseCamposAgrupados, IFases, IFieldComponent, IFields } from '../../Formulario/Formulario';
3
+ import { LOG } from '../../../util/util';
4
+
5
+ interface IFaseCampoGrupo {
6
+ tipo: 'campo' | 'grupo',
7
+ faseIndex: number,
8
+ nome?: string,
9
+ campo?: IFieldComponent<any>,
10
+ grupo?: IFaseCamposAgrupados<any>,
11
+ }
12
+
13
+ @Component({
14
+ selector: 'fields-base-fields-values',
15
+ template: '',
16
+ })
17
+ export abstract class BaseFieldsValues<T> implements OnInit {
18
+
19
+ abstract onSave(): Promise<any>;
20
+
21
+ form!: Formulario;
22
+
23
+ values = model<Partial<T>>();
24
+ campos = input.required<IFields<T>>();
25
+ fases = input<IFases<T>>();
26
+
27
+ gmin = input<string | undefined>();
28
+ gmax = input<string | undefined>();
29
+ showFormControls = input<boolean>(false);
30
+ camposNaoEncontrados = new Set<string>();
31
+ gruposNaoEncontrados = new Set<string>();
32
+
33
+ formulario = output<Formulario>();
34
+
35
+ isFaseado = computed(() => {
36
+ let fases = this.fases()?.fases;
37
+ return fases !== undefined && fases.length > 0;
38
+ });
39
+ isDisabledAction = signal<boolean>(true);
40
+ isLoadingActive = signal<boolean>(false);
41
+ faseIndex = signal<number>(0);
42
+
43
+ listaFase = computed(() => {
44
+ return this.fases()?.fases ?? [];
45
+ });
46
+ faseGrupo = computed<IFaseCampoGrupo[]>(() => {
47
+ let listaFase = this.listaFase();
48
+ if (!listaFase || listaFase.length === 0) {
49
+ return [];
50
+ }
51
+ let resultado: IFaseCampoGrupo[] = [];
52
+ for (let i = 0; i < listaFase.length; i++) {
53
+ for (let campoOrGrupo of listaFase[i].campos) {
54
+ if (typeof campoOrGrupo === 'string') {
55
+ let campo = this.form.campos()[campoOrGrupo];
56
+ if (!campo) {
57
+ this.camposNaoEncontrados.add(campoOrGrupo);
58
+ }
59
+ resultado = [...resultado, { tipo: 'campo', nome: campoOrGrupo, campo: campo, grupo: undefined, faseIndex: i }];
60
+ } else {
61
+ if (campoOrGrupo.area === undefined) {
62
+ // Para cada campo deste grupo encontrado em this.form.campos(), deve retornar a area de algum dos campos ou undefined
63
+ let areaEncontrada = undefined;
64
+ for (let campoNome of campoOrGrupo.campos) {
65
+ let campo = this.form.campos()[campoNome];
66
+ if (campo && campo.area) {
67
+ areaEncontrada = campo.area;
68
+ break;
69
+ }
70
+ }
71
+ campoOrGrupo.area = areaEncontrada;
72
+ }
73
+ if (!campoOrGrupo) {
74
+ this.gruposNaoEncontrados.add(campoOrGrupo);
75
+ }
76
+ resultado = [...resultado, { tipo: 'grupo', campo: undefined, grupo: campoOrGrupo, faseIndex: i }];
77
+ }
78
+ }
79
+ }
80
+ return resultado;
81
+ });
82
+
83
+ constructor() {
84
+ effect(() => {
85
+ let faseIndex = this.faseIndex();
86
+ this.updateDisabledAction();
87
+ });
88
+ }
89
+ ngOnInit(): void {
90
+ this.form = new Formulario(this.campos(), this.values(), this);
91
+ this.formulario.emit(this.form);
92
+
93
+ // Verifica campos e grupos não encontrados após um pequeno delay para garantir que todos os cálculos foram feitos
94
+ setTimeout(() => {
95
+ if (this.camposNaoEncontrados.size > 0) LOG(1, "❌ Campos não encontrados nas fases:", Array.from(this.camposNaoEncontrados));
96
+ if (this.gruposNaoEncontrados.size > 0) LOG(1, "❌ Grupos não encontrados nas fases:", Array.from(this.gruposNaoEncontrados));
97
+ }, 1)
98
+ }
99
+
100
+ updateDisabledAction(forcedDisabled: boolean = false) {
101
+ if (forcedDisabled) return this.isDisabledAction.set(true);
102
+
103
+ let isFaseado = this.isFaseado();
104
+ if (!isFaseado) return this.isDisabledAction.set(false);
105
+
106
+ let isLinear = this.fases()?.isLinear ?? false;
107
+ if (!isLinear) return this.isDisabledAction.set(false);
108
+
109
+ let isUltimaFase = this.faseIndex() >= (this.listaFase().length - 1);
110
+ this.isDisabledAction.set(!isUltimaFase);
111
+ }
112
+ }