mirror of
https://github.com/logseq/logseq.git
synced 2026-05-28 06:34:34 +00:00
fix: create :number and :url properties from scripts
This commit is contained in:
@@ -16,7 +16,8 @@
|
||||
["path" :as node-path]
|
||||
[nbb.classpath :as cp]
|
||||
[logseq.db.frontend.property :as db-property]
|
||||
[logseq.db.frontend.order :as db-order]))
|
||||
[logseq.db.frontend.order :as db-order]
|
||||
[logseq.db.frontend.property.type :as db-property-type]))
|
||||
|
||||
(defn- find-on-classpath [rel-path]
|
||||
(some (fn [dir]
|
||||
@@ -111,17 +112,52 @@
|
||||
"Provides the next temp :db/id to use in a create-graph transact!"
|
||||
#(swap! current-db-id dec))
|
||||
|
||||
(defn- ->block-tx [m uuid-maps all-idents page-id]
|
||||
(merge (dissoc m :properties)
|
||||
(sqlite-util/block-with-timestamps
|
||||
{:db/id (new-db-id)
|
||||
:block/format :markdown
|
||||
:block/page {:db/id page-id}
|
||||
:block/order (db-order/gen-key nil)
|
||||
:block/parent {:db/id page-id}})
|
||||
(when (seq (:properties m))
|
||||
(merge (->block-properties (:properties m) uuid-maps all-idents)
|
||||
{:block/refs (build-property-refs (:properties m) all-idents)}))))
|
||||
(defn- create-property-value
|
||||
[block property value]
|
||||
(db-property-build/property-create-new-block
|
||||
block
|
||||
property
|
||||
;; FIXME: Remove when fixed in UI
|
||||
(str value)
|
||||
;; TODO: One day would be nice to parse block for refs
|
||||
#(assoc % :block/order (db-order/gen-key nil))))
|
||||
|
||||
(defn- create-pvalue-entities
|
||||
"Given a new block and its properties, creates a map of properties which have property values as entities"
|
||||
[new-block properties properties-config all-idents]
|
||||
(->> properties
|
||||
(map (fn [[k v]]
|
||||
(when (db-property-type/value-ref-property-types (get-in properties-config [k :block/schema :type]))
|
||||
[k (if (set? v)
|
||||
(set (map #(create-property-value new-block {:db/ident (get-ident all-idents k)} %) v))
|
||||
(create-property-value new-block {:db/ident (get-ident all-idents k)} v))])))
|
||||
(into {})))
|
||||
|
||||
(defn- ->block-tx [{:keys [properties] :as m} properties-config uuid-maps all-idents page-id]
|
||||
(let [new-block {:db/id (new-db-id)
|
||||
:block/format :markdown
|
||||
:block/page {:db/id page-id}
|
||||
:block/order (db-order/gen-key nil)
|
||||
:block/parent {:db/id page-id}}
|
||||
pvalue-ents (create-pvalue-entities new-block properties properties-config all-idents)
|
||||
block-props (when (seq properties)
|
||||
(->block-properties (merge properties
|
||||
(update-vals pvalue-ents
|
||||
(fn [v]
|
||||
(if (set? v)
|
||||
(set (map #(vector :block/uuid (:block/uuid %)) v))
|
||||
(vector :block/uuid (:block/uuid v))))))
|
||||
uuid-maps all-idents))]
|
||||
(cond-> []
|
||||
;; Place property values first since they are referenced by block
|
||||
(seq pvalue-ents)
|
||||
(into (mapcat #(if (set? %) % [%]) (vals pvalue-ents)))
|
||||
true
|
||||
(conj (merge (dissoc m :properties)
|
||||
(sqlite-util/block-with-timestamps new-block)
|
||||
(when (seq properties)
|
||||
(merge block-props
|
||||
{:block/refs (build-property-refs properties all-idents)})))))))
|
||||
|
||||
(defn- build-properties-tx [properties uuid-maps all-idents]
|
||||
(let [property-db-ids (->> (keys properties)
|
||||
@@ -207,8 +243,8 @@
|
||||
(map :page pages-and-blocks))]
|
||||
(assert (empty? invalid-pages)
|
||||
(str "The following pages did not have a name attribute: " invalid-pages))
|
||||
(assert (every? :block/schema (vals properties))
|
||||
"All properties must have :block/schema")
|
||||
(assert (every? #(get-in % [:block/schema :type]) (vals properties))
|
||||
"All properties must have :block/schema and :type")
|
||||
(assert (empty? undeclared-properties)
|
||||
(str "The following properties used in EDN were not declared in :properties: " undeclared-properties))))
|
||||
|
||||
@@ -323,8 +359,8 @@
|
||||
:block/path-refs (build-property-refs (:properties page) all-idents)})))]
|
||||
;; blocks tx
|
||||
(reduce (fn [acc m]
|
||||
(conj acc
|
||||
(->block-tx m uuid-maps all-idents (page-id-fn new-page))))
|
||||
(into acc
|
||||
(->block-tx m properties uuid-maps all-idents (page-id-fn new-page))))
|
||||
[]
|
||||
blocks))))
|
||||
pages-and-blocks'))]
|
||||
|
||||
@@ -97,20 +97,20 @@
|
||||
{:block/content "string-closed property block" :properties {:string-closed (random-closed-value :string-closed)}}
|
||||
{:block/content "url property block" :properties {:url "https://logseq.com"}}
|
||||
{:block/content "url-many property block" :properties {:url-many #{"https://logseq.com" "https://docs.logseq.com"}}}
|
||||
{:block/content "url-closed property block" :properties {:url-closed (random-closed-value :url-closed)}}
|
||||
;; {:block/content "url-closed property block" :properties {:url-closed (random-closed-value :url-closed)}}
|
||||
{:block/content "checkbox property block" :properties {:checkbox true}}
|
||||
{:block/content "number property block" :properties {:number 5}}
|
||||
{:block/content "number-many property block" :properties {:number-many #{5 10}}}
|
||||
{:block/content "number-closed property block" :properties {:number-closed (random-closed-value :number-closed)}}
|
||||
{:block/content "page property block" :properties {:page [:page "page 1"]}}
|
||||
{:block/content "page-many property block" :properties {:page-many #{[:page "page 1"] [:page "page 2"]}}}
|
||||
;; :page-closed and :date-closed disabled for now since they're not supported
|
||||
#_{:block/content "page-closed property block" :properties {:page-closed (random-closed-value :page-closed)}}
|
||||
{:block/content "date property block" :properties {:date [:page (date-journal-title today)]}}
|
||||
{:block/content "date-many property block" :properties {:date-many #{[:page (date-journal-title today)]
|
||||
;; {:block/content "number-closed property block" :properties {:number-closed (random-closed-value :number-closed)}}
|
||||
;; {:block/content "page property block" :properties {:page [:page "page 1"]}}
|
||||
;; {:block/content "page-many property block" :properties {:page-many #{[:page "page 1"] [:page "page 2"]}}}
|
||||
;; ;; :page-closed and :date-closed disabled for now since they're not supported
|
||||
;; #_{:block/content "page-closed property block" :properties {:page-closed (random-closed-value :page-closed)}}
|
||||
;; {:block/content "date property block" :properties {:date [:page (date-journal-title today)]}}
|
||||
#_{:block/content "date-many property block" :properties {:date-many #{[:page (date-journal-title today)]
|
||||
[:page (date-journal-title yesterday)]}}}
|
||||
#_{:block/content "date-closed property block" :properties {:date-closed (random-closed-value :date-closed)}}]}
|
||||
{:page {:block/original-name "Block Property Queries"}
|
||||
#_{:page {:block/original-name "Block Property Queries"}
|
||||
:blocks
|
||||
[{:block/content "{{query (property :string \"haha\")}}"}
|
||||
{:block/content "{{query (property :string-many \"haw\")}}"}
|
||||
@@ -131,24 +131,24 @@
|
||||
|
||||
;; Page property pages and queries
|
||||
;; {:page {:block/name "default page" :properties {:default "yolo block"}}}
|
||||
{:page {:block/name "string page" :properties {:string "yolo"}}}
|
||||
{:page {:block/name "string-many page" :properties {:string-many #{"yee" "haw" "sir"}}}}
|
||||
{:page {:block/name "string-closed page" :properties {:string-closed (random-closed-value :string-closed)}}}
|
||||
{:page {:block/name "url page" :properties {:url "https://logseq.com"}}}
|
||||
{:page {:block/name "url-many page" :properties {:url-many #{"https://logseq.com" "https://docs.logseq.com"}}}}
|
||||
{:page {:block/name "url-closed page" :properties {:url-closed (random-closed-value :url-closed)}}}
|
||||
{:page {:block/name "checkbox page" :properties {:checkbox true}}}
|
||||
{:page {:block/name "number page" :properties {:number 5}}}
|
||||
{:page {:block/name "number-many page" :properties {:number-many #{5 10}}}}
|
||||
{:page {:block/name "number-closed page" :properties {:number-closed (random-closed-value :number-closed)}}}
|
||||
{:page {:block/name "page page" :properties {:page [:page "page 1"]}}}
|
||||
{:page {:block/name "page-many page" :properties {:page-many #{[:page "page 1"] [:page "page 2"]}}}}
|
||||
#_{:page {:block/name "page-closed page" :properties {:page-closed (random-closed-value :page-closed)}}}
|
||||
{:page {:block/name "date page" :properties {:date [:page (date-journal-title today)]}}}
|
||||
{:page {:block/name "date-many page" :properties {:date-many #{[:page (date-journal-title today)]
|
||||
;; {:page {:block/name "string page" :properties {:string "yolo"}}}
|
||||
;; {:page {:block/name "string-many page" :properties {:string-many #{"yee" "haw" "sir"}}}}
|
||||
;; {:page {:block/name "string-closed page" :properties {:string-closed (random-closed-value :string-closed)}}}
|
||||
;; {:page {:block/name "url page" :properties {:url "https://logseq.com"}}}
|
||||
;; {:page {:block/name "url-many page" :properties {:url-many #{"https://logseq.com" "https://docs.logseq.com"}}}}
|
||||
;; {:page {:block/name "url-closed page" :properties {:url-closed (random-closed-value :url-closed)}}}
|
||||
;; {:page {:block/name "checkbox page" :properties {:checkbox true}}}
|
||||
;; {:page {:block/name "number page" :properties {:number 5}}}
|
||||
;; {:page {:block/name "number-many page" :properties {:number-many #{5 10}}}}
|
||||
;; {:page {:block/name "number-closed page" :properties {:number-closed (random-closed-value :number-closed)}}}
|
||||
;; {:page {:block/name "page page" :properties {:page [:page "page 1"]}}}
|
||||
;; {:page {:block/name "page-many page" :properties {:page-many #{[:page "page 1"] [:page "page 2"]}}}}
|
||||
;; #_{:page {:block/name "page-closed page" :properties {:page-closed (random-closed-value :page-closed)}}}
|
||||
;; {:page {:block/name "date page" :properties {:date [:page (date-journal-title today)]}}}
|
||||
#_{:page {:block/name "date-many page" :properties {:date-many #{[:page (date-journal-title today)]
|
||||
[:page (date-journal-title yesterday)]}}}}
|
||||
#_{:page {:block/name "date-closed page" :properties {:date-closed (random-closed-value :date-closed)}}}
|
||||
{:page {:block/original-name "Page Property Queries"}
|
||||
#_{:page {:block/original-name "Page Property Queries"}
|
||||
:blocks
|
||||
[{:block/content "{{query (page-property :string \"yolo\")}}"}
|
||||
{:block/content "{{query (page-property :string-many \"haw\")}}"}
|
||||
@@ -176,7 +176,7 @@
|
||||
(into (mapv #(vector (keyword (str (name %) "-closed"))
|
||||
{:closed-values (closed-values-config (keyword (str (name %) "-closed")))
|
||||
:block/schema {:type %}})
|
||||
[:string :url :number #_:page #_:date]))
|
||||
[:string :url :number :page :date]))
|
||||
(into {}))}))
|
||||
|
||||
(def spec
|
||||
|
||||
Reference in New Issue
Block a user