Browse Source

enhance: put selected choices on top and ensure stable order

Tienson Qin 7 months ago
parent
commit
c18af313b8

+ 16 - 0
deps/common/src/logseq/common/util.cljs

@@ -393,3 +393,19 @@ return: [{:id 3} {:id 2 :depend-on 3} {:id 1 :depend-on 2}]"
       (str nn "/" (name x))
       (name x))
     x))
+
+(defn by-sorting
+  [sorting]
+  (let [get-value+cmp
+        (map
+         (fn [{:keys [get-value asc?]}]
+           [get-value
+            (if asc? compare #(compare %2 %1))])
+         sorting)]
+    (fn [a b]
+      (reduce
+       (fn [order [get-value cmp]]
+         (if (zero? order)
+           (cmp (get-value a) (get-value b))
+           (reduced order)))
+       0 get-value+cmp))))

+ 2 - 18
deps/db/src/logseq/db/common/view.cljs

@@ -61,22 +61,6 @@
           (when (valid-type-for-sort? v)
             v))))))
 
-(defn- by-sorting
-  [sorting]
-  (let [get-value+cmp
-        (map
-         (fn [{:keys [get-value asc?]}]
-           [get-value
-            (if asc? compare #(compare %2 %1))])
-         sorting)]
-    (fn [a b]
-      (reduce
-       (fn [order [get-value cmp]]
-         (if (zero? order)
-           (cmp (get-value a) (get-value b))
-           (reduced order)))
-       0 get-value+cmp))))
-
 (defn- by-one-sorting
   [{:keys [asc? get-value]}]
   (let [cmp (if asc? compare #(compare %2 %1))]
@@ -103,7 +87,7 @@
                              reverse)
 
                            (not (ldb/db-based-graph? db)) ; file graph properties don't support index
-                           (sort (by-sorting
+                           (sort (common-util/by-sorting
                                   [{:get-value get-value-fn
                                     :asc? asc?}]) entities)
 
@@ -138,7 +122,7 @@
                  {:asc? asc?
                   :get-value (memoize (get-value-for-sort property))}))
              minor-sorting)
-        sort-cmp (by-sorting sorting)]
+        sort-cmp (common-util/by-sorting sorting)]
     (mapcat (fn [entities] (sort sort-cmp entities)) partitioned-entities-by-major-sorting)))
 
 (defn sort-entities

+ 16 - 6
src/main/frontend/components/property/value.cljs

@@ -31,6 +31,7 @@
             [goog.dom :as gdom]
             [goog.functions :refer [debounce]]
             [lambdaisland.glogi :as log]
+            [logseq.common.util :as common-util]
             [logseq.common.util.macro :as macro-util]
             [logseq.db :as ldb]
             [logseq.db.frontend.content :as db-content]
@@ -614,20 +615,29 @@
       :else
       id)))
 
+(defn- sort-select-items
+  [property selected-choices items]
+  (if (:property/closed-values property)
+    items                   ; sorted by order
+    (sort
+     (common-util/by-sorting
+      [{:get-value db-property/property-value-content
+        :asc? true}
+       {:get-value (fn [item] (selected-choices (:db/id item)))
+        :asc? false}])
+     items)))
+
 (defn- select-aux
   [block property {:keys [items selected-choices multiple-choices?] :as opts}]
   (let [selected-choices (->> selected-choices
                               (remove nil?)
-                              (remove #(= :logseq.property/empty-placeholder %)))
+                              (remove #(= :logseq.property/empty-placeholder %))
+                              set)
         clear-value (str "No " (:block/title property))
         clear-value-label [:div.flex.flex-row.items-center.gap-1.text-sm
                            (ui/icon "x" {:size 14})
                            [:div clear-value]]
-        items (if (:property/closed-values property)
-                items                   ; sorted by order
-                (sort-by (fn [item]
-                           (db-property/property-value-content item))
-                         items))
+        items (sort-select-items property selected-choices items)
         items' (->>
                 (if (and (seq selected-choices)
                          (not multiple-choices?)