mirror of
https://github.com/langgenius/dify.git
synced 2026-02-09 04:22:06 +08:00
Signed-off-by: lyzno1 <yuanyouhuilyz@gmail.com> Co-authored-by: Stream <Stream_2@qq.com> Co-authored-by: lyzno1 <92089059+lyzno1@users.noreply.github.com> Co-authored-by: zhsama <torvalds@linux.do> Co-authored-by: Harry <xh001x@hotmail.com> Co-authored-by: lyzno1 <yuanyouhuilyz@gmail.com> Co-authored-by: yessenia <yessenia.contact@gmail.com> Co-authored-by: hjlarry <hjlarry@163.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: WTW0313 <twwu@dify.ai> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
92 lines
3.2 KiB
TypeScript
92 lines
3.2 KiB
TypeScript
'use client'
|
|
import type { FC } from 'react'
|
|
import React, { useState } from 'react'
|
|
import useSWR from 'swr'
|
|
import { useDebounce } from 'ahooks'
|
|
import { omit } from 'lodash-es'
|
|
import dayjs from 'dayjs'
|
|
import utc from 'dayjs/plugin/utc'
|
|
import timezone from 'dayjs/plugin/timezone'
|
|
import { useTranslation } from 'react-i18next'
|
|
import List from './list'
|
|
import Filter, { TIME_PERIOD_MAPPING } from './filter'
|
|
import EmptyElement from '@/app/components/app/log/empty-element'
|
|
import Pagination from '@/app/components/base/pagination'
|
|
import Loading from '@/app/components/base/loading'
|
|
import { fetchWorkflowLogs } from '@/service/log'
|
|
import { APP_PAGE_LIMIT } from '@/config'
|
|
import type { App } from '@/types/app'
|
|
import { useAppContext } from '@/context/app-context'
|
|
|
|
dayjs.extend(utc)
|
|
dayjs.extend(timezone)
|
|
|
|
export type ILogsProps = {
|
|
appDetail: App
|
|
}
|
|
|
|
export type QueryParam = {
|
|
period: string
|
|
status?: string
|
|
keyword?: string
|
|
}
|
|
|
|
const Logs: FC<ILogsProps> = ({ appDetail }) => {
|
|
const { t } = useTranslation()
|
|
const { userProfile: { timezone } } = useAppContext()
|
|
const [queryParams, setQueryParams] = useState<QueryParam>({ status: 'all', period: '2' })
|
|
const [currPage, setCurrPage] = React.useState<number>(0)
|
|
const debouncedQueryParams = useDebounce(queryParams, { wait: 500 })
|
|
const [limit, setLimit] = React.useState<number>(APP_PAGE_LIMIT)
|
|
|
|
const query = {
|
|
page: currPage + 1,
|
|
detail: true,
|
|
limit,
|
|
...(debouncedQueryParams.status !== 'all' ? { status: debouncedQueryParams.status } : {}),
|
|
...(debouncedQueryParams.keyword ? { keyword: debouncedQueryParams.keyword } : {}),
|
|
...((debouncedQueryParams.period !== '9')
|
|
? {
|
|
created_at__after: dayjs().subtract(TIME_PERIOD_MAPPING[debouncedQueryParams.period].value, 'day').startOf('day').tz(timezone).format('YYYY-MM-DDTHH:mm:ssZ'),
|
|
created_at__before: dayjs().endOf('day').tz(timezone).format('YYYY-MM-DDTHH:mm:ssZ'),
|
|
}
|
|
: {}),
|
|
...omit(debouncedQueryParams, ['period', 'status']),
|
|
}
|
|
|
|
const { data: workflowLogs, mutate } = useSWR({
|
|
url: `/apps/${appDetail.id}/workflow-app-logs`,
|
|
params: query,
|
|
}, fetchWorkflowLogs)
|
|
const total = workflowLogs?.total
|
|
|
|
return (
|
|
<div className='flex h-full flex-col'>
|
|
<h1 className='system-xl-semibold text-text-primary'>{t('appLog.workflowTitle')}</h1>
|
|
<p className='system-sm-regular text-text-tertiary'>{t('appLog.workflowSubtitle')}</p>
|
|
<div className='flex max-h-[calc(100%-16px)] flex-1 flex-col py-4'>
|
|
<Filter queryParams={queryParams} setQueryParams={setQueryParams} />
|
|
{/* workflow log */}
|
|
{total === undefined
|
|
? <Loading type='app' />
|
|
: total > 0
|
|
? <List logs={workflowLogs} appDetail={appDetail} onRefresh={mutate} />
|
|
: <EmptyElement appDetail={appDetail} />
|
|
}
|
|
{/* Show Pagination only if the total is more than the limit */}
|
|
{(total && total > APP_PAGE_LIMIT)
|
|
? <Pagination
|
|
current={currPage}
|
|
onChange={setCurrPage}
|
|
total={total}
|
|
limit={limit}
|
|
onLimitChange={setLimit}
|
|
/>
|
|
: null}
|
|
</div>
|
|
</div>
|
|
)
|
|
}
|
|
|
|
export default Logs
|