Files
portainer--portainer/app/react/portainer/logs/AuthenticationLogsView/columns.tsx
T
2026-07-13 12:08:39 +08:00

75 lines
1.9 KiB
TypeScript

import { createColumnHelper } from '@tanstack/react-table';
import { Check, X } from 'lucide-react';
import { isoDateFromTimestamp } from '@/portainer/filters/filters';
import { multiple } from '@@/datatables/filter-types';
import { filterHOC } from '@@/datatables/Filter';
import { Icon } from '@@/Icon';
import { ActivityType, AuthLog, AuthMethodType } from './types';
const activityTypesProps = {
[ActivityType.AuthSuccess]: {
label: 'Authentication success',
icon: Check,
mode: 'success',
},
[ActivityType.AuthFailure]: {
label: 'Authentication failure',
icon: X,
mode: 'danger',
},
[ActivityType.Logout]: { label: 'Logout', icon: undefined, mode: undefined },
} as const;
const columnHelper = createColumnHelper<AuthLog>();
export const columns = [
columnHelper.accessor('timestamp', {
header: 'Time',
cell: ({ getValue }) => {
const value = getValue();
return value ? isoDateFromTimestamp(value) : '';
},
}),
columnHelper.accessor('origin', {
header: 'Origin',
}),
columnHelper.accessor(({ context }) => AuthMethodType[context] || '', {
header: 'Context',
enableColumnFilter: true,
filterFn: multiple,
meta: {
filter: filterHOC('Filter'),
},
}),
columnHelper.accessor('username', {
header: 'User',
}),
columnHelper.accessor((item) => activityTypesProps[item.type].label, {
header: 'Result',
enableColumnFilter: true,
filterFn: multiple,
meta: {
filter: filterHOC('Filter'),
},
cell({ row: { original: item } }) {
const props = activityTypesProps[item.type];
if (!props) {
return null;
}
const { label, icon, mode } = props;
return (
<span className="flex items-center gap-1">
{label}
{icon && mode && <Icon icon={icon} mode={mode} />}
</span>
);
},
}),
];