;; Relations container-nav fragment handler ;; returns: sx ;; ;; Generic navigation fragment driven by the relation registry. ;; Renders nav items for all related entities of a container. (defhandler container-nav (&key container_type container_id post_slug nav_class exclude) (let ((ct (or container_type "page")) (cid (parse-int (or container_id "0"))) (slug (or post_slug "")) (ncls (or nav_class "")) (excl-raw (or exclude "")) (excl-set (filter (fn (e) (not (empty? e))) (map trim (split excl-raw ",")))) ;; URL builders per child type (url-builders (dict :calendar "events" :market "market")) ;; Filter relation defs: visible + not excluded (nav-defs (filter (fn (d) (and (!= (get d "nav") "hidden") (not (contains? excl-set (get d "name"))))) (relations-from ct)))) (when (not (empty? nav-defs)) (let ((parts (map (fn (defn) (let ((children (get-children :parent-type ct :parent-id cid :child-type (get defn "to_type") :relation-type (get defn "name")))) (<> (map (fn (child) (let ((child-slug (or (get (or (get child "metadata_") (dict)) "slug") ""))) (when (not (empty? child-slug)) (let ((path (if (not (empty? slug)) (str "/" slug "/" child-slug "/") (str "/" child-slug "/"))) (svc-name (get url-builders (get defn "to_type"))) (href (if svc-name (app-url svc-name path) path))) (~relation-nav :href href :name (or (get child "label") "") :icon (or (get defn "nav_icon") "") :nav-class ncls :relation-type (get defn "name")))))) children)))) nav-defs))) (<> parts)))))