diff --git a/app/kubernetes/react/views/index.ts b/app/kubernetes/react/views/index.ts
index 7913f7641..e4043985f 100644
--- a/app/kubernetes/react/views/index.ts
+++ b/app/kubernetes/react/views/index.ts
@@ -23,6 +23,7 @@ import { NamespaceView } from '@/react/kubernetes/namespaces/ItemView/NamespaceV
import { AccessView } from '@/react/kubernetes/namespaces/AccessView/AccessView';
import { JobsView } from '@/react/kubernetes/more-resources/JobsView/JobsView';
import { ClusterView } from '@/react/kubernetes/cluster/ClusterView';
+import { HelmApplicationView } from '@/react/kubernetes/helm/HelmApplicationView';
export const viewsModule = angular
.module('portainer.kubernetes.react.views', [])
@@ -79,6 +80,10 @@ export const viewsModule = angular
[]
)
)
+ .component(
+ 'kubernetesHelmApplicationView',
+ r2a(withUIRouter(withReactQuery(withCurrentUser(HelmApplicationView))), [])
+ )
.component(
'kubernetesClusterView',
r2a(withUIRouter(withReactQuery(withCurrentUser(ClusterView))), [])
diff --git a/app/kubernetes/views/applications/helm/helm.controller.js b/app/kubernetes/views/applications/helm/helm.controller.js
deleted file mode 100644
index 0b027c2ef..000000000
--- a/app/kubernetes/views/applications/helm/helm.controller.js
+++ /dev/null
@@ -1,52 +0,0 @@
-import PortainerError from 'Portainer/error';
-
-export default class KubernetesHelmApplicationController {
- /* @ngInject */
- constructor($async, $state, Authentication, Notifications, HelmService) {
- this.$async = $async;
- this.$state = $state;
- this.Authentication = Authentication;
- this.Notifications = Notifications;
- this.HelmService = HelmService;
- }
-
- /**
- * APPLICATION
- */
- async getHelmApplication() {
- try {
- this.state.dataLoading = true;
- const releases = await this.HelmService.listReleases(this.endpoint.Id, { filter: `^${this.state.params.name}$`, namespace: this.state.params.namespace });
- if (releases.length > 0) {
- this.state.release = releases[0];
- } else {
- throw new PortainerError(`Release ${this.state.params.name} not found`);
- }
- } catch (err) {
- this.Notifications.error('Failure', err, 'Unable to retrieve helm application details');
- } finally {
- this.state.dataLoading = false;
- }
- }
-
- $onInit() {
- return this.$async(async () => {
- this.state = {
- dataLoading: true,
- viewReady: false,
- params: {
- name: this.$state.params.name,
- namespace: this.$state.params.namespace,
- },
- release: {
- name: undefined,
- chart: undefined,
- app_version: undefined,
- },
- };
-
- await this.getHelmApplication();
- this.state.viewReady = true;
- });
- }
-}
diff --git a/app/kubernetes/views/applications/helm/helm.css b/app/kubernetes/views/applications/helm/helm.css
deleted file mode 100644
index 784f878fd..000000000
--- a/app/kubernetes/views/applications/helm/helm.css
+++ /dev/null
@@ -1,5 +0,0 @@
-.release-table tr {
- display: grid;
- grid-auto-flow: column;
- grid-template-columns: 1fr 4fr;
-}
diff --git a/app/kubernetes/views/applications/helm/helm.html b/app/kubernetes/views/applications/helm/helm.html
deleted file mode 100644
index a815e8a9d..000000000
--- a/app/kubernetes/views/applications/helm/helm.html
+++ /dev/null
@@ -1,50 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
- Name |
-
- {{ $ctrl.state.release.name }}
- |
-
-
- Chart |
-
- {{ $ctrl.state.release.chart }}
- |
-
-
- App version |
-
- {{ $ctrl.state.release.app_version }}
- |
-
-
-
-
-
-
-
-
diff --git a/app/kubernetes/views/applications/helm/index.js b/app/kubernetes/views/applications/helm/index.js
deleted file mode 100644
index b99f41d4b..000000000
--- a/app/kubernetes/views/applications/helm/index.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import angular from 'angular';
-import controller from './helm.controller';
-import './helm.css';
-
-angular.module('portainer.kubernetes').component('kubernetesHelmApplicationView', {
- templateUrl: './helm.html',
- controller,
- bindings: {
- endpoint: '<',
- },
-});
diff --git a/app/react/kubernetes/helm/HelmApplicationView/HelmApplicationView.test.tsx b/app/react/kubernetes/helm/HelmApplicationView/HelmApplicationView.test.tsx
new file mode 100644
index 000000000..296b17ff5
--- /dev/null
+++ b/app/react/kubernetes/helm/HelmApplicationView/HelmApplicationView.test.tsx
@@ -0,0 +1,119 @@
+import { render, screen } from '@testing-library/react';
+import { HttpResponse } from 'msw';
+
+import { withTestQueryProvider } from '@/react/test-utils/withTestQuery';
+import { server, http } from '@/setup-tests/server';
+import { withTestRouter } from '@/react/test-utils/withRouter';
+import { UserViewModel } from '@/portainer/models/user';
+import { withUserProvider } from '@/react/test-utils/withUserProvider';
+
+import { HelmApplicationView } from './HelmApplicationView';
+
+// Mock the necessary hooks and dependencies
+const mockUseCurrentStateAndParams = vi.fn();
+const mockUseEnvironmentId = vi.fn();
+
+vi.mock('@uirouter/react', async (importOriginal: () => Promise