-
-
Notifications
You must be signed in to change notification settings - Fork 1.8k
/
query_table.cljs
125 lines (117 loc) · 5.56 KB
/
query_table.cljs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
(ns frontend.components.query-table
(:require [frontend.ui :as ui]
[frontend.util :as util]
[rum.core :as rum]
[frontend.util.property :as property]
[frontend.db :as db]
[frontend.date :as date]
[frontend.state :as state]
[clojure.string :as string]
[frontend.components.svg :as svg]
[frontend.handler.common :as common-handler]))
;; TODO: extract to table utils
(defn- sort-result-by
[by-item desc? result]
(def result result)
(def by-item by-item)
(def desc? desc?)
(let [comp (if desc? > <)]
(sort-by by-item comp result)))
(rum/defc sortable-title
[title key by-item desc?]
[:th.whitespace-nowrap
[:a {:on-click (fn []
(reset! by-item key)
(swap! desc? not))}
[:div.flex.items-center
[:span.mr-1 title]
(when (= @by-item key)
[:span
(if @desc? (svg/caret-down) (svg/caret-up))])]]])
(defn get-keys
[result page?]
(let [keys (->> (distinct (mapcat keys (map :block/properties result)))
(remove property/built-in-properties)
(remove #{:template}))
keys (if page? (cons :page keys) (cons :block keys))
keys (concat keys [:created-at :updated-at])]
keys))
(rum/defcs result-table < rum/reactive
(rum/local :updated-at ::sort-by-item)
(rum/local true ::desc?)
(rum/local false ::select?)
[state config current-block result {:keys [page?]} map-inline page-cp ->elem inline-text]
(when current-block
(let [select? (get state ::select?)
*sort-by-item (get state ::sort-by-item)
*desc? (get state ::desc?)
editor-box (get config :editor-box)
;; remove templates
result (remove (fn [b] (some? (get-in b [:block/properties :template]))) result)
query-properties (some-> (get-in current-block [:block/properties :query-properties] "")
(common-handler/safe-read-string "Parsing query properties failed"))
keys (if (seq query-properties)
query-properties
(get-keys result page?))
sort-by-fn (fn [item]
(let [key @*sort-by-item]
(case key
:created-at
(:block/created-at item)
:updated-at
(:block/updated-at item)
:block
(:block/content item)
:page
(:block/name item)
(get-in item [:block/properties key]))))
result (sort-result-by sort-by-fn @*desc? result)]
[:div.overflow-x-auto {:on-mouse-down (fn [e] (.stopPropagation e))
:style {:width "100%"}}
[:table.table-auto
(for [key keys]
(sortable-title (name key) key *sort-by-item *desc?))
(for [item result]
(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 (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 (= :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)))))))]))]))]])))