forlogic-core 2.3.0 → 2.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.note/memory/patterns/dynamic-supabase-config.md +2 -2
- package/.note/memory/patterns/environment-detection-logic.md +21 -15
- package/README.md +1 -1
- package/dist/action-plans/config/environments.d.ts +18 -3
- package/dist/action-plans/config/index.d.ts +3 -3
- package/dist/action-plans/index.d.ts +1 -1
- package/dist/action-plans/index.esm.js +1 -1
- package/dist/action-plans/index.js +1 -1
- package/dist/audit-trail/config/environments.d.ts +18 -3
- package/dist/audit-trail/config/index.d.ts +3 -3
- package/dist/audit-trail/index.d.ts +1 -1
- package/dist/audit-trail/index.esm.js +1 -1
- package/dist/audit-trail/index.js +1 -1
- package/dist/config/environments.d.ts +18 -3
- package/dist/config/index.d.ts +3 -3
- package/dist/index.d.ts +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/index.js +1 -1
- package/dist/leadership/config/environments.d.ts +18 -3
- package/dist/leadership/config/index.d.ts +3 -3
- package/dist/leadership/index.d.ts +1 -1
- package/dist/leadership/index.esm.js +1 -1
- package/dist/leadership/index.js +1 -1
- package/dist/places/config/environments.d.ts +18 -3
- package/dist/places/config/index.d.ts +3 -3
- package/dist/places/index.d.ts +1 -1
- package/dist/places/index.esm.js +1 -1
- package/dist/places/index.js +1 -1
- package/dist/sign/config/environments.d.ts +18 -3
- package/dist/sign/config/index.d.ts +3 -3
- package/dist/sign/index.d.ts +1 -1
- package/dist/sign/index.esm.js +1 -1
- package/dist/sign/index.js +1 -1
- package/dist/vite/index.esm.js +24 -1
- package/dist/vite/index.js +24 -0
- package/docs/WORKSPACE_KNOWLEDGE.md +1 -1
- package/docs/design-system/patterns/core-providers.md +11 -2
- package/docs/design-system/patterns/feature-flags.md +53 -21
- package/package.json +1 -1
|
@@ -1,12 +1,27 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Detecção de ambiente prod/dev.
|
|
3
|
+
*
|
|
4
|
+
* Fonte de verdade ÚNICA: `VITE_APP_ENV` (`"PROD"` | `"DEV"`).
|
|
5
|
+
* - `"DEV"` → API/OAuth/Supabase de dev.
|
|
6
|
+
* - `"PROD"` ou ausente / qualquer outro valor → PROD (failsafe).
|
|
7
|
+
*
|
|
8
|
+
* Não há fallback baseado em env vars Supabase: apps sem Supabase precisam
|
|
9
|
+
* configurar `VITE_APP_ENV="DEV"` explicitamente quando quiserem apontar para dev.
|
|
10
|
+
*
|
|
11
|
+
* **Storage de assets (logos/favicon) é sempre prod** — bucket público fixo.
|
|
12
|
+
*/
|
|
13
|
+
export type AppEnv = 'PROD' | 'DEV';
|
|
2
14
|
export interface EnvironmentConfig {
|
|
3
15
|
storageProjectId: string;
|
|
16
|
+
supabaseProjectId: string;
|
|
17
|
+
supabaseUrl: string;
|
|
18
|
+
supabasePublishableKey: string;
|
|
4
19
|
oauth: {
|
|
5
20
|
authUrl: string;
|
|
6
21
|
clientId: string;
|
|
7
22
|
};
|
|
8
23
|
qualiexApiUrl: string;
|
|
9
24
|
}
|
|
25
|
+
export declare function getAppEnv(): AppEnv;
|
|
10
26
|
export declare function getEnvironmentConfig(): EnvironmentConfig;
|
|
11
|
-
export declare function
|
|
12
|
-
export { PROD_PROJECT_ID };
|
|
27
|
+
export declare function isDevEnv(): boolean;
|
|
@@ -22,13 +22,13 @@ export declare const SEARCH_CONFIG: {
|
|
|
22
22
|
export declare const isLovablePreview: () => boolean;
|
|
23
23
|
/**
|
|
24
24
|
* Determines auth method: true → use dev-tokens edge function, false → use OAuth.
|
|
25
|
-
*
|
|
26
|
-
*
|
|
25
|
+
* Requer modo Supabase: em modo dotnet, dev-tokens não existe e devemos sempre
|
|
26
|
+
* cair no OAuth real (loginProd), mesmo em localhost/preview.
|
|
27
27
|
*/
|
|
28
28
|
export declare const shouldUseDevTokens: () => boolean;
|
|
29
29
|
/** @deprecated Use `isLovablePreview()` or `shouldUseDevTokens()` instead */
|
|
30
30
|
export declare const isDevEnvironment: () => boolean;
|
|
31
|
-
export {
|
|
31
|
+
export { isDevEnv, getAppEnv, type AppEnv } from './environments';
|
|
32
32
|
export declare const getQualiexApiUrl: () => string;
|
|
33
33
|
export declare const QUERY_KEYS: {
|
|
34
34
|
readonly crud: (entity: string) => readonly [string];
|
|
@@ -90,7 +90,7 @@ export { loadForlogicFonts } from './utils/load-fonts';
|
|
|
90
90
|
export * from './types';
|
|
91
91
|
export * from './types/sidebar';
|
|
92
92
|
export * from './config';
|
|
93
|
-
export { getEnvironmentConfig,
|
|
93
|
+
export { getEnvironmentConfig, isDevEnv, getAppEnv, type AppEnv } from './config/environments';
|
|
94
94
|
export type { EnvironmentConfig } from './config/environments';
|
|
95
95
|
export { setBackendMode, getBackendMode, isSupabaseBackend } from './config/backend';
|
|
96
96
|
export type { BackendMode } from './config/backend';
|
|
@@ -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 A,Trash2 as E,Mail as I,Plus as T,Users as C,Pencil as D,UserPlus as U}from"lucide-react";import{Slot as R}from"@radix-ui/react-slot";import{cva as P}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 q from"@radix-ui/react-dialog";import*as j 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 J}from"@hookform/resolvers";import*as F from"@radix-ui/react-label";import*as K 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="qualiex_access_token",ae="qualiex_id_token",re="supabase_token",te="oauth_state",se="oauth_nonce",oe="selected_alias",ne="manual_logout",ie="supabase_project_id",le={setAccessToken:e=>localStorage.setItem(ee,e),getAccessToken:()=>localStorage.getItem(ee),setIdToken:e=>localStorage.setItem(ae,e),getIdToken:()=>localStorage.getItem(ae),getSupabaseToken:()=>localStorage.getItem(re),setOAuthState:e=>sessionStorage.setItem(te,e),getOAuthState:()=>sessionStorage.getItem(te),clearOAuthState:()=>sessionStorage.removeItem(te),setOAuthNonce:e=>sessionStorage.setItem(se,e),getOAuthNonce:()=>sessionStorage.getItem(se),clearOAuthNonce:()=>sessionStorage.removeItem(se),setSelectedAlias:e=>localStorage.setItem(oe,e),getSelectedAlias:()=>localStorage.getItem(oe),clearSelectedAlias:()=>localStorage.removeItem(oe),generateOAuthNonce:()=>{const e=new Uint8Array(32);return crypto.getRandomValues(e),btoa(String.fromCharCode(...e)).replace(/[+/=]/g,"")},hasAllTokens:()=>!(!le.getAccessToken()||!le.getIdToken()),checkProjectMismatch:()=>{const e=import.meta.env.VITE_SUPABASE_PROJECT_ID;if(!e)return!1;const a=localStorage.getItem(ie);return a&&a!==e?(le.clearAll(),localStorage.setItem(ie,e),!0):(a||localStorage.setItem(ie,e),!1)},setSupabaseToken:e=>{localStorage.setItem(re,e),le._clearValidationCache()},areAllTokensValid:()=>{const e=le.getAccessToken(),a=le.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=le.getAccessToken(),r=le.getIdToken(),t=le.getSupabaseToken();return a&&le.isTokenExpired(a)&&(localStorage.removeItem(ee),e=!0),r&&le.isTokenExpired(r)&&(localStorage.removeItem(ae),e=!0),t&&le.isTokenExpired(t)&&(localStorage.removeItem(re),e=!0),e},clearAll:()=>{localStorage.removeItem(ee),localStorage.removeItem(ae),localStorage.removeItem(re),localStorage.removeItem(oe),localStorage.removeItem(ne),sessionStorage.removeItem(te),sessionStorage.removeItem(se),le._clearValidationCache()},setManualLogout:()=>localStorage.setItem(ne,"true"),isManualLogout:()=>"true"===localStorage.getItem(ne),clearManualLogout:()=>localStorage.removeItem(ne),isTokenExpired:e=>{try{return Z.isTokenExpired(e)}catch{return!0}},_validationCache:{isValid:!1,timestamp:0,cacheValidityMs:3e5},_clearValidationCache:()=>{le._validationCache.isValid=!1,le._validationCache.timestamp=0},isSupabaseTokenValid:()=>{const e=le.getSupabaseToken();if(!e)return!1;if(le.isTokenExpired(e))return le._clearValidationCache(),le._handleExpiredToken(),!1;const a=Date.now();return a-le._validationCache.timestamp<le._validationCache.cacheValidityMs?le._validationCache.isValid:(le._validationCache.isValid=!0,le._validationCache.timestamp=a,!0)},getValidSupabaseToken:()=>le.isSupabaseTokenValid()?le.getSupabaseToken():null,_handleExpiredToken:()=>{le.clearAll()},extractTokenData:()=>{if(!le.isSupabaseTokenValid())return null;const e=le.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 le._handleExpiredToken(),null}},getCompanyId:e=>{const a=le.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=le.extractTokenData();if(r?.companyId)return r.companyId;const t=le.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=[le.getAccessToken(),le.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=le.extractTokenData();return e?.companyId||null},getAllCompaniesData:()=>{const e=le.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[]}}},de={storageProjectId:"ccjfvpnndclajkleyqkc",oauth:{authUrl:"https://login.qualiex.com/oauth2/authorize",clientId:"ae6021a0-e874-4aab-9716-b478e59cec20"},qualiexApiUrl:"https://common-v4-api.qualiex.com"},ce={storageProjectId:"ccjfvpnndclajkleyqkc",oauth:{authUrl:"https://login-dev.qualiex.com/oauth2/authorize",clientId:"ae6021a0-e874-4aab-9716-b478e59cec20"},qualiexApiUrl:"https://common-v4-api-dev.qualiex.com"};function ue(){let e=import.meta.env.VITE_SUPABASE_PROJECT_ID;if(!e)try{const a=import.meta.env.VITE_SUPABASE_URL;a&&(e=new URL(a).hostname.split(".")[0])}catch{}return"ccjfvpnndclajkleyqkc"===e?de:ce}const me={get oauth(){const e=ue();return{authUrl:e.oauth.authUrl,clientId:e.oauth.clientId,responseType:"id_token token",scope:"openid profile email"}}};import.meta.env.VITE_IS_QUALIEX;const he=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 pe(e){return!!e&&e.startsWith("eyJ")}function fe(){const e=import.meta.env.VITE_SUPABASE_PK_OVERRIDE;return e||(import.meta.env.VITE_SUPABASE_PUBLISHABLE_KEY??"")}let ge=!1;class ye{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?pe(a):e&&pe(a)?ge=!0:pe(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(!ye.instance){const e=function(){const e=import.meta.env.VITE_SUPABASE_URL,a=fe();return e&&a?{url:e,key:a}:null}();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).");ye.instance=new ye(e)}return ye.instance}getClient(){const e=le.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 he.handleError(a instanceof Error?a:"Supabase - Error validating token",!1),!1}}}function ve(){return ye.getInstance().getClient()}class we{static async generateToken(e,a,r,t=!1){try{if(!t){const e=le.getSupabaseToken();if(e&&le.isSupabaseTokenValid())return e}const s=ve(),{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?(le.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 xe{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=le.getAccessToken(),r=le.getSelectedAlias();if(!a||!r)return null;const t=await we.generateToken(a,r,this.onLogoutCallback||void 0,e);return t||null}catch(a){return null}}}xe.regenerationPromise=null,xe.onLogoutCallback=null;var be;const _e={isAuthenticated:!1,isLoading:!1,user:null,alias:null,companies:[],selectedUnit:null,userId:null,userAlias:null,placeId:null,placeName:null,activePlaceId:null,activePlaceName:null};be=class{static async initialize(){try{const e=!0;if(e){if(le.checkProjectMismatch())return{..._e}}if(!le.hasAllTokens()||!le.areAllTokensValid())return le.clearExpiredTokens(),{..._e};const a=le.getAccessToken(),r=le.getIdToken();le.clearManualLogout();const t=this.extractUserFromIdToken(r,a),s=this.extractCompaniesFromIdToken(r),o=this.extractAliasFromAccessToken(a),n=e?le.extractTokenData():null,i=n?.alias;let l=null;if(i&&s.some(e=>e.alias===i))l=i;else{const e=le.getSelectedAlias(),a=e&&s.some(a=>a.alias===e);l=a?e:o||s[0]?.alias||null}if(e&&(!le.isSupabaseTokenValid()&&l&&await xe.attemptRegeneration(),!le.isSupabaseTokenValid()))return{..._e};let d=null;if(l){const e=le.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{..._e}}}static async loginDev(){try{const e=ve(),{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==";le.setOAuthState(e);const a=le.generateOAuthNonce();le.setOAuthNonce(a);const r=`${window.location.origin}/callback`,t=new URL(me.oauth.authUrl);t.searchParams.set("client_id",me.oauth.clientId),t.searchParams.set("response_type",me.oauth.responseType),t.searchParams.set("scope",me.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=le.getAccessToken();e!==t&&le.clearAll()}const n=!0;if(le.hasAllTokens()){if(n){le.getValidSupabaseToken()||await xe.attemptRegeneration(!0)}return!0}const i=t,l=s;if(!i||!l)throw new Error("Tokens não encontrados na URL de callback");le.setAccessToken(i),le.setIdToken(l),le.clearManualLogout();const d=this.extractAliasFromAccessToken(i);if(d)le.setSelectedAlias(d);else{const e=this.extractCompaniesFromIdToken(l);if(0===e.length)throw new Error("Nenhuma empresa encontrada nos tokens");le.setSelectedAlias(e[0].alias)}if(n){if(!await xe.attemptRegeneration(!0))throw new Error("Falha ao gerar token Supabase")}return le.clearOAuthState(),le.clearOAuthNonce(),!0}catch(e){throw e}}static async logout(){le.setManualLogout(),le.clearAll(),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}},xe.setLogoutCallback(()=>{be.logout()});class Ne{static handleError(e){if(!e)return!1;const a=e.message||e.toString();return!!this.isAuthenticationError(e,a)&&(le.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 ke{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 xe.attemptRegeneration()?(this.isRetrying=!1,!0):(Ne.handleError(e),this.isRetrying=!1,!1)}catch(t){return Ne.handleError(e),this.isRetrying=!1,!1}}return!1}static validateToken(){const e=le.getAccessToken();return e?le.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."}}}ke.isRetrying=!1;const Se=new class{get baseUrl(){return ue().qualiexApiUrl}async makeApiCall(e,a,r){const t=ke.validateToken();if(!t.valid)throw new Error(t.message||"Token inválido");const s=le.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 he.handleError(`[QualiexApi] Formato de resposta inesperado${a}`,!1),null;r=e}return Array.isArray(r)?r.map(e=>this.mapToQualiexUser(e)):(he.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 ke.handleApiError(s))try{const a=await this.makeApiCall("/api/common/v1/companiesusers",t,e);return this.parseUsersResponse(a," após retry")??[]}catch(o){return he.handleError(o instanceof Error?o:"Erro ao buscar usuários após renovação de token",!0),[]}return he.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 he.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=le.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||""})):(he.handleError("[QualiexApi] fetchSoftwares: formato de resposta inesperado",!1),[])}catch(a){if(await ke.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 he.handleError(r instanceof Error?r:"Erro ao buscar softwares após renovação de token",!0),[]}return he.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})):(he.handleError("[QualiexApi] fetchUserAssociations: formato de resposta inesperado",!1),[])}catch(r){if(await ke.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 he.handleError(t instanceof Error?t:"Erro ao buscar associações após renovação de token",!0),[]}return he.handleError(r instanceof Error?r.message:"Erro ao buscar associações do usuário",!0),[]}}},Ae=t(void 0),Ee=()=>{const e=s(Ae);if(void 0===e)throw new Error("useAuth deve ser usado dentro de um AuthProvider");return e};import.meta.env.VITE_SUPABASE_URL,fe();const Ie=(e={})=>{const{user:a,alias:r}=Ee(),{enabled:t=!0,status:s="active"}=e;return c({queryKey:["qualiex-users",r,s],queryFn:()=>Se.getUsers(r,s),enabled:t&&!!r&&!!a,staleTime:3e5,retry:2,retryDelay:1e3})};function Te(){const{alias:a,isAuthenticated:r}=Ee(),t=le.getAccessToken(),{data:s=[]}=Ie(),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=ve(),{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 Ce="common";function De(){const{alias:e}=Ee(),a=u(),r=ve(),{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 Le(r,e,a.id_user,a.id_leader);const{data:s,error:o}=await r.schema(Ce).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}=Ee(),a=u(),r=ve(),{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(Ce).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 Le(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(Ce).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}=Ee(),a=u(),r=ve(),{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(Ce).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 Le(r,e,s.id_user,a.id_leader,a.id);const{data:o,error:n}=await r.schema(Ce).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 Pe(){const{alias:e}=Ee(),a=u(),r=ve(),{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(Ce).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 Ve(){const{alias:e}=Ee(),a=u(),r=ve(),{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(Ce).from("leaders").select("id, id_user, id_leader").eq("alias",e).eq("is_removed",!1).eq("id_leader",a),r.schema(Ce).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 Le(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 Le(r,e,x.id_user,a)}const v=[];if(p.length){const a=p.map(e=>e.id);v.push(r.schema(Ce).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(Ce).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(Ce).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 Le(a,r,t,s,o){const{data:n,error:i}=await a.schema(Ce).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 Oe(...e){return L(V(e))}const ze=P("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?R:"button",{className:Oe(ze({variant:a,size:r,className:e})),ref:o,...s}));qe.displayName="Button";const je=a.forwardRef(({className:e,...a},r)=>h(O.Root,{ref:r,className:Oe("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:Oe("flex items-center justify-center text-current"),children:h(w,{className:"h-4 w-4"})})}));je.displayName=O.Root.displayName;const Be=a.forwardRef(({className:e,...a},r)=>h("table",{ref:r,className:Oe("w-full caption-bottom text-[13px] table-fixed",e),...a}));Be.displayName="Table";const Me=a.forwardRef(({className:e,...a},r)=>h("thead",{ref:r,className:Oe("[&_tr]:border-b sticky top-0 z-[1] bg-background",e),...a}));Me.displayName="TableHeader";const $e=a.forwardRef(({className:e,...a},r)=>h("tbody",{ref:r,className:Oe("[&_tr:last-child]:border-0",e),...a}));$e.displayName="TableBody";a.forwardRef(({className:e,...a},r)=>h("tfoot",{ref:r,className:Oe("border-t bg-muted/50 font-medium [&>tr]:last:border-b-0",e),...a})).displayName="TableFooter";const We=a.forwardRef(({className:e,...a},r)=>h("tr",{ref:r,className:Oe("border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted even:bg-table-stripe",e),...a}));We.displayName="TableRow";const He=a.forwardRef(({className:e,...a},r)=>h("th",{ref:r,className:Oe("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}));He.displayName="TableHead";const Je=a.forwardRef(({className:e,...a},r)=>h("td",{ref:r,className:Oe("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:Oe("mt-4 text-sm text-muted-foreground",e),...a})).displayName="TableCaption";const Fe=z.Root,Ke=z.Trigger,Qe=a.forwardRef(({className:e,align:a="center",sideOffset:r=4,...t},s)=>h(z.Content,{ref:s,align:a,sideOffset:r,className:Oe("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 Ye(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 Ge({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 Xe({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:A}){const E=o.has(e.id),I=(e.children?.length??0)>0,T=24*a,C="inline"===d,D=y===e.id||u?.has(e.id)&&y&&u?.has(y),U=v===e.id&&y!==e.id,R=u?.has(e.id)??!1,P={itemId:e.id,enableDrag:g,onDragStartCell:w,onDragEndCell:b,onDragOverCell:k,onDropCell:S};return p(f,{children:[p(We,{className:Oe(i&&"cursor-pointer",C&&"group",D&&"opacity-40",U&&"ring-2 ring-primary ring-inset bg-primary/5"),onClick:i?()=>i(e):void 0,children:[h(Ge,{...P,children:p("div",{className:"flex items-center gap-2",style:{paddingLeft:`${T}px`},children:[c&&h(je,{checked:R,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:"⠿"}),I?h("button",{onClick:a=>{a.stopPropagation(),n(e.id)},className:"p-1 hover:bg-accent rounded shrink-0",children:h(E?_: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&&A&&A>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:A})]})}),r.map(r=>{const t=e[r.key],s=r.render?r.render(e,a):null!=t?String(t):"—";return h(Ge,{...P,className:Oe("text-center",r.className),children:r.hoverContent?p(Fe,{openDelay:200,children:[h(Ke,{asChild:!0,children:h("span",{className:"cursor-default underline decoration-dotted underline-offset-4 text-foreground",children:s})}),h(Qe,{side:"bottom",align:"center",className:"w-auto max-w-xs",children:r.hoverContent(e)})]}):s},String(r.key))}),l&&h(Ge,{...P,className:"text-right",children:h("div",{onClick:e=>e.stopPropagation(),className:Oe("flex items-center justify-end gap-1",C&&"opacity-0 group-hover:opacity-100 transition-opacity"),children:l(e)})})]}),I&&E&&e.children.map(e=>h(Xe,{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:A},e.id))]})}function Ze({onDrop:a,isDragOver:r,onDragOver:t,onDragLeave:s,label:o}){return p("div",{className:Oe("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 ea({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:A,enableRowDrag:E,onMoveNode:I,onMoveNodes:T,rootDropLabel:C,actionsWidth:D=20,nameMinWidth:U=200}){const[R,P]=n(null),[V,L]=n(null),[O,z]=n(!1),[q,j]=n(1),B=i(null),M=i([]),$=i(null),W=r.useMemo(()=>new Set(N??[]),[N]),H=r.useMemo(()=>{if(!R||!a)return new Set;const e=M.current.length>0?M.current:[R],r=function(e,a){const r=new Set;for(const t of a)Ye(e,t).forEach(e=>r.add(e));return r}(a,e);return e.forEach(e=>r.add(e)),r},[R,a]),J=i(H);J.current=H;const F=l(()=>{B.current=null,M.current=[],$.current=null,P(null),L(null),z(!1),j(1)},[]),K=l((e,a)=>{e.length>1&&T?T(e,a):1===e.length&&I?.(e[0],a)},[I,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,P(e),j(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",J.current.has(e)?L(null):($.current=e,L(e))},[]),G=l((e,a)=>{a.preventDefault(),a.stopPropagation();const r=J.current.has(e)?$.current:e;if(!r)return void F();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)||K(t,r),F()},[K,F]),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?(K(a,null),F()):F()},[K,F]),Z=l(e=>{e.preventDefault(),e.dataTransfer.dropEffect="move",z(!0)},[]),ee=l(e=>{E&&(e.preventDefault(),e.dataTransfer.dropEffect="move")},[E]),ae=l(e=>{if(!E)return;const a=document.elementFromPoint(e.clientX,e.clientY)?.closest?.("[data-tree-row-id]"),r=a?.dataset?.treeRowId??$.current;r&&G(r,e)},[E,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!==R;return p("div",{className:Oe("border rounded-lg overflow-hidden relative",b),onDragOver:ee,onDrop:ae,onDragLeave:E?e=>{const a=e.relatedTarget;a&&e.currentTarget.contains(a)||(L(null),z(!1))}:void 0,children:[E&&re&&h(Ze,{onDrop:X,isDragOver:O,onDragOver:Z,onDragLeave:()=>z(!1),label:C}),p(Be,{children:[h(Me,{children:p(We,{children:[h(He,{className:"text-left",style:{minWidth:U},children:p("div",{className:"flex items-center gap-2",children:[_&&h(je,{checked:A??!1,onCheckedChange:()=>S?.()}),o]})}),t.map(e=>h(He,{className:Oe("text-center",e.className),style:e.width?{width:e.width}:void 0,children:e.header},String(e.key))),f&&h(He,{className:"text-right",style:{width:D},children:g})]})}),h($e,{children:a.map(e=>h(Xe,{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:E,draggedId:R,dragOverId:V,onDragStartCell:Q,onDragEndCell:F,onDragOverCell:Y,onDropCell:G,dragCount:q},e.id))})]})]})}Qe.displayName=z.Content.displayName;const aa=a.forwardRef(({className:e,orientation:a="horizontal",decorative:r=!0,...t},s)=>h(j.Root,{ref:s,decorative:r,orientation:a,className:Oe("shrink-0 bg-border","horizontal"===a?"h-[1px] w-full":"h-full w-[1px]",e),...t}));aa.displayName=j.Root.displayName;const ra=B.Root,ta=B.Trigger,sa=B.Portal,oa=a.forwardRef(({className:e,...a},r)=>h(B.Overlay,{className:Oe("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}));oa.displayName=B.Overlay.displayName;const na=a.forwardRef(({className:e,...a},r)=>p(sa,{children:[h(oa,{}),h(B.Content,{ref:r,className:Oe("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})]}));na.displayName=B.Content.displayName;const ia=({className:e,...a})=>h("div",{className:Oe("flex flex-col space-y-2 text-center sm:text-left",e),...a});ia.displayName="AlertDialogHeader";const la=({className:e,...a})=>h("div",{className:Oe("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",e),...a});la.displayName="AlertDialogFooter";const da=a.forwardRef(({className:e,...a},r)=>h(B.Title,{ref:r,className:Oe("text-lg font-semibold",e),...a}));da.displayName=B.Title.displayName;const ca=a.forwardRef(({className:e,...a},r)=>h(B.Description,{ref:r,className:Oe("text-sm text-muted-foreground",e),...a}));ca.displayName=B.Description.displayName;const ua=a.forwardRef(({className:e,...a},r)=>h(B.Action,{ref:r,className:Oe(ze(),e),...a}));ua.displayName=B.Action.displayName;const ma=a.forwardRef(({className:e,...a},r)=>h(B.Cancel,{ref:r,className:Oe(ze({variant:"outline"}),"mt-2 sm:mt-0",e),...a}));ma.displayName=B.Cancel.displayName;const ha=q.Root,pa=q.Portal,fa=a.forwardRef(({className:e,...a},r)=>h(q.Overlay,{ref:r,className:Oe("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}));fa.displayName=q.Overlay.displayName;const ga={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"}},ya=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,A]=a.useState(!1),E=a.useRef(null),I=a.useRef(!1),T=s??(i||l||d||c||u||m?void 0:"md"),C=T?ga[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},U=a.useCallback(e=>{"form"===o&&n?(E.current=e,A(!0)):e()},[o,n]),R=a.useRef(null),P="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(pa,{children:[h(fa,{}),p(q.Content,{ref:N,className:Oe("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 U(()=>{I.current=!0,R.current?.click()})):void b?.(e);e.preventDefault()},..._,children:[t,P&&p(q.Close,{ref:R,onClick:e=>{I.current?I.current=!1:"form"===o&&n&&(e.preventDefault(),U(()=>{I.current=!0,R.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(ra,{open:S,onOpenChange:A,children:p(na,{children:[p(ia,{children:[h(da,{children:f}),h(ca,{children:g})]}),p(la,{children:[h(ma,{onClick:()=>{A(!1),E.current=null},children:y}),h(ua,{onClick:()=>{A(!1),E.current?.(),E.current=null},children:v})]})]})})]})});ya.displayName=q.Content.displayName;const va=({className:e,showSeparator:a=!1,children:r,...t})=>p("div",{className:Oe("flex flex-col flex-shrink-0",e),...t,children:[h("div",{className:"flex flex-col text-left",children:r}),a&&h(aa,{className:"mt-2"})]});va.displayName="DialogHeader";const wa=({className:e,...a})=>h("div",{className:Oe("flex-1 min-h-0 overflow-auto py-4 px-2 -mx-2",e),...a});wa.displayName="DialogBody";const xa=a.forwardRef(({className:e,...a},r)=>h(q.Title,{ref:r,className:Oe("text-xl font-semibold leading-none tracking-tight",e),...a}));xa.displayName=q.Title.displayName;a.forwardRef(({className:e,...a},r)=>h(q.Description,{ref:r,className:Oe("text-sm text-muted-foreground",e),...a})).displayName=q.Description.displayName;var ba=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},_a=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:J(ba(e.errors,!o.shouldUseNativeValidation&&"all"===o.criteriaMode),o)};throw e}))}catch(n){return Promise.reject(n)}}};const Na=P("text-xs font-medium leading-none text-foreground peer-disabled:cursor-not-allowed peer-disabled:opacity-70"),ka=a.forwardRef(({className:e,...a},r)=>h(F.Root,{ref:r,className:Oe(Na(),e),...a}));ka.displayName=F.Root.displayName;const Sa=a.forwardRef(({className:e,children:a,...r},t)=>p(K.Root,{ref:t,className:Oe("relative overflow-hidden",e),...r,children:[h(K.Viewport,{className:"h-full w-full rounded-[inherit]",children:a}),h(Aa,{}),h(K.Corner,{})]}));Sa.displayName=K.Root.displayName;const Aa=a.forwardRef(({className:e,orientation:a="vertical",...r},t)=>h(K.ScrollAreaScrollbar,{ref:t,orientation:a,className:Oe("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(K.ScrollAreaThumb,{className:"relative flex-1 rounded-full bg-border"})}));Aa.displayName=K.ScrollAreaScrollbar.displayName;const Ea=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:Oe("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]})]})});Ea.displayName="Input";const Ia=a.createContext({showCheck:!1}),Ta=({showCheck:e=!1,...a})=>h(Ia.Provider,{value:{showCheck:e},children:h(Q.Root,{...a})}),Ca=Q.Value,Da=a.forwardRef(({className:e,children:a,...r},t)=>p(Q.Trigger,{ref:t,className:Oe("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"})})]}));Da.displayName=Q.Trigger.displayName;const Ua=a.forwardRef(({className:e,...a},r)=>h(Q.ScrollUpButton,{ref:r,className:Oe("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:Oe("flex cursor-default items-center justify-center py-1",e),...a,children:h(_,{className:"h-4 w-4"})}));Ra.displayName=Q.ScrollDownButton.displayName;const Pa=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:Oe("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:Oe("p-1","popper"===r&&"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]"),children:a}),h(Ra,{})]})}));Pa.displayName=Q.Content.displayName;a.forwardRef(({className:e,...a},r)=>h(Q.Label,{ref:r,className:Oe("py-1.5 pl-8 pr-2 text-sm font-semibold",e),...a})).displayName=Q.Label.displayName;const Va=a.forwardRef(({className:e,children:r,...t},s)=>{const{showCheck:o}=a.useContext(Ia);return p(Q.Item,{ref:s,className:Oe("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})]})});Va.displayName=Q.Item.displayName;a.forwardRef(({className:e,...a},r)=>h(Q.Separator,{ref:r,className:Oe("-mx-1 my-1 h-px bg-muted",e),...a})).displayName=Q.Separator.displayName;const La=M.object({id_leader:M.string().nullable(),id_users:M.array(M.string()).min(1,e.t("leadership_select_subordinates"))}),Oa=M.object({id_leader:M.string().nullable(),id_users:M.array(M.string())});function za({value:a,onChange:r,excludeUserIds:t=[],error:s}){const{data:o=[],isLoading:l}=Ie(),[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(A,{className:"h-6 w-6 animate-spin"}),h("span",{className:"ml-2",children:"Carregando dados..."})]}:{className:"space-y-2",children:[h(Ea,{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(je,{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(ka,{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}=Ee(),i=!!a,l=a?.id.startsWith("virtual-"),c=Ue(),u=De(),m=Re(),g=Ve(),y=Pe(),{data:w=[]}=Te(),{data:x=[]}=Ie(),[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:_a(i?Oa:La),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 I=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(ka,{children:e.t("leader")}),h(Ea,{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(ka,{children:s("leadership_immediate_superior")}),p(Ta,{value:T||"none",onValueChange:e=>S.setValue("id_leader","none"===e?null:e),children:[h(Da,{children:h(Ca,{placeholder:"Selecione..."})}),p(Pa,{children:[h("div",{className:"sticky top-0 z-10 bg-background p-2 border-b",children:h(Ea,{placeholder:"Buscar superior...",value:b,onChange:e=>_(e.target.value),onKeyDown:e=>e.stopPropagation(),onClick:e=>e.stopPropagation(),className:"h-8"})}),p(Sa,{className:"h-[200px]",children:[h(Va,{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(Va,{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(ka,{children:"Subordinados *"}),h(za,{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:I||!i&&0===C.length,children:I&&!y.isPending?p(f,{children:[h(A,{className:"mr-2 h-4 w-4 animate-spin"}),i?"Atualizando...":"Salvando..."]}):i?"Atualizar":"Criar"}),i&&!T&&0===C.length&&p(ra,{children:[h(ta,{asChild:!0,children:h(qe,{type:"button",variant:"destructive",disabled:I,className:"ml-auto",children:y.isPending?p(f,{children:[h(A,{className:"mr-2 h-4 w-4 animate-spin"}),"Removendo..."]}):p(f,{children:[h(E,{className:"mr-2 h-4 w-4"}),"Remover"]})})}),p(na,{children:[p(ia,{children:[h(da,{children:s("confirm_removal")}),h(ca,{children:"Tem certeza que deseja remover este líder? Esta ação não pode ser desfeita."})]}),p(la,{children:[h(ma,{children:s("cancel")}),h(ua,{onClick:async()=>{if(a)try{await y.mutateAsync(a.id),t?.()}catch(e){}},children:s("remove")})]})]})]})]})]})}function ja({open:e,onOpenChange:a,leader:r,prefilledLeaderId:t,title:s}){return h(ha,{open:e,onOpenChange:a,children:p(ya,{variant:"form",className:"sm:max-w-[500px]",children:[h(va,{showSeparator:!0,children:h(xa,{children:s})}),h(wa,{children:h(qa,{leader:r,prefilledLeaderId:t,onSuccess:()=>a(!1)})})]})})}const Ba="leadership-expanded-nodes",Ma=(e,a)=>{try{localStorage.setItem(`${Ba}-${e}`,JSON.stringify(Array.from(a)))}catch{}};function $a({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}=Ee(),{data:g,isLoading:y,error:v,refetch:w}=Te(),b=Re(),k=De(),[S,A]=n(()=>m?(e=>{try{const a=localStorage.getItem(`${Ba}-${e}`);if(a)return new Set(JSON.parse(a))}catch{}return new Set})(m):new Set),[E,R]=n([]),[P,V]=n(new Set),[L,O]=n(!0),[z,q]=n(!1),[j,B]=n(),[M,$]=n(null),W=o(()=>g?X(g):[],[g]),H=o(()=>W.map(e=>e.id),[W]),J=H.length>0&&E.length===H.length,F=W.filter(e=>e.children.length>0).every(e=>S.has(e.id));d(()=>{if(g&&g.length>0&&m){if(!localStorage.getItem(`${Ba}-${m}`)){const e=g.map(e=>e.id),a=new Set(e);A(a),Ma(m,a)}}},[g,m]);const K=l(e=>{A(a=>{const r=new Set(a);return r.has(e)?r.delete(e):r.add(e),m&&Ma(m,r),r})},[m]),Q=l(()=>{if(F){const e=new Set;A(e),m&&Ma(m,e)}else{const e=new Set(W.filter(e=>e.children.length>0).map(e=>e.id));A(e),m&&Ma(m,e)}},[F,W,m]),Y=l(e=>{R(a=>a.includes(e)?a.filter(a=>a!==e):[...a,e])},[]),G=l(()=>{R(J?[]:H)},[J,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)),R([]))},[s,ae]),te=l(e=>{B(e),$(null),q(!0)},[]),se=l(()=>{B(void 0),$(null),q(!0)},[]),oe=l(()=>{q(!1),B(void 0),$(null)},[]),ne=l((e,a)=>{const r=P.has(e)&&P.size>1?Array.from(P):[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"},[P]),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(I,{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,F?{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(ea,{data:g||[],columns:le,nameKey:"name",nameHeader:c,expandedIds:S,onToggleExpand:K,iconComponent:h(C,{className:"h-4 w-4 text-muted-foreground shrink-0"}),rowActionsVariant:"inline",enableRowDrag:!0,enableSelection:!0,selectedIds:E,onSelectItem:Y,onSelectAll:G,isAllSelected:J,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(U,{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,")"]}),P.size>0&&p("span",{className:"text-xs text-primary ml-1",children:["(",P.size," selecionado",P.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:Oe("flex items-center gap-3 px-4 py-2.5 hover:bg-accent/50 cursor-grab active:cursor-grabbing transition-colors",P.has(e.id)&&"bg-primary/5"),children:[h(je,{checked:P.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(ja,{open:z,onOpenChange:oe,leader:j,prefilledLeaderId:M,title:j?e.t("edit_name"):M?e.t("leadership_add_subordinate"):e.t("leadership_add_root")},`leadership-dialog-${m}`)]})}export{ja as LeadershipDialog,qa as LeadershipForm,$a as LeadershipPage,G as buildHierarchy,Y as filterAndPromoteOrphans,X as flattenTree,Ue as useCreateMultipleLeadersMutation,De as useCreateSingleLeaderMutation,Te as useLeadershipApi,Pe as useRemoveLeaderMutation,Ve 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"),w=require("@radix-ui/react-label"),b=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),A=N(g),I=N(w),T=N(b),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 R(e){const a=[],t=e=>{a.push(e),e.children.forEach(t)};return e.forEach(t),a}class P{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()}}P.LARGE_PAYLOAD_THRESHOLD=1e3;const L="qualiex_access_token",V="qualiex_id_token",q="supabase_token",O="oauth_state",z="oauth_nonce",M="selected_alias",B="manual_logout",$="supabase_project_id",F={setAccessToken:e=>localStorage.setItem(L,e),getAccessToken:()=>localStorage.getItem(L),setIdToken:e=>localStorage.setItem(V,e),getIdToken:()=>localStorage.getItem(V),getSupabaseToken:()=>localStorage.getItem(q),setOAuthState:e=>sessionStorage.setItem(O,e),getOAuthState:()=>sessionStorage.getItem(O),clearOAuthState:()=>sessionStorage.removeItem(O),setOAuthNonce:e=>sessionStorage.setItem(z,e),getOAuthNonce:()=>sessionStorage.getItem(z),clearOAuthNonce:()=>sessionStorage.removeItem(z),setSelectedAlias:e=>localStorage.setItem(M,e),getSelectedAlias:()=>localStorage.getItem(M),clearSelectedAlias:()=>localStorage.removeItem(M),generateOAuthNonce:()=>{const e=new Uint8Array(32);return crypto.getRandomValues(e),btoa(String.fromCharCode(...e)).replace(/[+/=]/g,"")},hasAllTokens:()=>!(!F.getAccessToken()||!F.getIdToken()),checkProjectMismatch:()=>{const e=(void 0).VITE_SUPABASE_PROJECT_ID;if(!e)return!1;const a=localStorage.getItem($);return a&&a!==e?(F.clearAll(),localStorage.setItem($,e),!0):(a||localStorage.setItem($,e),!1)},setSupabaseToken:e=>{localStorage.setItem(q,e),F._clearValidationCache()},areAllTokensValid:()=>{const e=F.getAccessToken(),a=F.getIdToken();if(!e||!a)return!1;try{const t=P.validateTokens(e,a);return!!t.idTokenValid&&t.idTokenValid}catch(t){return!1}},clearExpiredTokens:()=>{let e=!1;const a=F.getAccessToken(),t=F.getIdToken(),r=F.getSupabaseToken();return a&&F.isTokenExpired(a)&&(localStorage.removeItem(L),e=!0),t&&F.isTokenExpired(t)&&(localStorage.removeItem(V),e=!0),r&&F.isTokenExpired(r)&&(localStorage.removeItem(q),e=!0),e},clearAll:()=>{localStorage.removeItem(L),localStorage.removeItem(V),localStorage.removeItem(q),localStorage.removeItem(M),localStorage.removeItem(B),sessionStorage.removeItem(O),sessionStorage.removeItem(z),F._clearValidationCache()},setManualLogout:()=>localStorage.setItem(B,"true"),isManualLogout:()=>"true"===localStorage.getItem(B),clearManualLogout:()=>localStorage.removeItem(B),isTokenExpired:e=>{try{return P.isTokenExpired(e)}catch{return!0}},_validationCache:{isValid:!1,timestamp:0,cacheValidityMs:3e5},_clearValidationCache:()=>{F._validationCache.isValid=!1,F._validationCache.timestamp=0},isSupabaseTokenValid:()=>{const e=F.getSupabaseToken();if(!e)return!1;if(F.isTokenExpired(e))return F._clearValidationCache(),F._handleExpiredToken(),!1;const a=Date.now();return a-F._validationCache.timestamp<F._validationCache.cacheValidityMs?F._validationCache.isValid:(F._validationCache.isValid=!0,F._validationCache.timestamp=a,!0)},getValidSupabaseToken:()=>F.isSupabaseTokenValid()?F.getSupabaseToken():null,_handleExpiredToken:()=>{F.clearAll()},extractTokenData:()=>{if(!F.isSupabaseTokenValid())return null;const e=F.getSupabaseToken();if(!e)return null;try{const a=P.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 F._handleExpiredToken(),null}},getCompanyId:e=>{const a=F.getAccessToken();if(a)try{const t=P.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=F.extractTokenData();if(t?.companyId)return t.companyId;const r=F.getIdToken();if(r)try{const a=P.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=[F.getAccessToken(),F.getIdToken()];for(const t of a)if(t)try{const a=P.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=F.extractTokenData();return e?.companyId||null},getAllCompaniesData:()=>{const e=F.getIdToken();if(!e)return[];try{const a=P.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[]}}},H={storageProjectId:"ccjfvpnndclajkleyqkc",oauth:{authUrl:"https://login.qualiex.com/oauth2/authorize",clientId:"ae6021a0-e874-4aab-9716-b478e59cec20"},qualiexApiUrl:"https://common-v4-api.qualiex.com"},W={storageProjectId:"ccjfvpnndclajkleyqkc",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(){let e=(void 0).VITE_SUPABASE_PROJECT_ID;if(!e)try{const a=(void 0).VITE_SUPABASE_URL;a&&(e=new URL(a).hostname.split(".")[0])}catch{}return"ccjfvpnndclajkleyqkc"===e?H:W}const J={get oauth(){const e=Q();return{authUrl:e.oauth.authUrl,clientId:e.oauth.clientId,responseType:"id_token token",scope:"openid profile email"}}};(void 0).VITE_IS_QUALIEX;const K=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 Y(e){return!!e&&e.startsWith("eyJ")}function G(){const e=(void 0).VITE_SUPABASE_PK_OVERRIDE;return e||((void 0).VITE_SUPABASE_PUBLISHABLE_KEY??"")}let X=!1;class Z{constructor(e){this.currentToken=null,this.config=e,function(){const e=(void 0).VITE_SUPABASE_PK_OVERRIDE,a=(void 0).VITE_SUPABASE_PUBLISHABLE_KEY;X?Y(a):e&&Y(a)?X=!0:Y(a)?X=!0:X=!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(!Z.instance){const e=function(){const e=(void 0).VITE_SUPABASE_URL,a=G();return e&&a?{url:e,key:a}:null}();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).");Z.instance=new Z(e)}return Z.instance}getClient(){const e=F.getValidSupabaseToken();return e!==this.currentToken&&(this.client=this.createClientWithToken(e),this.currentToken=e),this.client}isTokenValid(e){try{return!P.isTokenExpired(e)}catch(a){return K.handleError(a instanceof Error?a:"Supabase - Error validating token",!1),!1}}}function ee(){return Z.getInstance().getClient()}class ae{static async generateToken(e,a,t,r=!1){try{if(!r){const e=F.getSupabaseToken();if(e&&F.isSupabaseTokenValid())return e}const s=ee(),{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?(F.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 te{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=F.getAccessToken(),t=F.getSelectedAlias();if(!a||!t)return null;const r=await ae.generateToken(a,t,this.onLogoutCallback||void 0,e);return r||null}catch(a){return null}}}te.regenerationPromise=null,te.onLogoutCallback=null;var re;const se={isAuthenticated:!1,isLoading:!1,user:null,alias:null,companies:[],selectedUnit:null,userId:null,userAlias:null,placeId:null,placeName:null,activePlaceId:null,activePlaceName:null};re=class{static async initialize(){try{const e=!0;if(e){if(F.checkProjectMismatch())return{...se}}if(!F.hasAllTokens()||!F.areAllTokensValid())return F.clearExpiredTokens(),{...se};const a=F.getAccessToken(),t=F.getIdToken();F.clearManualLogout();const r=this.extractUserFromIdToken(t,a),s=this.extractCompaniesFromIdToken(t),n=this.extractAliasFromAccessToken(a),o=e?F.extractTokenData():null,i=o?.alias;let l=null;if(i&&s.some(e=>e.alias===i))l=i;else{const e=F.getSelectedAlias(),a=e&&s.some(a=>a.alias===e);l=a?e:n||s[0]?.alias||null}if(e&&(!F.isSupabaseTokenValid()&&l&&await te.attemptRegeneration(),!F.isSupabaseTokenValid()))return{...se};let d=null;if(l){const e=F.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{...se}}}static async loginDev(){try{const e=ee(),{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==";F.setOAuthState(e);const a=F.generateOAuthNonce();F.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=F.getAccessToken();e!==r&&F.clearAll()}const o=!0;if(F.hasAllTokens()){if(o){F.getValidSupabaseToken()||await te.attemptRegeneration(!0)}return!0}const i=r,l=s;if(!i||!l)throw new Error("Tokens não encontrados na URL de callback");F.setAccessToken(i),F.setIdToken(l),F.clearManualLogout();const d=this.extractAliasFromAccessToken(i);if(d)F.setSelectedAlias(d);else{const e=this.extractCompaniesFromIdToken(l);if(0===e.length)throw new Error("Nenhuma empresa encontrada nos tokens");F.setSelectedAlias(e[0].alias)}if(o){if(!await te.attemptRegeneration(!0))throw new Error("Falha ao gerar token Supabase")}return F.clearOAuthState(),F.clearOAuthNonce(),!0}catch(e){throw e}}static async logout(){F.setManualLogout(),F.clearAll(),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 P.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}},te.setLogoutCallback(()=>{re.logout()});class ne{static handleError(e){if(!e)return!1;const a=e.message||e.toString();return!!this.isAuthenticationError(e,a)&&(F.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 oe{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 te.attemptRegeneration()?(this.isRetrying=!1,!0):(ne.handleError(e),this.isRetrying=!1,!1)}catch(r){return ne.handleError(e),this.isRetrying=!1,!1}}return!1}static validateToken(){const e=F.getAccessToken();return e?F.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."}}}oe.isRetrying=!1;const ie=new class{get baseUrl(){return Q().qualiexApiUrl}async makeApiCall(e,a,t){const r=oe.validateToken();if(!r.valid)throw new Error(r.message||"Token inválido");const s=F.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 K.handleError(`[QualiexApi] Formato de resposta inesperado${a}`,!1),null;t=e}return Array.isArray(t)?t.map(e=>this.mapToQualiexUser(e)):(K.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 oe.handleApiError(s))try{const a=await this.makeApiCall("/api/common/v1/companiesusers",r,e);return this.parseUsersResponse(a," após retry")??[]}catch(n){return K.handleError(n instanceof Error?n:"Erro ao buscar usuários após renovação de token",!0),[]}return K.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 K.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=F.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||""})):(K.handleError("[QualiexApi] fetchSoftwares: formato de resposta inesperado",!1),[])}catch(a){if(await oe.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 K.handleError(t instanceof Error?t:"Erro ao buscar softwares após renovação de token",!0),[]}return K.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})):(K.handleError("[QualiexApi] fetchUserAssociations: formato de resposta inesperado",!1),[])}catch(t){if(await oe.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 K.handleError(r instanceof Error?r:"Erro ao buscar associações após renovação de token",!0),[]}return K.handleError(t instanceof Error?t.message:"Erro ao buscar associações do usuário",!0),[]}}},le=a.createContext(void 0),de=()=>{const e=a.useContext(le);if(void 0===e)throw new Error("useAuth deve ser usado dentro de um AuthProvider");return e};(void 0).VITE_SUPABASE_URL,G();const ce=(e={})=>{const{user:a,alias:r}=de(),{enabled:s=!0,status:n="active"}=e;return t.useQuery({queryKey:["qualiex-users",r,n],queryFn:()=>ie.getUsers(r,n),enabled:s&&!!r&&!!a,staleTime:3e5,retry:2,retryDelay:1e3})};function ue(){const{alias:r,isAuthenticated:s}=de(),n=F.getAccessToken(),{data:o=[]}=ce(),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=ee(),{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 me="common";function he(){const{alias:e}=de(),a=t.useQueryClient(),r=ee(),{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 ye(r,e,a.id_user,a.id_leader);const{data:t,error:n}=await r.schema(me).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 pe(){const{alias:e}=de(),a=t.useQueryClient(),r=ee(),{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(me).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 ye(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(me).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 fe(){const{alias:e}=de(),a=t.useQueryClient(),r=ee(),{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(me).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 ye(r,e,t.id_user,a.id_leader,a.id);const{data:n,error:o}=await r.schema(me).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 ge(){const{alias:e}=de(),a=t.useQueryClient(),r=ee(),{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(me).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 xe(){const{alias:e}=de(),a=t.useQueryClient(),r=ee(),{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(me).from("leaders").select("id, id_user, id_leader").eq("alias",e).eq("is_removed",!1).eq("id_leader",a),r.schema(me).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 ye(r,e,s.id_user,a,s.id);for(const w of x){if(w.id_user===a)throw new Error(s("cannot_be_own_leader","Usuário não pode ser seu próprio líder"));await ye(r,e,w.id_user,a)}const y=[];if(p.length){const a=p.map(e=>e.id);y.push(r.schema(me).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(me).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(me).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 ye(a,t,r,s,n){const{data:o,error:i}=await a.schema(me).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 ve(...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"}}),be=k.forwardRef(({className:e,variant:a,size:t,asChild:s=!1,...n},o)=>{const i=s?l.Slot:"button";return r.jsx(i,{className:ve(we({variant:a,size:t,className:e})),ref:o,...n})});be.displayName="Button";const _e=k.forwardRef(({className:e,...a},t)=>r.jsx(j.Root,{ref:t,className:ve("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:ve("flex items-center justify-center text-current"),children:r.jsx(i.Check,{className:"h-4 w-4"})})}));_e.displayName=j.Root.displayName;const Ne=k.forwardRef(({className:e,...a},t)=>r.jsx("table",{ref:t,className:ve("w-full caption-bottom text-[13px] table-fixed",e),...a}));Ne.displayName="Table";const ke=k.forwardRef(({className:e,...a},t)=>r.jsx("thead",{ref:t,className:ve("[&_tr]:border-b sticky top-0 z-[1] bg-background",e),...a}));ke.displayName="TableHeader";const je=k.forwardRef(({className:e,...a},t)=>r.jsx("tbody",{ref:t,className:ve("[&_tr:last-child]:border-0",e),...a}));je.displayName="TableBody";k.forwardRef(({className:e,...a},t)=>r.jsx("tfoot",{ref:t,className:ve("border-t bg-muted/50 font-medium [&>tr]:last:border-b-0",e),...a})).displayName="TableFooter";const Se=k.forwardRef(({className:e,...a},t)=>r.jsx("tr",{ref:t,className:ve("border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted even:bg-table-stripe",e),...a}));Se.displayName="TableRow";const Ce=k.forwardRef(({className:e,...a},t)=>r.jsx("th",{ref:t,className:ve("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}));Ce.displayName="TableHead";const Ee=k.forwardRef(({className:e,...a},t)=>r.jsx("td",{ref:t,className:ve("px-4 py-2 align-middle overflow-hidden [&:has([role=checkbox])]:pr-0",e),...a}));Ee.displayName="TableCell";k.forwardRef(({className:e,...a},t)=>r.jsx("caption",{ref:t,className:ve("mt-4 text-sm text-muted-foreground",e),...a})).displayName="TableCaption";const Ae=S.Root,Ie=S.Trigger,Te=k.forwardRef(({className:e,align:a="center",sideOffset:t=4,...s},n)=>r.jsx(S.Content,{ref:n,align:a,sideOffset:t,className:ve("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 De(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 Ue({children:e,itemId:a,enableDrag:t,onDragStartCell:s,onDragEndCell:n,onDragOverCell:o,onDropCell:i,className:l}){return r.jsx(Ee,{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:w,onDropCell:b,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,A=h?.has(e.id)??!1,I={itemId:e.id,enableDrag:f,onDragStartCell:y,onDragEndCell:v,onDragOverCell:w,onDropCell:b};return r.jsxs(r.Fragment,{children:[r.jsxs(Se,{className:ve(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(Ue,{...I,children:r.jsxs("div",{className:"flex items-center gap-2",style:{paddingLeft:`${j}px`},children:[m&&r.jsx(_e,{checked:A,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(Ue,{...I,className:ve("text-center",t.className),children:t.hoverContent?r.jsxs(Ae,{openDelay:200,children:[r.jsx(Ie,{asChild:!0,children:r.jsx("span",{className:"cursor-default underline decoration-dotted underline-offset-4 text-foreground",children:n})}),r.jsx(Te,{side:"bottom",align:"center",className:"w-auto max-w-xs",children:t.hoverContent(e)})]}):n},String(t.key))}),c&&r.jsx(Ue,{...I,className:"text-right",children:r.jsx("div",{onClick:e=>e.stopPropagation(),className:ve("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:w,onDropCell:b,dragCount:_},e.id))]})}function Pe({onDrop:a,isDragOver:t,onDragOver:s,onDragLeave:n,label:o}){return r.jsxs("div",{className:ve("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 Le({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:w,onSelectAll:b,isAllSelected:_,enableRowDrag:N,onMoveNode:k,onMoveNodes:j,rootDropLabel:S,actionsWidth:C=20,nameMinWidth:E=200}){const[A,I]=a.useState(null),[T,D]=a.useState(null),[U,R]=a.useState(!1),[P,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(!A||!t)return new Set;const e=q.current.length>0?q.current:[A],a=function(e,a){const t=new Set;for(const r of a)De(e,r).forEach(e=>t.add(e));return t}(t,e);return e.forEach(e=>a.add(e)),a},[A,t]),B=a.useRef(M);B.current=M;const $=a.useCallback(()=>{V.current=null,q.current=[],O.current=null,I(null),D(null),R(!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,I(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))},[]),Q=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,$]),J=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,$]),K=a.useCallback(e=>{e.preventDefault(),e.dataTransfer.dropEffect="move",R(!0)},[]),Y=a.useCallback(e=>{N&&(e.preventDefault(),e.dataTransfer.dropEffect="move")},[N]),G=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&&Q(t,e)},[N,Q]);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 X=null!==A;return r.jsxs("div",{className:ve("border rounded-lg overflow-hidden relative",x),onDragOver:Y,onDrop:G,onDragLeave:N?e=>{const a=e.relatedTarget;a&&e.currentTarget.contains(a)||(D(null),R(!1))}:void 0,children:[N&&X&&r.jsx(Pe,{onDrop:J,isDragOver:U,onDragOver:K,onDragLeave:()=>R(!1),label:S}),r.jsxs(Ne,{children:[r.jsx(ke,{children:r.jsxs(Se,{children:[r.jsx(Ce,{className:"text-left",style:{minWidth:E},children:r.jsxs("div",{className:"flex items-center gap-2",children:[y&&r.jsx(_e,{checked:_??!1,onCheckedChange:()=>b?.()}),o]})}),s.map(e=>r.jsx(Ce,{className:ve("text-center",e.className),style:e.width?{width:e.width}:void 0,children:e.header},String(e.key))),m&&r.jsx(Ce,{className:"text-right",style:{width:C},children:h})]})}),r.jsx(je,{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:w,enableRowDrag:N,draggedId:A,dragOverId:T,onDragStartCell:H,onDragEndCell:$,onDragOverCell:W,onDropCell:Q,dragCount:P},e.id))})]})]})}Te.displayName=S.Content.displayName;const Ve=k.forwardRef(({className:e,orientation:a="horizontal",decorative:t=!0,...s},n)=>r.jsx(E.Root,{ref:n,decorative:t,orientation:a,className:ve("shrink-0 bg-border","horizontal"===a?"h-[1px] w-full":"h-full w-[1px]",e),...s}));Ve.displayName=E.Root.displayName;const qe=A.Root,Oe=A.Trigger,ze=A.Portal,Me=k.forwardRef(({className:e,...a},t)=>r.jsx(A.Overlay,{className:ve("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}));Me.displayName=A.Overlay.displayName;const Be=k.forwardRef(({className:e,...a},t)=>r.jsxs(ze,{children:[r.jsx(Me,{}),r.jsx(A.Content,{ref:t,className:ve("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})]}));Be.displayName=A.Content.displayName;const $e=({className:e,...a})=>r.jsx("div",{className:ve("flex flex-col space-y-2 text-center sm:text-left",e),...a});$e.displayName="AlertDialogHeader";const Fe=({className:e,...a})=>r.jsx("div",{className:ve("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",e),...a});Fe.displayName="AlertDialogFooter";const He=k.forwardRef(({className:e,...a},t)=>r.jsx(A.Title,{ref:t,className:ve("text-lg font-semibold",e),...a}));He.displayName=A.Title.displayName;const We=k.forwardRef(({className:e,...a},t)=>r.jsx(A.Description,{ref:t,className:ve("text-sm text-muted-foreground",e),...a}));We.displayName=A.Description.displayName;const Qe=k.forwardRef(({className:e,...a},t)=>r.jsx(A.Action,{ref:t,className:ve(we(),e),...a}));Qe.displayName=A.Action.displayName;const Je=k.forwardRef(({className:e,...a},t)=>r.jsx(A.Cancel,{ref:t,className:ve(we({variant:"outline"}),"mt-2 sm:mt-0",e),...a}));Je.displayName=A.Cancel.displayName;const Ke=C.Root,Ye=C.Portal,Ge=k.forwardRef(({className:e,...a},t)=>r.jsx(C.Overlay,{ref:t,className:ve("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 Xe={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"}},Ze=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:w,...b},_)=>{const[N,j]=k.useState(!1),S=k.useRef(null),E=k.useRef(!1),A=s??(l||d||c||u||m||h?void 0:"md"),I=A?Xe[A]:{},T={...l??I.width?{width:l??I.width}:{},...d??I.minWidth?{minWidth:d??I.minWidth}:{},...c??I.maxWidth?{maxWidth:c??I.maxWidth}:{},...u??I.height?{height:u??I.height}:{},...m??I.minHeight?{minHeight:m??I.minHeight}:{},...h??I.maxHeight?{maxHeight:h??I.maxHeight}:{},...y},D=k.useCallback(e=>{"form"===n&&o?(S.current=e,j(!0)):e()},[n,o]),U=k.useRef(null),R="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(Ye,{children:[r.jsx(Ge,{}),r.jsxs(C.Content,{ref:_,className:ve("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 w?.(e);e.preventDefault()},...b,children:[t,R&&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(qe,{open:N,onOpenChange:j,children:r.jsxs(Be,{children:[r.jsxs($e,{children:[r.jsx(He,{children:p}),r.jsx(We,{children:f})]}),r.jsxs(Fe,{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})]})]})})]})});Ze.displayName=C.Content.displayName;const ea=({className:e,showSeparator:a=!1,children:t,...s})=>r.jsxs("div",{className:ve("flex flex-col flex-shrink-0",e),...s,children:[r.jsx("div",{className:"flex flex-col text-left",children:t}),a&&r.jsx(Ve,{className:"mt-2"})]});ea.displayName="DialogHeader";const aa=({className:e,...a})=>r.jsx("div",{className:ve("flex-1 min-h-0 overflow-auto py-4 px-2 -mx-2",e),...a});aa.displayName="DialogBody";const ta=k.forwardRef(({className:e,...a},t)=>r.jsx(C.Title,{ref:t,className:ve("text-xl font-semibold leading-none tracking-tight",e),...a}));ta.displayName=C.Title.displayName;k.forwardRef(({className:e,...a},t)=>r.jsx(C.Description,{ref:t,className:ve("text-sm text-muted-foreground",e),...a})).displayName=C.Description.displayName;var ra=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},sa=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(ra(e.errors,!n.shouldUseNativeValidation&&"all"===n.criteriaMode),n)};throw e}))}catch(o){return Promise.reject(o)}}};const na=d.cva("text-xs font-medium leading-none text-foreground peer-disabled:cursor-not-allowed peer-disabled:opacity-70"),oa=k.forwardRef(({className:e,...a},t)=>r.jsx(I.Root,{ref:t,className:ve(na(),e),...a}));oa.displayName=I.Root.displayName;const ia=k.forwardRef(({className:e,children:a,...t},s)=>r.jsxs(T.Root,{ref:s,className:ve("relative overflow-hidden",e),...t,children:[r.jsx(T.Viewport,{className:"h-full w-full rounded-[inherit]",children:a}),r.jsx(la,{}),r.jsx(T.Corner,{})]}));ia.displayName=T.Root.displayName;const la=k.forwardRef(({className:e,orientation:a="vertical",...t},s)=>r.jsx(T.ScrollAreaScrollbar,{ref:s,orientation:a,className:ve("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"})}));la.displayName=T.ScrollAreaScrollbar.displayName;const da=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:ve("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]})]})});da.displayName="Input";const ca=k.createContext({showCheck:!1}),ua=({showCheck:e=!1,...a})=>r.jsx(ca.Provider,{value:{showCheck:e},children:r.jsx(D.Root,{...a})}),ma=D.Value,ha=k.forwardRef(({className:e,children:a,...t},s)=>r.jsxs(D.Trigger,{ref:s,className:ve("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"})})]}));ha.displayName=D.Trigger.displayName;const pa=k.forwardRef(({className:e,...a},t)=>r.jsx(D.ScrollUpButton,{ref:t,className:ve("flex cursor-default items-center justify-center py-1",e),...a,children:r.jsx(i.ChevronUp,{className:"h-4 w-4"})}));pa.displayName=D.ScrollUpButton.displayName;const fa=k.forwardRef(({className:e,...a},t)=>r.jsx(D.ScrollDownButton,{ref:t,className:ve("flex cursor-default items-center justify-center py-1",e),...a,children:r.jsx(i.ChevronDown,{className:"h-4 w-4"})}));fa.displayName=D.ScrollDownButton.displayName;const ga=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:ve("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(pa,{}),r.jsx(D.Viewport,{className:ve("p-1","popper"===t&&"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]"),children:a}),r.jsx(fa,{})]})}));ga.displayName=D.Content.displayName;k.forwardRef(({className:e,...a},t)=>r.jsx(D.Label,{ref:t,className:ve("py-1.5 pl-8 pr-2 text-sm font-semibold",e),...a})).displayName=D.Label.displayName;const xa=k.forwardRef(({className:e,children:a,...t},s)=>{const{showCheck:n}=k.useContext(ca);return r.jsxs(D.Item,{ref:s,className:ve("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})]})});xa.displayName=D.Item.displayName;k.forwardRef(({className:e,...a},t)=>r.jsx(D.Separator,{ref:t,className:ve("-mx-1 my-1 h-px bg-muted",e),...a})).displayName=D.Separator.displayName;const ya=x.z.object({id_leader:x.z.string().nullable(),id_users:x.z.array(x.z.string()).min(1,e.t("leadership_select_subordinates"))}),va=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}=ce(),[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(da,{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(_e,{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(oa,{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 ba({leader:t,prefilledLeaderId:s,onSuccess:n}){const{t:l}=o.useTranslation(),{alias:d}=de(),c=!!t,u=t?.id.startsWith("virtual-"),m=pe(),h=he(),p=fe(),f=xe(),g=ge(),{data:x=[]}=ue(),{data:v=[]}=ce(),[w,b]=a.useState(""),_=R(x).map(e=>e.id_user),N=c?R(x).filter(e=>e.id_leader===t.id_user).map(e=>e.id_user):[],k=y.useForm({resolver:sa(c?va:ya),defaultValues:{id_leader:s||(c?t?.id_leader:null)||null,id_users:c?N:[]}});a.useEffect(()=>{if(t){const e=R(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(oa,{children:e.t("leader")}),r.jsx(da,{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(oa,{children:l("leadership_immediate_superior")}),r.jsxs(ua,{value:S||"none",onValueChange:e=>k.setValue("id_leader","none"===e?null:e),children:[r.jsx(ha,{children:r.jsx(ma,{placeholder:"Selecione..."})}),r.jsxs(ga,{children:[r.jsx("div",{className:"sticky top-0 z-10 bg-background p-2 border-b",children:r.jsx(da,{placeholder:"Buscar superior...",value:w,onChange:e=>b(e.target.value),onKeyDown:e=>e.stopPropagation(),onClick:e=>e.stopPropagation(),className:"h-8"})}),r.jsxs(ia,{className:"h-[200px]",children:[r.jsx(xa,{value:"none",children:"[Nenhum]"}),v.filter(e=>{const a=c?e.userId!==t.id_user:!C.includes(e.userId),r=!w||e.userName?.toLowerCase().includes(w.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(xa,{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(oa,{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(be,{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(qe,{children:[r.jsx(Oe,{asChild:!0,children:r.jsx(be,{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(Be,{children:[r.jsxs($e,{children:[r.jsx(He,{children:l("confirm_removal")}),r.jsx(We,{children:"Tem certeza que deseja remover este líder? Esta ação não pode ser desfeita."})]}),r.jsxs(Fe,{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 _a({open:e,onOpenChange:a,leader:t,prefilledLeaderId:s,title:n}){return r.jsx(Ke,{open:e,onOpenChange:a,children:r.jsxs(Ze,{variant:"form",className:"sm:max-w-[500px]",children:[r.jsx(ea,{showSeparator:!0,children:r.jsx(ta,{children:n})}),r.jsx(aa,{children:r.jsx(ba,{leader:t,prefilledLeaderId:s,onSuccess:()=>a(!1)})})]})})}const Na="leadership-expanded-nodes",ka=(e,a)=>{try{localStorage.setItem(`${Na}-${e}`,JSON.stringify(Array.from(a)))}catch{}};exports.LeadershipDialog=_a,exports.LeadershipForm=ba,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}=de(),{data:m,isLoading:h,error:p,refetch:f}=ue(),g=fe(),x=he(),[y,v]=a.useState(()=>u?(e=>{try{const a=localStorage.getItem(`${Na}-${e}`);if(a)return new Set(JSON.parse(a))}catch{}return new Set})(u):new Set),[w,b]=a.useState([]),[_,N]=a.useState(new Set),[k,j]=a.useState(!0),[S,C]=a.useState(!1),[E,A]=a.useState(),[I,T]=a.useState(null),D=a.useMemo(()=>m?R(m):[],[m]),U=a.useMemo(()=>D.map(e=>e.id),[D]),P=U.length>0&&w.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(`${Na}-${u}`)){const e=m.map(e=>e.id),a=new Set(e);v(a),ka(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&&ka(u,t),t})},[u]),q=a.useCallback(()=>{if(L){const e=new Set;v(e),u&&ka(u,e)}else{const e=new Set(D.filter(e=>e.children.length>0).map(e=>e.id));v(e),u&&ka(u,e)}},[L,D,u]),O=a.useCallback(e=>{b(a=>a.includes(e)?a.filter(a=>a!==e):[...a,e])},[]),z=a.useCallback(()=>{b(P?[]:U)},[P,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)),b([]))},[o,$]),H=a.useCallback(e=>{A(e),T(null),C(!0)},[]),W=a.useCallback(()=>{A(void 0),T(null),C(!0)},[]),Q=a.useCallback(()=>{C(!1),A(void 0),T(null)},[]),J=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"},[_]),K=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??K;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(be,{onClick:()=>f(),children:e.t("try_again")})]})});const G=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(be,{size:"sm",onClick:W,children:[r.jsx(i.Plus,{className:"h-4 w-4 mr-2"}),"Definir Líder"]}),r.jsx(be,{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:[G," usuário",1!==G?"s":""," associado",1!==G?"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(Le,{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:w,onSelectItem:O,onSelectAll:z,isAllSelected:P,onMoveNode:$,onMoveNodes:F,rootDropLabel:c,emptyMessage:e.t("leadership_no_hierarchy"),renderActions:e=>r.jsx(be,{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=>J(e.id,a),onDragEnd:e=>{e.currentTarget.style.opacity="1"},className:ve("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(_e,{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: ",G]}),t.length>0&&r.jsxs("span",{children:["Usuários não associados: ",t.length]})]}),r.jsx(_a,{open:S,onOpenChange:Q,leader:E,prefilledLeaderId:I,title:E?e.t("edit_name"):I?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=R,exports.useCreateMultipleLeadersMutation=pe,exports.useCreateSingleLeaderMutation=he,exports.useLeadershipApi=ue,exports.useRemoveLeaderMutation=ge,exports.useSyncSubordinatesMutation=xe,exports.useUpdateLeaderMutation=fe;
|
|
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;
|
|
@@ -1,12 +1,27 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Detecção de ambiente prod/dev.
|
|
3
|
+
*
|
|
4
|
+
* Fonte de verdade ÚNICA: `VITE_APP_ENV` (`"PROD"` | `"DEV"`).
|
|
5
|
+
* - `"DEV"` → API/OAuth/Supabase de dev.
|
|
6
|
+
* - `"PROD"` ou ausente / qualquer outro valor → PROD (failsafe).
|
|
7
|
+
*
|
|
8
|
+
* Não há fallback baseado em env vars Supabase: apps sem Supabase precisam
|
|
9
|
+
* configurar `VITE_APP_ENV="DEV"` explicitamente quando quiserem apontar para dev.
|
|
10
|
+
*
|
|
11
|
+
* **Storage de assets (logos/favicon) é sempre prod** — bucket público fixo.
|
|
12
|
+
*/
|
|
13
|
+
export type AppEnv = 'PROD' | 'DEV';
|
|
2
14
|
export interface EnvironmentConfig {
|
|
3
15
|
storageProjectId: string;
|
|
16
|
+
supabaseProjectId: string;
|
|
17
|
+
supabaseUrl: string;
|
|
18
|
+
supabasePublishableKey: string;
|
|
4
19
|
oauth: {
|
|
5
20
|
authUrl: string;
|
|
6
21
|
clientId: string;
|
|
7
22
|
};
|
|
8
23
|
qualiexApiUrl: string;
|
|
9
24
|
}
|
|
25
|
+
export declare function getAppEnv(): AppEnv;
|
|
10
26
|
export declare function getEnvironmentConfig(): EnvironmentConfig;
|
|
11
|
-
export declare function
|
|
12
|
-
export { PROD_PROJECT_ID };
|
|
27
|
+
export declare function isDevEnv(): boolean;
|