diff --git a/app/portainer/views/settings/components/backup-settings-panel/backup-settings-panel.controller.js b/app/portainer/views/settings/components/backup-settings-panel/backup-settings-panel.controller.js
new file mode 100644
index 000000000..13431ab31
--- /dev/null
+++ b/app/portainer/views/settings/components/backup-settings-panel/backup-settings-panel.controller.js
@@ -0,0 +1,131 @@
+import { FeatureId } from '@/react/portainer/feature-flags/enums';
+import { isBE } from '@/react/portainer/feature-flags/feature-flags.service';
+import { options } from '@/react/portainer/settings/SettingsView/backup-options';
+
+/* @ngInject */
+export default function BackupSettingsPanelController($scope, $async, BackupService, Notifications, FileSaver) {
+ this.$onInit = $onInit.bind(this);
+ this.onBackupOptionsChange = onBackupOptionsChange.bind(this);
+ this.onToggleAutoBackups = onToggleAutoBackups.bind(this);
+ this.getS3SettingsPayload = getS3SettingsPayload.bind(this);
+
+ this.downloadBackup = downloadBackup.bind(this);
+ this.saveS3BackupSettings = saveS3BackupSettings.bind(this);
+ this.exportBackup = exportBackup.bind(this);
+
+ this.backupOptions = options;
+ this.s3BackupFeatureId = FeatureId.S3_BACKUP_SETTING;
+ this.BACKUP_FORM_TYPES = { S3: 's3', FILE: 'file' };
+
+ this.formValues = {
+ passwordProtect: false,
+ password: '',
+ scheduleAutomaticBackups: true,
+ cronRule: '',
+ accessKeyId: '',
+ secretAccessKey: '',
+ region: '',
+ bucketName: '',
+ s3CompatibleHost: '',
+ backupFormType: this.BACKUP_FORM_TYPES.FILE,
+ };
+
+ this.state = {
+ backupInProgress: false,
+ featureLimited: false,
+ };
+
+ function onToggleAutoBackups(checked) {
+ $scope.$evalAsync(() => {
+ this.formValues.scheduleAutomaticBackups = checked;
+ });
+ }
+
+ function onBackupOptionsChange(type, limited) {
+ this.formValues.backupFormType = type;
+ this.state.featureLimited = limited;
+ }
+
+ function downloadBackup() {
+ const payload = {};
+ if (this.formValues.passwordProtect) {
+ payload.password = this.formValues.password;
+ }
+
+ this.state.backupInProgress = true;
+
+ BackupService.downloadBackup(payload)
+ .then((data) => {
+ const downloadData = new Blob([data.file], { type: 'application/gzip' });
+ FileSaver.saveAs(downloadData, data.name);
+ Notifications.success('Success', 'Backup successfully downloaded');
+ })
+ .catch((err) => {
+ Notifications.error('Failure', err, 'Unable to download backup');
+ })
+ .finally(() => {
+ this.state.backupInProgress = false;
+ });
+ }
+
+ function saveS3BackupSettings() {
+ const payload = this.getS3SettingsPayload();
+ BackupService.saveS3Settings(payload)
+ .then(() => {
+ Notifications.success('Success', 'S3 Backup settings successfully saved');
+ })
+ .catch((err) => {
+ Notifications.error('Failure', err, 'Unable to save S3 backup settings');
+ })
+ .finally(() => {
+ this.state.backupInProgress = false;
+ });
+ }
+
+ function exportBackup() {
+ const payload = this.getS3SettingsPayload();
+ BackupService.exportBackup(payload)
+ .then(() => {
+ Notifications.success('Success', 'Exported backup to S3 successfully');
+ })
+ .catch((err) => {
+ Notifications.error('Failure', err, 'Unable to export backup to S3');
+ })
+ .finally(() => {
+ this.state.backupInProgress = false;
+ });
+ }
+
+ function getS3SettingsPayload() {
+ return {
+ Password: this.formValues.passwordProtectS3 ? this.formValues.passwordS3 : '',
+ CronRule: this.formValues.scheduleAutomaticBackups ? this.formValues.cronRule : '',
+ AccessKeyID: this.formValues.accessKeyId,
+ SecretAccessKey: this.formValues.secretAccessKey,
+ Region: this.formValues.region,
+ BucketName: this.formValues.bucketName,
+ S3CompatibleHost: this.formValues.s3CompatibleHost,
+ };
+ }
+
+ function $onInit() {
+ return $async(async () => {
+ try {
+ const data = isBE ? await BackupService.getS3Settings() : {};
+
+ this.formValues.passwordS3 = data.Password;
+ this.formValues.cronRule = data.CronRule;
+ this.formValues.accessKeyId = data.AccessKeyID;
+ this.formValues.secretAccessKey = data.SecretAccessKey;
+ this.formValues.region = data.Region;
+ this.formValues.bucketName = data.BucketName;
+ this.formValues.s3CompatibleHost = data.S3CompatibleHost;
+
+ this.formValues.scheduleAutomaticBackups = this.formValues.cronRule ? true : false;
+ this.formValues.passwordProtectS3 = this.formValues.passwordS3 ? true : false;
+ } catch (err) {
+ Notifications.error('Failure', err, 'Unable to retrieve S3 backup settings');
+ }
+ });
+ }
+}
diff --git a/app/portainer/views/settings/components/backup-settings-panel/backup-settings-panel.html b/app/portainer/views/settings/components/backup-settings-panel/backup-settings-panel.html
new file mode 100644
index 000000000..ea4d6617f
--- /dev/null
+++ b/app/portainer/views/settings/components/backup-settings-panel/backup-settings-panel.html
@@ -0,0 +1,320 @@
+
diff --git a/app/portainer/views/settings/components/backup-settings-panel/index.js b/app/portainer/views/settings/components/backup-settings-panel/index.js
new file mode 100644
index 000000000..397a38a5a
--- /dev/null
+++ b/app/portainer/views/settings/components/backup-settings-panel/index.js
@@ -0,0 +1,12 @@
+import angular from 'angular';
+
+import controller from './backup-settings-panel.controller';
+
+angular.module('portainer.app').component('backupSettingsPanel', {
+ templateUrl: './backup-settings-panel.html',
+ controller,
+ bindings: {
+ settings: '<',
+ onSubmit: '<',
+ },
+});
diff --git a/app/portainer/views/settings/settings.html b/app/portainer/views/settings/settings.html
index 76b325b91..e9086232f 100644
--- a/app/portainer/views/settings/settings.html
+++ b/app/portainer/views/settings/settings.html
@@ -10,241 +10,4 @@
-
+
diff --git a/app/portainer/views/settings/settingsController.js b/app/portainer/views/settings/settingsController.js
index 315e2cbce..5b5d3c5d2 100644
--- a/app/portainer/views/settings/settingsController.js
+++ b/app/portainer/views/settings/settingsController.js
@@ -1,113 +1,13 @@
import angular from 'angular';
-import { FeatureId } from '@/react/portainer/feature-flags/enums';
-import { options } from '@/react/portainer/settings/SettingsView/backup-options';
-
angular.module('portainer.app').controller('SettingsController', [
'$scope',
'Notifications',
'SettingsService',
'StateManager',
- 'BackupService',
- 'FileSaver',
- function ($scope, Notifications, SettingsService, StateManager, BackupService, FileSaver) {
- $scope.customBannerFeatureId = FeatureId.CUSTOM_LOGIN_BANNER;
- $scope.s3BackupFeatureId = FeatureId.S3_BACKUP_SETTING;
- $scope.enforceDeploymentOptions = FeatureId.ENFORCE_DEPLOYMENT_OPTIONS;
-
+ function ($scope, Notifications, SettingsService, StateManager) {
$scope.updateSettings = updateSettings;
- $scope.backupOptions = options;
-
- $scope.state = {
- actionInProgress: false,
-
- backupInProgress: false,
- featureLimited: false,
- showHTTPS: !window.ddExtension,
- };
-
- $scope.BACKUP_FORM_TYPES = { S3: 's3', FILE: 'file' };
-
- $scope.formValues = {
- passwordProtect: false,
- password: '',
- backupFormType: $scope.BACKUP_FORM_TYPES.FILE,
- };
-
- $scope.onToggleAutoBackups = function onToggleAutoBackups(checked) {
- $scope.$evalAsync(() => {
- $scope.formValues.scheduleAutomaticBackups = checked;
- });
- };
-
- $scope.onBackupOptionsChange = function (type, limited) {
- $scope.formValues.backupFormType = type;
- $scope.state.featureLimited = limited;
- };
-
- $scope.downloadBackup = function () {
- const payload = {};
- if ($scope.formValues.passwordProtect) {
- payload.password = $scope.formValues.password;
- }
-
- $scope.state.backupInProgress = true;
-
- BackupService.downloadBackup(payload)
- .then(function success(data) {
- const downloadData = new Blob([data.file], { type: 'application/gzip' });
- FileSaver.saveAs(downloadData, data.name);
- Notifications.success('Success', 'Backup successfully downloaded');
- })
- .catch(function error(err) {
- Notifications.error('Failure', err, 'Unable to download backup');
- })
- .finally(function final() {
- $scope.state.backupInProgress = false;
- });
- };
-
- $scope.saveS3BackupSettings = function () {
- const payload = getS3SettingsPayload();
- BackupService.saveS3Settings(payload)
- .then(function success() {
- Notifications.success('Success', 'S3 Backup settings successfully saved');
- })
- .catch(function error(err) {
- Notifications.error('Failure', err, 'Unable to save S3 backup settings');
- })
- .finally(function final() {
- $scope.state.backupInProgress = false;
- });
- };
-
- $scope.exportBackup = function () {
- const payload = getS3SettingsPayload();
- BackupService.exportBackup(payload)
- .then(function success() {
- Notifications.success('Success', 'Exported backup to S3 successfully');
- })
- .catch(function error(err) {
- Notifications.error('Failure', err, 'Unable to export backup to S3');
- })
- .finally(function final() {
- $scope.state.backupInProgress = false;
- });
- };
-
- function getS3SettingsPayload() {
- return {
- Password: $scope.formValues.passwordProtectS3 ? $scope.formValues.passwordS3 : '',
- CronRule: $scope.formValues.scheduleAutomaticBackups ? $scope.formValues.cronRule : '',
- AccessKeyID: $scope.formValues.accessKeyId,
- SecretAccessKey: $scope.formValues.secretAccessKey,
- Region: $scope.formValues.region,
- BucketName: $scope.formValues.bucketName,
- S3CompatibleHost: $scope.formValues.s3CompatibleHost,
- };
- }
-
function updateSettings(settings, successMessage = 'Settings updated') {
// ignore CloudApiKeys to avoid overriding them
//
@@ -123,9 +23,6 @@ angular.module('portainer.app').controller('SettingsController', [
})
.catch(function error(err) {
Notifications.error('Failure', err, 'Unable to update settings');
- })
- .finally(function final() {
- $scope.state.actionInProgress = false;
});
}