| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312 |
- var syncthing = angular.module('syncthing', []);
- syncthing.controller('SyncthingCtrl', function ($scope, $http) {
- var prevDate = 0;
- var modelGetOK = true;
- $scope.connections = {};
- $scope.config = {};
- $scope.myID = "";
- $scope.nodes = [];
- // Strings before bools look better
- $scope.settings = [
- {id: 'ListenAddress', descr:"Sync Protocol Listen Address", type: 'string', restart: true},
- {id: 'GUIAddress', descr: "GUI Listen Address", type: 'string', restart: true},
- {id: 'MaxSendKbps', descr: "Outgoing Rate Limit (KBps)", type: 'string', restart: true},
- {id: 'RescanIntervalS', descr: "Rescan Interval (s)", type: 'string', restart: true},
- {id: 'ReconnectIntervalS', descr: "Reconnect Interval (s)", type: 'string', restart: true},
- {id: 'ParallelRequests', descr: "Max Outstanding Requests", type: 'string', restart: true},
- {id: 'MaxChangeKbps', descr: "Max File Change Rate (KBps)", type: 'string', restart: true},
- {id: 'ReadOnly', descr: "Read Only", type: 'bool', restart: true},
- {id: 'AllowDelete', descr: "Allow Delete", type: 'bool', restart: true},
- {id: 'FollowSymlinks', descr: "Follow Symlinks", type: 'bool', restart: true},
- {id: 'GlobalAnnEnabled', descr: "Global Announce", type: 'bool', restart: true},
- {id: 'LocalAnnEnabled', descr: "Local Announce", type: 'bool', restart: true},
- ];
- function modelGetSucceeded() {
- if (!modelGetOK) {
- $('#networkError').modal('hide');
- modelGetOK = true;
- }
- }
- function modelGetFailed() {
- if (modelGetOK) {
- $('#networkError').modal({backdrop: 'static', keyboard: false});
- modelGetOK = false;
- }
- }
- $http.get("/rest/version").success(function (data) {
- $scope.version = data;
- });
- $http.get("/rest/system").success(function (data) {
- $scope.system = data;
- $scope.myID = data.myID;
- $http.get("/rest/config").success(function (data) {
- $scope.config = data;
- var nodes = $scope.config.Repositories[0].Nodes;
- nodes.sort(function (a, b) {
- if (a.NodeID == $scope.myID)
- return -1;
- if (b.NodeID == $scope.myID)
- return 1;
- if (a.NodeID < b.NodeID)
- return -1;
- return a.NodeID > b.NodeID;
- })
- $scope.nodes = nodes;
- });
- });
- $scope.refresh = function () {
- $http.get("/rest/system").success(function (data) {
- $scope.system = data;
- });
- $http.get("/rest/model").success(function (data) {
- $scope.model = data;
- modelGetSucceeded();
- }).error(function () {
- modelGetFailed();
- });
- $http.get("/rest/connections").success(function (data) {
- var now = Date.now();
- var td = (now - prevDate) / 1000;
- prevDate = now;
- for (var id in data) {
- try {
- data[id].inbps = Math.max(0, 8 * (data[id].InBytesTotal - $scope.connections[id].InBytesTotal) / td);
- data[id].outbps = Math.max(0, 8 * (data[id].OutBytesTotal - $scope.connections[id].OutBytesTotal) / td);
- } catch (e) {
- data[id].inbps = 0;
- data[id].outbps = 0;
- }
- }
- $scope.connections = data;
- });
- $http.get("/rest/need").success(function (data) {
- var i, name;
- for (i = 0; i < data.length; i++) {
- name = data[i].Name.split("/");
- data[i].ShortName = name[name.length-1];
- }
- data.sort(function (a, b) {
- if (a.ShortName < b.ShortName) {
- return -1;
- }
- if (a.ShortName > b.ShortName) {
- return 1;
- }
- return 0;
- });
- $scope.need = data;
- });
- };
- $scope.nodeIcon = function (nodeCfg) {
- if (nodeCfg.NodeID === $scope.myID) {
- return "ok";
- }
- if ($scope.connections[nodeCfg.NodeID]) {
- return "ok";
- }
- return "minus";
- };
- $scope.nodeClass = function (nodeCfg) {
- if (nodeCfg.NodeID === $scope.myID) {
- return "default";
- }
- var conn = $scope.connections[nodeCfg.NodeID];
- if (conn) {
- return "success";
- }
- return "info";
- };
- $scope.nodeAddr = function (nodeCfg) {
- if (nodeCfg.NodeID === $scope.myID) {
- return "this node";
- }
- var conn = $scope.connections[nodeCfg.NodeID];
- if (conn) {
- return conn.Address;
- }
- return nodeCfg.Addresses.join(", ");
- };
- $scope.nodeVer = function (nodeCfg) {
- if (nodeCfg.NodeID === $scope.myID) {
- return $scope.version;
- }
- var conn = $scope.connections[nodeCfg.NodeID];
- if (conn) {
- return conn.ClientVersion;
- }
- return "";
- };
- $scope.saveSettings = function () {
- $http.post('/rest/config', JSON.stringify($scope.config), {headers: {'Content-Type': 'application/json'}});
- $('#settingsTable').collapse('hide');
- };
- $scope.editNode = function (nodeCfg) {
- $scope.currentNode = nodeCfg;
- $scope.editingExisting = true;
- $scope.currentNode.AddressesStr = nodeCfg.Addresses.join(", ")
- $('#editNode').modal({backdrop: 'static', keyboard: false});
- };
- $scope.addNode = function () {
- $scope.currentNode = {NodeID: "", AddressesStr: "dynamic"};
- $scope.editingExisting = false;
- $('#editNode').modal({backdrop: 'static', keyboard: false});
- };
- $scope.deleteNode = function () {
- $('#editNode').modal('hide');
- if (!$scope.editingExisting)
- return;
- var newNodes = [];
- for (var i = 0; i < $scope.nodes.length; i++) {
- if ($scope.nodes[i].NodeID !== $scope.currentNode.NodeID) {
- newNodes.push($scope.nodes[i]);
- }
- }
- $scope.nodes = newNodes;
- $scope.config.Repositories[0].Nodes = newNodes;
- $http.post('/rest/config', JSON.stringify($scope.config), {headers: {'Content-Type': 'application/json'}})
- }
- $scope.saveNode = function () {
- $('#editNode').modal('hide');
- nodeCfg = $scope.currentNode;
- nodeCfg.Addresses = nodeCfg.AddressesStr.split(',').map(function (x) { return x.trim(); });
- var done = false;
- for (var i = 0; i < $scope.nodes.length; i++) {
- if ($scope.nodes[i].NodeID === nodeCfg.NodeID) {
- $scope.nodes[i] = nodeCfg;
- done = true;
- break;
- }
- }
- if (!done) {
- $scope.nodes.push(nodeCfg);
- }
- $scope.nodes.sort(function (a, b) {
- if (a.NodeID == $scope.myID)
- return -1;
- if (b.NodeID == $scope.myID)
- return 1;
- if (a.NodeID < b.NodeID)
- return -1;
- return a.NodeID > b.NodeID;
- })
- $scope.config.Repositories[0].Nodes = $scope.nodes;
- $http.post('/rest/config', JSON.stringify($scope.config), {headers: {'Content-Type': 'application/json'}})
- };
- $scope.refresh();
- setInterval($scope.refresh, 10000);
- });
- function decimals(val, num) {
- if (val === 0) { return 0; }
- var digits = Math.floor(Math.log(Math.abs(val))/Math.log(10));
- var decimals = Math.max(0, num - digits);
- return decimals;
- }
- syncthing.filter('natural', function() {
- return function(input, valid) {
- return input.toFixed(decimals(input, valid));
- }
- });
- syncthing.filter('binary', function() {
- return function(input) {
- if (input === undefined) {
- return '0 '
- }
- if (input > 1024 * 1024 * 1024) {
- input /= 1024 * 1024 * 1024;
- return input.toFixed(decimals(input, 2)) + ' Gi';
- }
- if (input > 1024 * 1024) {
- input /= 1024 * 1024;
- return input.toFixed(decimals(input, 2)) + ' Mi';
- }
- if (input > 1024) {
- input /= 1024;
- return input.toFixed(decimals(input, 2)) + ' Ki';
- }
- return Math.round(input) + ' ';
- }
- });
- syncthing.filter('metric', function() {
- return function(input) {
- if (input === undefined) {
- return '0 '
- }
- if (input > 1000 * 1000 * 1000) {
- input /= 1000 * 1000 * 1000;
- return input.toFixed(decimals(input, 2)) + ' G';
- }
- if (input > 1000 * 1000) {
- input /= 1000 * 1000;
- return input.toFixed(decimals(input, 2)) + ' M';
- }
- if (input > 1000) {
- input /= 1000;
- return input.toFixed(decimals(input, 2)) + ' k';
- }
- return Math.round(input) + ' ';
- }
- });
- syncthing.filter('short', function() {
- return function(input) {
- return input.substr(0, 6);
- }
- });
- syncthing.filter('alwaysNumber', function() {
- return function(input) {
- if (input === undefined) {
- return 0;
- }
- return input;
- }
- });
- syncthing.directive('optionEditor', function() {
- return {
- restrict: 'C',
- replace: true,
- transclude: true,
- scope: {
- setting: '=setting',
- },
- template: '<input type="text" ng-model="config.Options[setting.id]"></input>',
- };
- })
|