Browse Source

wip: properties refactor

Tienson Qin 1 year ago
parent
commit
ce8c13065c

+ 9 - 1
deps/db/src/logseq/db/frontend/entity_plus.cljc

@@ -8,7 +8,8 @@
   (:require [cljs.core]
             #?(:org.babashka/nbb [datascript.db])
             [datascript.impl.entity :as entity :refer [Entity]]
-            [logseq.db.frontend.content :as db-content]))
+            [logseq.db.frontend.content :as db-content]
+            [logseq.db.frontend.property :as db-property]))
 
 (def lookup-entity @#'entity/lookup-entity)
 (defn lookup-kv-then-entity
@@ -18,6 +19,13 @@
      (= k :block/raw-content)
      (lookup-entity e :block/content default-value)
 
+     ;; Should we keep this?
+     (= k :block/properties)
+     (lookup-entity e :block/properties
+                    (->> (into {} e)
+                         (filter (fn [[k _]] (db-property/property? k)))
+                         (into {})))
+
      (= k :block/content)
      (or
       (get (.-kv e) k)

+ 14 - 5
deps/db/src/logseq/db/frontend/property.cljs

@@ -37,9 +37,12 @@
    :background-image {:schema {:type :default :hide? true}
                       :visible true}
    :heading {:schema {:type :any :hide? true}}      ; number (1-6) or boolean for auto heading
-   :created-from-block    {:schema {:type :ref}}
-   :created-from-property {:schema {:type :ref}}
-   :created-from-template {:schema {:type :ref}}
+   :created-from-block    {:schema {:db-attr-type :ref
+                                    :type :number}}
+   :created-from-property {:schema {:db-attr-type :ref
+                                    :type :number}}
+   :created-from-template {:schema {:db-attr-type :ref
+                                    :type :number}}
    :source-page-id        {:schema {:type :ref}}
    :built-in?             {:schema {:type :checkbox}}
    :hide-properties?      {:schema {:type :checkbox}}
@@ -94,11 +97,13 @@
               :visible true}
    :scheduled {:db-ident :logseq.property/scheduled
                :original-name "Scheduled"
-               :schema {:type :date}
+               :schema {:db-attr-type :ref
+                        :type :date}
                :visible true}
    :deadline {:db-ident :logseq.property/deadline
               :original-name "Deadline"
-              :schema {:type :date}
+              :schema {:db-attr-type :ref
+                       :type :date}
               :visible true}
 
    ;; TODO: Add more props :Assignee, :Estimate, :Cycle, :Project
@@ -245,3 +250,7 @@
             (let [e (d/entity db [:block/uuid id])]
               (when (= (closed-value-name e) value-name)
                 e))) values)))
+
+(defn property?
+  [k]
+  (contains? #{:logseq.property :user.property} (keyword (namespace k))))

+ 5 - 8
deps/db/src/logseq/db/frontend/property/type.cljs

@@ -60,17 +60,14 @@
   ;; TODO: Confirm that macro expanded value is url when it's easier to pass data into validations
   (macro-util/macro? s))
 
-(defn- logseq-page?
+(defn- logseq-block?
   [db id]
-  (and (uuid? id)
-       (when-let [e (d/entity db [:block/uuid id])]
-         (nil? (:block/page e)))))
+  (some? (d/entity db id)))
 
 ;; FIXME: template instance check
 (defn- logseq-template?
   [db id]
-  (and (uuid? id)
-       (some? (d/entity db [:block/uuid id]))))
+  (some? (d/entity db id)))
 
 (defn- existing-closed-value-valid?
   "Validates that the given existing closed value is valid"
@@ -109,14 +106,14 @@
               (some-fn number? uuid?)]
    :date     [:fn
               {:error/message "should be a journal date"}
-              logseq-page?]
+              logseq-block?]
    :checkbox boolean?
    :url      [:fn
               {:error/message "should be a URL"}
               (some-fn url? uuid? macro-url?)]
    :page     [:fn
               {:error/message "should be a page"}
-              logseq-page?]
+              logseq-block?]
    :template [:fn
               {:error/message "should has #template"}
               logseq-template?]

+ 48 - 51
src/main/frontend/components/property.cljs

