Skip to content

Commit 60b8e92

Browse files
committed
fix(mobile): foldable control
1 parent 1caefae commit 60b8e92

5 files changed

Lines changed: 116 additions & 47 deletions

File tree

src/main/frontend/components/page.cljs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -701,7 +701,8 @@
701701
:whiteboard? whiteboard?}))])])
702702

703703
(when-not preview?
704-
[:div.ml-1.flex.flex-col.gap-8
704+
[:div.flex.flex-col.gap-8
705+
{:class (when-not (util/mobile?) "ml-1")}
705706
(when today?
706707
(today-queries repo today? sidebar?))
707708

src/main/frontend/components/views.cljs

Lines changed: 40 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2002,6 +2002,39 @@
20022002

20032003
(when (and db-based? add-new-object!) (new-record-button table view-entity))]]))
20042004

2005+
(rum/defc group-item
2006+
[view-entity table' group group-by-property value option view-opts {:keys [list-view? group-by-page? readable-property-value]}]
2007+
(let [title [:div
2008+
{:class (when-not list-view? "my-2")}
2009+
(cond
2010+
group-by-page?
2011+
(if value
2012+
(let [c (state/get-component :block/page-cp)]
2013+
(c {:disable-preview? true} value))
2014+
[:div.text-muted-foreground.text-sm
2015+
"Pages"])
2016+
2017+
(some? value)
2018+
(let [icon (pu/get-block-property-value value :logseq.property/icon)]
2019+
[:div.flex.flex-row.gap-1.items-center
2020+
(when icon (icon-component/icon icon {:color? true}))
2021+
(readable-property-value value)])
2022+
:else
2023+
(str "No " (:block/title group-by-property)))]
2024+
body-fn (fn []
2025+
(let [render (view-cp view-entity
2026+
(assoc table' :rows group)
2027+
(assoc option
2028+
;; disabled virtualization for nested view
2029+
:disable-virtualized? true)
2030+
view-opts)]
2031+
(if (and list-view? (not (util/mobile?)))
2032+
[:div.-ml-2 render]
2033+
render)))]
2034+
(if (util/mobile?)
2035+
[:div.flex.flex-1.flex-col title (body-fn)]
2036+
(ui/foldable title body-fn {:title-trigger? false}))))
2037+
20052038
(rum/defc ^:large-vars/cleanup-todo view-inner < rum/static
20062039
[view-entity {:keys [view-parent data full-data set-data! columns add-new-object! foldable-options input set-input! sorting set-sorting! filters set-filters! display-type group-by-property-ident config] :as option*}
20072040
*scroller-ref]
@@ -2121,36 +2154,14 @@
21212154
:else
21222155
(str %))
21232156
group-by-page? (or (= :block/page group-by-property-ident)
2124-
(and (not db-based?) (contains? #{:linked-references :unlinked-references} display-type)))]
2157+
(and (not db-based?) (contains? #{:linked-references :unlinked-references} display-type)))
2158+
key (str (:db/id view-entity) "-group-idx-" idx)]
21252159
(rum/with-key
2126-
(ui/foldable
2127-
[:div
2128-
{:class (when-not list-view? "my-2")}
2129-
(cond
2130-
group-by-page?
2131-
(if value
2132-
(let [c (state/get-component :block/page-cp)]
2133-
(c {:disable-preview? true} value))
2134-
[:div.text-muted-foreground.text-sm
2135-
"Pages"])
2136-
2137-
(some? value)
2138-
(let [icon (pu/get-block-property-value value :logseq.property/icon)]
2139-
[:div.flex.flex-row.gap-1.items-center
2140-
(when icon (icon-component/icon icon {:color? true}))
2141-
(readable-property-value value)])
2142-
:else
2143-
(str "No " (:block/title group-by-property)))]
2144-
(fn []
2145-
(let [render (view-cp view-entity
2146-
(assoc table' :rows group)
2147-
(assoc option
2148-
;; disabled virtualization for nested view
2149-
:disable-virtualized? true)
2150-
view-opts)]
2151-
(if list-view? [:div.-ml-2 render] render)))
2152-
{:title-trigger? false})
2153-
(str (:db/id view-entity) "-group-idx-" idx))))}
2160+
(group-item view-entity table' group group-by-property value option view-opts
2161+
{:list-view? list-view?
2162+
:group-by-page? group-by-page?
2163+
:readable-property-value readable-property-value})
2164+
key)))}
21542165
disable-virtualized?)])
21552166
(view-cp view-entity table
21562167
(assoc option

src/main/frontend/ui.cljs

Lines changed: 44 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -628,38 +628,62 @@
628628
(let [^js target (.-target e)]
629629
(when (some-> target (.closest ".as-toggle"))
630630
(reset! collapsed? (not @collapsed?)))))}
631-
(when-not (mobile-util/native-platform?)
632-
(let [style {:width 14 :height 16}]
633-
[:a.ls-foldable-title-control.block-control.opacity-50.hover:opacity-100
634-
(cond->
635-
{:style style}
636-
(not title-trigger?)
637-
(assoc :on-pointer-down on-pointer-down))
638-
[:span {:class (if (or @control? @collapsed?) "control-show cursor-pointer" "control-hide")}
639-
(rotating-arrow @collapsed?)]]))
631+
(let [style {:width 14 :height 16}]
632+
[:a.ls-foldable-title-control.block-control.opacity-50.hover:opacity-100
633+
(cond->
634+
{:style style}
635+
(not title-trigger?)
636+
(assoc :on-pointer-down on-pointer-down))
637+
[:span {:class (if (or @control? @collapsed? (util/mobile?))
638+
"control-show cursor-pointer"
639+
"control-hide")}
640+
(rotating-arrow @collapsed?)]])
640641
(if (fn? header)
641642
(header @collapsed?)
642643
header)]]]))
643644

