forlogic-core 2.0.3 → 2.0.4
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 +187 -917
- package/dist/index.esm.js +1 -1
- package/dist/index.js +1 -1
- package/dist/types/sidebar.d.ts +2 -1
- package/docs/AUDIT_PROMPT.md +74 -0
- package/docs/PROJECT_KNOWLEDGE_TEMPLATE.md +117 -0
- package/docs/PROMPT_TEMPLATE.md +77 -0
- package/docs/STARTER_TEMPLATE.md +114 -0
- package/docs/design-system/README.md +45 -0
- package/docs/design-system/buttons-actions.md +427 -0
- package/docs/design-system/charts-dashboards.md +547 -0
- package/docs/design-system/crud.md +243 -0
- package/docs/design-system/data-display.md +360 -0
- package/docs/design-system/dialogs.md +588 -0
- package/docs/design-system/domain.md +651 -0
- package/docs/design-system/examples.md +275 -0
- package/docs/design-system/foundation.md +82 -0
- package/docs/design-system/infra-utils.md +36 -0
- package/docs/design-system/inputs.md +536 -0
- package/docs/design-system/layout.md +351 -0
- package/docs/design-system/navigation.md +599 -0
- package/docs/design-system/notifications-feedback.md +137 -0
- package/docs/design-system/platform.md +95 -0
- package/docs/design-system/selectors.md +424 -0
- package/docs/design-system/tables-grids.md +114 -0
- package/package.json +2 -2
|
@@ -0,0 +1,651 @@
|
|
|
1
|
+
<!-- ⚠️ ARQUIVO GERADO AUTOMATICAMENTE — NÃO EDITAR MANUALMENTE -->
|
|
2
|
+
<!-- Fonte: src/design-system/docs/ | Regenerar: npx tsx scripts/generate-ds-docs.ts -->
|
|
3
|
+
|
|
4
|
+
# Business Components
|
|
5
|
+
|
|
6
|
+
Categoria: **Business Components** | 12 componentes
|
|
7
|
+
|
|
8
|
+
### Action Plan
|
|
9
|
+
|
|
10
|
+
Componente de página completa para gerenciar planos de ação. Inclui formulário com abas (Geral, Progresso, Predecessores, Custos, Comentários, Histórico, Anexos), mudança de status e reportes de progresso. As abas de Comentários, Histórico e Anexos são componentes internos portados das libs Angular (flc-comments, flc-history, flc-attachments) e são renderizados automaticamente quando habilitados via config.
|
|
11
|
+
|
|
12
|
+
**Uso:**
|
|
13
|
+
```tsx
|
|
14
|
+
import { ActionPlanPage, ETaskPlanStatus } from "forlogic-core"
|
|
15
|
+
|
|
16
|
+
<ActionPlanPage
|
|
17
|
+
actionPlan={actionPlan}
|
|
18
|
+
config={{
|
|
19
|
+
enablePredecessors: true,
|
|
20
|
+
enableCosts: true,
|
|
21
|
+
enableAttachments: true,
|
|
22
|
+
enableComments: true,
|
|
23
|
+
enableHistory: true,
|
|
24
|
+
}}
|
|
25
|
+
users={users}
|
|
26
|
+
places={places}
|
|
27
|
+
progress={progress}
|
|
28
|
+
comments={comments}
|
|
29
|
+
history={history}
|
|
30
|
+
attachments={attachments}
|
|
31
|
+
onSave={handleSave}
|
|
32
|
+
onCancel={() => navigate(-1)}
|
|
33
|
+
onChangeStatus={handleChangeStatus}
|
|
34
|
+
onReportProgress={handleReportProgress}
|
|
35
|
+
onAddComment={handleAddComment}
|
|
36
|
+
onUploadAttachment={handleUploadAttachment}
|
|
37
|
+
/>
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
**Props:**
|
|
41
|
+
| Prop | Tipo | Padrão | Descrição |
|
|
42
|
+
|------|------|--------|-----------|
|
|
43
|
+
| `actionPlan` | `ActionPlan | null` | - | Dados do plano de ação. null/undefined para novo. |
|
|
44
|
+
| `isNew` | `boolean` | - | Se é um novo plano (oculta tabs extras e status). |
|
|
45
|
+
| `config` | `ActionPlanFormConfig` | - | Configuração do formulário: campos obrigatórios, visíveis, tabs habilitadas (enableComments, enableHistory, enableAttachments). |
|
|
46
|
+
| `isLoading` | `boolean` | - | Estado de loading global. |
|
|
47
|
+
|
|
48
|
+
**Exemplos:**
|
|
49
|
+
```tsx
|
|
50
|
+
<ActionPlanPage
|
|
51
|
+
actionPlan={actionPlan}
|
|
52
|
+
config={{
|
|
53
|
+
enablePredecessors: true,
|
|
54
|
+
enableCosts: true,
|
|
55
|
+
enableAttachments: true,
|
|
56
|
+
enableComments: true,
|
|
57
|
+
enableHistory: true,
|
|
58
|
+
hasComments: true,
|
|
59
|
+
}}
|
|
60
|
+
users={users}
|
|
61
|
+
places={places}
|
|
62
|
+
actionTypes={actionTypes}
|
|
63
|
+
causes={causes}
|
|
64
|
+
progress={progress}
|
|
65
|
+
predecessors={predecessors}
|
|
66
|
+
costs={costs}
|
|
67
|
+
comments={comments}
|
|
68
|
+
history={history}
|
|
69
|
+
attachments={attachments}
|
|
70
|
+
onSave={handleSave}
|
|
71
|
+
onChangeStatus={handleChangeStatus}
|
|
72
|
+
onReportProgress={handleReportProgress}
|
|
73
|
+
onAddComment={handleAddComment}
|
|
74
|
+
onEditComment={handleEditComment}
|
|
75
|
+
onDeleteComment={handleDeleteComment}
|
|
76
|
+
onUploadAttachment={handleUploadAttachment}
|
|
77
|
+
onDeleteAttachment={handleDeleteAttachment}
|
|
78
|
+
onRenameAttachment={handleRenameAttachment}
|
|
79
|
+
onDownloadAttachment={handleDownloadAttachment}
|
|
80
|
+
onViewAttachment={handleViewAttachment}
|
|
81
|
+
/>
|
|
82
|
+
```
|
|
83
|
+
```tsx
|
|
84
|
+
<ActionPlanPage
|
|
85
|
+
isNew
|
|
86
|
+
config={{}}
|
|
87
|
+
users={users}
|
|
88
|
+
places={places}
|
|
89
|
+
onSave={handleSave}
|
|
90
|
+
onCancel={() => navigate(-1)}
|
|
91
|
+
/>
|
|
92
|
+
```
|
|
93
|
+
```tsx
|
|
94
|
+
import { ActionPlanStatusBadge, ETaskPlanStatus } from
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
**Notas:**
|
|
98
|
+
- Os componentes internos de Comentários, Histórico e Anexos foram portados das libs Angular (flc-comments, flc-history, flc-attachments).
|
|
99
|
+
- Comentários suportam CRUD completo com avatar, timestamps e label
|
|
100
|
+
- . @menções e Rich Text Editor serão adicionados em versão futura.
|
|
101
|
+
- Histórico exibe timeline vertical com ícone, descrição, avatar do usuário, data/hora e indicador
|
|
102
|
+
- para requisições mobile.
|
|
103
|
+
- Anexos suportam upload múltiplo, barra de progresso, renomear inline, context menu (visualizar, download, excluir) e detecção de duplicatas.
|
|
104
|
+
- Slots (attachmentsSlot, commentsSlot, historySlot) permitem substituir os componentes padrão por implementações customizadas do projeto consumidor.
|
|
105
|
+
|
|
106
|
+
> Fonte: `src\design-system\docs\components\ActionPlanDoc.tsx`
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
### Approval Flow (Fluxo de Aprovação)
|
|
111
|
+
|
|
112
|
+
*Documentação não extraída automaticamente. Consulte o Design System interativo em `/ds`.*
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
### Audit Trail
|
|
117
|
+
|
|
118
|
+
Componente completo para visualização de trilha de auditoria (logs de alterações). Inclui filtros por módulo, evento, usuário e período, com visualização detalhada de cada registro.
|
|
119
|
+
|
|
120
|
+
**Uso:**
|
|
121
|
+
```tsx
|
|
122
|
+
import { AuditTrailPage } from 'forlogic-core';
|
|
123
|
+
|
|
124
|
+
<AuditTrailPage
|
|
125
|
+
softwares={softwares}
|
|
126
|
+
onFetchEvents={fetchEvents}
|
|
127
|
+
onSearch={searchAuditTrails}
|
|
128
|
+
onFetchDetails={fetchDetails}
|
|
129
|
+
onFetchUsers={fetchUsers}
|
|
130
|
+
/>
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
**Props:**
|
|
134
|
+
| Prop | Tipo | Padrão | Descrição |
|
|
135
|
+
|------|------|--------|-----------|
|
|
136
|
+
| `softwares` | `AuditTrailSoftware[]` | - | Lista de módulos disponíveis para filtro |
|
|
137
|
+
| `onFetchEvents` | `(softwareId) => Promise<AuditTrailEvent[]>` | - | Busca eventos por módulo |
|
|
138
|
+
| `onSearch` | `(params) => Promise<AuditTrail[]>` | - | Busca registros de auditoria |
|
|
139
|
+
| `onFetchDetails` | `(id) => Promise<AuditTrailDetails>` | - | Busca detalhes de um registro |
|
|
140
|
+
| `onFetchUsers` | `(query) => Promise<AuditTrailUserOption[]>` | - | Busca usuários para filtro |
|
|
141
|
+
|
|
142
|
+
**Notas:**
|
|
143
|
+
- Componente de página completa — inclui toolbar, filtros e tabela
|
|
144
|
+
- Requer implementação dos callbacks de busca no backend
|
|
145
|
+
|
|
146
|
+
> Fonte: `src\design-system\docs\components\AuditTrailDoc.tsx`
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
### Custom Form Fields
|
|
151
|
+
|
|
152
|
+
Componente container que renderiza campos de formulário dinâmicos baseados em configuração. Suporta 9 tipos de campo: Texto Somente Leitura, Texto, Data, Hora, URL, Numérico, Seleção Única, Seleção Múltipla e Questões. Portado de FlcCustomFormFieldsComponent (flc-custom-form-fields).
|
|
153
|
+
|
|
154
|
+
**Uso:**
|
|
155
|
+
```tsx
|
|
156
|
+
import { CustomFormFields, ECustomFormFieldType, validateFields } from "forlogic-core"
|
|
157
|
+
import type { FieldAssociation } from "forlogic-core"
|
|
158
|
+
|
|
159
|
+
const fields: FieldAssociation[] = [
|
|
160
|
+
{
|
|
161
|
+
id: 'f1',
|
|
162
|
+
type: ECustomFormFieldType.text,
|
|
163
|
+
name: 'Nome',
|
|
164
|
+
required: true,
|
|
165
|
+
config: { multiline: false },
|
|
166
|
+
isActive: true,
|
|
167
|
+
},
|
|
168
|
+
// ...mais campos
|
|
169
|
+
];
|
|
170
|
+
|
|
171
|
+
const [formFields, setFormFields] = useState(fields);
|
|
172
|
+
|
|
173
|
+
<CustomFormFields
|
|
174
|
+
fields={formFields}
|
|
175
|
+
onChange={setFormFields}
|
|
176
|
+
onFieldChange={(field) => console.log('Changed:', field)}
|
|
177
|
+
/>
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
**Notas:**
|
|
181
|
+
- Portado de FlcCustomFormFieldsComponent (flc-custom-form-fields) Angular.
|
|
182
|
+
- Tipos de campo: readOnlyText (1), text (2), date (3), time (4), url (5), number (6), singleSelection (7), multiSelection (8), questions (9).
|
|
183
|
+
- Use validateFields() para validar campos obrigatórios e restrições numéricas.
|
|
184
|
+
- Use getFormFieldValues() para extrair valores no formato de envio ao backend.
|
|
185
|
+
- Use setFormFieldValues() para aplicar valores salvos a uma lista de campos.
|
|
186
|
+
- Campos de seleção suportam dataSource custom (dados estáticos) e users (lista de usuários do sistema).
|
|
187
|
+
|
|
188
|
+
> Fonte: `src\design-system\docs\components\CustomFormFieldsDoc.tsx`
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
### Select
|
|
193
|
+
|
|
194
|
+
Exibe uma lista de opções para o usuário escolher—acionada por um botão.
|
|
195
|
+
|
|
196
|
+
**Uso:**
|
|
197
|
+
```tsx
|
|
198
|
+
import {
|
|
199
|
+
Select,
|
|
200
|
+
SelectContent,
|
|
201
|
+
SelectItem,
|
|
202
|
+
SelectTrigger,
|
|
203
|
+
SelectValue,
|
|
204
|
+
} from "forlogic-core"
|
|
205
|
+
|
|
206
|
+
<Select>
|
|
207
|
+
<SelectTrigger className="w-[180px]">
|
|
208
|
+
<SelectValue placeholder="Theme" />
|
|
209
|
+
</SelectTrigger>
|
|
210
|
+
<SelectContent>
|
|
211
|
+
<SelectItem value="light">Light</SelectItem>
|
|
212
|
+
<SelectItem value="dark">Dark</SelectItem>
|
|
213
|
+
</SelectContent>
|
|
214
|
+
</Select>
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
**Props:**
|
|
218
|
+
| Prop | Tipo | Padrão | Descrição |
|
|
219
|
+
|------|------|--------|-----------|
|
|
220
|
+
| `defaultValue` | `string` | - | O valor selecionado padrão. |
|
|
221
|
+
| `value` | `string` | - | O valor selecionado controlado. |
|
|
222
|
+
| `onValueChange` | `(value: string) => void` | - | Manipulador de evento quando o valor muda. |
|
|
223
|
+
| `disabled` | `boolean` | false | Se o select está desabilitado. |
|
|
224
|
+
| `container (SelectContent)` | `HTMLElement` | - | Container HTML para portal (útil dentro de Dialog). |
|
|
225
|
+
| `collisionBoundary (SelectContent)` | `HTMLElement` | - | Elemento para detecção de colisão de posicionamento. |
|
|
226
|
+
|
|
227
|
+
**Acessibilidade:**
|
|
228
|
+
- Navegação completa por teclado
|
|
229
|
+
- Busca por digitação antecipada
|
|
230
|
+
- Segue o padrão de listbox WAI-ARIA
|
|
231
|
+
- Anúncios para leitores de tela
|
|
232
|
+
|
|
233
|
+
**Notas:**
|
|
234
|
+
- 💡 Use
|
|
235
|
+
- e
|
|
236
|
+
- quando o Select estiver dentro de um Dialog para evitar problemas de scroll
|
|
237
|
+
- 💡 Para seleção com busca, considere usar
|
|
238
|
+
- ao invés de
|
|
239
|
+
|
|
240
|
+
> Fonte: `src\design-system\docs\components\SelectDoc.tsx`
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
### Leadership
|
|
245
|
+
|
|
246
|
+
Módulo hierárquico de liderança para gerenciar relações de liderança entre usuários do Qualiex. Inclui componentes visuais, hooks de API e utilitários para construção de árvores hierárquicas.
|
|
247
|
+
|
|
248
|
+
**Uso:**
|
|
249
|
+
```tsx
|
|
250
|
+
// Página completa de liderança
|
|
251
|
+
import { LeadershipPage } from 'forlogic-core';
|
|
252
|
+
|
|
253
|
+
function MyLeadershipPage() {
|
|
254
|
+
return <LeadershipPage />;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
// Ou use componentes individuais
|
|
258
|
+
import {
|
|
259
|
+
LeadershipDialog,
|
|
260
|
+
useLeadershipApi
|
|
261
|
+
} from 'forlogic-core';
|
|
262
|
+
|
|
263
|
+
function CustomLeadershipView() {
|
|
264
|
+
const { data: leaders, isLoading } = useLeadershipApi();
|
|
265
|
+
const [dialogOpen, setDialogOpen] = useState(false);
|
|
266
|
+
|
|
267
|
+
if (isLoading) return <div>Carregando...</div>;
|
|
268
|
+
|
|
269
|
+
return (
|
|
270
|
+
<div>
|
|
271
|
+
<Button onClick={() => setDialogOpen(true)}>
|
|
272
|
+
Adicionar Líder
|
|
273
|
+
</Button>
|
|
274
|
+
|
|
275
|
+
<LeadershipDialog
|
|
276
|
+
open={dialogOpen}
|
|
277
|
+
onOpenChange={setDialogOpen}
|
|
278
|
+
title="Novo Líder"
|
|
279
|
+
/>
|
|
280
|
+
|
|
281
|
+
{/* Renderizar hierarquia */}
|
|
282
|
+
</div>
|
|
283
|
+
);
|
|
284
|
+
}
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
**Props:**
|
|
288
|
+
| Prop | Tipo | Padrão | Descrição |
|
|
289
|
+
|------|------|--------|-----------|
|
|
290
|
+
| `LeadershipDialog.open` | `boolean` | - | Controla a visibilidade do dialog. |
|
|
291
|
+
| `LeadershipDialog.onOpenChange` | `(open: boolean) => void` | - | Callback quando o estado de abertura muda. |
|
|
292
|
+
| `LeadershipDialog.leader` | `Leader` | - | Líder a ser editado (se não fornecido, cria novo). |
|
|
293
|
+
| `LeadershipDialog.prefilledLeaderId` | `string | null` | - | ID do líder superior pré-selecionado (para criação). |
|
|
294
|
+
| `LeadershipDialog.title` | `string` | - | Título do dialog. |
|
|
295
|
+
| `LeaderRow.leader` | `LeaderNode` | - | Nó do líder a ser renderizado. |
|
|
296
|
+
| `LeaderRow.expandedIds` | `Set<string>` | - | IDs dos nós atualmente expandidos. |
|
|
297
|
+
| `LeaderRow.onToggleExpand` | `(id: string) => void` | - | Callback para alternar expansão de um nó. |
|
|
298
|
+
| `LeaderRow.onEdit` | `(leader: Leader) => void` | - | Callback quando o nome do líder é clicado. |
|
|
299
|
+
| `LeadershipForm.leader` | `Leader` | - | Líder a ser editado (modo edição). |
|
|
300
|
+
| `LeadershipForm.prefilledLeaderId` | `string | null` | - | ID do líder superior pré-selecionado. |
|
|
301
|
+
| `LeadershipForm.onSuccess` | `() => void` | - | Callback executado após salvar com sucesso. |
|
|
302
|
+
|
|
303
|
+
**Acessibilidade:**
|
|
304
|
+
- Os botões de expandir/colapsar são acessíveis via teclado.
|
|
305
|
+
- Os nomes clicáveis têm role=
|
|
306
|
+
- implícito.
|
|
307
|
+
- O dialog segue padrões WAI-ARIA para modais.
|
|
308
|
+
- Checkboxes de seleção de usuários são navegáveis via Tab.
|
|
309
|
+
- Estados de loading são anunciados para leitores de tela.
|
|
310
|
+
|
|
311
|
+
**Notas:**
|
|
312
|
+
- O módulo requer autenticação ativa (useAuth) e integração com Qualiex.
|
|
313
|
+
- Os dados são enriquecidos automaticamente com nomes/emails do Qualiex.
|
|
314
|
+
- Líderes
|
|
315
|
+
- são criados automaticamente para referências não cadastradas.
|
|
316
|
+
- Validação de ciclos na hierarquia é feita automaticamente.
|
|
317
|
+
- O estado de expansão é persistido no localStorage por alias.
|
|
318
|
+
- Soft delete é usado para remoção (is_removed = true).
|
|
319
|
+
|
|
320
|
+
> Fonte: `src\design-system\docs\components\LeadershipDoc.tsx`
|
|
321
|
+
|
|
322
|
+
---
|
|
323
|
+
|
|
324
|
+
### Media
|
|
325
|
+
|
|
326
|
+
Módulo completo para upload, edição e renderização de imagens e vídeos. Inclui editores interativos, renderizadores otimizados e hook genérico de upload.
|
|
327
|
+
|
|
328
|
+
**Uso:**
|
|
329
|
+
```tsx
|
|
330
|
+
// Exemplo básico de upload de imagem
|
|
331
|
+
const { upload, uploading, progress } = useMediaUpload({
|
|
332
|
+
uploadFunction: async (file, options) => {
|
|
333
|
+
// Implementação do upload para seu storage
|
|
334
|
+
const url = await uploadToStorage(file, options);
|
|
335
|
+
return { url, path: file.name };
|
|
336
|
+
}
|
|
337
|
+
});
|
|
338
|
+
|
|
339
|
+
// Renderizar uma imagem
|
|
340
|
+
<ImageRenderer
|
|
341
|
+
content={{
|
|
342
|
+
imageUrl: 'https://example.com/image.jpg',
|
|
343
|
+
caption: 'Legenda da imagem',
|
|
344
|
+
alignment: 'center'
|
|
345
|
+
}}
|
|
346
|
+
/>
|
|
347
|
+
|
|
348
|
+
// Renderizar um vídeo
|
|
349
|
+
<VideoRenderer
|
|
350
|
+
content={{
|
|
351
|
+
videoUrl: 'https://youtube.com/watch?v=...',
|
|
352
|
+
controls: true
|
|
353
|
+
}}
|
|
354
|
+
/>
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
**Props:**
|
|
358
|
+
| Prop | Tipo | Padrão | Descrição |
|
|
359
|
+
|------|------|--------|-----------|
|
|
360
|
+
| `uploadFunction` | `UploadFunction` | - | Função de upload customizada (obrigatória para uploads) |
|
|
361
|
+
| `deleteFunction` | `DeleteFunction` | - | Função de delete customizada |
|
|
362
|
+
| `defaultOptions` | `UploadOptions` | - | Opções padrão: bucket, maxSize, allowedTypes |
|
|
363
|
+
| `onSuccess` | `(result: UploadResult) => void` | - | Callback executado após upload bem-sucedido |
|
|
364
|
+
| `onError` | `(error: Error) => void` | - | Callback executado em caso de erro |
|
|
365
|
+
| `value` | `ImageBlockContent | VideoBlockContent` | - | Valor atual do conteúdo |
|
|
366
|
+
| `onChange` | `(value) => void` | - | Callback para mudanças no conteúdo |
|
|
367
|
+
| `onSubmit` | `(value) => void` | - | Callback ao salvar o conteúdo |
|
|
368
|
+
| `onCancel` | `() => void` | - | Callback ao cancelar edição |
|
|
369
|
+
| `uploadOptions` | `UploadOptions` | - | Opções de upload específicas para o editor |
|
|
370
|
+
| `content` | `ImageBlockContent | VideoBlockContent` | - | Conteúdo a ser renderizado |
|
|
371
|
+
| `className` | `string` | - | Classes CSS adicionais |
|
|
372
|
+
| `style` | `CSSProperties` | - | Estilos inline adicionais |
|
|
373
|
+
|
|
374
|
+
**Exemplos:**
|
|
375
|
+
```tsx
|
|
376
|
+
import { useMediaUpload, getSupabaseClient } from
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
**Acessibilidade:**
|
|
380
|
+
- ImageRenderer inclui atributo alt obrigatório para acessibilidade
|
|
381
|
+
- VideoRenderer usa atributo title no iframe para identificação
|
|
382
|
+
- Controles de vídeo habilitados por padrão para navegação por teclado
|
|
383
|
+
- Autoplay sempre acompanhado de muted para conformidade com navegadores
|
|
384
|
+
- Links de download possuem texto descritivo
|
|
385
|
+
- Todos os inputs dos editores possuem labels associados
|
|
386
|
+
|
|
387
|
+
**Notas:**
|
|
388
|
+
- O hook useMediaUpload requer que o projeto forneça as funções de upload/delete
|
|
389
|
+
- A função uploadFunction deve retornar { url: string, path?: string }
|
|
390
|
+
- VideoRenderer detecta automaticamente YouTube e Vimeo pela URL
|
|
391
|
+
- Para vídeos locais, use o player HTML5 nativo com controles
|
|
392
|
+
- Dimensões são opcionais; imagens usam max-width: 100% por padrão
|
|
393
|
+
- O módulo não inclui implementação de storage - use Supabase, S3, etc.
|
|
394
|
+
- Helpers de imagem usam Canvas API para compressão e resize
|
|
395
|
+
|
|
396
|
+
> Fonte: `src\design-system\docs\components\MediaDoc.tsx`
|
|
397
|
+
|
|
398
|
+
---
|
|
399
|
+
|
|
400
|
+
### Places
|
|
401
|
+
|
|
402
|
+
Módulo para gerenciar estruturas hierárquicas de locais integrado com a API Qualiex. Inclui visualização em árvore, gestão de acessos e componentes reutilizáveis.
|
|
403
|
+
|
|
404
|
+
**Uso:**
|
|
405
|
+
```tsx
|
|
406
|
+
// =====================
|
|
407
|
+
// BUSCAR LOCAIS
|
|
408
|
+
// =====================
|
|
409
|
+
import { placeService } from 'forlogic-core';
|
|
410
|
+
|
|
411
|
+
async function loadPlaces() {
|
|
412
|
+
const places = await placeService.getPlaces(alias, companyId);
|
|
413
|
+
// places já vem em estrutura hierárquica
|
|
414
|
+
console.log(places);
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
// =====================
|
|
418
|
+
// LISTA SIMPLES (SEM GESTÃO DE ACESSOS)
|
|
419
|
+
// =====================
|
|
420
|
+
import { PlacesList } from 'forlogic-core';
|
|
421
|
+
|
|
422
|
+
function MyPlacesPage() {
|
|
423
|
+
const [places, setPlaces] = useState<Place[]>([]);
|
|
424
|
+
const [isLoading, setIsLoading] = useState(true);
|
|
425
|
+
|
|
426
|
+
useEffect(() => {
|
|
427
|
+
placeService.getPlaces(alias, companyId)
|
|
428
|
+
.then(setPlaces)
|
|
429
|
+
.finally(() => setIsLoading(false));
|
|
430
|
+
}, [alias, companyId]);
|
|
431
|
+
|
|
432
|
+
return (
|
|
433
|
+
<PlacesList
|
|
434
|
+
places={places}
|
|
435
|
+
isLoading={isLoading}
|
|
436
|
+
/>
|
|
437
|
+
);
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
// =====================
|
|
441
|
+
// COM GESTÃO DE ACESSOS
|
|
442
|
+
// =====================
|
|
443
|
+
import { PlacesList, PlaceCard } from 'forlogic-core';
|
|
444
|
+
|
|
445
|
+
function PlacesWithAccess() {
|
|
446
|
+
const [places, setPlaces] = useState<Place[]>([]);
|
|
447
|
+
const [managers, setManagers] = useState<Record<string, string>>({});
|
|
448
|
+
const [members, setMembers] = useState<Record<string, string[]>>({});
|
|
449
|
+
|
|
450
|
+
const manageAccessConfig = {
|
|
451
|
+
onMakeManager: async (userId, placeId) => {
|
|
452
|
+
setManagers(prev => ({ ...prev, [placeId]: userId }));
|
|
453
|
+
// Chamar API para salvar
|
|
454
|
+
},
|
|
455
|
+
onMakeMembers: async (userIds, placeId) => {
|
|
456
|
+
setMembers(prev => ({ ...prev, [placeId]: userIds }));
|
|
457
|
+
// Chamar API para salvar
|
|
458
|
+
},
|
|
459
|
+
getCurrentManagerId: (placeId) => managers[placeId],
|
|
460
|
+
getCurrentMemberIds: (placeId) => members[placeId] || []
|
|
461
|
+
};
|
|
462
|
+
|
|
463
|
+
return (
|
|
464
|
+
<PlacesList
|
|
465
|
+
places={places}
|
|
466
|
+
isLoading={false}
|
|
467
|
+
manageAccessConfig={manageAccessConfig}
|
|
468
|
+
/>
|
|
469
|
+
);
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
// =====================
|
|
473
|
+
// PLACECARD INDIVIDUAL
|
|
474
|
+
// =====================
|
|
475
|
+
import { PlaceCard } from 'forlogic-core';
|
|
476
|
+
|
|
477
|
+
<PlaceCard
|
|
478
|
+
place={myPlace}
|
|
479
|
+
level={0}
|
|
480
|
+
manageAccessConfig={manageAccessConfig}
|
|
481
|
+
/>
|
|
482
|
+
```
|
|
483
|
+
|
|
484
|
+
**Acessibilidade:**
|
|
485
|
+
- Botões de expandir/colapsar acessíveis via teclado.
|
|
486
|
+
- Modal segue padrões WAI-ARIA.
|
|
487
|
+
- Checkboxes navegáveis por Tab.
|
|
488
|
+
- Estados de loading anunciados para leitores de tela.
|
|
489
|
+
- Busca de usuários com feedback visual.
|
|
490
|
+
|
|
491
|
+
**Notas:**
|
|
492
|
+
- Requer integração com API Qualiex configurada.
|
|
493
|
+
- O placeService monta a hierarquia automaticamente.
|
|
494
|
+
- O ManageAccessModal usa o hook useQualiexUsers internamente.
|
|
495
|
+
- A gestão de acessos é opcional - sem manageAccessConfig, apenas exibe.
|
|
496
|
+
- Níveis de hierarquia são controlados pela prop level no PlaceCard.
|
|
497
|
+
|
|
498
|
+
> Fonte: `src\design-system\docs\components\PlacesDoc.tsx`
|
|
499
|
+
|
|
500
|
+
---
|
|
501
|
+
|
|
502
|
+
### QualiexUserField
|
|
503
|
+
|
|
504
|
+
Campo de seleção de usuários integrado com a API Qualiex. Suporta seleção única ou múltipla, display customizado, filtros e funciona perfeitamente dentro de Dialogs.
|
|
505
|
+
|
|
506
|
+
**Uso:**
|
|
507
|
+
```tsx
|
|
508
|
+
import { QualiexUserField } from "forlogic-core"
|
|
509
|
+
|
|
510
|
+
// =====================
|
|
511
|
+
// USO BÁSICO
|
|
512
|
+
// =====================
|
|
513
|
+
<QualiexUserField
|
|
514
|
+
value={userId}
|
|
515
|
+
onChange={setUserId}
|
|
516
|
+
placeholder="Selecione..."
|
|
517
|
+
/>
|
|
518
|
+
|
|
519
|
+
// =====================
|
|
520
|
+
// COM LABEL E REQUIRED
|
|
521
|
+
// =====================
|
|
522
|
+
import { UserCheck } from "lucide-react"
|
|
523
|
+
|
|
524
|
+
<QualiexUserField
|
|
525
|
+
label="Responsável"
|
|
526
|
+
required
|
|
527
|
+
icon={UserCheck}
|
|
528
|
+
value={userId}
|
|
529
|
+
onChange={setUserId}
|
|
530
|
+
/>
|
|
531
|
+
|
|
532
|
+
// =====================
|
|
533
|
+
// SELEÇÃO MÚLTIPLA
|
|
534
|
+
// =====================
|
|
535
|
+
const [userIds, setUserIds] = useState<string[]>([])
|
|
536
|
+
|
|
537
|
+
<QualiexUserField
|
|
538
|
+
multiple
|
|
539
|
+
label="Avaliadores"
|
|
540
|
+
required
|
|
541
|
+
value={userIds}
|
|
542
|
+
onChange={setUserIds}
|
|
543
|
+
maxDisplayedBadges={3}
|
|
544
|
+
/>
|
|
545
|
+
|
|
546
|
+
// =====================
|
|
547
|
+
// DISPLAY CUSTOMIZADO
|
|
548
|
+
// =====================
|
|
549
|
+
|
|
550
|
+
// Exibir nome + email
|
|
551
|
+
<QualiexUserField
|
|
552
|
+
displayFormat="name-email"
|
|
553
|
+
value={userId}
|
|
554
|
+
onChange={setUserId}
|
|
555
|
+
/>
|
|
556
|
+
|
|
557
|
+
// Exibir nome + cargo
|
|
558
|
+
<QualiexUserField
|
|
559
|
+
displayFormat="name-role"
|
|
560
|
+
value={userId}
|
|
561
|
+
onChange={setUserId}
|
|
562
|
+
/>
|
|
563
|
+
|
|
564
|
+
// Custom display function
|
|
565
|
+
<QualiexUserField
|
|
566
|
+
displayFormat="custom"
|
|
567
|
+
customDisplayFn={(user) => \`\${user.userName} - \${user.placeName || 'Sem local'}\
|
|
568
|
+
```
|
|
569
|
+
|
|
570
|
+
**Acessibilidade:**
|
|
571
|
+
- Navegação completa por teclado
|
|
572
|
+
- Busca inteligente (sem acentos, case-insensitive)
|
|
573
|
+
- Segue padrão WAI-ARIA combobox
|
|
574
|
+
- Badges removíveis com teclado (modo múltiplo)
|
|
575
|
+
- Estados de loading e erro acessíveis
|
|
576
|
+
- Labels associados corretamente
|
|
577
|
+
|
|
578
|
+
**Notas:**
|
|
579
|
+
- Requer configuração Qualiex (apiUrl e apiToken) no projeto
|
|
580
|
+
- Use enabled={false} para lazy loading e chame refetch() manualmente
|
|
581
|
+
- Em Dialogs, sempre passe popoverContainer para evitar problemas de z-index
|
|
582
|
+
- O hook useQualiexUsers é usado internamente para buscar os usuários
|
|
583
|
+
- Integrado automaticamente com BaseForm via type=
|
|
584
|
+
|
|
585
|
+
> Fonte: `src\design-system\docs\components\QualiexUserFieldDoc.tsx`
|
|
586
|
+
|
|
587
|
+
---
|
|
588
|
+
|
|
589
|
+
### Report Request List
|
|
590
|
+
|
|
591
|
+
*Documentação não extraída automaticamente. Consulte o Design System interativo em `/ds`.*
|
|
592
|
+
|
|
593
|
+
---
|
|
594
|
+
|
|
595
|
+
### Select
|
|
596
|
+
|
|
597
|
+
Exibe uma lista de opções para o usuário escolher—acionada por um botão.
|
|
598
|
+
|
|
599
|
+
**Uso:**
|
|
600
|
+
```tsx
|
|
601
|
+
import {
|
|
602
|
+
Select,
|
|
603
|
+
SelectContent,
|
|
604
|
+
SelectItem,
|
|
605
|
+
SelectTrigger,
|
|
606
|
+
SelectValue,
|
|
607
|
+
} from "forlogic-core"
|
|
608
|
+
|
|
609
|
+
<Select>
|
|
610
|
+
<SelectTrigger className="w-[180px]">
|
|
611
|
+
<SelectValue placeholder="Theme" />
|
|
612
|
+
</SelectTrigger>
|
|
613
|
+
<SelectContent>
|
|
614
|
+
<SelectItem value="light">Light</SelectItem>
|
|
615
|
+
<SelectItem value="dark">Dark</SelectItem>
|
|
616
|
+
</SelectContent>
|
|
617
|
+
</Select>
|
|
618
|
+
```
|
|
619
|
+
|
|
620
|
+
**Props:**
|
|
621
|
+
| Prop | Tipo | Padrão | Descrição |
|
|
622
|
+
|------|------|--------|-----------|
|
|
623
|
+
| `defaultValue` | `string` | - | O valor selecionado padrão. |
|
|
624
|
+
| `value` | `string` | - | O valor selecionado controlado. |
|
|
625
|
+
| `onValueChange` | `(value: string) => void` | - | Manipulador de evento quando o valor muda. |
|
|
626
|
+
| `disabled` | `boolean` | false | Se o select está desabilitado. |
|
|
627
|
+
| `container (SelectContent)` | `HTMLElement` | - | Container HTML para portal (útil dentro de Dialog). |
|
|
628
|
+
| `collisionBoundary (SelectContent)` | `HTMLElement` | - | Elemento para detecção de colisão de posicionamento. |
|
|
629
|
+
|
|
630
|
+
**Acessibilidade:**
|
|
631
|
+
- Navegação completa por teclado
|
|
632
|
+
- Busca por digitação antecipada
|
|
633
|
+
- Segue o padrão de listbox WAI-ARIA
|
|
634
|
+
- Anúncios para leitores de tela
|
|
635
|
+
|
|
636
|
+
**Notas:**
|
|
637
|
+
- 💡 Use
|
|
638
|
+
- e
|
|
639
|
+
- quando o Select estiver dentro de um Dialog para evitar problemas de scroll
|
|
640
|
+
- 💡 Para seleção com busca, considere usar
|
|
641
|
+
- ao invés de
|
|
642
|
+
|
|
643
|
+
> Fonte: `src\design-system\docs\components\SelectDoc.tsx`
|
|
644
|
+
|
|
645
|
+
---
|
|
646
|
+
|
|
647
|
+
### Internacionalização (i18n)
|
|
648
|
+
|
|
649
|
+
*Documentação não extraída automaticamente. Consulte o Design System interativo em `/ds`.*
|
|
650
|
+
|
|
651
|
+
---
|