forlogic-core 2.0.0 → 2.0.2

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 (186) hide show
  1. package/README.md +0 -46
  2. package/dist/assets/AccordionDoc-CGNlubG3.js +31 -0
  3. package/dist/assets/ActionButtonDoc-CYtkXR0k.js +47 -0
  4. package/dist/assets/ActionPlanDoc-BSuPRftQ.js +65 -0
  5. package/dist/assets/AlertDoc-Cpvxneqg.js +37 -0
  6. package/dist/assets/AliasUrlDoc-DIpUWf4Y.js +189 -0
  7. package/dist/assets/AppHeaderDoc-DNQErj_t.js +74 -0
  8. package/dist/assets/AppSidebarDoc-DkeQarDu.js +221 -0
  9. package/dist/assets/ApprovalFlowDoc-8YgXbhKJ.js +31 -0
  10. package/dist/assets/AuditLogDoc-BBvNcHIo.js +67 -0
  11. package/dist/assets/AuditTrailDoc-DgFHO-uo.js +17 -0
  12. package/dist/assets/AuthDoc-WIA_Aetl.js +200 -0
  13. package/dist/assets/AvatarDoc-B6go1C1T.js +11 -0
  14. package/dist/assets/BadgeDoc-BONhfqB_.js +36 -0
  15. package/dist/assets/BaseFormDoc-CuyUArcj.js +169 -0
  16. package/dist/assets/BodyContentDoc-CterHC1E.js +83 -0
  17. package/dist/assets/BreadcrumbDoc-Dwn9nLeO.js +75 -0
  18. package/dist/assets/ButtonDoc-BOjRseZT.js +41 -0
  19. package/dist/assets/ButtonGroupDoc-8IS6PPh4.js +7 -0
  20. package/dist/assets/CalendarDoc-CMwIEqgT.js +81 -0
  21. package/dist/assets/CardDoc-BZz1CVg2.js +49 -0
  22. package/dist/assets/ChartDoc-B5vZVtqD.js +76 -0
  23. package/dist/assets/CheckboxDoc-lAbYO9I5.js +55 -0
  24. package/dist/assets/ColorPickerDoc-Dpsprp4N.js +10 -0
  25. package/dist/assets/ColorsFoundationDoc-CCHeSL3p.js +13 -0
  26. package/dist/assets/ComboTreeDoc-D4dTkIt-.js +46 -0
  27. package/dist/assets/ComboboxDoc-CqqZPvZq.js +134 -0
  28. package/dist/assets/ComponentDocTemplate-CQbBhfvZ.js +1 -0
  29. package/dist/assets/ContextMenuDoc-D3jC-MVA.js +182 -0
  30. package/dist/assets/ContextsDoc-XFH0-JdS.js +211 -0
  31. package/dist/assets/CreateCrudPageDoc-CpuiWI-g.js +106 -0
  32. package/dist/assets/CrudActionBarDoc-wuBGXD9Y.js +112 -0
  33. package/dist/assets/CrudGridDoc-BYWqSXBH.js +85 -0
  34. package/dist/assets/CrudOverviewDoc-B_bk2a2t.js +14 -0
  35. package/dist/assets/CrudPrimitivesDoc-CxaTB94A.js +164 -0
  36. package/dist/assets/CrudTableDoc-Dga1VgCu.js +113 -0
  37. package/dist/assets/CustomFormFieldsDoc-C1hwwSl3.js +33 -0
  38. package/dist/assets/DashboardFormDoc-BUDCmrMl.js +49 -0
  39. package/dist/assets/DashboardGeneralViewDoc-Cyg1SIiG.js +71 -0
  40. package/dist/assets/DashboardGridDoc-BavePiRF.js +49 -0
  41. package/dist/assets/DashboardListDoc-CLyMA6UK.js +37 -0
  42. package/dist/assets/DashboardOverviewDoc-DRVvNIF1.js +35 -0
  43. package/dist/assets/DashboardPanelRendererDoc--mfwb8Nc.js +60 -0
  44. package/dist/assets/DashboardPanelsBasicDoc-BQ2V_52D.js +62 -0
  45. package/dist/assets/DashboardPanelsCartesianDoc-sy-hcVQY.js +75 -0
  46. package/dist/assets/DashboardPanelsSpecialDoc-DsIUCRRP.js +83 -0
  47. package/dist/assets/DashboardViewDoc-CtlCNlEF.js +45 -0
  48. package/dist/assets/DataListDoc-DUy88lCQ.js +13 -0
  49. package/dist/assets/DesignSystemHome-DHl9YtbH.js +1 -0
  50. package/dist/assets/DialogDoc-CMQqnTV-.js +981 -0
  51. package/dist/assets/DropdownMenuDoc-S7X9csGt.js +175 -0
  52. package/dist/assets/ElectronicSignatureDialogDoc-BfithaL_.js +57 -0
  53. package/dist/assets/EmptyStateDoc-CHGCiGIk.js +35 -0
  54. package/dist/assets/EnvironmentsDoc-DZHJZ2nm.js +96 -0
  55. package/dist/assets/ErrorBoundaryDoc-DoaAg68p.js +111 -0
  56. package/dist/assets/ExampleActionPlanPage-C0fIMZCD.js +1 -0
  57. package/dist/assets/ExampleAppDoc-DzIU81Fn.js +1 -0
  58. package/dist/assets/ExampleCard-DuLrb3t-.js +1 -0
  59. package/dist/assets/ExampleCrudReportsPage-M0pz6tdM.js +1 -0
  60. package/dist/assets/ExampleDashboardPage-CRG5r3Vw.js +1 -0
  61. package/dist/assets/ExampleIdeasPage-I84ZMLY4.js +1 -0
  62. package/dist/assets/ExampleImportWizardPage-h4YqrrSe.js +1 -0
  63. package/dist/assets/ExampleSettingsPage-CwdWqoaP.js +1 -0
  64. package/dist/assets/FileUploadDoc-9-UujFNX.js +34 -0
  65. package/dist/assets/FilterBar-DDTqqUfZ.js +1 -0
  66. package/dist/assets/FormDoc-CVES6n3d.js +81 -0
  67. package/dist/assets/FoundationOverview-DT0u11Gz.js +1 -0
  68. package/dist/assets/GridDoc-CbHFSILF.js +28 -0
  69. package/dist/assets/HooksDoc-Ctxdk6Wq.js +665 -0
  70. package/dist/assets/HoverCardDoc-8Wkaafdj.js +31 -0
  71. package/dist/assets/I18nDoc-D3Q2m7ik.js +167 -0
  72. package/dist/assets/IconPickerDoc-DZ26Gdpg.js +10 -0
  73. package/dist/assets/IconsFoundationDoc-xOxtC7CW.js +33 -0
  74. package/dist/assets/InputDoc-BhztAiuJ.js +211 -0
  75. package/dist/assets/LabelDoc-A4hmTRRV.js +42 -0
  76. package/dist/assets/LeadershipDoc-CqOSfWsP.js +452 -0
  77. package/dist/assets/MediaDoc-C78gvC8p.js +459 -0
  78. package/dist/assets/MenubarDoc-DCnmd2tO.js +165 -0
  79. package/dist/assets/ModuleAccessDoc-CmD5nHDp.js +153 -0
  80. package/dist/assets/ModulesDialogDoc-DVit1CA-.js +46 -0
  81. package/dist/assets/MultiselectPermissionsDoc-tlJMs04L.js +34 -0
  82. package/dist/assets/NavigationMenuDoc-q1fbc89j.js +116 -0
  83. package/dist/assets/OnboardingDialogDoc-3A3eBYrq.js +55 -0
  84. package/dist/assets/PaginationDoc-B8-bMz5J.js +27 -0
  85. package/dist/assets/PaginationDoc-BkGdxHL3.js +98 -0
  86. package/dist/assets/PlacesDoc-CKPO6ATs.js +226 -0
  87. package/dist/assets/PopoverDoc-CJPU4Ags.js +64 -0
  88. package/dist/assets/ProgressDoc-CpjbTL4o.js +29 -0
  89. package/dist/assets/QualiexUserFieldDoc-DDwumlRw.js +149 -0
  90. package/dist/assets/RadioGroupDoc-D6tSZz8G.js +57 -0
  91. package/dist/assets/RadiusDoc-B4xSnajw.js +7 -0
  92. package/dist/assets/ReportRequestListDoc-C0LIaU8P.js +15 -0
  93. package/dist/assets/RequiredFieldsCounterDoc-COesoSdx.js +58 -0
  94. package/dist/assets/ResizableDoc-CW0-XQuB.js +104 -0
  95. package/dist/assets/RichTextEditorDoc-C8c_XA9P.js +24 -0
  96. package/dist/assets/ScrollAreaDoc-BxtoAPaZ.js +28 -0
  97. package/dist/assets/SecurityDoc-wOVqpg2F.js +204 -0
  98. package/dist/assets/SelectDoc-C75gtY9D.js +80 -0
  99. package/dist/assets/SeparatorDoc-BjQBPB1P.js +4 -0
  100. package/dist/assets/ServicesDoc-CXTctwBl.js +308 -0
  101. package/dist/assets/ShadowsDoc-C6Lw8_x2.js +9 -0
  102. package/dist/assets/SignDoc-Bh5ZUg5x.js +66 -0
  103. package/dist/assets/SkeletonDoc-rTLGK5VE.js +54 -0
  104. package/dist/assets/SliderDoc-JMAMDub7.js +41 -0
  105. package/dist/assets/SpacingDoc-RljOrpwA.js +12 -0
  106. package/dist/assets/SplitButtonDoc-CvShUW3w.js +53 -0
  107. package/dist/assets/StepSelectorDoc-C-nAap9H.js +41 -0
  108. package/dist/assets/SwitchDoc-DLnqmkPr.js +56 -0
  109. package/dist/assets/TableDoc-B8EpWLVg.js +128 -0
  110. package/dist/assets/TabsDoc-DIBtl_uC.js +42 -0
  111. package/dist/assets/TeamSelectorDoc-B7OnCbL7.js +10 -0
  112. package/dist/assets/TermsOfUseDoc-Bb-pw08s.js +16 -0
  113. package/dist/assets/TextareaDoc-DGnqMqEC.js +46 -0
  114. package/dist/assets/ToastDoc-DjYyc7ae.js +157 -0
  115. package/dist/assets/ToggleDoc-C9ZOVjkY.js +51 -0
  116. package/dist/assets/TooltipDoc-BEx4l9-i.js +58 -0
  117. package/dist/assets/TruncatedCellDoc-BbV1bRSY.js +12 -0
  118. package/dist/assets/TypographyFoundationDoc-CUDYjRo9.js +7 -0
  119. package/dist/assets/UpdatesNotificationDoc-7nyjzLMJ.js +29 -0
  120. package/dist/assets/UsersGroupsSelectorDoc-C0KlTAL5.js +18 -0
  121. package/dist/assets/UtilitiesDoc-DGxaHVV1.js +145 -0
  122. package/dist/assets/ViewerDialogsDoc-CnTPTEz0.js +1 -0
  123. package/dist/assets/blocks-B6LrJeAM.js +1 -0
  124. package/dist/assets/building-DeVappnD.js +1 -0
  125. package/dist/assets/calendar-days-BQ0na5kM.js +1 -0
  126. package/dist/assets/check-check-C_-PJCJa.js +1 -0
  127. package/dist/assets/circle-plus-CpIcep-O.js +1 -0
  128. package/dist/assets/circle-x-jPpBPew0.js +1 -0
  129. package/dist/assets/clipboard-list-CXNPdciZ.js +1 -0
  130. package/dist/assets/cloud-upload-BEjzumjl.js +1 -0
  131. package/dist/assets/crown-CqNsQIsm.js +1 -0
  132. package/dist/assets/date-picker-BW3eGOe_.js +1 -0
  133. package/dist/assets/disabled-menu-item-C2YaMvSt.js +1 -0
  134. package/dist/assets/drawer-D5rflIcD.js +3 -0
  135. package/dist/assets/file-braces-DFb5X9so.js +1 -0
  136. package/dist/assets/file-pen-line-CyUGKkEN.js +1 -0
  137. package/dist/assets/git-branch-BcXv9mpp.js +1 -0
  138. package/dist/assets/globe-CpMIWAcv.js +1 -0
  139. package/dist/assets/hash-cQWdKjya.js +1 -0
  140. package/dist/assets/hourglass-BahQ3eDv.js +1 -0
  141. package/dist/assets/hover-card-R66N85sZ.js +1 -0
  142. package/dist/assets/iframe-dialog-V0mW5aBb.js +1 -0
  143. package/dist/assets/index-DkiftrvI.js +352 -0
  144. package/dist/assets/index-nmBjO9Th.css +1 -0
  145. package/dist/assets/life-buoy-ByXiPddz.js +1 -0
  146. package/dist/assets/loading-state-Cb5_t5uE.js +1 -0
  147. package/dist/assets/lucide-react-Cp3Yw3Zm.js +1 -0
  148. package/dist/assets/package-B3-pVvPM.js +1 -0
  149. package/dist/assets/pen-Bi_lmmKT.js +1 -0
  150. package/dist/assets/pin-DVsSl8QA.js +1 -0
  151. package/dist/assets/printer-BnJ8B6m-.js +1 -0
  152. package/dist/assets/radio-group-BHAaNGsm.js +1 -0
  153. package/dist/assets/server-CtzFTfKR.js +1 -0
  154. package/dist/assets/share-2-Dv8Do445.js +1 -0
  155. package/dist/assets/shield-check-CFXjOV_w.js +1 -0
  156. package/dist/assets/shield-x-DJTRfVux.js +1 -0
  157. package/dist/assets/slider-v9tXBSnB.js +1 -0
  158. package/dist/assets/smartphone-BSNR60L7.js +1 -0
  159. package/dist/assets/step-selector-ATTh_9Wa.js +1 -0
  160. package/dist/assets/text-align-start-qE-MbYYw.js +1 -0
  161. package/dist/assets/thumbs-up-D_XIW_uX.js +1 -0
  162. package/dist/assets/trash-DTWQwpwA.js +1 -0
  163. package/dist/assets/trending-up-jip5-leJ.js +1 -0
  164. package/dist/assets/useMockCrud-CN4vjyOZ.js +1 -0
  165. package/dist/assets/user-check-BlH3EDWK.js +1 -0
  166. package/dist/assets/user-plus-BqwXwD-c.js +1 -0
  167. package/dist/components/modules/ModulesContent.d.ts +7 -3
  168. package/dist/components/modules/ModulesFooterCards.d.ts +3 -1
  169. package/dist/components/modules/types.d.ts +3 -1
  170. package/dist/components/ui/button.d.ts +1 -1
  171. package/dist/components/ui/resizable.d.ts +1 -1
  172. package/dist/exports/crud.d.ts +5 -1
  173. package/dist/exports/ui.d.ts +8 -1
  174. package/dist/index.css +1 -1
  175. package/dist/index.css.map +1 -1
  176. package/dist/index.d.ts +1 -0
  177. package/dist/index.esm.js +1 -1
  178. package/dist/index.html +33 -0
  179. package/dist/index.js +1 -1
  180. package/dist/setup/favicon.d.ts +1 -0
  181. package/docs/PUBLISH.md +3 -3
  182. package/package.json +1 -5
  183. package/dist/README.md +0 -1079
  184. package/dist/bin/bootstrap.js +0 -40
  185. package/dist/bin/pull-docs.js +0 -186
  186. package/dist/docs/KNOWLEDGE.md +0 -109
