2020-05-22 13:48:26 +02:00
<!-- Modal details -->
< div class = "modal fade" id = "backupDetailsModal" tabindex = "-1" role = "dialog" >
2022-09-29 16:07:43 +02:00
< div class = "modal-dialog" style = "width: 750px" >
2020-05-22 13:48:26 +02:00
< div class = "modal-content" >
< div class = "modal-header" >
2020-11-03 16:58:11 +01:00
< h4 class = "modal-title" > {{ 'backups.backupDetails.title' | tr }}< / h4 >
2020-05-22 13:48:26 +02:00
< / div >
< div class = "modal-body" >
< div class = "row" >
2022-09-29 16:07:43 +02:00
< div class = "col-xs-2 text-muted" > {{ 'backups.backupDetails.id' | tr }}:< / div >
< div class = "col-xs-10 text-right" > {{ backupDetails.backup.id }}< / div >
2020-05-22 13:48:26 +02:00
< / div >
2022-04-05 14:41:41 +02:00
< div class = "row" >
2022-09-29 16:07:43 +02:00
< div class = "col-xs-2 text-muted" > {{ 'backups.backupEdit.label' | tr }}:< / div >
< div class = "col-xs-10 text-right" > {{ backupDetails.backup.label }}< / div >
2022-04-05 14:41:41 +02:00
< / div >
2023-09-05 08:52:49 +05:30
< div class = "row" >
< div class = "col-xs-2 text-muted" > {{ 'backups.backupEdit.remotePath' | tr }}:< / div >
< div class = "col-xs-10 text-right" > {{ backupDetails.backup.remotePath }}< / div >
< / div >
2020-05-22 13:48:26 +02:00
< div class = "row" >
2022-09-29 16:07:43 +02:00
< div class = "col-xs-2 text-muted" > {{ 'backups.backupDetails.date' | tr }}:< / div >
< div class = "col-xs-10 text-right" > {{ backupDetails.backup.creationTime | prettyLongDate }}< / div >
2020-05-22 13:48:26 +02:00
< / div >
< div class = "row" >
2022-09-29 16:07:43 +02:00
< div class = "col-xs-2 text-muted" > {{ 'backups.backupDetails.version' | tr }}:< / div >
< div class = "col-xs-10 text-right" > v{{ backupDetails.backup.packageVersion }}< / div >
2020-05-22 13:48:26 +02:00
< / div >
< div class = "row" >
2022-09-29 16:07:43 +02:00
< div class = "col-xs-2 text-muted" > {{ 'backups.backupDetails.format' | tr }}:< / div >
< div class = "col-xs-10 text-right" > {{ backupDetails.backup.format }}< / div >
2020-05-22 13:48:26 +02:00
< / div >
< br / >
2020-11-12 23:13:52 +01:00
< p class = "text-muted" > {{ 'backups.backupDetails.list' | tr:{ appCount: backupDetails.backup.contents.length } }}:< / p >
2024-03-14 16:06:38 +01:00
< span ng-repeat = "content in backupDetails.backup.contents | orderBy:['label','fqdn']" >
< a ng-if = "content.fqdn" ng-href = "/#/app/{{content.id}}/backups" > {{ content.label || content.fqdn }}< / a >
< a ng-if = "!content.fqdn" ng-href = "/#/eventlog?search={{content.id}}" > {{ content.id }}< / a >
< span ng-hide = "$last" > ,< / span >
2020-05-27 09:20:39 -07:00
< / span >
2020-05-22 13:48:26 +02:00
< / div >
< div class = "modal-footer" >
2020-11-03 16:58:11 +01:00
< button type = "button" class = "btn btn-primary" data-dismiss = "modal" > {{ 'main.dialog.close' | tr }}< / button >
2020-05-22 13:48:26 +02:00
< / div >
< / div >
< / div >
< / div >
2022-04-05 14:41:41 +02:00
<!-- Modal edit individual backup (label and retention sec) -->
< div class = "modal fade" id = "editBackupModal" tabindex = "-1" role = "dialog" >
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
2022-04-08 15:09:04 +02:00
< h4 class = "modal-title" > {{ 'backups.backupEdit.title' | tr }}< / h4 >
2022-04-05 14:41:41 +02:00
< / div >
< div class = "modal-body" >
< form name = "editBackupForm" role = "form" novalidate ng-submit = "editBackup.submit()" autocomplete = "off" >
< p class = "has-error text-center" ng-show = "editBackup.error" > {{ editBackup.error }}< / p >
< div class = "form-group" >
2022-04-08 15:09:04 +02:00
< label class = "control-label" for = "inputBackupLabel" > {{ 'backups.backupEdit.label' | tr }}< / label >
2022-04-05 14:41:41 +02:00
< input type = "text" class = "form-control" ng-model = "editBackup.label" id = "inputBackupLabel" name = "label" ng-disabled = "editBackup.busy" placeholder = "" autofocus >
< / div >
< div class = "form-group" >
2022-04-07 15:31:41 +02:00
< div class = "checkbox" >
< label >
2022-04-08 15:09:04 +02:00
< input type = "checkbox" ng-model = "editBackup.persist" > {{ 'backups.backupEdit.preserved.description' | tr }}< / input >
2022-04-08 11:22:05 -07:00
< sup > < a popover-placement = "top-right" popover-trigger = "outsideClick" uib-popover = "{{ 'backups.backupEdit.preserved.tooltip' | tr: { appsLength: editBackup.backup.contents.length} }}" > < i class = "fa fa-question-circle" > < / i > < / a > < / sup >
2022-04-07 15:31:41 +02:00
< / label >
< / div >
2022-04-05 14:41:41 +02:00
< / div >
< / form >
< / div >
< div class = "modal-footer" >
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > {{ 'main.dialog.cancel' | tr }}< / button >
< button type = "submit" class = "btn btn-outline btn-success pull-right" ng-click = "editBackup.submit()" ng-disabled = "editBackupForm.$invalid || editBackup.busy" > < i class = "fa fa-circle-notch fa-spin" ng-show = "editBackup.busy" > < / i > < span > {{ 'main.dialog.save' | tr }}< / span > < / button >
< / div >
< / div >
< / div >
< / div >
2018-06-07 14:22:48 +02:00
<!-- Modal backup failed -->
< div class = "modal fade" id = "createBackupFailedModal" tabindex = "-1" role = "dialog" >
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
2020-11-03 16:58:11 +01:00
< h4 class = "modal-title" > {{ 'backups.backupFailed.title' | tr }}< / h4 >
2018-06-07 14:22:48 +02:00
< / div >
< div class = "modal-body" >
{{ createBackup.errorMessage }}
< / div >
< div class = "modal-footer" >
2020-11-03 16:58:11 +01:00
< button type = "button" class = "btn btn-primary" data-dismiss = "modal" > {{ 'main.dialog.close' | tr }}< / button >
2018-06-07 14:22:48 +02:00
< / div >
< / div >
< / div >
< / div >
2020-07-15 15:10:37 -07:00
<!-- Cleanup backups info -->
< div class = "modal fade" id = "cleanupBackupsModal" tabindex = "-1" role = "dialog" >
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
2020-11-03 16:58:11 +01:00
< h4 class = "modal-title" > {{ 'backups.cleanupBackups.title' | tr }}< / h4 >
2020-07-15 15:10:37 -07:00
< / div >
2020-11-03 16:58:11 +01:00
< div class = "modal-body" > {{ 'backups.cleanupBackups.description' | tr }}< / div >
2020-07-15 15:10:37 -07:00
< div class = "modal-footer" >
2020-11-03 16:58:11 +01:00
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > {{ 'main.dialog.cancel' | tr }}< / button >
2023-05-02 15:02:41 +02:00
< button type = "submit" class = "btn btn-outline btn-success pull-right" ng-click = "cleanupBackups.start()" > {{ 'backups.cleanupBackups.cleanupNow' | tr }}< / button >
2020-07-15 15:10:37 -07:00
< / div >
< / div >
< / div >
< / div >
2023-08-08 13:21:56 +02:00
<!-- modal backup schedule config -->
2023-07-12 10:01:53 +05:30
< div class = "modal fade" id = "backupPolicyModal" tabindex = "-1" role = "dialog" >
2020-05-19 16:13:20 +02:00
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
2020-11-03 16:58:11 +01:00
< h4 class = "modal-title" > {{ 'backups.configureBackupSchedule.title' | tr }}< / h4 >
2020-05-19 16:13:20 +02:00
< / div >
< div class = "modal-body" >
2023-07-12 10:01:53 +05:30
< form name = "backupPolicyForm" role = "form" novalidate ng-submit = "backupPolicy.submit()" autocomplete = "off" >
< p class = "has-error text-center" ng-show = "backupPolicy.error" > {{ backupPolicy.error.generic }}< / p >
2020-07-28 21:48:24 -07:00
2020-11-03 16:58:11 +01:00
< div class = "form-group" >
< label class = "control-label" for = "backupSchedule" > {{ 'backups.configureBackupSchedule.schedule' | tr }}< / label >
< p ng-bind-html = "'backups.configureBackupSchedule.scheduleDescription' | tr" > < / p >
2020-07-28 21:48:24 -07:00
2020-11-03 16:58:11 +01:00
< div class = "row" style = "margin-left: 20px;" >
2023-07-12 10:01:53 +05:30
< div class = "col-md-5" ng-class = "{ 'has-error': !backupPolicy.days.length }" >
{{ 'backups.configureBackupSchedule.days' | tr }}: < multiselect id = "backupSchedule" class = "input-sm stretch" ng-model = "backupPolicy.days" options = "a.name for a in cronDays" data-multiple = "true" ng-required > < / multiselect >
2020-07-28 21:48:24 -07:00
< / div >
2020-05-19 16:13:20 +02:00
2023-07-12 10:01:53 +05:30
< div class = "col-md-5" ng-class = "{ 'has-error': !backupPolicy.hours.length }" >
{{ 'backups.configureBackupSchedule.hours' | tr }}: < multiselect class = "input-sm stretch" ng-model = "backupPolicy.hours" options = "a.name for a in cronHours" data-multiple = "true" > < / multiselect >
2020-11-03 16:58:11 +01:00
< / div >
2020-05-19 16:13:20 +02:00
< / div >
2020-11-03 16:58:11 +01:00
< / div >
2020-05-19 16:13:20 +02:00
2020-11-03 16:58:11 +01:00
< div class = "form-group" >
< label class = "control-label" for = "backupRetention" > {{ 'backups.configureBackupSchedule.retentionPolicy' | tr }}< / label >
2023-07-12 10:01:53 +05:30
< select class = "form-control" id = "backupRetention" ng-model = "backupPolicy.retention" ng-options = "a.value as a.name for a in backupRetentions" > < / select >
2020-11-03 16:58:11 +01:00
< / div >
2020-05-19 16:13:20 +02:00
< / form >
< / div >
< div class = "modal-footer " >
2020-11-03 16:58:11 +01:00
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > {{ 'main.dialog.cancel' | tr }}< / button >
2023-07-12 10:01:53 +05:30
< button type = "submit" class = "btn btn-outline btn-success pull-right" ng-click = "backupPolicy.submit()" ng-disabled = "!backupPolicy.valid() || backupPolicy.busy" > < i class = "fa fa-circle-notch fa-spin" ng-show = "backupPolicy.busy" > < / i > < span > {{ 'main.dialog.save' | tr }}< / span > < / button >
2020-05-19 16:13:20 +02:00
< / div >
< / div >
< / div >
< / div >
2018-06-07 14:22:48 +02:00
<!-- modal backup config -->
< div class = "modal fade" id = "configureBackupModal" tabindex = "-1" role = "dialog" >
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
2020-11-03 16:58:11 +01:00
< h4 class = "modal-title" > {{ 'backups.configureBackupStorage.title' | tr }}< / h4 >
2018-06-07 14:22:48 +02:00
< / div >
< div class = "modal-body" >
< form name = "configureBackupForm" role = "form" novalidate ng-submit = "configureBackup.submit()" autocomplete = "off" >
2020-11-03 16:58:11 +01:00
< p class = "has-error text-center" ng-show = "configureBackup.error" > {{ configureBackup.error.generic }}< / p >
< div class = "form-group" >
< label class = "control-label" for = "storageProviderProvider" > {{ 'backups.configureBackupStorage.provider' | tr }} < sup > < a ng-href = "https://docs.cloudron.io/backups/#storage-providers" class = "help" target = "_blank" > < i class = "fa fa-question-circle" > < / i > < / a > < / sup > < / label >
< p class = "small text-info" ng-show = "backupConfig.provider !== configureBackup.provider" > Backups in the old storage location have to be removed manually.< / p >
2022-12-24 11:10:04 +01:00
< select class = "form-control" id = "storageProviderProvider" ng-model = "configureBackup.provider" ng-options = "a.value as a.name for a in storageProviders" ng-change = configureBackup.clearProviderFields() > < / select >
2020-11-03 16:58:11 +01:00
< / div >
<!-- Noop -->
< div class = "form-group" ng-show = "configureBackup.provider === 'noop'" >
< p class = "has-error" > {{ 'backups.configureBackupStorage.noopNote' | tr }}< / p >
< / div >
2021-06-21 22:08:19 -07:00
<!-- mountpoint -->
< div class = "form-group" ng-class = "{ 'has-error': configureBackup.error.mountPoint || (configureBackupForm.mountPoint.$dirty && !configureBackup.mountPoint) }" ng-show = "configureBackup.provider === 'mountpoint'" >
2020-11-03 16:58:11 +01:00
< label class = "control-label" for = "inputConfigureMountPoint" > {{ 'backups.configureBackupStorage.mountPoint' | tr }}< / label >
2021-06-21 22:08:19 -07:00
< input type = "text" class = "form-control" ng-model = "configureBackup.mountPoint" id = "inputConfigureMountPoint" name = "mountPoint" ng-disabled = "configureBackup.busy" placeholder = "/mnt/backups" ng-required = "configureBackup.provider === 'mountpoint'" >
2023-12-01 17:29:06 +01:00
< p ng-show = "configureBackup.provider === 'mountpoint'" ng-bind-html = "'backups.configureBackupStorage.mountPointDescription' | tr:{ providerDocsLink: 'https://docs.cloudron.io/backups/#'+configureBackup.provider }" > < / p >
2021-05-17 15:24:19 -07:00
< / div >
2021-06-21 22:39:43 -07:00
<!-- CIFS/NFS/SSHFS -->
< div class = "form-group" ng-show = "configureBackup.provider === 'cifs' || configureBackup.provider === 'nfs' || configureBackup.provider === 'sshfs'" >
2021-05-17 15:24:19 -07:00
< label class = "control-label" for = "configureBackupHost" > {{ 'backups.configureBackupStorage.server' | tr }} ({{ configureBackup.provider }})< / label >
2021-09-14 11:37:36 +02:00
< input type = "text" class = "form-control" ng-model = "configureBackup.mountOptions.host" id = "configureBackupHost" name = "host" ng-disabled = "configureBackup.busy" placeholder = "Server IP or hostname" ng-required = "configureBackup.provider === 'cifs' || configureBackup.provider === 'nfs' || configureBackup.provider === 'sshfs'" >
2021-05-17 15:24:19 -07:00
< / div >
2022-01-10 14:28:25 +01:00
<!-- CIFS -->
< div class = "checkbox" ng-show = "configureBackup.provider === 'cifs'" >
< label >
2022-01-10 16:09:42 +01:00
< input type = "checkbox" ng-model = "configureBackup.mountOptions.seal" > {{ 'backups.configureBackupStorage.cifsSealSupport' | tr }}< / input >
2022-01-10 14:28:25 +01:00
< / label >
< / div >
2021-09-14 11:37:36 +02:00
<!-- CIFS/NFS/SSHFS -->
2021-06-21 22:39:43 -07:00
< div class = "form-group" ng-show = "configureBackup.provider === 'cifs' || configureBackup.provider === 'nfs' || configureBackup.provider === 'sshfs'" >
2021-05-17 15:24:19 -07:00
< label class = "control-label" for = "configureBackupRemoteDir" > {{ 'backups.configureBackupStorage.remoteDirectory' | tr }} ({{ configureBackup.provider }})< / label >
2021-07-09 16:32:04 -07:00
< input type = "text" class = "form-control" ng-model = "configureBackup.mountOptions.remoteDir" id = "configureBackupRemoteDir" name = "remoteDir" ng-disabled = "configureBackup.busy" placeholder = "/share" ng-required = "configureBackup.provider === 'cifs' || configureBackup.provider === 'nfs' || configureBackup.provider === 'sshfs'" >
2021-05-17 15:24:19 -07:00
< / div >
2021-09-14 11:37:36 +02:00
<!-- CIFS -->
2021-05-17 15:24:19 -07:00
< div class = "form-group" ng-show = "configureBackup.provider === 'cifs'" >
< label class = "control-label" for = "configureBackupUsername" > {{ 'backups.configureBackupStorage.username' | tr }} ({{ configureBackup.provider }})< / label >
2022-03-30 09:14:08 -07:00
< input type = "text" class = "form-control" ng-model = "configureBackup.mountOptions.username" id = "configureBackupUsername" name = "cifsUsername" ng-disabled = "configureBackup.busy" >
2021-05-17 15:24:19 -07:00
< / div >
2021-09-14 11:37:36 +02:00
<!-- CIFS -->
2021-05-17 15:24:19 -07:00
< div class = "form-group" ng-show = "configureBackup.provider === 'cifs'" >
< label class = "control-label" for = "configureBackupPassword" > {{ 'backups.configureBackupStorage.password' | tr }} ({{ configureBackup.provider }})< / label >
2022-03-30 09:14:08 -07:00
< input type = "password" class = "form-control" ng-model = "configureBackup.mountOptions.password" id = "configureBackupPassword" name = "cifsPassword" ng-disabled = "configureBackup.busy" password-reveal >
2021-05-17 15:24:19 -07:00
< / div >
2023-08-08 13:21:56 +02:00
<!-- EXT4/XFS -->
< div class = "form-group" ng-class = "{ 'has-error': configureBackup.error.diskPath || !configureBackup.mountOptions.diskPath }" ng-show = "configureBackup.provider === 'xfs' || configureBackup.provider === 'ext4'" >
2021-05-17 15:24:19 -07:00
< label class = "control-label" for = "inputConfigureDiskPath" > {{ 'backups.configureBackupStorage.diskPath' | tr }}< / label >
2023-08-08 13:21:56 +02:00
< input type = "text" class = "form-control" ng-model = "configureBackup.mountOptions.diskPath" id = "inputConfigureDiskPath" name = "diskPath" ng-disabled = "configureBackup.busy" placeholder = "/dev/disk/by-uuid/uuid" ng-required = "configureBackup.provider === 'xfs' || configureBackup.provider === 'ext4'" >
< / div >
<!-- Disk -->
< div class = "form-group" ng-class = "{ 'has-error': configureBackup.error.diskPath || !configureBackup.mountOptions.diskPath }" ng-show = "configureBackup.provider === 'disk'" >
< label class = "control-label" > {{ 'backups.configureBackupStorage.diskPath' | tr }}< / label >
< select class = "form-control" ng-model = "configureBackup.disk" ng-options = "item as item.label for item in configureBackup.blockDevices track by item.path" ng-required = "configureBackup.provider === 'disk'" > < / select >
2020-11-03 16:58:11 +01:00
< / div >
2021-05-27 15:31:37 -07:00
<!-- SSHFS -->
< div class = "form-group" ng-show = "configureBackup.provider === 'sshfs'" >
< label class = "control-label" for = "configureBackupPort" > {{ 'backups.configureBackupStorage.port' | tr }}< / label >
2021-07-09 16:32:04 -07:00
< input type = "number" class = "form-control" ng-model = "configureBackup.mountOptions.port" id = "configureBackupPort" name = "port" ng-disabled = "configureBackup.busy" ng-required = "configureBackup.provider === 'sshfs'" >
2021-05-27 15:31:37 -07:00
< / div >
<!-- SSHFS -->
< div class = "form-group" ng-show = "configureBackup.provider === 'sshfs'" >
< label class = "control-label" for = "configureBackupUser" > {{ 'backups.configureBackupStorage.user' | tr }}< / label >
2021-07-09 16:32:04 -07:00
< input type = "text" class = "form-control" ng-model = "configureBackup.mountOptions.user" id = "configureBackupUser" name = "user" ng-disabled = "configureBackup.busy" ng-required = "configureBackup.provider === 'sshfs'" >
2021-05-27 15:31:37 -07:00
< / div >
<!-- SSHFS -->
< div class = "form-group" ng-show = "configureBackup.provider === 'sshfs'" >
< label class = "control-label" for = "configureBackupPrivateKey" > {{ 'backups.configureBackupStorage.privateKey' | tr }}< / label >
2021-07-09 16:32:04 -07:00
< textarea class = "form-control" ng-model = "configureBackup.mountOptions.privateKey" id = "configureBackupPrivateKey" name = "privateKey" ng-disabled = "configureBackup.busy" ng-required = "configureBackup.provider === 'sshfs'" > < / textarea >
2021-05-27 15:31:37 -07:00
< / div >
2020-11-03 16:58:11 +01:00
<!-- Filesystem -->
2021-07-09 16:32:04 -07:00
< div class = "form-group" ng-class = "{ 'has-error': configureBackup.error.backupFolder }" ng-show = "configureBackup.provider === 'filesystem'" >
2020-11-03 16:58:11 +01:00
< label class = "control-label" for = "inputConfigureBackupFolder" > {{ 'backups.configureBackupStorage.localDirectory' | tr }}< / label >
< input type = "text" class = "form-control" ng-model = "configureBackup.backupFolder" id = "inputConfigureBackupFolder" name = "backupFolder" ng-disabled = "configureBackup.busy" placeholder = "Directory for backups" ng-required = "configureBackup.provider === 'filesystem'" >
< / div >
2021-05-17 15:24:19 -07:00
<!-- Filesystem/SSHFS/CIFS/NFS/EXT4/mountpoint -->
2020-11-03 16:58:11 +01:00
< div class = "checkbox" ng-show = "configureBackup.provider === 'filesystem' || mountlike(configureBackup.provider)" >
< label >
< input type = "checkbox" ng-model = "configureBackup.useHardlinks" > {{ 'backups.configureBackupStorage.hardlinksLabel' | tr }}< / input >
< / label >
< / div >
2025-01-24 13:41:54 +01:00
<!-- CIFS/mountpoint -->
< div class = "checkbox" ng-show = "configureBackup.provider === 'mountpoint' || configureBackup.provider === 'cifs'" >
< label >
< input type = "checkbox" ng-model = "configureBackup.preserveAttributes" > {{ 'backups.configureBackupStorage.preserveAttributesLabel' | tr }}< / input >
< / label >
< / div >
2022-02-16 11:48:57 -08:00
<!-- mountpoint -->
< div class = "checkbox" ng-show = "configureBackup.provider === 'mountpoint'" >
< label >
< input type = "checkbox" ng-model = "configureBackup.chown" > {{ 'backups.configureBackupStorage.chown' | tr }}< / input >
< / label >
< / div >
2022-09-27 19:40:58 +02:00
<!-- S3/Minio/SOS/GCS/UpCloud/B2/R2 -->
2023-01-10 11:16:09 +01:00
< div class = "form-group" ng-class = "{ 'has-error': configureBackup.error.endpoint }" ng-show = "configureBackup.provider === 'minio' || configureBackup.provider === 'upcloud-objectstorage' || configureBackup.provider === 'backblaze-b2' || configureBackup.provider === 'cloudflare-r2' || configureBackup.provider === 's3-v4-compat' || configureBackup.provider === 'idrive-e2'" >
2020-11-03 16:58:11 +01:00
< label class = "control-label" for = "inputConfigureBackupEndpoint" > {{ 'backups.configureBackupStorage.s3Endpoint' | tr }}< / label >
2023-01-10 11:16:09 +01:00
< input type = "text" class = "form-control" ng-model = "configureBackup.endpoint" id = "inputConfigureBackupEndpoint" name = "endpoint" ng-disabled = "configureBackup.busy" placeholder = "URL" ng-required = "configureBackup.provider === 'minio' || configureBackup.provider === 'upcloud-objectstorage' || configureBackup.provider === 'backblaze-b2' || configureBackup.provider === 'cloudflare-r2' || configureBackup.provider === 's3-v4-compat' || configureBackup.provider === 'idrive-e2'" >
2020-11-03 16:58:11 +01:00
< / div >
< div class = "checkbox" ng-show = "configureBackup.provider === 'minio' || configureBackup.provider === 's3-v4-compat'" >
< label >
< input type = "checkbox" ng-model = "configureBackup.acceptSelfSignedCerts" > {{ 'backups.configureBackupStorage.acceptSelfSignedCerts' | tr }}< / input >
< / label >
< / div >
< div class = "form-group" ng-class = "{ 'has-error': configureBackup.error.bucket }" ng-show = "s3like(configureBackup.provider) || configureBackup.provider === 'gcs'" >
< label class = "control-label" for = "inputConfigureBackupBucket" > {{ 'backups.configureBackupStorage.bucketName' | tr }}< / label >
< input type = "text" class = "form-control" ng-model = "configureBackup.bucket" id = "inputConfigureBackupBucket" name = "bucket" ng-disabled = "configureBackup.busy" ng-required = "s3like(configureBackup.provider)" >
< / div >
<!-- S3/Minio/SOS/GCS/SSHFS/CIFS/NFS/B2 -->
< div class = "form-group" ng-class = "{ 'has-error': configureBackup.error.prefix }" ng-show = "configureBackup.provider !== 'filesystem' && configureBackup.provider !== 'noop'" >
< label class = "control-label" for = "inputConfigureBackupPrefix" > {{ 'backups.configureBackupStorage.prefix' | tr }}< / label >
< input type = "text" class = "form-control" ng-model = "configureBackup.prefix" id = "inputConfigureBackupPrefix" name = "prefix" ng-disabled = "configureBackup.busy" placeholder = "Prefix for backup file names" >
< / div >
<!-- S3/Minio/SOS/GCS -->
< div class = "form-group" ng-class = "{ 'has-error': configureBackup.error.region }" ng-show = "configureBackup.provider === 's3'" >
< label class = "control-label" for = "inputConfigureBackupS3Region" > {{ 'backups.configureBackupStorage.region' | tr }}< / label >
< select class = "form-control" name = "region" id = "inputConfigureBackupS3Region" ng-model = "configureBackup.region" ng-options = "a.value as a.name for a in s3Regions" ng-disabled = "configureBackup.busy" ng-required = "configureBackup.provider === 's3'" > < / select >
< / div >
< div class = "form-group" ng-class = "{ 'has-error': configureBackup.error.region }" ng-show = "configureBackup.provider === 's3-v4-compat'" >
< label class = "control-label" for = "inputConfigureBackupS3V4CompatRegion" > {{ 'backups.configureBackupStorage.region' | tr }}< / label >
< input class = "form-control" type = "text" name = "region" id = "inputConfigureBackupS3V4CompatRegion" ng-model = "configureBackup.region" ng-disabled = "configureBackup.busy" placeholder = "Leave empty to use us-east-1 as default" > < / input >
< / div >
< div class = "form-group" ng-class = "{ 'has-error': configureBackup.error.region }" ng-show = "configureBackup.provider === 'digitalocean-spaces'" >
< label class = "control-label" for = "inputConfigureBackupDORegion" > {{ 'backups.configureBackupStorage.region' | tr }}< / label >
< select class = "form-control" name = "region" id = "inputConfigureBackupDORegion" ng-model = "configureBackup.endpoint" ng-options = "a.value as a.name for a in doSpacesRegions" ng-disabled = "configureBackup.busy" ng-required = "configureBackup.provider === 'digitalocean-spaces'" > < / select >
< / div >
2024-09-25 12:21:42 +02:00
< div class = "form-group" ng-class = "{ 'has-error': configureBackup.error.region }" ng-show = "configureBackup.provider === 'hetzner-objectstorage'" >
< label class = "control-label" for = "inputConfigureBackupHetznerRegion" > {{ 'backups.configureBackupStorage.region' | tr }}< / label >
< select class = "form-control" name = "region" id = "inputConfigureBackupHetznerRegion" ng-model = "configureBackup.endpoint" ng-options = "a.value as a.name for a in hetznerRegions" ng-disabled = "configureBackup.busy" ng-required = "configureBackup.provider === 'hetzner-objectstorage'" > < / select >
< / div >
2020-11-03 16:58:11 +01:00
< div class = "form-group" ng-class = "{ 'has-error': configureBackup.error.region }" ng-show = "configureBackup.provider === 'exoscale-sos'" >
< label class = "control-label" for = "inputConfigureBackupExoscaleRegion" > {{ 'backups.configureBackupStorage.region' | tr }}< / label >
< select class = "form-control" name = "region" id = "inputConfigureBackupExoscaleRegion" ng-model = "configureBackup.endpoint" ng-options = "a.value as a.name for a in exoscaleSosRegions" ng-disabled = "configureBackup.busy" ng-required = "configureBackup.provider === 'exoscale-sos'" > < / select >
< / div >
< div class = "form-group" ng-class = "{ 'has-error': configureBackup.error.region }" ng-show = "configureBackup.provider === 'wasabi'" >
< label class = "control-label" for = "inputConfigureBackupWasabiRegion" > {{ 'backups.configureBackupStorage.region' | tr }}< / label >
< select class = "form-control" name = "region" id = "inputConfigureBackupWasabiRegion" ng-model = "configureBackup.endpoint" ng-options = "a.value as a.name for a in wasabiRegions" ng-disabled = "configureBackup.busy" ng-required = "configureBackup.provider === 'wasabi'" > < / select >
< / div >
< div class = "form-group" ng-class = "{ 'has-error': configureBackup.error.region }" ng-show = "configureBackup.provider === 'scaleway-objectstorage'" >
< label class = "control-label" for = "inputConfigureBackupScalewayRegion" > {{ 'backups.configureBackupStorage.region' | tr }}< / label >
< select class = "form-control" name = "region" id = "inputConfigureBackupScalewayRegion" ng-model = "configureBackup.endpoint" ng-options = "a.value as a.name for a in scalewayRegions" ng-disabled = "configureBackup.busy" ng-required = "configureBackup.provider === 'scaleway-objectstorage'" > < / select >
< / div >
< div class = "form-group" ng-class = "{ 'has-error': configureBackup.error.region }" ng-show = "configureBackup.provider === 'linode-objectstorage'" >
< label class = "control-label" for = "inputConfigureBackupLinodeRegion" > {{ 'backups.configureBackupStorage.region' | tr }}< / label >
< select class = "form-control" name = "region" id = "inputConfigureBackupLinodeRegion" ng-model = "configureBackup.endpoint" ng-options = "a.value as a.name for a in linodeRegions" ng-disabled = "configureBackup.busy" ng-required = "configureBackup.provider === 'linode-objectstorage'" > < / select >
< / div >
< div class = "form-group" ng-class = "{ 'has-error': configureBackup.error.region }" ng-show = "configureBackup.provider === 'ovh-objectstorage'" >
< label class = "control-label" for = "inputConfigureBackupOvhRegion" > {{ 'backups.configureBackupStorage.region' | tr }}< / label >
< select class = "form-control" name = "region" id = "inputConfigureBackupOvhRegion" ng-model = "configureBackup.endpoint" ng-options = "a.value as a.name for a in ovhRegions" ng-disabled = "configureBackup.busy" ng-required = "configureBackup.provider === 'ovh-objectstorage'" > < / select >
< / div >
2021-02-04 10:14:42 -08:00
< div class = "form-group" ng-class = "{ 'has-error': configureBackup.error.region }" ng-show = "configureBackup.provider === 'ionos-objectstorage'" >
< label class = "control-label" for = "inputConfigureBackupIonosRegion" > {{ 'backups.configureBackupStorage.region' | tr }}< / label >
< select class = "form-control" name = "region" id = "inputConfigureBackupIonosRegion" ng-model = "configureBackup.endpoint" ng-options = "a.value as a.name for a in ionosRegions" ng-disabled = "configureBackup.busy" ng-required = "configureBackup.provider === 'ionos-objectstorage'" > < / select >
< / div >
2021-06-16 22:35:46 -07:00
< div class = "form-group" ng-class = "{ 'has-error': configureBackup.error.region }" ng-show = "configureBackup.provider === 'vultr-objectstorage'" >
< label class = "control-label" for = "inputConfigureBackupVultrRegion" > {{ 'backups.configureBackupStorage.region' | tr }}< / label >
< select class = "form-control" name = "region" id = "inputConfigureBackupVultrRegion" ng-model = "configureBackup.endpoint" ng-options = "a.value as a.name for a in vultrRegions" ng-disabled = "configureBackup.busy" ng-required = "configureBackup.provider === 'vultr-objectstorage'" > < / select >
< / div >
2023-08-25 07:59:40 +05:30
< div class = "form-group" ng-class = "{ 'has-error': configureBackup.error.region }" ng-show = "configureBackup.provider === 'contabo-objectstorage'" >
< label class = "control-label" for = "inputConfigureBackupContaboRegion" > {{ 'backups.configureBackupStorage.region' | tr }}< / label >
< select class = "form-control" name = "region" id = "inputConfigureBackupContaboRegion" ng-model = "configureBackup.endpoint" ng-options = "a.value as a.name for a in contaboRegions" ng-disabled = "configureBackup.busy" ng-required = "configureBackup.provider === 'contabo-objectstorage'" > < / select >
< / div >
2020-11-03 16:58:11 +01:00
< div class = "form-group" ng-class = "{ 'has-error': configureBackup.error.accessKeyId }" ng-show = "s3like(configureBackup.provider)" >
< label class = "control-label" for = "inputConfigureBackupAccessKeyId" > {{ 'backups.configureBackupStorage.s3AccessKeyId' | tr }}< / label >
< input type = "text" class = "form-control" ng-model = "configureBackup.accessKeyId" id = "inputConfigureBackupAccessKeyId" name = "accessKeyId" ng-disabled = "configureBackup.busy" ng-required = "s3like(configureBackup.provider)" >
< / div >
< div class = "form-group" ng-class = "{ 'has-error': configureBackup.error.secretAccessKey }" ng-show = "s3like(configureBackup.provider)" >
< label class = "control-label" for = "inputConfigureBackupSecretAccessKey" > {{ 'backups.configureBackupStorage.s3SecretAccessKey' | tr }}< / label >
< input type = "text" class = "form-control" ng-model = "configureBackup.secretAccessKey" id = "inputConfigureBackupSecretAccessKey" name = "secretAccessKey" ng-disabled = "configureBackup.busy" ng-required = "s3like(configureBackup.provider)" >
< / div >
< div class = "form-group" ng-class = "{ 'has-error': configureBackup.error.gcsKeyInput }" ng-show = "configureBackup.provider === 'gcs'" >
< label class = "control-label" for = "gcsKeyInput" > {{ 'backups.configureBackupStorage.gcsServiceKey' | tr }}< / label >
< div class = "input-group" >
< input type = "file" id = "gcsKeyFileInput" style = "display:none" / >
< input type = "text" class = "form-control" placeholder = "Service Account Key" ng-model = "configureBackup.gcsKey.keyFileName" id = "gcsKeyInput" name = "cert" onclick = "getElementById('gcsKeyFileInput').click();" style = "cursor: pointer;" ng-disabled = "configureBackup.busy" ng-required = "configureBackup.provider === 'gcs'" >
< span class = "input-group-addon" >
< i class = "fa fa-upload" onclick = "getElementById('gcsKeyFileInput').click();" > < / i >
< / span >
2020-02-26 09:08:34 -08:00
< / div >
2020-11-03 16:58:11 +01:00
< / div >
2020-04-29 12:54:19 -07:00
2020-11-03 16:58:11 +01:00
< div class = "form-group" ng-show = "configureBackup.provider !== 'noop'" >
< label class = "control-label" for = "storageFormat" > {{ 'backups.configureBackupStorage.format' | tr }} < sup > < a ng-href = "https://docs.cloudron.io/backups/#backup-formats" class = "help" target = "_blank" > < i class = "fa fa-question-circle" > < / i > < / a > < / sup > < / label >
< p class = "small text-info" ng-show = "backupConfig.format !== configureBackup.format" > {{ 'backups.configureBackupStorage.formatChangeNote' | tr }}< / p >
< p class = "small text-info" ng-show = "configureBackup.format === 'rsync' && (s3like(configureBackup.provider) || configureBackup.provider === 'gcs')" > {{ 'backups.configureBackupStorage.s3LikeNote' | tr }} < sup > < a ng-href = "https://docs.cloudron.io/backups/#amazon-s3" class = "help" target = "_blank" > < i class = "fa fa-question-circle" > < / i > < / a > < / sup > < / p >
< select class = "form-control" id = "storageFormat" ng-model = "configureBackup.format" ng-options = "a.value as a.name for a in formats" > < / select >
< / div >
2020-02-26 09:08:34 -08:00
2020-11-03 16:58:11 +01:00
< div class = "form-group" ng-class = "{ 'has-error': configureBackup.error.password }" ng-show = "configureBackup.provider !== 'noop'" >
< label class = "control-label" for = "inputConfigureBackupPassword" > {{ 'backups.configureBackupStorage.encryptionPassword' | tr }} < sup > < a ng-href = "https://docs.cloudron.io/backups/#encryption" class = "help" target = "_blank" > < i class = "fa fa-question-circle" > < / i > < / a > < / sup > < / label >
< p class = "small" > {{ 'backups.configureBackupStorage.encryptionDescription' | tr }}< / p >
2022-03-30 09:14:08 -07:00
< input type = "text" class = "form-control" name = "encryptionPassword" ng-model = "configureBackup.password" id = "inputConfigureBackupPassword" ng-disabled = "configureBackup.busy" placeholder = "{{ 'backups.configureBackupStorage.encryptionPasswordPlaceholder' | tr }}" >
2022-03-16 22:01:22 -07:00
< / div >
2020-11-14 11:01:46 +01:00
2022-03-30 09:14:08 -07:00
< div class = "form-group" ng-show = "configureBackup.password && configureBackup.password !== SECRET_PLACEHOLDER" ng-class = "{ 'has-error': (configureBackupForm.encryptionPassword.$dirty && configureBackup.password !== configureBackup.passwordRepeat) }" >
2022-03-16 22:01:22 -07:00
< label class = "control-label" for = "inputConfigureBackupPasswordRepeat" > {{ 'backups.configureBackupStorage.encryptionPasswordRepeat' | tr }}< / label >
< input id = "inputConfigureBackupPasswordRepeat" type = "text" class = "form-control" name = "passwordRepeat" ng-model = "configureBackup.passwordRepeat" ng-disabled = "configureBackup.busy" >
2020-11-03 16:58:11 +01:00
< / div >
2018-06-07 14:22:48 +02:00
2022-06-27 09:02:44 -07:00
< div class = "checkbox" ng-show = "configureBackup.password !== '' && configureBackup.format === 'rsync'" >
< label >
2022-10-02 10:09:08 +02:00
< input type = "checkbox" ng-model = "configureBackup.encryptedFilenames" > {{ 'backups.configureBackupStorage.encryptFilenames' | tr }}< / input >
2022-06-27 09:02:44 -07:00
< sup > < a ng-href = "https://docs.cloudron.io/backups/#filenames" class = "help" target = "_blank" > < i class = "fa fa-question-circle" > < / i > < / a > < / sup >
< / label >
< / div >
2020-11-03 16:58:11 +01:00
< a href = "" ng-click = "configureBackup.advancedVisible = true" ng-hide = "configureBackup.advancedVisible" > {{ 'backups.configureBackupStorage.advancedSettings' | tr }}< / a >
2024-03-12 16:44:08 +01:00
< div uib-collapse = "!configureBackup.advancedVisible" >
2018-06-07 14:22:48 +02:00
2020-11-03 16:58:11 +01:00
< div class = "form-group" >
2024-03-12 16:44:08 +01:00
< label class = "control-label" for = "sliderConfigureBackupMemoryLimit" > {{ 'backups.configureBackupStorage.memoryLimit' | tr }}: < b > {{ configureBackup.memoryLimit | prettyBinarySize:'1024 MB' }}< / b > < / label >
2020-11-03 16:58:11 +01:00
< p class = "small" > {{ 'backups.configureBackupStorage.memoryLimitDescription' | tr }}< / p >
2024-03-12 17:09:35 +01:00
< input type = "range" id = "sliderConfigureBackupMemoryLimit" ng-model = "configureBackup.memoryLimit" step = "{{ 256*1024*1024 }}" min = "{{ MIN_MEMORY_LIMIT }}" max = "{{ MAX_MEMORY_LIMIT }}" / >
2018-06-07 14:22:48 +02:00
< / div >
2021-02-01 14:16:35 -08:00
< div class = "form-group" ng-show = "s3like(configureBackup.provider)" >
2024-03-12 17:09:35 +01:00
< label class = "control-label" for = "sliderConfigureBackupUploadPartSize" > {{ 'backups.configureBackupStorage.uploadPartSize' | tr }}: < b > {{ configureBackup.uploadPartSize | prettyBinarySize:'Default (50 MiB)' }}< / b > < / label >
2020-11-03 16:58:11 +01:00
< p class = "small" > {{ 'backups.configureBackupStorage.uploadPartSizeDescription' | tr }}< / p >
2024-03-12 17:09:35 +01:00
< input type = "range" id = "sliderConfigureBackupUploadPartSize" ng-model = "configureBackup.uploadPartSize" list = "uploadPartSizeTicks" step = "{{ 1024*1024 }}" min = "{{ 1024*1024 }}" max = "{{ 1024*1024*1024 }}" / >
< datalist id = "uploadPartSizeTicks" >
< option value = "{{ 1024*1024 }}" > < / option >
< option value = "{{ 64*1024*1024 }}" > < / option >
< option value = "{{ 128*1024*1024 }}" > < / option >
< option value = "{{ 256*1024*1024 }}" > < / option >
< option value = "{{ 512*1024*1024 }}" > < / option >
< option value = "{{ 1024*1024*1024 }}" > < / option >
< / datalist >
2020-11-03 16:58:11 +01:00
< / div >
2020-08-19 14:39:41 -07:00
2022-03-15 17:56:50 -07:00
< div class = "form-group" ng-show = "configureBackup.format === 'rsync' && configureBackup.provider !== 'noop'" >
2024-03-12 17:31:07 +01:00
< label class = "control-label" for = "sliderConfigureBackupSyncConcurrency" > {{ 'backups.configureBackupStorage.uploadConcurrency' | tr }}: < b > {{ configureBackup.syncConcurrency }}< / b > < / label >
2020-11-03 16:58:11 +01:00
< p class = "small" > {{ 'backups.configureBackupStorage.uploadConcurrencyDescription' | tr }}< / p >
2024-03-12 17:31:07 +01:00
< input type = "range" id = "sliderConfigureBackupSyncConcurrency" ng-model = "configureBackup.syncConcurrency" step = "10" min = "10" max = "200" / >
2020-11-03 16:58:11 +01:00
< / div >
2020-08-10 23:01:09 -07:00
2020-11-03 16:58:11 +01:00
< div class = "form-group" ng-show = "configureBackup.format === 'rsync' && (s3like(configureBackup.provider) || configureBackup.provider === 'gcs')" >
2024-03-12 17:31:07 +01:00
< label class = "control-label" for = "sliderConfigureBackupDownloadConcurrency" > {{ 'backups.configureBackupStorage.downloadConcurrency' | tr }}: < b > {{ configureBackup.downloadConcurrency }}< / b > < / label >
2020-11-03 16:58:11 +01:00
< p class = "small" > {{ 'backups.configureBackupStorage.downloadConcurrencyDescription' | tr }}< / p >
2024-03-12 17:31:07 +01:00
< input type = "range" id = "sliderConfigureBackupDownloadConcurrency" ng-model = "configureBackup.downloadConcurrency" step = "10" min = "10" max = "200" / >
2020-11-03 16:58:11 +01:00
< / div >
2020-08-10 23:01:09 -07:00
2020-11-03 16:58:11 +01:00
< div class = "form-group" ng-show = "configureBackup.format === 'rsync' && (s3like(configureBackup.provider) || configureBackup.provider === 'gcs')" >
2024-03-12 17:31:07 +01:00
< label class = "control-label" for = "sliderConfigureBackupCopyConcurrency" > {{ 'backups.configureBackupStorage.copyConcurrency' | tr }}: < b > {{ configureBackup.copyConcurrency }}< / b > < / label >
2020-11-03 16:58:11 +01:00
< p class = "small" > {{ 'backups.configureBackupStorage.copyConcurrencyDescription' | tr }}
< span ng-show = "configureBackup.provider === 'digitalocean-spaces'" > {{ 'backups.configureBackupStorage.copyConcurrencyDigitalOceanNote' | tr }}< / span >
< / p >
2024-03-12 17:31:07 +01:00
< input type = "range" id = "sliderConfigureBackupCopyConcurrency" ng-model = "configureBackup.copyConcurrency" step = "10" min = "10" max = "500" / >
2020-11-03 16:58:11 +01:00
< / div >
2020-08-10 23:01:09 -07:00
2020-11-03 16:58:11 +01:00
< / div > <!-- advanced -->
2018-06-07 14:22:48 +02:00
2020-11-14 11:01:46 +01:00
< input class = "ng-hide" type = "submit" ng-disabled = "configureBackupForm.$invalid || (configureBackup.password !== SECRET_PLACEHOLDER && configureBackup.password !== configureBackup.passwordRepeat)" / >
2018-06-07 14:22:48 +02:00
< / form >
< / div >
< div class = "modal-footer " >
2020-11-03 16:58:11 +01:00
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > {{ 'main.dialog.cancel' | tr }}< / button >
2020-11-14 11:01:46 +01:00
< button type = "submit" class = "btn btn-outline btn-success pull-right" ng-click = "configureBackup.submit()" ng-disabled = "configureBackupForm.$invalid || configureBackup.busy || (configureBackup.password !== SECRET_PLACEHOLDER && configureBackup.password !== configureBackup.passwordRepeat)" > < i class = "fa fa-circle-notch fa-spin" ng-show = "configureBackup.busy" > < / i > < span > {{ 'main.dialog.save' | tr }}< / span > < / button >
2018-06-07 14:22:48 +02:00
< / div >
< / div >
< / div >
< / div >
2024-12-10 11:53:29 +01:00
<!-- Modal archive restore -->
2024-12-10 14:46:30 +01:00
< div class = "modal fade" id = "restoreArchiveModal" tabindex = "-1" role = "dialog" >
2024-12-10 11:53:29 +01:00
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
2024-12-10 14:46:30 +01:00
< h4 class = "modal-title" > {{ 'backups.restoreArchiveDialog.title' | tr }}< / h4 >
2024-12-10 11:53:29 +01:00
< / div >
< div class = "modal-body" style = "padding: 0 15px" >
2024-12-19 14:21:39 +01:00
< p ng-bind-html = "'backups.restoreArchiveDialog.description' | tr:{ appId: archiveRestore.manifest.id, fqdn: archiveRestore.fqdn, creationTime: (archiveRestore.archive.creationTime | prettyLongDate) }" > < / p >
2024-12-10 14:46:30 +01:00
< form role = "form" ng-submit = "archiveRestore.submit()" autocomplete = "off" >
2024-12-10 11:53:29 +01:00
< fieldset >
2024-12-10 14:46:30 +01:00
< div class = "form-group" ng-class = "{ 'has-error': archiveRestore.error.location.fqdn === archiveRestore.subdomain + '.' + archiveRestore.domain.domain }" >
2024-12-10 11:53:29 +01:00
< label class = "control-label" for = "cloneLocationInput" > {{ 'app.cloneDialog.location' | tr }}< / label >
2024-12-10 14:46:30 +01:00
< div ng-show = "archiveRestore.error.location.fqdn === archiveRestore.subdomain + '.' + archiveRestore.domain.domain" > < small > {{ archiveRestore.error.location.message }}< / small > < / div >
2024-12-10 11:53:29 +01:00
< div class = "input-group form-inline" >
2024-12-10 14:46:30 +01:00
< input type = "text" class = "form-control" ng-model = "archiveRestore.subdomain" id = "cloneLocationInput" name = "location" placeholder = "{{ 'appstore.installDialog.locationPlaceholder' | tr }}" autofocus >
2024-12-10 11:53:29 +01:00
< div class = "input-group-btn" >
< button type = "button" class = "btn btn-default dropdown-toggle" data-toggle = "dropdown" >
2024-12-10 14:46:30 +01:00
< span > {{ '.' + archiveRestore.domain.domain }}< / span >
2024-12-10 11:53:29 +01:00
< span class = "caret" > < / span >
< / button >
< ul class = "dropdown-menu dropdown-menu-right" role = "menu" >
< li ng-repeat = "domain in domains" >
2024-12-10 14:46:30 +01:00
< a href = "" ng-click = "archiveRestore.domain = domain" > {{ domain.domain }}< / a >
2024-12-10 11:53:29 +01:00
< / li >
< / ul >
< / div >
< / div >
< / div >
2024-12-10 14:46:30 +01:00
< div class = "has-error text-center" ng-show = "archiveRestore.error.secondaryDomain" > {{ archiveRestore.error.secondaryDomain }}< / div >
2024-12-19 14:21:39 +01:00
< div ng-repeat = "(env, info) in archiveRestore.manifest.httpPorts" >
2024-12-10 11:53:29 +01:00
< ng-form name = "secondaryDomainInfo_form" >
2024-12-10 14:46:30 +01:00
< div class = "form-group" ng-class = "{ 'has-error': (!secondaryDomainInfo_form.itemName{{$index}}.$dirty && archiveRestore.error.secondaryDomain) || (secondaryDomainInfo_form.itemName{{$index}}.$dirty && secondaryDomainInfo_form.itemName{{$index}}.$invalid) || (archiveRestore.error.location.fqdn === archiveRestore.secondaryDomains[env].subdomain + '.' + archiveRestore.secondaryDomains[env].domain.domain) }" >
2024-12-10 11:53:29 +01:00
< label class = "control-label" for = "secondaryDomainInput{{env}}" >
{{ info.title }}
< sup >
< a popover-placement = "top-right" popover-trigger = "outsideClick" uib-popover = "{{info.description}}" > < i class = "fa fa-question-circle" > < / i > < / a >
< / sup >
< / label >
2024-12-10 14:46:30 +01:00
< div ng-show = "archiveRestore.error.location.fqdn === archiveRestore.secondaryDomains[env].subdomain + '.' + archiveRestore.secondaryDomains[env].domain.domain" > < small > {{ archiveRestore.error.location.message }}< / small > < / div >
2024-12-10 11:53:29 +01:00
< div class = "input-group form-inline" >
2024-12-10 14:46:30 +01:00
< input type = "text" class = "form-control" ng-model = "archiveRestore.secondaryDomains[env].subdomain" name = "location{{$index}}" placeholder = "{{ 'app.location.locationPlaceholder' | tr }}" autofocus >
2024-12-10 11:53:29 +01:00
< div class = "input-group-btn" >
< button type = "button" class = "btn btn-default dropdown-toggle" data-toggle = "dropdown" >
2024-12-10 14:46:30 +01:00
< span > .{{ archiveRestore.secondaryDomains[env].domain.domain }}< / span >
2024-12-10 11:53:29 +01:00
< span class = "caret" > < / span >
< / button >
< ul class = "dropdown-menu dropdown-menu-right" role = "menu" >
< li ng-repeat = "domain in domains" >
2024-12-10 14:46:30 +01:00
< a href = "" ng-click = "archiveRestore.secondaryDomains[env].domain = domain" > {{ domain.domain }}< / a >
2024-12-10 11:53:29 +01:00
< / li >
< / ul >
< / div >
< / div >
< / div >
< / ng-form >
< / div >
2024-12-10 14:46:30 +01:00
< p class = "text-small text-warning" ng-show = "archiveRestore.domain.provider === 'noop' || archiveRestore.domain.provider === 'manual'" ng-bind-html = "'appstore.installDialog.manualWarning' | tr:{ location: ((archiveRestore.subdomain ? archiveRestore.subdomain + '.' : '') + archiveRestore.domain.domain) }" > < / p >
2024-12-10 11:53:29 +01:00
2024-12-10 14:46:30 +01:00
< div class = "has-error text-center" ng-show = "archiveRestore.error.port" > {{ archiveRestore.error.port }}< / div >
< div ng-repeat = "(env, info) in archiveRestore.portInfo" >
2024-12-10 11:53:29 +01:00
< ng-form name = "portInfo_form" >
2024-12-10 14:46:30 +01:00
< div class = "form-group" ng-class = "{ 'has-error': (!archiveRestore.itemName{{$index}}.$dirty && archiveRestore.error.port) || (portInfo_form.itemName{{$index}}.$dirty && portInfo_form.itemName{{$index}}.$invalid) }" >
< label class = "control-label" for = "inputPortInfo{{env}}" > < input type = "checkbox" ng-model = "archiveRestore.portsEnabled[env]" >
2024-12-10 11:53:29 +01:00
{{ info.title }}
< sup >
< a popover-placement = "top-right" popover-trigger = "outsideClick" uib-popover = "{{info.description}}" > < i class = "fa fa-question-circle" > < / i > < / a >
< / sup >
< small style = "padding-left: 5px;" ng-show = "info.readOnly" > {{ 'appstore.installDialog.portReadOnly' | tr }}< / small >
< / label >
2024-12-10 14:46:30 +01:00
< input type = "number" class = "form-control" ng-model = "archiveRestore.ports[env]" ng-disabled = "!archiveRestore.portsEnabled[env]" ng-readonly = "info.readOnly" id = "inputPortInfo{{env}}" later-name = "itemName{{$index}}" min = "{{hostPortMin}}" max = "{{hostPortMax}}" required >
< p class = "text-small text-warning text-bold" ng-show = "archiveRestore.domain.provider === 'cloudflare'" > {{ 'appstore.installDialog.cloudflarePortWarning' | tr }} < / p >
2024-12-10 11:53:29 +01:00
< / div >
< / ng-form >
< / div >
< / fieldset >
< / form >
< / div >
< div class = "modal-footer" >
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > {{ 'main.dialog.cancel' | tr }}< / button >
2024-12-19 14:57:35 +01:00
< button type = "button" class = "btn btn-success" ng-click = "archiveRestore.submit()" ng-disabled = "archiveRestore.busy" > < i class = "fas fa-history" ng-hide = "archiveRestore.busy" > < / i > < i class = "fa fa-circle-notch fa-spin" ng-show = "archiveRestore.busy" > < / i > {{ 'backups.restoreArchiveDialog.restoreAction' | tr:{ dnsOverwrite: archiveRestore.needsOverwrite } }}< / button >
2024-12-10 11:53:29 +01:00
< / div >
< / div >
< / div >
< / div >
2024-12-10 14:26:07 +01:00
<!-- Modal delete archive -->
< div class = "modal fade" id = "archiveDeleteModal" tabindex = "-1" role = "dialog" >
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
2024-12-19 14:21:39 +01:00
< h4 class = "modal-title" > {{ 'backups.deleteArchiveDialog.title' | tr:{ appTitle: archiveDelete.title, fqdn: archiveDelete.fqdn } }}< / h4 >
2024-12-10 14:26:07 +01:00
< / div >
< div class = "modal-body" >
< p > {{ 'backups.deleteArchiveDialog.description' | tr }}< / p >
< / div >
< div class = "modal-footer" >
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > {{ 'main.dialog.cancel' | tr }}< / button >
< button type = "button" class = "btn btn-danger" ng-click = "archiveDelete.submit()" ng-disabled = "archiveDelete.busy" > < i class = "fa fa-circle-notch fa-spin" ng-show = "archiveDelete.busy" > < / i > {{ 'backups.deleteArchive.deleteAction' | tr }}< / button >
< / div >
< / div >
< / div >
< / div >
2018-06-07 14:22:48 +02:00
< div class = "content" >
2024-10-15 18:46:51 +02:00
< h1 class = "section-header" > {{ 'backups.title' | tr }}< / h1 >
2018-06-07 14:22:48 +02:00
2020-05-14 22:42:41 -07:00
< div class = "text-left" >
2020-11-03 12:58:33 +01:00
< h3 > {{ 'backups.location.title' | tr }}< / h3 >
2020-05-14 22:42:41 -07:00
< / div >
2018-06-07 14:22:48 +02:00
< div class = "card" style = "margin-bottom: 15px;" >
2020-11-03 12:58:33 +01:00
< p > {{ 'backups.location.description' | tr }}
2020-04-03 10:36:51 -07:00
< span ng-show = "manualBackupApps.length" >
2020-11-03 12:58:33 +01:00
{{ 'backups.location.disabledList' | tr }}
2020-04-03 10:36:51 -07:00
< span ng-repeat = "app in manualBackupApps" >
< a ng-href = "/#/app/{{app.id}}/backups" > {{app.label || app.fqdn}}< / a > < span ng-hide = "$last" > ,< / span >
< / span >
< / span >
< / p >
2020-03-18 17:15:41 -07:00
2021-06-23 22:12:05 -07:00
< p ng-show = "backupConfig.provider === 'noop'" class = "text-danger" ng-bind-html = "'backups.check.noop' | tr | markdown2html" > < / p >
< p ng-show = "backupConfig.provider === 'filesystem'" class = "text-danger" ng-bind-html = "'backups.check.sameDisk' | tr | markdown2html" > < / p >
2020-07-28 18:08:57 +02:00
2018-06-07 14:22:48 +02:00
< div class = "row" >
< div class = "col-xs-6" >
2020-11-03 12:58:33 +01:00
< span class = "text-muted" > {{ 'backups.location.provider' | tr }}< / span >
2018-06-07 14:22:48 +02:00
< / div >
< div class = "col-xs-6 text-right" >
< span > {{ prettyProviderName(backupConfig.provider) }}< / span >
< / div >
< / div >
2024-08-12 09:54:27 +02:00
< div class = "row" ng-show = "backupConfig.provider !== 'noop'" >
2018-06-07 14:22:48 +02:00
< div class = "col-xs-6" >
2020-11-03 12:58:33 +01:00
< span class = "text-muted" > {{ 'backups.location.location' | tr }}< / span >
2018-06-07 14:22:48 +02:00
< / div >
2020-11-25 16:36:55 +01:00
< div class = "col-xs-6 text-right no-wrap" >
2018-06-07 14:22:48 +02:00
< span ng-show = "backupConfig.provider === 'filesystem'" > {{ backupConfig.backupFolder }}< / span >
2021-05-17 15:24:19 -07:00
< span ng-show = "mountlike(backupConfig.provider)" >
2023-04-30 17:21:18 +02:00
< i class = "fa fa-circle" ng-style = "{ color: mountStatus.state === 'active' ? '#27CE65' : '#d9534f' }" ng-show = "mountStatus" uib-tooltip = "{{ mountStatus.message }}" > < / i >
2023-08-08 13:21:56 +02:00
< span ng-show = "backupConfig.provider === 'disk' || backupConfig.provider === 'filesystem' || backupConfig.provider === 'ext4' || backupConfig.provider === 'xfs' || backupConfig.provider === 'mountpoint'" > {{ backupConfig.mountOptions.diskPath || backupConfig.mountPoint }}{{ (backupConfig.prefix ? '/' : '') + backupConfig.prefix }}< / span >
2021-06-22 13:03:38 -07:00
< span ng-show = "backupConfig.provider === 'cifs' || backupConfig.provider === 'nfs' || backupConfig.provider === 'sshfs'" > {{ backupConfig.mountOptions.host }}:{{ backupConfig.mountOptions.remoteDir }}{{ (backupConfig.prefix ? '/' : '') + backupConfig.prefix }}< / span >
2021-05-17 15:24:19 -07:00
< / span >
2019-12-19 11:05:40 -08:00
< span ng-show = "backupConfig.provider !== 's3' && backupConfig.provider !== 'minio' && (s3like(backupConfig.provider) || backupConfig.provider === 'gcs')" > {{ backupConfig.bucket + (backupConfig.prefix ? '/' : '') + backupConfig.prefix }}< / span >
2019-11-18 11:04:06 -08:00
< span ng-show = "backupConfig.provider === 's3'" > {{ backupConfig.region + ' ' + backupConfig.bucket + (backupConfig.prefix ? '/' : '') + backupConfig.prefix }}< / span >
2019-12-19 11:05:40 -08:00
< span ng-show = "backupConfig.provider === 'minio'" > {{ backupConfig.endpoint + ' ' + backupConfig.bucket + (backupConfig.prefix ? '/' : '') + backupConfig.prefix }}< / span >
2018-06-07 14:22:48 +02:00
< / div >
< / div >
2020-05-15 16:05:30 -07:00
< div class = "row" ng-show = "backupConfig.endpoint && backupConfig.provider !== 'minio'" >
2022-09-28 22:45:22 +02:00
< div class = "col-xs-3" >
2020-11-03 12:58:33 +01:00
< span class = "text-muted" > {{ 'backups.location.endpoint' | tr }}< / span >
2020-05-15 16:05:30 -07:00
< / div >
2022-09-28 22:45:22 +02:00
< div class = "col-xs-9 text-right" >
2020-05-15 16:05:30 -07:00
< span > {{ backupConfig.endpoint || backupConfig.region }}< / span >
< / div >
< / div >
2020-02-04 12:49:36 -08:00
< div class = "row" >
2018-06-07 14:22:48 +02:00
< div class = "col-xs-6" >
2020-11-03 12:58:33 +01:00
< span class = "text-muted" > {{ 'backups.location.format' | tr }}< / span >
2018-06-07 14:22:48 +02:00
< / div >
< div class = "col-xs-6 text-right" >
2020-05-12 23:42:56 -07:00
< span > {{ backupConfig.format }} < i class = "fas fa-lock" ng-show = "backupConfig.password" > < / i > < / span >
2018-06-07 14:22:48 +02:00
< / div >
< / div >
< br / >
< div class = "row" >
2021-10-11 17:45:55 +02:00
< div class = "col-md-12" >
2021-12-02 12:21:59 -08:00
< button class = "btn btn-outline btn-primary pull-right" ng-show = "user.isAtLeastOwner" ng-click = "configureBackup.show()" > {{ 'backups.location.configure' | tr }}< / button >
< button class = "btn btn-outline btn-default pull-right" ng-show = "user.isAtLeastOwner && mountlike(backupConfig.provider)" ng-disabled = "remount.busy" ng-click = "remount.submit()" > < i class = "fa fa-circle-notch fa-spin" ng-show = "remount.busy" > < / i > {{ 'backups.location.remount' | tr }}< / button >
2018-06-07 14:22:48 +02:00
< / div >
< / div >
2020-05-14 22:42:41 -07:00
< / div >
2024-10-15 18:46:51 +02:00
< h3 class = "section-header" >
{{ 'backups.schedule.title' | tr }}
<!-- <a class="btn btn - sm btn - default pull - right" ng - href="/logs.html?taskId={{cleanupBackups.taskId}}" target="_blank" uib - tooltip="{{ 'backups.logs.showLogs' | tr }}"><i class="fas fa - align - left"></i></a> -->
< div class = "btn-group btn-group-sm pull-right" >
< button type = "button" class = "btn btn-small btn-default dropdown-toggle" ng-show = "cleanupTasks.length" data-toggle = "dropdown" aria-haspopup = "true" aria-expanded = "false" uib-tooltip = "{{ 'backups.logs.showLogs' | tr }}" >
< i class = "fas fa-align-left" > < / i > < span class = "caret" > < / span >
< / button >
< ul class = "dropdown-menu" >
< li ng-repeat = "task in cleanupTasks" >
< a ng-href = "/logs.html?taskId={{task.id}}" target = "_blank" class = "text-right" >
{{ task.ts | prettyLongDate }} < i class = "fa" style = "margin-left: 20px" ng-class = "{ 'status-active fa-check-circle': !task.active && task.success, 'fa-circle-notch fa-spin': task.active, 'status-error fa-times-circle': !task.active && !task.success }" > < / i >
< / a >
< / li >
< / ul >
< / div >
< / h3 >
2020-05-19 16:13:20 +02:00
< div class = "card" style = "margin-bottom: 15px;" >
2024-09-08 16:35:08 +02:00
< p ng-bind-html = " 'backups.schedule.description' | tr " > < / p >
2020-05-19 16:13:20 +02:00
< div class = "row" >
2024-09-08 15:51:07 +02:00
< div class = "col-xs-4" >
2020-11-03 12:58:33 +01:00
< span class = "text-muted" > {{ 'backups.schedule.schedule' | tr }}< / span >
2020-05-19 16:13:20 +02:00
< / div >
2024-09-08 15:51:07 +02:00
< div class = "col-xs-8 text-right" style = "text-overflow: ellipsis; overflow: hidden; white-space: nowrap;" >
2023-07-12 10:01:53 +05:30
< span > {{ prettyBackupSchedule(backupPolicy.currentPolicy.schedule) }}< / span >
2020-05-19 16:13:20 +02:00
< / div >
< / div >
< div class = "row" >
2024-09-08 15:51:07 +02:00
< div class = "col-xs-4" >
2020-11-03 12:58:33 +01:00
< span class = "text-muted" > {{ 'backups.schedule.retentionPolicy' | tr }}< / span >
2020-05-19 16:13:20 +02:00
< / div >
2024-09-08 15:51:07 +02:00
< div class = "col-xs-8 text-right" >
2023-07-12 10:01:53 +05:30
< span > {{ prettyBackupRetention(backupPolicy.currentPolicy.retention) }}< / span >
2020-05-19 16:13:20 +02:00
< / div >
< / div >
< br / >
< div class = "row" >
< div class = "col-md-12 text-right" >
2023-05-02 15:02:41 +02:00
< button class = "btn btn-default" ng-click = "cleanupBackups.ask()" ng-disabled = "cleanupBackups.busy" style = "margin-right: 5px" > < i class = "fa fa-circle-notch fa-spin" ng-show = "cleanupBackups.busy" > < / i > {{ 'backups.listing.cleanupBackups' | tr }}< / button >
2023-07-12 10:01:53 +05:30
< button class = "btn btn-outline btn-primary pull-right" ng-show = "user.isAtLeastOwner" ng-click = "backupPolicy.show()" > {{ 'backups.schedule.configure' | tr }}< / button >
2020-05-19 16:13:20 +02:00
< / div >
< / div >
< / div >
2024-10-15 18:46:51 +02:00
< h3 class = "section-header" >
{{ 'backups.listing.title' | tr }}
< div class = "btn-group btn-group-sm pull-right" >
< button type = "button" class = "btn btn-small btn-default dropdown-toggle" ng-show = "backupTasks.length" data-toggle = "dropdown" aria-haspopup = "true" aria-expanded = "false" uib-tooltip = "{{ 'backups.logs.showLogs' | tr }}" >
< i class = "fas fa-align-left" > < / i > < span class = "caret" > < / span >
< / button >
< ul class = "dropdown-menu" >
< li ng-repeat = "task in backupTasks" >
< a ng-href = "/logs.html?taskId={{task.id}}" target = "_blank" class = "text-right" >
{{ task.ts | prettyLongDate }} < i class = "fa" style = "margin-left: 20px" ng-class = "{ 'status-active fa-check-circle': !task.active && task.success, 'fa-circle-notch fa-spin': task.active, 'status-error fa-times-circle': !task.active && !task.success }" > < / i >
< / a >
< / li >
< / ul >
< / div >
< / h3 >
2018-06-07 14:22:48 +02:00
2020-05-14 22:42:41 -07:00
< div class = "card card-large" >
2018-06-07 14:22:48 +02:00
< div class = "row" >
2020-05-14 22:42:41 -07:00
< div class = "col-md-12" >
2020-11-03 12:58:33 +01:00
< p ng-show = "!backups.length" > {{ 'backups.listing.noBackups' | tr }}< / p >
2020-05-14 22:42:41 -07:00
< table class = "table table-hover" style = "margin: 0;" ng-hide = "!backups.length" >
< thead >
< tr >
2022-04-07 15:31:41 +02:00
< th style = "width: 20px" > < / th >
2020-11-03 12:58:33 +01:00
< th > {{ 'backups.listing.version' | tr }}< / th >
< th > {{ 'main.table.date' | tr }}< / th >
2024-10-15 17:50:46 +02:00
< th class = "hide-mobile" > {{ 'backups.listing.contents' | tr }}< / th >
2022-04-05 14:41:41 +02:00
< th class = "text-right" > {{ 'main.actions' | tr }}< / th >
2020-05-14 22:42:41 -07:00
< / tr >
< / thead >
< tbody >
< tr ng-repeat = "backup in backups" >
2022-04-08 19:10:29 +02:00
< td > < i class = "fas fa-archive" ng-show = "backup.preserveSecs === -1" uib-tooltip = "{{ 'backups.listing.tooltipPreservedBackup' | tr }}" > < / i > < / td >
2020-05-22 13:48:26 +02:00
< td ng-click = "backupDetails.show(backup)" class = "hand" > v{{ backup.packageVersion }}< / td >
2024-07-21 20:45:34 +02:00
< td ng-click = "backupDetails.show(backup)" class = "hand" > {{ backup.creationTime | prettyLongDate }} < b ng-show = "backup.label" > ({{ backup.label }})< / b > < / td >
2024-10-15 17:50:46 +02:00
< td ng-click = "backupDetails.show(backup)" class = "hand hide-mobile" >
2020-11-03 12:58:33 +01:00
< span ng-show = "!backup.contents.length" > {{ 'backups.listing.noApps' | tr }}< / span >
2020-11-25 18:29:15 +01:00
< span ng-show = "backup.contents.length" > {{ 'backups.listing.appCount' | tr:{ appCount: backup.contents.length } }}< / span >
2020-05-16 09:46:57 -07:00
< / td >
2024-10-15 17:50:46 +02:00
< td class = "text-right no-wrap" >
2022-04-08 15:09:04 +02:00
< button class = "btn btn-xs btn-default" ng-click = "editBackup.show(backup)" uib-tooltip = "{{ 'backups.listing.tooltipEditBackup' | tr }}" > < i class = "fa fa-pencil-alt" > < / i > < / button >
2020-11-03 12:58:33 +01:00
< button class = "btn btn-xs btn-default" ng-click = "downloadConfig(backup)" uib-tooltip = "{{ 'backups.listing.tooltipDownloadBackupConfig' | tr }}" > < i class = "fas fa-file-alt" > < / i > < / button >
2020-05-14 22:42:41 -07:00
< / td >
< / tr >
< / tbody >
< / table >
2018-06-07 14:22:48 +02:00
< / div >
< / div >
2020-04-20 18:21:35 +02:00
< br / >
< div class = "row" ng-show = "createBackup.busy" >
2018-12-09 20:59:32 +01:00
< div class = "col-md-12" style = "margin-bottom: 10px;" >
2020-04-20 18:21:35 +02:00
< div class = "progress progress-striped active animateMe" >
2018-06-07 14:22:48 +02:00
< div class = "progress-bar progress-bar-success" role = "progressbar" style = "width: {{ createBackup.percent }}%" > < / div >
< / div >
2020-04-20 18:21:35 +02:00
< p > {{ createBackup.message }}< / p >
2018-06-07 14:22:48 +02:00
< / div >
< / div >
2020-04-20 18:21:35 +02:00
< div class = "row" ng-show = "!createBackup.busy && !createBackup.active && createBackup.errorMessage" >
< div class = "col-md-12" >
< p class = "has-error" > {{ createBackup.errorMessage }}< / p >
2018-06-07 14:22:48 +02:00
< / div >
2020-04-20 18:21:35 +02:00
< / div >
< div class = "row" >
< div class = "col-md-12 text-right" >
2020-11-03 12:58:33 +01:00
< button class = "btn btn-outline btn-primary" ng-click = "createBackup.startBackup()" ng-show = "!createBackup.busy" > {{ 'backups.listing.backupNow' | tr }}< / button >
2023-08-31 22:47:15 +02:00
< button class = "btn btn-outline btn-danger" ng-click = "createBackup.stopTask()" ng-show = "createBackup.busy" > {{ 'backups.listing.stopTask' | tr }}< / button >
2018-06-07 14:22:48 +02:00
< / div >
< / div >
< / div >
2024-12-10 11:53:29 +01:00
< h3 class = "section-header" >
{{ 'backups.archives.title' | tr }}
< / h3 >
< div class = "card card-large" >
< p ng-bind-html = " 'backups.archive.description' | tr " > < / p >
< div class = "grid-item-top" >
2024-12-10 14:46:30 +01:00
< div class = "row ng-hide" ng-show = "!archiveList.ready" >
2024-12-10 11:53:29 +01:00
< div class = "col-lg-12 text-center" >
< h2 > < i class = "fa fa-circle-notch fa-spin" > < / i > < / h2 >
< / div >
< / div >
2024-12-10 14:46:30 +01:00
< div class = "row animateMeOpacity ng-hide" ng-show = "archiveList.ready" >
2024-12-10 11:53:29 +01:00
< div class = "col-lg-12" >
< table class = "table table-hover" style = "margin: 0;" >
< thead >
< tr >
< th style = "width: 5%" > < / th > <!-- icon -->
< th style = "width: 35%" > {{ 'backups.archives.location' | tr }}< / th >
2024-12-12 11:52:59 +01:00
< th style = "width: 35%" class = "hide-mobile" > {{ 'backups.archives.info' | tr }}< / th >
< th style = "width: 20%" > {{ 'main.table.date' | tr }}< / th >
< th style = "width: 5%" class = "text-right hide-mobile" > {{ 'main.actions' | tr }}< / th >
2024-12-10 11:53:29 +01:00
< / tr >
< / thead >
< tbody >
2024-12-10 14:46:30 +01:00
< tr ng-repeat = "archive in archiveList.archives" >
2024-12-10 11:53:29 +01:00
< td >
2024-12-10 13:25:44 +01:00
< img ng-src = "{{ archive.iconUrl || 'img/appicon_fallback.png' }}" fallback-icon = "img/appicon_fallback.png" onerror = "imageErrorHandler(this)" height = "48" width = "48" / >
2024-12-10 11:53:29 +01:00
< / td >
2024-12-19 14:21:39 +01:00
<!-- for pre - 8.2 backups, appConfig can be null -->
2024-12-10 14:46:30 +01:00
< td class = "hand elide-table-cell" style = "text-overflow: ellipsis; white-space: nowrap;" ng-click = "archiveRestore.show(archive)" >
2024-12-19 14:21:39 +01:00
{{ archive.appConfig ? archive.appConfig.fqdn : '-' }}
2024-12-10 11:53:29 +01:00
< / td >
2024-12-12 11:52:59 +01:00
< td class = "hand elide-table-cell hide-mobile" style = "text-overflow: ellipsis; white-space: nowrap;" ng-click = "archiveRestore.show(archive)" >
2024-12-19 14:21:39 +01:00
< span uib-tooltip = "{{ archive.manifest.id }}@{{ archive.manifest.version }}" > {{ archive.manifest.title }}< / span >
2024-12-10 11:53:29 +01:00
< / td >
2024-12-10 14:46:30 +01:00
< td class = "hand elide-table-cell" style = "text-overflow: ellipsis; white-space: nowrap;" ng-click = "archiveRestore.show(archive)" >
2024-12-10 11:53:29 +01:00
{{ archive.creationTime | prettyDate }}
< / td >
2024-12-12 11:52:59 +01:00
< td class = "text-right no-wrap hide-mobile" style = "vertical-align: middle;" >
2024-12-10 14:46:30 +01:00
< button class = "btn btn-xs btn-default" ng-click = "archiveRestore.show(archive)" uib-tooltip = "Restore from Archive" > < i class = "fas fa-history" > < / i > < / button >
2024-12-11 10:54:51 +01:00
< button class = "btn btn-xs btn-default" ng-click = "downloadConfig(archive, true)" uib-tooltip = "{{ 'backups.listing.tooltipDownloadBackupConfig' | tr }}" > < i class = "fas fa-file-alt" > < / i > < / button >
2024-12-10 14:26:07 +01:00
< button class = "btn btn-xs btn-danger" ng-click = "archiveDelete.ask(archive)" uib-tooltip = "Delete Archive" > < i class = "fa fa-trash-alt" > < / i > < / button >
2024-12-10 11:53:29 +01:00
< / td >
< / tr >
< / tbody >
< / table >
< / div >
< / div >
< / div >
< / div >
2018-06-07 14:22:48 +02:00
< / div >