瀏覽代碼

enhance(query table): click to edit and human-readable time

Tienson Qin 4 年之前
父節點
當前提交
962cd9fd7a

+ 57 - 29
src/main/frontend/components/block.cljs

@@ -2089,42 +2089,71 @@
                      result-atom)]
     (assoc state :query-atom query-atom)))
 
-(rum/defc query-result-table < rum/reactive
-  [config result {:keys [select-keys page?]}]
-  (let [editor-box (get config :editor-box)
-        all-keys (distinct (mapcat keys (map :block/properties result)))
+(rum/defcs query-result-table < rum/reactive
+  (rum/local false ::select?)
+  [state config result {:keys [select-keys page?]}]
+  (let [select? (get state ::select?)
+        editor-box (get config :editor-box)
+        ;; remove templates
+        result (remove (fn [b] (some? (get-in b [:block/properties :template]))) result)
+        all-keys (->> (distinct (mapcat keys (map :block/properties result)))
+                      (remove property/built-in-properties))
         keys (if (seq select-keys) select-keys all-keys)
-        keys (if page? (cons :page keys) keys)]
+        keys (if page? (cons :page keys) (cons :block keys))
+        keys (concat keys [:created-at :updated-at])]
     [:div.overflow-x-auto {:on-mouse-down (fn [e] (.stopPropagation e))
                            :style {:width "100%"}}
      [:table.table-auto
       (for [key keys]
         [:th.whitespace-nowrap (name key)])
       (for [item result]
-        [:tr {:on-click (fn [e]
-                          (when (gobj/get e "shiftKey")
-                            (state/sidebar-add-block!
-                             (state/get-current-repo)
-                             (:db/id item)
-                             :block-ref
-                             {:block item})))}
-         (let [format (:block/format item)]
+        (let [format (:block/format item)
+              edit-input-id (str "edit-block-" (:id config) "-" (:block/uuid item))
+              heading-level (:block/heading-level item)]
+          [:tr.cursor
            (for [key keys]
-             (let [value (if (= key :page)
-                           (or (:block/original-name item)
-                               (:block/name item))
-                           (get-in item [:block/properties key]))]
-               [:td.whitespace-nowrap
+             (let [value (case key
+                           :page
+                           [:string (or (:block/original-name item)
+                                        (:block/name item))]
+
+                           :block       ; block title
+                           (let [title (:block/title item)]
+                             (if (seq title)
+                               [:element (->elem :div (map-inline config title))]
+                               [:string (:block/content item)]))
+
+                           :created-at
+                           [:string (when-let [created-at (:block/created-at item)]
+                                      (date/int->local-time-2 created-at))]
+
+                           :updated-at
+                           [:string (when-let [updated-at (:block/updated-at item)]
+                                      (date/int->local-time-2 updated-at))]
+
+                           [:string (get-in item [:block/properties key])])]
+               [:td.whitespace-nowrap {:on-mouse-down (fn [] (reset! select? false))
+                                       :on-mouse-move (fn [] (reset! select? true))
+                                       :on-mouse-up (fn []
+                                                      (when-not @select?
+                                                        (state/sidebar-add-block!
+                                                         (state/get-current-repo)
+                                                         (:db/id item)
+                                                         :block-ref
+                                                         {:block item})))}
                 (when value
-                  (if (coll? value)
-                    (let [vals (for [item value]
-                                 (page-cp {} {:block/name item}))]
-                      (interpose [:span ", "] vals))
-                    (if (not (string? value))
-                      value
-                      (if-let [page (db/entity [:block/name (string/lower-case value)])]
-                        (page-cp {} page)
-                        (inline-text format value)))))])))])]]))
+                  (if (= :element (first value))
+                    (second value)
+                    (let [value (second value)]
+                      (if (coll? value)
+                        (let [vals (for [item value]
+                                     (page-cp {} {:block/name item}))]
+                          (interpose [:span ", "] vals))
+                        (if (not (string? value))
+                          value
+                          (if-let [page (db/entity [:block/name (string/lower-case value)])]
+                            (page-cp {} page)
+                            (inline-text format value)))))))]))]))]]))
 
 (rum/defcs custom-query < rum/reactive
   {:will-mount trigger-custom-query!
@@ -2183,8 +2212,7 @@
                              (editor-handler/set-block-property! current-block-uuid
                                                                  "query-table"
                                                                  (not table?)))
-                           true)]
-               [:span.ml-4.text-sm "Tip: Shift + Click a row to open its block in the right sidebar."]])]
+                           true)]])]
            (cond
              (and (seq result) view-f)
              (let [result (try

+ 16 - 13
src/main/frontend/components/editor.cljs

@@ -386,24 +386,27 @@
 (def starts-with? clojure.string/starts-with?)
 
 (defn get-editor-heading-class [content]
-  (cond
-    (string/includes? content "\n") "multiline-block"
-    (starts-with? content "# ") "h1"
-    (starts-with? content "## ") "h2"
-    (starts-with? content "### ") "h3"
-    (starts-with? content "#### ") "h4"
-    (starts-with? content "##### ") "h5"
-    (starts-with? content "###### ") "h6"
-    (starts-with? content "TODO ") "todo-block"
-    (starts-with? content "DOING ") "doing-block"
-    (starts-with? content "DONE ") "done-block"
-    :else "normal-block"))
+  (let [content (if content (str content) "")]
+    (cond
+     (string/includes? content "\n") "multiline-block"
+     (starts-with? content "# ") "h1"
+     (starts-with? content "## ") "h2"
+     (starts-with? content "### ") "h3"
+     (starts-with? content "#### ") "h4"
+     (starts-with? content "##### ") "h5"
+     (starts-with? content "###### ") "h6"
+     (starts-with? content "TODO ") "todo-block"
+     (starts-with? content "DOING ") "doing-block"
+     (starts-with? content "DONE ") "done-block"
+     :else "normal-block")))
 
 (rum/defc mock-textarea
   < rum/reactive
   {:did-update
    (fn [state]
-     (editor-handler/handle-last-input)
+     (try (editor-handler/handle-last-input)
+          (catch js/Error _e
+            nil))
      state)}
   []
   [:div#mock-text

+ 2 - 2
src/main/frontend/components/page.cljs

@@ -734,8 +734,8 @@
                       (block/page-cp {} page)]]
                 [:td [:span.text-gray-500.text-sm backlinks]]
                 [:td [:span.text-gray-500.text-sm (if created-at
-                                                    (date/int->local-time created-at)
+                                                    (date/int->local-time-2 created-at)
                                                     "Unknown")]]
                 [:td [:span.text-gray-500.text-sm (if updated-at
-                                                    (date/int->local-time updated-at)
+                                                    (date/int->local-time-2 updated-at)
                                                     "Unknown")]]])]]))])))

