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>
This commit is contained in:
2026-09-24 20:14:11 +03:30
co-authored by Copilot
parent 83edf721ba
commit 9854842ada
45 changed files with 285 additions and 184 deletions
+3 -2
View File
@@ -1,4 +1,5 @@
# Same-origin in dev (Vite proxies to the real API — avoids CORS) # Same-origin in dev (Vite proxies to the real API — avoids CORS)
VITE_API_BASE_URL=/server/api VITE_API_BASE_URL=https://nademitex.montest.ir/server/api
# بدون سرور هم می‌شود وارد شد # بدون سرور هم می‌شود وارد شد
VITE_USE_MOCK_AUTH=true VITE_USE_MOCK_AUTH=false
VITE_BASE_PATH=/admin/
+1
View File
@@ -1 +1,2 @@
VITE_API_BASE_URL=https://nademitex.montest.ir/server/api VITE_API_BASE_URL=https://nademitex.montest.ir/server/api
VITE_BASE_PATH=/admin/
@@ -1 +1 @@
import{L as e,Q as t,bt as n,it as r,lt as i,yt as a,z as o}from"./index-Ce0o2VuJ.js";import{t as s}from"./BaseSwitch-C9HY6KUs.js";function c(e=480){return new Promise(t=>{window.setTimeout(t,e)})}function l(e){let t=a(null),n=a(null),r=o();async function i(i,a){if(t.value)return a;let o=!a;if(!o&&e.confirmOff&&!await e.confirmOff())return a;t.value=i,n.value=null;let s=a;try{return await e.onPersist(o),r.success(e.successMessage?.(o)??(o?`وضعیت فعال شد.`:`وضعیت غیرفعال شد.`)),o}catch{return n.value=i,r.error(e.errorMessage??`به‌روزرسانی وضعیت انجام نشد.`),s}finally{t.value=null}}function s(e){return t.value===e}function c(e){return n.value===e}return{toggle:i,isLoading:s,hasError:c}}var u=r({__name:`ActiveSwitchCell`,props:{id:{},modelValue:{type:Boolean},entityName:{},entityType:{},persist:{type:Function}},emits:[`update:modelValue`],setup(r,{emit:a}){let o=r,u=a,{toggle:d,isLoading:f,hasError:p}=l({onPersist:async e=>{o.persist?await o.persist(o.id,e):await c()},successMessage:e=>e?`${o.entityType??`مورد`} «${o.entityName}» فعال شد.`:`${o.entityType??`مورد`} «${o.entityName}» غیرفعال شد.`});async function m(t){if(t===o.modelValue)return;let n=o.entityType??`مورد`;if(!await e({title:t?`فعال‌سازی ${n}`:`غیرفعال‌سازی ${n}`,message:t?`آیا از فعال کردن «${o.entityName}» مطمئن هستید؟`:`آیا از غیرفعال کردن «${o.entityName}» مطمئن هستید؟`,tone:t?`primary`:`danger`,confirmLabel:t?`فعال کردن`:`غیرفعال کردن`,cancelLabel:`انصراف`}))return;let r=await d(o.id,o.modelValue);u(`update:modelValue`,r)}return(e,a)=>(i(),t(s,{"model-value":r.modelValue,loading:n(f)(r.id),error:n(p)(r.id),"onUpdate:modelValue":m},null,8,[`model-value`,`loading`,`error`]))}});export{u as t}; import{L as e,Q as t,bt as n,it as r,lt as i,yt as a,z as o}from"./index-B2VD3zy8.js";import{t as s}from"./BaseSwitch-dp2xMemS.js";function c(e=480){return new Promise(t=>{window.setTimeout(t,e)})}function l(e){let t=a(null),n=a(null),r=o();async function i(i,a){if(t.value)return a;let o=!a;if(!o&&e.confirmOff&&!await e.confirmOff())return a;t.value=i,n.value=null;let s=a;try{return await e.onPersist(o),r.success(e.successMessage?.(o)??(o?`وضعیت فعال شد.`:`وضعیت غیرفعال شد.`)),o}catch{return n.value=i,r.error(e.errorMessage??`به‌روزرسانی وضعیت انجام نشد.`),s}finally{t.value=null}}function s(e){return t.value===e}function c(e){return n.value===e}return{toggle:i,isLoading:s,hasError:c}}var u=r({__name:`ActiveSwitchCell`,props:{id:{},modelValue:{type:Boolean},entityName:{},entityType:{},persist:{type:Function}},emits:[`update:modelValue`],setup(r,{emit:a}){let o=r,u=a,{toggle:d,isLoading:f,hasError:p}=l({onPersist:async e=>{o.persist?await o.persist(o.id,e):await c()},successMessage:e=>e?`${o.entityType??`مورد`} «${o.entityName}» فعال شد.`:`${o.entityType??`مورد`} «${o.entityName}» غیرفعال شد.`});async function m(t){if(t===o.modelValue)return;let n=o.entityType??`مورد`;if(!await e({title:t?`فعال‌سازی ${n}`:`غیرفعال‌سازی ${n}`,message:t?`آیا از فعال کردن «${o.entityName}» مطمئن هستید؟`:`آیا از غیرفعال کردن «${o.entityName}» مطمئن هستید؟`,tone:t?`primary`:`danger`,confirmLabel:t?`فعال کردن`:`غیرفعال کردن`,cancelLabel:`انصراف`}))return;let r=await d(o.id,o.modelValue);u(`update:modelValue`,r)}return(e,a)=>(i(),t(s,{"model-value":r.modelValue,loading:n(f)(r.id),error:n(p)(r.id),"onUpdate:modelValue":m},null,8,[`model-value`,`loading`,`error`]))}});export{u as t};
@@ -1 +1 @@
import{V as e,X as t,et as n,it as r,lt as i,o as a,t as o,xt as s}from"./index-Ce0o2VuJ.js";var c=[`id`,`value`,`placeholder`,`disabled`],l=e(r({__name:`AdminCurrencyInput`,props:{modelValue:{default:null},placeholder:{default:``},disabled:{type:Boolean,default:!1},id:{},inputClass:{default:`admin-input`},allowEmpty:{type:Boolean,default:!0}},emits:[`update:modelValue`],setup(e,{emit:r}){let l=e,u=r,d=t(()=>l.modelValue==null||!Number.isFinite(l.modelValue)?``:a(l.modelValue));function f(e){let t=e.target,n=o(t.value);if(!n){u(`update:modelValue`,l.allowEmpty?null:0),t.value=``;return}let r=Number(n);u(`update:modelValue`,r),t.value=a(r)}return(t,r)=>(i(),n(`input`,{id:e.id,type:`text`,inputmode:`numeric`,dir:`ltr`,class:s([`admin-currency-input`,e.inputClass]),value:d.value,placeholder:e.placeholder,disabled:e.disabled,onInput:f},null,42,c))}}),[[`__scopeId`,`data-v-56435fc8`]]);export{l as t}; import{V as e,X as t,et as n,it as r,lt as i,o as a,t as o,xt as s}from"./index-B2VD3zy8.js";var c=[`id`,`value`,`placeholder`,`disabled`],l=e(r({__name:`AdminCurrencyInput`,props:{modelValue:{default:null},placeholder:{default:``},disabled:{type:Boolean,default:!1},id:{},inputClass:{default:`admin-input`},allowEmpty:{type:Boolean,default:!0}},emits:[`update:modelValue`],setup(e,{emit:r}){let l=e,u=r,d=t(()=>l.modelValue==null||!Number.isFinite(l.modelValue)?``:a(l.modelValue));function f(e){let t=e.target,n=o(t.value);if(!n){u(`update:modelValue`,l.allowEmpty?null:0),t.value=``;return}let r=Number(n);u(`update:modelValue`,r),t.value=a(r)}return(t,r)=>(i(),n(`input`,{id:e.id,type:`text`,inputmode:`numeric`,dir:`ltr`,class:s([`admin-currency-input`,e.inputClass]),value:d.value,placeholder:e.placeholder,disabled:e.disabled,onInput:f},null,42,c))}}),[[`__scopeId`,`data-v-56435fc8`]]);export{l as t};
@@ -1 +1 @@
import{$ as e,Ct as t,St as n,V as r,Z as i,bt as a,et as o,it as s,lt as c,xt as l,yt as u}from"./index-Ce0o2VuJ.js";var d=960,f=.82;function p(e){let t=e.trim();return t?`url("${t.replace(/"/g,`\\"`)}")`:``}async function m(e){if(!e.type.startsWith(`image/`))throw Error(`فقط فایل تصویری مجاز است.`);if(e.size>8388608)throw Error(`حجم تصویر نباید بیشتر از ۸ مگابایت باشد.`);return g(await h(e))}function h(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=()=>t(String(r.result??``)),r.onerror=()=>n(Error(`خواندن تصویر ناموفق بود.`)),r.readAsDataURL(e)})}function g(e){return new Promise((t,n)=>{let r=new Image;r.onload=()=>{let e=Math.min(1,d/Math.max(r.width,r.height)),i=Math.max(1,Math.round(r.width*e)),a=Math.max(1,Math.round(r.height*e)),o=document.createElement(`canvas`);o.width=i,o.height=a;let s=o.getContext(`2d`);if(!s){n(Error(`پردازش تصویر ناموفق بود.`));return}s.drawImage(r,0,0,i,a),t(o.toDataURL(`image/jpeg`,f))},r.onerror=()=>n(Error(`تصویر نامعتبر است.`)),r.src=e})}var _={class:`image-picker`},v={key:0,class:`image-picker__label`},y={class:`image-picker__row`},b={class:`image-picker__actions`},x=[`disabled`],S=[`disabled`],C={key:1,class:`image-picker__error`},w={key:2,class:`image-picker__ok`},T=r(s({__name:`AdminImagePicker`,props:{modelValue:{},label:{}},emits:[`update:modelValue`],setup(r,{emit:s}){let d=r,f=s,h=u(null),g=u(!1),T=u(``),E=u(!1);function D(){h.value?.click()}async function O(e){let t=e.target,n=t.files?.[0];if(t.value=``,n){g.value=!0,T.value=``,E.value=!1;try{f(`update:modelValue`,await m(n)),E.value=!0}catch(e){T.value=e instanceof Error?e.message:`بارگذاری تصویر ناموفق بود.`}finally{g.value=!1}}}function k(){f(`update:modelValue`,null)}return(s,u)=>(c(),o(`div`,_,[r.label?(c(),o(`p`,v,t(r.label),1)):e(``,!0),i(`div`,y,[i(`div`,{class:l([`image-picker__preview`,{"image-picker__preview--empty":!d.modelValue}]),style:n(d.modelValue?{backgroundImage:a(p)(d.modelValue)}:void 0)},null,6),i(`div`,b,[i(`button`,{type:`button`,class:`admin-btn admin-btn--outline admin-btn--sm`,disabled:g.value,onClick:D},t(d.modelValue?`تغییر تصویر`:`افزودن تصویر`),9,x),d.modelValue?(c(),o(`button`,{key:0,type:`button`,class:`admin-btn admin-btn--outline admin-btn--sm`,disabled:g.value,onClick:k},` حذف `,8,S)):e(``,!0),T.value?(c(),o(`p`,C,t(T.value),1)):E.value?(c(),o(`p`,w,`تصویر انتخاب شد — برای ثبت نهایی «ذخیره» را بزنید.`)):e(``,!0)])]),i(`input`,{ref_key:`inputRef`,ref:h,type:`file`,accept:`image/*`,class:`image-picker__file`,onChange:O},null,544)]))}}),[[`__scopeId`,`data-v-05db5be7`]]);export{m as n,p as r,T as t}; import{$ as e,Ct as t,St as n,V as r,Z as i,bt as a,et as o,it as s,lt as c,xt as l,yt as u}from"./index-B2VD3zy8.js";var d=960,f=.82;function p(e){let t=e.trim();return t?`url("${t.replace(/"/g,`\\"`)}")`:``}async function m(e){if(!e.type.startsWith(`image/`))throw Error(`فقط فایل تصویری مجاز است.`);if(e.size>8388608)throw Error(`حجم تصویر نباید بیشتر از ۸ مگابایت باشد.`);return g(await h(e))}function h(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=()=>t(String(r.result??``)),r.onerror=()=>n(Error(`خواندن تصویر ناموفق بود.`)),r.readAsDataURL(e)})}function g(e){return new Promise((t,n)=>{let r=new Image;r.onload=()=>{let e=Math.min(1,d/Math.max(r.width,r.height)),i=Math.max(1,Math.round(r.width*e)),a=Math.max(1,Math.round(r.height*e)),o=document.createElement(`canvas`);o.width=i,o.height=a;let s=o.getContext(`2d`);if(!s){n(Error(`پردازش تصویر ناموفق بود.`));return}s.drawImage(r,0,0,i,a),t(o.toDataURL(`image/jpeg`,f))},r.onerror=()=>n(Error(`تصویر نامعتبر است.`)),r.src=e})}var _={class:`image-picker`},v={key:0,class:`image-picker__label`},y={class:`image-picker__row`},b={class:`image-picker__actions`},x=[`disabled`],S=[`disabled`],C={key:1,class:`image-picker__error`},w={key:2,class:`image-picker__ok`},T=r(s({__name:`AdminImagePicker`,props:{modelValue:{},label:{}},emits:[`update:modelValue`],setup(r,{emit:s}){let d=r,f=s,h=u(null),g=u(!1),T=u(``),E=u(!1);function D(){h.value?.click()}async function O(e){let t=e.target,n=t.files?.[0];if(t.value=``,n){g.value=!0,T.value=``,E.value=!1;try{f(`update:modelValue`,await m(n)),E.value=!0}catch(e){T.value=e instanceof Error?e.message:`بارگذاری تصویر ناموفق بود.`}finally{g.value=!1}}}function k(){f(`update:modelValue`,null)}return(s,u)=>(c(),o(`div`,_,[r.label?(c(),o(`p`,v,t(r.label),1)):e(``,!0),i(`div`,y,[i(`div`,{class:l([`image-picker__preview`,{"image-picker__preview--empty":!d.modelValue}]),style:n(d.modelValue?{backgroundImage:a(p)(d.modelValue)}:void 0)},null,6),i(`div`,b,[i(`button`,{type:`button`,class:`admin-btn admin-btn--outline admin-btn--sm`,disabled:g.value,onClick:D},t(d.modelValue?`تغییر تصویر`:`افزودن تصویر`),9,x),d.modelValue?(c(),o(`button`,{key:0,type:`button`,class:`admin-btn admin-btn--outline admin-btn--sm`,disabled:g.value,onClick:k},` حذف `,8,S)):e(``,!0),T.value?(c(),o(`p`,C,t(T.value),1)):E.value?(c(),o(`p`,w,`تصویر انتخاب شد — برای ثبت نهایی «ذخیره» را بزنید.`)):e(``,!0)])]),i(`input`,{ref_key:`inputRef`,ref:h,type:`file`,accept:`image/*`,class:`image-picker__file`,onChange:O},null,544)]))}}),[[`__scopeId`,`data-v-05db5be7`]]);export{m as n,p as r,T as t};
@@ -1 +1 @@
import{J as e,V as t,Z as n,dt as r,et as i,it as a,lt as o,tt as s}from"./index-Ce0o2VuJ.js";var c={class:`admin-page-skeleton`,role:`status`,"aria-live":`polite`,"aria-busy":`true`,"aria-label":`در حال بارگذاری`},l={class:`admin-card admin-page-skeleton__table`},u={key:1,class:`admin-card admin-page-skeleton__form`},d={key:2,class:`admin-card admin-page-skeleton__detail`},f={key:3,class:`admin-page-skeleton__cards`},p=t(a({__name:`AdminPageSkeleton`,props:{variant:{default:`cards`},rows:{default:5}},setup(t){return(a,p)=>(o(),i(`div`,c,[t.variant===`table`?(o(),i(e,{key:0},[p[1]||=n(`div`,{class:`admin-page-skeleton__toolbar`},[n(`span`,{class:`admin-skeleton admin-page-skeleton__search`}),n(`span`,{class:`admin-skeleton admin-page-skeleton__btn`})],-1),n(`div`,l,[(o(!0),i(e,null,r(t.rows,e=>(o(),i(`div`,{key:e,class:`admin-page-skeleton__tr`},[...p[0]||=[s(`<span class="admin-skeleton" style="width:18%;height:12px;" data-v-8283cd1d></span><span class="admin-skeleton" style="width:22%;height:12px;" data-v-8283cd1d></span><span class="admin-skeleton" style="width:14%;height:12px;" data-v-8283cd1d></span><span class="admin-skeleton" style="width:16%;height:12px;" data-v-8283cd1d></span><span class="admin-skeleton" style="width:12%;height:12px;" data-v-8283cd1d></span>`,5)]]))),128))])],64)):t.variant===`form`?(o(),i(`div`,u,[(o(!0),i(e,null,r(t.rows,e=>(o(),i(`div`,{key:e,class:`admin-page-skeleton__field`},[...p[2]||=[n(`span`,{class:`admin-skeleton`,style:{width:`28%`,height:`10px`}},null,-1),n(`span`,{class:`admin-skeleton`,style:{width:`100%`,height:`40px`,"border-radius":`10px`}},null,-1)]]))),128))])):t.variant===`detail`?(o(),i(`div`,d,[...p[3]||=[s(`<span class="admin-skeleton" style="width:40%;height:18px;" data-v-8283cd1d></span><span class="admin-skeleton" style="width:70%;height:12px;" data-v-8283cd1d></span><span class="admin-skeleton" style="width:100%;height:120px;border-radius:12px;" data-v-8283cd1d></span><span class="admin-skeleton" style="width:100%;height:12px;" data-v-8283cd1d></span><span class="admin-skeleton" style="width:88%;height:12px;" data-v-8283cd1d></span>`,5)]])):(o(),i(`div`,f,[(o(!0),i(e,null,r(t.rows,e=>(o(),i(`div`,{key:e,class:`admin-card admin-page-skeleton__card`},[...p[4]||=[n(`span`,{class:`admin-skeleton`,style:{width:`45%`,height:`14px`}},null,-1),n(`span`,{class:`admin-skeleton`,style:{width:`70%`,height:`11px`}},null,-1),n(`span`,{class:`admin-skeleton`,style:{width:`35%`,height:`11px`}},null,-1)]]))),128))]))]))}}),[[`__scopeId`,`data-v-8283cd1d`]]);export{p as t}; import{J as e,V as t,Z as n,dt as r,et as i,it as a,lt as o,tt as s}from"./index-B2VD3zy8.js";var c={class:`admin-page-skeleton`,role:`status`,"aria-live":`polite`,"aria-busy":`true`,"aria-label":`در حال بارگذاری`},l={class:`admin-card admin-page-skeleton__table`},u={key:1,class:`admin-card admin-page-skeleton__form`},d={key:2,class:`admin-card admin-page-skeleton__detail`},f={key:3,class:`admin-page-skeleton__cards`},p=t(a({__name:`AdminPageSkeleton`,props:{variant:{default:`cards`},rows:{default:5}},setup(t){return(a,p)=>(o(),i(`div`,c,[t.variant===`table`?(o(),i(e,{key:0},[p[1]||=n(`div`,{class:`admin-page-skeleton__toolbar`},[n(`span`,{class:`admin-skeleton admin-page-skeleton__search`}),n(`span`,{class:`admin-skeleton admin-page-skeleton__btn`})],-1),n(`div`,l,[(o(!0),i(e,null,r(t.rows,e=>(o(),i(`div`,{key:e,class:`admin-page-skeleton__tr`},[...p[0]||=[s(`<span class="admin-skeleton" style="width:18%;height:12px;" data-v-8283cd1d></span><span class="admin-skeleton" style="width:22%;height:12px;" data-v-8283cd1d></span><span class="admin-skeleton" style="width:14%;height:12px;" data-v-8283cd1d></span><span class="admin-skeleton" style="width:16%;height:12px;" data-v-8283cd1d></span><span class="admin-skeleton" style="width:12%;height:12px;" data-v-8283cd1d></span>`,5)]]))),128))])],64)):t.variant===`form`?(o(),i(`div`,u,[(o(!0),i(e,null,r(t.rows,e=>(o(),i(`div`,{key:e,class:`admin-page-skeleton__field`},[...p[2]||=[n(`span`,{class:`admin-skeleton`,style:{width:`28%`,height:`10px`}},null,-1),n(`span`,{class:`admin-skeleton`,style:{width:`100%`,height:`40px`,"border-radius":`10px`}},null,-1)]]))),128))])):t.variant===`detail`?(o(),i(`div`,d,[...p[3]||=[s(`<span class="admin-skeleton" style="width:40%;height:18px;" data-v-8283cd1d></span><span class="admin-skeleton" style="width:70%;height:12px;" data-v-8283cd1d></span><span class="admin-skeleton" style="width:100%;height:120px;border-radius:12px;" data-v-8283cd1d></span><span class="admin-skeleton" style="width:100%;height:12px;" data-v-8283cd1d></span><span class="admin-skeleton" style="width:88%;height:12px;" data-v-8283cd1d></span>`,5)]])):(o(),i(`div`,f,[(o(!0),i(e,null,r(t.rows,e=>(o(),i(`div`,{key:e,class:`admin-card admin-page-skeleton__card`},[...p[4]||=[n(`span`,{class:`admin-skeleton`,style:{width:`45%`,height:`14px`}},null,-1),n(`span`,{class:`admin-skeleton`,style:{width:`70%`,height:`11px`}},null,-1),n(`span`,{class:`admin-skeleton`,style:{width:`35%`,height:`11px`}},null,-1)]]))),128))]))]))}}),[[`__scopeId`,`data-v-8283cd1d`]]);export{p as t};
@@ -1 +1 @@
import{$ as e,Ct as t,G as n,J as r,K as i,O as a,P as o,Q as s,St as c,V as l,X as u,Y as d,Z as f,ct as p,dt as m,et as h,ft as g,gt as _,it as v,lt as y,mt as b,ot as x,q as S,rt as C,xt as w,yt as T}from"./index-Ce0o2VuJ.js";var E=[`id`],D=[`aria-label`,`aria-expanded`],O={class:`admin-select__trigger-content`},k={class:`admin-select__value`},A={class:`admin-select__chevron`,"aria-hidden":`true`},j=[`aria-label`],M={key:0,class:`admin-select__search`,role:`presentation`},N=[`placeholder`],P={key:1,class:`admin-select__empty`,role:`presentation`},F=[`aria-selected`,`onClick`],I={class:`admin-select__option-label`},L=l(v({__name:`AdminSelect`,props:{modelValue:{},options:{},placeholder:{default:`انتخاب کنید`},ariaLabel:{default:`انتخاب`},block:{type:Boolean,default:!1},searchable:{type:Boolean,default:!1},searchPlaceholder:{default:`جستجو…`},id:{default:void 0}},emits:[`update:modelValue`],setup(l,{emit:v}){let L=l,R=v,z=T(!1),B=T(``),V=T(null),H=T(null),U=T(null),W=T({});a(V,()=>{z.value=!1,B.value=``},{ignore:[H]});let G=u(()=>L.options.find(e=>e.value===L.modelValue)),K=u(()=>G.value?.label??L.placeholder),q=u(()=>{let e=B.value.trim().toLowerCase();return e?L.options.filter(t=>t.label.toLowerCase().includes(e)):L.options});function J(){let e=V.value;if(!e)return;let t=e.getBoundingClientRect(),n=Math.min(320,window.innerHeight*.5),r=window.innerHeight-t.bottom-6,i=t.top-6,a=r<Math.min(160,n)&&i>r,o=Math.max(120,Math.min(n,a?i:r));W.value={position:`fixed`,left:`${Math.max(8,Math.min(t.left,window.innerWidth-Math.max(t.width,220)-8))}px`,width:`${Math.max(t.width,220)}px`,zIndex:`1100`,maxHeight:`${o}px`,...a?{top:`auto`,bottom:`${window.innerHeight-t.top+6}px`}:{top:`${t.bottom+6}px`,bottom:`auto`}}}function Y(e){e?(window.addEventListener(`resize`,J),window.addEventListener(`scroll`,J,!0)):(window.removeEventListener(`resize`,J),window.removeEventListener(`scroll`,J,!0))}async function X(){z.value=!z.value,z.value&&(await x(),J(),L.searchable&&(B.value=``,await x(),U.value?.focus()))}function Z(e){R(`update:modelValue`,e),z.value=!1,B.value=``}return b(z,e=>{Y(e),e&&x(()=>J())}),p(()=>{Y(!1)}),(a,u)=>(y(),h(`div`,{id:l.id,ref_key:`rootRef`,ref:V,class:w([`admin-select`,{"admin-select--open":z.value,"admin-select--block":l.block}])},[f(`button`,{type:`button`,class:`admin-select__trigger`,"aria-label":l.ariaLabel,"aria-expanded":z.value,"aria-haspopup":`listbox`,onClick:X},[f(`span`,O,[g(a.$slots,`option-leading`,{option:G.value},void 0,!0),f(`span`,k,t(K.value),1)]),f(`span`,A,[C(o,{name:`chevron-down`,size:16})])],8,D),(y(),s(d,{to:`body`},[z.value?(y(),h(`ul`,{key:0,ref_key:`menuRef`,ref:H,class:`admin-select__menu`,role:`listbox`,"aria-label":l.ariaLabel,style:c(W.value)},[l.searchable?(y(),h(`li`,M,[_(f(`input`,{ref_key:`searchInputRef`,ref:U,"onUpdate:modelValue":u[0]||=e=>B.value=e,type:`search`,class:`admin-select__search-input`,placeholder:l.searchPlaceholder,onClick:u[1]||=S(()=>{},[`stop`]),onKeydown:u[2]||=i(S(e=>z.value=!1,[`stop`]),[`esc`])},null,40,N),[[n,B.value]])])):e(``,!0),q.value.length?e(``,!0):(y(),h(`li`,P,` موردی یافت نشد `)),(y(!0),h(r,null,m(q.value,n=>(y(),h(`li`,{key:n.value,role:`presentation`},[f(`button`,{type:`button`,class:w([`admin-select__option`,{"admin-select__option--active":n.value===l.modelValue}]),role:`option`,"aria-selected":n.value===l.modelValue,onClick:e=>Z(n.value)},[f(`span`,I,[g(a.$slots,`option-leading`,{option:n},void 0,!0),f(`span`,null,t(n.label),1)]),n.value===l.modelValue?(y(),s(o,{key:0,name:`check`,size:16,class:`admin-select__check`})):e(``,!0)],10,F)]))),128))],12,j)):e(``,!0)]))],10,E))}}),[[`__scopeId`,`data-v-4623e322`]]);export{L as t}; import{$ as e,Ct as t,G as n,J as r,K as i,O as a,P as o,Q as s,St as c,V as l,X as u,Y as d,Z as f,ct as p,dt as m,et as h,ft as g,gt as _,it as v,lt as y,mt as b,ot as x,q as S,rt as C,xt as w,yt as T}from"./index-B2VD3zy8.js";var E=[`id`],D=[`aria-label`,`aria-expanded`],O={class:`admin-select__trigger-content`},k={class:`admin-select__value`},A={class:`admin-select__chevron`,"aria-hidden":`true`},j=[`aria-label`],M={key:0,class:`admin-select__search`,role:`presentation`},N=[`placeholder`],P={key:1,class:`admin-select__empty`,role:`presentation`},F=[`aria-selected`,`onClick`],I={class:`admin-select__option-label`},L=l(v({__name:`AdminSelect`,props:{modelValue:{},options:{},placeholder:{default:`انتخاب کنید`},ariaLabel:{default:`انتخاب`},block:{type:Boolean,default:!1},searchable:{type:Boolean,default:!1},searchPlaceholder:{default:`جستجو…`},id:{default:void 0}},emits:[`update:modelValue`],setup(l,{emit:v}){let L=l,R=v,z=T(!1),B=T(``),V=T(null),H=T(null),U=T(null),W=T({});a(V,()=>{z.value=!1,B.value=``},{ignore:[H]});let G=u(()=>L.options.find(e=>e.value===L.modelValue)),K=u(()=>G.value?.label??L.placeholder),q=u(()=>{let e=B.value.trim().toLowerCase();return e?L.options.filter(t=>t.label.toLowerCase().includes(e)):L.options});function J(){let e=V.value;if(!e)return;let t=e.getBoundingClientRect(),n=Math.min(320,window.innerHeight*.5),r=window.innerHeight-t.bottom-6,i=t.top-6,a=r<Math.min(160,n)&&i>r,o=Math.max(120,Math.min(n,a?i:r));W.value={position:`fixed`,left:`${Math.max(8,Math.min(t.left,window.innerWidth-Math.max(t.width,220)-8))}px`,width:`${Math.max(t.width,220)}px`,zIndex:`1100`,maxHeight:`${o}px`,...a?{top:`auto`,bottom:`${window.innerHeight-t.top+6}px`}:{top:`${t.bottom+6}px`,bottom:`auto`}}}function Y(e){e?(window.addEventListener(`resize`,J),window.addEventListener(`scroll`,J,!0)):(window.removeEventListener(`resize`,J),window.removeEventListener(`scroll`,J,!0))}async function X(){z.value=!z.value,z.value&&(await x(),J(),L.searchable&&(B.value=``,await x(),U.value?.focus()))}function Z(e){R(`update:modelValue`,e),z.value=!1,B.value=``}return b(z,e=>{Y(e),e&&x(()=>J())}),p(()=>{Y(!1)}),(a,u)=>(y(),h(`div`,{id:l.id,ref_key:`rootRef`,ref:V,class:w([`admin-select`,{"admin-select--open":z.value,"admin-select--block":l.block}])},[f(`button`,{type:`button`,class:`admin-select__trigger`,"aria-label":l.ariaLabel,"aria-expanded":z.value,"aria-haspopup":`listbox`,onClick:X},[f(`span`,O,[g(a.$slots,`option-leading`,{option:G.value},void 0,!0),f(`span`,k,t(K.value),1)]),f(`span`,A,[C(o,{name:`chevron-down`,size:16})])],8,D),(y(),s(d,{to:`body`},[z.value?(y(),h(`ul`,{key:0,ref_key:`menuRef`,ref:H,class:`admin-select__menu`,role:`listbox`,"aria-label":l.ariaLabel,style:c(W.value)},[l.searchable?(y(),h(`li`,M,[_(f(`input`,{ref_key:`searchInputRef`,ref:U,"onUpdate:modelValue":u[0]||=e=>B.value=e,type:`search`,class:`admin-select__search-input`,placeholder:l.searchPlaceholder,onClick:u[1]||=S(()=>{},[`stop`]),onKeydown:u[2]||=i(S(e=>z.value=!1,[`stop`]),[`esc`])},null,40,N),[[n,B.value]])])):e(``,!0),q.value.length?e(``,!0):(y(),h(`li`,P,` موردی یافت نشد `)),(y(!0),h(r,null,m(q.value,n=>(y(),h(`li`,{key:n.value,role:`presentation`},[f(`button`,{type:`button`,class:w([`admin-select__option`,{"admin-select__option--active":n.value===l.modelValue}]),role:`option`,"aria-selected":n.value===l.modelValue,onClick:e=>Z(n.value)},[f(`span`,I,[g(a.$slots,`option-leading`,{option:n},void 0,!0),f(`span`,null,t(n.label),1)]),n.value===l.modelValue?(y(),s(o,{key:0,name:`check`,size:16,class:`admin-select__check`})):e(``,!0)],10,F)]))),128))],12,j)):e(``,!0)]))],10,E))}}),[[`__scopeId`,`data-v-4623e322`]]);export{L as t};
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
import{$ as e,Ct as t,P as n,V as r,Z as i,et as a,ft as o,it as s,lt as c,rt as l,xt as u}from"./index-Ce0o2VuJ.js";var d={class:`base-empty__icon`,"aria-hidden":`true`},f={class:`base-empty__title`},p={key:0,class:`base-empty__description`},m={key:1,class:`base-empty__actions`},h=r(s({__name:`BaseEmptyState`,props:{icon:{default:`file`},title:{},description:{},compact:{type:Boolean}},emits:[`action`,`secondary`],setup(r){return(s,h)=>(c(),a(`div`,{class:u([`base-empty`,{"base-empty--compact":r.compact}])},[i(`div`,d,[l(n,{name:r.icon,size:r.compact?28:36},null,8,[`name`,`size`])]),i(`h3`,f,t(r.title),1),r.description?(c(),a(`p`,p,t(r.description),1)):e(``,!0),s.$slots.default||s.$slots.secondary?(c(),a(`div`,m,[o(s.$slots,`default`,{},void 0,!0),o(s.$slots,`secondary`,{},void 0,!0)])):e(``,!0)],2))}}),[[`__scopeId`,`data-v-47ea81e4`]]);export{h as t}; import{$ as e,Ct as t,P as n,V as r,Z as i,et as a,ft as o,it as s,lt as c,rt as l,xt as u}from"./index-B2VD3zy8.js";var d={class:`base-empty__icon`,"aria-hidden":`true`},f={class:`base-empty__title`},p={key:0,class:`base-empty__description`},m={key:1,class:`base-empty__actions`},h=r(s({__name:`BaseEmptyState`,props:{icon:{default:`file`},title:{},description:{},compact:{type:Boolean}},emits:[`action`,`secondary`],setup(r){return(s,h)=>(c(),a(`div`,{class:u([`base-empty`,{"base-empty--compact":r.compact}])},[i(`div`,d,[l(n,{name:r.icon,size:r.compact?28:36},null,8,[`name`,`size`])]),i(`h3`,f,t(r.title),1),r.description?(c(),a(`p`,p,t(r.description),1)):e(``,!0),s.$slots.default||s.$slots.secondary?(c(),a(`div`,m,[o(s.$slots,`default`,{},void 0,!0),o(s.$slots,`secondary`,{},void 0,!0)])):e(``,!0)],2))}}),[[`__scopeId`,`data-v-47ea81e4`]]);export{h as t};
@@ -1 +1 @@
import{$ as e,Ct as t,V as n,X as r,Z as i,et as a,it as o,lt as s,xt as c}from"./index-Ce0o2VuJ.js";var l=[`title`],u={key:0,class:`base-switch__label`},d={class:`base-switch__control`},f=[`id`,`checked`,`disabled`,`aria-checked`,`aria-label`],p={class:`base-switch__track`,"aria-hidden":`true`},m={class:`base-switch__thumb`},h={key:0,class:`base-switch__spinner`},g=n(o({__name:`BaseSwitch`,props:{modelValue:{type:Boolean},disabled:{type:Boolean},loading:{type:Boolean},error:{type:Boolean},label:{},activeText:{default:`فعال`},inactiveText:{default:`غیرفعال`},id:{}},emits:[`update:modelValue`],setup(n,{emit:o}){let g=n,_=o,v=r(()=>g.id??`switch-${crypto.randomUUID().slice(0,8)}`),y=r(()=>g.modelValue?g.activeText:g.inactiveText);function b(e){let t=e.target,n=t.checked;t.checked=g.modelValue,!(g.disabled||g.loading)&&_(`update:modelValue`,n)}return(r,o)=>(s(),a(`label`,{class:c([`base-switch`,{"base-switch--disabled":n.disabled||n.loading,"base-switch--error":n.error}]),title:y.value},[n.label?(s(),a(`span`,u,t(n.label),1)):e(``,!0),i(`span`,d,[i(`input`,{id:v.value,class:`base-switch__input`,type:`checkbox`,role:`switch`,checked:n.modelValue,disabled:n.disabled||n.loading,"aria-checked":n.modelValue,"aria-label":n.label||y.value,onChange:b},null,40,f),i(`span`,p,[i(`span`,m,[n.loading?(s(),a(`span`,h)):e(``,!0)])])])],10,l))}}),[[`__scopeId`,`data-v-0410eed4`]]);export{g as t}; import{$ as e,Ct as t,V as n,X as r,Z as i,et as a,it as o,lt as s,xt as c}from"./index-B2VD3zy8.js";var l=[`title`],u={key:0,class:`base-switch__label`},d={class:`base-switch__control`},f=[`id`,`checked`,`disabled`,`aria-checked`,`aria-label`],p={class:`base-switch__track`,"aria-hidden":`true`},m={class:`base-switch__thumb`},h={key:0,class:`base-switch__spinner`},g=n(o({__name:`BaseSwitch`,props:{modelValue:{type:Boolean},disabled:{type:Boolean},loading:{type:Boolean},error:{type:Boolean},label:{},activeText:{default:`فعال`},inactiveText:{default:`غیرفعال`},id:{}},emits:[`update:modelValue`],setup(n,{emit:o}){let g=n,_=o,v=r(()=>g.id??`switch-${crypto.randomUUID().slice(0,8)}`),y=r(()=>g.modelValue?g.activeText:g.inactiveText);function b(e){let t=e.target,n=t.checked;t.checked=g.modelValue,!(g.disabled||g.loading)&&_(`update:modelValue`,n)}return(r,o)=>(s(),a(`label`,{class:c([`base-switch`,{"base-switch--disabled":n.disabled||n.loading,"base-switch--error":n.error}]),title:y.value},[n.label?(s(),a(`span`,u,t(n.label),1)):e(``,!0),i(`span`,d,[i(`input`,{id:v.value,class:`base-switch__input`,type:`checkbox`,role:`switch`,checked:n.modelValue,disabled:n.disabled||n.loading,"aria-checked":n.modelValue,"aria-label":n.label||y.value,onChange:b},null,40,f),i(`span`,p,[i(`span`,m,[n.loading?(s(),a(`span`,h)):e(``,!0)])])])],10,l))}}),[[`__scopeId`,`data-v-0410eed4`]]);export{g as t};
@@ -1 +1 @@
import{Ct as e,G as t,J as n,N as r,Q as i,R as a,V as o,X as s,Z as c,dt as l,et as u,gt as d,ht as f,it as p,lt as m,nt as h,rt as g,st as _,u as v,vt as y,yt as b,z as x}from"./index-Ce0o2VuJ.js";import{t as S}from"./AdminPageSkeleton-CeCa2h-t.js";import{t as C}from"./BaseSwitch-C9HY6KUs.js";import{t as w}from"./BaseEmptyState-SjEY4tIJ.js";var T={class:`admin-page`},E={key:2,class:`admin-table`},D={dir:`ltr`},O=[`onClick`],k={class:`field`},A={class:`field`},j={class:`field`},M={class:`field`},N=[`disabled`],P=o(p({__name:`BrandsView`,setup(o){let p=b([]),P=b(!0),F=b(!1),I=b(null),L=x(),R=y({name:``,slug:``,description:``,displayOrder:0,isActive:!0}),z=s(()=>I.value?`ویرایش برند`:`افزودن برند`);async function B(){P.value=!0;try{p.value=await v.list()}catch(e){L.error(e instanceof r?e.message:`بارگذاری برندها ناموفق بود`)}finally{P.value=!1}}function V(){I.value=null,Object.assign(R,{name:``,slug:``,description:``,displayOrder:p.value.length+1,isActive:!0}),F.value=!0}function H(e){I.value=e.id,Object.assign(R,{name:e.name,slug:e.slug??``,description:e.description??``,displayOrder:e.displayOrder,isActive:e.isActive}),F.value=!0}async function U(){try{let e={name:R.name.trim(),slug:R.slug.trim()||void 0,description:R.description.trim()||void 0,displayOrder:R.displayOrder,isActive:R.isActive};I.value?await v.update(I.value,e):await v.create(e),F.value=!1,L.success(`ذخیره شد`),await B()}catch(e){L.error(e instanceof r?e.message:`ذخیره ناموفق بود`)}}return _(()=>{B()}),(r,o)=>(m(),u(`div`,T,[c(`header`,{class:`admin-page__head`},[o[6]||=c(`div`,null,[c(`h1`,null,`برندها`)],-1),c(`button`,{type:`button`,class:`admin-btn admin-btn--primary`,onClick:V},`افزودن برند`)]),P.value?(m(),i(S,{key:0,variant:`table`})):p.value.length?(m(),u(`table`,E,[o[7]||=c(`thead`,null,[c(`tr`,null,[c(`th`,null,`نام`),c(`th`,null,`شناسه لاتین`),c(`th`,null,`مشتریان`),c(`th`,null,`فعال`),c(`th`)])],-1),c(`tbody`,null,[(m(!0),u(n,null,l(p.value,t=>(m(),u(`tr`,{key:t.id},[c(`td`,null,e(t.name),1),c(`td`,D,e(t.slug||`—`),1),c(`td`,null,e(t.customersCount??0),1),c(`td`,null,e(t.isActive?`بله`:`خیر`),1),c(`td`,null,[c(`button`,{type:`button`,class:`link`,onClick:e=>H(t)},`ویرایش`,8,O)])]))),128))])])):(m(),i(w,{key:1,title:`برندی ثبت نشده`})),g(a,{open:F.value,title:z.value,onClose:o[5]||=e=>F.value=!1},{footer:f(()=>[c(`button`,{type:`button`,class:`admin-btn admin-btn--primary`,disabled:!R.name.trim(),onClick:U},`ذخیره`,8,N)]),default:f(()=>[c(`label`,k,[o[8]||=h(`نام`,-1),d(c(`input`,{"onUpdate:modelValue":o[0]||=e=>R.name=e,class:`admin-input`},null,512),[[t,R.name]])]),c(`label`,A,[o[9]||=h(`شناسه لاتین`,-1),d(c(`input`,{"onUpdate:modelValue":o[1]||=e=>R.slug=e,class:`admin-input`,dir:`ltr`,placeholder:`مثلاً nademi-silk`},null,512),[[t,R.slug]])]),c(`label`,j,[o[10]||=h(`توضیح`,-1),d(c(`textarea`,{"onUpdate:modelValue":o[2]||=e=>R.description=e,class:`admin-input`,rows:`3`},null,512),[[t,R.description]])]),c(`label`,M,[o[11]||=h(`ترتیب`,-1),d(c(`input`,{"onUpdate:modelValue":o[3]||=e=>R.displayOrder=e,type:`number`,class:`admin-input`},null,512),[[t,R.displayOrder,void 0,{number:!0}]])]),g(C,{modelValue:R.isActive,"onUpdate:modelValue":o[4]||=e=>R.isActive=e,label:`فعال`},null,8,[`modelValue`])]),_:1},8,[`open`,`title`])]))}}),[[`__scopeId`,`data-v-88043806`]]);export{P as default}; import{Ct as e,G as t,J as n,N as r,Q as i,R as a,V as o,X as s,Z as c,dt as l,et as u,gt as d,ht as f,it as p,lt as m,nt as h,rt as g,st as _,u as v,vt as y,yt as b,z as x}from"./index-B2VD3zy8.js";import{t as S}from"./AdminPageSkeleton-BJpm6oxf.js";import{t as C}from"./BaseSwitch-dp2xMemS.js";import{t as w}from"./BaseEmptyState-DGu6Pfui.js";var T={class:`admin-page`},E={key:2,class:`admin-table`},D={dir:`ltr`},O=[`onClick`],k={class:`field`},A={class:`field`},j={class:`field`},M={class:`field`},N=[`disabled`],P=o(p({__name:`BrandsView`,setup(o){let p=b([]),P=b(!0),F=b(!1),I=b(null),L=x(),R=y({name:``,slug:``,description:``,displayOrder:0,isActive:!0}),z=s(()=>I.value?`ویرایش برند`:`افزودن برند`);async function B(){P.value=!0;try{p.value=await v.list()}catch(e){L.error(e instanceof r?e.message:`بارگذاری برندها ناموفق بود`)}finally{P.value=!1}}function V(){I.value=null,Object.assign(R,{name:``,slug:``,description:``,displayOrder:p.value.length+1,isActive:!0}),F.value=!0}function H(e){I.value=e.id,Object.assign(R,{name:e.name,slug:e.slug??``,description:e.description??``,displayOrder:e.displayOrder,isActive:e.isActive}),F.value=!0}async function U(){try{let e={name:R.name.trim(),slug:R.slug.trim()||void 0,description:R.description.trim()||void 0,displayOrder:R.displayOrder,isActive:R.isActive};I.value?await v.update(I.value,e):await v.create(e),F.value=!1,L.success(`ذخیره شد`),await B()}catch(e){L.error(e instanceof r?e.message:`ذخیره ناموفق بود`)}}return _(()=>{B()}),(r,o)=>(m(),u(`div`,T,[c(`header`,{class:`admin-page__head`},[o[6]||=c(`div`,null,[c(`h1`,null,`برندها`)],-1),c(`button`,{type:`button`,class:`admin-btn admin-btn--primary`,onClick:V},`افزودن برند`)]),P.value?(m(),i(S,{key:0,variant:`table`})):p.value.length?(m(),u(`table`,E,[o[7]||=c(`thead`,null,[c(`tr`,null,[c(`th`,null,`نام`),c(`th`,null,`شناسه لاتین`),c(`th`,null,`مشتریان`),c(`th`,null,`فعال`),c(`th`)])],-1),c(`tbody`,null,[(m(!0),u(n,null,l(p.value,t=>(m(),u(`tr`,{key:t.id},[c(`td`,null,e(t.name),1),c(`td`,D,e(t.slug||`—`),1),c(`td`,null,e(t.customersCount??0),1),c(`td`,null,e(t.isActive?`بله`:`خیر`),1),c(`td`,null,[c(`button`,{type:`button`,class:`link`,onClick:e=>H(t)},`ویرایش`,8,O)])]))),128))])])):(m(),i(w,{key:1,title:`برندی ثبت نشده`})),g(a,{open:F.value,title:z.value,onClose:o[5]||=e=>F.value=!1},{footer:f(()=>[c(`button`,{type:`button`,class:`admin-btn admin-btn--primary`,disabled:!R.name.trim(),onClick:U},`ذخیره`,8,N)]),default:f(()=>[c(`label`,k,[o[8]||=h(`نام`,-1),d(c(`input`,{"onUpdate:modelValue":o[0]||=e=>R.name=e,class:`admin-input`},null,512),[[t,R.name]])]),c(`label`,A,[o[9]||=h(`شناسه لاتین`,-1),d(c(`input`,{"onUpdate:modelValue":o[1]||=e=>R.slug=e,class:`admin-input`,dir:`ltr`,placeholder:`مثلاً nademi-silk`},null,512),[[t,R.slug]])]),c(`label`,j,[o[10]||=h(`توضیح`,-1),d(c(`textarea`,{"onUpdate:modelValue":o[2]||=e=>R.description=e,class:`admin-input`,rows:`3`},null,512),[[t,R.description]])]),c(`label`,M,[o[11]||=h(`ترتیب`,-1),d(c(`input`,{"onUpdate:modelValue":o[3]||=e=>R.displayOrder=e,type:`number`,class:`admin-input`},null,512),[[t,R.displayOrder,void 0,{number:!0}]])]),g(C,{modelValue:R.isActive,"onUpdate:modelValue":o[4]||=e=>R.isActive=e,label:`فعال`},null,8,[`modelValue`])]),_:1},8,[`open`,`title`])]))}}),[[`__scopeId`,`data-v-88043806`]]);export{P as default};
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
import{$ as e,Ct as t,J as n,N as r,Q as i,V as a,Z as o,bt as s,dt as c,et as l,f as u,i as d,it as f,lt as p,nt as m,rt as h,st as g,yt as _,z as v}from"./index-Ce0o2VuJ.js";import{t as y}from"./AdminPageSkeleton-CeCa2h-t.js";import{t as b}from"./BaseEmptyState-SjEY4tIJ.js";import{t as x}from"./AdminSelect-DW0RlAc0.js";var S={class:`admin-page`},C={class:`admin-page__head`},w={class:`request-card__top`},T={class:`muted`,dir:`ltr`},E={class:`badge`},D={key:0,class:`muted`},O={class:`admin-table`},k={dir:`ltr`},A={key:0,class:`movements`},j={class:`muted`},M=a(f({__name:`CatalogRequestsView`,setup(a){let f=[{value:``,label:`همه وضعیت‌ها`},{value:`new`,label:`درخواست جدید`},{value:`approved`,label:`تأیید شده`},{value:`ready_to_ship`,label:`آماده ارسال`},{value:`delivered`,label:`تحویل به مشتری`},{value:`returned`,label:`بازگردانده شده`},{value:`cancelled`,label:`لغو شده`}],M=[{value:`warehouse`,label:`انبار`},{value:`customer`,label:`مشتری`},{value:`agent`,label:`واسطه`}],N=Object.fromEntries(f.filter(e=>e.value).map(e=>[e.value,e.label])),P=Object.fromEntries(M.map(e=>[e.value,e.label])),F=_([]),I=_(``),L=_(!0),R=_(null),z=v();async function B(){L.value=!0;try{F.value=await u.list(I.value||void 0)}catch(e){z.error(e instanceof r?e.message:`بارگذاری انجام نشد`)}finally{L.value=!1}}async function V(e,t){try{await u.updateStatus(e,t),z.success(`وضعیت به‌روز شد`),await B()}catch(e){z.error(e instanceof r?e.message:`به‌روزرسانی ناموفق بود`)}}async function H(e,t){if(!R.value){R.value=e;try{await u.updateHolder(e,{holderType:t}),z.success(`محل نگهداری به‌روز شد`),await B()}catch(e){z.error(e instanceof r?e.message:`به‌روزرسانی محل ناموفق بود`)}finally{R.value=null}}}function U(e){return P[e]??e}return g(()=>{B()}),(r,a)=>(p(),l(`div`,S,[o(`header`,C,[a[1]||=o(`div`,null,[o(`h1`,null,`درخواست کالیته فیزیکی`),o(`p`,null,`بررسی، گردش وضعیت و محل نگهداری اقلام`)],-1),h(x,{modelValue:I.value,"onUpdate:modelValue":[a[0]||=e=>I.value=e,B],options:f},null,8,[`modelValue`])]),L.value?(p(),i(y,{key:0,variant:`cards`})):F.value.length?(p(!0),l(n,{key:2},c(F.value,r=>(p(),l(`div`,{key:r.id,class:`request-card`},[o(`div`,w,[o(`div`,null,[o(`strong`,null,t(r.customerName),1),o(`span`,T,t(r.customerPhone),1),o(`span`,E,t(s(N)[r.status]??r.status),1)]),h(x,{"model-value":r.status,options:f.filter(e=>e.value),"onUpdate:modelValue":e=>V(r.id,String(e))},null,8,[`model-value`,`options`,`onUpdate:modelValue`])]),r.note?(p(),l(`p`,D,t(r.note),1)):e(``,!0),o(`table`,O,[a[2]||=o(`thead`,null,[o(`tr`,null,[o(`th`,null,`محصول`),o(`th`,null,`کد`),o(`th`,null,`تعداد`),o(`th`,null,`محل`)])],-1),o(`tbody`,null,[(p(!0),l(n,null,c(r.items,r=>(p(),l(`tr`,{key:r.id},[o(`td`,null,t(r.productName),1),o(`td`,k,t(r.productCode),1),o(`td`,null,t(r.quantity),1),o(`td`,null,[h(x,{"model-value":r.holderType,options:M,"onUpdate:modelValue":e=>H(r.id,String(e))},null,8,[`model-value`,`onUpdate:modelValue`]),r.movements?.length?(p(),l(`ul`,A,[(p(!0),l(n,null,c(r.movements,e=>(p(),l(`li`,{key:e.id},[m(t(U(e.fromHolder))+` → `+t(U(e.toHolder))+` `,1),o(`span`,j,t(s(d)(e.movedAt)),1)]))),128))])):e(``,!0)])]))),128))])])]))),128)):(p(),i(b,{key:1,title:`درخواستی نیست`}))]))}}),[[`__scopeId`,`data-v-747d8f88`]]);export{M as default}; import{$ as e,Ct as t,J as n,N as r,Q as i,V as a,Z as o,bt as s,dt as c,et as l,f as u,i as d,it as f,lt as p,nt as m,rt as h,st as g,yt as _,z as v}from"./index-B2VD3zy8.js";import{t as y}from"./AdminPageSkeleton-BJpm6oxf.js";import{t as b}from"./BaseEmptyState-DGu6Pfui.js";import{t as x}from"./AdminSelect-BeLNl2Qz.js";var S={class:`admin-page`},C={class:`admin-page__head`},w={class:`request-card__top`},T={class:`muted`,dir:`ltr`},E={class:`badge`},D={key:0,class:`muted`},O={class:`admin-table`},k={dir:`ltr`},A={key:0,class:`movements`},j={class:`muted`},M=a(f({__name:`CatalogRequestsView`,setup(a){let f=[{value:``,label:`همه وضعیت‌ها`},{value:`new`,label:`درخواست جدید`},{value:`approved`,label:`تأیید شده`},{value:`ready_to_ship`,label:`آماده ارسال`},{value:`delivered`,label:`تحویل به مشتری`},{value:`returned`,label:`بازگردانده شده`},{value:`cancelled`,label:`لغو شده`}],M=[{value:`warehouse`,label:`انبار`},{value:`customer`,label:`مشتری`},{value:`agent`,label:`واسطه`}],N=Object.fromEntries(f.filter(e=>e.value).map(e=>[e.value,e.label])),P=Object.fromEntries(M.map(e=>[e.value,e.label])),F=_([]),I=_(``),L=_(!0),R=_(null),z=v();async function B(){L.value=!0;try{F.value=await u.list(I.value||void 0)}catch(e){z.error(e instanceof r?e.message:`بارگذاری انجام نشد`)}finally{L.value=!1}}async function V(e,t){try{await u.updateStatus(e,t),z.success(`وضعیت به‌روز شد`),await B()}catch(e){z.error(e instanceof r?e.message:`به‌روزرسانی ناموفق بود`)}}async function H(e,t){if(!R.value){R.value=e;try{await u.updateHolder(e,{holderType:t}),z.success(`محل نگهداری به‌روز شد`),await B()}catch(e){z.error(e instanceof r?e.message:`به‌روزرسانی محل ناموفق بود`)}finally{R.value=null}}}function U(e){return P[e]??e}return g(()=>{B()}),(r,a)=>(p(),l(`div`,S,[o(`header`,C,[a[1]||=o(`div`,null,[o(`h1`,null,`درخواست کالیته فیزیکی`),o(`p`,null,`بررسی، گردش وضعیت و محل نگهداری اقلام`)],-1),h(x,{modelValue:I.value,"onUpdate:modelValue":[a[0]||=e=>I.value=e,B],options:f},null,8,[`modelValue`])]),L.value?(p(),i(y,{key:0,variant:`cards`})):F.value.length?(p(!0),l(n,{key:2},c(F.value,r=>(p(),l(`div`,{key:r.id,class:`request-card`},[o(`div`,w,[o(`div`,null,[o(`strong`,null,t(r.customerName),1),o(`span`,T,t(r.customerPhone),1),o(`span`,E,t(s(N)[r.status]??r.status),1)]),h(x,{"model-value":r.status,options:f.filter(e=>e.value),"onUpdate:modelValue":e=>V(r.id,String(e))},null,8,[`model-value`,`options`,`onUpdate:modelValue`])]),r.note?(p(),l(`p`,D,t(r.note),1)):e(``,!0),o(`table`,O,[a[2]||=o(`thead`,null,[o(`tr`,null,[o(`th`,null,`محصول`),o(`th`,null,`کد`),o(`th`,null,`تعداد`),o(`th`,null,`محل`)])],-1),o(`tbody`,null,[(p(!0),l(n,null,c(r.items,r=>(p(),l(`tr`,{key:r.id},[o(`td`,null,t(r.productName),1),o(`td`,k,t(r.productCode),1),o(`td`,null,t(r.quantity),1),o(`td`,null,[h(x,{"model-value":r.holderType,options:M,"onUpdate:modelValue":e=>H(r.id,String(e))},null,8,[`model-value`,`onUpdate:modelValue`]),r.movements?.length?(p(),l(`ul`,A,[(p(!0),l(n,null,c(r.movements,e=>(p(),l(`li`,{key:e.id},[m(t(U(e.fromHolder))+` → `+t(U(e.toHolder))+` `,1),o(`span`,j,t(s(d)(e.movedAt)),1)]))),128))])):e(``,!0)])]))),128))])])]))),128)):(p(),i(b,{key:1,title:`درخواستی نیست`}))]))}}),[[`__scopeId`,`data-v-747d8f88`]]);export{M as default};
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,3 +1,3 @@
import{Ct as e,G as t,J as n,N as r,Q as i,R as a,V as o,X as s,Z as c,dt as l,et as u,gt as d,ht as f,it as p,lt as m,nt as h,rt as g,st as _,v,vt as y,yt as b,z as x}from"./index-Ce0o2VuJ.js";import{t as S}from"./AdminPageSkeleton-CeCa2h-t.js";import{t as C}from"./BaseEmptyState-SjEY4tIJ.js";var w={class:`admin-page`},T={key:2,class:`admin-table`},E={dir:`ltr`},D=[`onClick`],O={class:`field`},k={class:`field`},A={class:`field`},j={class:`field`},M=[`disabled`],N=o(p({__name:`LevelsView`,setup(o){let p=b([]),N=b(!0),P=b(!1),F=b(null),I=x(),L=y({code:``,label:``,sortOrder:0,benefitsText:``}),R=s(()=>F.value?`ویرایش سطح`:`سطح جدید`);function z(e){return e.split(` import{Ct as e,G as t,J as n,N as r,Q as i,R as a,V as o,X as s,Z as c,dt as l,et as u,gt as d,ht as f,it as p,lt as m,nt as h,rt as g,st as _,v,vt as y,yt as b,z as x}from"./index-B2VD3zy8.js";import{t as S}from"./AdminPageSkeleton-BJpm6oxf.js";import{t as C}from"./BaseEmptyState-DGu6Pfui.js";var w={class:`admin-page`},T={key:2,class:`admin-table`},E={dir:`ltr`},D=[`onClick`],O={class:`field`},k={class:`field`},A={class:`field`},j={class:`field`},M=[`disabled`],N=o(p({__name:`LevelsView`,setup(o){let p=b([]),N=b(!0),P=b(!1),F=b(null),I=x(),L=y({code:``,label:``,sortOrder:0,benefitsText:``}),R=s(()=>F.value?`ویرایش سطح`:`سطح جدید`);function z(e){return e.split(`
`).map(e=>e.trim()).filter(Boolean).map(e=>({title:e}))}async function B(){N.value=!0;try{p.value=await v.list()}catch(e){I.error(e instanceof r?e.message:`بارگذاری سطوح ناموفق بود`)}finally{N.value=!1}}function V(){F.value=null,Object.assign(L,{code:``,label:``,sortOrder:p.value.length+1,benefitsText:``}),P.value=!0}function H(e){F.value=e.id,Object.assign(L,{code:e.code,label:e.label,sortOrder:e.sortOrder,benefitsText:e.benefits.map(e=>e.title).join(` `).map(e=>e.trim()).filter(Boolean).map(e=>({title:e}))}async function B(){N.value=!0;try{p.value=await v.list()}catch(e){I.error(e instanceof r?e.message:`بارگذاری سطوح ناموفق بود`)}finally{N.value=!1}}function V(){F.value=null,Object.assign(L,{code:``,label:``,sortOrder:p.value.length+1,benefitsText:``}),P.value=!0}function H(e){F.value=e.id,Object.assign(L,{code:e.code,label:e.label,sortOrder:e.sortOrder,benefitsText:e.benefits.map(e=>e.title).join(`
`)}),P.value=!0}async function U(){try{let e={code:L.code.trim(),label:L.label.trim(),sortOrder:L.sortOrder,benefits:z(L.benefitsText)};F.value?await v.update(F.value,e):await v.create(e),P.value=!1,I.success(`ذخیره شد`),await B()}catch(e){I.error(e instanceof r?e.message:`ذخیره ناموفق بود`)}}return _(()=>{B()}),(r,o)=>(m(),u(`div`,w,[c(`header`,{class:`admin-page__head`},[o[5]||=c(`div`,null,[c(`h1`,null,`سطوح و مزایای مشتری`),c(`p`,null,`تعریف Level داخلی CRM و مزایای هر سطح (نمایش فقط در ادمین)`)],-1),c(`button`,{type:`button`,class:`admin-btn admin-btn--primary`,onClick:V},`سطح جدید`)]),N.value?(m(),i(S,{key:0,variant:`table`})):p.value.length?(m(),u(`table`,T,[o[6]||=c(`thead`,null,[c(`tr`,null,[c(`th`,null,`کد`),c(`th`,null,`عنوان`),c(`th`,null,`مزایا`),c(`th`,null,`مشتریان`),c(`th`)])],-1),c(`tbody`,null,[(m(!0),u(n,null,l(p.value,t=>(m(),u(`tr`,{key:t.id},[c(`td`,E,e(t.code),1),c(`td`,null,e(t.label),1),c(`td`,null,e(t.benefits.map(e=>e.title).join(`، `)||`—`),1),c(`td`,null,e(t.customersCount),1),c(`td`,null,[c(`button`,{type:`button`,class:`link`,onClick:e=>H(t)},`ویرایش`,8,D)])]))),128))])])):(m(),i(C,{key:1,title:`سطحی تعریف نشده`})),g(a,{open:P.value,title:R.value,onClose:o[4]||=e=>P.value=!1},{footer:f(()=>[c(`button`,{type:`button`,class:`admin-btn admin-btn--primary`,disabled:!L.code.trim()||!L.label.trim(),onClick:U},` ذخیره `,8,M)]),default:f(()=>[c(`label`,O,[o[7]||=h(`کد`,-1),d(c(`input`,{"onUpdate:modelValue":o[0]||=e=>L.code=e,class:`admin-input`,dir:`ltr`},null,512),[[t,L.code]])]),c(`label`,k,[o[8]||=h(`عنوان`,-1),d(c(`input`,{"onUpdate:modelValue":o[1]||=e=>L.label=e,class:`admin-input`},null,512),[[t,L.label]])]),c(`label`,A,[o[9]||=h(`ترتیب`,-1),d(c(`input`,{"onUpdate:modelValue":o[2]||=e=>L.sortOrder=e,type:`number`,class:`admin-input`},null,512),[[t,L.sortOrder,void 0,{number:!0}]])]),c(`label`,j,[o[10]||=h(` مزایا (هر خط یک مورد) `,-1),d(c(`textarea`,{"onUpdate:modelValue":o[3]||=e=>L.benefitsText=e,class:`admin-input`,rows:`4`},null,512),[[t,L.benefitsText]])])]),_:1},8,[`open`,`title`])]))}}),[[`__scopeId`,`data-v-44c7f808`]]);export{N as default}; `)}),P.value=!0}async function U(){try{let e={code:L.code.trim(),label:L.label.trim(),sortOrder:L.sortOrder,benefits:z(L.benefitsText)};F.value?await v.update(F.value,e):await v.create(e),P.value=!1,I.success(`ذخیره شد`),await B()}catch(e){I.error(e instanceof r?e.message:`ذخیره ناموفق بود`)}}return _(()=>{B()}),(r,o)=>(m(),u(`div`,w,[c(`header`,{class:`admin-page__head`},[o[5]||=c(`div`,null,[c(`h1`,null,`سطوح و مزایای مشتری`),c(`p`,null,`تعریف Level داخلی CRM و مزایای هر سطح (نمایش فقط در ادمین)`)],-1),c(`button`,{type:`button`,class:`admin-btn admin-btn--primary`,onClick:V},`سطح جدید`)]),N.value?(m(),i(S,{key:0,variant:`table`})):p.value.length?(m(),u(`table`,T,[o[6]||=c(`thead`,null,[c(`tr`,null,[c(`th`,null,`کد`),c(`th`,null,`عنوان`),c(`th`,null,`مزایا`),c(`th`,null,`مشتریان`),c(`th`)])],-1),c(`tbody`,null,[(m(!0),u(n,null,l(p.value,t=>(m(),u(`tr`,{key:t.id},[c(`td`,E,e(t.code),1),c(`td`,null,e(t.label),1),c(`td`,null,e(t.benefits.map(e=>e.title).join(`، `)||`—`),1),c(`td`,null,e(t.customersCount),1),c(`td`,null,[c(`button`,{type:`button`,class:`link`,onClick:e=>H(t)},`ویرایش`,8,D)])]))),128))])])):(m(),i(C,{key:1,title:`سطحی تعریف نشده`})),g(a,{open:P.value,title:R.value,onClose:o[4]||=e=>P.value=!1},{footer:f(()=>[c(`button`,{type:`button`,class:`admin-btn admin-btn--primary`,disabled:!L.code.trim()||!L.label.trim(),onClick:U},` ذخیره `,8,M)]),default:f(()=>[c(`label`,O,[o[7]||=h(`کد`,-1),d(c(`input`,{"onUpdate:modelValue":o[0]||=e=>L.code=e,class:`admin-input`,dir:`ltr`},null,512),[[t,L.code]])]),c(`label`,k,[o[8]||=h(`عنوان`,-1),d(c(`input`,{"onUpdate:modelValue":o[1]||=e=>L.label=e,class:`admin-input`},null,512),[[t,L.label]])]),c(`label`,A,[o[9]||=h(`ترتیب`,-1),d(c(`input`,{"onUpdate:modelValue":o[2]||=e=>L.sortOrder=e,type:`number`,class:`admin-input`},null,512),[[t,L.sortOrder,void 0,{number:!0}]])]),c(`label`,j,[o[10]||=h(` مزایا (هر خط یک مورد) `,-1),d(c(`textarea`,{"onUpdate:modelValue":o[3]||=e=>L.benefitsText=e,class:`admin-input`,rows:`4`},null,512),[[t,L.benefitsText]])])]),_:1},8,[`open`,`title`])]))}}),[[`__scopeId`,`data-v-44c7f808`]]);export{N as default};
@@ -1 +1 @@
import{$ as e,A as t,Ct as n,F as r,G as i,H as a,I as o,M as s,P as c,U as l,V as u,X as d,Z as f,bt as p,et as m,gt as h,it as g,j as _,lt as v,nt as y,q as b,rt as x,tt as S,yt as C,z as w}from"./index-Ce0o2VuJ.js";var T={class:`login-page`},E={class:`login-page__form-wrap`},D={class:`login-page__card admin-card`},O={class:`login-page__header`},k={key:0,class:`login-page__mock-hint`},A={dir:`ltr`},j={dir:`ltr`},M={key:0,class:`admin-form__error`,role:`alert`},N={class:`admin-form__field`},P={class:`login-page__input-wrap`},F={class:`login-page__field-icon`,"aria-hidden":`true`},I={class:`admin-form__field`},L={class:`login-page__input-wrap login-page__input-wrap--password`},R={class:`login-page__field-icon`,"aria-hidden":`true`},z=[`type`],B=[`aria-label`],V={class:`login-page__remember`},H=[`disabled`],U={key:0,class:`admin-btn__spinner`,"aria-hidden":`true`},W=u(g({__name:`LoginView`,setup(u){let g=o(),W=r(),G=t(),K=w(),q=C(s()?_.phone:``),J=C(s()?_.password:``),Y=C(!0),X=C(!1),Z=s(),Q=d(()=>q.value.trim().length>0&&J.value.length>0);function $(e){return e.replace(/[۰-۹]/g,e=>String(`۰۱۲۳۴۵۶۷۸۹`.indexOf(e))).replace(/[٠-٩]/g,e=>String(`٠١٢٣٤٥٦٧٨٩`.indexOf(e)))}async function ee(){if(!Q.value){G.error=`لطفاً شماره موبایل و رمز عبور را وارد کنید.`;return}if(!await G.login($(q.value.trim()),J.value,Y.value))return;K.success(`خوش آمدید، ${G.fullName}`);let e=typeof W.query.redirect==`string`?W.query.redirect:`/`;g.replace(e)}return(t,r)=>(v(),m(`div`,T,[f(`div`,E,[f(`div`,D,[f(`div`,O,[r[8]||=f(`h2`,{class:`login-page__title`},`ورود به پنل مدیریت`,-1),r[9]||=f(`p`,{class:`login-page__subtitle`},`برای ادامه، اطلاعات حساب کاربری خود را وارد کنید.`,-1),p(Z)?(v(),m(`p`,k,[r[6]||=y(` حالت موک فعال است — `,-1),f(`span`,A,n(p(_).phone),1),r[7]||=y(` / `,-1),f(`span`,j,n(p(_).password),1)])):e(``,!0)]),f(`form`,{class:`admin-form login-page__form`,onSubmit:b(ee,[`prevent`])},[p(G).error?(v(),m(`p`,M,n(p(G).error),1)):e(``,!0),f(`div`,N,[r[10]||=f(`label`,{for:`login-phone`},`شماره موبایل`,-1),f(`div`,P,[f(`span`,F,[x(c,{name:`phone`,size:18})]),h(f(`input`,{id:`login-phone`,"onUpdate:modelValue":r[0]||=e=>q.value=e,type:`tel`,class:`admin-input login-page__input`,placeholder:`۰۹۱۲۱۱۱۱۲۲۲۲`,autocomplete:`username`,inputmode:`tel`,dir:`ltr`,onInput:r[1]||=e=>p(G).clearError()},null,544),[[i,q.value]])])]),f(`div`,I,[r[11]||=f(`label`,{for:`login-password`},`رمز عبور`,-1),f(`div`,L,[f(`span`,R,[x(c,{name:`lock`,size:18})]),h(f(`input`,{id:`login-password`,"onUpdate:modelValue":r[2]||=e=>J.value=e,type:X.value?`text`:`password`,class:`admin-input login-page__input login-page__input--with-toggle`,placeholder:`رمز عبور`,autocomplete:`current-password`,onInput:r[3]||=e=>p(G).clearError()},null,40,z),[[l,J.value]]),f(`button`,{type:`button`,class:`login-page__toggle-password`,"aria-label":X.value?`پنهان کردن رمز`:`نمایش رمز`,onClick:r[4]||=e=>X.value=!X.value},[x(c,{name:X.value?`eye-off`:`eye`,size:18},null,8,[`name`])],8,B)])]),f(`label`,V,[h(f(`input`,{"onUpdate:modelValue":r[5]||=e=>Y.value=e,type:`checkbox`},null,512),[[a,Y.value]]),r[12]||=f(`span`,null,`مرا به خاطر بسپار`,-1)]),f(`button`,{type:`submit`,class:`admin-btn admin-btn--primary login-page__submit`,disabled:!Q.value||p(G).loading},[p(G).loading?(v(),m(`span`,U)):e(``,!0),r[13]||=y(` ورود به پنل `,-1)],8,H)],32)])]),r[14]||=S(`<div class="login-page__brand" data-v-3c4fbd85><div class="login-page__brand-inner" data-v-3c4fbd85><p class="login-page__brand-badge" data-v-3c4fbd85>پارچه</p><h1 class="login-page__brand-title" data-v-3c4fbd85>پنل مدیریت سفارش‌های عمده</h1><p class="login-page__brand-text" data-v-3c4fbd85> مدیریت سفارش‌ها، مشتریان، قیمت‌گذاری، چک‌ها و گزارش‌های فروش در یک محیط یکپارچه. </p></div></div>`,1)]))}}),[[`__scopeId`,`data-v-3c4fbd85`]]);export{W as default}; import{$ as e,A as t,Ct as n,F as r,G as i,H as a,I as o,M as s,P as c,U as l,V as u,X as d,Z as f,bt as p,et as m,gt as h,it as g,j as _,lt as v,nt as y,q as b,rt as x,tt as S,yt as C,z as w}from"./index-B2VD3zy8.js";var T={class:`login-page`},E={class:`login-page__form-wrap`},D={class:`login-page__card admin-card`},O={class:`login-page__header`},k={key:0,class:`login-page__mock-hint`},A={dir:`ltr`},j={dir:`ltr`},M={key:0,class:`admin-form__error`,role:`alert`},N={class:`admin-form__field`},P={class:`login-page__input-wrap`},F={class:`login-page__field-icon`,"aria-hidden":`true`},I={class:`admin-form__field`},L={class:`login-page__input-wrap login-page__input-wrap--password`},R={class:`login-page__field-icon`,"aria-hidden":`true`},z=[`type`],B=[`aria-label`],V={class:`login-page__remember`},H=[`disabled`],U={key:0,class:`admin-btn__spinner`,"aria-hidden":`true`},W=u(g({__name:`LoginView`,setup(u){let g=o(),W=r(),G=t(),K=w(),q=C(s()?_.phone:``),J=C(s()?_.password:``),Y=C(!0),X=C(!1),Z=s(),Q=d(()=>q.value.trim().length>0&&J.value.length>0);function $(e){return e.replace(/[۰-۹]/g,e=>String(`۰۱۲۳۴۵۶۷۸۹`.indexOf(e))).replace(/[٠-٩]/g,e=>String(`٠١٢٣٤٥٦٧٨٩`.indexOf(e)))}async function ee(){if(!Q.value){G.error=`لطفاً شماره موبایل و رمز عبور را وارد کنید.`;return}if(!await G.login($(q.value.trim()),J.value,Y.value))return;K.success(`خوش آمدید، ${G.fullName}`);let e=typeof W.query.redirect==`string`?W.query.redirect:`/`;g.replace(e)}return(t,r)=>(v(),m(`div`,T,[f(`div`,E,[f(`div`,D,[f(`div`,O,[r[8]||=f(`h2`,{class:`login-page__title`},`ورود به پنل مدیریت`,-1),r[9]||=f(`p`,{class:`login-page__subtitle`},`برای ادامه، اطلاعات حساب کاربری خود را وارد کنید.`,-1),p(Z)?(v(),m(`p`,k,[r[6]||=y(` حالت موک فعال است — `,-1),f(`span`,A,n(p(_).phone),1),r[7]||=y(` / `,-1),f(`span`,j,n(p(_).password),1)])):e(``,!0)]),f(`form`,{class:`admin-form login-page__form`,onSubmit:b(ee,[`prevent`])},[p(G).error?(v(),m(`p`,M,n(p(G).error),1)):e(``,!0),f(`div`,N,[r[10]||=f(`label`,{for:`login-phone`},`شماره موبایل`,-1),f(`div`,P,[f(`span`,F,[x(c,{name:`phone`,size:18})]),h(f(`input`,{id:`login-phone`,"onUpdate:modelValue":r[0]||=e=>q.value=e,type:`tel`,class:`admin-input login-page__input`,placeholder:`۰۹۱۲۱۱۱۱۲۲۲۲`,autocomplete:`username`,inputmode:`tel`,dir:`ltr`,onInput:r[1]||=e=>p(G).clearError()},null,544),[[i,q.value]])])]),f(`div`,I,[r[11]||=f(`label`,{for:`login-password`},`رمز عبور`,-1),f(`div`,L,[f(`span`,R,[x(c,{name:`lock`,size:18})]),h(f(`input`,{id:`login-password`,"onUpdate:modelValue":r[2]||=e=>J.value=e,type:X.value?`text`:`password`,class:`admin-input login-page__input login-page__input--with-toggle`,placeholder:`رمز عبور`,autocomplete:`current-password`,onInput:r[3]||=e=>p(G).clearError()},null,40,z),[[l,J.value]]),f(`button`,{type:`button`,class:`login-page__toggle-password`,"aria-label":X.value?`پنهان کردن رمز`:`نمایش رمز`,onClick:r[4]||=e=>X.value=!X.value},[x(c,{name:X.value?`eye-off`:`eye`,size:18},null,8,[`name`])],8,B)])]),f(`label`,V,[h(f(`input`,{"onUpdate:modelValue":r[5]||=e=>Y.value=e,type:`checkbox`},null,512),[[a,Y.value]]),r[12]||=f(`span`,null,`مرا به خاطر بسپار`,-1)]),f(`button`,{type:`submit`,class:`admin-btn admin-btn--primary login-page__submit`,disabled:!Q.value||p(G).loading},[p(G).loading?(v(),m(`span`,U)):e(``,!0),r[13]||=y(` ورود به پنل `,-1)],8,H)],32)])]),r[14]||=S(`<div class="login-page__brand" data-v-3c4fbd85><div class="login-page__brand-inner" data-v-3c4fbd85><p class="login-page__brand-badge" data-v-3c4fbd85>پارچه</p><h1 class="login-page__brand-title" data-v-3c4fbd85>پنل مدیریت سفارش‌های عمده</h1><p class="login-page__brand-text" data-v-3c4fbd85> مدیریت سفارش‌ها، مشتریان، قیمت‌گذاری، چک‌ها و گزارش‌های فروش در یک محیط یکپارچه. </p></div></div>`,1)]))}}),[[`__scopeId`,`data-v-3c4fbd85`]]);export{W as default};
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
import{Ct as e,V as t,bt as n,et as r,it as i,lt as a,xt as o}from"./index-Ce0o2VuJ.js";import{t as s}from"./orderStatus-CYVblRJB.js";var c=t(i({__name:`StatusBadge`,props:{status:{}},setup(t){let i={active:{label:`فعال`,tone:`success`},inactive:{label:`غیرفعال`,tone:`neutral`},pending_check_review:{label:`در انتظار بررسی`,tone:`warning`},check_approved:{label:`تأیید شده`,tone:`success`},check_rejected:{label:`رد شده`,tone:`danger`}};return(c,l)=>(a(),r(`span`,{class:o([`admin-badge status-badge`,`admin-badge--${(n(s)[t.status]??i[t.status])?.tone??`neutral`}`])},e((n(s)[t.status]??i[t.status])?.label??t.status),3))}}),[[`__scopeId`,`data-v-23aa055a`]]);export{c as t}; import{Ct as e,V as t,bt as n,et as r,it as i,lt as a,xt as o}from"./index-B2VD3zy8.js";import{t as s}from"./orderStatus-CYVblRJB.js";var c=t(i({__name:`StatusBadge`,props:{status:{}},setup(t){let i={active:{label:`فعال`,tone:`success`},inactive:{label:`غیرفعال`,tone:`neutral`},pending_check_review:{label:`در انتظار بررسی`,tone:`warning`},check_approved:{label:`تأیید شده`,tone:`success`},check_rejected:{label:`رد شده`,tone:`danger`}};return(c,l)=>(a(),r(`span`,{class:o([`admin-badge status-badge`,`admin-badge--${(n(s)[t.status]??i[t.status])?.tone??`neutral`}`])},e((n(s)[t.status]??i[t.status])?.label??t.status),3))}}),[[`__scopeId`,`data-v-23aa055a`]]);export{c as t};
@@ -1 +1 @@
import{Ct as e,E as t,J as n,N as r,Q as i,V as a,Z as o,dt as s,et as c,it as l,lt as u,nt as d,st as f,yt as p,z as m}from"./index-Ce0o2VuJ.js";import{t as h}from"./AdminPageSkeleton-CeCa2h-t.js";import{t as g}from"./BaseEmptyState-SjEY4tIJ.js";var _={class:`admin-page`},v={key:2,class:`admin-table`},y={class:`muted`,dir:`ltr`},b={class:`muted`,dir:`ltr`},x=[`onClick`],S=a(l({__name:`StockAlertsView`,setup(a){let l=p([]),S=p(!0),C=m();async function w(){S.value=!0;try{l.value=await t.list()}catch(e){C.error(e instanceof r?e.message:`بارگذاری ناموفق بود`)}finally{S.value=!1}}async function T(e){try{await t.notify(e),C.success(`اعلان موجودی ارسال شد`),await w()}catch(e){C.error(e instanceof r?e.message:`ارسال ناموفق بود`)}}return f(()=>{w()}),(t,r)=>(u(),c(`div`,_,[r[1]||=o(`header`,{class:`admin-page__head`},[o(`div`,null,[o(`h1`,null,`درخواست خبر موجودی`),o(`p`,null,`مشتریانی که برای محصول ناموجود درخواست اطلاع داده‌اند`)])],-1),S.value?(u(),i(h,{key:0,variant:`table`})):l.value.length?(u(),c(`table`,v,[r[0]||=o(`thead`,null,[o(`tr`,null,[o(`th`,null,`مشتری`),o(`th`,null,`محصول`),o(`th`,null,`موجودی فعلی`),o(`th`)])],-1),o(`tbody`,null,[(u(!0),c(n,null,s(l.value,t=>(u(),c(`tr`,{key:t.id},[o(`td`,null,[d(e(t.customerName)+` `,1),o(`span`,y,e(t.customerPhone),1)]),o(`td`,null,[d(e(t.productName)+` `,1),o(`span`,b,`(`+e(t.productCode)+`)`,1)]),o(`td`,null,e(t.stock??`—`),1),o(`td`,null,[o(`button`,{type:`button`,class:`admin-btn admin-btn--primary admin-btn--sm`,onClick:e=>T(t.id)},`ارسال اعلان`,8,x)])]))),128))])])):(u(),i(g,{key:1,title:`درخواستی فعال نیست`}))]))}}),[[`__scopeId`,`data-v-61131544`]]);export{S as default}; import{Ct as e,E as t,J as n,N as r,Q as i,V as a,Z as o,dt as s,et as c,it as l,lt as u,nt as d,st as f,yt as p,z as m}from"./index-B2VD3zy8.js";import{t as h}from"./AdminPageSkeleton-BJpm6oxf.js";import{t as g}from"./BaseEmptyState-DGu6Pfui.js";var _={class:`admin-page`},v={key:2,class:`admin-table`},y={class:`muted`,dir:`ltr`},b={class:`muted`,dir:`ltr`},x=[`onClick`],S=a(l({__name:`StockAlertsView`,setup(a){let l=p([]),S=p(!0),C=m();async function w(){S.value=!0;try{l.value=await t.list()}catch(e){C.error(e instanceof r?e.message:`بارگذاری ناموفق بود`)}finally{S.value=!1}}async function T(e){try{await t.notify(e),C.success(`اعلان موجودی ارسال شد`),await w()}catch(e){C.error(e instanceof r?e.message:`ارسال ناموفق بود`)}}return f(()=>{w()}),(t,r)=>(u(),c(`div`,_,[r[1]||=o(`header`,{class:`admin-page__head`},[o(`div`,null,[o(`h1`,null,`درخواست خبر موجودی`),o(`p`,null,`مشتریانی که برای محصول ناموجود درخواست اطلاع داده‌اند`)])],-1),S.value?(u(),i(h,{key:0,variant:`table`})):l.value.length?(u(),c(`table`,v,[r[0]||=o(`thead`,null,[o(`tr`,null,[o(`th`,null,`مشتری`),o(`th`,null,`محصول`),o(`th`,null,`موجودی فعلی`),o(`th`)])],-1),o(`tbody`,null,[(u(!0),c(n,null,s(l.value,t=>(u(),c(`tr`,{key:t.id},[o(`td`,null,[d(e(t.customerName)+` `,1),o(`span`,y,e(t.customerPhone),1)]),o(`td`,null,[d(e(t.productName)+` `,1),o(`span`,b,`(`+e(t.productCode)+`)`,1)]),o(`td`,null,e(t.stock??`—`),1),o(`td`,null,[o(`button`,{type:`button`,class:`admin-btn admin-btn--primary admin-btn--sm`,onClick:e=>T(t.id)},`ارسال اعلان`,8,x)])]))),128))])])):(u(),i(g,{key:1,title:`درخواستی فعال نیست`}))]))}}),[[`__scopeId`,`data-v-61131544`]]);export{S as default};
@@ -1 +1 @@
import{Ct as e,D as t,G as n,J as r,N as i,Q as a,R as o,S as s,V as c,X as l,Z as u,dt as d,et as f,g as p,gt as m,ht as h,it as g,lt as _,nt as v,rt as y,st as b,vt as x,yt as S,z as C}from"./index-Ce0o2VuJ.js";import{t as w}from"./AdminPageSkeleton-CeCa2h-t.js";import{t as T}from"./BaseEmptyState-SjEY4tIJ.js";import{t as E}from"./AdminSelect-DW0RlAc0.js";var D={class:`admin-page`},O={class:`admin-page__head`},k={key:2,class:`admin-table`},A={class:`muted`,dir:`ltr`},j=[`onClick`],M={class:`field`},N={class:`field`},P={class:`field`},F=[`disabled`],I=c(g({__name:`SuggestionsView`,setup(c){let g=S([]),I=S(!0),L=S([]),R=S([]),z=S(!1),B=C(),V=x({customerId:``,productId:``,note:``}),H=l(()=>L.value.map(e=>({value:e.id,label:e.name?.trim()||e.phone}))),U=l(()=>R.value.map(e=>({value:e.id,label:`${e.name} (${e.productCode})`})));async function W(){I.value=!0;try{let[e,n,r]=await Promise.all([t.list(),p.list(),s.list()]);g.value=e,L.value=n,R.value=r}catch(e){B.error(e instanceof i?e.message:`بارگذاری ناموفق بود`)}finally{I.value=!1}}async function G(){try{await t.create({customerId:V.customerId,productId:V.productId,note:V.note.trim()||void 0}),z.value=!1,V.note=``,B.success(`پیشنهاد ثبت شد`),await W()}catch(e){B.error(e instanceof i?e.message:`ثبت ناموفق بود`)}}async function K(e){try{await t.setActive(e.id,!e.isActive),await W()}catch(e){B.error(e instanceof i?e.message:`به‌روزرسانی ناموفق بود`)}}return b(()=>{W()}),(t,i)=>(_(),f(`div`,D,[u(`header`,O,[i[5]||=u(`div`,null,[u(`h1`,null,`پیشنهاد محصول`),u(`p`,null,`پیشنهاد دستی محصول به مشتری`)],-1),u(`button`,{type:`button`,class:`admin-btn admin-btn--primary`,onClick:i[0]||=e=>z.value=!0},`پیشنهاد جدید`)]),I.value?(_(),a(w,{key:0,variant:`table`})):g.value.length?(_(),f(`table`,k,[i[6]||=u(`thead`,null,[u(`tr`,null,[u(`th`,null,`مشتری`),u(`th`,null,`محصول`),u(`th`,null,`یادداشت`),u(`th`,null,`وضعیت`),u(`th`)])],-1),u(`tbody`,null,[(_(!0),f(r,null,d(g.value,t=>(_(),f(`tr`,{key:t.id},[u(`td`,null,e(t.customerName),1),u(`td`,null,[v(e(t.productName)+` `,1),u(`span`,A,`(`+e(t.productCode)+`)`,1)]),u(`td`,null,e(t.note||`—`),1),u(`td`,null,e(t.isActive?`فعال`:`غیرفعال`),1),u(`td`,null,[u(`button`,{type:`button`,class:`link`,onClick:e=>K(t)},e(t.isActive?`غیرفعال`:`فعال`),9,j)])]))),128))])])):(_(),a(T,{key:1,title:`پیشنهادی ثبت نشده`})),y(o,{open:z.value,title:`پیشنهاد محصول`,onClose:i[4]||=e=>z.value=!1},{footer:h(()=>[u(`button`,{type:`button`,class:`admin-btn admin-btn--primary`,disabled:!V.customerId||!V.productId,onClick:G},` ثبت `,8,F)]),default:h(()=>[u(`label`,M,[i[7]||=v(`مشتری `,-1),y(E,{modelValue:V.customerId,"onUpdate:modelValue":i[1]||=e=>V.customerId=e,options:H.value},null,8,[`modelValue`,`options`])]),u(`label`,N,[i[8]||=v(`محصول `,-1),y(E,{modelValue:V.productId,"onUpdate:modelValue":i[2]||=e=>V.productId=e,options:U.value},null,8,[`modelValue`,`options`])]),u(`label`,P,[i[9]||=v(`یادداشت`,-1),m(u(`textarea`,{"onUpdate:modelValue":i[3]||=e=>V.note=e,class:`admin-input`,rows:`3`},null,512),[[n,V.note]])])]),_:1},8,[`open`])]))}}),[[`__scopeId`,`data-v-56e3e728`]]);export{I as default}; import{Ct as e,D as t,G as n,J as r,N as i,Q as a,R as o,S as s,V as c,X as l,Z as u,dt as d,et as f,g as p,gt as m,ht as h,it as g,lt as _,nt as v,rt as y,st as b,vt as x,yt as S,z as C}from"./index-B2VD3zy8.js";import{t as w}from"./AdminPageSkeleton-BJpm6oxf.js";import{t as T}from"./BaseEmptyState-DGu6Pfui.js";import{t as E}from"./AdminSelect-BeLNl2Qz.js";var D={class:`admin-page`},O={class:`admin-page__head`},k={key:2,class:`admin-table`},A={class:`muted`,dir:`ltr`},j=[`onClick`],M={class:`field`},N={class:`field`},P={class:`field`},F=[`disabled`],I=c(g({__name:`SuggestionsView`,setup(c){let g=S([]),I=S(!0),L=S([]),R=S([]),z=S(!1),B=C(),V=x({customerId:``,productId:``,note:``}),H=l(()=>L.value.map(e=>({value:e.id,label:e.name?.trim()||e.phone}))),U=l(()=>R.value.map(e=>({value:e.id,label:`${e.name} (${e.productCode})`})));async function W(){I.value=!0;try{let[e,n,r]=await Promise.all([t.list(),p.list(),s.list()]);g.value=e,L.value=n,R.value=r}catch(e){B.error(e instanceof i?e.message:`بارگذاری ناموفق بود`)}finally{I.value=!1}}async function G(){try{await t.create({customerId:V.customerId,productId:V.productId,note:V.note.trim()||void 0}),z.value=!1,V.note=``,B.success(`پیشنهاد ثبت شد`),await W()}catch(e){B.error(e instanceof i?e.message:`ثبت ناموفق بود`)}}async function K(e){try{await t.setActive(e.id,!e.isActive),await W()}catch(e){B.error(e instanceof i?e.message:`به‌روزرسانی ناموفق بود`)}}return b(()=>{W()}),(t,i)=>(_(),f(`div`,D,[u(`header`,O,[i[5]||=u(`div`,null,[u(`h1`,null,`پیشنهاد محصول`),u(`p`,null,`پیشنهاد دستی محصول به مشتری`)],-1),u(`button`,{type:`button`,class:`admin-btn admin-btn--primary`,onClick:i[0]||=e=>z.value=!0},`پیشنهاد جدید`)]),I.value?(_(),a(w,{key:0,variant:`table`})):g.value.length?(_(),f(`table`,k,[i[6]||=u(`thead`,null,[u(`tr`,null,[u(`th`,null,`مشتری`),u(`th`,null,`محصول`),u(`th`,null,`یادداشت`),u(`th`,null,`وضعیت`),u(`th`)])],-1),u(`tbody`,null,[(_(!0),f(r,null,d(g.value,t=>(_(),f(`tr`,{key:t.id},[u(`td`,null,e(t.customerName),1),u(`td`,null,[v(e(t.productName)+` `,1),u(`span`,A,`(`+e(t.productCode)+`)`,1)]),u(`td`,null,e(t.note||`—`),1),u(`td`,null,e(t.isActive?`فعال`:`غیرفعال`),1),u(`td`,null,[u(`button`,{type:`button`,class:`link`,onClick:e=>K(t)},e(t.isActive?`غیرفعال`:`فعال`),9,j)])]))),128))])])):(_(),a(T,{key:1,title:`پیشنهادی ثبت نشده`})),y(o,{open:z.value,title:`پیشنهاد محصول`,onClose:i[4]||=e=>z.value=!1},{footer:h(()=>[u(`button`,{type:`button`,class:`admin-btn admin-btn--primary`,disabled:!V.customerId||!V.productId,onClick:G},` ثبت `,8,F)]),default:h(()=>[u(`label`,M,[i[7]||=v(`مشتری `,-1),y(E,{modelValue:V.customerId,"onUpdate:modelValue":i[1]||=e=>V.customerId=e,options:H.value},null,8,[`modelValue`,`options`])]),u(`label`,N,[i[8]||=v(`محصول `,-1),y(E,{modelValue:V.productId,"onUpdate:modelValue":i[2]||=e=>V.productId=e,options:U.value},null,8,[`modelValue`,`options`])]),u(`label`,P,[i[9]||=v(`یادداشت`,-1),m(u(`textarea`,{"onUpdate:modelValue":i[3]||=e=>V.note=e,class:`admin-input`,rows:`3`},null,512),[[n,V.note]])])]),_:1},8,[`open`])]))}}),[[`__scopeId`,`data-v-56e3e728`]]);export{I as default};
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -5,7 +5,7 @@
<link rel="icon" href="/admin/favicon.ico"> <link rel="icon" href="/admin/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>پنل مدیریت | پارچه</title> <title>پنل مدیریت | پارچه</title>
<script type="module" crossorigin src="/admin/assets/index-Ce0o2VuJ.js"></script> <script type="module" crossorigin src="/admin/assets/index-B2VD3zy8.js"></script>
<link rel="stylesheet" crossorigin href="/admin/assets/index-C3X1YgAk.css"> <link rel="stylesheet" crossorigin href="/admin/assets/index-C3X1YgAk.css">
</head> </head>
<body> <body>
+107 -89
View File
@@ -10,7 +10,7 @@
"dependencies": { "dependencies": {
"@unocss/vite": "^66.7.5", "@unocss/vite": "^66.7.5",
"@vueuse/core": "^14.4.0", "@vueuse/core": "^14.4.0",
"fabric-trade": "file:../fabric-nademitex_user", "fabric-trade": "file:../nademitex_user",
"jalaali-js": "^2.0.0", "jalaali-js": "^2.0.0",
"lodash-es": "^4.18.1", "lodash-es": "^4.18.1",
"pinia": "^4.0.2", "pinia": "^4.0.2",
@@ -32,19 +32,16 @@
"eslint-plugin-vue": "~10.9.2", "eslint-plugin-vue": "~10.9.2",
"jiti": "^2.7.0", "jiti": "^2.7.0",
"npm-run-all2": "^9.0.2", "npm-run-all2": "^9.0.2",
"oxlint": "~1.74.0", "oxlint": "~1.73.0",
"prettier": "3.9.5", "prettier": "3.9.5",
"typescript": "~6.0.0", "typescript": "~6.0.0",
"vite": "^8.1.5", "vite": "^8.1.5",
"vite-plugin-vue-devtools": "^8.1.5", "vite-plugin-vue-devtools": "^8.1.5",
"vue-eslint-parser": "^10.4.1", "vue-eslint-parser": "^10.4.1",
"vue-tsc": "^3.3.7" "vue-tsc": "^3.3.7"
},
"engines": {
"node": "^22.18.0 || >=24.12.0"
} }
}, },
"../fabric-nademitex_user": { "../nademitex_user": {
"name": "fabric-trade", "name": "fabric-trade",
"version": "0.0.0", "version": "0.0.0",
"dependencies": { "dependencies": {
@@ -78,9 +75,6 @@
"vite-plugin-vue-devtools": "^8.1.5", "vite-plugin-vue-devtools": "^8.1.5",
"vue-eslint-parser": "^10.4.1", "vue-eslint-parser": "^10.4.1",
"vue-tsc": "^3.3.7" "vue-tsc": "^3.3.7"
},
"engines": {
"node": "^22.18.0 || >=24.12.0"
} }
}, },
"node_modules/@antfu/install-pkg": { "node_modules/@antfu/install-pkg": {
@@ -1230,9 +1224,9 @@
} }
}, },
"node_modules/@oxlint/binding-android-arm-eabi": { "node_modules/@oxlint/binding-android-arm-eabi": {
"version": "1.74.0", "version": "1.73.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.74.0.tgz", "resolved": "https://registry.npmmirror.com/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.73.0.tgz",
"integrity": "sha512-+gHd12muVI9ZLBaWLPkHt3Fj7jihFjgQ1MGtBaRL8vWrWrI0P7dLUty/cHrHS0oqPYIRgQUJsPu2CExQuMcwNw==", "integrity": "sha512-HZQRN/UMBu+Ut+/9MiAChkbP4qZqrNOWBcNI45vOT40GVhbGR0JgHB87L48D4iAqFQIdVmeQYtV9RF89AjTKkg==",
"cpu": [ "cpu": [
"arm" "arm"
], ],
@@ -1247,9 +1241,9 @@
} }
}, },
"node_modules/@oxlint/binding-android-arm64": { "node_modules/@oxlint/binding-android-arm64": {
"version": "1.74.0", "version": "1.73.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.74.0.tgz", "resolved": "https://registry.npmmirror.com/@oxlint/binding-android-arm64/-/binding-android-arm64-1.73.0.tgz",
"integrity": "sha512-xjKdoMB+H+RCOByv/7l7nfIGW9mlOisqYdcyC75UqYuQecLpReAeEYUf2CNeDEI3KtmUgxpRw/+c63y4AeF/Bw==", "integrity": "sha512-Gp+KJRylv2aW7thRpG5p1KTxZq4ZJFbWowrKzufNq9d3ssl3r3JviYV45/+p+7CN1Nv0zDd1e8Ex0b/HUDq4TQ==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@@ -1264,9 +1258,9 @@
} }
}, },
"node_modules/@oxlint/binding-darwin-arm64": { "node_modules/@oxlint/binding-darwin-arm64": {
"version": "1.74.0", "version": "1.73.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.74.0.tgz", "resolved": "https://registry.npmmirror.com/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.73.0.tgz",
"integrity": "sha512-iUK7wvc6sejMKsC+Pt67mntoF5weFcyEunhZfLJceU6gL419mexz5wBkSx/EnkFBExMLNtOi9fnDSc5xfK0IzQ==", "integrity": "sha512-3de96NdtXhxERMjIz7wsp2HYMY6pMQycGxFWac2mFecAx6VeARF/IqFb1QIaqiCRIdfzBwzTed+pCTCoiS+CYA==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@@ -1281,9 +1275,9 @@
} }
}, },
"node_modules/@oxlint/binding-darwin-x64": { "node_modules/@oxlint/binding-darwin-x64": {
"version": "1.74.0", "version": "1.73.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.74.0.tgz", "resolved": "https://registry.npmmirror.com/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.73.0.tgz",
"integrity": "sha512-ggKc/tn5SJ1u2yG2izC6VKODfYKV8MQ2AicJlNzOjuyrC29udvOef6/JzK2r32xqCnBDLFouR1VCkjzEI0/N9Q==", "integrity": "sha512-5zx/uPW32TiaOeVY1dQ/H5iOf0K1HOdFKOJhLqGl4o63+i1fpzoqqu/mKtd7OFgFjNCdhlyTGgjVkQTZm1ELcg==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@@ -1298,9 +1292,9 @@
} }
}, },
"node_modules/@oxlint/binding-freebsd-x64": { "node_modules/@oxlint/binding-freebsd-x64": {
"version": "1.74.0", "version": "1.73.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.74.0.tgz", "resolved": "https://registry.npmmirror.com/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.73.0.tgz",
"integrity": "sha512-u++dH/43jy9hTLbneaWlS0gla/Bp1JdwJ2zgevCl8nDFUh6qRCGMxcL0f0lb7By3A9p/LfFr+7cG4HU1hG856g==", "integrity": "sha512-qNe4gKHaGnLuZJ8toUg90JAa0S2vTVvDw+0bRi3q1avXZXDT4u5mMeECf3nD4HYrbdn1O7dXqWut4onY/yx/Xg==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@@ -1315,9 +1309,9 @@
} }
}, },
"node_modules/@oxlint/binding-linux-arm-gnueabihf": { "node_modules/@oxlint/binding-linux-arm-gnueabihf": {
"version": "1.74.0", "version": "1.73.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.74.0.tgz", "resolved": "https://registry.npmmirror.com/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.73.0.tgz",
"integrity": "sha512-Sj1zmtFDVTPeIbIz4ZfcXAbFHqCmKCXdCUlAJzvTF7I20NTH1RDpoF2PhkqNODutJzVhJYmm3oz0GwgY+tvE2g==", "integrity": "sha512-cCehYh5hTbfShm/fxTD6wwrGUWIpvX+N5OxmAMhFhDeTGXvw+BeNj889tpxsFQ9ZLatQ6wImuY8tsKLZ+FMz7w==",
"cpu": [ "cpu": [
"arm" "arm"
], ],
@@ -1332,9 +1326,9 @@
} }
}, },
"node_modules/@oxlint/binding-linux-arm-musleabihf": { "node_modules/@oxlint/binding-linux-arm-musleabihf": {
"version": "1.74.0", "version": "1.73.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.74.0.tgz", "resolved": "https://registry.npmmirror.com/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.73.0.tgz",
"integrity": "sha512-//PKyQb/tQXcHArx2f7z+oVI/eMS2Jpv+edNuAtOrgIhWdGcpHxogveAxzmF2rpH1AIHp4Hq04RF/rgJdiICnQ==", "integrity": "sha512-d5j5GDU/2dMgjVhw7TQT9ITrsIr1Y02KEXKyVGIXUkD+KiaxE9TP65FS2ZdgTBemQvoRL+gSBdbrIm3cQIeacg==",
"cpu": [ "cpu": [
"arm" "arm"
], ],
@@ -1349,13 +1343,16 @@
} }
}, },
"node_modules/@oxlint/binding-linux-arm64-gnu": { "node_modules/@oxlint/binding-linux-arm64-gnu": {
"version": "1.74.0", "version": "1.73.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.74.0.tgz", "resolved": "https://registry.npmmirror.com/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.73.0.tgz",
"integrity": "sha512-/k1Me+aX2tjuH10K62mLS0y8cLkJBHX6Ce0xPK+eWeel4bSdEGZ8dv4+hYMzg0GrSmjwy4yAYsDPeEeKBft/2w==", "integrity": "sha512-Eyf1SrP3+yR1DI3OJgOY2Pvrr9dWP9TK37xPaDYycwTtlGlI45erJAVIfH5/m/xosDt6BupJYEFi47bvbTuuyw==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
"dev": true, "dev": true,
"libc": [
"glibc"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -1366,13 +1363,16 @@
} }
}, },
"node_modules/@oxlint/binding-linux-arm64-musl": { "node_modules/@oxlint/binding-linux-arm64-musl": {
"version": "1.74.0", "version": "1.73.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.74.0.tgz", "resolved": "https://registry.npmmirror.com/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.73.0.tgz",
"integrity": "sha512-3tFSjBxc5D8/zvjEuLvOqcA8ZXKD0+6NuaVO/edeamNc49MoAsbfaC9s1UiwODwgF6slGaF8yJA2TPkukd77tg==", "integrity": "sha512-IlT/OJApEDKaMmCooHuncgJZbbCe7T5QIWmTZBEtYscWvzPQuuEinVcid6kwQRVQOUdb7PUCz4jQHnaYXdfJXw==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
"dev": true, "dev": true,
"libc": [
"musl"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -1383,13 +1383,16 @@
} }
}, },
"node_modules/@oxlint/binding-linux-ppc64-gnu": { "node_modules/@oxlint/binding-linux-ppc64-gnu": {
"version": "1.74.0", "version": "1.73.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.74.0.tgz", "resolved": "https://registry.npmmirror.com/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.73.0.tgz",
"integrity": "sha512-9QggtPkSPXOCTu8Szis7auOK/sC7KdQaN+/TujP7YVVhzCAOhgdRfgv8uEz0r2tk5xdgus5rLYUrCDoZNtiRUw==", "integrity": "sha512-L+JYcb/vdg5fmcH08V6o0YYLU28cTH1SPNulwJdvK9NK49aXSkYy6oNpKBmddArVOXYqNepriDGiZ04G54kh1Q==",
"cpu": [ "cpu": [
"ppc64" "ppc64"
], ],
"dev": true, "dev": true,
"libc": [
"glibc"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -1400,13 +1403,16 @@
} }
}, },
"node_modules/@oxlint/binding-linux-riscv64-gnu": { "node_modules/@oxlint/binding-linux-riscv64-gnu": {
"version": "1.74.0", "version": "1.73.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.74.0.tgz", "resolved": "https://registry.npmmirror.com/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.73.0.tgz",
"integrity": "sha512-VM5VPUJ4DJIWiK+AZn8FScUqMr6OFrCAYybMYjEEi7W13ParI64MByiXTkKMqZpBmvQ9zxl9Ebq2VUOiZRJYUg==", "integrity": "sha512-Qtk0g3bKV6OwWjIm7R8kQN1uOZRKQt/MODK2a8QfkwhTpXBD53ozx5XLVWLGDQAVyp2otLW4D2wB98XfAfMPGA==",
"cpu": [ "cpu": [
"riscv64" "riscv64"
], ],
"dev": true, "dev": true,
"libc": [
"glibc"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -1417,13 +1423,16 @@
} }
}, },
"node_modules/@oxlint/binding-linux-riscv64-musl": { "node_modules/@oxlint/binding-linux-riscv64-musl": {
"version": "1.74.0", "version": "1.73.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.74.0.tgz", "resolved": "https://registry.npmmirror.com/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.73.0.tgz",
"integrity": "sha512-SaDY1gh9rOA592J54g+gu5hkOFFQBZsMmIYHs+NRHG+Uq0OxtuuCXMWQ3vu1830Eugv5uMXyjG+bv2Z9y4IXjw==", "integrity": "sha512-wX0NQKZVxltkAOVmzFcpOaMpdaUvsq1Eqpx9tkAfl71UdkTlSo1R4AdAnGccR1Fm2+TzFgZ22CyyGuZ41RDr/A==",
"cpu": [ "cpu": [
"riscv64" "riscv64"
], ],
"dev": true, "dev": true,
"libc": [
"musl"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -1434,13 +1443,16 @@
} }
}, },
"node_modules/@oxlint/binding-linux-s390x-gnu": { "node_modules/@oxlint/binding-linux-s390x-gnu": {
"version": "1.74.0", "version": "1.73.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.74.0.tgz", "resolved": "https://registry.npmmirror.com/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.73.0.tgz",
"integrity": "sha512-ZATQeHZCyr6MbDveg0obD5sxLHFOghtOdC5jwVwYlvFWqtFOxctgFEG6Ef/64hYvZrWyhyCckB10AelqLopeDA==", "integrity": "sha512-vPe7UGBMWyiLTtnqS4xxgMQFSFGmtQwhwCxuiw6lXygaO6bVt0D8dFVg8Xv05eaiN3ybC0HXXHUAohFMFvqoCQ==",
"cpu": [ "cpu": [
"s390x" "s390x"
], ],
"dev": true, "dev": true,
"libc": [
"glibc"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -1451,13 +1463,16 @@
} }
}, },
"node_modules/@oxlint/binding-linux-x64-gnu": { "node_modules/@oxlint/binding-linux-x64-gnu": {
"version": "1.74.0", "version": "1.73.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.74.0.tgz", "resolved": "https://registry.npmmirror.com/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.73.0.tgz",
"integrity": "sha512-+aIvJyrdeD7LwCQ2WYLMUWNmnbeDRSPb40aBYtPjD9+PTqUwgJnk+HK5yLfSMeqXrMrDhE9uTmtt2y50tvjhHw==", "integrity": "sha512-2CwIWr9cemFC/CbRBWZvuk5mffz6ObmfFkfcC/9rTQ7f+icNhYr2kOjf9Rt8lLvugvkdGDOmkoVoFFHh6ClCTw==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
"dev": true, "dev": true,
"libc": [
"glibc"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -1468,13 +1483,16 @@
} }
}, },
"node_modules/@oxlint/binding-linux-x64-musl": { "node_modules/@oxlint/binding-linux-x64-musl": {
"version": "1.74.0", "version": "1.73.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.74.0.tgz", "resolved": "https://registry.npmmirror.com/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.73.0.tgz",
"integrity": "sha512-XyktaR8lhK2qWiCK0Tk8oYD+/cgn+oHA6ddRnxSSXUKkkojkV78CmShZUxQF+yrBFs0SuW+JBOPG6hecyc/iZg==", "integrity": "sha512-nDadfJgg7NBBxG0N560wOe7LLX5QiYp6qBaI7viuk5EUORFBktU/NfV0MbTqU3gTqQDCh4VyxKdo5VADxk9w8Q==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
"dev": true, "dev": true,
"libc": [
"musl"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -1485,9 +1503,9 @@
} }
}, },
"node_modules/@oxlint/binding-openharmony-arm64": { "node_modules/@oxlint/binding-openharmony-arm64": {
"version": "1.74.0", "version": "1.73.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.74.0.tgz", "resolved": "https://registry.npmmirror.com/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.73.0.tgz",
"integrity": "sha512-mzbjrPl4neaVUiJ1fUiEUxTGaSZBoiKtaoB6jmIpz9S+VOA2vDYmJpihQ82w6178V5jxziclTg8Cgj5yF6tTDg==", "integrity": "sha512-wGjJC+NLH9xP+IKGn9RDW94ojJR/wPbg5WCnQjj/oReaOtCQthr8ws1zICe77JFmo4ouUdeTHHZL/ESGiF6Pmw==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@@ -1502,9 +1520,9 @@
} }
}, },
"node_modules/@oxlint/binding-win32-arm64-msvc": { "node_modules/@oxlint/binding-win32-arm64-msvc": {
"version": "1.74.0", "version": "1.73.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.74.0.tgz", "resolved": "https://registry.npmmirror.com/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.73.0.tgz",
"integrity": "sha512-vUAe9okpS2Oa5+lX67lqHMuNUvfkleRKwrUDJ/WJBsgmddvZ1mrsh2HVmuFDRzqFELhaJhFaCNOuR6a7L3rtIA==", "integrity": "sha512-I7X47GPGljw225YUQ5SbC/rb1Kkdrd0yQf0x+hYxeKS6DpfjMbo9ccQPQ6LNY6BoJQ1sHhgDUGuMn5Vg5gHT6w==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@@ -1519,9 +1537,9 @@
} }
}, },
"node_modules/@oxlint/binding-win32-ia32-msvc": { "node_modules/@oxlint/binding-win32-ia32-msvc": {
"version": "1.74.0", "version": "1.73.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.74.0.tgz", "resolved": "https://registry.npmmirror.com/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.73.0.tgz",
"integrity": "sha512-yyXXJyYYSXL4I8K8jAWjJs+J3fa9gH2JmEbo4f5adm+1tNC9itseicBNuwK7BDHvqQ5J534s+yDULu89vYL2ZQ==", "integrity": "sha512-5lWj+3h+74Fm1jYOO9qkJA4xkAlZA099DkXppuXsk7UpnpZLttsefrZU469vChGaG6hcSqrkKXQOvMTZtbjeNg==",
"cpu": [ "cpu": [
"ia32" "ia32"
], ],
@@ -1536,9 +1554,9 @@
} }
}, },
"node_modules/@oxlint/binding-win32-x64-msvc": { "node_modules/@oxlint/binding-win32-x64-msvc": {
"version": "1.74.0", "version": "1.73.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.74.0.tgz", "resolved": "https://registry.npmmirror.com/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.73.0.tgz",
"integrity": "sha512-VTC9IYTIMrVUk/i6Ms1ohzzDKZFkWn0KU2OBbPBzgmVZ2V30165T/zK4LztTr0Xgp9fZ1qQZ1rsZAu/rEmySlA==", "integrity": "sha512-WaNRvh4f6zY9CvUQk2YoA1O90ieWrIklI84+HXFr9Isjz9CSESrdqo/RtIYt4Dll/cAchqGDMehfaZd0vqEFZw==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@@ -3628,7 +3646,7 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/fabric-trade": { "node_modules/fabric-trade": {
"resolved": "../fabric-nademitex_user", "resolved": "../nademitex_user",
"link": true "link": true
}, },
"node_modules/fast-deep-equal": { "node_modules/fast-deep-equal": {
@@ -4841,9 +4859,9 @@
} }
}, },
"node_modules/oxlint": { "node_modules/oxlint": {
"version": "1.74.0", "version": "1.73.0",
"resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.74.0.tgz", "resolved": "https://registry.npmmirror.com/oxlint/-/oxlint-1.73.0.tgz",
"integrity": "sha512-odGl2s2x5IOJoj3A0v1k0PGBXVFBZeZ2+AK/+K2MJur7Ghi3bkyX5NuLUWHKqa4js1wjep3hJeuTQJOlr+4+dA==", "integrity": "sha512-u91G9TJzU6yqKWNZUYprQB07W7YvntZXaRxQ6CkoytepYhLWUXWsr1M8zUJ34VatNPuUAr3Z8GH+O2A331CluQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"bin": { "bin": {
@@ -4856,25 +4874,25 @@
"url": "https://github.com/sponsors/Boshen" "url": "https://github.com/sponsors/Boshen"
}, },
"optionalDependencies": { "optionalDependencies": {
"@oxlint/binding-android-arm-eabi": "1.74.0", "@oxlint/binding-android-arm-eabi": "1.73.0",
"@oxlint/binding-android-arm64": "1.74.0", "@oxlint/binding-android-arm64": "1.73.0",
"@oxlint/binding-darwin-arm64": "1.74.0", "@oxlint/binding-darwin-arm64": "1.73.0",
"@oxlint/binding-darwin-x64": "1.74.0", "@oxlint/binding-darwin-x64": "1.73.0",
"@oxlint/binding-freebsd-x64": "1.74.0", "@oxlint/binding-freebsd-x64": "1.73.0",
"@oxlint/binding-linux-arm-gnueabihf": "1.74.0", "@oxlint/binding-linux-arm-gnueabihf": "1.73.0",
"@oxlint/binding-linux-arm-musleabihf": "1.74.0", "@oxlint/binding-linux-arm-musleabihf": "1.73.0",
"@oxlint/binding-linux-arm64-gnu": "1.74.0", "@oxlint/binding-linux-arm64-gnu": "1.73.0",
"@oxlint/binding-linux-arm64-musl": "1.74.0", "@oxlint/binding-linux-arm64-musl": "1.73.0",
"@oxlint/binding-linux-ppc64-gnu": "1.74.0", "@oxlint/binding-linux-ppc64-gnu": "1.73.0",
"@oxlint/binding-linux-riscv64-gnu": "1.74.0", "@oxlint/binding-linux-riscv64-gnu": "1.73.0",
"@oxlint/binding-linux-riscv64-musl": "1.74.0", "@oxlint/binding-linux-riscv64-musl": "1.73.0",
"@oxlint/binding-linux-s390x-gnu": "1.74.0", "@oxlint/binding-linux-s390x-gnu": "1.73.0",
"@oxlint/binding-linux-x64-gnu": "1.74.0", "@oxlint/binding-linux-x64-gnu": "1.73.0",
"@oxlint/binding-linux-x64-musl": "1.74.0", "@oxlint/binding-linux-x64-musl": "1.73.0",
"@oxlint/binding-openharmony-arm64": "1.74.0", "@oxlint/binding-openharmony-arm64": "1.73.0",
"@oxlint/binding-win32-arm64-msvc": "1.74.0", "@oxlint/binding-win32-arm64-msvc": "1.73.0",
"@oxlint/binding-win32-ia32-msvc": "1.74.0", "@oxlint/binding-win32-ia32-msvc": "1.73.0",
"@oxlint/binding-win32-x64-msvc": "1.74.0" "@oxlint/binding-win32-x64-msvc": "1.73.0"
}, },
"peerDependencies": { "peerDependencies": {
"oxlint-tsgolint": ">=0.24.0", "oxlint-tsgolint": ">=0.24.0",
+2 -5
View File
@@ -18,7 +18,7 @@
"dependencies": { "dependencies": {
"@unocss/vite": "^66.7.5", "@unocss/vite": "^66.7.5",
"@vueuse/core": "^14.4.0", "@vueuse/core": "^14.4.0",
"fabric-trade": "file:../fabric-nademitex_user", "fabric-trade": "file:../nademitex_user",
"jalaali-js": "^2.0.0", "jalaali-js": "^2.0.0",
"lodash-es": "^4.18.1", "lodash-es": "^4.18.1",
"pinia": "^4.0.2", "pinia": "^4.0.2",
@@ -40,15 +40,12 @@
"eslint-plugin-vue": "~10.9.2", "eslint-plugin-vue": "~10.9.2",
"jiti": "^2.7.0", "jiti": "^2.7.0",
"npm-run-all2": "^9.0.2", "npm-run-all2": "^9.0.2",
"oxlint": "~1.74.0", "oxlint": "~1.73.0",
"prettier": "3.9.5", "prettier": "3.9.5",
"typescript": "~6.0.0", "typescript": "~6.0.0",
"vite": "^8.1.5", "vite": "^8.1.5",
"vite-plugin-vue-devtools": "^8.1.5", "vite-plugin-vue-devtools": "^8.1.5",
"vue-eslint-parser": "^10.4.1", "vue-eslint-parser": "^10.4.1",
"vue-tsc": "^3.3.7" "vue-tsc": "^3.3.7"
},
"engines": {
"node": "^22.18.0 || >=24.12.0"
} }
} }
+7 -2
View File
@@ -159,12 +159,17 @@ const router = createRouter({
}, },
], ],
}, },
{
path: '/:pathMatch(.*)*',
name: 'not-found',
component: () => import('@/views/NotFoundView.vue'),
},
], ],
}) })
router.beforeEach((to) => { router.beforeEach(async (to) => {
const auth = useAuthStore() const auth = useAuthStore()
auth.hydrate() await auth.hydrate()
if (to.meta.public) { if (to.meta.public) {
if (auth.isAuthenticated && to.name === 'login') { if (auth.isAuthenticated && to.name === 'login') {
+7 -2
View File
@@ -111,7 +111,10 @@ export async function loginAdmin(payload: AdminLoginPayload): Promise<AdminLogin
/** Refresh session from GET /auth/me when a token exists. */ /** Refresh session from GET /auth/me when a token exists. */
export async function refreshAdminSession(): Promise<AdminSession | null> { export async function refreshAdminSession(): Promise<AdminSession | null> {
const token = getAccessToken() const token = getAccessToken()
if (!token) return readSession() if (!token) {
clearSession()
return null
}
if (USE_MOCK_AUTH || token === 'mock-admin-token') { if (USE_MOCK_AUTH || token === 'mock-admin-token') {
const session = readSession() ?? MOCK_ADMIN.session const session = readSession() ?? MOCK_ADMIN.session
@@ -125,7 +128,9 @@ export async function refreshAdminSession(): Promise<AdminSession | null> {
writeSession(session, isRememberedToken()) writeSession(session, isRememberedToken())
return session return session
} catch { } catch {
return readSession() setAccessToken(null)
clearSession()
return null
} }
} }
+16
View File
@@ -112,6 +112,22 @@ export async function apiRequest<T>(path: string, options: RequestOptions = {}):
} }
if (!res.ok) { if (!res.ok) {
if (res.status === 401 && options.auth !== false) {
setAccessToken(null)
localStorage.removeItem('fabric-admin-session')
sessionStorage.removeItem('fabric-admin-session')
const loginPath = `${import.meta.env.BASE_URL}login`
if (typeof window !== 'undefined' && window.location.pathname !== loginPath) {
const basePath = import.meta.env.BASE_URL.replace(/\/$/, '')
const routePath = window.location.pathname.startsWith(basePath)
? window.location.pathname.slice(basePath.length) || '/'
: window.location.pathname
const redirect = encodeURIComponent(
`${routePath}${window.location.search}`,
)
window.location.assign(`${loginPath}?redirect=${redirect}`)
}
}
throw new ApiError(res.status, errorMessageFromBody(data, res.status)) throw new ApiError(res.status, errorMessageFromBody(data, res.status))
} }
+2 -4
View File
@@ -29,11 +29,9 @@ export const useAuthStore = defineStore('auth', () => {
error.value = null error.value = null
} }
function hydrate() { async function hydrate() {
session.value = getStoredSession() session.value = getStoredSession()
void refreshAdminSession().then((refreshed) => { session.value = await refreshAdminSession()
if (refreshed) session.value = refreshed
})
} }
async function login(phone: string, password: string, remember: boolean) { async function login(phone: string, password: string, remember: boolean) {
+35
View File
@@ -0,0 +1,35 @@
<template>
<main class="not-found">
<p class="not-found__code">404</p>
<h1>صفحه پیدا نشد</h1>
<p>آدرسی که وارد کرده‌اید وجود ندارد.</p>
<RouterLink to="/">بازگشت به داشبورد</RouterLink>
</main>
</template>
<style scoped>
.not-found {
display: grid;
min-height: 60vh;
place-content: center;
gap: 12px;
text-align: center;
}
.not-found__code {
margin: 0;
color: var(--color-primary, #c89b3c);
font-size: 72px;
font-weight: 800;
}
h1,
p {
margin: 0;
}
a {
color: var(--color-primary, #c89b3c);
font-weight: 700;
}
</style>
+6 -2
View File
@@ -35,8 +35,12 @@ async function submit() {
if (!ok) return if (!ok) return
toast.success(`خوش آمدید، ${auth.fullName}`) toast.success(`خوش آمدید، ${auth.fullName}`)
const redirect = typeof route.query.redirect === 'string' ? route.query.redirect : '/' const requestedPath = typeof route.query.redirect === 'string' ? route.query.redirect : '/'
router.replace(redirect) const basePath = import.meta.env.BASE_URL.replace(/\/$/, '')
const redirect = requestedPath.startsWith(basePath)
? requestedPath.slice(basePath.length) || '/'
: requestedPath
await router.replace(redirect)
} }
</script> </script>
+10 -4
View File
@@ -1,14 +1,17 @@
import { fileURLToPath, URL } from 'node:url' import { fileURLToPath, URL } from 'node:url'
import { defineConfig } from 'vite' import { defineConfig, loadEnv } from 'vite'
import vue from '@vitejs/plugin-vue' import vue from '@vitejs/plugin-vue'
import vueJsx from '@vitejs/plugin-vue-jsx' import vueJsx from '@vitejs/plugin-vue-jsx'
import vueDevTools from 'vite-plugin-vue-devtools' import vueDevTools from 'vite-plugin-vue-devtools'
import UnoCSS from '@unocss/vite' import UnoCSS from '@unocss/vite'
// https://vite.dev/config/ // https://vite.dev/config/
export default defineConfig(({ mode }) => ({ export default defineConfig(({ mode }) => {
base: '/admin/', const env = loadEnv(mode, process.cwd(), '')
return {
base: env.VITE_BASE_PATH || '/',
plugins: [ plugins: [
vue(), vue(),
vueJsx(), vueJsx(),
@@ -21,6 +24,8 @@ export default defineConfig(({ mode }) => ({
}, },
}, },
server: { server: {
port: 5174,
strictPort: true,
proxy: { proxy: {
'/server/api': { '/server/api': {
target: 'https://nademitex.montest.ir', target: 'https://nademitex.montest.ir',
@@ -29,4 +34,5 @@ export default defineConfig(({ mode }) => ({
}, },
}, },
}, },
})) }
})
+55 -40
View File
@@ -475,10 +475,15 @@
"@nodelib/fs.scandir" "2.1.5" "@nodelib/fs.scandir" "2.1.5"
fastq "^1.6.0" fastq "^1.6.0"
"@oxc-parser/binding-win32-x64-msvc@0.131.0": "@oxc-parser/binding-linux-x64-gnu@0.131.0":
version "0.131.0" version "0.131.0"
resolved "https://registry.npmmirror.com/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.131.0.tgz" resolved "https://registry.npmmirror.com/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.131.0.tgz"
integrity sha512-o14Hk8dAyiEUMFEWEgmAwFZvBt1RzAYLM3xeQ+5315JXgVYhoemivgYcbYVRbsFkS71ShMGlAFE0kPnr460rww== integrity sha512-JHK/h95qVqVQ+ITER837kcTdwBDFpFaNnOTYGCP0zdUSX/mLKC7tXOoyrTb6vG7iRPwGlcgBil3v2IjYw1FqJA==
"@oxc-parser/binding-linux-x64-musl@0.131.0":
version "0.131.0"
resolved "https://registry.npmmirror.com/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.131.0.tgz"
integrity sha512-b2BO82O8azXAyf7EUgOPKu145nWypbNyk07HbU09fkzhm9lEA5oPvaN/M8Nlo7tOErVTa2WOgS4QbOnxAPXdDQ==
"@oxc-project/types@^0.131.0": "@oxc-project/types@^0.131.0":
version "0.131.0" version "0.131.0"
@@ -490,10 +495,10 @@
resolved "https://registry.npmjs.org/@oxc-project/types/-/types-0.142.0.tgz" resolved "https://registry.npmjs.org/@oxc-project/types/-/types-0.142.0.tgz"
integrity sha512-7W+2q5AKQVU36fkaryontrHn3YDt1RyUYXatw9i5H8ocYe2sPKSFB6eS8WNPeRKiN1qAWWZUPm7gwFzJGrccqQ== integrity sha512-7W+2q5AKQVU36fkaryontrHn3YDt1RyUYXatw9i5H8ocYe2sPKSFB6eS8WNPeRKiN1qAWWZUPm7gwFzJGrccqQ==
"@oxlint/binding-win32-x64-msvc@1.74.0": "@oxlint/binding-linux-x64-gnu@1.73.0":
version "1.74.0" version "1.73.0"
resolved "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.74.0.tgz" resolved "https://registry.npmmirror.com/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.73.0.tgz"
integrity sha512-VTC9IYTIMrVUk/i6Ms1ohzzDKZFkWn0KU2OBbPBzgmVZ2V30165T/zK4LztTr0Xgp9fZ1qQZ1rsZAu/rEmySlA== integrity sha512-2CwIWr9cemFC/CbRBWZvuk5mffz6ObmfFkfcC/9rTQ7f+icNhYr2kOjf9Rt8lLvugvkdGDOmkoVoFFHh6ClCTw==
"@polka/url@^1.0.0-next.24": "@polka/url@^1.0.0-next.24":
version "1.0.0-next.29" version "1.0.0-next.29"
@@ -507,6 +512,16 @@
dependencies: dependencies:
quansync "^1.0.0" quansync "^1.0.0"
"@rolldown/binding-linux-x64-gnu@1.2.1":
version "1.2.1"
resolved "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.1.tgz"
integrity sha512-/Orga1fZYkLc/56jBICcHrKchl8Z2UKdDSr3LG9ToWO1lQ6a4Livk9Xz+9WN91zsz5QR3XQz2NNoSDEvP6qadw==
"@rolldown/binding-linux-x64-musl@1.2.1":
version "1.2.1"
resolved "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.1.tgz"
integrity sha512-xxBJRL+0q0Kce7orznGWLuylHDY65vuARXZRpX+hPdv+DqK2c3NlCsVA98tlWzWNEE7yPqA/1NQ5nnCrj49Y5A==
"@rolldown/binding-wasm32-wasi@1.2.1": "@rolldown/binding-wasm32-wasi@1.2.1":
version "1.2.1" version "1.2.1"
resolved "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.2.1.tgz" resolved "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.2.1.tgz"
@@ -516,11 +531,6 @@
"@emnapi/runtime" "2.0.0-alpha.3" "@emnapi/runtime" "2.0.0-alpha.3"
"@napi-rs/wasm-runtime" "^1.2.0" "@napi-rs/wasm-runtime" "^1.2.0"
"@rolldown/binding-win32-x64-msvc@1.2.1":
version "1.2.1"
resolved "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.1.tgz"
integrity sha512-Z4eCmn5QJ/5+azF9knpLWKfVd9aidn0mAe9TpJgvBLId9Ax3t0+JVxBmT25Bv7NBbVW1TZyKjQjQReouMeH5UQ==
"@rolldown/pluginutils@^1.0.0", "@rolldown/pluginutils@^1.0.1": "@rolldown/pluginutils@^1.0.0", "@rolldown/pluginutils@^1.0.1":
version "1.0.1" version "1.0.1"
resolved "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz" resolved "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz"
@@ -1532,9 +1542,9 @@ exsolve@^1.0.8:
resolved "https://registry.npmjs.org/exsolve/-/exsolve-1.1.1.tgz" resolved "https://registry.npmjs.org/exsolve/-/exsolve-1.1.1.tgz"
integrity sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g== integrity sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==
"fabric-trade@file:../fabric-nademitex_user": "fabric-trade@file:../nademitex_user":
version "0.0.0" version "0.0.0"
resolved "file:../fabric-nademitex_user" resolved "file:../nademitex_user"
dependencies: dependencies:
"@unocss/vite" "^66.7.5" "@unocss/vite" "^66.7.5"
"@vueuse/core" "^14.4.0" "@vueuse/core" "^14.4.0"
@@ -1790,10 +1800,15 @@ levn@^0.4.1:
prelude-ls "^1.2.1" prelude-ls "^1.2.1"
type-check "~0.4.0" type-check "~0.4.0"
lightningcss-win32-x64-msvc@1.33.0: lightningcss-linux-x64-gnu@1.33.0:
version "1.33.0" version "1.33.0"
resolved "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz" resolved "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz"
integrity sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA== integrity sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==
lightningcss-linux-x64-musl@1.33.0:
version "1.33.0"
resolved "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz"
integrity sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==
lightningcss@^1.33.0: lightningcss@^1.33.0:
version "1.33.0" version "1.33.0"
@@ -2053,30 +2068,30 @@ oxc-walker@^0.7.0:
dependencies: dependencies:
magic-regexp "^0.10.0" magic-regexp "^0.10.0"
oxlint@~1.74.0: oxlint@~1.73.0:
version "1.74.0" version "1.73.0"
resolved "https://registry.npmjs.org/oxlint/-/oxlint-1.74.0.tgz" resolved "https://registry.npmmirror.com/oxlint/-/oxlint-1.73.0.tgz"
integrity sha512-odGl2s2x5IOJoj3A0v1k0PGBXVFBZeZ2+AK/+K2MJur7Ghi3bkyX5NuLUWHKqa4js1wjep3hJeuTQJOlr+4+dA== integrity sha512-u91G9TJzU6yqKWNZUYprQB07W7YvntZXaRxQ6CkoytepYhLWUXWsr1M8zUJ34VatNPuUAr3Z8GH+O2A331CluQ==
optionalDependencies: optionalDependencies:
"@oxlint/binding-android-arm-eabi" "1.74.0" "@oxlint/binding-android-arm-eabi" "1.73.0"
"@oxlint/binding-android-arm64" "1.74.0" "@oxlint/binding-android-arm64" "1.73.0"
"@oxlint/binding-darwin-arm64" "1.74.0" "@oxlint/binding-darwin-arm64" "1.73.0"
"@oxlint/binding-darwin-x64" "1.74.0" "@oxlint/binding-darwin-x64" "1.73.0"
"@oxlint/binding-freebsd-x64" "1.74.0" "@oxlint/binding-freebsd-x64" "1.73.0"
"@oxlint/binding-linux-arm-gnueabihf" "1.74.0" "@oxlint/binding-linux-arm-gnueabihf" "1.73.0"
"@oxlint/binding-linux-arm-musleabihf" "1.74.0" "@oxlint/binding-linux-arm-musleabihf" "1.73.0"
"@oxlint/binding-linux-arm64-gnu" "1.74.0" "@oxlint/binding-linux-arm64-gnu" "1.73.0"
"@oxlint/binding-linux-arm64-musl" "1.74.0" "@oxlint/binding-linux-arm64-musl" "1.73.0"
"@oxlint/binding-linux-ppc64-gnu" "1.74.0" "@oxlint/binding-linux-ppc64-gnu" "1.73.0"
"@oxlint/binding-linux-riscv64-gnu" "1.74.0" "@oxlint/binding-linux-riscv64-gnu" "1.73.0"
"@oxlint/binding-linux-riscv64-musl" "1.74.0" "@oxlint/binding-linux-riscv64-musl" "1.73.0"
"@oxlint/binding-linux-s390x-gnu" "1.74.0" "@oxlint/binding-linux-s390x-gnu" "1.73.0"
"@oxlint/binding-linux-x64-gnu" "1.74.0" "@oxlint/binding-linux-x64-gnu" "1.73.0"
"@oxlint/binding-linux-x64-musl" "1.74.0" "@oxlint/binding-linux-x64-musl" "1.73.0"
"@oxlint/binding-openharmony-arm64" "1.74.0" "@oxlint/binding-openharmony-arm64" "1.73.0"
"@oxlint/binding-win32-arm64-msvc" "1.74.0" "@oxlint/binding-win32-arm64-msvc" "1.73.0"
"@oxlint/binding-win32-ia32-msvc" "1.74.0" "@oxlint/binding-win32-ia32-msvc" "1.73.0"
"@oxlint/binding-win32-x64-msvc" "1.74.0" "@oxlint/binding-win32-x64-msvc" "1.73.0"
p-limit@^3.0.2: p-limit@^3.0.2:
version "3.1.0" version "3.1.0"