diff --git a/src/main/frontend/components/block.cljs b/src/main/frontend/components/block.cljs index 54c3db4d2..6ded180e5 100644 --- a/src/main/frontend/components/block.cljs +++ b/src/main/frontend/components/block.cljs @@ -546,7 +546,7 @@ page-name-in-block is the overridable name of the page (legacy) 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) *mouse-down? (::mouse-down? state) tag? (:tag? config) @@ -570,10 +570,19 @@ :on-drag-start (fn [e] (editor-handler/block->data-transfer! page-name e true)) :on-mouse-over #(reset! *hover? true) :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] - (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) + + :else (do (util/stop e) (reset! *mouse-down? true)))) @@ -582,7 +591,7 @@ (state/clear-edit!) (open-page-ref config page-entity e page-name contents-page?) (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!) (open-page-ref config page-entity e page-name contents-page?)))} (when-not hide-icon? @@ -707,13 +716,13 @@ "Component for a page. `page` argument contains :block/name which can be (un)sanitized page name. Keys for `config`: - `: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)] (when-let [page-entity (when page-entity (db/sub-block (:db/id page-entity)))] (let [page-name (or (:block/name page-entity) (:block/name page)) 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)] (if (and (not (util/mobile?)) (not= page-name (:id config)) @@ -2281,7 +2290,7 @@ (when (seq properties) (case position :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] (let [property (db/entity pid) v (get block pid)] diff --git a/src/main/frontend/components/property.cljs b/src/main/frontend/components/property.cljs index c73863595..1d40812db 100644 --- a/src/main/frontend/components/property.cljs +++ b/src/main/frontend/components/property.cljs @@ -516,7 +516,7 @@ (rum/defcs property-key < (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) icon (:logseq.property/icon property) property-name (:block/original-name property)] @@ -541,18 +541,6 @@ "Delete property"]))] {:as-dropdown? true :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 (when-not other-position? (let [content-fn (fn [{:keys [id]}] diff --git a/src/main/frontend/components/property.css b/src/main/frontend/components/property.css index c1efc7310..9bb4e1c06 100644 --- a/src/main/frontend/components/property.css +++ b/src/main/frontend/components/property.css @@ -285,7 +285,7 @@ a.control-link { @apply font-bold outline-none; } -.positioned-properties .property-k:focus { +.positioned-properties .property-k:focus, .positioned-properties .ls-popup-closed:focus { @apply font-normal; } diff --git a/src/main/frontend/components/property/value.cljs b/src/main/frontend/components/property/value.cljs index 86c6ccc6f..0d1cb370b 100644 --- a/src/main/frontend/components/property/value.cljs +++ b/src/main/frontend/components/property/value.cljs @@ -24,7 +24,8 @@ [logseq.db.frontend.property :as db-property] [datascript.impl.entity :as de] [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 [& {:as opts}] @@ -153,7 +154,7 @@ (assoc :default-month initial-month))))) (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) page value title (when page (:block/original-name page)) @@ -161,10 +162,11 @@ (js/Date. (date/journal-title->long title))) content-fn (fn [{:keys [id]}] (calendar-inner id on-change value')) open-popup! (fn [e] - (util/stop e) - (when-not config/publishing? - (shui/popup-show! (.-target e) content-fn - {:align "start" :auto-focus? true})))] + (when-not (or (util/meta-key? e) (util/shift-key? e)) + (util/stop e) + (when-not config/publishing? + (shui/popup-show! (.-target e) content-fn + {:align "start" :auto-focus? true}))))] (rum/use-effect! (fn [] (when editing? @@ -184,12 +186,12 @@ :class "jtrigger min-h-[24px]" ; FIXME: min-h-6 not works :ref *trigger-ref :on-click open-popup!} - (if page (when-let [page-cp (state/get-component :block/page-cp)] (rum/with-key (page-cp {:disable-preview? true - :hide-close-button? true} page) + :hide-close-button? true + :meta-click? other-position?} page) (:db/id page))) (when-not multiple-values? (property-empty-btn-value))))))) @@ -558,7 +560,7 @@ (property-empty-btn-value)))))) (rum/defc closed-value-item < rum/reactive - [value {:keys [page-cp inline-text icon?]}] + [value {:keys [inline-text icon?]}] (when value (let [eid (if (de/entity? value) (:db/id value) [:block/uuid value])] (when-let [block (db/sub-block (:db/id (db/entity eid)))] @@ -566,12 +568,6 @@ value' (db-property/closed-value-name block) icon (pu/get-block-property-value block :logseq.property/icon)] (cond - (:block/name block) - (rum/with-key - (page-cp {:disable-preview? true - :hide-close-button? true} block) - (:db/id block)) - icon (if icon? (icon-component/icon icon) @@ -590,9 +586,17 @@ (inline-text {} :markdown (str value')))))))) (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)) - 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 (cond (= value :logseq.property/empty-placeholder) @@ -603,7 +607,8 @@ (rum/with-key (page-cp {:disable-preview? true :tag? tag? - :hide-close-button? true} value) + :hide-close-button? true + :meta-click? other-position?} value) (:db/id value))) (= type :object) @@ -614,10 +619,10 @@ (de/entity? 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 - (inline-text {} :markdown (macro-util/expand-value-if-macro (str value) (state/get-macros))))])) + (inline-text-cp (str value)))])) (rum/defc single-value-select [block property value value-f select-opts opts] @@ -640,19 +645,29 @@ (:object :page :date) (property-value-select-page block property select-opts' opts))]) trigger-id (str "trigger-" (:container-id opts) "-" (:db/id block) "-" (:db/id property)) - show! (fn [target] - (when-not (or (util/link? target) (.closest target "a") config/publishing?) - (shui/popup-show! target popup-content - {:align "start" - :as-dropdown? true - :auto-focus? true - :trigger-id trigger-id})))] + show! (fn [e] + (let [target (.-target e) + node (.closest target "a")] + (js/console.dir node) + (when-not (or config/publishing? + (util/shift-key? e) + (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 (if (:other-position? opts) :div :div.jtrigger.flex.flex-1.w-full) {:ref *el :id trigger-id :tabIndex 0 - :on-click #(show! (.-target %))} + :on-click show!} (if (string/blank? value) (property-empty-text-value) (value-f)))))) @@ -738,7 +753,7 @@ (assoc opts :editing? editing?)) (case type :date - (property-value-date-picker block property value {:editing? editing?}) + (property-value-date-picker block property value (merge opts {:editing? editing?})) :checkbox (let [add-property! (fn [] diff --git a/src/main/frontend/util.cljc b/src/main/frontend/util.cljc index a4119be06..638005e98 100644 --- a/src/main/frontend/util.cljc +++ b/src/main/frontend/util.cljc @@ -1242,6 +1242,11 @@ (gobj/get e "metaKey") (gobj/get e "ctrlKey")))) +#?(:cljs + (defn shift-key? [e] + (gobj/get e "shiftKey"))) + + #?(:cljs (defn right-click? [e]