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,C as t,Ct as n,G as r,J as i,N as a,P as ee,Q as o,R as te,S as s,St as c,V as ne,W as l,X as u,Z as d,bt as f,dt as p,et as m,gt as h,ht as g,it as _,lt as v,n as y,nt as b,o as x,p as re,q as ie,rt as S,st as ae,vt as oe,xt as se,yt as C,z as ce}from"./index-B2VD3zy8.js";import{t as le}from"./AdminPageSkeleton-BJpm6oxf.js";import{t as w}from"./BaseSwitch-dp2xMemS.js";import{t as ue}from"./BaseEmptyState-DGu6Pfui.js";import{n as de,r as T,t as fe}from"./AdminImagePicker-C0OGC-bB.js";import{t as E}from"./AdminSelect-BeLNl2Qz.js";import{t as D}from"./ActiveSwitchCell-DIzTn08M.js";import{t as pe}from"./AdminCurrencyInput-DxQX_Gwe.js";var me={class:`products-page`},he={class:`products-page__filters admin-card`},ge={class:`products-page__search`},_e={key:2,class:`products-page__table admin-card desktop-only`},ve={class:`admin-table-wrap`},ye={class:`admin-table`},be={class:`numeric`},xe={class:`numeric`},Se={class:`numeric`},Ce={class:`numeric`},O={class:`status`},k={class:`actions`},A=[`onClick`],we={key:3,class:`compact-only admin-card-list`},Te={class:`admin-card-item__header`},Ee={class:`admin-card-item__title`},De={class:`admin-card-item__header-actions`},Oe=[`onClick`],ke={class:`admin-card-item__meta`},Ae={key:0,class:`admin-form__error`,role:`alert`},je={class:`admin-form__field`},Me={class:`admin-form__row`},Ne={class:`admin-form__field`},Pe={class:`admin-form__field`},Fe={class:`admin-form__field`},Ie={class:`admin-form__row`},Le={class:`admin-form__field`},Re={class:`admin-form__field`},ze={class:`admin-form__row`},Be={class:`admin-form__field`},Ve={class:`admin-form__field`},He={class:`admin-form__row`},Ue={class:`admin-form__field`},We=[`value`],Ge={class:`admin-form__field`},Ke=[`value`],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__field`},et={class:`color-variants`},tt={class:`color-variant__fields`},nt=[`onUpdate:modelValue`,`placeholder`],rt=[`onClick`],it={class:`admin-form__field`},at={class:`product-images`},ot=[`onClick`],st={class:`product-images__add`},ct=[`disabled`],lt={class:`admin-form__field`},ut={class:`admin-form__field`},dt=[`disabled`],j=ne(_({__name:`ProductsView`,setup(ne){let _=C([]),j=C([]),M=C([{value:`trousers`,label:`شلوار`},{value:`suit`,label:`کتوشلوار`},{value:`shirt`,label:`پیراهن`},{value:`other`,label:`سایر`}]),N=C([{value:`summer`,label:`تابستان`},{value:`winter`,label:`زمستان`},{value:`all_season`,label:`چهارفصل`}]),P=C(``),F=C(`all`),I=C(!0),L=C(null),R=C(null),z=C(``),B=C(!1),V=ce(),ft=u(()=>[{value:`all`,label:`همه کالیتهها`},...j.value.map(e=>({value:e.id,label:`${e.code} — ${e.name}`}))]),pt=u(()=>j.value.map(e=>({value:e.id,label:`${e.code} — ${e.name} (${e.companyName})`}))),H=()=>({catalogId:j.value[0]?.id??``,name:``,color:``,productCode:``,minMeterage:100,orderStep:50,price:null,internalStock:0,isActive:!0,usageCategory:`other`,season:`all_season`,composition:``,weaveType:``,subtitle:``,rollMeters:50,isNew:!1,colorRows:[{name:``,imageUrl:``}],extraImageUrls:[]}),U=oe(H()),mt=u(()=>L.value!==null),ht=u(()=>L.value===`edit`?`ویرایش محصول`:`افزودن محصول`),W=u(()=>U.name.trim()&&U.catalogId&&U.minMeterage>0),G=u(()=>P.value.trim().length>0||F.value!==`all`),K=u(()=>{let e=_.value;F.value!==`all`&&(e=e.filter(e=>e.catalogId===F.value));let t=P.value.trim();return t&&(e=e.filter(e=>e.name.includes(t)||e.color.includes(t)||e.productCode.includes(t)||e.catalogCode.includes(t))),e});async function gt(){I.value=!0;try{let[e,n,r]=await Promise.all([s.list(),re.list(),t.get().catch(()=>null)]);_.value=e,j.value=n,r?.categoryDefsJson?.usage?.length&&(M.value=[...r.categoryDefsJson.usage.map(e=>({value:e.id,label:e.title})),{value:`other`,label:`سایر`}]),r?.categoryDefsJson?.seasons?.length&&(N.value=r.categoryDefsJson.seasons.map(e=>({value:e.id,label:e.title})))}catch(e){V.error(e instanceof a?e.message:`بارگذاری محصولات انجام نشد.`)}finally{I.value=!1}}ae(()=>{gt()});function _t(e){return j.value.find(t=>t.id===e)}function q(){L.value=`add`,R.value=null,Object.assign(U,H()),z.value=``}function J(e){L.value=`edit`,R.value=e.id,U.catalogId=e.catalogId,U.name=e.name,U.color=e.color,U.productCode=e.productCode,U.minMeterage=e.minMeterage,U.orderStep=e.orderStep,U.price=e.price,U.internalStock=e.internalStock,U.isActive=e.isActive,U.usageCategory=e.usageCategory??`other`,U.season=e.season??`all_season`,U.composition=e.composition??``,U.weaveType=e.weaveType??``,U.subtitle=e.subtitle??``,U.rollMeters=e.rollMeters??50,U.isNew=e.isNew??!1;let t=e.colors??[],n=e.colorImages??[],r=[...e.imageUrls??[]];if(t.length){U.colorRows=t.map((e,t)=>({name:e,imageUrl:n[t]||r[t]||``}));let e=new Set(U.colorRows.map(e=>e.imageUrl).filter(Boolean));U.extraImageUrls=r.filter(t=>!e.has(t))}else U.colorRows=[{name:e.color||``,imageUrl:r[0]||``}],U.extraImageUrls=r.slice(1);z.value=``}function vt(){U.colorRows.push({name:``,imageUrl:``})}function yt(e){if(U.colorRows.length<=1){U.colorRows[0]={name:``,imageUrl:``};return}U.colorRows.splice(e,1)}let Y=C(!1);async function bt(e){let t=e.target,n=[...t.files??[]];if(t.value=``,n.length){Y.value=!0,z.value=``;try{let e=await Promise.all(n.map(e=>de(e)));U.extraImageUrls=[...U.extraImageUrls,...e]}catch(e){z.value=e instanceof Error?e.message:`بارگذاری تصویر ناموفق بود.`}finally{Y.value=!1}}}function xt(e){U.extraImageUrls.splice(e,1)}function X(){let e=[],t=[],n=new Set,r=e=>{let r=e?.trim();!r||n.has(r)||(n.add(r),t.push(r))};return U.colorRows.forEach((t,n)=>{let i=t.imageUrl.trim()||void 0,a=t.name.trim()||(n===0?U.color.trim():``)||(i?`رنگ ${n+1}`:``);!a&&!i||(a&&e.push({name:a,imageUrl:i}),r(i))}),U.extraImageUrls.forEach(e=>r(e)),{colorEntries:e,imageUrls:t}}function Z(){L.value=null,R.value=null,z.value=``}async function Q(){if(!W.value){z.value=`نام محصول، کالیته و حداقل متراژ الزامی هستند.`;return}let e=_t(U.catalogId);if(!e){z.value=`کالیته معتبر انتخاب کنید.`;return}let{colorEntries:t,imageUrls:n}=X(),r={usageCategory:U.usageCategory,season:U.season,composition:U.composition.trim()||null,weaveType:U.weaveType.trim()||null,subtitle:U.subtitle.trim()||null,rollMeters:U.rollMeters,isNew:U.isNew,colorsJson:t,imageUrlsJson:n},i=U.productCode.trim()||`${e.code}-NEW`;B.value=!0;try{if(L.value===`edit`&&R.value){let e=await s.update(R.value,{catalogId:U.catalogId,name:U.name.trim(),color:U.color.trim()||t[0]?.name||`—`,code:i,productCode:i,minMeterage:U.minMeterage,orderStep:U.orderStep,price:U.price,internalStock:U.internalStock,isActive:U.isActive,...r}),n=_.value.findIndex(e=>e.id===R.value);n!==-1&&(_.value[n]={..._.value[n],...e}),V.success(`اطلاعات محصول بهروزرسانی شد.`)}else{let n=await s.create({companyId:e.companyId,catalogId:U.catalogId,name:U.name.trim(),color:U.color.trim()||t[0]?.name||`—`,code:i,productCode:i,minMeterage:U.minMeterage,orderStep:U.orderStep,price:U.price,internalStock:U.internalStock,isActive:U.isActive,...r});_.value.push(n),V.success(`محصول جدید ثبت شد.`)}Z()}catch(e){e instanceof a&&e.status===0&&(z.value=e.message),V.error(e instanceof a?e.message:`ذخیره محصول انجام نشد.`)}finally{B.value=!1}}async function $(e,t){await s.setActive(e,t)}function St(){P.value=``,F.value=`all`}return(t,a)=>(v(),m(`div`,me,[d(`div`,{class:`admin-page-header`},[a[18]||=d(`div`,null,[d(`h1`,{class:`admin-page-header__title`},`محصولات`)],-1),d(`button`,{type:`button`,class:`admin-btn admin-btn--primary`,onClick:q},` افزودن محصول `)]),d(`div`,he,[d(`div`,ge,[S(ee,{name:`search`,size:18}),h(d(`input`,{"onUpdate:modelValue":a[0]||=e=>P.value=e,type:`search`,class:`products-page__search-input`,placeholder:`جستجو در نام، رنگ، کد...`},null,512),[[r,P.value]])]),S(E,{modelValue:F.value,"onUpdate:modelValue":a[1]||=e=>F.value=e,class:`products-page__catalog-filter`,"aria-label":`فیلتر کالیته`,options:ft.value},null,8,[`modelValue`,`options`])]),I.value?(v(),o(le,{key:0,variant:`table`})):K.value.length?(v(),m(`div`,_e,[d(`div`,ve,[d(`table`,ye,[a[19]||=d(`thead`,null,[d(`tr`,null,[d(`th`,null,`تصویر`),d(`th`,null,`کد محصول`),d(`th`,null,`نام`),d(`th`,null,`رنگ`),d(`th`,null,`کالیته`),d(`th`,null,`شرکت`),d(`th`,{class:`numeric`},`حداقل متراژ`),d(`th`,{class:`numeric`},`ضریب`),d(`th`,{class:`numeric`},`قیمت`),d(`th`,{class:`numeric`},`موجودی`),d(`th`,{class:`status`},`وضعیت`),d(`th`,{class:`actions`},`عملیات`)])],-1),d(`tbody`,null,[(v(!0),m(i,null,p(K.value,e=>(v(),m(`tr`,{key:e.id},[d(`td`,null,[d(`span`,{class:se([`product-thumb`,{"product-thumb--empty":!e.imageUrls?.[0]}]),style:c(e.imageUrls?.[0]?{backgroundImage:f(T)(e.imageUrls[0])}:void 0)},null,6)]),d(`td`,null,n(e.productCode),1),d(`td`,null,n(e.name),1),d(`td`,null,n(e.color),1),d(`td`,null,n(e.catalogCode),1),d(`td`,null,n(e.companyName),1),d(`td`,be,n(f(x)(e.minMeterage))+` متر`,1),d(`td`,xe,n(f(x)(e.orderStep)),1),d(`td`,Se,n(e.price?f(y)(e.price):`—`),1),d(`td`,Ce,n(f(x)(e.internalStock))+` متر`,1),d(`td`,O,[S(D,{id:e.id,modelValue:e.isActive,"onUpdate:modelValue":t=>e.isActive=t,"entity-name":e.name,"entity-type":`محصول`,persist:$},null,8,[`id`,`modelValue`,`onUpdate:modelValue`,`entity-name`])]),d(`td`,k,[d(`button`,{type:`button`,class:`admin-btn admin-btn--ghost admin-btn--xs`,onClick:t=>J(e)},` ویرایش `,8,A)])]))),128))])])])])):(v(),o(ue,{key:1,class:`admin-card`,icon:`products`,title:G.value?`نتیجهای یافت نشد`:`محصولی ثبت نشده`,description:G.value?`عبارت جستجو را تغییر دهید یا فیلترها را پاک کنید.`:`برای شروع، اولین محصول را ثبت کنید.`},{default:g(()=>[G.value?(v(),m(`button`,{key:0,type:`button`,class:`admin-btn admin-btn--outline admin-btn--sm`,onClick:St},` پاک کردن فیلترها `)):(v(),m(`button`,{key:1,type:`button`,class:`admin-btn admin-btn--primary admin-btn--sm`,onClick:q},` افزودن محصول `))]),_:1},8,[`title`,`description`])),!I.value&&K.value.length?(v(),m(`div`,we,[(v(!0),m(i,null,p(K.value,e=>(v(),m(`article`,{key:e.id,class:`admin-card-item`},[d(`div`,Te,[d(`p`,Ee,n(e.name),1),d(`div`,De,[S(D,{id:e.id,modelValue:e.isActive,"onUpdate:modelValue":t=>e.isActive=t,"entity-name":e.name,"entity-type":`محصول`,persist:$},null,8,[`id`,`modelValue`,`onUpdate:modelValue`,`entity-name`]),d(`button`,{type:`button`,class:`admin-btn admin-btn--ghost admin-btn--xs`,onClick:t=>J(e)},` ویرایش `,8,Oe)])]),d(`div`,ke,[d(`span`,null,n(e.productCode),1),d(`span`,null,n(e.color),1),d(`span`,null,`کالیته `+n(e.catalogCode),1),d(`span`,null,n(e.price?f(y)(e.price):`بدون قیمت`),1)])]))),128))])):e(``,!0),S(te,{open:mt.value,title:ht.value,size:`lg`,onClose:Z},{footer:g(()=>[d(`button`,{type:`button`,class:`admin-btn admin-btn--outline`,onClick:Z},`انصراف`),d(`button`,{type:`button`,class:`admin-btn admin-btn--primary`,disabled:!W.value||B.value,onClick:Q},n(L.value===`edit`?`ذخیره تغییرات`:`ثبت محصول`),9,dt)]),default:g(()=>[d(`form`,{class:`admin-form`,onSubmit:ie(Q,[`prevent`])},[z.value?(v(),m(`p`,Ae,n(z.value),1)):e(``,!0),d(`div`,je,[a[20]||=d(`label`,null,[b(`کالیته `),d(`span`,{class:`admin-form__required`},`*`)],-1),S(E,{modelValue:U.catalogId,"onUpdate:modelValue":a[2]||=e=>U.catalogId=e,block:``,"aria-label":`انتخاب کالیته`,placeholder:`انتخاب کالیته`,options:pt.value},null,8,[`modelValue`,`options`])]),d(`div`,Me,[d(`div`,Ne,[a[21]||=d(`label`,{for:`product-name`},[b(`نام محصول `),d(`span`,{class:`admin-form__required`},`*`)],-1),h(d(`input`,{id:`product-name`,"onUpdate:modelValue":a[3]||=e=>U.name=e,type:`text`,class:`admin-input`},null,512),[[r,U.name]])]),d(`div`,Pe,[a[22]||=d(`label`,{for:`product-color`},`رنگ / نوع`,-1),h(d(`input`,{id:`product-color`,"onUpdate:modelValue":a[4]||=e=>U.color=e,type:`text`,class:`admin-input`},null,512),[[r,U.color]])])]),d(`div`,Fe,[a[23]||=d(`label`,{for:`product-code`},`کد محصول`,-1),h(d(`input`,{id:`product-code`,"onUpdate:modelValue":a[5]||=e=>U.productCode=e,type:`text`,class:`admin-input`,dir:`ltr`},null,512),[[r,U.productCode]])]),d(`div`,Ie,[d(`div`,Le,[a[24]||=d(`label`,{for:`product-min`},`حداقل متراژ`,-1),h(d(`input`,{id:`product-min`,"onUpdate:modelValue":a[6]||=e=>U.minMeterage=e,type:`number`,min:`1`,class:`admin-input`},null,512),[[r,U.minMeterage,void 0,{number:!0}]])]),d(`div`,Re,[a[25]||=d(`label`,{for:`product-step`},`ضریب سفارش`,-1),h(d(`input`,{id:`product-step`,"onUpdate:modelValue":a[7]||=e=>U.orderStep=e,type:`number`,min:`1`,class:`admin-input`},null,512),[[r,U.orderStep,void 0,{number:!0}]])])]),d(`div`,ze,[d(`div`,Be,[a[26]||=d(`label`,{for:`product-price`},`قیمت (تومان)`,-1),S(pe,{id:`product-price`,modelValue:U.price,"onUpdate:modelValue":a[8]||=e=>U.price=e},null,8,[`modelValue`])]),d(`div`,Ve,[a[27]||=d(`label`,{for:`product-stock`},`موجودی داخلی (متر)`,-1),h(d(`input`,{id:`product-stock`,"onUpdate:modelValue":a[9]||=e=>U.internalStock=e,type:`number`,min:`0`,class:`admin-input`},null,512),[[r,U.internalStock,void 0,{number:!0}]])])]),d(`div`,He,[d(`div`,Ue,[a[28]||=d(`label`,{for:`product-usage`},`کاربرد`,-1),h(d(`select`,{id:`product-usage`,"onUpdate:modelValue":a[10]||=e=>U.usageCategory=e,class:`admin-input`},[(v(!0),m(i,null,p(M.value,e=>(v(),m(`option`,{key:e.value,value:e.value},n(e.label),9,We))),128))],512),[[l,U.usageCategory]])]),d(`div`,Ge,[a[29]||=d(`label`,{for:`product-season`},`فصل`,-1),h(d(`select`,{id:`product-season`,"onUpdate:modelValue":a[11]||=e=>U.season=e,class:`admin-input`},[(v(!0),m(i,null,p(N.value,e=>(v(),m(`option`,{key:e.value,value:e.value},n(e.label),9,Ke))),128))],512),[[l,U.season]])])]),d(`div`,qe,[d(`div`,Je,[a[30]||=d(`label`,{for:`product-composition`},`جنس / ترکیب`,-1),h(d(`input`,{id:`product-composition`,"onUpdate:modelValue":a[12]||=e=>U.composition=e,type:`text`,class:`admin-input`},null,512),[[r,U.composition]])]),d(`div`,Ye,[a[31]||=d(`label`,{for:`product-weave`},`نوع بافت`,-1),h(d(`input`,{id:`product-weave`,"onUpdate:modelValue":a[13]||=e=>U.weaveType=e,type:`text`,class:`admin-input`},null,512),[[r,U.weaveType]])])]),d(`div`,Xe,[d(`div`,Ze,[a[32]||=d(`label`,{for:`product-subtitle`},`زیرعنوان`,-1),h(d(`input`,{id:`product-subtitle`,"onUpdate:modelValue":a[14]||=e=>U.subtitle=e,type:`text`,class:`admin-input`},null,512),[[r,U.subtitle]])]),d(`div`,Qe,[a[33]||=d(`label`,{for:`product-roll`},`متراژ طاقه`,-1),h(d(`input`,{id:`product-roll`,"onUpdate:modelValue":a[15]||=e=>U.rollMeters=e,type:`number`,min:`1`,class:`admin-input`},null,512),[[r,U.rollMeters,void 0,{number:!0}]])])]),d(`div`,$e,[a[34]||=d(`label`,null,`رنگها و تصویر هر رنگ`,-1),a[35]||=d(`p`,{class:`color-variants__hint`},` برای هر رنگ نام و عکس بگذارید. اگر فقط عکس دارید، نام رنگ اصلی (بالا) یا «رنگ ۱» استفاده میشود. تصویر با زدن «ذخیره تغییرات» روی سرور ثبت میشود. `,-1),d(`div`,et,[(v(!0),m(i,null,p(U.colorRows,(e,t)=>(v(),m(`div`,{key:t,class:`color-variant`},[S(fe,{"model-value":e.imageUrl||null,"onUpdate:modelValue":t=>e.imageUrl=t??``},null,8,[`model-value`,`onUpdate:modelValue`]),d(`div`,tt,[h(d(`input`,{"onUpdate:modelValue":t=>e.name=t,type:`text`,class:`admin-input`,placeholder:`نام رنگ ${t+1}`},null,8,nt),[[r,e.name]]),d(`button`,{type:`button`,class:`admin-btn admin-btn--ghost admin-btn--xs`,onClick:e=>yt(t)},` حذف این رنگ `,8,rt)])]))),128)),d(`button`,{type:`button`,class:`admin-btn admin-btn--outline`,onClick:vt},` + افزودن رنگ `)])]),d(`div`,it,[a[36]||=d(`label`,null,`تصاویر عمومی محصول (اختیاری)`,-1),a[37]||=d(`p`,{class:`color-variants__hint`},`پس از انتخاب فایل، حتماً دکمه ذخیره را بزنید.`,-1),d(`div`,at,[(v(!0),m(i,null,p(U.extraImageUrls,(e,t)=>(v(),m(`div`,{key:`${t}-${e.slice(0,24)}`,class:`product-images__item`},[d(`span`,{class:`product-images__thumb`,style:c({backgroundImage:f(T)(e)})},null,4),d(`button`,{type:`button`,class:`product-images__remove`,onClick:e=>xt(t)},` حذف `,8,ot)]))),128)),d(`label`,st,[d(`input`,{type:`file`,accept:`image/*`,multiple:``,hidden:``,disabled:Y.value,onChange:bt},null,40,ct),b(` `+n(Y.value?`...`:`+ افزودن تصویر`),1)])])]),d(`div`,lt,[S(w,{modelValue:U.isNew,"onUpdate:modelValue":a[16]||=e=>U.isNew=e,label:`محصول جدید`},null,8,[`modelValue`])]),d(`div`,ut,[S(w,{modelValue:U.isActive,"onUpdate:modelValue":a[17]||=e=>U.isActive=e,label:`وضعیت`},null,8,[`modelValue`])])],32)]),_:1},8,[`open`,`title`])]))}}),[[`__scopeId`,`data-v-761ea8ca`]]);export{j as default}; |