Pārlūkot izejas kodu

fix: add pre-configured properties when creating a new db graph

Tienson Qin 2 gadi atpakaļ
vecāks
revīzija
15cb78fbf7

+ 30 - 5
deps/graph-parser/src/logseq/graph_parser/property.cljs

@@ -80,10 +80,35 @@
      :todo :doing :now :later :done}
    @built-in-extended-properties))
 
-(defn full-built-in-properties
-  "All the built-in properties used by logseq"
-  []
-  (set/union (editable-built-in-properties) (hidden-built-in-properties)))
+;; FIXME: no support for built-in-extended-properties
+(def db-built-in-properties
+  {:background-color {:schema {:type :default}}
+   :heading {:schema {:type :any}}      ; number (1-6) or boolean for auto heading
+   :query-table {:schema {:type :checkbox}}
+   :query-properties {:schema {:type :coll}}
+   :query-sort-by {:schema {:type :checkbox}}
+   :query-sort-desc {:schema {:type :checkbox}}
+   :logseq.query/nlp-date {:schema {:type :checkbox}}
+   :ls-type {:schema {:type :keyword}}
+   :hl-type {:schema {:type :keyword}}
+   :hl-page {:schema {:type :number}}
+   :hl-stamp {:schema {:type :number}}
+   :hl-color {:schema {:type :default}}
+   :logseq.macro-name {:schema {:type :default}}
+   :logseq.macro-arguments {:schema {:type :default}}
+   :logseq.order-list-type {:schema {:type :checkbox}}
+   :logseq.tldraw.page {:schema {:type :map}}
+   :logseq.tldraw.shape {:schema {:type :map}}
+   :icon {:schema {:type :default}}
+   :public {:schema {:type :checkbox}}
+   :filters {:schema {:type :map}}
+   :exclude-from-graph-view {:schema {:type :checkbox}}})
+
+(defonce db-built-in-properties-keys
+  (set (keys db-built-in-properties)))
+
+(defonce db-built-in-properties-keys-str
+  (set (map name (keys db-built-in-properties))))
 
 (def built-in-property-types
   "Types for built-in properties. Built-in properties whose values are to be
@@ -92,7 +117,7 @@
    :public :boolean
    :exclude-from-graph-view :boolean
    :logseq.query/nlp-date :boolean
-   :heading :boolean
+   :heading :boolean                    ; FIXME: or integer
    :collapsed :boolean
    :created-at :integer
    :created_at :integer

+ 13 - 3
deps/publishing/src/logseq/publishing/db.cljs

@@ -62,6 +62,12 @@
         db)
        (map first)))
 
