PageSourceSearch

https://faptap.net/assets/ManageTags.8d79c89e.js

js faptap.net collected 2026-09-25 22:11:30 UTC 11,368 bytes, 1 lines download raw bytes

1import{d as Y,G as Z,u as ee,b as c,r as te,w as B,c as se,ag as ae,ah as le,L as ie,e as ne,C as oe,f as m,i as a,m as v,j as n,z as N,n as f,_ as w,g as F,O as de,h as ue,P as re,Q as ce,F as D,N as L,l as k,t as r,k as me,ac as ve,ad as fe,aT as pe,a as T,v as o,x as P,R as xe,p as U,aE as ge}from"./index.16ba4ea0.js";import{_ as we}from"./Notfound.vue_vue_type_script_setup_true_lang.b9e0406b.js";import{_ as _e}from"./ExtraInput.vue_vue_type_style_index_0_lang.6d02d9ec.js";import{_ as be}from"./Pagination.vue_vue_type_script_setup_true_lang.8b7ec3c5.js";import"./vendor-highcharts.9b480a8e.js";import"https://cdn.jsdelivr.net/npm/[email protected]/dist/buttplug-wasm.mjs";const he={class:"mx-auto max-w-4xl px-4 py-6"},ye={class:"mb-6"},ke={class:"flex flex-col sm:flex-row items-stretch sm:items-center gap-3"},Te={class:"flex items-center gap-2 shrink-0 w-full sm:w-auto justify-between sm:justify-start"},Ce={class:"relative flex-1 sm:flex-none"},ze={key:0,class:"py-12 flex justify-center items-center"},je={key:1,class:"bg-zinc-800 rounded-lg divide-y divide-zinc-700 shadow-lg"},Ve={class:"sm:col-span-4 space-y-1"},$e=["href"],Me={class:"text-xs text-zinc-500"},Fe={key:0,class:"text-xs text-zinc-500"},Pe={class:"font-semibold text-zinc-100"},Ae={class:"text-xs text-zinc-500"},Se={class:"sm:col-span-4 flex flex-col md:flex-row items-start md:items-center gap-2 text-sm text-zinc-400 mt-2 md:mt-0"},Ne={class:"font-semibold text-zinc-100"},De={class:"sm:col-span-4 flex flex-wrap items-center justify-start sm:justify-end gap-1.5 mt-2 sm:mt-0 w-full sm:w-auto"},Ue={key:2,class:"mt-12"},Be={key:0,class:"fixed inset-0 flex items-center justify-center z-50"},Le={class:"relative bg-zinc-900 p-6 md:p-8 rounded-lg shadow-lg overflow-y-auto max-h-[95vh] w-full max-w-md text-white"},Ee={class:"flex items-center justify-between mb-4"},Re={class:"text-xl md:text-2xl font-semibold text-center flex-1"},Ie={class:"flex justify-end"},qe={class:"flex flex-col md:flex-row md:items-start gap-2 md:gap-4"},He={class:"md:w-3/4 w-full"},Oe={class:"flex flex-col md:flex-row md:items-start gap-2 md:gap-4"},Qe={class:"md:w-3/4 w-full"},Ge={class:"flex flex-col md:flex-row md:items-center gap-2 md:gap-4"},Je={class:"md:w-3/4"},Ke={class:"flex flex-col md:flex-row md:items-center gap-2 md:gap-4"},We={class:"md:w-3/4"},Xe={class:"flex justify-end mt-6"},Ye={key:0,class:"text-sm text-center text-red-500 block mt-2 font-medium"},Ze={key:0,class:"mb-4 mt-4 px-4 py-2 rounded bg-green-600 text-white text-center animate-fade"},A=10,et=Y({__name:"ManageTags",setup(tt){const{isMobile:E}=Z(),{isAdmin:st,user:S}=ee(),i=c([]),C=c(!1),z=c(1),j=c(0),h=c(""),g=c(!1),$=c(!1),M=c(null),p=c(null),_=s=>{M.value=s},d=c({name:"",slug:"",status:"pending",description:""}),V=c(!1),u=te({status:"All",statusFilters:{All:"All",Pending:"Pending",Active:"Active",Rejected:"Rejected"}}),b=async(s=1,e)=>{C.value=!0;try{const l=e||h.value,t=await T.tags.getPendingTags({page:s,limit:A,status:u.status,query:l});i.value=t.tags||[],j.value=t.total||0,z.value=s}catch(l){console.error(l),i.value=[],j.value=0}finally{C.value=!1}},R=s=>{u.status=s,V.value=!1,b(1)};B(()=>u.status,()=>b(1)),B(h,s=>b(1,s));const I=async s=>{var e,l;p.value=null;try{const t=await T.tags.createTag({name:s.name,slug:s.slug||void 0,status:s.status,created_by:S==null?void 0:S.id,description:s.description});_("Tag created successfully!"),setTimeout(y,2e3),(u.status===t.status||u.status==="All"||u.status===void 0)&&await b(1)}catch(t){console.error(t),p.value=((l=(e=t.response)==null?void 0:e.data)==null?void 0:l.message)||t.message||"Failed to create tag."}},q=async s=>{var e,l;if(!!s.id){p.value=null;try{await T.tags.updateTag(s.id,{name:s.name,slug:s.slug||void 0,status:s.status,description:s.description}),_("Tag updated successfully!"),setTimeout(y,2e3);const t=i.value.findIndex(x=>x.id===s.id);t!==-1&&(i.value[t]={...i.value[t],...s}),await b(z.value)}catch(t){console.error("Failed to update tag",t),p.value=((l=(e=t.response)==null?void 0:e.data)==null?void 0:l.message)||t.message||"Failed to update tag."}}},H=async s=>{if(!!s.id)try{await T.tags.updateTag(s.id,{status:"active"}),_("Tag approved!");const e=i.value.findIndex(l=>l.id===s.id);e!==-1&&(i.value[e].status="active"),u.status.toLowerCase()==="pending"&&(i.value=i.value.filter(l=>
1l.id!==s.id))}catch(e){console.error("Failed to approve tag:",e),_("Failed to approve tag")}},O=async s=>{if(!!s.id)try{await T.tags.updateTag(s.id,{status:"rejected"}),_("Tag rejected!");const e=i.value.findIndex(l=>l.id===s.id);e!==-1&&(i.value[e].status="rejected"),u.status.toLowerCase()==="pending"&&(i.value=i.value.filter(l=>l.id!==s.id))}catch(e){console.error("Failed to reject tag:",e),_("Failed to reject tag")}},Q=async s=>{!s||(_("Tag deleted!"),await T.tags.deleteTag(s),i.value=i.value.filter(e=>e.id!==s))},G=()=>{d.value={name:"",slug:"",status:"active",description:""},p.value=null,g.value=!0,$.value=!0},J=s=>{d.value={...s},p.value=null,g.value=!1,$.value=!0},y=()=>{M.value=null,p.value=null,setTimeout(()=>$.value=!1,200)},K=se(()=>Math.ceil(j.value/A)>1&&!C.value),W=async s=>{const e=Math.ceil(j.value/A);s<1||s>e||(z.value=s,await b(s),window.scrollTo({top:0,behavior:"smooth"}))},X=s=>s?new Date(s).toLocaleDateString():"N/A";return ae(async()=>{y(),h.value=""}),le(()=>{y(),h.value=""}),ie(async()=>{const e=new URLSearchParams(window.location.search).get("page"),l=e?Number(e):1;z.value=l,await b(l)}),ne(oe("manage-tags",{title:"Tag Manager \u2013 FapTap",description:"Admin panel for managing tags"})),(s,e)=>{var l;return o(),m(D,null,[a("div",he,[e[15]||(e[15]=a("h1",{class:"text-3xl font-semibold text-center text-white mb-6"},[v(" Manage All Tags "),a("small",{class:"block text-sm text-zinc-400 font-normal mt-1"},"Admin access only")],-1)),a("div",ye,[a("div",ke,[n(N,{autofocus:"",placeholder:"Search tag by name",type:"text",class:"flex-1 bg-zinc-800 border-zinc-700 text-sm",modelValue:h.value,"onUpdate:modelValue":e[0]||(e[0]=t=>h.value=t)},null,8,["modelValue"]),a("div",Te,[n(w,{theme:"blue",class:"px-3 py-2 text-sm font-medium flex items-center gap-1.5 flex-1 sm:flex-none justify-center",disabled:"",onClick:G},{default:f(()=>[...e[8]||(e[8]=[v(" Create Tag ",-1)])]),_:1}),a("div",Ce,[n(w,{ref:"statusFilter",onClick:e[1]||(e[1]=t=>V.value=!V.value),theme:u.status!=="All"?"blue":"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"},{default:f(()=>[n(P,{name:"sort-ascending",class:"h-5 w-5"}),a("span",null,r(u.status),1)]),_:1},8,["theme"]),(o(),F(de(ue(E)?re:ce),{modelValue:V.value,"onUpdate:modelValue":e[2]||(e[2]=t=>V.value=t),placement:"bottom-end",target:((l=s.$refs.statusFilter)==null?void 0:l.$el)||s.statusFilter,class:"text-white text-sm py-1 w-40 bg-zinc-850 border border-zinc-700 shadow-xl rounded-md",offset:8},{default:f(()=>[(o(!0),m(D,null,L(u.statusFilters,(t,x)=>(o(),F(xe,{key:x,active:x===u.status,onClick:at=>R(x)},{default:f(()=>[v(r(t),1)]),_:2},1032,["active","onClick"]))),128))]),_:1},8,["modelValue","target"]))])])])]),C.value?(o(),m("div",ze,[n(P,{name:"loading",class:"h-10 w-10 text-blue-500 animate-spin"})])):i.value.length?(o(),m("div",je,[(o(!0),m(D,null,L(i.value,t=>(o(),m("div",{key:t.id,class:"p-4 grid grid-cols-1 sm:grid-cols-12 items-center gap-3 hover:bg-zinc-700 transition-colors rounded-md"},[a("div",Ve,[a("a",{target:"_blank",href:`/t/${t.slug}`,class:"text-zinc-100 font-medium line-clamp-2 leading-tight"},[v(r(t.name)+" ",1),n(P,{name:"open-in-new",class:"h-3 w-3 inline-block text-zinc-400 relative -top-1"})],8,$e),a("div",Me,"Slug: "+r(t.slug),1),t.CreatedBy?(o(),m("div",Fe,[e[9]||(e[9]=v(" Created by: ",-1)),a("span",Pe,r(t.CreatedBy),1)])):k("",!0),a("div",Ae,"Created at: "+r(X(t.created_at)),1)]),a("div",Se,[a("div",null,[e[10]||(e[10]=v("Videos: ",-1)),a("span",Ne,r(t.videos||0),1)]),a("div",null,[a("span",{class:U(["px-2 py-0.5 rounded-full text-xs font-semibold",{"bg-green-500 text-white":t.status==="active","bg-red-500 text-white":t.status==="rejected","bg-yellow-400 text-black":t.status==="pending"}])},r(t.status),3)])]),a("div",De,[n(w,{theme:"green",size:"sm",class:U(t.status==="active"?"hidden":"px-3 py-1"),disabled:t.status==="active",onClick:x=>H(t)},{default:f(()=>[...e[11]||(e[11]=[v("Approve",-1)])]),_:1},8,["class","disabled","onClick"]),n(w,{theme:"red",size:"sm",class:U(t.status==="rejected"?"hidden":"px-3 py-1"),disabled:t.status==="rejected",onClick:x=>O(t)},{default:f(()=>[...e[12]||(e[12]=[v("Reject",-1)])]),_:1},8,["class","disabled","onClick"]),n(w,{theme:"blue",size:"sm",class:"px-3 py-1",onClick:x=>J(t)},{default:f(()=>[...e[13]||(e[13]=[v("Edit",-1)])]),_:1},8,["onClick"]),t.status==="rejected"?(o(),F(w,{key:0,theme:"red",size:"sm",class:"px-3 py-1",onClick:x=>Q(t.id)},{default:f(()=>[...e[14]||(e[14]=[v("Delete",-1)])]),_:1},8,["onClick"])):k("",!0)])]))),128))])):C.value?k("",!0):(o(),m("div",Ue,[n(we,{title:"No Tags Found",message:"No tags match your current search query or filter."})])),n(be,{currentPage:z.value,total:j.value,limit:A,show:K.value,"onUpdate:currentPage":W},null,8,["currentPage","total","show"])]),(o(),F(pe,{to:"body"},[$.value?(o(),m("div",Be,[a("div",{class:"fixed inset-0 bg-black/80",onClick:y}
1),a("div",Le,[a("div",Ee,[a("div",Re,r(g.value?"Create New Tag":"Edit Tag"),1),a("div",Ie,[n(w,{theme:"transparent",onClick:y},{default:f(()=>[n(P,{name:"close",class:"h-6 w-6 text-zinc-400"})]),_:1})])]),a("form",{onSubmit:e[7]||(e[7]=me(t=>g.value?I(d.value):q(d.value),["prevent"])),class:"flex flex-col gap-5"},[a("div",qe,[e[16]||(e[16]=a("label",{class:"md:w-1/4 text-white font-medium text-right hidden md:block mt-2"},"Name",-1)),a("div",He,[n(N,{required:"",modelValue:d.value.name,"onUpdate:modelValue":e[3]||(e[3]=t=>d.value.name=t),placeholder:"Tag Name",disabled:!g.value},null,8,["modelValue","disabled"])])]),a("div",Oe,[e[17]||(e[17]=a("label",{class:"md:w-1/4 text-white font-medium text-right hidden md:block mt-2"},"Slug",-1)),a("div",Qe,[n(N,{modelValue:d.value.slug,"onUpdate:modelValue":e[4]||(e[4]=t=>d.value.slug=t),placeholder:"Slug (optional)",disabled:!g.value},null,8,["modelValue","disabled"])])]),a("div",Ge,[e[19]||(e[19]=a("label",{class:"md:w-1/4 text-white font-medium text-right hidden md:block"},"Status",-1)),a("div",Je,[ve(a("select",{"onUpdate:modelValue":e[5]||(e[5]=t=>d.value.status=t),class:"w-full bg-zinc-800 rounded px-3 py-2 focus-visible:outline-none focus:ring-2 ring-blue-500"},[...e[18]||(e[18]=[a("option",{value:"pending"},"pending",-1),a("option",{value:"active"},"active",-1),a("option",{value:"rejected"},"rejected",-1)])],512),[[fe,d.value.status]])])]),a("div",Ke,[e[20]||(e[20]=a("label",{class:"md:w-1/4 text-white font-medium text-right hidden md:block"},"Description",-1)),a("div",We,[n(_e,{modelValue:d.value.description,"onUpdate:modelValue":e[6]||(e[6]=t=>d.value.description=t),placeholder:"Description",disabled:!g.value},null,8,["modelValue","disabled"])])]),a("div",Xe,[n(w,{type:"submit",theme:"blue",class:"px-6 py-2"},{default:f(()=>[v(r(g.value?"Create":"Save"),1)]),_:1})]),p.value?(o(),m("span",Ye,r(p.value),1)):k("",!0)],32),M.value?(o(),m("div",Ze,r(M.value),1)):k("",!0)])])):k("",!0)]))],64)}}});const rt=ge(et,[["__scopeId","data-v-dd3b5a92"]]);export{rt 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.