From 391622db9ebb55d656f8d48eecc9daa40edcc8ac Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Mon, 26 Jun 2023 22:21:30 +0800 Subject: [PATCH] Add date picker, but yet to hook up --- .../Organization/AuditLogs/AuditLogs.tsx | 55 +++++++++-- .../components/ui/DatePicker/DatePicker.tsx | 99 ++++++++++--------- 2 files changed, 103 insertions(+), 51 deletions(-) diff --git a/studio/components/interfaces/Organization/AuditLogs/AuditLogs.tsx b/studio/components/interfaces/Organization/AuditLogs/AuditLogs.tsx index 17e3e632373..ce88fbff6a3 100644 --- a/studio/components/interfaces/Organization/AuditLogs/AuditLogs.tsx +++ b/studio/components/interfaces/Organization/AuditLogs/AuditLogs.tsx @@ -15,9 +15,10 @@ import { useOrganizationDetailQuery } from 'data/organizations/organization-deta import { useOrganizationRolesQuery } from 'data/organizations/organization-roles-query' import { useOrganizationsQuery } from 'data/organizations/organizations-query' import { useProjectsQuery } from 'data/projects/projects-query' -import { Button, IconArrowDown, IconArrowUp, IconBarChart, IconUser } from 'ui' +import { Alert, Button, IconArrowDown, IconArrowUp, IconBarChart, IconUser } from 'ui' import FilterPopover from './FilterPopover' import LogDetailsPanel from './LogDetailsPanel' +import { DatePicker } from 'components/ui/DatePicker' // [Joshen considerations] // - Maybe fix the height of the table to the remaining height of the viewport, so that the search input is always visible @@ -25,12 +26,16 @@ import LogDetailsPanel from './LogDetailsPanel' const AuditLogs = () => { const { slug } = useParams() - const currentTime = dayjs().set('millisecond', 0) + const currentTime = dayjs().utc().set('millisecond', 0) const [dateSortDesc, setDateSortDesc] = useState(true) + const [dateRange, setDateRange] = useState({ + from: currentTime.subtract(1, 'day').toISOString(), + to: currentTime.toISOString(), + }) const [selectedLog, setSelectedLog] = useState() const [filters, setFilters] = useState<{ users: string[]; projects: string[] }>({ - users: [], // gotrue_id - projects: [], // project_ref + users: [], // gotrue_id[] + projects: [], // project_ref[] }) const { data: projects } = useProjectsQuery() @@ -44,8 +49,8 @@ const AuditLogs = () => { isError, } = useOrganizationAuditLogsQuery({ slug, - iso_timestamp_start: currentTime.subtract(1, 'day').toISOString(), - iso_timestamp_end: currentTime.toISOString(), + iso_timestamp_start: dateRange.from, + iso_timestamp_end: dateRange.to, }) const members = detailData?.members ?? [] @@ -82,6 +87,7 @@ const AuditLogs = () => { )} + {/* [Joshen] We'll need to also handle then, if the selected date range is out, rather than blocking all actions */} {isError && } {isSuccess && ( @@ -112,6 +118,43 @@ const AuditLogs = () => { activeOptions={filters.projects} onSaveFilters={(values) => setFilters({ ...filters, projects: values })} /> + { + if (value.from !== null && value.to !== null) { + const current = dayjs().utc() + const from = dayjs(value.from) + .utc() + .hour(current.hour()) + .minute(current.minute()) + .second(current.second()) + .toISOString() + const to = dayjs(value.to) + .utc() + .hour(current.hour()) + .minute(current.minute()) + .second(current.second()) + .toISOString() + setDateRange({ from, to }) + } + }} + renderFooter={({ to, from }) => { + // If selected range is outside of retention policy + if (true) { + return ( + + Selected range is outside of included retention policy, as such no data + will be returned. + + ) + } + }} + /> void - to?: string - from?: string + to?: string // ISO string + from?: string // ISO string triggerButtonType?: ButtonProps['type'] triggerButtonClassName?: string triggerButtonTitle?: string + hideTime?: boolean + hideClear?: boolean renderFooter?: (args: DatePickerToFrom) => React.ReactNode | void } @@ -38,6 +40,8 @@ function _DatePicker({ triggerButtonType = 'default', triggerButtonClassName = '', triggerButtonTitle, + hideTime = false, + hideClear = false, renderFooter = () => null, }: DatePickerProps) { const [open, setOpen] = useState(false) @@ -64,6 +68,7 @@ function _DatePicker({ setAppliedEndDate(end) setEndDate(end) } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [to, from]) function handleDatePickerChange(dates: [from: Date | null, to: Date | null]) { @@ -81,15 +86,15 @@ function _DatePicker({ const payload = { from: dayjs .utc(startDate) - .second(startTime.ss) - .minute(startTime.mm) - .hour(startTime.HH) + .second(Number(startTime.ss)) + .minute(Number(startTime.mm)) + .hour(Number(startTime.HH)) .toISOString(), to: dayjs .utc(endDate || startDate) - .second(endTime.ss) - .minute(endTime.mm) - .hour(endTime.HH) + .second(Number(endTime.ss)) + .minute(Number(endTime.mm)) + .hour(Number(endTime.HH)) .toISOString(), } if (onChange) onChange(payload) @@ -114,47 +119,49 @@ function _DatePicker({ align="center" side="bottom" header={ - <> -
-
- -
-
+
+
+ +
+
- + > + +
+
+ +
-
- -
-
- + + ) } overlay={ <> @@ -213,9 +220,11 @@ function _DatePicker({ })}
- + {!hideClear && ( + + )}