- 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
7.1 KiB
JavaScript
1 line
7.1 KiB
JavaScript
import{t as e}from"./VuesaxIcon-B2OgulS6.js";import{Bt as t,Ct as n,Dt as r,It as i,Lt as a,Nt as o,Tt as s,_t as c,ct as l,dt as u,ft as d,gt as f,ht as p,i as m,kt as h,n as g,ot as _,pt as v,t as y,ut as b,wt as x}from"./index-BuGK6ptM.js";import{a as S,i as C,r as w}from"./format-B9MYDQJN.js";import{t as T}from"./PageHeader-3Ryvg2HD.js";var E={class:`grid grid-cols-3 gap-2.5 sm:grid-cols-4 md:grid-cols-6 xl:grid-cols-9`},D=[`title`,`onClick`],O=[`src`,`alt`],k={class:`absolute inset-x-0 bottom-0 bg-gradient-to-t from-black/60 to-transparent p-1 text-[9px] text-white opacity-0 transition group-hover:opacity-100 max-lg:hidden truncate`},A={class:`mt-4 flex justify-center`},j={class:`lg:hidden fixed bottom-20 left-4 z-30`},M=[`disabled`],N={key:1,class:`text-xs font-bold`},ee={class:`overflow-hidden rounded-xl border border-gray-200 bg-gray-50 flex items-center justify-center p-2`},te=[`src`,`alt`],ne={dir:`ltr`,class:`truncate block max-w-[240px] text-xs font-mono text-gray-700`},re={dir:`ltr`,class:`text-xs font-mono`},ie={class:`max-lg:grid max-lg:grid-cols-2 max-lg:gap-2 max-lg:mt-4 max-lg:hidden`},ae={class:`lg:hidden grid grid-cols-2 gap-2 mt-4`},P=36,F=c({__name:`MediaPage`,setup(c){let F=y(),I=i([]),L=i(0),R=i(1),z=i(``),B=i(!1),V=i(0),H=i(null),U=i(``),W=i(!1);function G(){typeof window<`u`&&(W.value=window.innerWidth<1024)}async function K(){B.value=!0;try{let e=await g(`/admin/media`,{query:{page:R.value,pageSize:P,q:z.value||void 0}});I.value=e.items,L.value=e.total}catch(e){_.error(m(e))}finally{B.value=!1}}async function q(e){V.value++;try{let t=new FormData;t.append(`file`,e),await g(`/admin/media`,{method:`POST`,body:t}),_.success(`«${e.name}» آپلود شد`),R.value=1,await K()}catch(t){_.error(`${e.name}: ${m(t)}`)}finally{V.value--}return!1}function oe(e){H.value=e,U.value=e.alt}async function J(){if(H.value)try{let e=await g(`/admin/media/${H.value.id}`,{method:`PATCH`,body:{alt:U.value}});Object.assign(H.value,e),_.success(`ذخیره شد`)}catch(e){_.error(m(e))}}async function Y(){if(H.value)try{await g(`/admin/media/${H.value.id}`,{method:`DELETE`}),_.success(`تصویر حذف شد`),H.value=null,await K()}catch(e){_.error(m(e))}}async function X(e){await navigator.clipboard.writeText(new URL(e,location.origin).toString()),_.success(`آدرس کپی شد`)}return n(()=>{G(),window.addEventListener(`resize`,G),K()}),x(()=>{typeof window<`u`&&window.removeEventListener(`resize`,G)}),(n,i)=>{let c=h(`a-button`),m=h(`a-upload`),g=h(`a-input-search`),_=h(`a-empty`),y=h(`a-spin`),x=h(`a-pagination`),G=h(`a-card`),Z=h(`a-descriptions-item`),se=h(`a-descriptions`),ce=h(`a-input`),le=h(`a-form-item`),Q=h(`a-popconfirm`),$=h(`a-space`),ue=h(`a-form`),de=h(`a-drawer`);return s(),v(l,null,[f(T,{title:`کتابخانه رسانه`,subtitle:`${a(w)(L.value)} تصویر`},{default:o(()=>[f(m,{accept:`image/jpeg,image/png,image/webp,image/avif,image/gif`,multiple:``,"show-upload-list":!1,"before-upload":q},{default:o(()=>[f(c,{type:`primary`,loading:V.value>0},{icon:o(()=>[f(e,{name:`document-upload`,size:16})]),default:o(()=>[i[7]||=p(` آپلود تصویر `,-1)]),_:1},8,[`loading`])]),_:1})]),_:1},8,[`subtitle`]),f(G,null,{default:o(()=>[f(g,{value:z.value,"onUpdate:value":i[0]||=e=>z.value=e,"allow-clear":``,placeholder:`جستجو در نام فایل یا متن جایگزین`,class:`mb-4 w-full md:max-w-md`,onSearch:i[1]||=()=>{R.value=1,K()}},null,8,[`value`]),f(y,{spinning:B.value},{default:o(()=>[!I.value.length&&!B.value?(s(),u(_,{key:0,description:`تصویری پیدا نشد`})):d(``,!0),b(`div`,E,[(s(!0),v(l,null,r(I.value,e=>(s(),v(`button`,{key:e.id,type:`button`,class:`group relative overflow-hidden rounded-xl border border-gray-200 bg-gray-50 transition active:scale-95 hover:border-[#ff5a00] focus:outline-none`,title:e.originalName,onClick:t=>oe(e)},[b(`img`,{src:e.url,alt:e.alt,class:`aspect-square w-full object-contain p-1`,loading:`lazy`},null,8,O),b(`div`,k,t(e.originalName),1)],8,D))),128))])]),_:1},8,[`spinning`]),b(`div`,A,[f(x,{current:R.value,"onUpdate:current":i[2]||=e=>R.value=e,total:L.value,"page-size":P,"show-size-changer":!1,simple:W.value,onChange:K},null,8,[`current`,`total`,`simple`])])]),_:1}),b(`div`,j,[f(m,{accept:`image/jpeg,image/png,image/webp,image/avif,image/gif`,multiple:``,"show-upload-list":!1,"before-upload":q},{default:o(()=>[b(`button`,{type:`button`,class:`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:`آپلود تصویر`,disabled:V.value>0},[V.value===0?(s(),u(e,{key:0,name:`document-upload`,size:24})):(s(),v(`span`,N,t(V.value),1))],8,M)]),_:1})]),f(de,{open:!!H.value,title:`جزئیات تصویر`,width:W.value?`100%`:380,height:W.value?`82vh`:void 0,placement:W.value?`bottom`:`left`,"body-style":{paddingBottom:W.value?`80px`:`24px`},onClose:i[6]||=e=>H.value=null},{default:o(()=>[H.value?(s(),v(l,{key:0},[b(`div`,ee,[b(`img`,{src:H.value.url,alt:H.value.alt,class:`max-h-60 w-full object-contain`},null,8,te)]),f(se,{column:W.value?2:1,size:`small`,class:`mt-4`},{default:o(()=>[f(Z,{label:`نام فایل`,span:W.value?2:1},{default:o(()=>[b(`span`,ne,t(H.value.originalName),1)]),_:1},8,[`span`]),f(Z,{label:`ابعاد`},{default:o(()=>[b(`span`,re,t(H.value.width)+`×`+t(H.value.height),1)]),_:1}),f(Z,{label:`حجم`},{default:o(()=>[p(t(a(C)(H.value.size)),1)]),_:1}),f(Z,{label:`تاریخ`,span:W.value?2:1},{default:o(()=>[p(t(a(S)(H.value.createdAt)),1)]),_:1},8,[`span`])]),_:1},8,[`column`]),f(ue,{layout:`vertical`,class:`mt-4`},{default:o(()=>[f(le,{label:`متن جایگزین (alt)`,class:`!mb-3`},{default:o(()=>[f(ce,{value:U.value,"onUpdate:value":i[3]||=e=>U.value=e,placeholder:`توضیح کوتاه برای سئو و دسترسپذیری`},null,8,[`value`])]),_:1}),b(`div`,ie,[f($,{wrap:``},{default:o(()=>[f(c,{type:`primary`,onClick:J},{default:o(()=>[...i[8]||=[p(`ذخیره`,-1)]]),_:1}),f(c,{onClick:i[4]||=e=>X(H.value.url)},{icon:o(()=>[f(e,{name:`copy`,size:16})]),default:o(()=>[i[9]||=p(`کپی آدرس`,-1)]),_:1}),a(F).isAdmin?(s(),u(Q,{key:0,title:`این تصویر حذف شود؟`,"ok-text":`حذف`,"cancel-text":`انصراف`,onConfirm:Y},{default:o(()=>[f(c,{danger:``},{icon:o(()=>[f(e,{name:`trash`,size:16})]),default:o(()=>[i[10]||=p(`حذف`,-1)]),_:1})]),_:1})):d(``,!0)]),_:1})]),b(`div`,ae,[f(c,{type:`primary`,class:`h-10 !font-bold`,onClick:J},{default:o(()=>[...i[11]||=[p(`ذخیره متن`,-1)]]),_:1}),f(c,{class:`h-10 !flex !items-center !justify-center !gap-1`,onClick:i[5]||=e=>X(H.value.url)},{icon:o(()=>[f(e,{name:`copy`,size:16})]),default:o(()=>[i[12]||=b(`span`,null,`کپی آدرس`,-1)]),_:1}),a(F).isAdmin?(s(),u(Q,{key:0,title:`این تصویر حذف شود؟`,"ok-text":`حذف`,"cancel-text":`انصراف`,onConfirm:Y},{default:o(()=>[f(c,{danger:``,class:`col-span-2 h-10 !flex !items-center !justify-center !gap-1`},{icon:o(()=>[f(e,{name:`trash`,size:16})]),default:o(()=>[i[13]||=b(`span`,null,`حذف تصویر`,-1)]),_:1})]),_:1})):d(``,!0)])]),_:1})],64)):d(``,!0)]),_:1},8,[`open`,`width`,`height`,`placement`,`body-style`])],64)}}});export{F as default}; |