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 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 arquivo **KNOWLEDGE.md**.
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 arquivo **KNOWLEDGE.md** qual é o schema padrão deste projeto específico.
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 KNOWLEDGE.md)
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 arquivo **KNOWLEDGE.md**.
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 arquivo **KNOWLEDGE.md** qual é o schema padrão deste projeto específico.
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 KNOWLEDGE.md)
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