|
|
@@ -31,27 +31,28 @@
|
|
|
(p/let [_ (loader/load :tldraw)]
|
|
|
(reset! tldraw-loaded? true))
|
|
|
state)}
|
|
|
- [name shape-id]
|
|
|
+ [page-uuid shape-id]
|
|
|
(let [loaded? (rum/react tldraw-loaded?)
|
|
|
draw-component (when loaded?
|
|
|
(resolve 'frontend.extensions.tldraw/tldraw-app))]
|
|
|
(when draw-component
|
|
|
- (draw-component name shape-id))))
|
|
|
+ (draw-component page-uuid shape-id))))
|
|
|
|
|
|
(rum/defc tldraw-preview < rum/reactive
|
|
|
{:init (fn [state]
|
|
|
(p/let [_ (loader/load :tldraw)]
|
|
|
(reset! tldraw-loaded? true))
|
|
|
- (let [page-name (first (:rum/args state))]
|
|
|
- (db-async/<get-block (state/get-current-repo) page-name))
|
|
|
+ (let [page-uuid (first (:rum/args state))]
|
|
|
+ (db-async/<get-block (state/get-current-repo) page-uuid))
|
|
|
state)}
|
|
|
- [page-name]
|
|
|
- (let [loaded? (rum/react tldraw-loaded?)
|
|
|
- tldr (whiteboard-handler/page-name->tldr! page-name)
|
|
|
- generate-preview (when loaded?
|
|
|
- (resolve 'frontend.extensions.tldraw/generate-preview))]
|
|
|
- (when (and generate-preview (not (state/sub-async-query-loading page-name)))
|
|
|
- (generate-preview tldr))))
|
|
|
+ [page-uuid]
|
|
|
+ (when page-uuid
|
|
|
+ (let [loaded? (rum/react tldraw-loaded?)
|
|
|
+ tldr (whiteboard-handler/get-page-tldr page-uuid)
|
|
|
+ generate-preview (when loaded?
|
|
|
+ (resolve 'frontend.extensions.tldraw/generate-preview))]
|
|
|
+ (when (and generate-preview (not (state/sub-async-query-loading page-uuid)))
|
|
|
+ (generate-preview tldr)))))
|
|
|
|
|
|
;; TODO: use frontend.ui instead of making a new one
|
|
|
(rum/defc dropdown
|
|
|
@@ -123,37 +124,30 @@
|
|
|
hover?
|
|
|
portal?]
|
|
|
:or {portal? true}}]
|
|
|
- (let [page-entity (model/get-page page-name-or-uuid)
|
|
|
- page (model/sub-block (:db/id page-entity))
|
|
|
- block-uuid (:block/uuid page-entity)
|
|
|
- refs-count (count (:block/_refs page))]
|
|
|
- (when (> refs-count 0)
|
|
|
- (dropdown-menu {:classname classname
|
|
|
- :label (fn [open?]
|
|
|
- [:div.inline-flex.items-center.gap-2
|
|
|
- [:div.open-page-ref-link refs-count]
|
|
|
- (when render-fn (render-fn open? refs-count))])
|
|
|
- :hover? hover?
|
|
|
- :portal? portal?
|
|
|
- :children (reference/block-linked-references block-uuid)})))))
|
|
|
-
|
|
|
-(defn- get-page-display-name
|
|
|
- [page-name]
|
|
|
- (let [page-entity (model/get-page page-name)]
|
|
|
- (or
|
|
|
- (:block/original-name page-entity)
|
|
|
- page-name)))
|
|
|
+ (when page-name-or-uuid
|
|
|
+ (let [page-entity (model/get-page page-name-or-uuid)
|
|
|
+ page (model/sub-block (:db/id page-entity))
|
|
|
+ block-uuid (:block/uuid page-entity)
|
|
|
+ refs-count (count (:block/_refs page))]
|
|
|
+ (when (> refs-count 0)
|
|
|
+ (dropdown-menu {:classname classname
|
|
|
+ :label (fn [open?]
|
|
|
+ [:div.inline-flex.items-center.gap-2
|
|
|
+ [:div.open-page-ref-link refs-count]
|
|
|
+ (when render-fn (render-fn open? refs-count))])
|
|
|
+ :hover? hover?
|
|
|
+ :portal? portal?
|
|
|
+ :children (reference/block-linked-references block-uuid)}))))))
|
|
|
|
|
|
;; This is not accurate yet
|
|
|
(defn- get-page-human-update-time
|
|
|
- [page-name]
|
|
|
- (let [page-entity (model/get-page page-name)
|
|
|
- {:block/keys [updated-at created-at]} page-entity]
|
|
|
+ [page]
|
|
|
+ (let [{:block/keys [updated-at created-at]} page]
|
|
|
(str (if (= created-at updated-at) (t :whiteboard/dashboard-card-created) (t :whiteboard/dashboard-card-edited))
|
|
|
(util/time-ago (js/Date. updated-at)))))
|
|
|
|
|
|
(rum/defc dashboard-preview-card
|
|
|
- [page-name {:keys [checked on-checked-change show-checked?]}]
|
|
|
+ [whiteboard {:keys [checked on-checked-change show-checked?]}]
|
|
|
[:div.dashboard-card.dashboard-preview-card.cursor-pointer.hover:shadow-lg
|
|
|
{:data-checked checked
|
|
|
:style {:filter (if (and show-checked? (not checked)) "opacity(0.5)" "none")}
|
|
|
@@ -162,13 +156,13 @@
|
|
|
(util/stop e)
|
|
|
(if show-checked?
|
|
|
(on-checked-change (not checked))
|
|
|
- (route-handler/redirect-to-page! page-name)))}
|
|
|
+ (route-handler/redirect-to-page! (:block/uuid whiteboard))))}
|
|
|
[:div.dashboard-card-title
|
|
|
[:div.flex.w-full.items-center
|
|
|
[:div.dashboard-card-title-name.font-bold
|
|
|
- (if (model/untitled-page? page-name)
|
|
|
+ (if (common-util/uuid-string? (:block/name whiteboard))
|
|
|
[:span.opacity-50 (t :untitled)]
|
|
|
- (get-page-display-name page-name))]
|
|
|
+ (:block/original-name whiteboard))]
|
|
|
[:div.flex-1]
|
|
|
[:div.dashboard-card-checkbox
|
|
|
{:tab-index -1
|
|
|
@@ -177,12 +171,12 @@
|
|
|
(ui/checkbox {:value checked
|
|
|
:on-change (fn [] (on-checked-change (not checked)))})]]
|
|
|
[:div.flex.w-full.opacity-50
|
|
|
- [:div (get-page-human-update-time page-name)]
|
|
|
+ [:div (get-page-human-update-time whiteboard)]
|
|
|
[:div.flex-1]
|
|
|
- (references-count page-name nil {:hover? true})]]
|
|
|
+ (references-count (:block/uuid whiteboard) nil {:hover? true})]]
|
|
|
(ui/lazy-visible
|
|
|
(fn [] [:div.p-4.h-64.flex.justify-center
|
|
|
- (tldraw-preview page-name)]))])
|
|
|
+ (tldraw-preview (:block/uuid whiteboard))]))])
|
|
|
|
|
|
(rum/defc dashboard-create-card
|
|
|
[]
|
|
|
@@ -201,7 +195,6 @@
|
|
|
(let [whiteboards (->> (model/get-all-whiteboards (state/get-current-repo))
|
|
|
(sort-by :block/updated-at)
|
|
|
reverse)
|
|
|
- whiteboard-names (map :block/name whiteboards)
|
|
|
[ref rect] (use-bounding-client-rect)
|
|
|
[container-width] (when rect [(.-width rect) (.-height rect)])
|
|
|
cols (cond (< container-width 600) 1
|
|
|
@@ -211,8 +204,8 @@
|
|
|
total-whiteboards (count whiteboards)
|
|
|
empty-cards (- (max (* (math/ceil (/ (inc total-whiteboards) cols)) cols) (* 2 cols))
|
|
|
(inc total-whiteboards))
|
|
|
- [checked-page-names set-checked-page-names] (rum/use-state #{})
|
|
|
- has-checked? (not-empty checked-page-names)]
|
|
|
+ [checked-page-ids set-checked-page-ids] (rum/use-state #{})
|
|
|
+ has-checked? (not-empty checked-page-ids)]
|
|
|
[:<>
|
|
|
[:h1.select-none.flex.items-center.whiteboard-dashboard-title.title
|
|
|
[:div (t :all-whiteboards)
|
|
|
@@ -221,14 +214,14 @@
|
|
|
[:div.flex-1]
|
|
|
(when has-checked?
|
|
|
(ui/button
|
|
|
- (count checked-page-names)
|
|
|
+ (count checked-page-ids)
|
|
|
{:icon "trash"
|
|
|
:on-click
|
|
|
(fn []
|
|
|
(state/set-modal! (page/batch-delete-dialog
|
|
|
- (map (fn [name]
|
|
|
- (some (fn [w] (when (= (:block/name w) name) w)) whiteboards))
|
|
|
- checked-page-names)
|
|
|
+ (map (fn [id]
|
|
|
+ (some (fn [w] (when (= (:db/id w) id) w)) whiteboards))
|
|
|
+ checked-page-ids)
|
|
|
false route-handler/redirect-to-whiteboard-dashboard!)))}))]
|
|
|
[:div
|
|
|
{:ref ref}
|
|
|
@@ -236,15 +229,16 @@
|
|
|
{:style {:visibility (when (nil? container-width) "hidden")
|
|
|
:grid-template-columns (str "repeat(" cols ", minmax(0, 1fr))")}}
|
|
|
(when-not config/publishing? (dashboard-create-card))
|
|
|
- (for [whiteboard-name whiteboard-names]
|
|
|
- [:<> {:key whiteboard-name}
|
|
|
- (dashboard-preview-card whiteboard-name
|
|
|
- {:show-checked? has-checked?
|
|
|
- :checked (boolean (checked-page-names whiteboard-name))
|
|
|
- :on-checked-change (fn [checked]
|
|
|
- (set-checked-page-names (if checked
|
|
|
- (conj checked-page-names whiteboard-name)
|
|
|
- (disj checked-page-names whiteboard-name))))})])
|
|
|
+ (for [whiteboard whiteboards]
|
|
|
+ (let [id (:db/id whiteboard)]
|
|
|
+ [:<> {:key (str id)}
|
|
|
+ (dashboard-preview-card whiteboard
|
|
|
+ {:show-checked? has-checked?
|
|
|
+ :checked (boolean (checked-page-ids id))
|
|
|
+ :on-checked-change (fn [checked]
|
|
|
+ (set-checked-page-ids (if checked
|
|
|
+ (conj checked-page-ids id)
|
|
|
+ (disj checked-page-ids id))))})]))
|
|
|
(for [n (range empty-cards)]
|
|
|
[:div.dashboard-card.dashboard-bg-card {:key n}])]]])
|
|
|
[:div "This feature is not publicly available yet."]))
|
|
|
@@ -277,14 +271,14 @@
|
|
|
(page/page-title page {:*hover? (atom false)})]
|
|
|
|
|
|
[:div.whiteboard-page-refs
|
|
|
- (references-count (:block/original-name page)
|
|
|
+ (references-count (:block/uuid page)
|
|
|
"text-md px-3 py-2 cursor-default whiteboard-page-refs-count"
|
|
|
{:hover? true
|
|
|
:render-fn (fn [open? refs-count] [:span.whiteboard-page-refs-count-label
|
|
|
(t :whiteboard/reference-count refs-count)
|
|
|
(ui/icon (if open? "references-hide" "references-show")
|
|
|
{:extension? true})])})]]
|
|
|
- (tldraw-app (:block/original-name page) block-id)]))
|
|
|
+ (tldraw-app page-uuid block-id)]))
|
|
|
|
|
|
(rum/defc whiteboard-route <
|
|
|
(shortcut/mixin :shortcut.handler/whiteboard false)
|