Browse Source

enhance: remove custom linked and unlinked refs implementations

Every view should use the same for loading data, filter and group by.
Tienson Qin 8 months ago
parent
commit
3676bce783

+ 1 - 1
deps/db/src/logseq/db/frontend/schema.cljs

@@ -37,7 +37,7 @@
          (map (juxt :major :minor)
               [(parse-schema-version x) (parse-schema-version y)])))
 
-(def version (parse-schema-version "64.3"))
+(def version (parse-schema-version "64.4"))
 
 (defn major-version
   "Return a number.

+ 45 - 20
deps/db/src/logseq/db/frontend/view.cljs

@@ -291,23 +291,48 @@
                      (let [view-for (:logseq.property/view-for view)]
                        (:db/ident view-for))
                      nil)
-        filters (:logseq.property.table/filters view)
-        data (if-let [cache (get-in @*view-cache [repo view-id])]
-               cache
-               (let [entities (get-entities db view feat-type index-attr)
-                     sorting (let [sorting* (:logseq.property.table/sorting view)]
-                               (if (or (= sorting* :logseq.property/empty-placeholder) (empty? sorting*))
-                                 [{:id :block/updated-at, :asc? false}]
-                                 sorting*))
-
-                     result (->>
-                                  ;; filter
-                             (cond->> entities
-                               (seq filters)
-                               (filter (fn [row] (row-matched? db row filters))))
-                                   ;; sort
-                             (sort-rows db sorting))]
-                 (swap! *view-cache assoc-in [repo view-id] result)
-                 result))]
-    {:count (count data)
-     :data (mapv :db/id data)}))
+        group-by-property (:logseq.property.view/group-by-property view)
+        group-by-property-ident (:db/ident group-by-property)
+        group-by-closed-values? (some? (:property/closed-values group-by-property))
+        ref-property? (= (:db/valueType group-by-property) :db.type/ref)
+        filters (:logseq.property.table/filters view)]
+    (or (get-in @*view-cache [repo view-id])
+        (let [entities (get-entities db view feat-type index-attr)
+              sorting (let [sorting* (:logseq.property.table/sorting view)]
+                        (if (or (= sorting* :logseq.property/empty-placeholder) (empty? sorting*))
+                          [{:id :block/updated-at, :asc? false}]
+                          sorting*))
+              filtered-entities (if (seq filters)
+                                  (filter (fn [row] (row-matched? db row filters)) entities)
+                                  entities)
+              group-by-page? (= group-by-property-ident :block/page)
+              result (if group-by-property
+                       (->> filtered-entities
+                            (group-by group-by-property-ident)
+                            (seq)
+                            (sort-by (fn [[by-value _]]
+                                       (cond
+                                         group-by-page?
+                                         (:block/updated-at by-value)
+                                         group-by-closed-values?
+                                         (:block/order by-value)
+                                         ref-property?
+                                         (db-property/property-value-content by-value)
+                                         :else
+                                         by-value))
+                                     (if group-by-page? #(compare %2 %1) compare)))
+                       (sort-rows db sorting filtered-entities))
+              data {:count (count filtered-entities)
+                    :data (if group-by-property
+                            (map
+                             (fn [[by-value entities]]
+                               [(if (de/entity? by-value)
+                                  (select-keys by-value [:db/id :block/title :logseq.property/value :logseq.property/icon])
+                                  by-value)
+                                (->> entities
+                                     ldb/sort-by-order
+                                     (map :db/id))])
+                             result)
+                            (mapv :db/id result))}]
+          (swap! *view-cache assoc-in [repo view-id] data)
+          data))))

+ 25 - 45
src/main/frontend/components/views.cljs

@@ -1144,23 +1144,7 @@
   [{:keys [config view-feature-type]} view-entity result]
   (for [id result]
     [:div
-     (block-container {} {:db/id id} {})])
-  ;; (when-let [->hiccup (state/get-component :block/->hiccup)]
-  ;;   (let [group-by-page? (not (every? db/page? result))
-  ;;         result (if group-by-page?
-  ;;                  (-> (group-by :block/page result)
-  ;;                      (update-vals ldb/sort-by-order))
-  ;;                  result)
-  ;;         config' (cond-> (assoc config
-  ;;                                :current-block (:db/id view-entity)
-  ;;                                :query (:block/title view-entity)
-  ;;                                :breadcrumb-show? (if group-by-page? true false)
-  ;;                                :group-by-page? group-by-page?
-  ;;                                :ref? true)
-  ;;                   (= view-feature-type :query-result)
-  ;;                   (assoc :query (:block/title view-entity)))]
-  ;;     (->hiccup result config')))
-  )
+     (block-container {} {:db/id id} {})]))
 
 (rum/defc gallery-card-item
   [table view-entity block config]
@@ -1316,7 +1300,8 @@
                         {:logseq.property/view-for (:db/id view-parent)
                          :logseq.property.view/feature-type view-feature-type}
                          (contains? #{:linked-references :unlinked-references} view-feature-type)
-                         (assoc :logseq.property.view/type (:db/id (db/entity :logseq.property.view/type.list))))
+                         (assoc :logseq.property.view/type (:db/id (db/entity :logseq.property.view/type.list))
+                                :logseq.property.view/group-by-property (:db/id (db/entity :block/page))))
             view-exists? (seq (get-views view-parent view-feature-type))
             view-title (if view-exists?
                          ""
@@ -1538,33 +1523,28 @@
                         :row-selection row-selection
                         :add-new-object! add-new-object!}]
          (if group-by-property
-           (let [readable-property-value #(if (de/entity? %) (db-property/property-value-content %) (str %))
-                 ;; similar to readable-property but return entity if :db/ident to allow for icons
-                 readable-property-value-or-ent #(if (de/entity? %)
-                                                   (if (:db/ident %) % (db-property/property-value-content %))
-                                                   (str %))
-                 groups (->> (group-by #(-> (:db/ident group-by-property) % readable-property-value-or-ent)
-                                       (:rows table))
-                             (sort-by #(db-property/property-value-content (first %))))]
-             [:div.flex.flex-col.gap-4.border-t.py-4
-              (for [[value group] groups]
-                (let [add-new-object! (fn [_]
-                                        (add-new-object! {:properties {(:db/ident group-by-property) (or (and (map? value) (:db/id value)) value)}}))
-                      table' (shui/table-option (-> table-map
-                                                    (assoc-in [:data-fns :add-new-object!] add-new-object!)
-                                                    (assoc :data group
-                                                           :all-data (:data table))))]
-                  (ui/foldable
-                   [:div.text-sm.font-medium.ml-2
-                    (if (some? value)
-                      (let [icon (pu/get-block-property-value value :logseq.property/icon)]
-                        [:div.flex.flex-row.gap-1.items-center
-                         (when icon (icon-component/icon icon {:color? true}))
-                         (readable-property-value value)])
-                      (str "No " (:block/title group-by-property)))]
-                   [:div.mt-2
-                    (view-cp view-entity (assoc table' :rows group) option view-opts)]
-                   {:title-trigger? false})))])
+           [:div.flex.flex-col.gap-4.border-t.py-4
+            (for [[value group] (:rows table)]
+              (let [add-new-object! (fn [_]
+                                      (add-new-object! {:properties {(:db/ident group-by-property) (or (and (map? value) (:db/id value)) value)}}))
+                    table' (shui/table-option (-> table-map
+                                                  (assoc-in [:data-fns :add-new-object!] add-new-object!)
+                                                  (assoc :data group
+                                                         :all-data (:data table))))
+                    readable-property-value #(if (and (map? %) (or (:block/title %) (:logseq.property/value %)))
+                                               (db-property/property-value-content %)
+                                               (str %))]
+                (ui/foldable
+                 [:div.text-sm.font-medium.ml-2
+                  (if (some? value)
+                    (let [icon (pu/get-block-property-value value :logseq.property/icon)]
+                      [:div.flex.flex-row.gap-1.items-center
+                       (when icon (icon-component/icon icon {:color? true}))
+                       (readable-property-value value)])
+                    (str "No " (:block/title group-by-property)))]
+                 [:div.mt-2
+                  (view-cp view-entity (assoc table' :rows group) option view-opts)]
+                 {:title-trigger? false})))]
            (view-cp view-entity table option view-opts)))]
       (merge {:title-trigger? false} foldable-options))]))
 

