Files
nademitex_admin/dist/assets/ProductsView-V-E7JmoO.js
T
mohmdsdgandCopilot 9854842ada fix(auth): secure sessions and app routing
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>
2026-09-24 20:14:11 +03:30

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};