diff --git a/app/docker/components/datatables/events-datatable/eventsDatatable.html b/app/docker/components/datatables/events-datatable/eventsDatatable.html
deleted file mode 100644
index a3b5a9ae2..000000000
--- a/app/docker/components/datatables/events-datatable/eventsDatatable.html
+++ /dev/null
@@ -1,95 +0,0 @@
-
-
-
-
-
-
-
-
-
-
- |
-
-
- |
-
-
- |
-
-
-
-
- {{ item.Time | getisodatefromtimestamp }} |
- {{ item.Type }} |
- {{ item.Details }} |
-
-
- Loading... |
-
-
- No event available. |
-
-
-
-
-
-
-
-
diff --git a/app/docker/components/datatables/events-datatable/eventsDatatable.js b/app/docker/components/datatables/events-datatable/eventsDatatable.js
deleted file mode 100644
index 9684b2577..000000000
--- a/app/docker/components/datatables/events-datatable/eventsDatatable.js
+++ /dev/null
@@ -1,12 +0,0 @@
-angular.module('portainer.docker').component('eventsDatatable', {
- templateUrl: './eventsDatatable.html',
- controller: 'GenericDatatableController',
- bindings: {
- titleText: '@',
- titleIcon: '@',
- dataset: '<',
- tableKey: '@',
- orderBy: '@',
- reverseOrder: '<',
- },
-});
diff --git a/app/docker/react/components/index.ts b/app/docker/react/components/index.ts
index 0acc32a64..3e0d0a977 100644
--- a/app/docker/react/components/index.ts
+++ b/app/docker/react/components/index.ts
@@ -17,8 +17,9 @@ import { GpusInsights } from '@/react/docker/host/SetupView/GpusInsights';
import { InsightsBox } from '@/react/components/InsightsBox';
import { BetaAlert } from '@/react/portainer/environments/update-schedules/common/BetaAlert';
import { ImagesDatatable } from '@/react/docker/images/ListView/ImagesDatatable/ImagesDatatable';
+import { EventsDatatable } from '@/react/docker/events/EventsDatatables';
-export const componentsModule = angular
+const ngModule = angular
.module('portainer.docker.react.components', [])
.component('dockerfileDetails', r2a(DockerfileDetails, ['image']))
.component('dockerHealthStatus', r2a(HealthStatus, ['health']))
@@ -80,4 +81,7 @@ export const componentsModule = angular
'onRefresh',
'onRemove',
])
- ).name;
+ )
+ .component('dockerEventsDatatable', r2a(EventsDatatable, ['dataset']));
+
+export const componentsModule = ngModule.name;
diff --git a/app/docker/views/events/events.html b/app/docker/views/events/events.html
index 0c0f4094b..b85942243 100644
--- a/app/docker/views/events/events.html
+++ b/app/docker/views/events/events.html
@@ -1,7 +1,3 @@
-
+
diff --git a/app/react/docker/events/EventsDatatables.tsx b/app/react/docker/events/EventsDatatables.tsx
new file mode 100644
index 000000000..c5bc35a09
--- /dev/null
+++ b/app/react/docker/events/EventsDatatables.tsx
@@ -0,0 +1,54 @@
+import { createColumnHelper } from '@tanstack/react-table';
+import { Clock } from 'lucide-react';
+
+import { isoDateFromTimestamp } from '@/portainer/filters/filters';
+
+import { Datatable } from '@@/datatables';
+import { createPersistedStore } from '@@/datatables/types';
+import { useTableState } from '@@/datatables/useTableState';
+
+type DockerEvent = {
+ Time: number;
+ Type: string;
+ Details: string;
+};
+
+const columnHelper = createColumnHelper();
+
+export const columns = [
+ columnHelper.accessor('Time', {
+ header: 'Date',
+ cell: ({ getValue }) => {
+ const value = getValue();
+ return isoDateFromTimestamp(value);
+ },
+ }),
+ columnHelper.accessor('Type', {
+ header: 'Type',
+ }),
+ columnHelper.accessor('Details', {
+ header: 'Details',
+ }),
+];
+
+const tableKey = 'docker-events';
+const settingsStore = createPersistedStore(tableKey, {
+ id: 'Time',
+ desc: true,
+});
+
+export function EventsDatatable({ dataset }: { dataset: Array }) {
+ const tableState = useTableState(settingsStore, tableKey);
+
+ return (
+
+ );
+}