2 lines
34 KiB
JavaScript
2 lines
34 KiB
JavaScript
import{_ as De,v as fe,t as ge,a as Ae}from"./AudienceSegmentPicker.vue_vue_type_script_setup_true_lang-df0f16a2.js";import{_ as pe,u as de}from"./useBaseTable-09dec183.js";import{_ as Le}from"./button.vue_vue_type_style_index_0_lang-485aa400.js";import{g as Ue,a as Be,p as je,s as qe,b as Oe,c as Me,d as Ne,e as Ee,f as me,r as Fe,h as Ke,i as Ve,j as be,u as he,k as Je}from"./pushNotification-7f573de1.js";import{t as ve}from"./useDataTime-c34f53fe.js";import{M as ye,_ as He}from"./index-21b3e11b.js";import{I as oe,_ as ze}from"./index-f7d24d7c.js";import{P as Ge}from"./index-8c21a425.js";import{d as _e,g as c,h as E,v as Qe,J as We,o as y,c as S,a as e,b as s,j as A,w as l,e as u,t as o,p as xe,k as T,H as ce,D as m,K as Xe,i as ie,F as ke,r as Ye}from"./index-5a216054.js";import{_ as we}from"./BasicModal.vue_vue_type_style_index_0_lang-12600cfe.js";import{I as re}from"./Icon-b61699b8.js";import{B as $e}from"./index-35a2fbcb.js";import{D as Ie,_ as Se}from"./index-d3e1774f.js";import{S as Pe}from"./index-efc9438a.js";import{T as ue}from"./isSymbol-67342ebb.js";import{_ as Ze}from"./BasicInput.vue_vue_type_style_index_0_lang-1dcca595.js";import{S as et,a as tt}from"./index-14d22686.js";import{C as st}from"./index-fe5d35f1.js";import{_ as at,T as lt}from"./index-a94d8106.js";import"./dayjs-4b62fb41.js";import"./updateLocale-67e6a89b.js";import"./shallowequal-9390c690.js";import"./_plugin-vue_export-helper-bf156267.js";import"./vnode-4ae36afb.js";import"./useState-aaca7c53.js";import"./useMemo-f3fe2319.js";import"./FormItemContext-c093a4c8.js";import"./omit-0e04d816.js";import"./index-bc659f42.js";import"./lodash-724580df.js";import"./BaseSwitch.vue_vue_type_script_setup_true_lang-5d13f90f.js";import"./index-7e28a3d1.js";import"./Badge-f954f9ce.js";import"./isNumeric-3f69e2aa.js";import"./index-16772af6.js";import"./index-70ec4858.js";import"./index-89aa8d2e.js";import"./DialogWrap-104be95a.js";import"./pickAttrs-ca601ed4.js";import"./styleChecker-559f6f42.js";import"./SearchOutlined-4a9dd4f9.js";import"./isPlainObject-3c9a77e7.js";import"./useRefs-88e72f09.js";import"./usePrice-bc935b83.js";import"./toArray-6764992d.js";import"./index-99d6fd3f.js";import"./isMobile-e2e89480.js";import"./index-8a5836b4.js";import"./css-aae66f86.js";import"./_flatRest-65586b5d.js";const nt=[{title:"ردیف",dataIndex:"id",key:"id",filterable:!1,customRender:a=>{var O;const r=((O=a==null?void 0:a.record)==null?void 0:O.record)??(a==null?void 0:a.record)??a;return(typeof(r==null?void 0:r.index)=="number"?r.index:0)+1}},{title:"نام",dataIndex:"first_name",key:"first_name",filterable:!0},{title:"نام خانوادگی",dataIndex:"last_name",key:"last_name",filterable:!0},{title:"شماره همراه",dataIndex:"phone",key:"phone",filterable:!0},{title:"اعلان فعال",dataIndex:"has_push",key:"has_push",filterField:"has_push",type:"Select",filterable:!0,filterComponentProps:{options:[{label:"فعال",value:"1"},{label:"غیرفعال",value:"0"}]},customRender:a=>{var D;const r=((D=a==null?void 0:a.record)==null?void 0:D.record)??(a==null?void 0:a.record)??a;return r!=null&&r.has_push?"✓ فعال":"—"}},{title:"زمان ثبتنام",dataIndex:"created_at",key:"created_at",type:"Date",filterable:!0,customRender:a=>{var D;const r=((D=a==null?void 0:a.record)==null?void 0:D.record)??(a==null?void 0:a.record)??a;return r!=null&&r.created_at?ve(r.created_at):"-"}}],ot={class:"space-y-4"},it={class:"grid grid-cols-1 xl:grid-cols-3 gap-4"},rt={class:"xl:col-span-2 space-y-4"},ut=e("div",{class:"mb-1 text-sm text-gray-600"},"عنوان نوتیفیکیشن *",-1),dt=e("div",{class:"mb-1 text-sm text-gray-600"},"متن نوتیفیکیشن *",-1),ct=e("div",{class:"mb-1 text-sm text-gray-600"},"لینک (اختیاری)",-1),vt={class:"flex flex-wrap gap-2"},_t={key:0,class:"rounded-lg border border-blue-200 bg-blue-50/60 p-4 space-y-3"},mt={class:"flex items-center justify-between gap-2"},pt=e("div",{class:"font-semibold text-gray-800"},"روند ارسال نوتیفیکیشن",-1),ft={class:"grid grid-cols-2 sm:grid-cols-4 gap-2 text-sm"},gt={class:"bg-white rounded-md border border-gray-100 px-3 py-2"},bt=e("div",{class:"text-gray-500 text-xs"},"پیشرفت",-1),ht={class:"font-semibold"},yt={class:"bg-white rounded-md border border-gray-100 px-3 py-2"},xt=e("div",{class:"text-gray-500 text-xs"},"موفق",-1),kt={class:"font-semibold text-green-700"},wt={class:"bg-white rounded-md border border-gray-100 px-3 py-2"},$t=e("div",{class:"text-gray-500 text-xs"},"ناموفق",-1),It={class:"font-semibold text-red-600"},St={class:"bg-white rounded-md border border-gray-100 px-3 py-2"},Pt=e("div",{class:"text-gray-500 text-xs"},"درصد",-1),Ct={class:"font-semibold"},Rt={key:0,class:"text-sm text-gray-600 m-0"},Tt={key:1,class:"text-sm text-red-600 m-0"},Dt={class:"bg-gray-50 rounded-lg p-4 border border-gray-200 space-y-2 text-sm"},At=e("div",{class:"font-semibold text-gray-700 mb-2"},"آمار اعلانها",-1),Lt={class:"grid grid-cols-1 gap-2"},Ut={class:"flex justify-between items-center bg-white rounded-md px-3 py-2 border border-gray-100"},Bt=e("span",{class:"text-gray-600"},"کاربران با اعلان فعال",-1),jt={class:"text-green-700"},qt={class:"flex justify-between items-center bg-white rounded-md px-3 py-2 border border-gray-100"},Ot=e("span",{class:"text-gray-600"},"کل اشتراک push",-1),Mt=e("div",{class:"font-semibold text-gray-700 mb-2 pt-2"},"راهنما",-1),Nt=e("p",{class:"text-gray-600 leading-6 m-0"}," فقط کاربرانی که اعلان را در اپ فعال کردهاند، نوتیف دریافت میکنند. ",-1),Et=e("p",{class:"text-gray-600 leading-6 m-0"}," از فیلتر «اعلان فعال» میتوانید فقط کاربران با اعلان روشن یا خاموش را ببینید. ",-1),Ft=e("p",{class:"text-gray-600 leading-6 m-0"}," برای ارسال محدود، کاربران را از جدول پایین انتخاب کنید. ",-1),Kt={key:0,class:"pt-2 border-t border-gray-200"},Vt=e("div",{class:"font-medium mb-1"},"آخرین ارسال:",-1),Jt={key:0,class:"text-amber-700 mb-1"},Ht={key:1,class:"text-amber-700 mb-1"},zt={key:2},Gt={key:3},Qt={key:4},Wt={key:5},Xt={key:6},Yt={key:7},Zt={class:"border-t border-gray-200 pt-4"},es=e("div",{class:"mb-2 text-sm text-gray-600"}," کاربران را جستجو کنید و برای ارسال محدود، آنها را انتخاب کنید. ",-1),ts=_e({__name:"PushSendPanel",emits:["sent"],setup(a,{emit:r}){const{TextArea:D}=oe,[O]=de(),f=c({title:"ماچارتا",body:"",url:"/"}),C=c(!1),g=c([]),b=c(null),t=c(null),j=c({uniqueUsers:0,totalSubscriptions:0}),p=c(!1),q=c({segments:[],inactiveDays:7,subscriberInactiveDays:3}),M=c(!1),N=c("");let K=null;const Y=E(()=>({selectedRowKeys:g.value,onChange:n=>{g.value=n.map(String)},preserveSelectedRowKeys:!0})),k=E(()=>{var i;const n=(i=t.value)==null?void 0:i.status;return n==="queued"||n==="running"}),H=E(()=>t.value?Math.max(t.value.total,t.value.processed):0),z=E(()=>{var n;switch((n=t.value)==null?void 0:n.status){case"queued":return"در صف";case"running":return"در حال ارسال";case"completed":return"تمام شد";case"failed":return"ناموفق";default:return""}}),G=E(()=>{var n;switch((n=t.value)==null?void 0:n.status){case"queued":return"bg-amber-100 text-amber-800";case"running":return"bg-blue-100 text-blue-800";case"completed":return"bg-green-100 text-green-800";case"failed":return"bg-red-100 text-red-700";default:return"bg-gray-100 text-gray-600"}}),te=E(()=>{var n,i;return((n=t.value)==null?void 0:n.status)==="failed"?"exception":((i=t.value)==null?void 0:i.status)==="completed"?"success":"active"}),R=E(()=>{var n,i;return((n=t.value)==null?void 0:n.status)==="failed"?"#ef4444":((i=t.value)==null?void 0:i.status)==="completed"?"#16a34a":"#2563eb"});function w(n){return Number(n||0).toLocaleString("fa-IR")}function L(){K&&(clearInterval(K),K=null)}async function $(n){var i,P;try{const _=await Ne(n);t.value=_,(_.status==="completed"||_.status==="failed")&&(L(),C.value=!1,b.value&&(b.value={...b.value,queued:!1,sent:_.sent,failed:_.failed,subscribed:_.total}),_.status==="completed"?(m.success(`ارسال تمام شد (${w(_.sent)} موفق، ${w(_.failed)} ناموفق)`),r("sent"),Q()):m.error(_.error||"ارسال نوتیفیکیشن ناموفق بود"))}catch(_){L(),C.value=!1,m.error(((P=(i=_==null?void 0:_.response)==null?void 0:i.data)==null?void 0:P.error)||_.message||"خطا در دریافت وضعیت ارسال")}}function U(n){L(),$(n),K=setInterval(()=>{$(n)},1e3)}async function Q(){p.value=!0;try{j.value=await Be()}finally{p.value=!1}}Qe(()=>{Q()}),We(()=>{L()});const se=c({columns:nt,api:Ue,defaultPageLimit:20,height:"45vh"}),Z=E(()=>{var n,i;return!!((n=f.value.title)!=null&&n.trim()&&((i=f.value.body)!=null&&i.trim()))});function V(){var n,i;return(n=f.value.title)!=null&&n.trim()?(i=f.value.body)!=null&&i.trim()?!0:(m.error("لطفاً متن نوتیفیکیشن را وارد کنید"),!1):(m.error("لطفاً عنوان نوتیفیکیشن را وارد کنید"),!1)}async function ae(n){if(!V())return;if(n==="selected"&&!g.value.length){m.warning("حداقل یک کاربر انتخاب کنید");return}if(k.value){m.warning("یک ارسال در حال انجام است. لطفاً صبر کنید.");return}const i=n==="selected"?`آیا از ارسال نوتیفیکیشن به ${g.value.length} کاربر انتخابشده مطمئن هستید؟`:"آیا از ارسال نوتیفیکیشن به همه کاربران مطمئن هستید؟";ye.confirm({title:"تأیید ارسال نوتیفیکیشن",content:i,okText:"بله، ارسال کن",cancelText:"انصراف",centered:!0,onOk:async()=>{var P,_,x;C.value=!0;try{const h={title:f.value.title.trim(),body:f.value.body.trim(),url:((P=f.value.url)==null?void 0:P.trim())||"/"},B=n==="selected"?await Oe(h.title,h.body,g.value,h.url):await Me(h.title,h.body,h.url);if(b.value=B,B.queued&&B.jobId){t.value={jobId:B.jobId,status:"queued",kind:n==="selected"?"selected":"broadcast",title:h.title,total:B.subscribed??0,sent:0,failed:0,processed:0,percent:0,message:B.message||"در صف ارسال",createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()},m.success(B.message||"نوتیفیکیشن در صف ارسال قرار گرفت؛ در صورت قطع از همان نقطه ادامه مییابد"),U(B.jobId),n==="all"&&(f.value.body="");return}m.success(`نوتیفیکیشن ارسال شد (${B.sent} موفق، ${B.failed} ناموفق)`),r("sent"),Q(),C.value=!1}catch(h){C.value=!1,m.error(((x=(_=h==null?void 0:h.response)==null?void 0:_.data)==null?void 0:x.error)||h.message||"خطا در ارسال نوتیفیکیشن")}}})}function le(){return ae("all")}function ne(){return ae("selected")}async function v(){var P,_;const n={...q.value,includeUserIds:g.value},i=fe(n);if(i){m.warning(i);return}M.value=!0,N.value="";try{const x=await je(ge(n)),h=g.value.length>0?` (شامل ${w(g.value.length)} کاربر اضافه از جدول)`:"";N.value=`کاربران دسته: ${w(x.userCount)} — اشتراک push: ${w(x.pushSubscriptions)}${h}`}catch(x){m.error(((_=(P=x==null?void 0:x.response)==null?void 0:P.data)==null?void 0:_.error)||x.message||"خطا در پیشنمایش")}finally{M.value=!1}}async function d(){if(!V())return;const n={...q.value,includeUserIds:g.value},i=fe(n);if(i){m.warning(i);return}if(k.value){m.warning("یک ارسال در حال انجام است. لطفاً صبر کنید.");return}const P=q.value.segments.length,_=g.value.length,x=_>0?`ارسال به ${P} دسته (OR) بهعلاوه ${_} کاربر انتخابشده؟`:`ارسال به ${P} دسته مخاطب (اتحاد / OR)؟`;ye.confirm({title:"تأیید ارسال نوتیفیکیشن",content:x,okText:"بله، ارسال کن",cancelText:"انصراف",centered:!0,onOk:async()=>{var h,B,X;C.value=!0;try{const J={title:f.value.title.trim(),body:f.value.body.trim(),url:((h=f.value.url)==null?void 0:h.trim())||"/"},F=await qe(J.title,J.body,ge(n),J.url);if(b.value=F,F.queued&&F.jobId){t.value={jobId:F.jobId,status:"queued",kind:"segment",title:J.title,total:F.subscribed??0,sent:0,failed:0,processed:0,percent:0,message:F.message||"در صف ارسال",createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()},m.success(F.message||"نوتیفیکیشن در صف ارسال قرار گرفت؛ در صورت قطع از همان نقطه ادامه مییابد"),U(F.jobId);return}m.success(`نوتیفیکیشن ارسال شد (${F.sent} موفق، ${F.failed} ناموفق)`),r("sent"),Q(),C.value=!1}catch(J){C.value=!1,m.error(((X=(B=J==null?void 0:J.response)==null?void 0:B.data)==null?void 0:X.error)||J.message||"خطا در ارسال نوتیفیکیشن")}}})}return(n,i)=>{const P=Le,_=pe;return y(),S("div",ot,[e("div",it,[e("div",rt,[e("div",null,[ut,s(A(oe),{value:f.value.title,"onUpdate:value":i[0]||(i[0]=x=>f.value.title=x),placeholder:"مثلاً: اطلاعیه مهم"},null,8,["value"])]),e("div",null,[dt,s(A(D),{value:f.value.body,"onUpdate:value":i[1]||(i[1]=x=>f.value.body=x),placeholder:"متن دلخواه برای کاربران",rows:4,maxlength:500,"show-count":""},null,8,["value"])]),e("div",null,[ct,s(A(oe),{value:f.value.url,"onUpdate:value":i[2]||(i[2]=x=>f.value.url=x),placeholder:"/shop یا /matches"},null,8,["value"])]),e("div",vt,[s(P,{type:"primary",loading:C.value,disabled:!Z.value||k.value,onClick:le},{default:l(()=>[u(" ارسال به همه کاربران ")]),_:1},8,["loading","disabled"]),s(P,{type:"primary",ghost:"",loading:C.value,disabled:!Z.value||!g.value.length||k.value,onClick:ne},{default:l(()=>[u(" ارسال به انتخابشدهها ("+o(g.value.length)+") ",1)]),_:1},8,["loading","disabled"])]),s(De,{modelValue:q.value,"onUpdate:modelValue":i[3]||(i[3]=x=>q.value=x),"include-user-count":g.value.length,"preview-loading":M.value,sending:C.value,disabled:!Z.value||k.value,"preview-text":N.value,onPreview:v,onSend:d},null,8,["modelValue","include-user-count","preview-loading","sending","disabled","preview-text"]),t.value?(y(),S("div",_t,[e("div",mt,[pt,e("span",{class:xe(["text-xs px-2 py-1 rounded-full",G.value])},o(z.value),3)]),s(A(Ge),{percent:t.value.percent,status:te.value,"stroke-color":R.value},null,8,["percent","status","stroke-color"]),e("div",ft,[e("div",gt,[bt,e("div",ht,o(w(t.value.processed))+" / "+o(w(H.value)),1)]),e("div",yt,[xt,e("div",kt,o(w(t.value.sent)),1)]),e("div",wt,[$t,e("div",It,o(w(t.value.failed)),1)]),e("div",St,[Pt,e("div",Ct,o(t.value.percent)+"٪",1)])]),t.value.message?(y(),S("p",Rt,o(t.value.message),1)):T("",!0),t.value.error?(y(),S("p",Tt,o(t.value.error),1)):T("",!0)])):T("",!0)]),e("div",Dt,[At,e("div",Lt,[e("div",Ut,[Bt,e("strong",jt,o(j.value.uniqueUsers)+" نفر",1)]),e("div",qt,[Ot,e("strong",null,o(j.value.totalSubscriptions),1)])]),Mt,Nt,Et,Ft,b.value?(y(),S("div",Kt,[Vt,t.value&&k.value?(y(),S("div",Jt,"در حال ارسال…")):b.value.queued&&!t.value?(y(),S("div",Ht," در صف ارسال (دستهای) ")):T("",!0),t.value?(y(),S("div",zt,[u(" موفق: "),e("strong",null,o(w(t.value.sent)),1)])):T("",!0),t.value?(y(),S("div",Gt,[u(" ناموفق: "),e("strong",null,o(w(t.value.failed)),1)])):b.value.queued?T("",!0):(y(),S("div",Qt,[u(" موفق: "),e("strong",null,o(b.value.sent),1)])),!t.value&&!b.value.queued?(y(),S("div",Wt,[u(" ناموفق: "),e("strong",null,o(b.value.failed),1)])):T("",!0),b.value.targeted!=null?(y(),S("div",Xt,[u(" انتخابشده: "),e("strong",null,o(b.value.targeted),1)])):T("",!0),b.value.subscribed!=null?(y(),S("div",Yt,[u(" دارای اشتراک push: "),e("strong",null,o(b.value.subscribed),1)])):T("",!0)])):T("",!0)])]),e("div",Zt,[es,s(_,ce(se.value,{"row-selection":Y.value,onRegister:A(O)}),null,16,["row-selection","onRegister"])])])}}}),Ce={custom:"همه کاربران",custom_selected:"کاربران انتخابشده",story:"قصه جدید",book:"کتاب صوتی",product:"محصول جدید",match:"مسابقه جدید"},Re={pending:"در صف",sending:"در حال ارسال",completed:"تمام شده",failed:"متوقف / شکست"},ss={pending:"text-amber-700",sending:"text-blue-700",completed:"text-green-700",failed:"text-red-600"},as=[{title:"ردیف",dataIndex:"id",key:"row_index",filterable:!1,customRender:a=>a.index+1},{title:"شناسه",dataIndex:"id",key:"id",filterable:!1},{title:"عنوان",dataIndex:"title",key:"title",filterable:!1,customRender:a=>{const r=a.record.title||"";return r.length>40?`${r.slice(0,40)}...`:r}},{title:"نوع ارسال",dataIndex:"type",key:"type",filterable:!1,customRender:a=>Ce[a.record.type]||a.record.type},{title:"وضعیت",dataIndex:"status",key:"status",filterable:!1,customRender:a=>{const r=a.record.status||"completed";return Xe("span",{class:ss[r]||"text-gray-700"},Re[r]||r)}},{title:"موفق",dataIndex:"sent_count",key:"sent_count",filterable:!1,customRender:a=>a.record.sent_count??0},{title:"ناموفق",dataIndex:"failed_count",key:"failed_count",filterable:!1,customRender:a=>a.record.failed_count??0},{title:"تاریخ",dataIndex:"created_at",key:"created_at",filterable:!1,customRender:a=>a.record.created_at?ve(a.record.created_at):"-"},{title:"عملیات",dataIndex:"action",key:"action",slot:"action",filterable:!1,align:"center"}];function ls(a){return Ce[a]||a}function ns(a){return Re[a]||a}const os={class:"gap-2 flex justify-center"},is=e("span",null,"جزئیات ارسال",-1),rs={class:"flex justify-end gap-2 w-full flex-wrap"},us={class:"whitespace-pre-wrap text-sm"},ds={class:"text-red-600"},cs={class:"grid grid-cols-1 sm:grid-cols-4 gap-3 mb-4"},vs={class:"rounded-lg border border-green-200 bg-green-50 p-4 text-center"},_s={class:"text-2xl font-bold text-green-600"},ms=e("div",{class:"text-sm text-gray-600 mt-1"},"ارسال موفق",-1),ps={class:"rounded-lg border border-red-200 bg-red-50 p-4 text-center"},fs={class:"text-2xl font-bold text-red-600"},gs=e("div",{class:"text-sm text-gray-600 mt-1"},"ارسال ناموفق",-1),bs={class:"rounded-lg border border-amber-200 bg-amber-50 p-4 text-center"},hs={class:"text-2xl font-bold text-amber-700"},ys=e("div",{class:"text-sm text-gray-600 mt-1"},"قابل ارسال مجدد",-1),xs={class:"rounded-lg border border-gray-200 bg-gray-50 p-4 text-center"},ks={class:"text-2xl font-bold text-gray-700"},ws=e("div",{class:"text-sm text-gray-600 mt-1"},"مجموع تلاشها",-1),$s={key:0,class:"mb-3 rounded-md border border-amber-200 bg-amber-50 px-3 py-2 text-sm text-amber-800"},Is={key:1,class:"mb-3 rounded-md border border-blue-200 bg-blue-50 px-3 py-2 text-sm text-blue-800"},Ss={key:2,class:"text-sm text-gray-600"},Ps={class:"text-green-600"},Cs={class:"text-green-600"},Rs={class:"text-red-600"},Ts={key:3,class:"text-sm text-gray-500"},Ds=_e({__name:"PushHistoryPanel",setup(a,{expose:r}){const[D,O]=de(),f=c(!1),C=c(!1),g=c(!1),b=c(!1),t=c(null),j=c({columns:as,api:Ee,defaultPageLimit:20,height:"55vh"}),p=E(()=>t.value?(t.value.sent_count||0)+(t.value.failed_count||0):0),q=E(()=>!p.value||!t.value?0:Math.round(t.value.sent_count/p.value*100)),M=E(()=>!t.value||t.value.status==="completed"?!1:t.value.can_resume!==!1),N=E(()=>!t.value||t.value.can_retry_timeouts===!1?!1:(t.value.timeout_count||0)>0),K=E(()=>{var R;switch((R=t.value)==null?void 0:R.status){case"failed":return"text-red-600 font-medium";case"sending":return"text-blue-700 font-medium";case"pending":return"text-amber-700 font-medium";case"completed":return"text-green-700 font-medium";default:return"text-gray-700"}});function Y(R){return R?ve(R):"-"}async function k(R){f.value=!0,C.value=!0,t.value=null;try{t.value=await me(R.id)}finally{C.value=!1}}function H(){f.value=!1,t.value=null}async function z(){var R,w,L;if(!(!((R=t.value)!=null&&R.id)||!M.value)){g.value=!0;try{const $=await Fe(t.value.id);m.success($.message||"ارسال از همان نقطه ادامه یافت"),t.value=await me(t.value.id),O()}catch($){m.error(((L=(w=$==null?void 0:$.response)==null?void 0:w.data)==null?void 0:L.error)||$.message||"خطا در ادامه ارسال")}finally{g.value=!1}}}async function G(){var R,w,L;if(!(!((R=t.value)!=null&&R.id)||!N.value)){b.value=!0;try{const $=await Ke(t.value.id);m.success($.message||"ارسال مجدد موارد ناموفق شروع شد"),t.value=await me(t.value.id),O()}catch($){m.error(((L=(w=$==null?void 0:$.response)==null?void 0:w.data)==null?void 0:L.error)||$.message||"خطا در ارسال مجدد")}finally{b.value=!1}}}function te(){O()}return r({reload:te}),(R,w)=>{const L=pe,$=$e,U=Ie,Q=Se,se=Pe,Z=we;return y(),S("div",null,[s(L,ce(j.value,{onRegister:A(D)}),{action:l(({record:V})=>[e("div",os,[s(A(ue),{class:"cursor-pointer"},{title:l(()=>[is]),default:l(()=>[s(re,{icon:"vuesax-linear:eye",color:"#1D4ED8",onClick:ae=>k(V)},null,8,["onClick"])]),_:2},1024)])]),_:1},16,["onRegister"]),s(Z,{visible:f.value,"onUpdate:visible":w[0]||(w[0]=V=>f.value=V),title:"جزئیات نوتیفیکیشن ارسالی","custom-footer":"",width:"720px",onClose:H},{footer:l(()=>[e("div",rs,[N.value?(y(),ie($,{key:0,type:"primary",ghost:"",loading:b.value,onClick:G},{default:l(()=>{var V;return[u(" ارسال مجدد موارد ناموفق ("+o(((V=t.value)==null?void 0:V.timeout_count)||0)+") ",1)]}),_:1},8,["loading"])):T("",!0),M.value?(y(),ie($,{key:1,type:"primary",loading:g.value,onClick:z},{default:l(()=>[u(" ادامه ارسال از همین نقطه ")]),_:1},8,["loading"])):T("",!0),s($,{onClick:H},{default:l(()=>[u("بستن")]),_:1})])]),default:l(()=>[s(se,{spinning:C.value},{default:l(()=>[t.value?(y(),S(ke,{key:0},[s(Q,{bordered:"",column:2,size:"small",class:"mb-4"},{default:l(()=>[s(U,{label:"شناسه"},{default:l(()=>[u("#"+o(t.value.id),1)]),_:1}),s(U,{label:"نوع ارسال"},{default:l(()=>[u(o(A(ls)(t.value.type)),1)]),_:1}),s(U,{label:"وضعیت"},{default:l(()=>[e("span",{class:xe(K.value)},o(A(ns)(t.value.status||"completed")),3)]),_:1}),s(U,{label:"تاریخ ارسال"},{default:l(()=>[u(o(Y(t.value.created_at)),1)]),_:1}),s(U,{label:"ارسالکننده"},{default:l(()=>[u(o(t.value.admin_name||"-"),1)]),_:1}),s(U,{label:"کل هدف"},{default:l(()=>[u(o(t.value.total_subscriptions??"-"),1)]),_:1}),s(U,{label:"عنوان",span:2},{default:l(()=>[u(o(t.value.title),1)]),_:1}),s(U,{label:"متن",span:2},{default:l(()=>[e("div",us,o(t.value.body),1)]),_:1}),s(U,{label:"لینک",span:2},{default:l(()=>[u(o(t.value.url||"/"),1)]),_:1}),t.value.error_message?(y(),ie(U,{key:0,label:"آخرین خطا",span:2},{default:l(()=>[e("span",ds,o(t.value.error_message),1)]),_:1})):T("",!0)]),_:1}),e("div",cs,[e("div",vs,[e("div",_s,o(t.value.sent_count),1),ms]),e("div",ps,[e("div",fs,o(t.value.failed_count),1),gs]),e("div",bs,[e("div",hs,o(t.value.timeout_count||0),1),ys]),e("div",xs,[e("div",ks,o(p.value),1),ws])]),M.value?(y(),S("div",$s," این کمپین کامل نشده است. با زدن دکمه «ادامه ارسال» از همان نقطه قبلی ادامه مییابد و از اول شروع نمیشود. ")):T("",!0),N.value?(y(),S("div",Is," برخی ارسالها بهخاطر Timeout یا خطای موقت شکست خوردهاند. با دکمه «ارسال مجدد موارد ناموفق» دوباره تلاش میشود. سابسکریپشنهای مرده (۴۰۴/۴۱۰) در این صف نیستند. ")):T("",!0),p.value>0?(y(),S("div",Ss,[u(" نرخ موفقیت: "),e("strong",Ps,o(q.value)+"%",1),u(" — "),e("span",Cs,o(t.value.sent_count)+" موفق",1),u(" / "),e("span",Rs,o(t.value.failed_count)+" ناموفق",1)])):(y(),S("div",Ts," هنوز ارسالی برای این کمپین ثبت نشده است. "))],64)):T("",!0)]),_:1},8,["spinning"])]),_:1},8,["visible"])])}}}),As=[{title:"ردیف",dataIndex:"id",key:"row_index",filterable:!1,customRender:a=>a.index+1},{title:"نام",dataIndex:"name",key:"name",filterable:!1},{title:"کد",dataIndex:"code",key:"code",filterable:!1},{title:"عنوان",dataIndex:"title",key:"title",filterable:!1},{title:"متن",dataIndex:"message",key:"message",filterable:!1,customRender:a=>{const r=a.record.message||"";return r.length>40?`${r.slice(0,40)}...`:r}},{title:"فعال",dataIndex:"is_active",key:"is_active",slot:"is_active",filterable:!1,align:"center"},{title:"ارسالشده",dataIndex:"sent_count",key:"sent_count",filterable:!1},{title:"ناموفق",dataIndex:"failed_count",key:"failed_count",filterable:!1},{title:"عملیات",dataIndex:"action",key:"action",slot:"action",filterable:!1,align:"center"}],Ls={pending:"در انتظار",sent:"ارسال شده",failed:"ناموفق",cancelled:"لغو شده",skipped:"رد شده"},Us=[{title:"ردیف",dataIndex:"id",key:"row_index",filterable:!1,customRender:a=>a.index+1},{title:"کاربر",dataIndex:"user_id",key:"user_id",filterable:!1,customRender:a=>{const r=a.record.user_id||"-";return r.length>12?`${r.slice(0,8)}…`:r}},{title:"وضعیت",dataIndex:"status",key:"status",filterable:!1,customRender:a=>Ls[a.record.status]||a.record.status},{title:"تاریخ برنامهریزی",dataIndex:"scheduled_for",key:"scheduled_for",filterable:!1},{title:"زمان ارسال",dataIndex:"sent_at",key:"sent_at",filterable:!1,customRender:a=>a.record.sent_at?ve(a.record.sent_at):"-"},{title:"توضیح",dataIndex:"error_message",key:"error_message",filterable:!1,customRender:a=>a.record.error_message||"-"}],Bs=e("p",{class:"text-sm text-gray-500 mb-4"}," اتوماسیونهای نوتیفیکیشن کدوبلو. عنوان، متن، لینک و فعال بودن قابل ویرایش است؛ شرط ارسال در سیستم ثابت است. ",-1),js={class:"gap-2 flex justify-center"},qs=e("span",null,"ویرایش",-1),Os=e("span",null,"آمار ارسال",-1),Ms=e("span",null,"ارسال تست",-1),Ns={class:"space-y-4"},Es=e("div",{class:"mb-1 text-sm text-gray-600"},"نام",-1),Fs={class:"font-medium"},Ks=e("div",{class:"mb-1 text-sm text-gray-600"},"شرط ارسال",-1),Vs={class:"text-sm text-gray-700 whitespace-pre-wrap"},Js=e("div",{class:"mb-1 text-sm text-gray-600"},"عنوان *",-1),Hs=e("div",{class:"mb-1 text-sm text-gray-600"},"متن پیام *",-1),zs=e("div",{class:"mb-1 text-sm text-gray-600"},"Deep Link",-1),Gs={class:"space-y-3"},Qs={class:"text-sm text-gray-600"},Ws={class:"text-green-600"},Xs={class:"text-red-600"},Ys={class:"text-gray-500"},Zs={class:"whitespace-pre-wrap text-sm"},ea={class:"flex flex-wrap gap-2 items-center mb-3"},ta=e("span",{class:"text-sm text-gray-600"},"فیلتر وضعیت:",-1),sa=_e({__name:"PushAutomationsPanel",setup(a,{expose:r}){const{TextArea:D}=oe,[O,f]=de(),[C,g]=de(),b=c({columns:As,api:Ve,defaultPageLimit:50,height:"55vh",showOptionHeader:!1}),t=c(!1),j=c(null),p=Ye({title:"",message:"",deep_link:"/challenges",is_active:!0}),q=c(!1),M=c(null),N=c(""),K=c(!1),Y=c(!1),k=c(null),H=c(null),z=c(),G=c(""),te=c({columns:Us,api:Z,defaultPageLimit:20,height:"40vh",showOptionHeader:!1});async function R(v,d){if(v.is_active===d)return;const n=v.is_active;v.is_active=d;try{await he(v.id,{is_active:d}),m.success(d?"اتوماسیون فعال شد":"اتوماسیون غیرفعال شد")}catch{v.is_active=n,m.error("تغییر وضعیت ناموفق بود")}}function w(v){j.value=v,p.title=v.title||"",p.message=v.message||"",p.deep_link=v.deep_link||"/challenges",p.is_active=v.is_active!==!1,t.value=!0}function L(){t.value=!1,j.value=null}async function $(){if(j.value){if(!p.title.trim()||!p.message.trim()){m.error("عنوان و متن الزامی است");return}try{await he(j.value.id,{title:p.title.trim(),message:p.message.trim(),deep_link:p.deep_link.trim()||"/",is_active:p.is_active}),m.success("اتوماسیون ذخیره شد"),L(),await f()}catch{m.error("ذخیره ناموفق بود")}}}function U(v){M.value=v,N.value="",q.value=!0}function Q(){q.value=!1,M.value=null,N.value=""}async function se(){var d,n;if(!M.value)return;const v=N.value.trim();if(!v){m.error("شماره موبایل الزامی است");return}try{await Je(M.value.id,{phone:v}),m.success("نوتیف تست ارسال شد"),Q()}catch(i){m.error(((n=(d=i==null?void 0:i.response)==null?void 0:d.data)==null?void 0:n.error)||(i==null?void 0:i.message)||"ارسال تست ناموفق بود")}}async function Z(v){if(!H.value)return{rows:[],total:0,query:{...v,total:0}};const d=await be(H.value,{page:v.page,limit:v.limit,status:z.value,search:G.value||v.search||void 0});k.value=d;const n=v.page||1,i=v.limit||20,P=(n-1)*i;return{rows:d.sends.rows.map((_,x)=>({..._,index:P+x})),total:d.sends.total,query:{...v,total:d.sends.total,page:n,limit:i}}}async function V(v){Y.value=!0;try{H.value=v,k.value=await be(v,{page:1,limit:20,status:z.value,search:G.value||void 0}),await g()}finally{Y.value=!1}}function ae(v){z.value=void 0,G.value="",K.value=!0,V(v.id)}function le(){K.value=!1,k.value=null,H.value=null}function ne(){g()}return r({reload:f}),(v,d)=>{const n=He,i=pe,P=Ze,_=we,x=$e,h=Ie,B=Se,X=et,J=tt,F=ze,Te=Pe;return y(),S("div",null,[Bs,s(i,ce(b.value,{onRegister:A(O)}),{is_active:l(({record:I})=>[s(n,{checked:I.is_active,onChange:W=>R(I,W)},null,8,["checked","onChange"])]),action:l(({record:I})=>[e("div",js,[s(A(ue),{class:"cursor-pointer"},{title:l(()=>[qs]),default:l(()=>[s(re,{icon:"vuesax-linear:edit",color:"#1D4ED8",onClick:W=>w(I)},null,8,["onClick"])]),_:2},1024),s(A(ue),{class:"cursor-pointer"},{title:l(()=>[Os]),default:l(()=>[s(re,{icon:"vuesax-linear:eye",color:"#059669",onClick:W=>ae(I)},null,8,["onClick"])]),_:2},1024),s(A(ue),{class:"cursor-pointer"},{title:l(()=>[Ms]),default:l(()=>[s(re,{icon:"vuesax-linear:notification",color:"#7C3AED",onClick:W=>U(I)},null,8,["onClick"])]),_:2},1024)])]),_:1},16,["onRegister"]),s(_,{visible:t.value,"onUpdate:visible":d[4]||(d[4]=I=>t.value=I),title:"ویرایش اتوماسیون نوتیف",width:"640px",onOk:$,onCancel:L},{default:l(()=>{var I,W;return[e("div",Ns,[e("div",null,[Es,e("div",Fs,o((I=j.value)==null?void 0:I.name),1)]),e("div",null,[Ks,e("div",Vs,o((W=j.value)==null?void 0:W.trigger_summary),1)]),e("div",null,[Js,s(P,{value:p.title,"onUpdate:value":d[0]||(d[0]=ee=>p.title=ee),placeholder:"عنوان نوتیف"},null,8,["value"])]),e("div",null,[Hs,s(A(D),{value:p.message,"onUpdate:value":d[1]||(d[1]=ee=>p.message=ee),rows:4,placeholder:"متن نوتیف"},null,8,["value"])]),e("div",null,[zs,s(P,{value:p.deep_link,"onUpdate:value":d[2]||(d[2]=ee=>p.deep_link=ee),placeholder:"/challenges"},null,8,["value"])]),e("div",null,[s(A(st),{checked:p.is_active,"onUpdate:checked":d[3]||(d[3]=ee=>p.is_active=ee)},{default:l(()=>[u("فعال")]),_:1},8,["checked"])])])]}),_:1},8,["visible"]),s(_,{visible:q.value,"onUpdate:visible":d[6]||(d[6]=I=>q.value=I),title:"ارسال تست نوتیف",width:"480px",onOk:se,onCancel:Q},{default:l(()=>{var I;return[e("div",Gs,[e("div",Qs," نوتیف «"+o((I=M.value)==null?void 0:I.name)+"» برای کاربری که Push فعال دارد ارسال میشود. ",1),s(P,{value:N.value,"onUpdate:value":d[5]||(d[5]=W=>N.value=W),placeholder:"شماره موبایل کاربر (09...)"},null,8,["value"])])]}),_:1},8,["visible"]),s(_,{visible:K.value,"onUpdate:visible":d[9]||(d[9]=I=>K.value=I),title:"آمار ارسال اتوماسیون نوتیف","custom-footer":"",width:"90%",onClose:le},{footer:l(()=>[s(x,{onClick:le},{default:l(()=>[u("بستن")]),_:1})]),default:l(()=>[s(Te,{spinning:Y.value},{default:l(()=>[k.value?(y(),S(ke,{key:0},[s(B,{bordered:"",column:2,size:"small",class:"mb-4"},{default:l(()=>[s(h,{label:"نام"},{default:l(()=>[u(o(k.value.automation.name),1)]),_:1}),s(h,{label:"کد"},{default:l(()=>[u(o(k.value.automation.code),1)]),_:1}),s(h,{label:"وضعیت"},{default:l(()=>[u(o(k.value.automation.is_active?"فعال":"غیرفعال"),1)]),_:1}),s(h,{label:"آمار کلی"},{default:l(()=>[e("span",Ws,o(k.value.automation.sent_count),1),u(" / "),e("span",Xs,o(k.value.automation.failed_count),1),u(" / "),e("span",Ys,o(k.value.automation.cancelled_count),1)]),_:1}),s(h,{label:"Deep Link",span:2},{default:l(()=>[u(o(k.value.automation.deep_link),1)]),_:1}),s(h,{label:"شرط",span:2},{default:l(()=>[u(o(k.value.automation.trigger_summary),1)]),_:1}),s(h,{label:"عنوان",span:2},{default:l(()=>[u(o(k.value.automation.title),1)]),_:1}),s(h,{label:"متن",span:2},{default:l(()=>[e("div",Zs,o(k.value.automation.message),1)]),_:1})]),_:1}),e("div",ea,[ta,s(J,{value:z.value,"onUpdate:value":d[7]||(d[7]=I=>z.value=I),"allow-clear":"",placeholder:"همه",style:{width:"160px"},onChange:ne},{default:l(()=>[s(X,{value:"sent"},{default:l(()=>[u("ارسال شده")]),_:1}),s(X,{value:"failed"},{default:l(()=>[u("ناموفق")]),_:1}),s(X,{value:"pending"},{default:l(()=>[u("در انتظار")]),_:1}),s(X,{value:"skipped"},{default:l(()=>[u("رد شده")]),_:1}),s(X,{value:"cancelled"},{default:l(()=>[u("لغو شده")]),_:1})]),_:1},8,["value"]),s(F,{value:G.value,"onUpdate:value":d[8]||(d[8]=I=>G.value=I),placeholder:"جستجو user id",style:{width:"220px"},onSearch:ne},null,8,["value"])]),s(i,ce(te.value,{onRegister:A(C)}),null,16,["onRegister"])],64)):T("",!0)]),_:1},8,["spinning"])]),_:1},8,["visible"])])}}}),aa=e("div",{class:"flex justify-between items-center mb-4"},[e("h2",null,"نوتیفیکیشن Push")],-1),el=_e({__name:"index",setup(a){const r=c("send"),D=c(null),O=c(null);function f(){var g;(g=D.value)==null||g.reload()}function C(g){var b,t;g==="history"&&((b=D.value)==null||b.reload()),g==="automations"&&((t=O.value)==null||t.reload())}return(g,b)=>{const t=at,j=lt,p=Ae;return y(),ie(p,null,{default:l(()=>[aa,s(j,{activeKey:r.value,"onUpdate:activeKey":b[0]||(b[0]=q=>r.value=q),onChange:C},{default:l(()=>[s(t,{key:"send",tab:"ارسال نوتیفیکیشن"},{default:l(()=>[s(ts,{onSent:f})]),_:1}),s(t,{key:"history",tab:"سوابق ارسالی"},{default:l(()=>[s(Ds,{ref_key:"historyPanelRef",ref:D},null,512)]),_:1}),s(t,{key:"automations",tab:"اتوماسیونها"},{default:l(()=>[s(sa,{ref_key:"automationsPanelRef",ref:O},null,512)]),_:1})]),_:1},8,["activeKey"])]),_:1})}}});export{el as default};
|