- API: `pnpm build` bundles dist/ into apps/api/.output (esbuild), with Linux musl native packages for sharp and argon2 kept alongside - docker/api.Dockerfile copies that output; no pnpm install on the server - add dist/migrate.js (prisma migrate deploy equivalent, same _prisma_migrations table and lock) so the Prisma CLI is not needed at runtime - pnpm-workspace: supportedArchitectures for linux/x64/musl - admin: apps/admin/.env.production sets VITE_SITE_URL for the production build - drop NPM_REGISTRY / SITE_URL build args from compose and .env.example - gitignore: anchor node_modules rules so pre-built node_modules are committed - README: describe the pre-built deploy flow Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
1 line
12 KiB
JavaScript
1 line
12 KiB
JavaScript
import{a as e,b as t,l as n,o as r,t as i,u as a}from"./VuesaxIcon-B2OgulS6.js";import{Bt as o,Ct as s,Dt as ee,It as c,Lt as l,Nt as u,Rt as te,Tt as d,_t as f,ct as p,dt as m,ft as h,gt as g,ht as _,i as v,kt as y,lt as b,n as x,ot as S,pt as C,st as ne,t as w,ut as T}from"./index-BuGK6ptM.js";import{a as E}from"./format-B9MYDQJN.js";import{t as re}from"./PageHeader-3Ryvg2HD.js";import{n as D,t as O}from"./FormField-CiVT7mqC.js";var ie={key:0,dir:`ltr`},ae={class:`lg:hidden space-y-3`},k={key:0,class:`rounded-xl border border-dashed border-gray-200 bg-white p-8 text-center`},A={key:1,class:`space-y-3`},oe={class:`flex items-start justify-between gap-3`},se={class:`flex items-center gap-3`},ce={class:`font-bold text-gray-900`},le=[`href`],ue={class:`flex flex-col items-end gap-1`},de={class:`mt-3.5 flex items-center justify-between border-t border-gray-100 pt-3 text-xs text-gray-400`},fe={class:`flex items-center gap-1.5`},pe={class:`font-medium text-gray-600`},j={class:`flex items-center gap-1.5`},M={class:`lg:hidden mt-4 rounded-xl border border-gray-200 bg-white p-3 text-xs shadow-sm`},N={class:`cursor-pointer font-bold text-gray-700 flex items-center justify-between select-none`},P={class:`flex items-center gap-1.5`},F={class:`mt-3 space-y-3 pt-3 border-t border-gray-100`},I={class:`rounded-lg border border-orange-200 bg-orange-50/40 p-2.5`},L={class:`flex items-center gap-2 font-bold text-orange-700`},R={class:`rounded-lg border border-blue-200 bg-blue-50/40 p-2.5`},z={class:`flex items-center gap-2 font-bold text-blue-700`},me={class:`mt-6 max-lg:hidden grid gap-4 md:grid-cols-2`},he={class:`flex items-center gap-2 font-bold text-orange-700`},ge={class:`flex items-center gap-2 font-bold text-blue-700`},_e={class:`mt-1.5 text-[11px] text-gray-500`},B=f({__name:`UsersPage`,setup(f){let B=w(),V=c([]),H=c(!1),U=c(null),W=c(!1),G={phone:``,name:``,role:`EDITOR`,password:``,isActive:!0},K=D(n,G),q=K.model,J=b(()=>U.value===0),ve=e.map(e=>({value:e,label:r[e]}));async function Y(){H.value=!0;try{V.value=await x(`/admin/users`)}catch(e){S.error(v(e))}finally{H.value=!1}}function X(){K.reset(G),U.value=0}function Z(e){K.reset({phone:e.phone,name:e.name,role:e.role,isActive:e.isActive,password:``}),U.value=e.id}async function Q(){W.value=!0;try{if(J.value){let e=K.validate();if(!e)return;await x(`/admin/users`,{method:`POST`,body:e})}else{let{name:e,role:n,isActive:r,password:i}=q.value,o=a.safeParse({name:e,role:n,isActive:r,password:i||void 0});if(!o.success){K.errors.value=Object.fromEntries(t(o.error).map(e=>[e.path,e.message]));return}await x(`/admin/users/${U.value}`,{method:`PUT`,body:o.data})}S.success(`ذخیره شد`),U.value=null,await Y()}catch(e){K.handleError(e)}finally{W.value=!1}}async function $(e){try{await x(`/admin/users/${e.id}`,{method:`DELETE`}),S.success(`کاربر حذف شد`),await Y()}catch(e){S.error(v(e))}}let ye=[{title:`نام`,dataIndex:`name`},{title:`موبایل`,key:`phone`},{title:`نقش`,key:`role`,width:110},{title:`وضعیت`,key:`active`,width:100},{title:`آخرین ورود`,key:`login`,width:170},{title:``,key:`actions`,width:100}];return s(Y),(e,t)=>{let n=y(`a-button`),a=y(`a-tag`),s=y(`a-popconfirm`),c=y(`a-space`),f=y(`a-table`),v=y(`a-card`),b=y(`a-spin`),x=y(`a-input`),S=y(`a-select`),w=y(`a-checkbox`),D=y(`a-input-password`),G=y(`a-form`),K=y(`a-modal`);return d(),C(p,null,[g(re,{title:`کاربران پنل`,subtitle:`مدیر کل به همه بخشها دسترسی دارد؛ ویرایشگر به جز کاربران و تنظیمات سایت`},{default:u(()=>[g(n,{type:`primary`,onClick:X},{icon:u(()=>[g(i,{name:`add`,size:16})]),default:u(()=>[t[6]||=_(` کاربر جدید `,-1)]),_:1})]),_:1}),g(v,{"body-style":{padding:0},class:`max-lg:hidden`},{default:u(()=>[g(f,{columns:ye,"data-source":V.value,loading:H.value,"row-key":`id`,pagination:!1,scroll:{x:700}},{bodyCell:u(({column:e,record:t})=>[e.key===`phone`?(d(),C(`span`,ie,o(t.phone),1)):e.key===`role`?(d(),m(a,{key:1,color:t.role===`ADMIN`?`orange`:`blue`},{default:u(()=>[_(o(l(r)[t.role]),1)]),_:2},1032,[`color`])):e.key===`active`?(d(),m(a,{key:2,color:t.isActive?`green`:`default`},{default:u(()=>[_(o(t.isActive?`فعال`:`غیرفعال`),1)]),_:2},1032,[`color`])):e.key===`login`?(d(),C(p,{key:3},[_(o(l(E)(t.lastLoginAt)),1)],64)):e.key===`actions`?(d(),m(c,{key:4,size:4},{default:u(()=>[g(n,{size:`small`,onClick:e=>Z(t)},{icon:u(()=>[g(i,{name:`edit-2`,size:16})]),_:1},8,[`onClick`]),t.id===l(B).user?.id?h(``,!0):(d(),m(s,{key:0,title:`این کاربر حذف شود؟`,"ok-text":`حذف`,"cancel-text":`انصراف`,onConfirm:e=>$(t)},{default:u(()=>[g(n,{size:`small`,danger:``},{icon:u(()=>[g(i,{name:`trash`,size:16})]),_:1})]),_:1},8,[`onConfirm`]))]),_:2},1024)):h(``,!0)]),_:1},8,[`data-source`,`loading`])]),_:1}),T(`div`,ae,[g(b,{spinning:H.value},{default:u(()=>[!V.value.length&&!H.value?(d(),C(`div`,k,[...t[7]||=[T(`div`,{class:`text-sm text-gray-500`},`کاربری یافت نشد`,-1)]])):(d(),C(`div`,A,[(d(!0),C(p,null,ee(V.value,e=>(d(),C(`div`,{key:e.id,class:`rounded-xl border border-gray-100 bg-white p-4 shadow-sm transition-all`},[T(`div`,oe,[T(`div`,se,[T(`div`,{class:te([`flex size-11 flex-shrink-0 items-center justify-center rounded-full font-bold text-white shadow-sm`,e.role===`ADMIN`?`bg-gradient-to-tr from-orange-600 to-amber-500`:`bg-gradient-to-tr from-blue-600 to-sky-500`])},o(e.name.slice(0,1)),3),T(`div`,null,[T(`div`,ce,o(e.name),1),T(`a`,{href:`tel:${e.phone}`,class:`mt-0.5 inline-block text-xs font-mono text-gray-500 hover:text-orange-600`,dir:`ltr`},o(e.phone),9,le)])]),T(`div`,ue,[g(a,{color:e.role===`ADMIN`?`orange`:`blue`,class:`!m-0 text-[11px]`},{default:u(()=>[_(o(l(r)[e.role]),1)]),_:2},1032,[`color`]),g(a,{color:e.isActive?`green`:`default`,class:`!m-0 text-[10px]`},{default:u(()=>[_(o(e.isActive?`فعال`:`غیرفعال`),1)]),_:2},1032,[`color`])])]),T(`div`,de,[T(`div`,fe,[t[8]||=T(`span`,null,`آخرین ورود:`,-1),T(`span`,pe,o(l(E)(e.lastLoginAt)),1)]),T(`div`,j,[g(n,{size:`small`,class:`!flex !items-center !gap-1`,onClick:t=>Z(e)},{icon:u(()=>[g(i,{name:`edit-2`,size:14})]),default:u(()=>[t[9]||=T(`span`,null,`ویرایش`,-1)]),_:1},8,[`onClick`]),e.id===l(B).user?.id?h(``,!0):(d(),m(s,{key:0,title:`این کاربر حذف شود؟`,"ok-text":`حذف`,"cancel-text":`انصراف`,onConfirm:t=>$(e)},{default:u(()=>[g(n,{size:`small`,danger:``,class:`!px-2`},{icon:u(()=>[g(i,{name:`trash`,size:14})]),_:1})]),_:1},8,[`onConfirm`]))])])]))),128))]))]),_:1},8,[`spinning`])]),T(`button`,{type:`button`,class:`lg:hidden fixed bottom-20 left-4 z-30 flex size-13 items-center justify-center rounded-full bg-[#ff5a00] text-white shadow-lg shadow-orange-500/30 transition-transform active:scale-95`,title:`کاربر جدید`,onClick:X},[g(i,{name:`add`,size:24})]),T(`details`,M,[T(`summary`,N,[T(`span`,P,[g(i,{name:`info-circle`,size:16,class:`text-orange-500`}),t[10]||=_(` راهنمای نقشها و مجوزهای دسترسی `,-1)]),t[11]||=T(`span`,{class:`text-gray-400 text-[10px]`},`لمس برای مشاهده`,-1)]),T(`div`,F,[T(`div`,I,[T(`div`,L,[g(a,{color:`orange`},{default:u(()=>[...t[12]||=[_(`مدیر کل (ADMIN)`,-1)]]),_:1}),t[13]||=T(`span`,{class:`text-[11px]`},`دسترسی ارشد سیستمی`,-1)]),t[14]||=T(`ul`,{class:`mt-2 space-y-1 text-[11px] text-gray-600 list-disc list-inside`},[T(`li`,null,`مدیریت کاربران، نقشها و تنظیمات امنیتی`),T(`li`,null,`تنظیمات پایه سایت، سئو، شبکهها و ساعات کاری`),T(`li`,null,`حذف دادهها (محصولات، دستهها، پیامها، رسانهها)`)],-1)]),T(`div`,R,[T(`div`,z,[g(a,{color:`blue`},{default:u(()=>[...t[15]||=[_(`ویرایشگر (EDITOR)`,-1)]]),_:1}),t[16]||=T(`span`,{class:`text-[11px]`},`دسترسی محتوایی`,-1)]),t[17]||=T(`ul`,{class:`mt-2 space-y-1 text-[11px] text-gray-600 list-disc list-inside`},[T(`li`,null,`ایجاد، ویرایش و انتشار محصولات و دستهبندیها`),T(`li`,null,`ویرایش محتوای بخشهای صفحه اصلی`),T(`li`,null,`آپلود تصاویر در رسانه و مشاهده پیامهای تماس`)],-1)])])]),T(`div`,me,[g(v,{size:`small`,class:`border-orange-200 bg-orange-50/30`},{default:u(()=>[T(`div`,he,[g(a,{color:`orange`},{default:u(()=>[...t[18]||=[_(`مدیر کل (ADMIN)`,-1)]]),_:1}),t[19]||=T(`span`,{class:`text-xs`},`دسترسی ارشد سیستمی`,-1)]),t[20]||=T(`ul`,{class:`mt-2.5 space-y-1.5 text-xs text-gray-600 list-disc list-inside`},[T(`li`,null,`مدیریت کاربران، افزودن کاربر و تغییر نقشها و وضعیت حساب`),T(`li`,null,`دسترسی کامل به تنظیمات پایه سایت، ساعات کاری، شبکهها و سئو`),T(`li`,null,`مجوز حذف محصولات، دستهبندیها، رسانهها و پیامهای تماس`),T(`li`,null,`مشاهده لاگهای امنیتی و رویدادهای کامل سامانه`)],-1)]),_:1}),g(v,{size:`small`,class:`border-blue-200 bg-blue-50/30`},{default:u(()=>[T(`div`,ge,[g(a,{color:`blue`},{default:u(()=>[...t[21]||=[_(`ویرایشگر (EDITOR)`,-1)]]),_:1}),t[22]||=T(`span`,{class:`text-xs`},`دسترسی محتوایی`,-1)]),t[23]||=T(`ul`,{class:`mt-2.5 space-y-1.5 text-xs text-gray-600 list-disc list-inside`},[T(`li`,null,`ایجاد، ویرایش، کپی و انتشار محصولات و گروهها`),T(`li`,null,`ویرایش محتوای بخشهای صفحه اصلی و فعال/مخفیسازی نمایش آنها`),T(`li`,null,`آپلود و ویرایش اطلاعات رسانهها در کتابخانه رسانه`),T(`li`,null,`مشاهده پیامهای تماس و بهروزرسانی وضعیت (بدون دسترسی حذف یا مدیریت کاربران)`)],-1)]),_:1})]),g(K,{open:U.value!==null,title:J.value?`کاربر جدید`:`ویرایش کاربر`,"ok-text":`ذخیره`,"cancel-text":`انصراف`,"confirm-loading":W.value,"destroy-on-close":``,onOk:Q,onCancel:t[5]||=e=>U.value=null},{default:u(()=>[g(G,{layout:`vertical`,class:`mt-4`,onSubmit:ne(Q,[`prevent`])},{default:u(()=>[g(O,{path:`phone`,label:`شماره موبایل`,required:``},{default:u(()=>[g(x,{value:l(q).phone,"onUpdate:value":t[0]||=e=>l(q).phone=e,class:`ltr-input`,disabled:!J.value,inputmode:`tel`,placeholder:`09121234567`},null,8,[`value`,`disabled`])]),_:1}),g(O,{path:`name`,label:`نام`,required:``},{default:u(()=>[g(x,{value:l(q).name,"onUpdate:value":t[1]||=e=>l(q).name=e},null,8,[`value`])]),_:1}),g(O,{path:`role`,label:`نقش`,required:``},{default:u(()=>[g(S,{value:l(q).role,"onUpdate:value":t[2]||=e=>l(q).role=e,disabled:U.value===l(B).user?.id,options:l(ve)},null,8,[`value`,`disabled`,`options`]),T(`div`,_e,o(l(q).role===`ADMIN`?`مدیر کل: دسترسی کامل سیستمی، حذف دادهها، تنظیمات و مدیریت کاربران`:`ویرایشگر: ویرایش محتوا، محصولات، بخشها و پیامها (بدون حذف)`),1)]),_:1}),J.value?h(``,!0):(d(),m(O,{key:0,path:`isActive`},{default:u(()=>[g(w,{checked:l(q).isActive,"onUpdate:checked":t[3]||=e=>l(q).isActive=e,disabled:U.value===l(B).user?.id},{default:u(()=>[...t[24]||=[_(`حساب فعال است`,-1)]]),_:1},8,[`checked`,`disabled`])]),_:1})),g(O,{path:`password`,label:J.value?`رمز عبور`:`رمز عبور جدید (اختیاری)`,required:J.value,hint:`حداقل ۸ کاراکتر`},{default:u(()=>[g(D,{value:l(q).password,"onUpdate:value":t[4]||=e=>l(q).password=e,class:`ltr-input`,autocomplete:`new-password`},null,8,[`value`])]),_:1},8,[`label`,`required`])]),_:1})]),_:1},8,[`open`,`title`,`confirm-loading`])],64)}}});export{B as default}; |