diff --git a/deps/common/src/logseq/common/util.cljs b/deps/common/src/logseq/common/util.cljs index a09f6000e5..73d111cf09 100644 --- a/deps/common/src/logseq/common/util.cljs +++ b/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)))) diff --git a/deps/db/src/logseq/db.cljs b/deps/db/src/logseq/db.cljs index 08f49dc0a9..4759643846 100644 --- a/deps/db/src/logseq/db.cljs +++ b/deps/db/src/logseq/db.cljs @@ -467,29 +467,7 @@ (when (seq ref-ids) (d/pull-many db '[*] ref-ids)))) -(defn hidden-ref? - "Whether ref-block (for block with the `id`) should be hidden." - [db ref-block id] - (let [db-based? (entity-plus/db-based-graph? db)] - (if db-based? - (let [entity (d/entity db id)] - (or - (= (:db/id ref-block) id) - (= id (:db/id (:block/page ref-block))) - (hidden? (:block/page ref-block)) - (hidden? ref-block) - (contains? (set (map :db/id (:block/tags ref-block))) (:db/id entity)) - (some? (get ref-block (:db/ident entity))))) - (or - (= (:db/id ref-block) id) - (= id (:db/id (:block/page ref-block))))))) - -(defn get-block-refs-count - [db id] - (some->> (d/entity db id) - :block/_refs - (remove (fn [ref-block] (hidden-ref? db ref-block id))) - count)) +(def get-block-refs-count common-initial-data/get-block-refs-count) (defn hidden-or-internal-tag? [e] diff --git a/deps/db/src/logseq/db/common/initial_data.cljs b/deps/db/src/logseq/db/common/initial_data.cljs index 9b2d555538..4867839ee6 100644 --- a/deps/db/src/logseq/db/common/initial_data.cljs +++ b/deps/db/src/logseq/db/common/initial_data.cljs @@ -154,6 +154,32 @@ (with-raw-title entity) (assoc :db/id (:db/id entity)))) +(defn hidden-ref? + "Whether ref-block (for block with the `id`) should be hidden." + [db ref-block id] + (let [db-based? (entity-plus/db-based-graph? db)] + (if db-based? + (let [entity (d/entity db id)] + (or + (= (:db/id ref-block) id) + (= id (:db/id (:block/page ref-block))) + (entity-util/hidden? (:block/page ref-block)) + (entity-util/hidden? ref-block) + (contains? (set (map :db/id (:block/tags ref-block))) (:db/id entity)) + (some? (get ref-block (:db/ident entity))))) + (or + (= (:db/id ref-block) id) + (= id (:db/id (:block/page ref-block))))))) + +(defn get-block-refs-count + [db id] + (or + (some->> (d/entity db id) + :block/_refs + (remove (fn [ref-block] (hidden-ref? db ref-block id))) + count) + 0)) + (defn ^:large-vars/cleanup-todo get-block-and-children [db id {:keys [children? children-only? nested-children? properties children-props]}] (let [block (d/entity db (if (uuid? id) @@ -211,7 +237,7 @@ :else v))) block-refs-count? - (assoc :block.temp/refs-count (count (:block/_refs block))))] + (assoc :block.temp/refs-count (get-block-refs-count db (:db/id block))))] (cond-> {:block block'} children? diff --git a/deps/db/src/logseq/db/common/view.cljs b/deps/db/src/logseq/db/common/view.cljs index 38f5af10fb..9a03ab8a6a 100644 --- a/deps/db/src/logseq/db/common/view.cljs +++ b/deps/db/src/logseq/db/common/view.cljs @@ -9,6 +9,7 @@ [logseq.common.util :as common-util] [logseq.db :as ldb] [logseq.db.common.entity-plus :as entity-plus] + [logseq.db.common.initial-data :as common-initial-data] [logseq.db.frontend.class :as db-class] [logseq.db.frontend.entity-util :as entity-util] [logseq.db.frontend.property :as db-property] @@ -60,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))] @@ -102,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) @@ -137,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 @@ -325,7 +310,7 @@ refs (mapcat (fn [id] (:block/_refs (d/entity db id))) ids) page-filters (get-filters db entity) full-ref-blocks (->> refs - (remove (fn [block] (ldb/hidden-ref? db block id))) + (remove (fn [block] (common-initial-data/hidden-ref? db block id))) (common-util/distinct-by :db/id)) ref-blocks (cond->> full-ref-blocks (seq page-filters) @@ -386,7 +371,7 @@ (entity-util/built-in? e))) (cond-> e refs-count? - (assoc :block.temp/refs-count (count (:block/_refs e))))))) + (assoc :block.temp/refs-count (ldb/get-block-refs-count db (:db/id e))))))) (d/datoms db :avet property-ident)))) (defn- get-entities diff --git a/deps/db/src/logseq/db/frontend/content.cljs b/deps/db/src/logseq/db/frontend/content.cljs index 4bdd0e7111..92d663b9db 100644 --- a/deps/db/src/logseq/db/frontend/content.cljs +++ b/deps/db/src/logseq/db/frontend/content.cljs @@ -172,21 +172,23 @@ ([ent] (recur-replace-uuid-in-block-title ent 10)) ([ent max-depth] - (let [ref-set (loop [result-refs (:block/refs ent) - current-refs (:block/refs ent) - depth 0] - (if (or (>= depth max-depth) (empty? current-refs)) - result-refs - (let [next-refs (set (mapcat :block/refs current-refs)) - result-refs' (apply conj result-refs next-refs)] - (if (= (count result-refs') (count result-refs)) - result-refs - (recur (apply conj result-refs next-refs) next-refs (inc depth)))))) - opts {:replace-block-id? true}] - (loop [result (id-ref->title-ref (:block/title ent) ref-set opts) - last-result nil - depth 0] - (if (or (>= depth max-depth) - (= last-result result)) - result - (recur (id-ref->title-ref result ref-set opts) result (inc depth))))))) + (if (some->> (:block/title ent) (re-find id-ref-pattern)) + (let [ref-set (loop [result-refs (:block/refs ent) + current-refs (:block/refs ent) + depth 0] + (if (or (>= depth max-depth) (empty? current-refs)) + result-refs + (let [next-refs (set (mapcat :block/refs current-refs)) + result-refs' (apply conj result-refs next-refs)] + (if (= (count result-refs') (count result-refs)) + result-refs + (recur (apply conj result-refs next-refs) next-refs (inc depth)))))) + opts {:replace-block-id? true}] + (loop [result (id-ref->title-ref (:block/title ent) ref-set opts) + last-result nil + depth 0] + (if (or (>= depth max-depth) + (= last-result result)) + result + (recur (id-ref->title-ref result ref-set opts) result (inc depth))))) + (:block/title ent)))) diff --git a/deps/db/src/logseq/db/frontend/malli_schema.cljs b/deps/db/src/logseq/db/frontend/malli_schema.cljs index 413a42f59b..d174c2d2ac 100644 --- a/deps/db/src/logseq/db/frontend/malli_schema.cljs +++ b/deps/db/src/logseq/db/frontend/malli_schema.cljs @@ -460,6 +460,7 @@ (def property-value-placeholder [:map [:db/ident [:= :logseq.property/empty-placeholder]] + [:block/uuid :uuid] [:block/tx-id {:optional true} :int]]) (defn entity-dispatch-key [db ent] @@ -486,10 +487,10 @@ :closed-value-block (and (:logseq.property/created-from-property d) (:logseq.property/value d)) :property-value-block - (:block/uuid d) - :block (= (:db/ident d) :logseq.property/empty-placeholder) :property-value-placeholder + (:block/uuid d) + :block (:db/ident d) :db-ident-key-value)] dispatch-key)) diff --git a/src/main/frontend/components/block.cljs b/src/main/frontend/components/block.cljs index b9a442b631..ca321478cb 100644 --- a/src/main/frontend/components/block.cljs +++ b/src/main/frontend/components/block.cljs @@ -2691,10 +2691,14 @@ (rum/local false ::hover-container?) [state block tag config popup-opts] (let [*hover? (::hover? state) - *hover-container? (::hover-container? state)] + *hover-container? (::hover-container? state) + private-tag? (ldb/private-tags (:db/ident tag))] [:div.block-tag.items-center.relative {:key (str "tag-" (:db/id tag)) - :class (if @*hover? "bg-gray-03 rounded pr-1" "px-1") + :class (if @*hover? + (str "bg-gray-03 rounded " + (if private-tag? "px-1" "pr-1")) + "pl-2 pr-1") :on-mouse-over #(reset! *hover-container? true) :on-mouse-out #(reset! *hover-container? false)} [:div.flex.items-center @@ -2722,10 +2726,12 @@ :on-click #(db-property-handler/delete-property-value! (:db/id block) :block/tags (:db/id tag))} "Remove tag"))]) popup-opts))} - (if (and @*hover? (not (ldb/private-tags (:db/ident tag)))) + (if (and @*hover? (not private-tag?)) [:a.inline-flex.text-muted-foreground {:title "Remove this tag" - :style {:margin-top 1} + :style {:margin-top 1 + :padding-left 2 + :margin-right 2} :on-pointer-down (fn [e] (util/stop e) diff --git a/src/main/frontend/components/icon.cljs b/src/main/frontend/components/icon.cljs index 5f8305f8fb..d47ac39a0d 100644 --- a/src/main/frontend/components/icon.cljs +++ b/src/main/frontend/components/icon.cljs @@ -29,9 +29,10 @@ opts (dissoc opts :color?) item (cond (and (= :emoji (:type icon')) (:id icon')) - [:em-emoji (merge {:id (:id icon') - :style {:line-height 1}} - opts)] + [:span.ui__icon + [:em-emoji (merge {:id (:id icon') + :style {:line-height 1}} + opts)]] (and (= :tabler-icon (:type icon')) (:id icon')) (ui/icon (:id icon') opts))] diff --git a/src/main/frontend/components/property/value.cljs b/src/main/frontend/components/property/value.cljs index 0f68381f86..c148c9f0ae 100644 --- a/src/main/frontend/components/property/value.cljs +++ b/src/main/frontend/components/property/value.cljs @@ -614,20 +614,26 @@ :else id))) -(defn- select-aux +(defn- sort-select-items + [property selected-choices items] + (if (:property/closed-values property) + items ; sorted by order + (sort-by + (juxt (fn [item] (not (selected-choices (:db/id item)))) + db-property/property-value-content) + items))) + +(rum/defc 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 _] (hooks/use-state (sort-select-items property selected-choices items)) items' (->> (if (and (seq selected-choices) (not multiple-choices?) diff --git a/src/main/frontend/handler/editor.cljs b/src/main/frontend/handler/editor.cljs index 1bcd487f12..b0e82c34dd 100644 --- a/src/main/frontend/handler/editor.cljs +++ b/src/main/frontend/handler/editor.cljs @@ -2,7 +2,6 @@ (:require [clojure.set :as set] [clojure.string :as string] [clojure.walk :as w] - [dommy.core :as d] [dommy.core :as dom] [electron.ipc :as ipc] [frontend.commands :as commands] @@ -1255,7 +1254,7 @@ (when-let [timeout @*action-bar-timeout] (js/clearTimeout timeout)) (state/pub-event! [:editor/hide-action-bar]) - (when (seq (remove (fn [b] (d/has-class? b "ls-table-cell")) + (when (seq (remove (fn [b] (dom/has-class? b "ls-table-cell")) (state/get-selection-blocks))) (let [timeout (js/setTimeout #(state/pub-event! [:editor/show-action-bar]) delay)] (reset! *action-bar-timeout timeout))))) diff --git a/src/main/frontend/ui.css b/src/main/frontend/ui.css index c2a102ef54..e3b5d9e3bd 100644 --- a/src/main/frontend/ui.css +++ b/src/main/frontend/ui.css @@ -275,6 +275,17 @@ html.is-mobile { display: inline-block; } +.ui__icon svg { + filter: brightness(0.8); + transition: filter .15s; + will-change: filter; +} + +.ui__icon:hover svg { + filter: brightness(1); + transition-duration: .15s; +} + .type-icon { @apply text-base text-center flex items-center justify-center rounded border mr-2 relative;