644645
(rum/defcs foldable < db-mixins/query rum/reactive
645646
(rum/local false ::collapsed?)
647+
(rum/local true ::render-content?)
648+
(rum/local nil ::collapse-timeout)
646649
{:will-mount (fn [state]
647650
(let [args (:rum/args state)]
648651
(when (true? (:default-collapsed? (last args)))
649-
(reset! (get state ::collapsed?) true)))
652+
(reset! (get state ::collapsed?) true)
653+
(reset! (get state ::render-content?) false)))
650654
state)
655+
:will-unmount (fn [state]
656+
(when-let [timeout-id @(get state ::collapse-timeout)]
657+
(js/clearTimeout timeout-id))
658+
state)
651659
:did-mount (fn [state]
652660
(when-let [f (:init-collapsed (last (:rum/args state)))]
653661
(f (::collapsed? state)))
654662
state)}
655663
[state header content {:keys [title-trigger? on-pointer-down class
656664
_default-collapsed? _init-collapsed]}]
657665
(let [collapsed? (get state ::collapsed?)
666+
render-content? (get state ::render-content?)
667+
collapse-timeout (get state ::collapse-timeout)
668+
transition-ms 200
658669
on-pointer-down (fn [e]
659670
(util/stop e)
660-
(swap! collapsed? not)
661-
(when on-pointer-down
662-
(on-pointer-down @collapsed?)))]
671+
(let [next-collapsed? (not @collapsed?)]
672+
(when-let [timeout-id @collapse-timeout]
673+
(js/clearTimeout timeout-id)
674+
(reset! collapse-timeout nil))
675+
(when (false? next-collapsed?)
676+
(reset! render-content? true))
677+
(reset! collapsed? next-collapsed?)
678+
(when (true? next-collapsed?)
679+
(reset! collapse-timeout
680+
(js/setTimeout
681+
(fn []
682+
(reset! render-content? false)
683+
(reset! collapse-timeout nil))
684+
transition-ms)))
685+
(when on-pointer-down
686+
(on-pointer-down next-collapsed?))))]
663687
[:div.flex.flex-col
664688
{:class class}
665689
(foldable-title {:on-pointer-down on-pointer-down
@@ -668,10 +692,13 @@
668692
:collapsed? collapsed?})
669693
;; Don't stop propagation for the pointer down event to the high level content container.
670694
;; That may cause the drag function to not work.
671-
[:div {:class (if @collapsed? "hidden" "initial")}
672-
(if (fn? content)
673-
(if (not @collapsed?) (content) nil)
674-
content)]]))
695+
[:div.ls-foldable-content
696+
{:class (when @collapsed? "is-collapsed")
697+
:aria-hidden (boolean @collapsed?)}
698+
[:div.ls-foldable-content-inner
699+
(if (fn? content)
700+
(when @render-content? (content))
701+
content)]]]))
675702

676703
(rum/defc admonition
677704
[type content]

src/main/frontend/ui.css

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,29 @@ input[type='range'] {
352352
margin-left: -27px;
353353
}
354354

355+
.ls-foldable-content {
356+
display: grid;
357+
grid-template-rows: 1fr;
358+
transition: grid-template-rows 200ms ease-in-out;
359+
360+
.ls-foldable-content-inner {
361+
overflow: hidden;
362+
opacity: 1;
363+
transform: translateY(0);
364+
transition: opacity 200ms ease-in-out, transform 200ms ease-in-out;
365+
}
366+
367+
&.is-collapsed {
368+
grid-template-rows: 0fr;
369+
370+
.ls-foldable-content-inner {
371+
opacity: 0;
372+
transform: translateY(-2px);
373+
pointer-events: none;
374+
}
375+
}
376+
}
377+
355378
.ls-nlp-calendar {
356379
@apply flex flex-col gap-2 relative;
357380
}

src/main/mobile/components/app.css

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,3 +375,10 @@ div[data-radix-menu-content] {
375375
width: 0.45em;
376376
height: 0.45em;
377377
}
378+
379+
.ls-foldable-title {
380+
margin-left: -5px;
381+
}
382+
.ls-foldable-title-control {
383+
margin-left: 0px;
384+
}

0 commit comments

Comments
 (0)