@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.
- 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-revitalizacao/components/_tcloud-ui-table.scss +95 -0
- package/scss/tcloud-revitalizacao/tc-rev-styles.scss +1 -1
- package/scss/tcloud-revitalizacao/components/_tc-rev-table.scss +0 -57
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
# Array To Text
|
|
2
|
+
|
|
3
|
+
O pipe **Array To Text** transforma um array em uma string formatada com separação por vírgulas e conjunção "e" antes do último elemento. É útil para exibir listas de valores de forma legível e gramaticalmente correta.
|
|
4
|
+
|
|
5
|
+
## Características
|
|
6
|
+
|
|
7
|
+
- **Formatação legível**: Converte arrays em texto com vírgulas e conjunção "e"
|
|
8
|
+
- **Tratamento de listas**: Separa items com ", " (vírgula-espaço)
|
|
9
|
+
- **Conjunção gramatical**: Usa "e " antes do último item
|
|
10
|
+
- **Validação de entrada**: Verifica se o array tem conteúdo antes de processar
|
|
11
|
+
- **Standalone**: Pode ser usado em qualquer template após importação no componente
|
|
12
|
+
|
|
13
|
+
## Instalação
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
import { TCloudUiModule } from 'projects/tcloud-ui/src/public-api';
|
|
17
|
+
|
|
18
|
+
@Component({
|
|
19
|
+
imports: [TCloudUiModule],
|
|
20
|
+
// ... resto da configuração
|
|
21
|
+
})
|
|
22
|
+
export class MyComponent {}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Propriedades (API)
|
|
26
|
+
|
|
27
|
+
### Nome do Pipe
|
|
28
|
+
|
|
29
|
+
| Nome | Descrição |
|
|
30
|
+
|------|-----------|
|
|
31
|
+
| `toText` | Nome do pipe usado na sintaxe de template |
|
|
32
|
+
|
|
33
|
+
### Transform
|
|
34
|
+
|
|
35
|
+
| Parâmetro | Tipo | Descrição |
|
|
36
|
+
|-----------|------|-----------|
|
|
37
|
+
| `value` | `any[]` | Array de valores a serem transformados em texto |
|
|
38
|
+
|
|
39
|
+
### Retorno
|
|
40
|
+
|
|
41
|
+
| Tipo | Descrição |
|
|
42
|
+
|------|-----------|
|
|
43
|
+
| `string` | String formatada com items separados por vírgulas e "e" antes do último item |
|
|
44
|
+
| `any` | Retorna o valor original se for vazio ou nulo |
|
|
45
|
+
|
|
46
|
+
## Comportamento de Transformação
|
|
47
|
+
|
|
48
|
+
### Regra de Formatação
|
|
49
|
+
|
|
50
|
+
O pipe segue a seguinte formatação:
|
|
51
|
+
- **Um item**: `valor1` → `valor1`
|
|
52
|
+
- **Dois items**: `[valor1, valor2]` → `valor1 e valor2`
|
|
53
|
+
- **Três ou mais items**: `[valor1, valor2, valor3]` → `valor1, valor2 e valor3`
|
|
54
|
+
|
|
55
|
+
### Exemplos de Transformação
|
|
56
|
+
|
|
57
|
+
| Input | Output |
|
|
58
|
+
|-------|--------|
|
|
59
|
+
| `['item']` | `item` |
|
|
60
|
+
| `['item1', 'item2']` | `item1 e item2` |
|
|
61
|
+
| `['item1', 'item2', 'item3']` | `item1, item2 e item3` |
|
|
62
|
+
| `['A', 'B', 'C', 'D']` | `A, B, C e D` |
|
|
63
|
+
| `[]` | `[]` |
|
|
64
|
+
| `null` | `null` |
|
|
65
|
+
|
|
66
|
+
## Exemplos de Uso
|
|
67
|
+
|
|
68
|
+
### Uso Básico
|
|
69
|
+
|
|
70
|
+
Transformação simples de um array em formato legível:
|
|
71
|
+
|
|
72
|
+
```typescript
|
|
73
|
+
@Component({
|
|
74
|
+
selector: 'app-array-basic',
|
|
75
|
+
imports: [CommonModule, TCloudUiModule],
|
|
76
|
+
template: `
|
|
77
|
+
<div>
|
|
78
|
+
<h3>Frutas Selecionadas:</h3>
|
|
79
|
+
<p>{{ fruits | toText }}</p>
|
|
80
|
+
</div>
|
|
81
|
+
`
|
|
82
|
+
})
|
|
83
|
+
export class ArrayBasicComponent {
|
|
84
|
+
fruits = ['Maçã', 'Banana', 'Laranja', 'Morango'];
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
**Output esperado:** `Maçã, Banana, Laranja e Morango`
|
|
89
|
+
|
|
90
|
+
### Uso com Listas Dinâmicas
|
|
91
|
+
|
|
92
|
+
Exibição de items selecionados com pipe:
|
|
93
|
+
|
|
94
|
+
```typescript
|
|
95
|
+
@Component({
|
|
96
|
+
selector: 'app-array-dynamic',
|
|
97
|
+
imports: [CommonModule, ReactiveFormsModule, TCloudUiModule],
|
|
98
|
+
template: `
|
|
99
|
+
<div>
|
|
100
|
+
<h3>Permissões Concedidas:</h3>
|
|
101
|
+
|
|
102
|
+
<div class="permissions-list">
|
|
103
|
+
<label *ngFor="let perm of availablePermissions">
|
|
104
|
+
<input
|
|
105
|
+
type="checkbox"
|
|
106
|
+
[value]="perm"
|
|
107
|
+
[formControl]="selectedPermissions"
|
|
108
|
+
>
|
|
109
|
+
{{ perm }}
|
|
110
|
+
</label>
|
|
111
|
+
</div>
|
|
112
|
+
|
|
113
|
+
<div *ngIf="selectedPermissions.value && selectedPermissions.value.length > 0" class="result">
|
|
114
|
+
<p><strong>Permissões ativas:</strong></p>
|
|
115
|
+
<p>{{ selectedPermissions.value | toText }}</p>
|
|
116
|
+
</div>
|
|
117
|
+
|
|
118
|
+
<div *ngIf="!selectedPermissions.value || selectedPermissions.value.length === 0" class="empty">
|
|
119
|
+
Nenhuma permissão selecionada
|
|
120
|
+
</div>
|
|
121
|
+
</div>
|
|
122
|
+
`
|
|
123
|
+
})
|
|
124
|
+
export class ArrayDynamicComponent {
|
|
125
|
+
availablePermissions = ['Leitura', 'Escrita', 'Exclusão', 'Exportação', 'Configuração'];
|
|
126
|
+
selectedPermissions = new FormControl([], { nonNullable: true });
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### Uso Avançado com Transformação de Dados
|
|
131
|
+
|
|
132
|
+
Pipeline de transformação para exibir dados estruturados:
|
|
133
|
+
|
|
134
|
+
```typescript
|
|
135
|
+
@Component({
|
|
136
|
+
selector: 'app-array-advanced',
|
|
137
|
+
imports: [CommonModule, TCloudUiModule],
|
|
138
|
+
template: `
|
|
139
|
+
<div class="recipients-group">
|
|
140
|
+
<h3>Configuração de E-mails</h3>
|
|
141
|
+
|
|
142
|
+
<div class="recipient-section">
|
|
143
|
+
<h4>Destinatários Para (To):</h4>
|
|
144
|
+
<div *ngIf="emailConfig.to.length > 0" class="email-list">
|
|
145
|
+
{{ emailConfig.to.map(e => e.email) | toText }}
|
|
146
|
+
</div>
|
|
147
|
+
<div *ngIf="emailConfig.to.length === 0" class="empty-state">
|
|
148
|
+
Nenhum destinatário adicionado
|
|
149
|
+
</div>
|
|
150
|
+
</div>
|
|
151
|
+
|
|
152
|
+
<div class="recipient-section">
|
|
153
|
+
<h4>Destinatários CC:</h4>
|
|
154
|
+
<div *ngIf="emailConfig.cc.length > 0" class="email-list">
|
|
155
|
+
{{ emailConfig.cc.map(e => e.email) | toText }}
|
|
156
|
+
</div>
|
|
157
|
+
<div *ngIf="emailConfig.cc.length === 0" class="empty-state">
|
|
158
|
+
Nenhum CC adicionado
|
|
159
|
+
</div>
|
|
160
|
+
</div>
|
|
161
|
+
|
|
162
|
+
<div class="recipient-section">
|
|
163
|
+
<h4>Tópicos Relacionados:</h4>
|
|
164
|
+
<div *ngIf="topics.length > 0">
|
|
165
|
+
{{ topics | toText }}
|
|
166
|
+
</div>
|
|
167
|
+
</div>
|
|
168
|
+
|
|
169
|
+
<div class="preview">
|
|
170
|
+
<h4>Prévia do Resumo:</h4>
|
|
171
|
+
<p>Este e-mail será enviado para {{ emailConfig.to.length }} destinatário(s) {{ (emailConfig.cc.length > 0 ? 'com ' + emailConfig.cc.length + ' em cópia' : 'sem cópia') }}.</p>
|
|
172
|
+
<p *ngIf="topics.length > 0">Tópicos abordados: {{ topics | toText }}</p>
|
|
173
|
+
</div>
|
|
174
|
+
</div>
|
|
175
|
+
`
|
|
176
|
+
})
|
|
177
|
+
export class ArrayAdvancedComponent {
|
|
178
|
+
emailConfig = {
|
|
179
|
+
to: [
|
|
180
|
+
{ email: 'user1@example.com', name: 'Usuário 1' },
|
|
181
|
+
{ email: 'user2@example.com', name: 'Usuário 2' },
|
|
182
|
+
{ email: 'user3@example.com', name: 'Usuário 3' }
|
|
183
|
+
],
|
|
184
|
+
cc: [
|
|
185
|
+
{ email: 'admin@example.com', name: 'Administrador' }
|
|
186
|
+
]
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
topics = ['Relatório Mensal', 'Planejamento Q1', 'Performance de Vendas'];
|
|
190
|
+
}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### Uso com Filtros e Busca
|
|
194
|
+
|
|
195
|
+
Aplicar o pipe após transformar dados verificados:
|
|
196
|
+
|
|
197
|
+
```typescript
|
|
198
|
+
@Component({
|
|
199
|
+
selector: 'app-array-filtered',
|
|
200
|
+
imports: [CommonModule, FormsModule, TCloudUiModule],
|
|
201
|
+
template: `
|
|
202
|
+
<div>
|
|
203
|
+
<h3>Filtrar e Exibir Departamentos</h3>
|
|
204
|
+
|
|
205
|
+
<input
|
|
206
|
+
type="text"
|
|
207
|
+
placeholder="Buscar departamento..."
|
|
208
|
+
[(ngModel)]="searchTerm"
|
|
209
|
+
(ngModelChange)="filterDepartments()"
|
|
210
|
+
>
|
|
211
|
+
|
|
212
|
+
<div *ngIf="filteredDepartments.length > 0" class="result">
|
|
213
|
+
<p><strong>Departamentos encontrados:</strong></p>
|
|
214
|
+
<p>{{ filteredDepartments | toText }}</p>
|
|
215
|
+
</div>
|
|
216
|
+
|
|
217
|
+
<div *ngIf="filteredDepartments.length === 0 && searchTerm" class="no-results">
|
|
218
|
+
Nenhum departamento encontrado para "{{ searchTerm }}"
|
|
219
|
+
</div>
|
|
220
|
+
|
|
221
|
+
<div *ngIf="filteredDepartments.length === 0 && !searchTerm" class="info">
|
|
222
|
+
Digite para filtrar departamentos
|
|
223
|
+
</div>
|
|
224
|
+
|
|
225
|
+
<div class="all-departments">
|
|
226
|
+
<h4>Todos os Departamentos ({{ departments.length }}):</h4>
|
|
227
|
+
<p>{{ departments | toText }}</p>
|
|
228
|
+
</div>
|
|
229
|
+
</div>
|
|
230
|
+
`
|
|
231
|
+
})
|
|
232
|
+
export class ArrayFilteredComponent {
|
|
233
|
+
departments = [
|
|
234
|
+
'Desenvolvimento',
|
|
235
|
+
'Design',
|
|
236
|
+
'Recursos Humanos',
|
|
237
|
+
'Financeiro',
|
|
238
|
+
'Vendas',
|
|
239
|
+
'Suporte',
|
|
240
|
+
'Operações',
|
|
241
|
+
'Marketing'
|
|
242
|
+
];
|
|
243
|
+
|
|
244
|
+
filteredDepartments: string[] = [];
|
|
245
|
+
searchTerm: string = '';
|
|
246
|
+
|
|
247
|
+
ngOnInit() {
|
|
248
|
+
this.filteredDepartments = [...this.departments];
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
filterDepartments() {
|
|
252
|
+
if (!this.searchTerm.trim()) {
|
|
253
|
+
this.filteredDepartments = [...this.departments];
|
|
254
|
+
} else {
|
|
255
|
+
this.filteredDepartments = this.departments.filter(dept =>
|
|
256
|
+
dept.toLowerCase().includes(this.searchTerm.toLowerCase())
|
|
257
|
+
);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
### Uso com Validação de Formulário
|
|
264
|
+
|
|
265
|
+
Exibir campos com erro usando o pipe:
|
|
266
|
+
|
|
267
|
+
```typescript
|
|
268
|
+
@Component({
|
|
269
|
+
selector: 'app-array-validation',
|
|
270
|
+
imports: [CommonModule, ReactiveFormsModule, TCloudUiModule],
|
|
271
|
+
template: `
|
|
272
|
+
<form [formGroup]="form">
|
|
273
|
+
<div class="form-group">
|
|
274
|
+
<label>Nome:</label>
|
|
275
|
+
<input formControlName="name" type="text">
|
|
276
|
+
</div>
|
|
277
|
+
|
|
278
|
+
<div class="form-group">
|
|
279
|
+
<label>Email:</label>
|
|
280
|
+
<input formControlName="email" type="email">
|
|
281
|
+
</div>
|
|
282
|
+
|
|
283
|
+
<div class="form-group">
|
|
284
|
+
<label>Telefone:</label>
|
|
285
|
+
<input formControlName="phone" type="tel">
|
|
286
|
+
</div>
|
|
287
|
+
|
|
288
|
+
<button (click)="validate()">Validar</button>
|
|
289
|
+
|
|
290
|
+
<div *ngIf="errorFields.length > 0" class="error-summary">
|
|
291
|
+
<h4>Campos com erro:</h4>
|
|
292
|
+
<p>{{ errorFields | toText }}</p>
|
|
293
|
+
<ul>
|
|
294
|
+
<li *ngFor="let field of errorFields">
|
|
295
|
+
{{ field }}: {{ getFieldError(field) }}
|
|
296
|
+
</li>
|
|
297
|
+
</ul>
|
|
298
|
+
</div>
|
|
299
|
+
|
|
300
|
+
<div *ngIf="isValid && errorFields.length === 0" class="success">
|
|
301
|
+
✓ Formulário válido!
|
|
302
|
+
</div>
|
|
303
|
+
</form>
|
|
304
|
+
`
|
|
305
|
+
})
|
|
306
|
+
export class ArrayValidationComponent {
|
|
307
|
+
form: FormGroup;
|
|
308
|
+
errorFields: string[] = [];
|
|
309
|
+
isValid: boolean = false;
|
|
310
|
+
|
|
311
|
+
constructor(private fb: FormBuilder) {
|
|
312
|
+
this.form = this.fb.group({
|
|
313
|
+
name: ['', [Validators.required, Validators.minLength(3)]],
|
|
314
|
+
email: ['', [Validators.required, Validators.email]],
|
|
315
|
+
phone: ['', Validators.required]
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
validate() {
|
|
320
|
+
this.errorFields = [];
|
|
321
|
+
this.isValid = false;
|
|
322
|
+
|
|
323
|
+
Object.keys(this.form.controls).forEach(fieldName => {
|
|
324
|
+
const field = this.form.get(fieldName);
|
|
325
|
+
if (field && field.invalid) {
|
|
326
|
+
this.errorFields.push(fieldName);
|
|
327
|
+
}
|
|
328
|
+
});
|
|
329
|
+
|
|
330
|
+
this.isValid = this.errorFields.length === 0;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
getFieldError(fieldName: string): string {
|
|
334
|
+
const field = this.form.get(fieldName);
|
|
335
|
+
if (field?.hasError('required')) {
|
|
336
|
+
return 'Campo obrigatório';
|
|
337
|
+
}
|
|
338
|
+
if (field?.hasError('minlength')) {
|
|
339
|
+
return 'Deve conter pelo menos 3 caracteres';
|
|
340
|
+
}
|
|
341
|
+
if (field?.hasError('email')) {
|
|
342
|
+
return 'Email inválido';
|
|
343
|
+
}
|
|
344
|
+
return 'Erro de validação';
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
## Notas de Implementação
|
|
350
|
+
|
|
351
|
+
- O pipe é **standalone** e pode ser importado diretamente em componentes
|
|
352
|
+
- A transformação ocorre no template usando a sintaxe de pipe Angular: `{{ array | toText }}`
|
|
353
|
+
- Se o array estiver vazio ou nulo, retorna o valor original sem transformação
|
|
354
|
+
- O pipe funciona com arrays de qualquer tipo (strings, números, objetos)
|
|
355
|
+
- A formatação usa ", " (vírgula com espaço) como separador entre items
|
|
356
|
+
- Usa " e " (espaço-e-espaço) como conjunção antes do último item
|
|
357
|
+
- Não há limite de items - funciona com arrays de qualquer tamanho
|
|
358
|
+
- O pipe é **imutável** - não modifica o array original
|
|
359
|
+
- Para arrays com um único item, retorna apenas esse item sem separadores
|
|
360
|
+
- A transformação responde a mudanças do array em tempo real (change detection)
|
|
361
|
+
- Pode ser combinado com outros pipes (ex: `{{ items | filter:condition | toText }}`)
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# Breadcrumb
|
|
2
|
+
|
|
3
|
+
Componente de navegação breadcrumb que exibe o caminho hierárquico da página atual, permitindo navegação rápida entre níveis.
|
|
4
|
+
|
|
5
|
+
## Características
|
|
6
|
+
|
|
7
|
+
- Exibe trilha de navegação hierárquica
|
|
8
|
+
- Ícone de "home" com link para o dashboard
|
|
9
|
+
- Separadores visuais entre itens (chevron)
|
|
10
|
+
- Último item aparece como texto (sem link), indicando a página atual
|
|
11
|
+
- Navegação por clique nos itens intermediários
|
|
12
|
+
- Serviço injetável (`TCloudUiBreadcrumbService`) para gerenciar os itens do breadcrumb de qualquer componente
|
|
13
|
+
- Suporte a adição e remoção dinâmica de níveis
|
|
14
|
+
|
|
15
|
+
## Instalação
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
import { TCloudUiModule } from 'tcloud-ui';
|
|
19
|
+
|
|
20
|
+
@NgModule({
|
|
21
|
+
imports: [TCloudUiModule]
|
|
22
|
+
})
|
|
23
|
+
export class AppModule { }
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Ou importe o componente standalone diretamente:
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
import { TCloudUiBreadcrumbComponent } from 'tcloud-ui';
|
|
30
|
+
|
|
31
|
+
@Component({
|
|
32
|
+
imports: [TCloudUiBreadcrumbComponent]
|
|
33
|
+
})
|
|
34
|
+
export class MeuComponent { }
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## API - Serviço (`TCloudUiBreadcrumbService`)
|
|
38
|
+
|
|
39
|
+
### Interface `BreadcrumbItem`
|
|
40
|
+
|
|
41
|
+
| Propriedade | Tipo | Descrição |
|
|
42
|
+
|-------------|----------|------------------------------------------|
|
|
43
|
+
| `label` | `string` | Texto exibido no item do breadcrumb |
|
|
44
|
+
| `url` | `string` | URL de navegação (opcional no último item)|
|
|
45
|
+
|
|
46
|
+
### Métodos
|
|
47
|
+
|
|
48
|
+
| Método | Parâmetro | Descrição |
|
|
49
|
+
|---------------------|------------------------|--------------------------------------------------|
|
|
50
|
+
| `setBreadcrumb` | `items: BreadcrumbItem[]` | Define a lista completa de itens do breadcrumb |
|
|
51
|
+
| `addLevel` | `item: BreadcrumbItem` | Adiciona um novo nível ao final do breadcrumb |
|
|
52
|
+
| `removeLastLevel` | — | Remove o último nível do breadcrumb |
|
|
53
|
+
| `clear` | — | Limpa todos os itens do breadcrumb |
|
|
54
|
+
|
|
55
|
+
### Observable
|
|
56
|
+
|
|
57
|
+
| Nome | Tipo | Descrição |
|
|
58
|
+
|-----------------|-------------------------------|----------------------------------------|
|
|
59
|
+
| `breadcrumbs$` | `Observable<BreadcrumbItem[]>`| Observable com a lista atual de itens |
|
|
60
|
+
|
|
61
|
+
## Exemplos de Uso
|
|
62
|
+
|
|
63
|
+
### Uso Básico
|
|
64
|
+
|
|
65
|
+
No template:
|
|
66
|
+
|
|
67
|
+
```html
|
|
68
|
+
<tcloud-ui-breadcrumb></tcloud-ui-breadcrumb>
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
No componente, defina os itens via serviço:
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
import { TCloudUiBreadcrumbService } from 'tcloud-ui';
|
|
75
|
+
|
|
76
|
+
export class MinhaPaginaComponent implements OnInit {
|
|
77
|
+
|
|
78
|
+
constructor(private breadcrumbService: TCloudUiBreadcrumbService) {}
|
|
79
|
+
|
|
80
|
+
ngOnInit(): void {
|
|
81
|
+
this.breadcrumbService.setBreadcrumb([
|
|
82
|
+
{ label: 'Home', url: '/dashboard' },
|
|
83
|
+
{ label: 'Produtos', url: '/produtos' },
|
|
84
|
+
{ label: 'Detalhes' }
|
|
85
|
+
]);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Uso Avançado
|
|
91
|
+
|
|
92
|
+
Adicionando níveis dinamicamente conforme a navegação:
|
|
93
|
+
|
|
94
|
+
```typescript
|
|
95
|
+
// Ao entrar em um sub-nível
|
|
96
|
+
this.breadcrumbService.addLevel({ label: 'Edição', url: '/produtos/editar' });
|
|
97
|
+
|
|
98
|
+
// Ao voltar, remover o último nível
|
|
99
|
+
this.breadcrumbService.removeLastLevel();
|
|
100
|
+
|
|
101
|
+
// Limpar completamente ao sair de uma seção
|
|
102
|
+
this.breadcrumbService.clear();
|
|
103
|
+
```
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# BytesPipe
|
|
2
|
+
|
|
3
|
+
O pipe `bytes` converte valores numéricos representando tamanhos de dados em uma string legível com a unidade apropriada (Bytes, KB, MB, GB, TB, PB, EB, ZB, YB). A conversão é automática com base na magnitude do valor, utilizando potências de 1024. Aceita um parâmetro opcional para indicar que o valor de entrada já está em KB ou MB, realizando a conversão para bytes antes de formatar.
|
|
4
|
+
|
|
5
|
+
## Características
|
|
6
|
+
|
|
7
|
+
- Conversão automática de bytes para a unidade mais adequada (Bytes, KB, MB, GB, TB, etc.)
|
|
8
|
+
- Suporte a parâmetro opcional `typeValue` para indicar a unidade de entrada (`'kb'` ou `'mb'`)
|
|
9
|
+
- Precisão de 2 casas decimais por padrão
|
|
10
|
+
- Retorna `'---'` para valores falsy (null, undefined, vazio)
|
|
11
|
+
- Retorna `'0 Bytes'` para o valor zero
|
|
12
|
+
- Pipe standalone
|
|
13
|
+
|
|
14
|
+
## Instalação
|
|
15
|
+
|
|
16
|
+
Importe o pipe diretamente no módulo ou componente standalone:
|
|
17
|
+
|
|
18
|
+
```typescript
|
|
19
|
+
import { BytesPipe } from 'tcloud-ui';
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## API
|
|
23
|
+
|
|
24
|
+
### Sintaxe do Pipe
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
{{ valor | bytes }}
|
|
28
|
+
{{ valor | bytes:'kb' }}
|
|
29
|
+
{{ valor | bytes:'mb' }}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Parâmetros
|
|
33
|
+
|
|
34
|
+
| Parâmetro | Tipo | Obrigatório | Descrição |
|
|
35
|
+
|-------------|----------|-------------|----------------------------------------------------------------------------------------------|
|
|
36
|
+
| `typeValue` | `string` | Não | Unidade do valor de entrada. Valores aceitos: `'kb'` (kilobytes) ou `'mb'` (megabytes). Quando informado, o valor é convertido para bytes antes da formatação |
|
|
37
|
+
|
|
38
|
+
### Tabela de Conversão
|
|
39
|
+
|
|
40
|
+
| Unidade | Faixa |
|
|
41
|
+
|---------|------------------------------|
|
|
42
|
+
| Bytes | 0 – 1.023 |
|
|
43
|
+
| KB | 1.024 – 1.048.575 |
|
|
44
|
+
| MB | 1.048.576 – 1.073.741.823 |
|
|
45
|
+
| GB | 1.073.741.824 – 1.099.511.627.775 |
|
|
46
|
+
| TB | 1.099.511.627.776+ |
|
|
47
|
+
|
|
48
|
+
## Exemplos de Uso
|
|
49
|
+
|
|
50
|
+
### Básico — Conversão automática a partir de bytes
|
|
51
|
+
|
|
52
|
+
```html
|
|
53
|
+
<p>{{ 123456789 | bytes }}</p>
|
|
54
|
+
<!-- Resultado: 117.74 MB -->
|
|
55
|
+
|
|
56
|
+
<p>{{ 1024 | bytes }}</p>
|
|
57
|
+
<!-- Resultado: 1 KB -->
|
|
58
|
+
|
|
59
|
+
<p>{{ 0 | bytes }}</p>
|
|
60
|
+
<!-- Resultado: 0 Bytes -->
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
```typescript
|
|
64
|
+
import { BytesPipe } from 'tcloud-ui';
|
|
65
|
+
|
|
66
|
+
@Component({
|
|
67
|
+
standalone: true,
|
|
68
|
+
imports: [BytesPipe],
|
|
69
|
+
template: `
|
|
70
|
+
<p>{{ valorBytes | bytes }}</p>
|
|
71
|
+
`
|
|
72
|
+
})
|
|
73
|
+
export class ExemploBasicoComponent {
|
|
74
|
+
valorBytes = 123456789;
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### Avançado — Valor de entrada em KB ou MB
|
|
79
|
+
|
|
80
|
+
```html
|
|
81
|
+
<!-- Entrada em kilobytes -->
|
|
82
|
+
<p>{{ 2048 | bytes:'kb' }}</p>
|
|
83
|
+
<!-- Resultado: 2 MB (2048 KB = 2.097.152 bytes = 2 MB) -->
|
|
84
|
+
|
|
85
|
+
<!-- Entrada em megabytes -->
|
|
86
|
+
<p>{{ 5 | bytes:'mb' }}</p>
|
|
87
|
+
<!-- Resultado: 5 MB (5 MB = 5.242.880 bytes = 5 MB) -->
|
|
88
|
+
|
|
89
|
+
<!-- Entrada em megabytes com valor grande -->
|
|
90
|
+
<p>{{ 2500 | bytes:'mb' }}</p>
|
|
91
|
+
<!-- Resultado: 2.44 GB -->
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
```typescript
|
|
95
|
+
import { BytesPipe } from 'tcloud-ui';
|
|
96
|
+
|
|
97
|
+
@Component({
|
|
98
|
+
standalone: true,
|
|
99
|
+
imports: [BytesPipe],
|
|
100
|
+
template: `
|
|
101
|
+
<p>{{ armazenamentoKB | bytes:'kb' }}</p>
|
|
102
|
+
<p>{{ armazenamentoMB | bytes:'mb' }}</p>
|
|
103
|
+
`
|
|
104
|
+
})
|
|
105
|
+
export class ExemploAvancadoComponent {
|
|
106
|
+
armazenamentoKB = 2048;
|
|
107
|
+
armazenamentoMB = 5;
|
|
108
|
+
}
|
|
109
|
+
```
|