forlogic-core 1.16.3 → 1.16.5

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.
Files changed (134) hide show
  1. package/README.md +113 -109
  2. package/dist/README.md +113 -109
  3. package/dist/components/modules/AccessDeniedDialog.d.ts +41 -0
  4. package/dist/components/modules/ModuleAccessGuard.d.ts +3 -1
  5. package/dist/components/modules/ModuleOfferContent.d.ts +20 -0
  6. package/dist/components/modules/ModulesContent.d.ts +15 -0
  7. package/dist/components/modules/ModulesFooterCards.d.ts +6 -0
  8. package/dist/components/modules/index.d.ts +8 -0
  9. package/dist/components/modules/types.d.ts +2 -0
  10. package/dist/index.css +1 -1
  11. package/dist/index.css.map +1 -1
  12. package/dist/index.esm.js +1 -1
  13. package/dist/index.js +1 -1
  14. package/docs/DESIGN_SYSTEM.md +17 -32
  15. package/package.json +4 -2
  16. package/dist/assets/AccordionDoc-BnfxyOi9.js +0 -31
  17. package/dist/assets/ActionButtonDoc-b4F_J8gn.js +0 -47
  18. package/dist/assets/AlertDoc-PkiHguSJ.js +0 -37
  19. package/dist/assets/AppHeaderDoc-CsFMZGV0.js +0 -67
  20. package/dist/assets/AppSidebarDoc-Bg71N-zq.js +0 -196
  21. package/dist/assets/AuthDoc-DDm57y_J.js +0 -192
  22. package/dist/assets/AvatarDoc-C6wiZIZR.js +0 -11
  23. package/dist/assets/BadgeDoc-Bsg7cfm0.js +0 -36
  24. package/dist/assets/BaseFormDoc-DeIlV273.js +0 -169
  25. package/dist/assets/BodyContentDoc-Q3DGvyN9.js +0 -83
  26. package/dist/assets/BreadcrumbDoc-ChsVFjMF.js +0 -75
  27. package/dist/assets/ButtonDoc-C7Q31Bh3.js +0 -41
  28. package/dist/assets/ButtonGroupDoc-Bn5vhjBq.js +0 -7
  29. package/dist/assets/CalendarDoc-iVjNyxyr.js +0 -81
  30. package/dist/assets/CardDoc-D511dll7.js +0 -49
  31. package/dist/assets/ChartDoc-CQyYOEHL.js +0 -111
  32. package/dist/assets/CheckboxDoc-Cjsy4XAq.js +0 -55
  33. package/dist/assets/ColorPickerDoc-hnYJUWpF.js +0 -10
  34. package/dist/assets/ColorsFoundationDoc-B8Z4tAyZ.js +0 -13
  35. package/dist/assets/ComboTreeDoc-ChEbW4a3.js +0 -21
  36. package/dist/assets/ComboboxDoc-CHWeGE_F.js +0 -134
  37. package/dist/assets/ComponentDocTemplate-BtOCnlM2.js +0 -1
  38. package/dist/assets/ContextMenuDoc-C3mFO_Yx.js +0 -182
  39. package/dist/assets/ContextsDoc-ChEbQxom.js +0 -184
  40. package/dist/assets/CreateCrudPageDoc-C9tXisCF.js +0 -106
  41. package/dist/assets/CrudActionBarDoc-Cp1L4gpO.js +0 -112
  42. package/dist/assets/CrudGridDoc-D-kSFBAQ.js +0 -85
  43. package/dist/assets/CrudOverviewDoc-CeLBwg-B.js +0 -14
  44. package/dist/assets/CrudPrimitivesDoc-B2u1vZog.js +0 -164
  45. package/dist/assets/CrudTableDoc-CvV-II_X.js +0 -95
  46. package/dist/assets/DataListDoc-BLRii0jB.js +0 -13
  47. package/dist/assets/DesignSystemHome-TE0Ubaup.js +0 -1
  48. package/dist/assets/DialogDoc--LC5Jvat.js +0 -981
  49. package/dist/assets/DropdownMenuDoc-oPlEriRY.js +0 -175
  50. package/dist/assets/EmptyStateDoc-rNqfWKok.js +0 -35
  51. package/dist/assets/EnvironmentsDoc-CT7l5s2u.js +0 -96
  52. package/dist/assets/ErrorBoundaryDoc-rPHOUygA.js +0 -111
  53. package/dist/assets/ExampleCard-DfuMYM6E.js +0 -1
  54. package/dist/assets/FormDoc-B0L_QaCT.js +0 -81
  55. package/dist/assets/FoundationOverview-Dbb8rBsU.js +0 -1
  56. package/dist/assets/GridDoc-ifcGA2Yw.js +0 -28
  57. package/dist/assets/HooksDoc-CUOT_3Du.js +0 -665
  58. package/dist/assets/HoverCardDoc-CdTU2QkI.js +0 -31
  59. package/dist/assets/I18nDoc-CMEvFqsz.js +0 -232
  60. package/dist/assets/IconPickerDoc-DF9hEwnJ.js +0 -10
  61. package/dist/assets/IconsFoundationDoc-D4Y0wKbm.js +0 -33
  62. package/dist/assets/InputDoc-d_IL4dsq.js +0 -211
  63. package/dist/assets/LabelDoc-Dr64ISiJ.js +0 -42
  64. package/dist/assets/LeadershipDoc-BnrTuaeV.js +0 -416
  65. package/dist/assets/MediaDoc-CLuVprAr.js +0 -459
  66. package/dist/assets/MenubarDoc-CW7L4QJ4.js +0 -165
  67. package/dist/assets/ModulesDialogDoc-CUb_g4X-.js +0 -71
  68. package/dist/assets/NavigationMenuDoc-Csc0U6bV.js +0 -116
  69. package/dist/assets/OnboardingDialogDoc-3RtjNH1O.js +0 -55
  70. package/dist/assets/PaginationDoc-BGurD4xQ.js +0 -27
  71. package/dist/assets/PaginationDoc-DqFyou6O.js +0 -98
  72. package/dist/assets/PlacesDoc-Dyx8gsqb.js +0 -226
  73. package/dist/assets/PopoverDoc-DHF-ItUX.js +0 -64
  74. package/dist/assets/ProgressDoc-DXKV-fkI.js +0 -29
  75. package/dist/assets/QualiexUserFieldDoc-BbP7w-Pu.js +0 -149
  76. package/dist/assets/RadioGroupDoc-D845uweM.js +0 -57
  77. package/dist/assets/RadiusDoc-vN4tTsay.js +0 -7
  78. package/dist/assets/RequiredFieldsCounterDoc-TzR9r-U9.js +0 -58
  79. package/dist/assets/ResizableDoc-Bkfz_25O.js +0 -104
  80. package/dist/assets/RichTextEditorDoc-BUQrg7M8.js +0 -24
  81. package/dist/assets/ScrollAreaDoc-B6ODYHMX.js +0 -28
  82. package/dist/assets/SecurityDoc-Chbt6w1s.js +0 -204
  83. package/dist/assets/SelectDoc-BhcpBIAO.js +0 -80
  84. package/dist/assets/SeparatorDoc-C3fhatb0.js +0 -4
  85. package/dist/assets/ServicesDoc-_uao-HA_.js +0 -308
  86. package/dist/assets/ShadowsDoc-DpkO_TZQ.js +0 -9
  87. package/dist/assets/SignDoc-BJtnoT6I.js +0 -66
  88. package/dist/assets/SkeletonDoc-BZS07PJh.js +0 -54
  89. package/dist/assets/SliderDoc-D2ApV3XT.js +0 -41
  90. package/dist/assets/SpacingDoc-PNrU24B2.js +0 -12
  91. package/dist/assets/SplitButtonDoc-D5tUF2Ja.js +0 -53
  92. package/dist/assets/StepSelectorDoc-Cj0ALYar.js +0 -41
  93. package/dist/assets/SwitchDoc-DtsT8oh_.js +0 -56
  94. package/dist/assets/TableDoc-BC-jQnXu.js +0 -128
  95. package/dist/assets/TableOfContents-DBMJMbI4.js +0 -1
  96. package/dist/assets/TabsDoc-DtXJ0xY5.js +0 -42
  97. package/dist/assets/TextareaDoc-nuW5tqBQ.js +0 -46
  98. package/dist/assets/ToastDoc-D1aX5zda.js +0 -157
  99. package/dist/assets/ToggleDoc-ILass4CS.js +0 -51
  100. package/dist/assets/TooltipDoc-lPbdWe_9.js +0 -58
  101. package/dist/assets/TruncatedCellDoc-DOAzbF2F.js +0 -12
  102. package/dist/assets/TypographyFoundationDoc-3ZD-rQZw.js +0 -7
  103. package/dist/assets/UtilitiesDoc-D7lkYhuz.js +0 -145
  104. package/dist/assets/blocks-Jy49RoqJ.js +0 -1
  105. package/dist/assets/calendar-days-Cvf2zLJl.js +0 -1
  106. package/dist/assets/circle-plus-MnG9kjyq.js +0 -1
  107. package/dist/assets/circle-x-B9ouupla.js +0 -1
  108. package/dist/assets/crown-BweN5jpI.js +0 -1
  109. package/dist/assets/date-picker-ttyYeYvC.js +0 -1
  110. package/dist/assets/disabled-menu-item-WlpPOqxg.js +0 -1
  111. package/dist/assets/drawer-DvU6_eK5.js +0 -3
  112. package/dist/assets/file-pen-line-C0VV-QjF.js +0 -1
  113. package/dist/assets/git-branch-DCjGGwvF.js +0 -1
  114. package/dist/assets/globe-BdFDFP_k.js +0 -1
  115. package/dist/assets/grip-vertical-CgXp0oI-.js +0 -1
  116. package/dist/assets/hash-BAYi_wfk.js +0 -1
  117. package/dist/assets/index-BtX5DZqb.js +0 -310
  118. package/dist/assets/index-C1So5Sai.css +0 -1
  119. package/dist/assets/life-buoy-BydIgTyJ.js +0 -1
  120. package/dist/assets/lucide-react-ZIMhRYmb.js +0 -1
  121. package/dist/assets/monitor-B6txWJPg.js +0 -1
  122. package/dist/assets/package-DNe3FsCh.js +0 -1
  123. package/dist/assets/pen-CzTmQ16z.js +0 -1
  124. package/dist/assets/pin-CJJgLEBz.js +0 -1
  125. package/dist/assets/radio-group-Btv_BY60.js +0 -1
  126. package/dist/assets/server-XQDXtrjm.js +0 -1
  127. package/dist/assets/share-2-Dz_89MJb.js +0 -1
  128. package/dist/assets/step-selector-D0_Y1dow.js +0 -1
  129. package/dist/assets/text-align-start-WsHo7CNJ.js +0 -1
  130. package/dist/assets/trash-CeK-mWnM.js +0 -1
  131. package/dist/assets/useMockCrud-RV9z9n5x.js +0 -1
  132. package/dist/assets/user-check-CrbWcnPN.js +0 -1
  133. package/dist/assets/user-plus-Dce9DbqQ.js +0 -1
  134. package/dist/index.html +0 -35
