diff --git a/app/portainer/components/datatables/tags-datatable/tagsDatatable.html b/app/portainer/components/datatables/tags-datatable/tagsDatatable.html
deleted file mode 100644
index cc53d049c..000000000
--- a/app/portainer/components/datatables/tags-datatable/tagsDatatable.html
+++ /dev/null
@@ -1,91 +0,0 @@
-
diff --git a/app/portainer/components/datatables/tags-datatable/tagsDatatable.js b/app/portainer/components/datatables/tags-datatable/tagsDatatable.js
deleted file mode 100644
index b34f7d015..000000000
--- a/app/portainer/components/datatables/tags-datatable/tagsDatatable.js
+++ /dev/null
@@ -1,13 +0,0 @@
-angular.module('portainer.app').component('tagsDatatable', {
- templateUrl: './tagsDatatable.html',
- controller: 'GenericDatatableController',
- bindings: {
- titleText: '@',
- titleIcon: '@',
- dataset: '<',
- tableKey: '@',
- orderBy: '@',
- reverseOrder: '<',
- removeAction: '<',
- },
-});
diff --git a/app/portainer/react/components/environments.ts b/app/portainer/react/components/environments.ts
index 057f4ce42..4c5a95c7b 100644
--- a/app/portainer/react/components/environments.ts
+++ b/app/portainer/react/components/environments.ts
@@ -3,11 +3,10 @@ import angular from 'angular';
import { r2a } from '@/react-tools/react2angular';
import { EdgeKeyDisplay } from '@/react/portainer/environments/ItemView/EdgeKeyDisplay';
import { KVMControl } from '@/react/portainer/environments/KvmView/KVMControl';
+import { TagsDatatable } from '@/react/portainer/environments/TagsView/TagsDatatable';
export const environmentsModule = angular
.module('portainer.app.react.components.environments', [])
.component('edgeKeyDisplay', r2a(EdgeKeyDisplay, ['edgeKey']))
- .component(
- 'kvmControl',
- r2a(KVMControl, ['deviceId', 'server', 'token'])
- ).name;
+ .component('kvmControl', r2a(KVMControl, ['deviceId', 'server', 'token']))
+ .component('tagsDatatable', r2a(TagsDatatable, ['dataset', 'onRemove'])).name;
diff --git a/app/portainer/views/tags/tags.html b/app/portainer/views/tags/tags.html
index 7b1e3df37..f8deb85f2 100644
--- a/app/portainer/views/tags/tags.html
+++ b/app/portainer/views/tags/tags.html
@@ -60,8 +60,4 @@
-
+
diff --git a/app/portainer/views/tags/tagsController.js b/app/portainer/views/tags/tagsController.js
index 51e1aedeb..ae86039a9 100644
--- a/app/portainer/views/tags/tagsController.js
+++ b/app/portainer/views/tags/tagsController.js
@@ -1,7 +1,5 @@
import angular from 'angular';
import _ from 'lodash-es';
-import { confirmDestructive } from '@@/modals/confirm';
-import { buildConfirmButton } from '@@/modals/utils';
angular.module('portainer.app').controller('TagsController', TagsController);
@@ -32,16 +30,6 @@ function TagsController($scope, $state, $async, TagService, Notifications) {
}
async function removeActionAsync(tags) {
- const confirmed = await confirmDestructive({
- title: 'Are you sure?',
- message: 'Are you sure you want to remove the selected tag(s)?',
- confirmButton: buildConfirmButton('Remove', 'danger'),
- });
-
- if (!confirmed) {
- return;
- }
-
for (let tag of tags) {
try {
await TagService.deleteTag(tag.Id);
diff --git a/app/react/portainer/environments/TagsView/.keep b/app/react/portainer/environments/TagsView/.keep
deleted file mode 100644
index e69de29bb..000000000
diff --git a/app/react/portainer/environments/TagsView/TagsDatatable.tsx b/app/react/portainer/environments/TagsView/TagsDatatable.tsx
new file mode 100644
index 000000000..42201e3d1
--- /dev/null
+++ b/app/react/portainer/environments/TagsView/TagsDatatable.tsx
@@ -0,0 +1,50 @@
+import { TagIcon } from 'lucide-react';
+import { createColumnHelper } from '@tanstack/react-table';
+
+import { Tag } from '@/portainer/tags/types';
+
+import { Datatable } from '@@/datatables';
+import { createPersistedStore } from '@@/datatables/types';
+import { useTableState } from '@@/datatables/useTableState';
+import { DeleteButton } from '@@/buttons/DeleteButton';
+
+const columnHelper = createColumnHelper();
+
+const columns = [
+ columnHelper.accessor('Name', {
+ header: 'Name',
+ }),
+];
+
+const tableKey = 'tags-table';
+
+const store = createPersistedStore(tableKey);
+
+export function TagsDatatable({
+ dataset,
+ onRemove,
+}: {
+ dataset: Array | undefined;
+ onRemove: (selectedItems: Array) => void;
+}) {
+ const tableState = useTableState(store, tableKey);
+
+ return (
+ (
+ onRemove(selectedItems)}
+ />
+ )}
+ />
+ );
+}