Validate sessions against the API, honor configurable base paths, and route unknown pages to 404. Keep development ports stable so user and admin apps cannot be confused. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 line
17 KiB
JavaScript
1 line
17 KiB
JavaScript
import{$ as e,Ct as t,D as n,G as r,J as i,N as a,P as ee,Q as o,R as s,S as c,V as l,X as u,Z as d,a as f,bt as p,dt as m,et as h,g,gt as _,ht as v,i as y,it as b,lt as x,mt as S,nt as C,q as w,rt as T,st as te,u as E,v as ne,vt as re,xt as D,yt as O,z as k}from"./index-B2VD3zy8.js";import{t as A}from"./AdminPageSkeleton-BJpm6oxf.js";import{t as ie}from"./BaseSwitch-dp2xMemS.js";import{t as ae}from"./BaseEmptyState-DGu6Pfui.js";import{t as j}from"./AdminSelect-BeLNl2Qz.js";import{r as M}from"./adminLabels-Cz9ccm1Z.js";import{t as N}from"./ActiveSwitchCell-DIzTn08M.js";var P={class:`suggestions-panel`},F={key:0,class:`suggestions-panel__loading`},I={class:`suggestions-panel__add`},L={class:`field`},R={key:0,class:`suggestions-panel__picked`},z=[`onClick`],B={class:`field`},V=[`disabled`],H={key:0,class:`suggestions-panel__list`},U={class:`muted`,dir:`ltr`},W={key:0,class:`note`},G={class:`suggestions-panel__actions`},K=[`onClick`],q={key:1,class:`suggestions-panel__empty`},oe=l(b({__name:`CustomerSuggestionsPanel`,props:{customerId:{}},setup(ee){let o=ee,s=k(),l=O(!0),f=O(!1),p=O([]),g=O([]),v=O([]),y=O(``),b=u(()=>g.value.filter(e=>!p.value.some(t=>t.productId===e.id&&t.isActive)).map(e=>({value:e.id,label:`${e.name} (${e.productCode})`})));async function w(){if(o.customerId){l.value=!0;try{let[e,t]=await Promise.all([n.list(o.customerId),c.list()]);p.value=e,g.value=t}catch(e){s.error(e instanceof a?e.message:`بارگذاری پیشنهادها ناموفق بود`)}finally{l.value=!1}}}async function E(){if(v.value.length){f.value=!0;try{for(let e of v.value)await n.create({customerId:o.customerId,productId:e,note:y.value.trim()||void 0});v.value=[],y.value=``,s.success(`پیشنهادها به صفحه خانه مشتری اضافه شد`),await w()}catch(e){s.error(e instanceof a?e.message:`ثبت پیشنهاد ناموفق بود`)}finally{f.value=!1}}}async function ne(e){try{await n.setActive(e.id,!e.isActive),await w()}catch(e){s.error(e instanceof a?e.message:`بهروزرسانی ناموفق بود`)}}function re(e){e&&(v.value.includes(e)||(v.value=[...v.value,e]))}function A(e){v.value=v.value.filter(t=>t!==e)}return S(()=>o.customerId,()=>{w()}),te(()=>{w()}),(n,a)=>(x(),h(`section`,P,[a[4]||=d(`header`,{class:`suggestions-panel__head`},[d(`div`,null,[d(`h3`,{class:`suggestions-panel__title`},`پیشنهاد اختصاصی در اپ`),d(`p`,{class:`suggestions-panel__hint`},` محصولات انتخابشده در بخش «پیشنهاد اختصاصی ما برای شما» در صفحه خانه مشتری نمایش داده میشوند. `)])],-1),l.value?(x(),h(`div`,F,`در حال بارگذاری...`)):(x(),h(i,{key:1},[d(`div`,I,[d(`label`,L,[a[1]||=C(` افزودن محصول (کد کالیته) `,-1),T(j,{"model-value":``,options:[{value:``,label:`انتخاب محصول...`},...b.value],"onUpdate:modelValue":re},null,8,[`options`])]),v.value.length?(x(),h(`div`,R,[(x(!0),h(i,null,m(v.value,e=>(x(),h(`span`,{key:e,class:`suggestions-panel__chip`},[C(t(g.value.find(t=>t.id===e)?.productCode||e)+` `,1),d(`button`,{type:`button`,"aria-label":`حذف`,onClick:t=>A(e)},`×`,8,z)]))),128))])):e(``,!0),d(`label`,B,[a[2]||=C(` یادداشت (اختیاری) `,-1),_(d(`textarea`,{"onUpdate:modelValue":a[0]||=e=>y.value=e,class:`admin-input`,rows:`2`,placeholder:`دلیل پیشنهاد برای مشتری`},null,512),[[r,y.value]])]),d(`button`,{type:`button`,class:`admin-btn admin-btn--primary admin-btn--sm`,disabled:!v.value.length||f.value,onClick:E},` افزودن به صفحه خانه مشتری `,8,V)]),p.value.length?(x(),h(`div`,H,[a[3]||=d(`h4`,{class:`suggestions-panel__sub`},`پیشنهادهای ثبتشده`,-1),d(`ul`,null,[(x(!0),h(i,null,m(p.value,n=>(x(),h(`li`,{key:n.id,class:`suggestions-panel__row`},[d(`div`,null,[d(`strong`,null,t(n.productName),1),d(`span`,U,`(`+t(n.productCode)+`)`,1),n.note?(x(),h(`p`,W,t(n.note),1)):e(``,!0)]),d(`div`,G,[d(`span`,{class:D(n.isActive?`on`:`off`)},t(n.isActive?`فعال`:`غیرفعال`),3),d(`button`,{type:`button`,class:`link`,onClick:e=>ne(n)},t(n.isActive?`حذف از خانه`:`فعالسازی`),9,K)])]))),128))])])):(x(),h(`p`,q,`هنوز پیشنهادی برای این مشتری ثبت نشده است.`))],64))]))}}),[[`__scopeId`,`data-v-4182e847`]]),se={class:`customers-page`},ce={class:`admin-page-header`},le={class:`customers-page__tabs`,role:`tablist`,"aria-label":`نوع کاربر`},ue=[`aria-selected`],de=[`aria-selected`],fe={class:`customers-page__search admin-card`},pe={key:2,class:`customers-page__table admin-card desktop-only`},me={class:`admin-table-wrap`},he={class:`admin-table`},ge={key:0},_e={key:1},ve={key:2},ye={key:3},be={key:4},xe={key:0},Se={key:1},Ce={key:2},we={key:3},Te={key:4},Ee={class:`numeric`},De={class:`numeric`},Oe={class:`status`},ke={class:`actions`},Ae=[`onClick`],je={key:3,class:`compact-only admin-card-list`},Me={class:`admin-card-item__header`},Ne={class:`admin-card-item__title`},Pe={class:`admin-card-item__header-actions`},Fe=[`onClick`],Ie={class:`admin-card-item__meta`},Le={key:0},Re={key:1},ze={key:2},Be={key:3},Ve={key:4},He={key:0,class:`admin-form__error`,role:`alert`},Ue={class:`admin-form__field`},We={class:`admin-form__row`},Ge={class:`admin-form__field`},Ke={class:`admin-form__field`},qe={class:`admin-form__row`},Je={class:`admin-form__field`},Ye={class:`admin-form__field`},Xe={class:`admin-form__row`},Ze={class:`admin-form__field`},Qe={class:`admin-form__field`},$e={class:`admin-form__row`},et={class:`admin-form__field`},tt={key:0,class:`admin-form__field`},nt={key:1,class:`admin-form__field`},rt={class:`customers-page__brands`},it=[`checked`,`onChange`],at={class:`admin-form__field`},ot=[`disabled`],st={key:0,class:`admin-btn__spinner`,"aria-hidden":`true`},J=l(b({__name:`CustomersView`,setup(n){let c=O([]),l=O([]),b=O([]),S=O([]),P=O(``),F=O(`customer`),I=O(!0),L=O(null),R=O(null),z=O(``),B=O(!1),V=k();function H(e){if(e==null)return`-`;if(typeof e==`number`)return Number.isFinite(e)?String(e):`-`;let t=e.trim();return!t||t===`—`?`-`:t}function U(e){return e==null||!Number.isFinite(e)?`-`:f(e)}let W=[{value:`wholesale`,label:`عمدهفروش`},{value:`retail`,label:`خردهفروش`}],G=[{value:`customer`,label:`مشتری`},{value:`agent`,label:`واسطه`}],K={customer:`مشتری`,agent:`واسطه`};function q(e){return K[e===`agent`?`agent`:`customer`]}let J=u(()=>[{value:``,label:`بدون سطح`},...l.value.map(e=>({value:e.id,label:e.label}))]),ct=u(()=>[{value:``,label:`بدون واسطه`},...b.value.filter(e=>e.id!==R.value).map(e=>({value:e.id,label:e.name+(e.agentCode?` (${e.agentCode})`:``)}))]),Y=()=>({name:``,phone:``,nationalId:``,customerType:`wholesale`,companyName:``,isActive:!0,levelDefId:``,assignedAgentId:``,brandIds:[],appRole:`customer`,agentCode:``}),X=re(Y()),lt=u(()=>L.value!==null),ut=u(()=>L.value===`edit`?`ویرایش مشتری`:`افزودن مشتری`),dt=u(()=>X.name.trim()&&X.phone.trim()&&X.nationalId.trim()),Z=u(()=>{let e=P.value.trim();return e?c.value.filter(t=>t.name.includes(e)||t.phone.includes(e)||t.nationalId.includes(e)||t.companyName.includes(e)):c.value});function ft(e,t){t?X.brandIds.includes(e)||X.brandIds.push(e):X.brandIds=X.brandIds.filter(t=>t!==e)}async function pt(){I.value=!0;try{c.value=await g.list(void 0,F.value)}catch(e){V.error(e instanceof a?e.message:F.value===`agent`?`بارگذاری واسطهها انجام نشد.`:`بارگذاری مشتریان انجام نشد.`)}finally{I.value=!1}}function Q(e){F.value!==e&&(F.value=e,P.value=``,pt())}async function mt(){try{let[e,t,n]=await Promise.all([ne.list(),g.list(void 0,`agent`),E.list()]);l.value=e,b.value=t,S.value=n}catch(e){V.error(e instanceof a?e.message:`بارگذاری اطلاعات کمکی انجام نشد.`)}}te(()=>{pt(),mt()});function ht(){L.value=`add`,R.value=null,Object.assign(X,Y()),X.appRole=F.value,z.value=``}function gt(e){L.value=`edit`,R.value=e.id,X.name=e.name,X.phone=e.phone,X.nationalId=e.nationalId,X.customerType=e.customerType,X.companyName=e.companyName,X.isActive=e.isActive,X.levelDefId=e.levelDefId??``,X.assignedAgentId=e.assignedAgentId??``,X.brandIds=[...e.brandIds??[]],X.appRole=e.appRole===`agent`?`agent`:`customer`,X.agentCode=e.agentCode??``,z.value=``}function $(){L.value=null,R.value=null,z.value=``}async function _t(){if(!dt.value){z.value=`نام، تلفن و شناسه ملی الزامی هستند.`;return}B.value=!0;let e={name:X.name.trim(),phone:X.phone.trim(),nationalId:X.nationalId.trim(),customerType:X.customerType,isActive:X.isActive,levelDefId:X.levelDefId||null,assignedAgentId:X.assignedAgentId||null,brandIds:[...X.brandIds],appRole:X.appRole,agentCode:X.appRole===`agent`&&X.agentCode.trim()||null};try{if(L.value===`edit`&&R.value){let t=await g.update(R.value,e),n=c.value.findIndex(e=>e.id===R.value);n!==-1&&(c.value[n]={...c.value[n],...t})}else{let t=await g.create(e);c.value.unshift(t)}V.success(L.value===`edit`?`اطلاعات مشتری بهروزرسانی شد.`:`مشتری جدید ثبت شد.`),$(),e.appRole===`agent`&&mt()}catch(e){V.error(e instanceof a?e.message:`ذخیره مشتری انجام نشد.`)}finally{B.value=!1}}async function vt(e,t){await g.setActive(e,t)}function yt(){P.value=``}return(n,a)=>(x(),h(`div`,se,[d(`div`,ce,[a[13]||=d(`div`,null,[d(`h1`,{class:`admin-page-header__title`},`مشتریان و واسطهها`)],-1),d(`button`,{type:`button`,class:`admin-btn admin-btn--primary`,onClick:ht},t(F.value===`agent`?`افزودن واسطه`:`افزودن مشتری`),1)]),d(`div`,le,[d(`button`,{type:`button`,role:`tab`,class:D([`customers-page__tab`,{"is-active":F.value===`customer`}]),"aria-selected":F.value===`customer`,onClick:a[0]||=e=>Q(`customer`)},` مشتریان `,10,ue),d(`button`,{type:`button`,role:`tab`,class:D([`customers-page__tab`,{"is-active":F.value===`agent`}]),"aria-selected":F.value===`agent`,onClick:a[1]||=e=>Q(`agent`)},` واسطهها `,10,de)]),d(`div`,fe,[T(ee,{name:`search`,size:18}),_(d(`input`,{"onUpdate:modelValue":a[2]||=e=>P.value=e,type:`search`,class:`customers-page__search-input`,placeholder:`جستجو در نام، تلفن، شناسه ملی...`},null,512),[[r,P.value]])]),I.value?(x(),o(A,{key:0,variant:`table`})):Z.value.length?(x(),h(`div`,pe,[d(`div`,me,[d(`table`,he,[d(`thead`,null,[d(`tr`,null,[d(`th`,null,t(F.value===`agent`?`نام واسطه`:`نام مشتری`),1),a[14]||=d(`th`,null,`تلفن`,-1),a[15]||=d(`th`,null,`نقش`,-1),F.value===`agent`?(x(),h(`th`,ge,`کد واسطه`)):e(``,!0),F.value===`customer`?(x(),h(`th`,_e,`نوع`)):e(``,!0),F.value===`customer`?(x(),h(`th`,ve,`سطح`)):e(``,!0),F.value===`customer`?(x(),h(`th`,ye,`واسطه`)):e(``,!0),F.value===`customer`?(x(),h(`th`,be,`شرکت`)):e(``,!0),a[16]||=d(`th`,{class:`numeric`},`تعداد سفارش`,-1),a[17]||=d(`th`,{class:`numeric`},`مجموع متراژ`,-1),a[18]||=d(`th`,{class:`status`},`وضعیت`,-1),a[19]||=d(`th`,null,`تاریخ ثبت`,-1),a[20]||=d(`th`,{class:`actions`},`عملیات`,-1)])]),d(`tbody`,null,[(x(!0),h(i,null,m(Z.value,n=>(x(),h(`tr`,{key:n.id},[d(`td`,null,t(H(n.name)),1),d(`td`,null,t(H(n.phone)),1),d(`td`,null,t(q(n.appRole)),1),F.value===`agent`?(x(),h(`td`,xe,t(H(n.agentCode)),1)):e(``,!0),F.value===`customer`?(x(),h(`td`,Se,t(H(p(M)[n.customerType])),1)):e(``,!0),F.value===`customer`?(x(),h(`td`,Ce,t(H(n.levelLabel)),1)):e(``,!0),F.value===`customer`?(x(),h(`td`,we,t(H(n.assignedAgentName)),1)):e(``,!0),F.value===`customer`?(x(),h(`td`,Te,t(H(n.companyName)),1)):e(``,!0),d(`td`,Ee,t(H(n.orderCount)),1),d(`td`,De,t(U(n.totalMeterage)),1),d(`td`,Oe,[T(N,{id:n.id,modelValue:n.isActive,"onUpdate:modelValue":e=>n.isActive=e,"entity-name":n.name,"entity-type":`مشتری`,persist:vt},null,8,[`id`,`modelValue`,`onUpdate:modelValue`,`entity-name`])]),d(`td`,null,t(H(p(y)(n.registeredAt))),1),d(`td`,ke,[d(`button`,{type:`button`,class:`admin-btn admin-btn--ghost admin-btn--xs`,onClick:e=>gt(n)},` ویرایش `,8,Ae)])]))),128))])])])])):(x(),o(ae,{key:1,class:`admin-card`,icon:`customers`,title:P.value.trim()?`نتیجهای یافت نشد`:F.value===`agent`?`واسطهای ثبت نشده`:`مشتریان ثبت شده`,description:P.value.trim()?`عبارت جستجو را تغییر دهید یا فیلترها را پاک کنید.`:F.value===`agent`?`برای شروع، اولین واسطه را ثبت کنید.`:`برای شروع، اولین مشتری را ثبت کنید.`},{default:v(()=>[P.value.trim()?(x(),h(`button`,{key:0,type:`button`,class:`admin-btn admin-btn--outline admin-btn--sm`,onClick:yt},` پاک کردن جستجو `)):(x(),h(`button`,{key:1,type:`button`,class:`admin-btn admin-btn--primary admin-btn--sm`,onClick:ht},t(F.value===`agent`?`افزودن واسطه`:`افزودن مشتری`),1))]),_:1},8,[`title`,`description`])),!I.value&&Z.value.length?(x(),h(`div`,je,[(x(!0),h(i,null,m(Z.value,n=>(x(),h(`article`,{key:n.id,class:`admin-card-item`},[d(`div`,Me,[d(`p`,Ne,t(H(n.name)),1),d(`div`,Pe,[T(N,{id:n.id,modelValue:n.isActive,"onUpdate:modelValue":e=>n.isActive=e,"entity-name":n.name,"entity-type":`مشتری`,persist:vt},null,8,[`id`,`modelValue`,`onUpdate:modelValue`,`entity-name`]),d(`button`,{type:`button`,class:`admin-btn admin-btn--ghost admin-btn--xs`,onClick:e=>gt(n)},` ویرایش `,8,Fe)])]),d(`div`,Ie,[d(`span`,null,t(H(n.phone)),1),F.value===`agent`?(x(),h(`span`,Le,`کد: `+t(H(n.agentCode)),1)):e(``,!0),F.value===`customer`?(x(),h(`span`,Re,t(H(p(M)[n.customerType])),1)):e(``,!0),F.value===`customer`?(x(),h(`span`,ze,t(H(n.levelLabel)),1)):e(``,!0),F.value===`customer`?(x(),h(`span`,Be,`واسطه: `+t(H(n.assignedAgentName)),1)):e(``,!0),F.value===`customer`?(x(),h(`span`,Ve,t(H(n.companyName)),1)):e(``,!0),d(`span`,null,t(H(n.orderCount))+` سفارش · `+t(U(n.totalMeterage)),1)])]))),128))])):e(``,!0),T(s,{open:lt.value,title:ut.value,size:`lg`,onClose:$},{footer:v(()=>[d(`button`,{type:`button`,class:`admin-btn admin-btn--outline`,onClick:$},`انصراف`),d(`button`,{type:`button`,class:`admin-btn admin-btn--primary`,disabled:!dt.value||B.value,onClick:_t},[B.value?(x(),h(`span`,st)):e(``,!0),C(` `+t(L.value===`edit`?`ذخیره تغییرات`:X.appRole===`agent`?`ثبت واسطه`:`ثبت مشتری`),1)],8,ot)]),default:v(()=>[d(`form`,{class:`admin-form`,onSubmit:w(_t,[`prevent`])},[z.value?(x(),h(`p`,He,t(z.value),1)):e(``,!0),d(`div`,Ue,[a[21]||=d(`label`,{for:`customer-name`},[C(`نام مشتری `),d(`span`,{class:`admin-form__required`},`*`)],-1),_(d(`input`,{id:`customer-name`,"onUpdate:modelValue":a[3]||=e=>X.name=e,type:`text`,class:`admin-input`},null,512),[[r,X.name]])]),d(`div`,We,[d(`div`,Ge,[a[22]||=d(`label`,{for:`customer-phone`},[C(`تلفن `),d(`span`,{class:`admin-form__required`},`*`)],-1),_(d(`input`,{id:`customer-phone`,"onUpdate:modelValue":a[4]||=e=>X.phone=e,type:`tel`,class:`admin-input`,inputmode:`tel`,dir:`ltr`},null,512),[[r,X.phone]])]),d(`div`,Ke,[a[23]||=d(`label`,{for:`customer-national-id`},[C(`شناسه ملی `),d(`span`,{class:`admin-form__required`},`*`)],-1),_(d(`input`,{id:`customer-national-id`,"onUpdate:modelValue":a[5]||=e=>X.nationalId=e,type:`text`,class:`admin-input`,inputmode:`numeric`,dir:`ltr`},null,512),[[r,X.nationalId]])])]),d(`div`,qe,[d(`div`,Je,[a[24]||=d(`label`,null,`نوع مشتری`,-1),T(j,{modelValue:X.customerType,"onUpdate:modelValue":a[6]||=e=>X.customerType=e,block:``,"aria-label":`نوع مشتری`,options:W},null,8,[`modelValue`])]),d(`div`,Ye,[a[25]||=d(`label`,{for:`customer-company`},`شرکت مرتبط`,-1),_(d(`input`,{id:`customer-company`,"onUpdate:modelValue":a[7]||=e=>X.companyName=e,type:`text`,class:`admin-input`},null,512),[[r,X.companyName]])])]),d(`div`,Xe,[d(`div`,Ze,[a[26]||=d(`label`,null,`سطح`,-1),T(j,{modelValue:X.levelDefId,"onUpdate:modelValue":a[8]||=e=>X.levelDefId=e,block:``,"aria-label":`سطح مشتری`,options:J.value},null,8,[`modelValue`,`options`])]),d(`div`,Qe,[a[27]||=d(`label`,null,`واسطه`,-1),T(j,{modelValue:X.assignedAgentId,"onUpdate:modelValue":a[9]||=e=>X.assignedAgentId=e,block:``,"aria-label":`واسطه اختصاصیافته`,options:ct.value},null,8,[`modelValue`,`options`])])]),d(`div`,$e,[d(`div`,et,[a[28]||=d(`label`,null,`نقش در اپ`,-1),T(j,{modelValue:X.appRole,"onUpdate:modelValue":a[10]||=e=>X.appRole=e,block:``,"aria-label":`نقش در اپ`,options:G},null,8,[`modelValue`])]),X.appRole===`agent`?(x(),h(`div`,tt,[a[29]||=d(`label`,{for:`customer-agent-code`},`کد واسطه`,-1),_(d(`input`,{id:`customer-agent-code`,"onUpdate:modelValue":a[11]||=e=>X.agentCode=e,type:`text`,class:`admin-input`,dir:`ltr`},null,512),[[r,X.agentCode]])])):e(``,!0)]),S.value.length?(x(),h(`div`,nt,[a[30]||=d(`label`,null,`برندها`,-1),d(`div`,rt,[(x(!0),h(i,null,m(S.value,e=>(x(),h(`label`,{key:e.id,class:`customers-page__brand`},[d(`input`,{type:`checkbox`,checked:X.brandIds.includes(e.id),onChange:t=>ft(e.id,t.target.checked)},null,40,it),d(`span`,null,t(e.name),1)]))),128))])])):e(``,!0),d(`div`,at,[T(ie,{modelValue:X.isActive,"onUpdate:modelValue":a[12]||=e=>X.isActive=e,label:`وضعیت`},null,8,[`modelValue`])]),L.value===`edit`&&R.value&&X.appRole===`customer`?(x(),o(oe,{key:2,"customer-id":R.value},null,8,[`customer-id`])):e(``,!0)],32)]),_:1},8,[`open`,`title`])]))}}),[[`__scopeId`,`data-v-db05c8d1`]]);export{J as default}; |