Skip to content

Commit 86b229b

Browse files
committed
DatePicker v2
1 parent 02d6c44 commit 86b229b

File tree

3 files changed

+78
-27
lines changed

3 files changed

+78
-27
lines changed

components/DatePicker.vue

Lines changed: 35 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,24 @@ import { DateTime, Info } from "luxon"
44
55
/** UI */
66
import Button from "@/components/ui/Button.vue"
7-
import Input from "@/components/ui/Input.vue"
87
import Popover from "@/components/ui/Popover.vue"
98
109
const props = defineProps({
11-
color: {
10+
from: {
1211
type: String,
13-
default: "primary"
12+
default: '',
1413
},
14+
to: {
15+
type: String,
16+
default: '',
17+
}
1518
})
1619
20+
const emit = defineEmits(["onUpdate"])
1721
const month = ref(DateTime.now().month)
1822
const year = ref(DateTime.now().year)
19-
const startDate = ref({})
20-
const endDate = ref({})
23+
const startDate = ref(props.from ? DateTime.fromSeconds(parseInt(props.from)) : {})
24+
const endDate = ref(props.to ? DateTime.fromSeconds(parseInt(props.to)) : {})
2125
const weekdays = ref(Info.weekdays('narrow', { locale: 'en-US' }))
2226
const days = computed(() => {
2327
let rawDays = []
@@ -84,26 +88,24 @@ const isInSelectedPeriod = (d) => {
8488
const isOpen = ref(false)
8589
const handleOpen = () => {
8690
isOpen.value = true
87-
88-
// if (Object.keys(filters.message_type).find((f) => filters.message_type[f])) {
89-
// savedFiltersBeforeChanges.value = { ...filters.message_type }
90-
// }
9191
}
9292
const handleClose = () => {
9393
isOpen.value = false
94+
}
9495
95-
// searchTerm.value = ""
96+
const handleApply = () => {
97+
emit('onUpdate', { from: parseInt(startDate.value.ts / 1_000), to: parseInt((endDate.value.ts ? endDate.value.ts : startDate.value.endOf('day').ts) / 1_000) })
9698
97-
// if (savedFiltersBeforeChanges.value) {
98-
// filters.message_type = savedFiltersBeforeChanges.value
99-
// savedFiltersBeforeChanges.value = null
100-
// } else {
101-
// resetFilters("message_type")
102-
// }
99+
isOpen.value = false
103100
}
104101
105-
const handleApply = () => {
102+
const handleClear = () => {
103+
startDate.value = {}
104+
endDate.value = {}
106105
106+
emit('onUpdate', { clear: true })
107+
108+
isOpen.value = false
107109
}
108110
109111
const handleMonthChange = (v) => {
@@ -128,6 +130,16 @@ const handleMonthChange = (v) => {
128130
<Icon name="plus-circle" size="12" color="tertiary" />
129131

130132
<Text color="secondary">Date Range</Text>
133+
134+
<template v-if="startDate.ts">
135+
<div :class="$style.vertical_divider" />
136+
137+
<Text size="12" weight="600" color="primary">
138+
{{ endDate.ts ? `${startDate.toFormat('LLL dd')} - ${endDate.toFormat('LLL dd')}` : startDate.toFormat('LLL dd') }}
139+
</Text>
140+
141+
<Icon @click.stop="handleClear" name="close-circle" size="12" color="secondary" />
142+
</template>
131143
</Button>
132144

133145
<template #content>
@@ -193,6 +205,12 @@ const handleMonthChange = (v) => {
193205
</template>
194206

195207
<style module>
208+
.vertical_divider {
209+
min-width: 2px;
210+
height: 12px;
211+
background: var(--op-10);
212+
}
213+
196214
.table {
197215
transition: all 0.2s ease;
198216

pages/txs.vue

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import { MsgTypes } from "@/services/constants/messages"
2020
2121
/** API */
2222
import { fetchTransactions } from "@/services/api/tx"
23+
import { reset } from "@amplitude/analytics-browser"
2324
2425
useHead({
2526
title: "Transactions - Celestia Explorer",
@@ -79,6 +80,8 @@ const filters = reactive({
7980
failed: false,
8081
},
8182
message_type: MsgTypes.reduce((a, b) => ({ ...a, [b]: false }), {}),
83+
from: '',
84+
to: '',
8285
})
8386
const savedFiltersBeforeChanges = ref(null)
8487
@@ -91,6 +94,9 @@ const handleClearAllFilters = () => {
9194
filters.message_type[f] = false
9295
})
9396
97+
filters.from = ''
98+
filters.to = ''
99+
94100
router.replace({
95101
query: null,
96102
})
@@ -104,7 +110,9 @@ const searchTerm = ref("")
104110
Object.keys(route.query).forEach((key) => {
105111
if (key === "page") return
106112
107-
if (route.query[key].split(",").length) {
113+
if (key === "from" || key === "to") {
114+
filters[key] = route.query[key]
115+
} else if (route.query[key].split(",").length) {
108116
route.query[key].split(",").forEach((item) => {
109117
filters[key][item] = true
110118
})
@@ -126,6 +134,8 @@ const updateRouteQuery = () => {
126134
Object.keys(filters.message_type)
127135
.filter((f) => filters.message_type[f])
128136
.join(","),
137+
...(filters.from ? { from: filters.from} : {}),
138+
...(filters.to ? { to: filters.to} : {}),
129139
},
130140
})
131141
}
@@ -190,10 +200,30 @@ const handleApplyMessageTypeFilters = () => {
190200
updateRouteQuery()
191201
}
192202
203+
const handleUpdateDateFilter = (event) => {
204+
if (event.from && event.to) {
205+
filters.from = event.from
206+
filters.to = event.to
207+
208+
page.value = 1
209+
210+
getTransactions()
211+
212+
updateRouteQuery()
213+
} else if (event.clear) {
214+
resetFilters('from')
215+
resetFilters('to', true)
216+
}
217+
}
218+
193219
const resetFilters = (target, refetch) => {
194-
Object.keys(filters[target]).forEach((f) => {
195-
filters[target][f] = false
196-
})
220+
if (target === "from" || target === "to") {
221+
filters[target] = ''
222+
} else {
223+
Object.keys(filters[target]).forEach((f) => {
224+
filters[target][f] = false
225+
})
226+
}
197227
198228
if (refetch) {
199229
page.value = 1
@@ -263,6 +293,8 @@ const getTransactions = async () => {
263293
Object.keys(filters.message_type)
264294
.filter((f) => filters.message_type[f])
265295
.join(","),
296+
from: filters.from,
297+
to: filters.to,
266298
})
267299
transactions.value = data.value
268300
@@ -283,7 +315,6 @@ watch(
283315
() => page.value,
284316
async () => {
285317
getTransactions()
286-
287318
router.replace({ query: { page: page.value } })
288319
},
289320
)
@@ -465,7 +496,7 @@ const handleNext = () => {
465496
</template>
466497
</Popover>
467498

468-
<DatePicker />
499+
<DatePicker @on-update="handleUpdateDateFilter" :from="filters.from" :to="filters.to" />
469500
</Flex>
470501

471502
<Popover :open="isConfigurePopoverOpen" @on-close="isConfigurePopoverOpen = false" width="150" side="right">

services/api/tx.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
11
/** Services */
22
import { useServerURL } from "@/services/config"
33

4-
export const fetchTransactions = async ({ limit, offset, sort, sort_by, msg_type, status }) => {
4+
export const fetchTransactions = async ({ msg_type, status, from, to, limit, offset, sort_by, sort }) => {
55
try {
66
const url = new URL(`${useServerURL()}/tx`)
77

8-
if (limit) url.searchParams.append("limit", limit)
9-
if (offset) url.searchParams.append("offset", offset)
108
if (msg_type) url.searchParams.append("msg_type", msg_type)
119
if (status) url.searchParams.append("status", status)
12-
if (sort) url.searchParams.append("sort", sort)
10+
if (from) url.searchParams.append("from", from)
11+
if (to) url.searchParams.append("to", to)
12+
if (limit) url.searchParams.append("limit", limit)
13+
if (offset) url.searchParams.append("offset", offset)
1314
if (sort_by) url.searchParams.append("sort_by", sort_by)
15+
if (sort) url.searchParams.append("sort", sort)
1416

1517
const data = await useFetch(url.href)
1618
return data

0 commit comments

Comments
 (0)