@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,83 @@
|
|
|
1
|
+
# Radio
|
|
2
|
+
|
|
3
|
+
Diretiva para estilizar inputs do tipo radio com o padrão visual do TCloud UI.
|
|
4
|
+
|
|
5
|
+
## Características
|
|
6
|
+
|
|
7
|
+
- Aplica automaticamente a classe CSS `tcloud-ui-radio` ao elemento `<input type="radio">`
|
|
8
|
+
- Uso simples via atributo `tcloudUiRadio` no input
|
|
9
|
+
- Compatível com `ngModel` e `formControl` para two-way binding
|
|
10
|
+
- Suporte nativo a `disabled` e `checked`
|
|
11
|
+
|
|
12
|
+
## Instalação
|
|
13
|
+
|
|
14
|
+
```typescript
|
|
15
|
+
import { TCloudUiModule } from 'tcloud-ui';
|
|
16
|
+
|
|
17
|
+
@NgModule({
|
|
18
|
+
imports: [TCloudUiModule]
|
|
19
|
+
})
|
|
20
|
+
export class AppModule { }
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Ou importe a diretiva standalone diretamente:
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
import { TCloudUiRadioDirective } from 'tcloud-ui';
|
|
27
|
+
|
|
28
|
+
@Component({
|
|
29
|
+
imports: [TCloudUiRadioDirective]
|
|
30
|
+
})
|
|
31
|
+
export class MeuComponent { }
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Propriedades (API)
|
|
35
|
+
|
|
36
|
+
A diretiva não possui `@Input` ou `@Output` próprios. Ela atua como uma diretiva de atributo pura, adicionando a classe CSS `tcloud-ui-radio` ao host element.
|
|
37
|
+
|
|
38
|
+
| Seletor | Descrição |
|
|
39
|
+
|---|---|
|
|
40
|
+
| `input[type="radio"][tcloudUiRadio]` | Aplica a diretiva a inputs do tipo radio |
|
|
41
|
+
|
|
42
|
+
## Exemplos de Uso
|
|
43
|
+
|
|
44
|
+
### Uso Básico
|
|
45
|
+
|
|
46
|
+
```html
|
|
47
|
+
<label>
|
|
48
|
+
<input type="radio" tcloudUiRadio name="opcao" value="1" /> Opção 1
|
|
49
|
+
</label>
|
|
50
|
+
<label>
|
|
51
|
+
<input type="radio" tcloudUiRadio name="opcao" value="2" /> Opção 2
|
|
52
|
+
</label>
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Uso com ngModel
|
|
56
|
+
|
|
57
|
+
```typescript
|
|
58
|
+
selectedOption: string = 'option1';
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
```html
|
|
62
|
+
<label>
|
|
63
|
+
<input type="radio" tcloudUiRadio name="example" value="option1" [(ngModel)]="selectedOption" />
|
|
64
|
+
Opção 1
|
|
65
|
+
</label>
|
|
66
|
+
<label>
|
|
67
|
+
<input type="radio" tcloudUiRadio name="example" value="option2" [(ngModel)]="selectedOption" />
|
|
68
|
+
Opção 2
|
|
69
|
+
</label>
|
|
70
|
+
|
|
71
|
+
<p>Selecionado: {{ selectedOption }}</p>
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Uso com estado desabilitado
|
|
75
|
+
|
|
76
|
+
```html
|
|
77
|
+
<label>
|
|
78
|
+
<input type="radio" tcloudUiRadio name="disabled" value="1" [disabled]="true" /> Desabilitado
|
|
79
|
+
</label>
|
|
80
|
+
<label>
|
|
81
|
+
<input type="radio" tcloudUiRadio name="disabled" value="2" [disabled]="true" [checked]="true" /> Desabilitado e marcado
|
|
82
|
+
</label>
|
|
83
|
+
```
|
|
@@ -0,0 +1,418 @@
|
|
|
1
|
+
# Reorder Items
|
|
2
|
+
|
|
3
|
+
O componente **Reorder Items** fornece uma interface interativa para reordenar uma lista de itens através de botões de seta para cima e para baixo. Suporta tanto arrays de strings simples quanto arrays de objetos com descrição, permitindo comparação entre valores antes e depois da reordenação.
|
|
4
|
+
|
|
5
|
+
## Características
|
|
6
|
+
|
|
7
|
+
- **Reordenação interativa**: Botões para mover itens para cima ou para baixo
|
|
8
|
+
- **Suporte a dois formatos**: Arrays de strings ou arrays de objetos com `name` e `description`
|
|
9
|
+
- **Descrições opcionais**: Exibe descrição adicional de cada item quando disponível
|
|
10
|
+
- **Two-way binding**: Funciona com `[(items)]` para sincronização bidirecional
|
|
11
|
+
- **Validação de limites**: Desabilita botões automaticamente nos extremos da lista
|
|
12
|
+
- **Reatividade em tempo real**: Emite mudanças imediatamente via `itemsChange`
|
|
13
|
+
- **Tabela intuitiva**: Apresentação clara com layout de nome/descrição e ações
|
|
14
|
+
|
|
15
|
+
## Instalação
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
import { TCloudUiModule } from 'projects/tcloud-ui/src/public-api';
|
|
19
|
+
|
|
20
|
+
@Component({
|
|
21
|
+
imports: [TCloudUiModule],
|
|
22
|
+
// ... resto da configuração
|
|
23
|
+
})
|
|
24
|
+
export class MyComponent {}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Propriedades (API)
|
|
28
|
+
|
|
29
|
+
### Inputs
|
|
30
|
+
|
|
31
|
+
| Nome | Tipo | Descrição | Valor Default |
|
|
32
|
+
|------|------|-----------|---------------|
|
|
33
|
+
| `items` | `any[]` | Array de itens a reordenar. Pode ser strings ou objetos com `name` e `description` | `[]` |
|
|
34
|
+
|
|
35
|
+
### Outputs
|
|
36
|
+
|
|
37
|
+
| Nome | Tipo de Evento | Descrição |
|
|
38
|
+
|------|--------|-----------|
|
|
39
|
+
| `itemsChange` | `any[]` | Emite o array reordenado quando um item é movido |
|
|
40
|
+
|
|
41
|
+
### Formatos de Dados Suportados
|
|
42
|
+
|
|
43
|
+
#### Formato 1: Array de Strings
|
|
44
|
+
|
|
45
|
+
```typescript
|
|
46
|
+
items: string[] = ['Item A', 'Item B', 'Item C'];
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
#### Formato 2: Array de Objetos
|
|
50
|
+
|
|
51
|
+
```typescript
|
|
52
|
+
items: Array<{ name: string; description: string }> = [
|
|
53
|
+
{ name: 'Protheus', description: 'Produto - Protheus' },
|
|
54
|
+
{ name: 'RM', description: 'Produto - RM' },
|
|
55
|
+
{ name: 'Datasul', description: 'Produto - Datasul' }
|
|
56
|
+
];
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Exemplos de Uso
|
|
60
|
+
|
|
61
|
+
### Uso Básico com Array de Strings
|
|
62
|
+
|
|
63
|
+
Reordenação simples de um array de strings:
|
|
64
|
+
|
|
65
|
+
```typescript
|
|
66
|
+
@Component({
|
|
67
|
+
selector: 'app-reorder-basic',
|
|
68
|
+
imports: [CommonModule, TCloudUiModule],
|
|
69
|
+
template: `
|
|
70
|
+
<div>
|
|
71
|
+
<h3>Reordenar Produtos</h3>
|
|
72
|
+
|
|
73
|
+
<tcloud-ui-reorder-items
|
|
74
|
+
[(items)]="products"
|
|
75
|
+
></tcloud-ui-reorder-items>
|
|
76
|
+
|
|
77
|
+
<div class="result">
|
|
78
|
+
<h4>Ordem Atual:</h4>
|
|
79
|
+
<pre>{{ products | json }}</pre>
|
|
80
|
+
</div>
|
|
81
|
+
</div>
|
|
82
|
+
`
|
|
83
|
+
})
|
|
84
|
+
export class ReorderBasicComponent {
|
|
85
|
+
products: string[] = ['Protheus', 'RM', 'Datasul', 'Fluig'];
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### Uso com Array de Objetos e Descrições
|
|
90
|
+
|
|
91
|
+
Reordenação com informações descritivas:
|
|
92
|
+
|
|
93
|
+
```typescript
|
|
94
|
+
@Component({
|
|
95
|
+
selector: 'app-reorder-objects',
|
|
96
|
+
imports: [CommonModule, TCloudUiModule],
|
|
97
|
+
template: `
|
|
98
|
+
<div class="reorder-container">
|
|
99
|
+
<h3>Reordenar Módulos</h3>
|
|
100
|
+
|
|
101
|
+
<tcloud-ui-reorder-items
|
|
102
|
+
[(items)]="modules"
|
|
103
|
+
></tcloud-ui-reorder-items>
|
|
104
|
+
|
|
105
|
+
<div class="preview">
|
|
106
|
+
<h4>Configuração Atual:</h4>
|
|
107
|
+
<div *ngFor="let module of modules" class="module-item">
|
|
108
|
+
<strong>{{ module.name }}</strong>
|
|
109
|
+
<p>{{ module.description }}</p>
|
|
110
|
+
</div>
|
|
111
|
+
</div>
|
|
112
|
+
</div>
|
|
113
|
+
`,
|
|
114
|
+
styles: [`
|
|
115
|
+
.module-item {
|
|
116
|
+
padding: 12px;
|
|
117
|
+
margin: 8px 0;
|
|
118
|
+
border-left: 4px solid #1976d2;
|
|
119
|
+
background: #f5f5f5;
|
|
120
|
+
}
|
|
121
|
+
`]
|
|
122
|
+
})
|
|
123
|
+
export class ReorderObjectsComponent {
|
|
124
|
+
modules = [
|
|
125
|
+
{ name: 'Autenticação', description: 'Sistema de login e autenticação' },
|
|
126
|
+
{ name: 'Dashboard', description: 'Painel principal da aplicação' },
|
|
127
|
+
{ name: 'Relatórios', description: 'Módulo de geração de relatórios' },
|
|
128
|
+
{ name: 'Configurações', description: 'Preferências e ajustes do sistema' }
|
|
129
|
+
];
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### Uso Avançado com Controle e Validação
|
|
134
|
+
|
|
135
|
+
Reordenação com verificação de alterações e persistência:
|
|
136
|
+
|
|
137
|
+
```typescript
|
|
138
|
+
@Component({
|
|
139
|
+
selector: 'app-reorder-advanced',
|
|
140
|
+
imports: [CommonModule, ReactiveFormsModule, TCloudUiModule],
|
|
141
|
+
template: `
|
|
142
|
+
<div class="reorder-advanced">
|
|
143
|
+
<h3>Gerenciar Ordem de Prioridades</h3>
|
|
144
|
+
|
|
145
|
+
<div class="controls">
|
|
146
|
+
<button
|
|
147
|
+
(click)="resetOrder()"
|
|
148
|
+
[disabled]="!hasChanges"
|
|
149
|
+
class="tc-btn"
|
|
150
|
+
>
|
|
151
|
+
Restaurar Original
|
|
152
|
+
</button>
|
|
153
|
+
|
|
154
|
+
<button
|
|
155
|
+
(click)="saveOrder()"
|
|
156
|
+
[disabled]="!hasChanges"
|
|
157
|
+
class="tc-btn tc-btn-primary"
|
|
158
|
+
>
|
|
159
|
+
Salvar Ordem
|
|
160
|
+
</button>
|
|
161
|
+
</div>
|
|
162
|
+
|
|
163
|
+
<div class="status" *ngIf="hasChanges" class="warning-banner">
|
|
164
|
+
⚠️ Existem alterações não salvas
|
|
165
|
+
</div>
|
|
166
|
+
|
|
167
|
+
<tcloud-ui-reorder-items
|
|
168
|
+
[(items)]="priorities"
|
|
169
|
+
(itemsChange)="onPrioritiesChange($event)"
|
|
170
|
+
></tcloud-ui-reorder-items>
|
|
171
|
+
|
|
172
|
+
<div class="comparison">
|
|
173
|
+
<div class="column">
|
|
174
|
+
<h4>Original</h4>
|
|
175
|
+
<ol>
|
|
176
|
+
<li *ngFor="let item of originalPriorities">
|
|
177
|
+
{{ item.name }}
|
|
178
|
+
</li>
|
|
179
|
+
</ol>
|
|
180
|
+
</div>
|
|
181
|
+
|
|
182
|
+
<div class="column">
|
|
183
|
+
<h4>Modificado</h4>
|
|
184
|
+
<ol>
|
|
185
|
+
<li *ngFor="let item of priorities">
|
|
186
|
+
{{ item.name }}
|
|
187
|
+
<span class="changed" *ngIf="isItemMoved(item.name)">
|
|
188
|
+
(↻ reordenado)
|
|
189
|
+
</span>
|
|
190
|
+
</li>
|
|
191
|
+
</ol>
|
|
192
|
+
</div>
|
|
193
|
+
</div>
|
|
194
|
+
|
|
195
|
+
<div *ngIf="saveSuccess" class="success-message">
|
|
196
|
+
✓ Ordem salva com sucesso!
|
|
197
|
+
</div>
|
|
198
|
+
</div>
|
|
199
|
+
`,
|
|
200
|
+
styles: [`
|
|
201
|
+
.controls {
|
|
202
|
+
margin-bottom: 16px;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
.warning-banner {
|
|
206
|
+
background: #fff3cd;
|
|
207
|
+
border-left: 4px solid #ffc107;
|
|
208
|
+
padding: 12px;
|
|
209
|
+
margin: 12px 0;
|
|
210
|
+
border-radius: 4px;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
.comparison {
|
|
214
|
+
display: grid;
|
|
215
|
+
grid-template-columns: 1fr 1fr;
|
|
216
|
+
gap: 16px;
|
|
217
|
+
margin-top: 24px;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
.column {
|
|
221
|
+
background: #f5f5f5;
|
|
222
|
+
padding: 16px;
|
|
223
|
+
border-radius: 4px;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
.column h4 {
|
|
227
|
+
margin-top: 0;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
.column ol {
|
|
231
|
+
margin: 0;
|
|
232
|
+
padding-left: 20px;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
.changed {
|
|
236
|
+
color: #ff9800;
|
|
237
|
+
font-size: 0.9em;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
.success-message {
|
|
241
|
+
background: #c8e6c9;
|
|
242
|
+
border-left: 4px solid #4caf50;
|
|
243
|
+
padding: 12px;
|
|
244
|
+
margin-top: 12px;
|
|
245
|
+
border-radius: 4px;
|
|
246
|
+
color: #2e7d32;
|
|
247
|
+
}
|
|
248
|
+
`]
|
|
249
|
+
})
|
|
250
|
+
export class ReorderAdvancedComponent implements OnInit {
|
|
251
|
+
priorities: Array<{ name: string; description: string }> = [];
|
|
252
|
+
originalPriorities: Array<{ name: string; description: string }> = [];
|
|
253
|
+
hasChanges: boolean = false;
|
|
254
|
+
saveSuccess: boolean = false;
|
|
255
|
+
|
|
256
|
+
constructor(private changeDetector: ChangeDetectorRef) {}
|
|
257
|
+
|
|
258
|
+
ngOnInit() {
|
|
259
|
+
this.initializePriorities();
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
initializePriorities() {
|
|
263
|
+
this.originalPriorities = [
|
|
264
|
+
{ name: 'Crítica', description: 'Impacto crítico no sistema' },
|
|
265
|
+
{ name: 'Alta', description: 'Impacto significativo' },
|
|
266
|
+
{ name: 'Média', description: 'Impacto moderado' },
|
|
267
|
+
{ name: 'Baixa', description: 'Impacto mínimo' }
|
|
268
|
+
];
|
|
269
|
+
|
|
270
|
+
this.priorities = JSON.parse(JSON.stringify(this.originalPriorities));
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
onPrioritiesChange(items: any[]) {
|
|
274
|
+
this.priorities = items;
|
|
275
|
+
this.hasChanges = this.checkHasChanges();
|
|
276
|
+
this.saveSuccess = false;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
checkHasChanges(): boolean {
|
|
280
|
+
for (let i = 0; i < this.originalPriorities.length; i++) {
|
|
281
|
+
if (this.originalPriorities[i].name !== this.priorities[i]?.name) {
|
|
282
|
+
return true;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
return false;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
isItemMoved(name: string): boolean {
|
|
289
|
+
const originalIndex = this.originalPriorities.findIndex(p => p.name === name);
|
|
290
|
+
const currentIndex = this.priorities.findIndex(p => p.name === name);
|
|
291
|
+
return originalIndex !== currentIndex;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
saveOrder() {
|
|
295
|
+
// Simular persistência em servidor
|
|
296
|
+
console.log('Salvando ordem:', this.priorities);
|
|
297
|
+
|
|
298
|
+
this.saveSuccess = true;
|
|
299
|
+
this.originalPriorities = JSON.parse(JSON.stringify(this.priorities));
|
|
300
|
+
this.hasChanges = false;
|
|
301
|
+
|
|
302
|
+
setTimeout(() => {
|
|
303
|
+
this.saveSuccess = false;
|
|
304
|
+
}, 3000);
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
resetOrder() {
|
|
308
|
+
this.priorities = JSON.parse(JSON.stringify(this.originalPriorities));
|
|
309
|
+
this.hasChanges = false;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
### Uso com Filtro e Busca
|
|
315
|
+
|
|
316
|
+
Reordenação combinada com busca de itens:
|
|
317
|
+
|
|
318
|
+
```typescript
|
|
319
|
+
@Component({
|
|
320
|
+
selector: 'app-reorder-with-search',
|
|
321
|
+
imports: [CommonModule, FormsModule, TCloudUiModule],
|
|
322
|
+
template: `
|
|
323
|
+
<div class="search-reorder">
|
|
324
|
+
<input
|
|
325
|
+
type="text"
|
|
326
|
+
placeholder="Buscar item..."
|
|
327
|
+
[(ngModel)]="searchTerm"
|
|
328
|
+
(ngModelChange)="filterItems()"
|
|
329
|
+
class="search-input"
|
|
330
|
+
>
|
|
331
|
+
|
|
332
|
+
<div *ngIf="filteredItems.length === 0 && searchTerm" class="no-results">
|
|
333
|
+
Nenhum item encontrado para "{{ searchTerm }}"
|
|
334
|
+
</div>
|
|
335
|
+
|
|
336
|
+
<tcloud-ui-reorder-items
|
|
337
|
+
*ngIf="filteredItems.length > 0"
|
|
338
|
+
[(items)]="filteredItems"
|
|
339
|
+
(itemsChange)="onReorderComplete($event)"
|
|
340
|
+
></tcloud-ui-reorder-items>
|
|
341
|
+
|
|
342
|
+
<div class="stats">
|
|
343
|
+
<p>Total: {{ filteredItems.length }} itens</p>
|
|
344
|
+
</div>
|
|
345
|
+
</div>
|
|
346
|
+
`,
|
|
347
|
+
styles: [`
|
|
348
|
+
.search-input {
|
|
349
|
+
width: 100%;
|
|
350
|
+
padding: 8px 12px;
|
|
351
|
+
border: 1px solid #ddd;
|
|
352
|
+
border-radius: 4px;
|
|
353
|
+
margin-bottom: 16px;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
.no-results {
|
|
357
|
+
background: #ffebee;
|
|
358
|
+
border-left: 4px solid #f44336;
|
|
359
|
+
padding: 12px;
|
|
360
|
+
color: #c62828;
|
|
361
|
+
border-radius: 4px;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
.stats {
|
|
365
|
+
margin-top: 16px;
|
|
366
|
+
padding: 8px;
|
|
367
|
+
background: #e3f2fd;
|
|
368
|
+
border-radius: 4px;
|
|
369
|
+
text-align: center;
|
|
370
|
+
}
|
|
371
|
+
`]
|
|
372
|
+
})
|
|
373
|
+
export class ReorderWithSearchComponent {
|
|
374
|
+
items = [
|
|
375
|
+
{ name: 'Angular', description: 'Framework JavaScript' },
|
|
376
|
+
{ name: 'React', description: 'Biblioteca JavaScript' },
|
|
377
|
+
{ name: 'Vue', description: 'Framework progressivo' },
|
|
378
|
+
{ name: 'Svelte', description: 'Compilador Frontend' },
|
|
379
|
+
{ name: 'TypeScript', description: 'Linguagem com tipos' }
|
|
380
|
+
];
|
|
381
|
+
|
|
382
|
+
filteredItems: any[] = [];
|
|
383
|
+
searchTerm: string = '';
|
|
384
|
+
|
|
385
|
+
ngOnInit() {
|
|
386
|
+
this.filteredItems = [...this.items];
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
filterItems() {
|
|
390
|
+
if (!this.searchTerm.trim()) {
|
|
391
|
+
this.filteredItems = [...this.items];
|
|
392
|
+
} else {
|
|
393
|
+
this.filteredItems = this.items.filter(item =>
|
|
394
|
+
item.name.toLowerCase().includes(this.searchTerm.toLowerCase()) ||
|
|
395
|
+
item.description.toLowerCase().includes(this.searchTerm.toLowerCase())
|
|
396
|
+
);
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
onReorderComplete(reorderedItems: any[]) {
|
|
401
|
+
console.log('Itens reordenados:', reorderedItems);
|
|
402
|
+
// Atualizar dados persistidos
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
## Notas de Implementação
|
|
408
|
+
|
|
409
|
+
- O componente mantém dois arrays internos: `sort_items` (para exibição) e `items` (dados originais)
|
|
410
|
+
- Quando `items` contém strings, `sort_items` cria uma cópia das strings para exibição
|
|
411
|
+
- Quando `items` contém objetos com propriedade `name`, `sort_items` extrai apenas os nomes
|
|
412
|
+
- A descrição é buscada dinamicamente através do método `get_description()` durante a renderização
|
|
413
|
+
- Os botões de movimento (cima/baixo) são automaticamente desabilitados nos extremos da lista
|
|
414
|
+
- O evento `itemsChange` emite o array completo reordenado (strings ou objetos)
|
|
415
|
+
- Duas-way binding `[(items)]` fornece sincronização automática com o componente pai
|
|
416
|
+
- A reordenação atual é feita através de troca de posições (swap) mantendo referências
|
|
417
|
+
- Se os itens originais são objetos, o componente preserva todas as propriedades após reordenação
|
|
418
|
+
- Nenhuma validação de tipos é feita - o componente detecta automaticamente se é string ou objeto verificando a propriedade `name`
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
# RespectivePipe
|
|
2
|
+
|
|
3
|
+
O pipe `respective` traduz chaves internas do sistema (strings em inglês ou siglas) para seus nomes legíveis em português. Utiliza um mapa interno de pares chave-valor organizado por categorias: tipos de ambientes, implantação/migração, portes de clientes, produtos TOTVS, sistemas operacionais e tipos de responsáveis. A comparação é case-insensitive e normaliza underscores (`_`) para hifens (`-`).
|
|
4
|
+
|
|
5
|
+
## Características
|
|
6
|
+
|
|
7
|
+
- Tradução de chaves do sistema para nomes legíveis em português
|
|
8
|
+
- Comparação case-insensitive (converte para lowercase antes de comparar)
|
|
9
|
+
- Normalização de underscores para hifens na comparação
|
|
10
|
+
- Remoção de espaços em branco nas extremidades
|
|
11
|
+
- Retorna o valor original quando não encontra correspondência no mapa
|
|
12
|
+
- Retorna string vazia para valores não-string (objetos, números)
|
|
13
|
+
- Pipe standalone
|
|
14
|
+
|
|
15
|
+
## Instalação
|
|
16
|
+
|
|
17
|
+
Importe o pipe diretamente no módulo ou componente standalone:
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
import { RespectivePipe } from 'tcloud-ui';
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## API
|
|
24
|
+
|
|
25
|
+
### Sintaxe do Pipe
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
{{ valor | respective }}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Parâmetros
|
|
32
|
+
|
|
33
|
+
Este pipe não recebe parâmetros adicionais.
|
|
34
|
+
|
|
35
|
+
### Mapa de Traduções
|
|
36
|
+
|
|
37
|
+
#### Tipos de Ambientes
|
|
38
|
+
|
|
39
|
+
| Chave | Valor |
|
|
40
|
+
|---------------|---------------------|
|
|
41
|
+
| `production` | Produção |
|
|
42
|
+
| `development` | Desenvolvimento |
|
|
43
|
+
| `qa` | Qualidade |
|
|
44
|
+
|
|
45
|
+
#### Implantação / Migração
|
|
46
|
+
|
|
47
|
+
| Chave | Valor |
|
|
48
|
+
|----------|-------------|
|
|
49
|
+
| `golive` | Pré GoLive |
|
|
50
|
+
| `kickoff`| Kickoff |
|
|
51
|
+
|
|
52
|
+
#### Portes de Clientes
|
|
53
|
+
|
|
54
|
+
| Chave | Valor |
|
|
55
|
+
|---------|----------|
|
|
56
|
+
| `prime` | Prime |
|
|
57
|
+
| `p` | Pequeno |
|
|
58
|
+
| `m` | Médio |
|
|
59
|
+
| `g` | Grande |
|
|
60
|
+
|
|
61
|
+
#### Produtos TOTVS
|
|
62
|
+
|
|
63
|
+
| Chave | Valor |
|
|
64
|
+
|-------------------|-------------------|
|
|
65
|
+
| `2c` | Carol |
|
|
66
|
+
| `carol` | carol |
|
|
67
|
+
| `consinco` | Consinco |
|
|
68
|
+
| `datasul` | Datasul |
|
|
69
|
+
| `fluig` | Fluig |
|
|
70
|
+
| `license-server` | License Server |
|
|
71
|
+
| `pep` | PEP |
|
|
72
|
+
| `protheus` | Protheus |
|
|
73
|
+
| `pvi` | PVI |
|
|
74
|
+
| `rm` | RM |
|
|
75
|
+
| `sfa` | SFA |
|
|
76
|
+
| `smartrm` | Smart RM |
|
|
77
|
+
| `smartrmcluster` | Smart RM Cluster |
|
|
78
|
+
| `smartrmcontrol` | Smart RM Control |
|
|
79
|
+
| `taf` | TAF |
|
|
80
|
+
| `treports` | Treports |
|
|
81
|
+
| `tss` | TSS |
|
|
82
|
+
| `winthor` | Winthor |
|
|
83
|
+
|
|
84
|
+
#### Sistemas Operacionais
|
|
85
|
+
|
|
86
|
+
| Chave | Valor |
|
|
87
|
+
|-----------|---------|
|
|
88
|
+
| `windows` | Windows |
|
|
89
|
+
| `linux` | Linux |
|
|
90
|
+
|
|
91
|
+
#### Tipos de Responsáveis
|
|
92
|
+
|
|
93
|
+
| Chave | Valor |
|
|
94
|
+
|--------------------------|----------------------|
|
|
95
|
+
| `prime_customer_success` | Customer Success |
|
|
96
|
+
| `project_manager` | Gerente de Projetos |
|
|
97
|
+
| `prime_engineer` | Engenheiro Prime |
|
|
98
|
+
|
|
99
|
+
## Exemplos de Uso
|
|
100
|
+
|
|
101
|
+
### Básico — Tradução de ambiente e produto
|
|
102
|
+
|
|
103
|
+
```html
|
|
104
|
+
<p>{{ 'production' | respective }}</p>
|
|
105
|
+
<!-- Resultado: Produção -->
|
|
106
|
+
|
|
107
|
+
<p>{{ 'protheus' | respective }}</p>
|
|
108
|
+
<!-- Resultado: Protheus -->
|
|
109
|
+
|
|
110
|
+
<p>{{ 'prime_customer_success' | respective }}</p>
|
|
111
|
+
<!-- Resultado: Customer Success -->
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
```typescript
|
|
115
|
+
import { RespectivePipe } from 'tcloud-ui';
|
|
116
|
+
|
|
117
|
+
@Component({
|
|
118
|
+
standalone: true,
|
|
119
|
+
imports: [RespectivePipe],
|
|
120
|
+
template: `
|
|
121
|
+
<p>{{ ambiente | respective }}</p>
|
|
122
|
+
`
|
|
123
|
+
})
|
|
124
|
+
export class ExemploBasicoComponent {
|
|
125
|
+
ambiente = 'production';
|
|
126
|
+
}
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### Avançado — Listagem de ambientes com tradução
|
|
130
|
+
|
|
131
|
+
```html
|
|
132
|
+
<table class="table">
|
|
133
|
+
<thead>
|
|
134
|
+
<tr>
|
|
135
|
+
<th>Ambiente</th>
|
|
136
|
+
<th>Produto</th>
|
|
137
|
+
<th>SO</th>
|
|
138
|
+
<th>Porte</th>
|
|
139
|
+
</tr>
|
|
140
|
+
</thead>
|
|
141
|
+
<tbody>
|
|
142
|
+
<tr *ngFor="let item of servidores">
|
|
143
|
+
<td>{{ item.ambiente | respective }}</td>
|
|
144
|
+
<td>{{ item.produto | respective }}</td>
|
|
145
|
+
<td>{{ item.so | respective }}</td>
|
|
146
|
+
<td>{{ item.porte | respective }}</td>
|
|
147
|
+
</tr>
|
|
148
|
+
</tbody>
|
|
149
|
+
</table>
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
```typescript
|
|
153
|
+
import { RespectivePipe } from 'tcloud-ui';
|
|
154
|
+
|
|
155
|
+
@Component({
|
|
156
|
+
standalone: true,
|
|
157
|
+
imports: [CommonModule, RespectivePipe],
|
|
158
|
+
template: `...`
|
|
159
|
+
})
|
|
160
|
+
export class ExemploAvancadoComponent {
|
|
161
|
+
servidores = [
|
|
162
|
+
{ ambiente: 'production', produto: 'protheus', so: 'linux', porte: 'g' },
|
|
163
|
+
{ ambiente: 'development', produto: 'rm', so: 'windows', porte: 'm' },
|
|
164
|
+
{ ambiente: 'qa', produto: 'datasul', so: 'linux', porte: 'p' }
|
|
165
|
+
];
|
|
166
|
+
}
|
|
167
|
+
```
|