mirror of https://github.com/logseq/logseq
feat: configure hidden properties
parent
cab00429c0
commit
07d58178b2
|
@ -18,7 +18,8 @@
|
||||||
[frontend.ui :as ui]
|
[frontend.ui :as ui]
|
||||||
[frontend.util :as util]
|
[frontend.util :as util]
|
||||||
[logseq.graph-parser.property :as gp-property]
|
[logseq.graph-parser.property :as gp-property]
|
||||||
[rum.core :as rum]))
|
[rum.core :as rum]
|
||||||
|
[frontend.db-mixins :as db-mixins]))
|
||||||
|
|
||||||
(rum/defc icon
|
(rum/defc icon
|
||||||
[block {:keys [_type id]}] ; only :emoji supported yet
|
[block {:keys [_type id]}] ; only :emoji supported yet
|
||||||
|
@ -137,6 +138,14 @@
|
||||||
:disabled built-in-property?
|
:disabled built-in-property?
|
||||||
:value (:description @*property-schema)})]]
|
:value (:description @*property-schema)})]]
|
||||||
|
|
||||||
|
(when-not built-in-property?
|
||||||
|
(let [hide? (:hide? @*property-schema)]
|
||||||
|
[:div.grid.grid-cols-4.gap-1.items-center.leading-8
|
||||||
|
[:label "Hide by default:"]
|
||||||
|
(ui/checkbox {:checked hide?
|
||||||
|
:on-change (fn []
|
||||||
|
(swap! *property-schema assoc :hide? (not hide?)))})]))
|
||||||
|
|
||||||
[:div
|
[:div
|
||||||
(when-not built-in-property?
|
(when-not built-in-property?
|
||||||
(ui/button
|
(ui/button
|
||||||
|
@ -351,7 +360,7 @@
|
||||||
(recur (:block/namespace current-ns))))))
|
(recur (:block/namespace current-ns))))))
|
||||||
@*namespaces))
|
@*namespaces))
|
||||||
|
|
||||||
(rum/defc properties-section
|
(rum/defc properties-section < rum/reactive db-mixins/query
|
||||||
[block properties opts]
|
[block properties opts]
|
||||||
(when (seq properties)
|
(when (seq properties)
|
||||||
(for [[k v] properties]
|
(for [[k v] properties]
|
||||||
|
@ -368,13 +377,25 @@
|
||||||
{:style {:margin-left -20}})
|
{:style {:margin-left -20}})
|
||||||
(pv/property-value block property v opts)])]))))))
|
(pv/property-value block property v opts)])]))))))
|
||||||
|
|
||||||
|
(rum/defcs hidden-properties < (rum/local true ::hide?)
|
||||||
|
[state block hidden-properties opts]
|
||||||
|
(let [*hide? (::hide? state)]
|
||||||
|
[:div.hidden-properties.flex.flex-col.gap-1
|
||||||
|
(when-not @*hide?
|
||||||
|
(properties-section block hidden-properties opts))
|
||||||
|
[:a.block.text-sm.fade-link {:on-click #(swap! *hide? not)}
|
||||||
|
[:div.flex.flex-row.items-center.gap-1
|
||||||
|
(ui/icon (if @*hide? "caret-right" "caret-down") {:size 16})
|
||||||
|
[:div "Hidden properties"]]]]))
|
||||||
|
|
||||||
(rum/defcs properties-area < rum/reactive
|
(rum/defcs properties-area < rum/reactive
|
||||||
{:init (fn [state]
|
{:init (fn [state]
|
||||||
(assoc state ::blocks-container-id (or (:blocks-container-id (last (:rum/args state)))
|
(assoc state ::blocks-container-id (or (:blocks-container-id (last (:rum/args state)))
|
||||||
(state/next-blocks-container-id))))}
|
(state/next-blocks-container-id))))}
|
||||||
[state target-block edit-input-id {:keys [in-block-container?] :as opts}]
|
[state target-block edit-input-id {:keys [in-block-container?] :as opts}]
|
||||||
(let [block (resolve-linked-block-if-exists target-block)
|
(let [block (resolve-linked-block-if-exists target-block)
|
||||||
properties (if (and (:class-schema? opts) (:block/schema block))
|
class-schema? (and (:class-schema? opts) (:block/schema block))
|
||||||
|
properties (if class-schema?
|
||||||
(let [properties (:properties (:block/schema block))]
|
(let [properties (:properties (:block/schema block))]
|
||||||
(map (fn [k] [k nil]) properties))
|
(map (fn [k] [k nil]) properties))
|
||||||
(:block/properties block))
|
(:block/properties block))
|
||||||
|
@ -392,30 +413,42 @@
|
||||||
properties))
|
properties))
|
||||||
classes (->> (:block/tags block)
|
classes (->> (:block/tags block)
|
||||||
(sort-by :block/name)
|
(sort-by :block/name)
|
||||||
(filter (fn [tag]
|
(filter (fn [tag] (= "class" (:block/type tag)))))
|
||||||
(= "class" (:block/type tag)))))
|
|
||||||
one-class? (= 1 (count classes))
|
one-class? (= 1 (count classes))
|
||||||
namespace-parents (get-namespace-parents classes)
|
namespace-parents (get-namespace-parents classes)
|
||||||
all-classes (->> (concat classes namespace-parents)
|
all-classes (->> (concat classes namespace-parents)
|
||||||
(filter (fn [class]
|
(filter (fn [class]
|
||||||
(seq (:properties (:block/schema class))))))
|
(seq (:properties (:block/schema class))))))
|
||||||
classes-properties (mapcat (fn [class]
|
classes-properties (-> (mapcat (fn [class]
|
||||||
(seq (:properties (:block/schema class)))) all-classes)
|
(seq (:properties (:block/schema class)))) all-classes)
|
||||||
own-properties (cond->
|
distinct)
|
||||||
(->> (concat (seq tags-properties)
|
block-own-properties (->> (concat (seq tags-properties)
|
||||||
(seq alias-properties)
|
(seq alias-properties)
|
||||||
(seq properties))
|
(seq properties))
|
||||||
remove-built-in-properties
|
remove-built-in-properties
|
||||||
(remove (fn [[id _]] ((set classes-properties) id)))
|
(remove (fn [[id _]] ((set classes-properties) id)))
|
||||||
(sort-by first))
|
(sort-by first))
|
||||||
|
property-hide-f (fn [property-id]
|
||||||
|
(let [eid (if (uuid? property-id) [:block/uuid property-id] property-id)]
|
||||||
|
(boolean (:hide? (:block/schema (db/entity eid))))))
|
||||||
|
{block-hidden-properties' true
|
||||||
|
block-own-properties' false} (group-by (fn [[id _]] (property-hide-f id)) block-own-properties)
|
||||||
|
block-hidden-properties (map first block-hidden-properties')
|
||||||
|
own-properties (cond-> block-own-properties'
|
||||||
one-class?
|
one-class?
|
||||||
(concat (map (fn [id] [id (get properties id)]) classes-properties)))
|
(concat (map (fn [id] [id (get properties id)])
|
||||||
|
(remove property-hide-f classes-properties))))
|
||||||
|
classes-hidden-properties (filter property-hide-f classes-properties)
|
||||||
|
full-hidden-properties (->> (distinct (concat block-hidden-properties classes-hidden-properties))
|
||||||
|
(map (fn [id] [id nil])))
|
||||||
new-property? (= edit-input-id (state/sub :ui/new-property-input-id))
|
new-property? (= edit-input-id (state/sub :ui/new-property-input-id))
|
||||||
class->properties (loop [classes all-classes
|
class->properties (loop [classes all-classes
|
||||||
properties #{}
|
properties #{}
|
||||||
result []]
|
result []]
|
||||||
(if-let [class (first classes)]
|
(if-let [class (first classes)]
|
||||||
(let [cur-properties (remove properties (:properties (:block/schema class)))]
|
(let [cur-properties (->> (:properties (:block/schema class))
|
||||||
|
(remove properties)
|
||||||
|
(remove property-hide-f))]
|
||||||
(recur (rest classes)
|
(recur (rest classes)
|
||||||
(set/union properties (set cur-properties))
|
(set/union properties (set cur-properties))
|
||||||
(conj result [class cur-properties])))
|
(conj result [class cur-properties])))
|
||||||
|
@ -426,18 +459,22 @@
|
||||||
(not new-property?)
|
(not new-property?)
|
||||||
(not (:page-configure? opts)))
|
(not (:page-configure? opts)))
|
||||||
[:div.ls-properties-area
|
[:div.ls-properties-area
|
||||||
[:div.own-properties
|
[:div
|
||||||
(cond->
|
(cond->
|
||||||
{}
|
{}
|
||||||
(:selected? opts)
|
(:selected? opts)
|
||||||
(assoc :class "select-none"))
|
(assoc :class "select-none"))
|
||||||
(properties-section block own-properties opts)
|
(properties-section block (if class-schema? properties own-properties) opts)
|
||||||
|
|
||||||
|
(when (and (seq full-hidden-properties) (not class-schema?))
|
||||||
|
(hidden-properties block full-hidden-properties opts))
|
||||||
|
|
||||||
(when (or new-property? (not in-block-container?))
|
(when (or new-property? (not in-block-container?))
|
||||||
(new-property block edit-input-id properties new-property? opts))]
|
(new-property block edit-input-id properties new-property? opts))]
|
||||||
|
|
||||||
(when (and (seq class->properties) (not one-class?))
|
(when (and (seq class->properties) (not one-class?))
|
||||||
(let [page-cp (:page-cp opts)]
|
(let [page-cp (:page-cp opts)]
|
||||||
[:div.parent-properties.flex.flex-1.flex-col.gap-1.mt-2
|
[:div.parent-properties.flex.flex-1.flex-col.gap-1
|
||||||
(for [[class class-properties] class->properties]
|
(for [[class class-properties] class->properties]
|
||||||
(let [id-properties (->> class-properties
|
(let [id-properties (->> class-properties
|
||||||
remove-built-in-properties
|
remove-built-in-properties
|
||||||
|
|
Loading…
Reference in New Issue