PageSourceSearch

https://faf.co.ao/assets/AdminFacil-BaEu_cqk.js

js faf.co.ao collected 2026-10-02 19:09:52 UTC 14,090 bytes, 1 lines download raw bytes

1import{s as R,r as b,b as w,t as f,j as e,L as G}from"./vendor-react-core-_0sZDOLQ.js";import{f as g,c as H,B as j,b as p}from"./index-j07E1qHv.js";import{C as l,a as d,b as y,c as v}from"./card-DHmBnTdH.js";import{I as m}from"./input-rti45mgP.js";import{L as o}from"./label-7HT5__eZ.js";import{S as F,a as z,b as K,c as M,d as i}from"./select-DHshRvNJ.js";import{T as U}from"./textarea-CHKzP3UK.js";import{T as X,a as J,b as N,c as k}from"./tabs-BUF6w8PE.js";import{B as W}from"./badge-BXqwvh8U.js";import{t as n}from"./index-CDqomOa1.js";import{B,_ as Y,ab as Z,ac as ee,W as ae,x as se,S as re}from"./vendor-lucide-Ddz0eB7N.js";import"./vendor-radix-CFmJ1img.js";import"./vendor-utils-BRu4i-LD.js";import"./vendor-supabase-Ca6cp8v2.js";import"./vendor-framer-motion-C1oRD-X5.js";const te=[{id:"mock-camisola-palancas-2026",name:"Camisola Palancas Negras 2026 - Vermelha",description:"Camisola mock oficial para testes da loja, inspirada nas cores de Angola e preparada para simular compras dos adeptos.",price:32500,category:"camisolas",image_url:g.cafCeremony,stock:48,stock_quantity:48,sizes:["S","M","L","XL","XXL"],active:!0,featured:!0},{id:"mock-cachecol-angola-futebol",name:"Cachecol Angola Futebol - Vermelho e Preto",description:"Cachecol de adepto para jogos da seleção, Girabola e competições nacionais.",price:8500,category:"acessorios",image_url:g.cafCrowd,stock:120,stock_quantity:120,sizes:["Único"],active:!0},{id:"mock-bola-futibool-angola",name:"Bola de Treino Futibool Angola",description:"Bola mock para treinos de formação, escolas de futebol e academias angolanas.",price:18500,category:"equipamento",image_url:g.pitch,stock:64,stock_quantity:64,sizes:["5"],active:!0},{id:"mock-bone-palancas-luanda",name:"Boné Palancas Negras - Luanda Edition",description:"Boné de adepto para deslocações, treinos e dias de jogo em Angola.",price:11e3,category:"acessorios",image_url:g.players.gelsonDala,stock:75,stock_quantity:75,sizes:["Único"],active:!0},{id:"mock-kit-infantil-angola-sub17",name:"Kit Infantil Angola Sub-17",description:"Produto mock para testar compras familiares e campanhas de futebol jovem.",price:24500,category:"camisolas",image_url:g.players.kelianoManuel,stock:36,stock_quantity:36,sizes:["6","8","10","12","14"],active:!0},{id:"mock-saco-desportivo-girabola",name:"Saco Desportivo Girabola",description:"Saco mock para atletas, staff e adeptos dos clubes angolanos.",price:27500,category:"equipamento",image_url:g.cafStage,stock:28,stock_quantity:28,sizes:["Único"],active:!0}],ie=[{order_number:"FAF-MOCK-LDA-001",customer_name:"Mateus Kiala",customer_email:"[email protected]",customer_phone:"+244 923 456 789",total_amount:41e3,status:"paid",payment_method:"multicaixa",payment_reference:"908 321 445",shipping_address:{street:"Rua Rainha Ginga",city:"Luanda",province:"Luanda",postal_code:"1000"},items:[{product_name:"Camisola Palancas Negras 2026 - Vermelha",quantity:1,size:"L",price:32500},{product_name:"Cachecol Angola Futebol - Vermelho e Preto",quantity:1,size:"Único",price:8500}],notes:"Compra mock para simular venda paga em Luanda."},{order_number:"FAF-MOCK-HLA-002",customer_name:"Carla Ndala",customer_email:"[email protected]",customer_phone:"+244 934 111 222",total_amount:18500,status:"pending",payment_method:"multicaixa",payment_reference:"908 654 118",shipping_address:{street:"Avenida 11 de Novembro",city:"Lubango",province:"Huíla",postal_code:""},items:[{product_name:"Bola de Treino Futibool Angola",quantity:1,size:"5",price:18500}],notes:"Compra mock pendente para testar fluxo Multicaixa."}],D={name:"",position:"Avançado",current_club:"Petro de Luanda",jersey_number:"",team_type:"principal",nationality:"Angola",status:"active",photo_url:""},V={name:"",description:"",price:"",category:"camisolas",stock:"",image_url:"",sizes:"S, M, L, XL",active:!0},oe=[{key:"updateMatchResults",label:"Atualizar resultados",payload:{}},{key:"fetchTransfermarktPlayers",label:"Importar jogadores",payload:{}},{key:"generateHistoricalMatches",label:"Histórico de jogos",payload:{years:5}},{key:"autoPopulateSystem",label:"Auto popular sistema",payload:{}}];function Ne(){const x=R(),[t,h]=b.useState(D),[s,u]=b.useState(V),[E,T]=b.useState(""),{data:_}=w({queryKey:["current-user"],queryFn:()=>p.auth.me()}),{data:C=[]}=w({queryKey:["admin-products"],queryFn:()=>p.entities.Product.list("-created_at"),initialData:[]}),{data:P=[]}=w({queryKey:["admin-orders"],queryFn:()=>p.entities.Order.list("-created_at"),initialData:[]}),I=b.useMemo(()=>C.filter(a=>a.active!==!1),[C]),A=f({mutationFn:a=>p.entities.Player.create(a),onSuccess:()=>{x.invalidateQueries({queryKey:["admin-players"]}),x.invalidateQueries({queryKey:["admin-players-count"]}),n.success("Jogador carregado com sucesso"),h(D)},onError:a=>n.error(`Erro ao carregar jogador: ${a.message}`)}),S=f({mutationFn:a=>p.entities.Product.create(a),onSuccess:()=>{x.invalidateQueries({queryKey:["admin-products"]}),x.invalidateQueries({queryKey:["products"]}),n.success("Produto carregado com sucesso"),u(V)},onError:a=>n.error(`Erro ao carregar produto: ${a.message}`)}),q=f({mutationFn:async()=>{const a=new Set(C.map(r=>r.name)),c=te.filter(r=>!a.has(r.name));for(const r of c)await p.entities.Product.create(r);return c.length},onSuccess:a=>{x.invalidateQueries({queryKey:["admin-products"]}),x.invalidateQueries({queryKey:["products"]}),n.success(a?`${a} produtos mock criados`:"Produtos mock já existem")},onError:a=>n.error(`Erro ao criar mocks: ${a.message}`)}),L=f({mutationFn:async()=>{const a=new Set(P.map(r=>r.order_number)),c=ie.filter(r=>!a.has(r.order_number));for(const r of c)await p.entities.Order.create(r);return c.length},onSuccess:a=>{x.invalidateQueries({queryKey:["admin-orders"]}),n.success(a?`${a} encomendas mock criadas`:"Encomendas mock já existem")},onError:a=>n.error(`Erro ao simular vendas: ${a.message}`)}),O=a=>{a.preventDefault(),A.mutate({...t,jersey_number:t.jersey_number?Number(t.
1jersey_number):null})},Q=a=>{a.preventDefault(),S.mutate({...s,price:Number(s.price),stock:Number(s.stock),stock_quantity:Number(s.stock),sizes:s.sizes.split(",").map(c=>c.trim()).filter(Boolean)})},$=async a=>{var c;T(a.key);try{const r=await p.functions.invoke(a.key,a.payload);n.success(((c=r==null?void 0:r.data)==null?void 0:c.message)||`${a.label} concluído`)}catch(r){n.error(`${a.label}: ${r.message}`)}finally{T("")}};return(_==null?void 0:_.role)!=="admin"?e.jsx("main",{className:"min-h-screen bg-gray-50 flex items-center justify-center px-4",children:e.jsx(l,{className:"max-w-md w-full",children:e.jsxs(d,{className:"p-8 text-center",children:[e.jsx(B,{className:"w-14 h-14 text-red-600 mx-auto mb-4"}),e.jsx("h1",{className:"text-2xl font-bold text-gray-900",children:"Acesso negado"}),e.jsx("p",{className:"text-gray-600 mt-2",children:"Apenas administradores podem aceder a esta área."})]})})}):e.jsx("main",{className:"min-h-screen bg-gray-50 py-10",children:e.jsxs("div",{className:"container mx-auto px-4",children:[e.jsx(G,{to:H("Admin"),children:e.jsxs(j,{variant:"ghost",className:"mb-6",children:[e.jsx(Y,{className:"w-4 h-4 mr-2"}),"Voltar ao Dashboard"]})}),e.jsxs("div",{className:"mb-8",children:[e.jsx(W,{className:"bg-red-600 mb-3",children:"Admin Fácil"}),e.jsx("h1",{className:"text-3xl md:text-4xl font-bold text-gray-900",children:"Carregamento rápido Futibool"}),e.jsx("p",{className:"text-gray-600 mt-2 max-w-3xl",children:"Área simplificada para criar jogadores, produtos de loja, dados mock de Angola e acionar automações de IA."})]}),e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-4 mb-8",children:[e.jsx(l,{children:e.jsxs(d,{className:"p-5",children:[e.jsx("p",{className:"text-sm text-gray-600",children:"Produtos ativos"}),e.jsx("p",{className:"text-3xl font-bold text-gray-900",children:I.length})]})}),e.jsx(l,{children:e.jsxs(d,{className:"p-5",children:[e.jsx("p",{className:"text-sm text-gray-600",children:"Encomendas"}),e.jsx("p",{className:"text-3xl font-bold text-gray-900",children:P.length})]})}),e.jsx(l,{children:e.jsxs(d,{className:"p-5",children:[e.jsx("p",{className:"text-sm text-gray-600",children:"Receita simulada"}),e.jsxs("p",{className:"text-3xl font-bold text-green-700",children:[P.reduce((a,c)=>a+Number(c.total_amount||0),0).toLocaleString("pt-AO")," Kz"]})]})})]}),e.jsxs(X,{defaultValue:"players",className:"space-y-6",children:[e.jsxs(J,{className:"grid w-full grid-cols-4",children:[e.jsx(N,{value:"players",children:"Jogadores"}),e.jsx(N,{value:"products",children:"Produtos"}),e.jsx(N,{value:"mocks",children:"Mocks"}),e.jsx(N,{value:"ai",children:"IA"})]}),e.jsx(k,{value:"players",children:e.jsxs(l,{children:[e.jsx(y,{children:e.jsxs(v,{className:"flex items-center gap-2",children:[e.jsx(Z,{className:"w-5 h-5 text-red-600"}),"Carregar jogador"]})}),e.jsx(d,{children:e.jsxs("form",{onSubmit:O,className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[e.jsxs("div",{className:"md:col-span-2",children:[e.jsx(o,{children:"Nome completo"}),e.jsx(m,{value:t.name,onChange:a=>h({...t,name:a.target.value}),required:!0})]}),e.jsxs("div",{children:[e.jsx(o,{children:"Posição"}),e.jsxs(F,{value:t.position,onValueChange:a=>h({...t,position:a}),children:[e.jsx(z,{children:e.jsx(K,{})}),e.jsxs(M,{children:[e.jsx(i,{value:"Guarda-redes",children:"Guarda-redes"}),e.jsx(i,{value:"Defesa",children:"Defesa"}),e.jsx(i,{value:"Médio",children:"Médio"}),e.jsx(i,{value:"Avançado",children:"Avançado"})]})]})]}),e.jsxs("div",{children:[e.jsx(o,{children:"Clube atual"}),e.jsx(m,{value:t.current_club,onChange:a=>h({...t,current_club:a.target.value})})]}),e.jsxs("div",{children:[e.jsx(o,{children:"Número"}),e.jsx(m,{type:"number",value:t.jersey_number,onChange:a=>h({...t,jersey_number:a.target.value})})]}),e.jsxs("div",{children:[e.jsx(o,{children:"Seleção"}),e.jsxs(F,{value:t.team_type,onValueChange:a=>h({...t,team_type:a}),children:[e.jsx(z,{children:e.jsx(K,{})}),e.jsxs(M,{children:[e.jsx(i,{value:"principal",children:"Principal"}),e.jsx(i,{value:"sub23",children:"Sub-23"}),e.jsx(i,{value:"sub20",children:"Sub-20"}
1),e.jsx(i,{value:"sub17",children:"Sub-17"}),e.jsx(i,{value:"feminina",children:"Feminina"}),e.jsx(i,{value:"futsal_masculino",children:"Futsal Masculino"}),e.jsx(i,{value:"praia_masculino",children:"Praia Masculino"})]})]})]}),e.jsxs("div",{className:"md:col-span-2",children:[e.jsx(o,{children:"URL da foto"}),e.jsx(m,{value:t.photo_url,onChange:a=>h({...t,photo_url:a.target.value})})]}),e.jsx(j,{type:"submit",disabled:A.isPending,className:"md:col-span-2 bg-red-600 hover:bg-red-700",children:A.isPending?"A guardar...":"Guardar jogador"})]})})]})}),e.jsx(k,{value:"products",children:e.jsxs(l,{children:[e.jsx(y,{children:e.jsxs(v,{className:"flex items-center gap-2",children:[e.jsx(ee,{className:"w-5 h-5 text-red-600"}),"Carregar produto da loja"]})}),e.jsx(d,{children:e.jsxs("form",{onSubmit:Q,className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[e.jsxs("div",{className:"md:col-span-2",children:[e.jsx(o,{children:"Nome do produto"}),e.jsx(m,{value:s.name,onChange:a=>u({...s,name:a.target.value}),required:!0})]}),e.jsxs("div",{children:[e.jsx(o,{children:"Preço Kz"}),e.jsx(m,{type:"number",value:s.price,onChange:a=>u({...s,price:a.target.value}),required:!0})]}),e.jsxs("div",{children:[e.jsx(o,{children:"Stock"}),e.jsx(m,{type:"number",value:s.stock,onChange:a=>u({...s,stock:a.target.value}),required:!0})]}),e.jsxs("div",{children:[e.jsx(o,{children:"Categoria"}),e.jsxs(F,{value:s.category,onValueChange:a=>u({...s,category:a}),children:[e.jsx(z,{children:e.jsx(K,{})}),e.jsxs(M,{children:[e.jsx(i,{value:"camisolas",children:"Camisolas"}),e.jsx(i,{value:"equipamento",children:"Equipamento"}),e.jsx(i,{value:"acessorios",children:"Acessórios"}),e.jsx(i,{value:"outros",children:"Outros"})]})]})]}),e.jsxs("div",{children:[e.jsx(o,{children:"Tamanhos"}),e.jsx(m,{value:s.sizes,onChange:a=>u({...s,sizes:a.target.value})})]}),e.jsxs("div",{className:"md:col-span-2",children:[e.jsx(o,{children:"URL da imagem"}),e.jsx(m,{value:s.image_url,onChange:a=>u({...s,image_url:a.target.value})})]}),e.jsxs("div",{className:"md:col-span-2",children:[e.jsx(o,{children:"Descrição"}),e.jsx(U,{value:s.description,onChange:a=>u({...s,description:a.target.value}),rows:3})]}),e.jsx(j,{type:"submit",disabled:S.isPending,className:"md:col-span-2 bg-red-600 hover:bg-red-700",children:S.isPending?"A guardar...":"Guardar produto"})]})})]})}),e.jsx(k,{value:"mocks",children:e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-6",children:[e.jsxs(l,{children:[e.jsx(y,{children:e.jsxs(v,{className:"flex items-center gap-2",children:[e.jsx(ae,{className:"w-5 h-5 text-red-600"}),"Produtos mock Angola"]})}),e.jsxs(d,{className:"space-y-4",children:[e.jsx("p",{className:"text-gray-600",children:"Cria camisolas, cachecóis, bolas, bonés e kits infantis vinculados a Angola, futebol e desporto."}),e.jsx(j,{onClick:()=>q.mutate(),disabled:q.isPending,className:"bg-red-600 hover:bg-red-700",children:q.isPending?"A criar...":"Criar produtos mock"})]})]}),e.jsxs(l,{children:[e.jsx(y,{children:e.jsxs(v,{className:"flex items-center gap-2",children:[e.jsx(se,{className:"w-5 h-5 text-red-600"}),"Vendas mock"]})}),e.jsxs(d,{className:"space-y-4",children:[e.jsx("p",{className:"text-gray-600",children:"Cria encomendas de teste com clientes de Luanda e Huíla para validar vendas, valores e estados."}),e.jsx(j,{onClick:()=>L.mutate(),disabled:L.isPending,className:"bg-green-700 hover:bg-green-800",children:L.isPending?"A simular...":"Simular vendas"})]})]})]})}),e.jsx(k,{value:"ai",children:e.jsxs(l,{children:[e.jsx(y,{children:e.jsxs(v,{className:"flex items-center gap-2",children:[e.jsx(re,{className:"w-5 h-5 text-red-600"}),"Atualizações IA"]})}),e.jsx(d,{children:e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:oe.map(a=>e.jsxs(j,{variant:"outline",onClick:()=>$(a),disabled:!!E,className:"h-14 justify-start",children:[e.jsx(B,{className:"w-4 h-4 mr-2"}),E===a.key?"A executar...":a.label]},a.key))})})]})})]})]})})}export{Ne as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.