PageSourceSearch

https://revby.co/_nuxt/KVglggqN.js

js revby.co collected 2026-09-25 18:18:43 UTC 29,126 bytes, 1 lines download raw bytes

1import{Q as Oe,l as Ie,A as Qe,c as r,a as t,b as n,w as o,a2 as He,F as M,r as V,k as s,X as $,t as c,z as E,g as f,_ as Ge,h as Xe,o as u,i as Je,d as a,n as We,K as D,s as N,j as _e}from"./Cny-jMUR.js";import{_ as Ye}from"./tJRDHKHm.js";import{_ as Ze}from"./DmDz5m4l.js";import{_ as et}from"./BcOQZI7O.js";import{u as me}from"./D1mNL5xR.js";import"./DRbcCXkf.js";import"./CXDzCsr7.js";import"./B7NayylV.js";import"./BGx-vc2c.js";import"./BRdsWsvc.js";import"./COjSgi5K.js";import"./DgD9rLi7.js";const tt={class:"max-w-6xl mx-auto px-4 py-10"},lt={class:"flex flex-col gap-8"},st={class:"flex flex-col gap-3"},it={class:"flex flex-col gap-4 md:flex-row md:items-end md:justify-between"},nt={class:"w-full overflow-x-auto mt-4"},ot={class:"rounded-2xl border border-neutral-200 bg-white p-5 shadow-sm"},at={class:"flex flex-col gap-4 md:flex-row md:items-end md:justify-between"},dt={class:"rounded-2xl border border-neutral-200 bg-white p-5 shadow-sm"},rt={class:"flex items-center justify-between gap-4"},ut={class:"flex flex-col gap-1"},pt={class:"flex flex-col gap-1"},ct={class:"flex items-end"},mt={key:0,class:"py-8 text-neutral-500"},ft={key:1,class:"py-8 text-neutral-500"},xt={key:2,class:"mt-6 overflow-x-auto"},yt={class:"min-w-full text-sm"},vt={class:"py-3 pr-4 text-neutral-800"},gt={class:"py-3 pr-4 text-neutral-800"},bt={class:"py-3 pr-4 text-neutral-500"},kt={class:"py-3 pr-4"},wt={class:"flex items-center gap-2"},_t={class:"rounded-2xl border border-neutral-200 bg-white p-5 shadow-sm"},ht={class:"flex items-center justify-between gap-4"},Ct={class:"flex flex-col gap-1"},Rt={class:"flex flex-col gap-1"},Tt={class:"flex items-end"},Mt={key:0,class:"py-8 text-neutral-500"},Vt={key:1,class:"py-8 text-neutral-500"},$t={key:2,class:"mt-6 overflow-x-auto"},Et={class:"min-w-full text-sm"},Dt={class:"py-3 pr-4 text-neutral-800"},Nt={class:"py-3 pr-4 text-neutral-800"},St={class:"py-3 pr-4 text-neutral-500"},Ut={class:"py-3 pr-4"},Pt={class:"flex items-center gap-2"},qt={class:"rounded-2xl border border-neutral-200 bg-white p-5 shadow-sm"},Ft={class:"flex items-center justify-between gap-4"},jt={class:"flex flex-col gap-1"},Lt={class:"flex flex-col gap-1"},At={class:"flex items-end"},Kt={class:"flex flex-col gap-6"},zt={class:"rounded-2xl border border-neutral-200 bg-white p-5 shadow-sm"},Bt={class:"mb-4 flex items-center justify-between gap-4"},Ot={class:"rounded-full bg-amber-100 px-3 py-1 text-xs font-medium text-amber-800"},It={key:0,class:"py-8 text-neutral-500"},Qt={key:1,class:"py-8 text-neutral-500"},Ht={key:2,class:"overflow-x-auto"},Gt={class:"min-w-full text-sm"},Xt={class:"py-3 pr-4 text-neutral-800"},Jt={class:"py-3 pr-4 text-neutral-500"},Wt={class:"py-3 pr-4"},Yt={class:"flex items-center gap-2"},Zt={class:"rounded-2xl border border-neutral-200 bg-white p-5 shadow-sm"},el={class:"mb-4 flex items-center justify-between gap-4"},tl={class:"rounded-full bg-green-100 px-3 py-1 text-xs font-medium text-green-800"},ll={key:0,class:"py-8 text-neutral-500"},sl={key:1,class:"py-8 text-neutral-500"},il={key:2,class:"overflow-x-auto"},nl={class:"min-w-full text-sm"},ol={class:"py-3 pr-4 text-neutral-800"},al={class:"py-3 pr-4 text-neutral-500"},dl={class:"py-3 pr-4"},rl={class:"flex items-center gap-2"},ul={class:"rounded-2xl border border-neutral-200 bg-white p-5 shadow-sm"},pl={class:"mb-4 flex items-center justify-between gap-4"},cl={class:"rounded-full bg-red-100 px-3 py-1 text-xs font-medium text-red-800"},ml={key:0,class:"py-8 text-neutral-500"},fl={key:1,class:"py-8 text-neutral-500"},xl={key:2,class:"overflow-x-auto"},yl={class:"min-w-full text-sm"},vl={class:"py-3 pr-4 text-neutral-800"},gl={class:"py-3 pr-4 text-neutral-500"},bl={class:"py-3 pr-4"},kl={class:"flex items-center gap-2"},wl={class:"rounded-2xl border border-neutral-200 bg-white p-5 shadow-sm"},_l={class:"flex flex-col gap-3 md:flex-row md:items-center md:justify-between"},hl={class:"p-6"},Cl={class:"flex items-start justify-between gap-4"},Rl={class:"flex flex-col gap-1"},Tl={class:"flex flex-col gap-1"},Ml={class:"flex justify-end gap-3"},Vl={class:"p-6"},$l={class:"flex items-start justify-between gap-4"},El={class:"mt-4 text-sm text-neutral-700"},Dl={class:"mt-6 flex justify-end gap-3"},Nl={class:"p-6"},Sl={class:"flex items-start justify-between gap-4"},Ul={class:"flex flex-col gap-1"},Pl={class:"flex flex-col gap-1"},ql={class:"flex justify-end gap-3"},Fl={class:"p-6"},jl={class:"flex items-start justify-between gap-4"},Ll={class:"mt-4 text-sm text-neutral-700"},Al={key:0},Kl={class:"mt-6 flex justify-end gap-3"},zl={class:"p-6"},Bl={class:"flex items-start justify-between gap-4"},Ol={class:"flex flex-col gap-1"},Il={class:"flex flex-col gap-1"},Ql={class:"flex justify-end gap-3"},Hl={class:"p-6"},Gl={class:"flex items-start justify-between gap-4"},Xl={class:"mt-4 text-sm text-neutral-700"},Jl={key:0},Wl={class:"mt-6 flex justify-end gap-3"},ps=Oe({__name:"settings",setup(Yl){const he=Ie(),m=Qe(),fe=[{label:"Positive",value:"positive"},{label:"Negative",value:"negative"},{label:"Required",value:"required"}],k=D({keyword:"",keywordType:"positive"}),w=D({name:"",email:""}),_=D({name:"",email:""}),y=D({id:null,keyword:"",keywordType:"positive"}),v=D({id:null,name:"",email:""}),g=D({id:null,name:"",email:""}),I=f(!1),Q=f(!1),H=f(!1),G=f(!1),X=f(!1),J=f(!1),W=f(!1),Y=f(!1),Z=f(!1),ee=f(!1),S=f(!1),U=f(!1),P=f(!1),q=f(!1),F=f(!1),j=f(!1),R=f(null),h=f(null),C=f(null),{data:Ce,pending:xe,refresh:K}=me("/api/admin/rfp/notification-recipients",{default:()=>[]},"$bh0-Ae-A7q"),{data:Re,pending:ye,refresh:z}=me("/api/admin/rfp/note-notification-recipients",{default:()=>[]},"$R8mTtKxii7"),{data:Te,pending:B,refresh:O}=me("/api/admin/rfp/keywords",{default:()=>[]},"$mhBQUtfmm9"),ve=N(()=>Ce.value||[]),ge=N(()=>Re.value||[]),te=N(()=>Te.value||[]),le=N(()=>te.value.filter(i=>i.keyword_type==="positive")),se=N(()=>te.value.filter(i=>i.keyword_type==="negative")),ie=N(()=>te.value.filter(i=>i.keyword_type==="required")),be=[{label:"opportunities",to:"/admin/rfp"},{label:"sources",to:"/admin/rfp/sources"},{label:"stats",to:"/admin/rfp/stats"},{label:"logs",to:"/admin/rfp/logs"},{label:"settings",to:"/admin/rfp/settings"}],L=i=>{if(!i)return"—";const e=new Date(i);
1return Number.isNaN(e.getTime())?i:e.toLocaleString()},Me=()=>{k.keyword="",k.keywordType="positive"},Ve=()=>{w.name="",w.email=""},$e=()=>{_.name="",_.email=""},ne=()=>{S.value=!1,y.id=null,y.keyword="",y.keywordType="positive"},oe=i=>{y.id=i.id,y.keyword=i.keyword,y.keywordType=i.keyword_type,S.value=!0},ae=i=>{R.value=i,U.value=!0},de=()=>{U.value=!1,R.value=null},re=()=>{P.value=!1,v.id=null,v.name="",v.email=""},Ee=i=>{v.id=i.id,v.name=i.name,v.email=i.email,P.value=!0},De=i=>{h.value=i,q.value=!0},ue=()=>{q.value=!1,h.value=null},pe=()=>{F.value=!1,g.id=null,g.name="",g.email=""},Ne=i=>{g.id=i.id,g.name=i.name,g.email=i.email,F.value=!0},Se=i=>{C.value=i,j.value=!0},ce=()=>{j.value=!1,C.value=null},Ue=async()=>{var i;I.value=!0;try{await $fetch("/api/admin/rfp/keywords",{method:"POST",body:{keyword:k.keyword,keywordType:k.keywordType}}),Me(),await O(),m.add({title:"Keyword added",description:"The keyword list was updated successfully.",color:"success"})}catch(e){m.add({title:"Failed to add keyword",description:((i=e==null?void 0:e.data)==null?void 0:i.statusMessage)||(e==null?void 0:e.message)||"Request failed",color:"error"})}finally{I.value=!1}},Pe=async()=>{var i;X.value=!0;try{await $fetch("/api/admin/rfp/notification-recipients",{method:"POST",body:{name:w.name,email:w.email}}),Ve(),await K(),m.add({title:"Recipient added",description:"The alert recipient list was updated successfully.",color:"success"})}catch(e){m.add({title:"Failed to add recipient",description:((i=e==null?void 0:e.data)==null?void 0:i.statusMessage)||(e==null?void 0:e.message)||"Request failed",color:"error"})}finally{X.value=!1}},qe=async()=>{var i;Y.value=!0;try{await $fetch("/api/admin/rfp/note-notification-recipients",{method:"POST",body:{name:_.name,email:_.email}}),$e(),await z(),m.add({title:"Slack recipient added",description:"The Slack note recipient list was updated successfully.",color:"success"})}catch(e){m.add({title:"Failed to add Slack recipient",description:((i=e==null?void 0:e.data)==null?void 0:i.statusMessage)||(e==null?void 0:e.message)||"Request failed",color:"error"})}finally{Y.value=!1}},Fe=async()=>{var i;if(y.id){Q.value=!0;try{await $fetch(`/api/admin/rfp/keywords/${y.id}`,{method:"PATCH",body:{keyword:y.keyword,keywordType:y.keywordType}}),await O(),ne(),m.add({title:"Keyword updated",description:"The keyword was saved successfully.",color:"success"})}catch(e){m.add({title:"Failed to update keyword",description:((i=e==null?void 0:e.data)==null?void 0:i.statusMessage)||(e==null?void 0:e.message)||"Request failed",color:"error"})}finally{Q.value=!1}}},je=async()=>{var i,e;if((i=R.value)!=null&&i.id){H.value=!0;try{await $fetch(`/api/admin/rfp/keywords/${R.value.id}`,{method:"DELETE"});const p=R.value.keyword;await O(),de(),m.add({title:"Keyword deleted",description:`${p} was removed successfully.`,color:"success"})}catch(p){m.add({title:"Failed to delete keyword",description:((e=p==null?void 0:p.data)==null?void 0:e.statusMessage)||(p==null?void 0:p.message)||"Request failed",color:"error"})}finally{H.value=!1}}},Le=async()=>{var i;if(v.id){J.value=!0;try{await $fetch(`/api/admin/rfp/notification-recipients/${v.id}`,{method:"PATCH",body:{name:v.name,email:v.email}}),await K(),re(),m.add({title:"Recipient updated",description:"The recipient was saved successfully.",color:"success"})}catch(e){m.add({title:"Failed to update recipient",description:((i=e==null?void 0:e.data)==null?void 0:i.statusMessage)||(e==null?void 0:e.message)||"Request failed",color:"error"})}finally{J.value=!1}}},Ae=async()=>{var i,e;if((i=h.value)!=null&&i.id){W.value=!0;try{await $fetch(`/api/admin/rfp/notification-recipients/${h.value.id}`,{method:"DELETE"});const p=h.value.name;await K(),ue(),m.add({title:"Recipient deleted",description:`${p} was removed successfully.`,color:"success"})}catch(p){m.add({title:"Failed to delete recipient",description:((e=p==null?void 0:p.data)==null?void 0:e.statusMessage)||(p==null?void 0:p.message)||"Request failed",color:"error"})}finally{W.value=!1}}},Ke=async()=>{var i;if(g.id){Z.value=!0;try{await $fetch(`/api/admin/rfp/note-notification-recipients/${g.id}`,{method:"PATCH",body:{name:g.name,email:g.email}}),await z(),pe(),m.add({title:"Slack recipient updated",description:"The Slack recipient was saved successfully.",color:"success"})}catch(e){m.add({title:"Failed to update Slack recipient",description:((i=e==null?void 0:e.data)==null?void 0:i.statusMessage)||(e==null?void 0:e.message)||"Request failed",color:"error"})}finally{Z.value=!1}}},ze=async()=>{var i,e;if((i=C.value)!=null&&i.id){ee.value=!0;try{await $fetch(`/api/admin/rfp/note-notification-recipients/${C.value.id}`,{method:"DELETE"});const p=C.value.name;await z(),ce(),m.add({title:"Slack recipient deleted",description:`${p} was removed successfully.`,color:"success"})}catch(p){m.add({title:"Failed to delete Slack recipient",description:((e=p==null?void 0:p.data)==null?void 0:e.statusMessage)||(p==null?void 0:p.message)||"Request failed",color:"error"})}finally{ee.value=!1}}},Be=async()=>{var i;G.value=!0;try{const e=await $fetch("/api/admin/rfp/jobs/backfill-llm",{method:"POST"});m.add({title:"LLM backfill queued",description:`${(e==null?void 0:e.queuedCount)||0} jobs queued, ${(e==null?void 0:e.skippedCount)||0} skipped.`,color:"success"})}catch(e){m.add({title:"Failed to queue LLM backfill",description:((i=e==null?void 0:e.data)==null?void 0:i.statusMessage)||(e==null?void 0:e.message)||"Request failed",color:"error"})}finally{G.value=!1}};return(i,e)=>{const p=Je,ke=Ge,d=Xe,b=Ye,we=Ze,T=et;return u(),r("div",tt,[t("div",lt,[t("section",st,[t("div",it,[t("div",null,[n(ke,{to:"/admin",class:"mb-4 inline-flex items-center gap-2 text-brand hover:underline"},{default:o(()=>[n(p,{name:"i-lucide-arrow-left",class:"size-4"}),e[18]||(e[18]=t("span",null,"Admin",-1))]),_:1}),e[19]||(e[19]=t("h1",{class:"text-4xl font-bold text-neutral-950"},"RFP crawler",-1)),e[20]||(e[20]=t("p",{class:"text-neutral-600"}," Inspect discovered opportunities, manage sources, and monitor crawl activity. ",-1))])]),t("nav",nt,[t("div",{class:"grid min-w-full gap-2 rounded-2xl border border-neutral-200 bg-neutral-100/80 p-2 shadow-sm",style:He({gridTemplateColumns:`repeat(${Math.max(be.length,1)}, minmax(0, 1fr))`})},[(u(),r(M,null,V(be,l=>n(ke,{key:l.to,to:l.to,class:We(["rounded-xl px-4 py-2 text-center text-sm font-medium capitalize transition-colors",s(he).path===l.to?"bg-brand text-white":"text-neutral-600 hover:bg-white hover:text-brand"])},{default:o(()=>[a(c(l.label),1)]),_:2},1032,["to","class"])),64))],4)])]),e[58]||(e[58]=t("section",{class:"flex flex-col gap-2"},[t("h2",{class:"text-2xl font-semibold text-neutral-950"},"Settings"),t("p",{class:"text-neutral-600"}," Manage notification recipients and the positive, negative, and required phrases used by listing crawls to identify candidate opportunities. ")],-1)),t("section",ot,[t("div",at,[e[22]||(e[22]=t("div",null,[t("h2",{class:"text-xl font-semibold text-neutral-950"},"LLM evaluation backfill"),t("p",{class:"text-sm text-neutral-500"}," Queue score-relevance jobs for parsed opportunities that do not have an LLM evaluation yet. ")],-1)),n(d,{color:"primary",icon:"i-lucide-sparkles",loading:s(G),onClick:Be},{default:o(()=>[...e[21]||(e[21]=[a(" Queue LLM backfill ",-1)])]),_:1},8,["loading"])])]),t("section",dt,[t("div",rt,[e[24]||(e[24]=t("div",null,[t("h2",{class:"text-xl font-semibold text-neutral-950"},"Good-fit alert recipients"),t("p",{class:"text-sm text-neutral-500"}," These people receive an email when OpenAI scores an RFP opportunity at 80 or above. ")],-1)),n(d,{variant:"outline",loading:s(xe),onClick:s(K)},{default:o(()=>[...e[23]||(e[23]=[a("Refresh",-1)])]),_:1},8,["loading","onClick"])]),t("form",{class:"mt-5 grid gap-4 md:grid-cols-[minmax(0,220px)_minmax(0,1fr)_auto]",onSubmit:$(Pe,["prevent"])},[t("label",ut,[e[25]||(e[25]=t("span",{class:"text-sm font-medium text-neutral-700"},"Name",-1)),n(b,{modelValue:s(w).name,"onUpdate:modelValue":e[0]||(e[0]=l=>s(w).name=l),placeholder:"Brian Bishop"},null,8,["modelValue"])]),t("label",pt,[e[26]||(e[26]=t("span",{class:"text-sm font-medium text-neutral-700"},"Email",-1)),n(b,{modelValue:s(w).email,"onUpdate:modelValue":e[1]||(e[1]=l=>s(w).email=l),placeholder:"[email protected]"},null,8,["modelValue"])]),t("div",ct,[n(d,{type:"submit",loading:s(X)},{default:o(()=>[...e[27]||(e[27]=[a("Add recipient",-1)])]),_:1},8,["loading"])])],32),s(xe)?(u(),r("div",mt,"Loading recipients...")):s(ve).length?(u(),r("div",xt,[t("table",yt,[e[30]||(e[30]=t("thead",{class:"text-left text-neutral-500"},[t("tr",null,[t("th",{class:"py-2 pr-4"},"Name"),t("th",{class:"py-2 pr-4"},"Email"),t("th",{class:"py-2 pr-4"},"Updated"),t("th",{class:"py-2 pr-4"},"Actions")])],-1)),t("tbody",null,[(u(!0),r(M,null,V(s(ve),l=>(u(),r("tr",{key:l.id,class:"border-t border-neutral-200"},[t("td",vt,c(l.name),1),t("td",gt,c(l.email),1),t("td",bt,c(L(l.updated_at)),1),t("td",kt,[t("div",wt,[n(d,{size:"xs",variant:"outline",icon:"i-lucide-pencil",onClick:x=>Ee(l)},{default:o(()=>[...e[28]||(e[28]=[a(" Edit ",-1)])]),_:1},8,["onClick"]),n(d,{size:"xs",color:"error",variant:"outline",icon:"i-lucide-trash-2",onClick:x=>De(l)},{default:o(()=>[...e[29]||(e[29]=[a(" Delete ",-1)])]),_:1},8,["onClick"])])])]))),128))])])])):(u(),r("div",ft,"No recipients configured yet."))]),t("section",_t,[t("div",ht,[e[32]||(e[32]=t("div",null,[t("h2",{class:"text-xl font-semibold text-neutral-950"},"Slack note notification recipients"),t("p",{class:"text-sm text-neutral-500"}," These people receive a Slack DM when a new internal note is left on an RFP opportunity. ")],-1)),n(d,{variant:"outline",loading:s(ye),onClick:s(z)},{default:o(()=>[...e[31]||(e[31]=[a("Refresh",-1)])]),_:1},8,["loading","onClick"])]),t("form",{class:"mt-5 grid gap-4 md:grid-cols-[minmax(0,220px)_minmax(0,1fr)_auto]",onSubmit:$(qe,["prevent"])},[t("label",Ct,[e[33]||(e[33]=t("span",{class:"text-sm font-medium text-neutral-700"},"Name",-1)),n(b,{modelValue:s(_).name,"onUpdate:modelValue":e[2]||(e[2]=l=>s(_).name=l),placeholder:"Brian Bishop"},null,8,["modelValue"])]),t("label",Rt,[e[34]||(e[34]=t("span",{class:"text-sm font-medium text-neutral-700"},"Email",-1)),n(b,{modelValue:s(_).email,"onUpdate:modelValue":e[3]||(e[3]=l=>s(_).email=l),placeholder:"[email protected]"},null,8,["modelValue"])]),t("div",Tt,[n(d,{type:"submit",loading:s(Y)},{default:o(()=>[...e[35]||(e[35]=[a("Add recipient",-1)])]),_:1}
1,8,["loading"])])],32),s(ye)?(u(),r("div",Mt,"Loading Slack recipients...")):s(ge).length?(u(),r("div",$t,[t("table",Et,[e[38]||(e[38]=t("thead",{class:"text-left text-neutral-500"},[t("tr",null,[t("th",{class:"py-2 pr-4"},"Name"),t("th",{class:"py-2 pr-4"},"Email"),t("th",{class:"py-2 pr-4"},"Updated"),t("th",{class:"py-2 pr-4"},"Actions")])],-1)),t("tbody",null,[(u(!0),r(M,null,V(s(ge),l=>(u(),r("tr",{key:l.id,class:"border-t border-neutral-200"},[t("td",Dt,c(l.name),1),t("td",Nt,c(l.email),1),t("td",St,c(L(l.updated_at)),1),t("td",Ut,[t("div",Pt,[n(d,{size:"xs",variant:"outline",icon:"i-lucide-pencil",onClick:x=>Ne(l)},{default:o(()=>[...e[36]||(e[36]=[a(" Edit ",-1)])]),_:1},8,["onClick"]),n(d,{size:"xs",color:"error",variant:"outline",icon:"i-lucide-trash-2",onClick:x=>Se(l)},{default:o(()=>[...e[37]||(e[37]=[a(" Delete ",-1)])]),_:1},8,["onClick"])])])]))),128))])])])):(u(),r("div",Vt,"No Slack recipients configured yet."))]),t("section",qt,[t("div",Ft,[e[40]||(e[40]=t("div",null,[t("h2",{class:"text-xl font-semibold text-neutral-950"},"Add keyword"),t("p",{class:"text-sm text-neutral-500"},"New entries are picked up by future listing crawls.")],-1)),n(d,{variant:"outline",loading:s(B),onClick:s(O)},{default:o(()=>[...e[39]||(e[39]=[a("Refresh",-1)])]),_:1},8,["loading","onClick"])]),t("form",{class:"mt-5 grid gap-4 md:grid-cols-[minmax(0,1fr)_220px_auto]",onSubmit:$(Ue,["prevent"])},[t("label",jt,[e[41]||(e[41]=t("span",{class:"text-sm font-medium text-neutral-700"},"Keyword or phrase",-1)),n(b,{modelValue:s(k).keyword,"onUpdate:modelValue":e[4]||(e[4]=l=>s(k).keyword=l),placeholder:"request for qualifications"},null,8,["modelValue"])]),t("label",Lt,[e[42]||(e[42]=t("span",{class:"text-sm font-medium text-neutral-700"},"List",-1)),n(we,{modelValue:s(k).keywordType,"onUpdate:modelValue":e[5]||(e[5]=l=>s(k).keywordType=l),items:fe,"option-attribute":"label","value-attribute":"value"},null,8,["modelValue"])]),t("div",At,[n(d,{type:"submit",loading:s(I)},{default:o(()=>[...e[43]||(e[43]=[a("Add keyword",-1)])]),_:1},8,["loading"])])],32)]),t("section",Kt,[t("div",zt,[t("div",Bt,[e[44]||(e[44]=t("div",null,[t("h2",{class:"text-xl font-semibold text-neutral-950"},"Required phrases"),t("p",{class:"text-sm text-neutral-500"},"These phrases are the must-have matches used to qualify first-stage crawl candidates.")],-1)),t("span",Ot,c(s(ie).length)+" total ",1)]),s(B)?(u(),r("div",It,"Loading keywords...")):s(ie).length?(u(),r("div",Ht,[t("table",Gt,[e[47]||(e[47]=t("thead",{class:"text-left text-neutral-500"},[t("tr",null,[t("th",{class:"py-2 pr-4"},"Phrase"),t("th",{class:"py-2 pr-4"},"Updated"),t("th",{class:"py-2 pr-4"},"Actions")])],-1)),t("tbody",null,[(u(!0),r(M,null,V(s(ie),l=>(u(),r("tr",{key:l.id,class:"border-t border-neutral-200"},[t("td",Xt,c(l.keyword),1),t("td",Jt,c(L(l.updated_at)),1),t("td",Wt,[t("div",Yt,[n(d,{size:"xs",variant:"outline",icon:"i-lucide-pencil",onClick:x=>oe(l)},{default:o(()=>[...e[45]||(e[45]=[a(" Edit ",-1)])]),_:1},8,["onClick"]),n(d,{size:"xs",color:"error",variant:"outline",icon:"i-lucide-trash-2",onClick:x=>ae(l)},{default:o(()=>[...e[46]||(e[46]=[a(" Delete ",-1)])]),_:1},8,["onClick"])])])]))),128))])])])):(u(),r("div",Qt,"No required phrases yet."))]),t("div",Zt,[t("div",el,[e[48]||(e[48]=t("div",null,[t("h2",{class:"text-xl font-semibold text-neutral-950"},"Positive keywords"),t("p",{class:"text-sm text-neutral-500"},"These phrases help identify links or rows as likely opportunities.")],-1)),t("span",tl,c(s(le).length)+" total ",1)]),s(B)?(u(),r("div",ll,"Loading keywords...")):s(le).length?(u(),r("div",il,[t("table",nl,[e[51]||(e[51]=t("thead",{class:"text-left text-neutral-500"},[t("tr",null,[t("th",{class:"py-2 pr-4"},"Keyword"),t("th",{class:"py-2 pr-4"},"Updated"),t("th",{class:"py-2 pr-4"},"Actions")])],-1)),t("tbody",null,[(u(!0),r(M,null,V(s(le),l=>(u(),r("tr",{key:l.id,class:"border-t border-neutral-200"},[t("td",ol,c(l.keyword),1),t("td",al,c(L(l.updated_at)),1),t("td",dl,[t("div",rl,[n(d,{size:"xs",variant:"outline",icon:"i-lucide-pencil",onClick:x=>oe(l)},{default:o(()=>[...e[49]||(e[49]=[a(" Edit ",-1)])]),_:1},8,["onClick"]),n(d,{size:"xs",color:"error",variant:"outline",icon:"i-lucide-trash-2",onClick:x=>ae(l)},{default:o(()=>[...e[50]||(e[50]=[a(" Delete ",-1)])]),_:1},8,["onClick"])])])]))),128))])])])):(u(),r("div",sl,"No positive keywords yet."))]),t("div",ul,[t("div",pl,[e[52]||(e[52]=t("div",null,[t("h2",{class:"text-xl font-semibold text-neutral-950"},"Negative keywords"),t("p",{class:"text-sm text-neutral-500"},"These phrases reject links or rows that look like site noise instead of opportunities.")],-1)),t("span",cl,c(s(se).length)+" total ",1)]),s(B)?(u(),r("div",ml,"Loa
1ding keywords...")):s(se).length?(u(),r("div",xl,[t("table",yl,[e[55]||(e[55]=t("thead",{class:"text-left text-neutral-500"},[t("tr",null,[t("th",{class:"py-2 pr-4"},"Keyword"),t("th",{class:"py-2 pr-4"},"Updated"),t("th",{class:"py-2 pr-4"},"Actions")])],-1)),t("tbody",null,[(u(!0),r(M,null,V(s(se),l=>(u(),r("tr",{key:l.id,class:"border-t border-neutral-200"},[t("td",vl,c(l.keyword),1),t("td",gl,c(L(l.updated_at)),1),t("td",bl,[t("div",kl,[n(d,{size:"xs",variant:"outline",icon:"i-lucide-pencil",onClick:x=>oe(l)},{default:o(()=>[...e[53]||(e[53]=[a(" Edit ",-1)])]),_:1},8,["onClick"]),n(d,{size:"xs",color:"error",variant:"outline",icon:"i-lucide-trash-2",onClick:x=>ae(l)},{default:o(()=>[...e[54]||(e[54]=[a(" Delete ",-1)])]),_:1},8,["onClick"])])])]))),128))])])])):(u(),r("div",fl,"No negative keywords yet."))])]),t("section",wl,[t("div",_l,[e[57]||(e[57]=t("div",null,[t("h2",{class:"text-xl font-semibold text-neutral-950"},"RFPMart API"),t("p",{class:"text-sm text-neutral-500"}," Open the manual RFPMart admin console to test date ranges and inspect the raw API response. ")],-1)),n(d,{to:"/admin/rfp/rfpmart-api",icon:"i-lucide-external-link",variant:"outline",color:"neutral"},{default:o(()=>[...e[56]||(e[56]=[a(" Open RFPMart API page ",-1)])]),_:1})])])]),n(T,{open:s(S),"onUpdate:open":e[8]||(e[8]=l=>E(S)?S.value=l:null)},{content:o(()=>[t("div",hl,[t("div",Cl,[e[59]||(e[59]=t("div",null,[t("h2",{class:"text-xl font-semibold text-neutral-950"},"Edit keyword"),t("p",{class:"mt-1 text-sm text-neutral-500"},"Update the phrase or move it between the positive, negative, and required lists.")],-1)),n(d,{icon:"i-lucide-x",variant:"ghost",color:"neutral",onClick:ne})]),t("form",{class:"mt-6 grid gap-5",onSubmit:$(Fe,["prevent"])},[t("label",Rl,[e[60]||(e[60]=t("span",{class:"text-sm font-medium text-neutral-700"},"Keyword or phrase",-1)),n(b,{modelValue:s(y).keyword,"onUpdate:modelValue":e[6]||(e[6]=l=>s(y).keyword=l),placeholder:"request for qualifications"},null,8,["modelValue"])]),t("label",Tl,[e[61]||(e[61]=t("span",{class:"text-sm font-medium text-neutral-700"},"List",-1)),n(we,{modelValue:s(y).keywordType,"onUpdate:modelValue":e[7]||(e[7]=l=>s(y).keywordType=l),items:fe,"option-attribute":"label","value-attribute":"value"},null,8,["modelValue"])]),t("div",Ml,[n(d,{type:"button",variant:"outline",color:"neutral",onClick:ne},{default:o(()=>[...e[62]||(e[62]=[a("Cancel",-1)])]),_:1}),n(d,{type:"submit",loading:s(Q)},{default:o(()=>[...e[63]||(e[63]=[a("Save changes",-1)])]),_:1},8,["loading"])])],32)])]),_:1},8,["open"]),n(T,{open:s(U),"onUpdate:open":e[9]||(e[9]=l=>E(U)?U.value=l:null)},{content:o(()=>{var l,x;return[t("div",Vl,[t("div",$l,[e[64]||(e[64]=t("div",null,[t("h2",{class:"text-xl font-semibold text-error-600"},"Delete keyword"),t("p",{class:"mt-1 text-sm text-neutral-500"},"This action cannot be undone.")],-1)),n(d,{icon:"i-lucide-x",variant:"ghost",color:"neutral",onClick:de})]),t("p",El,[e[65]||(e[65]=a(" Are you sure you want to delete ",-1)),t("strong",null,c((l=s(R))==null?void 0:l.keyword),1),a(" from the "+c((x=s(R))==null?void 0:x.keyword_type)+" list? ",1)]),t("div",Dl,[n(d,{type:"button",variant:"outline",color:"neutral",onClick:de},{default:o(()=>[...e[66]||(e[66]=[a("Cancel",-1)])]),_:1}),n(d,{type:"button",color:"error",loading:s(H),onClick:je},{default:o(()=>[...e[67]||(e[67]=[a("Delete",-1)])]),_:1},8,["loading"])])])]}),_:1},8,["open"]),n(T,{open:s(P),"onUpdate:open":e[12]||(e[12]=l=>E(P)?P.value=l:null)},{content:o(()=>[t("div",Nl,[t("div",Sl,[e[68]||(e[68]=t("div",null,[t("h2",{class:"text-xl font-semibold text-neutral-950"},"Edit recipient"),t("p",{class:"mt-1 text-sm text-neutral-500"},"Update the name or email for this alert recipient.")],-1)),n(d,{icon:"i-lucide-x",variant:"ghost",color:"neutral",onClick:re})]),t("form",{class:"mt-6 grid gap-5",onSubmit:$(Le,["prevent"])},[t("label",Ul,[e[69]||(e[69]=t("span",{class:"text-sm font-medium text-neutral-700"},"Name",-1)),n(b,{modelValue:s(v).name,"onUpdate:modelValue":e[10]||(e[10]=l=>s(v).name=l),placeholder:"Brian Bishop"}
1,null,8,["modelValue"])]),t("label",Pl,[e[70]||(e[70]=t("span",{class:"text-sm font-medium text-neutral-700"},"Email",-1)),n(b,{modelValue:s(v).email,"onUpdate:modelValue":e[11]||(e[11]=l=>s(v).email=l),placeholder:"[email protected]"},null,8,["modelValue"])]),t("div",ql,[n(d,{type:"button",variant:"outline",color:"neutral",onClick:re},{default:o(()=>[...e[71]||(e[71]=[a("Cancel",-1)])]),_:1}),n(d,{type:"submit",loading:s(J)},{default:o(()=>[...e[72]||(e[72]=[a("Save changes",-1)])]),_:1},8,["loading"])])],32)])]),_:1},8,["open"]),n(T,{open:s(q),"onUpdate:open":e[13]||(e[13]=l=>E(q)?q.value=l:null)},{content:o(()=>{var l,x,A;return[t("div",Fl,[t("div",jl,[e[73]||(e[73]=t("div",null,[t("h2",{class:"text-xl font-semibold text-error-600"},"Delete recipient"),t("p",{class:"mt-1 text-sm text-neutral-500"},"This action cannot be undone.")],-1)),n(d,{icon:"i-lucide-x",variant:"ghost",color:"neutral",onClick:ue})]),t("p",Ll,[e[74]||(e[74]=a(" Are you sure you want to delete ",-1)),t("strong",null,c((l=s(h))==null?void 0:l.name),1),(x=s(h))!=null&&x.email?(u(),r("span",Al,"("+c((A=s(h))==null?void 0:A.email)+")",1)):_e("",!0),e[75]||(e[75]=a("? ",-1))]),t("div",Kl,[n(d,{type:"button",variant:"outline",color:"neutral",onClick:ue},{default:o(()=>[...e[76]||(e[76]=[a("Cancel",-1)])]),_:1}),n(d,{type:"button",color:"error",loading:s(W),onClick:Ae},{default:o(()=>[...e[77]||(e[77]=[a("Delete",-1)])]),_:1},8,["loading"])])])]}),_:1},8,["open"]),n(T,{open:s(F),"onUpdate:open":e[16]||(e[16]=l=>E(F)?F.value=l:null)},{content:o(()=>[t("div",zl,[t("div",Bl,[e[78]||(e[78]=t("div",null,[t("h2",{class:"text-xl font-semibold text-neutral-950"},"Edit Slack recipient"),t("p",{class:"mt-1 text-sm text-neutral-500"},"Update the name or email for this Slack note notification recipient.")],-1)),n(d,{icon:"i-lucide-x",variant:"ghost",color:"neutral",onClick:pe})]),t("form",{class:"mt-6 grid gap-5",onSubmit:$(Ke,["prevent"])},[t("label",Ol,[e[79]||(e[79]=t("span",{class:"text-sm font-medium text-neutral-700"},"Name",-1)),n(b,{modelValue:s(g).name,"onUpdate:modelValue":e[14]||(e[14]=l=>s(g).name=l),placeholder:"Brian Bishop"},null,8,["modelValue"])]),t("label",Il,[e[80]||(e[80]=t("span",{class:"text-sm font-medium text-neutral-700"},"Email",-1)),n(b,{modelValue:s(g).email,"onUpdate:modelValue":e[15]||(e[15]=l=>s(g).email=l),placeholder:"[email protected]"},null,8,["modelValue"])]),t("div",Ql,[n(d,{type:"button",variant:"outline",color:"neutral",onClick:pe},{default:o(()=>[...e[81]||(e[81]=[a("Cancel",-1)])]),_:1}),n(d,{type:"submit",loading:s(Z)},{default:o(()=>[...e[82]||(e[82]=[a("Save changes",-1)])]),_:1},8,["loading"])])],32)])]),_:1},8,["open"]),n(T,{open:s(j),"onUpdate:open":e[17]||(e[17]=l=>E(j)?j.value=l:null)},{content:o(()=>{var l,x,A;return[t("div",Hl,[t("div",Gl,[e[83]||(e[83]=t("div",null,[t("h2",{class:"text-xl font-semibold text-error-600"},"Delete Slack recipient"),t("p",{class:"mt-1 text-sm text-neutral-500"},"This action cannot be undone.")],-1)),n(d,{icon:"i-lucide-x",variant:"ghost",color:"neutral",onClick:ce})]),t("p",Xl,[e[84]||(e[84]=a(" Are you sure you want to delete ",-1)),t("strong",null,c((l=s(C))==null?void 0:l.name),1),(x=s(C))!=null&&x.email?(u(),r("span",Jl,"("+c((A=s(C))==null?void 0:A.email)+")",1)):_e("",!0),e[85]||(e[85]=a("? ",-1))]),t("div",Wl,[n(d,{type:"button",variant:"outline",color:"neutral",onClick:ce},{default:o(()=>[...e[86]||(e[86]=[a("Cancel",-1)])]),_:1}),n(d,{type:"button",color:"error",loading:s(ee),onClick:ze},{default:o(()=>[...e[87]||(e[87]=[a("Delete",-1)])]),_:1},8,["loading"])])])]}),_:1},8,["open"])])}}});export{ps 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.