reference.cljs 4.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. (ns frontend.components.reference
  2. (:require [frontend.common.missionary :as c.m]
  3. [frontend.components.reference-filters :as filters]
  4. [frontend.components.views :as views]
  5. [frontend.config :as config]
  6. [frontend.db :as db]
  7. [frontend.db-mixins :as db-mixins]
  8. [frontend.state :as state]
  9. [frontend.ui :as ui]
  10. [logseq.db.common.reference :as db-reference]
  11. [logseq.shui.hooks :as hooks]
  12. [logseq.shui.ui :as shui]
  13. [missionary.core :as m]
  14. [rum.core :as rum]))
  15. (rum/defc references-aux
  16. [page-entity config]
  17. (let [filters (db-reference/get-filters (db/get-db) page-entity)
  18. reference-filter (fn [{:keys [ref-pages-count]}]
  19. (shui/button
  20. {:title "Page filter"
  21. :variant "ghost"
  22. :class "text-muted-foreground !px-1"
  23. :size :sm
  24. :on-click (fn [e]
  25. (shui/popup-show! (.-target e)
  26. (fn []
  27. [:div.p-4
  28. (filters/filter-dialog page-entity ref-pages-count)])
  29. {:align "end"}))}
  30. (ui/icon "filter-cog"
  31. {:class (cond
  32. (and (empty? (:included filters)) (empty? (:excluded filters)))
  33. ""
  34. (and (seq (:included filters)) (empty? (:excluded filters)))
  35. "text-success"
  36. (and (empty? (:included filters)) (seq (:excluded filters)))
  37. "text-error"
  38. :else
  39. "text-warning")})))]
  40. (views/view
  41. {:view-parent page-entity
  42. :view-feature-type :linked-references
  43. :show-items-count? true
  44. :additional-actions [reference-filter]
  45. :columns (views/build-columns config [] {})
  46. :config config})))
  47. (rum/defc references-cp < rum/reactive db-mixins/query
  48. [entity config]
  49. (let [block (db/sub-block (:db/id entity))]
  50. (references-aux block config)))
  51. (rum/defc references-inner
  52. [entity config]
  53. (when-let [id (:db/id entity)]
  54. (let [[has-references? set-has-references!] (hooks/use-state nil)]
  55. (hooks/use-effect!
  56. #(c.m/run-task*
  57. (m/sp
  58. (let [result (c.m/<? (state/<invoke-db-worker :thread-api/block-refs-check
  59. (state/get-current-repo) id {}))]
  60. (set-has-references! result))))
  61. [])
  62. (when has-references?
  63. (ui/catch-error
  64. (ui/component-error (if (config/db-based-graph? (state/get-current-repo))
  65. "Linked References: Unexpected error."
  66. "Linked References: Unexpected error. Please re-index your graph first."))
  67. (references-cp entity config))))))
  68. (rum/defc references
  69. [entity config]
  70. (ui/lazy-visible
  71. (fn []
  72. (references-inner entity config))
  73. {}))
  74. (rum/defc unlinked-references
  75. [entity config]
  76. (when-let [id (:db/id entity)]
  77. (let [[has-references? set-has-references!] (hooks/use-state nil)]
  78. (hooks/use-effect!
  79. #(c.m/run-task*
  80. (m/sp
  81. (let [result (c.m/<? (state/<invoke-db-worker :thread-api/block-refs-check
  82. (state/get-current-repo) id {:unlinked? true}))]
  83. (set-has-references! result))))
  84. [])
  85. (when has-references?
  86. (views/view
  87. {:view-parent entity
  88. :view-feature-type :unlinked-references
  89. :columns (views/build-columns config [] {})
  90. :foldable-options {:default-collapsed? true}
  91. :config config})))))