No longer hide the web UI controls for the new untrusted/encrypted device feature. Testing hasn't been very widespread, but there has been some and quite a few bugs have been caught and fixed. I believe its time to not hide it anymore, and cautiously recommend usage. E.g. mention that the feature hasn't been widely used yet and anyone using it is an early adopter, but drop the bit about not using it with production data. We can maybe stress the need for backups in general and especially using this.
167 lines
11 KiB
HTML
167 lines
11 KiB
HTML
<modal id="editDevice" status="default" icon="{{editDeviceModalIcon()}}" heading="{{editDeviceModalTitle()}}" large="yes" closeable="yes">
|
|
<div class="modal-body">
|
|
<form role="form" name="deviceEditor">
|
|
<ul class="nav nav-tabs" ng-init="loadFormIntoScope(deviceEditor)">
|
|
<li class="active"><a data-toggle="tab" href="#device-general"><span class="fas fa-cog"></span> <span translate>General</span></a></li>
|
|
<li ng-if="!editingDefaults"><a data-toggle="tab" href="#device-sharing"><span class="fas fa-share-alt"></span> <span translate>Sharing</span></a></li>
|
|
<li><a data-toggle="tab" href="#device-advanced"><span class="fas fa-cogs"></span> <span translate>Advanced</span></a></li>
|
|
</ul>
|
|
<div class="tab-content">
|
|
<div id="device-general" class="tab-pane in active">
|
|
<div ng-if="!editingDefaults" class="form-group" ng-class="{'has-error': deviceEditor.deviceID.$invalid && deviceEditor.deviceID.$dirty}" ng-init="loadFormIntoScope(deviceEditor)">
|
|
<label translate for="deviceID">Device ID</label>
|
|
<div ng-if="!editingExisting">
|
|
<input name="deviceID" id="deviceID" class="form-control text-monospace" type="text" ng-model="currentDevice.deviceID" required="" valid-deviceid list="discovery-list" aria-required="true" />
|
|
<datalist id="discovery-list">
|
|
<option ng-repeat="id in discovery" value="{{id}}" />
|
|
</datalist>
|
|
<p class="help-block" ng-if="discovery && discovery.length !== 0">
|
|
<span translate>You can also select one of these nearby devices:</span>
|
|
<ul>
|
|
<li ng-repeat="id in discovery"><a href="#" ng-click="currentDevice.deviceID = id">{{id}}</a></li>
|
|
</ul>
|
|
</p>
|
|
<p class="help-block">
|
|
<span translate ng-if="deviceEditor.deviceID.$valid || deviceEditor.deviceID.$pristine">The device ID to enter here can be found in the "Actions > Show ID" dialog on the other device. Spaces and dashes are optional (ignored).</span>
|
|
<span translate ng-show="deviceEditor.deviceID.$valid || deviceEditor.deviceID.$pristine">When adding a new device, keep in mind that this device must be added on the other side too.</span>
|
|
<span translate ng-if="deviceEditor.deviceID.$error.required && deviceEditor.deviceID.$dirty">The device ID cannot be blank.</span>
|
|
<span translate ng-if="deviceEditor.deviceID.$error.validDeviceid && deviceEditor.deviceID.$dirty">The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.</span>
|
|
<span translate ng-if="deviceEditor.deviceID.$error.unique && deviceEditor.deviceID.$dirty">A device with that ID is already added.</span>
|
|
</p>
|
|
</div>
|
|
<div ng-if="editingExisting" class="well well-sm text-monospace" select-on-click>{{currentDevice.deviceID}}</div>
|
|
</div>
|
|
<div class="form-group">
|
|
<label translate for="name">Device Name</label>
|
|
<input id="name" class="form-control" type="text" ng-model="currentDevice.name" />
|
|
<p translate ng-if="currentDevice.deviceID == myID" class="help-block">Shown instead of Device ID in the cluster status. Will be advertised to other devices as an optional default name.</p>
|
|
<p translate ng-if="currentDevice.deviceID != myID" class="help-block">Shown instead of Device ID in the cluster status. Will be updated to the name the device advertises if left empty.</p>
|
|
</div>
|
|
</div>
|
|
<div ng-if="!editingDefaults" id="device-sharing" class="tab-pane">
|
|
<div class="row">
|
|
<div class="col-md-6">
|
|
<div class="form-group">
|
|
<div class="checkbox">
|
|
<label>
|
|
<input type="checkbox" ng-model="currentDevice.introducer">
|
|
<span translate>Introducer</span>
|
|
<p translate class="help-block">Add devices from the introducer to our device list, for mutually shared folders.</p>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<div class="form-group">
|
|
<div class="checkbox">
|
|
<label>
|
|
<input type="checkbox" ng-model="currentDevice.autoAcceptFolders">
|
|
<span translate>Auto Accept</span>
|
|
<p translate class="help-block">Automatically create or share folders that this device advertises at the default path.</p>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="form-group">
|
|
<div class="form-horizontal" ng-if="currentSharing.shared.length">
|
|
<label translate for="folders">Shared Folders</label>
|
|
<p class="help-block">
|
|
<span translate>Deselect folders to stop sharing with this device.</span> 
|
|
<small><a href="#" ng-click="selectAllSharedFolders(true)" translate>Select All</a> 
|
|
<a href="#" ng-click="selectAllSharedFolders(false)" translate>Deselect All</a></small>
|
|
</p>
|
|
<div class="form-group" ng-repeat="folder in currentSharing.shared">
|
|
<share-template selected="currentSharing.selected" encryption-passwords="currentSharing.encryptionPasswords" id="{{folder.id}}" label="{{folderLabel(folder.id)}}" folder-type="{{folder.type}}" untrusted="currentDevice.untrusted" />
|
|
</div>
|
|
</div>
|
|
<div class="form-horizontal" ng-if="currentSharing.unrelated.length">
|
|
<label translate for="folders">Unshared Folders</label>
|
|
<p class="help-block" ng-if="folderList().length > 0">
|
|
<span translate>Select additional folders to share with this device.</span> 
|
|
<small><a href="#" ng-click="selectAllUnrelatedFolders(true)" translate>Select All</a> 
|
|
<a href="#" ng-click="selectAllUnrelatedFolders(false)" translate>Deselect All</a></small>
|
|
</p>
|
|
<p class="help-block" ng-if="folderList().length == 0">
|
|
<span translate>There are no folders to share with this device.</span>
|
|
</p>
|
|
<div class="form-group" ng-repeat="folder in currentSharing.unrelated">
|
|
<share-template selected="currentSharing.selected" encryption-passwords="currentSharing.encryptionPasswords" id="{{folder.id}}" label="{{folderLabel(folder.id)}}" folder-type="{{folder.type}}" untrusted="currentDevice.untrusted" />
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div id="device-advanced" class="tab-pane">
|
|
<div class="row form-group">
|
|
<div class="col-md-6">
|
|
<div class="form-group">
|
|
<label translate for="addresses">Addresses</label>
|
|
<input ng-disabled="currentDevice.deviceID == myID" id="addresses" class="form-control" type="text" ng-model="currentDevice._addressesStr"></input>
|
|
<p translate class="help-block">Enter comma separated ("tcp://ip:port", "tcp://host:port") addresses or "dynamic" to perform automatic discovery of the address.</p>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<div class="form-group">
|
|
<label translate>Compression</label>
|
|
<select class="form-control" ng-model="currentDevice.compression">
|
|
<option value="always" translate>All Data</option>
|
|
<option value="metadata" translate>Metadata Only</option>
|
|
<option value="never" translate>Off</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="row form-group">
|
|
<div class="col-md-12">
|
|
<label translate>Device rate limits</label>
|
|
<div class="row">
|
|
<div class="col-md-6" ng-class="{'has-error': deviceEditor.maxRecvKbps.$invalid && deviceEditor.maxRecvKbps.$dirty}">
|
|
<div class="row">
|
|
<span class="col-md-8" translate>Incoming Rate Limit (KiB/s)</span>
|
|
<div class="col-md-4">
|
|
<input name="maxRecvKbps" id="maxRecvKbps" class="form-control" type="number" pattern="\d+" ng-model="currentDevice.maxRecvKbps" min="0" />
|
|
</div>
|
|
</div>
|
|
<p class="help-block" ng-if="!deviceEditor.maxRecvKbps.$valid && deviceEditor.maxRecvKbps.$dirty" translate>The rate limit must be a non-negative number (0: no limit)</p>
|
|
</div>
|
|
<div class="col-md-6" ng-class="{'has-error': deviceEditor.maxSendKbps.$invalid && deviceEditor.maxSendKbps.$dirty}">
|
|
<div class="row">
|
|
<span class="col-md-8" translate>Outgoing Rate Limit (KiB/s)</span>
|
|
<div class="col-md-4">
|
|
<input name="maxSendKbps" id="maxSendKbps" class="form-control" type="number" pattern="\d+" ng-model="currentDevice.maxSendKbps" min="0" />
|
|
</div>
|
|
</div>
|
|
<p class="help-block" ng-if="!deviceEditor.maxSendKbps.$valid && deviceEditor.maxSendKbps.$dirty" translate>The rate limit must be a non-negative number (0: no limit)</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="row">
|
|
<div class="form-group col-md-6">
|
|
<input type="checkbox" id="untrusted" ng-model="currentDevice.untrusted" />
|
|
<label for="untrusted" translate>Untrusted</label>
|
|
<p translate class="help-block">All folders shared with this device must be protected by a password, such that all sent data is unreadable without the given password.</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
<div class="modal-footer">
|
|
<button type="button" class="btn btn-primary btn-sm" ng-click="saveDevice()" ng-disabled="deviceEditor.$invalid">
|
|
<span class="fas fa-check"></span> <span translate>Save</span>
|
|
</button>
|
|
<button ng-if="!editingDefaults" type="button" class="btn btn-default btn-sm" data-toggle="modal" data-target="#idqr" ng-if="editingExisting || deviceEditor.deviceID.$valid">
|
|
<span class="fas fa-qrcode"></span> <span translate>Show QR</span>
|
|
</button>
|
|
<button type="button" class="btn btn-default btn-sm" data-dismiss="modal">
|
|
<span class="fas fa-times"></span> <span translate>Close</span>
|
|
</button>
|
|
<div ng-if="editingExisting && !editingDefaults" class="pull-left">
|
|
<button type="button" class="btn btn-warning btn-sm" data-toggle="modal" data-target="#remove-device-confirmation">
|
|
<span class="fas fa-minus-circle"></span> <span translate>Remove</span>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</modal>
|