Files
igny8/frontend/dist/assets/js/Keywords-CeSsLZuH.js
IGNY8 VPS (Salman) 3c100be1cf more
2025-11-13 14:12:36 +00:00

2 lines
25 KiB
JavaScript

import{j as a,r as l}from"./chunk-UIGDSWPH-BhuNDbxn.js";import{u as Pe,T as qe,S as He}from"./TablePageTemplate-BEWe6AkV.js";import{A as ue,L as ce,B as de,I as ke,u as We,b as Ge,d as Je,h as Qe,o as Xe,p as Ye,e as Ze,q as et,r as tt,s as rt,i as Se,t as st,v as at}from"./main-af3pcbZa.js";import{P as ot}from"./PageHeader-iXTYKDGo.js";import{g as Ce,a as lt,b as nt}from"./difficulty-j1OGc4r8.js";import{F as it}from"./FormModal-DkhE3zPR.js";import{k as ct,s as dt,v as ut,c as mt,d as pt,i as ft,a as yt,f as _e,b as gt,u as wt,P as bt}from"./date-Cc7ORwbK.js";import{u as xt}from"./useResourceDebug-Dza3x9eP.js";import{S as vt}from"./plus-2WF6_FMG.js";import{S as ht}from"./arrow-up-Ba39LAbN.js";import{M as kt}from"./index-ju2wdkG8.js";import{B as z}from"./Badge-DM3morB7.js";import"./SelectDropdown-C8sZwHi_.js";import"./AlertModal-BhtTtzZV.js";import"./check-circle--AtVWUy0.js";import"./arrow-right-DC7G5FiV.js";import"./pencil-CuC2vg9I.js";import"./angle-left-CYBnq6Pg.js";const St=e=>{const i=new URLSearchParams;e.filters&&Object.entries(e.filters).forEach(([n,g])=>{g!==""&&g!==null&&g!==void 0&&i.append(n,String(g))});const r=i.toString(),s=e.endpoint.endsWith("/")?e.endpoint:`${e.endpoint}/`;return`${ue}${s}${r?`?${r}`:""}`},Ct=async(e,i,r)=>{const s=e.format||"csv",m=St(e);i==null||i(`Exporting ${s.toUpperCase()}...`);try{const n=await fetch(m,{method:"GET",credentials:"include"});if(!n.ok){const L=await n.text();throw new Error(`Export failed: ${n.statusText} - ${L}`)}const g=await n.blob(),k=window.URL.createObjectURL(g),u=document.createElement("a");u.href=k,u.download=`${e.filename}.${s}`,document.body.appendChild(u),u.click(),document.body.removeChild(u),window.URL.revokeObjectURL(k),i==null||i(`Export successful: ${e.filename}.${s}`)}catch(n){const g=n instanceof Error?n:new Error("Export failed");throw r==null||r(g),g}},_t=async(e,i,r,s)=>{var u,L;const m=i.acceptedFormats||[".csv"],n="."+((u=e.name.split(".").pop())==null?void 0:u.toLowerCase());if(!m.includes(n)){const w=new Error(`Invalid file format. Accepted formats: ${m.join(", ")}`);throw s==null||s(w),w}const g=i.maxFileSize||5*1024*1024;if(e.size>g){const w=new Error(`File size exceeds ${g/1024/1024}MB limit`);throw s==null||s(w),w}r==null||r(`Importing ${e.name}...`);const k=new FormData;k.append("file",e);try{const w=i.endpoint.endsWith("/")?i.endpoint:`${i.endpoint}/`,D=new URLSearchParams;i.queryParams&&Object.entries(i.queryParams).forEach(([O,b])=>{b!==""&&b!==null&&b!==void 0&&D.append(O,String(b))});const I=D.toString(),P=`${ue}${w}${I?`?${I}`:""}`,F=await fetch(P,{method:"POST",body:k,credentials:"include"});if(!F.ok){const O=await F.text();throw new Error(`Import failed: ${F.statusText} - ${O}`)}const S=await F.json();return r==null||r(`Import successful: ${S.imported||0} rows imported`),(L=i.onSuccess)==null||L.call(i,S),S}catch(w){const D=w instanceof Error?w:new Error("Import failed");throw s==null||s(D),D}},It=({className:e,onChange:i,accept:r,disabled:s=!1})=>a.jsx("input",{type:"file",accept:r,disabled:s,className:`focus:border-ring-brand-300 h-11 w-full overflow-hidden rounded-lg border border-gray-300 bg-transparent text-sm text-gray-500 shadow-theme-xs transition-colors file:mr-5 file:border-collapse file:cursor-pointer file:rounded-l-lg file:border-0 file:border-r file:border-solid file:border-gray-200 file:bg-gray-50 file:py-3 file:pl-3.5 file:pr-3 file:text-sm file:text-gray-700 placeholder:text-gray-400 hover:file:bg-gray-100 focus:outline-hidden focus:file:ring-brand-300 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-400 dark:text-white/90 dark:file:border-gray-800 dark:file:bg-white/[0.03] dark:file:text-gray-400 dark:placeholder:text-gray-400 disabled:opacity-50 disabled:cursor-not-allowed ${e}`,onChange:i});function Mt(e){const{exportEndpoint:i,importEndpoint:r,filename:s,acceptedFormats:m=[".csv"],maxFileSize:n=5*1024*1024,onImportSuccess:g,onExportSuccess:k,onError:u}=e,[L,w]=l.useState(!1),[D,I]=l.useState(!1),P=l.useCallback(async(b="csv",_={})=>{I(!0);try{await Ct({endpoint:i,filename:s,format:b,filters:_},v=>console.log(v),v=>{throw u==null||u(v),v}),k==null||k()}catch(x){const v=x instanceof Error?x:new Error("Export failed");throw u==null||u(v),v}finally{I(!1)}},[i,s,u,k]),F=l.useCallback(async b=>{I(!0);try{const _={endpoint:r,acceptedFormats:m,maxFileSize:n,queryParams:e.importQueryParams,onSuccess:v=>{g==null||g(v)}},x=await _t(b,_,v=>console.log(v),v=>{throw u==null||u(v),v});return w(!1),x}catch(_){const x=_ instanceof Error?_:new Error("Import failed");throw u==null||u(x),x}finally{I(!1)}},[r,m,n,g,u]),S=l.useCallback(async b=>{var x;const _=(x=b.target.files)==null?void 0:x[0];_&&(await F(_),b.target.value="")},[F]);return{handleExport:P,handleImportClick:()=>w(!0),ImportModal:()=>a.jsx(kt,{isOpen:L,onClose:()=>w(!1),className:"max-w-md",children:a.jsxs("div",{className:"p-6",children:[a.jsxs("h2",{className:"text-xl font-bold mb-6 text-gray-800 dark:text-white",children:["Import ",s.charAt(0).toUpperCase()+s.slice(1)]}),a.jsxs("div",{className:"space-y-4",children:[a.jsxs("div",{children:[a.jsx(ce,{children:"CSV File"}),a.jsx(It,{onChange:S,accept:m.join(","),disabled:D}),a.jsxs("p",{className:"text-sm text-gray-500 dark:text-gray-400 mt-2",children:["Upload a CSV file (max ",n/1024/1024,"MB)"]})]}),a.jsx("div",{className:"flex justify-end gap-4 pt-4",children:a.jsx(de,{variant:"outline",onClick:()=>w(!1),disabled:D,children:"Close"})})]})]})})}}const jt=(e,i,r)=>Mt({exportEndpoint:"/v1/planner/keywords/export/",importEndpoint:"/v1/planner/keywords/import_keywords/",filename:"keywords",acceptedFormats:[".csv"],maxFileSize:5*1024*1024,importQueryParams:r,onImportSuccess:e,onError:i}),Dt=e=>{const i=!e.activeSector;return{columns:[{...ct,sortable:!0,sortField:"keyword"},...i?[{...dt,render:(r,s)=>a.jsx(z,{color:"info",size:"sm",variant:"light",children:s.sector_name||"-"})}]:[],{...ut,sortable:!0,sortField:"volume",render:r=>r.toLocaleString()},{...mt,sortable:!0,sortField:"cluster_id",render:(r,s)=>s.cluster_name||"-"},{...pt,sortable:!0,sortField:"difficulty",align:"center",render:r=>{const s=Ce(r),m=typeof s=="number"&&s===5?"solid":typeof s=="number"&&(s===2||s===3||s===4)?"light":typeof s=="number"&&s===1?"solid":"light",n=typeof s=="number"&&s===1||typeof s=="number"&&s===2?"success":typeof s=="number"&&s===3?"warning":typeof s=="number"&&s===4||typeof s=="number"&&s===5?"error":"light";return typeof s=="number"?a.jsx(z,{color:n,variant:m,size:"sm",children:s}):s}},{...ft,sortable:!0,sortField:"intent",render:r=>{const s=m=>{const n=(m==null?void 0:m.toLowerCase())||"";return n==="transactional"||n==="commercial"?"success":n==="navigational"?"warning":"info"};return a.jsx(z,{color:s(r),size:"sm",variant:(r==null?void 0:r.toLowerCase())==="informational"?"light":void 0,children:r})}},{...yt,sortable:!0,sortField:"status",render:r=>a.jsx(z,{color:r==="active"?"success":r==="pending"?"warning":"error",size:"sm",children:r})},{...gt,sortable:!0,sortField:"created_at",render:r=>_e(r)},{key:"updated_at",label:"Updated",sortable:!0,sortField:"updated_at",defaultVisible:!1,render:r=>_e(r)},{key:"volume_override",label:"Volume Override",sortable:!0,sortField:"volume_override",defaultVisible:!1,render:r=>r?r.toLocaleString():"-"},{key:"difficulty_override",label:"Difficulty Override",sortable:!0,sortField:"difficulty_override",defaultVisible:!1,align:"center",render:r=>{if(r==null)return"-";const s=Ce(r);return typeof s=="number"?a.jsx(z,{color:s===1||s===2?"success":s===3?"warning":"error",variant:s===5?"solid":"light",size:"sm",children:s}):s}}],filters:[{key:"search",label:"Search",type:"text",placeholder:"Search keywords..."},{key:"status",label:"Status",type:"select",options:[{value:"",label:"All Status"},{value:"active",label:"Active"},{value:"pending",label:"Pending"},{value:"archived",label:"Archived"}]},{key:"intent",label:"Intent",type:"select",options:[{value:"",label:"All Intent"},{value:"informational",label:"Informational"},{value:"navigational",label:"Navigational"},{value:"transactional",label:"Transactional"},{value:"commercial",label:"Commercial"}]},{key:"difficulty",label:"Difficulty",type:"select",options:[{value:"",label:"All Difficulty"},{value:"1",label:"1 - Very Easy"},{value:"2",label:"2 - Easy"},{value:"3",label:"3 - Medium"},{value:"4",label:"4 - Hard"},{value:"5",label:"5 - Very Hard"}]},{key:"volume",label:"Volume Range",type:"custom",customRender:()=>a.jsxs("div",{className:"relative flex-1 min-w-[140px]",children:[a.jsxs("button",{ref:e.volumeButtonRef,type:"button",onClick:()=>{e.setIsVolumeDropdownOpen(!e.isVolumeDropdownOpen),e.setTempVolumeMin(e.volumeMin),e.setTempVolumeMax(e.volumeMax)},className:`igny8-select-styled h-9 w-full appearance-none rounded-lg border border-gray-300 bg-transparent px-3 py-2 pr-10 text-sm shadow-theme-xs focus:border-brand-300 focus:outline-hidden focus:ring-3 focus:ring-brand-500/10 dark:border-gray-700 dark:bg-gray-900 dark:focus:border-brand-800 ${e.volumeMin||e.volumeMax?"text-gray-800 dark:text-white/90":"text-gray-400 dark:text-gray-400"} ${e.isVolumeDropdownOpen?"border-brand-300 ring-3 ring-brand-500/10 dark:border-brand-800":""}`,children:[a.jsx("span",{className:"block text-left truncate",children:e.volumeMin||e.volumeMax?`Vol: ${e.volumeMin||"Min"} - ${e.volumeMax||"Max"}`:"Volume Range"}),a.jsx("span",{className:"absolute inset-y-0 right-0 flex items-center pr-3 pointer-events-none",children:a.jsx("svg",{className:"h-4 w-4 text-gray-400",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:a.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M19 9l-7 7-7-7"})})})]}),e.isVolumeDropdownOpen&&a.jsx("div",{ref:e.volumeDropdownRef,className:"absolute z-50 left-0 right-0 mt-1 rounded-lg border border-gray-200 bg-white shadow-theme-lg dark:border-gray-800 dark:bg-gray-dark overflow-hidden p-4 min-w-[280px]",children:a.jsxs("div",{className:"space-y-3",children:[a.jsxs("div",{children:[a.jsx(ce,{htmlFor:"vol-min",className:"text-xs mb-1",children:"Min Volume"}),a.jsx(ke,{id:"vol-min",type:"number",placeholder:"Min",value:e.tempVolumeMin,onChange:r=>{const s=r.target.value;e.setTempVolumeMin(s===""?"":parseInt(s)||"")},className:"w-full h-9"})]}),a.jsxs("div",{children:[a.jsx(ce,{htmlFor:"vol-max",className:"text-xs mb-1",children:"Max Volume"}),a.jsx(ke,{id:"vol-max",type:"number",placeholder:"Max",value:e.tempVolumeMax,onChange:r=>{const s=r.target.value;e.setTempVolumeMax(s===""?"":parseInt(s)||"")},className:"w-full h-9"})]}),a.jsxs("div",{className:"flex gap-2 pt-2",children:[a.jsx(de,{size:"sm",variant:"primary",onClick:async()=>{const r=e.tempVolumeMin===""?"":Number(e.tempVolumeMin),s=e.tempVolumeMax===""?"":Number(e.tempVolumeMax);e.setIsVolumeDropdownOpen(!1),e.setVolumeMin(r),e.setVolumeMax(s),e.setCurrentPage(1),setTimeout(()=>{e.loadKeywords()},0)},className:"flex-1",children:"OK"}),a.jsx(de,{size:"sm",variant:"secondary",onClick:()=>{e.setIsVolumeDropdownOpen(!1),e.setTempVolumeMin(e.volumeMin),e.setTempVolumeMax(e.volumeMax)},className:"flex-1",children:"Cancel"})]})]})})]})},{key:"cluster_id",label:"Cluster",type:"select",options:[{value:"",label:"All Clusters"},...e.clusters.map(r=>({value:r.id.toString(),label:r.name}))],className:"w-40"}],headerMetrics:[{label:"Total Keywords",value:0,accentColor:"blue",calculate:r=>r.totalCount||0},{label:"Mapped",value:0,accentColor:"green",calculate:r=>r.keywords.filter(s=>s.cluster_id).length},{label:"Unmapped",value:0,accentColor:"amber",calculate:r=>r.keywords.filter(s=>!s.cluster_id).length},{label:"Total Volume",value:0,accentColor:"purple",calculate:r=>r.keywords.reduce((s,m)=>s+(m.volume||0),0)}],formFields:r=>{var s,m;return[{key:"seed_keyword_id",label:"Seed Keyword",type:"select",placeholder:"Select a seed keyword",value:((s=e.formData.seed_keyword_id)==null?void 0:s.toString())||"",onChange:n=>e.setFormData({...e.formData,seed_keyword_id:n?parseInt(n):0}),required:!0,options:[{value:"",label:"Select a keyword..."},...e.availableSeedKeywords.map(n=>({value:n.id.toString(),label:`${n.keyword} (Vol: ${n.volume.toLocaleString()}, Diff: ${n.difficulty}, ${n.intent})`}))]},{key:"volume_override",label:"Volume Override (optional)",type:"number",placeholder:"Leave empty to use seed keyword volume",value:e.formData.volume_override??"",onChange:n=>e.setFormData({...e.formData,volume_override:n?parseInt(n):null})},{key:"difficulty_override",label:"Difficulty Override (optional)",type:"number",placeholder:"Leave empty to use seed keyword difficulty",value:e.formData.difficulty_override??"",onChange:n=>e.setFormData({...e.formData,difficulty_override:n?parseInt(n):null}),min:0,max:100},{key:"cluster_id",label:"Cluster",type:"select",value:((m=e.formData.cluster_id)==null?void 0:m.toString())||"",onChange:n=>e.setFormData({...e.formData,cluster_id:n?parseInt(n):null}),options:[{value:"",label:"No Cluster"},...r.map(n=>({value:n.id.toString(),label:n.name}))]},{key:"status",label:"Status",type:"select",value:e.formData.status||"pending",onChange:n=>e.setFormData({...e.formData,status:n}),options:[{value:"pending",label:"Pending"},{value:"active",label:"Active"},{value:"archived",label:"Archived"}]}]},exportConfig:{endpoint:"/v1/planner/keywords/export/",filename:"keywords",formats:["csv","json"]},importConfig:{endpoint:"/v1/planner/keywords/import_keywords/",acceptedFormats:[".csv"],maxFileSize:5*1024*1024}}};function Gt(){const e=We(),{activeSite:i}=Ge(),{activeSector:r,loadSectorsForSite:s}=Je(),{pageSize:m}=Pe(),[n,g]=l.useState([]),[k,u]=l.useState([]),[L,w]=l.useState([]),[D,I]=l.useState(!0),[P,F]=l.useState(!1),[S,O]=l.useState(""),[b,_]=l.useState(""),[x,v]=l.useState(""),[T,J]=l.useState(""),[K,Q]=l.useState(""),[N,me]=l.useState(""),[V,pe]=l.useState(""),[q,X]=l.useState(!1),[fe,Y]=l.useState(""),[ye,Z]=l.useState(""),ee=l.useRef(null),te=l.useRef(null),[Ie,ge]=l.useState([]),[U,M]=l.useState(1),[Me,je]=l.useState(1),[re,De]=l.useState(0),[H,Fe]=l.useState("created_at"),[se,Ne]=l.useState("desc"),[Ve,ae]=l.useState(!1),[Ee,W]=l.useState(!1),[oe,we]=l.useState(!1),[be,xe]=l.useState(null),[B,le]=l.useState({seed_keyword_id:0,volume_override:null,difficulty_override:null,cluster_id:null,status:"pending"}),p=wt(),A=l.useRef(!1),ne=xt(),[ve,he]=l.useState([]),R=l.useRef(null),G=l.useRef(-1),E=l.useCallback(t=>{ne&&he(o=>[...o,t])},[ne]);l.useEffect(()=>{i&&s(i.id)},[i,s]),l.useEffect(()=>{(async()=>{if(!i||!r||!i.industry){w([]);return}try{F(!0);const o=await rt({industry:i.industry,sector:r.industry_sector||void 0}),d=new Set(n.map(f=>f.seed_keyword_id)),y=(o.results||[]).filter(f=>!d.has(f.id));w(y)}catch(o){console.error("Failed to load available seed keywords:",o),w([])}finally{F(!1)}})()},[i,r,n]),l.useEffect(()=>{(async()=>{try{const o=await Se({ordering:"name"});u(o.results||[])}catch(o){console.error("Error fetching clusters:",o)}})()},[]);const h=l.useCallback(async()=>{I(!0),ae(!1);try{const t=H?`${se==="desc"?"-":""}${H}`:"-created_at",o={...S&&{search:S},...b&&{status:b},...x&&{cluster_id:x},...T&&{intent:T},...(r==null?void 0:r.id)&&{sector_id:r.id},page:U,page_size:m||10,ordering:t};if(K){const y=parseInt(K),f=lt(y);if(f!==null){const j=nt(f);j&&(o.difficulty_min=j.min,o.difficulty_max=j.max)}}N!==""&&N!==null&&N!==void 0&&(o.volume_min=Number(N)),V!==""&&V!==null&&V!==void 0&&(o.volume_max=Number(V));const d=await Qe(o);g(d.results||[]),De(d.count||0),je(Math.ceil((d.count||0)/m)),setTimeout(()=>{ae(!0),I(!1)},100)}catch(t){console.error("Error loading keywords:",t),e.error(`Failed to load keywords: ${t.message}`),ae(!0),I(!1)}},[U,b,x,T,K,N,V,H,se,S,i,r,m]);l.useEffect(()=>{const t=()=>{h(),(async()=>{try{const y=await Se({ordering:"name"});u(y.results||[])}catch(y){console.error("Error fetching clusters:",y)}})()},o=()=>{h()};return window.addEventListener("siteChanged",t),window.addEventListener("sectorChanged",o),()=>{window.removeEventListener("siteChanged",t),window.removeEventListener("sectorChanged",o)}},[h]),l.useEffect(()=>{const t=o=>{ee.current&&!ee.current.contains(o.target)&&te.current&&!te.current.contains(o.target)&&(X(!1),Y(N),Z(V))};if(q)return document.addEventListener("mousedown",t),()=>{document.removeEventListener("mousedown",t)}},[q,N,V]),l.useEffect(()=>{h()},[h]),l.useEffect(()=>{const t=setTimeout(()=>{M(1)},500);return()=>clearTimeout(t)},[S]),l.useEffect(()=>{const t=U===1;M(1),t&&setTimeout(()=>{h()},0)},[m]);const $e=(t,o)=>{Fe(t||"created_at"),Ne(o),M(1)},{handleExport:Le,handleImportClick:Oe,ImportModal:Te}=jt(()=>{e.success("Import successful","Keywords imported successfully."),h()},t=>{e.error("Import failed",t.message)},i&&r?{site_id:i.id,sector_id:r.id}:void 0),Ke=l.useCallback(async(t,o)=>{if(t==="auto_cluster"){if(o.length===0){e.error("Please select at least one keyword to cluster");return}if(o.length>20){e.error("Maximum 20 keywords allowed for clustering");return}const d=o.map(c=>parseInt(c)),y=r==null?void 0:r.id,f=n.filter(c=>d.includes(c.id)),j={ids:d,keyword_count:d.length,keyword_names:f.map(c=>c.keyword),sector_id:y};E({timestamp:new Date().toISOString(),type:"request",action:"auto_cluster (Bulk Action)",data:j});try{const c=await Xe(d,y);if(c&&c.success===!1){const C=c.error||"Failed to cluster keywords";E({timestamp:new Date().toISOString(),type:"error",action:"auto_cluster (Bulk Action)",data:{error:C,keyword_count:d.length}}),e.error(C);return}if(c&&c.success)c.task_id?(E({timestamp:new Date().toISOString(),type:"success",action:"auto_cluster (Bulk Action)",data:{task_id:c.task_id,message:c.message,keyword_count:d.length}}),A.current=!1,p.openModal(c.task_id,"Auto-Clustering Keywords","ai-auto-cluster-01")):(E({timestamp:new Date().toISOString(),type:"success",action:"auto_cluster (Bulk Action)",data:{clusters_created:c.clusters_created||0,keywords_updated:c.keywords_updated||0,keyword_count:d.length,message:c.message}}),e.success(`Clustering complete: ${c.clusters_created||0} clusters created, ${c.keywords_updated||0} keywords updated`),A.current||(A.current=!0,h()));else{const C=(c==null?void 0:c.error)||"Unexpected response format";E({timestamp:new Date().toISOString(),type:"error",action:"auto_cluster (Bulk Action)",data:{error:C,keyword_count:d.length}}),e.error(C)}}catch(c){let C="Failed to cluster keywords";c.message&&(C=c.message.replace(/^API Error \(\d+\): [^-]+ - /,"").trim(),(!C||C===c.message)&&(C=c.message)),E({timestamp:new Date().toISOString(),type:"error",action:"auto_cluster (Bulk Action)",data:{error:C,keyword_count:d.length}}),e.error(C)}}else e.info(`Bulk action "${t}" for ${o.length} items`)},[e,r,h,p,n]);l.useEffect(()=>{var j;if(!p.taskId||!p.isOpen)return;const t=p.progress,o=((j=t.details)==null?void 0:j.phase)||"",d=t.percentage,y=t.message,f=t.status;if(o&&o!==R.current){const c=f==="error"?"error":f==="completed"?"success":"step";E({timestamp:new Date().toISOString(),type:c,action:p.title||"AI Function",stepName:o,percentage:d,data:{step:o,message:y,percentage:d,status:f,details:t.details}}),R.current=o,G.current=d}else if(o&&Math.abs(d-G.current)>=10){const c=f==="error"?"error":f==="completed"?"success":"step";E({timestamp:new Date().toISOString(),type:c,action:p.title||"AI Function",stepName:o,percentage:d,data:{step:o,message:y,percentage:d,status:f,details:t.details}}),G.current=d}else if((f==="error"||f==="completed")&&(o!==R.current||f==="error"&&R.current!=="error"||f==="completed"&&R.current!=="completed")){const c=f==="error"?"error":"success";E({timestamp:new Date().toISOString(),type:c,action:p.title||"AI Function",stepName:o||"Final",percentage:d,data:{step:o||"Final",message:y,percentage:d,status:f,details:t.details}}),R.current=o||f}},[p.progress,p.taskId,p.isOpen,p.title,E]),l.useEffect(()=>{p.isOpen||(R.current=null,G.current=-1),A.current=!1},[p.isOpen,p.taskId]);const ie=l.useCallback(()=>{le({seed_keyword_id:0,volume_override:null,difficulty_override:null,cluster_id:null,status:"pending"}),we(!1),xe(null)},[]),Ae=l.useCallback(async t=>{try{if(!t||t.length===0)throw new Error("No records selected for export");const o=t.join(","),d=`${ue}/v1/planner/keywords/export/?ids=${encodeURIComponent(o)}`,y=await fetch(d,{method:"GET",credentials:"include"});if(!y.ok){const C=await y.text();throw new Error(`Export failed: ${y.statusText} - ${C}`)}const f=await y.blob(),j=window.URL.createObjectURL(f),c=document.createElement("a");c.href=j,c.download="keywords.csv",document.body.appendChild(c),c.click(),document.body.removeChild(c),window.URL.revokeObjectURL(j)}catch(o){throw o}},[]),Re=l.useCallback(async(t,o)=>{try{const d=t.map(y=>parseInt(y));await Ye(d,o),await h()}catch(d){throw d}},[h]),$=l.useMemo(()=>Dt({clusters:k,activeSector:r,availableSeedKeywords:L,formData:B,setFormData:le,searchTerm:S,setSearchTerm:O,statusFilter:b,setStatusFilter:_,intentFilter:T,setIntentFilter:J,difficultyFilter:K,setDifficultyFilter:Q,clusterFilter:x,setClusterFilter:v,volumeMin:N,volumeMax:V,setVolumeMin:me,setVolumeMax:pe,isVolumeDropdownOpen:q,setIsVolumeDropdownOpen:X,tempVolumeMin:fe,tempVolumeMax:ye,setTempVolumeMin:Y,setTempVolumeMax:Z,volumeButtonRef:te,volumeDropdownRef:ee,setCurrentPage:M,loadKeywords:h}),[k,r,L,B,S,b,T,K,x,N,V,q,fe,ye,h,i]),Ue=l.useMemo(()=>$!=null&&$.headerMetrics?$.headerMetrics.map(t=>({label:t.label,value:t.calculate({keywords:n,totalCount:re,clusters:k}),accentColor:t.accentColor})):[],[$==null?void 0:$.headerMetrics,n,re,k]),Be=async()=>{try{if(!i){e.error("Please select an active site first");return}if(oe&&be)await st(be.id,B),e.success("Keyword updated successfully");else{if(!r){e.error("Please select a sector for this site first");return}if(!B.seed_keyword_id){e.error("Please select a seed keyword");return}const t=r.id,o={...B,site_id:i.id,sector_id:t};await at(o),e.success("Keyword attached successfully")}W(!1),ie(),h()}catch(t){e.error(`Failed to save: ${t.message}`)}},ze=l.useCallback(t=>{xe(t),we(!0),le({seed_keyword_id:t.seed_keyword_id,volume_override:t.volume_override||null,difficulty_override:t.difficulty_override||null,cluster_id:t.cluster_id,status:t.status}),W(!0)},[]);return a.jsxs(a.Fragment,{children:[a.jsx(ot,{title:"Keywords",badge:{icon:a.jsx(Ze,{}),color:"green"}}),a.jsx(qe,{columns:$.columns,data:n,loading:D,showContent:Ve,filters:$.filters,filterValues:{search:S,status:b,intent:T,difficulty:K,cluster_id:x,volumeMin:N,volumeMax:V},onFilterChange:(t,o)=>{const d=o==null?"":String(o);t==="search"?O(d):t==="status"?(_(d),M(1)):t==="intent"?(J(d),M(1)):t==="difficulty"?(Q(d),M(1)):t==="cluster_id"&&(v(d),M(1))},onEdit:ze,onCreate:()=>{ie(),W(!0)},createLabel:"Add Keyword",onCreateIcon:a.jsx(vt,{}),onDelete:async t=>{await tt(t),h()},onBulkDelete:async t=>{const o=await et(t);return ge([]),U>1&&n.length<=t.length&&M(1),await h(),o},onBulkExport:Ae,onBulkUpdateStatus:Re,onBulkAction:Ke,getItemDisplayName:t=>t.keyword,onExport:async()=>{try{await Le("csv",{search:S,status:b,cluster_id:x,intent:T,difficulty:K}),e.success("Export successful","Keywords exported successfully.")}catch(t){e.error("Export failed",t.message)}},onExportIcon:a.jsx(He,{}),onImport:Oe,onImportIcon:a.jsx(ht,{}),selectionLabel:"keyword",pagination:{currentPage:U,totalPages:Me,totalCount:re,onPageChange:t=>{M(t)}},selection:{selectedIds:Ie,onSelectionChange:ge},sorting:{sortBy:H,sortDirection:se,onSort:$e},headerMetrics:Ue,onFilterReset:()=>{O(""),_(""),v(""),J(""),Q(""),me(""),pe(""),Y(""),Z(""),X(!1),M(1)}}),a.jsx(it,{isOpen:Ee,onClose:()=>{W(!1),ie()},onSubmit:Be,title:oe?"Edit Keyword":"Add Keyword",submitLabel:oe?"Update":"Create",fields:$.formFields(k)}),a.jsx(Te,{}),a.jsx(bt,{isOpen:p.isOpen,title:p.title,percentage:p.progress.percentage,status:p.progress.status,message:p.progress.message,details:p.progress.details,taskId:p.taskId||void 0,functionId:p.functionId,onClose:()=>{p.closeModal(),p.progress.status==="completed"&&!A.current&&(A.current=!0,h())}}),ne&&ve.length>0&&a.jsxs("div",{className:"mt-6 bg-gray-50 dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 p-4",children:[a.jsxs("div",{className:"flex items-center justify-between mb-3",children:[a.jsx("h3",{className:"text-sm font-semibold text-gray-900 dark:text-gray-100",children:"AI Function Logs"}),a.jsx("button",{onClick:()=>he([]),className:"text-xs text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200",children:"Clear Logs"})]}),a.jsx("div",{className:"space-y-2 max-h-96 overflow-y-auto",children:ve.slice().reverse().map((t,o)=>a.jsxs("div",{className:`p-3 rounded border text-xs font-mono ${t.type==="request"?"bg-blue-50 dark:bg-blue-900/20 border-blue-200 dark:border-blue-800":t.type==="success"?"bg-green-50 dark:bg-green-900/20 border-green-200 dark:border-green-800":t.type==="error"?"bg-red-50 dark:bg-red-900/20 border-red-200 dark:border-red-800":"bg-purple-50 dark:bg-purple-900/20 border-purple-200 dark:border-purple-800"}`,children:[a.jsxs("div",{className:"flex items-center justify-between mb-1",children:[a.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[a.jsxs("span",{className:`font-semibold ${t.type==="request"?"text-blue-700 dark:text-blue-300":t.type==="success"?"text-green-700 dark:text-green-300":t.type==="error"?"text-red-700 dark:text-red-300":"text-purple-700 dark:text-purple-300"}`,children:["[",t.type.toUpperCase(),"]"]}),a.jsx("span",{className:"text-gray-700 dark:text-gray-300",children:t.action}),t.stepName&&a.jsx("span",{className:"text-xs px-2 py-0.5 rounded bg-gray-200 dark:bg-gray-700 text-gray-600 dark:text-gray-400",children:t.stepName}),t.percentage!==void 0&&a.jsxs("span",{className:"text-xs text-gray-500 dark:text-gray-400",children:[t.percentage,"%"]})]}),a.jsx("span",{className:"text-gray-500 dark:text-gray-400",children:new Date(t.timestamp).toLocaleTimeString()})]}),a.jsx("pre",{className:"text-xs text-gray-700 dark:text-gray-300 whitespace-pre-wrap break-words",children:JSON.stringify(t.data,null,2)})]},o))})]})]})}export{Gt as default};