Răsfoiți Sursa

fix: import not handling scheduled and deadline property

on same block. Fixes https://github.com/logseq/db-test/issues/318
Gabriel Horner 4 luni în urmă
părinte
comite
fdff75cdf8

+ 31 - 23
deps/graph-parser/src/logseq/graph_parser/exporter.cljs

@@ -310,33 +310,41 @@
           (dissoc :block/priority)))
     block))
 
-(defn- update-block-deadline
-  ":block/title doesn't contain DEADLINE.* text so unable to detect timestamp
-  or repeater usage and notify user that they aren't supported"
-  [block page-names-to-uuids {:keys [user-config]}]
-  (if-let [date-int (or (:block/deadline block) (:block/scheduled block))]
-    (let [title (date-time-util/int->journal-title date-int (common-config/get-date-formatter user-config))
-          existing-journal-page (some->> title
-                                         common-util/page-name-sanity-lc
-                                         (get @page-names-to-uuids)
-                                         (hash-map :block/uuid))
-          deadline-page (->
-                         (or existing-journal-page
-                            ;; FIXME: Register new pages so that two different refs to same new page
-                            ;; don't create different uuids and thus an invalid page
+(defn- find-or-create-deadline-scheduled-value
+  "Given a :block/scheduled or :block/deadline value, creates the datetime property value
+   and any optional journal tx associated with that value"
+  [date-int page-names-to-uuids user-config]
+  (let [title (date-time-util/int->journal-title date-int (common-config/get-date-formatter user-config))
+        existing-journal-page (some->> title
+                                       common-util/page-name-sanity-lc
+                                       (get @page-names-to-uuids)
+                                       (hash-map :block/uuid))
+        journal-page (-> (or existing-journal-page
                              (let [page-m (sqlite-util/build-new-page title)]
                                (assoc page-m
                                       :block/uuid (common-uuid/gen-uuid :journal-page-uuid date-int)
                                       :block/journal-day date-int)))
                          (assoc :block/tags #{:logseq.class/Journal}))
-          time-long (tc/to-long (date-time-util/int->local-date date-int))
-          datetime-property (if (:block/deadline block) :logseq.property/deadline :logseq.property/scheduled)]
-      {:block
-       (-> block
-           (assoc datetime-property time-long)
-           (dissoc :block/deadline :block/scheduled :block/repeated?))
-       :properties-tx (when-not existing-journal-page [deadline-page])})
-    {:block block :properties-tx []}))
+        time-long (tc/to-long (date-time-util/int->local-date date-int))]
+    {:property-value time-long
+     :journal-tx (when-not existing-journal-page [journal-page])}))
+
+(defn- update-block-deadline-and-scheduled
+  "Converts :block/deadline and :block/scheduled to their new logseq properties."
+  [block page-names-to-uuids {:keys [user-config]}]
+  (let [{deadline-value :property-value deadline-tx :journal-tx}
+        (when (:block/deadline block)
+          (find-or-create-deadline-scheduled-value (:block/deadline block) page-names-to-uuids user-config))
+        {scheduled-value :property-value scheduled-tx :journal-tx}
+        (when (:block/scheduled block)
+          (find-or-create-deadline-scheduled-value (:block/scheduled block) page-names-to-uuids user-config))]
+    {:block
+     (cond-> (dissoc block :block/deadline :block/scheduled :block/repeated?)
+       (some? deadline-value)
+       (assoc :logseq.property/deadline deadline-value)
+       (some? scheduled-value)
+       (assoc :logseq.property/scheduled scheduled-value))
+     :properties-tx (distinct (concat deadline-tx scheduled-tx))}))
 
 (defn- text-with-refs?
   "Detects if a property value has text with refs e.g. `#Logseq is #awesome`
@@ -1032,7 +1040,7 @@
   (let [;; needs to come before update-block-refs to detect new property schemas
         {:keys [block properties-tx]}
         (handle-block-properties block* db page-names-to-uuids (:block/refs block*) options)
-        {block-after-built-in-props :block deadline-properties-tx :properties-tx} (update-block-deadline block page-names-to-uuids options)
+        {block-after-built-in-props :block deadline-properties-tx :properties-tx} (update-block-deadline-and-scheduled block page-names-to-uuids options)
         {block-after-assets :block :keys [asset-blocks-tx]}
         (handle-assets-in-block block-after-built-in-props (select-keys import-state [:assets :ignored-assets]))
         ;; :block/page should be [:block/page NAME]

+ 5 - 4
deps/graph-parser/test/logseq/graph_parser/exporter_test.cljs

@@ -331,10 +331,11 @@
                  date-time-util/ms->journal-day))
           "deadline block has correct journal as property value")
 
-      (is (= 20221125
-             (-> (db-test/readable-properties (db-test/find-block-by-content @conn "only scheduled"))
-                 :logseq.property/scheduled
-                 date-time-util/ms->journal-day))
+      (is (= {:logseq.property/scheduled 20221125
+              :logseq.property/deadline 20221125}
+             (-> (db-test/readable-properties (db-test/find-block-by-content @conn #"deadline and scheduled"))
+                 (select-keys [:logseq.property/scheduled :logseq.property/deadline])
+                 (update-vals date-time-util/ms->journal-day)))
           "scheduled block converted to correct deadline")
 
       (is (= 1 (count (d/q '[:find [(pull ?b [*]) ...]

+ 2 - 1
deps/graph-parser/test/resources/exporter-test-graph/journals/2024_04_01.md

@@ -1,7 +1,8 @@
 - only deadline
   id:: 669168ed-8734-4943-8a86-5e3a553a526d
   DEADLINE: <2022-11-26 Sat>
-- only scheduled
+- deadline and scheduled, also tests using same day on one block
+  DEADLINE: <2022-11-25 Sat>
   SCHEDULED: <2022-11-25 Fri .+1d>
 - [#A] high priority
 - DOING [#B] status test