1
0
Fork 0
mirror of https://github.com/portainer/portainer.git synced 2025-07-24 15:59:41 +02:00

refactor(docker/services): migrate service tasks to react [EE-4676] (#10328)

This commit is contained in:
Chaim Lev-Ari 2023-10-23 13:52:49 +03:00 committed by GitHub
parent 70455320be
commit 1fa63f6ab7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
24 changed files with 175 additions and 259 deletions

View file

@ -0,0 +1,37 @@
import { List } from 'lucide-react';
import { Datatable } from '@@/datatables';
import { createPersistedStore } from '@@/datatables/types';
import { useTableState } from '@@/datatables/useTableState';
import { withMeta } from '@@/datatables/extend-options/withMeta';
import { useColumns } from './columns';
import { DecoratedTask } from './types';
const storageKey = 'docker-service-tasks';
const store = createPersistedStore(storageKey);
export function TasksDatatable({
dataset,
isSlotColumnVisible,
serviceName,
}: {
dataset: DecoratedTask[];
isSlotColumnVisible: boolean;
serviceName: string;
}) {
const tableState = useTableState(store, storageKey);
const columns = useColumns(isSlotColumnVisible);
return (
<Datatable
title="Tasks"
titleIcon={List}
settingsManager={tableState}
columns={columns}
dataset={dataset}
emptyContentLabel="No task available."
extendTableOptions={withMeta({ table: 'tasks', serviceName })}
/>
);
}

View file

@ -24,7 +24,7 @@ function Cell({
return null;
}
const state: QuickActionsState = {
showQuickActionAttach: true,
showQuickActionAttach: false,
showQuickActionExec: true,
showQuickActionInspect: true,
showQuickActionLogs: true,

View file

@ -0,0 +1,24 @@
import { useMemo } from 'react';
import _ from 'lodash';
import { actions } from './actions';
import { node } from './node';
import { slot } from './slot';
import { status } from './status';
import { task } from './task';
import { updated } from './updated';
export function useColumns(isSlotColumnsVisible = true) {
return useMemo(
() =>
_.compact([
status,
task,
actions,
isSlotColumnsVisible && slot,
node,
updated,
]),
[isSlotColumnsVisible]
);
}

View file

@ -0,0 +1,5 @@
import { columnHelper } from './helper';
export const slot = columnHelper.accessor((item) => item.Slot || '-', {
header: 'Slot',
});

View file

@ -0,0 +1,51 @@
import { CellContext } from '@tanstack/react-table';
import { useCurrentEnvironment } from '@/react/hooks/useCurrentEnvironment';
import { isAgentEnvironment } from '@/react/portainer/environments/utils';
import { Link } from '@@/Link';
import { DecoratedTask } from '../types';
import { getTableMeta } from '../meta';
import { columnHelper } from './helper';
export const task = columnHelper.accessor('Id', {
header: 'Id',
cell: Cell,
});
function Cell({
getValue,
row: { original: item },
table: {
options: { meta },
},
}: CellContext<DecoratedTask, string>) {
const environmentQuery = useCurrentEnvironment();
if (!environmentQuery.data) {
return null;
}
const { serviceName } = getTableMeta(meta);
const value = getValue();
const isAgent = isAgentEnvironment(environmentQuery.data.Type);
const name = `${serviceName}${item.Slot ? `.${item.Slot}` : ''}.${value}`;
return isAgent && item.Container ? (
<Link
to="docker.containers.container"
params={{ id: item.Container.Id, nodeName: item.Container.NodeName }}
className="monospaced"
>
{name}
</Link>
) : (
<Link to="docker.tasks.task" params={{ id: value }} className="monospaced">
{name}
</Link>
);
}

View file

@ -0,0 +1,8 @@
import { isoDate } from '@/portainer/filters/filters';
import { columnHelper } from './helper';
export const updated = columnHelper.accessor('Updated', {
header: 'Last Update',
cell: ({ getValue }) => isoDate(getValue()),
});

View file

@ -0,0 +1 @@
export { TasksDatatable } from './TasksDatatable';

View file

@ -0,0 +1,17 @@
type TableMeta = {
serviceName: string;
table: 'tasks';
};
export function getTableMeta(meta: unknown): TableMeta {
return isTableMeta(meta) ? meta : { table: 'tasks', serviceName: '' };
}
function isTableMeta(meta: unknown): meta is TableMeta {
return (
!!meta &&
typeof meta === 'object' &&
'table' in meta &&
meta.table === 'tasks'
);
}

View file

@ -19,6 +19,8 @@ import { getColumnVisibilityState } from '@@/datatables/ColumnVisibilityMenu';
import { mergeOptions } from '@@/datatables/extend-options/mergeOptions';
import { withGlobalFilter } from '@@/datatables/extend-options/withGlobalFilter';
import { DecoratedTask } from '../../ItemView/TasksDatatable/types';
import { useColumns } from './columns';
import { TasksDatatable } from './TasksDatatable';
import { TableActions } from './TableActions';
@ -72,7 +74,10 @@ export function ServicesDatatable({
<tr>
<td />
<td colSpan={Number.MAX_SAFE_INTEGER}>
<TasksDatatable dataset={item.Tasks} search={tableState.search} />
<TasksDatatable
dataset={item.Tasks as Array<DecoratedTask>}
search={tableState.search}
/>
</td>
</tr>
)}

View file

@ -1,7 +1,15 @@
import { DecoratedTask } from '@/react/docker/services/ItemView/TasksDatatable/types';
import { status } from '@/react/docker/services/ItemView/TasksDatatable/columns/status';
import { actions } from '@/react/docker/services/ItemView/TasksDatatable/columns/actions';
import { slot } from '@/react/docker/services/ItemView/TasksDatatable/columns/slot';
import { node } from '@/react/docker/services/ItemView/TasksDatatable/columns/node';
import { updated } from '@/react/docker/services/ItemView/TasksDatatable/columns/updated';
import { NestedDatatable } from '@@/datatables/NestedDatatable';
import { columns } from './columns';
import { DecoratedTask } from './types';
import { task } from './task-column';
const columns = [status, task, actions, slot, node, updated];
export function TasksDatatable({
dataset,

View file

@ -1,19 +0,0 @@
import { isoDate } from '@/portainer/filters/filters';
import { actions } from './actions';
import { columnHelper } from './helper';
import { node } from './node';
import { status } from './status';
import { task } from './task';
export const columns = [
status,
task,
actions,
columnHelper.accessor((item) => item.Slot || '-', { header: 'Slot' }),
node,
columnHelper.accessor('Updated', {
header: 'Last Update',
cell: ({ getValue }) => isoDate(getValue()),
}),
];

View file

@ -2,13 +2,11 @@ import { CellContext } from '@tanstack/react-table';
import { useCurrentEnvironment } from '@/react/hooks/useCurrentEnvironment';
import { isAgentEnvironment } from '@/react/portainer/environments/utils';
import { DecoratedTask } from '@/react/docker/services/ItemView/TasksDatatable/types';
import { columnHelper } from '@/react/docker/services/ItemView/TasksDatatable/columns/helper';
import { Link } from '@@/Link';
import { DecoratedTask } from '../types';
import { columnHelper } from './helper';
export const task = columnHelper.accessor('Id', {
header: 'Task',
cell: Cell,