+ 6 - 0
src/main/frontend/date.cljs

@@ -218,6 +218,12 @@
   [n]
   (get-date-time-string (t/to-default-time-zone (tc/from-long n))))
 
+(defn int->local-time-2
+  [n]
+  (tf/unparse
+   (tf/formatter "yyyy-MM-dd HH:mm")
+   (t/to-default-time-zone (tc/from-long n))))
+
 (comment
   (def default-formatter (tf/formatter "MMM do, yyyy"))
   (def zh-formatter (tf/formatter "YYYY年MM月dd日"))

+ 19 - 18
src/main/frontend/handler/editor.cljs

@@ -819,24 +819,25 @@
                                            (let [block (db/entity [:block/uuid block-id])]
                                              (seq (:block/_parent block)))))]
              (when-not (and has-children? left-has-children?)
-               (let [block-parent (gdom/getElement block-parent-id)
-                     sibling-block (util/get-prev-block-non-collapsed block-parent)]
-                 (delete-block-aux! block delete-children?)
-                 (when (and repo sibling-block)
-                   (when-let [sibling-block-id (dom/attr sibling-block "blockid")]
-                     (when-let [block (db/pull repo '[*] [:block/uuid (uuid sibling-block-id)])]
-                       (let [original-content (util/trim-safe (:block/content block))
-                             new-value (str original-content " " (string/triml value))
-                             tail-len (count (string/triml value))
-                             pos (max
-                                  (if original-content
-                                    (utf8/length (utf8/encode original-content))
-                                    0)
-                                  0)]
-                         (edit-block! block pos format id
-                                      {:custom-content new-value
-                                       :tail-len tail-len
-                                       :move-cursor? false}))))))))))))
+               (when block-parent-id
+                 (let [block-parent (gdom/getElement block-parent-id)
+                       sibling-block (util/get-prev-block-non-collapsed block-parent)]
+                   (delete-block-aux! block delete-children?)
+                   (when (and repo sibling-block)
+                     (when-let [sibling-block-id (dom/attr sibling-block "blockid")]
+                       (when-let [block (db/pull repo '[*] [:block/uuid (uuid sibling-block-id)])]
+                         (let [original-content (util/trim-safe (:block/content block))
+                               new-value (str original-content " " (string/triml value))
+                               tail-len (count (string/triml value))
+                               pos (max
+                                    (if original-content
+                                      (utf8/length (utf8/encode original-content))
+                                      0)
+                                    0)]
+                           (edit-block! block pos format id
+                                        {:custom-content new-value
+                                         :tail-len tail-len
+                                         :move-cursor? false})))))))))))))
    (state/set-editor-op! nil)))
 
 (defn- get-end-block-parent