|
|
|
|
@ -2,7 +2,7 @@
|
|
|
|
|
import type { FC } from 'react'
|
|
|
|
|
import React, { useState } from 'react'
|
|
|
|
|
import { useTranslation } from 'react-i18next'
|
|
|
|
|
import s from './style.module.css'
|
|
|
|
|
// import s from './style.module.css'
|
|
|
|
|
import DetailPanel from './detail'
|
|
|
|
|
import cn from '@/utils/classnames'
|
|
|
|
|
import type { WorkflowAppLogDetail, WorkflowLogsResponse } from '@/models/log'
|
|
|
|
|
@ -34,33 +34,33 @@ const WorkflowAppLogList: FC<ILogs> = ({ logs, appDetail, onRefresh }) => {
|
|
|
|
|
const statusTdRender = (status: string) => {
|
|
|
|
|
if (status === 'succeeded') {
|
|
|
|
|
return (
|
|
|
|
|
<div className='inline-flex items-center gap-1'>
|
|
|
|
|
<div className='inline-flex items-center gap-1 system-xs-semibold-uppercase'>
|
|
|
|
|
<Indicator color={'green'} />
|
|
|
|
|
<span>Success</span>
|
|
|
|
|
<span className='text-util-colors-green-green-600'>Success</span>
|
|
|
|
|
</div>
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
if (status === 'failed') {
|
|
|
|
|
return (
|
|
|
|
|
<div className='inline-flex items-center gap-1'>
|
|
|
|
|
<div className='inline-flex items-center gap-1 system-xs-semibold-uppercase'>
|
|
|
|
|
<Indicator color={'red'} />
|
|
|
|
|
<span className='text-red-600'>Fail</span>
|
|
|
|
|
<span className='text-util-colors-red-red-600'>Fail</span>
|
|
|
|
|
</div>
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
if (status === 'stopped') {
|
|
|
|
|
return (
|
|
|
|
|
<div className='inline-flex items-center gap-1'>
|
|
|
|
|
<div className='inline-flex items-center gap-1 system-xs-semibold-uppercase'>
|
|
|
|
|
<Indicator color={'yellow'} />
|
|
|
|
|
<span>Stop</span>
|
|
|
|
|
<span className='text-util-colors-warning-warning-600'>Stop</span>
|
|
|
|
|
</div>
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
if (status === 'running') {
|
|
|
|
|
return (
|
|
|
|
|
<div className='inline-flex items-center gap-1'>
|
|
|
|
|
<div className='inline-flex items-center gap-1 system-xs-semibold-uppercase'>
|
|
|
|
|
<Indicator color={'blue'} />
|
|
|
|
|
<span className='text-primary-600'>Running</span>
|
|
|
|
|
<span className='text-util-colors-blue-light-blue-light-600'>Running</span>
|
|
|
|
|
</div>
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
@ -77,43 +77,47 @@ const WorkflowAppLogList: FC<ILogs> = ({ logs, appDetail, onRefresh }) => {
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<div className='overflow-x-auto'>
|
|
|
|
|
<table className={cn('mt-1 w-full min-w-[440px] border-collapse border-0 text-sm', s.logTable)}>
|
|
|
|
|
<thead className="h-8 !pl-3 py-2 leading-[18px] border-b border-gray-200 text-xs text-gray-500 font-medium">
|
|
|
|
|
<table className={cn('mt-2 w-full min-w-[440px] border-collapse border-0')}>
|
|
|
|
|
<thead className='system-xs-medium-uppercase text-text-tertiary'>
|
|
|
|
|
<tr>
|
|
|
|
|
<td className='w-[1.375rem] whitespace-nowrap'></td>
|
|
|
|
|
<td className='whitespace-nowrap'>{t('appLog.table.header.startTime')}</td>
|
|
|
|
|
<td className='whitespace-nowrap'>{t('appLog.table.header.status')}</td>
|
|
|
|
|
<td className='whitespace-nowrap'>{t('appLog.table.header.runtime')}</td>
|
|
|
|
|
<td className='whitespace-nowrap'>{t('appLog.table.header.tokens')}</td>
|
|
|
|
|
<td className='whitespace-nowrap'>{t('appLog.table.header.user')}</td>
|
|
|
|
|
{/* <td className='whitespace-nowrap'>{t('appLog.table.header.version')}</td> */}
|
|
|
|
|
<td className='pl-2 pr-1 w-5 rounded-l-lg bg-background-section-burn whitespace-nowrap'></td>
|
|
|
|
|
<td className='pl-3 py-1.5 bg-background-section-burn whitespace-nowrap'>{t('appLog.table.header.startTime')}</td>
|
|
|
|
|
<td className='pl-3 py-1.5 bg-background-section-burn whitespace-nowrap'>{t('appLog.table.header.status')}</td>
|
|
|
|
|
<td className='pl-3 py-1.5 bg-background-section-burn whitespace-nowrap'>{t('appLog.table.header.runtime')}</td>
|
|
|
|
|
<td className='pl-3 py-1.5 bg-background-section-burn whitespace-nowrap'>{t('appLog.table.header.tokens')}</td>
|
|
|
|
|
<td className='pl-3 py-1.5 rounded-r-lg bg-background-section-burn whitespace-nowrap'>{t('appLog.table.header.user')}</td>
|
|
|
|
|
</tr>
|
|
|
|
|
</thead>
|
|
|
|
|
<tbody className="text-gray-700 text-[13px]">
|
|
|
|
|
<tbody className="text-text-secondary system-sm-regular">
|
|
|
|
|
{logs.data.map((log: WorkflowAppLogDetail) => {
|
|
|
|
|
const endUser = log.created_by_end_user ? log.created_by_end_user.session_id : defaultValue
|
|
|
|
|
return <tr
|
|
|
|
|
key={log.id}
|
|
|
|
|
className={`border-b border-gray-200 h-8 hover:bg-gray-50 cursor-pointer ${currentLog?.id !== log.id ? '' : 'bg-gray-50'}`}
|
|
|
|
|
className={cn('border-b border-divider-subtle hover:bg-background-default-hover cursor-pointer', currentLog?.id !== log.id ? '' : 'bg-background-default-hover')}
|
|
|
|
|
onClick={() => {
|
|
|
|
|
setCurrentLog(log)
|
|
|
|
|
setShowDrawer(true)
|
|
|
|
|
}}>
|
|
|
|
|
<td className='text-center align-middle'>{!log.read_at && <span className='inline-block bg-[#3F83F8] h-1.5 w-1.5 rounded'></span>}</td>
|
|
|
|
|
<td className='w-[160px]'>{formatTime(log.created_at, t('appLog.dateTimeFormat') as string)}</td>
|
|
|
|
|
<td>{statusTdRender(log.workflow_run.status)}</td>
|
|
|
|
|
<td>
|
|
|
|
|
<td className='h-4'>
|
|
|
|
|
{!log.read_at && (
|
|
|
|
|
<div className='p-3 pr-0.5 flex items-center'>
|
|
|
|
|
<span className='inline-block bg-util-colors-blue-blue-500 h-1.5 w-1.5 rounded'></span>
|
|
|
|
|
</div>
|
|
|
|
|
)}
|
|
|
|
|
</td>
|
|
|
|
|
<td className='p-3 pr-2 w-[160px]'>{formatTime(log.created_at, t('appLog.dateTimeFormat') as string)}</td>
|
|
|
|
|
<td className='p-3 pr-2'>{statusTdRender(log.workflow_run.status)}</td>
|
|
|
|
|
<td className='p-3 pr-2'>
|
|
|
|
|
<div className={cn(
|
|
|
|
|
log.workflow_run.elapsed_time === 0 && 'text-gray-400',
|
|
|
|
|
log.workflow_run.elapsed_time === 0 && 'text-text-quaternary',
|
|
|
|
|
)}>{`${log.workflow_run.elapsed_time.toFixed(3)}s`}</div>
|
|
|
|
|
</td>
|
|
|
|
|
<td>{log.workflow_run.total_tokens}</td>
|
|
|
|
|
<td>
|
|
|
|
|
<div className={cn(endUser === defaultValue ? 'text-gray-400' : 'text-gray-700', 'text-sm overflow-hidden text-ellipsis whitespace-nowrap')}>
|
|
|
|
|
<td className='p-3 pr-2'>{log.workflow_run.total_tokens}</td>
|
|
|
|
|
<td className='p-3 pr-2'>
|
|
|
|
|
<div className={cn(endUser === defaultValue ? 'text-text-quaternary' : 'text-text-secondary', 'overflow-hidden text-ellipsis whitespace-nowrap')}>
|
|
|
|
|
{endUser}
|
|
|
|
|
</div>
|
|
|
|
|
</td>
|
|
|
|
|
{/* <td>VERSION</td> */}
|
|
|
|
|
</tr>
|
|
|
|
|
})}
|
|
|
|
|
</tbody>
|
|
|
|
|
@ -123,7 +127,7 @@ const WorkflowAppLogList: FC<ILogs> = ({ logs, appDetail, onRefresh }) => {
|
|
|
|
|
onClose={onCloseDrawer}
|
|
|
|
|
mask={isMobile}
|
|
|
|
|
footer={null}
|
|
|
|
|
panelClassname='mt-16 mx-2 sm:mr-2 mb-3 !p-0 !max-w-[600px] rounded-xl border border-gray-200'
|
|
|
|
|
panelClassname='mt-16 mx-2 sm:mr-2 mb-3 !p-0 !max-w-[600px] rounded-xl border border-components-panel-border'
|
|
|
|
|
>
|
|
|
|
|
<DetailPanel onClose={onCloseDrawer} runID={currentLog?.workflow_run.id || ''} />
|
|
|
|
|
</Drawer>
|
|
|
|
|
|