@dev-tcloud/tcloud-ui 6.15.0 → 6.18.0

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 (79) hide show
  1. package/docs/tcloud-ui-accordion.md +345 -0
  2. package/docs/tcloud-ui-actions.md +88 -0
  3. package/docs/tcloud-ui-alert-banner.md +104 -0
  4. package/docs/tcloud-ui-array-to-text.md +361 -0
  5. package/docs/tcloud-ui-breadcrumb.md +103 -0
  6. package/docs/tcloud-ui-bytes.md +109 -0
  7. package/docs/tcloud-ui-calendar.md +387 -0
  8. package/docs/tcloud-ui-card-accordion.md +266 -0
  9. package/docs/tcloud-ui-card-title.md +47 -0
  10. package/docs/tcloud-ui-card.md +40 -0
  11. package/docs/tcloud-ui-choice-issues.md +59 -0
  12. package/docs/tcloud-ui-cnpj.md +102 -0
  13. package/docs/tcloud-ui-container.md +171 -0
  14. package/docs/tcloud-ui-cpf.md +102 -0
  15. package/docs/tcloud-ui-currency.md +271 -0
  16. package/docs/tcloud-ui-data-list.md +91 -0
  17. package/docs/tcloud-ui-datebr.md +139 -0
  18. package/docs/tcloud-ui-datepicker-time.md +191 -0
  19. package/docs/tcloud-ui-datepicker.md +186 -0
  20. package/docs/tcloud-ui-dropdown-multi.md +444 -0
  21. package/docs/tcloud-ui-dropdown.md +369 -0
  22. package/docs/tcloud-ui-el-copy.md +113 -0
  23. package/docs/tcloud-ui-empty-content.md +412 -0
  24. package/docs/tcloud-ui-faq.md +496 -0
  25. package/docs/tcloud-ui-filter-bar.md +86 -0
  26. package/docs/tcloud-ui-filters.md +337 -0
  27. package/docs/tcloud-ui-hover-parent.md +467 -0
  28. package/docs/tcloud-ui-icon-button.md +104 -0
  29. package/docs/tcloud-ui-input-container.md +520 -0
  30. package/docs/tcloud-ui-input-password.md +258 -0
  31. package/docs/tcloud-ui-input-search.md +314 -0
  32. package/docs/tcloud-ui-label-token.md +286 -0
  33. package/docs/tcloud-ui-legend.md +72 -0
  34. package/docs/tcloud-ui-line-step-circle.md +98 -0
  35. package/docs/tcloud-ui-line-step-title.md +194 -0
  36. package/docs/tcloud-ui-linha-logo.md +550 -0
  37. package/docs/tcloud-ui-loading.md +88 -0
  38. package/docs/tcloud-ui-message.md +539 -0
  39. package/docs/tcloud-ui-modal.md +196 -0
  40. package/docs/tcloud-ui-monthname.md +123 -0
  41. package/docs/tcloud-ui-multi-input.md +290 -0
  42. package/docs/tcloud-ui-multi-select.md +311 -0
  43. package/docs/tcloud-ui-multiples-values.md +157 -0
  44. package/docs/tcloud-ui-not-found.md +88 -0
  45. package/docs/tcloud-ui-number-step.md +134 -0
  46. package/docs/tcloud-ui-pagination.md +579 -0
  47. package/docs/tcloud-ui-progress-bar.md +65 -0
  48. package/docs/tcloud-ui-radio.md +83 -0
  49. package/docs/tcloud-ui-reorder-items.md +418 -0
  50. package/docs/tcloud-ui-respective.md +167 -0
  51. package/docs/tcloud-ui-scroll-box.md +109 -0
  52. package/docs/tcloud-ui-search-bar.md +88 -0
  53. package/docs/tcloud-ui-search-in-object.md +143 -0
  54. package/docs/tcloud-ui-search-input.md +74 -0
  55. package/docs/tcloud-ui-skeleton-loading.md +394 -0
  56. package/docs/tcloud-ui-slide-toggle.md +210 -0
  57. package/docs/tcloud-ui-statusinfo.md +138 -0
  58. package/docs/tcloud-ui-tab-group.md +376 -0
  59. package/docs/tcloud-ui-tab-menu.md +109 -0
  60. package/docs/tcloud-ui-table.md +96 -0
  61. package/docs/tcloud-ui-tag.md +379 -0
  62. package/docs/tcloud-ui-tc-badge.md +168 -0
  63. package/docs/tcloud-ui-tc-btn.md +189 -0
  64. package/docs/tcloud-ui-tc-colors.md +204 -0
  65. package/docs/tcloud-ui-tc-form-control.md +200 -0
  66. package/docs/tcloud-ui-tc-text.md +139 -0
  67. package/docs/tcloud-ui-tc-title.md +118 -0
  68. package/docs/tcloud-ui-tcloud-form.md +55 -0
  69. package/docs/tcloud-ui-toast.md +83 -0
  70. package/docs/tcloud-ui-tooltip.md +88 -0
  71. package/docs/tcloud-ui-topology.md +232 -0
  72. package/docs/tcloud-ui-upload-area.md +195 -0
  73. package/docs/tcloud-ui-welcome.md +112 -0
  74. package/docs/tcloud-ui-wizard-steps.md +103 -0
  75. package/js/tcloud-ui-app.js +11 -0
  76. package/package.json +1 -1
  77. package/scss/tcloud-revitalizacao/components/_tcloud-ui-table.scss +95 -0
  78. package/scss/tcloud-revitalizacao/tc-rev-styles.scss +1 -1
  79. package/scss/tcloud-revitalizacao/components/_tc-rev-table.scss +0 -57