@@ -245,18 +245,17 @@
              [:div.col-span-3.flex.flex-row.items-center.gap-2
               (icon-component/icon-picker icon-value
                                           {:on-chosen (fn [_e icon]
-                                                        (let [icon-property-id (db-pu/get-built-in-property-uuid :icon)]
-                                                          (db-property-handler/<update-property!
-                                                           (state/get-current-repo)
-                                                           (:block/uuid property)
-                                                           {:properties {icon-property-id icon}})))})
+                                                        (db-property-handler/<update-property!
+                                                         (state/get-current-repo)
+                                                         (:block/uuid property)
+                                                         {:properties {:logseq.property/icon icon}}))})
 
               (when icon-value
                 [:a.fade-link.flex {:on-click (fn [_e]
                                                 (db-property-handler/remove-block-property!
                                                  (state/get-current-repo)
                                                  (:block/uuid property)
-                                                 (db-pu/get-built-in-property-uuid :icon)))
+                                                 :logseq.property/icon))
                                     :title "Delete this icon"}
                  (ui/icon "X")])])]
 
@@ -573,20 +572,19 @@
                         (icon-component/icon-search
                          {:on-chosen
                           (fn [_e icon]
-                            (let [icon-property-id (db-pu/get-built-in-property-uuid :icon)]
-                              (when icon
-                                (p/let [_ (db-property-handler/<update-property! repo
-                                                                                 (:block/uuid property)
-                                                                                 {:properties {icon-property-id icon}})]
-                                  (shui/popup-hide! id)))))}))]
+                            (when icon
+                              (p/let [_ (db-property-handler/<update-property! repo
+                                                                               (:block/uuid property)
+                                                                               {:properties {:logseq.property/icon icon}})]
+                                (shui/popup-hide! id))))}))]
        (shui/trigger-as :button
-         (-> (when-not config/publishing?
-               {:on-click #(shui/popup-show! (.-target %) content-fn {:as-dropdown? true :auto-focus? true})})
-           (assoc :class "flex items-center"))
-         (if icon
-           (icon-component/icon icon)
-           [:span.bullet-container.cursor (when collapsed? {:class "bullet-closed"})
-            [:span.bullet]])))
+                        (-> (when-not config/publishing?
+                              {:on-click #(shui/popup-show! (.-target %) content-fn {:as-dropdown? true :auto-focus? true})})
+                            (assoc :class "flex items-center"))
+                        (if icon
+                          (icon-component/icon icon)
+                          [:span.bullet-container.cursor (when collapsed? {:class "bullet-closed"})
+                           [:span.bullet]])))
 
      (if config/publishing?
        [:a.property-k.flex.select-none.jtrigger.pl-2
@@ -594,29 +592,29 @@
         (:block/original-name property)]
 
        (shui/trigger-as :a
-         {:tabIndex 0
-          :title (str "Configure property: " (:block/original-name property))
-          :class "property-k flex select-none jtrigger pl-2"
-          :on-pointer-down (fn [^js e]
-                             (when (util/meta-key? e)
-                               (route-handler/redirect-to-page! (:block/name property))
-                               (.preventDefault e)))
-          :on-click (fn [^js e]
-                      (shui/popup-show!
-                        (.-target e)
-                        (fn [_]
-                          [:div.p-2
-                           [:h2.text-lg.font-medium.mb-2.p-1 "Configure property"]
-                           (property-config property
-                             {:inline-text inline-text
-                              :page-cp page-cp})])
-                        {:content-props {:class "property-configure-popup-content"
-                                         :collisionPadding {:bottom 10 :top 10}
-                                         :avoidCollisions true
-                                         :align "start"}
-                         :auto-side? true
-                         :auto-focus? true}))}
-         (:block/original-name property)))]))
+                        {:tabIndex 0
+                         :title (str "Configure property: " (:block/original-name property))
+                         :class "property-k flex select-none jtrigger pl-2"
+                         :on-pointer-down (fn [^js e]
+                                            (when (util/meta-key? e)
+                                              (route-handler/redirect-to-page! (:block/name property))
+                                              (.preventDefault e)))
+                         :on-click (fn [^js e]
+                                     (shui/popup-show!
+                                      (.-target e)
+                                      (fn [_]
+                                        [:div.p-2
+                                         [:h2.text-lg.font-medium.mb-2.p-1 "Configure property"]
+                                         (property-config property
+                                                          {:inline-text inline-text
+                                                           :page-cp page-cp})])
+                                      {:content-props {:class "property-configure-popup-content"
+                                                       :collisionPadding {:bottom 10 :top 10}
+                                                       :avoidCollisions true
+                                                       :align "start"}
+                                       :auto-side? true
+                                       :auto-focus? true}))}
+                        (:block/original-name property)))]))
 
 (defn- resolve-linked-block-if-exists
   "Properties will be updated for the linked page instead of the refed block.
@@ -636,11 +634,11 @@
   rum/reactive
   db-mixins/query
   [block k v {:keys [inline-text page-cp] :as opts}]
-  (when (uuid? k)
-    (when-let [property (db/sub-block (:db/id (db/entity [:block/uuid k])))]
+  (when (keyword? k)
+    (when-let [property (db/sub-block (:db/id (db/entity k)))]
       (let [type (get-in property [:block/schema :type] :default)
             closed-values? (seq (get-in property [:block/schema :values]))
-            v-block (when (uuid? v) (db/entity [:block/uuid v]))
+            v-block (when (integer? v) (db/entity v))
             block? (and v-block
                         (not closed-values?)
                         (:block/page v-block)
@@ -723,8 +721,7 @@
         hide-with-property-id (fn [property-id]
                                 (if (or root-block? page? page-configure?)
                                   false
-                                  (let [eid (if (uuid? property-id) [:block/uuid property-id] property-id)]
-                                    (boolean (:hide? (:block/schema (db/entity eid)))))))
+                                  (boolean (:hide? (:block/schema (db/entity property-id))))))
         property-hide-f (cond
                           config/publishing?
                           ;; Publishing is read only so hide all blank properties as they
@@ -735,7 +732,7 @@
                           (:ui/hide-empty-properties? (state/get-config))
                           (fn [[property-id property-value]]
                             ;; User's selection takes precedence over config
-                            (if (contains? (:block/schema (db/entity [:block/uuid property-id])) :hide?)
+                            (if (contains? (:block/schema (db/entity property-id)) :hide?)
                               (hide-with-property-id property-id)
                               (nil? property-value)))
                           :else
@@ -776,7 +773,7 @@
          (update :class conj "select-none")
          true (assoc :tab-index 0
                      :on-key-up #(when-let [block (and (= "Escape" (.-key %))
-                                                    (.closest (.-target %) "[blockid]"))]
+                                                       (.closest (.-target %) "[blockid]"))]
                                    (state/set-selection-blocks! [block])
                                    (some-> js/document.activeElement (.blur)))))
        (properties-section block (if class-schema? properties own-properties) opts)
@@ -788,8 +785,8 @@
            [:div.parent-properties.flex.flex-1.flex-col.gap-1
             (for [[class class-properties] class->properties]
               (let [id-properties (->> class-properties
-                                    remove-built-in-properties
-                                    (map (fn [id] [id (get block-properties id)])))]
+                                       remove-built-in-properties
+                                       (map (fn [id] [id (get block-properties id)])))]
                 (when (seq id-properties)
                   [:div
                    (when page-cp

+ 6 - 6
src/main/frontend/components/property/closed_value.cljs

@@ -43,7 +43,7 @@
       (let [value (if (string/blank? @*value) nil @*value)]
         (property-value/date-picker value
           {:on-change (fn [page]
-                        (reset! *value (:block/uuid page)))}))
+                        (reset! *value (:db/id page)))}))
 
       (shui/input
         {:default-value @*value
@@ -127,8 +127,8 @@
          (property-value/date-picker (:block/original-name item)
                                     {:on-change (fn [page]
                                                   (db-property-handler/replace-closed-value property
-                                                                                            (:block/uuid page)
-                                                                                            (:block/uuid item)))})
+                                                                                            (:db/id page)
+                                                                                            (:db/id item)))})
          ((:page-cp parent-opts) {:preview? false} item)]
 
         (and page? (:page-cp parent-opts))
