Kaynağa Gözat

feat: add task class and default properties `status` and `priority`

Tienson Qin 2 yıl önce
ebeveyn
işleme
8a846f6f81

+ 8 - 0
deps/db/src/logseq/db/frontend/class.cljs

@@ -0,0 +1,8 @@
+(ns logseq.db.frontend.class
+  "Class related fns for DB graphs and frontend/datascript usage")
+
+(def ^:large-vars/data-var built-in-classes
+  {:task {:original-name "Task"
+          :schema {:properties ["status" "priority"]}}
+   ;; TODO: Add more classes such as :book, :paper, :movie, :music, :project
+   })

+ 19 - 1
deps/db/src/logseq/db/frontend/property.cljs

@@ -45,7 +45,25 @@
    :logseq.order-list-type {:schema {:type :default}}
    :logseq.tldraw.page {:schema {:type :map}}
    :logseq.tldraw.shape {:schema {:type :map}}
-   ;; TODO: Add enums for logseq.color, logseq.table.headers and logseq.table.hover
+
+   ;; Task props
+   :status {:original-name "Status"
+            :schema
+            {:type :default}
+            :closed-values
+            (mapv #(hash-map :value % :uuid (random-uuid))
+                  ["Backlog" "Todo" "Doing" "In Review" "Done" "Canceled"])
+            :visible true}
+   :priority {:original-name "Priority"
+              :schema
+              {:type :default}
+              :closed-values
+              (mapv #(hash-map :value % :uuid (random-uuid))
+                    ["Urgent" "High" "Medium" "Low"])
+              :visible true}
+
+   ;; TODO: Add more props :Assignee, :Estimate, :Cycle, :Project
+
    ;; color props
    :logseq.color {:schema
                   {:type :default :hide? true}

+ 20 - 2
deps/db/src/logseq/db/sqlite/create_graph.cljs

@@ -3,6 +3,7 @@
   (:require [logseq.db.sqlite.util :as sqlite-util]
             [logseq.db.frontend.schema :as db-schema]
             [logseq.db.frontend.property :as db-property]
+            [logseq.db.frontend.class :as db-class]
             [logseq.db.frontend.property.util :as db-property-util]
             [logseq.common.util :as common-util]
             [datascript.core :as d]
@@ -39,5 +40,22 @@
                                      :block/name (common-util/page-name-sanity-lc k-name)
                                      :block/uuid (d/squuid)})])))
                             db-property/built-in-properties)
-        ]
-    (concat initial-data initial-files default-pages default-properties)))
+        name->properties (zipmap
+                          (map :block/name default-properties)
+                          default-properties)
+        default-classes (map
+                         (fn [[k-keyword {:keys [schema original-name]}]]
+                           (let [k-name (name k-keyword)]
+                             (sqlite-util/build-new-class
+                              {:block/original-name (or original-name k-name)
+                               :block/name (common-util/page-name-sanity-lc k-name)
+                               :block/uuid (d/squuid)
+                               :block/schema {:properties
+                                              (mapv
+                                               (fn [property-name]
+                                                 (let [id (:block/uuid (get name->properties property-name))]
+                                                   (assert id (str "Built-in property " property-name " is not defined yet"))
+                                                   id))
+                                               (:properties schema))}})))
+                         db-class/built-in-classes)]
+    (concat initial-data initial-files default-pages default-classes default-properties)))

+ 10 - 0
deps/db/src/logseq/db/sqlite/util.cljs

@@ -41,3 +41,13 @@
            :block/journal? false
            :block/format :markdown}
           block)))
+
+
+(defn build-new-class
+  "Build a standard new class so that it is is consistent across contexts"
+  [block]
+  (block-with-timestamps
+   (merge {:block/type "class"
+           :block/journal? false
+           :block/format :markdown}
+          block)))