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.
This commit is contained in:
@@ -769,6 +769,7 @@ angular.module('syncthing.core')
|
||||
$scope.currentSharing.shared = [];
|
||||
$scope.currentSharing.unrelated = [];
|
||||
$scope.currentSharing.selected = {};
|
||||
$scope.currentSharing.encryptionPasswords = {};
|
||||
if (editing === 'folder') {
|
||||
initShareEditingFolder();
|
||||
}
|
||||
@@ -779,6 +780,9 @@ angular.module('syncthing.core')
|
||||
if (n.deviceID !== $scope.myID) {
|
||||
$scope.currentSharing.shared.push($scope.devices[n.deviceID]);
|
||||
}
|
||||
if (n.encryptionPassword !== '') {
|
||||
$scope.currentSharing.encryptionPasswords[n.deviceID] = n.encryptionPassword;
|
||||
}
|
||||
$scope.currentSharing.selected[n.deviceID] = true;
|
||||
});
|
||||
$scope.currentSharing.unrelated = $scope.deviceList().filter(function (n) {
|
||||
@@ -903,9 +907,12 @@ angular.module('syncthing.core')
|
||||
if ($scope.hasFailedFiles(folderCfg.id)) {
|
||||
return 'faileditems';
|
||||
}
|
||||
if (folderInfo.receiveOnlyTotalItems) {
|
||||
if ($scope.hasReceiveOnlyChanged(folderCfg)) {
|
||||
return 'localadditions';
|
||||
}
|
||||
if ($scope.hasReceiveEncryptedItems(folderCfg)) {
|
||||
return 'localunencrypted';
|
||||
}
|
||||
if (folderCfg.devices.length <= 1) {
|
||||
return 'unshared';
|
||||
}
|
||||
@@ -928,7 +935,7 @@ angular.module('syncthing.core')
|
||||
if (status === 'unknown') {
|
||||
return 'info';
|
||||
}
|
||||
if (status === 'stopped' || status === 'outofsync' || status === 'error' || status === 'faileditems') {
|
||||
if (status === 'stopped' || status === 'outofsync' || status === 'error' || status === 'faileditems' || status === 'localunencrypted') {
|
||||
return 'danger';
|
||||
}
|
||||
if (status === 'unshared' || status === 'scan-waiting' || status === 'sync-waiting' || status === 'clean-waiting') {
|
||||
@@ -1553,6 +1560,13 @@ angular.module('syncthing.core')
|
||||
$scope.deviceFolders($scope.currentDevice).forEach(function (folderID) {
|
||||
$scope.currentSharing.shared.push($scope.folders[folderID]);
|
||||
$scope.currentSharing.selected[folderID] = true;
|
||||
var folderdevices = $scope.folders[folderID].devices;
|
||||
for (var i = 0; i < folderdevices.length; i++) {
|
||||
if (folderdevices[i].deviceID === deviceCfg.deviceID) {
|
||||
$scope.currentSharing.encryptionPasswords[folderID] = folderdevices[i].encryptionPassword;
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
$scope.currentSharing.unrelated = $scope.folderList().filter(function (n) {
|
||||
return !$scope.currentSharing.selected[n.id];
|
||||
@@ -1656,6 +1670,8 @@ angular.module('syncthing.core')
|
||||
for (i = 0; i < $scope.folders[id].devices.length; i++) {
|
||||
if ($scope.folders[id].devices[i].deviceID === currentID) {
|
||||
found = true;
|
||||
// Update encryption pw
|
||||
$scope.folders[id].devices[i].encryptionPassword = $scope.currentSharing.encryptionPasswords[id];
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1664,6 +1680,7 @@ angular.module('syncthing.core')
|
||||
// Add device to folder
|
||||
$scope.folders[id].devices.push({
|
||||
deviceID: currentID,
|
||||
encryptionPassword: $scope.currentSharing.encryptionPasswords[id],
|
||||
});
|
||||
}
|
||||
} else {
|
||||
@@ -1822,19 +1839,32 @@ angular.module('syncthing.core')
|
||||
});
|
||||
|
||||
$scope.setFSWatcherIntervalDefault = function () {
|
||||
var defaultRescanIntervals = [60, 3600];
|
||||
var defaultRescanIntervals = [60, 3600, 3600*24];
|
||||
if (defaultRescanIntervals.indexOf($scope.currentFolder.rescanIntervalS) === -1) {
|
||||
return;
|
||||
}
|
||||
var idx;
|
||||
if ($scope.currentFolder.fsWatcherEnabled) {
|
||||
idx = 1;
|
||||
} else if ($scope.currentFolder.type === 'receiveencrypted') {
|
||||
idx = 2;
|
||||
} else {
|
||||
idx = 0;
|
||||
}
|
||||
$scope.currentFolder.rescanIntervalS = defaultRescanIntervals[idx];
|
||||
};
|
||||
|
||||
$scope.setDefaultsForFolderType = function () {
|
||||
if ($scope.currentFolder.type === 'receiveencrypted') {
|
||||
$scope.currentFolder.fsWatcherEnabled = false;
|
||||
$scope.currentFolder.ignorePerms = true;
|
||||
delete $scope.currentFolder.versioning;
|
||||
} else {
|
||||
$scope.currentFolder.fsWatcherEnabled = true;
|
||||
}
|
||||
$scope.setFSWatcherIntervalDefault();
|
||||
};
|
||||
|
||||
$scope.loadFormIntoScope = function (form) {
|
||||
console.log('loadFormIntoScope', form.$name);
|
||||
switch (form.$name) {
|
||||
@@ -1853,6 +1883,7 @@ angular.module('syncthing.core')
|
||||
|
||||
function editFolderModal() {
|
||||
initVersioningEditing();
|
||||
$scope.currentFolder._recvEnc = $scope.currentFolder.type === 'receiveencrypted';
|
||||
$scope.folderPathErrors = {};
|
||||
$scope.folderEditor.$setPristine();
|
||||
$('#editFolder').modal().one('shown.bs.tab', function (e) {
|
||||
@@ -2003,6 +2034,13 @@ angular.module('syncthing.core')
|
||||
};
|
||||
$scope.currentSharing.selected[device] = true;
|
||||
$scope.currentFolder.label = pendingFolder.offeredBy[device].label;
|
||||
for (var k in pendingFolder.offeredBy) {
|
||||
if (pendingFolder.offeredBy[k].receiveEncrypted) {
|
||||
$scope.currentFolder.type = "receiveencrypted";
|
||||
$scope.setDefaultsForFolderType();
|
||||
break;
|
||||
}
|
||||
}
|
||||
editFolderModal();
|
||||
});
|
||||
};
|
||||
@@ -2039,6 +2077,7 @@ angular.module('syncthing.core')
|
||||
var newDevices = [];
|
||||
folderCfg.devices.forEach(function (dev) {
|
||||
if ($scope.currentSharing.selected[dev.deviceID] === true) {
|
||||
dev.encryptionPassword = $scope.currentSharing.encryptionPasswords[dev.deviceID];
|
||||
newDevices.push(dev);
|
||||
delete $scope.currentSharing.selected[dev.deviceID];
|
||||
};
|
||||
@@ -2046,7 +2085,8 @@ angular.module('syncthing.core')
|
||||
for (var deviceID in $scope.currentSharing.selected) {
|
||||
if ($scope.currentSharing.selected[deviceID] === true) {
|
||||
newDevices.push({
|
||||
deviceID: deviceID
|
||||
deviceID: deviceID,
|
||||
encryptionPassword: $scope.currentSharing.encryptionPasswords[deviceID],
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -2473,23 +2513,40 @@ angular.module('syncthing.core')
|
||||
return $scope.model[folder].errors !== 0;
|
||||
};
|
||||
|
||||
$scope.showLocalChanged = function (folder) {
|
||||
$scope.showLocalChanged = function (folder, folderType) {
|
||||
$scope.localChangedFolder = folder;
|
||||
$scope.localChangedType = folderType;
|
||||
$scope.localChanged = $scope.refreshLocalChanged(1, 10);
|
||||
$('#localChanged').modal().one('hidden.bs.modal', function () {
|
||||
$scope.localChanged = {};
|
||||
$scope.localChangedFolder = undefined;
|
||||
$scope.localChangedType = undefined;
|
||||
});
|
||||
};
|
||||
|
||||
$scope.canRevert = function (folder) {
|
||||
var f = $scope.model[folder];
|
||||
if (!f) {
|
||||
$scope.hasReceiveOnlyChanged = function (folderCfg) {
|
||||
if (!folderCfg || folderCfg.type !== "receiveonly") {
|
||||
return false;
|
||||
}
|
||||
return $scope.model[folder].receiveOnlyTotalItems > 0;
|
||||
var counts = $scope.model[folderCfg.id];
|
||||
return counts && counts.receiveOnlyTotalItems > 0;
|
||||
};
|
||||
|
||||
$scope.hasReceiveEncryptedItems = function (folderCfg) {
|
||||
if (!folderCfg || folderCfg.type !== "receiveencrypted") {
|
||||
return false;
|
||||
}
|
||||
return $scope.receiveEncryptedItemsCount(folderCfg) > 0;
|
||||
};
|
||||
|
||||
$scope.receiveEncryptedItemsCount = function (folderCfg) {
|
||||
var counts = $scope.model[folderCfg.id];
|
||||
if (!counts) {
|
||||
return 0;
|
||||
}
|
||||
return counts.receiveOnlyTotalItems - counts.receiveOnlyChangedDeletes;
|
||||
}
|
||||
|
||||
$scope.revertOverride = function () {
|
||||
$http.post(
|
||||
urlbase + "/db/" + $scope.revertOverrideParams.operation +"?folder="
|
||||
@@ -2734,4 +2791,23 @@ angular.module('syncthing.core')
|
||||
address.indexOf('unix://') == 0 ||
|
||||
address.indexOf('unixs://') == 0);
|
||||
}
|
||||
})
|
||||
.directive('shareTemplate', function () {
|
||||
return {
|
||||
templateUrl: 'syncthing/core/editShareTemplate.html',
|
||||
scope: {
|
||||
selected: '=',
|
||||
encryptionPasswords: '=',
|
||||
id: '@',
|
||||
label: '@',
|
||||
folderType: '@',
|
||||
untrusted: '=',
|
||||
},
|
||||
link: function(scope, elem, attrs) {
|
||||
var plain = false;
|
||||
scope.togglePasswordVisibility = function() {
|
||||
scope.plain = !scope.plain;
|
||||
};
|
||||
},
|
||||
}
|
||||
});
|
||||
|
||||
@@ -63,50 +63,30 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<div class="form-group" 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="row">
|
||||
<div class="col-md-4" ng-repeat="folder in currentSharing.shared">
|
||||
<div class="checkbox">
|
||||
<label ng-if="folder.label.length == 0">
|
||||
<input type="checkbox" ng-model="currentSharing.selected[folder.id]" /> {{folder.id}}
|
||||
</label>
|
||||
<label ng-if="folder.label.length != 0">
|
||||
<input type="checkbox" ng-model="currentSharing.selected[folder.id]" /> <span tooltip data-original-title="{{folder.id}}">{{folder.label}}</span>
|
||||
</label>
|
||||
</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 class="form-group" ng-if="currentSharing.unrelated.length || folderList().length == 0">
|
||||
<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="row">
|
||||
<div class="col-md-4" ng-repeat="folder in currentSharing.unrelated">
|
||||
<div class="checkbox">
|
||||
<label ng-if="folder.label.length == 0">
|
||||
<input type="checkbox" ng-model="currentSharing.selected[folder.id]"> {{folder.id}}
|
||||
</label>
|
||||
<label ng-if="folder.label.length != 0">
|
||||
<input type="checkbox" ng-model="currentSharing.selected[folder.id]"> <span tooltip data-original-title="{{folder.id}}">{{folder.label}}</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</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>
|
||||
@@ -156,6 +136,13 @@
|
||||
</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>
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<li class="active"><a data-toggle="tab" href="#folder-general"><span class="fas fa-cog"></span> <span translate>General</span></a></li>
|
||||
<li><a data-toggle="tab" href="#folder-sharing"><span class="fas fa-share-alt"></span> <span translate>Sharing</span></a></li>
|
||||
<li><a data-toggle="tab" href="#folder-versioning"><span class="fas fa-copy"></span> <span translate>File Versioning</span></a></li>
|
||||
<li ng-if="!editingDefaults"><a data-toggle="tab" href="#folder-ignores"><span class="fas fa-filter"></span> <span translate>Ignore Patterns</span></a></li>
|
||||
<li ng-if="!editingDefaults" ng-class="{'disabled': currentFolder._recvEnc}"><a ng-attr-data-toggle="{{ currentFolder._recvEnc ? undefined : 'tab'}}" href="{{currentFolder._recvEnc ? '#' : '#folder-ignores'}}"><span class="fas fa-filter"></span> <span translate>Ignore Patterns</span></a></li>
|
||||
<li><a data-toggle="tab" href="#folder-advanced"><span class="fas fa-cogs"></span> <span translate>Advanced</span></a></li>
|
||||
</ul>
|
||||
<div class="tab-content">
|
||||
@@ -48,24 +48,18 @@
|
||||
</div>
|
||||
|
||||
<div id="folder-sharing" class="tab-pane">
|
||||
<div class="form-group" ng-if="currentSharing.shared.length">
|
||||
<div class="form-horizontal" ng-if="currentSharing.shared.length">
|
||||
<label translate>Currently Shared With Devices</label>
|
||||
<p class="help-block">
|
||||
<span translate>Deselect devices to stop sharing this folder with.</span> 
|
||||
<small><a href="#" ng-click="selectAllSharedDevices(true)" translate>Select All</a> 
|
||||
<a href="#" ng-click="selectAllSharedDevices(false)" translate>Deselect All</a></small>
|
||||
</p>
|
||||
<div class="row">
|
||||
<div class="col-md-4" ng-repeat="device in currentSharing.shared">
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" ng-model="currentSharing.selected[device.deviceID]" /> {{deviceName(device)}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group" ng-repeat="device in currentSharing.shared">
|
||||
<share-template selected="currentSharing.selected" encryption-passwords="currentSharing.encryptionPasswords" id="{{device.deviceID}}" label="{{deviceName(device)}}" folder-type="{{currentFolder.type}}" untrusted="device.untrusted" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group" ng-if="currentSharing.unrelated.length || otherDevices().length <= 0">
|
||||
<div class="form-horizontal" ng-if="currentSharing.unrelated.length || otherDevices().length <= 0">
|
||||
<label translate>Unshared Devices</label>
|
||||
<p class="help-block" ng-if="otherDevices().length > 0">
|
||||
<span translate>Select additional devices to share this folder with.</span> 
|
||||
@@ -75,14 +69,8 @@
|
||||
<p class="help-block" ng-if="otherDevices().length <= 0">
|
||||
<span translate>There are no devices to share this folder with.</span>
|
||||
</p>
|
||||
<div class="row">
|
||||
<div class="col-md-4" ng-repeat="device in currentSharing.unrelated">
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" ng-model="currentSharing.selected[device.deviceID]" /> {{deviceName(device)}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group" ng-repeat="device in currentSharing.unrelated" ng-init="id = device.deviceID; folder = currentFolder">
|
||||
<share-template selected="currentSharing.selected" encryption-passwords="currentSharing.encryptionPasswords" id="{{device.deviceID}}" label="{{deviceName(device)}}" folder-type="{{currentFolder.type}}" untrusted="device.untrusted" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -153,7 +141,7 @@
|
||||
<div class="input-group-addon" translate>seconds</div>
|
||||
</div>
|
||||
<p class="help-block">
|
||||
<span translate ng-if="folderEditor.cleanupIntervalS.$valid || folderEditor.cleanupIntervalS.$pristine" class="help-block">The interval, in seconds, for running cleanup in the versions directory. Zero to disable periodic cleaning.</span>
|
||||
<span translate ng-if="folderEditor.cleanupIntervalS.$valid || folderEditor.cleanupIntervalS.$pristine"class="help-block">The interval, in seconds, for running cleanup in the versions directory. Zero to disable periodic cleaning.</span>
|
||||
<span translate ng-if="folderEditor.cleanupIntervalS.$error.required && folderEditor.cleanupIntervalS.$dirty">The cleanup interval cannot be blank.</span>
|
||||
<span translate ng-if="folderEditor.cleanupIntervalS.$error.min && folderEditor.cleanupIntervalS.$dirty">The interval must be a positive number of seconds.</span>
|
||||
</p>
|
||||
@@ -217,13 +205,17 @@
|
||||
<div class="col-md-6 form-group">
|
||||
<label translate>Folder Type</label>
|
||||
<a href="https://docs.syncthing.net/users/foldertypes.html" target="_blank"><span class="fas fa-question-circle"></span> <span translate>Help</span></a>
|
||||
<select class="form-control" ng-model="currentFolder.type">
|
||||
<select class="form-control" ng-change="setDefaultsForFolderType()" ng-model="currentFolder.type" ng-disabled="editingExisting && currentFolder.type == 'receiveencrypted'">
|
||||
<option value="sendreceive" translate>Send & Receive</option>
|
||||
<option value="sendonly" translate>Send Only</option>
|
||||
<option value="receiveonly" translate>Receive Only</option>
|
||||
<option value="receiveencrypted" ng-disabled="editingExisting" translate>Receive Encrypted</option>
|
||||
</select>
|
||||
<p ng-if="currentFolder.type == 'sendonly'" translate class="help-block">Files are protected from changes made on other devices, but changes made on this device will be sent to the rest of the cluster.</p>
|
||||
<p ng-if="currentFolder.type == 'receiveonly'" translate class="help-block">Files are synchronized from the cluster, but any changes made locally will not be sent to other devices.</p>
|
||||
<p ng-if="currentFolder.type == 'receiveencrypted'" translate class="help-block" translate-value-receive-encrypted="{{'Receive Encrypted' | translate}}">Stores and syncs only encrypted data. Folders on all connected devices need to be set up with the same password or be of type "{%receiveEncrypted%}" too.</p>
|
||||
<p ng-if="editingExisting && currentFolder.type == 'receiveencrypted'" translate class="help-block" translate-value-receive-encrypted="{{'Receive Encrypted' | translate}}">Folder type "{%receiveEncrypted%}" cannot be changed after adding the folder. You need to remove the folder, delete or decrypt the data on disk, and add the folder again.</p>
|
||||
<p ng-if="editingExisting && currentFolder.type != 'receiveencrypted'" translate class="help-block" translate-value-receive-encrypted="{{'Receive Encrypted' | translate}}">Folder type "{%receiveEncrypted%}" can only be set when adding a new folder.</p>
|
||||
</div>
|
||||
<div class="col-md-6 form-group">
|
||||
<label translate>File Pull Order</label>
|
||||
@@ -264,7 +256,7 @@
|
||||
</div>
|
||||
<div class="col-md-6 form-group">
|
||||
<label>
|
||||
<input type="checkbox" ng-model="currentFolder.ignorePerms" /> <span translate>Ignore Permissions</span>
|
||||
<input type="checkbox" ng-disabled="currentFolder._recvEnc" ng-model="currentFolder.ignorePerms" /> <span translate>Ignore Permissions</span>
|
||||
</label>
|
||||
<p translate class="help-block">
|
||||
Disables comparing and syncing file permissions. Useful on systems with nonexistent or custom permissions (e.g. FAT, exFAT, Synology, Android).
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
<modal id="localChanged" status="info" icon="fas fa-exclamation-circle" heading="{{'Locally Changed Items' | translate}}" large="yes" closeable="yes">
|
||||
<div class="modal-body">
|
||||
<p translate>
|
||||
<modal id="localChanged" status="{{localChangedType === 'receiveencrypted' ? 'warning' : 'info'}}" icon="fas fa-exclamation-circle" heading="{{localChangedHeading(localChangedType)}}" large="yes" closeable="yes">
|
||||
<div class="modal-body" ng-switch="localChangedType">
|
||||
<p ng-switch-when="receiveonly" translate>
|
||||
The following items were changed locally.
|
||||
</p>
|
||||
<p ng-switch-when="receiveencrypted">
|
||||
<span translate>The following unexpected items were found.</span>
|
||||
<span translate translate-value-receive-encrypted="{{'Receive Encrypted' | translate}}">You should never add or change anything locally in a "{%receiveEncrypted%}" folder.</span>
|
||||
</p>
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
|
||||
Reference in New Issue
Block a user