forlogic-core 2.3.1 → 2.3.3
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/dist/action-plans/auth/services/AuthService.d.ts +19 -0
- package/dist/action-plans/exports/ui.d.ts +2 -0
- package/dist/action-plans/i18n/LanguageBootstrap.d.ts +14 -0
- package/dist/action-plans/i18n/index.d.ts +1 -0
- package/dist/action-plans/index.esm.js +1 -1
- package/dist/action-plans/index.js +1 -1
- package/dist/audit-trail/auth/services/AuthService.d.ts +19 -0
- package/dist/audit-trail/exports/ui.d.ts +2 -0
- package/dist/audit-trail/i18n/LanguageBootstrap.d.ts +14 -0
- package/dist/audit-trail/i18n/index.d.ts +1 -0
- package/dist/audit-trail/index.esm.js +1 -1
- package/dist/audit-trail/index.js +1 -1
- package/dist/auth/services/AuthService.d.ts +19 -0
- package/dist/exports/ui.d.ts +2 -0
- package/dist/i18n/LanguageBootstrap.d.ts +14 -0
- package/dist/i18n/index.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/leadership/auth/services/AuthService.d.ts +19 -0
- package/dist/leadership/exports/ui.d.ts +2 -0
- package/dist/leadership/i18n/LanguageBootstrap.d.ts +14 -0
- package/dist/leadership/i18n/index.d.ts +1 -0
- package/dist/leadership/index.esm.js +1 -1
- package/dist/leadership/index.js +1 -1
- package/dist/places/auth/services/AuthService.d.ts +19 -0
- package/dist/places/exports/ui.d.ts +2 -0
- package/dist/places/i18n/LanguageBootstrap.d.ts +14 -0
- package/dist/places/i18n/index.d.ts +1 -0
- package/dist/places/index.esm.js +1 -1
- package/dist/places/index.js +1 -1
- package/dist/sign/auth/services/AuthService.d.ts +19 -0
- package/dist/sign/exports/ui.d.ts +2 -0
- package/dist/sign/i18n/LanguageBootstrap.d.ts +14 -0
- package/dist/sign/i18n/index.d.ts +1 -0
- package/dist/sign/index.esm.js +1 -1
- package/dist/sign/index.js +1 -1
- package/package.json +1 -1
|
@@ -42,4 +42,23 @@ export declare class AuthService {
|
|
|
42
42
|
* Extrai alias do access token (campo default)
|
|
43
43
|
*/
|
|
44
44
|
private static extractAliasFromAccessToken;
|
|
45
|
+
/**
|
|
46
|
+
* Detecta o alias a partir do subdomínio da URL atual.
|
|
47
|
+
*
|
|
48
|
+
* Padrões reconhecidos:
|
|
49
|
+
* - `educacao.sabergestao.com.br` → "sabergestao"
|
|
50
|
+
* - `<modulo>.<alias>.<tld>` → alias
|
|
51
|
+
* - `<alias>.qualiex.com` → alias
|
|
52
|
+
* - localhost / *.lovable.app / *.lovable.dev → null
|
|
53
|
+
*/
|
|
54
|
+
private static getSubdomainAlias;
|
|
55
|
+
/**
|
|
56
|
+
* Resolve o alias ativo seguindo prioridade:
|
|
57
|
+
* 1. Subdomínio da URL (se válido contra companies)
|
|
58
|
+
* 2. Alias do Supabase token (se válido)
|
|
59
|
+
* 3. Alias armazenado (se válido)
|
|
60
|
+
* 4. `default` do access token (se válido)
|
|
61
|
+
* 5. Primeira company
|
|
62
|
+
*/
|
|
63
|
+
private static resolveAliasFromContext;
|
|
45
64
|
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Componente interno (renderiza `null`) que aplica automaticamente o idioma
|
|
3
|
+
* do usuário ao i18next assim que `useModuleAccess` resolver a associação atual.
|
|
4
|
+
*
|
|
5
|
+
* - Fonte de verdade: `association.language` (vindo de `/users/{userId}/associations`).
|
|
6
|
+
* - Não persiste em `localStorage` — o React-Query já cacheia o resultado e o
|
|
7
|
+
* próximo boot refaz a chamada para revalidar.
|
|
8
|
+
* - Reage a `switchUnit`: ao trocar de unidade, useModuleAccess refaz a query
|
|
9
|
+
* e o efeito reaplica o idioma da nova associação.
|
|
10
|
+
*
|
|
11
|
+
* Para que funcione, deve ser montado dentro do `AuthProvider`, `LocaleProvider`
|
|
12
|
+
* e `ModuleProvider`. `CoreProviders` já cuida disso.
|
|
13
|
+
*/
|
|
14
|
+
export declare function LanguageBootstrap(): any;
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* Import this instead of importing directly from react-i18next.
|
|
6
6
|
*/
|
|
7
7
|
export { default as i18n, addAppTranslations } from './config';
|
|
8
|
+
export { LanguageBootstrap } from './LanguageBootstrap';
|
|
8
9
|
export { useTranslation } from 'react-i18next';
|
|
9
10
|
export { I18nextProvider } from 'react-i18next';
|
|
10
11
|
export { mergeTranslationFiles } from './utils';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import e from"i18next";import*as a from"react";import r,{createContext as t,useContext as s,useMemo as o,useState as n,useRef as i,useCallback as l,useEffect as d}from"react";import{useQuery as c,useQueryClient as u,useMutation as m}from"@tanstack/react-query";import{jsx as h,jsxs as p,Fragment as f}from"react/jsx-runtime";import{createClient as g}from"@supabase/supabase-js";import{toast as y}from"sonner";import{useTranslation as v}from"react-i18next";import{Check as w,User as x,ArrowUpToLine as b,ChevronDown as _,ChevronRight as N,X as k,ChevronUp as S,Loader2 as E,Trash2 as I,Mail as A,Plus as T,Users as C,Pencil as D,UserPlus as P}from"lucide-react";import{Slot as U}from"@radix-ui/react-slot";import{cva as R}from"class-variance-authority";import{clsx as V}from"clsx";import{twMerge as L}from"tailwind-merge";import"date-fns";import*as O from"@radix-ui/react-checkbox";import*as z from"@radix-ui/react-hover-card";import*as j from"@radix-ui/react-dialog";import*as q from"@radix-ui/react-separator";import*as B from"@radix-ui/react-alert-dialog";import{z as M}from"zod";import{appendErrors as $,useForm as W}from"react-hook-form";import{validateFieldsNatively as H,toNestErrors as K}from"@hookform/resolvers";import*as J from"@radix-ui/react-label";import*as F from"@radix-ui/react-scroll-area";import*as Q from"@radix-ui/react-select";function Y(e,a){const r=e.map(e=>({...e})),t=new Set(r.filter(e=>!a.has(e.id_user)).map(e=>e.id_user));return r.forEach(e=>{if(e.id_leader&&t.has(e.id_leader)){let a=e.id_leader;for(;a&&t.has(a);){const e=r.find(e=>e.id_user===a);a=e?.id_leader||null}e.id_leader=a}}),r.filter(e=>a.has(e.id_user))}function G(e){const a=new Map,r=new Map,t=[];e.forEach(e=>{const t={...e,children:[],level:0};a.set(e.id,t),r.set(e.id_user,t)}),e.forEach(e=>{const s=a.get(e.id);if(e.id_leader){const a=r.get(e.id_leader);if(a)return void a.children.push(s)}t.push(s)});const s=(e,a)=>{e.level=a,e.children.forEach(e=>s(e,a+1))};t.forEach(e=>s(e,0));const o=e=>{e.sort((e,a)=>{const r=e.name||e.id_user||e.email||"",t=a.name||a.id_user||a.email||"";return r.localeCompare(t)}),e.forEach(e=>e.children.length>0&&o(e.children))};return o(t),t}function X(e){const a=[],r=e=>{a.push(e),e.children.forEach(r)};return e.forEach(r),a}class Z{static normalizeBase64Url(e){let a=e.replace(/-/g,"+").replace(/_/g,"/");const r=(4-a.length%4)%4;return a+="=".repeat(r),a}static parseJwtPayload(e){try{const s=e.split(".");if(3!==s.length)return null;const o=s[1];o.length,this.LARGE_PAYLOAD_THRESHOLD;try{const e=this.normalizeBase64Url(o),a=atob(e),r=new Uint8Array(a.length);for(let s=0;s<a.length;s++)r[s]=a.charCodeAt(s);const t=new TextDecoder("utf-8").decode(r);return JSON.parse(t)}catch(a){try{const e=this.normalizeBase64Url(o),a=decodeURIComponent(atob(e).split("").map(e=>"%"+("00"+e.charCodeAt(0).toString(16)).slice(-2)).join(""));return JSON.parse(a)}catch(r){try{const e=this.normalizeBase64Url(o),a=atob(e);return JSON.parse(a)}catch(t){throw t}}}}catch(s){return null}}static validateTokens(e,a){const r=[],t=[];try{a.split(".")[1],e.split(".")[1];const s=this.parseJwtPayload(a),o=this.parseJwtPayload(e);if(!s){const e="ID token decode falhou - possível problema com base64url encoding";return t.push(e),{isValid:!1,idTokenValid:!1,accessTokenValid:!1,warnings:r,errors:t}}let n=!0;if(!o){const e="Access token decode falhou - será tentado novamente nas chamadas de API";r.push(e),n=!1}const i=Math.floor(Date.now()/1e3);if(o?.exp&&o.exp<i){const e="Access token expirado - pode precisar de refresh";r.push(e),n=!1}if(s.exp&&s.exp<i){const e="ID token expirado - autenticação inválida";return t.push(e),{isValid:!1,idTokenValid:!1,accessTokenValid:n,warnings:r,errors:t}}return{isValid:!0,idTokenValid:!0,accessTokenValid:n,warnings:r,errors:t}}catch(s){const e=`Erro na validação de tokens: ${s}`;return t.push(e),{isValid:!1,idTokenValid:!1,accessTokenValid:!1,warnings:r,errors:t}}}static isTokenExpired(e){const a=this.parseJwtPayload(e);return!a||!a.exp||1e3*a.exp<Date.now()}}Z.LARGE_PAYLOAD_THRESHOLD=1e3;const ee={storageProjectId:"ccjfvpnndclajkleyqkc",supabaseProjectId:"ccjfvpnndclajkleyqkc",supabaseUrl:"https://ccjfvpnndclajkleyqkc.supabase.co",supabasePublishableKey:"sb_publishable_w-TKU0hE4bjM_uOgt3fK1g_ewrXKJ8J",oauth:{authUrl:"https://login.qualiex.com/oauth2/authorize",clientId:"ae6021a0-e874-4aab-9716-b478e59cec20"},qualiexApiUrl:"https://common-v4-api.qualiex.com"},ae={storageProjectId:"ccjfvpnndclajkleyqkc",supabaseProjectId:"tskpcuganynhsppzoqgj",supabaseUrl:"https://tskpcuganynhsppzoqgj.supabase.co",supabasePublishableKey:"sb_publishable_2EIWdYocxgrN4t_f64Ms3g_pKRcbHfL",oauth:{authUrl:"https://login-dev.qualiex.com/oauth2/authorize",clientId:"ae6021a0-e874-4aab-9716-b478e59cec20"},qualiexApiUrl:"https://common-v4-api-dev.qualiex.com"};function re(){return"DEV"===import.meta.env.VITE_APP_ENV?"DEV":"PROD"}function te(){return"DEV"===re()?ae:ee}const se="qualiex_access_token",oe="qualiex_id_token",ne="supabase_token",ie="oauth_state",le="oauth_nonce",de="selected_alias",ce="manual_logout",ue="supabase_project_id",me={setAccessToken:e=>localStorage.setItem(se,e),getAccessToken:()=>localStorage.getItem(se),setIdToken:e=>localStorage.setItem(oe,e),getIdToken:()=>localStorage.getItem(oe),getSupabaseToken:()=>localStorage.getItem(ne),setOAuthState:e=>sessionStorage.setItem(ie,e),getOAuthState:()=>sessionStorage.getItem(ie),clearOAuthState:()=>sessionStorage.removeItem(ie),setOAuthNonce:e=>sessionStorage.setItem(le,e),getOAuthNonce:()=>sessionStorage.getItem(le),clearOAuthNonce:()=>sessionStorage.removeItem(le),setSelectedAlias:e=>localStorage.setItem(de,e),getSelectedAlias:()=>localStorage.getItem(de),clearSelectedAlias:()=>localStorage.removeItem(de),generateOAuthNonce:()=>{const e=new Uint8Array(32);return crypto.getRandomValues(e),btoa(String.fromCharCode(...e)).replace(/[+/=]/g,"")},hasAllTokens:()=>!(!me.getAccessToken()||!me.getIdToken()),checkProjectMismatch:()=>{const e=te().supabaseProjectId,a=localStorage.getItem(ue);return a&&a!==e?(me.clearAll(),localStorage.setItem(ue,e),!0):(a||localStorage.setItem(ue,e),!1)},setSupabaseToken:e=>{localStorage.setItem(ne,e),me._clearValidationCache()},areAllTokensValid:()=>{const e=me.getAccessToken(),a=me.getIdToken();if(!e||!a)return!1;try{const r=Z.validateTokens(e,a);return!!r.idTokenValid&&r.idTokenValid}catch(r){return!1}},clearExpiredTokens:()=>{let e=!1;const a=me.getAccessToken(),r=me.getIdToken(),t=me.getSupabaseToken();return a&&me.isTokenExpired(a)&&(localStorage.removeItem(se),e=!0),r&&me.isTokenExpired(r)&&(localStorage.removeItem(oe),e=!0),t&&me.isTokenExpired(t)&&(localStorage.removeItem(ne),e=!0),e},clearAll:()=>{localStorage.removeItem(se),localStorage.removeItem(oe),localStorage.removeItem(ne),localStorage.removeItem(de),sessionStorage.removeItem(ie),sessionStorage.removeItem(le),me._clearValidationCache()},setManualLogout:()=>localStorage.setItem(ce,"true"),isManualLogout:()=>"true"===localStorage.getItem(ce),clearManualLogout:()=>localStorage.removeItem(ce),isTokenExpired:e=>{try{return Z.isTokenExpired(e)}catch{return!0}},_validationCache:{isValid:!1,timestamp:0,cacheValidityMs:3e5},_clearValidationCache:()=>{me._validationCache.isValid=!1,me._validationCache.timestamp=0},isSupabaseTokenValid:()=>{const e=me.getSupabaseToken();if(!e)return!1;if(me.isTokenExpired(e))return me._clearValidationCache(),me._handleExpiredToken(),!1;const a=Date.now();return a-me._validationCache.timestamp<me._validationCache.cacheValidityMs?me._validationCache.isValid:(me._validationCache.isValid=!0,me._validationCache.timestamp=a,!0)},getValidSupabaseToken:()=>me.isSupabaseTokenValid()?me.getSupabaseToken():null,_handleExpiredToken:()=>{me.clearAll()},extractTokenData:()=>{if(!me.isSupabaseTokenValid())return null;const e=me.getSupabaseToken();if(!e)return null;try{const a=Z.parseJwtPayload(e);if(!a)return null;const r=a.alias||a.default||a.user_alias,t=a.place_id||null,s=a.place_name||null;let o=a.company_id;if(!o&&r)for(const e in a)if(e.startsWith("co")&&/^co\d+$/.test(e)){const t=a[e];if(t&&"string"==typeof t){const e=t.split(";");if(e.length>7&&e[0]===r){o=e[7];break}}}return{alias:r,companyId:o,placeId:t,placeName:s,payload:a}}catch(a){return me._handleExpiredToken(),null}},getCompanyId:e=>{const a=me.getAccessToken();if(a)try{const r=Z.parseJwtPayload(a);if(r)for(const a in r)if(a.startsWith("co")&&/^co\d+$/.test(a)){const t=r[a];if(t&&"string"==typeof t){const a=t.split(";");if(e&&a.length>7&&a[0]===e)return a[7];if(!e&&a.length>7)return a[7]}}}catch(s){}const r=me.extractTokenData();if(r?.companyId)return r.companyId;const t=me.getIdToken();if(t)try{const a=Z.parseJwtPayload(t);if(a)for(const r in a)if(r.startsWith("co")&&/^co\d+$/.test(r)){const t=a[r];if(t&&"string"==typeof t){const a=t.split(";");if(e&&a.length>7&&a[0]===e)return a[7];if(!e&&a.length>7)return a[7]}}}catch(s){}return null},getCompanyIdInt:e=>{const a=[me.getAccessToken(),me.getIdToken()];for(const r of a)if(r)try{const a=Z.parseJwtPayload(r);if(!a)continue;for(const r in a)if(r.startsWith("co")&&/^co\d+$/.test(r)){const t=a[r];if(t&&"string"==typeof t){const a=t.split(";");if(e&&a.length>1&&a[0]===e)return a[1];if(!e&&a.length>1)return a[1]}}}catch{}return null},getCurrentCompanyId:()=>{const e=me.extractTokenData();return e?.companyId||null},getAllCompaniesData:()=>{const e=me.getIdToken();if(!e)return[];try{const a=Z.parseJwtPayload(e);if(!a)return[];const r=[];for(const e in a)if(e.startsWith("co")&&/^co\d+$/.test(e)){const t=a[e];if(t&&"string"==typeof t){const e=t.split(";");e.length>=4&&r.push({id:e.length>7?e[7]:"",alias:e[0].trim(),name:e[3].trim(),payload:a})}}return r}catch{return[]}}};const he={get oauth(){const e=te();return{authUrl:e.oauth.authUrl,clientId:e.oauth.clientId,responseType:"id_token token",scope:"openid profile email"}}};import.meta.env.VITE_IS_QUALIEX;const pe=new class{constructor(){this.errors=[],this.toastCount=0,this.lastToastTime=0}handleError(e,a=!0){const r="string"==typeof e?e:e.message;if(this.errors.push({id:Date.now().toString(),message:r,timestamp:Date.now(),count:1}),this.errors.length>50&&(this.errors=this.errors.slice(-50)),a&&this.shouldShowToast()){const e=this.getErrorTitle(r);y.error(e,{description:r})}}getErrorTitle(a){const r=a.toLowerCase();return r.includes("401")||r.includes("unauthorized")||r.includes("expirou")?e.t("error_session_expired"):r.includes("token")||r.includes("autenticação")?e.t("error_authentication"):r.includes("api")||r.includes("network")?e.t("error_connection"):"Erro"}success(e,a){y.success(e,{description:a})}shouldShowToast(){const e=Date.now();return e-this.lastToastTime>6e4&&(this.toastCount=0),this.toastCount<3&&(this.toastCount++,this.lastToastTime=e,!0)}getErrors(){return this.errors.slice(-50)}clearErrors(){this.errors=[]}};["[forlogic-core] ⚠️ VITE_SUPABASE_PUBLISHABLE_KEY contém uma legacy anon key (JWT).","O Supabase desativou legacy API keys. Substitua pela nova publishable key (formato sb_publishable_*).","Todas as requests retornarão 401 Unauthorized.","Causa provável: a integração Supabase do Lovable sobrescreveu o .env com a anon key legada.","Solução: defina VITE_SUPABASE_PK_OVERRIDE no .env com a publishable key correta."].join(" ");function fe(e){return!!e&&e.startsWith("eyJ")}let ge=!1;function ye(){if("DEV"===re()){const e=te();return{url:e.supabaseUrl,key:e.supabasePublishableKey}}const e=import.meta.env.VITE_SUPABASE_URL,a=import.meta.env.VITE_SUPABASE_PK_OVERRIDE||(import.meta.env.VITE_SUPABASE_PUBLISHABLE_KEY??"");return e&&a?{url:e,key:a}:null}class ve{constructor(e){this.currentToken=null,this.config=e,function(){const e=import.meta.env.VITE_SUPABASE_PK_OVERRIDE,a=import.meta.env.VITE_SUPABASE_PUBLISHABLE_KEY;ge?fe(a):e&&fe(a)?ge=!0:fe(a)?ge=!0:ge=!0}(),this.client=this.createClientWithToken(null)}createClientWithToken(e){const a={apikey:this.config.key};e&&this.isTokenValid(e)&&(a.Authorization=`Bearer ${e}`);return g(this.config.url,this.config.key,{auth:{persistSession:!1,autoRefreshToken:!1,detectSessionInUrl:!1,storage:void 0},global:{headers:a,fetch:async(e,a)=>("string"==typeof e?e:e.url).includes("/auth/v1/user")?new Response(JSON.stringify({error:"blocked"}),{status:401,headers:{"Content-Type":"application/json"}}):fetch(e,a)}})}static getInstance(){if(!ve.instance){const e=ye();if(!e)throw new Error("[forlogic-core] Supabase não configurado. Defina VITE_SUPABASE_URL e VITE_SUPABASE_PUBLISHABLE_KEY no .env, ou não invoque getSupabaseClient() (use isSupabaseConfigured() para checar antes).");ve.instance=new ve(e)}return ve.instance}getClient(){const e=me.getValidSupabaseToken();return e!==this.currentToken&&(this.client=this.createClientWithToken(e),this.currentToken=e),this.client}isTokenValid(e){try{return!Z.isTokenExpired(e)}catch(a){return pe.handleError(a instanceof Error?a:"Supabase - Error validating token",!1),!1}}}function we(){return ve.getInstance().getClient()}class xe{static async generateToken(e,a,r,t=!1){try{if(!t){const e=me.getSupabaseToken();if(e&&me.isSupabaseTokenValid())return e}const s=we(),{data:o,error:n}=await s.functions.invoke("validate-token",{body:{access_token:e,alias:a}});return n&&(n.message?.includes("401")||n.message?.includes("Unauthorized"))?(r?.(),null):o?.access_token?(me.setSupabaseToken(o.access_token),o.access_token):null}catch(s){return s instanceof Error&&(s.message.includes("401")||s.message.includes("Unauthorized"))&&r?.(),null}}}class be{static setLogoutCallback(e){this.onLogoutCallback=e}static async attemptRegeneration(e=!1){if(this.regenerationPromise)return this.regenerationPromise;this.regenerationPromise=this._doRegenerate(e);try{return await this.regenerationPromise}finally{this.regenerationPromise=null}}static async _doRegenerate(e=!1){try{const a=me.getAccessToken(),r=me.getSelectedAlias();if(!a||!r)return null;const t=await xe.generateToken(a,r,this.onLogoutCallback||void 0,e);return t||null}catch(a){return null}}}var _e;be.regenerationPromise=null,be.onLogoutCallback=null;const Ne={isAuthenticated:!1,isLoading:!1,user:null,alias:null,companies:[],selectedUnit:null,userId:null,userAlias:null,placeId:null,placeName:null,activePlaceId:null,activePlaceName:null};_e=class{static async initialize(){try{const e=!0;if(e){if(me.checkProjectMismatch())return{...Ne}}if(!me.hasAllTokens()||!me.areAllTokensValid())return me.clearExpiredTokens(),{...Ne};const a=me.getAccessToken(),r=me.getIdToken();me.clearManualLogout();const t=this.extractUserFromIdToken(r,a),s=this.extractCompaniesFromIdToken(r),o=this.extractAliasFromAccessToken(a),n=e?me.extractTokenData():null,i=n?.alias;let l=null;if(i&&s.some(e=>e.alias===i))l=i;else{const e=me.getSelectedAlias(),a=e&&s.some(a=>a.alias===e);l=a?e:o||s[0]?.alias||null}if(e&&(!me.isSupabaseTokenValid()&&l&&await be.attemptRegeneration(),!me.isSupabaseTokenValid()))return{...Ne};let d=null;if(l){const e=me.getCompanyId(l),a=s.find(e=>e.alias===l);a&&(d={id:e||a.id,name:a.name,alias:a.alias})}const c=n?.placeId??null,u=n?.placeName??null;return{isAuthenticated:!0,isLoading:!1,user:t,alias:l,companies:s,selectedUnit:d,userId:t?.id||null,userAlias:t?.id||null,placeId:c,placeName:u,activePlaceId:c,activePlaceName:u}}catch(e){return{...Ne}}}static async loginDev(){try{const e=we(),{data:a,error:r}=await e.functions.invoke("dev-tokens",{body:{environment:"development"}});if(r)return!1;if(!a?.access_token||!a?.id_token)return!1;const t=new URL("/callback",window.location.origin);return t.hash=`access_token=${a.access_token}&id_token=${a.id_token}&token_type=bearer`,window.location.href=t.toString(),!0}catch(e){return!1}}static loginProd(){const e="Lw==";me.setOAuthState(e);const a=me.generateOAuthNonce();me.setOAuthNonce(a);const r=`${window.location.origin}/callback`,t=new URL(he.oauth.authUrl);t.searchParams.set("client_id",he.oauth.clientId),t.searchParams.set("response_type",he.oauth.responseType),t.searchParams.set("scope",he.oauth.scope),t.searchParams.set("redirect_uri",r),t.searchParams.set("state",e),t.searchParams.set("nonce",a),t.searchParams.set("response_mode","fragment"),window.location.href=t.toString()}static async processCallback(){try{const e=new URLSearchParams(window.location.hash.startsWith("#")?window.location.hash.substring(1):window.location.hash),a=new URLSearchParams(window.location.search),r=r=>e.get(r)||a.get(r),t=r("access_token"),s=r("id_token"),o=r("error");if(o)throw new Error(`Erro OAuth: ${o}`);if(t&&s){const e=me.getAccessToken();e!==t&&me.clearAll()}const n=!0;if(me.hasAllTokens()){if(n){me.getValidSupabaseToken()||await be.attemptRegeneration(!0)}return!0}const i=t,l=s;if(!i||!l)throw new Error("Tokens não encontrados na URL de callback");me.setAccessToken(i),me.setIdToken(l),me.clearManualLogout();const d=this.extractAliasFromAccessToken(i);if(d)me.setSelectedAlias(d);else{const e=this.extractCompaniesFromIdToken(l);if(0===e.length)throw new Error("Nenhuma empresa encontrada nos tokens");me.setSelectedAlias(e[0].alias)}if(n){if(!await be.attemptRegeneration(!0))throw new Error("Falha ao gerar token Supabase")}return me.clearOAuthState(),me.clearOAuthNonce(),!0}catch(e){throw e}}static async logout(){me.clearAll(),me.setManualLogout(),localStorage.removeItem("auth_return_url"),sessionStorage.clear();try{if("caches"in window){const e=await caches.keys();await Promise.all(e.map(e=>caches.delete(e)))}}catch{}window.location.href="/login"}static decodeToken(e){return Z.parseJwtPayload(e)}static extractUserFromIdToken(e,a){const r=this.decodeToken(e);if(!r)return null;const t=a?this.decodeToken(a):null;return{id:r.subNewId,email:r.email,name:r.name,identifier:r.identifier,isSysAdmin:"1"===t?.admin}}static extractCompaniesFromIdToken(e){const a=this.decodeToken(e);if(!a)return[];const r=[];return Object.keys(a).forEach(e=>{if(e.match(/^co(\d+)$/)&&"string"==typeof a[e]){const t=a[e].split(";");if(t.length>=4)r.push({id:t.length>7?t[7].trim():"",alias:t[0].trim(),name:t[3].trim()});else{const[t,s]=a[e].split("|");t&&s&&r.push({id:"",alias:t.trim(),name:s.trim()})}}}),r}static extractAliasFromAccessToken(e){const a=this.decodeToken(e);return a?.default||null}},be.setLogoutCallback(()=>{_e.logout()});class ke{static handleError(e){if(!e)return!1;const a=e.message||e.toString();return!!this.isAuthenticationError(e,a)&&(me.clearAll(),window.location.href="/login",!0)}static isAuthenticationError(e,a){if(401===e.status||401===e.statusCode)return!0;const r=a.toLowerCase();return["401","unauthorized","token expired","invalid token","session expired","jwt expired","authentication failed","not authenticated"].some(e=>r.includes(e))}static async wrapAsync(e){try{return await e}catch(a){if(!this.handleError(a))throw a;throw new Error("Sua sessão expirou. Você será redirecionado para fazer login novamente.")}}}class Se{static async handleApiError(e){if(!e||this.isRetrying)return!1;const a=e.status||e.statusCode,r=e.message||e.toString();if(401===a||r.includes("401")||r.includes("Unauthorized")){this.isRetrying=!0;try{return await be.attemptRegeneration()?(this.isRetrying=!1,!0):(ke.handleError(e),this.isRetrying=!1,!1)}catch(t){return ke.handleError(e),this.isRetrying=!1,!1}}return!1}static validateToken(){const e=me.getAccessToken();return e?me.isTokenExpired(e)?{valid:!1,message:"Sua sessão expirou. Você será redirecionado para fazer login."}:{valid:!0}:{valid:!1,message:"Token OAuth não encontrado. Faça login novamente."}}}Se.isRetrying=!1;const Ee=new class{get baseUrl(){return te().qualiexApiUrl}async makeApiCall(e,a,r){const t=Se.validateToken();if(!t.valid)throw new Error(t.message||"Token inválido");const s=me.getAccessToken();if(!s)throw new Error("Token Qualiex não encontrado");if(!r||""===r.trim())throw new Error("Alias da unidade é obrigatório para chamadas à API do Qualiex");const o=new URL(e,this.baseUrl);Object.entries(a).forEach(([e,a])=>{o.searchParams.append(e,a)});const n=await fetch(o.toString(),{method:"GET",headers:{Authorization:`Bearer ${s}`,"Content-Type":"application/json",Accept:"application/json","un-alias":r}});if(!n.ok){const e=new Error(`API call failed: ${n.status} ${n.statusText}`);throw e.status=n.status,e.statusCode=n.status,e}return await n.json()}mapToQualiexUser(e){let a;return a="boolean"==typeof e.isActive?e.isActive:"boolean"==typeof e.active?e.active:"string"!=typeof e.status||"active"===e.status.toLowerCase(),{id:e.id||e.ID||"",userId:e.userId||String(e.ID),userName:e.userName||"Nome não disponível",userEmail:e.userEmail||"Email não disponível",placeId:null,placeName:e.placeName||null,roleId:e.roleId||void 0,roleName:e.roleName||void 0,companyId:e.companyId||void 0,companyName:e.companyName||void 0,isActive:a}}parseUsersResponse(e,a=""){let r=e;if(e.data)r=e.data;else{if(!Array.isArray(e))return pe.handleError(`[QualiexApi] Formato de resposta inesperado${a}`,!1),null;r=e}return Array.isArray(r)?r.map(e=>this.mapToQualiexUser(e)):(pe.handleError(`[QualiexApi] Resposta não é um array${a}`,!1),null)}async fetchUsers(e,a,r="active"){const t={companyId:a,search:"",filterStatus:r};try{const a=await this.makeApiCall("/api/common/v1/companiesusers",t,e);return this.parseUsersResponse(a)??[]}catch(s){if(await Se.handleApiError(s))try{const a=await this.makeApiCall("/api/common/v1/companiesusers",t,e);return this.parseUsersResponse(a," após retry")??[]}catch(o){return pe.handleError(o instanceof Error?o:"Erro ao buscar usuários após renovação de token",!0),[]}return pe.handleError(s instanceof Error?s.message:"Erro ao buscar usuários da API Qualiex",!0),[]}}async fetchUserById(e,a,r){try{return(await this.fetchUsers(a,r)).find(a=>a.userId===e)||null}catch(t){return pe.handleError(t instanceof Error?t:"[QualiexApi] Error fetching user by ID"),null}}async fetchActiveUsersMap(e,a){const r=await this.fetchUsers(e,a,"active"),t=new Map;return r.forEach(e=>t.set(e.userId,e)),t}async fetchAllUsersMap(e,a){const r=await this.fetchUsers(e,a,"all"),t=new Map;return r.forEach(e=>t.set(e.userId,e)),t}async getUsers(e,a="active"){const r=me.extractTokenData();return r&&r.companyId?this.fetchUsers(e,r.companyId,a):[]}async fetchSoftwares(e){try{const a=await this.makeApiCall("/api/common/v1/softwares",{},e),r=a?.data||a;return Array.isArray(r)?r.map(e=>({id:e.id,alias:e.alias||"",color:e.color||"",colorLight:e.colorLight||"",namePtBr:e.namePtBr||"",nameUs:e.nameUs||"",nameEs:e.nameEs||""})):(pe.handleError("[QualiexApi] fetchSoftwares: formato de resposta inesperado",!1),[])}catch(a){if(await Se.handleApiError(a))try{const a=await this.makeApiCall("/api/common/v1/softwares",{},e),r=a?.data||a;return Array.isArray(r)?r.map(e=>({id:e.id,alias:e.alias||"",color:e.color||"",colorLight:e.colorLight||"",namePtBr:e.namePtBr||"",nameUs:e.nameUs||"",nameEs:e.nameEs||""})):[]}catch(r){return pe.handleError(r instanceof Error?r:"Erro ao buscar softwares após renovação de token",!0),[]}return pe.handleError(a instanceof Error?a.message:"Erro ao buscar softwares da API Qualiex",!0),[]}}async fetchUserAssociations(e,a){try{const r=await this.makeApiCall(`/api/common/v1/Users/${e}/associations`,{},a),t=r?.data||r;return Array.isArray(t)?t.map(e=>({associationId:e.associationId||"",userId:e.userId||"",userName:e.userName||"",companyId:e.companyId||"",companyName:e.companyName||"",companyAlias:e.companyAlias||"",companyPhotoDate:e.companyPhotoDate,language:e.language,roleId:e.roleId||"",roleName:e.roleName||"",placeId:e.placeId,placeName:e.placeName,softwares:Array.isArray(e.softwares)?e.softwares:[],functionalities:Array.isArray(e.functionalities)?e.functionalities:[],isQualitfy:e.isQualitfy??!1,isMetroex:e.isMetroex??!1})):(pe.handleError("[QualiexApi] fetchUserAssociations: formato de resposta inesperado",!1),[])}catch(r){if(await Se.handleApiError(r))try{const r=await this.makeApiCall(`/api/common/v1/Users/${e}/associations`,{},a),t=r?.data||r;return Array.isArray(t)?t.map(e=>({associationId:e.associationId||"",userId:e.userId||"",userName:e.userName||"",companyId:e.companyId||"",companyName:e.companyName||"",companyAlias:e.companyAlias||"",companyPhotoDate:e.companyPhotoDate,language:e.language,roleId:e.roleId||"",roleName:e.roleName||"",placeId:e.placeId,placeName:e.placeName,softwares:Array.isArray(e.softwares)?e.softwares:[],functionalities:Array.isArray(e.functionalities)?e.functionalities:[],isQualitfy:e.isQualitfy??!1,isMetroex:e.isMetroex??!1})):[]}catch(t){return pe.handleError(t instanceof Error?t:"Erro ao buscar associações após renovação de token",!0),[]}return pe.handleError(r instanceof Error?r.message:"Erro ao buscar associações do usuário",!0),[]}}},Ie=t(void 0),Ae=()=>{const e=s(Ie);if(void 0===e)throw new Error("useAuth deve ser usado dentro de um AuthProvider");return e},Te=(e={})=>{const{user:a,alias:r}=Ae(),{enabled:t=!0,status:s="active"}=e;return c({queryKey:["qualiex-users",r,s],queryFn:()=>Ee.getUsers(r,s),enabled:t&&!!r&&!!a,staleTime:3e5,retry:2,retryDelay:1e3})};function Ce(){const{alias:a,isAuthenticated:r}=Ae(),t=me.getAccessToken(),{data:s=[]}=Te(),n=c({queryKey:["leadership-raw",a],queryFn:async()=>{if(!t||!a)throw new Error("Usuário não autenticado ou unidade não selecionada");const e=we(),{data:r,error:s}=await e.schema("common").from("leaders").select("*").eq("is_removed",!1).eq("alias",a);if(s)throw new Error("Erro ao buscar hierarquia de liderança");return r??[]},enabled:!!t&&!!a&&r}),i=o(()=>{const a=n.data;if(!a)return;if(0===a.length)return[];const r={};s.forEach(e=>{r[e.userId]={name:e.userName||e.userEmail,email:e.userEmail||""}});const t=a.map(t=>{const s=a.filter(e=>e.id_leader===t.id_user);return{...t,name:r[t.id_user]?.name||e.t("inactive_user"),email:r[t.id_user]?.email||"",subordinatesCount:s.length,subordinateNames:s.map(e=>r[e.id_user]?.name||"[Usuário inativo]").sort((e,a)=>e.localeCompare(a))}}),o=new Set(a.map(e=>e.id_user));return new Set(a.filter(e=>e.id_leader&&!o.has(e.id_leader)).map(e=>e.id_leader)).forEach(s=>{const o=r[s],n=a.filter(e=>e.id_leader===s);t.push({id:`virtual-${s}`,alias:a[0]?.alias||"",id_user:s,id_leader:null,is_removed:!1,is_active:!0,created_at:(new Date).toISOString(),updated_at:(new Date).toISOString(),name:o?.name||e.t("inactive_user"),email:o?.email||"",subordinatesCount:n.length,subordinateNames:n.map(e=>r[e.id_user]?.name||"[Usuário inativo]").sort((e,a)=>e.localeCompare(a))})}),G(t)},[n.data,s]);return{...n,data:i}}const De="common";function Pe(){const{alias:e}=Ae(),a=u(),r=we(),{t:t}=v();return m({mutationFn:async a=>{if(!e)throw new Error(t("unit_not_selected","Unidade não selecionada"));if(a.id_user===a.id_leader)throw new Error(t("cannot_be_own_leader","Usuário não pode ser seu próprio líder"));a.id_leader&&await Oe(r,e,a.id_user,a.id_leader);const{data:s,error:o}=await r.schema(De).from("leaders").insert({alias:e,id_user:a.id_user,id_leader:a.id_leader,is_active:!0,is_removed:!1}).select().single();if(o)throw o;return s},onSuccess:()=>{a.invalidateQueries({queryKey:["leadership-raw",e]}),y.success(t("leader_promoted_success","Líder virtual promovido com sucesso"))},onError:e=>{y.error(e.message||t("leader_create_error","Erro ao criar líder"))}})}function Ue(){const{alias:e}=Ae(),a=u(),r=we(),{t:t}=v();return m({mutationFn:async a=>{if(!e)throw new Error(t("unit_not_selected","Unidade não selecionada"));if(!a.users.length)throw new Error(t("select_at_least_one",t("leadership_select_subordinates")));const s=a.users.map(e=>e.id_user),{data:o}=await r.schema(De).from("leaders").select("id_user").eq("alias",e).in("id_user",s).eq("is_removed",!1);if(o&&o.length>0){const e=o.map(e=>e.id_user);throw new Error(t("users_already_leaders",`Alguns usuários já estão cadastrados como líderes: ${e.join(", ")}`))}for(const d of a.users){if(a.id_leader&&d.id_user===a.id_leader)throw new Error(t("cannot_be_own_leader","Usuário não pode ser seu próprio líder"));a.id_leader&&await Oe(r,e,d.id_user,a.id_leader)}const n=a.users.map(r=>({alias:e,id_user:r.id_user,id_leader:a.id_leader,is_active:!0,is_removed:!1})),{data:i,error:l}=await r.schema(De).from("leaders").insert(n).select();if(l)throw l;return i},onSuccess:r=>{a.invalidateQueries({queryKey:["leadership-raw",e]}),y.success(t("subordinates_added_success",`${r?.length||0} liderado(s) adicionado(s) com sucesso`))},onError:e=>{y.error(e.message||t("subordinates_add_error","Erro ao adicionar liderados"))}})}function Re(){const{alias:e}=Ae(),a=u(),r=we(),{t:t}=v();return m({mutationFn:async a=>{if(!e)throw new Error(t("unit_not_selected","Unidade não selecionada"));const{data:s}=await r.schema(De).from("leaders").select("id_user").eq("id",a.id).eq("alias",e).single();if(!s)throw new Error(t("leader_not_found","Líder não encontrado"));if(s.id_user===a.id_leader)throw new Error(t("cannot_be_own_leader","Usuário não pode ser seu próprio líder"));a.id_leader&&await Oe(r,e,s.id_user,a.id_leader,a.id);const{data:o,error:n}=await r.schema(De).from("leaders").update({id_leader:a.id_leader}).eq("id",a.id).eq("alias",e).select().single();if(n)throw n;return o},onSuccess:()=>{a.invalidateQueries({queryKey:["leadership-raw",e]}),y.success(t("leader_updated_success","Líder atualizado com sucesso"))},onError:e=>{y.error(e.message||t("leader_update_error","Erro ao atualizar líder"))}})}function Ve(){const{alias:e}=Ae(),a=u(),r=we(),{t:t}=v();return m({mutationFn:async a=>{if(!e)throw new Error(t("unit_not_selected","Unidade não selecionada"));const{error:s}=await r.schema(De).from("leaders").update({is_removed:!0}).eq("id",a).eq("alias",e);if(s)throw s},onSuccess:()=>{a.invalidateQueries({queryKey:["leadership-raw",e]}),y.success(t("leader_removed_success","Líder removido com sucesso"))},onError:e=>{y.error(e.message||t("leader_remove_error","Erro ao remover líder"))}})}function Le(){const{alias:e}=Ae(),a=u(),r=we(),{t:t}=v();return m({mutationFn:async({leaderUserId:a,selectedUsers:s})=>{if(!e)throw new Error(t("unit_not_selected","Unidade não selecionada"));const o=s.map(e=>e.id_user),n=await Promise.all([r.schema(De).from("leaders").select("id, id_user, id_leader").eq("alias",e).eq("is_removed",!1).eq("id_leader",a),r.schema(De).from("leaders").select("id, id_user, id_leader").eq("alias",e).eq("is_removed",!1).in("id_user",o.length?o:["__none__"])]),[{data:i,error:l},{data:d,error:c}]=n;if(l)throw l;if(c)throw c;const u=i||[],m=d||[],h=new Set(o),p=u.filter(e=>!h.has(e.id_user)),f=m.filter(e=>e.id_leader!==a),g=new Set(m.map(e=>e.id_user)),y=s.filter(e=>!g.has(e.id_user));for(const t of f)await Oe(r,e,t.id_user,a,t.id);for(const x of y){if(x.id_user===a)throw new Error(t("cannot_be_own_leader","Usuário não pode ser seu próprio líder"));await Oe(r,e,x.id_user,a)}const v=[];if(p.length){const a=p.map(e=>e.id);v.push(r.schema(De).from("leaders").update({is_removed:!0}).in("id",a).eq("alias",e))}if(f.length){const t=f.map(e=>e.id);v.push(r.schema(De).from("leaders").update({id_leader:a}).in("id",t).eq("alias",e))}if(y.length){const t=y.map(r=>({alias:e,id_user:r.id_user,id_leader:a,is_active:!0,is_removed:!1}));v.push(r.schema(De).from("leaders").insert(t))}const w=(await Promise.all(v)).find(e=>e?.error);if(w?.error)throw w.error;return{unlinked:p.length,updated:f.length,created:y.length}},onSuccess:r=>{a.invalidateQueries({queryKey:["leadership-raw",e]}),y.success(t("subordinates_synced_success",`Subordinados sincronizados (${r.created} adicionados, ${r.updated} atualizados, ${r.unlinked} removidos)`))},onError:e=>{y.error(e.message||t("subordinates_sync_error","Erro ao sincronizar subordinados"))}})}async function Oe(a,r,t,s,o){const{data:n,error:i}=await a.schema(De).from("leaders").select("id, id_user, id_leader").eq("alias",r).eq("is_removed",!1);if(i)throw i;const l=o?n.filter(e=>e.id!==o):n,d=new Set;let c=s;for(;c;){if(d.has(c))throw new Error(e.t("leadership_cycle_error"));if(c===t)throw new Error("Esta associação criaria um ciclo na hierarquia");d.add(c);const a=l.find(e=>e.id_user===c);c=a?.id_leader||null}}function ze(...e){return L(V(e))}const je=R("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",{variants:{variant:{primary:"bg-primary text-primary-foreground hover:bg-primary-hover shadow-sm hover:shadow-md active:scale-[0.98]",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary-hover border border-input shadow-sm",tertiary:"bg-background text-foreground hover:bg-accent hover:text-accent-foreground border border-border",outline:"border border-input bg-background hover:bg-accent hover:text-accent-foreground",ghost:"hover:bg-accent hover:text-accent-foreground",subtle:"text-muted-foreground hover:text-foreground hover:bg-accent/50",destructive:"bg-destructive text-destructive-foreground hover:bg-destructive/90 shadow-sm hover:shadow-md",danger:"bg-destructive text-destructive-foreground hover:bg-destructive/90 shadow-sm hover:shadow-md",link:"text-primary underline-offset-4 hover:underline",icon:"bg-transparent border border-input hover:bg-accent hover:text-accent-foreground p-2",loading:"bg-primary/50 text-primary-foreground cursor-wait",default:"bg-primary text-primary-foreground hover:bg-primary/90",action:"bg-primary/10 text-primary hover:bg-primary/20 border border-primary/30","icon-only":"bg-transparent border border-input hover:bg-accent hover:text-accent-foreground p-2","external-link":"bg-transparent text-muted-foreground hover:text-foreground hover:bg-accent/50 transition-colors","action-primary":"bg-primary text-primary-foreground hover:bg-primary/90 shadow-sm","action-secondary":"bg-secondary text-secondary-foreground hover:bg-secondary/80 border border-input"},size:{sm:"h-8 px-3 text-xs rounded-lg",md:"h-10 px-4 py-2 text-sm rounded-md",lg:"h-12 px-8 text-base rounded-lg",xl:"h-14 px-10 text-lg rounded-lg",icon:"h-10 w-10","icon-sm":"h-8 w-8","icon-xs":"h-6 w-6",default:"h-10 px-4 py-2"}},defaultVariants:{variant:"primary",size:"md"}}),qe=a.forwardRef(({className:e,variant:a,size:r,asChild:t=!1,...s},o)=>h(t?U:"button",{className:ze(je({variant:a,size:r,className:e})),ref:o,...s}));qe.displayName="Button";const Be=a.forwardRef(({className:e,...a},r)=>h(O.Root,{ref:r,className:ze("peer h-4 w-4 shrink-0 rounded-sm border border-primary ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground",e),...a,children:h(O.Indicator,{className:ze("flex items-center justify-center text-current"),children:h(w,{className:"h-4 w-4"})})}));Be.displayName=O.Root.displayName;const Me=a.forwardRef(({className:e,...a},r)=>h("table",{ref:r,className:ze("w-full caption-bottom text-[13px] table-fixed",e),...a}));Me.displayName="Table";const $e=a.forwardRef(({className:e,...a},r)=>h("thead",{ref:r,className:ze("[&_tr]:border-b sticky top-0 z-[1] bg-background",e),...a}));$e.displayName="TableHeader";const We=a.forwardRef(({className:e,...a},r)=>h("tbody",{ref:r,className:ze("[&_tr:last-child]:border-0",e),...a}));We.displayName="TableBody";a.forwardRef(({className:e,...a},r)=>h("tfoot",{ref:r,className:ze("border-t bg-muted/50 font-medium [&>tr]:last:border-b-0",e),...a})).displayName="TableFooter";const He=a.forwardRef(({className:e,...a},r)=>h("tr",{ref:r,className:ze("border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted even:bg-table-stripe",e),...a}));He.displayName="TableRow";const Ke=a.forwardRef(({className:e,...a},r)=>h("th",{ref:r,className:ze("h-9 px-4 py-2 text-left align-middle font-medium text-muted-foreground bg-background border-b [&:has([role=checkbox])]:pr-0",e),...a}));Ke.displayName="TableHead";const Je=a.forwardRef(({className:e,...a},r)=>h("td",{ref:r,className:ze("px-4 py-2 align-middle overflow-hidden [&:has([role=checkbox])]:pr-0",e),...a}));Je.displayName="TableCell";a.forwardRef(({className:e,...a},r)=>h("caption",{ref:r,className:ze("mt-4 text-sm text-muted-foreground",e),...a})).displayName="TableCaption";const Fe=z.Root,Qe=z.Trigger,Ye=a.forwardRef(({className:e,align:a="center",sideOffset:r=4,...t},s)=>h(z.Content,{ref:s,align:a,sideOffset:r,className:ze("z-50 w-64 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",e),...t}));function Ge(e,a){const r=new Set;function t(e){if(e)for(const a of e)r.add(a.id),t(a.children)}return function e(r){for(const s of r){if(s.id===a)return t(s.children),!0;if(s.children&&e(s.children))return!0}return!1}(e),r}function Xe({children:e,itemId:a,enableDrag:r,onDragStartCell:t,onDragEndCell:s,onDragOverCell:o,onDropCell:n,className:i}){return h(Je,{draggable:r,onDragStart:r?e=>t(a,e):void 0,onDragEnd:r?s:void 0,onDragOver:e=>{e.preventDefault(),e.stopPropagation(),o(a,e)},onDragEnter:e=>{e.preventDefault(),e.stopPropagation(),o(a,e)},onDrop:e=>{e.preventDefault(),e.stopPropagation(),n(a,e)},className:i,children:e})}function Ze({item:e,level:a,columns:r,nameKey:t,iconComponent:s,expandedIds:o,onToggleExpand:n,onRowClick:i,renderActions:l,rowActionsVariant:d="default",enableSelection:c,selectedIds:u,onSelectItem:m,enableRowDrag:g,draggedId:y,dragOverId:v,onDragStartCell:w,onDragEndCell:b,onDragOverCell:k,onDropCell:S,dragCount:E}){const I=o.has(e.id),A=(e.children?.length??0)>0,T=24*a,C="inline"===d,D=y===e.id||u?.has(e.id)&&y&&u?.has(y),P=v===e.id&&y!==e.id,U=u?.has(e.id)??!1,R={itemId:e.id,enableDrag:g,onDragStartCell:w,onDragEndCell:b,onDragOverCell:k,onDropCell:S};return p(f,{children:[p(He,{className:ze(i&&"cursor-pointer",C&&"group",D&&"opacity-40",P&&"ring-2 ring-primary ring-inset bg-primary/5"),onClick:i?()=>i(e):void 0,children:[h(Xe,{...R,children:p("div",{className:"flex items-center gap-2",style:{paddingLeft:`${T}px`},children:[c&&h(Be,{checked:U,onCheckedChange:()=>m?.(e.id),onClick:e=>e.stopPropagation(),className:"shrink-0"}),g&&h("span",{className:"cursor-grab text-muted-foreground shrink-0 select-none",title:"Arrastar",children:"⠿"}),A?h("button",{onClick:a=>{a.stopPropagation(),n(e.id)},className:"p-1 hover:bg-accent rounded shrink-0",children:h(I?_:N,{className:"h-4 w-4"})}):h("div",{className:"w-6 shrink-0"}),s??h(x,{className:"h-4 w-4 text-muted-foreground shrink-0"}),h("span",{className:"truncate",children:String(e[t]??e.id)}),y===e.id&&E&&E>1&&h("span",{className:"ml-1 inline-flex items-center rounded-full bg-primary px-1.5 py-0 text-xs font-semibold text-primary-foreground",children:E})]})}),r.map(r=>{const t=e[r.key],s=r.render?r.render(e,a):null!=t?String(t):"—";return h(Xe,{...R,className:ze("text-center",r.className),children:r.hoverContent?p(Fe,{openDelay:200,children:[h(Qe,{asChild:!0,children:h("span",{className:"cursor-default underline decoration-dotted underline-offset-4 text-foreground",children:s})}),h(Ye,{side:"bottom",align:"center",className:"w-auto max-w-xs",children:r.hoverContent(e)})]}):s},String(r.key))}),l&&h(Xe,{...R,className:"text-right",children:h("div",{onClick:e=>e.stopPropagation(),className:ze("flex items-center justify-end gap-1",C&&"opacity-0 group-hover:opacity-100 transition-opacity"),children:l(e)})})]}),A&&I&&e.children.map(e=>h(Ze,{item:e,level:a+1,columns:r,nameKey:t,iconComponent:s,expandedIds:o,onToggleExpand:n,onRowClick:i,renderActions:l,rowActionsVariant:d,enableSelection:c,selectedIds:u,onSelectItem:m,enableRowDrag:g,draggedId:y,dragOverId:v,onDragStartCell:w,onDragEndCell:b,onDragOverCell:k,onDropCell:S,dragCount:E},e.id))]})}function ea({onDrop:a,isDragOver:r,onDragOver:t,onDragLeave:s,label:o}){return p("div",{className:ze("absolute top-0 left-0 right-0 z-10 flex items-center justify-center gap-2 py-2 px-4 border-2 border-dashed rounded-md text-sm transition-colors mx-2 mt-2",r?"border-primary bg-primary/10 text-primary":"border-muted-foreground/30 text-muted-foreground bg-background/95"),onDragOver:t,onDragEnter:t,onDragLeave:s,onDrop:a,children:[h(b,{className:"h-4 w-4"}),o??e.t("leadership_make_root_short")]})}function aa({data:a,columns:t,nameKey:s,nameHeader:o=e.t("ap_name"),iconComponent:d,expandedIds:c,onToggleExpand:u,onRowClick:m,renderActions:f,actionsHeader:g="",rowActionsVariant:y="default",isLoading:v,emptyMessage:w="Nenhum registro encontrado.",className:b,enableSelection:_,selectedIds:N,onSelectItem:k,onSelectAll:S,isAllSelected:E,enableRowDrag:I,onMoveNode:A,onMoveNodes:T,rootDropLabel:C,actionsWidth:D=20,nameMinWidth:P=200}){const[U,R]=n(null),[V,L]=n(null),[O,z]=n(!1),[j,q]=n(1),B=i(null),M=i([]),$=i(null),W=r.useMemo(()=>new Set(N??[]),[N]),H=r.useMemo(()=>{if(!U||!a)return new Set;const e=M.current.length>0?M.current:[U],r=function(e,a){const r=new Set;for(const t of a)Ge(e,t).forEach(e=>r.add(e));return r}(a,e);return e.forEach(e=>r.add(e)),r},[U,a]),K=i(H);K.current=H;const J=l(()=>{B.current=null,M.current=[],$.current=null,R(null),L(null),z(!1),q(1)},[]),F=l((e,a)=>{e.length>1&&T?T(e,a):1===e.length&&A?.(e[0],a)},[A,T]),Q=l((e,a)=>{const r=W.has(e)&&W.size>1?Array.from(W):[e];B.current=e,M.current=r,$.current=null,R(e),q(r.length),a.dataTransfer.effectAllowed="move",a.dataTransfer.setData("text/plain",e),a.dataTransfer.setData("application/x-tree-ids",JSON.stringify(r))},[W]),Y=l((e,a)=>{a.preventDefault(),a.dataTransfer.dropEffect="move",K.current.has(e)?L(null):($.current=e,L(e))},[]),G=l((e,a)=>{a.preventDefault(),a.stopPropagation();const r=K.current.has(e)?$.current:e;if(!r)return void J();let t=M.current;if(0===t.length){try{const e=a.dataTransfer.getData("application/x-tree-ids");if(e){const a=JSON.parse(e);Array.isArray(a)&&a.length>0&&(t=a)}}catch{}if(0===t.length){const e=a.dataTransfer.getData("text/plain");e&&(t=[e])}}0===t.length||t.includes(r)||F(t,r),J()},[F,J]),X=l(e=>{e.preventDefault(),e.stopPropagation();let a=M.current;if(0===a.length){try{const r=e.dataTransfer.getData("application/x-tree-ids");if(r){const e=JSON.parse(r);Array.isArray(e)&&e.length>0&&(a=e)}}catch{}if(0===a.length){const r=e.dataTransfer.getData("text/plain");r&&(a=[r])}}0!==a.length?(F(a,null),J()):J()},[F,J]),Z=l(e=>{e.preventDefault(),e.dataTransfer.dropEffect="move",z(!0)},[]),ee=l(e=>{I&&(e.preventDefault(),e.dataTransfer.dropEffect="move")},[I]),ae=l(e=>{if(!I)return;const a=document.elementFromPoint(e.clientX,e.clientY)?.closest?.("[data-tree-row-id]"),r=a?.dataset?.treeRowId??$.current;r&&G(r,e)},[I,G]);if(v)return h("div",{className:"flex items-center justify-center py-12",children:p("div",{className:"text-center space-y-2",children:[h("div",{className:"animate-spin h-8 w-8 border-4 border-primary border-t-transparent rounded-full mx-auto"}),h("p",{className:"text-sm text-muted-foreground",children:"Carregando..."})]})});if(!a||0===a.length)return p("div",{className:"flex flex-col items-center justify-center py-12 text-center space-y-2",children:[h(x,{className:"h-10 w-10 text-muted-foreground/50"}),h("p",{className:"text-sm text-muted-foreground",children:w})]});const re=null!==U;return p("div",{className:ze("border rounded-lg overflow-hidden relative",b),onDragOver:ee,onDrop:ae,onDragLeave:I?e=>{const a=e.relatedTarget;a&&e.currentTarget.contains(a)||(L(null),z(!1))}:void 0,children:[I&&re&&h(ea,{onDrop:X,isDragOver:O,onDragOver:Z,onDragLeave:()=>z(!1),label:C}),p(Me,{children:[h($e,{children:p(He,{children:[h(Ke,{className:"text-left",style:{minWidth:P},children:p("div",{className:"flex items-center gap-2",children:[_&&h(Be,{checked:E??!1,onCheckedChange:()=>S?.()}),o]})}),t.map(e=>h(Ke,{className:ze("text-center",e.className),style:e.width?{width:e.width}:void 0,children:e.header},String(e.key))),f&&h(Ke,{className:"text-right",style:{width:D},children:g})]})}),h(We,{children:a.map(e=>h(Ze,{item:e,level:0,columns:t,nameKey:s,iconComponent:d,expandedIds:c,onToggleExpand:u,onRowClick:m,renderActions:f,rowActionsVariant:y,enableSelection:_,selectedIds:W,onSelectItem:k,enableRowDrag:I,draggedId:U,dragOverId:V,onDragStartCell:Q,onDragEndCell:J,onDragOverCell:Y,onDropCell:G,dragCount:j},e.id))})]})]})}Ye.displayName=z.Content.displayName;const ra=a.forwardRef(({className:e,orientation:a="horizontal",decorative:r=!0,...t},s)=>h(q.Root,{ref:s,decorative:r,orientation:a,className:ze("shrink-0 bg-border","horizontal"===a?"h-[1px] w-full":"h-full w-[1px]",e),...t}));ra.displayName=q.Root.displayName;const ta=B.Root,sa=B.Trigger,oa=B.Portal,na=a.forwardRef(({className:e,...a},r)=>h(B.Overlay,{className:ze("fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",e),...a,ref:r}));na.displayName=B.Overlay.displayName;const ia=a.forwardRef(({className:e,...a},r)=>p(oa,{children:[h(na,{}),h(B.Content,{ref:r,className:ze("fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",e),...a})]}));ia.displayName=B.Content.displayName;const la=({className:e,...a})=>h("div",{className:ze("flex flex-col space-y-2 text-center sm:text-left",e),...a});la.displayName="AlertDialogHeader";const da=({className:e,...a})=>h("div",{className:ze("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",e),...a});da.displayName="AlertDialogFooter";const ca=a.forwardRef(({className:e,...a},r)=>h(B.Title,{ref:r,className:ze("text-lg font-semibold",e),...a}));ca.displayName=B.Title.displayName;const ua=a.forwardRef(({className:e,...a},r)=>h(B.Description,{ref:r,className:ze("text-sm text-muted-foreground",e),...a}));ua.displayName=B.Description.displayName;const ma=a.forwardRef(({className:e,...a},r)=>h(B.Action,{ref:r,className:ze(je(),e),...a}));ma.displayName=B.Action.displayName;const ha=a.forwardRef(({className:e,...a},r)=>h(B.Cancel,{ref:r,className:ze(je({variant:"outline"}),"mt-2 sm:mt-0",e),...a}));ha.displayName=B.Cancel.displayName;const pa=j.Root,fa=j.Portal,ga=a.forwardRef(({className:e,...a},r)=>h(j.Overlay,{ref:r,className:ze("fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",e),...a}));ga.displayName=j.Overlay.displayName;const ya={sm:{width:"30vw",minWidth:"320px",maxWidth:"480px",maxHeight:"320px"},md:{width:"50vw",minWidth:"480px",maxWidth:"720px",maxHeight:"70vh"},lg:{width:"85vw",height:"85vh",maxWidth:"1440px",minHeight:"480px",maxHeight:"900px"}},va=a.forwardRef(({className:r,children:t,size:s,variant:o="informative",isDirty:n,customWidth:i,customMinWidth:l,customMaxWidth:d,customHeight:c,customMinHeight:u,customMaxHeight:m,unsavedChangesTitle:f=e.t("unsaved_changes"),unsavedChangesDescription:g=e.t("unsaved_changes_description"),cancelText:y=e.t("cancel"),leaveWithoutSavingText:v=e.t("leave_without_saving"),style:w,onInteractOutside:x,onEscapeKeyDown:b,..._},N)=>{const[S,E]=a.useState(!1),I=a.useRef(null),A=a.useRef(!1),T=s??(i||l||d||c||u||m?void 0:"md"),C=T?ya[T]:{},D={...i??C.width?{width:i??C.width}:{},...l??C.minWidth?{minWidth:l??C.minWidth}:{},...d??C.maxWidth?{maxWidth:d??C.maxWidth}:{},...c??C.height?{height:c??C.height}:{},...u??C.minHeight?{minHeight:u??C.minHeight}:{},...m??C.maxHeight?{maxHeight:m??C.maxHeight}:{},...w},P=a.useCallback(e=>{"form"===o&&n?(I.current=e,E(!0)):e()},[o,n]),U=a.useRef(null),R="destructive"!==o;if("development"===process.env.NODE_ENV&&t){const e=a.Children.toArray(t);e.some(e=>a.isValidElement(e)&&"DialogFooter"===e.type?.displayName),e.some(e=>a.isValidElement(e)&&"DialogBody"===e.type?.displayName)}return p(fa,{children:[h(ga,{}),p(j.Content,{ref:N,className:ze("fixed left-[50%] top-[50%] z-50 flex flex-col translate-x-[-50%] translate-y-[-50%] border-0 border-l-[10px] border-l-primary bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] rounded-lg max-sm:!w-[calc(100vw-2rem)] max-sm:!h-[calc(100dvh-2rem)] max-sm:!min-w-0 max-sm:!min-h-0 max-sm:!max-w-none max-sm:!max-h-none max-sm:p-4",r),style:D,onInteractOutside:e=>{"form"!==o&&"destructive"!==o?x?.(e):e.preventDefault()},onEscapeKeyDown:e=>{if("destructive"!==o)return"form"===o&&n?(e.preventDefault(),void P(()=>{A.current=!0,U.current?.click()})):void b?.(e);e.preventDefault()},..._,children:[t,R&&p(j.Close,{ref:U,onClick:e=>{A.current?A.current=!1:"form"===o&&n&&(e.preventDefault(),P(()=>{A.current=!0,U.current?.click()}))},className:"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-0 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground",children:[h(k,{className:"h-4 w-4"}),h("span",{className:"sr-only",children:"Close"})]})]}),h(ta,{open:S,onOpenChange:E,children:p(ia,{children:[p(la,{children:[h(ca,{children:f}),h(ua,{children:g})]}),p(da,{children:[h(ha,{onClick:()=>{E(!1),I.current=null},children:y}),h(ma,{onClick:()=>{E(!1),I.current?.(),I.current=null},children:v})]})]})})]})});va.displayName=j.Content.displayName;const wa=({className:e,showSeparator:a=!1,children:r,...t})=>p("div",{className:ze("flex flex-col flex-shrink-0",e),...t,children:[h("div",{className:"flex flex-col text-left",children:r}),a&&h(ra,{className:"mt-2"})]});wa.displayName="DialogHeader";const xa=({className:e,...a})=>h("div",{className:ze("flex-1 min-h-0 overflow-auto py-4 px-2 -mx-2",e),...a});xa.displayName="DialogBody";const ba=a.forwardRef(({className:e,...a},r)=>h(j.Title,{ref:r,className:ze("text-xl font-semibold leading-none tracking-tight",e),...a}));ba.displayName=j.Title.displayName;a.forwardRef(({className:e,...a},r)=>h(j.Description,{ref:r,className:ze("text-sm text-muted-foreground",e),...a})).displayName=j.Description.displayName;var _a=function(e,a){for(var r={};e.length;){var t=e[0],s=t.code,o=t.message,n=t.path.join(".");if(!r[n])if("unionErrors"in t){var i=t.unionErrors[0].errors[0];r[n]={message:i.message,type:i.code}}else r[n]={message:o,type:s};if("unionErrors"in t&&t.unionErrors.forEach(function(a){return a.errors.forEach(function(a){return e.push(a)})}),a){var l=r[n].types,d=l&&l[t.code];r[n]=$(n,a,r,s,d?[].concat(d,t.message):t.message)}e.shift()}return r},Na=function(e,a,r){return void 0===r&&(r={}),function(t,s,o){try{return Promise.resolve(function(s,n){try{var i=Promise.resolve(e["sync"===r.mode?"parse":"parseAsync"](t,a)).then(function(e){return o.shouldUseNativeValidation&&H({},o),{errors:{},values:r.raw?t:e}})}catch(l){return n(l)}return i&&i.then?i.then(void 0,n):i}(0,function(e){if(function(e){return Array.isArray(null==e?void 0:e.errors)}(e))return{values:{},errors:K(_a(e.errors,!o.shouldUseNativeValidation&&"all"===o.criteriaMode),o)};throw e}))}catch(n){return Promise.reject(n)}}};const ka=R("text-xs font-medium leading-none text-foreground peer-disabled:cursor-not-allowed peer-disabled:opacity-70"),Sa=a.forwardRef(({className:e,...a},r)=>h(J.Root,{ref:r,className:ze(ka(),e),...a}));Sa.displayName=J.Root.displayName;const Ea=a.forwardRef(({className:e,children:a,...r},t)=>p(F.Root,{ref:t,className:ze("relative overflow-hidden",e),...r,children:[h(F.Viewport,{className:"h-full w-full rounded-[inherit]",children:a}),h(Ia,{}),h(F.Corner,{})]}));Ea.displayName=F.Root.displayName;const Ia=a.forwardRef(({className:e,orientation:a="vertical",...r},t)=>h(F.ScrollAreaScrollbar,{ref:t,orientation:a,className:ze("flex touch-none select-none transition-colors","vertical"===a&&"h-full w-2.5 border-l border-l-transparent p-[1px]","horizontal"===a&&"h-2.5 flex-col border-t border-t-transparent p-[1px]",e),...r,children:h(F.ScrollAreaThumb,{className:"relative flex-1 rounded-full bg-border"})}));Ia.displayName=F.ScrollAreaScrollbar.displayName;const Aa=a.forwardRef(({className:e,type:r,showCharCount:t,maxLength:s,onChange:o,...n},i)=>{const[l,d]=a.useState(0);a.useEffect(()=>{"string"==typeof n.value?d(n.value.length):"string"==typeof n.defaultValue&&d(n.defaultValue.length)},[n.value,n.defaultValue]);return p("div",{className:"w-full",children:[h("input",{type:r,className:ze("flex h-10 w-full rounded-lg border border-input bg-background px-3 py-2 text-base ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground hover:border-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 transition-colors md:text-sm",e),ref:i,maxLength:s,onChange:e=>{d(e.target.value.length),o?.(e)},...n}),t&&s&&p("div",{className:"text-right text-xs text-muted-foreground mt-1",children:[l," / ",s]})]})});Aa.displayName="Input";const Ta=a.createContext({showCheck:!1}),Ca=({showCheck:e=!1,...a})=>h(Ta.Provider,{value:{showCheck:e},children:h(Q.Root,{...a})}),Da=Q.Value,Pa=a.forwardRef(({className:e,children:a,...r},t)=>p(Q.Trigger,{ref:t,className:ze("flex h-10 w-full items-center justify-between rounded-lg border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground hover:border-primary focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 transition-colors [&>span]:line-clamp-1",e),...r,children:[a,h(Q.Icon,{asChild:!0,children:h(_,{className:"h-4 w-4 opacity-50"})})]}));Pa.displayName=Q.Trigger.displayName;const Ua=a.forwardRef(({className:e,...a},r)=>h(Q.ScrollUpButton,{ref:r,className:ze("flex cursor-default items-center justify-center py-1",e),...a,children:h(S,{className:"h-4 w-4"})}));Ua.displayName=Q.ScrollUpButton.displayName;const Ra=a.forwardRef(({className:e,...a},r)=>h(Q.ScrollDownButton,{ref:r,className:ze("flex cursor-default items-center justify-center py-1",e),...a,children:h(_,{className:"h-4 w-4"})}));Ra.displayName=Q.ScrollDownButton.displayName;const Va=a.forwardRef(({className:e,children:a,position:r="popper",container:t,collisionBoundary:s,...o},n)=>h(Q.Portal,{container:t,children:p(Q.Content,{ref:n,className:ze("relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2","popper"===r&&"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",e),position:r,collisionBoundary:s,...o,children:[h(Ua,{}),h(Q.Viewport,{className:ze("p-1","popper"===r&&"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]"),children:a}),h(Ra,{})]})}));Va.displayName=Q.Content.displayName;a.forwardRef(({className:e,...a},r)=>h(Q.Label,{ref:r,className:ze("py-1.5 pl-8 pr-2 text-sm font-semibold",e),...a})).displayName=Q.Label.displayName;const La=a.forwardRef(({className:e,children:r,...t},s)=>{const{showCheck:o}=a.useContext(Ta);return p(Q.Item,{ref:s,className:ze("relative flex w-full cursor-pointer select-none items-center rounded-sm py-1.5 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",o?"pl-8":"pl-2","data-[state=checked]:bg-accent data-[state=checked]:text-accent-foreground data-[state=checked]:font-medium data-[state=checked]:border-l-2 data-[state=checked]:border-primary",o?"data-[state=checked]:pl-[calc(2rem-2px)]":"data-[state=checked]:pl-[calc(0.5rem-2px)]",e),...t,children:[o&&h("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:h(Q.ItemIndicator,{children:h(w,{className:"h-4 w-4"})})}),h(Q.ItemText,{children:r})]})});La.displayName=Q.Item.displayName;a.forwardRef(({className:e,...a},r)=>h(Q.Separator,{ref:r,className:ze("-mx-1 my-1 h-px bg-muted",e),...a})).displayName=Q.Separator.displayName;const Oa=M.object({id_leader:M.string().nullable(),id_users:M.array(M.string()).min(1,e.t("leadership_select_subordinates"))}),za=M.object({id_leader:M.string().nullable(),id_users:M.array(M.string())});function ja({value:a,onChange:r,excludeUserIds:t=[],error:s}){const{data:o=[],isLoading:l}=Te(),[c,u]=n(""),m=i(null),f=i(0),g=o.filter(e=>!t.includes(e.userId||"")).filter(e=>{const a=c.toLowerCase(),r=e.userName?.toLowerCase().includes(a);return r}).sort((e,r)=>{const t=a.includes(e.userId),s=a.includes(r.userId);if(t&&!s)return-1;if(!t&&s)return 1;const o=e.userName||e.userEmail||"",n=r.userName||r.userEmail||"";return o.localeCompare(n)});return d(()=>{m.current&&f.current>0&&(m.current.scrollTop=f.current)},[g]),p("div",l?{className:"flex items-center justify-center p-4",children:[h(E,{className:"h-6 w-6 animate-spin"}),h("span",{className:"ml-2",children:"Carregando dados..."})]}:{className:"space-y-2",children:[h(Aa,{placeholder:e.t("search_user_placeholder"),value:c,onChange:e=>u(e.target.value)}),h("div",{ref:m,className:"border rounded-md p-4 max-h-[300px] overflow-y-auto",children:0===g.length?h("p",{className:"text-sm text-muted-foreground",children:e.t("search_user_placeholder")}):h("div",{className:"space-y-2",children:g.map(e=>p("div",{className:"flex items-center space-x-2",children:[h(Be,{id:e.userId,checked:a.includes(e.userId),onCheckedChange:()=>{return t=e.userId,m.current&&(f.current=m.current.scrollTop),void(a.includes(t)?r(a.filter(e=>e!==t)):r([...a,t]));var t}}),h(Sa,{htmlFor:e.userId,className:"flex-1 cursor-pointer",children:e.userName||e.userEmail})]},e.userId))})}),a.length>0&&p("p",{className:"text-sm text-muted-foreground",children:[a.length," selecionado(s)"]}),s&&h("p",{className:"text-sm text-destructive",children:s})]})}function qa({leader:a,prefilledLeaderId:r,onSuccess:t}){const{t:s}=v(),{alias:o}=Ae(),i=!!a,l=a?.id.startsWith("virtual-"),c=Ue(),u=Pe(),m=Re(),g=Le(),y=Ve(),{data:w=[]}=Ce(),{data:x=[]}=Te(),[b,_]=n(""),N=X(w).map(e=>e.id_user),k=i?X(w).filter(e=>e.id_leader===a.id_user).map(e=>e.id_user):[],S=W({resolver:Na(i?za:Oa),defaultValues:{id_leader:r||(i?a?.id_leader:null)||null,id_users:i?k:[]}});d(()=>{if(a){const e=X(w).filter(e=>e.id_leader===a.id_user).map(e=>e.id_user);S.reset({id_leader:a.id_leader||null,id_users:e})}else r?S.reset({id_leader:r,id_users:[]}):S.reset({id_leader:null,id_users:[]})},[o,a?.id,a?.id_user,a?.id_leader,r,w]);const A=c.isPending||u.isPending||m.isPending||g.isPending||y.isPending,T=S.watch("id_leader"),C=S.watch("id_users"),D=i?[a.id_user,...N.filter(e=>e!==a.id_user&&!C.includes(e)&&!k.includes(e))]:[T,...N.filter(e=>!C.includes(e))].filter(Boolean);return p("form",{onSubmit:S.handleSubmit(async e=>{try{if(i)if(l){await u.mutateAsync({id_user:a.id_user,id_leader:e.id_leader});const r=x.filter(a=>e.id_users.includes(a.userId)).map(e=>({id_user:e.userId}));await g.mutateAsync({leaderUserId:a.id_user,selectedUsers:r})}else{await m.mutateAsync({id:a.id,id_leader:e.id_leader});const r=x.filter(a=>e.id_users.includes(a.userId)).map(e=>({id_user:e.userId}));await g.mutateAsync({leaderUserId:a.id_user,selectedUsers:r})}else{const a=x.filter(a=>e.id_users.includes(a.userId)).map(e=>({id_user:e.userId}));await c.mutateAsync({id_leader:e.id_leader,users:a})}t?.()}catch(r){}}),className:"space-y-4",children:[i&&p("div",{children:[h(Sa,{children:e.t("leader")}),h(Aa,{value:x.find(e=>e.userId===a.id_user)?.userName||a.name||e.t("inactive_user"),disabled:!0,className:"bg-muted"})]}),p("div",{children:[h(Sa,{children:s("leadership_immediate_superior")}),p(Ca,{value:T||"none",onValueChange:e=>S.setValue("id_leader","none"===e?null:e),children:[h(Pa,{children:h(Da,{placeholder:"Selecione..."})}),p(Va,{children:[h("div",{className:"sticky top-0 z-10 bg-background p-2 border-b",children:h(Aa,{placeholder:"Buscar superior...",value:b,onChange:e=>_(e.target.value),onKeyDown:e=>e.stopPropagation(),onClick:e=>e.stopPropagation(),className:"h-8"})}),p(Ea,{className:"h-[200px]",children:[h(La,{value:"none",children:"[Nenhum]"}),x.filter(e=>{const r=i?e.userId!==a.id_user:!C.includes(e.userId),t=!b||e.userName?.toLowerCase().includes(b.toLowerCase());return r&&t}).sort((e,a)=>{const r=e.userName||e.userEmail||"",t=a.userName||a.userEmail||"";return r.localeCompare(t)}).map(e=>h(La,{value:e.userId,children:e.userName},e.userId))]})]})]},`superior-select-${o}`),S.formState.errors.id_leader&&h("p",{className:"text-sm text-destructive mt-1",children:S.formState.errors.id_leader.message})]}),p("div",{children:[h(Sa,{children:"Subordinados *"}),h(ja,{value:C,onChange:e=>S.setValue("id_users",e),excludeUserIds:D,error:S.formState.errors.id_users?.message},`users-multiselect-${o}`)]}),p("div",{className:"flex items-center justify-between gap-2",children:[h(qe,{type:"submit",disabled:A||!i&&0===C.length,children:A&&!y.isPending?p(f,{children:[h(E,{className:"mr-2 h-4 w-4 animate-spin"}),i?"Atualizando...":"Salvando..."]}):i?"Atualizar":"Criar"}),i&&!T&&0===C.length&&p(ta,{children:[h(sa,{asChild:!0,children:h(qe,{type:"button",variant:"destructive",disabled:A,className:"ml-auto",children:y.isPending?p(f,{children:[h(E,{className:"mr-2 h-4 w-4 animate-spin"}),"Removendo..."]}):p(f,{children:[h(I,{className:"mr-2 h-4 w-4"}),"Remover"]})})}),p(ia,{children:[p(la,{children:[h(ca,{children:s("confirm_removal")}),h(ua,{children:"Tem certeza que deseja remover este líder? Esta ação não pode ser desfeita."})]}),p(da,{children:[h(ha,{children:s("cancel")}),h(ma,{onClick:async()=>{if(a)try{await y.mutateAsync(a.id),t?.()}catch(e){}},children:s("remove")})]})]})]})]})]})}function Ba({open:e,onOpenChange:a,leader:r,prefilledLeaderId:t,title:s}){return h(pa,{open:e,onOpenChange:a,children:p(va,{variant:"form",className:"sm:max-w-[500px]",children:[h(wa,{showSeparator:!0,children:h(ba,{children:s})}),h(xa,{children:h(qa,{leader:r,prefilledLeaderId:t,onSuccess:()=>a(!1)})})]})})}const Ma="leadership-expanded-nodes",$a=(e,a)=>{try{localStorage.setItem(`${Ma}-${e}`,JSON.stringify(Array.from(a)))}catch{}};function Wa({unassociatedUsers:a=[],onAssociateUser:r,onMoveNode:t,onMoveNodes:s,columns:i,nameHeader:c=e.t("leader"),rootDropLabel:u=e.t("leadership_make_root")}={}){const{alias:m}=Ae(),{data:g,isLoading:y,error:v,refetch:w}=Ce(),b=Re(),k=Pe(),[S,E]=n(()=>m?(e=>{try{const a=localStorage.getItem(`${Ma}-${e}`);if(a)return new Set(JSON.parse(a))}catch{}return new Set})(m):new Set),[I,U]=n([]),[R,V]=n(new Set),[L,O]=n(!0),[z,j]=n(!1),[q,B]=n(),[M,$]=n(null),W=o(()=>g?X(g):[],[g]),H=o(()=>W.map(e=>e.id),[W]),K=H.length>0&&I.length===H.length,J=W.filter(e=>e.children.length>0).every(e=>S.has(e.id));d(()=>{if(g&&g.length>0&&m){if(!localStorage.getItem(`${Ma}-${m}`)){const e=g.map(e=>e.id),a=new Set(e);E(a),$a(m,a)}}},[g,m]);const F=l(e=>{E(a=>{const r=new Set(a);return r.has(e)?r.delete(e):r.add(e),m&&$a(m,r),r})},[m]),Q=l(()=>{if(J){const e=new Set;E(e),m&&$a(m,e)}else{const e=new Set(W.filter(e=>e.children.length>0).map(e=>e.id));E(e),m&&$a(m,e)}},[J,W,m]),Y=l(e=>{U(a=>a.includes(e)?a.filter(a=>a!==e):[...a,e])},[]),G=l(()=>{U(K?[]:H)},[K,H]),Z=l(e=>{V(a=>{const r=new Set(a);return r.has(e)?r.delete(e):r.add(e),r})},[]),ee=l(e=>W.find(a=>a.id===e),[W]),ae=l((e,s)=>{if(t)return void t(e,s);const o=a.find(a=>a.id===e);if(o){if(r){const e=s?ee(s):null;r(o.id,e?.id_user||null)}else k.mutate({id_user:o.id,id_leader:s&&ee(s)?.id_user||null});return}const n=ee(e);if(!n)return;const i=s?ee(s):null;b.mutate({id:n.id,id_leader:i?.id_user||null})},[t,a,r,ee,b,k]),re=l((e,a)=>{s?s(e,a):(e.forEach(e=>ae(e,a)),U([]))},[s,ae]),te=l(e=>{B(e),$(null),j(!0)},[]),se=l(()=>{B(void 0),$(null),j(!0)},[]),oe=l(()=>{j(!1),B(void 0),$(null)},[]),ne=l((e,a)=>{const r=R.has(e)&&R.size>1?Array.from(R):[e];a.dataTransfer.effectAllowed="move",a.dataTransfer.setData("text/plain",e),a.dataTransfer.setData("application/x-tree-ids",JSON.stringify(r)),a.currentTarget.style.opacity="0.4"},[R]),ie=o(()=>[{key:"subordinatesCount",header:"Subordinados",hoverContent:e=>e.subordinateNames&&e.subordinateNames.length>0?p("div",{className:"space-y-1.5",children:[h("p",{className:"text-xs font-medium text-muted-foreground mb-1",children:"Subordinados diretos:"}),[...e.subordinateNames].sort((e,a)=>e.localeCompare(a)).map(e=>p("div",{className:"flex items-center gap-2 text-sm",children:[h(x,{className:"h-3 w-3 text-muted-foreground"}),h("span",{children:e})]},e))]}):h("p",{className:"text-xs text-muted-foreground",children:"Sem subordinados diretos"})},{key:"email",header:"Email",className:"text-left",width:180,render:e=>p("span",{className:"flex items-center gap-1.5 text-muted-foreground text-sm",children:[h(A,{className:"h-3.5 w-3.5"}),e.email||"—"]})}],[]),le=i??ie;if(y)return h("div",{className:"flex items-center justify-center h-full",children:p("div",{className:"text-center space-y-2",children:[h("div",{className:"animate-spin h-8 w-8 border-4 border-primary border-t-transparent rounded-full mx-auto"}),h("p",{className:"text-sm text-muted-foreground",children:"Carregando..."})]})});if(v)return h("div",{className:"flex items-center justify-center h-full",children:p("div",{className:"text-center",children:[h("p",{className:"text-destructive mb-4",children:"Erro ao carregar hierarquia de liderança"}),h(qe,{onClick:()=>w(),children:e.t("try_again")})]})});const de=W.filter(a=>a.name!==e.t("inactive_user")).length;return p("div",{className:"flex flex-col h-full gap-3 p-4",children:[p("div",{className:"flex items-center justify-between",children:[p("div",{className:"flex gap-2 items-center",children:[p(qe,{size:"sm",onClick:se,children:[h(T,{className:"h-4 w-4 mr-2"}),"Definir Líder"]}),h(qe,{size:"sm",variant:"outline",onClick:Q,children:p(f,J?{children:[h(_,{className:"h-4 w-4 mr-1"}),"Colapsar"]}:{children:[h(N,{className:"h-4 w-4 mr-1"}),"Expandir"]})}),h("div",{className:"flex items-center gap-2 ml-4",children:p("div",{className:"flex items-center gap-2 px-3 py-1.5 bg-muted rounded-md",children:[h(C,{className:"h-4 w-4 text-muted-foreground"}),p("span",{className:"text-sm font-medium",children:[de," usuário",1!==de?"s":""," associado",1!==de?"s":""]})]})})]}),h("p",{className:"text-xs text-muted-foreground",children:"Arraste as linhas para reorganizar • Selecione múltiplos para mover em lote"})]}),h(aa,{data:g||[],columns:le,nameKey:"name",nameHeader:c,expandedIds:S,onToggleExpand:F,iconComponent:h(C,{className:"h-4 w-4 text-muted-foreground shrink-0"}),rowActionsVariant:"inline",enableRowDrag:!0,enableSelection:!0,selectedIds:I,onSelectItem:Y,onSelectAll:G,isAllSelected:K,onMoveNode:ae,onMoveNodes:re,rootDropLabel:u,emptyMessage:e.t("leadership_no_hierarchy"),renderActions:e=>h(qe,{variant:"ghost",size:"icon",className:"h-8 w-8",onClick:()=>te(e),children:h(D,{className:"h-4 w-4"})})}),a.length>0&&p("div",{className:"border rounded-lg overflow-hidden",children:[p("button",{type:"button",onClick:()=>O(e=>!e),className:"w-full px-4 py-2.5 bg-muted/50 border-b flex items-center gap-2 hover:bg-muted/70 transition-colors cursor-pointer",children:[h(L?_:N,{className:"h-4 w-4 text-muted-foreground shrink-0"}),h(P,{className:"h-4 w-4 text-muted-foreground"}),h("span",{className:"text-sm font-medium",children:"Usuários não associados"}),p("span",{className:"text-xs text-muted-foreground ml-1",children:["(",a.length,")"]}),R.size>0&&p("span",{className:"text-xs text-primary ml-1",children:["(",R.size," selecionado",R.size>1?"s":"",")"]}),h("span",{className:"text-xs text-muted-foreground ml-auto",children:"Arraste para a hierarquia acima"})]}),L&&h("div",{className:"divide-y",children:a.map(e=>p("div",{draggable:!0,onDragStart:a=>ne(e.id,a),onDragEnd:e=>{e.currentTarget.style.opacity="1"},className:ze("flex items-center gap-3 px-4 py-2.5 hover:bg-accent/50 cursor-grab active:cursor-grabbing transition-colors",R.has(e.id)&&"bg-primary/5"),children:[h(Be,{checked:R.has(e.id),onCheckedChange:()=>Z(e.id),onClick:e=>e.stopPropagation(),className:"shrink-0"}),h("span",{className:"text-muted-foreground shrink-0 select-none",children:"⠿"}),h(x,{className:"h-4 w-4 text-muted-foreground shrink-0"}),p("div",{className:"flex flex-col min-w-0",children:[h("span",{className:"text-sm truncate",children:e.name}),h("span",{className:"text-xs text-muted-foreground truncate",children:e.email})]})]},e.id))})]}),p("div",{className:"px-3 py-2 bg-muted/20 border rounded-lg text-xs text-muted-foreground flex justify-between",children:[p("span",{children:["Usuários associados: ",de]}),a.length>0&&p("span",{children:["Usuários não associados: ",a.length]})]}),h(Ba,{open:z,onOpenChange:oe,leader:q,prefilledLeaderId:M,title:q?e.t("edit_name"):M?e.t("leadership_add_subordinate"):e.t("leadership_add_root")},`leadership-dialog-${m}`)]})}export{Ba as LeadershipDialog,qa as LeadershipForm,Wa as LeadershipPage,G as buildHierarchy,Y as filterAndPromoteOrphans,X as flattenTree,Ue as useCreateMultipleLeadersMutation,Pe as useCreateSingleLeaderMutation,Ce as useLeadershipApi,Ve as useRemoveLeaderMutation,Le as useSyncSubordinatesMutation,Re as useUpdateLeaderMutation};
|
|
1
|
+
import e from"i18next";import{useMemo as r,useState as a,useEffect as s,useRef as i,useCallback as t}from"react";import{useQuery as n,useQueryClient as d,useMutation as o}from"@tanstack/react-query";import{useAuth as l,TokenManager as c,useQualiexUsers as u,getSupabaseClient as m,Label as h,Input as f,Select as _,SelectTrigger as p,SelectValue as g,SelectContent as w,ScrollArea as v,SelectItem as N,Button as x,AlertDialog as y,AlertDialogTrigger as b,AlertDialogContent as E,AlertDialogHeader as S,AlertDialogTitle as C,AlertDialogDescription as I,AlertDialogFooter as q,AlertDialogCancel as k,AlertDialogAction as U,Checkbox as A,Dialog as z,DialogContent as L,DialogHeader as P,DialogTitle as $,DialogBody as j,TreeTable as D,cn as T}from"forlogic-core";import{toast as K}from"sonner";import{useTranslation as M}from"react-i18next";import{jsxs as O,jsx as F,Fragment as V}from"react/jsx-runtime";import{Loader2 as Q,Trash2 as J,User as R,Mail as B,Plus as H,ChevronDown as W,ChevronRight as G,Users as X,Pencil as Y,UserPlus as Z}from"lucide-react";import{z as ee}from"zod";import{appendErrors as re,useForm as ae}from"react-hook-form";import{validateFieldsNatively as se,toNestErrors as ie}from"@hookform/resolvers";function te(e,r){const a=e.map(e=>({...e})),s=new Set(a.filter(e=>!r.has(e.id_user)).map(e=>e.id_user));return a.forEach(e=>{if(e.id_leader&&s.has(e.id_leader)){let r=e.id_leader;for(;r&&s.has(r);){const e=a.find(e=>e.id_user===r);r=e?.id_leader||null}e.id_leader=r}}),a.filter(e=>r.has(e.id_user))}function ne(e){const r=new Map,a=new Map,s=[];e.forEach(e=>{const s={...e,children:[],level:0};r.set(e.id,s),a.set(e.id_user,s)}),e.forEach(e=>{const i=r.get(e.id);if(e.id_leader){const r=a.get(e.id_leader);if(r)return void r.children.push(i)}s.push(i)});const i=(e,r)=>{e.level=r,e.children.forEach(e=>i(e,r+1))};s.forEach(e=>i(e,0));const t=e=>{e.sort((e,r)=>{const a=e.name||e.id_user||e.email||"",s=r.name||r.id_user||r.email||"";return a.localeCompare(s)}),e.forEach(e=>e.children.length>0&&t(e.children))};return t(s),s}function de(e){const r=[],a=e=>{r.push(e),e.children.forEach(a)};return e.forEach(a),r}function oe(){const{alias:a,isAuthenticated:s}=l(),i=c.getAccessToken(),{data:t=[]}=u(),d=n({queryKey:["leadership-raw",a],queryFn:async()=>{if(!i||!a)throw new Error("Usuário não autenticado ou unidade não selecionada");const e=m(),{data:r,error:s}=await e.schema("common").from("leaders").select("*").eq("is_removed",!1).eq("alias",a);if(s)throw new Error("Erro ao buscar hierarquia de liderança");return r??[]},enabled:!!i&&!!a&&s}),o=r(()=>{const r=d.data;if(!r)return;if(0===r.length)return[];const a={};t.forEach(e=>{a[e.userId]={name:e.userName||e.userEmail,email:e.userEmail||""}});const s=r.map(s=>{const i=r.filter(e=>e.id_leader===s.id_user);return{...s,name:a[s.id_user]?.name||e.t("inactive_user"),email:a[s.id_user]?.email||"",subordinatesCount:i.length,subordinateNames:i.map(e=>a[e.id_user]?.name||"[Usuário inativo]").sort((e,r)=>e.localeCompare(r))}}),i=new Set(r.map(e=>e.id_user));return new Set(r.filter(e=>e.id_leader&&!i.has(e.id_leader)).map(e=>e.id_leader)).forEach(i=>{const t=a[i],n=r.filter(e=>e.id_leader===i);s.push({id:`virtual-${i}`,alias:r[0]?.alias||"",id_user:i,id_leader:null,is_removed:!1,is_active:!0,created_at:(new Date).toISOString(),updated_at:(new Date).toISOString(),name:t?.name||e.t("inactive_user"),email:t?.email||"",subordinatesCount:n.length,subordinateNames:n.map(e=>a[e.id_user]?.name||"[Usuário inativo]").sort((e,r)=>e.localeCompare(r))})}),ne(s)},[d.data,t]);return{...d,data:o}}const le="common";function ce(){const{alias:e}=l(),r=d(),a=m(),{t:s}=M();return o({mutationFn:async r=>{if(!e)throw new Error(s("unit_not_selected","Unidade não selecionada"));if(r.id_user===r.id_leader)throw new Error(s("cannot_be_own_leader","Usuário não pode ser seu próprio líder"));r.id_leader&&await _e(a,e,r.id_user,r.id_leader);const{data:i,error:t}=await a.schema(le).from("leaders").insert({alias:e,id_user:r.id_user,id_leader:r.id_leader,is_active:!0,is_removed:!1}).select().single();if(t)throw t;return i},onSuccess:()=>{r.invalidateQueries({queryKey:["leadership-raw",e]}),K.success(s("leader_promoted_success","Líder virtual promovido com sucesso"))},onError:e=>{K.error(e.message||s("leader_create_error","Erro ao criar líder"))}})}function ue(){const{alias:e}=l(),r=d(),a=m(),{t:s}=M();return o({mutationFn:async r=>{if(!e)throw new Error(s("unit_not_selected","Unidade não selecionada"));if(!r.users.length)throw new Error(s("select_at_least_one",s("leadership_select_subordinates")));const i=r.users.map(e=>e.id_user),{data:t}=await a.schema(le).from("leaders").select("id_user").eq("alias",e).in("id_user",i).eq("is_removed",!1);if(t&&t.length>0){const e=t.map(e=>e.id_user);throw new Error(s("users_already_leaders",`Alguns usuários já estão cadastrados como líderes: ${e.join(", ")}`))}for(const l of r.users){if(r.id_leader&&l.id_user===r.id_leader)throw new Error(s("cannot_be_own_leader","Usuário não pode ser seu próprio líder"));r.id_leader&&await _e(a,e,l.id_user,r.id_leader)}const n=r.users.map(a=>({alias:e,id_user:a.id_user,id_leader:r.id_leader,is_active:!0,is_removed:!1})),{data:d,error:o}=await a.schema(le).from("leaders").insert(n).select();if(o)throw o;return d},onSuccess:a=>{r.invalidateQueries({queryKey:["leadership-raw",e]}),K.success(s("subordinates_added_success",`${a?.length||0} liderado(s) adicionado(s) com sucesso`))},onError:e=>{K.error(e.message||s("subordinates_add_error","Erro ao adicionar liderados"))}})}function me(){const{alias:e}=l(),r=d(),a=m(),{t:s}=M();return o({mutationFn:async r=>{if(!e)throw new Error(s("unit_not_selected","Unidade não selecionada"));const{data:i}=await a.schema(le).from("leaders").select("id_user").eq("id",r.id).eq("alias",e).single();if(!i)throw new Error(s("leader_not_found","Líder não encontrado"));if(i.id_user===r.id_leader)throw new Error(s("cannot_be_own_leader","Usuário não pode ser seu próprio líder"));r.id_leader&&await _e(a,e,i.id_user,r.id_leader,r.id);const{data:t,error:n}=await a.schema(le).from("leaders").update({id_leader:r.id_leader}).eq("id",r.id).eq("alias",e).select().single();if(n)throw n;return t},onSuccess:()=>{r.invalidateQueries({queryKey:["leadership-raw",e]}),K.success(s("leader_updated_success","Líder atualizado com sucesso"))},onError:e=>{K.error(e.message||s("leader_update_error","Erro ao atualizar líder"))}})}function he(){const{alias:e}=l(),r=d(),a=m(),{t:s}=M();return o({mutationFn:async r=>{if(!e)throw new Error(s("unit_not_selected","Unidade não selecionada"));const{error:i}=await a.schema(le).from("leaders").update({is_removed:!0}).eq("id",r).eq("alias",e);if(i)throw i},onSuccess:()=>{r.invalidateQueries({queryKey:["leadership-raw",e]}),K.success(s("leader_removed_success","Líder removido com sucesso"))},onError:e=>{K.error(e.message||s("leader_remove_error","Erro ao remover líder"))}})}function fe(){const{alias:e}=l(),r=d(),a=m(),{t:s}=M();return o({mutationFn:async({leaderUserId:r,selectedUsers:i})=>{if(!e)throw new Error(s("unit_not_selected","Unidade não selecionada"));const t=i.map(e=>e.id_user),n=await Promise.all([a.schema(le).from("leaders").select("id, id_user, id_leader").eq("alias",e).eq("is_removed",!1).eq("id_leader",r),a.schema(le).from("leaders").select("id, id_user, id_leader").eq("alias",e).eq("is_removed",!1).in("id_user",t.length?t:["__none__"])]),[{data:d,error:o},{data:l,error:c}]=n;if(o)throw o;if(c)throw c;const u=d||[],m=l||[],h=new Set(t),f=u.filter(e=>!h.has(e.id_user)),_=m.filter(e=>e.id_leader!==r),p=new Set(m.map(e=>e.id_user)),g=i.filter(e=>!p.has(e.id_user));for(const s of _)await _e(a,e,s.id_user,r,s.id);for(const N of g){if(N.id_user===r)throw new Error(s("cannot_be_own_leader","Usuário não pode ser seu próprio líder"));await _e(a,e,N.id_user,r)}const w=[];if(f.length){const r=f.map(e=>e.id);w.push(a.schema(le).from("leaders").update({is_removed:!0}).in("id",r).eq("alias",e))}if(_.length){const s=_.map(e=>e.id);w.push(a.schema(le).from("leaders").update({id_leader:r}).in("id",s).eq("alias",e))}if(g.length){const s=g.map(a=>({alias:e,id_user:a.id_user,id_leader:r,is_active:!0,is_removed:!1}));w.push(a.schema(le).from("leaders").insert(s))}const v=(await Promise.all(w)).find(e=>e?.error);if(v?.error)throw v.error;return{unlinked:f.length,updated:_.length,created:g.length}},onSuccess:a=>{r.invalidateQueries({queryKey:["leadership-raw",e]}),K.success(s("subordinates_synced_success",`Subordinados sincronizados (${a.created} adicionados, ${a.updated} atualizados, ${a.unlinked} removidos)`))},onError:e=>{K.error(e.message||s("subordinates_sync_error","Erro ao sincronizar subordinados"))}})}async function _e(r,a,s,i,t){const{data:n,error:d}=await r.schema(le).from("leaders").select("id, id_user, id_leader").eq("alias",a).eq("is_removed",!1);if(d)throw d;const o=t?n.filter(e=>e.id!==t):n,l=new Set;let c=i;for(;c;){if(l.has(c))throw new Error(e.t("leadership_cycle_error"));if(c===s)throw new Error("Esta associação criaria um ciclo na hierarquia");l.add(c);const r=o.find(e=>e.id_user===c);c=r?.id_leader||null}}var pe=function(e,r){for(var a={};e.length;){var s=e[0],i=s.code,t=s.message,n=s.path.join(".");if(!a[n])if("unionErrors"in s){var d=s.unionErrors[0].errors[0];a[n]={message:d.message,type:d.code}}else a[n]={message:t,type:i};if("unionErrors"in s&&s.unionErrors.forEach(function(r){return r.errors.forEach(function(r){return e.push(r)})}),r){var o=a[n].types,l=o&&o[s.code];a[n]=re(n,r,a,i,l?[].concat(l,s.message):s.message)}e.shift()}return a},ge=function(e,r,a){return void 0===a&&(a={}),function(s,i,t){try{return Promise.resolve(function(i,n){try{var d=Promise.resolve(e["sync"===a.mode?"parse":"parseAsync"](s,r)).then(function(e){return t.shouldUseNativeValidation&&se({},t),{errors:{},values:a.raw?s:e}})}catch(o){return n(o)}return d&&d.then?d.then(void 0,n):d}(0,function(e){if(function(e){return Array.isArray(null==e?void 0:e.errors)}(e))return{values:{},errors:ie(pe(e.errors,!t.shouldUseNativeValidation&&"all"===t.criteriaMode),t)};throw e}))}catch(n){return Promise.reject(n)}}};const we=ee.object({id_leader:ee.string().nullable(),id_users:ee.array(ee.string()).min(1,e.t("leadership_select_subordinates"))}),ve=ee.object({id_leader:ee.string().nullable(),id_users:ee.array(ee.string())});function Ne({value:r,onChange:t,excludeUserIds:n=[],error:d}){const{data:o=[],isLoading:l}=u(),[c,m]=a(""),_=i(null),p=i(0),g=o.filter(e=>!n.includes(e.userId||"")).filter(e=>{const r=c.toLowerCase(),a=e.userName?.toLowerCase().includes(r);return a}).sort((e,a)=>{const s=r.includes(e.userId),i=r.includes(a.userId);if(s&&!i)return-1;if(!s&&i)return 1;const t=e.userName||e.userEmail||"",n=a.userName||a.userEmail||"";return t.localeCompare(n)});return s(()=>{_.current&&p.current>0&&(_.current.scrollTop=p.current)},[g]),O("div",l?{className:"flex items-center justify-center p-4",children:[F(Q,{className:"h-6 w-6 animate-spin"}),F("span",{className:"ml-2",children:"Carregando dados..."})]}:{className:"space-y-2",children:[F(f,{placeholder:e.t("search_user_placeholder"),value:c,onChange:e=>m(e.target.value)}),F("div",{ref:_,className:"border rounded-md p-4 max-h-[300px] overflow-y-auto",children:0===g.length?F("p",{className:"text-sm text-muted-foreground",children:e.t("search_user_placeholder")}):F("div",{className:"space-y-2",children:g.map(e=>O("div",{className:"flex items-center space-x-2",children:[F(A,{id:e.userId,checked:r.includes(e.userId),onCheckedChange:()=>{return a=e.userId,_.current&&(p.current=_.current.scrollTop),void(r.includes(a)?t(r.filter(e=>e!==a)):t([...r,a]));var a}}),F(h,{htmlFor:e.userId,className:"flex-1 cursor-pointer",children:e.userName||e.userEmail})]},e.userId))})}),r.length>0&&O("p",{className:"text-sm text-muted-foreground",children:[r.length," selecionado(s)"]}),d&&F("p",{className:"text-sm text-destructive",children:d})]})}function xe({leader:r,prefilledLeaderId:i,onSuccess:t}){const{t:n}=M(),{alias:d}=l(),o=!!r,c=r?.id.startsWith("virtual-"),m=ue(),A=ce(),z=me(),L=fe(),P=he(),{data:$=[]}=oe(),{data:j=[]}=u(),[D,T]=a(""),K=de($).map(e=>e.id_user),R=o?de($).filter(e=>e.id_leader===r.id_user).map(e=>e.id_user):[],B=ae({resolver:ge(o?ve:we),defaultValues:{id_leader:i||(o?r?.id_leader:null)||null,id_users:o?R:[]}});s(()=>{if(r){const e=de($).filter(e=>e.id_leader===r.id_user).map(e=>e.id_user);B.reset({id_leader:r.id_leader||null,id_users:e})}else i?B.reset({id_leader:i,id_users:[]}):B.reset({id_leader:null,id_users:[]})},[d,r?.id,r?.id_user,r?.id_leader,i,$]);const H=m.isPending||A.isPending||z.isPending||L.isPending||P.isPending,W=B.watch("id_leader"),G=B.watch("id_users"),X=o?[r.id_user,...K.filter(e=>e!==r.id_user&&!G.includes(e)&&!R.includes(e))]:[W,...K.filter(e=>!G.includes(e))].filter(Boolean);return O("form",{onSubmit:B.handleSubmit(async e=>{try{if(o)if(c){await A.mutateAsync({id_user:r.id_user,id_leader:e.id_leader});const a=j.filter(r=>e.id_users.includes(r.userId)).map(e=>({id_user:e.userId}));await L.mutateAsync({leaderUserId:r.id_user,selectedUsers:a})}else{await z.mutateAsync({id:r.id,id_leader:e.id_leader});const a=j.filter(r=>e.id_users.includes(r.userId)).map(e=>({id_user:e.userId}));await L.mutateAsync({leaderUserId:r.id_user,selectedUsers:a})}else{const r=j.filter(r=>e.id_users.includes(r.userId)).map(e=>({id_user:e.userId}));await m.mutateAsync({id_leader:e.id_leader,users:r})}t?.()}catch(a){}}),className:"space-y-4",children:[o&&O("div",{children:[F(h,{children:e.t("leader")}),F(f,{value:j.find(e=>e.userId===r.id_user)?.userName||r.name||e.t("inactive_user"),disabled:!0,className:"bg-muted"})]}),O("div",{children:[F(h,{children:n("leadership_immediate_superior")}),O(_,{value:W||"none",onValueChange:e=>B.setValue("id_leader","none"===e?null:e),children:[F(p,{children:F(g,{placeholder:"Selecione..."})}),O(w,{children:[F("div",{className:"sticky top-0 z-10 bg-background p-2 border-b",children:F(f,{placeholder:"Buscar superior...",value:D,onChange:e=>T(e.target.value),onKeyDown:e=>e.stopPropagation(),onClick:e=>e.stopPropagation(),className:"h-8"})}),O(v,{className:"h-[200px]",children:[F(N,{value:"none",children:"[Nenhum]"}),j.filter(e=>{const a=o?e.userId!==r.id_user:!G.includes(e.userId),s=!D||e.userName?.toLowerCase().includes(D.toLowerCase());return a&&s}).sort((e,r)=>{const a=e.userName||e.userEmail||"",s=r.userName||r.userEmail||"";return a.localeCompare(s)}).map(e=>F(N,{value:e.userId,children:e.userName},e.userId))]})]})]},`superior-select-${d}`),B.formState.errors.id_leader&&F("p",{className:"text-sm text-destructive mt-1",children:B.formState.errors.id_leader.message})]}),O("div",{children:[F(h,{children:"Subordinados *"}),F(Ne,{value:G,onChange:e=>B.setValue("id_users",e),excludeUserIds:X,error:B.formState.errors.id_users?.message},`users-multiselect-${d}`)]}),O("div",{className:"flex items-center justify-between gap-2",children:[F(x,{type:"submit",disabled:H||!o&&0===G.length,children:H&&!P.isPending?O(V,{children:[F(Q,{className:"mr-2 h-4 w-4 animate-spin"}),o?"Atualizando...":"Salvando..."]}):o?"Atualizar":"Criar"}),o&&!W&&0===G.length&&O(y,{children:[F(b,{asChild:!0,children:F(x,{type:"button",variant:"destructive",disabled:H,className:"ml-auto",children:P.isPending?O(V,{children:[F(Q,{className:"mr-2 h-4 w-4 animate-spin"}),"Removendo..."]}):O(V,{children:[F(J,{className:"mr-2 h-4 w-4"}),"Remover"]})})}),O(E,{children:[O(S,{children:[F(C,{children:n("confirm_removal")}),F(I,{children:"Tem certeza que deseja remover este líder? Esta ação não pode ser desfeita."})]}),O(q,{children:[F(k,{children:n("cancel")}),F(U,{onClick:async()=>{if(r)try{await P.mutateAsync(r.id),t?.()}catch(e){}},children:n("remove")})]})]})]})]})]})}function ye({open:e,onOpenChange:r,leader:a,prefilledLeaderId:s,title:i}){return F(z,{open:e,onOpenChange:r,children:O(L,{variant:"form",className:"sm:max-w-[500px]",children:[F(P,{showSeparator:!0,children:F($,{children:i})}),F(j,{children:F(xe,{leader:a,prefilledLeaderId:s,onSuccess:()=>r(!1)})})]})})}const be="leadership-expanded-nodes",Ee=(e,r)=>{try{localStorage.setItem(`${be}-${e}`,JSON.stringify(Array.from(r)))}catch{}};function Se({unassociatedUsers:i=[],onAssociateUser:n,onMoveNode:d,onMoveNodes:o,columns:c,nameHeader:u=e.t("leader"),rootDropLabel:m=e.t("leadership_make_root")}={}){const{alias:h}=l(),{data:f,isLoading:_,error:p,refetch:g}=oe(),w=me(),v=ce(),[N,y]=a(()=>h?(e=>{try{const r=localStorage.getItem(`${be}-${e}`);if(r)return new Set(JSON.parse(r))}catch{}return new Set})(h):new Set),[b,E]=a([]),[S,C]=a(new Set),[I,q]=a(!0),[k,U]=a(!1),[z,L]=a(),[P,$]=a(null),j=r(()=>f?de(f):[],[f]),K=r(()=>j.map(e=>e.id),[j]),M=K.length>0&&b.length===K.length,Q=j.filter(e=>e.children.length>0).every(e=>N.has(e.id));s(()=>{if(f&&f.length>0&&h){if(!localStorage.getItem(`${be}-${h}`)){const e=f.map(e=>e.id),r=new Set(e);y(r),Ee(h,r)}}},[f,h]);const J=t(e=>{y(r=>{const a=new Set(r);return a.has(e)?a.delete(e):a.add(e),h&&Ee(h,a),a})},[h]),ee=t(()=>{if(Q){const e=new Set;y(e),h&&Ee(h,e)}else{const e=new Set(j.filter(e=>e.children.length>0).map(e=>e.id));y(e),h&&Ee(h,e)}},[Q,j,h]),re=t(e=>{E(r=>r.includes(e)?r.filter(r=>r!==e):[...r,e])},[]),ae=t(()=>{E(M?[]:K)},[M,K]),se=t(e=>{C(r=>{const a=new Set(r);return a.has(e)?a.delete(e):a.add(e),a})},[]),ie=t(e=>j.find(r=>r.id===e),[j]),te=t((e,r)=>{if(d)return void d(e,r);const a=i.find(r=>r.id===e);if(a){if(n){const e=r?ie(r):null;n(a.id,e?.id_user||null)}else v.mutate({id_user:a.id,id_leader:r&&ie(r)?.id_user||null});return}const s=ie(e);if(!s)return;const t=r?ie(r):null;w.mutate({id:s.id,id_leader:t?.id_user||null})},[d,i,n,ie,w,v]),ne=t((e,r)=>{o?o(e,r):(e.forEach(e=>te(e,r)),E([]))},[o,te]),le=t(e=>{L(e),$(null),U(!0)},[]),ue=t(()=>{L(void 0),$(null),U(!0)},[]),he=t(()=>{U(!1),L(void 0),$(null)},[]),fe=t((e,r)=>{const a=S.has(e)&&S.size>1?Array.from(S):[e];r.dataTransfer.effectAllowed="move",r.dataTransfer.setData("text/plain",e),r.dataTransfer.setData("application/x-tree-ids",JSON.stringify(a)),r.currentTarget.style.opacity="0.4"},[S]),_e=r(()=>[{key:"subordinatesCount",header:"Subordinados",hoverContent:e=>e.subordinateNames&&e.subordinateNames.length>0?O("div",{className:"space-y-1.5",children:[F("p",{className:"text-xs font-medium text-muted-foreground mb-1",children:"Subordinados diretos:"}),[...e.subordinateNames].sort((e,r)=>e.localeCompare(r)).map(e=>O("div",{className:"flex items-center gap-2 text-sm",children:[F(R,{className:"h-3 w-3 text-muted-foreground"}),F("span",{children:e})]},e))]}):F("p",{className:"text-xs text-muted-foreground",children:"Sem subordinados diretos"})},{key:"email",header:"Email",className:"text-left",width:180,render:e=>O("span",{className:"flex items-center gap-1.5 text-muted-foreground text-sm",children:[F(B,{className:"h-3.5 w-3.5"}),e.email||"—"]})}],[]),pe=c??_e;if(_)return F("div",{className:"flex items-center justify-center h-full",children:O("div",{className:"text-center space-y-2",children:[F("div",{className:"animate-spin h-8 w-8 border-4 border-primary border-t-transparent rounded-full mx-auto"}),F("p",{className:"text-sm text-muted-foreground",children:"Carregando..."})]})});if(p)return F("div",{className:"flex items-center justify-center h-full",children:O("div",{className:"text-center",children:[F("p",{className:"text-destructive mb-4",children:"Erro ao carregar hierarquia de liderança"}),F(x,{onClick:()=>g(),children:e.t("try_again")})]})});const ge=j.filter(r=>r.name!==e.t("inactive_user")).length;return O("div",{className:"flex flex-col h-full gap-3 p-4",children:[O("div",{className:"flex items-center justify-between",children:[O("div",{className:"flex gap-2 items-center",children:[O(x,{size:"sm",onClick:ue,children:[F(H,{className:"h-4 w-4 mr-2"}),"Definir Líder"]}),F(x,{size:"sm",variant:"outline",onClick:ee,children:O(V,Q?{children:[F(W,{className:"h-4 w-4 mr-1"}),"Colapsar"]}:{children:[F(G,{className:"h-4 w-4 mr-1"}),"Expandir"]})}),F("div",{className:"flex items-center gap-2 ml-4",children:O("div",{className:"flex items-center gap-2 px-3 py-1.5 bg-muted rounded-md",children:[F(X,{className:"h-4 w-4 text-muted-foreground"}),O("span",{className:"text-sm font-medium",children:[ge," usuário",1!==ge?"s":""," associado",1!==ge?"s":""]})]})})]}),F("p",{className:"text-xs text-muted-foreground",children:"Arraste as linhas para reorganizar • Selecione múltiplos para mover em lote"})]}),F(D,{data:f||[],columns:pe,nameKey:"name",nameHeader:u,expandedIds:N,onToggleExpand:J,iconComponent:F(X,{className:"h-4 w-4 text-muted-foreground shrink-0"}),rowActionsVariant:"inline",enableRowDrag:!0,enableSelection:!0,selectedIds:b,onSelectItem:re,onSelectAll:ae,isAllSelected:M,onMoveNode:te,onMoveNodes:ne,rootDropLabel:m,emptyMessage:e.t("leadership_no_hierarchy"),renderActions:e=>F(x,{variant:"ghost",size:"icon",className:"h-8 w-8",onClick:()=>le(e),children:F(Y,{className:"h-4 w-4"})})}),i.length>0&&O("div",{className:"border rounded-lg overflow-hidden",children:[O("button",{type:"button",onClick:()=>q(e=>!e),className:"w-full px-4 py-2.5 bg-muted/50 border-b flex items-center gap-2 hover:bg-muted/70 transition-colors cursor-pointer",children:[F(I?W:G,{className:"h-4 w-4 text-muted-foreground shrink-0"}),F(Z,{className:"h-4 w-4 text-muted-foreground"}),F("span",{className:"text-sm font-medium",children:"Usuários não associados"}),O("span",{className:"text-xs text-muted-foreground ml-1",children:["(",i.length,")"]}),S.size>0&&O("span",{className:"text-xs text-primary ml-1",children:["(",S.size," selecionado",S.size>1?"s":"",")"]}),F("span",{className:"text-xs text-muted-foreground ml-auto",children:"Arraste para a hierarquia acima"})]}),I&&F("div",{className:"divide-y",children:i.map(e=>O("div",{draggable:!0,onDragStart:r=>fe(e.id,r),onDragEnd:e=>{e.currentTarget.style.opacity="1"},className:T("flex items-center gap-3 px-4 py-2.5 hover:bg-accent/50 cursor-grab active:cursor-grabbing transition-colors",S.has(e.id)&&"bg-primary/5"),children:[F(A,{checked:S.has(e.id),onCheckedChange:()=>se(e.id),onClick:e=>e.stopPropagation(),className:"shrink-0"}),F("span",{className:"text-muted-foreground shrink-0 select-none",children:"⠿"}),F(R,{className:"h-4 w-4 text-muted-foreground shrink-0"}),O("div",{className:"flex flex-col min-w-0",children:[F("span",{className:"text-sm truncate",children:e.name}),F("span",{className:"text-xs text-muted-foreground truncate",children:e.email})]})]},e.id))})]}),O("div",{className:"px-3 py-2 bg-muted/20 border rounded-lg text-xs text-muted-foreground flex justify-between",children:[O("span",{children:["Usuários associados: ",ge]}),i.length>0&&O("span",{children:["Usuários não associados: ",i.length]})]}),F(ye,{open:k,onOpenChange:he,leader:z,prefilledLeaderId:P,title:z?e.t("edit_name"):P?e.t("leadership_add_subordinate"):e.t("leadership_add_root")},`leadership-dialog-${h}`)]})}export{ye as LeadershipDialog,xe as LeadershipForm,Se as LeadershipPage,ne as buildHierarchy,te as filterAndPromoteOrphans,de as flattenTree,ue as useCreateMultipleLeadersMutation,ce as useCreateSingleLeaderMutation,oe as useLeadershipApi,he as useRemoveLeaderMutation,fe as useSyncSubordinatesMutation,me as useUpdateLeaderMutation};
|
package/dist/leadership/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var e=require("i18next"),a=require("react"),t=require("@tanstack/react-query"),r=require("react/jsx-runtime"),s=require("@supabase/supabase-js"),n=require("sonner"),o=require("react-i18next"),i=require("lucide-react"),l=require("@radix-ui/react-slot"),d=require("class-variance-authority"),c=require("clsx"),u=require("tailwind-merge");require("date-fns");var m=require("@radix-ui/react-checkbox"),h=require("@radix-ui/react-hover-card"),p=require("@radix-ui/react-dialog"),f=require("@radix-ui/react-separator"),g=require("@radix-ui/react-alert-dialog"),x=require("zod"),y=require("react-hook-form"),v=require("@hookform/resolvers"),b=require("@radix-ui/react-label"),w=require("@radix-ui/react-scroll-area"),_=require("@radix-ui/react-select");function N(e){var a=Object.create(null);return e&&Object.keys(e).forEach(function(t){if("default"!==t){var r=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(a,t,r.get?r:{enumerable:!0,get:function(){return e[t]}})}}),a.default=e,Object.freeze(a)}var k=N(a),j=N(m),S=N(h),C=N(p),E=N(f),I=N(g),A=N(b),T=N(w),D=N(_);function U(e){const a=new Map,t=new Map,r=[];e.forEach(e=>{const r={...e,children:[],level:0};a.set(e.id,r),t.set(e.id_user,r)}),e.forEach(e=>{const s=a.get(e.id);if(e.id_leader){const a=t.get(e.id_leader);if(a)return void a.children.push(s)}r.push(s)});const s=(e,a)=>{e.level=a,e.children.forEach(e=>s(e,a+1))};r.forEach(e=>s(e,0));const n=e=>{e.sort((e,a)=>{const t=e.name||e.id_user||e.email||"",r=a.name||a.id_user||a.email||"";return t.localeCompare(r)}),e.forEach(e=>e.children.length>0&&n(e.children))};return n(r),r}function P(e){const a=[],t=e=>{a.push(e),e.children.forEach(t)};return e.forEach(t),a}class R{static normalizeBase64Url(e){let a=e.replace(/-/g,"+").replace(/_/g,"/");const t=(4-a.length%4)%4;return a+="=".repeat(t),a}static parseJwtPayload(e){try{const s=e.split(".");if(3!==s.length)return null;const n=s[1];n.length,this.LARGE_PAYLOAD_THRESHOLD;try{const e=this.normalizeBase64Url(n),a=atob(e),t=new Uint8Array(a.length);for(let s=0;s<a.length;s++)t[s]=a.charCodeAt(s);const r=new TextDecoder("utf-8").decode(t);return JSON.parse(r)}catch(a){try{const e=this.normalizeBase64Url(n),a=decodeURIComponent(atob(e).split("").map(e=>"%"+("00"+e.charCodeAt(0).toString(16)).slice(-2)).join(""));return JSON.parse(a)}catch(t){try{const e=this.normalizeBase64Url(n),a=atob(e);return JSON.parse(a)}catch(r){throw r}}}}catch(s){return null}}static validateTokens(e,a){const t=[],r=[];try{a.split(".")[1],e.split(".")[1];const s=this.parseJwtPayload(a),n=this.parseJwtPayload(e);if(!s){const e="ID token decode falhou - possível problema com base64url encoding";return r.push(e),{isValid:!1,idTokenValid:!1,accessTokenValid:!1,warnings:t,errors:r}}let o=!0;if(!n){const e="Access token decode falhou - será tentado novamente nas chamadas de API";t.push(e),o=!1}const i=Math.floor(Date.now()/1e3);if(n?.exp&&n.exp<i){const e="Access token expirado - pode precisar de refresh";t.push(e),o=!1}if(s.exp&&s.exp<i){const e="ID token expirado - autenticação inválida";return r.push(e),{isValid:!1,idTokenValid:!1,accessTokenValid:o,warnings:t,errors:r}}return{isValid:!0,idTokenValid:!0,accessTokenValid:o,warnings:t,errors:r}}catch(s){const e=`Erro na validação de tokens: ${s}`;return r.push(e),{isValid:!1,idTokenValid:!1,accessTokenValid:!1,warnings:t,errors:r}}}static isTokenExpired(e){const a=this.parseJwtPayload(e);return!a||!a.exp||1e3*a.exp<Date.now()}}R.LARGE_PAYLOAD_THRESHOLD=1e3;const L={storageProjectId:"ccjfvpnndclajkleyqkc",supabaseProjectId:"ccjfvpnndclajkleyqkc",supabaseUrl:"https://ccjfvpnndclajkleyqkc.supabase.co",supabasePublishableKey:"sb_publishable_w-TKU0hE4bjM_uOgt3fK1g_ewrXKJ8J",oauth:{authUrl:"https://login.qualiex.com/oauth2/authorize",clientId:"ae6021a0-e874-4aab-9716-b478e59cec20"},qualiexApiUrl:"https://common-v4-api.qualiex.com"},V={storageProjectId:"ccjfvpnndclajkleyqkc",supabaseProjectId:"tskpcuganynhsppzoqgj",supabaseUrl:"https://tskpcuganynhsppzoqgj.supabase.co",supabasePublishableKey:"sb_publishable_2EIWdYocxgrN4t_f64Ms3g_pKRcbHfL",oauth:{authUrl:"https://login-dev.qualiex.com/oauth2/authorize",clientId:"ae6021a0-e874-4aab-9716-b478e59cec20"},qualiexApiUrl:"https://common-v4-api-dev.qualiex.com"};function q(){return"DEV"===(void 0).VITE_APP_ENV?"DEV":"PROD"}function O(){return"DEV"===q()?V:L}const z="qualiex_access_token",M="qualiex_id_token",B="supabase_token",$="oauth_state",F="oauth_nonce",H="selected_alias",W="manual_logout",K="supabase_project_id",Q={setAccessToken:e=>localStorage.setItem(z,e),getAccessToken:()=>localStorage.getItem(z),setIdToken:e=>localStorage.setItem(M,e),getIdToken:()=>localStorage.getItem(M),getSupabaseToken:()=>localStorage.getItem(B),setOAuthState:e=>sessionStorage.setItem($,e),getOAuthState:()=>sessionStorage.getItem($),clearOAuthState:()=>sessionStorage.removeItem($),setOAuthNonce:e=>sessionStorage.setItem(F,e),getOAuthNonce:()=>sessionStorage.getItem(F),clearOAuthNonce:()=>sessionStorage.removeItem(F),setSelectedAlias:e=>localStorage.setItem(H,e),getSelectedAlias:()=>localStorage.getItem(H),clearSelectedAlias:()=>localStorage.removeItem(H),generateOAuthNonce:()=>{const e=new Uint8Array(32);return crypto.getRandomValues(e),btoa(String.fromCharCode(...e)).replace(/[+/=]/g,"")},hasAllTokens:()=>!(!Q.getAccessToken()||!Q.getIdToken()),checkProjectMismatch:()=>{const e=O().supabaseProjectId,a=localStorage.getItem(K);return a&&a!==e?(Q.clearAll(),localStorage.setItem(K,e),!0):(a||localStorage.setItem(K,e),!1)},setSupabaseToken:e=>{localStorage.setItem(B,e),Q._clearValidationCache()},areAllTokensValid:()=>{const e=Q.getAccessToken(),a=Q.getIdToken();if(!e||!a)return!1;try{const t=R.validateTokens(e,a);return!!t.idTokenValid&&t.idTokenValid}catch(t){return!1}},clearExpiredTokens:()=>{let e=!1;const a=Q.getAccessToken(),t=Q.getIdToken(),r=Q.getSupabaseToken();return a&&Q.isTokenExpired(a)&&(localStorage.removeItem(z),e=!0),t&&Q.isTokenExpired(t)&&(localStorage.removeItem(M),e=!0),r&&Q.isTokenExpired(r)&&(localStorage.removeItem(B),e=!0),e},clearAll:()=>{localStorage.removeItem(z),localStorage.removeItem(M),localStorage.removeItem(B),localStorage.removeItem(H),sessionStorage.removeItem($),sessionStorage.removeItem(F),Q._clearValidationCache()},setManualLogout:()=>localStorage.setItem(W,"true"),isManualLogout:()=>"true"===localStorage.getItem(W),clearManualLogout:()=>localStorage.removeItem(W),isTokenExpired:e=>{try{return R.isTokenExpired(e)}catch{return!0}},_validationCache:{isValid:!1,timestamp:0,cacheValidityMs:3e5},_clearValidationCache:()=>{Q._validationCache.isValid=!1,Q._validationCache.timestamp=0},isSupabaseTokenValid:()=>{const e=Q.getSupabaseToken();if(!e)return!1;if(Q.isTokenExpired(e))return Q._clearValidationCache(),Q._handleExpiredToken(),!1;const a=Date.now();return a-Q._validationCache.timestamp<Q._validationCache.cacheValidityMs?Q._validationCache.isValid:(Q._validationCache.isValid=!0,Q._validationCache.timestamp=a,!0)},getValidSupabaseToken:()=>Q.isSupabaseTokenValid()?Q.getSupabaseToken():null,_handleExpiredToken:()=>{Q.clearAll()},extractTokenData:()=>{if(!Q.isSupabaseTokenValid())return null;const e=Q.getSupabaseToken();if(!e)return null;try{const a=R.parseJwtPayload(e);if(!a)return null;const t=a.alias||a.default||a.user_alias,r=a.place_id||null,s=a.place_name||null;let n=a.company_id;if(!n&&t)for(const e in a)if(e.startsWith("co")&&/^co\d+$/.test(e)){const r=a[e];if(r&&"string"==typeof r){const e=r.split(";");if(e.length>7&&e[0]===t){n=e[7];break}}}return{alias:t,companyId:n,placeId:r,placeName:s,payload:a}}catch(a){return Q._handleExpiredToken(),null}},getCompanyId:e=>{const a=Q.getAccessToken();if(a)try{const t=R.parseJwtPayload(a);if(t)for(const a in t)if(a.startsWith("co")&&/^co\d+$/.test(a)){const r=t[a];if(r&&"string"==typeof r){const a=r.split(";");if(e&&a.length>7&&a[0]===e)return a[7];if(!e&&a.length>7)return a[7]}}}catch(s){}const t=Q.extractTokenData();if(t?.companyId)return t.companyId;const r=Q.getIdToken();if(r)try{const a=R.parseJwtPayload(r);if(a)for(const t in a)if(t.startsWith("co")&&/^co\d+$/.test(t)){const r=a[t];if(r&&"string"==typeof r){const a=r.split(";");if(e&&a.length>7&&a[0]===e)return a[7];if(!e&&a.length>7)return a[7]}}}catch(s){}return null},getCompanyIdInt:e=>{const a=[Q.getAccessToken(),Q.getIdToken()];for(const t of a)if(t)try{const a=R.parseJwtPayload(t);if(!a)continue;for(const t in a)if(t.startsWith("co")&&/^co\d+$/.test(t)){const r=a[t];if(r&&"string"==typeof r){const a=r.split(";");if(e&&a.length>1&&a[0]===e)return a[1];if(!e&&a.length>1)return a[1]}}}catch{}return null},getCurrentCompanyId:()=>{const e=Q.extractTokenData();return e?.companyId||null},getAllCompaniesData:()=>{const e=Q.getIdToken();if(!e)return[];try{const a=R.parseJwtPayload(e);if(!a)return[];const t=[];for(const e in a)if(e.startsWith("co")&&/^co\d+$/.test(e)){const r=a[e];if(r&&"string"==typeof r){const e=r.split(";");e.length>=4&&t.push({id:e.length>7?e[7]:"",alias:e[0].trim(),name:e[3].trim(),payload:a})}}return t}catch{return[]}}};const J={get oauth(){const e=O();return{authUrl:e.oauth.authUrl,clientId:e.oauth.clientId,responseType:"id_token token",scope:"openid profile email"}}};(void 0).VITE_IS_QUALIEX;const Y=new class{constructor(){this.errors=[],this.toastCount=0,this.lastToastTime=0}handleError(e,a=!0){const t="string"==typeof e?e:e.message;if(this.errors.push({id:Date.now().toString(),message:t,timestamp:Date.now(),count:1}),this.errors.length>50&&(this.errors=this.errors.slice(-50)),a&&this.shouldShowToast()){const e=this.getErrorTitle(t);n.toast.error(e,{description:t})}}getErrorTitle(a){const t=a.toLowerCase();return t.includes("401")||t.includes("unauthorized")||t.includes("expirou")?e.t("error_session_expired"):t.includes("token")||t.includes("autenticação")?e.t("error_authentication"):t.includes("api")||t.includes("network")?e.t("error_connection"):"Erro"}success(e,a){n.toast.success(e,{description:a})}shouldShowToast(){const e=Date.now();return e-this.lastToastTime>6e4&&(this.toastCount=0),this.toastCount<3&&(this.toastCount++,this.lastToastTime=e,!0)}getErrors(){return this.errors.slice(-50)}clearErrors(){this.errors=[]}};["[forlogic-core] ⚠️ VITE_SUPABASE_PUBLISHABLE_KEY contém uma legacy anon key (JWT).","O Supabase desativou legacy API keys. Substitua pela nova publishable key (formato sb_publishable_*).","Todas as requests retornarão 401 Unauthorized.","Causa provável: a integração Supabase do Lovable sobrescreveu o .env com a anon key legada.","Solução: defina VITE_SUPABASE_PK_OVERRIDE no .env com a publishable key correta."].join(" ");function X(e){return!!e&&e.startsWith("eyJ")}let G=!1;function Z(){if("DEV"===q()){const e=O();return{url:e.supabaseUrl,key:e.supabasePublishableKey}}const e=(void 0).VITE_SUPABASE_URL,a=(void 0).VITE_SUPABASE_PK_OVERRIDE||((void 0).VITE_SUPABASE_PUBLISHABLE_KEY??"");return e&&a?{url:e,key:a}:null}class ee{constructor(e){this.currentToken=null,this.config=e,function(){const e=(void 0).VITE_SUPABASE_PK_OVERRIDE,a=(void 0).VITE_SUPABASE_PUBLISHABLE_KEY;G?X(a):e&&X(a)?G=!0:X(a)?G=!0:G=!0}(),this.client=this.createClientWithToken(null)}createClientWithToken(e){const a={apikey:this.config.key};e&&this.isTokenValid(e)&&(a.Authorization=`Bearer ${e}`);return s.createClient(this.config.url,this.config.key,{auth:{persistSession:!1,autoRefreshToken:!1,detectSessionInUrl:!1,storage:void 0},global:{headers:a,fetch:async(e,a)=>("string"==typeof e?e:e.url).includes("/auth/v1/user")?new Response(JSON.stringify({error:"blocked"}),{status:401,headers:{"Content-Type":"application/json"}}):fetch(e,a)}})}static getInstance(){if(!ee.instance){const e=Z();if(!e)throw new Error("[forlogic-core] Supabase não configurado. Defina VITE_SUPABASE_URL e VITE_SUPABASE_PUBLISHABLE_KEY no .env, ou não invoque getSupabaseClient() (use isSupabaseConfigured() para checar antes).");ee.instance=new ee(e)}return ee.instance}getClient(){const e=Q.getValidSupabaseToken();return e!==this.currentToken&&(this.client=this.createClientWithToken(e),this.currentToken=e),this.client}isTokenValid(e){try{return!R.isTokenExpired(e)}catch(a){return Y.handleError(a instanceof Error?a:"Supabase - Error validating token",!1),!1}}}function ae(){return ee.getInstance().getClient()}class te{static async generateToken(e,a,t,r=!1){try{if(!r){const e=Q.getSupabaseToken();if(e&&Q.isSupabaseTokenValid())return e}const s=ae(),{data:n,error:o}=await s.functions.invoke("validate-token",{body:{access_token:e,alias:a}});return o&&(o.message?.includes("401")||o.message?.includes("Unauthorized"))?(t?.(),null):n?.access_token?(Q.setSupabaseToken(n.access_token),n.access_token):null}catch(s){return s instanceof Error&&(s.message.includes("401")||s.message.includes("Unauthorized"))&&t?.(),null}}}class re{static setLogoutCallback(e){this.onLogoutCallback=e}static async attemptRegeneration(e=!1){if(this.regenerationPromise)return this.regenerationPromise;this.regenerationPromise=this._doRegenerate(e);try{return await this.regenerationPromise}finally{this.regenerationPromise=null}}static async _doRegenerate(e=!1){try{const a=Q.getAccessToken(),t=Q.getSelectedAlias();if(!a||!t)return null;const r=await te.generateToken(a,t,this.onLogoutCallback||void 0,e);return r||null}catch(a){return null}}}var se;re.regenerationPromise=null,re.onLogoutCallback=null;const ne={isAuthenticated:!1,isLoading:!1,user:null,alias:null,companies:[],selectedUnit:null,userId:null,userAlias:null,placeId:null,placeName:null,activePlaceId:null,activePlaceName:null};se=class{static async initialize(){try{const e=!0;if(e){if(Q.checkProjectMismatch())return{...ne}}if(!Q.hasAllTokens()||!Q.areAllTokensValid())return Q.clearExpiredTokens(),{...ne};const a=Q.getAccessToken(),t=Q.getIdToken();Q.clearManualLogout();const r=this.extractUserFromIdToken(t,a),s=this.extractCompaniesFromIdToken(t),n=this.extractAliasFromAccessToken(a),o=e?Q.extractTokenData():null,i=o?.alias;let l=null;if(i&&s.some(e=>e.alias===i))l=i;else{const e=Q.getSelectedAlias(),a=e&&s.some(a=>a.alias===e);l=a?e:n||s[0]?.alias||null}if(e&&(!Q.isSupabaseTokenValid()&&l&&await re.attemptRegeneration(),!Q.isSupabaseTokenValid()))return{...ne};let d=null;if(l){const e=Q.getCompanyId(l),a=s.find(e=>e.alias===l);a&&(d={id:e||a.id,name:a.name,alias:a.alias})}const c=o?.placeId??null,u=o?.placeName??null;return{isAuthenticated:!0,isLoading:!1,user:r,alias:l,companies:s,selectedUnit:d,userId:r?.id||null,userAlias:r?.id||null,placeId:c,placeName:u,activePlaceId:c,activePlaceName:u}}catch(e){return{...ne}}}static async loginDev(){try{const e=ae(),{data:a,error:t}=await e.functions.invoke("dev-tokens",{body:{environment:"development"}});if(t)return!1;if(!a?.access_token||!a?.id_token)return!1;const r=new URL("/callback",window.location.origin);return r.hash=`access_token=${a.access_token}&id_token=${a.id_token}&token_type=bearer`,window.location.href=r.toString(),!0}catch(e){return!1}}static loginProd(){const e="Lw==";Q.setOAuthState(e);const a=Q.generateOAuthNonce();Q.setOAuthNonce(a);const t=`${window.location.origin}/callback`,r=new URL(J.oauth.authUrl);r.searchParams.set("client_id",J.oauth.clientId),r.searchParams.set("response_type",J.oauth.responseType),r.searchParams.set("scope",J.oauth.scope),r.searchParams.set("redirect_uri",t),r.searchParams.set("state",e),r.searchParams.set("nonce",a),r.searchParams.set("response_mode","fragment"),window.location.href=r.toString()}static async processCallback(){try{const e=new URLSearchParams(window.location.hash.startsWith("#")?window.location.hash.substring(1):window.location.hash),a=new URLSearchParams(window.location.search),t=t=>e.get(t)||a.get(t),r=t("access_token"),s=t("id_token"),n=t("error");if(n)throw new Error(`Erro OAuth: ${n}`);if(r&&s){const e=Q.getAccessToken();e!==r&&Q.clearAll()}const o=!0;if(Q.hasAllTokens()){if(o){Q.getValidSupabaseToken()||await re.attemptRegeneration(!0)}return!0}const i=r,l=s;if(!i||!l)throw new Error("Tokens não encontrados na URL de callback");Q.setAccessToken(i),Q.setIdToken(l),Q.clearManualLogout();const d=this.extractAliasFromAccessToken(i);if(d)Q.setSelectedAlias(d);else{const e=this.extractCompaniesFromIdToken(l);if(0===e.length)throw new Error("Nenhuma empresa encontrada nos tokens");Q.setSelectedAlias(e[0].alias)}if(o){if(!await re.attemptRegeneration(!0))throw new Error("Falha ao gerar token Supabase")}return Q.clearOAuthState(),Q.clearOAuthNonce(),!0}catch(e){throw e}}static async logout(){Q.clearAll(),Q.setManualLogout(),localStorage.removeItem("auth_return_url"),sessionStorage.clear();try{if("caches"in window){const e=await caches.keys();await Promise.all(e.map(e=>caches.delete(e)))}}catch{}window.location.href="/login"}static decodeToken(e){return R.parseJwtPayload(e)}static extractUserFromIdToken(e,a){const t=this.decodeToken(e);if(!t)return null;const r=a?this.decodeToken(a):null;return{id:t.subNewId,email:t.email,name:t.name,identifier:t.identifier,isSysAdmin:"1"===r?.admin}}static extractCompaniesFromIdToken(e){const a=this.decodeToken(e);if(!a)return[];const t=[];return Object.keys(a).forEach(e=>{if(e.match(/^co(\d+)$/)&&"string"==typeof a[e]){const r=a[e].split(";");if(r.length>=4)t.push({id:r.length>7?r[7].trim():"",alias:r[0].trim(),name:r[3].trim()});else{const[r,s]=a[e].split("|");r&&s&&t.push({id:"",alias:r.trim(),name:s.trim()})}}}),t}static extractAliasFromAccessToken(e){const a=this.decodeToken(e);return a?.default||null}},re.setLogoutCallback(()=>{se.logout()});class oe{static handleError(e){if(!e)return!1;const a=e.message||e.toString();return!!this.isAuthenticationError(e,a)&&(Q.clearAll(),window.location.href="/login",!0)}static isAuthenticationError(e,a){if(401===e.status||401===e.statusCode)return!0;const t=a.toLowerCase();return["401","unauthorized","token expired","invalid token","session expired","jwt expired","authentication failed","not authenticated"].some(e=>t.includes(e))}static async wrapAsync(e){try{return await e}catch(a){if(!this.handleError(a))throw a;throw new Error("Sua sessão expirou. Você será redirecionado para fazer login novamente.")}}}class ie{static async handleApiError(e){if(!e||this.isRetrying)return!1;const a=e.status||e.statusCode,t=e.message||e.toString();if(401===a||t.includes("401")||t.includes("Unauthorized")){this.isRetrying=!0;try{return await re.attemptRegeneration()?(this.isRetrying=!1,!0):(oe.handleError(e),this.isRetrying=!1,!1)}catch(r){return oe.handleError(e),this.isRetrying=!1,!1}}return!1}static validateToken(){const e=Q.getAccessToken();return e?Q.isTokenExpired(e)?{valid:!1,message:"Sua sessão expirou. Você será redirecionado para fazer login."}:{valid:!0}:{valid:!1,message:"Token OAuth não encontrado. Faça login novamente."}}}ie.isRetrying=!1;const le=new class{get baseUrl(){return O().qualiexApiUrl}async makeApiCall(e,a,t){const r=ie.validateToken();if(!r.valid)throw new Error(r.message||"Token inválido");const s=Q.getAccessToken();if(!s)throw new Error("Token Qualiex não encontrado");if(!t||""===t.trim())throw new Error("Alias da unidade é obrigatório para chamadas à API do Qualiex");const n=new URL(e,this.baseUrl);Object.entries(a).forEach(([e,a])=>{n.searchParams.append(e,a)});const o=await fetch(n.toString(),{method:"GET",headers:{Authorization:`Bearer ${s}`,"Content-Type":"application/json",Accept:"application/json","un-alias":t}});if(!o.ok){const e=new Error(`API call failed: ${o.status} ${o.statusText}`);throw e.status=o.status,e.statusCode=o.status,e}return await o.json()}mapToQualiexUser(e){let a;return a="boolean"==typeof e.isActive?e.isActive:"boolean"==typeof e.active?e.active:"string"!=typeof e.status||"active"===e.status.toLowerCase(),{id:e.id||e.ID||"",userId:e.userId||String(e.ID),userName:e.userName||"Nome não disponível",userEmail:e.userEmail||"Email não disponível",placeId:null,placeName:e.placeName||null,roleId:e.roleId||void 0,roleName:e.roleName||void 0,companyId:e.companyId||void 0,companyName:e.companyName||void 0,isActive:a}}parseUsersResponse(e,a=""){let t=e;if(e.data)t=e.data;else{if(!Array.isArray(e))return Y.handleError(`[QualiexApi] Formato de resposta inesperado${a}`,!1),null;t=e}return Array.isArray(t)?t.map(e=>this.mapToQualiexUser(e)):(Y.handleError(`[QualiexApi] Resposta não é um array${a}`,!1),null)}async fetchUsers(e,a,t="active"){const r={companyId:a,search:"",filterStatus:t};try{const a=await this.makeApiCall("/api/common/v1/companiesusers",r,e);return this.parseUsersResponse(a)??[]}catch(s){if(await ie.handleApiError(s))try{const a=await this.makeApiCall("/api/common/v1/companiesusers",r,e);return this.parseUsersResponse(a," após retry")??[]}catch(n){return Y.handleError(n instanceof Error?n:"Erro ao buscar usuários após renovação de token",!0),[]}return Y.handleError(s instanceof Error?s.message:"Erro ao buscar usuários da API Qualiex",!0),[]}}async fetchUserById(e,a,t){try{return(await this.fetchUsers(a,t)).find(a=>a.userId===e)||null}catch(r){return Y.handleError(r instanceof Error?r:"[QualiexApi] Error fetching user by ID"),null}}async fetchActiveUsersMap(e,a){const t=await this.fetchUsers(e,a,"active"),r=new Map;return t.forEach(e=>r.set(e.userId,e)),r}async fetchAllUsersMap(e,a){const t=await this.fetchUsers(e,a,"all"),r=new Map;return t.forEach(e=>r.set(e.userId,e)),r}async getUsers(e,a="active"){const t=Q.extractTokenData();return t&&t.companyId?this.fetchUsers(e,t.companyId,a):[]}async fetchSoftwares(e){try{const a=await this.makeApiCall("/api/common/v1/softwares",{},e),t=a?.data||a;return Array.isArray(t)?t.map(e=>({id:e.id,alias:e.alias||"",color:e.color||"",colorLight:e.colorLight||"",namePtBr:e.namePtBr||"",nameUs:e.nameUs||"",nameEs:e.nameEs||""})):(Y.handleError("[QualiexApi] fetchSoftwares: formato de resposta inesperado",!1),[])}catch(a){if(await ie.handleApiError(a))try{const a=await this.makeApiCall("/api/common/v1/softwares",{},e),t=a?.data||a;return Array.isArray(t)?t.map(e=>({id:e.id,alias:e.alias||"",color:e.color||"",colorLight:e.colorLight||"",namePtBr:e.namePtBr||"",nameUs:e.nameUs||"",nameEs:e.nameEs||""})):[]}catch(t){return Y.handleError(t instanceof Error?t:"Erro ao buscar softwares após renovação de token",!0),[]}return Y.handleError(a instanceof Error?a.message:"Erro ao buscar softwares da API Qualiex",!0),[]}}async fetchUserAssociations(e,a){try{const t=await this.makeApiCall(`/api/common/v1/Users/${e}/associations`,{},a),r=t?.data||t;return Array.isArray(r)?r.map(e=>({associationId:e.associationId||"",userId:e.userId||"",userName:e.userName||"",companyId:e.companyId||"",companyName:e.companyName||"",companyAlias:e.companyAlias||"",companyPhotoDate:e.companyPhotoDate,language:e.language,roleId:e.roleId||"",roleName:e.roleName||"",placeId:e.placeId,placeName:e.placeName,softwares:Array.isArray(e.softwares)?e.softwares:[],functionalities:Array.isArray(e.functionalities)?e.functionalities:[],isQualitfy:e.isQualitfy??!1,isMetroex:e.isMetroex??!1})):(Y.handleError("[QualiexApi] fetchUserAssociations: formato de resposta inesperado",!1),[])}catch(t){if(await ie.handleApiError(t))try{const t=await this.makeApiCall(`/api/common/v1/Users/${e}/associations`,{},a),r=t?.data||t;return Array.isArray(r)?r.map(e=>({associationId:e.associationId||"",userId:e.userId||"",userName:e.userName||"",companyId:e.companyId||"",companyName:e.companyName||"",companyAlias:e.companyAlias||"",companyPhotoDate:e.companyPhotoDate,language:e.language,roleId:e.roleId||"",roleName:e.roleName||"",placeId:e.placeId,placeName:e.placeName,softwares:Array.isArray(e.softwares)?e.softwares:[],functionalities:Array.isArray(e.functionalities)?e.functionalities:[],isQualitfy:e.isQualitfy??!1,isMetroex:e.isMetroex??!1})):[]}catch(r){return Y.handleError(r instanceof Error?r:"Erro ao buscar associações após renovação de token",!0),[]}return Y.handleError(t instanceof Error?t.message:"Erro ao buscar associações do usuário",!0),[]}}},de=a.createContext(void 0),ce=()=>{const e=a.useContext(de);if(void 0===e)throw new Error("useAuth deve ser usado dentro de um AuthProvider");return e},ue=(e={})=>{const{user:a,alias:r}=ce(),{enabled:s=!0,status:n="active"}=e;return t.useQuery({queryKey:["qualiex-users",r,n],queryFn:()=>le.getUsers(r,n),enabled:s&&!!r&&!!a,staleTime:3e5,retry:2,retryDelay:1e3})};function me(){const{alias:r,isAuthenticated:s}=ce(),n=Q.getAccessToken(),{data:o=[]}=ue(),i=t.useQuery({queryKey:["leadership-raw",r],queryFn:async()=>{if(!n||!r)throw new Error("Usuário não autenticado ou unidade não selecionada");const e=ae(),{data:a,error:t}=await e.schema("common").from("leaders").select("*").eq("is_removed",!1).eq("alias",r);if(t)throw new Error("Erro ao buscar hierarquia de liderança");return a??[]},enabled:!!n&&!!r&&s}),l=a.useMemo(()=>{const a=i.data;if(!a)return;if(0===a.length)return[];const t={};o.forEach(e=>{t[e.userId]={name:e.userName||e.userEmail,email:e.userEmail||""}});const r=a.map(r=>{const s=a.filter(e=>e.id_leader===r.id_user);return{...r,name:t[r.id_user]?.name||e.t("inactive_user"),email:t[r.id_user]?.email||"",subordinatesCount:s.length,subordinateNames:s.map(e=>t[e.id_user]?.name||"[Usuário inativo]").sort((e,a)=>e.localeCompare(a))}}),s=new Set(a.map(e=>e.id_user));return new Set(a.filter(e=>e.id_leader&&!s.has(e.id_leader)).map(e=>e.id_leader)).forEach(s=>{const n=t[s],o=a.filter(e=>e.id_leader===s);r.push({id:`virtual-${s}`,alias:a[0]?.alias||"",id_user:s,id_leader:null,is_removed:!1,is_active:!0,created_at:(new Date).toISOString(),updated_at:(new Date).toISOString(),name:n?.name||e.t("inactive_user"),email:n?.email||"",subordinatesCount:o.length,subordinateNames:o.map(e=>t[e.id_user]?.name||"[Usuário inativo]").sort((e,a)=>e.localeCompare(a))})}),U(r)},[i.data,o]);return{...i,data:l}}const he="common";function pe(){const{alias:e}=ce(),a=t.useQueryClient(),r=ae(),{t:s}=o.useTranslation();return t.useMutation({mutationFn:async a=>{if(!e)throw new Error(s("unit_not_selected","Unidade não selecionada"));if(a.id_user===a.id_leader)throw new Error(s("cannot_be_own_leader","Usuário não pode ser seu próprio líder"));a.id_leader&&await ve(r,e,a.id_user,a.id_leader);const{data:t,error:n}=await r.schema(he).from("leaders").insert({alias:e,id_user:a.id_user,id_leader:a.id_leader,is_active:!0,is_removed:!1}).select().single();if(n)throw n;return t},onSuccess:()=>{a.invalidateQueries({queryKey:["leadership-raw",e]}),n.toast.success(s("leader_promoted_success","Líder virtual promovido com sucesso"))},onError:e=>{n.toast.error(e.message||s("leader_create_error","Erro ao criar líder"))}})}function fe(){const{alias:e}=ce(),a=t.useQueryClient(),r=ae(),{t:s}=o.useTranslation();return t.useMutation({mutationFn:async a=>{if(!e)throw new Error(s("unit_not_selected","Unidade não selecionada"));if(!a.users.length)throw new Error(s("select_at_least_one",s("leadership_select_subordinates")));const t=a.users.map(e=>e.id_user),{data:n}=await r.schema(he).from("leaders").select("id_user").eq("alias",e).in("id_user",t).eq("is_removed",!1);if(n&&n.length>0){const e=n.map(e=>e.id_user);throw new Error(s("users_already_leaders",`Alguns usuários já estão cadastrados como líderes: ${e.join(", ")}`))}for(const d of a.users){if(a.id_leader&&d.id_user===a.id_leader)throw new Error(s("cannot_be_own_leader","Usuário não pode ser seu próprio líder"));a.id_leader&&await ve(r,e,d.id_user,a.id_leader)}const o=a.users.map(t=>({alias:e,id_user:t.id_user,id_leader:a.id_leader,is_active:!0,is_removed:!1})),{data:i,error:l}=await r.schema(he).from("leaders").insert(o).select();if(l)throw l;return i},onSuccess:t=>{a.invalidateQueries({queryKey:["leadership-raw",e]}),n.toast.success(s("subordinates_added_success",`${t?.length||0} liderado(s) adicionado(s) com sucesso`))},onError:e=>{n.toast.error(e.message||s("subordinates_add_error","Erro ao adicionar liderados"))}})}function ge(){const{alias:e}=ce(),a=t.useQueryClient(),r=ae(),{t:s}=o.useTranslation();return t.useMutation({mutationFn:async a=>{if(!e)throw new Error(s("unit_not_selected","Unidade não selecionada"));const{data:t}=await r.schema(he).from("leaders").select("id_user").eq("id",a.id).eq("alias",e).single();if(!t)throw new Error(s("leader_not_found","Líder não encontrado"));if(t.id_user===a.id_leader)throw new Error(s("cannot_be_own_leader","Usuário não pode ser seu próprio líder"));a.id_leader&&await ve(r,e,t.id_user,a.id_leader,a.id);const{data:n,error:o}=await r.schema(he).from("leaders").update({id_leader:a.id_leader}).eq("id",a.id).eq("alias",e).select().single();if(o)throw o;return n},onSuccess:()=>{a.invalidateQueries({queryKey:["leadership-raw",e]}),n.toast.success(s("leader_updated_success","Líder atualizado com sucesso"))},onError:e=>{n.toast.error(e.message||s("leader_update_error","Erro ao atualizar líder"))}})}function xe(){const{alias:e}=ce(),a=t.useQueryClient(),r=ae(),{t:s}=o.useTranslation();return t.useMutation({mutationFn:async a=>{if(!e)throw new Error(s("unit_not_selected","Unidade não selecionada"));const{error:t}=await r.schema(he).from("leaders").update({is_removed:!0}).eq("id",a).eq("alias",e);if(t)throw t},onSuccess:()=>{a.invalidateQueries({queryKey:["leadership-raw",e]}),n.toast.success(s("leader_removed_success","Líder removido com sucesso"))},onError:e=>{n.toast.error(e.message||s("leader_remove_error","Erro ao remover líder"))}})}function ye(){const{alias:e}=ce(),a=t.useQueryClient(),r=ae(),{t:s}=o.useTranslation();return t.useMutation({mutationFn:async({leaderUserId:a,selectedUsers:t})=>{if(!e)throw new Error(s("unit_not_selected","Unidade não selecionada"));const n=t.map(e=>e.id_user),o=await Promise.all([r.schema(he).from("leaders").select("id, id_user, id_leader").eq("alias",e).eq("is_removed",!1).eq("id_leader",a),r.schema(he).from("leaders").select("id, id_user, id_leader").eq("alias",e).eq("is_removed",!1).in("id_user",n.length?n:["__none__"])]),[{data:i,error:l},{data:d,error:c}]=o;if(l)throw l;if(c)throw c;const u=i||[],m=d||[],h=new Set(n),p=u.filter(e=>!h.has(e.id_user)),f=m.filter(e=>e.id_leader!==a),g=new Set(m.map(e=>e.id_user)),x=t.filter(e=>!g.has(e.id_user));for(const s of f)await ve(r,e,s.id_user,a,s.id);for(const b of x){if(b.id_user===a)throw new Error(s("cannot_be_own_leader","Usuário não pode ser seu próprio líder"));await ve(r,e,b.id_user,a)}const y=[];if(p.length){const a=p.map(e=>e.id);y.push(r.schema(he).from("leaders").update({is_removed:!0}).in("id",a).eq("alias",e))}if(f.length){const t=f.map(e=>e.id);y.push(r.schema(he).from("leaders").update({id_leader:a}).in("id",t).eq("alias",e))}if(x.length){const t=x.map(t=>({alias:e,id_user:t.id_user,id_leader:a,is_active:!0,is_removed:!1}));y.push(r.schema(he).from("leaders").insert(t))}const v=(await Promise.all(y)).find(e=>e?.error);if(v?.error)throw v.error;return{unlinked:p.length,updated:f.length,created:x.length}},onSuccess:t=>{a.invalidateQueries({queryKey:["leadership-raw",e]}),n.toast.success(s("subordinates_synced_success",`Subordinados sincronizados (${t.created} adicionados, ${t.updated} atualizados, ${t.unlinked} removidos)`))},onError:e=>{n.toast.error(e.message||s("subordinates_sync_error","Erro ao sincronizar subordinados"))}})}async function ve(a,t,r,s,n){const{data:o,error:i}=await a.schema(he).from("leaders").select("id, id_user, id_leader").eq("alias",t).eq("is_removed",!1);if(i)throw i;const l=n?o.filter(e=>e.id!==n):o,d=new Set;let c=s;for(;c;){if(d.has(c))throw new Error(e.t("leadership_cycle_error"));if(c===r)throw new Error("Esta associação criaria um ciclo na hierarquia");d.add(c);const a=l.find(e=>e.id_user===c);c=a?.id_leader||null}}function be(...e){return u.twMerge(c.clsx(e))}const we=d.cva("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",{variants:{variant:{primary:"bg-primary text-primary-foreground hover:bg-primary-hover shadow-sm hover:shadow-md active:scale-[0.98]",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary-hover border border-input shadow-sm",tertiary:"bg-background text-foreground hover:bg-accent hover:text-accent-foreground border border-border",outline:"border border-input bg-background hover:bg-accent hover:text-accent-foreground",ghost:"hover:bg-accent hover:text-accent-foreground",subtle:"text-muted-foreground hover:text-foreground hover:bg-accent/50",destructive:"bg-destructive text-destructive-foreground hover:bg-destructive/90 shadow-sm hover:shadow-md",danger:"bg-destructive text-destructive-foreground hover:bg-destructive/90 shadow-sm hover:shadow-md",link:"text-primary underline-offset-4 hover:underline",icon:"bg-transparent border border-input hover:bg-accent hover:text-accent-foreground p-2",loading:"bg-primary/50 text-primary-foreground cursor-wait",default:"bg-primary text-primary-foreground hover:bg-primary/90",action:"bg-primary/10 text-primary hover:bg-primary/20 border border-primary/30","icon-only":"bg-transparent border border-input hover:bg-accent hover:text-accent-foreground p-2","external-link":"bg-transparent text-muted-foreground hover:text-foreground hover:bg-accent/50 transition-colors","action-primary":"bg-primary text-primary-foreground hover:bg-primary/90 shadow-sm","action-secondary":"bg-secondary text-secondary-foreground hover:bg-secondary/80 border border-input"},size:{sm:"h-8 px-3 text-xs rounded-lg",md:"h-10 px-4 py-2 text-sm rounded-md",lg:"h-12 px-8 text-base rounded-lg",xl:"h-14 px-10 text-lg rounded-lg",icon:"h-10 w-10","icon-sm":"h-8 w-8","icon-xs":"h-6 w-6",default:"h-10 px-4 py-2"}},defaultVariants:{variant:"primary",size:"md"}}),_e=k.forwardRef(({className:e,variant:a,size:t,asChild:s=!1,...n},o)=>{const i=s?l.Slot:"button";return r.jsx(i,{className:be(we({variant:a,size:t,className:e})),ref:o,...n})});_e.displayName="Button";const Ne=k.forwardRef(({className:e,...a},t)=>r.jsx(j.Root,{ref:t,className:be("peer h-4 w-4 shrink-0 rounded-sm border border-primary ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground",e),...a,children:r.jsx(j.Indicator,{className:be("flex items-center justify-center text-current"),children:r.jsx(i.Check,{className:"h-4 w-4"})})}));Ne.displayName=j.Root.displayName;const ke=k.forwardRef(({className:e,...a},t)=>r.jsx("table",{ref:t,className:be("w-full caption-bottom text-[13px] table-fixed",e),...a}));ke.displayName="Table";const je=k.forwardRef(({className:e,...a},t)=>r.jsx("thead",{ref:t,className:be("[&_tr]:border-b sticky top-0 z-[1] bg-background",e),...a}));je.displayName="TableHeader";const Se=k.forwardRef(({className:e,...a},t)=>r.jsx("tbody",{ref:t,className:be("[&_tr:last-child]:border-0",e),...a}));Se.displayName="TableBody";k.forwardRef(({className:e,...a},t)=>r.jsx("tfoot",{ref:t,className:be("border-t bg-muted/50 font-medium [&>tr]:last:border-b-0",e),...a})).displayName="TableFooter";const Ce=k.forwardRef(({className:e,...a},t)=>r.jsx("tr",{ref:t,className:be("border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted even:bg-table-stripe",e),...a}));Ce.displayName="TableRow";const Ee=k.forwardRef(({className:e,...a},t)=>r.jsx("th",{ref:t,className:be("h-9 px-4 py-2 text-left align-middle font-medium text-muted-foreground bg-background border-b [&:has([role=checkbox])]:pr-0",e),...a}));Ee.displayName="TableHead";const Ie=k.forwardRef(({className:e,...a},t)=>r.jsx("td",{ref:t,className:be("px-4 py-2 align-middle overflow-hidden [&:has([role=checkbox])]:pr-0",e),...a}));Ie.displayName="TableCell";k.forwardRef(({className:e,...a},t)=>r.jsx("caption",{ref:t,className:be("mt-4 text-sm text-muted-foreground",e),...a})).displayName="TableCaption";const Ae=S.Root,Te=S.Trigger,De=k.forwardRef(({className:e,align:a="center",sideOffset:t=4,...s},n)=>r.jsx(S.Content,{ref:n,align:a,sideOffset:t,className:be("z-50 w-64 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",e),...s}));function Ue(e,a){const t=new Set;function r(e){if(e)for(const a of e)t.add(a.id),r(a.children)}return function e(t){for(const s of t){if(s.id===a)return r(s.children),!0;if(s.children&&e(s.children))return!0}return!1}(e),t}function Pe({children:e,itemId:a,enableDrag:t,onDragStartCell:s,onDragEndCell:n,onDragOverCell:o,onDropCell:i,className:l}){return r.jsx(Ie,{draggable:t,onDragStart:t?e=>s(a,e):void 0,onDragEnd:t?n:void 0,onDragOver:e=>{e.preventDefault(),e.stopPropagation(),o(a,e)},onDragEnter:e=>{e.preventDefault(),e.stopPropagation(),o(a,e)},onDrop:e=>{e.preventDefault(),e.stopPropagation(),i(a,e)},className:l,children:e})}function Re({item:e,level:a,columns:t,nameKey:s,iconComponent:n,expandedIds:o,onToggleExpand:l,onRowClick:d,renderActions:c,rowActionsVariant:u="default",enableSelection:m,selectedIds:h,onSelectItem:p,enableRowDrag:f,draggedId:g,dragOverId:x,onDragStartCell:y,onDragEndCell:v,onDragOverCell:b,onDropCell:w,dragCount:_}){const N=o.has(e.id),k=(e.children?.length??0)>0,j=24*a,S="inline"===u,C=g===e.id||h?.has(e.id)&&g&&h?.has(g),E=x===e.id&&g!==e.id,I=h?.has(e.id)??!1,A={itemId:e.id,enableDrag:f,onDragStartCell:y,onDragEndCell:v,onDragOverCell:b,onDropCell:w};return r.jsxs(r.Fragment,{children:[r.jsxs(Ce,{className:be(d&&"cursor-pointer",S&&"group",C&&"opacity-40",E&&"ring-2 ring-primary ring-inset bg-primary/5"),onClick:d?()=>d(e):void 0,children:[r.jsx(Pe,{...A,children:r.jsxs("div",{className:"flex items-center gap-2",style:{paddingLeft:`${j}px`},children:[m&&r.jsx(Ne,{checked:I,onCheckedChange:()=>p?.(e.id),onClick:e=>e.stopPropagation(),className:"shrink-0"}),f&&r.jsx("span",{className:"cursor-grab text-muted-foreground shrink-0 select-none",title:"Arrastar",children:"⠿"}),k?r.jsx("button",{onClick:a=>{a.stopPropagation(),l(e.id)},className:"p-1 hover:bg-accent rounded shrink-0",children:N?r.jsx(i.ChevronDown,{className:"h-4 w-4"}):r.jsx(i.ChevronRight,{className:"h-4 w-4"})}):r.jsx("div",{className:"w-6 shrink-0"}),n??r.jsx(i.User,{className:"h-4 w-4 text-muted-foreground shrink-0"}),r.jsx("span",{className:"truncate",children:String(e[s]??e.id)}),g===e.id&&_&&_>1&&r.jsx("span",{className:"ml-1 inline-flex items-center rounded-full bg-primary px-1.5 py-0 text-xs font-semibold text-primary-foreground",children:_})]})}),t.map(t=>{const s=e[t.key],n=t.render?t.render(e,a):null!=s?String(s):"—";return r.jsx(Pe,{...A,className:be("text-center",t.className),children:t.hoverContent?r.jsxs(Ae,{openDelay:200,children:[r.jsx(Te,{asChild:!0,children:r.jsx("span",{className:"cursor-default underline decoration-dotted underline-offset-4 text-foreground",children:n})}),r.jsx(De,{side:"bottom",align:"center",className:"w-auto max-w-xs",children:t.hoverContent(e)})]}):n},String(t.key))}),c&&r.jsx(Pe,{...A,className:"text-right",children:r.jsx("div",{onClick:e=>e.stopPropagation(),className:be("flex items-center justify-end gap-1",S&&"opacity-0 group-hover:opacity-100 transition-opacity"),children:c(e)})})]}),k&&N&&e.children.map(e=>r.jsx(Re,{item:e,level:a+1,columns:t,nameKey:s,iconComponent:n,expandedIds:o,onToggleExpand:l,onRowClick:d,renderActions:c,rowActionsVariant:u,enableSelection:m,selectedIds:h,onSelectItem:p,enableRowDrag:f,draggedId:g,dragOverId:x,onDragStartCell:y,onDragEndCell:v,onDragOverCell:b,onDropCell:w,dragCount:_},e.id))]})}function Le({onDrop:a,isDragOver:t,onDragOver:s,onDragLeave:n,label:o}){return r.jsxs("div",{className:be("absolute top-0 left-0 right-0 z-10 flex items-center justify-center gap-2 py-2 px-4 border-2 border-dashed rounded-md text-sm transition-colors mx-2 mt-2",t?"border-primary bg-primary/10 text-primary":"border-muted-foreground/30 text-muted-foreground bg-background/95"),onDragOver:s,onDragEnter:s,onDragLeave:n,onDrop:a,children:[r.jsx(i.ArrowUpToLine,{className:"h-4 w-4"}),o??e.t("leadership_make_root_short")]})}function Ve({data:t,columns:s,nameKey:n,nameHeader:o=e.t("ap_name"),iconComponent:l,expandedIds:d,onToggleExpand:c,onRowClick:u,renderActions:m,actionsHeader:h="",rowActionsVariant:p="default",isLoading:f,emptyMessage:g="Nenhum registro encontrado.",className:x,enableSelection:y,selectedIds:v,onSelectItem:b,onSelectAll:w,isAllSelected:_,enableRowDrag:N,onMoveNode:k,onMoveNodes:j,rootDropLabel:S,actionsWidth:C=20,nameMinWidth:E=200}){const[I,A]=a.useState(null),[T,D]=a.useState(null),[U,P]=a.useState(!1),[R,L]=a.useState(1),V=a.useRef(null),q=a.useRef([]),O=a.useRef(null),z=a.useMemo(()=>new Set(v??[]),[v]),M=a.useMemo(()=>{if(!I||!t)return new Set;const e=q.current.length>0?q.current:[I],a=function(e,a){const t=new Set;for(const r of a)Ue(e,r).forEach(e=>t.add(e));return t}(t,e);return e.forEach(e=>a.add(e)),a},[I,t]),B=a.useRef(M);B.current=M;const $=a.useCallback(()=>{V.current=null,q.current=[],O.current=null,A(null),D(null),P(!1),L(1)},[]),F=a.useCallback((e,a)=>{e.length>1&&j?j(e,a):1===e.length&&k?.(e[0],a)},[k,j]),H=a.useCallback((e,a)=>{const t=z.has(e)&&z.size>1?Array.from(z):[e];V.current=e,q.current=t,O.current=null,A(e),L(t.length),a.dataTransfer.effectAllowed="move",a.dataTransfer.setData("text/plain",e),a.dataTransfer.setData("application/x-tree-ids",JSON.stringify(t))},[z]),W=a.useCallback((e,a)=>{a.preventDefault(),a.dataTransfer.dropEffect="move",B.current.has(e)?D(null):(O.current=e,D(e))},[]),K=a.useCallback((e,a)=>{a.preventDefault(),a.stopPropagation();const t=B.current.has(e)?O.current:e;if(!t)return void $();let r=q.current;if(0===r.length){try{const e=a.dataTransfer.getData("application/x-tree-ids");if(e){const a=JSON.parse(e);Array.isArray(a)&&a.length>0&&(r=a)}}catch{}if(0===r.length){const e=a.dataTransfer.getData("text/plain");e&&(r=[e])}}0===r.length||r.includes(t)||F(r,t),$()},[F,$]),Q=a.useCallback(e=>{e.preventDefault(),e.stopPropagation();let a=q.current;if(0===a.length){try{const t=e.dataTransfer.getData("application/x-tree-ids");if(t){const e=JSON.parse(t);Array.isArray(e)&&e.length>0&&(a=e)}}catch{}if(0===a.length){const t=e.dataTransfer.getData("text/plain");t&&(a=[t])}}0!==a.length?(F(a,null),$()):$()},[F,$]),J=a.useCallback(e=>{e.preventDefault(),e.dataTransfer.dropEffect="move",P(!0)},[]),Y=a.useCallback(e=>{N&&(e.preventDefault(),e.dataTransfer.dropEffect="move")},[N]),X=a.useCallback(e=>{if(!N)return;const a=document.elementFromPoint(e.clientX,e.clientY)?.closest?.("[data-tree-row-id]"),t=a?.dataset?.treeRowId??O.current;t&&K(t,e)},[N,K]);if(f)return r.jsx("div",{className:"flex items-center justify-center py-12",children:r.jsxs("div",{className:"text-center space-y-2",children:[r.jsx("div",{className:"animate-spin h-8 w-8 border-4 border-primary border-t-transparent rounded-full mx-auto"}),r.jsx("p",{className:"text-sm text-muted-foreground",children:"Carregando..."})]})});if(!t||0===t.length)return r.jsxs("div",{className:"flex flex-col items-center justify-center py-12 text-center space-y-2",children:[r.jsx(i.User,{className:"h-10 w-10 text-muted-foreground/50"}),r.jsx("p",{className:"text-sm text-muted-foreground",children:g})]});const G=null!==I;return r.jsxs("div",{className:be("border rounded-lg overflow-hidden relative",x),onDragOver:Y,onDrop:X,onDragLeave:N?e=>{const a=e.relatedTarget;a&&e.currentTarget.contains(a)||(D(null),P(!1))}:void 0,children:[N&&G&&r.jsx(Le,{onDrop:Q,isDragOver:U,onDragOver:J,onDragLeave:()=>P(!1),label:S}),r.jsxs(ke,{children:[r.jsx(je,{children:r.jsxs(Ce,{children:[r.jsx(Ee,{className:"text-left",style:{minWidth:E},children:r.jsxs("div",{className:"flex items-center gap-2",children:[y&&r.jsx(Ne,{checked:_??!1,onCheckedChange:()=>w?.()}),o]})}),s.map(e=>r.jsx(Ee,{className:be("text-center",e.className),style:e.width?{width:e.width}:void 0,children:e.header},String(e.key))),m&&r.jsx(Ee,{className:"text-right",style:{width:C},children:h})]})}),r.jsx(Se,{children:t.map(e=>r.jsx(Re,{item:e,level:0,columns:s,nameKey:n,iconComponent:l,expandedIds:d,onToggleExpand:c,onRowClick:u,renderActions:m,rowActionsVariant:p,enableSelection:y,selectedIds:z,onSelectItem:b,enableRowDrag:N,draggedId:I,dragOverId:T,onDragStartCell:H,onDragEndCell:$,onDragOverCell:W,onDropCell:K,dragCount:R},e.id))})]})]})}De.displayName=S.Content.displayName;const qe=k.forwardRef(({className:e,orientation:a="horizontal",decorative:t=!0,...s},n)=>r.jsx(E.Root,{ref:n,decorative:t,orientation:a,className:be("shrink-0 bg-border","horizontal"===a?"h-[1px] w-full":"h-full w-[1px]",e),...s}));qe.displayName=E.Root.displayName;const Oe=I.Root,ze=I.Trigger,Me=I.Portal,Be=k.forwardRef(({className:e,...a},t)=>r.jsx(I.Overlay,{className:be("fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",e),...a,ref:t}));Be.displayName=I.Overlay.displayName;const $e=k.forwardRef(({className:e,...a},t)=>r.jsxs(Me,{children:[r.jsx(Be,{}),r.jsx(I.Content,{ref:t,className:be("fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",e),...a})]}));$e.displayName=I.Content.displayName;const Fe=({className:e,...a})=>r.jsx("div",{className:be("flex flex-col space-y-2 text-center sm:text-left",e),...a});Fe.displayName="AlertDialogHeader";const He=({className:e,...a})=>r.jsx("div",{className:be("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",e),...a});He.displayName="AlertDialogFooter";const We=k.forwardRef(({className:e,...a},t)=>r.jsx(I.Title,{ref:t,className:be("text-lg font-semibold",e),...a}));We.displayName=I.Title.displayName;const Ke=k.forwardRef(({className:e,...a},t)=>r.jsx(I.Description,{ref:t,className:be("text-sm text-muted-foreground",e),...a}));Ke.displayName=I.Description.displayName;const Qe=k.forwardRef(({className:e,...a},t)=>r.jsx(I.Action,{ref:t,className:be(we(),e),...a}));Qe.displayName=I.Action.displayName;const Je=k.forwardRef(({className:e,...a},t)=>r.jsx(I.Cancel,{ref:t,className:be(we({variant:"outline"}),"mt-2 sm:mt-0",e),...a}));Je.displayName=I.Cancel.displayName;const Ye=C.Root,Xe=C.Portal,Ge=k.forwardRef(({className:e,...a},t)=>r.jsx(C.Overlay,{ref:t,className:be("fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",e),...a}));Ge.displayName=C.Overlay.displayName;const Ze={sm:{width:"30vw",minWidth:"320px",maxWidth:"480px",maxHeight:"320px"},md:{width:"50vw",minWidth:"480px",maxWidth:"720px",maxHeight:"70vh"},lg:{width:"85vw",height:"85vh",maxWidth:"1440px",minHeight:"480px",maxHeight:"900px"}},ea=k.forwardRef(({className:a,children:t,size:s,variant:n="informative",isDirty:o,customWidth:l,customMinWidth:d,customMaxWidth:c,customHeight:u,customMinHeight:m,customMaxHeight:h,unsavedChangesTitle:p=e.t("unsaved_changes"),unsavedChangesDescription:f=e.t("unsaved_changes_description"),cancelText:g=e.t("cancel"),leaveWithoutSavingText:x=e.t("leave_without_saving"),style:y,onInteractOutside:v,onEscapeKeyDown:b,...w},_)=>{const[N,j]=k.useState(!1),S=k.useRef(null),E=k.useRef(!1),I=s??(l||d||c||u||m||h?void 0:"md"),A=I?Ze[I]:{},T={...l??A.width?{width:l??A.width}:{},...d??A.minWidth?{minWidth:d??A.minWidth}:{},...c??A.maxWidth?{maxWidth:c??A.maxWidth}:{},...u??A.height?{height:u??A.height}:{},...m??A.minHeight?{minHeight:m??A.minHeight}:{},...h??A.maxHeight?{maxHeight:h??A.maxHeight}:{},...y},D=k.useCallback(e=>{"form"===n&&o?(S.current=e,j(!0)):e()},[n,o]),U=k.useRef(null),P="destructive"!==n;if("development"===process.env.NODE_ENV&&t){const e=k.Children.toArray(t);e.some(e=>k.isValidElement(e)&&"DialogFooter"===e.type?.displayName),e.some(e=>k.isValidElement(e)&&"DialogBody"===e.type?.displayName)}return r.jsxs(Xe,{children:[r.jsx(Ge,{}),r.jsxs(C.Content,{ref:_,className:be("fixed left-[50%] top-[50%] z-50 flex flex-col translate-x-[-50%] translate-y-[-50%] border-0 border-l-[10px] border-l-primary bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] rounded-lg max-sm:!w-[calc(100vw-2rem)] max-sm:!h-[calc(100dvh-2rem)] max-sm:!min-w-0 max-sm:!min-h-0 max-sm:!max-w-none max-sm:!max-h-none max-sm:p-4",a),style:T,onInteractOutside:e=>{"form"!==n&&"destructive"!==n?v?.(e):e.preventDefault()},onEscapeKeyDown:e=>{if("destructive"!==n)return"form"===n&&o?(e.preventDefault(),void D(()=>{E.current=!0,U.current?.click()})):void b?.(e);e.preventDefault()},...w,children:[t,P&&r.jsxs(C.Close,{ref:U,onClick:e=>{E.current?E.current=!1:"form"===n&&o&&(e.preventDefault(),D(()=>{E.current=!0,U.current?.click()}))},className:"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-0 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground",children:[r.jsx(i.X,{className:"h-4 w-4"}),r.jsx("span",{className:"sr-only",children:"Close"})]})]}),r.jsx(Oe,{open:N,onOpenChange:j,children:r.jsxs($e,{children:[r.jsxs(Fe,{children:[r.jsx(We,{children:p}),r.jsx(Ke,{children:f})]}),r.jsxs(He,{children:[r.jsx(Je,{onClick:()=>{j(!1),S.current=null},children:g}),r.jsx(Qe,{onClick:()=>{j(!1),S.current?.(),S.current=null},children:x})]})]})})]})});ea.displayName=C.Content.displayName;const aa=({className:e,showSeparator:a=!1,children:t,...s})=>r.jsxs("div",{className:be("flex flex-col flex-shrink-0",e),...s,children:[r.jsx("div",{className:"flex flex-col text-left",children:t}),a&&r.jsx(qe,{className:"mt-2"})]});aa.displayName="DialogHeader";const ta=({className:e,...a})=>r.jsx("div",{className:be("flex-1 min-h-0 overflow-auto py-4 px-2 -mx-2",e),...a});ta.displayName="DialogBody";const ra=k.forwardRef(({className:e,...a},t)=>r.jsx(C.Title,{ref:t,className:be("text-xl font-semibold leading-none tracking-tight",e),...a}));ra.displayName=C.Title.displayName;k.forwardRef(({className:e,...a},t)=>r.jsx(C.Description,{ref:t,className:be("text-sm text-muted-foreground",e),...a})).displayName=C.Description.displayName;var sa=function(e,a){for(var t={};e.length;){var r=e[0],s=r.code,n=r.message,o=r.path.join(".");if(!t[o])if("unionErrors"in r){var i=r.unionErrors[0].errors[0];t[o]={message:i.message,type:i.code}}else t[o]={message:n,type:s};if("unionErrors"in r&&r.unionErrors.forEach(function(a){return a.errors.forEach(function(a){return e.push(a)})}),a){var l=t[o].types,d=l&&l[r.code];t[o]=y.appendErrors(o,a,t,s,d?[].concat(d,r.message):r.message)}e.shift()}return t},na=function(e,a,t){return void 0===t&&(t={}),function(r,s,n){try{return Promise.resolve(function(s,o){try{var i=Promise.resolve(e["sync"===t.mode?"parse":"parseAsync"](r,a)).then(function(e){return n.shouldUseNativeValidation&&v.validateFieldsNatively({},n),{errors:{},values:t.raw?r:e}})}catch(l){return o(l)}return i&&i.then?i.then(void 0,o):i}(0,function(e){if(function(e){return Array.isArray(null==e?void 0:e.errors)}(e))return{values:{},errors:v.toNestErrors(sa(e.errors,!n.shouldUseNativeValidation&&"all"===n.criteriaMode),n)};throw e}))}catch(o){return Promise.reject(o)}}};const oa=d.cva("text-xs font-medium leading-none text-foreground peer-disabled:cursor-not-allowed peer-disabled:opacity-70"),ia=k.forwardRef(({className:e,...a},t)=>r.jsx(A.Root,{ref:t,className:be(oa(),e),...a}));ia.displayName=A.Root.displayName;const la=k.forwardRef(({className:e,children:a,...t},s)=>r.jsxs(T.Root,{ref:s,className:be("relative overflow-hidden",e),...t,children:[r.jsx(T.Viewport,{className:"h-full w-full rounded-[inherit]",children:a}),r.jsx(da,{}),r.jsx(T.Corner,{})]}));la.displayName=T.Root.displayName;const da=k.forwardRef(({className:e,orientation:a="vertical",...t},s)=>r.jsx(T.ScrollAreaScrollbar,{ref:s,orientation:a,className:be("flex touch-none select-none transition-colors","vertical"===a&&"h-full w-2.5 border-l border-l-transparent p-[1px]","horizontal"===a&&"h-2.5 flex-col border-t border-t-transparent p-[1px]",e),...t,children:r.jsx(T.ScrollAreaThumb,{className:"relative flex-1 rounded-full bg-border"})}));da.displayName=T.ScrollAreaScrollbar.displayName;const ca=k.forwardRef(({className:e,type:a,showCharCount:t,maxLength:s,onChange:n,...o},i)=>{const[l,d]=k.useState(0);k.useEffect(()=>{"string"==typeof o.value?d(o.value.length):"string"==typeof o.defaultValue&&d(o.defaultValue.length)},[o.value,o.defaultValue]);return r.jsxs("div",{className:"w-full",children:[r.jsx("input",{type:a,className:be("flex h-10 w-full rounded-lg border border-input bg-background px-3 py-2 text-base ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground hover:border-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 transition-colors md:text-sm",e),ref:i,maxLength:s,onChange:e=>{d(e.target.value.length),n?.(e)},...o}),t&&s&&r.jsxs("div",{className:"text-right text-xs text-muted-foreground mt-1",children:[l," / ",s]})]})});ca.displayName="Input";const ua=k.createContext({showCheck:!1}),ma=({showCheck:e=!1,...a})=>r.jsx(ua.Provider,{value:{showCheck:e},children:r.jsx(D.Root,{...a})}),ha=D.Value,pa=k.forwardRef(({className:e,children:a,...t},s)=>r.jsxs(D.Trigger,{ref:s,className:be("flex h-10 w-full items-center justify-between rounded-lg border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground hover:border-primary focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 transition-colors [&>span]:line-clamp-1",e),...t,children:[a,r.jsx(D.Icon,{asChild:!0,children:r.jsx(i.ChevronDown,{className:"h-4 w-4 opacity-50"})})]}));pa.displayName=D.Trigger.displayName;const fa=k.forwardRef(({className:e,...a},t)=>r.jsx(D.ScrollUpButton,{ref:t,className:be("flex cursor-default items-center justify-center py-1",e),...a,children:r.jsx(i.ChevronUp,{className:"h-4 w-4"})}));fa.displayName=D.ScrollUpButton.displayName;const ga=k.forwardRef(({className:e,...a},t)=>r.jsx(D.ScrollDownButton,{ref:t,className:be("flex cursor-default items-center justify-center py-1",e),...a,children:r.jsx(i.ChevronDown,{className:"h-4 w-4"})}));ga.displayName=D.ScrollDownButton.displayName;const xa=k.forwardRef(({className:e,children:a,position:t="popper",container:s,collisionBoundary:n,...o},i)=>r.jsx(D.Portal,{container:s,children:r.jsxs(D.Content,{ref:i,className:be("relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2","popper"===t&&"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",e),position:t,collisionBoundary:n,...o,children:[r.jsx(fa,{}),r.jsx(D.Viewport,{className:be("p-1","popper"===t&&"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]"),children:a}),r.jsx(ga,{})]})}));xa.displayName=D.Content.displayName;k.forwardRef(({className:e,...a},t)=>r.jsx(D.Label,{ref:t,className:be("py-1.5 pl-8 pr-2 text-sm font-semibold",e),...a})).displayName=D.Label.displayName;const ya=k.forwardRef(({className:e,children:a,...t},s)=>{const{showCheck:n}=k.useContext(ua);return r.jsxs(D.Item,{ref:s,className:be("relative flex w-full cursor-pointer select-none items-center rounded-sm py-1.5 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",n?"pl-8":"pl-2","data-[state=checked]:bg-accent data-[state=checked]:text-accent-foreground data-[state=checked]:font-medium data-[state=checked]:border-l-2 data-[state=checked]:border-primary",n?"data-[state=checked]:pl-[calc(2rem-2px)]":"data-[state=checked]:pl-[calc(0.5rem-2px)]",e),...t,children:[n&&r.jsx("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:r.jsx(D.ItemIndicator,{children:r.jsx(i.Check,{className:"h-4 w-4"})})}),r.jsx(D.ItemText,{children:a})]})});ya.displayName=D.Item.displayName;k.forwardRef(({className:e,...a},t)=>r.jsx(D.Separator,{ref:t,className:be("-mx-1 my-1 h-px bg-muted",e),...a})).displayName=D.Separator.displayName;const va=x.z.object({id_leader:x.z.string().nullable(),id_users:x.z.array(x.z.string()).min(1,e.t("leadership_select_subordinates"))}),ba=x.z.object({id_leader:x.z.string().nullable(),id_users:x.z.array(x.z.string())});function wa({value:t,onChange:s,excludeUserIds:n=[],error:o}){const{data:l=[],isLoading:d}=ue(),[c,u]=a.useState(""),m=a.useRef(null),h=a.useRef(0),p=l.filter(e=>!n.includes(e.userId||"")).filter(e=>{const a=c.toLowerCase(),t=e.userName?.toLowerCase().includes(a);return t}).sort((e,a)=>{const r=t.includes(e.userId),s=t.includes(a.userId);if(r&&!s)return-1;if(!r&&s)return 1;const n=e.userName||e.userEmail||"",o=a.userName||a.userEmail||"";return n.localeCompare(o)});return a.useEffect(()=>{m.current&&h.current>0&&(m.current.scrollTop=h.current)},[p]),d?r.jsxs("div",{className:"flex items-center justify-center p-4",children:[r.jsx(i.Loader2,{className:"h-6 w-6 animate-spin"}),r.jsx("span",{className:"ml-2",children:"Carregando dados..."})]}):r.jsxs("div",{className:"space-y-2",children:[r.jsx(ca,{placeholder:e.t("search_user_placeholder"),value:c,onChange:e=>u(e.target.value)}),r.jsx("div",{ref:m,className:"border rounded-md p-4 max-h-[300px] overflow-y-auto",children:0===p.length?r.jsx("p",{className:"text-sm text-muted-foreground",children:e.t("search_user_placeholder")}):r.jsx("div",{className:"space-y-2",children:p.map(e=>r.jsxs("div",{className:"flex items-center space-x-2",children:[r.jsx(Ne,{id:e.userId,checked:t.includes(e.userId),onCheckedChange:()=>{return a=e.userId,m.current&&(h.current=m.current.scrollTop),void(t.includes(a)?s(t.filter(e=>e!==a)):s([...t,a]));var a}}),r.jsx(ia,{htmlFor:e.userId,className:"flex-1 cursor-pointer",children:e.userName||e.userEmail})]},e.userId))})}),t.length>0&&r.jsxs("p",{className:"text-sm text-muted-foreground",children:[t.length," selecionado(s)"]}),o&&r.jsx("p",{className:"text-sm text-destructive",children:o})]})}function _a({leader:t,prefilledLeaderId:s,onSuccess:n}){const{t:l}=o.useTranslation(),{alias:d}=ce(),c=!!t,u=t?.id.startsWith("virtual-"),m=fe(),h=pe(),p=ge(),f=ye(),g=xe(),{data:x=[]}=me(),{data:v=[]}=ue(),[b,w]=a.useState(""),_=P(x).map(e=>e.id_user),N=c?P(x).filter(e=>e.id_leader===t.id_user).map(e=>e.id_user):[],k=y.useForm({resolver:na(c?ba:va),defaultValues:{id_leader:s||(c?t?.id_leader:null)||null,id_users:c?N:[]}});a.useEffect(()=>{if(t){const e=P(x).filter(e=>e.id_leader===t.id_user).map(e=>e.id_user);k.reset({id_leader:t.id_leader||null,id_users:e})}else s?k.reset({id_leader:s,id_users:[]}):k.reset({id_leader:null,id_users:[]})},[d,t?.id,t?.id_user,t?.id_leader,s,x]);const j=m.isPending||h.isPending||p.isPending||f.isPending||g.isPending,S=k.watch("id_leader"),C=k.watch("id_users"),E=c?[t.id_user,..._.filter(e=>e!==t.id_user&&!C.includes(e)&&!N.includes(e))]:[S,..._.filter(e=>!C.includes(e))].filter(Boolean);return r.jsxs("form",{onSubmit:k.handleSubmit(async e=>{try{if(c)if(u){await h.mutateAsync({id_user:t.id_user,id_leader:e.id_leader});const a=v.filter(a=>e.id_users.includes(a.userId)).map(e=>({id_user:e.userId}));await f.mutateAsync({leaderUserId:t.id_user,selectedUsers:a})}else{await p.mutateAsync({id:t.id,id_leader:e.id_leader});const a=v.filter(a=>e.id_users.includes(a.userId)).map(e=>({id_user:e.userId}));await f.mutateAsync({leaderUserId:t.id_user,selectedUsers:a})}else{const a=v.filter(a=>e.id_users.includes(a.userId)).map(e=>({id_user:e.userId}));await m.mutateAsync({id_leader:e.id_leader,users:a})}n?.()}catch(a){}}),className:"space-y-4",children:[c&&r.jsxs("div",{children:[r.jsx(ia,{children:e.t("leader")}),r.jsx(ca,{value:v.find(e=>e.userId===t.id_user)?.userName||t.name||e.t("inactive_user"),disabled:!0,className:"bg-muted"})]}),r.jsxs("div",{children:[r.jsx(ia,{children:l("leadership_immediate_superior")}),r.jsxs(ma,{value:S||"none",onValueChange:e=>k.setValue("id_leader","none"===e?null:e),children:[r.jsx(pa,{children:r.jsx(ha,{placeholder:"Selecione..."})}),r.jsxs(xa,{children:[r.jsx("div",{className:"sticky top-0 z-10 bg-background p-2 border-b",children:r.jsx(ca,{placeholder:"Buscar superior...",value:b,onChange:e=>w(e.target.value),onKeyDown:e=>e.stopPropagation(),onClick:e=>e.stopPropagation(),className:"h-8"})}),r.jsxs(la,{className:"h-[200px]",children:[r.jsx(ya,{value:"none",children:"[Nenhum]"}),v.filter(e=>{const a=c?e.userId!==t.id_user:!C.includes(e.userId),r=!b||e.userName?.toLowerCase().includes(b.toLowerCase());return a&&r}).sort((e,a)=>{const t=e.userName||e.userEmail||"",r=a.userName||a.userEmail||"";return t.localeCompare(r)}).map(e=>r.jsx(ya,{value:e.userId,children:e.userName},e.userId))]})]})]},`superior-select-${d}`),k.formState.errors.id_leader&&r.jsx("p",{className:"text-sm text-destructive mt-1",children:k.formState.errors.id_leader.message})]}),r.jsxs("div",{children:[r.jsx(ia,{children:"Subordinados *"}),r.jsx(wa,{value:C,onChange:e=>k.setValue("id_users",e),excludeUserIds:E,error:k.formState.errors.id_users?.message},`users-multiselect-${d}`)]}),r.jsxs("div",{className:"flex items-center justify-between gap-2",children:[r.jsx(_e,{type:"submit",disabled:j||!c&&0===C.length,children:j&&!g.isPending?r.jsxs(r.Fragment,{children:[r.jsx(i.Loader2,{className:"mr-2 h-4 w-4 animate-spin"}),c?"Atualizando...":"Salvando..."]}):c?"Atualizar":"Criar"}),c&&!S&&0===C.length&&r.jsxs(Oe,{children:[r.jsx(ze,{asChild:!0,children:r.jsx(_e,{type:"button",variant:"destructive",disabled:j,className:"ml-auto",children:g.isPending?r.jsxs(r.Fragment,{children:[r.jsx(i.Loader2,{className:"mr-2 h-4 w-4 animate-spin"}),"Removendo..."]}):r.jsxs(r.Fragment,{children:[r.jsx(i.Trash2,{className:"mr-2 h-4 w-4"}),"Remover"]})})}),r.jsxs($e,{children:[r.jsxs(Fe,{children:[r.jsx(We,{children:l("confirm_removal")}),r.jsx(Ke,{children:"Tem certeza que deseja remover este líder? Esta ação não pode ser desfeita."})]}),r.jsxs(He,{children:[r.jsx(Je,{children:l("cancel")}),r.jsx(Qe,{onClick:async()=>{if(t)try{await g.mutateAsync(t.id),n?.()}catch(e){}},children:l("remove")})]})]})]})]})]})}function Na({open:e,onOpenChange:a,leader:t,prefilledLeaderId:s,title:n}){return r.jsx(Ye,{open:e,onOpenChange:a,children:r.jsxs(ea,{variant:"form",className:"sm:max-w-[500px]",children:[r.jsx(aa,{showSeparator:!0,children:r.jsx(ra,{children:n})}),r.jsx(ta,{children:r.jsx(_a,{leader:t,prefilledLeaderId:s,onSuccess:()=>a(!1)})})]})})}const ka="leadership-expanded-nodes",ja=(e,a)=>{try{localStorage.setItem(`${ka}-${e}`,JSON.stringify(Array.from(a)))}catch{}};exports.LeadershipDialog=Na,exports.LeadershipForm=_a,exports.LeadershipPage=function({unassociatedUsers:t=[],onAssociateUser:s,onMoveNode:n,onMoveNodes:o,columns:l,nameHeader:d=e.t("leader"),rootDropLabel:c=e.t("leadership_make_root")}={}){const{alias:u}=ce(),{data:m,isLoading:h,error:p,refetch:f}=me(),g=ge(),x=pe(),[y,v]=a.useState(()=>u?(e=>{try{const a=localStorage.getItem(`${ka}-${e}`);if(a)return new Set(JSON.parse(a))}catch{}return new Set})(u):new Set),[b,w]=a.useState([]),[_,N]=a.useState(new Set),[k,j]=a.useState(!0),[S,C]=a.useState(!1),[E,I]=a.useState(),[A,T]=a.useState(null),D=a.useMemo(()=>m?P(m):[],[m]),U=a.useMemo(()=>D.map(e=>e.id),[D]),R=U.length>0&&b.length===U.length,L=D.filter(e=>e.children.length>0).every(e=>y.has(e.id));a.useEffect(()=>{if(m&&m.length>0&&u){if(!localStorage.getItem(`${ka}-${u}`)){const e=m.map(e=>e.id),a=new Set(e);v(a),ja(u,a)}}},[m,u]);const V=a.useCallback(e=>{v(a=>{const t=new Set(a);return t.has(e)?t.delete(e):t.add(e),u&&ja(u,t),t})},[u]),q=a.useCallback(()=>{if(L){const e=new Set;v(e),u&&ja(u,e)}else{const e=new Set(D.filter(e=>e.children.length>0).map(e=>e.id));v(e),u&&ja(u,e)}},[L,D,u]),O=a.useCallback(e=>{w(a=>a.includes(e)?a.filter(a=>a!==e):[...a,e])},[]),z=a.useCallback(()=>{w(R?[]:U)},[R,U]),M=a.useCallback(e=>{N(a=>{const t=new Set(a);return t.has(e)?t.delete(e):t.add(e),t})},[]),B=a.useCallback(e=>D.find(a=>a.id===e),[D]),$=a.useCallback((e,a)=>{if(n)return void n(e,a);const r=t.find(a=>a.id===e);if(r){if(s){const e=a?B(a):null;s(r.id,e?.id_user||null)}else x.mutate({id_user:r.id,id_leader:a&&B(a)?.id_user||null});return}const o=B(e);if(!o)return;const i=a?B(a):null;g.mutate({id:o.id,id_leader:i?.id_user||null})},[n,t,s,B,g,x]),F=a.useCallback((e,a)=>{o?o(e,a):(e.forEach(e=>$(e,a)),w([]))},[o,$]),H=a.useCallback(e=>{I(e),T(null),C(!0)},[]),W=a.useCallback(()=>{I(void 0),T(null),C(!0)},[]),K=a.useCallback(()=>{C(!1),I(void 0),T(null)},[]),Q=a.useCallback((e,a)=>{const t=_.has(e)&&_.size>1?Array.from(_):[e];a.dataTransfer.effectAllowed="move",a.dataTransfer.setData("text/plain",e),a.dataTransfer.setData("application/x-tree-ids",JSON.stringify(t)),a.currentTarget.style.opacity="0.4"},[_]),J=a.useMemo(()=>[{key:"subordinatesCount",header:"Subordinados",hoverContent:e=>e.subordinateNames&&e.subordinateNames.length>0?r.jsxs("div",{className:"space-y-1.5",children:[r.jsx("p",{className:"text-xs font-medium text-muted-foreground mb-1",children:"Subordinados diretos:"}),[...e.subordinateNames].sort((e,a)=>e.localeCompare(a)).map(e=>r.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[r.jsx(i.User,{className:"h-3 w-3 text-muted-foreground"}),r.jsx("span",{children:e})]},e))]}):r.jsx("p",{className:"text-xs text-muted-foreground",children:"Sem subordinados diretos"})},{key:"email",header:"Email",className:"text-left",width:180,render:e=>r.jsxs("span",{className:"flex items-center gap-1.5 text-muted-foreground text-sm",children:[r.jsx(i.Mail,{className:"h-3.5 w-3.5"}),e.email||"—"]})}],[]),Y=l??J;if(h)return r.jsx("div",{className:"flex items-center justify-center h-full",children:r.jsxs("div",{className:"text-center space-y-2",children:[r.jsx("div",{className:"animate-spin h-8 w-8 border-4 border-primary border-t-transparent rounded-full mx-auto"}),r.jsx("p",{className:"text-sm text-muted-foreground",children:"Carregando..."})]})});if(p)return r.jsx("div",{className:"flex items-center justify-center h-full",children:r.jsxs("div",{className:"text-center",children:[r.jsx("p",{className:"text-destructive mb-4",children:"Erro ao carregar hierarquia de liderança"}),r.jsx(_e,{onClick:()=>f(),children:e.t("try_again")})]})});const X=D.filter(a=>a.name!==e.t("inactive_user")).length;return r.jsxs("div",{className:"flex flex-col h-full gap-3 p-4",children:[r.jsxs("div",{className:"flex items-center justify-between",children:[r.jsxs("div",{className:"flex gap-2 items-center",children:[r.jsxs(_e,{size:"sm",onClick:W,children:[r.jsx(i.Plus,{className:"h-4 w-4 mr-2"}),"Definir Líder"]}),r.jsx(_e,{size:"sm",variant:"outline",onClick:q,children:L?r.jsxs(r.Fragment,{children:[r.jsx(i.ChevronDown,{className:"h-4 w-4 mr-1"}),"Colapsar"]}):r.jsxs(r.Fragment,{children:[r.jsx(i.ChevronRight,{className:"h-4 w-4 mr-1"}),"Expandir"]})}),r.jsx("div",{className:"flex items-center gap-2 ml-4",children:r.jsxs("div",{className:"flex items-center gap-2 px-3 py-1.5 bg-muted rounded-md",children:[r.jsx(i.Users,{className:"h-4 w-4 text-muted-foreground"}),r.jsxs("span",{className:"text-sm font-medium",children:[X," usuário",1!==X?"s":""," associado",1!==X?"s":""]})]})})]}),r.jsx("p",{className:"text-xs text-muted-foreground",children:"Arraste as linhas para reorganizar • Selecione múltiplos para mover em lote"})]}),r.jsx(Ve,{data:m||[],columns:Y,nameKey:"name",nameHeader:d,expandedIds:y,onToggleExpand:V,iconComponent:r.jsx(i.Users,{className:"h-4 w-4 text-muted-foreground shrink-0"}),rowActionsVariant:"inline",enableRowDrag:!0,enableSelection:!0,selectedIds:b,onSelectItem:O,onSelectAll:z,isAllSelected:R,onMoveNode:$,onMoveNodes:F,rootDropLabel:c,emptyMessage:e.t("leadership_no_hierarchy"),renderActions:e=>r.jsx(_e,{variant:"ghost",size:"icon",className:"h-8 w-8",onClick:()=>H(e),children:r.jsx(i.Pencil,{className:"h-4 w-4"})})}),t.length>0&&r.jsxs("div",{className:"border rounded-lg overflow-hidden",children:[r.jsxs("button",{type:"button",onClick:()=>j(e=>!e),className:"w-full px-4 py-2.5 bg-muted/50 border-b flex items-center gap-2 hover:bg-muted/70 transition-colors cursor-pointer",children:[k?r.jsx(i.ChevronDown,{className:"h-4 w-4 text-muted-foreground shrink-0"}):r.jsx(i.ChevronRight,{className:"h-4 w-4 text-muted-foreground shrink-0"}),r.jsx(i.UserPlus,{className:"h-4 w-4 text-muted-foreground"}),r.jsx("span",{className:"text-sm font-medium",children:"Usuários não associados"}),r.jsxs("span",{className:"text-xs text-muted-foreground ml-1",children:["(",t.length,")"]}),_.size>0&&r.jsxs("span",{className:"text-xs text-primary ml-1",children:["(",_.size," selecionado",_.size>1?"s":"",")"]}),r.jsx("span",{className:"text-xs text-muted-foreground ml-auto",children:"Arraste para a hierarquia acima"})]}),k&&r.jsx("div",{className:"divide-y",children:t.map(e=>r.jsxs("div",{draggable:!0,onDragStart:a=>Q(e.id,a),onDragEnd:e=>{e.currentTarget.style.opacity="1"},className:be("flex items-center gap-3 px-4 py-2.5 hover:bg-accent/50 cursor-grab active:cursor-grabbing transition-colors",_.has(e.id)&&"bg-primary/5"),children:[r.jsx(Ne,{checked:_.has(e.id),onCheckedChange:()=>M(e.id),onClick:e=>e.stopPropagation(),className:"shrink-0"}),r.jsx("span",{className:"text-muted-foreground shrink-0 select-none",children:"⠿"}),r.jsx(i.User,{className:"h-4 w-4 text-muted-foreground shrink-0"}),r.jsxs("div",{className:"flex flex-col min-w-0",children:[r.jsx("span",{className:"text-sm truncate",children:e.name}),r.jsx("span",{className:"text-xs text-muted-foreground truncate",children:e.email})]})]},e.id))})]}),r.jsxs("div",{className:"px-3 py-2 bg-muted/20 border rounded-lg text-xs text-muted-foreground flex justify-between",children:[r.jsxs("span",{children:["Usuários associados: ",X]}),t.length>0&&r.jsxs("span",{children:["Usuários não associados: ",t.length]})]}),r.jsx(Na,{open:S,onOpenChange:K,leader:E,prefilledLeaderId:A,title:E?e.t("edit_name"):A?e.t("leadership_add_subordinate"):e.t("leadership_add_root")},`leadership-dialog-${u}`)]})},exports.buildHierarchy=U,exports.filterAndPromoteOrphans=function(e,a){const t=e.map(e=>({...e})),r=new Set(t.filter(e=>!a.has(e.id_user)).map(e=>e.id_user));return t.forEach(e=>{if(e.id_leader&&r.has(e.id_leader)){let a=e.id_leader;for(;a&&r.has(a);){const e=t.find(e=>e.id_user===a);a=e?.id_leader||null}e.id_leader=a}}),t.filter(e=>a.has(e.id_user))},exports.flattenTree=P,exports.useCreateMultipleLeadersMutation=fe,exports.useCreateSingleLeaderMutation=pe,exports.useLeadershipApi=me,exports.useRemoveLeaderMutation=xe,exports.useSyncSubordinatesMutation=ye,exports.useUpdateLeaderMutation=ge;
|
|
1
|
+
"use strict";var e=require("i18next"),r=require("react"),s=require("@tanstack/react-query"),a=require("forlogic-core"),t=require("sonner"),i=require("react-i18next"),n=require("react/jsx-runtime"),d=require("lucide-react"),o=require("zod"),l=require("react-hook-form"),u=require("@hookform/resolvers");function c(e){const r=new Map,s=new Map,a=[];e.forEach(e=>{const a={...e,children:[],level:0};r.set(e.id,a),s.set(e.id_user,a)}),e.forEach(e=>{const t=r.get(e.id);if(e.id_leader){const r=s.get(e.id_leader);if(r)return void r.children.push(t)}a.push(t)});const t=(e,r)=>{e.level=r,e.children.forEach(e=>t(e,r+1))};a.forEach(e=>t(e,0));const i=e=>{e.sort((e,r)=>{const s=e.name||e.id_user||e.email||"",a=r.name||r.id_user||r.email||"";return s.localeCompare(a)}),e.forEach(e=>e.children.length>0&&i(e.children))};return i(a),a}function m(e){const r=[],s=e=>{r.push(e),e.children.forEach(s)};return e.forEach(s),r}function h(){const{alias:t,isAuthenticated:i}=a.useAuth(),n=a.TokenManager.getAccessToken(),{data:d=[]}=a.useQualiexUsers(),o=s.useQuery({queryKey:["leadership-raw",t],queryFn:async()=>{if(!n||!t)throw new Error("Usuário não autenticado ou unidade não selecionada");const e=a.getSupabaseClient(),{data:r,error:s}=await e.schema("common").from("leaders").select("*").eq("is_removed",!1).eq("alias",t);if(s)throw new Error("Erro ao buscar hierarquia de liderança");return r??[]},enabled:!!n&&!!t&&i}),l=r.useMemo(()=>{const r=o.data;if(!r)return;if(0===r.length)return[];const s={};d.forEach(e=>{s[e.userId]={name:e.userName||e.userEmail,email:e.userEmail||""}});const a=r.map(a=>{const t=r.filter(e=>e.id_leader===a.id_user);return{...a,name:s[a.id_user]?.name||e.t("inactive_user"),email:s[a.id_user]?.email||"",subordinatesCount:t.length,subordinateNames:t.map(e=>s[e.id_user]?.name||"[Usuário inativo]").sort((e,r)=>e.localeCompare(r))}}),t=new Set(r.map(e=>e.id_user));return new Set(r.filter(e=>e.id_leader&&!t.has(e.id_leader)).map(e=>e.id_leader)).forEach(t=>{const i=s[t],n=r.filter(e=>e.id_leader===t);a.push({id:`virtual-${t}`,alias:r[0]?.alias||"",id_user:t,id_leader:null,is_removed:!1,is_active:!0,created_at:(new Date).toISOString(),updated_at:(new Date).toISOString(),name:i?.name||e.t("inactive_user"),email:i?.email||"",subordinatesCount:n.length,subordinateNames:n.map(e=>s[e.id_user]?.name||"[Usuário inativo]").sort((e,r)=>e.localeCompare(r))})}),c(a)},[o.data,d]);return{...o,data:l}}const f="common";function p(){const{alias:e}=a.useAuth(),r=s.useQueryClient(),n=a.getSupabaseClient(),{t:d}=i.useTranslation();return s.useMutation({mutationFn:async r=>{if(!e)throw new Error(d("unit_not_selected","Unidade não selecionada"));if(r.id_user===r.id_leader)throw new Error(d("cannot_be_own_leader","Usuário não pode ser seu próprio líder"));r.id_leader&&await w(n,e,r.id_user,r.id_leader);const{data:s,error:a}=await n.schema(f).from("leaders").insert({alias:e,id_user:r.id_user,id_leader:r.id_leader,is_active:!0,is_removed:!1}).select().single();if(a)throw a;return s},onSuccess:()=>{r.invalidateQueries({queryKey:["leadership-raw",e]}),t.toast.success(d("leader_promoted_success","Líder virtual promovido com sucesso"))},onError:e=>{t.toast.error(e.message||d("leader_create_error","Erro ao criar líder"))}})}function _(){const{alias:e}=a.useAuth(),r=s.useQueryClient(),n=a.getSupabaseClient(),{t:d}=i.useTranslation();return s.useMutation({mutationFn:async r=>{if(!e)throw new Error(d("unit_not_selected","Unidade não selecionada"));if(!r.users.length)throw new Error(d("select_at_least_one",d("leadership_select_subordinates")));const s=r.users.map(e=>e.id_user),{data:a}=await n.schema(f).from("leaders").select("id_user").eq("alias",e).in("id_user",s).eq("is_removed",!1);if(a&&a.length>0){const e=a.map(e=>e.id_user);throw new Error(d("users_already_leaders",`Alguns usuários já estão cadastrados como líderes: ${e.join(", ")}`))}for(const l of r.users){if(r.id_leader&&l.id_user===r.id_leader)throw new Error(d("cannot_be_own_leader","Usuário não pode ser seu próprio líder"));r.id_leader&&await w(n,e,l.id_user,r.id_leader)}const t=r.users.map(s=>({alias:e,id_user:s.id_user,id_leader:r.id_leader,is_active:!0,is_removed:!1})),{data:i,error:o}=await n.schema(f).from("leaders").insert(t).select();if(o)throw o;return i},onSuccess:s=>{r.invalidateQueries({queryKey:["leadership-raw",e]}),t.toast.success(d("subordinates_added_success",`${s?.length||0} liderado(s) adicionado(s) com sucesso`))},onError:e=>{t.toast.error(e.message||d("subordinates_add_error","Erro ao adicionar liderados"))}})}function x(){const{alias:e}=a.useAuth(),r=s.useQueryClient(),n=a.getSupabaseClient(),{t:d}=i.useTranslation();return s.useMutation({mutationFn:async r=>{if(!e)throw new Error(d("unit_not_selected","Unidade não selecionada"));const{data:s}=await n.schema(f).from("leaders").select("id_user").eq("id",r.id).eq("alias",e).single();if(!s)throw new Error(d("leader_not_found","Líder não encontrado"));if(s.id_user===r.id_leader)throw new Error(d("cannot_be_own_leader","Usuário não pode ser seu próprio líder"));r.id_leader&&await w(n,e,s.id_user,r.id_leader,r.id);const{data:a,error:t}=await n.schema(f).from("leaders").update({id_leader:r.id_leader}).eq("id",r.id).eq("alias",e).select().single();if(t)throw t;return a},onSuccess:()=>{r.invalidateQueries({queryKey:["leadership-raw",e]}),t.toast.success(d("leader_updated_success","Líder atualizado com sucesso"))},onError:e=>{t.toast.error(e.message||d("leader_update_error","Erro ao atualizar líder"))}})}function g(){const{alias:e}=a.useAuth(),r=s.useQueryClient(),n=a.getSupabaseClient(),{t:d}=i.useTranslation();return s.useMutation({mutationFn:async r=>{if(!e)throw new Error(d("unit_not_selected","Unidade não selecionada"));const{error:s}=await n.schema(f).from("leaders").update({is_removed:!0}).eq("id",r).eq("alias",e);if(s)throw s},onSuccess:()=>{r.invalidateQueries({queryKey:["leadership-raw",e]}),t.toast.success(d("leader_removed_success","Líder removido com sucesso"))},onError:e=>{t.toast.error(e.message||d("leader_remove_error","Erro ao remover líder"))}})}function v(){const{alias:e}=a.useAuth(),r=s.useQueryClient(),n=a.getSupabaseClient(),{t:d}=i.useTranslation();return s.useMutation({mutationFn:async({leaderUserId:r,selectedUsers:s})=>{if(!e)throw new Error(d("unit_not_selected","Unidade não selecionada"));const a=s.map(e=>e.id_user),t=await Promise.all([n.schema(f).from("leaders").select("id, id_user, id_leader").eq("alias",e).eq("is_removed",!1).eq("id_leader",r),n.schema(f).from("leaders").select("id, id_user, id_leader").eq("alias",e).eq("is_removed",!1).in("id_user",a.length?a:["__none__"])]),[{data:i,error:o},{data:l,error:u}]=t;if(o)throw o;if(u)throw u;const c=i||[],m=l||[],h=new Set(a),p=c.filter(e=>!h.has(e.id_user)),_=m.filter(e=>e.id_leader!==r),x=new Set(m.map(e=>e.id_user)),g=s.filter(e=>!x.has(e.id_user));for(const d of _)await w(n,e,d.id_user,r,d.id);for(const f of g){if(f.id_user===r)throw new Error(d("cannot_be_own_leader","Usuário não pode ser seu próprio líder"));await w(n,e,f.id_user,r)}const v=[];if(p.length){const r=p.map(e=>e.id);v.push(n.schema(f).from("leaders").update({is_removed:!0}).in("id",r).eq("alias",e))}if(_.length){const s=_.map(e=>e.id);v.push(n.schema(f).from("leaders").update({id_leader:r}).in("id",s).eq("alias",e))}if(g.length){const s=g.map(s=>({alias:e,id_user:s.id_user,id_leader:r,is_active:!0,is_removed:!1}));v.push(n.schema(f).from("leaders").insert(s))}const j=(await Promise.all(v)).find(e=>e?.error);if(j?.error)throw j.error;return{unlinked:p.length,updated:_.length,created:g.length}},onSuccess:s=>{r.invalidateQueries({queryKey:["leadership-raw",e]}),t.toast.success(d("subordinates_synced_success",`Subordinados sincronizados (${s.created} adicionados, ${s.updated} atualizados, ${s.unlinked} removidos)`))},onError:e=>{t.toast.error(e.message||d("subordinates_sync_error","Erro ao sincronizar subordinados"))}})}async function w(r,s,a,t,i){const{data:n,error:d}=await r.schema(f).from("leaders").select("id, id_user, id_leader").eq("alias",s).eq("is_removed",!1);if(d)throw d;const o=i?n.filter(e=>e.id!==i):n,l=new Set;let u=t;for(;u;){if(l.has(u))throw new Error(e.t("leadership_cycle_error"));if(u===a)throw new Error("Esta associação criaria um ciclo na hierarquia");l.add(u);const r=o.find(e=>e.id_user===u);u=r?.id_leader||null}}var j=function(e,r){for(var s={};e.length;){var a=e[0],t=a.code,i=a.message,n=a.path.join(".");if(!s[n])if("unionErrors"in a){var d=a.unionErrors[0].errors[0];s[n]={message:d.message,type:d.code}}else s[n]={message:i,type:t};if("unionErrors"in a&&a.unionErrors.forEach(function(r){return r.errors.forEach(function(r){return e.push(r)})}),r){var o=s[n].types,u=o&&o[a.code];s[n]=l.appendErrors(n,r,s,t,u?[].concat(u,a.message):a.message)}e.shift()}return s},b=function(e,r,s){return void 0===s&&(s={}),function(a,t,i){try{return Promise.resolve(function(t,n){try{var d=Promise.resolve(e["sync"===s.mode?"parse":"parseAsync"](a,r)).then(function(e){return i.shouldUseNativeValidation&&u.validateFieldsNatively({},i),{errors:{},values:s.raw?a:e}})}catch(o){return n(o)}return d&&d.then?d.then(void 0,n):d}(0,function(e){if(function(e){return Array.isArray(null==e?void 0:e.errors)}(e))return{values:{},errors:u.toNestErrors(j(e.errors,!i.shouldUseNativeValidation&&"all"===i.criteriaMode),i)};throw e}))}catch(n){return Promise.reject(n)}}};const y=o.z.object({id_leader:o.z.string().nullable(),id_users:o.z.array(o.z.string()).min(1,e.t("leadership_select_subordinates"))}),N=o.z.object({id_leader:o.z.string().nullable(),id_users:o.z.array(o.z.string())});function S({value:s,onChange:t,excludeUserIds:i=[],error:o}){const{data:l=[],isLoading:u}=a.useQualiexUsers(),[c,m]=r.useState(""),h=r.useRef(null),f=r.useRef(0),p=l.filter(e=>!i.includes(e.userId||"")).filter(e=>{const r=c.toLowerCase(),s=e.userName?.toLowerCase().includes(r);return s}).sort((e,r)=>{const a=s.includes(e.userId),t=s.includes(r.userId);if(a&&!t)return-1;if(!a&&t)return 1;const i=e.userName||e.userEmail||"",n=r.userName||r.userEmail||"";return i.localeCompare(n)});return r.useEffect(()=>{h.current&&f.current>0&&(h.current.scrollTop=f.current)},[p]),u?n.jsxs("div",{className:"flex items-center justify-center p-4",children:[n.jsx(d.Loader2,{className:"h-6 w-6 animate-spin"}),n.jsx("span",{className:"ml-2",children:"Carregando dados..."})]}):n.jsxs("div",{className:"space-y-2",children:[n.jsx(a.Input,{placeholder:e.t("search_user_placeholder"),value:c,onChange:e=>m(e.target.value)}),n.jsx("div",{ref:h,className:"border rounded-md p-4 max-h-[300px] overflow-y-auto",children:0===p.length?n.jsx("p",{className:"text-sm text-muted-foreground",children:e.t("search_user_placeholder")}):n.jsx("div",{className:"space-y-2",children:p.map(e=>n.jsxs("div",{className:"flex items-center space-x-2",children:[n.jsx(a.Checkbox,{id:e.userId,checked:s.includes(e.userId),onCheckedChange:()=>{return r=e.userId,h.current&&(f.current=h.current.scrollTop),void(s.includes(r)?t(s.filter(e=>e!==r)):t([...s,r]));var r}}),n.jsx(a.Label,{htmlFor:e.userId,className:"flex-1 cursor-pointer",children:e.userName||e.userEmail})]},e.userId))})}),s.length>0&&n.jsxs("p",{className:"text-sm text-muted-foreground",children:[s.length," selecionado(s)"]}),o&&n.jsx("p",{className:"text-sm text-destructive",children:o})]})}function C({leader:s,prefilledLeaderId:t,onSuccess:o}){const{t:u}=i.useTranslation(),{alias:c}=a.useAuth(),f=!!s,w=s?.id.startsWith("virtual-"),j=_(),C=p(),E=x(),A=v(),k=g(),{data:q=[]}=h(),{data:I=[]}=a.useQualiexUsers(),[U,L]=r.useState(""),D=m(q).map(e=>e.id_user),z=f?m(q).filter(e=>e.id_leader===s.id_user).map(e=>e.id_user):[],M=l.useForm({resolver:b(f?N:y),defaultValues:{id_leader:t||(f?s?.id_leader:null)||null,id_users:f?z:[]}});r.useEffect(()=>{if(s){const e=m(q).filter(e=>e.id_leader===s.id_user).map(e=>e.id_user);M.reset({id_leader:s.id_leader||null,id_users:e})}else t?M.reset({id_leader:t,id_users:[]}):M.reset({id_leader:null,id_users:[]})},[c,s?.id,s?.id_user,s?.id_leader,t,q]);const T=j.isPending||C.isPending||E.isPending||A.isPending||k.isPending,P=M.watch("id_leader"),F=M.watch("id_users"),$=f?[s.id_user,...D.filter(e=>e!==s.id_user&&!F.includes(e)&&!z.includes(e))]:[P,...D.filter(e=>!F.includes(e))].filter(Boolean);return n.jsxs("form",{onSubmit:M.handleSubmit(async e=>{try{if(f)if(w){await C.mutateAsync({id_user:s.id_user,id_leader:e.id_leader});const r=I.filter(r=>e.id_users.includes(r.userId)).map(e=>({id_user:e.userId}));await A.mutateAsync({leaderUserId:s.id_user,selectedUsers:r})}else{await E.mutateAsync({id:s.id,id_leader:e.id_leader});const r=I.filter(r=>e.id_users.includes(r.userId)).map(e=>({id_user:e.userId}));await A.mutateAsync({leaderUserId:s.id_user,selectedUsers:r})}else{const r=I.filter(r=>e.id_users.includes(r.userId)).map(e=>({id_user:e.userId}));await j.mutateAsync({id_leader:e.id_leader,users:r})}o?.()}catch(r){}}),className:"space-y-4",children:[f&&n.jsxs("div",{children:[n.jsx(a.Label,{children:e.t("leader")}),n.jsx(a.Input,{value:I.find(e=>e.userId===s.id_user)?.userName||s.name||e.t("inactive_user"),disabled:!0,className:"bg-muted"})]}),n.jsxs("div",{children:[n.jsx(a.Label,{children:u("leadership_immediate_superior")}),n.jsxs(a.Select,{value:P||"none",onValueChange:e=>M.setValue("id_leader","none"===e?null:e),children:[n.jsx(a.SelectTrigger,{children:n.jsx(a.SelectValue,{placeholder:"Selecione..."})}),n.jsxs(a.SelectContent,{children:[n.jsx("div",{className:"sticky top-0 z-10 bg-background p-2 border-b",children:n.jsx(a.Input,{placeholder:"Buscar superior...",value:U,onChange:e=>L(e.target.value),onKeyDown:e=>e.stopPropagation(),onClick:e=>e.stopPropagation(),className:"h-8"})}),n.jsxs(a.ScrollArea,{className:"h-[200px]",children:[n.jsx(a.SelectItem,{value:"none",children:"[Nenhum]"}),I.filter(e=>{const r=f?e.userId!==s.id_user:!F.includes(e.userId),a=!U||e.userName?.toLowerCase().includes(U.toLowerCase());return r&&a}).sort((e,r)=>{const s=e.userName||e.userEmail||"",a=r.userName||r.userEmail||"";return s.localeCompare(a)}).map(e=>n.jsx(a.SelectItem,{value:e.userId,children:e.userName},e.userId))]})]})]},`superior-select-${c}`),M.formState.errors.id_leader&&n.jsx("p",{className:"text-sm text-destructive mt-1",children:M.formState.errors.id_leader.message})]}),n.jsxs("div",{children:[n.jsx(a.Label,{children:"Subordinados *"}),n.jsx(S,{value:F,onChange:e=>M.setValue("id_users",e),excludeUserIds:$,error:M.formState.errors.id_users?.message},`users-multiselect-${c}`)]}),n.jsxs("div",{className:"flex items-center justify-between gap-2",children:[n.jsx(a.Button,{type:"submit",disabled:T||!f&&0===F.length,children:T&&!k.isPending?n.jsxs(n.Fragment,{children:[n.jsx(d.Loader2,{className:"mr-2 h-4 w-4 animate-spin"}),f?"Atualizando...":"Salvando..."]}):f?"Atualizar":"Criar"}),f&&!P&&0===F.length&&n.jsxs(a.AlertDialog,{children:[n.jsx(a.AlertDialogTrigger,{asChild:!0,children:n.jsx(a.Button,{type:"button",variant:"destructive",disabled:T,className:"ml-auto",children:k.isPending?n.jsxs(n.Fragment,{children:[n.jsx(d.Loader2,{className:"mr-2 h-4 w-4 animate-spin"}),"Removendo..."]}):n.jsxs(n.Fragment,{children:[n.jsx(d.Trash2,{className:"mr-2 h-4 w-4"}),"Remover"]})})}),n.jsxs(a.AlertDialogContent,{children:[n.jsxs(a.AlertDialogHeader,{children:[n.jsx(a.AlertDialogTitle,{children:u("confirm_removal")}),n.jsx(a.AlertDialogDescription,{children:"Tem certeza que deseja remover este líder? Esta ação não pode ser desfeita."})]}),n.jsxs(a.AlertDialogFooter,{children:[n.jsx(a.AlertDialogCancel,{children:u("cancel")}),n.jsx(a.AlertDialogAction,{onClick:async()=>{if(s)try{await k.mutateAsync(s.id),o?.()}catch(e){}},children:u("remove")})]})]})]})]})]})}function E({open:e,onOpenChange:r,leader:s,prefilledLeaderId:t,title:i}){return n.jsx(a.Dialog,{open:e,onOpenChange:r,children:n.jsxs(a.DialogContent,{variant:"form",className:"sm:max-w-[500px]",children:[n.jsx(a.DialogHeader,{showSeparator:!0,children:n.jsx(a.DialogTitle,{children:i})}),n.jsx(a.DialogBody,{children:n.jsx(C,{leader:s,prefilledLeaderId:t,onSuccess:()=>r(!1)})})]})})}const A="leadership-expanded-nodes",k=(e,r)=>{try{localStorage.setItem(`${A}-${e}`,JSON.stringify(Array.from(r)))}catch{}};exports.LeadershipDialog=E,exports.LeadershipForm=C,exports.LeadershipPage=function({unassociatedUsers:s=[],onAssociateUser:t,onMoveNode:i,onMoveNodes:o,columns:l,nameHeader:u=e.t("leader"),rootDropLabel:c=e.t("leadership_make_root")}={}){const{alias:f}=a.useAuth(),{data:_,isLoading:g,error:v,refetch:w}=h(),j=x(),b=p(),[y,N]=r.useState(()=>f?(e=>{try{const r=localStorage.getItem(`${A}-${e}`);if(r)return new Set(JSON.parse(r))}catch{}return new Set})(f):new Set),[S,C]=r.useState([]),[q,I]=r.useState(new Set),[U,L]=r.useState(!0),[D,z]=r.useState(!1),[M,T]=r.useState(),[P,F]=r.useState(null),$=r.useMemo(()=>_?m(_):[],[_]),Q=r.useMemo(()=>$.map(e=>e.id),[$]),B=Q.length>0&&S.length===Q.length,O=$.filter(e=>e.children.length>0).every(e=>y.has(e.id));r.useEffect(()=>{if(_&&_.length>0&&f){if(!localStorage.getItem(`${A}-${f}`)){const e=_.map(e=>e.id),r=new Set(e);N(r),k(f,r)}}},[_,f]);const K=r.useCallback(e=>{N(r=>{const s=new Set(r);return s.has(e)?s.delete(e):s.add(e),f&&k(f,s),s})},[f]),R=r.useCallback(()=>{if(O){const e=new Set;N(e),f&&k(f,e)}else{const e=new Set($.filter(e=>e.children.length>0).map(e=>e.id));N(e),f&&k(f,e)}},[O,$,f]),V=r.useCallback(e=>{C(r=>r.includes(e)?r.filter(r=>r!==e):[...r,e])},[]),H=r.useCallback(()=>{C(B?[]:Q)},[B,Q]),J=r.useCallback(e=>{I(r=>{const s=new Set(r);return s.has(e)?s.delete(e):s.add(e),s})},[]),W=r.useCallback(e=>$.find(r=>r.id===e),[$]),G=r.useCallback((e,r)=>{if(i)return void i(e,r);const a=s.find(r=>r.id===e);if(a){if(t){const e=r?W(r):null;t(a.id,e?.id_user||null)}else b.mutate({id_user:a.id,id_leader:r&&W(r)?.id_user||null});return}const n=W(e);if(!n)return;const d=r?W(r):null;j.mutate({id:n.id,id_leader:d?.id_user||null})},[i,s,t,W,j,b]),X=r.useCallback((e,r)=>{o?o(e,r):(e.forEach(e=>G(e,r)),C([]))},[o,G]),Y=r.useCallback(e=>{T(e),F(null),z(!0)},[]),Z=r.useCallback(()=>{T(void 0),F(null),z(!0)},[]),ee=r.useCallback(()=>{z(!1),T(void 0),F(null)},[]),re=r.useCallback((e,r)=>{const s=q.has(e)&&q.size>1?Array.from(q):[e];r.dataTransfer.effectAllowed="move",r.dataTransfer.setData("text/plain",e),r.dataTransfer.setData("application/x-tree-ids",JSON.stringify(s)),r.currentTarget.style.opacity="0.4"},[q]),se=r.useMemo(()=>[{key:"subordinatesCount",header:"Subordinados",hoverContent:e=>e.subordinateNames&&e.subordinateNames.length>0?n.jsxs("div",{className:"space-y-1.5",children:[n.jsx("p",{className:"text-xs font-medium text-muted-foreground mb-1",children:"Subordinados diretos:"}),[...e.subordinateNames].sort((e,r)=>e.localeCompare(r)).map(e=>n.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[n.jsx(d.User,{className:"h-3 w-3 text-muted-foreground"}),n.jsx("span",{children:e})]},e))]}):n.jsx("p",{className:"text-xs text-muted-foreground",children:"Sem subordinados diretos"})},{key:"email",header:"Email",className:"text-left",width:180,render:e=>n.jsxs("span",{className:"flex items-center gap-1.5 text-muted-foreground text-sm",children:[n.jsx(d.Mail,{className:"h-3.5 w-3.5"}),e.email||"—"]})}],[]),ae=l??se;if(g)return n.jsx("div",{className:"flex items-center justify-center h-full",children:n.jsxs("div",{className:"text-center space-y-2",children:[n.jsx("div",{className:"animate-spin h-8 w-8 border-4 border-primary border-t-transparent rounded-full mx-auto"}),n.jsx("p",{className:"text-sm text-muted-foreground",children:"Carregando..."})]})});if(v)return n.jsx("div",{className:"flex items-center justify-center h-full",children:n.jsxs("div",{className:"text-center",children:[n.jsx("p",{className:"text-destructive mb-4",children:"Erro ao carregar hierarquia de liderança"}),n.jsx(a.Button,{onClick:()=>w(),children:e.t("try_again")})]})});const te=$.filter(r=>r.name!==e.t("inactive_user")).length;return n.jsxs("div",{className:"flex flex-col h-full gap-3 p-4",children:[n.jsxs("div",{className:"flex items-center justify-between",children:[n.jsxs("div",{className:"flex gap-2 items-center",children:[n.jsxs(a.Button,{size:"sm",onClick:Z,children:[n.jsx(d.Plus,{className:"h-4 w-4 mr-2"}),"Definir Líder"]}),n.jsx(a.Button,{size:"sm",variant:"outline",onClick:R,children:O?n.jsxs(n.Fragment,{children:[n.jsx(d.ChevronDown,{className:"h-4 w-4 mr-1"}),"Colapsar"]}):n.jsxs(n.Fragment,{children:[n.jsx(d.ChevronRight,{className:"h-4 w-4 mr-1"}),"Expandir"]})}),n.jsx("div",{className:"flex items-center gap-2 ml-4",children:n.jsxs("div",{className:"flex items-center gap-2 px-3 py-1.5 bg-muted rounded-md",children:[n.jsx(d.Users,{className:"h-4 w-4 text-muted-foreground"}),n.jsxs("span",{className:"text-sm font-medium",children:[te," usuário",1!==te?"s":""," associado",1!==te?"s":""]})]})})]}),n.jsx("p",{className:"text-xs text-muted-foreground",children:"Arraste as linhas para reorganizar • Selecione múltiplos para mover em lote"})]}),n.jsx(a.TreeTable,{data:_||[],columns:ae,nameKey:"name",nameHeader:u,expandedIds:y,onToggleExpand:K,iconComponent:n.jsx(d.Users,{className:"h-4 w-4 text-muted-foreground shrink-0"}),rowActionsVariant:"inline",enableRowDrag:!0,enableSelection:!0,selectedIds:S,onSelectItem:V,onSelectAll:H,isAllSelected:B,onMoveNode:G,onMoveNodes:X,rootDropLabel:c,emptyMessage:e.t("leadership_no_hierarchy"),renderActions:e=>n.jsx(a.Button,{variant:"ghost",size:"icon",className:"h-8 w-8",onClick:()=>Y(e),children:n.jsx(d.Pencil,{className:"h-4 w-4"})})}),s.length>0&&n.jsxs("div",{className:"border rounded-lg overflow-hidden",children:[n.jsxs("button",{type:"button",onClick:()=>L(e=>!e),className:"w-full px-4 py-2.5 bg-muted/50 border-b flex items-center gap-2 hover:bg-muted/70 transition-colors cursor-pointer",children:[U?n.jsx(d.ChevronDown,{className:"h-4 w-4 text-muted-foreground shrink-0"}):n.jsx(d.ChevronRight,{className:"h-4 w-4 text-muted-foreground shrink-0"}),n.jsx(d.UserPlus,{className:"h-4 w-4 text-muted-foreground"}),n.jsx("span",{className:"text-sm font-medium",children:"Usuários não associados"}),n.jsxs("span",{className:"text-xs text-muted-foreground ml-1",children:["(",s.length,")"]}),q.size>0&&n.jsxs("span",{className:"text-xs text-primary ml-1",children:["(",q.size," selecionado",q.size>1?"s":"",")"]}),n.jsx("span",{className:"text-xs text-muted-foreground ml-auto",children:"Arraste para a hierarquia acima"})]}),U&&n.jsx("div",{className:"divide-y",children:s.map(e=>n.jsxs("div",{draggable:!0,onDragStart:r=>re(e.id,r),onDragEnd:e=>{e.currentTarget.style.opacity="1"},className:a.cn("flex items-center gap-3 px-4 py-2.5 hover:bg-accent/50 cursor-grab active:cursor-grabbing transition-colors",q.has(e.id)&&"bg-primary/5"),children:[n.jsx(a.Checkbox,{checked:q.has(e.id),onCheckedChange:()=>J(e.id),onClick:e=>e.stopPropagation(),className:"shrink-0"}),n.jsx("span",{className:"text-muted-foreground shrink-0 select-none",children:"⠿"}),n.jsx(d.User,{className:"h-4 w-4 text-muted-foreground shrink-0"}),n.jsxs("div",{className:"flex flex-col min-w-0",children:[n.jsx("span",{className:"text-sm truncate",children:e.name}),n.jsx("span",{className:"text-xs text-muted-foreground truncate",children:e.email})]})]},e.id))})]}),n.jsxs("div",{className:"px-3 py-2 bg-muted/20 border rounded-lg text-xs text-muted-foreground flex justify-between",children:[n.jsxs("span",{children:["Usuários associados: ",te]}),s.length>0&&n.jsxs("span",{children:["Usuários não associados: ",s.length]})]}),n.jsx(E,{open:D,onOpenChange:ee,leader:M,prefilledLeaderId:P,title:M?e.t("edit_name"):P?e.t("leadership_add_subordinate"):e.t("leadership_add_root")},`leadership-dialog-${f}`)]})},exports.buildHierarchy=c,exports.filterAndPromoteOrphans=function(e,r){const s=e.map(e=>({...e})),a=new Set(s.filter(e=>!r.has(e.id_user)).map(e=>e.id_user));return s.forEach(e=>{if(e.id_leader&&a.has(e.id_leader)){let r=e.id_leader;for(;r&&a.has(r);){const e=s.find(e=>e.id_user===r);r=e?.id_leader||null}e.id_leader=r}}),s.filter(e=>r.has(e.id_user))},exports.flattenTree=m,exports.useCreateMultipleLeadersMutation=_,exports.useCreateSingleLeaderMutation=p,exports.useLeadershipApi=h,exports.useRemoveLeaderMutation=g,exports.useSyncSubordinatesMutation=v,exports.useUpdateLeaderMutation=x;
|
|
@@ -42,4 +42,23 @@ export declare class AuthService {
|
|
|
42
42
|
* Extrai alias do access token (campo default)
|
|
43
43
|
*/
|
|
44
44
|
private static extractAliasFromAccessToken;
|
|
45
|
+
/**
|
|
46
|
+
* Detecta o alias a partir do subdomínio da URL atual.
|
|
47
|
+
*
|
|
48
|
+
* Padrões reconhecidos:
|
|
49
|
+
* - `educacao.sabergestao.com.br` → "sabergestao"
|
|
50
|
+
* - `<modulo>.<alias>.<tld>` → alias
|
|
51
|
+
* - `<alias>.qualiex.com` → alias
|
|
52
|
+
* - localhost / *.lovable.app / *.lovable.dev → null
|
|
53
|
+
*/
|
|
54
|
+
private static getSubdomainAlias;
|
|
55
|
+
/**
|
|
56
|
+
* Resolve o alias ativo seguindo prioridade:
|
|
57
|
+
* 1. Subdomínio da URL (se válido contra companies)
|
|
58
|
+
* 2. Alias do Supabase token (se válido)
|
|
59
|
+
* 3. Alias armazenado (se válido)
|
|
60
|
+
* 4. `default` do access token (se válido)
|
|
61
|
+
* 5. Primeira company
|
|
62
|
+
*/
|
|
63
|
+
private static resolveAliasFromContext;
|
|
45
64
|
}
|