PIMS/public/build/assets/Index-CYUFIW2Y.js

2 lines
6.8 KiB
JavaScript

import{d as Y,r,c as A,e as B,p as E,a as l,f as T,u as z,h as D,w as I,b as s,i as _,q as x,v as w,s as O,o,t as p,F as P,g as X,l as C,T as Z}from"./app-CClrM5Yi.js";import{_ as G}from"./AppLayout.vue_vue_type_script_setup_true_lang-DESMBqxz.js";import{_ as H}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./AppLogoIcon.vue_vue_type_script_setup_true_lang-7XZAfK5W.js";import"./useForwardExpose-BhawR5VU.js";import"./VisuallyHidden-Cu70tzB6.js";import"./RovingFocusGroup-CNFroA6Y.js";import"./useArrowNavigation-C6Y-ieo6.js";import"./index-C4J_hXM0.js";import"./createLucideIcon-ZFd4jktC.js";const W={class:"flex h-full flex-1 flex-col gap-4 overflow-x-auto rounded-xl p-4"},J={class:"grid grid-cols-1 gap-2 md:grid-cols-12"},K={class:"md:col-span-4"},Q={class:"md:col-span-3"},ee={class:"md:col-span-2"},ae={class:"md:col-span-3"},te={class:"flex gap-2"},se={class:"md:col-span-2"},re={key:0,class:"rounded-md border border-red-300 bg-red-50 p-3 text-red-800 dark:border-red-800 dark:bg-red-950 dark:text-red-200"},le=["aria-busy"],oe=["href"],ne={class:"h-20 w-14 shrink-0 overflow-hidden rounded bg-muted"},ie=["src","alt"],ue={class:"flex min-w-0 flex-1 flex-col"},de={class:"flex items-center justify-between gap-2"},ce={class:"truncate font-medium"},ve={class:"text-xs text-muted-foreground"},me={class:"mt-1 text-xs text-muted-foreground"},pe={key:0,class:"mr-2 rounded border px-1 py-0.5"},fe={key:1},ge={class:"mt-2 text-sm text-foreground/90"},he={key:0,class:"fixed bottom-4 left-1/2 z-50 -translate-x-1/2 rounded bg-foreground px-3 py-2 text-sm text-background shadow-lg"},_e=Y({__name:"Index",setup(xe){const n=r(""),i=r("title_asc"),u=r(""),d=r(""),c=r(""),v=r(""),y=r(1),f=r([]),j=r(0),U=r(1),m=r(!1),k=r(null),L=r(!1),N=r("");let V=null;const q=A(()=>y.value<U.value&&!m.value);function R(t,e=50){if(!t)return"";const a=t.split(/\s+/);return a.length<=e?t:a.slice(0,e).join(" ")+"…"}async function S(t=!1){if(!m.value){m.value=!0,k.value=null;try{const e=new URLSearchParams;n.value&&e.set("q",n.value),i.value&&e.set("sort",i.value),u.value&&e.set("genre",u.value),d.value&&e.set("rating",d.value),c.value!==""&&e.set("year_min",String(c.value)),v.value!==""&&e.set("year_max",String(v.value)),e.set("page",String(y.value));const a=await fetch(`/api/movies?${e.toString()}`,{headers:{Accept:"application/json","X-Requested-With":"XMLHttpRequest"},credentials:"same-origin"});if(!a.ok)throw new Error(`Fetch failed: ${a.status}`);const h=await a.json();j.value=h.total,U.value=h.last_page,t?f.value=h.data:f.value=f.value.concat(h.data)}catch(e){k.value=e?.message??"Unexpected error"}finally{m.value=!1}}}function F(){clearTimeout(V),V=setTimeout(()=>{y.value=1,S(!0)},300)}function b(){const t=new URL(window.location.href);n.value?t.searchParams.set("q",n.value):t.searchParams.delete("q"),i.value?t.searchParams.set("sort",i.value):t.searchParams.delete("sort"),u.value?t.searchParams.set("genre",u.value):t.searchParams.delete("genre"),d.value?t.searchParams.set("rating",d.value):t.searchParams.delete("rating"),c.value!==""?t.searchParams.set("year_min",String(c.value)):t.searchParams.delete("year_min"),v.value!==""?t.searchParams.set("year_max",String(v.value)):t.searchParams.delete("year_max"),window.history.replaceState({},"",t.toString()),y.value=1,S(!0)}async function $(){q.value&&(y.value+=1,await S(!1))}const M=r(null);let g=null;return B(()=>{const t=new URL(window.location.href);n.value=t.searchParams.get("q")??"",i.value=t.searchParams.get("sort")??"title_asc",u.value=t.searchParams.get("genre")??"",d.value=t.searchParams.get("rating")??"",c.value=t.searchParams.get("year_min")??"",v.value=t.searchParams.get("year_max")??"",S(!0),g=new IntersectionObserver(e=>{for(const a of e)a.isIntersecting&&$()},{root:null,rootMargin:"200px",threshold:0}),M.value&&g.observe(M.value)}),E(M,(t,e)=>{e&&g&&g.unobserve(e),t&&g&&g.observe(t)}),(t,e)=>(o(),l(P,null,[T(z(D),{title:"Movies"}),T(G,{breadcrumbs:[{title:"Movies",href:"/movies"}]},{default:I(()=>[s("div",W,[s("div",J,[s("div",K,[x(s("input",{class:"w-full rounded-md border border-gray-300 bg-background px-3 py-2 text-sm outline-none focus:ring-2 focus:ring-primary",type:"text",placeholder:"Search movies…","aria-label":"Search movies","onUpdate:modelValue":e[0]||(e[0]=a=>n.value=a),onInput:F},null,544),[[w,n.value]])]),s("div",Q,[x(s("select",{"onUpdate:modelValue":e[1]||(e[1]=a=>i.value=a),onChange:b,class:"w-full rounded-md border px-3 py-2 text-sm","aria-label":"Sort movies"},[...e[6]||(e[6]=[s("option",{value:"title_asc"},"Title A → Z",-1),s("option",{value:"title_desc"},"Title Z → A",-1),s("option",{value:"newest"},"Newest",-1),s("option",{value:"oldest"},"Oldest",-1),s("option",{value:"year_asc"},"Year ↑",-1),s("option",{value:"year_desc"},"Year ↓",-1)])],544),[[O,i.value]])]),s("div",ee,[x(s("input",{"onUpdate:modelValue":e[2]||(e[2]=a=>u.value=a),onChange:b,class:"w-full rounded-md border px-3 py-2 text-sm",type:"text",placeholder:"Genre","aria-label":"Filter by genre"},null,544),[[w,u.value]])]),s("div",ae,[s("div",te,[x(s("input",{"onUpdate:modelValue":e[3]||(e[3]=a=>c.value=a),onChange:b,class:"w-full rounded-md border px-3 py-2 text-sm",type:"number",placeholder:"Year min","aria-label":"Minimum year"},null,544),[[w,c.value]]),x(s("input",{"onUpdate:modelValue":e[4]||(e[4]=a=>v.value=a),onChange:b,class:"w-full rounded-md border px-3 py-2 text-sm",type:"number",placeholder:"Year max","aria-label":"Maximum year"},null,544),[[w,v.value]])])]),s("div",se,[x(s("input",{"onUpdate:modelValue":e[5]||(e[5]=a=>d.value=a),onChange:b,class:"w-full rounded-md border px-3 py-2 text-sm",type:"text",placeholder:"Rating","aria-label":"Filter by rating"},null,544),[[w,d.value]])])]),k.value?(o(),l("div",re,p(k.value),1)):_("",!0),s("ul",{class:"divide-y divide-muted-foreground/20","aria-busy":m.value?"true":"false"},[(o(!0),l(P,null,X(f.value,a=>(o(),l("li",{key:a.id,class:"py-1"},[s("a",{href:`/movies/${a.id}`,class:"flex gap-3 rounded px-2 py-2 hover:bg-muted/40 focus:bg-muted/40 focus:outline-none"},[s("div",ne,[a.poster_url?(o(),l("img",{key:0,src:a.poster_url,alt:`Poster for ${a.title}`,loading:"lazy",class:"h-full w-full object-cover"},null,8,ie)):_("",!0)]),s("div",ue,[s("div",de,[s("div",ce,p(a.title),1),s("div",ve,p(a.year??""),1)]),s("div",me,[a.rating?(o(),l("span",pe,p(a.rating),1)):_("",!0),a.genres?.length?(o(),l("span",fe,p(a.genres.map(h=>h.name).join(", ")),1)):_("",!0)]),s("div",ge,p(R(a.description)),1)])],8,oe)]))),128))],8,le),s("div",{ref_key:"sentinel",ref:M,class:"py-6 text-center text-sm text-muted-foreground"},[m.value?(o(),l(P,{key:0},[C("Loading…")],64)):!q.value&&f.value.length>0?(o(),l(P,{key:1},[C("End of results")],64)):!f.value.length&&!m.value?(o(),l(P,{key:2},[C("No results")],64)):_("",!0)],512),T(Z,{name:"fade"},{default:I(()=>[L.value?(o(),l("div",he,p(N.value),1)):_("",!0)]),_:1})])]),_:1})],64))}}),Ve=H(_e,[["__scopeId","data-v-b2cf9ca5"]]);export{Ve as default};