2020-10-28 16:14:32 -07:00
<!-- modal volume add -->
2021-06-21 16:23:34 -07:00
< div class = "modal fade" id = "volumeAddModal" tabindex = "-1" role = "dialog" >
2020-10-28 16:14:32 -07:00
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
2021-06-21 16:23:34 -07:00
< h4 class = "modal-title" > {{ 'volumes.addVolumeDialog.title' | tr }}< / h4 >
2020-10-28 16:14:32 -07:00
< / div >
< div class = "modal-body" >
2021-06-21 16:23:34 -07:00
< form name = "volumeAddForm" role = "form" novalidate ng-submit = "volumeAdd.submit()" autocomplete = "off" >
2020-10-28 16:14:32 -07:00
< fieldset >
2021-06-21 16:23:34 -07:00
< p class = "has-error text-center" ng-show = "volumeAdd.error" > {{ volumeAdd.error }}< / p >
2020-10-28 16:14:32 -07:00
2021-06-21 16:23:34 -07:00
< div class = "form-group" >
2020-11-23 22:13:54 +01:00
< label class = "control-label" > {{ 'volumes.name' | tr }}< / label >
2023-02-25 23:14:54 +01:00
< input type = "text" class = "form-control" ng-model = "volumeAdd.name" name = "name" ng-disabled = "volumeAdd.busy" ng-required = "true" autofocus >
2020-10-28 16:14:32 -07:00
< / div >
2021-05-12 21:40:30 -07:00
< div class = "form-group" >
< label class = "control-label" for = "mountType" > {{ 'volumes.mountType' | tr }}< / label >
2021-06-21 16:23:34 -07:00
< select class = "form-control" id = "mountType" ng-model = "volumeAdd.mountType" ng-options = "a.value as a.name for a in mountTypes" > < / select >
2022-11-04 15:01:27 +01:00
< p class = "small" >
< span class = "text-warning" ng-show = "volumeAdd.mountType === 'mountpoint'" ng-bind-html = "'volumes.addVolumeDialog.mountpointWarning' | tr" > < / span >
< span class = "text-info" ng-hide = "volumeAdd.mountType === 'mountpoint' || volumeAdd.mountType === 'filesystem'" ng-bind-html = "'volumes.addVolumeDialog.mountTypeInfo' | tr" > < / span >
< / p >
2021-05-12 21:40:30 -07:00
< / div >
2021-06-24 23:01:35 -07:00
< div class = "form-group" ng-show = "volumeAdd.mountType === 'filesystem'" >
< label class = "control-label" > {{ 'volumes.localDirectory' | tr }}< / label >
2023-02-25 23:14:54 +01:00
< input type = "text" class = "form-control" ng-model = "volumeAdd.hostPath" name = "hostPath" ng-disabled = "volumeAdd.busy" placeholder = "/srv/shared" ng-required = "volumeAdd.mountType === 'filesystem'" autofocus >
2021-06-24 23:01:35 -07:00
< / div >
< div class = "form-group" ng-show = "volumeAdd.mountType === 'mountpoint'" >
2021-06-18 23:03:18 -07:00
< label class = "control-label" > {{ 'volumes.hostPath' | tr }}< / label >
2023-02-25 23:14:54 +01:00
< input type = "text" class = "form-control" ng-model = "volumeAdd.hostPath" name = "hostPath" ng-disabled = "volumeAdd.busy" placeholder = "/mnt/data" ng-required = "volumeAdd.mountType === 'mountpoint'" autofocus >
2021-06-18 23:03:18 -07:00
< / div >
2023-05-08 18:07:42 +02:00
< div class = "form-group" ng-show = "volumeAdd.mountType === 'ext4'" >
2023-01-23 18:43:54 +01:00
< label class = "control-label" > {{ 'volumes.addVolumeDialog.diskPath' | tr }}< / label >
2023-05-08 18:07:42 +02:00
< select class = "form-control" ng-model = "volumeAdd.ext4Disk" ng-options = "item as item.label for item in ext4BlockDevices track by item.path" ng-required = "volumeAdd.mountType === 'ext4'" > < / select >
< / div >
< div class = "form-group" ng-show = "volumeAdd.mountType === 'xfs'" >
< label class = "control-label" > {{ 'volumes.addVolumeDialog.diskPath' | tr }}< / label >
< select class = "form-control" ng-model = "volumeAdd.xfsDisk" ng-options = "item as item.label for item in xfsBlockDevices track by item.path" ng-required = "volumeAdd.mountType === 'xfs'" > < / select >
2022-11-04 15:01:27 +01:00
< / div >
2021-05-12 21:40:30 -07:00
2022-11-04 15:01:27 +01:00
< div class = "form-group" ng-show = "volumeAdd.mountType === 'cifs' || volumeAdd.mountType === 'nfs' || volumeAdd.mountType === 'sshfs'" >
< label class = "control-label" for = "volumeAddHost" > {{ 'volumes.addVolumeDialog.server' | tr }}< / label >
2023-02-25 23:14:54 +01:00
< input type = "text" class = "form-control" ng-model = "volumeAdd.host" id = "volumeAddHost" name = "host" ng-disabled = "volumeAdd.busy" placeholder = "Server IP or hostname" ng-required = "volumeAdd.mountType === 'cifs' || volumeAdd.mountType === 'nfs' || volumeAdd.mountType === 'sshfs'" >
2022-11-04 15:01:27 +01:00
< / div >
2021-05-12 21:40:30 -07:00
2022-11-04 15:01:27 +01:00
< div class = "checkbox" ng-show = "volumeAdd.mountType === 'cifs'" >
< label >
< input type = "checkbox" ng-model = "volumeAdd.seal" > {{ 'backups.configureBackupStorage.cifsSealSupport' | tr }}< / input >
< / label >
< / div >
2022-01-10 16:45:58 +01:00
2022-11-04 15:01:27 +01:00
< div class = "form-group" ng-show = "volumeAdd.mountType === 'sshfs'" >
< label class = "control-label" for = "volumeAddPort" > {{ 'volumes.addVolumeDialog.port' | tr }}< / label >
2023-02-25 23:14:54 +01:00
< input type = "number" class = "form-control" ng-model = "volumeAdd.port" id = "volumeAddPort" name = "port" ng-disabled = "volumeAdd.busy" ng-required = "volumeAdd.mountType === 'sshfs'" >
2022-11-04 15:01:27 +01:00
< / div >
2021-06-24 15:04:51 -07:00
2022-11-04 15:01:27 +01:00
< div class = "form-group" ng-show = "volumeAdd.mountType === 'cifs' || volumeAdd.mountType === 'nfs' || volumeAdd.mountType === 'sshfs'" >
< label class = "control-label" for = "volumeAddRemoteDir" > {{ 'volumes.addVolumeDialog.remoteDirectory' | tr }}< / label >
2023-02-25 23:14:54 +01:00
< input type = "text" class = "form-control" ng-model = "volumeAdd.remoteDir" id = "volumeAddRemoteDir" name = "remoteDir" ng-disabled = "volumeAdd.busy" placeholder = "/share" ng-required = "volumeAdd.mountType === 'cifs' || volumeAdd.mountType === 'nfs' || volumeAdd.mountType === 'sshfs'" >
2022-11-04 15:01:27 +01:00
< / div >
2021-05-12 21:40:30 -07:00
2022-11-04 15:01:27 +01:00
< div class = "form-group" ng-show = "volumeAdd.mountType === 'cifs'" >
< label class = "control-label" for = "volumeAddUsername" > {{ 'volumes.addVolumeDialog.username' | tr }}< / label >
2023-02-25 23:14:54 +01:00
< input type = "text" class = "form-control" ng-model = "volumeAdd.username" id = "volumeAddUsername" name = "cifsUsername" ng-disabled = "volumeAdd.busy" ng-required = "volumeAdd.mountType === 'cifs'" >
2022-11-04 15:01:27 +01:00
< / div >
2021-05-12 21:40:30 -07:00
2022-11-04 15:01:27 +01:00
< div class = "form-group" ng-show = "volumeAdd.mountType === 'cifs'" >
< label class = "control-label" for = "volumeAddPassword" > {{ 'volumes.addVolumeDialog.password' | tr }}< / label >
2023-02-25 23:14:54 +01:00
< input type = "password" class = "form-control" ng-model = "volumeAdd.password" id = "volumeAddPassword" name = "cifsPassword" ng-disabled = "volumeAdd.busy" password-reveal ng-required = "volumeAdd.mountType === 'cifs'" >
2022-11-04 15:01:27 +01:00
< / div >
2021-05-18 17:20:59 +02:00
2022-11-04 15:01:27 +01:00
< div class = "form-group" ng-show = "volumeAdd.mountType === 'sshfs'" >
< label class = "control-label" for = "volumeAddUser" > {{ 'volumes.addVolumeDialog.user' | tr }}< / label >
2023-02-25 23:14:54 +01:00
< input type = "text" class = "form-control" ng-model = "volumeAdd.user" id = "volumeAddUser" name = "user" ng-disabled = "volumeAdd.busy" ng-required = "volumeAdd.mountType === 'sshfs'" >
2022-11-04 15:01:27 +01:00
< / div >
2021-05-18 17:20:59 +02:00
2022-11-04 15:01:27 +01:00
< div class = "form-group" ng-show = "volumeAdd.mountType === 'sshfs'" >
< label class = "control-label" for = "volumeAddPrivateKey" > {{ 'volumes.addVolumeDialog.privateKey' | tr }}< / label >
2023-02-25 23:14:54 +01:00
< textarea class = "form-control" ng-model = "volumeAdd.privateKey" id = "volumeAddPrivateKey" name = "privateKey" ng-disabled = "volumeAdd.busy" ng-required = "volumeAdd.mountType === 'sshfs'" > < / textarea >
2021-05-12 21:40:30 -07:00
< / div >
2021-06-21 16:23:34 -07:00
< input class = "ng-hide" type = "submit" ng-disabled = "volumeAddForm.$invalid || volumeAdd.busy" / >
2020-10-28 16:14:32 -07:00
< / fieldset >
< / form >
< / div >
< div class = "modal-footer " >
2020-11-23 22:13:54 +01:00
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > {{ 'main.dialog.cancel' | tr }}< / button >
2021-06-21 16:23:34 -07:00
< button type = "submit" class = "btn btn-outline btn-success pull-right" ng-click = "volumeAdd.submit()" ng-disabled = "volumeAddForm.$invalid || volumeAdd.busy" > < i class = "fa fa-circle-notch fa-spin" ng-show = "volumeAdd.busy" > < / i > {{ 'main.dialog.save' | tr }}< / button >
2020-10-28 16:14:32 -07:00
< / div >
< / div >
< / div >
< / div >
2023-09-20 16:27:39 +02:00
<!-- modal volume edit -->
< div class = "modal fade" id = "volumeEditModal" tabindex = "-1" role = "dialog" >
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
2023-09-28 09:43:48 +02:00
< h4 class = "modal-title" > {{ 'volumes.editVolumeDialog.title' | tr:{ name: volumeEdit.name } }}< / h4 >
2023-09-20 16:27:39 +02:00
< / div >
< div class = "modal-body" >
< form name = "volumeEditForm" role = "form" novalidate ng-submit = "volumeEdit.submit()" autocomplete = "off" >
< fieldset >
< p class = "has-error text-center" ng-show = "volumeEdit.error" > {{ volumeEdit.error }}< / p >
< div > < b > {{ 'volumes.mountType' | tr }}:< / b > {{ volumeEdit.mountType }}< / div >
< br / >
< div class = "form-group" ng-show = "volumeEdit.mountType === 'cifs' || volumeEdit.mountType === 'nfs' || volumeEdit.mountType === 'sshfs'" >
< label class = "control-label" for = "volumeAddHost" > {{ 'volumes.addVolumeDialog.server' | tr }}< / label >
< input type = "text" class = "form-control" ng-model = "volumeEdit.host" id = "volumeEditHost" name = "host" ng-disabled = "volumeEdit.busy" placeholder = "Server IP or hostname" ng-required = "volumeEdit.mountType === 'cifs' || volumeEdit.mountType === 'nfs' || volumeEdit.mountType === 'sshfs'" >
< / div >
< div class = "checkbox" ng-show = "volumeEdit.mountType === 'cifs'" >
< label >
< input type = "checkbox" ng-model = "volumeEdit.seal" > {{ 'backups.configureBackupStorage.cifsSealSupport' | tr }}< / input >
< / label >
< / div >
< div class = "form-group" ng-show = "volumeEdit.mountType === 'sshfs'" >
< label class = "control-label" for = "volumeEditPort" > {{ 'volumes.addVolumeDialog.port' | tr }}< / label >
< input type = "number" class = "form-control" ng-model = "volumeEdit.port" id = "volumeEditPort" name = "port" ng-disabled = "volumeEdit.busy" ng-required = "volumeEdit.mountType === 'sshfs'" >
< / div >
< div class = "form-group" ng-show = "volumeEdit.mountType === 'cifs' || volumeEdit.mountType === 'nfs' || volumeEdit.mountType === 'sshfs'" >
< label class = "control-label" for = "volumeEditRemoteDir" > {{ 'volumes.addVolumeDialog.remoteDirectory' | tr }}< / label >
< input type = "text" class = "form-control" ng-model = "volumeEdit.remoteDir" id = "volumeAddRemoteDir" name = "remoteDir" ng-disabled = "volumeEdit.busy" placeholder = "/share" ng-required = "volumeEdit.mountType === 'cifs' || volumeAdd.mountType === 'nfs' || volumeAdd.mountType === 'sshfs'" >
< / div >
< div class = "form-group" ng-show = "volumeEdit.mountType === 'cifs'" >
< label class = "control-label" for = "volumeEditUsername" > {{ 'volumes.addVolumeDialog.username' | tr }}< / label >
< input type = "text" class = "form-control" ng-model = "volumeEdit.username" id = "volumeEditUsername" name = "cifsUsername" ng-disabled = "volumeEdit.busy" ng-required = "volumeEdit.mountType === 'cifs'" >
< / div >
< div class = "form-group" ng-show = "volumeEdit.mountType === 'cifs'" >
< label class = "control-label" for = "volumeEditPassword" > {{ 'volumes.addVolumeDialog.password' | tr }}< / label >
< input type = "password" class = "form-control" ng-model = "volumeEdit.password" id = "volumeEditPassword" name = "cifsPassword" ng-disabled = "volumeEdit.busy" password-reveal ng-required = "volumeEdit.mountType === 'cifs'" >
< / div >
< div class = "form-group" ng-show = "volumeEdit.mountType === 'sshfs'" >
< label class = "control-label" for = "volumeEditUser" > {{ 'volumes.addVolumeDialog.user' | tr }}< / label >
< input type = "text" class = "form-control" ng-model = "volumeEdit.user" id = "volumeEditAddUser" name = "user" ng-disabled = "volumeEdit.busy" ng-required = "volumeEdit.mountType === 'sshfs'" >
< / div >
< div class = "form-group" ng-show = "volumeEdit.mountType === 'sshfs'" >
< label class = "control-label" for = "volumeEditPrivateKey" > {{ 'volumes.addVolumeDialog.privateKey' | tr }}< / label >
< textarea class = "form-control" ng-model = "volumeEdit.privateKey" id = "volumeEditPrivateKey" name = "privateKey" ng-disabled = "volumeEdit.busy" ng-required = "volumeEdit.mountType === 'sshfs'" > < / textarea >
< / div >
< input class = "ng-hide" type = "submit" ng-disabled = "volumeEditForm.$invalid || volumeEdit.busy" / >
< / fieldset >
< / 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 = "volumeEdit.submit()" ng-disabled = "volumeEditForm.$invalid || volumeEdit.busy" > < i class = "fa fa-circle-notch fa-spin" ng-show = "volumeEdit.busy" > < / i > {{ 'main.dialog.save' | tr }}< / button >
< / div >
< / div >
< / div >
< / div >
2020-10-28 16:14:32 -07:00
<!-- Modal volume remove -->
< div class = "modal fade" id = "volumeRemoveModal" tabindex = "-1" role = "dialog" >
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
2020-11-23 22:13:54 +01:00
< h4 class = "modal-title" > {{ 'volumes.removeVolumeDialog.title' | tr:{ volume:volumeRemove.volume.name } }}< / h4 >
2020-10-28 16:14:32 -07:00
< / div >
< div class = "modal-body" >
2020-11-23 17:10:40 -08:00
< p ng-bind-html = "'volumes.removeVolumeDialog.description' | tr:{ volume:volumeRemove.volume.name }" > < / p >
2020-11-23 22:13:54 +01:00
< p class = "has-error" ng-show = "volumeRemove.error" > {{ volumeRemove.error }}< / p >
2020-10-28 16:14:32 -07:00
< / div >
< div class = "modal-footer" >
2020-11-23 22:13:54 +01:00
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > {{ 'main.dialog.cancel' | tr }}< / button >
< button type = "button" class = "btn btn-danger" ng-click = "volumeRemove.submit()" ng-disabled = "volumeRemove.busy" > < i class = "fa fa-circle-notch fa-spin" ng-show = "volumeRemove.busy" > < / i > {{ 'volumes.removeVolumeDialog.removeAction' | tr }}< / button >
2020-10-28 16:14:32 -07:00
< / div >
< / div >
< / div >
< / div >
< div class = "content" >
2024-10-15 18:46:51 +02:00
< h1 class = "section-header" >
{{ 'volumes.title' | tr }}
< button class = "btn btn-primary btn-outline" ng-click = "volumeAdd.show()" > < i class = "fa fa-plus" > < / i > {{ 'volumes.addVolumeAction' | tr }}< / button >
< / h1 >
2020-10-28 16:14:32 -07:00
< div class = "card card-large" >
2020-11-23 17:10:40 -08:00
< p ng-bind-html = "'volumes.description' | tr" > < / p >
2020-10-28 16:14:32 -07:00
< div class = "row ng-hide" ng-show = "!ready" >
< div class = "col-lg-12 text-center" >
< h2 > < i class = "fa fa-circle-notch fa-spin" > < / i > < / h2 >
< / div >
< / div >
< div class = "row animateMeOpacity ng-hide" ng-show = "ready" >
< div class = "col-lg-12" >
2022-06-10 12:55:23 +02:00
< table class = "table table-hover" style = "margin-top: 10px; table-layout: fixed;" >
2020-10-28 16:14:32 -07:00
< thead >
< tr >
2024-10-15 19:35:24 +02:00
< th style = "width: 30px" > < / th >
< th class = "text-left" > {{ 'volumes.name' | tr }}< / th >
< th class = "text-left" > {{ 'volumes.type' | tr }}< / th >
< th class = "text-left hide-mobile" style = "width: 40%;" > {{ 'volumes.hostPath' | tr }}< / th >
< th class = "text-right" > {{ 'main.actions' | tr }}< / th >
2020-10-28 16:14:32 -07:00
< / tr >
< / thead >
< tbody >
< tr ng-repeat = "volume in volumes" >
2021-05-13 15:33:07 -07:00
< td >
< i class = "fa fa-circle" ng-style = "{ color: volume.status.state === 'active' ? '#27CE65' : '#d9534f' }" ng-show = "volume.status" uib-tooltip = "{{ volume.status.message }}" > < / i >
< i class = "fa fa-circle-notch fa-spin" ng-hide = "volume.status" > < / i >
< / td >
2024-10-15 19:35:24 +02:00
< td >
2020-10-28 16:14:32 -07:00
{{ volume.name }}
< / td >
2024-10-15 19:35:24 +02:00
< td >
2021-06-21 00:05:39 -07:00
{{ volume.mountType }}
< / td >
2024-10-15 19:35:24 +02:00
< td class = "hide-mobile" style = "text-wrap: nowrap; overflow: hidden; text-overflow: ellipsis;" ng-hide = "(volume.mountType === 'mountpoint' || volume.mountType === 'filesystem')" > {{ volume.mountOptions.host || volume.mountOptions.diskPath || volume.hostPath }}{{ volume.mountOptions.remoteDir }}< / td >
< td class = "hide-mobile" style = "text-wrap: nowrap; overflow: hidden; text-overflow: ellipsis;" ng-show = "(volume.mountType === 'mountpoint' || volume.mountType === 'filesystem')" > {{ volume.hostPath }}< / td >
< td class = "text-right" style = "text-wrap: nowrap;" >
2021-10-11 15:51:26 +02:00
< button class = "btn btn-xs btn-default" ng-click = "remount(volume)" ng-show = "isMountProvider(volume.mountType)" ng-disabled = "volume.remounting" uib-tooltip = "{{ 'volumes.remountActionTooltip' | tr }}" > < i class = "fa fa-sync-alt" ng-class = "{ 'fa-spin': volume.remounting }" > < / i > < / button >
2023-09-20 16:27:39 +02:00
< button class = "btn btn-xs btn-default" ng-click = "volumeEdit.show(volume)" ng-show = "isNetworkProvider(volume.mountType)" ng-disabled = "volume.remounting" uib-tooltip = "{{ 'volumes.editActionTooltip' | tr }}" > < i class = "fa fa-pencil-alt" > < / i > < / button >
2024-10-04 21:37:17 +02:00
< a class = "btn btn-xs btn-default" ng-href = "{{ '/filemanager.html#/home/volume/' + volume.id }}" target = "_blank" uib-tooltip = "{{ 'volumes.openFileManagerActionTooltip' | tr }}" > < i class = "fas fa-folder" > < / i > < / a >
2020-11-23 22:13:54 +01:00
< button class = "btn btn-xs btn-danger" ng-click = "volumeRemove.show(volume)" uib-tooltip = "{{ 'volumes.removeVolumeActionTooltip' | tr }}" > < i class = "far fa-trash-alt" > < / i > < / button >
2020-10-28 16:14:32 -07:00
< / td >
< / tr >
< / tbody >
< / table >
< / div >
< / div >
< / div >
2021-09-26 12:19:32 -07:00
< / div >