From 30f615647edabefd4cb4828ef65b4f4def686edc Mon Sep 17 00:00:00 2001 From: budaeva <47611627+budaeva@users.noreply.github.com> Date: Wed, 1 Jun 2022 16:17:07 +0700 Subject: [PATCH] fix jump to date (#1970) Signed-off-by: budaeva --- .../src/components/Channel.svelte | 46 ++++++++++++------- .../src/components/JumpToDateSelector.svelte | 9 +++- 2 files changed, 37 insertions(+), 18 deletions(-) diff --git a/plugins/chunter-resources/src/components/Channel.svelte b/plugins/chunter-resources/src/components/Channel.svelte index b9a19f38c7..4887450cca 100644 --- a/plugins/chunter-resources/src/components/Channel.svelte +++ b/plugins/chunter-resources/src/components/Channel.svelte @@ -130,13 +130,15 @@ const dateSelectors = div?.getElementsByClassName('dateSelector') if (!dateSelectors) return - let closestDate: Timestamp | undefined = Array.from(dateSelectors).reduceRight((prevDate, cur) => { - const curDate = parseInt(cur.id) - if (prevDate < date) return curDate - if (curDate < date) return prevDate - if (curDate - date < prevDate - date) return curDate - else return prevDate - }, parseInt(dateSelectors[dateSelectors.length - 1].id)) + let closestDate: Timestamp | undefined = parseInt(dateSelectors[dateSelectors.length - 1].id) + + for (const elem of Array.from(dateSelectors).reverse()) { + const curDate = parseInt(elem.id) + if (curDate < date) break + else if (curDate - date < closestDate - date) { + closestDate = curDate + } + } if (closestDate && closestDate < date) closestDate = undefined if (closestDate) { @@ -149,23 +151,22 @@ function scrollToDate (date: Timestamp) { let offset = date && document.getElementById(date.toString())?.offsetTop if (offset) { - offset = offset - headerHeight + offset = offset - headerHeight - dateSelectorHeight / 2 if (pinnedIds.length > 0) offset = offset - pinnedHeight div?.scrollTo({ left: 0, top: offset }) } } - let up: boolean | undefined = true + let showFixed: boolean | undefined let selectedDate: Timestamp | undefined = messages ? getDay(messages[0].createOn) : undefined function handleScroll () { - up = div && div.scrollTop === 0 - const upperVisible = getFirstVisible() if (upperVisible) { selectedDate = parseInt(upperVisible.id) } } + const dateSelectorHeight = 30 function getFirstVisible (): Element | undefined { if (!div) return @@ -176,22 +177,25 @@ .find((child) => { if (child?.nodeType === Node.ELEMENT_NODE) { const rect = child?.getBoundingClientRect() - if (rect.top <= clientRect.top) { + if (rect.top - dateSelectorHeight / 2 <= clientRect.top + dateSelectorHeight) { return true } } return false }) + if (firstVisible) { + showFixed = clientRect.top - firstVisible.getBoundingClientRect().top > -dateSelectorHeight / 2 + } return firstVisible } -{#if !up} -
- -
-{/if}
+ {#if showFixed} +
+ +
+ {/if} {#if messages} {#each messages as message, i (message._id)} {#if newMessagesPos === i} @@ -211,3 +215,11 @@ {/each} {/if}
+ + diff --git a/plugins/chunter-resources/src/components/JumpToDateSelector.svelte b/plugins/chunter-resources/src/components/JumpToDateSelector.svelte index 3a52f62600..40181164a7 100644 --- a/plugins/chunter-resources/src/components/JumpToDateSelector.svelte +++ b/plugins/chunter-resources/src/components/JumpToDateSelector.svelte @@ -13,9 +13,10 @@ $: time = selectedDate ? getDay(selectedDate) : undefined -
+
{ showPopup(DateRangePopup, {}, div, (v) => { if (v) { @@ -39,4 +40,10 @@ border-top: 1px solid var(--theme-dialog-divider); } } + + .dateSelectorButton { + margin-top: -1rem; + border: 1px solid var(--theme-dialog-divider); + background-color: var(--body-color); + }