objects.cljs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. (ns frontend.components.objects
  2. "Tagged objects"
  3. (:require [frontend.components.views :as views]
  4. [frontend.db :as db]
  5. [logseq.db :as ldb]
  6. [frontend.db-mixins :as db-mixins]
  7. [frontend.db.async :as db-async]
  8. [frontend.db.model :as db-model]
  9. [frontend.handler.editor :as editor-handler]
  10. [frontend.mixins :as mixins]
  11. [frontend.state :as state]
  12. [logseq.outliner.property :as outliner-property]
  13. [promesa.core :as p]
  14. [rum.core :as rum]
  15. [frontend.modules.outliner.ui :as ui-outliner-tx]
  16. [frontend.modules.outliner.op :as outliner-op]))
  17. (defn- get-all-objects
  18. [class]
  19. (->> (db-model/get-class-objects (state/get-current-repo) (:db/id class))
  20. (map (fn [row] (assoc row :id (:db/id row))))))
  21. (defn- add-new-object!
  22. [class set-data!]
  23. (p/let [block (editor-handler/api-insert-new-block! ""
  24. {:page (:block/uuid class)
  25. :properties {:block/tags (:db/id class)}
  26. :edit-block? false})
  27. _ (set-data! (get-all-objects class))]
  28. (editor-handler/edit-block! (db/entity [:block/uuid (:block/uuid block)]) 0 :unknown-container)))
  29. (defn- get-views
  30. [class]
  31. (let [class (db/entity (:db/id class))]
  32. (-> (filter (fn [b]
  33. (= (:db/ident class) (:logseq.property/view-for b)))
  34. (:block/_parent class))
  35. (ldb/sort-by-order))))
  36. (rum/defc objects-inner < rum/static
  37. [config class objects properties]
  38. (let [[loading? set-loading?] (rum/use-state nil)
  39. [view-entity set-view-entity!] (rum/use-state nil)
  40. [data set-data!] (rum/use-state objects)
  41. columns (views/build-columns config properties)]
  42. (rum/use-effect!
  43. (fn []
  44. (set-data! objects))
  45. [objects])
  46. (rum/use-effect!
  47. (fn []
  48. (set-loading? true)
  49. (p/let [_result (db-async/<get-views (state/get-current-repo) (:db/id class))
  50. views (get-views class)]
  51. (when-let [view (first views)]
  52. (set-view-entity! view))
  53. (p/let [_result (db-async/<get-tag-objects (state/get-current-repo) (:db/id class))]
  54. (set-data! (get-all-objects class))
  55. (set-loading? false))))
  56. [])
  57. (when (false? loading?)
  58. (views/view view-entity {:data data
  59. :set-data! set-data!
  60. :columns columns
  61. :add-new-object! #(add-new-object! class set-data!)
  62. :create-view! (fn []
  63. (p/let [result (editor-handler/api-insert-new-block! "" {:page (:block/uuid class)
  64. :properties {:logseq.property/view-for (:db/ident class)}})]
  65. (let [view (db/entity [:block/uuid (:block/uuid result)])]
  66. (set-view-entity! view)
  67. view)))
  68. :show-add-property? true
  69. :add-property! (fn []
  70. (state/pub-event! [:editor/new-property {:block class
  71. :page-configure? true
  72. :class-schema? true}]))
  73. :on-delete-rows (fn [table selected-rows]
  74. (let [pages (filter ldb/page? selected-rows)
  75. blocks (remove ldb/page? selected-rows)]
  76. (p/do!
  77. (ui-outliner-tx/transact!
  78. {:outliner-op :delete-blocks}
  79. (when (seq blocks)
  80. (outliner-op/delete-blocks! blocks nil))
  81. (let [page-ids (map :db/id pages)
  82. tx-data (map (fn [pid] [:db/retract pid :block/tags (:db/id class)]) page-ids)]
  83. (when (seq tx-data)
  84. (outliner-op/transact! tx-data {:outliner-op :save-block}))))
  85. (set-data! (get-all-objects class))
  86. (when-let [f (get-in table [:data-fns :set-row-selection!])]
  87. (f {})))))}))))
  88. (rum/defcs objects < rum/reactive db-mixins/query mixins/container-id
  89. [state class]
  90. (when class
  91. (let [class (db/sub-block (:db/id class))
  92. config {:container-id (:container-id state)}
  93. properties (cond->> (outliner-property/get-class-properties class)
  94. (= :logseq.class/Root (:db/ident class))
  95. (concat [(db/entity :block/tags)]))
  96. repo (state/get-current-repo)
  97. objects (->> (db-model/sub-class-objects repo (:db/id class))
  98. (map (fn [row] (assoc row :id (:db/id row)))))]
  99. [:div.ml-2
  100. (objects-inner config class objects properties)])))