forlogic-core 2.0.4 → 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.
- package/.note/memory/features/crud-defaults-batteries-included.md +1 -1
- package/dist/components/ui/dialog-wizard.d.ts +82 -0
- package/dist/components/ui/input-group.d.ts +1 -1
- package/dist/components/ui/input.d.ts +5 -23
- package/dist/components/ui/resizable.d.ts +1 -1
- package/dist/components/ui/sidebar.d.ts +1 -1
- package/dist/components/ui/step-selector.d.ts +11 -9
- package/dist/components/ui/textarea.d.ts +1 -0
- package/dist/crud/components/CrudTable.d.ts +3 -1
- package/dist/crud/createCrudPage.d.ts +2 -0
- package/dist/crud/hooks/useColumnManager.d.ts +3 -1
- package/dist/exports/ui.d.ts +1 -0
- package/dist/index.css +1 -1
- package/dist/index.css.map +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/index.js +1 -1
- package/dist/types.d.ts +3 -0
- package/docs/design-system/README.md +2 -2
- package/docs/design-system/buttons-actions.md +6 -0
- package/docs/design-system/domain.md +10 -0
- package/docs/design-system/inputs.md +20 -0
- package/docs/design-system/navigation.md +5 -0
- package/docs/design-system/notifications-feedback.md +2 -0
- package/package.json +1 -1
- package/dist/assets/AccordionDoc-CGNlubG3.js +0 -31
- package/dist/assets/ActionButtonDoc-CYtkXR0k.js +0 -47
- package/dist/assets/ActionPlanDoc-BSuPRftQ.js +0 -65
- package/dist/assets/AlertDoc-Cpvxneqg.js +0 -37
- package/dist/assets/AliasUrlDoc-DIpUWf4Y.js +0 -189
- package/dist/assets/AppHeaderDoc-DNQErj_t.js +0 -74
- package/dist/assets/AppSidebarDoc-DkeQarDu.js +0 -221
- package/dist/assets/ApprovalFlowDoc-8YgXbhKJ.js +0 -31
- package/dist/assets/AuditLogDoc-BBvNcHIo.js +0 -67
- package/dist/assets/AuditTrailDoc-DgFHO-uo.js +0 -17
- package/dist/assets/AuthDoc-WIA_Aetl.js +0 -200
- package/dist/assets/AvatarDoc-B6go1C1T.js +0 -11
- package/dist/assets/BadgeDoc-BONhfqB_.js +0 -36
- package/dist/assets/BaseFormDoc-CuyUArcj.js +0 -169
- package/dist/assets/BodyContentDoc-CterHC1E.js +0 -83
- package/dist/assets/BreadcrumbDoc-Dwn9nLeO.js +0 -75
- package/dist/assets/ButtonDoc-BOjRseZT.js +0 -41
- package/dist/assets/ButtonGroupDoc-8IS6PPh4.js +0 -7
- package/dist/assets/CalendarDoc-CMwIEqgT.js +0 -81
- package/dist/assets/CardDoc-BZz1CVg2.js +0 -49
- package/dist/assets/ChartDoc-B5vZVtqD.js +0 -76
- package/dist/assets/CheckboxDoc-lAbYO9I5.js +0 -55
- package/dist/assets/ColorPickerDoc-Dpsprp4N.js +0 -10
- package/dist/assets/ColorsFoundationDoc-CCHeSL3p.js +0 -13
- package/dist/assets/ComboTreeDoc-D4dTkIt-.js +0 -46
- package/dist/assets/ComboboxDoc-CqqZPvZq.js +0 -134
- package/dist/assets/ComponentDocTemplate-CQbBhfvZ.js +0 -1
- package/dist/assets/ContextMenuDoc-D3jC-MVA.js +0 -182
- package/dist/assets/ContextsDoc-XFH0-JdS.js +0 -211
- package/dist/assets/CreateCrudPageDoc-CpuiWI-g.js +0 -106
- package/dist/assets/CrudActionBarDoc-wuBGXD9Y.js +0 -112
- package/dist/assets/CrudGridDoc-BYWqSXBH.js +0 -85
- package/dist/assets/CrudOverviewDoc-B_bk2a2t.js +0 -14
- package/dist/assets/CrudPrimitivesDoc-CxaTB94A.js +0 -164
- package/dist/assets/CrudTableDoc-Dga1VgCu.js +0 -113
- package/dist/assets/CustomFormFieldsDoc-C1hwwSl3.js +0 -33
- package/dist/assets/DashboardFormDoc-BUDCmrMl.js +0 -49
- package/dist/assets/DashboardGeneralViewDoc-Cyg1SIiG.js +0 -71
- package/dist/assets/DashboardGridDoc-BavePiRF.js +0 -49
- package/dist/assets/DashboardListDoc-CLyMA6UK.js +0 -37
- package/dist/assets/DashboardOverviewDoc-DRVvNIF1.js +0 -35
- package/dist/assets/DashboardPanelRendererDoc--mfwb8Nc.js +0 -60
- package/dist/assets/DashboardPanelsBasicDoc-BQ2V_52D.js +0 -62
- package/dist/assets/DashboardPanelsCartesianDoc-sy-hcVQY.js +0 -75
- package/dist/assets/DashboardPanelsSpecialDoc-DsIUCRRP.js +0 -83
- package/dist/assets/DashboardViewDoc-CtlCNlEF.js +0 -45
- package/dist/assets/DataListDoc-DUy88lCQ.js +0 -13
- package/dist/assets/DesignSystemHome-DHl9YtbH.js +0 -1
- package/dist/assets/DialogDoc-CMQqnTV-.js +0 -981
- package/dist/assets/DropdownMenuDoc-S7X9csGt.js +0 -175
- package/dist/assets/ElectronicSignatureDialogDoc-BfithaL_.js +0 -57
- package/dist/assets/EmptyStateDoc-CHGCiGIk.js +0 -35
- package/dist/assets/EnvironmentsDoc-DZHJZ2nm.js +0 -96
- package/dist/assets/ErrorBoundaryDoc-DoaAg68p.js +0 -111
- package/dist/assets/ExampleActionPlanPage-C0fIMZCD.js +0 -1
- package/dist/assets/ExampleAppDoc-DzIU81Fn.js +0 -1
- package/dist/assets/ExampleCard-DuLrb3t-.js +0 -1
- package/dist/assets/ExampleCrudReportsPage-M0pz6tdM.js +0 -1
- package/dist/assets/ExampleDashboardPage-CRG5r3Vw.js +0 -1
- package/dist/assets/ExampleIdeasPage-I84ZMLY4.js +0 -1
- package/dist/assets/ExampleImportWizardPage-h4YqrrSe.js +0 -1
- package/dist/assets/ExampleSettingsPage-CwdWqoaP.js +0 -1
- package/dist/assets/FileUploadDoc-9-UujFNX.js +0 -34
- package/dist/assets/FilterBar-DDTqqUfZ.js +0 -1
- package/dist/assets/FormDoc-CVES6n3d.js +0 -81
- package/dist/assets/FoundationOverview-DT0u11Gz.js +0 -1
- package/dist/assets/GridDoc-CbHFSILF.js +0 -28
- package/dist/assets/HooksDoc-Ctxdk6Wq.js +0 -665
- package/dist/assets/HoverCardDoc-8Wkaafdj.js +0 -31
- package/dist/assets/I18nDoc-D3Q2m7ik.js +0 -167
- package/dist/assets/IconPickerDoc-DZ26Gdpg.js +0 -10
- package/dist/assets/IconsFoundationDoc-xOxtC7CW.js +0 -33
- package/dist/assets/InputDoc-BhztAiuJ.js +0 -211
- package/dist/assets/LabelDoc-A4hmTRRV.js +0 -42
- package/dist/assets/LeadershipDoc-CqOSfWsP.js +0 -452
- package/dist/assets/MediaDoc-C78gvC8p.js +0 -459
- package/dist/assets/MenubarDoc-DCnmd2tO.js +0 -165
- package/dist/assets/ModuleAccessDoc-CmD5nHDp.js +0 -153
- package/dist/assets/ModulesDialogDoc-DVit1CA-.js +0 -46
- package/dist/assets/MultiselectPermissionsDoc-tlJMs04L.js +0 -34
- package/dist/assets/NavigationMenuDoc-q1fbc89j.js +0 -116
- package/dist/assets/OnboardingDialogDoc-3A3eBYrq.js +0 -55
- package/dist/assets/PaginationDoc-B8-bMz5J.js +0 -27
- package/dist/assets/PaginationDoc-BkGdxHL3.js +0 -98
- package/dist/assets/PlacesDoc-CKPO6ATs.js +0 -226
- package/dist/assets/PopoverDoc-CJPU4Ags.js +0 -64
- package/dist/assets/ProgressDoc-CpjbTL4o.js +0 -29
- package/dist/assets/QualiexUserFieldDoc-DDwumlRw.js +0 -149
- package/dist/assets/RadioGroupDoc-D6tSZz8G.js +0 -57
- package/dist/assets/RadiusDoc-B4xSnajw.js +0 -7
- package/dist/assets/ReportRequestListDoc-C0LIaU8P.js +0 -15
- package/dist/assets/RequiredFieldsCounterDoc-COesoSdx.js +0 -58
- package/dist/assets/ResizableDoc-CW0-XQuB.js +0 -104
- package/dist/assets/RichTextEditorDoc-C8c_XA9P.js +0 -24
- package/dist/assets/ScrollAreaDoc-BxtoAPaZ.js +0 -28
- package/dist/assets/SecurityDoc-wOVqpg2F.js +0 -204
- package/dist/assets/SelectDoc-C75gtY9D.js +0 -80
- package/dist/assets/SeparatorDoc-BjQBPB1P.js +0 -4
- package/dist/assets/ServicesDoc-CXTctwBl.js +0 -308
- package/dist/assets/ShadowsDoc-C6Lw8_x2.js +0 -9
- package/dist/assets/SignDoc-Bh5ZUg5x.js +0 -66
- package/dist/assets/SkeletonDoc-rTLGK5VE.js +0 -54
- package/dist/assets/SliderDoc-JMAMDub7.js +0 -41
- package/dist/assets/SpacingDoc-RljOrpwA.js +0 -12
- package/dist/assets/SplitButtonDoc-CvShUW3w.js +0 -53
- package/dist/assets/StepSelectorDoc-C-nAap9H.js +0 -41
- package/dist/assets/SwitchDoc-DLnqmkPr.js +0 -56
- package/dist/assets/TableDoc-B8EpWLVg.js +0 -128
- package/dist/assets/TabsDoc-DIBtl_uC.js +0 -42
- package/dist/assets/TeamSelectorDoc-B7OnCbL7.js +0 -10
- package/dist/assets/TermsOfUseDoc-Bb-pw08s.js +0 -16
- package/dist/assets/TextareaDoc-DGnqMqEC.js +0 -46
- package/dist/assets/ToastDoc-DjYyc7ae.js +0 -157
- package/dist/assets/ToggleDoc-C9ZOVjkY.js +0 -51
- package/dist/assets/TooltipDoc-BEx4l9-i.js +0 -58
- package/dist/assets/TruncatedCellDoc-BbV1bRSY.js +0 -12
- package/dist/assets/TypographyFoundationDoc-CUDYjRo9.js +0 -7
- package/dist/assets/UpdatesNotificationDoc-7nyjzLMJ.js +0 -29
- package/dist/assets/UsersGroupsSelectorDoc-C0KlTAL5.js +0 -18
- package/dist/assets/UtilitiesDoc-DGxaHVV1.js +0 -145
- package/dist/assets/ViewerDialogsDoc-CnTPTEz0.js +0 -1
- package/dist/assets/blocks-B6LrJeAM.js +0 -1
- package/dist/assets/building-DeVappnD.js +0 -1
- package/dist/assets/calendar-days-BQ0na5kM.js +0 -1
- package/dist/assets/check-check-C_-PJCJa.js +0 -1
- package/dist/assets/circle-plus-CpIcep-O.js +0 -1
- package/dist/assets/circle-x-jPpBPew0.js +0 -1
- package/dist/assets/clipboard-list-CXNPdciZ.js +0 -1
- package/dist/assets/cloud-upload-BEjzumjl.js +0 -1
- package/dist/assets/crown-CqNsQIsm.js +0 -1
- package/dist/assets/date-picker-BW3eGOe_.js +0 -1
- package/dist/assets/disabled-menu-item-C2YaMvSt.js +0 -1
- package/dist/assets/drawer-D5rflIcD.js +0 -3
- package/dist/assets/file-braces-DFb5X9so.js +0 -1
- package/dist/assets/file-pen-line-CyUGKkEN.js +0 -1
- package/dist/assets/git-branch-BcXv9mpp.js +0 -1
- package/dist/assets/globe-CpMIWAcv.js +0 -1
- package/dist/assets/hash-cQWdKjya.js +0 -1
- package/dist/assets/hourglass-BahQ3eDv.js +0 -1
- package/dist/assets/hover-card-R66N85sZ.js +0 -1
- package/dist/assets/iframe-dialog-V0mW5aBb.js +0 -1
- package/dist/assets/index-DkiftrvI.js +0 -352
- package/dist/assets/index-nmBjO9Th.css +0 -1
- package/dist/assets/life-buoy-ByXiPddz.js +0 -1
- package/dist/assets/loading-state-Cb5_t5uE.js +0 -1
- package/dist/assets/lucide-react-Cp3Yw3Zm.js +0 -1
- package/dist/assets/package-B3-pVvPM.js +0 -1
- package/dist/assets/pen-Bi_lmmKT.js +0 -1
- package/dist/assets/pin-DVsSl8QA.js +0 -1
- package/dist/assets/printer-BnJ8B6m-.js +0 -1
- package/dist/assets/radio-group-BHAaNGsm.js +0 -1
- package/dist/assets/server-CtzFTfKR.js +0 -1
- package/dist/assets/share-2-Dv8Do445.js +0 -1
- package/dist/assets/shield-check-CFXjOV_w.js +0 -1
- package/dist/assets/shield-x-DJTRfVux.js +0 -1
- package/dist/assets/slider-v9tXBSnB.js +0 -1
- package/dist/assets/smartphone-BSNR60L7.js +0 -1
- package/dist/assets/step-selector-ATTh_9Wa.js +0 -1
- package/dist/assets/text-align-start-qE-MbYYw.js +0 -1
- package/dist/assets/thumbs-up-D_XIW_uX.js +0 -1
- package/dist/assets/trash-DTWQwpwA.js +0 -1
- package/dist/assets/trending-up-jip5-leJ.js +0 -1
- package/dist/assets/useMockCrud-CN4vjyOZ.js +0 -1
- package/dist/assets/user-check-BlH3EDWK.js +0 -1
- package/dist/assets/user-plus-BqwXwD-c.js +0 -1
- package/dist/index.html +0 -33
|
@@ -1,31 +0,0 @@
|
|
|
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};
|
|
@@ -1,67 +0,0 @@
|
|
|
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};
|
|
@@ -1,17 +0,0 @@
|
|
|
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};
|
|
@@ -1,200 +0,0 @@
|
|
|
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};
|
|
@@ -1,11 +0,0 @@
|
|
|
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};
|
|
@@ -1,36 +0,0 @@
|
|
|
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};
|