forlogic-core 1.8.13 → 1.8.14
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/README.md +238 -4
- package/dist/README.md +238 -4
- package/dist/index.css +1 -1
- package/dist/index.css.map +1 -1
- package/dist/index.esm.js +2 -2
- package/dist/index.js +2 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
# 🧱 forlogic-core - Guia de Desenvolvimento
|
|
2
2
|
|
|
3
|
-
> **IMPORTANTE**: Este README é genérico para todos os projetos. Para configurações específicas do projeto (como schema padrão), consulte o
|
|
3
|
+
> **IMPORTANTE**: Este README é genérico para todos os projetos. Para configurações específicas do projeto (como schema padrão), consulte o **Custom Knowledge** do projeto nas configurações do Lovable.
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
## 🤖 REGRAS CRÍTICAS
|
|
8
8
|
|
|
9
|
-
> **📋 Schema Padrão**: Veja no
|
|
9
|
+
> **📋 Schema Padrão**: Veja no **Custom Knowledge** do projeto (Settings → Manage Knowledge) qual é o schema padrão deste projeto específico.
|
|
10
10
|
|
|
11
11
|
### ⚠️ TOP 4 ERROS MAIS COMUNS
|
|
12
12
|
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
// ❌ ERRADO
|
|
17
17
|
.from('table')
|
|
18
18
|
|
|
19
|
-
// ✅ CORRETO (verifique o schema padrão no
|
|
19
|
+
// ✅ CORRETO (verifique o schema padrão no Custom Knowledge)
|
|
20
20
|
.schema('SEU_SCHEMA').from('table')
|
|
21
21
|
```
|
|
22
22
|
|
|
@@ -5459,6 +5459,240 @@ fetch(url, { headers: { 'un-alias': 'true' } }); // ✅
|
|
|
5459
5459
|
|
|
5460
5460
|
---
|
|
5461
5461
|
|
|
5462
|
+
## 🔍 COMPONENTES DE SELEÇÃO: SelectSearch vs MultiSelect vs EntitySelect
|
|
5463
|
+
|
|
5464
|
+
### **Quando Usar Cada Componente?**
|
|
5465
|
+
|
|
5466
|
+
| Componente | Uso Recomendado | Modo | Características |
|
|
5467
|
+
|------------|----------------|------|-----------------|
|
|
5468
|
+
| **SelectSearch** | Seleção versátil (única OU múltipla) | Configurável | Mais flexível, ideal para formulários dinâmicos |
|
|
5469
|
+
| **MultiSelect** | Seleção múltipla apenas | Múltiplo (default) | Otimizado para badges, limite de badges exibidos |
|
|
5470
|
+
| **EntitySelect** | Seleção única de entidades | Único | Mais simples, ideal para foreign keys |
|
|
5471
|
+
|
|
5472
|
+
### **SelectSearch - Componente Versátil**
|
|
5473
|
+
|
|
5474
|
+
**Quando usar:**
|
|
5475
|
+
- ✅ Precisa alternar entre modo único e múltiplo dinamicamente
|
|
5476
|
+
- ✅ Formulários onde o modo pode mudar com base em lógica
|
|
5477
|
+
- ✅ Situações onde você quer um único componente para ambos os casos
|
|
5478
|
+
|
|
5479
|
+
**Exemplo básico:**
|
|
5480
|
+
|
|
5481
|
+
```typescript
|
|
5482
|
+
import { SelectSearch } from 'forlogic-core';
|
|
5483
|
+
|
|
5484
|
+
// Seleção única
|
|
5485
|
+
const [selectedLanguage, setSelectedLanguage] = useState<string>('');
|
|
5486
|
+
|
|
5487
|
+
<SelectSearch
|
|
5488
|
+
options={languageOptions}
|
|
5489
|
+
value={selectedLanguage}
|
|
5490
|
+
onChange={setSelectedLanguage}
|
|
5491
|
+
placeholder="Selecione um idioma..."
|
|
5492
|
+
label="Idioma"
|
|
5493
|
+
/>
|
|
5494
|
+
|
|
5495
|
+
// Seleção múltipla
|
|
5496
|
+
const [selectedTags, setSelectedTags] = useState<string[]>([]);
|
|
5497
|
+
|
|
5498
|
+
<SelectSearch
|
|
5499
|
+
multiple
|
|
5500
|
+
options={tagOptions}
|
|
5501
|
+
value={selectedTags}
|
|
5502
|
+
onChange={setSelectedTags}
|
|
5503
|
+
placeholder="Selecione tags..."
|
|
5504
|
+
label="Tags"
|
|
5505
|
+
maxDisplayedBadges={3}
|
|
5506
|
+
/>
|
|
5507
|
+
```
|
|
5508
|
+
|
|
5509
|
+
**Uso dentro de Dialog (scroll funcionando):**
|
|
5510
|
+
|
|
5511
|
+
```typescript
|
|
5512
|
+
import { Dialog, DialogContent, SelectSearch } from 'forlogic-core';
|
|
5513
|
+
|
|
5514
|
+
function MyComponent() {
|
|
5515
|
+
const [dialogContentRef, setDialogContentRef] = useState<HTMLDivElement | null>(null);
|
|
5516
|
+
const [selected, setSelected] = useState<string>('');
|
|
5517
|
+
|
|
5518
|
+
return (
|
|
5519
|
+
<Dialog>
|
|
5520
|
+
<DialogTrigger asChild>
|
|
5521
|
+
<Button>Abrir Seleção</Button>
|
|
5522
|
+
</DialogTrigger>
|
|
5523
|
+
<DialogContent ref={setDialogContentRef} className="max-h-[90vh] overflow-visible">
|
|
5524
|
+
<DialogHeader>
|
|
5525
|
+
<DialogTitle>Selecione uma Categoria</DialogTitle>
|
|
5526
|
+
</DialogHeader>
|
|
5527
|
+
<div className="mt-4 max-h-[60vh] overflow-auto pr-1">
|
|
5528
|
+
<SelectSearch
|
|
5529
|
+
options={categoryOptions}
|
|
5530
|
+
value={selected}
|
|
5531
|
+
onChange={setSelected}
|
|
5532
|
+
placeholder="Selecione..."
|
|
5533
|
+
popoverContainer={dialogContentRef} {/* ✅ CRÍTICO para scroll funcionar */}
|
|
5534
|
+
/>
|
|
5535
|
+
</div>
|
|
5536
|
+
</DialogContent>
|
|
5537
|
+
</Dialog>
|
|
5538
|
+
);
|
|
5539
|
+
}
|
|
5540
|
+
```
|
|
5541
|
+
|
|
5542
|
+
**Props principais:**
|
|
5543
|
+
|
|
5544
|
+
```typescript
|
|
5545
|
+
interface SelectSearchProps<T> {
|
|
5546
|
+
multiple?: boolean; // Modo: false = único, true = múltiplo
|
|
5547
|
+
options: T[]; // Array de itens
|
|
5548
|
+
value?: string | string[]; // Valor(es) selecionado(s)
|
|
5549
|
+
onChange?: (value: string | string[]) => void;
|
|
5550
|
+
getOptionValue?: (option: T) => string;
|
|
5551
|
+
getOptionLabel?: (option: T) => string;
|
|
5552
|
+
placeholder?: string;
|
|
5553
|
+
label?: string;
|
|
5554
|
+
disabled?: boolean;
|
|
5555
|
+
required?: boolean;
|
|
5556
|
+
isLoading?: boolean;
|
|
5557
|
+
error?: string | boolean;
|
|
5558
|
+
sortOptions?: boolean; // Default: true
|
|
5559
|
+
maxDisplayedBadges?: number; // Limite de badges (modo múltiplo)
|
|
5560
|
+
popoverContainer?: HTMLElement | null; // ✅ Essencial para Dialog
|
|
5561
|
+
}
|
|
5562
|
+
```
|
|
5563
|
+
|
|
5564
|
+
### **MultiSelect - Seleção Múltipla**
|
|
5565
|
+
|
|
5566
|
+
**Quando usar:**
|
|
5567
|
+
- ✅ Seleção múltipla obrigatória (não precisa alternar para único)
|
|
5568
|
+
- ✅ Exibição de badges é importante
|
|
5569
|
+
- ✅ Precisa de limite de badges exibidos (+N)
|
|
5570
|
+
|
|
5571
|
+
**Exemplo:**
|
|
5572
|
+
|
|
5573
|
+
```typescript
|
|
5574
|
+
import { MultiSelect } from 'forlogic-core';
|
|
5575
|
+
|
|
5576
|
+
const [selectedFrameworks, setSelectedFrameworks] = useState<string[]>([]);
|
|
5577
|
+
|
|
5578
|
+
<MultiSelect
|
|
5579
|
+
options={frameworks}
|
|
5580
|
+
value={selectedFrameworks}
|
|
5581
|
+
onChange={setSelectedFrameworks}
|
|
5582
|
+
getOptionValue={(opt) => opt.id}
|
|
5583
|
+
getOptionLabel={(opt) => opt.name}
|
|
5584
|
+
placeholder="Selecione frameworks..."
|
|
5585
|
+
label="Frameworks"
|
|
5586
|
+
maxDisplayedBadges={3} // Exibe: [Badge 1] [Badge 2] [Badge 3] [+5]
|
|
5587
|
+
/>
|
|
5588
|
+
```
|
|
5589
|
+
|
|
5590
|
+
**Modo único (suportado mas não recomendado):**
|
|
5591
|
+
|
|
5592
|
+
```typescript
|
|
5593
|
+
// ⚠️ Use SelectSearch ou EntitySelect para modo único
|
|
5594
|
+
<MultiSelect
|
|
5595
|
+
multiple={false} // Funciona, mas SelectSearch é mais apropriado
|
|
5596
|
+
options={options}
|
|
5597
|
+
value={selected}
|
|
5598
|
+
onChange={setSelected}
|
|
5599
|
+
/>
|
|
5600
|
+
```
|
|
5601
|
+
|
|
5602
|
+
### **EntitySelect - Seleção Única Simples**
|
|
5603
|
+
|
|
5604
|
+
**Quando usar:**
|
|
5605
|
+
- ✅ Seleção única de entidades (processos, usuários, categorias)
|
|
5606
|
+
- ✅ Foreign keys em formulários
|
|
5607
|
+
- ✅ Casos simples sem necessidade de badges ou modo múltiplo
|
|
5608
|
+
|
|
5609
|
+
**Exemplo:**
|
|
5610
|
+
|
|
5611
|
+
```typescript
|
|
5612
|
+
import { EntitySelect } from 'forlogic-core';
|
|
5613
|
+
|
|
5614
|
+
const [selectedFramework, setSelectedFramework] = useState<string>('');
|
|
5615
|
+
|
|
5616
|
+
<EntitySelect
|
|
5617
|
+
items={frameworks}
|
|
5618
|
+
value={selectedFramework}
|
|
5619
|
+
onChange={setSelectedFramework}
|
|
5620
|
+
getItemValue={(opt) => opt.id}
|
|
5621
|
+
getItemLabel={(opt) => opt.name}
|
|
5622
|
+
placeholder="Selecione um framework..."
|
|
5623
|
+
searchPlaceholder="Buscar framework..."
|
|
5624
|
+
/>
|
|
5625
|
+
```
|
|
5626
|
+
|
|
5627
|
+
### **Comparação de Props**
|
|
5628
|
+
|
|
5629
|
+
| Prop | SelectSearch | MultiSelect | EntitySelect |
|
|
5630
|
+
|------|--------------|-------------|--------------|
|
|
5631
|
+
| `multiple` | ✅ Configurável | ✅ Default true | ❌ Sempre único |
|
|
5632
|
+
| `maxDisplayedBadges` | ✅ Modo múltiplo | ✅ | ❌ |
|
|
5633
|
+
| `popoverContainer` | ✅ | ✅ | ❌ |
|
|
5634
|
+
| `items` vs `options` | `options` | `options` | `items` |
|
|
5635
|
+
| Complexidade | Média | Média | Baixa |
|
|
5636
|
+
|
|
5637
|
+
### **Recomendações**
|
|
5638
|
+
|
|
5639
|
+
1. **Use SelectSearch quando:**
|
|
5640
|
+
- Precisar de flexibilidade para alternar entre único/múltiplo
|
|
5641
|
+
- Estiver dentro de Dialog e precisar de scroll
|
|
5642
|
+
- Quiser um componente versátil para diversos casos
|
|
5643
|
+
|
|
5644
|
+
2. **Use MultiSelect quando:**
|
|
5645
|
+
- Seleção múltipla for o único caso de uso
|
|
5646
|
+
- Precisar de controle avançado de badges
|
|
5647
|
+
- Precisar de modo único ocasionalmente (mas prefira SelectSearch)
|
|
5648
|
+
|
|
5649
|
+
3. **Use EntitySelect quando:**
|
|
5650
|
+
- Seleção única simples for suficiente
|
|
5651
|
+
- Não precisar de Dialog ou scroll especial
|
|
5652
|
+
- Quiser o componente mais leve e focado
|
|
5653
|
+
|
|
5654
|
+
### **⚠️ IMPORTANTE: Uso em Dialog**
|
|
5655
|
+
|
|
5656
|
+
Tanto `SelectSearch` quanto `MultiSelect` funcionam perfeitamente dentro de `Dialog`, mas requerem configuração específica:
|
|
5657
|
+
|
|
5658
|
+
**✅ Configuração correta:**
|
|
5659
|
+
|
|
5660
|
+
```typescript
|
|
5661
|
+
// 1. State para ref do DialogContent
|
|
5662
|
+
const [dialogContentRef, setDialogContentRef] = useState<HTMLDivElement | null>(null);
|
|
5663
|
+
|
|
5664
|
+
// 2. DialogContent com overflow-visible
|
|
5665
|
+
<DialogContent ref={setDialogContentRef} className="max-h-[90vh] overflow-visible">
|
|
5666
|
+
|
|
5667
|
+
{/* 3. Container interno com overflow-auto */}
|
|
5668
|
+
<div className="mt-4 max-h-[60vh] overflow-auto pr-1">
|
|
5669
|
+
|
|
5670
|
+
{/* 4. Passar ref como popoverContainer */}
|
|
5671
|
+
<SelectSearch
|
|
5672
|
+
options={options}
|
|
5673
|
+
value={selected}
|
|
5674
|
+
onChange={setSelected}
|
|
5675
|
+
popoverContainer={dialogContentRef} {/* ✅ CRÍTICO */}
|
|
5676
|
+
/>
|
|
5677
|
+
</div>
|
|
5678
|
+
</DialogContent>
|
|
5679
|
+
```
|
|
5680
|
+
|
|
5681
|
+
**❌ Erros comuns:**
|
|
5682
|
+
|
|
5683
|
+
```typescript
|
|
5684
|
+
// ❌ ERRADO: Sem popoverContainer
|
|
5685
|
+
<SelectSearch options={options} value={selected} onChange={setSelected} />
|
|
5686
|
+
|
|
5687
|
+
// ❌ ERRADO: DialogContent sem overflow-visible
|
|
5688
|
+
<DialogContent className="max-h-[90vh] overflow-auto">
|
|
5689
|
+
|
|
5690
|
+
// ❌ ERRADO: Usar document.body como container (perde scroll)
|
|
5691
|
+
<SelectSearch popoverContainer={document.body} />
|
|
5692
|
+
```
|
|
5693
|
+
|
|
5694
|
+
---
|
|
5695
|
+
|
|
5462
5696
|
## 🔍 FILTROS NO BACKEND (Backend Filtering)
|
|
5463
5697
|
|
|
5464
5698
|
### **Por que Filtros no Backend?**
|
|
@@ -6051,4 +6285,4 @@ src/
|
|
|
6051
6285
|
|
|
6052
6286
|
## 📝 Licença
|
|
6053
6287
|
|
|
6054
|
-
MIT License - ForLogic © 2025
|
|
6288
|
+
MIT License - ForLogic © 2025
|
package/dist/README.md
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
# 🧱 forlogic-core - Guia de Desenvolvimento
|
|
2
2
|
|
|
3
|
-
> **IMPORTANTE**: Este README é genérico para todos os projetos. Para configurações específicas do projeto (como schema padrão), consulte o
|
|
3
|
+
> **IMPORTANTE**: Este README é genérico para todos os projetos. Para configurações específicas do projeto (como schema padrão), consulte o **Custom Knowledge** do projeto nas configurações do Lovable.
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
## 🤖 REGRAS CRÍTICAS
|
|
8
8
|
|
|
9
|
-
> **📋 Schema Padrão**: Veja no
|
|
9
|
+
> **📋 Schema Padrão**: Veja no **Custom Knowledge** do projeto (Settings → Manage Knowledge) qual é o schema padrão deste projeto específico.
|
|
10
10
|
|
|
11
11
|
### ⚠️ TOP 4 ERROS MAIS COMUNS
|
|
12
12
|
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
// ❌ ERRADO
|
|
17
17
|
.from('table')
|
|
18
18
|
|
|
19
|
-
// ✅ CORRETO (verifique o schema padrão no
|
|
19
|
+
// ✅ CORRETO (verifique o schema padrão no Custom Knowledge)
|
|
20
20
|
.schema('SEU_SCHEMA').from('table')
|
|
21
21
|
```
|
|
22
22
|
|
|
@@ -5459,6 +5459,240 @@ fetch(url, { headers: { 'un-alias': 'true' } }); // ✅
|
|
|
5459
5459
|
|
|
5460
5460
|
---
|
|
5461
5461
|
|
|
5462
|
+
## 🔍 COMPONENTES DE SELEÇÃO: SelectSearch vs MultiSelect vs EntitySelect
|
|
5463
|
+
|
|
5464
|
+
### **Quando Usar Cada Componente?**
|
|
5465
|
+
|
|
5466
|
+
| Componente | Uso Recomendado | Modo | Características |
|
|
5467
|
+
|------------|----------------|------|-----------------|
|
|
5468
|
+
| **SelectSearch** | Seleção versátil (única OU múltipla) | Configurável | Mais flexível, ideal para formulários dinâmicos |
|
|
5469
|
+
| **MultiSelect** | Seleção múltipla apenas | Múltiplo (default) | Otimizado para badges, limite de badges exibidos |
|
|
5470
|
+
| **EntitySelect** | Seleção única de entidades | Único | Mais simples, ideal para foreign keys |
|
|
5471
|
+
|
|
5472
|
+
### **SelectSearch - Componente Versátil**
|
|
5473
|
+
|
|
5474
|
+
**Quando usar:**
|
|
5475
|
+
- ✅ Precisa alternar entre modo único e múltiplo dinamicamente
|
|
5476
|
+
- ✅ Formulários onde o modo pode mudar com base em lógica
|
|
5477
|
+
- ✅ Situações onde você quer um único componente para ambos os casos
|
|
5478
|
+
|
|
5479
|
+
**Exemplo básico:**
|
|
5480
|
+
|
|
5481
|
+
```typescript
|
|
5482
|
+
import { SelectSearch } from 'forlogic-core';
|
|
5483
|
+
|
|
5484
|
+
// Seleção única
|
|
5485
|
+
const [selectedLanguage, setSelectedLanguage] = useState<string>('');
|
|
5486
|
+
|
|
5487
|
+
<SelectSearch
|
|
5488
|
+
options={languageOptions}
|
|
5489
|
+
value={selectedLanguage}
|
|
5490
|
+
onChange={setSelectedLanguage}
|
|
5491
|
+
placeholder="Selecione um idioma..."
|
|
5492
|
+
label="Idioma"
|
|
5493
|
+
/>
|
|
5494
|
+
|
|
5495
|
+
// Seleção múltipla
|
|
5496
|
+
const [selectedTags, setSelectedTags] = useState<string[]>([]);
|
|
5497
|
+
|
|
5498
|
+
<SelectSearch
|
|
5499
|
+
multiple
|
|
5500
|
+
options={tagOptions}
|
|
5501
|
+
value={selectedTags}
|
|
5502
|
+
onChange={setSelectedTags}
|
|
5503
|
+
placeholder="Selecione tags..."
|
|
5504
|
+
label="Tags"
|
|
5505
|
+
maxDisplayedBadges={3}
|
|
5506
|
+
/>
|
|
5507
|
+
```
|
|
5508
|
+
|
|
5509
|
+
**Uso dentro de Dialog (scroll funcionando):**
|
|
5510
|
+
|
|
5511
|
+
```typescript
|
|
5512
|
+
import { Dialog, DialogContent, SelectSearch } from 'forlogic-core';
|
|
5513
|
+
|
|
5514
|
+
function MyComponent() {
|
|
5515
|
+
const [dialogContentRef, setDialogContentRef] = useState<HTMLDivElement | null>(null);
|
|
5516
|
+
const [selected, setSelected] = useState<string>('');
|
|
5517
|
+
|
|
5518
|
+
return (
|
|
5519
|
+
<Dialog>
|
|
5520
|
+
<DialogTrigger asChild>
|
|
5521
|
+
<Button>Abrir Seleção</Button>
|
|
5522
|
+
</DialogTrigger>
|
|
5523
|
+
<DialogContent ref={setDialogContentRef} className="max-h-[90vh] overflow-visible">
|
|
5524
|
+
<DialogHeader>
|
|
5525
|
+
<DialogTitle>Selecione uma Categoria</DialogTitle>
|
|
5526
|
+
</DialogHeader>
|
|
5527
|
+
<div className="mt-4 max-h-[60vh] overflow-auto pr-1">
|
|
5528
|
+
<SelectSearch
|
|
5529
|
+
options={categoryOptions}
|
|
5530
|
+
value={selected}
|
|
5531
|
+
onChange={setSelected}
|
|
5532
|
+
placeholder="Selecione..."
|
|
5533
|
+
popoverContainer={dialogContentRef} {/* ✅ CRÍTICO para scroll funcionar */}
|
|
5534
|
+
/>
|
|
5535
|
+
</div>
|
|
5536
|
+
</DialogContent>
|
|
5537
|
+
</Dialog>
|
|
5538
|
+
);
|
|
5539
|
+
}
|
|
5540
|
+
```
|
|
5541
|
+
|
|
5542
|
+
**Props principais:**
|
|
5543
|
+
|
|
5544
|
+
```typescript
|
|
5545
|
+
interface SelectSearchProps<T> {
|
|
5546
|
+
multiple?: boolean; // Modo: false = único, true = múltiplo
|
|
5547
|
+
options: T[]; // Array de itens
|
|
5548
|
+
value?: string | string[]; // Valor(es) selecionado(s)
|
|
5549
|
+
onChange?: (value: string | string[]) => void;
|
|
5550
|
+
getOptionValue?: (option: T) => string;
|
|
5551
|
+
getOptionLabel?: (option: T) => string;
|
|
5552
|
+
placeholder?: string;
|
|
5553
|
+
label?: string;
|
|
5554
|
+
disabled?: boolean;
|
|
5555
|
+
required?: boolean;
|
|
5556
|
+
isLoading?: boolean;
|
|
5557
|
+
error?: string | boolean;
|
|
5558
|
+
sortOptions?: boolean; // Default: true
|
|
5559
|
+
maxDisplayedBadges?: number; // Limite de badges (modo múltiplo)
|
|
5560
|
+
popoverContainer?: HTMLElement | null; // ✅ Essencial para Dialog
|
|
5561
|
+
}
|
|
5562
|
+
```
|
|
5563
|
+
|
|
5564
|
+
### **MultiSelect - Seleção Múltipla**
|
|
5565
|
+
|
|
5566
|
+
**Quando usar:**
|
|
5567
|
+
- ✅ Seleção múltipla obrigatória (não precisa alternar para único)
|
|
5568
|
+
- ✅ Exibição de badges é importante
|
|
5569
|
+
- ✅ Precisa de limite de badges exibidos (+N)
|
|
5570
|
+
|
|
5571
|
+
**Exemplo:**
|
|
5572
|
+
|
|
5573
|
+
```typescript
|
|
5574
|
+
import { MultiSelect } from 'forlogic-core';
|
|
5575
|
+
|
|
5576
|
+
const [selectedFrameworks, setSelectedFrameworks] = useState<string[]>([]);
|
|
5577
|
+
|
|
5578
|
+
<MultiSelect
|
|
5579
|
+
options={frameworks}
|
|
5580
|
+
value={selectedFrameworks}
|
|
5581
|
+
onChange={setSelectedFrameworks}
|
|
5582
|
+
getOptionValue={(opt) => opt.id}
|
|
5583
|
+
getOptionLabel={(opt) => opt.name}
|
|
5584
|
+
placeholder="Selecione frameworks..."
|
|
5585
|
+
label="Frameworks"
|
|
5586
|
+
maxDisplayedBadges={3} // Exibe: [Badge 1] [Badge 2] [Badge 3] [+5]
|
|
5587
|
+
/>
|
|
5588
|
+
```
|
|
5589
|
+
|
|
5590
|
+
**Modo único (suportado mas não recomendado):**
|
|
5591
|
+
|
|
5592
|
+
```typescript
|
|
5593
|
+
// ⚠️ Use SelectSearch ou EntitySelect para modo único
|
|
5594
|
+
<MultiSelect
|
|
5595
|
+
multiple={false} // Funciona, mas SelectSearch é mais apropriado
|
|
5596
|
+
options={options}
|
|
5597
|
+
value={selected}
|
|
5598
|
+
onChange={setSelected}
|
|
5599
|
+
/>
|
|
5600
|
+
```
|
|
5601
|
+
|
|
5602
|
+
### **EntitySelect - Seleção Única Simples**
|
|
5603
|
+
|
|
5604
|
+
**Quando usar:**
|
|
5605
|
+
- ✅ Seleção única de entidades (processos, usuários, categorias)
|
|
5606
|
+
- ✅ Foreign keys em formulários
|
|
5607
|
+
- ✅ Casos simples sem necessidade de badges ou modo múltiplo
|
|
5608
|
+
|
|
5609
|
+
**Exemplo:**
|
|
5610
|
+
|
|
5611
|
+
```typescript
|
|
5612
|
+
import { EntitySelect } from 'forlogic-core';
|
|
5613
|
+
|
|
5614
|
+
const [selectedFramework, setSelectedFramework] = useState<string>('');
|
|
5615
|
+
|
|
5616
|
+
<EntitySelect
|
|
5617
|
+
items={frameworks}
|
|
5618
|
+
value={selectedFramework}
|
|
5619
|
+
onChange={setSelectedFramework}
|
|
5620
|
+
getItemValue={(opt) => opt.id}
|
|
5621
|
+
getItemLabel={(opt) => opt.name}
|
|
5622
|
+
placeholder="Selecione um framework..."
|
|
5623
|
+
searchPlaceholder="Buscar framework..."
|
|
5624
|
+
/>
|
|
5625
|
+
```
|
|
5626
|
+
|
|
5627
|
+
### **Comparação de Props**
|
|
5628
|
+
|
|
5629
|
+
| Prop | SelectSearch | MultiSelect | EntitySelect |
|
|
5630
|
+
|------|--------------|-------------|--------------|
|
|
5631
|
+
| `multiple` | ✅ Configurável | ✅ Default true | ❌ Sempre único |
|
|
5632
|
+
| `maxDisplayedBadges` | ✅ Modo múltiplo | ✅ | ❌ |
|
|
5633
|
+
| `popoverContainer` | ✅ | ✅ | ❌ |
|
|
5634
|
+
| `items` vs `options` | `options` | `options` | `items` |
|
|
5635
|
+
| Complexidade | Média | Média | Baixa |
|
|
5636
|
+
|
|
5637
|
+
### **Recomendações**
|
|
5638
|
+
|
|
5639
|
+
1. **Use SelectSearch quando:**
|
|
5640
|
+
- Precisar de flexibilidade para alternar entre único/múltiplo
|
|
5641
|
+
- Estiver dentro de Dialog e precisar de scroll
|
|
5642
|
+
- Quiser um componente versátil para diversos casos
|
|
5643
|
+
|
|
5644
|
+
2. **Use MultiSelect quando:**
|
|
5645
|
+
- Seleção múltipla for o único caso de uso
|
|
5646
|
+
- Precisar de controle avançado de badges
|
|
5647
|
+
- Precisar de modo único ocasionalmente (mas prefira SelectSearch)
|
|
5648
|
+
|
|
5649
|
+
3. **Use EntitySelect quando:**
|
|
5650
|
+
- Seleção única simples for suficiente
|
|
5651
|
+
- Não precisar de Dialog ou scroll especial
|
|
5652
|
+
- Quiser o componente mais leve e focado
|
|
5653
|
+
|
|
5654
|
+
### **⚠️ IMPORTANTE: Uso em Dialog**
|
|
5655
|
+
|
|
5656
|
+
Tanto `SelectSearch` quanto `MultiSelect` funcionam perfeitamente dentro de `Dialog`, mas requerem configuração específica:
|
|
5657
|
+
|
|
5658
|
+
**✅ Configuração correta:**
|
|
5659
|
+
|
|
5660
|
+
```typescript
|
|
5661
|
+
// 1. State para ref do DialogContent
|
|
5662
|
+
const [dialogContentRef, setDialogContentRef] = useState<HTMLDivElement | null>(null);
|
|
5663
|
+
|
|
5664
|
+
// 2. DialogContent com overflow-visible
|
|
5665
|
+
<DialogContent ref={setDialogContentRef} className="max-h-[90vh] overflow-visible">
|
|
5666
|
+
|
|
5667
|
+
{/* 3. Container interno com overflow-auto */}
|
|
5668
|
+
<div className="mt-4 max-h-[60vh] overflow-auto pr-1">
|
|
5669
|
+
|
|
5670
|
+
{/* 4. Passar ref como popoverContainer */}
|
|
5671
|
+
<SelectSearch
|
|
5672
|
+
options={options}
|
|
5673
|
+
value={selected}
|
|
5674
|
+
onChange={setSelected}
|
|
5675
|
+
popoverContainer={dialogContentRef} {/* ✅ CRÍTICO */}
|
|
5676
|
+
/>
|
|
5677
|
+
</div>
|
|
5678
|
+
</DialogContent>
|
|
5679
|
+
```
|
|
5680
|
+
|
|
5681
|
+
**❌ Erros comuns:**
|
|
5682
|
+
|
|
5683
|
+
```typescript
|
|
5684
|
+
// ❌ ERRADO: Sem popoverContainer
|
|
5685
|
+
<SelectSearch options={options} value={selected} onChange={setSelected} />
|
|
5686
|
+
|
|
5687
|
+
// ❌ ERRADO: DialogContent sem overflow-visible
|
|
5688
|
+
<DialogContent className="max-h-[90vh] overflow-auto">
|
|
5689
|
+
|
|
5690
|
+
// ❌ ERRADO: Usar document.body como container (perde scroll)
|
|
5691
|
+
<SelectSearch popoverContainer={document.body} />
|
|
5692
|
+
```
|
|
5693
|
+
|
|
5694
|
+
---
|
|
5695
|
+
|
|
5462
5696
|
## 🔍 FILTROS NO BACKEND (Backend Filtering)
|
|
5463
5697
|
|
|
5464
5698
|
### **Por que Filtros no Backend?**
|
|
@@ -6051,4 +6285,4 @@ src/
|
|
|
6051
6285
|
|
|
6052
6286
|
## 📝 Licença
|
|
6053
6287
|
|
|
6054
|
-
MIT License - ForLogic © 2025
|
|
6288
|
+
MIT License - ForLogic © 2025
|