hierarchy.cljs 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. (ns frontend.components.hierarchy
  2. (:require [clojure.string :as string]
  3. [frontend.components.block :as block]
  4. [frontend.db :as db]
  5. [frontend.db.model :as db-model]
  6. [frontend.state :as state]
  7. [logseq.graph-parser.text :as text]
  8. [frontend.ui :as ui]
  9. [medley.core :as medley]
  10. [rum.core :as rum]
  11. [frontend.util :as util]))
  12. (defn- get-relation
  13. "Get all parent pages along the namespace hierarchy path.
  14. If there're aliases, only use the first namespaced alias."
  15. [page]
  16. (when-let [page (or (text/get-nested-page-name page) page)]
  17. (let [repo (state/get-current-repo)
  18. aliases (db/get-page-alias-names repo page)
  19. all-page-names (conj aliases page)]
  20. (when-let [page (or (first (filter text/namespace-page? all-page-names))
  21. (when (:block/_namespace (db/entity [:block/name (util/page-name-sanity-lc page)]))
  22. page))]
  23. (let [namespace-pages (db/get-namespace-pages repo page)
  24. parent-routes (db-model/get-page-namespace-routes repo page)
  25. pages (->> (concat namespace-pages parent-routes)
  26. (distinct)
  27. (sort-by :block/name)
  28. (map (fn [page]
  29. (or (:block/original-name page) (:block/name page))))
  30. (map #(string/split % "/")))
  31. page-namespace (db-model/get-page-namespace repo page)
  32. page-namespace (util/get-page-original-name page-namespace)]
  33. (cond
  34. (seq pages)
  35. pages
  36. page-namespace
  37. [(string/split page-namespace "/")]
  38. :else
  39. nil))))))
  40. (rum/defc structures
  41. [page]
  42. (let [namespaces (get-relation page)]
  43. (when (seq namespaces)
  44. [:div.page-hierarchy.mt-6
  45. (ui/foldable
  46. [:h2.font-bold.opacity-30 "Hierarchy"]
  47. [:ul.namespaces {:style {:margin "12px 24px"}}
  48. (for [namespace namespaces]
  49. [:li.my-2
  50. (->>
  51. (for [[idx page] (medley/indexed namespace)]
  52. (when (and (string? page) page)
  53. (let [full-page (->> (take (inc idx) namespace)
  54. (string/join "/"))]
  55. (block/page-reference false
  56. full-page
  57. {}
  58. page))))
  59. (interpose [:span.mx-2.opacity-30 "/"]))])]
  60. {:default-collapsed? false
  61. :title-trigger? true})])))