|  | @@ -16,7 +16,8 @@
 | 
	
		
			
				|  |  |              [frontend.ui :as ui]
 | 
	
		
			
				|  |  |              [frontend.util :as util]
 | 
	
		
			
				|  |  |              [rum.core :as rum]
 | 
	
		
			
				|  |  | -            [frontend.modules.outliner.tree :as tree]))
 | 
	
		
			
				|  |  | +            [frontend.modules.outliner.tree :as tree]
 | 
	
		
			
				|  |  | +            [frontend.db.async :as db-async]))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  (defn- frequencies-sort
 | 
	
		
			
				|  |  |    [references]
 | 
	
	
		
			
				|  | @@ -96,23 +97,29 @@
 | 
	
		
			
				|  |  |      (filter-dialog-inner filters-atom *references page-name)))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  (rum/defc block-linked-references < rum/reactive db-mixins/query
 | 
	
		
			
				|  |  | +  {:init (fn [state]
 | 
	
		
			
				|  |  | +           (when-let [e (db/entity [:block/uuid (first (:rum/args state))])]
 | 
	
		
			
				|  |  | +             (db-async/<get-block-refs (state/get-current-repo) (:db/id e)))
 | 
	
		
			
				|  |  | +           state)}
 | 
	
		
			
				|  |  |    [block-id]
 | 
	
		
			
				|  |  | -  (let [e (db/entity [:block/uuid block-id])
 | 
	
		
			
				|  |  | -        page? (some? (:block/name e))
 | 
	
		
			
				|  |  | -        ref-blocks (if page?
 | 
	
		
			
				|  |  | -                     (-> (db/get-page-referenced-blocks (:block/name e))
 | 
	
		
			
				|  |  | -                         db-utils/group-by-page)
 | 
	
		
			
				|  |  | -                     (db/get-block-referenced-blocks block-id))
 | 
	
		
			
				|  |  | -        ref-hiccup (block/->hiccup ref-blocks
 | 
	
		
			
				|  |  | -                                   {:id (str block-id)
 | 
	
		
			
				|  |  | -                                    :ref? true
 | 
	
		
			
				|  |  | -                                    :breadcrumb-show? true
 | 
	
		
			
				|  |  | -                                    :group-by-page? true
 | 
	
		
			
				|  |  | -                                    :editor-box editor/box}
 | 
	
		
			
				|  |  | -                                   {})]
 | 
	
		
			
				|  |  | -    [:div.references-blocks
 | 
	
		
			
				|  |  | -     (content/content block-id
 | 
	
		
			
				|  |  | -                      {:hiccup ref-hiccup})]))
 | 
	
		
			
				|  |  | +  (when-let [e (db/entity [:block/uuid block-id])]
 | 
	
		
			
				|  |  | +    (when-not (state/sub-async-query-loading (str (:db/id e) "-refs"))
 | 
	
		
			
				|  |  | +      (let [page? (some? (:block/name e))
 | 
	
		
			
				|  |  | +            ref-blocks (if page?
 | 
	
		
			
				|  |  | +                         (-> (db/get-page-referenced-blocks (:block/name e))
 | 
	
		
			
				|  |  | +                             db-utils/group-by-page)
 | 
	
		
			
				|  |  | +                         (db/get-block-referenced-blocks block-id))]
 | 
	
		
			
				|  |  | +        (when (> (count ref-blocks) 0)
 | 
	
		
			
				|  |  | +          (let [ref-hiccup (block/->hiccup ref-blocks
 | 
	
		
			
				|  |  | +                                           {:id (str block-id)
 | 
	
		
			
				|  |  | +                                            :ref? true
 | 
	
		
			
				|  |  | +                                            :breadcrumb-show? true
 | 
	
		
			
				|  |  | +                                            :group-by-page? true
 | 
	
		
			
				|  |  | +                                            :editor-box editor/box}
 | 
	
		
			
				|  |  | +                                           {})]
 | 
	
		
			
				|  |  | +            [:div.references-blocks
 | 
	
		
			
				|  |  | +             (content/content block-id
 | 
	
		
			
				|  |  | +                              {:hiccup ref-hiccup})]))))))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  (rum/defc references-inner
 | 
	
		
			
				|  |  |    [page-name filters filtered-ref-blocks]
 | 
	
	
		
			
				|  | @@ -191,59 +198,65 @@
 | 
	
		
			
				|  |  |  (rum/defcs references* < rum/reactive db-mixins/query
 | 
	
		
			
				|  |  |    (rum/local nil ::ref-pages)
 | 
	
		
			
				|  |  |    {:init (fn [state]
 | 
	
		
			
				|  |  | -           (let [page-name (first (:rum/args state))
 | 
	
		
			
				|  |  | +           (let [page-name (->> (first (:rum/args state))
 | 
	
		
			
				|  |  | +                                util/page-name-sanity-lc)
 | 
	
		
			
				|  |  | +                 page (db/entity [:block/name page-name])
 | 
	
		
			
				|  |  |                   filters (when page-name (atom nil))]
 | 
	
		
			
				|  |  | +             (when page (db-async/<get-block-refs (state/get-current-repo) (:db/id page)))
 | 
	
		
			
				|  |  |               (assoc state ::filters filters)))}
 | 
	
		
			
				|  |  |    [state page-name]
 | 
	
		
			
				|  |  |    (when page-name
 | 
	
		
			
				|  |  | -    (let [page-name (util/page-name-sanity-lc page-name)
 | 
	
		
			
				|  |  | -          page-props-v (state/sub-page-properties-changed page-name)
 | 
	
		
			
				|  |  | -          *ref-pages (::ref-pages state)
 | 
	
		
			
				|  |  | -          repo (state/get-current-repo)
 | 
	
		
			
				|  |  | -          filters-atom (get state ::filters)
 | 
	
		
			
				|  |  | -          filter-state (rum/react filters-atom)
 | 
	
		
			
				|  |  | -          ref-blocks (db/get-page-referenced-blocks page-name)
 | 
	
		
			
				|  |  | -          page-id (:db/id (db/entity repo [:block/name page-name]))
 | 
	
		
			
				|  |  | -          aliases (db/page-alias-set repo page-name)
 | 
	
		
			
				|  |  | -          aliases-exclude-self (set (remove #{page-id} aliases))
 | 
	
		
			
				|  |  | -          top-level-blocks (filter (fn [b] (some aliases (set (map :db/id (:block/refs b))))) ref-blocks)
 | 
	
		
			
				|  |  | -          top-level-blocks-ids (set (map :db/id top-level-blocks))
 | 
	
		
			
				|  |  | -          filters (when (seq filter-state)
 | 
	
		
			
				|  |  | -                    (-> (group-by second filter-state)
 | 
	
		
			
				|  |  | -                        (update-vals #(map first %))))
 | 
	
		
			
				|  |  | -          filtered-ref-blocks (->> (block-handler/filter-blocks ref-blocks filters)
 | 
	
		
			
				|  |  | -                                   (block-handler/get-filtered-ref-blocks-with-parents ref-blocks))
 | 
	
		
			
				|  |  | -          total (count top-level-blocks)
 | 
	
		
			
				|  |  | -          filtered-top-blocks (filter (fn [b] (top-level-blocks-ids (:db/id b))) filtered-ref-blocks)
 | 
	
		
			
				|  |  | -          filter-n (count filtered-top-blocks)
 | 
	
		
			
				|  |  | -          parent->blocks (group-by (fn [x] (:db/id (x :block/parent))) filtered-ref-blocks)
 | 
	
		
			
				|  |  | -          result (->> (group-by :block/page filtered-top-blocks)
 | 
	
		
			
				|  |  | -                      (map (fn [[page blocks]]
 | 
	
		
			
				|  |  | -                             (let [blocks (sort-by (fn [b] (not= (:db/id page) (:db/id (:block/parent b)))) blocks)
 | 
	
		
			
				|  |  | -                                   result (map (fn [block]
 | 
	
		
			
				|  |  | -                                                 (let [filtered-children (get-filtered-children block parent->blocks)
 | 
	
		
			
				|  |  | -                                                       refs (when-not (contains? top-level-blocks-ids (:db/id (:block/parent block)))
 | 
	
		
			
				|  |  | -                                                              (block-handler/get-blocks-refed-pages aliases (cons block filtered-children)))
 | 
	
		
			
				|  |  | -                                                       block' (assoc (tree/block-entity->map block) :block/children filtered-children)]
 | 
	
		
			
				|  |  | -                                                   [block' refs])) blocks)
 | 
	
		
			
				|  |  | -                                   blocks' (map first result)
 | 
	
		
			
				|  |  | -                                   page' (if (contains? aliases-exclude-self (:db/id page))
 | 
	
		
			
				|  |  | -                                           {:db/id (:db/id page)
 | 
	
		
			
				|  |  | -                                            :block/alias? true
 | 
	
		
			
				|  |  | -                                            :block/journal-day (:block/journal-day page)}
 | 
	
		
			
				|  |  | -                                           page)]
 | 
	
		
			
				|  |  | -                               [[page' blocks'] (mapcat second result)]))))
 | 
	
		
			
				|  |  | -          filtered-ref-blocks' (map first result)
 | 
	
		
			
				|  |  | -          ref-pages (->>
 | 
	
		
			
				|  |  | -                     (mapcat second result)
 | 
	
		
			
				|  |  | -                     (map :block/original-name)
 | 
	
		
			
				|  |  | -                     frequencies)]
 | 
	
		
			
				|  |  | -      (reset! *ref-pages ref-pages)
 | 
	
		
			
				|  |  | -      (when (or (seq filter-state) (> filter-n 0))
 | 
	
		
			
				|  |  | -        [:div.references.page-linked.flex-1.flex-row
 | 
	
		
			
				|  |  | -         (sub-page-properties-changed page-name page-props-v filters-atom)
 | 
	
		
			
				|  |  | -         [:div.content.pt-6
 | 
	
		
			
				|  |  | -          (references-cp page-name filters filters-atom filter-state total filter-n filtered-ref-blocks' *ref-pages)]]))))
 | 
	
		
			
				|  |  | +    (let [repo (state/get-current-repo)
 | 
	
		
			
				|  |  | +          page-name (util/page-name-sanity-lc page-name)
 | 
	
		
			
				|  |  | +          page-entity (db/entity repo [:block/name page-name])]
 | 
	
		
			
				|  |  | +      (when page-entity
 | 
	
		
			
				|  |  | +        (when-not (state/sub-async-query-loading (str (:db/id page-entity) "-refs"))
 | 
	
		
			
				|  |  | +          (let [page-props-v (state/sub-page-properties-changed page-name)
 | 
	
		
			
				|  |  | +                *ref-pages (::ref-pages state)
 | 
	
		
			
				|  |  | +                filters-atom (get state ::filters)
 | 
	
		
			
				|  |  | +                filter-state (rum/react filters-atom)
 | 
	
		
			
				|  |  | +                ref-blocks (db/get-page-referenced-blocks page-name)
 | 
	
		
			
				|  |  | +                page-id (:db/id page-entity)
 | 
	
		
			
				|  |  | +                aliases (db/page-alias-set repo page-name)
 | 
	
		
			
				|  |  | +                aliases-exclude-self (set (remove #{page-id} aliases))
 | 
	
		
			
				|  |  | +                top-level-blocks (filter (fn [b] (some aliases (set (map :db/id (:block/refs b))))) ref-blocks)
 | 
	
		
			
				|  |  | +                top-level-blocks-ids (set (map :db/id top-level-blocks))
 | 
	
		
			
				|  |  | +                filters (when (seq filter-state)
 | 
	
		
			
				|  |  | +                          (-> (group-by second filter-state)
 | 
	
		
			
				|  |  | +                              (update-vals #(map first %))))
 | 
	
		
			
				|  |  | +                filtered-ref-blocks (->> (block-handler/filter-blocks ref-blocks filters)
 | 
	
		
			
				|  |  | +                                         (block-handler/get-filtered-ref-blocks-with-parents ref-blocks))
 | 
	
		
			
				|  |  | +                total (count top-level-blocks)
 | 
	
		
			
				|  |  | +                filtered-top-blocks (filter (fn [b] (top-level-blocks-ids (:db/id b))) filtered-ref-blocks)
 | 
	
		
			
				|  |  | +                filter-n (count filtered-top-blocks)
 | 
	
		
			
				|  |  | +                parent->blocks (group-by (fn [x] (:db/id (x :block/parent))) filtered-ref-blocks)
 | 
	
		
			
				|  |  | +                result (->> (group-by :block/page filtered-top-blocks)
 | 
	
		
			
				|  |  | +                            (map (fn [[page blocks]]
 | 
	
		
			
				|  |  | +                                   (let [blocks (sort-by (fn [b] (not= (:db/id page) (:db/id (:block/parent b)))) blocks)
 | 
	
		
			
				|  |  | +                                         result (map (fn [block]
 | 
	
		
			
				|  |  | +                                                       (let [filtered-children (get-filtered-children block parent->blocks)
 | 
	
		
			
				|  |  | +                                                             refs (when-not (contains? top-level-blocks-ids (:db/id (:block/parent block)))
 | 
	
		
			
				|  |  | +                                                                    (block-handler/get-blocks-refed-pages aliases (cons block filtered-children)))
 | 
	
		
			
				|  |  | +                                                             block' (assoc (tree/block-entity->map block) :block/children filtered-children)]
 | 
	
		
			
				|  |  | +                                                         [block' refs])) blocks)
 | 
	
		
			
				|  |  | +                                         blocks' (map first result)
 | 
	
		
			
				|  |  | +                                         page' (if (contains? aliases-exclude-self (:db/id page))
 | 
	
		
			
				|  |  | +                                                 {:db/id (:db/id page)
 | 
	
		
			
				|  |  | +                                                  :block/alias? true
 | 
	
		
			
				|  |  | +                                                  :block/journal-day (:block/journal-day page)}
 | 
	
		
			
				|  |  | +                                                 page)]
 | 
	
		
			
				|  |  | +                                     [[page' blocks'] (mapcat second result)]))))
 | 
	
		
			
				|  |  | +                filtered-ref-blocks' (map first result)
 | 
	
		
			
				|  |  | +                ref-pages (->>
 | 
	
		
			
				|  |  | +                           (mapcat second result)
 | 
	
		
			
				|  |  | +                           (map :block/original-name)
 | 
	
		
			
				|  |  | +                           frequencies)]
 | 
	
		
			
				|  |  | +            (reset! *ref-pages ref-pages)
 | 
	
		
			
				|  |  | +            (when (or (seq filter-state) (> filter-n 0))
 | 
	
		
			
				|  |  | +              [:div.references.page-linked.flex-1.flex-row
 | 
	
		
			
				|  |  | +               (sub-page-properties-changed page-name page-props-v filters-atom)
 | 
	
		
			
				|  |  | +               [:div.content.pt-6
 | 
	
		
			
				|  |  | +                (references-cp page-name filters filters-atom filter-state total filter-n filtered-ref-blocks' *ref-pages)]])))))))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  (rum/defc references
 | 
	
		
			
				|  |  |    [page-name]
 |