75 lines
1.9 KiB
TypeScript
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>
|
|
);
|
|
},
|
|
}),
|
|
];
|