forlogic-core 2.0.3 → 2.0.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 (207) hide show
  1. package/.note/memory/features/crud-defaults-batteries-included.md +1 -1
  2. package/README.md +187 -917
  3. package/dist/components/ui/dialog-wizard.d.ts +82 -0
  4. package/dist/components/ui/input-group.d.ts +1 -1
  5. package/dist/components/ui/input.d.ts +5 -23
  6. package/dist/components/ui/resizable.d.ts +1 -1
  7. package/dist/components/ui/sidebar.d.ts +1 -1
  8. package/dist/components/ui/step-selector.d.ts +11 -9
  9. package/dist/components/ui/textarea.d.ts +1 -0
  10. package/dist/crud/components/CrudTable.d.ts +3 -1
  11. package/dist/crud/createCrudPage.d.ts +2 -0
  12. package/dist/crud/hooks/useColumnManager.d.ts +3 -1
  13. package/dist/exports/ui.d.ts +1 -0
  14. package/dist/index.css +1 -1
  15. package/dist/index.css.map +1 -1
  16. package/dist/index.esm.js +1 -1
  17. package/dist/index.js +1 -1
  18. package/dist/types/sidebar.d.ts +2 -1
  19. package/dist/types.d.ts +3 -0
  20. package/docs/AUDIT_PROMPT.md +74 -0
  21. package/docs/PROJECT_KNOWLEDGE_TEMPLATE.md +117 -0
  22. package/docs/PROMPT_TEMPLATE.md +77 -0
  23. package/docs/STARTER_TEMPLATE.md +114 -0
  24. package/docs/design-system/README.md +45 -0
  25. package/docs/design-system/buttons-actions.md +433 -0
  26. package/docs/design-system/charts-dashboards.md +547 -0
  27. package/docs/design-system/crud.md +243 -0
  28. package/docs/design-system/data-display.md +360 -0
  29. package/docs/design-system/dialogs.md +588 -0
  30. package/docs/design-system/domain.md +661 -0
  31. package/docs/design-system/examples.md +275 -0
  32. package/docs/design-system/foundation.md +82 -0
  33. package/docs/design-system/infra-utils.md +36 -0
  34. package/docs/design-system/inputs.md +556 -0
  35. package/docs/design-system/layout.md +351 -0
  36. package/docs/design-system/navigation.md +604 -0
  37. package/docs/design-system/notifications-feedback.md +139 -0
  38. package/docs/design-system/platform.md +95 -0
  39. package/docs/design-system/selectors.md +424 -0
  40. package/docs/design-system/tables-grids.md +114 -0
  41. package/package.json +2 -2
  42. package/dist/assets/AccordionDoc-CGNlubG3.js +0 -31
  43. package/dist/assets/ActionButtonDoc-CYtkXR0k.js +0 -47
  44. package/dist/assets/ActionPlanDoc-BSuPRftQ.js +0 -65
  45. package/dist/assets/AlertDoc-Cpvxneqg.js +0 -37
  46. package/dist/assets/AliasUrlDoc-DIpUWf4Y.js +0 -189
  47. package/dist/assets/AppHeaderDoc-DNQErj_t.js +0 -74
  48. package/dist/assets/AppSidebarDoc-DkeQarDu.js +0 -221
  49. package/dist/assets/ApprovalFlowDoc-8YgXbhKJ.js +0 -31
  50. package/dist/assets/AuditLogDoc-BBvNcHIo.js +0 -67
  51. package/dist/assets/AuditTrailDoc-DgFHO-uo.js +0 -17
  52. package/dist/assets/AuthDoc-WIA_Aetl.js +0 -200
  53. package/dist/assets/AvatarDoc-B6go1C1T.js +0 -11
  54. package/dist/assets/BadgeDoc-BONhfqB_.js +0 -36
  55. package/dist/assets/BaseFormDoc-CuyUArcj.js +0 -169
  56. package/dist/assets/BodyContentDoc-CterHC1E.js +0 -83
  57. package/dist/assets/BreadcrumbDoc-Dwn9nLeO.js +0 -75
  58. package/dist/assets/ButtonDoc-BOjRseZT.js +0 -41
  59. package/dist/assets/ButtonGroupDoc-8IS6PPh4.js +0 -7
  60. package/dist/assets/CalendarDoc-CMwIEqgT.js +0 -81
  61. package/dist/assets/CardDoc-BZz1CVg2.js +0 -49
  62. package/dist/assets/ChartDoc-B5vZVtqD.js +0 -76
  63. package/dist/assets/CheckboxDoc-lAbYO9I5.js +0 -55
  64. package/dist/assets/ColorPickerDoc-Dpsprp4N.js +0 -10
  65. package/dist/assets/ColorsFoundationDoc-CCHeSL3p.js +0 -13
  66. package/dist/assets/ComboTreeDoc-D4dTkIt-.js +0 -46
  67. package/dist/assets/ComboboxDoc-CqqZPvZq.js +0 -134
  68. package/dist/assets/ComponentDocTemplate-CQbBhfvZ.js +0 -1
  69. package/dist/assets/ContextMenuDoc-D3jC-MVA.js +0 -182
  70. package/dist/assets/ContextsDoc-XFH0-JdS.js +0 -211
  71. package/dist/assets/CreateCrudPageDoc-CpuiWI-g.js +0 -106
  72. package/dist/assets/CrudActionBarDoc-wuBGXD9Y.js +0 -112
  73. package/dist/assets/CrudGridDoc-BYWqSXBH.js +0 -85
  74. package/dist/assets/CrudOverviewDoc-B_bk2a2t.js +0 -14
  75. package/dist/assets/CrudPrimitivesDoc-CxaTB94A.js +0 -164
  76. package/dist/assets/CrudTableDoc-Dga1VgCu.js +0 -113
  77. package/dist/assets/CustomFormFieldsDoc-C1hwwSl3.js +0 -33
  78. package/dist/assets/DashboardFormDoc-BUDCmrMl.js +0 -49
  79. package/dist/assets/DashboardGeneralViewDoc-Cyg1SIiG.js +0 -71
  80. package/dist/assets/DashboardGridDoc-BavePiRF.js +0 -49
  81. package/dist/assets/DashboardListDoc-CLyMA6UK.js +0 -37
  82. package/dist/assets/DashboardOverviewDoc-DRVvNIF1.js +0 -35
  83. package/dist/assets/DashboardPanelRendererDoc--mfwb8Nc.js +0 -60
  84. package/dist/assets/DashboardPanelsBasicDoc-BQ2V_52D.js +0 -62
  85. package/dist/assets/DashboardPanelsCartesianDoc-sy-hcVQY.js +0 -75
  86. package/dist/assets/DashboardPanelsSpecialDoc-DsIUCRRP.js +0 -83
  87. package/dist/assets/DashboardViewDoc-CtlCNlEF.js +0 -45
  88. package/dist/assets/DataListDoc-DUy88lCQ.js +0 -13
  89. package/dist/assets/DesignSystemHome-DHl9YtbH.js +0 -1
  90. package/dist/assets/DialogDoc-CMQqnTV-.js +0 -981
  91. package/dist/assets/DropdownMenuDoc-S7X9csGt.js +0 -175
  92. package/dist/assets/ElectronicSignatureDialogDoc-BfithaL_.js +0 -57
  93. package/dist/assets/EmptyStateDoc-CHGCiGIk.js +0 -35
  94. package/dist/assets/EnvironmentsDoc-DZHJZ2nm.js +0 -96
  95. package/dist/assets/ErrorBoundaryDoc-DoaAg68p.js +0 -111
  96. package/dist/assets/ExampleActionPlanPage-C0fIMZCD.js +0 -1
  97. package/dist/assets/ExampleAppDoc-DzIU81Fn.js +0 -1
  98. package/dist/assets/ExampleCard-DuLrb3t-.js +0 -1
  99. package/dist/assets/ExampleCrudReportsPage-M0pz6tdM.js +0 -1
  100. package/dist/assets/ExampleDashboardPage-CRG5r3Vw.js +0 -1
  101. package/dist/assets/ExampleIdeasPage-I84ZMLY4.js +0 -1
  102. package/dist/assets/ExampleImportWizardPage-h4YqrrSe.js +0 -1
  103. package/dist/assets/ExampleSettingsPage-CwdWqoaP.js +0 -1
  104. package/dist/assets/FileUploadDoc-9-UujFNX.js +0 -34
  105. package/dist/assets/FilterBar-DDTqqUfZ.js +0 -1
  106. package/dist/assets/FormDoc-CVES6n3d.js +0 -81
  107. package/dist/assets/FoundationOverview-DT0u11Gz.js +0 -1
  108. package/dist/assets/GridDoc-CbHFSILF.js +0 -28
  109. package/dist/assets/HooksDoc-Ctxdk6Wq.js +0 -665
  110. package/dist/assets/HoverCardDoc-8Wkaafdj.js +0 -31
  111. package/dist/assets/I18nDoc-D3Q2m7ik.js +0 -167
  112. package/dist/assets/IconPickerDoc-DZ26Gdpg.js +0 -10
  113. package/dist/assets/IconsFoundationDoc-xOxtC7CW.js +0 -33
  114. package/dist/assets/InputDoc-BhztAiuJ.js +0 -211
  115. package/dist/assets/LabelDoc-A4hmTRRV.js +0 -42
  116. package/dist/assets/LeadershipDoc-CqOSfWsP.js +0 -452
  117. package/dist/assets/MediaDoc-C78gvC8p.js +0 -459
  118. package/dist/assets/MenubarDoc-DCnmd2tO.js +0 -165
  119. package/dist/assets/ModuleAccessDoc-CmD5nHDp.js +0 -153
  120. package/dist/assets/ModulesDialogDoc-DVit1CA-.js +0 -46
  121. package/dist/assets/MultiselectPermissionsDoc-tlJMs04L.js +0 -34
  122. package/dist/assets/NavigationMenuDoc-q1fbc89j.js +0 -116
  123. package/dist/assets/OnboardingDialogDoc-3A3eBYrq.js +0 -55
  124. package/dist/assets/PaginationDoc-B8-bMz5J.js +0 -27
  125. package/dist/assets/PaginationDoc-BkGdxHL3.js +0 -98
  126. package/dist/assets/PlacesDoc-CKPO6ATs.js +0 -226
  127. package/dist/assets/PopoverDoc-CJPU4Ags.js +0 -64
  128. package/dist/assets/ProgressDoc-CpjbTL4o.js +0 -29
  129. package/dist/assets/QualiexUserFieldDoc-DDwumlRw.js +0 -149
  130. package/dist/assets/RadioGroupDoc-D6tSZz8G.js +0 -57
  131. package/dist/assets/RadiusDoc-B4xSnajw.js +0 -7
  132. package/dist/assets/ReportRequestListDoc-C0LIaU8P.js +0 -15
  133. package/dist/assets/RequiredFieldsCounterDoc-COesoSdx.js +0 -58
  134. package/dist/assets/ResizableDoc-CW0-XQuB.js +0 -104
  135. package/dist/assets/RichTextEditorDoc-C8c_XA9P.js +0 -24
  136. package/dist/assets/ScrollAreaDoc-BxtoAPaZ.js +0 -28
  137. package/dist/assets/SecurityDoc-wOVqpg2F.js +0 -204
  138. package/dist/assets/SelectDoc-C75gtY9D.js +0 -80
  139. package/dist/assets/SeparatorDoc-BjQBPB1P.js +0 -4
  140. package/dist/assets/ServicesDoc-CXTctwBl.js +0 -308
  141. package/dist/assets/ShadowsDoc-C6Lw8_x2.js +0 -9
  142. package/dist/assets/SignDoc-Bh5ZUg5x.js +0 -66
  143. package/dist/assets/SkeletonDoc-rTLGK5VE.js +0 -54
  144. package/dist/assets/SliderDoc-JMAMDub7.js +0 -41
  145. package/dist/assets/SpacingDoc-RljOrpwA.js +0 -12
  146. package/dist/assets/SplitButtonDoc-CvShUW3w.js +0 -53
  147. package/dist/assets/StepSelectorDoc-C-nAap9H.js +0 -41
  148. package/dist/assets/SwitchDoc-DLnqmkPr.js +0 -56
  149. package/dist/assets/TableDoc-B8EpWLVg.js +0 -128
  150. package/dist/assets/TabsDoc-DIBtl_uC.js +0 -42
  151. package/dist/assets/TeamSelectorDoc-B7OnCbL7.js +0 -10
  152. package/dist/assets/TermsOfUseDoc-Bb-pw08s.js +0 -16
  153. package/dist/assets/TextareaDoc-DGnqMqEC.js +0 -46
  154. package/dist/assets/ToastDoc-DjYyc7ae.js +0 -157
  155. package/dist/assets/ToggleDoc-C9ZOVjkY.js +0 -51
  156. package/dist/assets/TooltipDoc-BEx4l9-i.js +0 -58
  157. package/dist/assets/TruncatedCellDoc-BbV1bRSY.js +0 -12
  158. package/dist/assets/TypographyFoundationDoc-CUDYjRo9.js +0 -7
  159. package/dist/assets/UpdatesNotificationDoc-7nyjzLMJ.js +0 -29
  160. package/dist/assets/UsersGroupsSelectorDoc-C0KlTAL5.js +0 -18
  161. package/dist/assets/UtilitiesDoc-DGxaHVV1.js +0 -145
  162. package/dist/assets/ViewerDialogsDoc-CnTPTEz0.js +0 -1
  163. package/dist/assets/blocks-B6LrJeAM.js +0 -1
  164. package/dist/assets/building-DeVappnD.js +0 -1
  165. package/dist/assets/calendar-days-BQ0na5kM.js +0 -1
  166. package/dist/assets/check-check-C_-PJCJa.js +0 -1
  167. package/dist/assets/circle-plus-CpIcep-O.js +0 -1
  168. package/dist/assets/circle-x-jPpBPew0.js +0 -1
  169. package/dist/assets/clipboard-list-CXNPdciZ.js +0 -1
  170. package/dist/assets/cloud-upload-BEjzumjl.js +0 -1
  171. package/dist/assets/crown-CqNsQIsm.js +0 -1
  172. package/dist/assets/date-picker-BW3eGOe_.js +0 -1
  173. package/dist/assets/disabled-menu-item-C2YaMvSt.js +0 -1
  174. package/dist/assets/drawer-D5rflIcD.js +0 -3
  175. package/dist/assets/file-braces-DFb5X9so.js +0 -1
  176. package/dist/assets/file-pen-line-CyUGKkEN.js +0 -1
  177. package/dist/assets/git-branch-BcXv9mpp.js +0 -1
  178. package/dist/assets/globe-CpMIWAcv.js +0 -1
  179. package/dist/assets/hash-cQWdKjya.js +0 -1
  180. package/dist/assets/hourglass-BahQ3eDv.js +0 -1
  181. package/dist/assets/hover-card-R66N85sZ.js +0 -1
  182. package/dist/assets/iframe-dialog-V0mW5aBb.js +0 -1
  183. package/dist/assets/index-DkiftrvI.js +0 -352
  184. package/dist/assets/index-nmBjO9Th.css +0 -1
  185. package/dist/assets/life-buoy-ByXiPddz.js +0 -1
  186. package/dist/assets/loading-state-Cb5_t5uE.js +0 -1
  187. package/dist/assets/lucide-react-Cp3Yw3Zm.js +0 -1
  188. package/dist/assets/package-B3-pVvPM.js +0 -1
  189. package/dist/assets/pen-Bi_lmmKT.js +0 -1
  190. package/dist/assets/pin-DVsSl8QA.js +0 -1
  191. package/dist/assets/printer-BnJ8B6m-.js +0 -1
  192. package/dist/assets/radio-group-BHAaNGsm.js +0 -1
  193. package/dist/assets/server-CtzFTfKR.js +0 -1
  194. package/dist/assets/share-2-Dv8Do445.js +0 -1
  195. package/dist/assets/shield-check-CFXjOV_w.js +0 -1
  196. package/dist/assets/shield-x-DJTRfVux.js +0 -1
  197. package/dist/assets/slider-v9tXBSnB.js +0 -1
  198. package/dist/assets/smartphone-BSNR60L7.js +0 -1
  199. package/dist/assets/step-selector-ATTh_9Wa.js +0 -1
  200. package/dist/assets/text-align-start-qE-MbYYw.js +0 -1
  201. package/dist/assets/thumbs-up-D_XIW_uX.js +0 -1
  202. package/dist/assets/trash-DTWQwpwA.js +0 -1
  203. package/dist/assets/trending-up-jip5-leJ.js +0 -1
  204. package/dist/assets/useMockCrud-CN4vjyOZ.js +0 -1
  205. package/dist/assets/user-check-BlH3EDWK.js +0 -1
  206. package/dist/assets/user-plus-BqwXwD-c.js +0 -1
  207. package/dist/index.html +0 -33
