feat: choices property displayed as checkbox

e.g. Status can be configured to be displayed as a checkbox.
This commit is contained in:
Tienson Qin
2024-12-23 12:50:41 +08:00
parent 7714cc2707
commit ea8be8936b
5 changed files with 63 additions and 11 deletions

View File

@@ -637,11 +637,26 @@
(when enable-closed-values?
(let [values (:property/closed-values property)]
(when (>= (count values) 2)
(when-not owner-block
(dropdown-editor-menuitem {:icon :list :title "Display as checkbox"
:desc "Configure"
:submenu-content (fn []
(checkbox-state-mapping values))})))))
(if owner-block
(let [checked? (contains?
(set (map :db/id (:logseq.property/checkbox-display-properties owner-block)))
(:db/id property))]
(dropdown-editor-menuitem
{:icon :checkbox :title "Display as checkbox"
:desc (shui/switch
{:id "display as checkbox" :size "sm"
:checked checked?
:on-click util/stop-propagation
:on-checked-change
(fn [value]
(if value
(db-property-handler/set-block-property! (:db/id owner-block) :logseq.property/checkbox-display-properties (:db/id property))
(db-property-handler/delete-property-value! (:db/id owner-block) :logseq.property/checkbox-display-properties (:db/id property))))})}))
(dropdown-editor-menuitem
{:icon :settings :title "Display as checkbox"
:desc "Configure"
:submenu-content (fn []
(checkbox-state-mapping values))})))))
(when (and (contains? db-property-type/cardinality-property-types property-type) (not disabled?))
(let [many? (db-property/many? property)]
@@ -735,6 +750,7 @@
(assoc state ::values *values)))}
[state property* owner-block opts]
(let [property (db/sub-block (:db/id property*))
owner-block (when (:db/id owner-block) (db/sub-block (:db/id owner-block)))
values (rum/react (::values state))]
(when-not (= :loading values)
(dropdown-editor-impl property owner-block values opts))))

View File

@@ -35,7 +35,8 @@
[logseq.shui.ui :as shui]
[promesa.core :as p]
[rum.core :as rum]
[clojure.set :as set]))
[clojure.set :as set]
[logseq.outliner.property :as outliner-property]))
(rum/defc property-empty-btn-value
[property & opts]
@@ -1040,10 +1041,28 @@
(icon-row block editing?)
(if (and select-type?'
(not (and (not closed-values?) (= type :date))))
(single-value-select block property value
(fn [] (select-item property type value opts))
select-opts
(assoc opts :editing? editing?))
(let [classes (outliner-property/get-block-classes (db/get-db) (:db/id block))
display-as-checkbox? (and (some
(fn [block]
(-> (set (map :db/id (:logseq.property/checkbox-display-properties block)))
(contains? (:db/id property))))
(conj classes block))
(seq (:property/closed-values property))
(boolean? (:logseq.property/choice-checkbox-state value*)))]
(if display-as-checkbox?
(let [checked? (:logseq.property/choice-checkbox-state value*)]
(shui/checkbox {:checked checked?
:class "mt-1"
:on-checked-change (fn [value]
(let [choices (:property/closed-values property)
choice (some (fn [choice] (when (= value (:logseq.property/choice-checkbox-state choice))
choice)) choices)]
(when choice
(db-property-handler/set-block-property! (:db/id block) (:db/ident property) (:db/id choice)))))}))
(single-value-select block property value
(fn [] (select-item property type value opts))
select-opts
(assoc opts :editing? editing?))))
(case type
(:date :datetime)
(property-value-date-picker block property value (merge opts {:editing? editing?}))

View File

@@ -536,7 +536,7 @@
[52 {:fix replace-block-type-with-tags}]
[53 {:properties [:logseq.task/scheduled :logseq.task/recur-frequency :logseq.task/recur-unit :logseq.task/repeated?]
:fix add-scheduled-to-task}]
[54 {:properties [:logseq.property/choice-checkbox-state]}]])
[54 {:properties [:logseq.property/choice-checkbox-state :logseq.property/checkbox-display-properties]}]])
(let [max-schema-version (apply max (map first schema-version->updates))]
(assert (<= db-schema/version max-schema-version))