+ 12 - 1
src/main/frontend/worker/db/migrate.cljs

@@ -651,6 +651,16 @@
                  (common-util/distinct-by :db/id (concat tags properties)))]
     tx-data))
 
+(defn- add-group-by-property-for-list-views
+  [conn _search-db]
+  (let [db @conn
+        list-type-id (:db/id (d/entity db :logseq.property.view/type.list))
+        list-views (d/datoms db :avet :logseq.property.view/type list-type-id)
+        block-page-prop-id (:db/id (d/entity db :block/page))]
+    (map (fn [view-datom]
+           [:db/add (:e view-datom) :logseq.property.view/group-by-property block-page-prop-id])
+         list-views)))
+
 (def ^:large-vars/cleanup-todo schema-version->updates
   "A vec of tuples defining datascript migrations. Each tuple consists of the
    schema version integer and a migration map. A migration map can have keys of :properties, :classes
@@ -757,7 +767,8 @@
    ["64.2" {:properties [:logseq.property.view/feature-type]
             :fix migrate-views}]
    ["64.3" {:properties [:logseq.property/used-template :logseq.property/template-applied-to]
-            :classes [:logseq.class/Template]}]])
+            :classes [:logseq.class/Template]}]
+   ["64.4" {:fix add-group-by-property-for-list-views}]])
 
 (let [[major minor] (last (sort (map (comp (juxt :major :minor) db-schema/parse-schema-version first)
                                      schema-version->updates)))