@@ -1,416 +0,0 @@
1
- import{j as e,c7 as s,r as l,dS as p,dT as m,f as d,dU as h,dV as x,dW as g,a7 as u,h as n}from"./index-BtX5DZqb.js";import{C as v}from"./ComponentDocTemplate-BtOCnlM2.js";import{U as c}from"./user-plus-Dce9DbqQ.js";import"./ExampleCard-DfuMYM6E.js";import"./TableOfContents-DBMJMbI4.js";function M(){return e.jsx(v,{title:"Leadership",description:"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.",installation:`import {
2
- LeadershipPage,
3
- LeadershipDialog,
4
- LeadershipForm,
5
- LeaderRow,
6
- useLeadershipApi,
7
- useLeadershipMutations,
8
- buildHierarchy,
9
- flattenTree
10
- } from 'forlogic-core';`,component:e.jsx(L,{}),usage:`// Página completa de liderança
11
- import { LeadershipPage } from 'forlogic-core';
12
-
13
- function MyLeadershipPage() {
14
- return <LeadershipPage />;
15
- }
16
-
17
- // Ou use componentes individuais
18
- import {
19
- LeadershipDialog,
20
- useLeadershipApi
21
- } from 'forlogic-core';
22
-
23
- function CustomLeadershipView() {
24
- const { data: leaders, isLoading } = useLeadershipApi();
25
- const [dialogOpen, setDialogOpen] = useState(false);
26
-
27
- if (isLoading) return <div>Carregando...</div>;
28
-
29
- return (
30
- <div>
31
- <Button onClick={() => setDialogOpen(true)}>
32
- Adicionar Líder
33
- </Button>
34
-
35
- <LeadershipDialog
36
- open={dialogOpen}
37
- onOpenChange={setDialogOpen}
38
- title="Novo Líder"
39
- />
40
-
41
- {/* Renderizar hierarquia */}
42
- </div>
43
- );
44
- }`,examples:[{title:"Estrutura de Tipos",description:"Tipos principais usados no módulo de liderança.",preview:e.jsx(f,{}),code:`// Tipos principais
45
- interface Leader {
46
- id: string;
47
- alias: string;
48
- id_user: string; // ID do usuário no Qualiex
49
- id_leader: string | null; // ID do líder superior (null = raiz)
50
- is_removed: boolean;
51
- is_active: boolean;
52
- created_at: string;
53
- updated_at: string;
54
-
55
- // Campos enriquecidos do Qualiex (virtuais)
56
- name?: string;
57
- email?: string;
58
- subordinatesCount?: number;
59
- }
60
-
61
- interface LeaderNode extends Leader {
62
- children: LeaderNode[]; // Subordinados diretos
63
- level: number; // Nível na hierarquia (0 = raiz)
64
- }`},{title:"Hook useLeadershipApi",description:"Hook para buscar a hierarquia de liderança com dados enriquecidos do Qualiex.",preview:e.jsx(j,{}),code:`import { useLeadershipApi, flattenTree } from 'forlogic-core';
65
-
66
- function LeadersList() {
67
- const {
68
- data: leaders = [], // LeaderNode[] - árvore hierárquica
69
- isLoading,
70
- error
71
- } = useLeadershipApi();
72
-
73
- if (isLoading) return <div>Carregando...</div>;
74
- if (error) return <div>Erro: {error.message}</div>;
75
-
76
- // Achatar a árvore para iteração simples
77
- const allLeaders = flattenTree(leaders);
78
-
79
- return (
80
- <ul>
81
- {allLeaders.map(leader => (
82
- <li key={leader.id} style={{ marginLeft: leader.level * 20 }}>
83
- {leader.name} ({leader.subordinatesCount} subordinados)
84
- </li>
85
- ))}
86
- </ul>
87
- );
88
- }`},{title:"LeadershipDialog",description:"Dialog modal para adicionar ou editar um líder.",preview:e.jsx(b,{}),code:`import { useState } from 'react';
89
- import { LeadershipDialog, Button } from 'forlogic-core';
90
-
91
- function AddLeaderButton() {
92
- const [open, setOpen] = useState(false);
93
-
94
- return (
95
- <>
96
- <Button onClick={() => setOpen(true)}>
97
- Adicionar Líder
98
- </Button>
99
-
100
- <LeadershipDialog
101
- open={open}
102
- onOpenChange={setOpen}
103
- title="Novo Líder"
104
- // Opcional: pré-selecionar um líder superior
105
- prefilledLeaderId="user-uuid-do-lider"
106
- />
107
- </>
108
- );
109
- }
110
-
111
- // Editando um líder existente
112
- function EditLeaderButton({ leader }) {
113
- const [open, setOpen] = useState(false);
114
-
115
- return (
116
- <>
117
- <Button variant="outline" onClick={() => setOpen(true)}>
118
- Editar
119
- </Button>
120
-
121
- <LeadershipDialog
122
- open={open}
123
- onOpenChange={setOpen}
124
- leader={leader} // Passa o líder para edição
125
- title="Editar Líder"
126
- />
127
- </>
128
- );
129
- }`},{title:"Mutations (useLeadershipMutations)",description:"Hooks de mutação para criar, atualizar e remover líderes.",preview:e.jsx(N,{}),code:`import {
130
- useCreateMultipleLeadersMutation,
131
- useUpdateLeaderMutation,
132
- useRemoveLeaderMutation,
133
- useSyncSubordinatesMutation
134
- } from 'forlogic-core';
135
-
136
- function LeaderActions() {
137
- // Criar múltiplos liderados de uma vez
138
- const createMultiple = useCreateMultipleLeadersMutation();
139
-
140
- // Atualizar líder existente
141
- const updateLeader = useUpdateLeaderMutation();
142
-
143
- // Remover líder (soft delete)
144
- const removeLeader = useRemoveLeaderMutation();
145
-
146
- // Sincronizar subordinados de um líder
147
- const syncSubordinates = useSyncSubordinatesMutation();
148
-
149
- const handleCreateMultiple = async () => {
150
- await createMultiple.mutateAsync({
151
- id_leader: 'uuid-do-lider-superior', // null para raiz
152
- users: [
153
- { id_user: 'uuid-usuario-1' },
154
- { id_user: 'uuid-usuario-2' }
155
- ]
156
- });
157
- };
158
-
159
- const handleUpdate = async () => {
160
- await updateLeader.mutateAsync({
161
- id: 'uuid-do-registro-leader',
162
- id_leader: 'novo-uuid-lider-superior'
163
- });
164
- };
165
-
166
- const handleRemove = async () => {
167
- await removeLeader.mutateAsync('uuid-do-registro-leader');
168
- };
169
-
170
- const handleSync = async () => {
171
- await syncSubordinates.mutateAsync({
172
- leaderUserId: 'uuid-do-lider',
173
- selectedUsers: [
174
- { id_user: 'uuid-subordinado-1' },
175
- { id_user: 'uuid-subordinado-2' }
176
- ]
177
- });
178
- };
179
-
180
- return (
181
- <div className="space-x-2">
182
- <Button onClick={handleCreateMultiple}>Criar Múltiplos</Button>
183
- <Button onClick={handleUpdate}>Atualizar</Button>
184
- <Button onClick={handleRemove} variant="destructive">Remover</Button>
185
- <Button onClick={handleSync}>Sincronizar</Button>
186
- </div>
187
- );
188
- }`},{title:"Utilitários (buildHierarchy, flattenTree)",description:"Funções utilitárias para manipular a estrutura hierárquica.",preview:e.jsx(C,{}),code:`import { buildHierarchy, flattenTree } from 'forlogic-core';
189
-
190
- // buildHierarchy: Converte lista plana em árvore
191
- const leaders = [
192
- { id: '1', id_user: 'user-a', id_leader: null, name: 'CEO' },
193
- { id: '2', id_user: 'user-b', id_leader: 'user-a', name: 'Diretor' },
194
- { id: '3', id_user: 'user-c', id_leader: 'user-b', name: 'Gerente' }
195
- ];
196
-
197
- const tree = buildHierarchy(leaders);
198
- // Resultado:
199
- // [{
200
- // id: '1', name: 'CEO', level: 0, children: [
201
- // { id: '2', name: 'Diretor', level: 1, children: [
202
- // { id: '3', name: 'Gerente', level: 2, children: [] }
203
- // ]}
204
- // ]
205
- // }]
206
-
207
- // flattenTree: Achata árvore para lista
208
- const flatList = flattenTree(tree);
209
- // Resultado: [CEO, Diretor, Gerente] com níveis preservados
210
-
211
- // Uso comum: iterar mantendo indentação visual
212
- flatList.forEach(node => {
213
- const indent = ' '.repeat(node.level);
214
- console.log(\`\${indent}\${node.name}\`);
215
- });`},{title:"LeaderRow (Componente de Linha)",description:"Componente de linha expansível para tabelas de liderança.",preview:e.jsx(y,{}),code:`import { useState } from 'react';
216
- import { LeaderRow, useLeadershipApi } from 'forlogic-core';
217
-
218
- function LeadersTable() {
219
- const { data: leaders = [] } = useLeadershipApi();
220
- const [expandedIds, setExpandedIds] = useState<Set<string>>(new Set());
221
-
222
- const handleToggleExpand = (id: string) => {
223
- setExpandedIds(prev => {
224
- const next = new Set(prev);
225
- if (next.has(id)) {
226
- next.delete(id);
227
- } else {
228
- next.add(id);
229
- }
230
- return next;
231
- });
232
- };
233
-
234
- const handleEdit = (leader) => {
235
- console.log('Editar:', leader);
236
- };
237
-
238
- return (
239
- <table className="w-full">
240
- <thead>
241
- <tr>
242
- <th>Nome</th>
243
- <th>Subordinados</th>
244
- </tr>
245
- </thead>
246
- <tbody>
247
- {leaders.map(leader => (
248
- <LeaderRow
249
- key={leader.id}
250
- leader={leader}
251
- expandedIds={expandedIds}
252
- onToggleExpand={handleToggleExpand}
253
- onEdit={handleEdit}
254
- />
255
- ))}
256
- </tbody>
257
- </table>
258
- );
259
- }`},{title:"Página Completa (LeadershipPage)",description:"Componente de página completa com todas as funcionalidades integradas.",preview:e.jsx(w,{}),code:`import { LeadershipPage } from 'forlogic-core';
260
-
261
- // Uso simples - página completa pronta
262
- function MyApp() {
263
- return (
264
- <Routes>
265
- <Route path="/leadership" element={<LeadershipPage />} />
266
- </Routes>
267
- );
268
- }
269
-
270
- // A LeadershipPage inclui:
271
- // - Botão "Adicionar Líder"
272
- // - Botões "Expandir/Colapsar Todos"
273
- // - Tabela hierárquica com LeaderRow
274
- // - LeadershipDialog para criar/editar
275
- // - Contadores de usuários associados/não associados
276
- // - Persistência do estado de expansão no localStorage`},{title:"Exemplo Completo Integrado",description:"Implementação customizada com todos os recursos do módulo de liderança.",preview:e.jsx(E,{}),code:`import { useState, useMemo } from 'react';
277
- import {
278
- useLeadershipApi,
279
- useRemoveLeaderMutation,
280
- LeadershipDialog,
281
- LeaderRow,
282
- flattenTree,
283
- Button,
284
- Card,
285
- toast
286
- } from 'forlogic-core';
287
- import { Users, UserPlus, ChevronDown, ChevronUp, Trash2 } from 'lucide-react';
288
-
289
- function CustomLeadershipPage() {
290
- const { data: leaders = [], isLoading, error } = useLeadershipApi();
291
- const removeLeader = useRemoveLeaderMutation();
292
-
293
- const [dialogOpen, setDialogOpen] = useState(false);
294
- const [editingLeader, setEditingLeader] = useState<Leader | null>(null);
295
- const [expandedIds, setExpandedIds] = useState<Set<string>>(new Set());
296
-
297
- // Achatar árvore para estatísticas
298
- const flatList = useMemo(() => flattenTree(leaders), [leaders]);
299
- const totalLeaders = flatList.length;
300
- const rootLeaders = leaders.length;
301
-
302
- // Handlers
303
- const handleToggleExpand = (id: string) => {
304
- setExpandedIds(prev => {
305
- const next = new Set(prev);
306
- next.has(id) ? next.delete(id) : next.add(id);
307
- return next;
308
- });
309
- };
310
-
311
- const handleExpandAll = () => {
312
- setExpandedIds(new Set(flatList.map(l => l.id)));
313
- };
314
-
315
- const handleCollapseAll = () => {
316
- setExpandedIds(new Set());
317
- };
318
-
319
- const handleEdit = (leader: Leader) => {
320
- setEditingLeader(leader);
321
- setDialogOpen(true);
322
- };
323
-
324
- const handleAdd = () => {
325
- setEditingLeader(null);
326
- setDialogOpen(true);
327
- };
328
-
329
- const handleRemove = async (leader: Leader) => {
330
- try {
331
- await removeLeader.mutateAsync(leader.id);
332
- toast.success(\`\${leader.name} removido com sucesso\`);
333
- } catch (error) {
334
- toast.error('Erro ao remover líder');
335
- }
336
- };
337
-
338
- const handleDialogClose = () => {
339
- setDialogOpen(false);
340
- setEditingLeader(null);
341
- };
342
-
343
- if (isLoading) return <div>Carregando hierarquia...</div>;
344
- if (error) return <div>Erro: {error.message}</div>;
345
-
346
- return (
347
- <div className="space-y-6">
348
- {/* Header com estatísticas e ações */}
349
- <div className="flex items-center justify-between">
350
- <div>
351
- <h1 className="text-2xl font-bold">Hierarquia de Liderança</h1>
352
- <p className="text-muted-foreground">
353
- {totalLeaders} líderes • {rootLeaders} níveis raiz
354
- </p>
355
- </div>
356
-
357
- <div className="flex gap-2">
358
- <Button variant="outline" size="sm" onClick={handleExpandAll}>
359
- <ChevronDown className="h-4 w-4 mr-1" />
360
- Expandir
361
- </Button>
362
- <Button variant="outline" size="sm" onClick={handleCollapseAll}>
363
- <ChevronUp className="h-4 w-4 mr-1" />
364
- Colapsar
365
- </Button>
366
- <Button onClick={handleAdd}>
367
- <UserPlus className="h-4 w-4 mr-1" />
368
- Adicionar Líder
369
- </Button>
370
- </div>
371
- </div>
372
-
373
- {/* Tabela hierárquica */}
374
- <Card>
375
- <table className="w-full">
376
- <thead className="bg-muted/50">
377
- <tr>
378
- <th className="text-left p-4">Líder</th>
379
- <th className="text-center p-4">Subordinados</th>
380
- <th className="text-right p-4">Ações</th>
381
- </tr>
382
- </thead>
383
- <tbody>
384
- {leaders.map(leader => (
385
- <LeaderRow
386
- key={leader.id}
387
- leader={leader}
388
- expandedIds={expandedIds}
389
- onToggleExpand={handleToggleExpand}
390
- onEdit={handleEdit}
391
- // Ação extra de remoção
392
- actions={
393
- <Button
394
- variant="ghost"
395
- size="sm"
396
- onClick={() => handleRemove(leader)}
397
- >
398
- <Trash2 className="h-4 w-4 text-destructive" />
399
- </Button>
400
- }
401
- />
402
- ))}
403
- </tbody>
404
- </table>
405
- </Card>
406
-
407
- {/* Dialog para criar/editar */}
408
- <LeadershipDialog
409
- open={dialogOpen}
410
- onOpenChange={handleDialogClose}
411
- leader={editingLeader}
412
- title={editingLeader ? 'Editar Líder' : 'Novo Líder'}
413
- />
414
- </div>
415
- );
416
- }`}],props:[{name:"LeadershipDialog.open",type:"boolean",description:"Controla a visibilidade do dialog."},{name:"LeadershipDialog.onOpenChange",type:"(open: boolean) => void",description:"Callback quando o estado de abertura muda."},{name:"LeadershipDialog.leader",type:"Leader",description:"Líder a ser editado (se não fornecido, cria novo)."},{name:"LeadershipDialog.prefilledLeaderId",type:"string | null",description:"ID do líder superior pré-selecionado (para criação)."},{name:"LeadershipDialog.title",type:"string",description:"Título do dialog."},{name:"LeaderRow.leader",type:"LeaderNode",description:"Nó do líder a ser renderizado."},{name:"LeaderRow.expandedIds",type:"Set<string>",description:"IDs dos nós atualmente expandidos."},{name:"LeaderRow.onToggleExpand",type:"(id: string) => void",description:"Callback para alternar expansão de um nó."},{name:"LeaderRow.onEdit",type:"(leader: Leader) => void",description:"Callback quando o nome do líder é clicado."},{name:"LeadershipForm.leader",type:"Leader",description:"Líder a ser editado (modo edição)."},{name:"LeadershipForm.prefilledLeaderId",type:"string | null",description:"ID do líder superior pré-selecionado."},{name:"LeadershipForm.onSuccess",type:"() => void",description:"Callback executado após salvar com sucesso."}],accessibility:["Os botões de expandir/colapsar são acessíveis via teclado.",'Os nomes clicáveis têm role="button" implícito.',"O dialog segue padrões WAI-ARIA para modais.","Checkboxes de seleção de usuários são navegáveis via Tab.","Estados de loading são anunciados para leitores de tela."],notes:["O módulo requer autenticação ativa (useAuth) e integração com Qualiex.","Os dados são enriquecidos automaticamente com nomes/emails do Qualiex.",'Líderes "virtuais" são criados automaticamente para referências não cadastradas.',"Validação de ciclos na hierarquia é feita automaticamente.","O estado de expansão é persistido no localStorage por alias.","Soft delete é usado para remoção (is_removed = true)."]})}function L(){return e.jsxs("div",{className:"p-6 border rounded-lg bg-card space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(s,{className:"h-6 w-6 text-primary"}),e.jsx("h3",{className:"text-lg font-semibold",children:"Módulo de Liderança"})]}),e.jsx("p",{className:"text-muted-foreground",children:"Sistema completo para gerenciar hierarquias de liderança, incluindo:"}),e.jsxs("ul",{className:"list-disc list-inside space-y-1 text-sm",children:[e.jsx("li",{children:"Visualização em árvore hierárquica"}),e.jsx("li",{children:"Criação e edição de líderes"}),e.jsx("li",{children:"Seleção múltipla de subordinados"}),e.jsx("li",{children:"Validação automática de ciclos"}),e.jsx("li",{children:"Integração com usuários do Qualiex"})]})]})}function f(){return e.jsxs("div",{className:"p-4 border rounded-lg bg-muted/30 font-mono text-xs space-y-2",children:[e.jsx("div",{className:"text-primary",children:"Leader"}),e.jsx("div",{className:"pl-4 text-muted-foreground",children:"id, alias, id_user, id_leader, is_removed, is_active"}),e.jsx("div",{className:"text-primary",children:"LeaderNode extends Leader"}),e.jsx("div",{className:"pl-4 text-muted-foreground",children:"children: LeaderNode[], level: number"})]})}function j(){const a=[{name:"CEO",level:0,subordinatesCount:2},{name:"Diretor A",level:1,subordinatesCount:3},{name:"Diretor B",level:1,subordinatesCount:1}];return e.jsxs("div",{className:"p-4 border rounded-lg space-y-2",children:[e.jsx("div",{className:"text-sm font-medium text-muted-foreground mb-2",children:"Resultado do useLeadershipApi:"}),a.map((r,t)=>e.jsxs("div",{className:"flex items-center gap-2 text-sm",style:{paddingLeft:r.level*16},children:[e.jsx(s,{className:"h-4 w-4 text-muted-foreground"}),e.jsx("span",{children:r.name}),e.jsxs("span",{className:"text-muted-foreground",children:["(",r.subordinatesCount," subordinados)"]})]},t))]})}function b(){const[a,r]=l.useState(!1);return e.jsx("div",{className:"p-4 border rounded-lg",children:e.jsxs(p,{open:a,onOpenChange:r,children:[e.jsx(m,{asChild:!0,children:e.jsxs(d,{children:[e.jsx(c,{className:"h-4 w-4 mr-2"}),"Adicionar Líder"]})}),e.jsxs(h,{children:[e.jsx(x,{children:e.jsx(g,{children:"Novo Líder"})}),e.jsx("div",{className:"py-4 text-center text-muted-foreground",children:"[LeadershipForm seria renderizado aqui]"})]})]})})}function N(){return e.jsxs("div",{className:"p-4 border rounded-lg space-y-3",children:[e.jsx("div",{className:"text-sm font-medium",children:"Mutations disponíveis:"}),e.jsxs("div",{className:"grid grid-cols-2 gap-2 text-xs",children:[e.jsx("div",{className:"p-2 bg-muted/50 rounded",children:"useCreateMultipleLeadersMutation"}),e.jsx("div",{className:"p-2 bg-muted/50 rounded",children:"useUpdateLeaderMutation"}),e.jsx("div",{className:"p-2 bg-muted/50 rounded",children:"useRemoveLeaderMutation"}),e.jsx("div",{className:"p-2 bg-muted/50 rounded",children:"useSyncSubordinatesMutation"})]})]})}function C(){const a=[{name:"CEO",level:0},{name:"├── Diretor",level:1},{name:"│ └── Gerente",level:2}];return e.jsxs("div",{className:"p-4 border rounded-lg font-mono text-sm space-y-1",children:[e.jsx("div",{className:"text-muted-foreground mb-2",children:"buildHierarchy → flattenTree:"}),a.map((r,t)=>e.jsx("div",{children:r.name},t))]})}function y(){const[a,r]=l.useState(!0);return e.jsx("div",{className:"border rounded-lg overflow-hidden",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{className:"bg-muted/50",children:e.jsxs("tr",{children:[e.jsx("th",{className:"text-left p-3",children:"Nome"}),e.jsx("th",{className:"text-center p-3",children:"Subordinados"})]})}),e.jsxs("tbody",{children:[e.jsxs("tr",{className:"border-t hover:bg-muted/30",children:[e.jsx("td",{className:"p-3",children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("button",{onClick:()=>r(!a),className:"p-1 hover:bg-accent rounded",children:a?e.jsx(u,{className:"h-4 w-4"}):e.jsx(n,{className:"h-4 w-4"})}),e.jsx(s,{className:"h-4 w-4 text-muted-foreground"}),e.jsx("span",{className:"font-medium hover:text-primary cursor-pointer",children:"CEO"})]})}),e.jsx("td",{className:"text-center p-3",children:"2"})]}),a&&e.jsxs(e.Fragment,{children:[e.jsxs("tr",{className:"border-t hover:bg-muted/30",children:[e.jsx("td",{className:"p-3",children:e.jsxs("div",{className:"flex items-center gap-2",style:{paddingLeft:32},children:[e.jsx("button",{className:"p-1 hover:bg-accent rounded",children:e.jsx(n,{className:"h-4 w-4"})}),e.jsx(s,{className:"h-4 w-4 text-muted-foreground"}),e.jsx("span",{className:"font-medium hover:text-primary cursor-pointer",children:"Diretor A"})]})}),e.jsx("td",{className:"text-center p-3",children:"3"})]}),e.jsxs("tr",{className:"border-t hover:bg-muted/30",children:[e.jsx("td",{className:"p-3",children:e.jsxs("div",{className:"flex items-center gap-2",style:{paddingLeft:32},children:[e.jsx("div",{className:"w-6"}),e.jsx(s,{className:"h-4 w-4 text-muted-foreground"}),e.jsx("span",{className:"font-medium hover:text-primary cursor-pointer",children:"Diretor B"})]})}),e.jsx("td",{className:"text-center p-3",children:"0"})]})]})]})]})})}function w(){return e.jsxs("div",{className:"p-4 border rounded-lg space-y-3",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("h3",{className:"font-medium",children:"LeadershipPage"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(d,{size:"sm",variant:"outline",children:"Expandir Todos"}),e.jsxs(d,{size:"sm",children:[e.jsx(c,{className:"h-4 w-4 mr-1"}),"Adicionar"]})]})]}),e.jsx("div",{className:"text-xs text-muted-foreground",children:"Inclui tabela hierárquica, dialog de edição, contadores e persistência"})]})}function E(){const[a,r]=l.useState(!0),t=[{name:"CEO",subordinates:2,level:0},{name:"Diretor Comercial",subordinates:3,level:1},{name:"Gerente de Vendas",subordinates:5,level:2},{name:"Diretor de TI",subordinates:2,level:1}];return e.jsxs("div",{className:"border rounded-lg overflow-hidden",children:[e.jsxs("div",{className:"p-4 bg-muted/30 border-b flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"font-semibold",children:"Hierarquia de Liderança"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"4 líderes • 2 níveis raiz"})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(d,{size:"sm",variant:"outline",onClick:()=>r(!a),children:a?"Colapsar":"Expandir"}),e.jsxs(d,{size:"sm",children:[e.jsx(c,{className:"h-4 w-4 mr-1"}),"Adicionar"]})]})]}),e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{className:"bg-muted/50",children:e.jsxs("tr",{children:[e.jsx("th",{className:"text-left p-3",children:"Líder"}),e.jsx("th",{className:"text-center p-3",children:"Subordinados"}),e.jsx("th",{className:"text-right p-3",children:"Ações"})]})}),e.jsx("tbody",{children:t.slice(0,a?4:1).map((i,o)=>e.jsxs("tr",{className:"border-t hover:bg-muted/30",children:[e.jsx("td",{className:"p-3",children:e.jsxs("div",{className:"flex items-center gap-2",style:{paddingLeft:i.level*16},children:[o===0&&e.jsx("button",{onClick:()=>r(!a),className:"p-1 hover:bg-accent rounded",children:a?e.jsx(u,{className:"h-4 w-4"}):e.jsx(n,{className:"h-4 w-4"})}),o!==0&&e.jsx("div",{className:"w-6"}),e.jsx(s,{className:"h-4 w-4 text-muted-foreground"}),e.jsx("span",{className:"font-medium hover:text-primary cursor-pointer",children:i.name})]})}),e.jsx("td",{className:"text-center p-3",children:i.subordinates}),e.jsx("td",{className:"text-right p-3",children:e.jsx(d,{variant:"ghost",size:"sm",children:"Editar"})})]},o))})]}),e.jsxs("div",{className:"p-3 bg-muted/20 border-t text-xs text-muted-foreground flex justify-between",children:[e.jsx("span",{children:"Usuários associados: 12"}),e.jsx("span",{children:"Usuários não associados: 5"})]})]})}export{M as LeadershipDoc};