mirror of
https://github.com/octoleo/syncthing.git
synced 2025-02-02 11:58:28 +00:00
parent
fd73682806
commit
48a3fac2da
File diff suppressed because one or more lines are too long
49
gui/app.js
49
gui/app.js
@ -33,6 +33,19 @@ syncthing.controller('SyncthingCtrl', function ($scope, $http) {
|
|||||||
$scope.reportData = {};
|
$scope.reportData = {};
|
||||||
$scope.reportPreview = false;
|
$scope.reportPreview = false;
|
||||||
|
|
||||||
|
$scope.needActions = {
|
||||||
|
'rm': 'Del',
|
||||||
|
'rmdir': 'Del (dir)',
|
||||||
|
'sync': 'Sync',
|
||||||
|
'touch': 'Update',
|
||||||
|
}
|
||||||
|
$scope.needIcons = {
|
||||||
|
'rm': 'remove',
|
||||||
|
'rmdir': 'remove',
|
||||||
|
'sync': 'download',
|
||||||
|
'touch': 'asterisk',
|
||||||
|
}
|
||||||
|
|
||||||
// Strings before bools look better
|
// Strings before bools look better
|
||||||
$scope.settings = [
|
$scope.settings = [
|
||||||
{id: 'ListenStr', descr: 'Sync Protocol Listen Addresses', type: 'text'},
|
{id: 'ListenStr', descr: 'Sync Protocol Listen Addresses', type: 'text'},
|
||||||
@ -590,6 +603,30 @@ syncthing.controller('SyncthingCtrl', function ($scope, $http) {
|
|||||||
$('#ur').modal('hide');
|
$('#ur').modal('hide');
|
||||||
};
|
};
|
||||||
|
|
||||||
|
$scope.showNeed = function (repo) {
|
||||||
|
$scope.neededLoaded = false;
|
||||||
|
$('#needed').modal({backdrop: 'static', keyboard: true});
|
||||||
|
$http.get(urlbase + "/need?repo=" + encodeURIComponent(repo)).success(function (data) {
|
||||||
|
$scope.needed = data;
|
||||||
|
$scope.neededLoaded = true;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
$scope.needAction = function (file) {
|
||||||
|
var fDelete = 4096;
|
||||||
|
var fDirectory = 16384;
|
||||||
|
|
||||||
|
if ((file.Flags & (fDelete+fDirectory)) === fDelete+fDirectory) {
|
||||||
|
return 'rmdir';
|
||||||
|
} else if ((file.Flags & fDelete) === fDelete) {
|
||||||
|
return 'rm';
|
||||||
|
} else if ((file.Flags & fDirectory) === fDirectory) {
|
||||||
|
return 'touch';
|
||||||
|
} else {
|
||||||
|
return 'sync';
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
$scope.init();
|
$scope.init();
|
||||||
setInterval($scope.refresh, 10000);
|
setInterval($scope.refresh, 10000);
|
||||||
});
|
});
|
||||||
@ -740,6 +777,18 @@ syncthing.filter('shortPath', function () {
|
|||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
|
syncthing.filter('basename', function () {
|
||||||
|
return function (input) {
|
||||||
|
if (input === undefined)
|
||||||
|
return "";
|
||||||
|
var parts = input.split(/[\/\\]/);
|
||||||
|
if (!parts || parts.length < 1) {
|
||||||
|
return input;
|
||||||
|
}
|
||||||
|
return parts[parts.length-1];
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
syncthing.filter('clean', function () {
|
syncthing.filter('clean', function () {
|
||||||
return function (input) {
|
return function (input) {
|
||||||
return encodeURIComponent(input).replace(/%/g, '');
|
return encodeURIComponent(input).replace(/%/g, '');
|
||||||
|
@ -65,7 +65,7 @@ found in the LICENSE file.
|
|||||||
}
|
}
|
||||||
|
|
||||||
.table th {
|
.table th {
|
||||||
white-space:nowrap;
|
white-space: nowrap;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -73,6 +73,10 @@ found in the LICENSE file.
|
|||||||
padding-left: 20px !important;
|
padding-left: 20px !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.table td.small-data {
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
@media (max-width:767px) {
|
@media (max-width:767px) {
|
||||||
.table-responsive>.table>tbody>tr>td {
|
.table-responsive>.table>tbody>tr>td {
|
||||||
/* revert a bootstrap setting e.g.:
|
/* revert a bootstrap setting e.g.:
|
||||||
@ -168,15 +172,18 @@ found in the LICENSE file.
|
|||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th><span class="glyphicon glyphicon-globe"></span> Global Repository</th>
|
<th><span class="glyphicon glyphicon-globe"></span> Global Repository</th>
|
||||||
<td class="text-right">{{model[repo.ID].globalFiles | alwaysNumber}} files, {{model[repo.ID].globalBytes | binary}}B</td>
|
<td class="text-right">{{model[repo.ID].globalFiles | alwaysNumber}} items, {{model[repo.ID].globalBytes | binary}}B</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th><span class="glyphicon glyphicon-home"></span> Local Repository</th>
|
<th><span class="glyphicon glyphicon-home"></span> Local Repository</th>
|
||||||
<td class="text-right">{{model[repo.ID].localFiles | alwaysNumber}} files, {{model[repo.ID].localBytes | binary}}B</td>
|
<td class="text-right">{{model[repo.ID].localFiles | alwaysNumber}} items, {{model[repo.ID].localBytes | binary}}B</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th><span class="glyphicon glyphicon-cloud-download"></span> Out of Sync</th>
|
<th><span class="glyphicon glyphicon-cloud-download"></span> Out of Sync</th>
|
||||||
<td class="text-right">{{model[repo.ID].needFiles | alwaysNumber}} files, {{model[repo.ID].needBytes | binary}}B</td>
|
<td class="text-right">
|
||||||
|
<a ng-if="model[repo.ID].needFiles > 0" ng-click="showNeed(repo.ID)" href="">{{model[repo.ID].needFiles | alwaysNumber}} items, {{model[repo.ID].needBytes | binary}}B</a>
|
||||||
|
<span ng-if="model[repo.ID].needFiles == 0">0 items, 0 B</span>
|
||||||
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th><span class="glyphicon glyphicon-lock"></span> Master Repository</th>
|
<th><span class="glyphicon glyphicon-lock"></span> Master Repository</th>
|
||||||
@ -637,6 +644,30 @@ found in the LICENSE file.
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- Needed files modal -->
|
||||||
|
|
||||||
|
<div id="needed" class="modal fade">
|
||||||
|
<div class="modal-dialog modal-lg">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header alert alert-info">
|
||||||
|
<h4 class="modal-title">Out of Sync Items</h4>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<table class="table table-striped table-condensed">
|
||||||
|
<tr ng-repeat="f in needed" ng-init="a = needAction(f)">
|
||||||
|
<td class="small-data"><span class="glyphicon glyphicon-{{needIcons[a]}}"></span> {{needActions[a]}}</td>
|
||||||
|
<td title="{{f.Name}}">{{f.Name | basename}}</td>
|
||||||
|
<td class="text-right small-data"><span ng-if="f.Size > 0">{{f.Size | binary}}B</span></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-default" data-dismiss="modal"><span class="glyphicon glyphicon-remove"></span> Close</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<script src="angular.min.js"></script>
|
<script src="angular.min.js"></script>
|
||||||
<script src="jquery-2.0.3.min.js"></script>
|
<script src="jquery-2.0.3.min.js"></script>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user