1import{d as fe,b as n,w as $e,g as S,n as m,D as Y,v as r,i as s,f,t as u,l as p,ac as Ce,ad as _e,j as a,m as i,_ as x,x as V,a as M,u as Te,aU as Se,c as Ve,L as Me,K as je,e as De,C as Be,z as ie,Q as Pe,F as re,N as ue,s as Ae,R as de,h as ce,aA as me,p as ve,k as Ue}from"./index.16ba4ea0.js";import{_ as Ne}from"./Avatar.vue_vue_type_script_setup_true_lang.87e6bbe3.js";import{_ as qe}from"./Notfound.vue_vue_type_script_setup_true_lang.b9e0406b.js";import{_ as Ie}from"./Pagination.vue_vue_type_script_setup_true_lang.8b7ec3c5.js";import{_ as Fe}from"./TaxonomyMergeModal.vue_vue_type_script_setup_true_lang.d9b24f76.js";import"./vendor-highcharts.9b480a8e.js";import"https://cdn.jsdelivr.net/npm/[email protected]/dist/buttplug-wasm.mjs";const Le={class:"space-y-4 text-white"},Oe={key:0,class:"rounded-lg border border-red-500/40 bg-red-950/30 p-3.5 space-y-1"},Re={class:"text-xs uppercase tracking-wider font-semibold text-red-400"},Ee={class:"text-base font-bold text-white flex items-center gap-2"},Ge={key:0,class:"text-xs font-mono text-zinc-400"},He={class:"text-xs text-zinc-400 mt-1"},Qe={key:1,class:"rounded-md border border-red-500/50 bg-red-950/30 px-3 py-2 text-sm text-red-200"},Je={key:2,class:"rounded-md border border-green-500/50 bg-green-950/30 px-3 py-2 text-sm text-green-200"},Ke={class:"flex gap-3 pt-2"},We=fe({__name:"TaxonomyBlacklistModal",props:{open:{type:Boolean},kind:{},item:{}},emits:["update:open","success"],setup(y,{emit:R}){const w=y,d=R,z=n("ToS violation"),k=n(!1),g=n(""),b=n("");$e(()=>w.open,v=>{v&&(z.value="ToS violation",g.value="",b.value="")});const $=async()=>{if(!!w.item){if(!z.value.trim()){g.value="Reason for blacklisting is required.";return}k.value=!0,g.value="",b.value="";try{const v=w.item.slug||w.item.name||"",o=w.item.name||w.item.content_preview||v;await M.taxonomy.createTaxonomyBlacklist({kind:w.kind,slug:v,name:o,reason:z.value.trim()}),b.value=`Successfully blacklisted "${o}"!`,d("success",w.item),setTimeout(()=>{d("update:open",!1)},1e3)}catch(v){g.value=(v==null?void 0:v.message)||String(v)}finally{k.value=!1}}};return(v,o)=>(r(),S(Y,{"model-value":y.open,"onUpdate:modelValue":o[2]||(o[2]=h=>v.$emit("update:open",h)),title:"Add to Taxonomy Blacklist"},{default:m(()=>[s("div",Le,[y.item?(r(),f("div",Oe,[s("div",Re," Target "+u(y.kind==="tag"?"Tag":"Performer"),1),s("div",Ee,[s("span",null,u(y.item.name||y.item.content_preview),1),y.item.slug?(r(),f("span",Ge,"("+u(y.item.slug)+")",1)):p("",!0)])])):p("",!0),s("div",null,[o[4]||(o[4]=s("label",{class:"block text-sm font-medium text-white mb-1"},"Reason for Blacklisting *",-1)),Ce(s("select",{"onUpdate:modelValue":o[0]||(o[0]=h=>z.value=h),class:"w-full bg-zinc-800 border border-zinc-700 text-white rounded px-3 py-2 text-sm focus:outline-none focus:border-blue-500",required:""},[...o[3]||(o[3]=[s("option",{value:"ToS violation"},"ToS violation",-1),s("option",{value:"Google notice"},"Google notice",-1)])],512),[[_e,z.value]]),s("p",He," Blacklisting will remove this "+u(y.kind)+" from all videos, delete its record, and enforce a 410 Gone status to prevent recreation. ",1)]),g.value?(r(),f("div",Qe,u(g.value),1)):p("",!0),b.value?(r(),f("div",Je,u(b.value),1)):p("",!0),s("div",Ke,[a(x,{class:"flex-1",dense:"",onClick:o[1]||(o[1]=h=>v.$emit("update:open",!1))},{default:m(()=>[...o[5]||(o[5]=[i(" Cancel ",-1)])]),_:1}),a(x,{class:"flex-1 flex items-center justify-center gap-1.5",dense:"",theme:"red",loading:k.value,onClick:$},{default:m(()=>[a(V,{name:"block",class:"h-4 w-4"}),o[6]||(o[6]=i(" Confirm Blacklist ",-1))]),_:1},8,["loading"])])])]),_:1},8,["model-value"]))}}),Xe={class:"mx-auto max-w-4xl px-4 py-6"},Ye={class:"mb-6 flex flex-col sm:flex-row items-stretch sm:items-center gap-3 bg-zinc-900/60 p-2 rounded-lg border border-zinc-700/80"},Ze={class:"flex items-center gap-2 shrink-0 w-full sm:w-auto justify-between sm:justify-start"},et={class:"relative flex-1 sm:flex-none"},tt={key:0,class:"mb-6 p-4 rounded-lg bg-green-900/40 border border-green-500/40 text-green-300 flex items-center justify-between text-sm"},st={key:1,class:"py-16 flex justify-center items-center"},lt={key:2,class:"bg-zinc-900 rounded-lg divide-y divide-zinc-800 border border-zinc-800 shadow-xl"},at={class:"space-y-1 min-w-0 flex-1"},nt={class:"flex items-center gap-2"},ot=["href"],it={class:"text-xs text-zinc-400 flex flex-wrap items-center gap-3"},rt={class:"text-zinc-300"},ut={class:"text-zinc-300"},dt={class:"text-zinc-300"},ct={class:"flex flex-wrap items-center justify-end gap-2 sm:gap-3 shrink-0 self-end sm:self-ce
1nter w-full sm:w-auto"},mt={class:"text-xs text-zinc-400 flex items-center gap-2 mr-2"},vt={class:"text-white font-bold"},ft={key:3,class:"bg-zinc-900 rounded-lg divide-y divide-zinc-800 border border-zinc-800 shadow-xl"},xt={class:"space-y-1 min-w-0 flex-1"},pt={class:"flex items-center gap-2"},gt=["href"],bt={class:"text-xs text-zinc-400 flex flex-wrap items-center gap-3"},yt={class:"text-zinc-300"},wt={class:"text-zinc-300"},kt={class:"text-zinc-300"},ht={class:"flex flex-wrap items-center justify-end gap-2 sm:gap-3 shrink-0 self-end sm:self-center w-full sm:w-auto"},zt={class:"text-xs text-zinc-400 flex items-center gap-2 mr-2"},$t={class:"text-white font-bold"},Ct={key:4,class:"mt-12"},_t={key:0,class:"text-xs text-zinc-400 mt-1 font-mono"},Tt={key:0,class:"text-sm text-red-400"},St={class:"flex justify-end gap-3 pt-2"},Vt={class:"space-y-4"},Mt={class:"text-sm text-zinc-300"},jt={key:0,class:"text-sm text-red-400"},Dt={class:"flex justify-end gap-3 pt-2"},O=20,Ft=fe({__name:"TaxonomyManager",setup(y){const{isAdmin:R}=Te(),w=Ae();R||w.push("/");const d=n("tags"),z=n(),k=n(!1),g=n(!1);n(!1);const b=n(""),$=n(1),v=n(0),o=n(null);let h=null;const F=l=>{h&&clearTimeout(h),o.value=l,h=setTimeout(()=>{o.value=null},3e3)},E=()=>{h&&clearTimeout(h),o.value=null},L=n([]),B=n([]),P=n(!1),j=n(""),G=n(!1),D=n(""),Z=l=>l.toLowerCase().trim().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,""),xe=()=>{j.value="",D.value="",P.value=!0},pe=async()=>{const l=j.value.trim();if(!l){D.value="Name is required.";return}G.value=!0,D.value="";try{const e=Z(l);d.value==="tags"?await M.tags.createTag({name:l,slug:e,description:""}):await M.performers.createPerformer(l,e,!0,"",""),F(`${d.value==="tags"?"Tag":"Performer"} "${l}" created successfully.`),P.value=!1,C()}catch(e){D.value=typeof e=="string"?e:(e==null?void 0:e.message)||"Create failed"}finally{G.value=!1}},H=n(!1),ee=n(null),Q=n(!1),te=n(null),ge=n("ToS violation"),se=l=>{E(),d.value=l,localStorage.setItem("taxonomy_mode",l),b.value="",$.value=1,C()},be=()=>{E(),$.value=1};Se(b,l=>{const e=l.trim();(e.length===0||e.length>=3)&&($.value=1,C())},{debounce:300});const C=async()=>{var l,e,q,t,_;!L.value.length&&!B.value.length&&(g.value=!0);try{const I=(l=b.value)==null?void 0:l.trim(),oe=I&&I.length>=3?I:void 0;if(d.value==="tags"){const c=await M.tags.getPendingTags({page:$.value,limit:O,status:"all",query:oe}),T=Array.isArray(c)?c:(c==null?void 0:c.tags)||((e=c==null?void 0:c.data)==null?void 0:e.tags)||(c==null?void 0:c.data)||[];T.sort((W,X)=>(X.videos||0)-(W.videos||0)),L.value=T,v.value=(q=c==null?void 0:c.total)!=null?q:T.length}else{const c=await M.performers.getPerformers({query:oe,page:$.value,limit:O,status:!0,contextPage:"manage"}),T=c.performers||((t=c.data)==null?void 0:t.performers)||c.data||(Array.isArray(c)?c:[]);T.sort((W,X)=>(X.videos||0)-(W.videos||0)),B.value=T,v.value=(_=c.total)!=null?_:T.length}}catch(I){console.error("Failed to fetch taxonomy items:",I)}finally{g.value=!1}},J=(l=null)=>{ee.value=l,H.value=!0},ye=l=>{F(`${l.sources.length} item(s) merged into "${l.target.name}".`),C()},le=l=>{te.value=l,ge.value="ToS violation",Q.value=!0},we=l=>{const e=d.value==="tags"?"Tag":"Performer";F(`${e} "${l.name}" has been blacklisted and is no longer accessible.`),C()},A=n(!1),U=n(null),K=n(!1),N=n(""),ae=l=>{U.value=l,N.value="",A.value=!0},ke=async()=>{if(!!U.value){K.value=!0,N.value="";try{if(d.value==="tags")await M.tags.deleteTag(U.value);else{const l=B.value.find(e=>e.id===U.value);await M.performers.updatePerformer(U.value,(l==null?void 0:l.name)||"",!1)}F(`${d.value==="tags"?"Tag":"Performer"} deleted successfully.`),A.value=!1,C()}catch(l){N.value=(l==null?void 0:l.message)||"Delete failed"}finally{K.value=!1}}},he=Ve(()=>Math.ceil(v.value/O)>1&&!g.value),ze=l=>{E(),$.value=l,C(),window.scrollTo({top:0,behavior:"smooth"})},ne=()=>{const l=localStorage.getItem("taxonomy_mode");(l==="tags"||l==="performers")&&(d.value=l),C()};return Me(()=>{ne()}),je(()=>{ne()}),De(Be("taxonomy-manager",{title:"Taxonomy Manager \u2013 FapTap",description:"Admin taxonomy normalization and entity merge tool"})),(l,e)=>{var q;return r(),f("div",Xe,[e[41]||(e[41]=s("div",{class:"text-center mb-6 relative"},[s("h1",{class:"text-3xl font-bold text-white"},"Taxonomy"),s("p",{class:"text-xs text-zinc-400 mt-1"},"Admin access only")],-1)),s("div",Ye,[a(ie,{autofocus:"",placeholder:"Search by name",type:"text",class:"flex-1 text-sm bg-zinc-800 border-zinc-700",modelValue:b.value,"onUpdate:modelValue":e[0]||(e[0]=t=>b.value=t),onInput:be},null,8,["modelValue"]),s("div",Ze,[a(x,{theme:"green",class:"px-3 py-2 text-sm font-medium flex items-center gap-1.5 flex-1 sm:flex-none justify-center",onClick:xe},{default:m(()=>[a(V,{name:"plus",class:"h-4 w-4"}),e[14]||(e[14]=i(" Create ",-1))]),_:1}),a(x,{theme:"blue",class:"px-3 py-2 text-sm font-medium flex items-center gap-1.5 flex-1 sm:flex-none justify-center",onClick:e[1]||(e[1]=t=>J(null))},{default:m(()=>[...e[15]||(e[15]=[i(" Merge ",-1)])]),_:1}),s("div",et,[a(x,{ref_key:"viewDropdownBtn",ref:z,theme:"transparent",class:"px-3 py-2 text-sm font-medium border border-zinc-700 text-zinc-300 hover:text-white flex items-center gap-1.5 justify-center w-full sm:w-auto",onClick:e[2]||(e[2]=t=>k.value=!k.value)},{default:m(()=>[s("span",null,u(d.value==="tags"?"Tags":"Performers"),1),a(V,{name:"chevron-down",class:"h-3 w-3 opacity-70 ml-0.5"})]),_:1},512),a(Pe,{modelValue:k.value,"onUpdate:modelValue":e[5]||(e[5]=t=>k.value=t),target:((q=z.value)==null?void 0:q.$el)||z.value,placement:"bottom-end",offset:8,class:"text-white text-sm py-1 w-32 bg-zinc-800 border border-zinc-700 shadow-xl rounded-md"},{default:m(()=>[a(de,{active:d.value==="tags",onClick:e[3]||(e[3]=t=>{se("tags"),k.value=!1})},{default:m(()=>[...e[16]||(e[16]=[s("span",null,"Tags",-1)])]),_:1},8,["active"]),a(de,{active:d.value==="performers",onClick:e[4]||(e[4]=t=>{se("performers"),k.value=!1})},{default:m(()=>[...e[17]||(e[17]=[s("span",null,"Performers",-1)])]),_:1},8,["active"])]),_:1},8,["modelValue","target"])])])]),o.value?(r(),f("div",tt,[s("span",null,u(o.value),1),s("button",{onClick:e[6]||(e[6]=t=>o.value=null),class:"text-green-300 hover:text-white"},[a(V,{name:"close",class:"h-4 w-4"})])])):p("",!0),g.value?(r(),f("div",st,[a(V,{name:"loading",class:"h-10 w-10 text-blue-500 animate-spin"})])):d.value==="tags"&&L.value.length?(r(),f("div",lt,[(r(!0),f(re,null,ue(L.value,t=>
1(r(),f("div",{key:t.id,class:"p-4 flex flex-col sm:flex-row items-start sm:items-center justify-between gap-4 hover:bg-zinc-850 transition-colors"},[s("div",at,[s("div",nt,[s("a",{href:`/t/${t.slug}`,target:"_blank",class:"text-white font-bold text-base hover:text-blue-400 inline-flex items-center gap-1"},[i(u(t.name)+" ",1),a(V,{name:"open-in-new",class:"h-3.5 w-3.5 text-zinc-400"})],8,ot)]),s("div",it,[s("span",null,[e[18]||(e[18]=i("Slug: ",-1)),s("strong",rt,u(t.slug),1)]),e[21]||(e[21]=s("span",null,"\u2022",-1)),s("span",null,[e[19]||(e[19]=i("Created by: ",-1)),s("strong",ut,u(t.CreatedBy||"Slibowitz"),1)]),e[22]||(e[22]=s("span",null,"\u2022",-1)),s("span",null,[e[20]||(e[20]=i("Created at: ",-1)),s("strong",dt,u(t.created_at?`${ce(me)(new Date(t.created_at))} ago`:"-"),1)])])]),s("div",ct,[s("div",mt,[s("span",null,[e[23]||(e[23]=i("Videos: ",-1)),s("strong",vt,u(t.videos||0),1)]),s("span",{class:ve(["px-2 py-0.5 rounded text-xs font-semibold uppercase tracking-wider border",t.status==="active"||t.status===!0||!t.status?"bg-emerald-500/20 text-emerald-400 border-emerald-500/30":t.status==="rejected"?"bg-red-500/20 text-red-400 border-red-500/30":t.status==="pending"||t.status==="awaiting_response"?"bg-amber-500/20 text-amber-400 border-amber-500/30":"bg-red-500/20 text-red-400 border-red-500/30"])},u(typeof t.status=="boolean"?t.status?"active":"inactive":t.status||"active"),3)]),(!t.videos||t.videos===0)&&t.status!=="rejected"?(r(),S(x,{key:0,theme:"transparent",size:"sm",class:"px-3 py-1.5 text-xs border border-zinc-700 text-zinc-300 hover:text-white",onClick:_=>ae(t.id)},{default:m(()=>[...e[24]||(e[24]=[i(" Delete ",-1)])]),_:1},8,["onClick"])):p("",!0),t.status!=="rejected"?(r(),S(x,{key:1,theme:"blue",size:"sm",class:"px-3 py-1.5 text-xs font-semibold",onClick:_=>le(t)},{default:m(()=>[...e[25]||(e[25]=[i(" Blacklist ",-1)])]),_:1},8,["onClick"])):p("",!0),t.status!=="rejected"?(r(),S(x,{key:2,theme:"transparent",size:"sm",class:"px-3 py-1.5 text-xs border border-zinc-700 text-zinc-300 hover:text-white",onClick:_=>J(t)},{default:m(()=>[...e[26]||(e[26]=[i(" Merge ",-1)])]),_:1},8,["onClick"])):p("",!0)])]))),128))])):d.value==="performers"&&B.value.length?(r(),f("div",ft,[(r(!0),f(re,null,ue(B.value,t=>(r(),f("div",{key:t.id,class:"p-4 flex flex-col sm:flex-row items-start sm:items-center justify-between gap-4 hover:bg-zinc-850 transition-colors"},[s("div",xt,[s("div",pt,[a(Ne,{icon:"performer-report",image:t.avatar_url,name:t.name,class:"w-6 h-6 rounded-full shrink-0"},null,8,["image","name"]),s("a",{href:`/p/${t.slug}`,target:"_blank",class:"text-white font-bold text-base hover:text-blue-400 inline-flex items-center gap-1"},[i(u(t.name)+" ",1),a(V,{name:"open-in-new",class:"h-3.5 w-3.5 text-zinc-400"})],8,gt)]),s("div",bt,[s("span",null,[e[27]||(e[27]=i("Slug: ",-1)),s("strong",yt,u(t.slug),1)]),e[30]||(e[30]=s("span",null,"\u2022",-1)),s("span",null,[e[28]||(e[28]=i("Created by: ",-1)),s("strong",wt,u(t.created_by||"Slibowitz"),1)]),e[31]||(e[31]=s("span",null,"\u2022",-1)),s("span",null,[e[29]||(e[29]=i("Created at: ",-1)),s("strong",kt,u(t.created_at?`${ce(me)(new Date(t.created_at))} ago`:"-"),1)])])]),s("div",ht,[s("div",zt,[s("span",null,[e[32]||(e[32]=i("Videos: ",-1)),s("strong",$t,u(t.videos||0),1)]),s("span",{class:ve(["px-2 py-0.5 rounded text-xs font-semibold uppercase tracking-wider border",t.status===!0||t.status==="active"?"bg-emerald-500/20 text-emerald-400 border-emerald-500/30":"bg-red-500/20 text-red-400 border-red-500/30"])},u(t.status===!0||t.status==="active"?"active":"inactive"),3)]),(!t.videos||t.videos===0)&&t.status!==!1&&t.status!=="inactive"&&t.status!=="rejected"?(r(),S(x,{key:0,theme:"transparent",size:"sm",class:"px-3 py-1.5 text-xs border border-zinc-700 text-zinc-300 hover:text-white",onClick:_=>ae(t.id)},{default:m(()=>[...e[33]||(e[33]=[i(" Delete ",-1)])]),_:1},8,["onClick"])):p("",!0),t.status!==!1&&t.status!=="inactive"&&t.status!=="rejected"?(r(),S(x,{key:1,theme:"blue",size:"sm",class:"px-3 py-1.5 text-xs font-semibold",onClick:_=>le(t)},{default:m(()=>[...e[34]||(e[34]=[i(" Blacklist ",-1)])]),_:1},8,["onClick"])):p("",!0),t.status!==!1&&t.status!=="inactive"&&t.status!=="rejected"?(r(),S(x,{key:2,theme:"transparent",size:"sm",class:"px-3 py-1.5 text-xs border border-zinc-700 text-zinc-300 hover:text-white",onClick:_=>J(t)},{default:m(()=>[...e[35]||(e[35]=[i(" Merge ",-1)])]),_:1},8,["onClick"])):p("",!0)])]))),128))])):g.value?p("",!0):(r(),f("div",Ct,[a(qe,{title:d.value==="tags"?"No Tags Found":"No Performers Found",message:"No items match your search query."},null,8,["title"])])),a(Ie,{currentPage:$.value,total:v.value,limit:O,show:he.value,"onUpdate:currentPage":ze},null,8,["currentPage","total","show"]),a(Y,{modelValue:P.value,"onUpdate:modelValue":e[9]||(e[9]=t=>P.value=t),title:`Create ${d.value==="tags"?"Tag":"Performer"}`},{default:m(()=>[s("form",{onSubmit:Ue(pe,["prevent"]),class:"space-y-4 text-white"},[s("div",null,[e[36]||(e[36]=s("label",{class:"block text-sm font-medium text-white mb-1"},"Name *",-1)),a(ie,{modelValue:j.value,"onUpdate:modelValue":e[7]||
1(e[7]=t=>j.value=t),placeholder:`e.g. ${d.value==="tags"?"Amateur":"John Doe"}`,required:""},null,8,["modelValue","placeholder"]),j.value?(r(),f("p",_t," Slug preview: "+u(Z(j.value)),1)):p("",!0)]),D.value?(r(),f("div",Tt,u(D.value),1)):p("",!0),s("div",St,[a(x,{type:"button",theme:"transparent",dense:"",onClick:e[8]||(e[8]=t=>P.value=!1)},{default:m(()=>[...e[37]||(e[37]=[i("Cancel",-1)])]),_:1}),a(x,{type:"submit",theme:"green",dense:"",loading:G.value},{default:m(()=>[...e[38]||(e[38]=[i("Create",-1)])]),_:1},8,["loading"])])],32)]),_:1},8,["modelValue","title"]),a(Fe,{open:H.value,"onUpdate:open":e[10]||(e[10]=t=>H.value=t),kind:d.value==="tags"?"tag":"performer",source:ee.value,onSuccess:ye},null,8,["open","kind","source"]),a(We,{open:Q.value,"onUpdate:open":e[11]||(e[11]=t=>Q.value=t),kind:d.value==="tags"?"tag":"performer",item:te.value,onSuccess:we},null,8,["open","kind","item"]),a(Y,{modelValue:A.value,"onUpdate:modelValue":e[13]||(e[13]=t=>A.value=t),title:"Confirm Deletion"},{default:m(()=>[s("div",Vt,[s("p",Mt," Are you sure you want to delete this "+u(d.value==="tags"?"tag":"performer")+"? ",1),N.value?(r(),f("div",jt,u(N.value),1)):p("",!0),s("div",Dt,[a(x,{theme:"transparent",dense:"",onClick:e[12]||(e[12]=t=>A.value=!1)},{default:m(()=>[...e[39]||(e[39]=[i("Cancel",-1)])]),_:1}),a(x,{theme:"red",dense:"",loading:K.value,onClick:ke},{default:m(()=>[...e[40]||(e[40]=[i("Delete",-1)])]),_:1},8,["loading"])])])]),_:1},8,["modelValue"])])}}});export{Ft 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.