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