@dev-tcloud/tcloud-ui 6.14.3 → 6.17.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.
- package/docs/tcloud-ui-accordion.md +345 -0
- package/docs/tcloud-ui-actions.md +88 -0
- package/docs/tcloud-ui-alert-banner.md +104 -0
- package/docs/tcloud-ui-array-to-text.md +361 -0
- package/docs/tcloud-ui-breadcrumb.md +103 -0
- package/docs/tcloud-ui-bytes.md +109 -0
- package/docs/tcloud-ui-calendar.md +387 -0
- package/docs/tcloud-ui-card-accordion.md +266 -0
- package/docs/tcloud-ui-card-title.md +47 -0
- package/docs/tcloud-ui-card.md +40 -0
- package/docs/tcloud-ui-choice-issues.md +59 -0
- package/docs/tcloud-ui-cnpj.md +102 -0
- package/docs/tcloud-ui-container.md +171 -0
- package/docs/tcloud-ui-cpf.md +102 -0
- package/docs/tcloud-ui-currency.md +271 -0
- package/docs/tcloud-ui-data-list.md +91 -0
- package/docs/tcloud-ui-datebr.md +139 -0
- package/docs/tcloud-ui-datepicker-time.md +191 -0
- package/docs/tcloud-ui-datepicker.md +186 -0
- package/docs/tcloud-ui-dropdown-multi.md +444 -0
- package/docs/tcloud-ui-dropdown.md +369 -0
- package/docs/tcloud-ui-el-copy.md +113 -0
- package/docs/tcloud-ui-empty-content.md +412 -0
- package/docs/tcloud-ui-faq.md +496 -0
- package/docs/tcloud-ui-filter-bar.md +86 -0
- package/docs/tcloud-ui-filters.md +337 -0
- package/docs/tcloud-ui-hover-parent.md +467 -0
- package/docs/tcloud-ui-icon-button.md +104 -0
- package/docs/tcloud-ui-input-container.md +520 -0
- package/docs/tcloud-ui-input-password.md +258 -0
- package/docs/tcloud-ui-input-search.md +314 -0
- package/docs/tcloud-ui-label-token.md +286 -0
- package/docs/tcloud-ui-legend.md +72 -0
- package/docs/tcloud-ui-line-step-circle.md +98 -0
- package/docs/tcloud-ui-line-step-title.md +194 -0
- package/docs/tcloud-ui-linha-logo.md +550 -0
- package/docs/tcloud-ui-loading.md +88 -0
- package/docs/tcloud-ui-message.md +539 -0
- package/docs/tcloud-ui-modal.md +196 -0
- package/docs/tcloud-ui-monthname.md +123 -0
- package/docs/tcloud-ui-multi-input.md +290 -0
- package/docs/tcloud-ui-multi-select.md +311 -0
- package/docs/tcloud-ui-multiples-values.md +157 -0
- package/docs/tcloud-ui-not-found.md +88 -0
- package/docs/tcloud-ui-number-step.md +134 -0
- package/docs/tcloud-ui-pagination.md +579 -0
- package/docs/tcloud-ui-progress-bar.md +65 -0
- package/docs/tcloud-ui-radio.md +83 -0
- package/docs/tcloud-ui-reorder-items.md +418 -0
- package/docs/tcloud-ui-respective.md +167 -0
- package/docs/tcloud-ui-scroll-box.md +109 -0
- package/docs/tcloud-ui-search-bar.md +88 -0
- package/docs/tcloud-ui-search-in-object.md +143 -0
- package/docs/tcloud-ui-search-input.md +74 -0
- package/docs/tcloud-ui-skeleton-loading.md +394 -0
- package/docs/tcloud-ui-slide-toggle.md +210 -0
- package/docs/tcloud-ui-statusinfo.md +138 -0
- package/docs/tcloud-ui-tab-group.md +376 -0
- package/docs/tcloud-ui-tab-menu.md +109 -0
- package/docs/tcloud-ui-table.md +96 -0
- package/docs/tcloud-ui-tag.md +379 -0
- package/docs/tcloud-ui-tc-badge.md +168 -0
- package/docs/tcloud-ui-tc-btn.md +189 -0
- package/docs/tcloud-ui-tc-colors.md +204 -0
- package/docs/tcloud-ui-tc-form-control.md +200 -0
- package/docs/tcloud-ui-tc-text.md +139 -0
- package/docs/tcloud-ui-tc-title.md +118 -0
- package/docs/tcloud-ui-tcloud-form.md +55 -0
- package/docs/tcloud-ui-toast.md +83 -0
- package/docs/tcloud-ui-tooltip.md +88 -0
- package/docs/tcloud-ui-topology.md +232 -0
- package/docs/tcloud-ui-upload-area.md +195 -0
- package/docs/tcloud-ui-welcome.md +112 -0
- package/docs/tcloud-ui-wizard-steps.md +103 -0
- package/js/tcloud-ui-app.js +11 -0
- package/package.json +1 -1
- package/scss/tcloud-ui/styles/_claus-badge.scss +117 -0
- package/scss/tcloud-ui/styles/_claus-btn.scss +207 -0
- package/scss/tcloud-ui/styles/_claus-card.scss +12 -0
- package/scss/tcloud-ui/styles/_claus-colors.scss +192 -0
- package/scss/tcloud-ui/styles/_claus-form.scss +88 -0
- package/scss/tcloud-ui/styles/_claus-sizes.scss +28 -0
- package/scss/tcloud-ui/styles/_claus-spacers.scss +49 -0
- package/scss/tcloud-ui/styles/_claus-themes.scss +36 -0
- package/scss/tcloud-ui/styles/_claus-title.scss +24 -0
- package/scss/tcloud-ui/styles/_claus-typography.scss +70 -0
- package/scss/tcloud-ui/styles/_claus-variables.scss +131 -0
- package/scss/tcloud-ui/styles/_colors.scss +123 -0
- package/scss/tcloud-ui/styles/_tc-btn.scss +210 -0
- package/scss/tcloud-ui/styles/_tc-card.scss +7 -0
- package/scss/tcloud-ui/styles/_tc-title.scss +49 -0
- package/scss/tcloud-ui/styles.scss +35 -0
|
@@ -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
|
+
```
|