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