Files
imen_pishghaman/apps/admin/dist/assets/MessagesPage-Bb_X9ABq.js
T
S. EsmaeiliandClaude Haiku 5.5 10e453e4be build: ship pre-built API bundle; images copy output instead of installing
- 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>
2026-10-24 14:41:31 +03:30

1 line
7.6 KiB
JavaScript

import{i as e,r as t,t as n}from"./VuesaxIcon-B2OgulS6.js";import{Bt as r,Ct as i,Dt as a,It as o,Lt as s,Mt as c,Nt as l,Rt as u,Tt as d,_t as f,a as p,ct as m,dt as h,ft as g,gt as _,ht as v,i as y,kt as b,lt as x,n as S,ot as C,pt as w,t as T,ut as E}from"./index-BuGK6ptM.js";import{a as D,r as ee}from"./format-B9MYDQJN.js";import{t as O}from"./PageHeader-3Ryvg2HD.js";var te={class:`!hidden lg:!block`},k={class:`mobile-filter-bar sticky top-[52px] z-20 bg-white/95 backdrop-blur-md -mx-3 px-3 py-2 border-b border-slate-100 flex items-center gap-1.5 overflow-x-auto no-scrollbar mb-3 lg:!hidden`},ne=[`onClick`],re={class:`whitespace-pre-line leading-7`},ie=[`href`],ae={class:`mobile-messages-view block lg:!hidden pb-20`},oe={key:1,class:`space-y-3`},se={class:`flex items-start justify-between gap-2`},ce={class:`flex items-center gap-1.5`},le={class:`font-bold text-[14px] text-slate-800`},ue={key:0,class:`size-2 rounded-full bg-orange-500 animate-pulse`},de={key:0,class:`text-xs text-slate-500 font-medium mt-0.5`},fe={class:`flex items-center justify-between border-t border-slate-100 pt-2.5 mt-2.5`},pe={class:`text-[11px] text-slate-400 font-mono`},me=[`href`],he={dir:`ltr`,class:`font-mono`},ge=[`onClick`],A={key:0,class:`text-xs text-slate-600 line-clamp-2 leading-relaxed bg-slate-50/70 p-2.5 rounded-lg border border-slate-100`},j={key:1,class:`text-xs text-slate-700 whitespace-pre-line leading-relaxed bg-orange-50/30 p-3 rounded-lg border border-orange-100`},M={class:`flex items-center justify-between border-t border-slate-100 pt-2.5 mt-3`},N={class:`flex items-center gap-2`},P={type:`button`,class:`size-8 rounded-lg flex items-center justify-center text-rose-500 bg-rose-50 hover:bg-rose-100 active:bg-rose-200 transition`,title:`حذف پیام`},F={key:2,class:`flex items-center justify-between gap-3 pt-4 px-1`},I={class:`text-xs text-slate-500 font-mono`},L=20,R=f({__name:`MessagesPage`,setup(f){let R=T(),z=p(),B=o(z.query.status||`ALL`),V=t.map(t=>({value:t,label:e[t]})),H=[{value:`ALL`,label:`همه`},...V],U=o(1),W=o([]),G=o(0),K=o(!1),q=o([]),J=x(()=>Math.ceil(G.value/L)||1);async function Y(){K.value=!0;try{let e=await S(`/admin/messages`,{query:{status:B.value===`ALL`?void 0:B.value,page:U.value,pageSize:L}});W.value=e.items,G.value=e.total}catch(e){C.error(y(e))}finally{K.value=!1}}async function X(t,n){try{await S(`/admin/messages/${t.id}`,{method:`PATCH`,body:{status:n}}),t.status=n,C.success(`وضعیت پیام به «${e[n]}» تغییر کرد`)}catch(e){C.error(y(e))}}function _e(e){let t=q.value.indexOf(e.id);t>-1?q.value.splice(t,1):(q.value.push(e.id),e.status===`NEW`&&X(e,`READ`))}function ve(e,t){e&&t.status===`NEW`&&X(t,`READ`)}async function Z(e){try{await S(`/admin/messages/${e.id}`,{method:`DELETE`}),C.success(`پیام حذف شد`),await Y()}catch(e){C.error(y(e))}}function Q(e){e<1||e>J.value||(U.value=e,Y())}let $={NEW:`orange`,READ:`blue`,ARCHIVED:`default`},ye=[{title:`نام`,dataIndex:`name`},{title:`سازمان`,dataIndex:`org`},{title:`تلفن`,key:`phone`,width:150},{title:`تاریخ`,key:`date`,width:170},{title:`وضعیت`,key:`status`,width:140},{title:``,key:`actions`,width:60}];return c(B,()=>{U.value=1,Y()}),i(Y),(t,i)=>{let o=b(`a-segmented`),c=b(`a-badge`),f=b(`a-select`),p=b(`a-button`),y=b(`a-popconfirm`),x=b(`a-table`),S=b(`a-card`),C=b(`a-empty`),T=b(`a-tag`),z=b(`Phone`),be=b(`a-spin`);return d(),w(m,null,[_(O,{title:`پیام‌های تماس`,subtitle:`${s(ee)(G.value)} پیام — استعلام‌ها و درخواست‌های ثبت‌شده از سایت`},{default:l(()=>[E(`div`,te,[_(o,{value:B.value,"onUpdate:value":i[0]||=e=>B.value=e,options:H},null,8,[`value`])])]),_:1},8,[`subtitle`]),E(`div`,k,[(d(),w(m,null,a(H,e=>E(`button`,{key:e.value,type:`button`,class:u([`px-3 py-1.5 rounded-full text-xs font-bold transition shrink-0 select-none cursor-pointer`,B.value===e.value?`bg-orange-600 text-white shadow-xs`:`bg-slate-100 text-slate-600 active:bg-slate-200`]),onClick:t=>B.value=e.value},r(e.label),11,ne)),64))]),_(S,{class:`!hidden lg:!block`,"body-style":{padding:0}},{default:l(()=>[_(x,{columns:ye,"data-source":W.value,loading:K.value,"row-key":`id`,scroll:{x:760},pagination:{current:U.value,pageSize:L,total:G.value,showSizeChanger:!1,onChange:e=>{U.value=e,Y()}},onExpand:ve},{expandedRowRender:l(({record:e})=>[E(`p`,re,r(e.message||`— بدون توضیح —`),1)]),bodyCell:l(({column:e,record:t})=>[e.key===`phone`?(d(),w(`a`,{key:0,href:`tel:${t.phone}`,dir:`ltr`,class:`hover:text-orange-600 font-mono`},r(t.phone),9,ie)):e.key===`date`?(d(),w(m,{key:1},[v(r(s(D)(t.createdAt)),1)],64)):e.key===`status`?(d(),h(f,{key:2,value:t.status,size:`small`,class:`w-28`,options:s(V),onChange:e=>X(t,e)},{suffixIcon:l(()=>[_(c,{color:$[t.status]},null,8,[`color`])]),_:2},1032,[`value`,`options`,`onChange`])):e.key===`actions`?(d(),w(m,{key:3},[s(R).isAdmin?(d(),h(y,{key:0,title:`این پیام حذف شود؟`,"ok-text":`حذف`,"cancel-text":`انصراف`,onConfirm:e=>Z(t)},{default:l(()=>[_(p,{size:`small`,danger:``},{icon:l(()=>[_(n,{name:`trash`,size:16})]),_:1})]),_:1},8,[`onConfirm`])):g(``,!0)],64)):g(``,!0)]),_:1},8,[`data-source`,`loading`,`pagination`])]),_:1}),E(`div`,ae,[_(be,{spinning:K.value},{default:l(()=>[!W.value.length&&!K.value?(d(),h(C,{key:0,description:`پیامی با این وضعیت موجود نیست`,class:`py-12`})):(d(),w(`div`,oe,[(d(!0),w(m,null,a(W.value,t=>(d(),w(`div`,{key:t.id,class:u([`bg-white rounded-xl border border-slate-200/80 p-3.5 shadow-2xs transition`,{"border-orange-300 ring-2 ring-orange-100":t.status===`NEW`}])},[E(`div`,se,[E(`div`,null,[E(`div`,ce,[E(`span`,le,r(t.name),1),t.status===`NEW`?(d(),w(`span`,ue)):g(``,!0)]),t.org?(d(),w(`div`,de,r(t.org),1)):g(``,!0)]),_(T,{color:$[t.status],class:`!m-0 !text-[11px] !font-bold`},{default:l(()=>[v(r(s(e)[t.status]),1)]),_:2},1032,[`color`])]),E(`div`,fe,[E(`span`,pe,r(s(D)(t.createdAt)),1),E(`a`,{href:`tel:`+t.phone,class:`inline-flex items-center gap-1.5 px-3 py-1.5 rounded-lg bg-emerald-50 text-emerald-700 border border-emerald-200/70 font-bold text-xs active:bg-emerald-100 active:scale-95 transition`,title:`تماس مستقیم با مشتری`},[_(z,{size:13,class:`text-emerald-600 shrink-0`}),E(`span`,he,r(t.phone),1)],8,me)]),E(`div`,{class:`mt-3 cursor-pointer`,onClick:e=>_e(t)},[q.value.includes(t.id)?(d(),w(`div`,j,[v(r(t.message||`— بدون توضیح —`)+` `,1),i[4]||=E(`div`,{class:`text-[10px] text-slate-400 font-medium mt-2`},`بستن متن پیام ↑`,-1)])):(d(),w(`div`,A,[v(r(t.message||`— بدون توضیح —`)+` `,1),i[3]||=E(`div`,{class:`text-[10px] text-orange-600 font-bold mt-1`},`مشاهده متن کامل پیام ←`,-1)]))],8,ge),E(`div`,M,[E(`div`,N,[i[5]||=E(`span`,{class:`text-[11px] text-slate-400`},`وضعیت:`,-1),_(f,{value:t.status,size:`small`,class:`w-28 !text-xs`,options:s(V),onChange:e=>X(t,e)},null,8,[`value`,`options`,`onChange`])]),s(R).isAdmin?(d(),h(y,{key:0,title:`این پیام حذف شود؟`,"ok-text":`حذف`,"cancel-text":`انصراف`,onConfirm:e=>Z(t)},{default:l(()=>[E(`button`,P,[_(n,{name:`trash`,size:16})])]),_:1},8,[`onConfirm`])):g(``,!0)])],2))),128))])),J.value>1?(d(),w(`div`,F,[_(p,{disabled:U.value<=1,class:`!flex-1 !h-10 !rounded-xl !font-medium`,onClick:i[1]||=e=>Q(U.value-1)},{default:l(()=>[...i[6]||=[v(` صفحه قبلی `,-1)]]),_:1},8,[`disabled`]),E(`span`,I,r(U.value.toLocaleString(`fa-IR`))+` / `+r(J.value.toLocaleString(`fa-IR`)),1),_(p,{disabled:U.value>=J.value,class:`!flex-1 !h-10 !rounded-xl !font-medium`,onClick:i[2]||=e=>Q(U.value+1)},{default:l(()=>[...i[7]||=[v(` صفحه بعدی `,-1)]]),_:1},8,[`disabled`])])):g(``,!0)]),_:1},8,[`spinning`])])],64)}}});export{R as default};