2 lines
13 KiB
JavaScript
2 lines
13 KiB
JavaScript
import{j as l,r}from"./chunk-UIGDSWPH-BhuNDbxn.js";import{u as ve,T as Ce,S as he}from"./TablePageTemplate-BEWe6AkV.js";import{L as X,I as Y,B as Z,u as we,d as Me,i as ke,w as Se,x as ee,y as Ve,z as De,C as Fe,D as je}from"./main-af3pcbZa.js";import{F as Ee}from"./FormModal-DkhE3zPR.js";import{t as Ie,s as _e,d as Ne,a as Te,f as te,b as Le,u as Be,P as Pe}from"./date-Cc7ORwbK.js";import{S as Re}from"./plus-2WF6_FMG.js";import{S as Oe}from"./group-Dnur-I7a.js";import{B as $}from"./Badge-DM3morB7.js";import{g as Ae,a as $e,b as ze}from"./difficulty-j1OGc4r8.js";import{P as Ue}from"./PageHeader-iXTYKDGo.js";import"./SelectDropdown-C8sZwHi_.js";import"./AlertModal-BhtTtzZV.js";import"./index-ju2wdkG8.js";import"./check-circle--AtVWUy0.js";import"./arrow-right-DC7G5FiV.js";import"./pencil-CuC2vg9I.js";import"./angle-left-CYBnq6Pg.js";const Ge=e=>{const m=!e.activeSector;return{columns:[{...Ie,key:"name",label:"Cluster Name",sortable:!0,sortField:"name"},...m?[{..._e,render:(t,a)=>l.jsx($,{color:"info",size:"sm",variant:"light",children:a.sector_name||"-"})}]:[],{key:"keywords_count",label:"Keywords",sortable:!0,sortField:"keywords_count",width:"120px",render:t=>t.toLocaleString()},{key:"ideas_count",label:"Ideas",sortable:!0,sortField:"ideas_count",width:"120px",render:t=>t.toLocaleString()},{key:"volume",label:"Volume",sortable:!0,sortField:"volume",width:"120px",render:t=>t.toLocaleString()},{...Ne,key:"difficulty",label:"Difficulty",sortable:!0,sortField:"difficulty",align:"center",render:t=>{const a=Ae(t),y=typeof a=="number"&&a===5?"solid":typeof a=="number"&&(a===2||a===3||a===4)?"light":typeof a=="number"&&a===1?"solid":"light",D=typeof a=="number"&&a===1||typeof a=="number"&&a===2?"success":typeof a=="number"&&a===3?"warning":typeof a=="number"&&a===4||typeof a=="number"&&a===5?"error":"light";return typeof a=="number"?l.jsx($,{color:D,variant:y,size:"sm",children:a}):a}},{key:"content_count",label:"Content",sortable:!0,sortField:"content_count",width:"120px",render:t=>t.toLocaleString()},{...Te,sortable:!0,sortField:"status",render:t=>l.jsx($,{color:t==="active"?"success":"warning",size:"sm",children:t})},{...Le,sortable:!0,sortField:"created_at",render:t=>te(t)},{key:"description",label:"Description",sortable:!1,defaultVisible:!1,width:"250px",render:t=>l.jsx("span",{className:"text-sm text-gray-600 dark:text-gray-400 truncate block max-w-[250px]",children:t||"-"})},{key:"mapped_pages",label:"Mapped Pages",sortable:!0,sortField:"mapped_pages",defaultVisible:!1,width:"120px",render:t=>t.toLocaleString()},{key:"updated_at",label:"Updated",sortable:!0,sortField:"updated_at",defaultVisible:!1,render:t=>te(t)}],filters:[{key:"search",label:"Search",type:"text",placeholder:"Search clusters..."},{key:"status",label:"Status",type:"select",options:[{value:"",label:"All Status"},{value:"active",label:"Active"},{value:"archived",label:"Archived"}]},{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:()=>l.jsxs("div",{className:"relative flex-1 min-w-[140px]",children:[l.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:[l.jsx("span",{className:"block text-left truncate",children:e.volumeMin||e.volumeMax?`Vol: ${e.volumeMin||"Min"} - ${e.volumeMax||"Max"}`:"Volume Range"}),l.jsx("span",{className:"absolute inset-y-0 right-0 flex items-center pr-3 pointer-events-none",children:l.jsx("svg",{className:"h-4 w-4 text-gray-400",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:l.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M19 9l-7 7-7-7"})})})]}),e.isVolumeDropdownOpen&&l.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:l.jsxs("div",{className:"space-y-3",children:[l.jsxs("div",{children:[l.jsx(X,{htmlFor:"vol-min",className:"text-xs mb-1",children:"Min Volume"}),l.jsx(Y,{id:"vol-min",type:"number",placeholder:"Min",value:e.tempVolumeMin,onChange:t=>{const a=t.target.value;e.setTempVolumeMin(a===""?"":parseInt(a)||"")},className:"w-full h-9"})]}),l.jsxs("div",{children:[l.jsx(X,{htmlFor:"vol-max",className:"text-xs mb-1",children:"Max Volume"}),l.jsx(Y,{id:"vol-max",type:"number",placeholder:"Max",value:e.tempVolumeMax,onChange:t=>{const a=t.target.value;e.setTempVolumeMax(a===""?"":parseInt(a)||"")},className:"w-full h-9"})]}),l.jsxs("div",{className:"flex gap-2 pt-2",children:[l.jsx(Z,{size:"sm",variant:"primary",onClick:async()=>{const t=e.tempVolumeMin===""?"":Number(e.tempVolumeMin),a=e.tempVolumeMax===""?"":Number(e.tempVolumeMax);e.setIsVolumeDropdownOpen(!1),e.setVolumeMin(t),e.setVolumeMax(a),e.setCurrentPage(1),setTimeout(()=>{e.loadClusters()},0)},className:"flex-1",children:"OK"}),l.jsx(Z,{size:"sm",variant:"secondary",onClick:()=>{e.setIsVolumeDropdownOpen(!1),e.setTempVolumeMin(e.volumeMin),e.setTempVolumeMax(e.volumeMax)},className:"flex-1",children:"Cancel"})]})]})})]})}],formFields:()=>[{key:"name",label:"Cluster Name",type:"text",placeholder:"Enter cluster name",required:!0,value:e.formData.name||"",onChange:t=>e.setFormData({...e.formData,name:t})},{key:"description",label:"Description",type:"textarea",placeholder:"Enter cluster description",value:e.formData.description||"",onChange:t=>e.setFormData({...e.formData,description:t})},{key:"status",label:"Status",type:"select",value:e.formData.status||"active",onChange:t=>e.setFormData({...e.formData,status:t}),options:[{value:"active",label:"Active"},{value:"archived",label:"Archived"}]}],headerMetrics:[{label:"Total Clusters",value:0,accentColor:"blue",calculate:t=>t.totalCount||0},{label:"Active",value:0,accentColor:"green",calculate:t=>t.clusters.filter(a=>a.status==="active").length},{label:"Total Keywords",value:0,accentColor:"amber",calculate:t=>t.clusters.reduce((a,y)=>a+(y.keywords_count||0),0)},{label:"Total Volume",value:0,accentColor:"purple",calculate:t=>t.clusters.reduce((a,y)=>a+(y.volume||0),0)}]}};function it(){const e=we(),{activeSector:m}=Me(),{pageSize:t}=ve(),[a,y]=r.useState([]),[D,F]=r.useState(!0),[x,j]=r.useState(""),[v,E]=r.useState(""),[C,I]=r.useState(""),[p,z]=r.useState(""),[f,U]=r.useState(""),[M,G]=r.useState(!1),[K,se]=r.useState(""),[H,ae]=r.useState(""),_=r.useRef(null),N=r.useRef(null),[re,q]=r.useState([]),[h,g]=r.useState(1),[oe,le]=r.useState(1),[T,ne]=r.useState(0),[k,ie]=r.useState("name"),[L,ue]=r.useState("asc"),[ce,B]=r.useState(!1),[de,S]=r.useState(!1),[P,W]=r.useState(!1),[J,Q]=r.useState(null),[V,R]=r.useState({name:"",description:"",status:"active"}),c=Be(),w=r.useRef(!1),u=r.useCallback(async()=>{F(!0),B(!1);try{const s=k?`${L==="desc"?"-":""}${k}`:"name",o={...x&&{search:x},...v&&{status:v},...(m==null?void 0:m.id)&&{sector_id:m.id},page:h,page_size:t,ordering:s};if(C){const i=parseInt(C),b=$e(i);if(b!==null){const A=ze(b);A&&(o.difficulty_min=A.min,o.difficulty_max=A.max)}}p!==""&&p!==null&&p!==void 0&&(o.volume_min=Number(p)),f!==""&&f!==null&&f!==void 0&&(o.volume_max=Number(f));const n=await ke(o);y(n.results||[]),ne(n.count||0),le(Math.ceil((n.count||0)/t)),setTimeout(()=>{B(!0),F(!1)},100)}catch(s){console.error("Error loading clusters:",s),e.error(`Failed to load clusters: ${s.message}`),B(!0),F(!1)}},[h,v,k,L,x,C,p,f,m,t]);r.useEffect(()=>{u()},[u]),r.useEffect(()=>{const s=()=>{u()},o=()=>{u()};return window.addEventListener("siteChanged",s),window.addEventListener("sectorChanged",o),()=>{window.removeEventListener("siteChanged",s),window.removeEventListener("sectorChanged",o)}},[u]),r.useEffect(()=>{const s=setTimeout(()=>{h===1?u():g(1)},500);return()=>clearTimeout(s)},[x,h,u]),r.useEffect(()=>{g(1)},[t]);const me=(s,o)=>{ie(s||"name"),ue(o),g(1)},pe=r.useCallback(async(s,o)=>{try{const n=s.map(i=>parseInt(i));await Se(n,o),await u()}catch(n){throw n}},[u]),fe=r.useCallback(async s=>{try{if(!s||s.length===0)throw new Error("No records selected for export");e.info("Export functionality coming soon")}catch(o){throw o}},[]),ge=r.useCallback(async(s,o)=>{if(s==="generate_ideas")try{const n=await ee([o.id]);n.success&&n.task_id?c.openModal(n.task_id,"Generating Ideas","ai-generate-ideas-01-desktop"):n.success&&n.ideas_created?(e.success(n.message||"Ideas generated successfully"),await u()):e.error(n.error||"Failed to generate ideas")}catch(n){e.error(`Failed to generate ideas: ${n.message}`)}},[e,c,u]),be=r.useCallback(async(s,o)=>{if(s==="auto_generate_ideas"){if(o.length===0){e.error("Please select at least one cluster to generate ideas");return}if(o.length>5){e.error("Maximum 5 clusters allowed for idea generation");return}try{const n=o.map(b=>parseInt(b)),i=await ee(n);if(i&&i.success===!1){const b=i.error||"Failed to generate ideas";e.error(b);return}if(i&&i.success)i.task_id?(w.current=!1,c.openModal(i.task_id,"Generating Content Ideas","ai-generate-ideas-01-desktop")):(e.success(`Ideas generation complete: ${i.ideas_created||0} ideas created`),w.current||(w.current=!0,u()));else{const b=(i==null?void 0:i.error)||"Unexpected response format";e.error(b)}}catch(n){let i="Failed to generate ideas";n.message&&(i=n.message.replace(/^API Error \(\d+\): [^-]+ - /,"").trim(),(!i||i===n.message)&&(i=n.message)),e.error(i)}}else e.info(`Bulk action "${s}" for ${o.length} items`)},[e,u,c]);r.useEffect(()=>{const s=o=>{_.current&&!_.current.contains(o.target)&&N.current&&!N.current.contains(o.target)&&G(!1)};return M&&document.addEventListener("mousedown",s),()=>{document.removeEventListener("mousedown",s)}},[M]);const d=r.useMemo(()=>Ge({activeSector:m,formData:V,setFormData:R,searchTerm:x,setSearchTerm:j,statusFilter:v,setStatusFilter:E,difficultyFilter:C,setDifficultyFilter:I,volumeMin:p,volumeMax:f,setVolumeMin:z,setVolumeMax:U,isVolumeDropdownOpen:M,setIsVolumeDropdownOpen:G,tempVolumeMin:K,tempVolumeMax:H,setTempVolumeMin:se,setTempVolumeMax:ae,volumeButtonRef:N,volumeDropdownRef:_,setCurrentPage:g,loadClusters:u}),[m,V,x,v,C,p,f,M,K,H,u]),ye=r.useMemo(()=>d!=null&&d.headerMetrics?d.headerMetrics.map(s=>({label:s.label,value:s.calculate({clusters:a,totalCount:T}),accentColor:s.accentColor})):[],[d==null?void 0:d.headerMetrics,a,T]),O=r.useCallback(()=>{R({name:"",description:"",status:"active"}),W(!1),Q(null)},[]),xe=async()=>{try{P&&J?(await Fe(J.id,V),e.success("Cluster updated successfully")):(await je(V),e.success("Cluster created successfully")),S(!1),O(),u()}catch(s){e.error(`Failed to save: ${s.message}`)}};return l.jsxs(l.Fragment,{children:[l.jsx(Ue,{title:"Keyword Clusters",badge:{icon:l.jsx(Oe,{}),color:"purple"}}),l.jsx(Ce,{columns:d.columns,data:a,loading:D,showContent:ce,filters:d.filters,filterValues:{search:x,status:v,difficulty:C,volumeMin:p,volumeMax:f},onFilterChange:(s,o)=>{const n=o==null?"":String(o);s==="search"?j(n):s==="status"?E(n):s==="difficulty"&&I(n),g(1)},onEdit:s=>{Q(s),R({name:s.name||"",description:s.description||"",status:s.status||"active"}),W(!0),S(!0)},onCreate:()=>{O(),S(!0)},createLabel:"Create Cluster",onCreateIcon:l.jsx(Re,{}),onDelete:async s=>{await De(s),u()},onBulkDelete:async s=>{const o=await Ve(s);return q([]),h>1&&a.length<=s.length&&g(1),await u(),o},onBulkExport:fe,onBulkUpdateStatus:pe,onBulkAction:be,onRowAction:ge,getItemDisplayName:s=>s.name,onExport:async()=>{e.info("Export functionality coming soon")},onExportIcon:l.jsx(he,{}),selectionLabel:"cluster",pagination:{currentPage:h,totalPages:oe,totalCount:T,onPageChange:g},selection:{selectedIds:re,onSelectionChange:q},sorting:{sortBy:k,sortDirection:L,onSort:me},headerMetrics:ye,onFilterReset:()=>{j(""),E(""),I(""),z(""),U(""),g(1)}}),l.jsx(Pe,{isOpen:c.isOpen,title:c.title,percentage:c.progress.percentage,status:c.progress.status,message:c.progress.message,details:c.progress.details,taskId:c.taskId||void 0,functionId:c.functionId,stepLogs:c.stepLogs,onClose:()=>{c.closeModal(),c.progress.status==="completed"&&!w.current&&(w.current=!0,u())}}),l.jsx(Ee,{isOpen:de,onClose:()=>{S(!1),O()},onSubmit:xe,title:P?"Edit Cluster":"Add Cluster",submitLabel:P?"Update":"Create",fields:d.formFields()})]})}export{it as default};
|