fix: can't edit properties in :block-below

experiment/tanstack-table
Tienson Qin 2024-05-28 04:38:10 +08:00
parent 1b528b2fc6
commit fbdb22358a
5 changed files with 67 additions and 50 deletions

View File

@ -546,7 +546,7 @@
page-name-in-block is the overridable name of the page (legacy) page-name-in-block is the overridable name of the page (legacy)
All page-names are sanitized except page-name-in-block" All page-names are sanitized except page-name-in-block"
[state config page-entity contents-page? children html-export? label whiteboard-page?] [state {:keys [contents-page? whiteboard-page? html-export? meta-click?] :as config} page-entity children label]
(let [*hover? (::hover? state) (let [*hover? (::hover? state)
*mouse-down? (::mouse-down? state) *mouse-down? (::mouse-down? state)
tag? (:tag? config) tag? (:tag? config)
@ -570,10 +570,19 @@
:on-drag-start (fn [e] (editor-handler/block->data-transfer! page-name e true)) :on-drag-start (fn [e] (editor-handler/block->data-transfer! page-name e true))
:on-mouse-over #(reset! *hover? true) :on-mouse-over #(reset! *hover? true)
:on-mouse-leave #(reset! *hover? false) :on-mouse-leave #(reset! *hover? false)
:on-click (fn [e] (util/stop e)) :on-click (fn [e] (when-not meta-click? (util/stop e)))
:on-pointer-down (fn [e] :on-pointer-down (fn [e]
(if breadcrumb? (cond
(and meta-click? (util/meta-key? e))
(reset! *mouse-down? true)
(and meta-click? (not (util/shift-key? e)))
nil
breadcrumb?
(.preventDefault e) (.preventDefault e)
:else
(do (do
(util/stop e) (util/stop e)
(reset! *mouse-down? true)))) (reset! *mouse-down? true))))
@ -582,7 +591,7 @@
(state/clear-edit!) (state/clear-edit!)
(open-page-ref config page-entity e page-name contents-page?) (open-page-ref config page-entity e page-name contents-page?)
(reset! *mouse-down? false))) (reset! *mouse-down? false)))
:on-key-up (fn [e] (when (and e (= (.-key e) "Enter")) :on-key-up (fn [e] (when (and e (= (.-key e) "Enter") (not meta-click?))
(state/clear-edit!) (state/clear-edit!)
(open-page-ref config page-entity e page-name contents-page?)))} (open-page-ref config page-entity e page-name contents-page?)))}
(when-not hide-icon? (when-not hide-icon?
@ -707,13 +716,13 @@
"Component for a page. `page` argument contains :block/name which can be (un)sanitized page name. "Component for a page. `page` argument contains :block/name which can be (un)sanitized page name.
Keys for `config`: Keys for `config`:
- `:preview?`: Is this component under preview mode? (If true, `page-preview-trigger` won't be registered to this `page-cp`)" - `:preview?`: Is this component under preview mode? (If true, `page-preview-trigger` won't be registered to this `page-cp`)"
[state {:keys [html-export? label children contents-page? preview? disable-preview?] :as config} page] [state {:keys [label children preview? disable-preview?] :as config} page]
(let [page-entity (::page-entity state)] (let [page-entity (::page-entity state)]
(when-let [page-entity (when page-entity (db/sub-block (:db/id page-entity)))] (when-let [page-entity (when page-entity (db/sub-block (:db/id page-entity)))]
(let [page-name (or (:block/name page-entity) (let [page-name (or (:block/name page-entity)
(:block/name page)) (:block/name page))
whiteboard-page? (model/whiteboard-page? page-name) whiteboard-page? (model/whiteboard-page? page-name)
inner (page-inner config page-entity contents-page? children html-export? label whiteboard-page?) inner (page-inner (assoc config :whiteboard-page? whiteboard-page?) page-entity children label)
modal? (:modal/show? @state/state)] modal? (:modal/show? @state/state)]
(if (and (not (util/mobile?)) (if (and (not (util/mobile?))
(not= page-name (:id config)) (not= page-name (:id config))
@ -2281,7 +2290,7 @@
(when (seq properties) (when (seq properties)
(case position (case position
:block-below :block-below
[:div.positioned-properties.flex.flex-row.gap-2.item-center.ml-2.pl-8.flex-nowrap.text-sm [:div.positioned-properties.flex.flex-row.gap-2.item-center.ml-2.pl-8.flex-wrap.text-sm.overflow-x-hidden.max-h-6
(for [pid properties] (for [pid properties]
(let [property (db/entity pid) (let [property (db/entity pid)
v (get block pid)] v (get block pid)]

View File

@ -516,7 +516,7 @@
(rum/defcs property-key < (rum/defcs property-key <
(rum/local false ::hover?) (rum/local false ::hover?)
[state block property {:keys [class-schema? block? collapsed? page-cp inline-text other-position?]}] [state block property {:keys [class-schema? collapsed? page-cp inline-text other-position?]}]
(let [*hover? (::hover? state) (let [*hover? (::hover? state)
icon (:logseq.property/icon property) icon (:logseq.property/icon property)
property-name (:block/original-name property)] property-name (:block/original-name property)]
@ -541,18 +541,6 @@
"Delete property"]))] "Delete property"]))]
{:as-dropdown? true {:as-dropdown? true
:content-props {:class "w-48"}}))} :content-props {:class "w-48"}}))}
(when block?
[:a.block-control
{:on-click (fn [event]
(util/stop event)
(db-property-handler/collapse-expand-block-property! (:db/id block) (:db/id property) (not collapsed?)))}
[:span {:class (cond
(or collapsed? @*hover?)
"control-show cursor-pointer"
:else
"control-hide")}
(ui/rotating-arrow collapsed?)]])
;; icon picker ;; icon picker
(when-not other-position? (when-not other-position?
(let [content-fn (fn [{:keys [id]}] (let [content-fn (fn [{:keys [id]}]

View File

@ -285,7 +285,7 @@ a.control-link {
@apply font-bold outline-none; @apply font-bold outline-none;
} }
.positioned-properties .property-k:focus { .positioned-properties .property-k:focus, .positioned-properties .ls-popup-closed:focus {
@apply font-normal; @apply font-normal;
} }

View File

@ -24,7 +24,8 @@
[logseq.db.frontend.property :as db-property] [logseq.db.frontend.property :as db-property]
[datascript.impl.entity :as de] [datascript.impl.entity :as de]
[frontend.handler.property.util :as pu] [frontend.handler.property.util :as pu]
[logseq.db.frontend.property.type :as db-property-type])) [logseq.db.frontend.property.type :as db-property-type]
[dommy.core :as d]))
(rum/defc property-empty-btn-value (rum/defc property-empty-btn-value
[& {:as opts}] [& {:as opts}]
@ -153,7 +154,7 @@
(assoc :default-month initial-month))))) (assoc :default-month initial-month)))))
(rum/defc date-picker (rum/defc date-picker
[value {:keys [on-change editing? multiple-values?]}] [value {:keys [on-change editing? multiple-values? other-position?]}]
(let [*trigger-ref (rum/use-ref nil) (let [*trigger-ref (rum/use-ref nil)
page value page value
title (when page (:block/original-name page)) title (when page (:block/original-name page))
@ -161,10 +162,11 @@
(js/Date. (date/journal-title->long title))) (js/Date. (date/journal-title->long title)))
content-fn (fn [{:keys [id]}] (calendar-inner id on-change value')) content-fn (fn [{:keys [id]}] (calendar-inner id on-change value'))
open-popup! (fn [e] open-popup! (fn [e]
(util/stop e) (when-not (or (util/meta-key? e) (util/shift-key? e))
(when-not config/publishing? (util/stop e)
(shui/popup-show! (.-target e) content-fn (when-not config/publishing?
{:align "start" :auto-focus? true})))] (shui/popup-show! (.-target e) content-fn
{:align "start" :auto-focus? true}))))]
(rum/use-effect! (rum/use-effect!
(fn [] (fn []
(when editing? (when editing?
@ -184,12 +186,12 @@
:class "jtrigger min-h-[24px]" ; FIXME: min-h-6 not works :class "jtrigger min-h-[24px]" ; FIXME: min-h-6 not works
:ref *trigger-ref :ref *trigger-ref
:on-click open-popup!} :on-click open-popup!}
(if page (if page
(when-let [page-cp (state/get-component :block/page-cp)] (when-let [page-cp (state/get-component :block/page-cp)]
(rum/with-key (rum/with-key
(page-cp {:disable-preview? true (page-cp {:disable-preview? true
:hide-close-button? true} page) :hide-close-button? true
:meta-click? other-position?} page)
(:db/id page))) (:db/id page)))
(when-not multiple-values? (when-not multiple-values?
(property-empty-btn-value))))))) (property-empty-btn-value)))))))
@ -558,7 +560,7 @@
(property-empty-btn-value)))))) (property-empty-btn-value))))))
(rum/defc closed-value-item < rum/reactive (rum/defc closed-value-item < rum/reactive
[value {:keys [page-cp inline-text icon?]}] [value {:keys [inline-text icon?]}]
(when value (when value
(let [eid (if (de/entity? value) (:db/id value) [:block/uuid value])] (let [eid (if (de/entity? value) (:db/id value) [:block/uuid value])]
(when-let [block (db/sub-block (:db/id (db/entity eid)))] (when-let [block (db/sub-block (:db/id (db/entity eid)))]
@ -566,12 +568,6 @@
value' (db-property/closed-value-name block) value' (db-property/closed-value-name block)
icon (pu/get-block-property-value block :logseq.property/icon)] icon (pu/get-block-property-value block :logseq.property/icon)]
(cond (cond
(:block/name block)
(rum/with-key
(page-cp {:disable-preview? true
:hide-close-button? true} block)
(:db/id block))
icon icon
(if icon? (if icon?
(icon-component/icon icon) (icon-component/icon icon)
@ -590,9 +586,17 @@
(inline-text {} :markdown (str value')))))))) (inline-text {} :markdown (str value'))))))))
(rum/defc select-item (rum/defc select-item
[property type value {:keys [page-cp inline-text _icon?] :as opts}] [property type value {:keys [page-cp inline-text other-position? _icon?] :as opts}]
(let [closed-values? (seq (:property/closed-values property)) (let [closed-values? (seq (:property/closed-values property))
tag? (or (:tag? opts) (= (:db/ident property) :block/tags))] tag? (or (:tag? opts) (= (:db/ident property) :block/tags))
inline-text-cp (fn [content]
[:div.flex.flex-row.items-center
(inline-text {} :markdown (macro-util/expand-value-if-macro content (state/get-macros)))
(when (and (= type :url) other-position?)
(shui/button {:variant :ghost
:size :sm
:class "px-0 py-0 h-4"}
(ui/icon "edit" {:size 14})))])]
[:div.select-item [:div.select-item
(cond (cond
(= value :logseq.property/empty-placeholder) (= value :logseq.property/empty-placeholder)
@ -603,7 +607,8 @@
(rum/with-key (rum/with-key
(page-cp {:disable-preview? true (page-cp {:disable-preview? true
:tag? tag? :tag? tag?
:hide-close-button? true} value) :hide-close-button? true
:meta-click? other-position?} value)
(:db/id value))) (:db/id value)))
(= type :object) (= type :object)
@ -614,10 +619,10 @@
(de/entity? value) (de/entity? value)
(when-let [content (:block/content value)] (when-let [content (:block/content value)]
(inline-text {} :markdown (macro-util/expand-value-if-macro content (state/get-macros)))) (inline-text-cp content))
:else :else
(inline-text {} :markdown (macro-util/expand-value-if-macro (str value) (state/get-macros))))])) (inline-text-cp (str value)))]))
(rum/defc single-value-select (rum/defc single-value-select
[block property value value-f select-opts opts] [block property value value-f select-opts opts]
@ -640,19 +645,29 @@
(:object :page :date) (:object :page :date)
(property-value-select-page block property select-opts' opts))]) (property-value-select-page block property select-opts' opts))])
trigger-id (str "trigger-" (:container-id opts) "-" (:db/id block) "-" (:db/id property)) trigger-id (str "trigger-" (:container-id opts) "-" (:db/id block) "-" (:db/id property))
show! (fn [target] show! (fn [e]
(when-not (or (util/link? target) (.closest target "a") config/publishing?) (let [target (.-target e)
(shui/popup-show! target popup-content node (.closest target "a")]
{:align "start" (js/console.dir node)
:as-dropdown? true (when-not (or config/publishing?
:auto-focus? true (util/shift-key? e)
:trigger-id trigger-id})))] (util/meta-key? e)
(util/link? target)
(when-let [node (.closest target "a")]
(not (or (d/has-class? node "page-ref")
(d/has-class? node "tag")))))
(shui/popup-show! target popup-content
{:align "start"
:as-dropdown? true
:auto-focus? true
:trigger-id trigger-id}))))]
(shui/trigger-as (shui/trigger-as
(if (:other-position? opts) :div :div.jtrigger.flex.flex-1.w-full) (if (:other-position? opts) :div :div.jtrigger.flex.flex-1.w-full)
{:ref *el {:ref *el
:id trigger-id :id trigger-id
:tabIndex 0 :tabIndex 0
:on-click #(show! (.-target %))} :on-click show!}
(if (string/blank? value) (if (string/blank? value)
(property-empty-text-value) (property-empty-text-value)
(value-f)))))) (value-f))))))
@ -738,7 +753,7 @@
(assoc opts :editing? editing?)) (assoc opts :editing? editing?))
(case type (case type
:date :date
(property-value-date-picker block property value {:editing? editing?}) (property-value-date-picker block property value (merge opts {:editing? editing?}))
:checkbox :checkbox
(let [add-property! (fn [] (let [add-property! (fn []

View File

@ -1242,6 +1242,11 @@
(gobj/get e "metaKey") (gobj/get e "metaKey")
(gobj/get e "ctrlKey")))) (gobj/get e "ctrlKey"))))
#?(:cljs
(defn shift-key? [e]
(gobj/get e "shiftKey")))
#?(:cljs #?(:cljs
(defn right-click? (defn right-click?
[e] [e]