@@ -0,0 +1,31 @@
1
+ import{r as n,j as e,E as R,G as F,H as _,I as M,J as P,N as Y,O as W,Q as Z,R as ee,V as ae,M as re,X as U,x,Y as b,eP as se,a1 as oe,o as T,aH as te,bp as ne,aI as ie,ab as le,e3 as pe,ew as ce,ar as de,dv as ue}from"./index-DkiftrvI.js";import{E as S}from"./ExampleCard-DuLrb3t-.js";import{L as B}from"./loading-state-Cb5_t5uE.js";import{C as xe}from"./circle-x-jPpBPew0.js";function $({open:a,onOpenChange:s,returnSteps:o,initialObservation:u="",title:m="Executar ação",descriptions:v=[],setDefaultApproverOnInit:p=!0,onSubmit:f}){const[c,h]=n.useState(!0),[j,i]=n.useState(p&&o.length>0?o[0].id:null),[d,w]=n.useState(u),N=4e3,C=l=>{h(l),l&&!p?i(null):!l&&!p&&o.length>0&&i(o[0].id)},D=()=>{if(!d.trim()){b.error("Formulário inválido. Preencha todos os campos obrigatórios.");return}const l=c?null:o.find(A=>A.id===j);f({approved:c,returnStepId:c?null:j,returnType:l?.type??null,observation:d})},g=d!==u||!c;return e.jsx(R,{open:a,onOpenChange:s,children:e.jsxs(F,{className:"sm:max-w-[480px]",children:[e.jsx(_,{children:e.jsx(M,{children:m})}),e.jsxs("div",{className:"space-y-4",children:[v.length>0&&e.jsx("div",{className:"space-y-1 text-sm text-muted-foreground",children:v.map((l,A)=>e.jsx("p",{dangerouslySetInnerHTML:{__html:l}},A))}),e.jsxs("div",{className:"flex gap-4",children:[e.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[e.jsx("input",{type:"radio",name:"approved",checked:c,onChange:()=>C(!0),className:"accent-primary"}),e.jsx("span",{className:"text-sm",children:"Aprovar"})]}),e.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[e.jsx("input",{type:"radio",name:"approved",checked:!c,onChange:()=>C(!1),className:"accent-primary"}),e.jsx("span",{className:"text-sm",children:"Reprovar e retornar para etapa"})]})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(P,{children:"Etapa"}),e.jsxs(Y,{value:j??void 0,onValueChange:i,disabled:c,children:[e.jsx(W,{children:e.jsx(Z,{placeholder:"Selecione a etapa"})}),e.jsx(ee,{children:o.map(l=>e.jsx(ae,{value:l.id,children:l.name},l.id))})]})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(P,{children:"Parecer *"}),e.jsx(re,{value:d,onChange:l=>w(l.target.value),maxLength:N,rows:4,autoFocus:!0}),e.jsxs("p",{className:"text-xs text-muted-foreground text-right",children:[d.length,"/",N]})]})]}),e.jsxs(U,{children:[e.jsx(x,{variant:"ghost",onClick:()=>s(!1),children:"Cancelar"}),e.jsx(x,{onClick:D,disabled:!g,children:"Concluir"})]})]})})}function G({open:a,onOpenChange:s,approvers:o,isLoading:u=!1,ignoreUserIds:m=[],onSubmit:v}){const[p,f]=n.useState(null),c=n.useMemo(()=>{const i=new Set(m);return o.filter(d=>!i.has(d.id))},[o,m]),h=n.useMemo(()=>c.map(i=>({value:i.id,label:i.name})),[c]),j=()=>{if(!p)return;const i=c.find(d=>d.id===p);i&&v(i)};return e.jsx(R,{open:a,onOpenChange:s,children:e.jsxs(F,{className:"sm:max-w-[450px]",children:[e.jsx(_,{children:e.jsx(M,{children:"Selecionar aprovador"})}),e.jsx(B,{isLoading:u,type:"spinner",children:e.jsx("div",{className:"space-y-4",children:e.jsx(se,{options:h,value:p??void 0,onValueChange:i=>f(typeof i=="string"?i:i?.[0]??null),placeholder:"Selecione um aprovador...",searchPlaceholder:"Buscar aprovador..."})})}),e.jsxs(U,{children:[e.jsx(x,{variant:"ghost",onClick:()=>s(!1),children:"Cancelar"}),e.jsx(x,{onClick:j,disabled:!p||u,children:"Concluir"})]})]})})}const me=130;function O(a){return a?(typeof a=="string"?new Date(a):a).toLocaleDateString("pt-BR",{day:"2-digit",month:"short",year:"numeric"}):""}function y({text:a,maxLength:s=me}){const[o,u]=n.useState(!1);return a.length<=s?e.jsx("span",{children:a}):e.jsxs("span",{children:[o?a:`${a.substring(0,s)}... `,e.jsx("button",{className:"text-primary hover:underline text-sm cursor-pointer",onClick:()=>u(!o),children:o?"Ler menos":"Ler mais"})]})}function ve({approver:a}){if(a.type===1&&a.approverId)return e.jsxs(te,{className:"h-9 w-9 shrink-0",children:[e.jsx(ne,{src:a.photoUrl,alt:a.name}),e.jsx(ie,{className:"text-xs",children:a.name?.substring(0,2).toUpperCase()})]});const s=a.type===2?le:a.type===3?pe:ce;return e.jsx("div",{className:"h-9 w-9 rounded-full bg-muted-foreground/30 flex items-center justify-center shrink-0",children:e.jsx(s,{className:"h-4 w-4 text-background"})})}function he({approver:a}){return a.date?e.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[e.jsxs("span",{className:"inline-flex items-center gap-1 text-xs rounded px-2 py-0.5 bg-green-500/10 text-foreground",children:[e.jsx(de,{className:"h-3.5 w-3.5 text-green-600"}),"Aprovado"]}),e.jsx("span",{className:"text-xs text-muted-foreground",children:O(a.date)}),a.type!==1&&a.approvedUsername&&e.jsxs("span",{className:"text-xs text-muted-foreground",children:["por ",a.approvedUsername]})]}):a.returnDate?e.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[e.jsxs("span",{className:"inline-flex items-center gap-1 text-xs rounded px-2 py-0.5 bg-red-500/10 text-foreground",children:[e.jsx(xe,{className:"h-3.5 w-3.5 text-red-600"}),"Reprovado"]}),e.jsx("span",{className:"text-xs text-muted-foreground",children:O(a.returnDate)})]}):e.jsxs("span",{className:"inline-flex items-center gap-1 text-xs rounded px-2 py-0.5 bg-muted text-muted-foreground",children:[e.jsx(ue,{className:"h-3.5 w-3.5"}),"Aguardando"]})}function fe({approver:a}){const s=a.type===1&&!a.approverId?"A definir":a.name;return e.jsxs("div",{children:[a.type===2&&e.jsx("p",{className:"text-xs text-muted-foreground",children:"Grupo de usuários"}),a.type===3&&e.jsx("p",{className:"text-xs text-muted-foreground",children:"Local"}),e.jsx("p",{className:"text-sm font-medium break-words",children:s}),e.jsx(he,{approver:a})]})}function je({config:a,isLoading:s=!1,onClose:o,onApprove:u,onDefineApprover:m,onRefreshSteps:v,availableApprovers:p=[],isLoadingApprovers:f=!1}){const[c,h]=n.useState(!1),[j,i]=n.useState(!1),[d,w]=n.useState(""),[N,C]=n.useState(""),[D,g]=n.useState(!1),[l,A]=n.useState(""),V=s||c,I=n.useCallback((r,t)=>{w(r),C(t??""),i(!0)},[]),z=n.useCallback(async r=>{if(i(!1),h(!0),!await u(a.associationId,{stepApproverId:d,...r})){I(d,r.observation),h(!1);return}o(),h(!1)},[a.associationId,d,u,o,I]),X=n.useCallback(r=>{A(r),g(!0)},[]),K=n.useCallback(async r=>{g(!1),h(!0),await m(a.associationId,l,r),await v?.(a.associationId),h(!1)},[a.associationId,l,m,v]),q=a.approvalFlowSteps.find(r=>r.isCurrentStep)?.approvers.filter(r=>r.type===1&&r.approverId).map(r=>r.approverId)??[],J=(r,t)=>a.canApprove&&r.isCurrentStep&&t.approverId&&!t.date&&t.canApprove,Q=(r,t)=>!a.flowReproved&&r.isCurrentStep&&t.type===1&&t.canApprove&&(!t.approverId||t.isToBeDefined);return e.jsxs("div",{className:"w-[550px] max-w-[900px] min-w-[400px] h-full flex flex-col bg-background",children:[e.jsxs("div",{className:"shrink-0 shadow-sm px-1 py-2 flex items-center gap-1 border-l-4",style:{borderLeftColor:a.color},children:[e.jsx(x,{variant:"ghost",size:"icon",onClick:o,className:"shrink-0",children:e.jsx(oe,{className:"h-5 w-5"})}),e.jsx("span",{className:"text-lg font-medium",children:a.title})]}),V?e.jsx(B,{isLoading:!0,type:"spinner",className:"flex-1",children:e.jsx("div",{})}):e.jsxs("div",{className:"flex-1 overflow-auto p-4 space-y-4",children:[a.approvalFlowInfo.length>0&&e.jsx("div",{className:"space-y-1",children:a.approvalFlowInfo.map((r,t)=>e.jsx("div",{className:T("flex items-center gap-1.5 text-sm",r.color&&"rounded-lg px-2 py-1"),style:r.color?{color:r.color,backgroundColor:r.backgroundColor}:void 0,children:r.title?`${r.title}: ${r.value}`:r.value},t))}),e.jsx("hr",{className:"border-border"}),a.approvalFlowSteps.map(r=>e.jsxs("div",{className:T("space-y-2",(!r.isCurrentStep||a.flowReproved)&&"opacity-50"),children:[e.jsxs("p",{className:"font-semibold text-sm",children:[r.index,". Etapa: ",r.name]}),r.description&&e.jsx("p",{className:"text-sm text-muted-foreground break-words",children:e.jsx(y,{text:r.description})}),r.returnDate&&e.jsxs("div",{className:"border-y border-border py-3 mt-3 space-y-1",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-xs rounded px-1.5 py-0.5 bg-red-500/10 text-red-600",children:"Retorno de etapa"}),e.jsxs("span",{className:"text-xs text-muted-foreground",children:[r.returnUserName," em ",O(r.returnDate)]})]}),r.returnObservation&&e.jsx("p",{className:"text-sm text-muted-foreground bg-muted rounded p-2 break-words",children:e.jsx(y,{text:r.returnObservation})})]}),r.approvers.map(t=>e.jsxs("div",{className:"p-2 space-y-1",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsxs("div",{className:"flex items-center gap-2 flex-1 min-w-0",children:[e.jsx(ve,{approver:t}),e.jsx(fe,{approver:t})]}),J(r,t)&&e.jsx(x,{size:"sm",onClick:()=>I(t.id),children:"Aprovar"}),Q(r,t)&&e.jsx(x,{size:"sm",variant:"outline",onClick:()=>X(t.id),children:"Selecionar"})]}),t.observation&&e.jsx("p",{className:"text-sm text-muted-foreground break-words ml-11",children:e.jsx(y,{text:t.observation})}),t.returnObservation&&e.jsx("p",{className:"text-sm text-muted-foreground break-words ml-11",children:e.jsx(y,{text:t.returnObservation})})]},t.id))]},r.id))]}),e.jsx($,{open:j,onOpenChange:i,returnSteps:a.returnSteps,initialObservation:N,title:a.approveDialogTitle,descriptions:a.approveDialogDescriptions,setDefaultApproverOnInit:a.approveDialogSetDefaultApproverOnInit,onSubmit:z}),e.jsx(G,{open:D,onOpenChange:g,approvers:p,isLoading:f,ignoreUserIds:q,onSubmit:K})]})}var k=(a=>(a[a.ApprovalFlow=1]="ApprovalFlow",a[a.Association=2]="Association",a))(k||{});const E={associationId:"assoc-001",title:"Aprovação - NC-2024-001",color:"hsl(var(--primary))",flowReproved:!1,canApprove:!0,returnSteps:[{id:"step-1",name:"Etapa 1 - Análise",type:k.ApprovalFlow},{id:"step-2",name:"Etapa 2 - Revisão",type:k.Association}],approveDialogTitle:"Executar ação de aprovação",approveDialogDescriptions:["Revise as informações antes de aprovar ou reprovar."],approvalFlowInfo:[{value:"NC-2024-001",icon:"file",title:"Código"},{value:"Em aprovação",icon:"clock",color:"hsl(var(--warning))",backgroundColor:"hsl(var(--warning) / 0.1)"},{value:"Processo de fabricação",icon:"settings",title:"Processo"}],approvalFlowSteps:[{id:"step-1",name:"Análise preliminar",index:1,allApprove:!1,isCurrentStep:!1,description:"Primeira análise do documento para verificar conformidade básica.",approvers:[{id:"approver-1",type:1,name:"João Silva",approverId:"user-1",canApprove:!1,hasAccess:!0,date:"2024-03-15",observation:"Documento em conformidade com os requisitos básicos. Aprovado para próxima etapa."}]},{id:"step-2",name:"Revisão técnica",index:2,allApprove:!0,isCurrentStep:!0,description:"Revisão detalhada por especialistas técnicos da área para validar as correções propostas.",approvers:[{id:"approver-2",type:1,name:"Maria Santos",approverId:"user-2",canApprove:!0,hasAccess:!0},{id:"approver-3",type:2,name:"Grupo Qualidade",approverId:"group-1",canApprove:!1,hasAccess:!0},{id:"approver-4",type:1,name:"",approverId:"",canApprove:!0,hasAccess:!0,isToBeDefined:!0}]},{id:"step-3",name:"Aprovação final",index:3,allApprove:!1,isCurrentStep:!1,approvers:[{id:"approver-5",type:3,name:"Unidade São Paulo",approverId:"place-1",canApprove:!1,hasAccess:!0}]}]},ge={...E,title:"Aprovação - NC-2024-002 (Reprovada)",flowReproved:!0,approvalFlowSteps:[{id:"step-1",name:"Análise preliminar",index:1,allApprove:!1,isCurrentStep:!0,returnDate:"2024-03-20",returnUserName:"Carlos Mendes",returnObservation:"Documentação incompleta. Necessário incluir evidências fotográficas.",approvers:[{id:"approver-1",type:1,name:"Ana Costa",approverId:"user-3",canApprove:!1,hasAccess:!0,returnDate:"2024-03-20",returnObservation:"Faltam evidências obrigatórias."}]}]},H=[{id:"user-10",name:"Pedro Oliveira",email:"pedro@example.com"},{id:"user-11",name:"Fernanda Lima",email:"fernanda@example.com"},{id:"user-12",name:"Ricardo Souza",email:"ricardo@example.com"}];function L({config:a}){const[s,o]=n.useState(!1),u=async(v,p)=>(b.success(`Ação: ${p.approved?"Aprovado":"Reprovado"} | Obs: ${p.observation}`),!0),m=async(v,p,f)=>{b.success(`Aprovador definido: ${f.name}`)};return e.jsxs("div",{children:[e.jsx(x,{onClick:()=>o(!0),variant:a.flowReproved?"destructive":"default",children:a.flowReproved?"Abrir fluxo reprovado":"Abrir fluxo de aprovação"}),e.jsx(R,{open:s,onOpenChange:o,children:e.jsx(F,{className:"p-0 max-w-[600px] h-[80vh] overflow-hidden",children:e.jsx(je,{config:a,onClose:()=>o(!1),onApprove:u,onDefineApprover:m,availableApprovers:H})})})]})}function Ae(){const[a,s]=n.useState(!1);return e.jsxs("div",{children:[e.jsx(x,{onClick:()=>s(!0),children:"Abrir dialog de aprovação"}),e.jsx($,{open:a,onOpenChange:s,returnSteps:E.returnSteps,title:"Executar ação",descriptions:["Selecione se deseja aprovar ou reprovar esta etapa."],onSubmit:o=>{b.success(`Resultado: ${o.approved?"Aprovado":"Reprovado"}`),s(!1)}})]})}function Se(){const[a,s]=n.useState(!1);return e.jsxs("div",{children:[e.jsx(x,{variant:"outline",onClick:()=>s(!0),children:"Selecionar aprovador"}),e.jsx(G,{open:a,onOpenChange:s,approvers:H,onSubmit:o=>{b.success(`Aprovador selecionado: ${o.name}`),s(!1)}})]})}function we(){return e.jsxs("div",{className:"space-y-8",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-3xl font-bold mb-2",children:"Approval Flow (Fluxo de Aprovação)"}),e.jsxs("p",{className:"text-muted-foreground",children:["Componente de fluxo de aprovação portado de ",e.jsx("code",{children:"flc-approval-sidenav"})," (v2) e ",e.jsx("code",{children:"qex-approve-sidenav"})," (v1)."]})]}),e.jsx(S,{title:"ApprovalSidenav — Fluxo normal",description:"Sidenav com etapas, aprovadores e botões de ação.",preview:e.jsx(L,{config:E}),code:`<ApprovalSidenav
2
+ config={config}
3
+ onClose={handleClose}
4
+ onApprove={handleApprove}
5
+ onDefineApprover={handleDefineApprover}
6
+ availableApprovers={approvers}
7
+ />`}),e.jsx(S,{title:"ApprovalSidenav — Fluxo reprovado",description:"Fluxo reprovado e retornado para etapa anterior.",preview:e.jsx(L,{config:ge}),code:"<ApprovalSidenav config={reprovedConfig} ... />"}),e.jsx(S,{title:"ApproveDialog",description:"Dialog isolado de aprovação/reprovação.",preview:e.jsx(Ae,{}),code:`<ApproveDialog
8
+ open={open}
9
+ onOpenChange={setOpen}
10
+ returnSteps={returnSteps}
11
+ onSubmit={handleSubmit}
12
+ />`}),e.jsx(S,{title:"SelectApproverDialog",description:"Dialog para selecionar um aprovador.",preview:e.jsx(Se,{}),code:`<SelectApproverDialog
13
+ open={open}
14
+ onOpenChange={setOpen}
15
+ approvers={approvers}
16
+ onSubmit={handleSubmit}
17
+ />`}),e.jsx(S,{title:"Importação",description:"Como usar os componentes.",preview:e.jsx("pre",{className:"bg-muted p-4 rounded text-sm overflow-x-auto",children:`import {
18
+ ApprovalSidenav,
19
+ ApproveDialog,
20
+ SelectApproverDialog,
21
+ } from 'forlogic-core';`}),code:`import {
22
+ ApprovalSidenav,
23
+ ApproveDialog,
24
+ SelectApproverDialog,
25
+ ApprovalFlowReturnStep,
26
+ } from 'forlogic-core';
27
+ import type {
28
+ ApprovalSidenavConfig,
29
+ ApproveDialogResult,
30
+ ApproverOption,
31
+ } from 'forlogic-core';`})]})}export{we as ApprovalFlowDoc};
@@ -0,0 +1,67 @@
1
+ import{j as e,eo as l,B as t,a as s,as as c,aK as d,aN as i,P as r,dB as o,a8 as n,ez as m}from"./index-DkiftrvI.js";import{C as x}from"./ComponentDocTemplate-CQbBhfvZ.js";import{S as p}from"./server-CtzFTfKR.js";import"./ExampleCard-DuLrb3t-.js";function h(){return e.jsxs("div",{className:"space-y-6",children:[e.jsx("p",{className:"text-muted-foreground",children:"O sistema de Audit Log captura automaticamente todas as operações de escrita (INSERT, UPDATE, DELETE) nas tabelas monitoradas e envia os registros para o Elasticsearch via Edge Function."}),e.jsxs("div",{className:"grid gap-4 md:grid-cols-2 lg:grid-cols-4",children:[e.jsxs(s,{className:"p-4 border-2",children:[e.jsxs("div",{className:"flex items-center gap-3 mb-2",children:[e.jsx("div",{className:"p-2 rounded-lg bg-primary/10",children:e.jsx(o,{className:"h-5 w-5 text-primary"})}),e.jsx("h4",{className:"font-semibold",children:"Triggers"})]}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Captura automática via AFTER triggers no Postgres"})]}),e.jsxs(s,{className:"p-4 border-2",children:[e.jsxs("div",{className:"flex items-center gap-3 mb-2",children:[e.jsx("div",{className:"p-2 rounded-lg bg-accent/50",children:e.jsx(n,{className:"h-5 w-5 text-accent-foreground"})}),e.jsx("h4",{className:"font-semibold",children:"Contexto JWT"})]}),e.jsxs("p",{className:"text-sm text-muted-foreground",children:["Extrai ",e.jsx("code",{children:"user_id"})," e ",e.jsx("code",{children:"alias"})," (unidade) do token"]})]}),e.jsxs(s,{className:"p-4 border-2",children:[e.jsxs("div",{className:"flex items-center gap-3 mb-2",children:[e.jsx("div",{className:"p-2 rounded-lg bg-secondary",children:e.jsx(c,{className:"h-5 w-5 text-secondary-foreground"})}),e.jsx("h4",{className:"font-semibold",children:"pg_cron"})]}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Envio em lotes a cada minuto via cron job"})]}),e.jsxs(s,{className:"p-4 border-2",children:[e.jsxs("div",{className:"flex items-center gap-3 mb-2",children:[e.jsx("div",{className:"p-2 rounded-lg bg-muted",children:e.jsx(m,{className:"h-5 w-5 text-muted-foreground"})}),e.jsx("h4",{className:"font-semibold",children:"Elasticsearch"})]}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Bulk API para indexação eficiente dos logs"})]})]})]})}function u(){return e.jsx(s,{className:"p-6 font-mono text-sm bg-muted/50",children:e.jsx("pre",{className:"whitespace-pre text-foreground",children:`[Tabela com trigger]
2
+
3
+ ▼ AFTER INSERT / UPDATE / DELETE
4
+ [common.audit_trigger_fn()] ← SECURITY DEFINER
5
+
6
+ │ Extrai user_id + alias do JWT
7
+
8
+ [common.audit_log] (shipped = false)
9
+
10
+ ▼ pg_cron (a cada 1 min)
11
+ [Edge Function: audit-ship]
12
+
13
+ │ POST /_bulk (até 500 registros)
14
+
15
+ [Elasticsearch] (índice: audit-logs)`})})}function j(){return e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full text-sm border-collapse",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b",children:[e.jsx("th",{className:"text-left py-2 px-3 font-semibold",children:"Coluna"}),e.jsx("th",{className:"text-left py-2 px-3 font-semibold",children:"Tipo"}),e.jsx("th",{className:"text-left py-2 px-3 font-semibold",children:"Descrição"})]})}),e.jsxs("tbody",{className:"divide-y",children:[e.jsxs("tr",{children:[e.jsx("td",{className:"py-2 px-3",children:e.jsx("code",{children:"id"})}),e.jsx("td",{className:"py-2 px-3",children:"uuid"}),e.jsx("td",{className:"py-2 px-3",children:"PK, gen_random_uuid()"})]}),e.jsxs("tr",{children:[e.jsx("td",{className:"py-2 px-3",children:e.jsx("code",{children:"table_schema"})}),e.jsx("td",{className:"py-2 px-3",children:"text"}),e.jsx("td",{className:"py-2 px-3",children:"Schema da tabela (ex: common)"})]}),e.jsxs("tr",{children:[e.jsx("td",{className:"py-2 px-3",children:e.jsx("code",{children:"table_name"})}),e.jsx("td",{className:"py-2 px-3",children:"text"}),e.jsx("td",{className:"py-2 px-3",children:"Nome da tabela"})]}),e.jsxs("tr",{children:[e.jsx("td",{className:"py-2 px-3",children:e.jsx("code",{children:"operation"})}),e.jsx("td",{className:"py-2 px-3",children:"text"}),e.jsx("td",{className:"py-2 px-3",children:"INSERT, UPDATE ou DELETE"})]}),e.jsxs("tr",{children:[e.jsx("td",{className:"py-2 px-3",children:e.jsx("code",{children:"old_data"})}),e.jsx("td",{className:"py-2 px-3",children:"jsonb"}),e.jsx("td",{className:"py-2 px-3",children:"Dados antes da operação (UPDATE/DELETE)"})]}),e.jsxs("tr",{children:[e.jsx("td",{className:"py-2 px-3",children:e.jsx("code",{children:"new_data"})}),e.jsx("td",{className:"py-2 px-3",children:"jsonb"}),e.jsx("td",{className:"py-2 px-3",children:"Dados após a operação (INSERT/UPDATE)"})]}),e.jsxs("tr",{children:[e.jsx("td",{className:"py-2 px-3",children:e.jsx("code",{children:"user_id"})}),e.jsx("td",{className:"py-2 px-3",children:"text"}),e.jsx("td",{className:"py-2 px-3",children:"ID do usuário (extraído do JWT)"})]}),e.jsxs("tr",{children:[e.jsx("td",{className:"py-2 px-3",children:e.jsx("code",{children:"alias"})}),e.jsx("td",{className:"py-2 px-3",children:"text"}),e.jsx("td",{className:"py-2 px-3",children:"Unidade/tenant (extraído do JWT)"})]}),e.jsxs("tr",{children:[e.jsx("td",{className:"py-2 px-3",children:e.jsx("code",{children:"created_at"})}),e.jsx("td",{className:"py-2 px-3",children:"timestamptz"}),e.jsx("td",{className:"py-2 px-3",children:"Timestamp da operação"})]}),e.jsxs("tr",{children:[e.jsx("td",{className:"py-2 px-3",children:e.jsx("code",{children:"shipped"})}),e.jsx("td",{className:"py-2 px-3",children:"boolean"}),e.jsx("td",{className:"py-2 px-3",children:"Se já foi enviado ao Elastic"})]})]})]})})}const N=[{name:"leaders",description:"Cadastro de lideranças"},{name:"admin_access",description:"Acessos administrativos"},{name:"user_management_permissions",description:"Permissões de usuários"},{name:"sign_configs",description:"Configurações de assinatura digital"},{name:"documentation",description:"Documentos e registros"}];function T(){return e.jsxs(x,{title:"Audit Log",description:"Sistema de auditoria de operações de escrita com envio automático para Elasticsearch.",usage:`-- Adicionar auditoria a qualquer tabela:
16
+ CREATE TRIGGER audit_<nome_tabela>
17
+ AFTER INSERT OR UPDATE OR DELETE ON common.<nome_tabela>
18
+ FOR EACH ROW EXECUTE FUNCTION common.audit_trigger_fn();`,tocItems:[{id:"visao-geral",label:"Visão Geral"},{id:"arquitetura",label:"Arquitetura"},{id:"schema-tabela",label:"Schema da Tabela"},{id:"tabelas-auditadas",label:"Tabelas Auditadas"},{id:"funcao-trigger",label:"Função de Trigger"},{id:"edge-function",label:"Edge Function"},{id:"pg-cron",label:"Configuração pg_cron"},{id:"adicionar-tabela",label:"Adicionar Nova Tabela"},{id:"manutencao",label:"Manutenção"}],children:[e.jsxs("section",{id:"visao-geral",className:"space-y-4 scroll-mt-8",children:[e.jsx("h2",{className:"text-2xl font-bold",children:"Visão Geral"}),e.jsx(h,{})]}),e.jsxs("section",{id:"arquitetura",className:"space-y-4 scroll-mt-8",children:[e.jsx("h2",{className:"text-2xl font-bold",children:"Arquitetura"}),e.jsx(u,{})]}),e.jsxs("section",{id:"schema-tabela",className:"space-y-4 scroll-mt-8",children:[e.jsx("h2",{className:"text-2xl font-bold",children:"Schema da Tabela: common.audit_log"}),e.jsx(j,{})]}),e.jsxs("section",{id:"tabelas-auditadas",className:"space-y-4 scroll-mt-8",children:[e.jsxs("h2",{className:"text-2xl font-bold flex items-center gap-2",children:[e.jsx(l,{className:"h-5 w-5"}),"Tabelas Auditadas"]}),e.jsx("div",{className:"grid gap-2",children:N.map(a=>e.jsxs("div",{className:"flex items-center gap-3 p-3 rounded-lg border",children:[e.jsx(t,{variant:"secondary",className:"font-mono",children:a.name}),e.jsx("span",{className:"text-sm text-muted-foreground",children:a.description})]},a.name))})]}),e.jsxs("section",{id:"funcao-trigger",className:"space-y-4 scroll-mt-8",children:[e.jsx("h2",{className:"text-2xl font-bold",children:"Função de Trigger"}),e.jsxs("p",{className:"text-sm text-muted-foreground",children:["A função ",e.jsx("code",{children:"common.audit_trigger_fn()"})," usa ",e.jsx("code",{children:"SECURITY DEFINER"})," para bypassar RLS e gravar na tabela de auditoria. Extrai automaticamente o contexto do usuário das claims do JWT."]}),e.jsx("pre",{className:"p-4 rounded-lg bg-muted text-sm overflow-x-auto font-mono",children:`CREATE OR REPLACE FUNCTION common.audit_trigger_fn()
19
+ RETURNS trigger LANGUAGE plpgsql
20
+ SECURITY DEFINER SET search_path = common
21
+ AS $$
22
+ DECLARE
23
+ _user_id text; _alias text; _claims jsonb;
24
+ BEGIN
25
+ BEGIN
26
+ _claims := current_setting('request.jwt.claims', true)::jsonb;
27
+ _user_id := _claims->>'user_id';
28
+ _alias := _claims->>'alias';
29
+ EXCEPTION WHEN OTHERS THEN
30
+ _user_id := NULL; _alias := NULL;
31
+ END;
32
+
33
+ INSERT INTO common.audit_log
34
+ (table_schema, table_name, operation, old_data, new_data, user_id, alias)
35
+ VALUES (
36
+ TG_TABLE_SCHEMA, TG_TABLE_NAME, TG_OP,
37
+ CASE WHEN TG_OP IN ('UPDATE','DELETE') THEN to_jsonb(OLD) END,
38
+ CASE WHEN TG_OP IN ('INSERT','UPDATE') THEN to_jsonb(NEW) END,
39
+ _user_id, _alias
40
+ );
41
+ RETURN COALESCE(NEW, OLD);
42
+ END;
43
+ $$;`})]}),e.jsxs("section",{id:"edge-function",className:"space-y-4 scroll-mt-8",children:[e.jsxs("h2",{className:"text-2xl font-bold flex items-center gap-2",children:[e.jsx(p,{className:"h-5 w-5"}),"Edge Function: audit-ship"]}),e.jsxs("p",{className:"text-sm text-muted-foreground",children:["Chamada a cada minuto pelo pg_cron. Busca até 500 registros não enviados, envia em bulk para o Elasticsearch e marca como ",e.jsx("code",{children:"shipped = true"}),"."]}),e.jsxs(s,{className:"p-4 space-y-3",children:[e.jsx("h4",{className:"font-semibold",children:"Secrets necessários"}),e.jsxs("div",{className:"grid gap-2",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(t,{variant:"outline",className:"font-mono",children:"ELASTIC_URL"}),e.jsx("span",{className:"text-sm text-muted-foreground",children:"URL base do Elasticsearch"})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(t,{variant:"outline",className:"font-mono",children:"ELASTIC_API_KEY"}),e.jsx("span",{className:"text-sm text-muted-foreground",children:"API Key para autenticação"})]})]})]}),e.jsxs(s,{className:"p-4 space-y-3",children:[e.jsx("h4",{className:"font-semibold",children:"Formato do documento no Elastic"}),e.jsx("pre",{className:"p-4 rounded-lg bg-muted text-sm overflow-x-auto font-mono",children:`{
44
+ "timestamp": "2026-03-22T10:00:00Z",
45
+ "schema": "common",
46
+ "table": "leaders",
47
+ "operation": "UPDATE",
48
+ "user_id": "Rd96mkiX",
49
+ "alias": "empresa-abc",
50
+ "old_data": { "name": "Antigo" },
51
+ "new_data": { "name": "Novo" }
52
+ }`})]})]}),e.jsxs("section",{id:"pg-cron",className:"space-y-4 scroll-mt-8",children:[e.jsxs("h2",{className:"text-2xl font-bold flex items-center gap-2",children:[e.jsx(c,{className:"h-5 w-5"}),"Configuração pg_cron"]}),e.jsx(d,{children:e.jsxs(i,{children:["As extensões ",e.jsx("code",{children:"pg_cron"})," e ",e.jsx("code",{children:"pg_net"})," devem estar habilitadas. O agendamento é feito via SQL Editor (não via migration)."]})}),e.jsx("pre",{className:"p-4 rounded-lg bg-muted text-sm overflow-x-auto font-mono",children:`SELECT cron.schedule(
53
+ 'ship-audit-logs',
54
+ '* * * * *',
55
+ $$
56
+ SELECT net.http_post(
57
+ url := 'https://<PROJECT_ID>.supabase.co/functions/v1/audit-ship',
58
+ headers := '{"Authorization": "Bearer <ANON_KEY>",
59
+ "Content-Type": "application/json"}'::jsonb,
60
+ body := '{}'::jsonb
61
+ ) AS request_id;
62
+ $$
63
+ );`})]}),e.jsxs("section",{id:"adicionar-tabela",className:"space-y-4 scroll-mt-8",children:[e.jsxs("h2",{className:"text-2xl font-bold flex items-center gap-2",children:[e.jsx(r,{className:"h-5 w-5"}),"Adicionar Nova Tabela"]}),e.jsx(d,{children:e.jsxs(i,{children:["A função ",e.jsx("code",{children:"common.audit_trigger_fn()"})," é genérica — basta criar uma migration com o trigger."]})}),e.jsxs(s,{className:"p-4 space-y-4",children:[e.jsx("h4",{className:"font-semibold",children:"Migration"}),e.jsx("pre",{className:"p-4 rounded-lg bg-muted text-sm overflow-x-auto font-mono",children:`CREATE TRIGGER audit_<nome_tabela>
64
+ AFTER INSERT OR UPDATE OR DELETE ON common.<nome_tabela>
65
+ FOR EACH ROW EXECUTE FUNCTION common.audit_trigger_fn();`})]}),e.jsxs(s,{className:"p-4 space-y-4",children:[e.jsxs("h4",{className:"font-semibold",children:["Exemplo: tabela ",e.jsx("code",{children:"queries"})]}),e.jsx("pre",{className:"p-4 rounded-lg bg-muted text-sm overflow-x-auto font-mono",children:`CREATE TRIGGER audit_queries
66
+ AFTER INSERT OR UPDATE OR DELETE ON common.queries
67
+ FOR EACH ROW EXECUTE FUNCTION common.audit_trigger_fn();`})]})]}),e.jsxs("section",{id:"manutencao",className:"space-y-4 scroll-mt-8",children:[e.jsx("h2",{className:"text-2xl font-bold",children:"Manutenção"}),e.jsxs("div",{className:"grid gap-3",children:[e.jsxs(s,{className:"p-4",children:[e.jsx("h4",{className:"font-semibold mb-1",children:"Retenção"}),e.jsxs("p",{className:"text-sm text-muted-foreground",children:["Registros com ",e.jsx("code",{children:"shipped = true"})," podem ser limpos periodicamente (ex: remover registros com mais de 30 dias)."]})]}),e.jsxs(s,{className:"p-4",children:[e.jsx("h4",{className:"font-semibold mb-1",children:"Performance em bulk imports"}),e.jsxs("p",{className:"text-sm text-muted-foreground",children:["Desabilite temporariamente durante importações em massa:",e.jsx("code",{className:"ml-1",children:"ALTER TABLE common.tabela DISABLE TRIGGER audit_tabela;"})]})]}),e.jsxs(s,{className:"p-4",children:[e.jsx("h4",{className:"font-semibold mb-1",children:"Operações sem JWT"}),e.jsxs("p",{className:"text-sm text-muted-foreground",children:["Operações via service_role terão ",e.jsx("code",{children:"user_id"})," e ",e.jsx("code",{children:"alias"})," como ",e.jsx("code",{children:"NULL"}),"."]})]})]})]})]})}export{T as AuditLogDoc};
@@ -0,0 +1,17 @@
1
+ import{r as i,j as e,J as A,N as $,O as z,Q as U,R as L,V as P,K as q,x as V,aO as oe,aJ as ne,$ as le,a1 as de,eH as W,F as H,dW as ie,as as ce,ew as ue,aX as me,o as B}from"./index-DkiftrvI.js";function xe({queryParams:t,events:o,softwares:r,users:s=[],permissions:a={viewAllEvents:!0,viewOnlyMyEvents:!1,download:!1},isLoading:n=!1,onFilter:x,onReset:p,onExport:c,onSoftwareChange:m}){const[u,h]=i.useState(t.softwareId),[f,b]=i.useState(t.eventId),[g,j]=i.useState(t.userId||"all"),[y,T]=i.useState(O(t.startDate)),[N,I]=i.useState(O(t.endDate)),E=i.useCallback(l=>{const w=parseInt(l);h(w),m?.(w)},[m]),R=i.useCallback(()=>{x({...t,softwareId:u,eventId:f,userId:g==="all"?void 0:g,startDate:new Date(y),endDate:new Date(N),software:r.find(l=>l.id===u)?.software||t.software,event:o.find(l=>l.id===f)?.name||t.event})},[t,u,f,g,y,N,r,o,x]),k=i.useCallback(()=>{const l=new Date;l.setHours(0,0,0,0),T(O(l)),I(O(l)),b(t.eventId),a.viewAllEvents&&j("all"),p?.()},[t.eventId,a.viewAllEvents,p]),S=a.viewOnlyMyEvents&&!a.viewAllEvents,D=u&&f&&y&&N;return e.jsxs("div",{className:"flex flex-wrap items-end gap-3 rounded-lg border border-border bg-card p-3",children:[e.jsxs("div",{className:"flex flex-col gap-1 min-w-[180px]",children:[e.jsx(A,{className:"text-xs text-muted-foreground",children:"Módulo *"}),e.jsxs($,{value:String(u),onValueChange:E,disabled:n,children:[e.jsx(z,{className:"h-8 text-xs",children:e.jsx(U,{placeholder:"Selecione..."})}),e.jsx(L,{children:r.map(l=>e.jsx(P,{value:String(l.id),className:"text-xs",children:l.translation},l.id))})]})]}),e.jsxs("div",{className:"flex flex-col gap-1 min-w-[200px]",children:[e.jsx(A,{className:"text-xs text-muted-foreground",children:"Evento *"}),e.jsxs($,{value:String(f),onValueChange:l=>b(parseInt(l)),disabled:n,children:[e.jsx(z,{className:"h-8 text-xs",children:e.jsx(U,{placeholder:"Selecione..."})}),e.jsx(L,{children:o.map(l=>e.jsx(P,{value:String(l.id),className:"text-xs",children:l.translation},l.id))})]})]}),e.jsxs("div",{className:"flex flex-col gap-1 min-w-[200px]",children:[e.jsx(A,{className:"text-xs text-muted-foreground",children:"Usuário *"}),e.jsxs($,{value:g,onValueChange:j,disabled:n||S,children:[e.jsx(z,{className:"h-8 text-xs",children:e.jsx(U,{placeholder:"Selecione..."})}),e.jsxs(L,{children:[e.jsx(P,{value:"all",className:"text-xs",children:"Todos"}),s.map(l=>e.jsx(P,{value:l.id,className:"text-xs",children:l.name},l.id))]})]})]}),e.jsxs("div",{className:"flex flex-col gap-1 min-w-[150px]",children:[e.jsx(A,{className:"text-xs text-muted-foreground",children:"De *"}),e.jsx(q,{type:"date",value:y,onChange:l=>T(l.target.value),className:"h-8 text-xs",max:N,disabled:n})]}),e.jsxs("div",{className:"flex flex-col gap-1 min-w-[150px]",children:[e.jsx(A,{className:"text-xs text-muted-foreground",children:"Até *"}),e.jsx(q,{type:"date",value:N,onChange:l=>I(l.target.value),className:"h-8 text-xs",min:y,disabled:n})]}),e.jsxs("div",{className:"flex items-center gap-2 ml-auto",children:[e.jsxs(V,{variant:"outline",size:"sm",onClick:k,disabled:n,children:[e.jsx(oe,{className:"h-3.5 w-3.5 mr-1"}),"Limpar"]}),a.download&&c&&e.jsxs(V,{variant:"outline",size:"sm",onClick:()=>c("xlsx"),disabled:n,children:[e.jsx(ne,{className:"h-3.5 w-3.5 mr-1"}),"Exportar"]}),e.jsxs(V,{size:"sm",onClick:R,disabled:n||!D,children:[e.jsx(le,{className:"h-3.5 w-3.5 mr-1"}),"Filtrar"]})]})]})}function O(t){return(t instanceof Date?t:new Date(t)).toISOString().split("T")[0]}function pe(t,o,r,s="Anônimo"){return t.map(a=>({...a,translatedSoftware:he(a.software,r),user:a.userEmail||a.userName||s,translatedEvent:fe(a.eventName,o),date:new Date(a.dateTime)})).sort((a,n)=>(n.date?.getTime()??0)-(a.date?.getTime()??0))}function fe(t,o){return o.find(s=>s.name===t)?.translation||t}function he(t,o){const r=t.includes(".")?t.split(".").pop():t;return o.find(a=>a.software===r)?.translation||r}function ge(t,o){const r=[],s={...Ne,...o?.labels},a=t.eventName;r.push({name:s.event,value:a});const n=t.entities?.[0];n&&(r.push({name:s.entityName,value:J(n)}),n.description&&r.push({name:s.description,value:n.description}),n.justification&&r.push({name:s.justification,value:n.justification}),n.statusName&&r.push({name:s.status,value:n.statusName}),n.equipmentType&&r.push({name:s.type,value:n.equipmentType}),n.extra?.length&&[...new Set(n.extra.map(c=>c.property))].forEach(c=>{const u=n.extra.filter(h=>h.property===c).map(h=>ve(h)).join(", ");r.push({name:X(c),value:u})})),t.entities?.forEach(p=>{p.data?.forEach(c=>{if(c.property==="Removed"||c.newValue===""&&!c.tagTranslate)return;const m=M(c,a,o?.translateProperty),u=_(c,null,a,s,o);u&&r.push({name:m,value:u})})}),t.entities?.forEach(p=>{if(p.association?.length){const c=p.association.filter(m=>m.id!=="").map(m=>{const u=J(m);return`(${m.softwareName||m.type}) ${u}`});c.length&&r.push({name:s.references,value:c.join(", ")})}}),n?.isElectronicSigned&&r.push({name:s.security,value:"🛡️ "+s.electronicSigned}),r.push({name:s.accomplishedBy,value:t.userName?`${t.userName} (${t.userEmail})`:t.userEmail});const x=o?.formatDate?o.formatDate(t.dateTime):Z(t.dateTime);return r.push({name:s.accomplishedIn,value:x}),r}function J(t){return t.code&&t.name&&t.code!==t.name?`${t.code} ${t.name}`:t.name||t.code||""}function ve(t){return t.value||""}function M(t,o,r){if(t.propertyCustomName)return t.propertyCustomName;const s=X(t.property);return r?r(o,s):s}function _(t,o,r,s,a){if(t.propertyResource||(t.propertyResource=o?`${o.propertyResource}.${t.property}`:t.property),t.children?.length){if(t.newValue){const x=M(t,r,a?.translateProperty),p=je(t,s);let c=`${x}: "${F(t,"newValue",s,a)}" ${p}`;const m=t.children.map(u=>(u.propertyResource=`${t.propertyResource}.${u.property}`,_(u,t,r,s,a)));return m.some(Boolean)&&(c+=`
2
+ `+m.filter(Boolean).join(`
3
+ `)),c}return t.children.map(x=>(x.propertyResource=`${t.propertyResource}.${x.property}`,_(x,t,r,s,a))).filter(Boolean).join(`
4
+ `)}if(t.property==="Removed")return"";if(t.state==="Modified"){const x=F(t,"oldValue",s,a),p=F(t,"newValue",s,a);return`${o?M(t,r,a?.translateProperty)+": ":""}${s.changedFrom} "${x}" ${s.changedTo} "${p}"`}const n=F(t,"newValue",s,a);return o?`${M(t,r,a?.translateProperty)}: ${n}`:n}function F(t,o,r,s){const a=t[o];return a==null||a===""?t.state==="Modified"||t.state==="Added"||t.state==="Unchanged"?r.uninformed:"":typeof a=="string"&&ye(a)?s?.formatDate?s.formatDate(a):Z(a):String(a)}function je(t,o){switch(t.state){case"Added":return o.stateAdded;case"Modified":return t.children?.some(r=>r.property==="Removed")?o.stateRemoved:o.stateModified;default:return""}}function X(t){return t.replace(/([A-Z])/g,(o,r,s)=>`${s>0?"-":""}${r.toLowerCase()}`)}function ye(t){if(typeof t!="string"||!/^\d{4}[-/]\d{2}[-/]\d{2}/.test(t))return!1;const o=new Date(t);return!isNaN(o.getTime())}function Z(t){try{return new Date(t).toLocaleString()}catch{return t}}const Ne={event:"Evento",entityName:"Item",description:"Descrição",justification:"Justificativa",status:"Status",type:"Tipo",references:"Referências",security:"Segurança",electronicSigned:"Assinatura Eletrônica",accomplishedBy:"Realizado por",accomplishedIn:"Realizado em",changedFrom:"de",changedTo:"para",uninformed:"Não informado",stateAdded:"(adicionado)",stateModified:"(modificado)",stateRemoved:"(removido)"};function we({documentId:t,onFetchDetails:o,onClose:r,labels:s,translateProperty:a,translatePropertyValue:n,formatDate:x}){const[p,c]=i.useState(!1),[m,u]=i.useState([]),[h,f]=i.useState(null),b=i.useCallback(async g=>{c(!0),f(null);try{const j=await o(g),y=ge(j,{translateProperty:a,translatePropertyValue:n,formatDate:x,labels:s});u(y)}catch{f("Erro ao carregar detalhes da trilha de auditoria."),u([])}finally{c(!1)}},[o,a,n,x,s]);return i.useEffect(()=>{t&&b(t)},[t,b]),t?e.jsxs("div",{className:"flex flex-col h-full bg-background",children:[e.jsxs("div",{className:"flex items-center justify-between px-4 py-3 border-b border-border bg-muted/30",children:[e.jsx("h3",{className:"text-sm font-semibold text-foreground",children:"Detalhes da Auditoria"}),e.jsx(V,{variant:"ghost",size:"icon",className:"h-7 w-7",onClick:r,children:e.jsx(de,{className:"h-4 w-4"})})]}),e.jsx("div",{className:"flex-1 overflow-y-auto",children:p?e.jsxs("div",{className:"flex items-center justify-center p-6",children:[e.jsx(W,{size:"md"}),e.jsx("span",{className:"ml-2 text-sm text-muted-foreground",children:"Carregando detalhes..."})]}):h?e.jsx("div",{className:"p-6 text-sm text-destructive",children:h}):e.jsx("table",{className:"w-full text-xs",children:e.jsx("tbody",{children:m.map((g,j)=>e.jsxs("tr",{className:j%2===0?"bg-background":"bg-muted/20",children:[e.jsx("td",{className:"px-4 py-2.5 font-semibold text-foreground whitespace-nowrap align-top w-[180px] border-b border-border/50",children:g.name}),e.jsx("td",{className:"px-4 py-2.5 text-muted-foreground break-words border-b border-border/50",children:e.jsx("span",{dangerouslySetInnerHTML:{__html:g.value.replace(/\n/g,"<br />")}})})]},j))})})})]}):null}function be({title:t="Trilha de Auditoria",softwares:o,softwareId:r,permissions:s={viewAllEvents:!0,viewOnlyMyEvents:!1,download:!1},callbacks:a,limit:n=2e3,currentUserId:x,labels:p,formatDate:c,anonymousLabel:m="Anônimo"}){const[u,h]=i.useState(!0),[f,b]=i.useState([]),[g,j]=i.useState([]),[y,T]=i.useState([]),[N,I]=i.useState(null),[E,R]=i.useState(!1),k=i.useRef(null),S=new Date;S.setHours(0,0,0,0);const[D,l]=i.useState({software:o.find(d=>d.id===r)?.software||"",softwareId:r,event:"All",eventId:1,startDate:S,endDate:S,limit:n,softwares:o,userId:s.viewOnlyMyEvents&&!s.viewAllEvents?x:void 0});i.useEffect(()=>{(async()=>{h(!0);try{const[v,C]=await Promise.all([a.onFetchEvents(D.softwareId),a.onFetchUsers?.()??Promise.resolve([])]);j(v),T(C),await w(D,v)}catch(v){console.error("Error loading audit trail:",v)}finally{h(!1)}})()},[]);const w=i.useCallback(async(d,v)=>{try{const C=await a.onFetchTrails(d),re=pe(C.data,v||g,o,m);b(re)}catch(C){console.error("Error fetching trails:",C)}},[a,g,o,m]),G=i.useCallback(async d=>{h(!0),l(d);try{await w(d)}finally{h(!1)}},[w]),Y=i.useCallback(async d=>{try{const v=await a.onFetchEvents(d);j(v)}catch(v){console.error("Error fetching events:",v)}},[a]),ee=i.useCallback(d=>{I(d.documentId),R(!0)},[]),te=i.useCallback(()=>{R(!1),I(null)},[]),se=i.useCallback(async()=>{const d={...D,startDate:S,endDate:S,eventId:1,userId:s.viewAllEvents?void 0:x};l(d),h(!0);try{await w(d)}finally{h(!1)}},[D,w]),ae=i.useCallback(d=>{a.onExport?.(d,f)},[a,f]),K=i.useCallback(d=>{try{return new Date(d).toLocaleString("pt-BR",{day:"2-digit",month:"2-digit",year:"numeric",hour:"2-digit",minute:"2-digit",second:"2-digit"})}catch{return d}},[]);return e.jsxs("div",{className:"flex flex-col h-full",children:[e.jsx("div",{className:"p-3",children:e.jsx(xe,{queryParams:D,events:g,softwares:o,users:y,permissions:s,isLoading:u,onFilter:G,onReset:se,onExport:s.download?ae:void 0,onSoftwareChange:Y})}),e.jsxs("div",{className:"flex flex-1 min-h-0 relative",children:[e.jsxs("div",{className:B("flex-1 overflow-auto transition-all duration-300",E?"mr-[400px]":""),children:[u?e.jsxs("div",{className:"flex items-center justify-center h-64",children:[e.jsx(W,{size:"md"}),e.jsx("span",{className:"ml-2 text-sm text-muted-foreground",children:"Carregando trilha de auditoria..."})]}):f.length===0?e.jsxs("div",{className:"flex flex-col items-center justify-center h-64 text-muted-foreground",children:[e.jsx(H,{className:"h-12 w-12 mb-3 opacity-30"}),e.jsx("p",{className:"text-sm",children:"Nenhum registro encontrado"}),e.jsx("p",{className:"text-xs mt-1",children:"Ajuste os filtros e tente novamente"})]}):e.jsxs("table",{className:"w-full text-xs border-collapse",children:[e.jsx("thead",{className:"sticky top-0 z-10",children:e.jsxs("tr",{className:"bg-muted/60 border-b border-border",children:[e.jsx("th",{className:"px-3 py-2 text-left font-medium text-muted-foreground",children:e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx(ie,{className:"h-3 w-3"}),"Módulo"]})}),e.jsx("th",{className:"px-3 py-2 text-left font-medium text-muted-foreground",children:e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx(ce,{className:"h-3 w-3"}),"Data"]})}),e.jsx("th",{className:"px-3 py-2 text-left font-medium text-muted-foreground",children:e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx(ue,{className:"h-3 w-3"}),"Usuário"]})}),e.jsx("th",{className:"px-3 py-2 text-left font-medium text-muted-foreground",children:e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx(H,{className:"h-3 w-3"}),"Evento"]})}),e.jsx("th",{className:"px-3 py-2 text-left font-medium text-muted-foreground",children:"Item"}),e.jsx("th",{className:"px-3 py-2 w-10"})]})}),e.jsx("tbody",{children:f.map((d,v)=>e.jsxs("tr",{onClick:()=>ee(d),className:B("cursor-pointer border-b border-border/50 transition-colors","hover:bg-accent/50",N===d.documentId&&"bg-accent",v%2===0?"bg-background":"bg-muted/10"),children:[e.jsx("td",{className:"px-3 py-2 text-foreground",children:d.translatedSoftware}),e.jsx("td",{className:"px-3 py-2 text-muted-foreground whitespace-nowrap",children:d.date?K(d.date.toISOString()):"—"}),e.jsx("td",{className:"px-3 py-2 text-foreground",children:d.user}),e.jsx("td",{className:"px-3 py-2 text-foreground",children:d.translatedEvent}),e.jsx("td",{className:"px-3 py-2 text-foreground truncate max-w-[200px]",title:d.entityName,children:d.entityName}),e.jsx("td",{className:"px-3 py-2",children:e.jsx(me,{className:"h-3.5 w-3.5 text-muted-foreground"})})]},d.documentId||v))})]}),!u&&f.length>0&&e.jsxs("div",{className:"px-3 py-2 text-xs text-muted-foreground border-t border-border bg-muted/20",children:[f.length," registro",f.length!==1?"s":""]})]}),e.jsx("div",{ref:k,className:B("fixed right-0 top-0 h-full w-[400px] border-l border-border bg-background shadow-lg z-30","transition-transform duration-300 ease-in-out",E?"translate-x-0":"translate-x-full"),children:E&&e.jsx(we,{documentId:N,onFetchDetails:a.onFetchDetails,onClose:te,labels:p,translateProperty:a.translateProperty,translatePropertyValue:a.translatePropertyValue,formatDate:c||K})})]})]})}const Se=[{id:1,name:"documents",software:"Documents",translation:"Documentos"},{id:2,name:"occurrences",software:"Occurrences",translation:"Ocorrências"},{id:3,name:"indicators",software:"Indicators",translation:"Indicadores"}],Q={1:[{id:1,name:"All",translation:"Todos",softwareId:1},{id:2,name:"Created",translation:"Criação",softwareId:1},{id:3,name:"Updated",translation:"Alteração",softwareId:1},{id:4,name:"Approved",translation:"Aprovação",softwareId:1},{id:5,name:"Deleted",translation:"Exclusão",softwareId:1}],2:[{id:1,name:"All",translation:"Todos",softwareId:2},{id:6,name:"StatusChanged",translation:"Mudança de Status",softwareId:2},{id:7,name:"Commented",translation:"Comentário",softwareId:2}],3:[{id:1,name:"All",translation:"Todos",softwareId:3},{id:8,name:"ValueUpdated",translation:"Valor Atualizado",softwareId:3}]},De=[{id:"user-1",name:"Ana Silva",email:"ana@company.com"},{id:"user-2",name:"Carlos Souza",email:"carlos@company.com"},{id:"user-3",name:"Maria Santos",email:"maria@company.com"}];function Ie(){const t=[{entity:"POP-001 Procedimento Operacional",event:"Created",user:"ana@company.com",userName:"Ana Silva"},{entity:"POP-002 Manual da Qualidade",event:"Updated",user:"carlos@company.com",userName:"Carlos Souza"},{entity:"NC-0045 Não Conformidade Fornecedor",event:"StatusChanged",user:"maria@company.com",userName:"Maria Santos"},{entity:"POP-003 Instruções de Trabalho",event:"Approved",user:"ana@company.com",userName:"Ana Silva"},{entity:"IND-012 Satisfação do Cliente",event:"ValueUpdated",user:"carlos@company.com",userName:"Carlos Souza"},{entity:"POP-001 Procedimento Operacional",event:"Updated",user:"maria@company.com",userName:"Maria Santos"},{entity:"NC-0046 Reclamação Cliente",event:"Created",user:"ana@company.com",userName:"Ana Silva"},{entity:"POP-004 Controle de Registros",event:"Deleted",user:"carlos@company.com",userName:"Carlos Souza"}],o=Date.now();return t.map((r,s)=>({documentId:`doc-${s+1}`,eventName:r.event,entityName:r.entity,entityTypeName:"Document",software:"Common.Documents",dateTime:new Date(o-s*36e5*(s+1)).toISOString(),userEmail:r.user,userName:r.userName,ip:"192.168.1."+(10+s),isMobileRequest:s%3===0,eventId:s+1,userIdentId:s+100}))}const Ee={software:"Common.Documents",dateTime:new Date().toISOString(),userId:"user-1",userName:"Ana Silva",userEmail:"ana@company.com",associationId:"assoc-1",isMobileRequest:!1,method:"POST",urlPath:"/api/documents",eventId:2,eventName:"Created",commandName:"CreateDocument",ip:"192.168.1.10",entities:[{id:"entity-1",code:"POP-001",name:"Procedimento Operacional",description:"Procedimento para controle de qualidade na linha de produção.",item:"",date:new Date,typeId:0,typeName:"Document",data:[{property:"Title",propertyCustomName:"",oldValue:"",newValue:"Procedimento Operacional",state:"Added",propertyResource:"Title"},{property:"Status",propertyCustomName:"",oldValue:"Rascunho",newValue:"Em Revisão",state:"Modified",propertyResource:"Status"},{property:"ResponsibleUser",propertyCustomName:"Responsável",oldValue:"",newValue:"Ana Silva",state:"Added",propertyResource:"ResponsibleUser"},{property:"Revision",propertyCustomName:"Revisão",oldValue:"1",newValue:"2",state:"Modified",propertyResource:"Revision",children:[{property:"RevisionDate",newValue:new Date().toISOString(),oldValue:"",state:"Added",propertyResource:"RevisionDate"},{property:"RevisionReason",newValue:"Atualização de procedimento",oldValue:"",state:"Added",propertyResource:"RevisionReason"}]}],justification:"Atualização conforme auditoria interna."}]};function Ae(){return e.jsxs("div",{className:"space-y-8",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold text-foreground",children:"Audit Trail (Trilha de Auditoria)"}),e.jsx("p",{className:"text-sm text-muted-foreground mt-1",children:"Componente completo de trilha de auditoria com lista, filtros (módulo, evento, data, usuário) e drawer lateral de detalhes com propriedades alteradas. Portado do Angular v1 (qex-audit-trail-readable) e v2 (flc-audit-trail)."})]}),e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-semibold text-foreground mb-2",children:"Uso Básico"}),e.jsx("pre",{className:"bg-muted/50 rounded-lg p-4 text-xs overflow-auto border border-border",children:`import { AuditTrailPage } from 'forlogic-core';
5
+
6
+ <AuditTrailPage
7
+ softwares={softwares}
8
+ softwareId={1}
9
+ permissions={{ viewAllEvents: true, viewOnlyMyEvents: false, download: true }}
10
+ callbacks={{
11
+ onFetchTrails: async (params) => { /* fetch from API */ },
12
+ onFetchEvents: async (softwareId) => { /* fetch events */ },
13
+ onFetchDetails: async (documentId) => { /* fetch details */ },
14
+ onFetchUsers: async () => { /* fetch users */ },
15
+ onExport: (format, data) => { /* export logic */ },
16
+ }}
17
+ />`})]}),e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-semibold text-foreground mb-2",children:"Exemplo Interativo"}),e.jsx("div",{className:"border border-border rounded-lg overflow-hidden h-[600px]",children:e.jsx(be,{softwares:Se,softwareId:1,permissions:{viewAllEvents:!0,viewOnlyMyEvents:!1,download:!0},callbacks:{onFetchTrails:async()=>({data:Ie(),totalRows:8}),onFetchEvents:async t=>Q[t]||Q[1],onFetchDetails:async()=>Ee,onFetchUsers:async()=>De,onExport:(t,o)=>{console.log(`Exporting ${o.length} records as ${t}`)}},anonymousLabel:"Anônimo"})})]}),e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-semibold text-foreground mb-2",children:"Props - AuditTrailPage"}),e.jsx("div",{className:"border border-border rounded-lg overflow-auto",children:e.jsxs("table",{className:"w-full text-xs",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"bg-muted/60 border-b border-border",children:[e.jsx("th",{className:"px-3 py-2 text-left font-medium",children:"Prop"}),e.jsx("th",{className:"px-3 py-2 text-left font-medium",children:"Tipo"}),e.jsx("th",{className:"px-3 py-2 text-left font-medium",children:"Default"}),e.jsx("th",{className:"px-3 py-2 text-left font-medium",children:"Descrição"})]})}),e.jsx("tbody",{children:[["softwares","AuditTrailSoftware[]","—","Lista de módulos/softwares disponíveis"],["softwareId","number","—","ID do software inicial selecionado"],["callbacks","AuditTrailCallbacks","—","Callbacks para fetch de dados (obrigatório)"],["permissions","AuditTrailPermissions","{viewAllEvents: true, ...}","Permissões de visualização e download"],["title","string",'"Trilha de Auditoria"',"Título da página"],["limit","number","2000","Limite de registros por consulta"],["currentUserId","string","—","ID do usuário atual (para viewOnlyMyEvents)"],["labels","AuditTrailLabels","—","Labels customizados para painel de detalhes"],["formatDate","(date: string) => string","—","Função customizada para formatação de data"],["anonymousLabel","string",'"Anônimo"',"Label para usuários sem identificação"]].map(([t,o,r,s],a)=>e.jsxs("tr",{className:a%2===0?"bg-background":"bg-muted/10",children:[e.jsx("td",{className:"px-3 py-2 font-mono text-primary",children:t}),e.jsx("td",{className:"px-3 py-2 font-mono text-muted-foreground",children:o}),e.jsx("td",{className:"px-3 py-2 text-muted-foreground",children:r}),e.jsx("td",{className:"px-3 py-2 text-foreground",children:s})]},t))})]})})]}),e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-semibold text-foreground mb-2",children:"Callbacks"}),e.jsx("div",{className:"border border-border rounded-lg overflow-auto",children:e.jsxs("table",{className:"w-full text-xs",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"bg-muted/60 border-b border-border",children:[e.jsx("th",{className:"px-3 py-2 text-left font-medium",children:"Callback"}),e.jsx("th",{className:"px-3 py-2 text-left font-medium",children:"Tipo"}),e.jsx("th",{className:"px-3 py-2 text-left font-medium",children:"Descrição"})]})}),e.jsx("tbody",{children:[["onFetchTrails","(params) => Promise<{data, totalRows}>","Busca lista de trilhas de auditoria"],["onFetchEvents","(softwareId) => Promise<Event[]>","Busca eventos disponíveis para um módulo"],["onFetchDetails","(documentId) => Promise<Details>","Busca detalhes de um registro específico"],["onFetchUsers","() => Promise<UserOption[]>","Busca opções de usuários para filtro"],["onExport","(format, data) => void","Exporta dados (csv, pdf, xlsx)"],["translateEvent","(eventName, softwareName) => string","Traduz nome do evento"],["translateSoftware","(softwareKey) => string","Traduz nome do módulo"],["translateProperty","(eventName, propResource) => string","Traduz propriedade no detalhe"]].map(([t,o,r],s)=>e.jsxs("tr",{className:s%2===0?"bg-background":"bg-muted/10",children:[e.jsx("td",{className:"px-3 py-2 font-mono text-primary",children:t}),e.jsx("td",{className:"px-3 py-2 font-mono text-muted-foreground",children:o}),e.jsx("td",{className:"px-3 py-2 text-foreground",children:r})]},t))})]})})]}),e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-semibold text-foreground mb-2",children:"Sub-componentes"}),e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-4",children:[e.jsxs("div",{className:"border border-border rounded-lg p-4",children:[e.jsx("h3",{className:"text-sm font-semibold text-foreground mb-1",children:"AuditTrailFilter"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Barra horizontal de filtros com dropdowns para módulo, evento, usuário e campos de data. Botões de Limpar, Exportar e Filtrar."})]}),e.jsxs("div",{className:"border border-border rounded-lg p-4",children:[e.jsx("h3",{className:"text-sm font-semibold text-foreground mb-1",children:"AuditTrailDetails"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Painel/drawer lateral que exibe propriedades alteradas em formato tabular: evento, item, campos modificados (de/para), realizado por/em."})]}),e.jsxs("div",{className:"border border-border rounded-lg p-4",children:[e.jsx("h3",{className:"text-sm font-semibold text-foreground mb-1",children:"AuditTrailPage"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Página completa que compõe Filter + lista + Details drawer. Recebe callbacks para integração com qualquer API backend."})]})]})]}),e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-semibold text-foreground mb-2",children:"Origem Angular"}),e.jsxs("div",{className:"bg-muted/30 rounded-lg p-4 text-xs text-muted-foreground space-y-1",children:[e.jsxs("p",{children:[e.jsx("strong",{children:"v1:"})," qex-audit-trail-readable-list + qex-audit-trail-readable-filter + qex-audit-trail-readable-details"]}),e.jsxs("p",{children:[e.jsx("strong",{children:"v2:"})," flc-audit-trail-list + flc-audit-trail-filter + flc-audit-trail-details"]}),e.jsxs("p",{children:[e.jsx("strong",{children:"Regras portadas:"})," processTrails (tradução de software/evento, sort por data desc), buildDetailRows (header/changes/associations/footer), camelToDash, isDate, getChangeTemplate (Modified/Added/children recursivo)"]})]})]})]})}export{Ae as AuditTrailDoc};
@@ -0,0 +1,200 @@
1
+ import{j as e,a,e0 as s,dn as o,B as i,x as t,aK as r,dw as n,aN as d,a8 as c,dV as l}from"./index-DkiftrvI.js";import{C as u}from"./ComponentDocTemplate-CQbBhfvZ.js";import"./ExampleCard-DuLrb3t-.js";function m(){return e.jsx("div",{className:"space-y-6",children:e.jsxs("div",{className:"grid gap-4 md:grid-cols-2 lg:grid-cols-4",children:[e.jsxs(a,{className:"p-4 border-2",children:[e.jsxs("div",{className:"flex items-center gap-3 mb-2",children:[e.jsx("div",{className:"p-2 rounded-lg bg-green-500/10",children:e.jsx(c,{className:"h-5 w-5 text-green-500"})}),e.jsx("h4",{className:"font-semibold",children:"AuthProvider"})]}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Context provider que gerencia estado de autenticação global"})]}),e.jsxs(a,{className:"p-4 border-2",children:[e.jsxs("div",{className:"flex items-center gap-3 mb-2",children:[e.jsx("div",{className:"p-2 rounded-lg bg-blue-500/10",children:e.jsx(s,{className:"h-5 w-5 text-blue-500"})}),e.jsx("h4",{className:"font-semibold",children:"ProtectedRoute"})]}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Componente que protege rotas e redireciona usuários não autenticados"})]}),e.jsxs(a,{className:"p-4 border-2",children:[e.jsxs("div",{className:"flex items-center gap-3 mb-2",children:[e.jsx("div",{className:"p-2 rounded-lg bg-orange-500/10",children:e.jsx(l,{className:"h-5 w-5 text-orange-500"})}),e.jsx("h4",{className:"font-semibold",children:"TokenManager"})]}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Gerenciador de tokens JWT com validação e refresh automático"})]}),e.jsxs(a,{className:"p-4 border-2",children:[e.jsxs("div",{className:"flex items-center gap-3 mb-2",children:[e.jsx("div",{className:"p-2 rounded-lg bg-purple-500/10",children:e.jsx(o,{className:"h-5 w-5 text-purple-500"})}),e.jsx("h4",{className:"font-semibold",children:"Multi-Tenant"})]}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Suporte a múltiplas unidades/empresas com troca dinâmica"})]})]})})}function p(){return e.jsxs(a,{className:"p-4 space-y-3",children:[e.jsx("h4",{className:"font-medium",children:"Estado de Autenticação (AuthState):"}),e.jsxs("div",{className:"text-sm space-y-2",children:[e.jsxs("div",{className:"flex justify-between py-1 border-b",children:[e.jsx("code",{className:"text-xs",children:"user"}),e.jsx("span",{className:"text-muted-foreground text-xs",children:"User | null"})]}),e.jsxs("div",{className:"flex justify-between py-1 border-b",children:[e.jsx("code",{className:"text-xs",children:"companies"}),e.jsx("span",{className:"text-muted-foreground text-xs",children:"Company[]"})]}),e.jsxs("div",{className:"flex justify-between py-1 border-b",children:[e.jsx("code",{className:"text-xs",children:"alias"}),e.jsx("span",{className:"text-muted-foreground text-xs",children:"string | null"})]}),e.jsxs("div",{className:"flex justify-between py-1 border-b",children:[e.jsx("code",{className:"text-xs",children:"isAuthenticated"}),e.jsx("span",{className:"text-muted-foreground text-xs",children:"boolean"})]}),e.jsxs("div",{className:"flex justify-between py-1 border-b",children:[e.jsx("code",{className:"text-xs",children:"isLoading"}),e.jsx("span",{className:"text-muted-foreground text-xs",children:"boolean"})]}),e.jsxs("div",{className:"flex justify-between py-1 border-b",children:[e.jsx("code",{className:"text-xs",children:"selectedUnit"}),e.jsx("span",{className:"text-muted-foreground text-xs",children:"SelectedUnit | null"})]}),e.jsxs("div",{className:"flex justify-between py-1 border-b",children:[e.jsx("code",{className:"text-xs",children:"placeId / placeName"}),e.jsx("span",{className:"text-muted-foreground text-xs",children:"string | null"})]}),e.jsxs("div",{className:"flex justify-between py-1",children:[e.jsx("code",{className:"text-xs",children:"activePlaceId / activePlaceName"}),e.jsx("span",{className:"text-muted-foreground text-xs",children:"string | null"})]})]})]})}function x(){return e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:"flex items-center justify-center w-8 h-8 rounded-full bg-primary text-primary-foreground text-sm font-medium",children:"1"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("p",{className:"font-medium text-sm",children:"Usuário acessa rota protegida"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"ProtectedRoute verifica isAuthenticated"})]})]}),e.jsx("div",{className:"w-8 border-l-2 border-dashed h-4 ml-4"}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:"flex items-center justify-center w-8 h-8 rounded-full bg-primary text-primary-foreground text-sm font-medium",children:"2"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("p",{className:"font-medium text-sm",children:"Redirecionamento para OAuth"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Dev: Token local | Prod: Qualiex OAuth"})]})]}),e.jsx("div",{className:"w-8 border-l-2 border-dashed h-4 ml-4"}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:"flex items-center justify-center w-8 h-8 rounded-full bg-primary text-primary-foreground text-sm font-medium",children:"3"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("p",{className:"font-medium text-sm",children:"Callback processa tokens"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"CallbackPage valida e armazena tokens"})]})]}),e.jsx("div",{className:"w-8 border-l-2 border-dashed h-4 ml-4"}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:"flex items-center justify-center w-8 h-8 rounded-full bg-green-500 text-white text-sm font-medium",children:"✓"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("p",{className:"font-medium text-sm",children:"Usuário autenticado"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Token Supabase gerado, dados carregados"})]})]})]})}function v(){return e.jsx(u,{title:"Autenticação (Auth)",description:"Sistema completo de autenticação OAuth integrado com Qualiex. Inclui gerenciamento de tokens, rotas protegidas, suporte multi-tenant e troca de unidades.",installation:`import {
2
+ useAuth,
3
+ AuthProvider,
4
+ ProtectedRoute,
5
+ LoginPage,
6
+ CallbackPage
7
+ } from 'forlogic-core';`,component:e.jsx(m,{}),usage:`// App.tsx - Setup básico
8
+ import { CoreProviders, ProtectedRoute } from 'forlogic-core';
9
+ import { BrowserRouter, Routes, Route } from 'react-router-dom';
10
+
11
+ function App() {
12
+ return (
13
+ <CoreProviders>
14
+ <BrowserRouter>
15
+ <Routes>
16
+ <Route path="/callback" element={<CallbackPage />} />
17
+ <Route path="/login" element={<LoginPage />} />
18
+ <Route
19
+ path="/*"
20
+ element={
21
+ <ProtectedRoute>
22
+ <MainApp />
23
+ </ProtectedRoute>
24
+ }
25
+ />
26
+ </Routes>
27
+ </BrowserRouter>
28
+ </CoreProviders>
29
+ );
30
+ }`,examples:[{title:"useAuth Hook",description:"Hook principal para acessar dados de autenticação e funções de controle.",preview:e.jsx(p,{}),code:`import { useAuth } from 'forlogic-core';
31
+
32
+ function UserProfile() {
33
+ const {
34
+ user, // Dados do usuário logado
35
+ alias, // Alias da empresa/unidade ativa
36
+ companies, // Lista de empresas disponíveis
37
+ selectedUnit, // Unidade atualmente selecionada
38
+ isAuthenticated, // true se está logado
39
+ isLoading, // true durante inicialização
40
+ logout, // Função para fazer logout
41
+ switchUnit, // Função para trocar de unidade
42
+ placeId, // ID do local do usuário
43
+ placeName, // Nome do local do usuário
44
+ } = useAuth();
45
+
46
+ if (isLoading) return <div>Carregando...</div>;
47
+ if (!isAuthenticated) return <div>Não autenticado</div>;
48
+
49
+ return (
50
+ <div>
51
+ <p>Olá, {user?.name}</p>
52
+ <p>Empresa: {selectedUnit?.name} ({alias})</p>
53
+ <p>Local: {placeName}</p>
54
+ <button onClick={logout}>Sair</button>
55
+ </div>
56
+ );
57
+ }`},{title:"Fluxo de Autenticação",description:"Sequência completa desde acesso até autenticação.",preview:e.jsx(x,{}),code:`// O fluxo é gerenciado automaticamente:
58
+
59
+ // 1. ProtectedRoute detecta usuário não autenticado
60
+ // 2. AuthService.loginProd() redireciona para Qualiex OAuth
61
+ // 3. Usuário faz login no Qualiex
62
+ // 4. Callback recebe tokens na URL
63
+ // 5. CallbackPage processa e valida tokens
64
+ // 6. AuthService.initialize() carrega dados do usuário
65
+ // 7. Token Supabase é gerado via SupabaseTokenService
66
+ // 8. Usuário é redirecionado para página original
67
+
68
+ // Em desenvolvimento, usa tokens de dev:
69
+ // AuthService.loginDev() gera token via edge function dev-tokens`},{title:"ProtectedRoute",description:"Componente que protege rotas e gerencia redirecionamentos.",preview:e.jsxs(a,{className:"p-4 space-y-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(s,{className:"h-5 w-5 text-green-500"}),e.jsx("span",{className:"font-medium",children:"Proteção Automática"})]}),e.jsxs("ul",{className:"text-sm text-muted-foreground space-y-1",children:[e.jsx("li",{children:"• Verifica isAuthenticated do AuthContext"}),e.jsx("li",{children:"• Mostra loading durante inicialização"}),e.jsx("li",{children:"• Redireciona para login se não autenticado"}),e.jsx("li",{children:"• Valida tokens periodicamente (5 min)"}),e.jsx("li",{children:"• Força logout se tokens expirarem"})]})]}),code:`import { ProtectedRoute } from 'forlogic-core';
70
+
71
+ // Proteger todas as rotas da aplicação
72
+ function App() {
73
+ return (
74
+ <Routes>
75
+ {/* Rotas públicas */}
76
+ <Route path="/login" element={<LoginPage />} />
77
+ <Route path="/callback" element={<CallbackPage />} />
78
+
79
+ {/* Rotas protegidas */}
80
+ <Route
81
+ path="/*"
82
+ element={
83
+ <ProtectedRoute>
84
+ <MainLayout>
85
+ <Routes>
86
+ <Route path="/" element={<HomePage />} />
87
+ <Route path="/settings" element={<SettingsPage />} />
88
+ </Routes>
89
+ </MainLayout>
90
+ </ProtectedRoute>
91
+ }
92
+ />
93
+ </Routes>
94
+ );
95
+ }
96
+
97
+ // ProtectedRoute mostra automaticamente:
98
+ // - Loading durante isLoading
99
+ // - Redirecionamento para OAuth se !isAuthenticated
100
+ // - Conteúdo protegido se autenticado`},{title:"Troca de Unidade (Multi-Tenant)",description:"Suporte a múltiplas empresas/unidades com troca dinâmica.",preview:e.jsxs(a,{className:"p-4 space-y-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(o,{className:"h-5 w-5 text-blue-500"}),e.jsx("span",{className:"font-medium",children:"Unidades Disponíveis:"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex items-center justify-between p-2 border rounded bg-accent/50",children:[e.jsx("span",{className:"text-sm font-medium",children:"Empresa A"}),e.jsx(i,{variant:"secondary",children:"Ativa"})]}),e.jsxs("div",{className:"flex items-center justify-between p-2 border rounded hover:bg-accent/30 cursor-pointer",children:[e.jsx("span",{className:"text-sm",children:"Empresa B"}),e.jsx(t,{size:"sm",variant:"ghost",children:"Trocar"})]})]})]}),code:`import { useAuth } from 'forlogic-core';
101
+
102
+ function UnitSelector() {
103
+ const { companies, alias, switchUnit, isLoading } = useAuth();
104
+
105
+ const handleSwitch = async (company: Company) => {
106
+ await switchUnit(company);
107
+ // Automaticamente:
108
+ // 1. Gera novo token Supabase com novo alias
109
+ // 2. Limpa cache de queries (React Query)
110
+ // 3. Atualiza placeId/placeName
111
+ // 4. Dispara re-fetch de dados
112
+ };
113
+
114
+ return (
115
+ <Select
116
+ value={alias || ''}
117
+ onValueChange={(value) => {
118
+ const company = companies.find(c => c.alias === value);
119
+ if (company) handleSwitch(company);
120
+ }}
121
+ disabled={isLoading}
122
+ >
123
+ <SelectTrigger>
124
+ <SelectValue placeholder="Selecione a unidade" />
125
+ </SelectTrigger>
126
+ <SelectContent>
127
+ {companies.map(company => (
128
+ <SelectItem key={company.id} value={company.alias}>
129
+ {company.name}
130
+ </SelectItem>
131
+ ))}
132
+ </SelectContent>
133
+ </Select>
134
+ );
135
+ }`},{title:"LoginPage",description:"Página de login pronta para uso com suporte a dev/prod.",preview:e.jsxs(a,{className:"p-6 text-center space-y-4 max-w-sm mx-auto",children:[e.jsx("h3",{className:"text-xl font-bold",children:"Acesso ao Sistema"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Faça login para acessar o sistema"}),e.jsx(t,{className:"w-full",children:"Entrar com Qualiex"})]}),code:`import { LoginPage } from 'forlogic-core';
136
+
137
+ // Uso direto - página pronta
138
+ <Route path="/login" element={<LoginPage />} />
139
+
140
+ // A LoginPage detecta automaticamente o contexto:
141
+ // - Preview Lovable / localhost: "Login Desenvolvimento" (usa dev-tokens)
142
+ // - Publicado: "Entrar com Qualiex" (OAuth)
143
+
144
+ // Para customizar, crie sua própria página:
145
+ import { AuthService, shouldUseDevTokens } from 'forlogic-core';
146
+
147
+ function CustomLoginPage() {
148
+ const handleLogin = async () => {
149
+ if (shouldUseDevTokens()) {
150
+ await AuthService.loginDev();
151
+ } else {
152
+ AuthService.loginProd();
153
+ }
154
+ };
155
+
156
+ return (
157
+ <div>
158
+ <h1>Meu Login Customizado</h1>
159
+ <Button onClick={handleLogin}>Entrar</Button>
160
+ </div>
161
+ );
162
+ }`},{title:"CallbackPage",description:"Página de callback que processa tokens OAuth.",preview:e.jsxs(a,{className:"p-6 text-center space-y-4 max-w-sm mx-auto",children:[e.jsx("div",{className:"h-8 w-8 border-4 border-primary border-t-transparent rounded-full animate-spin mx-auto"}),e.jsx("h3",{className:"font-semibold",children:"Processando Autenticação"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Processando tokens e redirecionando..."})]}),code:`import { CallbackPage } from 'forlogic-core';
163
+
164
+ // Adicionar rota para callback OAuth
165
+ <Route path="/callback" element={<CallbackPage />} />
166
+
167
+ // A CallbackPage automaticamente:
168
+ // 1. Extrai tokens da URL (query string ou hash)
169
+ // 2. Valida tokens com o AuthService
170
+ // 3. Gera token Supabase
171
+ // 4. Redireciona para página de origem (se salva)
172
+ // 5. Mostra erro com opção de retry se falhar
173
+
174
+ // A URL de callback deve ser configurada no Qualiex:
175
+ // https://seu-app.com/callback`},{title:"Detecção de Ambiente",description:"Como a lib decide qual API e método de autenticação usar.",preview:e.jsxs(r,{children:[e.jsx(n,{className:"h-4 w-4 text-green-500"}),e.jsx(d,{children:e.jsxs("div",{className:"space-y-1 text-sm",children:[e.jsx("p",{className:"font-medium",children:"Duas decisões independentes:"}),e.jsxs("code",{className:"block text-xs bg-muted p-2 rounded mt-2",children:["shouldUseDevTokens() → auth method",e.jsx("br",{}),"getEnvironmentConfig() → API URL (prod/dev)"]})]})})]}),code:`# Detecção de Ambiente
176
+
177
+ # A lib separa duas preocupações:
178
+
179
+ # 1. Método de autenticação (shouldUseDevTokens):
180
+ # - Preview Lovable (iframe) → dev-tokens
181
+ # - localhost → dev-tokens
182
+ # - Publicado → OAuth
183
+
184
+ # 2. Qual API usar (getEnvironmentConfig):
185
+ # - Supabase prod (ccjfvpnndclajkleyqkc) → API prod
186
+ # - Qualquer outro Supabase → API dev
187
+
188
+ # Variáveis Supabase são extraídas automaticamente
189
+ # de src/integrations/supabase/client.ts via vite.config.ts
190
+ # NÃO precisam estar no .env
191
+
192
+ # Exemplo de regras:
193
+ # ┌────────────────────────┬──────────┬────────────┐
194
+ # │ Cenário │ API │ Auth │
195
+ # ├────────────────────────┼──────────┼────────────┤
196
+ # │ Preview + Prod Supa │ Prod │ dev-tokens │
197
+ # │ Preview + Dev Supa │ Dev │ dev-tokens │
198
+ # │ Publicado + Prod Supa │ Prod │ OAuth │
199
+ # │ Publicado + Dev Supa │ Dev │ OAuth │
200
+ # └────────────────────────┴──────────┴────────────┘`}],props:[{name:"useAuth().user",type:"User | null",default:"null",description:"Dados do usuário autenticado."},{name:"useAuth().companies",type:"Company[]",default:"[]",description:"Lista de empresas/unidades disponíveis."},{name:"useAuth().alias",type:"string | null",default:"null",description:"Alias da empresa/unidade ativa."},{name:"useAuth().isAuthenticated",type:"boolean",default:"false",description:"Indica se usuário está autenticado."},{name:"useAuth().isLoading",type:"boolean",default:"true",description:"Indica se está inicializando."},{name:"useAuth().selectedUnit",type:"SelectedUnit | null",default:"null",description:"Unidade atualmente selecionada."},{name:"useAuth().logout",type:"() => void",default:"-",description:"Função para fazer logout."},{name:"useAuth().switchUnit",type:"(company: Company) => Promise<void>",default:"-",description:"Função para trocar de unidade."},{name:"useAuth().placeId",type:"string | null",default:"null",description:"ID do local do usuário."},{name:"useAuth().placeName",type:"string | null",default:"null",description:"Nome do local do usuário."},{name:"ProtectedRoute.children",type:"ReactNode",default:"-",description:"Conteúdo protegido a ser renderizado."}],accessibility:["Loading states são anunciados para leitores de tela.","Botões de login seguem padrões de acessibilidade.","Feedback de erro é apresentado de forma clara.","Focus management correto durante redirecionamentos."],notes:["**CoreProviders** já inclui AuthProvider - não precisa configurar separadamente.","Tokens são validados automaticamente a cada **5-10 minutos**.","Troca de unidade limpa automaticamente o cache do **React Query**.","Em **desenvolvimento**, use a edge function `dev-tokens` para gerar tokens de teste.","A URL de callback (/callback) deve estar configurada no **Qualiex OAuth**.","Locale fixo em **pt-BR** — preferências do usuário serão implementadas futuramente via API externa."]})}export{v as AuthDoc};
@@ -0,0 +1,11 @@
1
+ import{j as a,aH as t,bp as r,aI as e}from"./index-DkiftrvI.js";import{C as s}from"./ComponentDocTemplate-CQbBhfvZ.js";import"./ExampleCard-DuLrb3t-.js";function n(){return a.jsx(s,{title:"Avatar",description:"Um elemento de imagem com fallback para representar o usuário.",component:a.jsxs("div",{className:"flex gap-4 items-center",children:[a.jsxs(t,{children:[a.jsx(r,{src:"https://github.com/shadcn.png",alt:"@shadcn"}),a.jsx(e,{children:"CN"})]}),a.jsx(t,{children:a.jsx(e,{children:"JD"})})]}),usage:`import { Avatar, AvatarImage, AvatarFallback } from "forlogic-core"
2
+
3
+ <Avatar>
4
+ <AvatarImage src="https://github.com/shadcn.png" alt="@shadcn" />
5
+ <AvatarFallback>CN</AvatarFallback>
6
+ </Avatar>`,examples:[{title:"Com Imagem",preview:a.jsxs(t,{children:[a.jsx(r,{src:"https://github.com/shadcn.png",alt:"User"}),a.jsx(e,{children:"CN"})]}),code:`<Avatar>
7
+ <AvatarImage src="..." />
8
+ <AvatarFallback>CN</AvatarFallback>
9
+ </Avatar>`},{title:"Apenas Fallback",preview:a.jsx(t,{children:a.jsx(e,{children:"JD"})}),code:`<Avatar>
10
+ <AvatarFallback>JD</AvatarFallback>
11
+ </Avatar>`}],props:[{name:"src",type:"string",default:"-",description:"A URL da fonte da imagem (AvatarImage)."},{name:"alt",type:"string",default:"-",description:"Texto alternativo para a imagem (AvatarImage)."}],accessibility:["Texto alternativo adequado para imagens","Fallback garante que o conteúdo seja sempre exibido","Estrutura HTML semântica"]})}export{n as AvatarDoc};
@@ -0,0 +1,36 @@
1
+ import{j as a,B as e}from"./index-DkiftrvI.js";import{C as n}from"./ComponentDocTemplate-CQbBhfvZ.js";import"./ExampleCard-DuLrb3t-.js";function d(){return a.jsx(n,{title:"Badge",description:"Exibe um badge ou um componente que se parece com um badge.",component:a.jsxs("div",{className:"flex flex-wrap gap-2",children:[a.jsx(e,{children:"Default"}),a.jsx(e,{variant:"secondary",children:"Secondary"}),a.jsx(e,{variant:"info",children:"Info"}),a.jsx(e,{variant:"success",children:"Success"}),a.jsx(e,{variant:"warning",children:"Warning"}),a.jsx(e,{variant:"danger",children:"Danger"}),a.jsx(e,{variant:"outline",children:"Outline"}),a.jsx(e,{variant:"sharp",children:"Sharp"})]}),usage:`import { Badge } from "forlogic-core"
2
+
3
+ <Badge>Badge</Badge>
4
+ <Badge variant="secondary">Secondary</Badge>
5
+ <Badge variant="info">Info</Badge>
6
+ <Badge variant="success">Success</Badge>
7
+ <Badge variant="warning">Warning</Badge>
8
+ <Badge variant="danger">Danger</Badge>
9
+ <Badge variant="outline">Outline</Badge>
10
+ <Badge variant="sharp">Sharp</Badge>`,examples:[{title:"Todas as Variantes",preview:a.jsxs("div",{className:"flex flex-wrap gap-2",children:[a.jsx(e,{children:"Default"}),a.jsx(e,{variant:"secondary",children:"Secondary"}),a.jsx(e,{variant:"info",children:"Info"}),a.jsx(e,{variant:"success",children:"Success"}),a.jsx(e,{variant:"warning",children:"Warning"}),a.jsx(e,{variant:"danger",children:"Danger"}),a.jsx(e,{variant:"outline",children:"Outline"}),a.jsx(e,{variant:"sharp",children:"Sharp"})]}),code:`<Badge>Default</Badge>
11
+ <Badge variant="secondary">Secondary</Badge>
12
+ <Badge variant="info">Info</Badge>
13
+ <Badge variant="success">Success</Badge>
14
+ <Badge variant="warning">Warning</Badge>
15
+ <Badge variant="danger">Danger</Badge>
16
+ <Badge variant="outline">Outline</Badge>
17
+ <Badge variant="sharp">Sharp</Badge>`},{title:"Variantes Semânticas",preview:a.jsxs("div",{className:"flex flex-wrap gap-2",children:[a.jsx(e,{variant:"info",children:"Informativo"}),a.jsx(e,{variant:"success",children:"Aprovado"}),a.jsx(e,{variant:"warning",children:"Pendente"}),a.jsx(e,{variant:"danger",children:"Rejeitado"})]}),code:`<Badge variant="info">Informativo</Badge>
18
+ <Badge variant="success">Aprovado</Badge>
19
+ <Badge variant="warning">Pendente</Badge>
20
+ <Badge variant="danger">Rejeitado</Badge>`},{title:"Casos de Uso - Status",preview:a.jsxs("div",{className:"flex flex-wrap gap-2",children:[a.jsx(e,{variant:"success",children:"Active"}),a.jsx(e,{variant:"warning",children:"Pending"}),a.jsx(e,{variant:"danger",children:"Inactive"}),a.jsx(e,{variant:"info",children:"Processing"})]}),code:`<Badge variant="success">Active</Badge>
21
+ <Badge variant="warning">Pending</Badge>
22
+ <Badge variant="danger">Inactive</Badge>
23
+ <Badge variant="info">Processing</Badge>`},{title:"Casos de Uso - Contadores",preview:a.jsxs("div",{className:"flex flex-wrap gap-4 items-center",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("span",{className:"text-sm",children:"Inbox"}),a.jsx(e,{variant:"secondary",children:"12"})]}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("span",{className:"text-sm",children:"Notifications"}),a.jsx(e,{variant:"danger",children:"3"})]}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("span",{className:"text-sm",children:"Updates"}),a.jsx(e,{variant:"info",children:"New"})]})]}),code:`<div className="flex items-center gap-2">
24
+ <span>Inbox</span>
25
+ <Badge variant="secondary">12</Badge>
26
+ </div>
27
+ <div className="flex items-center gap-2">
28
+ <span>Notifications</span>
29
+ <Badge variant="danger">3</Badge>
30
+ </div>
31
+ <div className="flex items-center gap-2">
32
+ <span>Updates</span>
33
+ <Badge variant="info">New</Badge>
34
+ </div>`},{title:"Casos de Uso - Tags",preview:a.jsxs("div",{className:"flex flex-wrap gap-2",children:[a.jsx(e,{variant:"outline",children:"React"}),a.jsx(e,{variant:"outline",children:"TypeScript"}),a.jsx(e,{variant:"outline",children:"Tailwind CSS"}),a.jsx(e,{variant:"outline",children:"Supabase"})]}),code:`<Badge variant="outline">React</Badge>
35
+ <Badge variant="outline">TypeScript</Badge>
36
+ <Badge variant="outline">Tailwind CSS</Badge>`}],props:[{name:"variant",type:'"default" | "secondary" | "info" | "success" | "warning" | "danger" | "outline" | "sharp"',default:'"default"',description:"O estilo visual do badge."}],accessibility:["HTML semântico com taxas de contraste adequadas","Funciona com leitores de tela","Pode ser tornado interativo com labels ARIA adequadas se necessário"]})}export{d as BadgeDoc};