@@ -0,0 +1,661 @@
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
+
241
+ - rounded-lg
242
+ - hover:border-primary
243
+ - transition-colors
244
+
245
+ > Fonte: `src\design-system\docs\components\SelectDoc.tsx`
246
+
247
+ ---
248
+
249
+ ### Leadership
250
+
251
+ 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.
252
+
253
+ **Uso:**
254
+ ```tsx
255
+ // Página completa de liderança
256
+ import { LeadershipPage } from 'forlogic-core';
257
+
258
+ function MyLeadershipPage() {
259
+ return <LeadershipPage />;
260
+ }
261
+
262
+ // Ou use componentes individuais
263
+ import {
264
+ LeadershipDialog,
265
+ useLeadershipApi
266
+ } from 'forlogic-core';
267
+
268
+ function CustomLeadershipView() {
269
+ const { data: leaders, isLoading } = useLeadershipApi();
270
+ const [dialogOpen, setDialogOpen] = useState(false);
271
+
272
+ if (isLoading) return <div>Carregando...</div>;
273
+
274
+ return (
275
+ <div>
276
+ <Button onClick={() => setDialogOpen(true)}>
277
+ Adicionar Líder
278
+ </Button>
279
+
280
+ <LeadershipDialog
281
+ open={dialogOpen}
282
+ onOpenChange={setDialogOpen}
283
+ title="Novo Líder"
284
+ />
285
+
286
+ {/* Renderizar hierarquia */}
287
+ </div>
288
+ );
289
+ }
290
+ ```
291
+
292
+ **Props:**
293
+ | Prop | Tipo | Padrão | Descrição |
294
+ |------|------|--------|-----------|
295
+ | `LeadershipDialog.open` | `boolean` | - | Controla a visibilidade do dialog. |
296
+ | `LeadershipDialog.onOpenChange` | `(open: boolean) => void` | - | Callback quando o estado de abertura muda. |
297
+ | `LeadershipDialog.leader` | `Leader` | - | Líder a ser editado (se não fornecido, cria novo). |
298
+ | `LeadershipDialog.prefilledLeaderId` | `string | null` | - | ID do líder superior pré-selecionado (para criação). |
299
+ | `LeadershipDialog.title` | `string` | - | Título do dialog. |
300
+ | `LeaderRow.leader` | `LeaderNode` | - | Nó do líder a ser renderizado. |
301
+ | `LeaderRow.expandedIds` | `Set<string>` | - | IDs dos nós atualmente expandidos. |
302
+ | `LeaderRow.onToggleExpand` | `(id: string) => void` | - | Callback para alternar expansão de um nó. |
303
+ | `LeaderRow.onEdit` | `(leader: Leader) => void` | - | Callback quando o nome do líder é clicado. |
304
+ | `LeadershipForm.leader` | `Leader` | - | Líder a ser editado (modo edição). |
305
+ | `LeadershipForm.prefilledLeaderId` | `string | null` | - | ID do líder superior pré-selecionado. |
306
+ | `LeadershipForm.onSuccess` | `() => void` | - | Callback executado após salvar com sucesso. |
307
+
308
+ **Acessibilidade:**
309
+ - Os botões de expandir/colapsar são acessíveis via teclado.
310
+ - Os nomes clicáveis têm role=
311
+ - implícito.
312
+ - O dialog segue padrões WAI-ARIA para modais.
313
+ - Checkboxes de seleção de usuários são navegáveis via Tab.
314
+ - Estados de loading são anunciados para leitores de tela.
315
+
316
+ **Notas:**
317
+ - O módulo requer autenticação ativa (useAuth) e integração com Qualiex.
318
+ - Os dados são enriquecidos automaticamente com nomes/emails do Qualiex.
319
+ - Líderes
320
+ - são criados automaticamente para referências não cadastradas.
321
+ - Validação de ciclos na hierarquia é feita automaticamente.
322
+ - O estado de expansão é persistido no localStorage por alias.
323
+ - Soft delete é usado para remoção (is_removed = true).
324
+
325
+ > Fonte: `src\design-system\docs\components\LeadershipDoc.tsx`
326
+
327
+ ---
328
+
329
+ ### Media
330
+
331
+ 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.
332
+
333
+ **Uso:**
334
+ ```tsx
335
+ // Exemplo básico de upload de imagem
336
+ const { upload, uploading, progress } = useMediaUpload({
337
+ uploadFunction: async (file, options) => {
338
+ // Implementação do upload para seu storage
339
+ const url = await uploadToStorage(file, options);
340
+ return { url, path: file.name };
341
+ }
342
+ });
343
+
344
+ // Renderizar uma imagem
345
+ <ImageRenderer
346
+ content={{
347
+ imageUrl: 'https://example.com/image.jpg',
348
+ caption: 'Legenda da imagem',
349
+ alignment: 'center'
350
+ }}
351
+ />
352
+
353
+ // Renderizar um vídeo
354
+ <VideoRenderer
355
+ content={{
356
+ videoUrl: 'https://youtube.com/watch?v=...',
357
+ controls: true
358
+ }}
359
+ />
360
+ ```
361
+
362
+ **Props:**
363
+ | Prop | Tipo | Padrão | Descrição |
364
+ |------|------|--------|-----------|
365
+ | `uploadFunction` | `UploadFunction` | - | Função de upload customizada (obrigatória para uploads) |
366
+ | `deleteFunction` | `DeleteFunction` | - | Função de delete customizada |
367
+ | `defaultOptions` | `UploadOptions` | - | Opções padrão: bucket, maxSize, allowedTypes |
368
+ | `onSuccess` | `(result: UploadResult) => void` | - | Callback executado após upload bem-sucedido |
369
+ | `onError` | `(error: Error) => void` | - | Callback executado em caso de erro |
370
+ | `value` | `ImageBlockContent | VideoBlockContent` | - | Valor atual do conteúdo |
371
+ | `onChange` | `(value) => void` | - | Callback para mudanças no conteúdo |
372
+ | `onSubmit` | `(value) => void` | - | Callback ao salvar o conteúdo |
373
+ | `onCancel` | `() => void` | - | Callback ao cancelar edição |
374
+ | `uploadOptions` | `UploadOptions` | - | Opções de upload específicas para o editor |
375
+ | `content` | `ImageBlockContent | VideoBlockContent` | - | Conteúdo a ser renderizado |
376
+ | `className` | `string` | - | Classes CSS adicionais |
377
+ | `style` | `CSSProperties` | - | Estilos inline adicionais |
378
+
379
+ **Exemplos:**
380
+ ```tsx
381
+ import { useMediaUpload, getSupabaseClient } from
382
+ ```
383
+
384
+ **Acessibilidade:**
385
+ - ImageRenderer inclui atributo alt obrigatório para acessibilidade
386
+ - VideoRenderer usa atributo title no iframe para identificação
387
+ - Controles de vídeo habilitados por padrão para navegação por teclado
388
+ - Autoplay sempre acompanhado de muted para conformidade com navegadores
389
+ - Links de download possuem texto descritivo
390
+ - Todos os inputs dos editores possuem labels associados
391
+
392
+ **Notas:**
393
+ - O hook useMediaUpload requer que o projeto forneça as funções de upload/delete
394
+ - A função uploadFunction deve retornar { url: string, path?: string }
395
+ - VideoRenderer detecta automaticamente YouTube e Vimeo pela URL
396
+ - Para vídeos locais, use o player HTML5 nativo com controles
397
+ - Dimensões são opcionais; imagens usam max-width: 100% por padrão
398
+ - O módulo não inclui implementação de storage - use Supabase, S3, etc.
399
+ - Helpers de imagem usam Canvas API para compressão e resize
400
+
401
+ > Fonte: `src\design-system\docs\components\MediaDoc.tsx`
402
+
403
+ ---
404
+
405
+ ### Places
406
+
407
+ 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.
408
+
409
+ **Uso:**
410
+ ```tsx
411
+ // =====================
412
+ // BUSCAR LOCAIS
413
+ // =====================
414
+ import { placeService } from 'forlogic-core';
415
+
416
+ async function loadPlaces() {
417
+ const places = await placeService.getPlaces(alias, companyId);
418
+ // places já vem em estrutura hierárquica
419
+ console.log(places);
420
+ }
421
+
422
+ // =====================
423
+ // LISTA SIMPLES (SEM GESTÃO DE ACESSOS)
424
+ // =====================
425
+ import { PlacesList } from 'forlogic-core';
426
+
427
+ function MyPlacesPage() {
428
+ const [places, setPlaces] = useState<Place[]>([]);
429
+ const [isLoading, setIsLoading] = useState(true);
430
+
431
+ useEffect(() => {
432
+ placeService.getPlaces(alias, companyId)
433
+ .then(setPlaces)
434
+ .finally(() => setIsLoading(false));
435
+ }, [alias, companyId]);
436
+
437
+ return (
438
+ <PlacesList
439
+ places={places}
440
+ isLoading={isLoading}
441
+ />
442
+ );
443
+ }
444
+
445
+ // =====================
446
+ // COM GESTÃO DE ACESSOS
447
+ // =====================
448
+ import { PlacesList, PlaceCard } from 'forlogic-core';
449
+
450
+ function PlacesWithAccess() {
451
+ const [places, setPlaces] = useState<Place[]>([]);
452
+ const [managers, setManagers] = useState<Record<string, string>>({});
453
+ const [members, setMembers] = useState<Record<string, string[]>>({});
454
+
455
+ const manageAccessConfig = {
456
+ onMakeManager: async (userId, placeId) => {
457
+ setManagers(prev => ({ ...prev, [placeId]: userId }));
458
+ // Chamar API para salvar
459
+ },
460
+ onMakeMembers: async (userIds, placeId) => {
461
+ setMembers(prev => ({ ...prev, [placeId]: userIds }));
462
+ // Chamar API para salvar
463
+ },
464
+ getCurrentManagerId: (placeId) => managers[placeId],
465
+ getCurrentMemberIds: (placeId) => members[placeId] || []
466
+ };
467
+
468
+ return (
469
+ <PlacesList
470
+ places={places}
471
+ isLoading={false}
472
+ manageAccessConfig={manageAccessConfig}
473
+ />
474
+ );
475
+ }
476
+
477
+ // =====================
478
+ // PLACECARD INDIVIDUAL
479
+ // =====================
480
+ import { PlaceCard } from 'forlogic-core';
481
+
482
+ <PlaceCard
483
+ place={myPlace}
484
+ level={0}
485
+ manageAccessConfig={manageAccessConfig}
486
+ />
487
+ ```
488
+
489
+ **Acessibilidade:**
490
+ - Botões de expandir/colapsar acessíveis via teclado.
491
+ - Modal segue padrões WAI-ARIA.
492
+ - Checkboxes navegáveis por Tab.
493
+ - Estados de loading anunciados para leitores de tela.
494
+ - Busca de usuários com feedback visual.
495
+
496
+ **Notas:**
497
+ - Requer integração com API Qualiex configurada.
498
+ - O placeService monta a hierarquia automaticamente.
499
+ - O ManageAccessModal usa o hook useQualiexUsers internamente.
500
+ - A gestão de acessos é opcional - sem manageAccessConfig, apenas exibe.
501
+ - Níveis de hierarquia são controlados pela prop level no PlaceCard.
502
+
503
+ > Fonte: `src\design-system\docs\components\PlacesDoc.tsx`
504
+
505
+ ---
506
+
507
+ ### QualiexUserField
508
+
509
+ 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.
510
+
511
+ **Uso:**
512
+ ```tsx
513
+ import { QualiexUserField } from "forlogic-core"
514
+
515
+ // =====================
516
+ // USO BÁSICO
517
+ // =====================
518
+ <QualiexUserField
519
+ value={userId}
520
+ onChange={setUserId}
521
+ placeholder="Selecione..."
522
+ />
523
+
524
+ // =====================
525
+ // COM LABEL E REQUIRED
526
+ // =====================
527
+ import { UserCheck } from "lucide-react"
528
+
529
+ <QualiexUserField
530
+ label="Responsável"
531
+ required
532
+ icon={UserCheck}
533
+ value={userId}
534
+ onChange={setUserId}
535
+ />
536
+
537
+ // =====================
538
+ // SELEÇÃO MÚLTIPLA
539
+ // =====================
540
+ const [userIds, setUserIds] = useState<string[]>([])
541
+
542
+ <QualiexUserField
543
+ multiple
544
+ label="Avaliadores"
545
+ required
546
+ value={userIds}
547
+ onChange={setUserIds}
548
+ maxDisplayedBadges={3}
549
+ />
550
+
551
+ // =====================
552
+ // DISPLAY CUSTOMIZADO
553
+ // =====================
554
+
555
+ // Exibir nome + email
556
+ <QualiexUserField
557
+ displayFormat="name-email"
558
+ value={userId}
559
+ onChange={setUserId}
560
+ />
561
+
562
+ // Exibir nome + cargo
563
+ <QualiexUserField
564
+ displayFormat="name-role"
565
+ value={userId}
566
+ onChange={setUserId}
567
+ />
568
+
569
+ // Custom display function
570
+ <QualiexUserField
571
+ displayFormat="custom"
572
+ customDisplayFn={(user) => \`\${user.userName} - \${user.placeName || 'Sem local'}\
573
+ ```
574
+
575
+ **Acessibilidade:**
576
+ - Navegação completa por teclado
577
+ - Busca inteligente (sem acentos, case-insensitive)
578
+ - Segue padrão WAI-ARIA combobox
579
+ - Badges removíveis com teclado (modo múltiplo)
580
+ - Estados de loading e erro acessíveis
581
+ - Labels associados corretamente
582
+
583
+ **Notas:**
584
+ - Requer configuração Qualiex (apiUrl e apiToken) no projeto
585
+ - Use enabled={false} para lazy loading e chame refetch() manualmente
586
+ - Em Dialogs, sempre passe popoverContainer para evitar problemas de z-index
587
+ - O hook useQualiexUsers é usado internamente para buscar os usuários
588
+ - Integrado automaticamente com BaseForm via type=
589
+
590
+ > Fonte: `src\design-system\docs\components\QualiexUserFieldDoc.tsx`
591
+
592
+ ---
593
+
594
+ ### Report Request List
595
+
596
+ *Documentação não extraída automaticamente. Consulte o Design System interativo em `/ds`.*
597
+
598
+ ---
599
+
600
+ ### Select
601
+
602
+ Exibe uma lista de opções para o usuário escolher—acionada por um botão.
603
+
604
+ **Uso:**
605
+ ```tsx
606
+ import {
607
+ Select,
608
+ SelectContent,
609
+ SelectItem,
610
+ SelectTrigger,
611
+ SelectValue,
612
+ } from "forlogic-core"
613
+
614
+ <Select>
615
+ <SelectTrigger className="w-[180px]">
616
+ <SelectValue placeholder="Theme" />
617
+ </SelectTrigger>
618
+ <SelectContent>
619
+ <SelectItem value="light">Light</SelectItem>
620
+ <SelectItem value="dark">Dark</SelectItem>
621
+ </SelectContent>
622
+ </Select>
623
+ ```
624
+
625
+ **Props:**
626
+ | Prop | Tipo | Padrão | Descrição |
627
+ |------|------|--------|-----------|
628
+ | `defaultValue` | `string` | - | O valor selecionado padrão. |
629
+ | `value` | `string` | - | O valor selecionado controlado. |
630
+ | `onValueChange` | `(value: string) => void` | - | Manipulador de evento quando o valor muda. |
631
+ | `disabled` | `boolean` | false | Se o select está desabilitado. |
632
+ | `container (SelectContent)` | `HTMLElement` | - | Container HTML para portal (útil dentro de Dialog). |
633
+ | `collisionBoundary (SelectContent)` | `HTMLElement` | - | Elemento para detecção de colisão de posicionamento. |
634
+
635
+ **Acessibilidade:**
636
+ - Navegação completa por teclado
637
+ - Busca por digitação antecipada
638
+ - Segue o padrão de listbox WAI-ARIA
639
+ - Anúncios para leitores de tela
640
+
641
+ **Notas:**
642
+ - 💡 Use
643
+ - e
644
+ - quando o Select estiver dentro de um Dialog para evitar problemas de scroll
645
+ - 💡 Para seleção com busca, considere usar
646
+ - ao invés de
647
+ - ,
648
+
649
+ - rounded-lg
650
+ - hover:border-primary
651
+ - transition-colors
652
+
653
+ > Fonte: `src\design-system\docs\components\SelectDoc.tsx`
654
+
655
+ ---
656
+
657
+ ### Internacionalização (i18n)
658
+
659
+ *Documentação não extraída automaticamente. Consulte o Design System interativo em `/ds`.*
660
+
661
+ ---