@@ -174,7 +174,7 @@
                     (swap! *property-schema update :values (fn [vs] (vec (remove #(= uuid %) vs)))))))
               :update-icon
               (fn [icon]
-                (property-handler/set-block-property! (state/get-current-repo) (:block/uuid block) :icon icon)))
+                (property-handler/set-block-property! (state/get-current-repo) (:block/uuid block) :logseq.property/icon icon)))
        parent-opts))))
 
 (rum/defc add-existing-values
@@ -185,7 +185,7 @@
    [:ol
     (for [value values]
       [:li (if (uuid? value)
-             (let [result (db/entity [:block/uuid value])]
+             (let [result (db/entity value)]
                (:block/original-name result))
              (str value))])]
    (ui/button
@@ -205,7 +205,7 @@
     [:div.closed-values.flex.flex-col
      (let [choices (doall
                     (keep (fn [id]
-                            (when-let [block (db/sub-block (:db/id (db/entity [:block/uuid id])))]
+                            (when-let [block (db/sub-block (:db/id (db/entity id)))]
                               {:id (str id)
                                :value id
                                :content (choice-item-content property *property-schema block (merge opts dropdown-opts))}))

+ 6 - 7
src/main/frontend/components/property/value.cljs

@@ -76,8 +76,7 @@
   (let [;; FIXME: Remove ignore when editing bug is fixed
         #_:clj-kondo/ignore
         [open? set-open!] (rum/use-state editing?)
-        page (when (uuid? value)
-               (db/entity [:block/uuid value]))
+        page (db/entity value)
         title (when page (:block/original-name page))
         value (if title
                 (js/Date. (date/journal-title->long title))
@@ -148,7 +147,7 @@
                                       (let [repo (state/get-current-repo)]
                                         (property-handler/set-block-property! repo (:block/uuid block)
                                                                               (:block/name property)
-                                                                              (:block/uuid page))
+                                                                              (:db/id page))
                                         (exit-edit-property)))}))))
 
 (defn- <create-page-if-not-exists!
@@ -219,7 +218,7 @@
                                      (:block/tags block)
                                      (:block/alias block))
                                    (map (fn [e] (:block/original-name e))))
-                              (when-let [v (get-in block [:block/properties (:block/uuid property)])]
+                              (when-let [v (get-in block [:block/properties (:db/ident property)])]
                                 (if (coll? v)
                                   (map (fn [id]
                                          (:block/original-name (db/entity [:block/uuid id])))
@@ -439,7 +438,7 @@
                         (p/do!
                          (add-property-f (if (map? chosen) (:value chosen) chosen))
                          (when-let [f (:on-chosen select-opts)] (f))))
-            selected-choices' (get-in block [:block/properties (:block/uuid property)])
+            selected-choices' (get-in block [:block/properties (:db/ident property)])
             selected-choices (if (coll? selected-choices') selected-choices' [selected-choices'])]
         (select-aux block property
                     (cond->
@@ -578,7 +577,7 @@
     [:div.select-item
      (cond
        (contains? #{:page :date} type)
-       (when-let [page (db/entity [:block/uuid value])]
+       (when-let [page (db/entity value)]
          (page-cp {:disable-preview? true
                    :hide-close-button? true} page))
 
@@ -689,7 +688,7 @@
                           type
                           :default)
                  type (if (= :block type)
-                        (let [v-block (db/entity [:block/uuid value])]
+                        (let [v-block (db/entity value)]
                           (if (:logseq.property/created-from-template v-block)
                             :template
                             type))

+ 2 - 6
src/main/frontend/handler/db_based/property.cljs

@@ -511,14 +511,10 @@
    (let [schema (:block/schema (db/entity property-id))]
      (= (:position schema) "block-beginning"))))
 
-(defn property?
-  [k]
-  (contains? #{:logseq.property :user.property} (namespace k)))
-
 (defn get-block-other-position-properties
   [eid]
   (let [block (db/entity eid)
-        own-properties (filter property? (keys block))]
+        own-properties (filter db-property/property? (keys block))]
     (->> (:classes-properties (get-block-classes-properties eid))
          (concat own-properties)
          (filter (fn [id] (closed-value-other-position? id block)))
@@ -526,7 +522,7 @@
 
 (defn block-has-viewable-properties?
   [block-entity]
-  (let [properties (->> (keys block-entity) (filter property?))]
+  (let [properties (->> (keys block-entity) (filter db-property/property?))]
     (or
      (seq (:block/alias block-entity))
      (and (seq properties)