@@ -0,0 +1,271 @@
1
+ # Currency
2
+
3
+ A diretiva **Currency** formata automaticamente valores monetários em Reais (R$) em um campo de entrada. Ela implementa `ControlValueAccessor`, permitindo integração transparente com `ngModel` e formulários reativos do Angular.
4
+
5
+ ## Características
6
+
7
+ - **Formatação automática de moeda**: Exibe valores no formato `R$ 1.234,56`
8
+ - **Máscara de entrada**: Remove caracteres não numéricos e aplica formatação em tempo real
9
+ - **Compatível com ngModel**: Funciona perfeitamente com two-way data binding
10
+ - **Compatível com Reactive Forms**: Implementa `ControlValueAccessor`
11
+ - **Alinhamento à direita**: Posiciona o texto monetário à direita automaticamente
12
+ - **Cursor inteligente**: Posiciona o cursor ao final do valor quando o input recebe foco
13
+ - **Conversão segura**: Converte valores para número quando emitidos através de `onChange`
14
+
15
+ ## Instalação
16
+
17
+ ```typescript
18
+ import { TCloudUiModule } from 'projects/tcloud-ui/src/public-api';
19
+ import { FormsModule } from '@angular/forms';
20
+
21
+ @Component({
22
+ imports: [TCloudUiModule, FormsModule],
23
+ // ... resto da configuração
24
+ })
25
+ export class MyComponent {}
26
+ ```
27
+
28
+ ## Propriedades (API)
29
+
30
+ ### Seletor
31
+
32
+ | Seletor | Descrição |
33
+ |---------|-----------|
34
+ | `[TCcurrency]` | Atributo aplicado em um elemento `<input>` para ativar a formatação de moeda |
35
+
36
+ ### Implementação de ControlValueAccessor
37
+
38
+ A diretiva implementa as seguintes interfaces obrigatórias de `ControlValueAccessor`:
39
+
40
+ | Método | Assinatura | Descrição |
41
+ |--------|-----------|-----------|
42
+ | `writeValue(value: any)` | Escreve o valor formatado no elemento | Formata e exibe o valor com máscara de moeda |
43
+ | `registerOnChange(fn: any)` | Registra callback de mudança | Chamado quando o usuário modifica o valor |
44
+ | `registerOnTouched(fn: any)` | Registra callback de toque | Chamado quando o usuário interage com o input |
45
+
46
+ ### Listeners do Host
47
+
48
+ | Evento | Descrição |
49
+ |--------|-----------|
50
+ | `@HostListener('focus')` | Posiciona o cursor ao final do valor |
51
+ | `@HostListener('input')` | Formata o valor conforme o usuário digita |
52
+
53
+ ## Comportamento
54
+
55
+ ### Formatação
56
+
57
+ Os valores são exibidos no formato brasileiro de moeda:
58
+ - Separador de milhares: `.` (ponto)
59
+ - Separador decimal: `,` (vírgula)
60
+ - Símbolo monetário: `R$ `
61
+
62
+ **Exemplos:**
63
+ - `100` → `R$ 0,00`
64
+ - `1000` → `R$ 10,00`
65
+ - `100050` → `R$ 1.000,50`
66
+ - `1234567` → `R$ 12.345,67`
67
+
68
+ ### Entrada de Dados
69
+
70
+ A diretiva automaticamente:
71
+ 1. Remove caracteres não numéricos
72
+ 2. Aplica formatação de moeda
73
+ 3. Emite o valor numérico puro via `onChange`
74
+
75
+ ## Exemplos de Uso
76
+
77
+ ### Uso Básico com ngModel
78
+
79
+ Implementação simples com two-way binding:
80
+
81
+ ```typescript
82
+ @Component({
83
+ selector: 'app-currency-basic',
84
+ imports: [CommonModule, FormsModule, TCloudUiModule],
85
+ template: `
86
+ <div>
87
+ <label>Valor:</label>
88
+ <input
89
+ TCcurrency
90
+ [(ngModel)]="valor"
91
+ class="tc-form-control"
92
+ placeholder="0,00"
93
+ >
94
+ <p>Valor armazenado: {{ valor }}</p>
95
+ </div>
96
+ `
97
+ })
98
+ export class CurrencyBasicComponent {
99
+ valor: number = 0;
100
+ }
101
+ ```
102
+
103
+ ### Uso com Formulário Reativo
104
+
105
+ Integração com Reactive Forms:
106
+
107
+ ```typescript
108
+ @Component({
109
+ selector: 'app-currency-reactive',
110
+ imports: [CommonModule, ReactiveFormsModule, TCloudUiModule],
111
+ template: `
112
+ <form [formGroup]="form">
113
+ <div>
114
+ <label>Valor da Venda:</label>
115
+ <input
116
+ TCcurrency
117
+ formControlName="saleValue"
118
+ class="tc-form-control"
119
+ >
120
+ <small *ngIf="form.get('saleValue')?.invalid">
121
+ Valor inválido
122
+ </small>
123
+ </div>
124
+
125
+ <button
126
+ (click)="submitForm()"
127
+ class="tc-btn tc-btn-primary"
128
+ >
129
+ Enviar
130
+ </button>
131
+ </form>
132
+ `
133
+ })
134
+ export class CurrencyReactiveComponent {
135
+ form: FormGroup;
136
+
137
+ constructor(private fb: FormBuilder) {
138
+ this.form = this.fb.group({
139
+ saleValue: [0, [Validators.required, Validators.min(0)]]
140
+ });
141
+ }
142
+
143
+ submitForm() {
144
+ if (this.form.valid) {
145
+ console.log('Valor enviado:', this.form.get('saleValue')?.value);
146
+ }
147
+ }
148
+ }
149
+ ```
150
+
151
+ ### Uso Avançado com Validação de Range
152
+
153
+ Diretiva aplicada com validação de valor mínimo e máximo:
154
+
155
+ ```typescript
156
+ @Component({
157
+ selector: 'app-currency-advanced',
158
+ imports: [CommonModule, ReactiveFormsModule, TCloudUiModule],
159
+ template: `
160
+ <form [formGroup]="form">
161
+ <div class="form-group">
162
+ <label>Preço do Produto (R$ 0,01 - R$ 999.999,99):</label>
163
+ <input
164
+ TCcurrency
165
+ formControlName="price"
166
+ class="tc-form-control"
167
+ (blur)="validatePrice()"
168
+ >
169
+
170
+ <div *ngIf="priceOutOfRange" class="error-message">
171
+ Preço deve estar entre R$ 0,01 e R$ 999.999,99
172
+ </div>
173
+ </div>
174
+
175
+ <div class="form-group">
176
+ <label>Desconto (R$ 0,00 - máximo 50% do preço):</label>
177
+ <input
178
+ TCcurrency
179
+ formControlName="discount"
180
+ class="tc-form-control"
181
+ (blur)="validateDiscount()"
182
+ >
183
+
184
+ <div *ngIf="discountOutOfRange" class="error-message">
185
+ Desconto inválido
186
+ </div>
187
+ </div>
188
+
189
+ <div class="summary">
190
+ <p>Preço: {{ form.get('price')?.value | currency }}</p>
191
+ <p>Desconto: -{{ form.get('discount')?.value | currency }}</p>
192
+ <p><strong>Total: {{ calculateTotal() | currency }}</strong></p>
193
+ </div>
194
+
195
+ <button
196
+ (click)="save()"
197
+ [disabled]="form.invalid"
198
+ class="tc-btn tc-btn-primary"
199
+ >
200
+ Salvar Produto
201
+ </button>
202
+ </form>
203
+ `,
204
+ styles: [`
205
+ .error-message {
206
+ color: #d32f2f;
207
+ font-size: 12px;
208
+ margin-top: 4px;
209
+ }
210
+ .summary {
211
+ background: #f5f5f5;
212
+ padding: 12px;
213
+ border-radius: 4px;
214
+ margin: 16px 0;
215
+ }
216
+ `]
217
+ })
218
+ export class CurrencyAdvancedComponent {
219
+ form: FormGroup;
220
+ priceOutOfRange: boolean = false;
221
+ discountOutOfRange: boolean = false;
222
+
223
+ constructor(private fb: FormBuilder) {
224
+ this.form = this.fb.group({
225
+ price: [0, [Validators.required, Validators.min(0.01)]],
226
+ discount: [0, [Validators.required, Validators.min(0)]]
227
+ });
228
+ }
229
+
230
+ validatePrice() {
231
+ const price = this.form.get('price')?.value;
232
+ this.priceOutOfRange = price < 0.01 || price > 999999.99;
233
+ }
234
+
235
+ validateDiscount() {
236
+ const price = this.form.get('price')?.value;
237
+ const discount = this.form.get('discount')?.value;
238
+ const maxDiscount = price * 0.5;
239
+ this.discountOutOfRange = discount < 0 || discount > maxDiscount;
240
+ }
241
+
242
+ calculateTotal(): number {
243
+ const price = this.form.get('price')?.value || 0;
244
+ const discount = this.form.get('discount')?.value || 0;
245
+ return price - discount;
246
+ }
247
+
248
+ save() {
249
+ if (this.form.valid) {
250
+ const data = {
251
+ price: this.form.get('price')?.value,
252
+ discount: this.form.get('discount')?.value,
253
+ total: this.calculateTotal()
254
+ };
255
+ console.log('Produto salvo:', data);
256
+ }
257
+ }
258
+ }
259
+ ```
260
+
261
+ ## Notas de Implementação
262
+
263
+ - A diretiva é **standalone** e pode ser usada diretamente em componentes standalone
264
+ - Trabalha especificamente com a moeda **Real Brasileiro (R$)**
265
+ - O valor armazenado internamente é sempre um **número decimal** (ex: `100.50`)
266
+ - A exibição sempre será formatada como **`R$ 1.234,56`** (formato brasileiro)
267
+ - A diretiva implementa `ControlValueAccessor`, permitindo uso com `ngModel`, `formControl` e `formControlName`
268
+ - O input é automaticamente configurado com `type="text"` e `text-align="right"`
269
+ - Quando o input recebe foco, o cursor é posicionado ao final do valor
270
+ - Valores inválidos ou vazios são tratados como `0`
271
+ - A diretiva não valida se o valor é negativo; use `Validators.min()` do Reactive Forms para isso
@@ -0,0 +1,91 @@
1
+ # Data List
2
+
3
+ ## Características
4
+ - Dropdown com busca e suporte a loading, disabled e abertura programática.
5
+ - Integração com `ngModel` (ControlValueAccessor) e eventos de abertura/fechamento e mudança de valor.
6
+ - Opções podem ser declaradas via conteúdo (`tcloud-ui-data-list-option`) ou via `listItems` (array de objetos `{ value, description, disabled? }`).
7
+ - Ajuste automático de posicionamento (abre para cima se faltar espaço) e input opcional (`showInput`).
8
+
9
+ ## Instalação
10
+ ```ts
11
+ import { TCloudUiDataListComponent } from 'projects/tcloud-ui/src/public-api';
12
+ import { TCloudUiDataListOptionComponent } from 'projects/tcloud-ui/src/public-api';
13
+
14
+ @Component({
15
+ selector: 'app-example',
16
+ standalone: true,
17
+ imports: [TCloudUiDataListComponent, TCloudUiDataListOptionComponent],
18
+ template: `<tcloud-ui-data-list></tcloud-ui-data-list>`
19
+ })
20
+ export class ExampleComponent {}
21
+ ```
22
+
23
+ ## Propriedades (API)
24
+ ### Inputs
25
+ | Nome | Tipo | Descrição | Valor Default |
26
+ | --- | --- | --- | --- |
27
+ | placeholder | string | Placeholder exibido quando nada está selecionado. | '' |
28
+ | disabled | boolean | Desabilita interação. | false |
29
+ | loading | boolean | Exibe estado de carregamento e bloqueia interação. | false |
30
+ | showInput | boolean | Exibe input (bordas/área de clique). | true |
31
+ | search | boolean | Habilita campo de busca interno. | true |
32
+ | listItems | ISelectOptions[] | Lista de opções alternativa ao conteúdo projetado. | [] |
33
+ | open | boolean | Abre/fecha programaticamente o menu. | false |
34
+ | border | boolean | Controla exibição da borda do input. | true |
35
+ | ngModel | any | Valor selecionado (two-way). | '' |
36
+
37
+ ### Outputs
38
+ | Nome | Tipo de Evento | Descrição |
39
+ | --- | --- | --- |
40
+ | onInputChange | EventEmitter<ISelectOptions> | Emite a descrição/valor ao digitar ou alterar internamente. |
41
+ | onChange | EventEmitter<ISelectOptions> | Emite quando o valor é alterado. |
42
+ | onOpened | EventEmitter<any> | Emite ao abrir o menu. |
43
+ | onClosed | EventEmitter<any> | Emite ao fechar o menu. |
44
+ | ngModelChange | EventEmitter<any> | Suporte ao two-way binding de `ngModel`. |
45
+
46
+ ## Exemplos de Uso
47
+ ### Uso Básico com opções inline
48
+ ```html
49
+ <tcloud-ui-data-list placeholder="Opções" [(ngModel)]="selected">
50
+ <tcloud-ui-data-list-option [value]="''"></tcloud-ui-data-list-option>
51
+ <tcloud-ui-data-list-option value="a">Opção A</tcloud-ui-data-list-option>
52
+ <tcloud-ui-data-list-option value="b" [disabled]="true">Opção B</tcloud-ui-data-list-option>
53
+ <tcloud-ui-data-list-option value="c">Opção C</tcloud-ui-data-list-option>
54
+ </tcloud-ui-data-list>
55
+
56
+ <pre>selected: {{ selected }}</pre>
57
+ ```
58
+
59
+ ### Uso com lista dinâmica, loading e eventos
60
+ ```html
61
+ <tcloud-ui-data-list
62
+ [placeholder]="'Tamanho do Disco'"
63
+ [listItems]="diskOptions"
64
+ [loading]="loading"
65
+ (onChange)="handleChange($event)"
66
+ (onInputChange)="handleInput($event)"
67
+ [(ngModel)]="diskSize">
68
+ </tcloud-ui-data-list>
69
+
70
+ <button type="button" (click)="loading = true">Simular loading</button>
71
+ ```
72
+
73
+ ### Abrir programaticamente e ocultar input
74
+ ```html
75
+ <tcloud-ui-data-list
76
+ [open]="openMenu"
77
+ [showInput]="false"
78
+ [listItems]="items"
79
+ [(ngModel)]="value">
80
+ </tcloud-ui-data-list>
81
+ <button type="button" (click)="openMenu = !openMenu">Toggle open</button>
82
+ ```
83
+
84
+ ## Tipos auxiliares
85
+ ```ts
86
+ export interface ISelectOptions {
87
+ description: any;
88
+ value: any;
89
+ disabled?: boolean;
90
+ }
91
+ ```
@@ -0,0 +1,139 @@
1
+ # DateBRPipe
2
+
3
+ O pipe `datebr` formata uma string numérica em formato de data brasileira (`dd/MM/yyyy`). A formatação é progressiva — aplica a máscara de acordo com a quantidade de dígitos informados, inserindo as barras (`/`) automaticamente. Remove barras existentes antes de processar, permitindo uso tanto com valores brutos quanto pré-formatados. Retorna string vazia quando o valor é nulo ou undefined.
4
+
5
+ ## Características
6
+
7
+ - Formatação progressiva conforme quantidade de dígitos (1 a 8+)
8
+ - Inserção automática de barras (`/`) como separadores
9
+ - Remoção de barras existentes antes do processamento
10
+ - Suporte a strings com 1 a 8 dígitos:
11
+ - 1 dígito: `#`
12
+ - 2 dígitos: `##/`
13
+ - 3 dígitos: `##/#`
14
+ - 4 dígitos: `##/##`
15
+ - 5 dígitos: `##/##/#`
16
+ - 6 dígitos: `##/##/##`
17
+ - 7 dígitos: `##/##/###`
18
+ - 8 dígitos: `##/##/####`
19
+ - Retorna string vazia para valores falsy
20
+ - Retorna valor original se a string excede 10 caracteres
21
+ - Pipe standalone
22
+
23
+ ## Instalação
24
+
25
+ Importe o pipe diretamente no módulo ou componente standalone:
26
+
27
+ ```typescript
28
+ import { DateBRPipe } from 'tcloud-ui';
29
+ ```
30
+
31
+ ## API
32
+
33
+ ### Sintaxe do Pipe
34
+
35
+ ```
36
+ {{ valor | datebr }}
37
+ ```
38
+
39
+ ### Parâmetros
40
+
41
+ Este pipe não recebe parâmetros adicionais.
42
+
43
+ ### Entrada e Saída
44
+
45
+ | Entrada | Saída |
46
+ |----------------|----------------|
47
+ | `'04032026'` | `'04/03/2026'` |
48
+ | `'040326'` | `'04/03/26'` |
49
+ | `'0403'` | `'04/03'` |
50
+ | `'04'` | `'04/'` |
51
+ | `'04/03/2026'` | `'04/03/2026'` |
52
+ | `null` | `''` |
53
+
54
+ ## Exemplos de Uso
55
+
56
+ ### Básico — Formatação de data completa
57
+
58
+ ```html
59
+ <p>{{ '04032026' | datebr }}</p>
60
+ <!-- Resultado: 04/03/2026 -->
61
+
62
+ <p>{{ '0403' | datebr }}</p>
63
+ <!-- Resultado: 04/03 -->
64
+ ```
65
+
66
+ ```typescript
67
+ import { DateBRPipe } from 'tcloud-ui';
68
+
69
+ @Component({
70
+ standalone: true,
71
+ imports: [DateBRPipe],
72
+ template: `
73
+ <p>{{ data | datebr }}</p>
74
+ `
75
+ })
76
+ export class ExemploBasicoComponent {
77
+ data = '04032026';
78
+ }
79
+ ```
80
+
81
+ ### Avançado — Máscara em tempo real em input
82
+
83
+ ```html
84
+ <input type="text" [value]="dataDigitada | datebr" (input)="onInput($event)" placeholder="dd/MM/yyyy">
85
+ ```
86
+
87
+ ```typescript
88
+ import { DateBRPipe } from 'tcloud-ui';
89
+
90
+ @Component({
91
+ standalone: true,
92
+ imports: [DateBRPipe],
93
+ template: `...`
94
+ })
95
+ export class ExemploAvancadoComponent {
96
+ dataDigitada = '';
97
+
98
+ onInput(event: Event) {
99
+ const input = event.target as HTMLInputElement;
100
+ this.dataDigitada = input.value.replace(/\//g, '');
101
+ }
102
+ }
103
+ ```
104
+
105
+ ### Avançado — Exibição em tabela
106
+
107
+ ```html
108
+ <table class="table">
109
+ <thead>
110
+ <tr>
111
+ <th>Evento</th>
112
+ <th>Data</th>
113
+ </tr>
114
+ </thead>
115
+ <tbody>
116
+ <tr *ngFor="let item of eventos">
117
+ <td>{{ item.nome }}</td>
118
+ <td>{{ item.data | datebr }}</td>
119
+ </tr>
120
+ </tbody>
121
+ </table>
122
+ ```
123
+
124
+ ```typescript
125
+ import { DateBRPipe } from 'tcloud-ui';
126
+
127
+ @Component({
128
+ standalone: true,
129
+ imports: [CommonModule, DateBRPipe],
130
+ template: `...`
131
+ })
132
+ export class ExemploTabelaComponent {
133
+ eventos = [
134
+ { nome: 'Deploy Produção', data: '04032026' },
135
+ { nome: 'Sprint Review', data: '15032026' },
136
+ { nome: 'Retrospectiva', data: '20032026' }
137
+ ];
138
+ }
139
+ ```
@@ -0,0 +1,191 @@
1
+ # Datepicker Time
2
+
3
+ ## Características
4
+ - Componente standalone que combina seleção de data com hora e minutos.
5
+ - Integração com `TCloudUiDatepickerComponent` para seleção de datas.
6
+ - Seletores dropdown para hora (00-23) e minutos (00-59).
7
+ - Suporte a intervalo de datas com `minDate` e `maxDate`.
8
+ - Opção de atalhos de tempo rápido: 7 dias, 15 dias, 30 dias, mês atual, ano atual.
9
+ - Integração com ngModel (two-way binding) via ControlValueAccessor.
10
+ - Emite eventos em mudanças: `onChange`, `ngModelChange` e `eventChange`.
11
+ - Validação automática de datas.
12
+
13
+ ## Instalação
14
+ ```ts
15
+ import { TCloudUiDatepickerTimeComponent } from 'projects/tcloud-ui/src/public-api';
16
+
17
+ @Component({
18
+ selector: 'app-example',
19
+ standalone: true,
20
+ imports: [TCloudUiDatepickerTimeComponent],
21
+ template: `<tcloud-ui-datepicker-time [(ngModel)]="dateTimeValue"></tcloud-ui-datepicker-time>`
22
+ })
23
+ export class ExampleComponent {
24
+ dateTimeValue: Date = new Date();
25
+ }
26
+ ```
27
+
28
+ ## Propriedades (API)
29
+ ### Inputs
30
+ | Nome | Tipo | Descrição | Valor Default |
31
+ | --- | --- | --- | --- |
32
+ | minDate | string | Data mínima permitida no formato DD/MM/YYYY. | '' |
33
+ | maxDate | string | Data máxima permitida no formato DD/MM/YYYY. | '' |
34
+ | useOptionsDateTime | boolean | Se true, exibe dropdown com opções rápidas de data (7 dias, 15 dias, etc). | false |
35
+ | ngModel | Date | Data e hora selecionada (two-way binding). | undefined |
36
+
37
+ ### Outputs
38
+ | Nome | Tipo de Evento | Descrição |
39
+ | --- | --- | --- |
40
+ | onChange | EventEmitter<Date> | Emite quando data ou hora é alterada. |
41
+ | ngModelChange | EventEmitter<Date> | Emite mudança do ngModel para two-way binding. |
42
+ | eventChange | EventEmitter<any> | Emite o elemento nativo ao alterar data/hora. |
43
+
44
+ ## Exemplos de Uso
45
+ ### Uso Básico
46
+ ```html
47
+ <tcloud-ui-datepicker-time [(ngModel)]="dateTimeValue"></tcloud-ui-datepicker-time>
48
+
49
+ <p>Data/Hora selecionada: {{ dateTimeValue }}</p>
50
+ ```
51
+
52
+ Componente:
53
+ ```ts
54
+ export class ExampleComponent {
55
+ dateTimeValue: Date = new Date();
56
+ }
57
+ ```
58
+
59
+ ### Com Intervalo de Datas
60
+ ```html
61
+ <tcloud-ui-datepicker-time
62
+ [minDate]="'01/01/2024'"
63
+ [maxDate]="'31/12/2024'"
64
+ [(ngModel)]="dateTimeValue">
65
+ </tcloud-ui-datepicker-time>
66
+ ```
67
+
68
+ ### Modo Input com Intervalo
69
+ ```html
70
+ <tcloud-ui-datepicker-time
71
+ [minDate]="'15/03/2024'"
72
+ [maxDate]="'15/04/2024'"
73
+ [(ngModel)]="dateTime">
74
+ </tcloud-ui-datepicker-time>
75
+
76
+ <p>Valor: {{ dateTime | date:'dd/MM/yyyy HH:mm' }}</p>
77
+ ```
78
+
79
+ ## Uso Avançado
80
+ ### Com Opções de Tempo Rápido
81
+ Quando `useOptionsDateTime="true"`, o componente exibe um dropdown com atalhos:
82
+ - **7 dias**: últimos 7 dias
83
+ - **15 dias**: últimos 15 dias
84
+ - **30 dias**: últimos 30 dias
85
+ - **Mês atual até agora**: de 1º do mês até a data atual
86
+ - **Ano atual até agora**: de 1º de janeiro até a data atual
87
+
88
+ ```html
89
+ <tcloud-ui-datepicker-time
90
+ [useOptionsDateTime]="true"
91
+ [(ngModel)]="dateTimeValue">
92
+ </tcloud-ui-datepicker-time>
93
+ ```
94
+
95
+ Componente:
96
+ ```ts
97
+ export class ExampleComponent {
98
+ dateTimeValue: Date = new Date();
99
+ }
100
+ ```
101
+
102
+ ### Com Eventos
103
+ ```html
104
+ <tcloud-ui-datepicker-time
105
+ [(ngModel)]="dateTimeValue"
106
+ (onChange)="onDateTimeChanged($event)"
107
+ (eventChange)="onEventChange($event)">
108
+ </tcloud-ui-datepicker-time>
109
+ ```
110
+
111
+ Componente:
112
+ ```ts
113
+ export class ExampleComponent {
114
+ dateTimeValue: Date = new Date();
115
+
116
+ onDateTimeChanged(newDateTime: Date) {
117
+ console.log('Nova data/hora:', newDateTime);
118
+ // Realizar ações quando data/hora mudar
119
+ }
120
+
121
+ onEventChange(element: any) {
122
+ console.log('Elemento nativo:', element);
123
+ }
124
+ }
125
+ ```
126
+
127
+ ### Combinação: Intervalo + Opções Rápidas
128
+ ```html
129
+ <tcloud-ui-datepicker-time
130
+ [minDate]="'01/01/2024'"
131
+ [maxDate]="'31/12/2024'"
132
+ [useOptionsDateTime]="true"
133
+ [(ngModel)]="filtroData">
134
+ </tcloud-ui-datepicker-time>
135
+
136
+ <p>Filtro: {{ filtroData | date:'dd/MM/yyyy HH:mm' }}</p>
137
+ ```
138
+
139
+ Componente:
140
+ ```ts
141
+ export class FiltroComponent {
142
+ filtroData: Date = new Date();
143
+ }
144
+ ```
145
+
146
+ ### Em Formulário com Validação
147
+ ```html
148
+ <form #form="ngForm">
149
+ <div>
150
+ <label>Data/Hora:</label>
151
+ <tcloud-ui-datepicker-time
152
+ name="dataHora"
153
+ [(ngModel)]="dataHora"
154
+ (onChange)="validarData()">
155
+ </tcloud-ui-datepicker-time>
156
+ </div>
157
+ <p *ngIf="erroData" class="error">{{ erroData }}</p>
158
+ </form>
159
+ ```
160
+
161
+ Componente:
162
+ ```ts
163
+ export class FormularioComponent {
164
+ dataHora: Date = new Date();
165
+ erroData: string = '';
166
+
167
+ validarData() {
168
+ if (this.dataHora) {
169
+ this.erroData = '';
170
+ } else {
171
+ this.erroData = 'Selecione uma data/hora válida.';
172
+ }
173
+ }
174
+ }
175
+ ```
176
+
177
+ ### Inicializar com Valor Específico
178
+ ```ts
179
+ export class ExampleComponent implements OnInit {
180
+ dateTimeValue: Date;
181
+
182
+ ngOnInit() {
183
+ // Inicializar com data específica
184
+ this.dateTimeValue = new Date(2024, 0, 15, 14, 30); // 15/01/2024 às 14:30
185
+ }
186
+ }
187
+ ```
188
+
189
+ ```html
190
+ <tcloud-ui-datepicker-time [(ngModel)]="dateTimeValue"></tcloud-ui-datepicker-time>
191
+ ```