library.cljs 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. (ns frontend.components.library
  2. "Library page"
  3. (:require [clojure.string :as string]
  4. [frontend.components.select :as components-select]
  5. [frontend.db :as db]
  6. [frontend.handler.editor :as editor-handler]
  7. [frontend.search :as search]
  8. [frontend.state :as state]
  9. [frontend.ui :as ui]
  10. [logseq.shui.hooks :as hooks]
  11. [logseq.shui.ui :as shui]
  12. [promesa.core :as p]
  13. [rum.core :as rum]))
  14. (rum/defc select-pages
  15. [library-page]
  16. (let [[result set-result!] (hooks/use-state nil)
  17. [input set-input!] (hooks/use-state "")
  18. [selected-choices set-selected-choices!] (hooks/use-state #{})
  19. items (map (fn [block]
  20. {:value (:db/id block)
  21. :label (:block/title block)})
  22. result)]
  23. (hooks/use-effect!
  24. (fn []
  25. (if (string/blank? input)
  26. (set-result! nil)
  27. (p/let [result (search/block-search (state/get-current-repo) input {:enable-snippet? false
  28. :built-in? false
  29. :page-only? true
  30. :library-page-search? true})]
  31. (set-result! result))))
  32. [(hooks/use-debounced-value input 200)])
  33. (components-select/select
  34. {:items items
  35. :extract-fn :label
  36. :extract-chosen-fn :value
  37. :selected-choices selected-choices
  38. :on-chosen (fn [chosen selected?]
  39. (if selected?
  40. (let [chosen-block (db/entity chosen)]
  41. (editor-handler/move-blocks! [chosen-block] library-page {:bottom? true})
  42. (set-selected-choices! (conj selected-choices chosen)))
  43. (do
  44. (db/transact! (state/get-current-repo)
  45. [[:db/retract chosen :block/parent]]
  46. {:outliner-op :save-block})
  47. (set-selected-choices! (disj selected-choices chosen)))))
  48. :multiple-choices? true
  49. :input-default-placeholder "Add pages"
  50. :show-new-when-not-exact-match? false
  51. :on-input set-input!
  52. :input-opts {:class "!p-1 !text-sm"}
  53. :clear-input-on-chosen? false})))
  54. (rum/defc add-pages
  55. [library-page]
  56. [:div.ls-add-pages.px-1.mt-4
  57. (shui/button
  58. {:variant :secondary
  59. :size :sm
  60. :class "text-muted-foreground hover:text-foreground"
  61. :on-click (fn [e]
  62. (shui/popup-show!
  63. (.-target e)
  64. (fn []
  65. [:div {:style {:min-height 120}}
  66. (select-pages library-page)])
  67. {:align :start}))}
  68. (ui/icon "plus" {:size 16})
  69. "Add existing pages to Library")])