+(defn db-graph?
+  "Whether the current graph is db-only"
+  [db]
+  (= "db" (d/entity db :db/type)))
+
+;; FIXME: store assets as blocks for db-based graphs
 (defn- get-assets
   [db datoms]
   (let [pull (fn [eid db]
@@ -71,12 +77,14 @@
                    (pull % db)
                    :block/page
                    :db/id
-                   (pull db)))]
+                   (pull db)))
+        db-based? (= "db" (d/entity db :db/type))
+        hl-type-key (if db-based?
+                      :hl-type)]
     (->>
      (keep
       (fn [datom]
         (cond-> []
-
           (= :block/content (:a datom))
           (concat (let [matched (re-seq #"\([./]*/assets/([^)]+)\)" (:v datom))]
                     (when (seq matched)
@@ -85,7 +93,9 @@
                                    (not (string/ends-with? path ".js")))
                           path)))))
           ;; area image assets
-          (= (:hl-type (:v datom)) "area")
+          (and
+           (= :block/properties (:a datom))
+           (= (keyword (get (:v datom) hl-type-key)) :area))
           (#(let [path (some-> (pull (:e datom) db)
                                (get-area-block-asset-url
                                 (get-page-by-eid (:e datom))))

+ 2 - 1
src/main/frontend/components/property.cljs

@@ -47,6 +47,7 @@
       [:div.grid.grid-cols-4.gap-1.leading-8
        [:label "Schema type:"]
        (let [schema-types (->> (keys property-handler/builtin-schema-types)
+                               (remove gp-property/db-built-in-properties-keys)
                                (map (comp string/capitalize name))
                                (map (fn [type]
                                       {:label type
@@ -548,7 +549,7 @@
                                             (:properties (:block/schema e))))))
                               (map (fn [id]
                                      [id nil])))
-        built-in-properties (set (map name (gp-property/full-built-in-properties)))
+        built-in-properties (set (map name gp-property/db-built-in-properties-keys))
         properties (->> (concat (seq properties) class-properties)
                         (util/distinct-by first)
                         (remove (fn [[k _v]]

+ 5 - 3
src/main/frontend/components/query_table.cljs

@@ -110,9 +110,11 @@
 
 (defn get-columns [current-block result {:keys [page?]}]
   (let [properties (:block/properties current-block)
-        query-properties (or (pu/lookup properties :query-properties) "")
-        query-properties (some-> query-properties
-                                 (common-handler/safe-read-string "Parsing query properties failed"))
+        query-properties (pu/lookup properties :query-properties)
+        query-properties (if (config/db-based-graph? (state/get-current-repo))
+                           query-properties
+                           (some-> query-properties
+                                   (common-handler/safe-read-string "Parsing query properties failed")))
         query-properties (if page? (remove #{:block} query-properties) query-properties)
         columns (if (seq query-properties)
                   query-properties

+ 2 - 2
src/main/frontend/extensions/pdf/assets.cljs

@@ -192,11 +192,11 @@
            ref-block)
          (let [text       (:text content)
                wrap-props #(if-let [stamp (:image content)]
-                             (assoc % :hl-type "area" :hl-stamp stamp)
+                             (assoc % :hl-type :area :hl-stamp stamp)
                              %)
                properties (->>
                            (wrap-props
-                            {:ls-type  "annotation"
+                            {:ls-type  :annotation
                              :hl-page  page
                              :hl-color (:color properties)
                              ;; force custom uuid

+ 8 - 1
src/main/frontend/handler/db_based/property.cljs

@@ -56,7 +56,14 @@
               logseq-block?]
    :object    [:fn
                {:error/message "should be an object"}
-               logseq-object?]})
+               logseq-object?]
+
+   ;; internal usage
+   :map      map?
+   :coll     coll?
+   :any      some?})
+
+(def internal-builtin-schema-types #{:map :coll :any})
 
 ;; schema -> type, cardinality, object's class
 ;;           min, max -> string length, number range, cardinality size limit

+ 13 - 6
src/main/frontend/handler/editor.cljs

@@ -804,19 +804,26 @@
   [block-id all-properties key add?]
   (when-let [block (db/entity [:block/uuid block-id])]
     (let [properties (:block/properties block)
-          query-properties (or (pu/lookup properties :query-properties) "")
-          query-properties (-> query-properties
-                               (common-handler/safe-read-string "Failed to parse query properties"))
+          query-properties (pu/lookup properties :query-properties)
+          repo (state/get-current-repo)
+          db-based? (config/db-based-graph? repo)
+          query-properties (if db-based?
+                             query-properties
+                             (some-> query-properties
+                                     (common-handler/safe-read-string "Parsing query properties failed")))
           query-properties (if (seq query-properties)
                              query-properties
                              all-properties)
           query-properties (if add?
                              (distinct (conj query-properties key))
                              (remove #{key} query-properties))
-          query-properties (vec query-properties)
-          repo (state/get-current-repo)]
+          query-properties (vec query-properties)]
       (if (seq query-properties)
-        (property-handler/set-block-property! repo block-id :query-properties (str query-properties))
+        (property-handler/set-block-property! repo block-id
+                                              :query-properties
+                                              (if db-based?
+                                                query-properties
+                                                (str query-properties)))
         (property-handler/remove-block-property! repo block-id :query-properties)))))
 
 (defn set-block-timestamp!

+ 10 - 6
src/main/frontend/handler/page.cljs

@@ -949,16 +949,20 @@
                  (let [name (:block/name p)]
                    (or (util/uuid-string? name)
                        (gp-config/draw? name)
-                       (db/built-in-pages-names (string/upper-case name))))))
+                       (db/built-in-pages-names (string/upper-case name))
+                       (gp-property/db-built-in-properties-keys-str name)
+                       (contains? #{"macro"} (:block/type p))))))
        (common-handler/fix-pages-timestamps)))
 
 (defn get-filters
   [page-name]
-  (let [properties (db/get-page-properties page-name)
-        properties-str (or (pu/lookup properties :filters) "{}")]
-    (try (reader/read-string properties-str)
-         (catch :default e
-           (log/error :syntax/filters e)))))
+  (let [properties (db/get-page-properties page-name)]
+    (if (config/db-based-graph? (state/get-current-repo))
+      (pu/lookup properties :filters)
+      (let [properties-str (or (:filters properties) "{}")]
+        (try (reader/read-string properties-str)
+             (catch :default e
+               (log/error :syntax/filters e)))))))
 
 (defn save-filter!
   [page-name filter-state]

+ 1 - 1
src/main/frontend/handler/property/util.cljs

@@ -12,7 +12,7 @@
   (let [repo (state/get-current-repo)]
     (if (and (config/db-based-graph? repo)
              (keyword? key)
-             (contains? (gp-property/full-built-in-properties) key))
+             (contains? gp-property/db-built-in-properties-keys key))
       (when-let [property (db/entity repo [:block/name (gp-util/page-name-sanity-lc (name key))])]
         (get coll (:block/uuid property)))
       (get coll key))))

+ 24 - 11
src/main/frontend/handler/repo.cljs

@@ -26,6 +26,7 @@
             [frontend.db.persist :as db-persist]
             [logseq.graph-parser :as graph-parser]
             [logseq.graph-parser.config :as gp-config]
+            [logseq.graph-parser.property :as gp-property]
             [electron.ipc :as ipc]
             [cljs-bean.core :as bean]
             [clojure.core.async :as async]
@@ -34,7 +35,8 @@
             [logseq.common.path :as path]
             [logseq.common.config :as common-config]
             [frontend.db.react :as react]
-            [frontend.db.listener :as db-listener]))
+            [frontend.db.listener :as db-listener]
+            [frontend.modules.outliner.core :as outliner-core]))
 
 ;; Project settings should be checked in two situations:
 ;; 1. User changes the config.edn directly in logseq.com (fn: alter-file)
@@ -544,16 +546,27 @@
           _ (state/add-repo! {:url full-graph-name})
           _ (route-handler/redirect-to-home!)
           _ (db/transact! full-graph-name [(react/kv :db/type "db")]
-                          {:skip-persist? true})
-          initial-data [{:block/uuid (db/new-block-id)
-                         :file/path (str "logseq/" "config.edn")
-                         :file/content config/config-default-content}
-                        {:block/uuid (db/new-block-id)
-                         :file/path (str "logseq/" "custom.css")
-                         :file/content ""}
-                        {:block/uuid (db/new-block-id)
-                         :file/path (str "logseq/" "custom.js")
-                         :file/content ""}]
+              {:skip-persist? true})
+          initial-files [{:block/uuid (db/new-block-id)
+                          :file/path (str "logseq/" "config.edn")
+                          :file/content config/config-default-content}
+                         {:block/uuid (db/new-block-id)
+                          :file/path (str "logseq/" "custom.css")
+                          :file/content ""}
+                         {:block/uuid (db/new-block-id)
+                          :file/path (str "logseq/" "custom.js")
+                          :file/content ""}]
+          default-properties (map
+                               (fn [[k-keyword {:keys [schema]}]]
+                                 (let [k-name (name k-keyword)]
+                                   (outliner-core/block-with-timestamps
+                                    {:block/schema schema
+                                     :block/original-name k-name
+                                     :block/name (util/page-name-sanity-lc k-name)
+                                     :block/uuid (db/new-block-id)
+                                     :block/type "property"})))
+                               gp-property/db-built-in-properties)
+          initial-data (concat initial-files default-properties)
           _ (db/transact! full-graph-name initial-data)
           _ (repo-config-handler/set-repo-config-state! full-graph-name config/config-default-content)
           ;; TODO: handle global graph