forlogic-core 2.0.7 → 2.0.8
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/.note/memory/patterns/admin-i18n-policy.md +20 -0
- package/.note/memory/patterns/i18n-architecture.md +3 -0
- package/README.md +34 -269
- package/dist/action-plans/constants.d.ts +23 -3
- package/dist/audit-trail/utils.d.ts +5 -5
- package/dist/auth/components/EditProfileDialog.d.ts +12 -0
- package/dist/auth/contexts/AuthContext.d.ts +1 -1
- package/dist/auth/services/AuthService.d.ts +1 -1
- package/dist/components/dashboards/panels/panel-header.d.ts +1 -1
- package/dist/components/layout/SidebarActionTrigger.d.ts +3 -3
- package/dist/components/modules/ModuleAccessGuard.d.ts +1 -1
- package/dist/components/modules/icons/ModulesCardIcons.d.ts +2 -2
- package/dist/components/ui/color-picker.d.ts +2 -2
- package/dist/components/ui/combo-tree.d.ts +3 -1
- package/dist/components/ui/data-list.d.ts +2 -2
- package/dist/components/ui/dialog-wizard.d.ts +1 -1
- package/dist/components/ui/dialog.d.ts +1 -1
- package/dist/components/ui/disabled-menu-item.d.ts +1 -1
- package/dist/components/ui/empty-state.d.ts +9 -9
- package/dist/components/ui/onboarding-dialog.d.ts +1 -1
- package/dist/components/ui/popover.d.ts +1 -1
- package/dist/components/ui/split-button.d.ts +2 -2
- package/dist/components/ui/terms-of-use-dialog.d.ts +3 -3
- package/dist/config/index.d.ts +1 -1
- package/dist/contexts/PageMetadataContext.d.ts +2 -2
- package/dist/crud/components/CrudTable.d.ts +3 -1
- package/dist/crud/components/FilterBar.d.ts +2 -2
- package/dist/crud/primitives/Table.d.ts +2 -2
- package/dist/crud/primitives/types.d.ts +1 -1
- package/dist/i18n/index.d.ts +1 -10
- package/dist/i18n/utils.d.ts +14 -0
- package/dist/index.css +1 -1
- package/dist/index.css.map +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/index.js +1 -1
- package/dist/leadership/components/LeadershipPage.d.ts +1 -1
- package/dist/media/components/ImageRenderer.d.ts +1 -1
- package/dist/media/components/VideoEditor.d.ts +0 -20
- package/dist/media/components/VideoRenderer.d.ts +0 -6
- package/dist/qualiex/components/QualiexUserField.d.ts +1 -1
- package/dist/types.d.ts +1 -0
- package/docs/WORKSPACE_KNOWLEDGE.md +254 -0
- package/docs/design-system/README.md +1 -1
- package/docs/design-system/patterns/feature-flags.md +1 -0
- package/docs/design-system/patterns/i18n-setup.md +76 -1
- package/package.json +1 -1
- package/docs/AUDIT_PROMPT.md +0 -74
- package/docs/KNOWLEDGE.md +0 -109
- package/docs/PROJECT_KNOWLEDGE_TEMPLATE.md +0 -120
- package/docs/PROMPT_TEMPLATE.md +0 -77
- package/docs/STARTER_TEMPLATE.md +0 -114
|
@@ -13,7 +13,7 @@ export interface LeadershipPageProps {
|
|
|
13
13
|
columns?: TreeTableColumn<LeaderNode>[];
|
|
14
14
|
/** Header da coluna de nome (default: "Líder") */
|
|
15
15
|
nameHeader?: string;
|
|
16
|
-
/** Texto da zona de drop raiz (default:
|
|
16
|
+
/** Texto da zona de drop raiz (default: t('leadership_make_root')) */
|
|
17
17
|
rootDropLabel?: string;
|
|
18
18
|
}
|
|
19
19
|
export declare function LeadershipPage({ unassociatedUsers, onAssociateUser, onMoveNode: customMoveNode, onMoveNodes: customMoveNodes, columns: customColumns, nameHeader, rootDropLabel, }?: LeadershipPageProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,22 +1,2 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Video Editor Component
|
|
3
|
-
*
|
|
4
|
-
* Editor genérico de vídeo para forlogic-core.
|
|
5
|
-
* Suporta URL, upload e código embed.
|
|
6
|
-
*
|
|
7
|
-
* @example
|
|
8
|
-
* ```tsx
|
|
9
|
-
* import { VideoEditor } from 'forlogic-core';
|
|
10
|
-
*
|
|
11
|
-
* <VideoEditor
|
|
12
|
-
* value={videoData}
|
|
13
|
-
* onChange={setVideoData}
|
|
14
|
-
* onSubmit={handleSave}
|
|
15
|
-
* onCancel={handleCancel}
|
|
16
|
-
* uploadFunction={myUploadFunction}
|
|
17
|
-
* uploadOptions={{ bucket: 'videos', folder: 'content' }}
|
|
18
|
-
* />
|
|
19
|
-
* ```
|
|
20
|
-
*/
|
|
21
1
|
import type { MediaEditorProps, VideoBlockContent } from '../types';
|
|
22
2
|
export declare function VideoEditor({ value, onChange, onSubmit, onCancel, uploadFunction, deleteFunction, uploadOptions }: MediaEditorProps<VideoBlockContent>): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,8 +1,2 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Video Renderer Component
|
|
3
|
-
*
|
|
4
|
-
* Renderizador genérico de vídeo para forlogic-core.
|
|
5
|
-
* Suporta YouTube, Vimeo e arquivos diretos.
|
|
6
|
-
*/
|
|
7
1
|
import type { MediaRendererProps, VideoBlockContent } from '../types';
|
|
8
2
|
export declare function VideoRenderer({ content, className, style }: MediaRendererProps<VideoBlockContent>): import("react/jsx-runtime").JSX.Element;
|
|
@@ -52,7 +52,7 @@ export type QualiexUserDisplayFormat = 'name' | 'name-email' | 'name-role' | 'cu
|
|
|
52
52
|
* // Display customizado
|
|
53
53
|
* <QualiexUserField
|
|
54
54
|
* displayFormat="custom"
|
|
55
|
-
* customDisplayFn={(user) => `${user.userName} - ${user.placeName || '
|
|
55
|
+
* customDisplayFn={(user) => `${user.userName} - ${user.placeName || t('no_place_selected')}`}
|
|
56
56
|
* value={userId}
|
|
57
57
|
* onChange={setUserId}
|
|
58
58
|
* />
|
package/dist/types.d.ts
CHANGED
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
# forlogic-core — Workspace Knowledge
|
|
2
|
+
|
|
3
|
+
> **Documento de referência** para todos os projetos que consomem `forlogic-core`.
|
|
4
|
+
> Cole este conteúdo como **Workspace Knowledge** no Lovable.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 🔗 Cross-Project: Projeto Admin (DS + Lib)
|
|
9
|
+
|
|
10
|
+
> **Para consultar componentes, props, tipos, exemplos e implementação**: use cross-project (`@Admin`) para ler arquivos do projeto **"Admin"** (`qualiex-admin`).
|
|
11
|
+
|
|
12
|
+
### Caminhos úteis no projeto Admin
|
|
13
|
+
|
|
14
|
+
| O que procurar | Caminho no Admin |
|
|
15
|
+
|----------------|------------------|
|
|
16
|
+
| Código-fonte dos componentes UI | `lib/components/ui/` |
|
|
17
|
+
| Sistema CRUD | `lib/crud/` |
|
|
18
|
+
| Barrel exports (lista completa) | `lib/exports/ui.ts`, `lib/exports/index.ts` |
|
|
19
|
+
| Documentação MD do Design System | `docs/design-system/` |
|
|
20
|
+
| Docs interativos (código-fonte) | `src/design-system/docs/` |
|
|
21
|
+
| Hooks compartilhados | `lib/hooks/` |
|
|
22
|
+
| Providers (CoreProviders) | `lib/providers/` |
|
|
23
|
+
| Serviços (Base, Email, Error) | `lib/services/` |
|
|
24
|
+
| Config Vite/Tailwind | `lib/vite/`, `lib/tailwind/` |
|
|
25
|
+
| Constituição (regras canônicas) | `spec/constitution.md` |
|
|
26
|
+
| Prompt template | `docs/PROMPT_TEMPLATE.md` |
|
|
27
|
+
| Project Knowledge template | `docs/PROJECT_KNOWLEDGE_TEMPLATE.md` |
|
|
28
|
+
| Starter template | `docs/STARTER_TEMPLATE.md` |
|
|
29
|
+
| Golden snippets | `docs/design-system/examples.md` |
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 0. Schema do Projeto
|
|
34
|
+
|
|
35
|
+
> ⚠️ **O schema é definido no `README.md` de cada projeto.** Consulte-o antes de qualquer query.
|
|
36
|
+
|
|
37
|
+
```ts
|
|
38
|
+
// ✅ CORRETO — substituir pelo schema do projeto (ex: 'common', 'docs', etc.)
|
|
39
|
+
supabase.schema('SCHEMA_DO_PROJETO').from('tabela').select('*');
|
|
40
|
+
|
|
41
|
+
// ❌ ERRADO (vai falhar em produção)
|
|
42
|
+
supabase.from('tabela').select('*');
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
> Nunca usar o schema `public`. Cada projeto tem seu próprio schema documentado no `README.md`.
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## 1. Constituição — Regras Canônicas
|
|
50
|
+
|
|
51
|
+
> 📖 **Todas as regras, convenções e melhores práticas estão em `spec/constitution.md`** no projeto Admin.
|
|
52
|
+
|
|
53
|
+
Antes de implementar qualquer funcionalidade, consulte a constituição via cross-project:
|
|
54
|
+
```
|
|
55
|
+
@Admin spec/constitution.md
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Resumo das regras invioláveis
|
|
59
|
+
|
|
60
|
+
| Regra | Detalhe |
|
|
61
|
+
|-------|---------|
|
|
62
|
+
| Schema obrigatório | `.schema('...')` em toda query Supabase (schema do `README.md`) |
|
|
63
|
+
| Sem DELETE físico | Soft delete com `deleted_at` + policy `FOR UPDATE` |
|
|
64
|
+
| Sem índices automáticos | Apenas com aprovação explícita + `EXPLAIN ANALYZE` |
|
|
65
|
+
| Sem modificar `.env` | Apenas com autorização do usuário |
|
|
66
|
+
| Sem hardcoded admin | Nunca localStorage/sessionStorage para roles |
|
|
67
|
+
| Lib-first | Usar `forlogic-core` antes de criar componente |
|
|
68
|
+
| Import do Supabase | Sempre `getSupabaseClient()` de `forlogic-core` |
|
|
69
|
+
| Import de i18n | Sempre `useTranslation` de `forlogic-core`, nunca de `react-i18next` |
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## 2. Lib-First — forlogic-core
|
|
74
|
+
|
|
75
|
+
> Antes de criar qualquer componente, **verificar se já existe em `forlogic-core`**.
|
|
76
|
+
|
|
77
|
+
```ts
|
|
78
|
+
// ✅ CORRETO
|
|
79
|
+
import { Button, Dialog, Input, Combobox, ActionButton, useTranslation } from 'forlogic-core';
|
|
80
|
+
|
|
81
|
+
// ❌ PROIBIDO — criar componente local que já existe na lib
|
|
82
|
+
import { MyCustomButton } from '@/components/MyCustomButton';
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Checklist
|
|
86
|
+
|
|
87
|
+
- [ ] Pesquisei se existe na forlogic-core?
|
|
88
|
+
- [ ] Verifiquei o Design System (`@Admin docs/design-system/`)?
|
|
89
|
+
- [ ] Pode ser alcançado com props/variantes existentes?
|
|
90
|
+
|
|
91
|
+
### Exceções permitidas
|
|
92
|
+
|
|
93
|
+
1. Componente específico de domínio de negócio (ex: `InvoiceCard`)
|
|
94
|
+
2. Composição de componentes da lib (wrapper Dialog + Form)
|
|
95
|
+
3. Protótipo temporário que será migrado para a lib
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## 3. Design System — Categorias
|
|
100
|
+
|
|
101
|
+
> Para ver props e exemplos: `@Admin docs/design-system/<arquivo>.md`
|
|
102
|
+
|
|
103
|
+
| Categoria | Arquivo |
|
|
104
|
+
|-----------|---------|
|
|
105
|
+
| Fundação | `foundation.md` |
|
|
106
|
+
| Botões & Ações | `buttons-actions.md` |
|
|
107
|
+
| Inputs | `inputs.md` |
|
|
108
|
+
| Seletores | `selectors.md` |
|
|
109
|
+
| Data Display | `data-display.md` |
|
|
110
|
+
| Data Grid | `tables-grids.md` |
|
|
111
|
+
| Gráficos & Dashboards | `charts-dashboards.md` |
|
|
112
|
+
| Navegação | `navigation.md` |
|
|
113
|
+
| Dialogs | `dialogs.md` |
|
|
114
|
+
| Notifications & Feedback | `notifications-feedback.md` |
|
|
115
|
+
| Layout | `layout.md` |
|
|
116
|
+
| CRUD | `crud.md` |
|
|
117
|
+
| Plataforma | `platform.md` |
|
|
118
|
+
| Business Components | `domain.md` |
|
|
119
|
+
| Developer Tools | `infra-utils.md` |
|
|
120
|
+
|
|
121
|
+
### Aliases disponíveis
|
|
122
|
+
|
|
123
|
+
| Original | Alias(es) |
|
|
124
|
+
|----------|-----------|
|
|
125
|
+
| Combobox | SelectSearch, MultiSelect, EntitySelect, AutoComplete |
|
|
126
|
+
| ComboTree | TreeSelect |
|
|
127
|
+
| StepSelector | Stepper |
|
|
128
|
+
| ActionButton | ActionMenu, RowActions |
|
|
129
|
+
| TruncatedCell | EllipsisText |
|
|
130
|
+
| CrudPrimitiveTable | DataTable |
|
|
131
|
+
| CrudPrimitivePagination | DataPagination |
|
|
132
|
+
| CrudPrimitiveFilterBar | DataFilterBar |
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## 4. Instrução para IA — Leitura Obrigatória
|
|
137
|
+
|
|
138
|
+
**QUANDO** criar ou modificar qualquer arquivo `.tsx` com JSX:
|
|
139
|
+
|
|
140
|
+
- **SE** contém tabela, listagem ou CRUD → **LER** `@Admin docs/design-system/crud.md` e `@Admin docs/design-system/tables-grids.md` ANTES
|
|
141
|
+
- **SE** contém formulário, input ou campo → **LER** `@Admin docs/design-system/inputs.md` e `@Admin docs/design-system/selectors.md` ANTES
|
|
142
|
+
- **SE** contém modal ou confirmação → **LER** `@Admin docs/design-system/dialogs.md` ANTES
|
|
143
|
+
- **SE** contém botões ou ações de linha → **LER** `@Admin docs/design-system/buttons-actions.md` ANTES
|
|
144
|
+
- **SE** é estrutura de página/layout → **LER** `@Admin docs/design-system/layout.md` ANTES
|
|
145
|
+
|
|
146
|
+
**SEMPRE** consultar `@Admin docs/design-system/examples.md` como referência de implementação.
|
|
147
|
+
|
|
148
|
+
**VALIDAÇÃO pós-geração**: Todo import de componente visual DEVE vir de `forlogic-core`. Se criou componente local que existe na lib, refatore imediatamente.
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## 5. Padrões CRUD
|
|
153
|
+
|
|
154
|
+
### Toolbar — Layout obrigatório de 3 zonas
|
|
155
|
+
|
|
156
|
+
| Zona | Posição | Conteúdo |
|
|
157
|
+
|------|---------|----------|
|
|
158
|
+
| Esquerda | `justify-start` | Botão "Novo" + Dropdown ações em lote |
|
|
159
|
+
| Centro | `flex-1 max-w-md` | Campo de busca |
|
|
160
|
+
| Direita | `justify-end` | Filtros + Toggle view |
|
|
161
|
+
|
|
162
|
+
### Defaults obrigatórios
|
|
163
|
+
|
|
164
|
+
- Paginação: `CrudPrimitivePagination variant="full"`, **10 itens/página** (menor opção)
|
|
165
|
+
- Column resize: ativado por padrão
|
|
166
|
+
- Column manager: ativado por padrão
|
|
167
|
+
- Ordenação: ativada em todas as colunas por padrão
|
|
168
|
+
- Busca: na action bar com `showSearch=true`
|
|
169
|
+
- Ações de linha: sempre usar `ActionButton` da lib
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
## 6. Padrões Deprecated
|
|
174
|
+
|
|
175
|
+
| ❌ Não usar | ✅ Usar |
|
|
176
|
+
|------------|--------|
|
|
177
|
+
| `BulkActionBar` separado | Dropdown no `CrudActionBar` |
|
|
178
|
+
| `<MoreHorizontal>` genérico | `ActionButton` |
|
|
179
|
+
| Paginação manual | `CrudPrimitivePagination` |
|
|
180
|
+
| `StatusSelect` | `Combobox` |
|
|
181
|
+
| `DeleteConfirmationDialog` | `Dialog` |
|
|
182
|
+
| `Searchbar` | `Input` com ícone |
|
|
183
|
+
| Schema `public` | `.schema('...')` com schema do projeto |
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
## 7. Feature Flags
|
|
188
|
+
|
|
189
|
+
| Variável | Descrição | Padrão |
|
|
190
|
+
|----------|-----------|--------|
|
|
191
|
+
| `VITE_SHOW_USER_PREFERENCES` | Exibe "Preferências" no menu do usuário (idioma, timezone, formato de data) | Não exibe |
|
|
192
|
+
| `VITE_I18N_DEBUG_MODE` | Modo debug de i18n (mostra `🔑 chave` ao invés de traduções) | `"false"` |
|
|
193
|
+
| `VITE_IS_QUALIEX` | Usa logos Qualiex ao invés de Forlogic | `"false"` |
|
|
194
|
+
| `VITE_SHOW_EDIT_PROFILE` | Exibe "Editar Perfil" no menu do usuário (foto e idioma) | Não exibe |
|
|
195
|
+
|
|
196
|
+
Todas precisam do prefixo `VITE_` para serem expostas ao cliente.
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
200
|
+
## 8. Configuração — Setup do Projeto
|
|
201
|
+
|
|
202
|
+
### CoreProviders
|
|
203
|
+
|
|
204
|
+
```tsx
|
|
205
|
+
import { CoreProviders } from 'forlogic-core';
|
|
206
|
+
import ptBR from './i18n/pt-BR.json';
|
|
207
|
+
|
|
208
|
+
function App() {
|
|
209
|
+
return (
|
|
210
|
+
<CoreProviders moduleAlias="seu-modulo" appTranslations={{ 'pt-BR': ptBR, 'en-US': enUS }}>
|
|
211
|
+
<BrowserRouter><Routes /></BrowserRouter>
|
|
212
|
+
</CoreProviders>
|
|
213
|
+
);
|
|
214
|
+
}
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
### Vite
|
|
218
|
+
|
|
219
|
+
```ts
|
|
220
|
+
import { createSecurityHeadersPlugin } from 'forlogic-core/vite';
|
|
221
|
+
|
|
222
|
+
export default defineConfig(({ mode }) => ({
|
|
223
|
+
plugins: [
|
|
224
|
+
react(),
|
|
225
|
+
createSecurityHeadersPlugin(mode === 'development', {
|
|
226
|
+
supabaseUrls: ['https://SEU_PROJETO.supabase.co'],
|
|
227
|
+
additionalConnectSrc: ['https://*.qualiex.com'],
|
|
228
|
+
}),
|
|
229
|
+
],
|
|
230
|
+
resolve: { alias: { '@': path.resolve(__dirname, './src') } },
|
|
231
|
+
}));
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
### Tailwind
|
|
235
|
+
|
|
236
|
+
```ts
|
|
237
|
+
import { forlogicTailwindPreset, forlogicContentPaths } from 'forlogic-core/tailwind';
|
|
238
|
+
|
|
239
|
+
export default {
|
|
240
|
+
presets: [forlogicTailwindPreset],
|
|
241
|
+
content: [...forlogicContentPaths],
|
|
242
|
+
} satisfies Config;
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
---
|
|
246
|
+
|
|
247
|
+
## 9. Estrutura de Documentação
|
|
248
|
+
|
|
249
|
+
| Local | Responsabilidade |
|
|
250
|
+
|-------|-----------------|
|
|
251
|
+
| `README.md` (raiz de cada projeto) | **Schema do projeto** — única fonte canônica |
|
|
252
|
+
| `spec/constitution.md` (projeto Admin) | **Regras e convenções** — fonte canônica para todos os projetos |
|
|
253
|
+
| `docs/design-system/` (projeto Admin) | **Design System** — documentação de componentes |
|
|
254
|
+
| Rota `/ds` no app Admin | **Design System visual** — documentação interativa |
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
| `VITE_SHOW_USER_PREFERENCES` | Exibe "Preferências" no menu do usuário (idioma, timezone, formato de data) | Não exibe |
|
|
8
8
|
| `VITE_I18N_DEBUG_MODE` | Modo debug de i18n (mostra chaves ao invés de traduções) | `"false"` |
|
|
9
9
|
| `VITE_IS_QUALIEX` | Usa logos Qualiex ao invés de Forlogic | `"false"` |
|
|
10
|
+
| `VITE_SHOW_EDIT_PROFILE` | Exibe "Editar Perfil" no menu do usuário (foto e idioma) | Não exibe |
|
|
10
11
|
|
|
11
12
|
## Uso
|
|
12
13
|
|
|
@@ -8,7 +8,9 @@
|
|
|
8
8
|
|
|
9
9
|
## Setup em projetos consumidores
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
### Projeto simples (poucas chaves)
|
|
12
|
+
|
|
13
|
+
1. Criar JSON flat em `src/i18n/pt-BR.json`: `{ "key": "value" }` (sem nesting)
|
|
12
14
|
2. Passar para CoreProviders:
|
|
13
15
|
|
|
14
16
|
```tsx
|
|
@@ -17,6 +19,67 @@
|
|
|
17
19
|
|
|
18
20
|
3. Usar `useTranslation` de `forlogic-core` (nunca de `react-i18next`)
|
|
19
21
|
|
|
22
|
+
### Projeto modular (múltiplas features)
|
|
23
|
+
|
|
24
|
+
Para módulos com muitas chaves, dividir traduções por feature:
|
|
25
|
+
|
|
26
|
+
```text
|
|
27
|
+
src/i18n/
|
|
28
|
+
├── pt-BR/
|
|
29
|
+
│ ├── common.json ← chaves gerais do módulo
|
|
30
|
+
│ ├── matrices.json ← feature: matrizes
|
|
31
|
+
│ ├── requirements.json ← feature: requisitos
|
|
32
|
+
│ └── reports.json ← feature: relatórios
|
|
33
|
+
├── en-US/
|
|
34
|
+
│ ├── common.json
|
|
35
|
+
│ ├── matrices.json
|
|
36
|
+
│ ├── requirements.json
|
|
37
|
+
│ └── reports.json
|
|
38
|
+
└── index.ts ← merge automático
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
#### Arquivo `src/i18n/index.ts`
|
|
42
|
+
|
|
43
|
+
```ts
|
|
44
|
+
import { mergeTranslationFiles } from 'forlogic-core/i18n';
|
|
45
|
+
|
|
46
|
+
import ptCommon from './pt-BR/common.json';
|
|
47
|
+
import ptMatrices from './pt-BR/matrices.json';
|
|
48
|
+
import ptRequirements from './pt-BR/requirements.json';
|
|
49
|
+
import ptReports from './pt-BR/reports.json';
|
|
50
|
+
|
|
51
|
+
import enCommon from './en-US/common.json';
|
|
52
|
+
import enMatrices from './en-US/matrices.json';
|
|
53
|
+
import enRequirements from './en-US/requirements.json';
|
|
54
|
+
import enReports from './en-US/reports.json';
|
|
55
|
+
|
|
56
|
+
export const appTranslations = {
|
|
57
|
+
'pt-BR': mergeTranslationFiles(ptCommon, ptMatrices, ptRequirements, ptReports),
|
|
58
|
+
'en-US': mergeTranslationFiles(enCommon, enMatrices, enRequirements, enReports),
|
|
59
|
+
};
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
#### Uso no App
|
|
63
|
+
|
|
64
|
+
```tsx
|
|
65
|
+
import { CoreProviders } from 'forlogic-core';
|
|
66
|
+
import { appTranslations } from './i18n';
|
|
67
|
+
|
|
68
|
+
function App() {
|
|
69
|
+
return (
|
|
70
|
+
<CoreProviders appTranslations={appTranslations}>
|
|
71
|
+
<BrowserRouter><Routes /></BrowserRouter>
|
|
72
|
+
</CoreProviders>
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Regras dos JSONs
|
|
78
|
+
|
|
79
|
+
- Formato **flat** (sem nesting): `{ "key": "value" }`
|
|
80
|
+
- Chaves duplicadas entre arquivos: o último spread vence (common → features)
|
|
81
|
+
- Chaves do `app` sobrescrevem chaves do `core` com mesmo nome
|
|
82
|
+
|
|
20
83
|
## Resolução de chaves
|
|
21
84
|
|
|
22
85
|
```
|
|
@@ -25,6 +88,17 @@ t('objective') → app: "Objetivo"
|
|
|
25
88
|
t('save') com override no app → app: "Gravar" (sobrescreve core)
|
|
26
89
|
```
|
|
27
90
|
|
|
91
|
+
## Helper `mergeTranslationFiles`
|
|
92
|
+
|
|
93
|
+
Utilitário exportado pela lib para facilitar o merge:
|
|
94
|
+
|
|
95
|
+
```ts
|
|
96
|
+
import { mergeTranslationFiles } from 'forlogic-core/i18n';
|
|
97
|
+
|
|
98
|
+
const ptBR = mergeTranslationFiles(common, matrices, requirements);
|
|
99
|
+
// Equivalente a: { ...common, ...matrices, ...requirements }
|
|
100
|
+
```
|
|
101
|
+
|
|
28
102
|
## Debug
|
|
29
103
|
|
|
30
104
|
```ts
|
|
@@ -40,3 +114,4 @@ console.log('Resources:', i18n.store.data);
|
|
|
40
114
|
| Import de `react-i18next` direto | Usar import de `forlogic-core` |
|
|
41
115
|
| `appTranslations` não passado | Adicionar prop no CoreProviders |
|
|
42
116
|
| JSON com formato errado | Deve ser flat, sem nesting |
|
|
117
|
+
| Chave duplicada entre features | Último arquivo no merge vence |
|
package/package.json
CHANGED
package/docs/AUDIT_PROMPT.md
DELETED
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
# Prompt de Auditoria — Design System
|
|
2
|
-
|
|
3
|
-
> **Como usar**: Cole este prompt em uma conversa do Lovable no projeto consumidor para auditar e corrigir violações do Design System.
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## Prompt para copiar
|
|
8
|
-
|
|
9
|
-
```
|
|
10
|
-
Audite TODOS os arquivos .tsx do projeto em busca de violações do Design System do forlogic-core.
|
|
11
|
-
|
|
12
|
-
Antes de começar, leia obrigatoriamente via cross-project:
|
|
13
|
-
@Admin docs/design-system/crud.md
|
|
14
|
-
@Admin docs/design-system/inputs.md
|
|
15
|
-
@Admin docs/design-system/selectors.md
|
|
16
|
-
@Admin docs/design-system/layout.md
|
|
17
|
-
@Admin docs/design-system/dialogs.md
|
|
18
|
-
@Admin docs/design-system/buttons-actions.md
|
|
19
|
-
|
|
20
|
-
Verifique CADA arquivo .tsx contra estas regras:
|
|
21
|
-
|
|
22
|
-
### Imports inválidos
|
|
23
|
-
- [ ] Import de componente UI que NÃO vem de `forlogic-core` (Button, Dialog, Input, Select, Table, etc.)
|
|
24
|
-
- [ ] Import de `react-i18next` em vez de `useTranslation` de `forlogic-core`
|
|
25
|
-
- [ ] Import de `@/integrations/supabase/client` em vez de `getSupabaseClient()` de `forlogic-core`
|
|
26
|
-
|
|
27
|
-
### Componentes proibidos
|
|
28
|
-
- [ ] `<Select>` ou `<StatusSelect>` → deve ser `<Combobox>`
|
|
29
|
-
- [ ] `<MoreHorizontal>` genérico como menu de ações → deve ser `<ActionButton>`
|
|
30
|
-
- [ ] `<DeleteConfirmationDialog>` → deve ser `<Dialog>`
|
|
31
|
-
- [ ] `<Searchbar>` → deve ser `<Input>` com ícone de busca
|
|
32
|
-
- [ ] `BulkActionBar` separado → deve ser dropdown no `CrudActionBar`
|
|
33
|
-
- [ ] Paginação manual → deve ser `CrudPrimitivePagination`
|
|
34
|
-
|
|
35
|
-
### Supabase
|
|
36
|
-
- [ ] Query sem `.schema('SCHEMA_PADRAO')` (qualquer `supabase.from(` direto)
|
|
37
|
-
- [ ] DELETE físico (deve ser soft delete com `deleted_at`)
|
|
38
|
-
- [ ] `supabase` importado diretamente do client em vez de `getSupabaseClient()`
|
|
39
|
-
|
|
40
|
-
### Layout
|
|
41
|
-
- [ ] Página sem `usePageMetadata` (título/subtítulo)
|
|
42
|
-
- [ ] Layout sem `AppLayout` + `AppSidebar`
|
|
43
|
-
- [ ] Componente criado localmente quando existe equivalente na lib
|
|
44
|
-
|
|
45
|
-
### Formulários
|
|
46
|
-
- [ ] Formulário sem `BaseForm` ou `react-hook-form` + `zod`
|
|
47
|
-
- [ ] Select nativo HTML em vez de `Combobox`
|
|
48
|
-
|
|
49
|
-
Para cada violação encontrada, gere um relatório no formato:
|
|
50
|
-
|
|
51
|
-
| Arquivo | Linha | Violação | Correção |
|
|
52
|
-
|---------|-------|----------|----------|
|
|
53
|
-
| src/pages/X.tsx | 15 | Import de Button local | Usar `import { Button } from 'forlogic-core'` |
|
|
54
|
-
|
|
55
|
-
Depois do relatório, pergunte se devo corrigir automaticamente.
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
---
|
|
59
|
-
|
|
60
|
-
## Variações
|
|
61
|
-
|
|
62
|
-
### Auditoria rápida (apenas imports)
|
|
63
|
-
|
|
64
|
-
```
|
|
65
|
-
Busque em TODOS os arquivos .tsx do projeto por imports que NÃO vêm de 'forlogic-core'.
|
|
66
|
-
Liste: arquivo, linha, import atual, e o import correto de forlogic-core.
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
### Auditoria de Supabase
|
|
70
|
-
|
|
71
|
-
```
|
|
72
|
-
Busque em TODOS os arquivos .ts/.tsx por chamadas a `supabase.from(` sem `.schema('SCHEMA_PADRAO')`.
|
|
73
|
-
Liste: arquivo, linha, query atual, e a correção com .schema().
|
|
74
|
-
```
|
package/docs/KNOWLEDGE.md
DELETED
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
# KNOWLEDGE — Regras Críticas do Projeto
|
|
2
|
-
|
|
3
|
-
> 🤖 **Para IA**: Detalhes de componentes, props e tipos → ler do projeto **Admin** via cross-project.
|
|
4
|
-
> Padrões universais (componentes, layout, CRUD, scroll) → `docs/design-system/patterns/`
|
|
5
|
-
> Padrões internos do Admin → `.note/memory/`
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## 0. Schema do Projeto
|
|
10
|
-
|
|
11
|
-
**SCHEMA = `common`**
|
|
12
|
-
|
|
13
|
-
☝️ Este é o **único local** onde o schema é definido. Toda query Supabase
|
|
14
|
-
**DEVE** usar `.schema('<valor acima>')`. Altere **apenas aqui** ao configurar
|
|
15
|
-
um novo projeto.
|
|
16
|
-
|
|
17
|
-
```ts
|
|
18
|
-
// ✅ usar o schema definido acima
|
|
19
|
-
supabase.schema('common').from('tabela').select('*');
|
|
20
|
-
// ❌ vai falhar (sem schema)
|
|
21
|
-
supabase.from('tabela').select('*');
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
---
|
|
25
|
-
|
|
26
|
-
## 1. Regras Invioláveis
|
|
27
|
-
|
|
28
|
-
| Regra | Detalhe |
|
|
29
|
-
|-------|---------|
|
|
30
|
-
| Schema obrigatório | `.schema()` com o schema do projeto (seção 0) em toda query |
|
|
31
|
-
| Sem DELETE físico | Soft delete com `deleted_at` + policy `FOR UPDATE` |
|
|
32
|
-
| Sem índices automáticos | Apenas com aprovação explícita |
|
|
33
|
-
| Sem modificar `.env` | Apenas com autorização do usuário |
|
|
34
|
-
| Sem hardcoded admin | Nunca localStorage/sessionStorage para roles |
|
|
35
|
-
| Lib-first | Usar `forlogic-core` antes de criar componente |
|
|
36
|
-
| Import do Supabase | Sempre `getSupabaseClient()` de `forlogic-core`, nunca `@/integrations/supabase/client` |
|
|
37
|
-
|
|
38
|
-
---
|
|
39
|
-
|
|
40
|
-
## 2. RLS — Resumo de Sintaxe
|
|
41
|
-
|
|
42
|
-
- `SELECT` → `USING` | `INSERT` → `WITH CHECK` | `UPDATE` → `USING` + `WITH CHECK`
|
|
43
|
-
- **Nunca** `FOR DELETE`
|
|
44
|
-
- **Sempre** `(SELECT auth.jwt())` com parênteses (evita re-execução por linha)
|
|
45
|
-
- Padrão multi-tenant: `((SELECT auth.jwt()) ->> 'alias'::text) = alias`
|
|
46
|
-
|
|
47
|
-
---
|
|
48
|
-
|
|
49
|
-
## 3. Convenções SQL
|
|
50
|
-
|
|
51
|
-
| Tipo | Padrão | Exemplo |
|
|
52
|
-
|------|--------|---------|
|
|
53
|
-
| FK | `id_<singular>` | `id_process` |
|
|
54
|
-
| Boolean | `is_` / `has_` | `is_active` |
|
|
55
|
-
| Timestamps | `created_at`, `updated_at`, `deleted_at` | — |
|
|
56
|
-
| Tabelas | plural, snake_case | `processes` |
|
|
57
|
-
|
|
58
|
-
---
|
|
59
|
-
|
|
60
|
-
## 4. Mapa de Módulos (forlogic-core)
|
|
61
|
-
|
|
62
|
-
> Para props, tipos e implementação: ler do projeto **Admin** (forlogic-core) via cross-project.
|
|
63
|
-
|
|
64
|
-
| Módulo | Caminho | O que contém |
|
|
65
|
-
|--------|---------|--------------|
|
|
66
|
-
| **UI Components** | `lib/components/ui/` | Button, Dialog, Input, Select, Combobox, Badge, Tabs, etc. |
|
|
67
|
-
| **Layout** | `lib/components/layout/` | AppLayout, AppHeader, AppSidebar, BodyContent |
|
|
68
|
-
| **CRUD** | `lib/crud/` | createCrudPage, CrudTable, CrudGrid, BaseForm, ActionBar |
|
|
69
|
-
| **CRUD Primitives** | `lib/crud/primitives/` | Table, FilterBar, Pagination, ActionMenu, TreeTable |
|
|
70
|
-
| **Auth** | `lib/auth/` | AuthContext, ProtectedRoute, LoginPage, TokenManager |
|
|
71
|
-
| **Módulos** | `lib/components/modules/` | ModulesDialog, ModuleGrid, ModuleAccessGuard |
|
|
72
|
-
| **Places** | `lib/places/` | PlacesList, PlaceCard, ManageAccessModal |
|
|
73
|
-
| **Leadership** | `lib/leadership/` | LeadershipPage, LeadershipDialog |
|
|
74
|
-
| **Media** | `lib/media/` | ImageEditor, VideoEditor, useMediaUpload |
|
|
75
|
-
| **Sign** | `lib/sign/` | SignWidget, D4SignWidget, SignConfigForm |
|
|
76
|
-
| **Qualiex** | `lib/qualiex/` | QualiexUserField, useQualiexUsers |
|
|
77
|
-
| **i18n** | `lib/i18n/` | Namespaces core/app, JSONs por idioma, addAppTranslations, formatadores |
|
|
78
|
-
| **Config** | `lib/config/` | Environments, CRUD defaults, mensagens |
|
|
79
|
-
| **Services** | `lib/services/` | BaseService, EmailService, ErrorService |
|
|
80
|
-
| **Hooks** | `lib/hooks/` | useDebounce, useWizard, useModuleAccess, useColumnResize |
|
|
81
|
-
| **Providers** | `lib/providers/` | CoreProviders (setup simplificado) |
|
|
82
|
-
| **Vite** | `lib/vite/` | create-config, CSP, security headers |
|
|
83
|
-
| **Tailwind** | `lib/tailwind/` | Preset compartilhado |
|
|
84
|
-
|
|
85
|
-
---
|
|
86
|
-
|
|
87
|
-
## 5. Padrões Deprecated
|
|
88
|
-
|
|
89
|
-
| ❌ Não usar | ✅ Usar |
|
|
90
|
-
|------------|--------|
|
|
91
|
-
| `BulkActionBar` separado | Dropdown no `CrudActionBar` |
|
|
92
|
-
| `<MoreHorizontal>` genérico | `ActionButton` |
|
|
93
|
-
| Paginação manual | `CrudPrimitivePagination` |
|
|
94
|
-
| `StatusSelect` | `Combobox` |
|
|
95
|
-
| `DeleteConfirmationDialog` | `Dialog` |
|
|
96
|
-
| `Searchbar` | `Input` com ícone |
|
|
97
|
-
|
|
98
|
-
---
|
|
99
|
-
|
|
100
|
-
## 6. Fontes de Contexto
|
|
101
|
-
|
|
102
|
-
| Fonte | Caminho | Conteúdo |
|
|
103
|
-
|-------|---------|----------|
|
|
104
|
-
| **Padrões universais** | `docs/design-system/patterns/` | Componentes, CRUD, layout, scroll, setup — acessível via cross-project |
|
|
105
|
-
| Padrões internos Admin | `.note/memory/` | Lógicas específicas do Admin (alias, doc-sync, env detection) |
|
|
106
|
-
| Código-fonte da lib | Cross-project → projeto **Admin** (forlogic-core) | Props, tipos, implementação |
|
|
107
|
-
| Design System (visual) | Rota `/ds` no app do projeto **Admin** | Documentação interativa |
|
|
108
|
-
|
|
109
|
-
> ℹ️ Padrões universais foram migrados de `.note/memory/` para `docs/design-system/patterns/` para ficarem acessíveis a todos os projetos consumidores via `@Admin docs/design-system/patterns/`. `KNOWLEDGE.md` é a fonte única de verdade para regras e convenções.
|