feat: swipe between ledger months
This commit is contained in:
parent
98a5da5c45
commit
44d6f37290
|
|
@ -317,6 +317,7 @@ input:focus-visible {
|
||||||
position: sticky;
|
position: sticky;
|
||||||
top: 0;
|
top: 0;
|
||||||
z-index: 2;
|
z-index: 2;
|
||||||
|
touch-action: pan-y;
|
||||||
min-height: 70px;
|
min-height: 70px;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
|
|
||||||
|
|
@ -39,6 +39,7 @@ const ledgerContent = ref<HTMLElement | null>(null);
|
||||||
const loadMoreTrigger = ref<HTMLElement | null>(null);
|
const loadMoreTrigger = ref<HTMLElement | null>(null);
|
||||||
const monthInput = ref<HTMLInputElement | null>(null);
|
const monthInput = ref<HTMLInputElement | null>(null);
|
||||||
const selectedMonth = ref(toMonthValue(new Date()));
|
const selectedMonth = ref(toMonthValue(new Date()));
|
||||||
|
const monthSwipeStart = ref<{ x: number; y: number } | null>(null);
|
||||||
let loadMoreObserver: IntersectionObserver | null = null;
|
let loadMoreObserver: IntersectionObserver | null = null;
|
||||||
|
|
||||||
const selectedMonthParts = computed(() => {
|
const selectedMonthParts = computed(() => {
|
||||||
|
|
@ -155,6 +156,28 @@ function openMonthPicker() {
|
||||||
else input.click();
|
else input.click();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function startMonthSwipe(event: TouchEvent) {
|
||||||
|
const touch = event.touches[0];
|
||||||
|
if (touch) monthSwipeStart.value = { x: touch.clientX, y: touch.clientY };
|
||||||
|
}
|
||||||
|
|
||||||
|
function finishMonthSwipe(event: TouchEvent) {
|
||||||
|
const start = monthSwipeStart.value;
|
||||||
|
const touch = event.changedTouches[0];
|
||||||
|
monthSwipeStart.value = null;
|
||||||
|
if (!start || !touch) return;
|
||||||
|
const deltaX = touch.clientX - start.x;
|
||||||
|
const deltaY = touch.clientY - start.y;
|
||||||
|
if (Math.abs(deltaX) < 48 || Math.abs(deltaX) <= Math.abs(deltaY)) return;
|
||||||
|
shiftMonth(deltaX < 0 ? 1 : -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
function shiftMonth(offset: number) {
|
||||||
|
const selected = selectedMonthParts.value;
|
||||||
|
if (!selected) return;
|
||||||
|
selectedMonth.value = toMonthValue(new Date(selected.year, selected.month + offset, 1));
|
||||||
|
}
|
||||||
|
|
||||||
function dateHeading(value: string) {
|
function dateHeading(value: string) {
|
||||||
const date = new Date(`${value}T00:00:00`);
|
const date = new Date(`${value}T00:00:00`);
|
||||||
const today = new Date();
|
const today = new Date();
|
||||||
|
|
@ -321,7 +344,7 @@ async function shareLedger() {
|
||||||
<span><Clock3 :size="15" />{{ pendingConversionCount }} 条外币账目等待换算</span>
|
<span><Clock3 :size="15" />{{ pendingConversionCount }} 条外币账目等待换算</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="list-toolbar">
|
<div class="list-toolbar" @touchstart.passive="startMonthSwipe" @touchend="finishMonthSwipe">
|
||||||
<div class="list-toolbar-copy">
|
<div class="list-toolbar-copy">
|
||||||
<div class="list-toolbar-heading">
|
<div class="list-toolbar-heading">
|
||||||
<button class="list-month-switcher" type="button" @click="openMonthPicker">
|
<button class="list-month-switcher" type="button" @click="openMonthPicker">
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue