@dev-tcloud/tcloud-ui 6.15.0 → 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
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
# Input Password
|
|
2
|
+
|
|
3
|
+
## Características
|
|
4
|
+
- Componente standalone para entrada de senhas com validação robusta.
|
|
5
|
+
- Suporta validação customizável: letras maiúsculas, minúsculas, caracteres especiais, comprimento mínimo.
|
|
6
|
+
- Regex de validação gerado dinamicamente baseado nas propriedades de configuração.
|
|
7
|
+
- Ações integradas: visualizar/ocultar senha, gerar senha aleatória, copiar para clipboard.
|
|
8
|
+
- Feedback visual de cópia: ícone muda para checkmark por 3 segundos ao copiar.
|
|
9
|
+
- Toggle entre modo password (mascarado) e text (visível).
|
|
10
|
+
- Integração com ngModel (two-way binding) via ControlValueAccessor.
|
|
11
|
+
- Suporte a padrão HTML5 pattern para validação.
|
|
12
|
+
|
|
13
|
+
## Instalação
|
|
14
|
+
```ts
|
|
15
|
+
import { TCloudUiInputPasswordComponent } from 'projects/tcloud-ui/src/public-api';
|
|
16
|
+
|
|
17
|
+
@Component({
|
|
18
|
+
selector: 'app-example',
|
|
19
|
+
standalone: true,
|
|
20
|
+
imports: [TCloudUiInputPasswordComponent],
|
|
21
|
+
template: `<tcloud-ui-input-password [(ngModel)]="password"></tcloud-ui-input-password>`
|
|
22
|
+
})
|
|
23
|
+
export class ExampleComponent {
|
|
24
|
+
password: string = '';
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Propriedades (API)
|
|
29
|
+
### Inputs
|
|
30
|
+
| Nome | Tipo | Descrição | Valor Default |
|
|
31
|
+
| --- | --- | --- | --- |
|
|
32
|
+
| actionView | boolean | Se true, exibe botão para visualizar/ocultar a senha. | true |
|
|
33
|
+
| actionCopy | boolean | Se true, exibe botão para copiar a senha ao clipboard. | true |
|
|
34
|
+
| actionGeneratePassword | boolean | Se true, exibe botão para gerar uma senha aleatória. | true |
|
|
35
|
+
| numberOfCharacter | number | Comprimento mínimo da senha (e tamanho base para geração). | 14 |
|
|
36
|
+
| atLeastOneUppercaseLetter | boolean | Se true, valida presença de pelo menos uma letra maiúscula. | true |
|
|
37
|
+
| atLeastOneLowercaseLetter | boolean | Se true, valida presença de pelo menos uma letra minúscula. | true |
|
|
38
|
+
| atLeastOneSpecialCharacter | boolean | Se true, valida presença de pelo menos um caractere especial. | true |
|
|
39
|
+
| ngModel | string | Valor da senha (two-way binding). | '' |
|
|
40
|
+
|
|
41
|
+
### Outputs
|
|
42
|
+
| Nome | Tipo de Evento | Descrição |
|
|
43
|
+
| --- | --- | --- |
|
|
44
|
+
| ngModelChange | EventEmitter<string> | Emite quando a senha é alterada. |
|
|
45
|
+
|
|
46
|
+
## Exemplos de Uso
|
|
47
|
+
### Uso Básico
|
|
48
|
+
```html
|
|
49
|
+
<tcloud-ui-input-password [(ngModel)]="password"></tcloud-ui-input-password>
|
|
50
|
+
|
|
51
|
+
<p>Senha: {{ password }}</p>
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Componente:
|
|
55
|
+
```ts
|
|
56
|
+
export class ExampleComponent {
|
|
57
|
+
password: string = '';
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Sem Ação de Gerar Senha
|
|
62
|
+
```html
|
|
63
|
+
<tcloud-ui-input-password
|
|
64
|
+
[(ngModel)]="password"
|
|
65
|
+
[actionGeneratePassword]="false">
|
|
66
|
+
</tcloud-ui-input-password>
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Com Apenas Ação de Visualizar
|
|
70
|
+
```html
|
|
71
|
+
<tcloud-ui-input-password
|
|
72
|
+
[(ngModel)]="password"
|
|
73
|
+
[actionCopy]="false"
|
|
74
|
+
[actionGeneratePassword]="false">
|
|
75
|
+
</tcloud-ui-input-password>
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### Sem Nenhuma Ação (apenas input)
|
|
79
|
+
```html
|
|
80
|
+
<tcloud-ui-input-password
|
|
81
|
+
[(ngModel)]="password"
|
|
82
|
+
[actionView]="false"
|
|
83
|
+
[actionCopy]="false"
|
|
84
|
+
[actionGeneratePassword]="false">
|
|
85
|
+
</tcloud-ui-input-password>
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Customizando Validação - Sem Requisitos Especiais
|
|
89
|
+
```html
|
|
90
|
+
<tcloud-ui-input-password
|
|
91
|
+
[(ngModel)]="password"
|
|
92
|
+
[numberOfCharacter]="8"
|
|
93
|
+
[atLeastOneUppercaseLetter]="false"
|
|
94
|
+
[atLeastOneSpecialCharacter]="false">
|
|
95
|
+
</tcloud-ui-input-password>
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Uso Avançado
|
|
99
|
+
### Validação Rigorosa - Apenas Maiúsculas, Minúsculas e Números
|
|
100
|
+
```html
|
|
101
|
+
<tcloud-ui-input-password
|
|
102
|
+
[(ngModel)]="password"
|
|
103
|
+
[numberOfCharacter]="12"
|
|
104
|
+
[atLeastOneUppercaseLetter]="true"
|
|
105
|
+
[atLeastOneLowercaseLetter]="true"
|
|
106
|
+
[atLeastOneSpecialCharacter]="false">
|
|
107
|
+
</tcloud-ui-input-password>
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Comprimento Customizado
|
|
111
|
+
```html
|
|
112
|
+
<!-- Senha curta (8 caracteres) -->
|
|
113
|
+
<tcloud-ui-input-password
|
|
114
|
+
[(ngModel)]="shortPassword"
|
|
115
|
+
[numberOfCharacter]="8">
|
|
116
|
+
</tcloud-ui-input-password>
|
|
117
|
+
|
|
118
|
+
<!-- Senha alongada (20 caracteres) -->
|
|
119
|
+
<tcloud-ui-input-password
|
|
120
|
+
[(ngModel)]="longPassword"
|
|
121
|
+
[numberOfCharacter]="20">
|
|
122
|
+
</tcloud-ui-input-password>
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### Em Formulário com Validação
|
|
126
|
+
```html
|
|
127
|
+
<form #passwordForm="ngForm">
|
|
128
|
+
<div>
|
|
129
|
+
<label>Nova Senha:</label>
|
|
130
|
+
<tcloud-ui-input-password
|
|
131
|
+
name="password"
|
|
132
|
+
[(ngModel)]="password"
|
|
133
|
+
(ngModelChange)="onPasswordChange($event)">
|
|
134
|
+
</tcloud-ui-input-password>
|
|
135
|
+
</div>
|
|
136
|
+
|
|
137
|
+
<div *ngIf="password && !isPasswordValid()">
|
|
138
|
+
<p class="error">Senha não atende aos requisitos</p>
|
|
139
|
+
</div>
|
|
140
|
+
|
|
141
|
+
<button [disabled]="!passwordForm.valid">Salvar</button>
|
|
142
|
+
</form>
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Componente:
|
|
146
|
+
```ts
|
|
147
|
+
export class PasswordFormComponent {
|
|
148
|
+
password: string = '';
|
|
149
|
+
numberOfCharacter: number = 14;
|
|
150
|
+
atLeastOneUppercaseLetter: boolean = true;
|
|
151
|
+
atLeastOneLowercaseLetter: boolean = true;
|
|
152
|
+
atLeastOneSpecialCharacter: boolean = true;
|
|
153
|
+
|
|
154
|
+
onPasswordChange(newPassword: string) {
|
|
155
|
+
console.log('Senha alterada:', newPassword);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
isPasswordValid(): boolean {
|
|
159
|
+
if (this.password.length < this.numberOfCharacter) return false;
|
|
160
|
+
if (this.atLeastOneUppercaseLetter && !/[A-Z]/.test(this.password)) return false;
|
|
161
|
+
if (this.atLeastOneLowercaseLetter && !/[a-z]/.test(this.password)) return false;
|
|
162
|
+
if (this.atLeastOneSpecialCharacter && !/[!@#$%^&*()_+{}[\]:;<>,.?/~]/.test(this.password)) return false;
|
|
163
|
+
return true;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### Gerador de Senha com Customização
|
|
169
|
+
```ts
|
|
170
|
+
export class PasswordGeneratorComponent {
|
|
171
|
+
generatedPassword: string = '';
|
|
172
|
+
passwordLength: number = 16;
|
|
173
|
+
|
|
174
|
+
generateNewPassword() {
|
|
175
|
+
// Aciona o gerador via botão no componente
|
|
176
|
+
// Ou manualmente:
|
|
177
|
+
const uppercaseLetters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
|
178
|
+
const lowercaseLetters = 'abcdefghijklmnopqrstuvwxyz';
|
|
179
|
+
const numbers = '0123456789';
|
|
180
|
+
const specialCharacters = '!@#$%^&*()_+{}[]:;<>,.?/~';
|
|
181
|
+
const allCharacters = uppercaseLetters + lowercaseLetters + numbers + specialCharacters;
|
|
182
|
+
|
|
183
|
+
let password = '';
|
|
184
|
+
password += uppercaseLetters[Math.floor(Math.random() * uppercaseLetters.length)];
|
|
185
|
+
password += lowercaseLetters[Math.floor(Math.random() * lowercaseLetters.length)];
|
|
186
|
+
password += specialCharacters[Math.floor(Math.random() * specialCharacters.length)];
|
|
187
|
+
|
|
188
|
+
for (let i = password.length; i < this.passwordLength; i++) {
|
|
189
|
+
password += allCharacters[Math.floor(Math.random() * allCharacters.length)];
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
this.generatedPassword = password.split('').sort(() => Math.random() - 0.5).join('');
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
```html
|
|
198
|
+
<div>
|
|
199
|
+
<label>Comprimento da Senha:</label>
|
|
200
|
+
<input type="number" [(ngModel)]="passwordLength" min="8" max="32">
|
|
201
|
+
|
|
202
|
+
<button (click)="generateNewPassword()">Gerar Nova Senha</button>
|
|
203
|
+
|
|
204
|
+
<tcloud-ui-input-password
|
|
205
|
+
[(ngModel)]="generatedPassword"
|
|
206
|
+
[numberOfCharacter]="passwordLength"
|
|
207
|
+
readonly>
|
|
208
|
+
</tcloud-ui-input-password>
|
|
209
|
+
</div>
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
### Com Múltiplos Níveis de Segurança
|
|
213
|
+
```ts
|
|
214
|
+
export class PasswordSecurityComponent {
|
|
215
|
+
password: string = '';
|
|
216
|
+
securityLevel: 'low' | 'medium' | 'high' = 'high';
|
|
217
|
+
|
|
218
|
+
getPasswordConfig() {
|
|
219
|
+
const configs = {
|
|
220
|
+
low: { numberOfCharacter: 6, atLeastOneUppercaseLetter: false, atLeastOneSpecialCharacter: false },
|
|
221
|
+
medium: { numberOfCharacter: 10, atLeastOneUppercaseLetter: true, atLeastOneSpecialCharacter: false },
|
|
222
|
+
high: { numberOfCharacter: 14, atLeastOneUppercaseLetter: true, atLeastOneSpecialCharacter: true }
|
|
223
|
+
};
|
|
224
|
+
return configs[this.securityLevel];
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
```html
|
|
230
|
+
<div>
|
|
231
|
+
<label>Nível de Segurança:</label>
|
|
232
|
+
<select [(ngModel)]="securityLevel">
|
|
233
|
+
<option value="low">Baixo (6 caracteres)</option>
|
|
234
|
+
<option value="medium">Médio (10 caracteres, maiúsculas)</option>
|
|
235
|
+
<option value="high">Alto (14 caracteres, maiúsculas, especiais)</option>
|
|
236
|
+
</select>
|
|
237
|
+
|
|
238
|
+
<tcloud-ui-input-password
|
|
239
|
+
[(ngModel)]="password"
|
|
240
|
+
[numberOfCharacter]="getPasswordConfig().numberOfCharacter"
|
|
241
|
+
[atLeastOneUppercaseLetter]="getPasswordConfig().atLeastOneUppercaseLetter"
|
|
242
|
+
[atLeastOneSpecialCharacter]="getPasswordConfig().atLeastOneSpecialCharacter">
|
|
243
|
+
</tcloud-ui-input-password>
|
|
244
|
+
</div>
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
## Validação
|
|
248
|
+
A senha é validada através de um regex dinâmico com as seguintes regras:
|
|
249
|
+
- **Comprimento mínimo**: Configurável via `numberOfCharacter`
|
|
250
|
+
- **Letra maiúscula**: Validada se `atLeastOneUppercaseLetter=true`
|
|
251
|
+
- **Letra minúscula**: Validada se `atLeastOneLowercaseLetter=true`
|
|
252
|
+
- **Caractere especial**: Validada se `atLeastOneSpecialCharacter=true`
|
|
253
|
+
- Caracteres especiais reconhecidos: `!@#$%^&*()_+{}[]:;<>,.?/~`
|
|
254
|
+
|
|
255
|
+
Exemplos de regex gerados:
|
|
256
|
+
- Com todos os requisitos (14+ caracteres): `^(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*\(\)_+\{\}\[\]:;<>,.?\/~])(?!.*\s).{14,}$`
|
|
257
|
+
- Sem caracteres especiais: `^(?=.*[A-Z])(?=.*[a-z]).{14,}$`
|
|
258
|
+
- Comprimento mínimo apenas: `^.{14,}$`
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
# Input Search
|
|
2
|
+
|
|
3
|
+
## Características
|
|
4
|
+
- Componente standalone para busca full-text em arrays de objetos.
|
|
5
|
+
- Suporta dois modos: **mirror** (exibe todos os itens, filtrando visualmente) e **não mirror** (exibe apenas resultados encontrados).
|
|
6
|
+
- Normalização automática: ignora maiúsculas, minúsculas, acentos e caracteres especiais.
|
|
7
|
+
- Busca em todos os campos do objeto ou apenas em campos selecionados.
|
|
8
|
+
- Suporte a busca em dados aninhados e datas.
|
|
9
|
+
- Botões integrados: ícone de busca (quando vazio) e ícone de limpeza (quando preenchido).
|
|
10
|
+
- Placeholder customizável.
|
|
11
|
+
- Emite resultados através do evento `found`.
|
|
12
|
+
|
|
13
|
+
## Instalação
|
|
14
|
+
```ts
|
|
15
|
+
import { TCloudUiInputSearchComponent } from 'projects/tcloud-ui/src/public-api';
|
|
16
|
+
|
|
17
|
+
@Component({
|
|
18
|
+
selector: 'app-example',
|
|
19
|
+
standalone: true,
|
|
20
|
+
imports: [TCloudUiInputSearchComponent],
|
|
21
|
+
template: `
|
|
22
|
+
<tcloud-ui-input-search
|
|
23
|
+
[base_object]="items"
|
|
24
|
+
(found)="searchResult = $event">
|
|
25
|
+
</tcloud-ui-input-search>
|
|
26
|
+
`
|
|
27
|
+
})
|
|
28
|
+
export class ExampleComponent {
|
|
29
|
+
items: any[] = [...];
|
|
30
|
+
searchResult: any[] = [];
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Propriedades (API)
|
|
35
|
+
### Inputs
|
|
36
|
+
| Nome | Tipo | Descrição | Valor Default |
|
|
37
|
+
| --- | --- | --- | --- |
|
|
38
|
+
| base_object | any[] | Array de objetos ou dados simples a serem pesquisados. | undefined |
|
|
39
|
+
| placeholder | string | Texto exibido no input quando vazio. | 'Procurar...' |
|
|
40
|
+
| mirror | boolean | Se true, exibe todos os itens espelhados (com destaque). Se false, exibe apenas os resultados encontrados. | true |
|
|
41
|
+
|
|
42
|
+
### Outputs
|
|
43
|
+
| Nome | Tipo de Evento | Descrição |
|
|
44
|
+
| --- | --- | --- |
|
|
45
|
+
| found | EventEmitter<any[]> | Emite o array de resultados encontrados. |
|
|
46
|
+
|
|
47
|
+
## Exemplos de Uso
|
|
48
|
+
### Uso Básico com Array de Objetos
|
|
49
|
+
```ts
|
|
50
|
+
export class ExampleComponent {
|
|
51
|
+
items = [
|
|
52
|
+
{ id: 1, name: 'João Silva', city: 'São Paulo' },
|
|
53
|
+
{ id: 2, name: 'Maria Santos', city: 'Rio de Janeiro' },
|
|
54
|
+
{ id: 3, name: 'Pedro Oliveira', city: 'São Paulo' }
|
|
55
|
+
];
|
|
56
|
+
|
|
57
|
+
searchResult: any[] = [];
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
```html
|
|
62
|
+
<tcloud-ui-input-search
|
|
63
|
+
[base_object]="items"
|
|
64
|
+
placeholder="Buscar por nome ou cidade..."
|
|
65
|
+
(found)="searchResult = $event">
|
|
66
|
+
</tcloud-ui-input-search>
|
|
67
|
+
|
|
68
|
+
<div *ngFor="let item of searchResult">
|
|
69
|
+
<p>{{ item.name }} - {{ item.city }}</p>
|
|
70
|
+
</div>
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Modo Espelho (Mirror) - Padrão
|
|
74
|
+
```html
|
|
75
|
+
<!-- Todos os itens são exibidos, mas apenas os encontrados são destacados -->
|
|
76
|
+
<tcloud-ui-input-search
|
|
77
|
+
[base_object]="items"
|
|
78
|
+
[mirror]="true"
|
|
79
|
+
placeholder="Procurar...">
|
|
80
|
+
</tcloud-ui-input-search>
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Modo Sem Espelho
|
|
84
|
+
```html
|
|
85
|
+
<!-- Apenas os itens encontrados são exibidos -->
|
|
86
|
+
<tcloud-ui-input-search
|
|
87
|
+
[base_object]="items"
|
|
88
|
+
[mirror]="false"
|
|
89
|
+
placeholder="Procurar...">
|
|
90
|
+
</tcloud-ui-input-search>
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Com Array Simples
|
|
94
|
+
```ts
|
|
95
|
+
export class ExampleComponent {
|
|
96
|
+
countries = ['Brasil', 'Argentina', 'Uruguai', 'Paraguai', 'Chile'];
|
|
97
|
+
searchResult: string[] = [];
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
```html
|
|
102
|
+
<tcloud-ui-input-search
|
|
103
|
+
[base_object]="countries"
|
|
104
|
+
placeholder="Buscar país..."
|
|
105
|
+
(found)="searchResult = $event">
|
|
106
|
+
</tcloud-ui-input-search>
|
|
107
|
+
|
|
108
|
+
<ul>
|
|
109
|
+
<li *ngFor="let country of searchResult">{{ country }}</li>
|
|
110
|
+
</ul>
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Uso Avançado
|
|
114
|
+
### Com Objetos Complexos e Aninhados
|
|
115
|
+
```ts
|
|
116
|
+
export class ExampleComponent {
|
|
117
|
+
products = [
|
|
118
|
+
{
|
|
119
|
+
id: 1,
|
|
120
|
+
name: 'Notebook Dell',
|
|
121
|
+
category: { name: 'Eletrônicos', subcategory: 'Computadores' },
|
|
122
|
+
price: 3500,
|
|
123
|
+
stock: true,
|
|
124
|
+
supplier: { name: 'Fornecedor A', city: 'São Paulo' }
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
id: 2,
|
|
128
|
+
name: 'Mouse Logitech',
|
|
129
|
+
category: { name: 'Eletrônicos', subcategory: 'Periféricos' },
|
|
130
|
+
price: 150,
|
|
131
|
+
stock: true,
|
|
132
|
+
supplier: { name: 'Fornecedor B', city: 'Rio de Janeiro' }
|
|
133
|
+
}
|
|
134
|
+
];
|
|
135
|
+
|
|
136
|
+
searchResult: any[] = [];
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
```html
|
|
141
|
+
<tcloud-ui-input-search
|
|
142
|
+
[base_object]="products"
|
|
143
|
+
placeholder="Buscar por nome, categoria, fornecedor..."
|
|
144
|
+
[mirror]="false"
|
|
145
|
+
(found)="searchResult = $event">
|
|
146
|
+
</tcloud-ui-input-search>
|
|
147
|
+
|
|
148
|
+
<table>
|
|
149
|
+
<thead>
|
|
150
|
+
<tr>
|
|
151
|
+
<th>Nome</th>
|
|
152
|
+
<th>Categoria</th>
|
|
153
|
+
<th>Preço</th>
|
|
154
|
+
<th>Fornecedor</th>
|
|
155
|
+
</tr>
|
|
156
|
+
</thead>
|
|
157
|
+
<tbody>
|
|
158
|
+
<tr *ngFor="let product of searchResult">
|
|
159
|
+
<td>{{ product.name }}</td>
|
|
160
|
+
<td>{{ product.category.name }}</td>
|
|
161
|
+
<td>{{ product.price | currency }}</td>
|
|
162
|
+
<td>{{ product.supplier.name }}</td>
|
|
163
|
+
</tr>
|
|
164
|
+
</tbody>
|
|
165
|
+
</table>
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### Com Busca e Tabela de Resultados
|
|
169
|
+
```ts
|
|
170
|
+
export class SearchTableComponent {
|
|
171
|
+
employees = [
|
|
172
|
+
{ id: 1, name: 'Alice Johnson', department: 'TI', role: 'Desenvolvedor', hired: new Date(2020, 0, 15) },
|
|
173
|
+
{ id: 2, name: 'Bob Smith', department: 'RH', role: 'Gerente', hired: new Date(2019, 5, 20) },
|
|
174
|
+
{ id: 3, name: 'Carol White', department: 'TI', role: 'Analista', hired: new Date(2021, 2, 10) },
|
|
175
|
+
{ id: 4, name: 'David Brown', department: 'Vendas', role: 'Vendedor', hired: new Date(2022, 8, 5) }
|
|
176
|
+
];
|
|
177
|
+
|
|
178
|
+
searchResult: any[] = [];
|
|
179
|
+
|
|
180
|
+
ngOnInit() {
|
|
181
|
+
// Inicial com todos os itens
|
|
182
|
+
this.searchResult = this.employees;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
```html
|
|
188
|
+
<div class="search-container">
|
|
189
|
+
<h2>Buscar Funcionários</h2>
|
|
190
|
+
<tcloud-ui-input-search
|
|
191
|
+
[base_object]="employees"
|
|
192
|
+
placeholder="Nome, departamento, cargo..."
|
|
193
|
+
[mirror]="false"
|
|
194
|
+
(found)="searchResult = $event">
|
|
195
|
+
</tcloud-ui-input-search>
|
|
196
|
+
</div>
|
|
197
|
+
|
|
198
|
+
<table class="table">
|
|
199
|
+
<thead>
|
|
200
|
+
<tr>
|
|
201
|
+
<th>ID</th>
|
|
202
|
+
<th>Nome</th>
|
|
203
|
+
<th>Departamento</th>
|
|
204
|
+
<th>Cargo</th>
|
|
205
|
+
<th>Data Admissão</th>
|
|
206
|
+
</tr>
|
|
207
|
+
</thead>
|
|
208
|
+
<tbody>
|
|
209
|
+
<tr *ngFor="let employee of searchResult">
|
|
210
|
+
<td>{{ employee.id }}</td>
|
|
211
|
+
<td>{{ employee.name }}</td>
|
|
212
|
+
<td>{{ employee.department }}</td>
|
|
213
|
+
<td>{{ employee.role }}</td>
|
|
214
|
+
<td>{{ employee.hired | date: 'dd/MM/yyyy' }}</td>
|
|
215
|
+
</tr>
|
|
216
|
+
</tbody>
|
|
217
|
+
</table>
|
|
218
|
+
|
|
219
|
+
<div *ngIf="searchResult.length === 0">
|
|
220
|
+
<p>Nenhum resultado encontrado.</p>
|
|
221
|
+
</div>
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### Com Dupla Busca (Cascade)
|
|
225
|
+
```ts
|
|
226
|
+
export class CascadeSearchComponent {
|
|
227
|
+
companies = [
|
|
228
|
+
{ id: 1, name: 'Tech Solutions', city: 'São Paulo', employees: [...] },
|
|
229
|
+
{ id: 2, name: 'Data Corp', city: 'Rio de Janeiro', employees: [...] }
|
|
230
|
+
];
|
|
231
|
+
|
|
232
|
+
selectedCompany: any = null;
|
|
233
|
+
companyResults: any[] = [];
|
|
234
|
+
employeeResults: any[] = [];
|
|
235
|
+
}
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
```html
|
|
239
|
+
<div class="search-cascade">
|
|
240
|
+
<h3>Buscar Empresa</h3>
|
|
241
|
+
<tcloud-ui-input-search
|
|
242
|
+
[base_object]="companies"
|
|
243
|
+
placeholder="Nome da empresa, cidade..."
|
|
244
|
+
[mirror]="false"
|
|
245
|
+
(found)="companyResults = $event">
|
|
246
|
+
</tcloud-ui-input-search>
|
|
247
|
+
|
|
248
|
+
<h3>Empresas Encontradas</h3>
|
|
249
|
+
<div *ngFor="let company of companyResults" (click)="selectedCompany = company">
|
|
250
|
+
<p>{{ company.name }} - {{ company.city }}</p>
|
|
251
|
+
</div>
|
|
252
|
+
|
|
253
|
+
<div *ngIf="selectedCompany">
|
|
254
|
+
<h3>Buscar Funcionário em {{ selectedCompany.name }}</h3>
|
|
255
|
+
<tcloud-ui-input-search
|
|
256
|
+
[base_object]="selectedCompany.employees"
|
|
257
|
+
placeholder="Nome do funcionário..."
|
|
258
|
+
[mirror]="false"
|
|
259
|
+
(found)="employeeResults = $event">
|
|
260
|
+
</tcloud-ui-input-search>
|
|
261
|
+
|
|
262
|
+
<div *ngFor="let employee of employeeResults">
|
|
263
|
+
<p>{{ employee.name }}</p>
|
|
264
|
+
</div>
|
|
265
|
+
</div>
|
|
266
|
+
</div>
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
### Customização Visual com Resultados
|
|
270
|
+
```html
|
|
271
|
+
<div class="search-wrapper">
|
|
272
|
+
<tcloud-ui-input-search
|
|
273
|
+
[base_object]="items"
|
|
274
|
+
placeholder="Digite para buscar..."
|
|
275
|
+
[mirror]="false"
|
|
276
|
+
(found)="searchResult = $event">
|
|
277
|
+
</tcloud-ui-input-search>
|
|
278
|
+
|
|
279
|
+
<div class="results-info">
|
|
280
|
+
<span *ngIf="searchResult.length > 0">
|
|
281
|
+
{{ searchResult.length }} resultado(s) encontrado(s)
|
|
282
|
+
</span>
|
|
283
|
+
<span *ngIf="searchResult.length === 0">
|
|
284
|
+
Nenhum resultado encontrado
|
|
285
|
+
</span>
|
|
286
|
+
</div>
|
|
287
|
+
|
|
288
|
+
<ul class="results-list">
|
|
289
|
+
<li *ngFor="let item of searchResult" class="result-item">
|
|
290
|
+
<span class="result-title">{{ item.title }}</span>
|
|
291
|
+
<span class="result-description">{{ item.description }}</span>
|
|
292
|
+
</li>
|
|
293
|
+
</ul>
|
|
294
|
+
</div>
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
## Normalização de Busca
|
|
298
|
+
O componente normaliza automaticamente o texto de busca:
|
|
299
|
+
- Converte para minúsculas
|
|
300
|
+
- Remove acentos e caracteres especiais
|
|
301
|
+
- Remove espaços em branco
|
|
302
|
+
- Formata datas para busca (DD/MM/YYYY e formato médio)
|
|
303
|
+
|
|
304
|
+
Exemplos de buscas equivalentes:
|
|
305
|
+
- `João` = `joao` = `JOÃO` = `jõão`
|
|
306
|
+
- `São Paulo` = `sao paulo` = `SÃO PAULO`
|
|
307
|
+
- `15/03/2024` buscará por qualquer data nesse formato
|
|
308
|
+
|
|
309
|
+
## Casos de Uso
|
|
310
|
+
- **Tabelas dinâmicas**: Filtrar registros enquanto digita
|
|
311
|
+
- **Listas de produtos**: Buscar por nome, categoria, fornecedor
|
|
312
|
+
- **Diretórios**: Localizar contatos por nome, departamento, cidade
|
|
313
|
+
- **Relatórios**: Filtrar dados dinâmicamente
|
|
314
|
+
- **Autocomplete**: Implementar sugestões baseadas em busca em tempo real
|