Browse Source

fix: keep weekday/month/day for year/month/week unit

Tienson Qin 11 months ago
parent
commit
7175b2c53e
1 changed files with 46 additions and 16 deletions
  1. 46 16
      src/main/frontend/worker/commands.cljs

+ 46 - 16
src/main/frontend/worker/commands.cljs

@@ -93,31 +93,61 @@
 
 (defmulti handle-command (fn [action-id & _others] action-id))
 
+(defn- repeat-until-future-timestamp
+  [datetime delta keep-week?]
+  (let [now (t/now)]
+    (if (t/after? datetime now)
+      datetime
+      (let [datetime (t/plus datetime delta)
+            result (loop [result datetime]
+                     (if (t/after? result now)
+                       result
+                       (recur (t/plus result delta))))
+            w1 (t/day-of-week datetime)
+            w2 (t/day-of-week result)]
+        (if (and keep-week? (not= w1 w2))
+      ;; next week
+          (if (> w2 w1)
+            (t/plus result (t/days (- 7 (- w2 w1))))
+            (t/plus result (t/days (- w1 w2))))
+          result)))))
+
+(defn- get-next-time
+  [current-value unit frequency]
+  (let [current-date-time (tc/to-date-time current-value)
+        default-timezone-time (t/to-default-time-zone current-date-time)
+        interval (case (:db/ident unit)
+                   :logseq.task/recur-unit.minute t/minutes
+                   :logseq.task/recur-unit.hour t/hours
+                   :logseq.task/recur-unit.day t/days
+                   :logseq.task/recur-unit.week t/weeks
+                   :logseq.task/recur-unit.month t/months
+                   :logseq.task/recur-unit.year t/years)
+        delta (interval frequency)
+        next-time (case (:db/ident unit)
+                    :logseq.task/recur-unit.year
+                    (repeat-until-future-timestamp default-timezone-time delta false)
+                    :logseq.task/recur-unit.month
+                    (repeat-until-future-timestamp default-timezone-time delta false)
+                    :logseq.task/recur-unit.week
+                    (repeat-until-future-timestamp default-timezone-time delta true)
+                    (t/plus (t/now) delta))]
+    (tc/to-long next-time)))
+
 (defmethod handle-command :reschedule [_ db entity]
   (let [property-ident (or (:db/ident (:logseq.task/scheduled-on-property entity))
                            :logseq.task/scheduled)
-        property (when property-ident (d/entity db property-ident))
         frequency (db-property/property-value-content (:logseq.task/recur-frequency entity))
-        unit (:logseq.task/recur-unit entity)]
+        unit (:logseq.task/recur-unit entity)
+        current-value (get entity property-ident)]
     (when (and frequency unit)
-      (let [interval (case (:db/ident unit)
-                       :logseq.task/recur-unit.minute t/minutes
-                       :logseq.task/recur-unit.hour t/hours
-                       :logseq.task/recur-unit.day t/days
-                       :logseq.task/recur-unit.week t/weeks
-                       :logseq.task/recur-unit.month t/months
-                       :logseq.task/recur-unit.year t/years)
-            next-time (t/plus (t/now) (interval frequency))
-            next-time-long (tc/to-long next-time)
+      (let [next-time-long (get-next-time current-value unit frequency)
             journal-day (outliner-pipeline/get-journal-day-from-long db next-time-long)
             create-journal-page (when-not journal-day
                                   (let [formatter (:logseq.property.journal/title-format (d/entity db :logseq.class/Journal))
-                                        title (date-time-util/format (t/to-default-time-zone next-time) formatter)]
+                                        title (date-time-util/format (t/to-default-time-zone (tc/to-date-time next-time-long)) formatter)]
                                     (worker-db-page/create db title {:create-first-block? false})))
-            value (if (= :datetime (get-in property [:block/schema :type]))
-                    next-time-long
-                    (or journal-day
-                        [:block/uuid (:page-uuid create-journal-page)]))]
+            value next-time-long]
         (concat
          (:tx-data create-journal-page)
          (when value