Browse Source

fix: mod+p to add property

Tienson Qin 1 year ago
parent
commit
5b5f0f59e9

+ 4 - 1
src/main/frontend/components/block.cljs

@@ -2332,7 +2332,10 @@
       [:div.closed-values-properties.flex.flex-row.items-center.gap-1.select-none.h-full
        (for [pid closed-values-properties]
          (when-let [property (db/entity [:block/uuid pid])]
-           (pv/property-value block property (get (:block/properties block) pid) {:icon? true :page-cp page-cp})))])))
+           (pv/property-value block property (get (:block/properties block) pid)
+                              {:icon? true
+                               :page-cp page-cp
+                               :inline-text inline-text})))])))
 
 (rum/defc ^:large-vars/cleanup-todo block-content < rum/reactive
   [config {:block/keys [uuid content properties scheduled deadline format pre-block?] :as block} edit-input-id block-id slide? selected? *ref]

+ 35 - 32
src/main/frontend/components/property.cljs

@@ -435,38 +435,40 @@
                              nil))}]
          (property-select exclude-properties on-chosen input-opts)))]))
 
-(rum/defcs new-property < rum/reactive rum/static
+(rum/defcs new-property < rum/reactive
   (rum/local false ::new-property?)
   (rum/local nil ::property-key)
   (rum/local nil ::property-value)
-  [state block id opts]
+  [state block id keyboard-triggered? opts]
   (let [*new-property? (::new-property? state)
         container-id (state/sub :editor/properties-container)
-        new-property? (and @*new-property? (= container-id id))]
-    [:div.ls-new-property
-     (let [*property-key (::property-key state)
-           *property-value (::property-value state)]
-       (cond
-         new-property?
-         (property-input block *property-key *property-value opts)
-
-         (and (or (db-property-handler/block-has-viewable-properties? block)
-                  (:page-configure? opts))
-              (not config/publishing?)
-              (not (:in-block-container? opts)))
-         [:a.fade-link.flex.add-property
-          {:on-click (fn []
-                       (state/set-state! :editor/block block)
-                       (state/set-state! :editor/properties-container id)
-                       (reset! *new-property? true)
-                       (reset! *property-key nil)
-                       (reset! *property-value nil))}
-          [:div.flex.flex-row.items-center {:style {:padding-left 1}}
-           (ui/icon "plus" {:size 15})
-           [:div.ml-1.text-sm {:style {:padding-left 2}} "Add property"]]]
-
-         :else
-         [:div {:style {:height 28}}]))]))
+        new-property? (or keyboard-triggered? (and @*new-property? (= container-id id)))]
+
+    (when-not (and (:in-block-container? opts) (not keyboard-triggered?))
+      [:div.ls-new-property
+       (let [*property-key (::property-key state)
+             *property-value (::property-value state)]
+         (cond
+           new-property?
+           (property-input block *property-key *property-value opts)
+
+           (and (or (db-property-handler/block-has-viewable-properties? block)
+                    (:page-configure? opts))
+                (not config/publishing?)
+                (not (:in-block-container? opts)))
+           [:a.fade-link.flex.add-property
+            {:on-click (fn []
+                         (state/set-state! :editor/block block)
+                         (state/set-state! :editor/properties-container id)
+                         (reset! *new-property? true)
+                         (reset! *property-key nil)
+                         (reset! *property-value nil))}
+            [:div.flex.flex-row.items-center {:style {:padding-left 1}}
+             (ui/icon "plus" {:size 15})
+             [:div.ml-1.text-sm {:style {:padding-left 2}} "Add property"]]]
+
+           :else
+           [:div {:style {:height 28}}]))])))
 
 (defn- property-collapsed?
   [block property]
@@ -626,7 +628,7 @@
 (rum/defcs ^:large-vars/cleanup-todo properties-area < rum/reactive
   {:init (fn [state]
            (assoc state ::id (str (random-uuid))))}
-  [state target-block _edit-input-id {:keys [in-block-container? page-configure? class-schema?] :as opts}]
+  [state target-block edit-input-id {:keys [in-block-container? page-configure? class-schema?] :as opts}]
   (let [id (::id state)
         block (resolve-linked-block-if-exists target-block)
         block-properties (:block/properties block)
@@ -688,10 +690,12 @@
                                 (recur (rest classes)
                                        (set/union properties (set cur-properties))
                                        (conj result [class cur-properties])))
-                              result))]
+                              result))
+        keyboard-triggered? (= (state/sub :editor/new-property-input-id) edit-input-id)]
     (when-not (and (empty? block-own-properties)
                    (empty? class->properties)
-                   (not (:page-configure? opts)))
+                   (not (:page-configure? opts))
+                   (not keyboard-triggered?))
       [:div.ls-properties-area (cond-> (if in-block-container?
                                          {:id id}
                                          {:id id
@@ -703,8 +707,7 @@
        (when (and (seq full-hidden-properties) (not class-schema?) (not config/publishing?))
          (hidden-properties block full-hidden-properties opts))
 
-       (when (not in-block-container?)
-         (rum/with-key (new-property block id opts) (str id "-add-property")))
+       (rum/with-key (new-property block id keyboard-triggered? opts) (str id "-add-property"))
 
        (when (and (seq class->properties) (not one-class?))
          (let [page-cp (:page-cp opts)]

+ 1 - 0
src/main/frontend/components/property/value.cljs

@@ -34,6 +34,7 @@
   ([property-configure-check?]
    (when (or (and property-configure-check? (not (:editor/property-configure? @state/state)))
              (not property-configure-check?))
+     (state/set-state! :editor/new-property-input-id nil)
      (state/clear-edit!))))
 
 (defn set-editing!

+ 10 - 8
src/main/frontend/handler/events.cljs

@@ -921,14 +921,16 @@
     (editor-handler/toggle-blocks-as-own-order-list! blocks)))
 
 (defmethod handle :editor/new-property [[_]]
-  (when-let [edit-block (state/get-edit-block)]
-    (when-let [block-id (:block/uuid edit-block)]
-      (let [block (db/entity [:block/uuid block-id])
-            collapsed? (or (get-in @state/state [:ui/collapsed-blocks (state/get-current-repo) block-id])
-                           (:block/collapsed? block))]
-        (when collapsed?
-          (editor-handler/set-blocks-collapsed! [block-id] false)))))
-  (property-handler/editing-new-property!))
+  (p/do!
+    (when-let [edit-block (state/get-edit-block)]
+     (when-let [block-id (:block/uuid edit-block)]
+       (let [block (db/entity [:block/uuid block-id])
+             collapsed? (or (get-in @state/state [:ui/collapsed-blocks (state/get-current-repo) block-id])
+                            (:block/collapsed? block))]
+         (when collapsed?
+           (editor-handler/set-blocks-collapsed! [block-id] false)))))
+    (editor-handler/save-current-block!)
+    (property-handler/editing-new-property!)))
 
 (rum/defc multi-tabs-dialog
   []

+ 5 - 0
src/main/frontend/handler/property.cljs

@@ -31,8 +31,13 @@
        (set-block-property! repo (:block/uuid page) key value))
       (file-page-property/add-property! page-name key value))))
 
+(defn set-editing-new-property!
+  [value]
+  (state/set-state! :editor/new-property-input-id value))
+
 (defn editing-new-property!
   []
+  (set-editing-new-property! (state/get-edit-input-id))
   (state/clear-edit!))
 
 (defn remove-id-property

+ 2 - 1
src/main/frontend/state.cljs

@@ -130,7 +130,8 @@
       :editor/in-composition?                false
       :editor/content                        (atom {})
       :editor/block                          (atom nil)
-      :editor/properties-container                           (atom nil)
+      :editor/new-property-input-id          (atom nil)
+      :editor/properties-container           (atom nil)
       :editor/block-dom-id                   (atom nil)
       :editor/set-timestamp-block            (atom nil) ;; click rendered block timestamp-cp to set timestamp
       :editor/last-input-time                (atom {})