diff --git a/internal/components/gallery/image.go b/internal/components/gallery/image.go index bd1b9ac..82fbb6b 100644 --- a/internal/components/gallery/image.go +++ b/internal/components/gallery/image.go @@ -129,7 +129,7 @@ func (s *Service) GetImages(ctx context.Context) (images []Image, err error) { func (s *Service) GetPrevAndNext(ctx context.Context, uid string) (previous *Image, next *Image, err error) { imgs, err := s.GetImages(ctx) if err != nil { - return + return nil, nil, err } for i := range imgs { @@ -137,20 +137,20 @@ func (s *Service) GetPrevAndNext(ctx context.Context, uid string) (previous *Ima continue } - if i-1 >= 0 { - previous = &imgs[i-1] + if i > 0 { + prevImg := imgs[i-1] + previous = &prevImg } - if i+1 >= len(imgs) { - next = &imgs[i+1] + if i+1 < len(imgs) { + nextImg := imgs[i+1] + next = &nextImg } - return + return previous, next, nil } - err = &rest.Error{ + return nil, nil, &rest.Error{ Type: rest.ErrorTypeNotFound, Message: "could not find image with uid", } - - return } diff --git a/internal/server/factory.go b/internal/server/factory.go index d48f463..93ad214 100644 --- a/internal/server/factory.go +++ b/internal/server/factory.go @@ -77,7 +77,9 @@ func (s *Server) dynamicRoutes() (h http.Handler, err error) { func() http.Handler { mux := http.NewServeMux() - mux.Handle("/"+s.cfg.Gallery.Path, restgallery.New(renderer, gallery.New(fs, s.cfg.Gallery, imageSrv, valkeyClient), s.cfg.Gallery)) + galleryMux := restgallery.New(renderer, gallery.New(fs, s.cfg.Gallery, imageSrv, valkeyClient), s.cfg.Gallery) + mux.Handle("/"+s.cfg.Gallery.Path, galleryMux) + mux.Handle("/"+s.cfg.Gallery.Path+"/", galleryMux) mux.Handle("/", resthome.New(renderer, page.New(fs))) return mux diff --git a/web/components/modal.templ b/web/components/modal.templ index 5f5ffed..05c2010 100644 --- a/web/components/modal.templ +++ b/web/components/modal.templ @@ -1,7 +1,27 @@ package components +// Modal renders a modal dialog. +// +// The itself must never be an htmx swap target: swapping its +// innerHTML would replace the wrapper below (centering + close button) and +// break the layout. Content is swapped into the inner element with id +// "-content" instead. templ Modal(id string) { - - { children... } + +
+ +
+ { children... } +
+
} diff --git a/web/pages/gallery.templ b/web/pages/gallery.templ index eeb940c..c3d693c 100644 --- a/web/pages/gallery.templ +++ b/web/pages/gallery.templ @@ -9,21 +9,37 @@ import ( const detailsID = "imgs-details" +// detailsContentID is the inner element of the modal that htmx swaps into. +// It is defined by components.Modal and must not be the dialog itself. +const detailsContentID = detailsID + "-content" + templ GallerySet(g gallery.Set) {
@components.Modal(detailsID) { - @GalleryImage(g.SM.Images[0].UID, &gallery.Image{}, &gallery.Image{}) + // Placeholder: only visible until the first image is swapped in. + // prev/next are nil because relative links would be resolved + // against the gallery index, not the image page. + if len(g.SM.Images) > 0 { + @GalleryImage(g.SM.Images[0].UID, nil, nil) + } }
for _,img := range g.SM.Images { - Gallery item + }