feat: time period filter for workflow logs
This commit is contained in:
parent
7790214620
commit
e954e0d6c4
@ -2,11 +2,29 @@
|
|||||||
import type { FC } from 'react'
|
import type { FC } from 'react'
|
||||||
import React from 'react'
|
import React from 'react'
|
||||||
import { useTranslation } from 'react-i18next'
|
import { useTranslation } from 'react-i18next'
|
||||||
|
import dayjs from 'dayjs'
|
||||||
|
import { RiCalendarLine } from '@remixicon/react'
|
||||||
|
import quarterOfYear from 'dayjs/plugin/quarterOfYear'
|
||||||
import type { QueryParam } from './index'
|
import type { QueryParam } from './index'
|
||||||
import Chip from '@/app/components/base/chip'
|
import Chip from '@/app/components/base/chip'
|
||||||
import Input from '@/app/components/base/input'
|
import Input from '@/app/components/base/input'
|
||||||
|
dayjs.extend(quarterOfYear)
|
||||||
|
|
||||||
interface IFilterProps {
|
const today = dayjs()
|
||||||
|
|
||||||
|
export const TIME_PERIOD_MAPPING: { [key: string]: { value: number; name: string } } = {
|
||||||
|
1: { value: 0, name: 'today' },
|
||||||
|
2: { value: 7, name: 'last7days' },
|
||||||
|
3: { value: 28, name: 'last4weeks' },
|
||||||
|
4: { value: today.diff(today.subtract(3, 'month'), 'day'), name: 'last3months' },
|
||||||
|
5: { value: today.diff(today.subtract(12, 'month'), 'day'), name: 'last12months' },
|
||||||
|
6: { value: today.diff(today.startOf('month'), 'day'), name: 'monthToDate' },
|
||||||
|
7: { value: today.diff(today.startOf('quarter'), 'day'), name: 'quarterToDate' },
|
||||||
|
8: { value: today.diff(today.startOf('year'), 'day'), name: 'yearToDate' },
|
||||||
|
9: { value: -1, name: 'allTime' },
|
||||||
|
}
|
||||||
|
|
||||||
|
type IFilterProps = {
|
||||||
queryParams: QueryParam
|
queryParams: QueryParam
|
||||||
setQueryParams: (v: QueryParam) => void
|
setQueryParams: (v: QueryParam) => void
|
||||||
}
|
}
|
||||||
@ -27,6 +45,17 @@ const Filter: FC<IFilterProps> = ({ queryParams, setQueryParams }: IFilterProps)
|
|||||||
{ value: 'stopped', name: 'Stop' },
|
{ value: 'stopped', name: 'Stop' },
|
||||||
]}
|
]}
|
||||||
/>
|
/>
|
||||||
|
<Chip
|
||||||
|
className='min-w-[150px]'
|
||||||
|
panelClassName='w-[270px]'
|
||||||
|
leftIcon={<RiCalendarLine className='h-4 w-4 text-text-secondary' />}
|
||||||
|
value={queryParams.period}
|
||||||
|
onSelect={(item) => {
|
||||||
|
setQueryParams({ ...queryParams, period: item.value })
|
||||||
|
}}
|
||||||
|
onClear={() => setQueryParams({ ...queryParams, period: '9' })}
|
||||||
|
items={Object.entries(TIME_PERIOD_MAPPING).map(([k, v]) => ({ value: k, name: t(`appLog.filter.period.${v.name}`) }))}
|
||||||
|
/>
|
||||||
<Input
|
<Input
|
||||||
wrapperClassName='w-[200px]'
|
wrapperClassName='w-[200px]'
|
||||||
showLeftIcon
|
showLeftIcon
|
||||||
|
@ -4,10 +4,12 @@ import React, { useState } from 'react'
|
|||||||
import useSWR from 'swr'
|
import useSWR from 'swr'
|
||||||
import { usePathname } from 'next/navigation'
|
import { usePathname } from 'next/navigation'
|
||||||
import { useDebounce } from 'ahooks'
|
import { useDebounce } from 'ahooks'
|
||||||
|
import { omit } from 'lodash-es'
|
||||||
|
import dayjs from 'dayjs'
|
||||||
import { Trans, useTranslation } from 'react-i18next'
|
import { Trans, useTranslation } from 'react-i18next'
|
||||||
import Link from 'next/link'
|
import Link from 'next/link'
|
||||||
import List from './list'
|
import List from './list'
|
||||||
import Filter from './filter'
|
import Filter, { TIME_PERIOD_MAPPING } from './filter'
|
||||||
import Pagination from '@/app/components/base/pagination'
|
import Pagination from '@/app/components/base/pagination'
|
||||||
import Loading from '@/app/components/base/loading'
|
import Loading from '@/app/components/base/loading'
|
||||||
import { fetchWorkflowLogs } from '@/service/log'
|
import { fetchWorkflowLogs } from '@/service/log'
|
||||||
@ -19,6 +21,7 @@ export type ILogsProps = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export type QueryParam = {
|
export type QueryParam = {
|
||||||
|
period: string
|
||||||
status?: string
|
status?: string
|
||||||
keyword?: string
|
keyword?: string
|
||||||
}
|
}
|
||||||
@ -48,7 +51,7 @@ const EmptyElement: FC<{ appUrl: string }> = ({ appUrl }) => {
|
|||||||
|
|
||||||
const Logs: FC<ILogsProps> = ({ appDetail }) => {
|
const Logs: FC<ILogsProps> = ({ appDetail }) => {
|
||||||
const { t } = useTranslation()
|
const { t } = useTranslation()
|
||||||
const [queryParams, setQueryParams] = useState<QueryParam>({ status: 'all' })
|
const [queryParams, setQueryParams] = useState<QueryParam>({ status: 'all', period: '2' })
|
||||||
const [currPage, setCurrPage] = React.useState<number>(0)
|
const [currPage, setCurrPage] = React.useState<number>(0)
|
||||||
const debouncedQueryParams = useDebounce(queryParams, { wait: 500 })
|
const debouncedQueryParams = useDebounce(queryParams, { wait: 500 })
|
||||||
const [limit, setLimit] = React.useState<number>(APP_PAGE_LIMIT)
|
const [limit, setLimit] = React.useState<number>(APP_PAGE_LIMIT)
|
||||||
@ -58,6 +61,13 @@ const Logs: FC<ILogsProps> = ({ appDetail }) => {
|
|||||||
limit,
|
limit,
|
||||||
...(debouncedQueryParams.status !== 'all' ? { status: debouncedQueryParams.status } : {}),
|
...(debouncedQueryParams.status !== 'all' ? { status: debouncedQueryParams.status } : {}),
|
||||||
...(debouncedQueryParams.keyword ? { keyword: debouncedQueryParams.keyword } : {}),
|
...(debouncedQueryParams.keyword ? { keyword: debouncedQueryParams.keyword } : {}),
|
||||||
|
...((debouncedQueryParams.period !== '9')
|
||||||
|
? {
|
||||||
|
start: dayjs().subtract(TIME_PERIOD_MAPPING[debouncedQueryParams.period].value, 'day').startOf('day').format('YYYY-MM-DD HH:mm'),
|
||||||
|
end: dayjs().endOf('day').format('YYYY-MM-DD HH:mm'),
|
||||||
|
}
|
||||||
|
: {}),
|
||||||
|
...omit(debouncedQueryParams, ['period', 'status']),
|
||||||
}
|
}
|
||||||
|
|
||||||
const getWebAppType = (appType: AppMode) => {
|
const getWebAppType = (appType: AppMode) => {
|
||||||
|
@ -42,7 +42,7 @@ export const VarItem: FC<VarItemProps> = ({
|
|||||||
<div className='py-1'>
|
<div className='py-1'>
|
||||||
<div className='flex leading-[18px] items-center'>
|
<div className='flex leading-[18px] items-center'>
|
||||||
<div className='code-sm-semibold text-text-secondary'>{name}</div>
|
<div className='code-sm-semibold text-text-secondary'>{name}</div>
|
||||||
<div className='ml-2 system-xs-regular text-text-tertiary'>{type}</div>
|
<div className='ml-2 system-xs-regular text-text-tertiary capitalize'>{type}</div>
|
||||||
</div>
|
</div>
|
||||||
<div className='mt-0.5 system-xs-regular text-text-tertiary'>
|
<div className='mt-0.5 system-xs-regular text-text-tertiary'>
|
||||||
{description}
|
{description}
|
||||||
|
Loading…
Reference in New Issue
Block a user