Преглед изворни кода

enhance: datetime property support custom date filter

Tienson Qin пре 8 месеци
родитељ
комит
90c83b62fa
1 измењених фајлова са 58 додато и 29 уклоњено
  1. 58 29
      src/main/frontend/components/views.cljs

+ 58 - 29
src/main/frontend/components/views.cljs

@@ -3,6 +3,7 @@
   (:require [cljs-bean.core :as bean]
             [cljs-time.coerce :as tc]
             [cljs-time.core :as t]
+            [cljs-time.format :as tf]
             [clojure.set :as set]
             [clojure.string :as string]
             [datascript.impl.entity :as de]
@@ -667,29 +668,29 @@
     :label "3 months ago"}
    {:value "1 year ago"
     :label "1 year ago"}
-   ;; TODO: support date picker
-   ;; {:value "Custom time"
-   ;;  :label "Custom time"}
-   ])
+   {:value "Custom date"
+    :label "Custom date"}])
 
 (defn- get-timestamp
   [value]
   (let [now (t/now)
         f t/minus]
-    (case value
-      "1 day ago"
-      (tc/to-long (f now (t/days 1)))
-      "3 days ago"
-      (tc/to-long (f now (t/days 3)))
-      "1 week ago"
-      (tc/to-long (f now (t/weeks 1)))
-      "1 month ago"
-      (tc/to-long (f now (t/months 1)))
-      "3 months ago"
-      (tc/to-long (f now (t/months 3)))
-      "1 year ago"
-      (tc/to-long (f now (t/years 1)))
-      nil)))
+    (if (string? value)
+      (case value
+        "1 day ago"
+        (tc/to-long (f now (t/days 1)))
+        "3 days ago"
+        (tc/to-long (f now (t/days 3)))
+        "1 week ago"
+        (tc/to-long (f now (t/weeks 1)))
+        "1 month ago"
+        (tc/to-long (f now (t/months 1)))
+        "3 months ago"
+        (tc/to-long (f now (t/months 3)))
+        "1 year ago"
+        (tc/to-long (f now (t/years 1)))
+        nil)
+      (tc/to-long (tc/to-date value)))))
 
 (rum/defc filter-property < rum/static
   [columns {:keys [data-fns] :as table}]
@@ -732,11 +733,23 @@
                  (merge option
                         {:items timestamp-options
                          :input-default-placeholder (if property (:block/title property) "Select")
-                         :on-chosen (fn [value]
+                         :on-chosen (fn [value _ _ e]
                                       (shui/popup-hide!)
-                                      (let [filters' (conj (:filters filters) [(:db/ident property) :after value])]
-                                        (set-filters! {:or? (:or? filters)
-                                                       :filters filters'})))})
+                                      (let [set-filter-fn (fn [value]
+                                                            (let [filters' (conj (:filters filters) [(:db/ident property) :after value])]
+                                                              (set-filters! {:or? (:or? filters)
+                                                                             :filters filters'})))]
+                                        (if (= value "Custom date")
+                                          (shui/popup-show!
+                                           (.-target e)
+                                           (ui/nlp-calendar
+                                            {:initial-focus true
+                                             :datetime? false
+                                             :on-day-click (fn [value]
+                                                             (set-filter-fn value)
+                                                             (shui/popup-hide!))})
+                                           {})
+                                          (set-filter-fn value))))})
                  property
                  (if (= :checkbox (:logseq.property/type property))
                    (let [items [{:value true :label "true"}
@@ -925,16 +938,28 @@
                  :items items
                  :extract-fn :label
                  :extract-chosen-fn :value
-                 :on-chosen (fn [value _selected? selected]
+                 :on-chosen (fn [value _selected? selected e]
                               (when-not many?
                                 (shui/popup-hide!))
                               (let [value' (if many? selected value)
-                                    new-filters (update filters :filters
-                                                        (fn [col]
-                                                          (update col idx
-                                                                  (fn [[property operator _value]]
-                                                                    [property operator value']))))]
-                                (set-filters! new-filters)))}
+                                    set-filters-fn (fn [value']
+                                                     (let [new-filters (update filters :filters
+                                                                               (fn [col]
+                                                                                 (update col idx
+                                                                                         (fn [[property operator _value]]
+                                                                                           [property operator value']))))]
+                                                       (set-filters! new-filters)))]
+                                (if (= value "Custom date")
+                                  (shui/popup-show!
+                                   (.-target e)
+                                   (ui/nlp-calendar
+                                    {:initial-focus true
+                                     :datetime? false
+                                     :on-day-click (fn [value]
+                                                     (set-filters-fn value)
+                                                     (shui/popup-hide!))})
+                                   {})
+                                  (set-filters-fn value'))))}
                  many?
                  (assoc
                   :multiple-choices? true
@@ -949,6 +974,10 @@
        (let [value (cond
                      (uuid? value)
                      (db/entity [:block/uuid value])
+                     (instance? js/Date value)
+                     (some->> (tc/to-date value)
+                              (t/to-default-time-zone)
+                              (tf/unparse (tf/formatter "yyyy-MM-dd")))
                      (and (coll? value) (every? uuid? value))
                      (set (map #(db/entity [:block/uuid %]) value))
                      :else