2014-01-05 22:54:57 +00:00
<!DOCTYPE html>
2014-06-01 20:50:14 +00:00
<!--
2014-11-16 20:13:20 +00:00
// Copyright (C) 2014 The Syncthing Authors.
2014-09-29 19:43:32 +00:00
//
2015-03-07 20:36:35 +00:00
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
2017-02-09 06:52:18 +00:00
// You can obtain one at https://mozilla.org/MPL/2.0/.
2015-03-07 20:36:35 +00:00
2014-06-01 20:50:14 +00:00
-->
2014-11-26 12:39:59 +00:00
< html lang = "en" ng-app = "syncthing" ng-controller = "SyncthingController" class = "ng-cloak" >
2014-01-05 22:54:57 +00:00
< head >
2017-07-15 09:54:37 +00:00
< meta charset = "utf-8" / >
< meta http-equiv = "X-UA-Compatible" content = "IE=edge" / >
< meta name = "viewport" content = "width=device-width, initial-scale=1.0" / >
< meta name = "description" content = "" / >
< meta name = "author" content = "" / >
< link rel = "shortcut icon" href = "assets/img/favicon-{{syncthingStatus()}}.png" / >
< link rel = "mask-icon" href = "assets/img/safari-pinned-tab.svg" color = "#0882c8" / >
2014-04-09 21:00:23 +00:00
2015-07-20 09:18:48 +00:00
< title ng-bind = "thisDeviceName() + ' | Syncthing'" > < / title >
2017-07-15 09:54:37 +00:00
< link href = "vendor/bootstrap/css/bootstrap.css" rel = "stylesheet" / >
2018-01-01 14:39:23 +00:00
< link href = "vendor/bootstrap/css/daterangepicker.css" rel = "stylesheet" / >
2017-07-15 09:54:37 +00:00
< link href = "assets/font/raleway.css" rel = "stylesheet" / >
< link href = "vendor/font-awesome/css/font-awesome.css" rel = "stylesheet" / >
< link href = "assets/css/overrides.css" rel = "stylesheet" / >
< link href = "assets/css/theme.css" rel = "stylesheet" / >
2018-01-01 14:39:23 +00:00
< link href = "vendor/fancytree/css/ui.fancytree.css" rel = "stylesheet" / >
2014-01-05 22:54:57 +00:00
< / head >
2014-05-16 16:42:22 +00:00
< body >
2017-07-15 09:54:37 +00:00
< script type = "text/javascript" src = "syncthing/development/logbar.js" > < / script >
2016-04-05 06:36:53 +00:00
< div ng-if = "version.isDevelopmentVersion" ng-include = "'syncthing/development/logbar.html'" > < / div >
2014-04-09 21:00:23 +00:00
<!-- Top bar -->
< nav class = "navbar navbar-top navbar-default" role = "navigation" >
2014-01-08 12:52:17 +00:00
< div class = "container" >
2016-07-31 22:59:44 +00:00
< span class = "navbar-brand" aria-hidden = "true" >
2017-07-15 09:54:37 +00:00
< img class = "logo hidden-xs" src = "assets/img/logo-horizontal.svg" height = "32" width = "117" alt = "" / >
< img class = "logo hidden visible-xs" src = "assets/img/favicon-default.png" height = "32" alt = "" / >
2016-04-02 08:31:16 +00:00
< / span >
2015-04-02 12:48:59 +00:00
< p class = "navbar-text hidden-xs" ng-class = "{'hidden-sm':upgradeInfo && upgradeInfo.newer}" > {{thisDeviceName()}}< / p >
2014-05-20 17:36:37 +00:00
< ul class = "nav navbar-nav navbar-right" >
2016-04-02 08:31:16 +00:00
< li ng-if = "upgradeInfo && upgradeInfo.newer" class = "upgrade-newer" >
2015-08-10 09:22:37 +00:00
< button type = "button" class = "btn navbar-btn btn-primary btn-sm" ng-click = "upgrade()" >
2016-06-02 06:08:18 +00:00
< span class = "fa fa-arrow-circle-up" > < / span >
< span class = "hidden-xs" translate translate-value-version = "{{upgradeInfo.latest}}" > Upgrade To {%version%}< / span >
2014-07-20 11:49:26 +00:00
< / button >
2014-07-14 08:45:29 +00:00
< / li >
2016-04-02 08:31:16 +00:00
< li ng-if = "upgradeInfo && upgradeInfo.majorNewer" class = "upgrade-newer-major" >
2016-06-12 14:06:48 +00:00
< button type = "button" class = "btn navbar-btn btn-danger btn-sm" data-toggle = "modal" data-target = "#majorUpgrade" >
2016-06-02 06:08:18 +00:00
< span class = "fa fa-arrow-circle-up" > < / span >
< span class = "hidden-xs" translate translate-value-version = "{{upgradeInfo.latest}}" > Upgrade To {%version%}< / span >
2015-04-22 12:41:08 +00:00
< / button >
< / li >
2015-04-02 12:48:59 +00:00
< li class = "dropdown" language-select > < / li >
2016-04-02 08:31:16 +00:00
< li >
2016-05-20 16:50:11 +00:00
< a class = "navbar-link" href = "https://docs.syncthing.net/intro/gui.html" target = "_blank" >
2016-06-02 06:08:18 +00:00
< span class = "fa fa-question-circle" > < / span >
< span class = "hidden-xs" translate > Help< / span >
2015-05-27 19:54:00 +00:00
< / a >
< / li >
2016-04-02 08:31:16 +00:00
< li class = "dropdown action-menu" >
2016-07-31 22:59:44 +00:00
< a href = "#" class = "dropdown-toggle" data-toggle = "dropdown" aria-expanded = "false" >
2016-06-02 06:08:18 +00:00
< span class = "fa fa-cog" > < / span >
< span class = "hidden-xs" translate > Actions< / span >
< span class = "caret" > < / span >
< / a >
2014-05-20 17:36:37 +00:00
< ul class = "dropdown-menu" >
2015-08-10 09:22:37 +00:00
< li > < a href = "" ng-click = "editSettings()" > < span class = "fa fa-fw fa-cog" > < / span > < span translate > Settings< / span > < / a > < / li >
2016-06-12 14:06:48 +00:00
< li > < a href = "" data-toggle = "modal" data-target = "#idqr" ng-click = "currentDevice=thisDevice()" > < span class = "fa fa-fw fa-qrcode" > < / span > < span translate > Show ID< / span > < / a > < / li >
2016-07-31 22:59:44 +00:00
< li class = "divider" aria-hidden = "true" > < / li >
2015-08-10 09:22:37 +00:00
< li > < a href = "" ng-click = "shutdown()" > < span class = "fa fa-fw fa-power-off" > < / span > < span translate > Shutdown< / span > < / a > < / li >
< li > < a href = "" ng-click = "restart()" > < span class = "fa fa-fw fa-refresh" > < / span > < span translate > Restart< / span > < / a > < / li >
2016-07-31 22:59:44 +00:00
< li class = "divider" aria-hidden = "true" > < / li >
2015-06-02 14:48:31 +00:00
< li class = "visible-xs" >
2016-03-25 07:02:29 +00:00
< a href = "https://docs.syncthing.net/intro/gui.html" target = "_blank" >
2015-08-10 09:22:37 +00:00
< span class = "fa fa-fw fa-book" > < / span > < span translate > Help< / span >
2015-06-02 14:48:31 +00:00
< / a >
< / li >
2016-06-12 14:06:48 +00:00
< li > < a href = "" data-toggle = "modal" data-target = "#about" > < span class = "fa fa-fw fa-heart-o" > < / span > < span translate > About< / span > < / a > < / li >
2016-07-31 22:59:44 +00:00
< li class = "divider" aria-hidden = "true" > < / li >
2015-08-10 09:22:37 +00:00
< li > < a href = "" ng-click = "advanced()" > < span class = "fa fa-fw fa-cogs" > < / span > < span translate > Advanced< / span > < / a > < / li >
2017-12-24 22:26:05 +00:00
< li > < a href = "" ng-click = "logging.show()" > < span class = "fa fa-fw fa-book" > < / span > < span translate > Logs< / span > < / a > < / li >
2014-05-20 17:36:37 +00:00
< / ul >
< / li >
2014-05-24 19:56:09 +00:00
< / ul >
2014-02-12 11:10:44 +00:00
< / div >
2014-04-09 21:00:23 +00:00
< / nav >
2014-01-05 22:54:57 +00:00
2015-10-03 10:18:19 +00:00
< div class = "container" id = "content" >
2014-02-12 22:18:41 +00:00
2015-11-16 20:33:55 +00:00
<!-- Panel: Open, no auth -->
< div ng-if = "openNoAuth" class = "row" >
< div class = "col-md-12" >
< div class = "panel panel-danger" >
2016-06-02 23:21:19 +00:00
< div class = "panel-heading" >
< h3 class = "panel-title" >
< div class = "panel-icon" >
< span class = "fa fa-exclamation-circle" > < / span >
< / div >
< span translate > Danger!< / span >
< / h3 >
< / div >
2015-11-16 20:33:55 +00:00
< div class = "panel-body" >
< p >
< span translate > The Syncthing admin interface is configured to allow remote access without a password.< / span >
< b > < span translate > This can easily give hackers access to read and change any files on your computer.< / span > < / b >
< span translate > Please set a GUI Authentication User and Password in the Settings dialog.< / span >
< / p >
< / div >
< div class = "panel-footer" >
< button type = "button" class = "btn btn-sm btn-default pull-right" ng-click = "editSettings()" >
< span class = "fa fa-cog" > < / span > < span translate > Settings< / span >
< / button >
< div class = "clearfix" > < / div >
< / div >
< / div >
< / div >
< / div >
2015-01-23 15:28:30 +00:00
<!-- Panel: Restart Needed -->
2014-04-09 21:00:23 +00:00
< div ng-if = "!configInSync" class = "row" >
< div class = "col-md-12" >
< div class = "panel panel-warning" >
2016-06-02 23:21:19 +00:00
< div class = "panel-heading" >
< h3 class = "panel-title" >
< div class = "panel-icon" >
< span class = "fa fa-exclamation-circle" > < / span >
< / div >
< span translate > Restart Needed< / span >
< / h3 >
< / div >
2014-04-09 21:00:23 +00:00
< div class = "panel-body" >
2014-07-20 11:49:26 +00:00
< p translate > The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.< / p >
2014-04-09 21:00:23 +00:00
< / div >
< div class = "panel-footer" >
2015-08-10 09:22:37 +00:00
< button type = "button" class = "btn btn-sm btn-default pull-right" ng-click = "restart()" >
< span class = "fa fa-refresh" > < / span > < span translate > Restart< / span >
< / button >
2014-04-09 21:00:23 +00:00
< div class = "clearfix" > < / div >
< / div >
2014-01-05 22:54:57 +00:00
< / div >
2014-04-09 21:00:23 +00:00
< / div >
2014-02-12 11:10:44 +00:00
< / div >
2015-01-23 15:28:30 +00:00
<!-- Panel: New Device -->
< div ng-repeat = "(device, event) in deviceRejections" class = "row" >
< div class = "col-md-12" >
< div class = "panel panel-warning" >
< div class = "panel-heading" >
< h3 class = "panel-title" >
2016-06-02 20:52:10 +00:00
< identicon class = "panel-icon" data-value = "device" > < / identicon >
2015-12-18 18:17:04 +00:00
< span translate > New Device< / span >
< span class = "pull-right" > {{ event.time | date:"yyyy-MM-dd HH:mm:ss" }}< / span >
2015-01-23 15:28:30 +00:00
< / h3 >
< / div >
< div class = "panel-body" >
< p >
2016-03-25 20:29:07 +00:00
< span translate translate-value-device = "{{ device }}" translate-value-address = "{{ event.data.address }}" translate-value-name = "{{ event.data.name }}" >
Device "{%name%}" ({%device%} at {%address%}) wants to connect. Add new device?
2015-12-17 15:52:36 +00:00
< / span >
2015-01-23 15:28:30 +00:00
< / p >
< / div >
< div class = "panel-footer clearfix" >
< div class = "pull-right" >
2016-03-25 20:29:07 +00:00
< button type = "button" class = "btn btn-sm btn-success" ng-click = "addDevice(device, event.data.name)" >
2015-12-18 20:33:11 +00:00
< span class = "fa fa-plus" > < / span > < span translate > Add Device< / span >
2015-08-10 09:22:37 +00:00
< / button >
< button type = "button" class = "btn btn-sm btn-danger" ng-click = "ignoreRejectedDevice(device)" >
< span class = "fa fa-times" > < / span > < span translate > Ignore< / span >
< / button >
< button type = "button" class = "btn btn-sm btn-default" ng-click = "dismissDeviceRejection(device)" >
< span class = "fa fa-clock-o" > < / span > < span translate > Later< / span >
< / button >
2015-01-23 15:28:30 +00:00
< / div >
< / div >
< / div >
< / div >
< / div >
<!-- Panel: New Folder -->
< div ng-repeat = "(key, event) in folderRejections" class = "row reject" >
< div class = "col-md-12" >
< div class = "panel panel-warning" >
< div class = "panel-heading" >
2016-06-02 23:21:19 +00:00
< h3 class = "panel-title" >
< div class = "panel-icon" >
< span class = "fa fa-folder" > < / span >
< / div >
2015-01-23 15:28:30 +00:00
< span translate ng-if = "!folders[event.data.folder]" > New Folder< / span >
< span translate ng-if = "folders[event.data.folder]" > Share Folder< / span >
2015-12-20 08:52:59 +00:00
< span class = "pull-right" > {{ event.time | date:"yyyy-MM-dd HH:mm:ss" }}< / span >
2015-01-23 15:28:30 +00:00
< / h3 >
< / div >
< div class = "panel-body" >
< p >
2016-03-11 09:48:46 +00:00
< span ng-if = "event.data.folderLabel.length == 0" translate translate-value-device = "{{ deviceName(findDevice(event.data.device)) }}" translate-value-folder = "{{ event.data.folder }}" >
2015-01-23 15:28:30 +00:00
{%device%} wants to share folder "{%folder%}".
< / span >
2016-04-09 12:20:56 +00:00
< span ng-if = "event.data.folderLabel.length != 0" translate translate-value-device = "{{ deviceName(findDevice(event.data.device)) }}" translate-value-folder = "{{ event.data.folder }}" translate-value-folderlabel = "{{ event.data.folderLabel }}" >
{%device%} wants to share folder "{%folderlabel%}" ({%folder%}).
2016-03-11 09:48:46 +00:00
< / span >
2015-01-23 15:28:30 +00:00
< span translate ng-if = "folders[event.data.folder]" > Share this folder?< / span >
< span translate ng-if = "!folders[event.data.folder]" > Add new folder?< / span >
< / p >
< / div >
< div class = "panel-footer clearfix" >
< div class = "pull-right" >
2016-03-11 09:48:46 +00:00
< button type = "button" class = "btn btn-sm btn-success" ng-click = "addFolderAndShare(event.data.folder, event.data.folderLabel, event.data.device)" ng-if = "!folders[event.data.folder]" >
2015-08-10 09:22:37 +00:00
< span class = "fa fa-check" > < / span > < span translate > Add< / span >
2015-01-23 15:28:30 +00:00
< / button >
2015-08-10 09:22:37 +00:00
< button type = "button" class = "btn btn-sm btn-success" ng-click = "shareFolderWithDevice(event.data.folder, event.data.device)" ng-if = "folders[event.data.folder]" >
< span class = "fa fa-check" > < / span > < span translate > Share< / span >
2015-01-23 15:28:30 +00:00
< / button >
2015-08-10 09:22:37 +00:00
< button type = "button" class = "btn btn-sm btn-default" ng-click = "dismissFolderRejection(event.data.folder, event.data.device)" >
< span class = "fa fa-clock-o" > < / span > < span translate > Later< / span >
2015-01-23 15:28:30 +00:00
< / button >
2017-05-31 18:04:00 +00:00
< button type = "button" class = "btn btn-sm btn-default" ng-click = "ignoreRejectedFolder(event.data.folder, event.data.device)" >
< span class = "fa fa-times" > < / span > < span translate > Ignore< / span >
< / button >
2015-01-23 15:28:30 +00:00
< / div >
< / div >
< / div >
< / div >
< / div >
<!-- Panel: Notice -->
< div ng-if = "errorList().length > 0" class = "row" >
< div class = "col-md-12" >
< div class = "panel panel-warning" >
2016-06-02 23:21:19 +00:00
< div class = "panel-heading" >
< h3 class = "panel-title" >
< div class = "panel-icon" >
< span class = "fa fa-exclamation-circle" > < / span >
< / div >
< span translate > Notice< / span >
< / h3 >
< / div >
2015-01-23 15:28:30 +00:00
< div class = "panel-body" >
2016-11-21 08:27:44 +00:00
< p ng-repeat = "err in errorList()" >
< small > {{err.when | date:"yyyy-MM-dd HH:mm:ss"}}:< / small >
< span ng-bind-html = "friendlyDevices(err.message) | linky: '_blank'" > < / span >
< / p >
2015-01-23 15:28:30 +00:00
< / div >
< div class = "panel-footer" >
2015-08-10 09:22:37 +00:00
< button type = "button" class = "btn btn-sm btn-default pull-right" ng-click = "clearErrors()" >
< span class = "fa fa-check" > < / span > < span translate > OK< / span >
< / button >
2015-01-23 15:28:30 +00:00
< div class = "clearfix" > < / div >
< / div >
< / div >
< / div >
< / div >
2016-08-02 08:07:30 +00:00
< div ng-if = "config && config.options && config.options.unackedNotificationIDs" ng-include = "'syncthing/core/notifications.html'" > < / div >
2014-04-09 21:00:23 +00:00
<!-- First regular row -->
2014-02-12 11:10:44 +00:00
< div class = "row" >
2014-04-09 21:00:23 +00:00
2014-09-28 11:00:38 +00:00
<!-- Folder list (top left) -->
2014-04-09 21:00:23 +00:00
2016-07-31 22:59:44 +00:00
< div class = "col-md-6" aria-labelledby = "folder_list" role = "region" >
< h3 id = "folder_list" translate > Folders< / h3 >
2014-09-28 11:00:38 +00:00
< div class = "panel-group" id = "folders" >
2014-11-29 12:08:00 +00:00
< div class = "panel panel-default" ng-repeat = "folder in folderList()" >
2016-07-31 22:59:44 +00:00
< button class = "btn panel-heading" data-toggle = "collapse" data-parent = "#folders" data-target = "#folder-{{$index}}" aria-expanded = "false" >
2015-03-10 22:45:43 +00:00
< div class = "panel-progress" ng-show = "folderStatus(folder) == 'syncing'" ng-attr-style = "width: {{syncPercentage(folder.id)}}%" > < / div >
2015-08-26 22:49:06 +00:00
< div class = "panel-progress" ng-show = "folderStatus(folder) == 'scanning' && scanProgress[folder.id] != undefined" ng-attr-style = "width: {{scanPercentage(folder.id)}}%" > < / div >
2016-03-22 20:53:56 +00:00
< h4 class = "panel-title" >
2016-06-02 23:21:19 +00:00
< div class = "panel-icon hidden-xs" >
< span class = "fa fa-fw" ng-class = "[folder.type == 'readonly' ? 'fa-lock' : 'fa-folder']" > < / span >
2016-05-30 08:18:09 +00:00
< / div >
< div class = "panel-status pull-right text-{{folderClass(folder)}}" ng-switch = "folderStatus(folder)" >
2016-12-21 18:41:25 +00:00
< span ng-switch-when = "paused" > < span class = "hidden-xs" translate > Paused< / span > < span class = "visible-xs" > ◼ < / span > < / span >
2015-01-08 10:04:27 +00:00
< span ng-switch-when = "unknown" > < span class = "hidden-xs" translate > Unknown< / span > < span class = "visible-xs" > ◼ < / span > < / span >
< span ng-switch-when = "unshared" > < span class = "hidden-xs" translate > Unshared< / span > < span class = "visible-xs" > ◼ < / span > < / span >
< span ng-switch-when = "stopped" > < span class = "hidden-xs" translate > Stopped< / span > < span class = "visible-xs" > ◼ < / span > < / span >
2015-08-26 22:49:06 +00:00
< span ng-switch-when = "scanning" >
< span class = "hidden-xs" translate > Scanning< / span >
< span class = "hidden-xs" ng-if = "scanPercentage(folder.id) != undefined" >
2015-11-18 13:35:51 +00:00
({{scanPercentage(folder.id)}}%)
2015-08-26 22:49:06 +00:00
< / span >
< span class = "visible-xs" > ◼ < / span >
< / span >
2015-01-08 10:04:27 +00:00
< span ng-switch-when = "idle" > < span class = "hidden-xs" translate > Up to Date< / span > < span class = "visible-xs" > ◼ < / span > < / span >
2014-09-08 17:46:33 +00:00
< span ng-switch-when = "syncing" >
2015-01-08 10:04:27 +00:00
< span class = "hidden-xs" translate > Syncing< / span >
2017-01-26 09:39:48 +00:00
< span ng-show = "syncRemaining(folder.id)" > ({{syncPercentage(folder.id)}}%, {{syncRemaining(folder.id) | binary}}B)< / span >
2014-09-08 17:46:33 +00:00
< / span >
2015-06-26 12:22:52 +00:00
< span ng-switch-when = "outofsync" > < span class = "hidden-xs" translate > Out of Sync< / span > < span class = "visible-xs" > ◼ < / span > < / span >
2016-05-30 08:18:09 +00:00
< / div >
< div class = "panel-title-text" >
< span tooltip data-original-title = "{{folder.label.length != 0 ? folder.id : ''}}" > {{folder.label.length != 0 ? folder.label : folder.id}}< / span >
< / div >
2016-03-22 20:53:56 +00:00
< / h4 >
2016-06-08 15:55:44 +00:00
< / button >
2015-02-19 14:48:43 +00:00
< div id = "folder-{{$index}}" class = "panel-collapse collapse" >
2014-05-24 19:56:09 +00:00
< div class = "panel-body" >
2014-09-10 09:27:21 +00:00
< table class = "table table-condensed table-striped" >
< tbody >
2016-03-11 09:48:46 +00:00
< tr ng-show = "folder.label != undefined && folder.label.length > 0" >
< th > < span class = "fa fa-fw fa-folder-open" > < / span > < span translate > Folder ID< / span > < / th >
< td class = "text-right no-overflow-ellipse" > {{folder.id}}< / td >
< / tr >
2014-09-10 09:27:21 +00:00
< tr >
2015-08-10 09:22:37 +00:00
< th > < span class = "fa fa-fw fa-folder-open" > < / span > < span translate > Folder Path< / span > < / th >
2016-03-16 14:55:29 +00:00
< td class = "text-right" >
< span tooltip data-original-title = "{{folder.path}}" > {{folder.path}}< / span >
< / td >
2014-09-10 09:27:21 +00:00
< / tr >
2016-12-21 18:41:25 +00:00
< tr ng-if = "!folder.paused && (model[folder.id].invalid || model[folder.id].error)" >
2015-08-10 09:22:37 +00:00
< th > < span class = "fa fa-fw fa-exclamation-triangle" > < / span > < span translate > Error< / span > < / th >
2015-04-12 20:12:01 +00:00
< td class = "text-right" > {{model[folder.id].invalid || model[folder.id].error}}< / td >
2014-09-10 09:27:21 +00:00
< / tr >
2016-12-21 18:41:25 +00:00
< tr ng-if = "!folder.paused" >
2015-08-10 09:22:37 +00:00
< th > < span class = "fa fa-fw fa-globe" > < / span > < span translate > Global State< / span > < / th >
2016-10-17 12:10:17 +00:00
< td class = "text-right" >
2018-04-25 08:26:49 +00:00
< span tooltip data-original-title = "{{model[folder.id].globalFiles | alwaysNumber | localeNumber}} {{'files' | translate}}, {{model[folder.id].globalDirectories | alwaysNumber | localeNumber}} {{'directories' | translate}}, ~{{model[folder.id].globalBytes | binary}}B" >
< span class = "fa fa-files-o" > < / span > {{model[folder.id].globalFiles | alwaysNumber | localeNumber}} 
< span class = "fa fa-folder-o" > < / span > {{model[folder.id].globalDirectories | alwaysNumber | localeNumber}} 
2016-11-13 13:56:07 +00:00
< span class = "fa fa-hdd-o" > < / span > ~{{model[folder.id].globalBytes | binary}}B
< / span >
2016-10-17 12:10:17 +00:00
< / td >
2014-09-10 09:27:21 +00:00
< / tr >
2016-12-21 18:41:25 +00:00
< tr ng-if = "!folder.paused" >
2015-08-10 09:22:37 +00:00
< th > < span class = "fa fa-fw fa-home" > < / span > < span translate > Local State< / span > < / th >
2016-10-17 12:10:17 +00:00
< td class = "text-right" >
2018-04-25 08:26:49 +00:00
< span tooltip data-original-title = "{{model[folder.id].localFiles | alwaysNumber | localeNumber}} {{'files' | translate}}, {{model[folder.id].localDirectories | alwaysNumber | localeNumber}} {{'directories' | translate}}, ~{{model[folder.id].localBytes | binary}}B" >
< span class = "fa fa-files-o" > < / span > {{model[folder.id].localFiles | alwaysNumber | localeNumber}} 
< span class = "fa fa-folder-o" > < / span > {{model[folder.id].localDirectories | alwaysNumber | localeNumber}} 
2016-11-13 13:56:07 +00:00
< span class = "fa fa-hdd-o" > < / span > ~{{model[folder.id].localBytes | binary}}B
< span ng-if = "model[folder.id].ignorePatterns" > < br / > < i > < small translate class = "text-muted" > Reduced by ignore patterns< / small > < / i > < / span >
< / span >
2016-10-17 12:10:17 +00:00
< / td >
2014-09-10 09:27:21 +00:00
< / tr >
2016-10-17 14:07:58 +00:00
< tr ng-if = "neededItems(folder.id) > 0" >
2015-10-08 23:34:11 +00:00
< th > < span class = "fa fa-fw fa-cloud-download" > < / span > < span translate > Out of Sync Items< / span > < / th >
2014-09-10 09:27:21 +00:00
< td class = "text-right" >
2016-10-17 14:07:58 +00:00
< a href = "" ng-click = "showNeed(folder.id)" > {{neededItems(folder.id) | alwaysNumber}} < span translate > items< / span > , ~{{model[folder.id].needBytes | binary}}B< / a >
2014-09-10 09:27:21 +00:00
< / td >
< / tr >
2015-11-18 09:57:11 +00:00
< tr ng-if = "folderStatus(folder) === 'scanning' && scanRate(folder.id) > 0" >
< th > < span class = "fa fa-fw fa-hourglass-2" > < / span > < span translate > Scan Time Remaining< / span > < / th >
< td class = "text-right" >
2016-03-16 14:55:29 +00:00
< span tooltip data-original-title = "{{scanRate(folder.id) | binary}}B/s" > ~ {{scanRemaining(folder.id)}}< / span >
2015-11-18 09:57:11 +00:00
< / td >
< / tr >
2016-11-02 13:03:57 +00:00
< tr ng-if = "hasFailedFiles(folder.id)" >
2015-08-10 09:22:37 +00:00
< th > < span class = "fa fa-fw fa-exclamation-circle" > < / span > < span translate > Failed Items< / span > < / th >
2015-06-26 12:22:52 +00:00
<!-- Show the number of failed items as a link to bring up the list. -->
2016-10-17 11:35:30 +00:00
< td class = "text-right" >
2018-04-25 08:26:49 +00:00
< a href = "" ng-click = "showFailed(folder.id)" > {{model[folder.id].pullErrors | alwaysNumber | localeNumber}} < span translate > items< / span > < / a >
2015-06-26 12:22:52 +00:00
< / td >
< / tr >
2016-05-04 10:47:33 +00:00
< tr ng-if = "folder.type != 'readwrite'" >
< th > < span class = "fa fa-fw fa-lock" > < / span > < span translate > Folder Type< / span > < / th >
2014-09-10 09:27:21 +00:00
< td class = "text-right" >
2016-12-16 22:23:35 +00:00
< span ng-if = "folder.type == 'readonly'" translate > Send Only< / span >
2016-05-04 10:47:33 +00:00
< span ng-if = "folder.type != 'readonly'" > {{ folder.type.charAt(0).toUpperCase() + folder.type.slice(1) }}< / span >
2014-09-10 09:27:21 +00:00
< / td >
< / tr >
2015-03-10 22:45:43 +00:00
< tr ng-if = "folder.ignorePerms" >
2015-08-10 09:22:37 +00:00
< th > < span class = "fa fa-fw fa-minus-square-o" > < / span > < span translate > Ignore Permissions< / span > < / th >
2014-09-10 09:27:21 +00:00
< td class = "text-right" >
2014-11-27 19:43:00 +00:00
< span translate > Yes< / span >
2014-09-10 09:27:21 +00:00
< / td >
< / tr >
2018-02-04 21:46:24 +00:00
< tr >
< th > < span class = "fa fa-fw fa-refresh" > < / span > < span translate > Rescans< / span > < / th >
2017-10-20 14:52:55 +00:00
< td class = "text-right" >
2018-02-07 12:46:27 +00:00
< div ng-if = "folder.rescanIntervalS > 0" >
< span ng-if = "!folder.fsWatcherEnabled" tooltip data-original-title = "{{'Periodic scanning at given interval and disabled watching for changes' | translate}}" >
< span class = "fa fa-clock-o" > < / span > {{folder.rescanIntervalS | duration}} 
< span class = "fa fa-eye-slash" > < / span > < span translate > Disabled< / span >
< / span >
< span ng-if = "folder.fsWatcherEnabled && (!model[folder.id].watchError || folder.paused)" tooltip data-original-title = "{{'Periodic scanning at given interval and enabled watching for changes' | translate}}" >
< span class = "fa fa-clock-o" > < / span > {{folder.rescanIntervalS | duration}} 
< span class = "fa fa-eye" > < / span > < span translate > Enabled< / span >
< / span >
< span ng-if = "folder.fsWatcherEnabled && !folder.paused && model[folder.id].watchError" tooltip data-original-title = "{{'Periodic scanning at given interval and failed setting up watching for changes, retrying every 1m:' | translate}}<br/>{{model[folder.id].watchError}}" >
< span class = "fa fa-clock-o" > < / span > {{folder.rescanIntervalS | duration}} 
< span class = "fa fa-eye-slash" > < / span > < span translate > Failed to setup, retrying< / span >
< / span >
< / div >
< div ng-if = "folder.rescanIntervalS <= 0" >
< span ng-if = "!folder.fsWatcherEnabled" tooltip data-original-title = "{{'Disabled periodic scanning and disabled watching for changes' | translate}}" >
< span class = "fa fa-clock-o" > < / span > < span translate > Disabled< / span >  
< span class = "fa fa-eye-slash" > < / span > < span translate > Disabled< / span >
< / span >
< span ng-if = "folder.fsWatcherEnabled && (!model[folder.id].watchError || folder.paused)" tooltip data-original-title = "{{'Disabled periodic scanning and enabled watching for changes' | translate}}" >
< span class = "fa fa-clock-o" > < / span > < span translate > Disabled< / span >  
< span class = "fa fa-eye" > < / span > < span translate > Enabled< / span >
< / span >
< span ng-if = "folder.fsWatcherEnabled && !folder.paused && model[folder.id].watchError" tooltip data-original-title = "{{'Disabled periodic scanning and failed setting up watching for changes, retrying every 1m:' | translate}}<br/>{{model[folder.id].watchError}}" >
< span class = "fa fa-clock-o" > < / span > < span translate > Disabled< / span >  
< span class = "fa fa-eye-slash" > < / span > < span translate > Failed to setup, retrying< / span >
< / span >
< / div >
2017-10-20 14:52:55 +00:00
< / td >
< / tr >
2015-04-25 05:13:53 +00:00
< tr ng-if = "folder.order != 'random'" >
2015-08-10 09:22:37 +00:00
< th > < span class = "fa fa-fw fa-sort" > < / span > < span translate > File Pull Order< / span > < / th >
2015-04-25 05:13:53 +00:00
< td class = "text-right" ng-switch = "folder.order" >
< span ng-switch-when = "random" translate > Random< / span >
< span ng-switch-when = "alphabetic" translate > Alphabetic< / span >
< span ng-switch-when = "smallestFirst" translate > Smallest First< / span >
< span ng-switch-when = "largestFirst" translate > Largest First< / span >
< span ng-switch-when = "oldestFirst" translate > Oldest First< / span >
< span ng-switch-when = "newestFirst" translate > Newest First< / span >
< / td >
< / tr >
2015-03-10 22:45:43 +00:00
< tr ng-if = "folder.versioning.type" >
2015-08-10 09:22:37 +00:00
< th > < span class = "fa fa-fw fa-files-o" > < / span > < span translate > File Versioning< / span > < / th >
2015-03-19 17:16:48 +00:00
< td class = "text-right" ng-switch = "folder.versioning.type" >
2015-06-12 11:04:00 +00:00
< span ng-switch-when = "trashcan" translate > Trash Can File Versioning< / span >
2015-01-15 14:47:47 +00:00
< span ng-switch-when = "staggered" translate > Staggered File Versioning< / span >
< span ng-switch-when = "simple" translate > Simple File Versioning< / span >
2015-03-19 10:31:21 +00:00
< span ng-switch-when = "external" translate > External File Versioning< / span >
2015-01-15 14:47:47 +00:00
< / td >
< / tr >
2014-12-01 19:50:27 +00:00
< tr >
2015-08-10 09:22:37 +00:00
< th > < span class = "fa fa-fw fa-share-alt" > < / span > < span translate > Shared With< / span > < / th >
2017-09-19 15:37:26 +00:00
< td class = "text-right" ng-attr-title = "{{sharesFolder(folder)}}" > {{sharesFolder(folder)}}< / td >
2014-12-01 19:50:27 +00:00
< / tr >
2017-12-07 07:08:24 +00:00
< tr ng-if = "folderStats[folder.id].lastScan" >
2016-06-02 19:26:52 +00:00
< th > < span class = "fa fa-fw fa-clock-o" > < / span > < span translate > Last Scan< / span > < / th >
< td translate ng-if = "folderStats[folder.id].lastScanDays >= 365" class = "text-right" > Never< / td >
< td ng-if = "folderStats[folder.id].lastScanDays < 365" class = "text-right" >
< span > {{folderStats[folder.id].lastScan | date:'yyyy-MM-dd HH:mm:ss'}}< / span >
< / td >
< / tr >
2016-05-04 10:47:33 +00:00
< tr ng-if = "folder.type != 'readonly' && folderStats[folder.id].lastFile && folderStats[folder.id].lastFile.filename" >
2016-12-09 17:16:29 +00:00
< th > < span class = "fa fa-fw fa-exchange" > < / span > < span translate > Latest Change< / span > < / th >
2014-12-07 20:21:12 +00:00
< td class = "text-right" >
2016-03-16 14:55:29 +00:00
< span tooltip data-original-title = "{{folderStats[folder.id].lastFile.filename}} @ {{folderStats[folder.id].lastFile.at | date:'yyyy-MM-dd HH:mm:ss'}}" >
2015-06-16 11:12:34 +00:00
< span translate ng-if = "!folderStats[folder.id].lastFile.deleted" > Updated< / span >
< span translate ng-if = "folderStats[folder.id].lastFile.deleted" > Deleted< / span >
2015-03-10 22:45:43 +00:00
{{folderStats[folder.id].lastFile.filename | basename}}
2014-12-07 20:21:12 +00:00
< / span >
< / td >
< / tr >
2014-09-10 09:27:21 +00:00
< / tbody >
< / table >
< / div >
< div class = "panel-footer" >
2016-05-04 20:30:18 +00:00
< button type = "button" class = "btn btn-sm btn-danger pull-left" ng-click = "override(folder.id)" ng-if = "folderStatus(folder) == 'outofsync' && folder.type == 'readonly'" >
2015-08-10 09:22:37 +00:00
< span class = "fa fa-arrow-circle-up" > < / span > < span translate > Override Changes< / span >
< / button >
2014-06-16 08:47:02 +00:00
< span class = "pull-right" >
2016-12-21 18:41:25 +00:00
< button ng-if = "!folder.paused" type = "button" class = "btn btn-sm btn-default" ng-click = "setFolderPause(folder.id, true)" >
< span class = "fa fa-pause" > < / span > < span translate > Pause< / span >
< / button >
< button ng-if = "folder.paused" type = "button" class = "btn btn-sm btn-default" ng-click = "setFolderPause(folder.id, false)" >
< span class = "fa fa-play" > < / span > < span translate > Resume< / span >
< / button >
2018-01-01 14:39:23 +00:00
< button type = "button" class = "btn btn-default btn-sm" ng-click = "restoreVersions.show(folder.id)" ng-if = "folder.versioning.type" >
< span class = "fa fa-undo" > < / span > < span translate > Versions< / span >
< / button >
2018-01-27 09:10:11 +00:00
< button type = "button" class = "btn btn-sm btn-default" ng-click = "rescanFolder(folder.id)" ng-show = "['idle', 'stopped', 'unshared', 'outofsync'].indexOf(folderStatus(folder)) > -1" >
2015-08-10 09:22:37 +00:00
< span class = "fa fa-refresh" > < / span > < span translate > Rescan< / span >
< / button >
< button type = "button" class = "btn btn-sm btn-default" ng-click = "editFolder(folder)" >
< span class = "fa fa-pencil" > < / span > < span translate > Edit< / span >
< / button >
2014-06-16 08:47:02 +00:00
< / span >
2014-09-10 09:27:21 +00:00
< div class = "clearfix" > < / div >
2014-05-24 19:56:09 +00:00
< / div >
2014-05-20 17:36:37 +00:00
< / div >
2014-04-09 21:00:23 +00:00
< / div >
2014-02-12 11:10:44 +00:00
< / div >
2015-02-11 18:52:59 +00:00
< span class = "pull-right" >
2017-02-09 20:31:23 +00:00
< button type = "button" class = "btn btn-sm btn-default" ng-click = "setAllFoldersPause(true)" ng-if = "isAtleastOneFolderPausedStateSetTo(false)" >
2017-02-24 08:42:32 +00:00
< span class = "fa fa-pause" > < / span > < span translate > Pause All< / span >
2017-02-09 20:31:23 +00:00
< / button >
< button type = "button" class = "btn btn-sm btn-default" ng-click = "setAllFoldersPause(false)" ng-if = "isAtleastOneFolderPausedStateSetTo(true)" >
2017-02-24 08:42:32 +00:00
< span class = "fa fa-play" > < / span > < span translate > Resume All< / span >
2017-02-09 20:31:23 +00:00
< / button >
2015-08-10 09:22:37 +00:00
< button type = "button" class = "btn btn-sm btn-default" ng-click = "rescanAllFolders()" >
< span class = "fa fa-refresh" > < / span > < span translate > Rescan All< / span >
< / button >
< button type = "button" class = "btn btn-sm btn-default" ng-click = "addFolder()" >
< span class = "fa fa-plus" > < / span > < span translate > Add Folder< / span >
< / button >
2015-02-11 18:52:59 +00:00
< / span >
< div class = "clearfix" > < / div >
2014-09-10 14:56:23 +00:00
< hr class = "visible-sm" / >
2014-04-09 21:00:23 +00:00
< / div >
2014-01-05 22:54:57 +00:00
2014-09-28 11:00:38 +00:00
<!-- Device list (top right) -->
2014-04-09 21:00:23 +00:00
2014-09-28 11:00:38 +00:00
<!-- This device -->
2014-09-10 09:27:21 +00:00
2016-07-31 22:59:44 +00:00
< div class = "col-md-6" aria-label = "{{'Devices' | translate}}" role = "region" >
2016-03-17 20:05:09 +00:00
< h3 translate > This Device< / h3 >
2014-09-28 11:00:38 +00:00
< div class = "panel panel-default" ng-repeat = "deviceCfg in [thisDevice()]" >
2016-07-31 22:59:44 +00:00
< button class = "btn panel-heading" data-toggle = "collapse" data-target = "#device-this" aria-expanded = "true" >
2016-03-22 20:53:56 +00:00
< h4 class = "panel-title" >
2016-05-30 08:18:09 +00:00
< identicon class = "panel-icon" data-value = "deviceCfg.deviceID" > < / identicon >
< div class = "panel-title-text" > {{deviceName(deviceCfg)}}< / div >
2016-03-22 20:53:56 +00:00
< / h4 >
2016-06-08 15:55:44 +00:00
< / button >
2014-09-28 11:00:38 +00:00
< div id = "device-this" class = "panel-collapse collapse in" >
2014-09-10 09:27:21 +00:00
< div class = "panel-body" >
< table class = "table table-condensed table-striped" >
< tbody >
< tr >
2015-08-10 09:22:37 +00:00
< th > < span class = "fa fa-fw fa-cloud-download" > < / span > < span translate > Download Rate< / span > < / th >
2017-03-31 06:32:54 +00:00
< td class = "text-right" >
< a href = "#" class = "toggler" ng-click = "toggleUnits()" >
< span ng-if = "!metricRates" > {{connectionsTotal.inbps | binary}}B/s< / span >
< span ng-if = "metricRates" > {{connectionsTotal.inbps*8 | metric}}bps< / span >
({{connectionsTotal.inBytesTotal | binary}}B)< / span >
< / a >
< / td >
2014-09-10 09:27:21 +00:00
< / tr >
< tr >
2015-08-10 09:22:37 +00:00
< th > < span class = "fa fa-fw fa-cloud-upload" > < / span > < span translate > Upload Rate< / span > < / th >
2017-03-31 06:32:54 +00:00
< td class = "text-right" >
< a href = "#" class = "toggler" ng-click = "toggleUnits()" >
< span ng-if = "!metricRates" > {{connectionsTotal.outbps | binary}}B/s< / span >
< span ng-if = "metricRates" > {{connectionsTotal.outbps*8 | metric}}bps< / span >
({{connectionsTotal.outBytesTotal | binary}}B)
< / a >
< / td >
2014-09-10 09:27:21 +00:00
< / tr >
2015-06-19 19:52:19 +00:00
< tr >
2015-08-10 09:22:37 +00:00
< th > < span class = "fa fa-fw fa-home" > < / span > < span translate > Local State (Total)< / span > < / th >
2017-06-07 10:34:45 +00:00
< td class = "text-right" >
2018-04-25 08:26:49 +00:00
< span tooltip data-original-title = "{{localStateTotal.files | alwaysNumber | localeNumber}} {{'files' | translate}}, {{ localStateTotal.directories | alwaysNumber | localeNumber}} {{'directories' | translate}}, ~{{ localStateTotal.bytes | binary}}B" >
< span class = "fa fa-files-o" > < / span > {{localStateTotal.files | alwaysNumber | localeNumber}} 
< span class = "fa fa-folder-o" > < / span > {{localStateTotal.directories| alwaysNumber | localeNumber}} 
2017-06-07 10:34:45 +00:00
< span class = "fa fa-hdd-o" > < / span > ~{{localStateTotal.bytes | binary}}B
< / td >
2015-06-19 19:52:19 +00:00
< / tr >
2014-09-10 09:27:21 +00:00
< tr >
2015-08-10 09:22:37 +00:00
< th > < span class = "fa fa-fw fa-th" > < / span > < span translate > RAM Utilization< / span > < / th >
2014-09-10 09:27:21 +00:00
< td class = "text-right" > {{system.sys | binary}}B< / td >
< / tr >
< tr >
2015-08-10 09:22:37 +00:00
< th > < span class = "fa fa-fw fa-tachometer" > < / span > < span translate > CPU Utilization< / span > < / th >
2018-04-25 08:26:49 +00:00
< td class = "text-right" > {{system.cpuPercent | alwaysNumber | localeNumber:2}}%< / td >
2014-09-10 09:27:21 +00:00
< / tr >
2016-05-04 19:38:12 +00:00
< tr >
< th > < span class = "fa fa-fw fa-sitemap" > < / span > < span translate > Listeners< / span > < / th >
< td class = "text-right" >
< span ng-if = "listenersFailed.length == 0" class = "data text-success" >
< span > {{listenersTotal}}/{{listenersTotal}}< / span >
< / span >
< span ng-if = "listenersFailed.length != 0" class = "data" ng-class = "{'text-danger': listenersFailed.length == listenersTotal}" >
< span popover data-trigger = "hover" data-placement = "bottom" data-html = "true" data-content = "{{listenersFailed.join('<br>\n')}}" >
{{listenersTotal-listenersFailed.length}}/{{listenersTotal}}
< / span >
< / span >
< / td >
< / tr >
2015-09-20 13:30:25 +00:00
< tr ng-if = "system.discoveryEnabled" >
< th > < span class = "fa fa-fw fa-map-signs" > < / span > < span translate > Discovery< / span > < / th >
2014-09-10 09:27:21 +00:00
< td class = "text-right" >
2015-09-20 13:30:25 +00:00
< span ng-if = "discoveryFailed.length == 0" class = "data text-success" >
< span > {{discoveryTotal}}/{{discoveryTotal}}< / span >
2014-11-18 22:57:21 +00:00
< / span >
2015-09-20 13:30:25 +00:00
< span ng-if = "discoveryFailed.length != 0" class = "data" ng-class = "{'text-danger': discoveryFailed.length == discoveryTotal}" >
2017-03-25 11:56:51 +00:00
< span popover data-trigger = "hover" data-placement = "bottom" data-content = "{{'Click to see discovery failures' | translate}}." >
2017-03-20 13:55:08 +00:00
< a href = "" style = "color:inherit" ng-click = "showDiscoveryFailures()" > {{discoveryTotal-discoveryFailed.length}}/{{discoveryTotal}}< / a >
2014-11-18 22:57:21 +00:00
< / span >
< / span >
2014-09-10 09:27:21 +00:00
< / td >
< / tr >
2015-04-03 18:00:13 +00:00
< tr >
2015-08-10 09:22:37 +00:00
< th > < span class = "fa fa-fw fa-clock-o" > < / span > < span translate > Uptime< / span > < / th >
2015-04-03 18:00:13 +00:00
< td class = "text-right" > {{system.uptime | duration:"m"}}< / td >
< / tr >
2014-09-10 09:27:21 +00:00
< tr >
2015-08-10 09:22:37 +00:00
< th > < span class = "fa fa-fw fa-tag" > < / span > < span translate > Version< / span > < / th >
2016-03-16 14:55:29 +00:00
< td class = "text-right" >
< span tooltip data-original-title = "{{versionString()}}" > {{versionString()}}< / span >
< / td >
2014-09-10 09:27:21 +00:00
< / tr >
< / tbody >
< / table >
2014-05-20 17:36:37 +00:00
< / div >
< / div >
2014-09-10 09:27:21 +00:00
< / div >
2014-09-28 11:00:38 +00:00
<!-- Remote devices -->
2016-03-17 20:05:09 +00:00
< h3 translate > Remote Devices< / h3 >
2014-09-28 11:00:38 +00:00
< div class = "panel-group" id = "devices" >
2014-11-29 12:08:00 +00:00
< div class = "panel panel-default" ng-repeat = "deviceCfg in otherDevices()" >
2016-07-31 22:59:44 +00:00
< button class = "btn panel-heading" data-toggle = "collapse" data-parent = "#devices" data-target = "#device-{{$index}}" aria-expanded = "false" >
2015-03-10 22:45:43 +00:00
< div class = "panel-progress" ng-show = "deviceStatus(deviceCfg) == 'syncing'" ng-attr-style = "width: {{completion[deviceCfg.deviceID]._total | number:0}}%" > < / div >
2016-03-22 20:53:56 +00:00
< h4 class = "panel-title" >
2016-06-02 23:21:19 +00:00
< identicon class = "panel-icon" data-value = "deviceCfg.deviceID" > < / identicon >
2015-01-08 10:04:27 +00:00
< span ng-switch = "deviceStatus(deviceCfg)" class = "pull-right text-{{deviceClass(deviceCfg)}}" >
< span ng-switch-when = "insync" > < span class = "hidden-xs" translate > Up to Date< / span > < span class = "visible-xs" > ◼ < / span > < / span >
2014-11-29 08:42:16 +00:00
< span ng-switch-when = "syncing" >
2017-07-05 09:19:29 +00:00
< span class = "hidden-xs" translate > Syncing< / span > ({{completion[deviceCfg.deviceID]._total | number:0}}%, {{completion[deviceCfg.deviceID]._needBytes | binary}}B)
2014-07-26 20:30:29 +00:00
< / span >
2015-08-23 19:56:10 +00:00
< span ng-switch-when = "paused" > < span class = "hidden-xs" translate > Paused< / span > < span class = "visible-xs" > ◼ < / span > < / span >
2015-01-08 10:04:27 +00:00
< span ng-switch-when = "disconnected" > < span class = "hidden-xs" translate > Disconnected< / span > < span class = "visible-xs" > ◼ < / span > < / span >
< span ng-switch-when = "unused" > < span class = "hidden-xs" translate > Unused< / span > < span class = "visible-xs" > ◼ < / span > < / span >
2014-09-08 17:46:33 +00:00
< / span >
2016-06-08 15:55:44 +00:00
< span > {{deviceName(deviceCfg)}}< / span >
2016-03-22 20:53:56 +00:00
< / h4 >
2016-06-08 15:55:44 +00:00
< / button >
2014-09-28 11:00:38 +00:00
< div id = "device-{{$index}}" class = "panel-collapse collapse" >
2014-05-24 19:56:09 +00:00
< div class = "panel-body" >
2014-09-10 09:27:21 +00:00
< table class = "table table-condensed table-striped" >
< tbody >
2015-08-23 19:56:10 +00:00
< tr ng-if = "connections[deviceCfg.deviceID].connected" >
2015-08-10 09:22:37 +00:00
< th > < span class = "fa fa-fw fa-cloud-download" > < / span > < span translate > Download Rate< / span > < / th >
2017-04-06 08:42:45 +00:00
< td class = "text-right" >
< a href = "#" class = "toggler" ng-click = "toggleUnits()" >
< span ng-if = "!metricRates" > {{connections[deviceCfg.deviceID].inbps | binary}}B/s< / span >
< span ng-if = "metricRates" > {{connections[deviceCfg.deviceID].inbps*8 | metric}}bps< / span >
({{connections[deviceCfg.deviceID].inBytesTotal | binary}}B)< / span >
< / a >
< / td >
2014-09-10 09:27:21 +00:00
< / tr >
2015-08-23 19:56:10 +00:00
< tr ng-if = "connections[deviceCfg.deviceID].connected" >
2015-08-10 09:22:37 +00:00
< th > < span class = "fa fa-fw fa-cloud-upload" > < / span > < span translate > Upload Rate< / span > < / th >
2017-04-06 08:42:45 +00:00
< td class = "text-right" >
< a href = "#" class = "toggler" ng-click = "toggleUnits()" >
< span ng-if = "!metricRates" > {{connections[deviceCfg.deviceID].outbps | binary}}B/s< / span >
< span ng-if = "metricRates" > {{connections[deviceCfg.deviceID].outbps*8 | metric}}bps< / span >
({{connections[deviceCfg.deviceID].outBytesTotal | binary}}B)< / span >
< / a >
< / td >
2014-09-10 09:27:21 +00:00
< / tr >
2017-12-15 20:01:56 +00:00
< tr ng-if = "deviceStatus(deviceCfg) == 'syncing'" >
< th > < span class = "fa fa-fw fa-exchange" > < / span > < span translate > Out of Sync Items< / span > < / th >
< td class = "text-right" >
2018-04-25 08:26:49 +00:00
< a href = "" ng-click = "showRemoteNeed(deviceCfg)" > {{completion[deviceCfg.deviceID]._needItems | alwaysNumber | localeNumber}} < span translate > items< / span > , ~{{completion[deviceCfg.deviceID]._needBytes | binary}}B< / a >
2017-12-15 20:01:56 +00:00
< / td >
< / tr >
2016-06-26 10:47:23 +00:00
< tr >
2016-05-04 19:38:12 +00:00
< th > < span class = "fa fa-fw fa-link" > < / span > & nbsp< span translate > Address< / span > < / th >
2016-06-26 10:47:23 +00:00
< td ng-if = "connections[deviceCfg.deviceID].connected" class = "text-right" >
2016-05-04 19:38:12 +00:00
< span tooltip data-original-title = "{{ connections[deviceCfg.deviceID].type.indexOf('Relay') > -1 ? '' : connections[deviceCfg.deviceID].type }}" >
{{deviceAddr(deviceCfg)}}
< / span >
< / td >
2016-06-26 10:47:23 +00:00
< td ng-if = "!connections[deviceCfg.deviceID].connected" class = "text-right" >
< span ng-repeat = "addr in deviceCfg.addresses" > < span tooltip data-original-title = "{{'Configured' | translate}}" > {{addr}}< / span > < br > < / span >
< span ng-repeat = "addr in discoveryCache[deviceCfg.deviceID].addresses" > < span tooltip data-original-title = "{{'Discovered' | translate}}" > {{addr}}< / span > < br > < / span >
< / td >
2016-05-04 19:38:12 +00:00
< / tr >
< tr ng-if = "connections[deviceCfg.deviceID].connected && connections[deviceCfg.deviceID].type.indexOf('Relay') > -1" tooltip data-original-title = "Connections via relays might be rate limited by the relay" >
2016-06-02 23:21:19 +00:00
< th > < span class = "fa fa-fw fa-warning text-danger" > < / span > < span translate > Connection Type< / span > < / th >
2016-05-04 19:38:12 +00:00
< td class = "text-right" > {{connections[deviceCfg.deviceID].type}}< / td >
2014-09-10 09:27:21 +00:00
< / tr >
2017-04-01 09:52:31 +00:00
< tr ng-if = "deviceCfg.allowedNetworks" >
< th > < span class = "fa fa-fw fa-filter" > < / span > < span translate > Allowed Networks< / span > < / th >
< td class = "text-right" >
< span > {{deviceCfg.allowedNetworks.join(", ")}}< / span >
< / td >
< / tr >
2015-03-10 22:45:43 +00:00
< tr ng-if = "deviceCfg.compression != 'metadata'" >
2015-08-10 09:22:37 +00:00
< th > < span class = "fa fa-fw fa-compress" > < / span > < span translate > Compression< / span > < / th >
2015-02-23 08:44:10 +00:00
< td class = "text-right" >
2015-03-10 22:45:43 +00:00
< span ng-if = "deviceCfg.compression == 'always'" translate > All Data< / span >
< span ng-if = "deviceCfg.compression == 'never'" translate > Off< / span >
2015-02-23 08:44:10 +00:00
< / td >
2014-09-10 09:27:21 +00:00
< / tr >
2015-03-10 22:45:43 +00:00
< tr ng-if = "deviceCfg.introducer" >
2015-08-10 09:22:37 +00:00
< th > < span class = "fa fa-fw fa-thumbs-o-up" > < / span > < span translate > Introducer< / span > < / th >
2014-11-27 19:46:36 +00:00
< td translate class = "text-right" > Yes< / td >
2014-09-23 14:04:20 +00:00
< / tr >
2016-12-20 20:37:19 +00:00
< tr ng-if = "deviceCfg.introducedBy" >
< th > < span class = "fa fa-fw fa-meh-o" > < / span > < span translate > Introduced By< / span > < / th >
2017-01-17 14:58:35 +00:00
< td class = "text-right" > {{ deviceName(findDevice(deviceCfg.introducedBy)) || deviceCfg.introducedBy.substring(0, 5) }}< / td >
2016-12-20 20:37:19 +00:00
< / tr >
2015-10-22 06:53:28 +00:00
< tr ng-if = "connections[deviceCfg.deviceID].clientVersion" >
2015-08-10 09:22:37 +00:00
< th > < span class = "fa fa-fw fa-tag" > < / span > < span translate > Version< / span > < / th >
2015-03-10 22:45:43 +00:00
< td class = "text-right" > {{connections[deviceCfg.deviceID].clientVersion}}< / td >
2014-09-10 09:27:21 +00:00
< / tr >
2015-08-23 19:56:10 +00:00
< tr ng-if = "!connections[deviceCfg.deviceID].connected" >
2015-08-10 09:22:37 +00:00
< th > < span class = "fa fa-fw fa-eye" > < / span > < span translate > Last seen< / span > < / th >
2015-03-10 22:45:43 +00:00
< td translate ng-if = "!deviceStats[deviceCfg.deviceID].lastSeenDays || deviceStats[deviceCfg.deviceID].lastSeenDays >= 365" class = "text-right" > Never< / td >
2015-05-21 08:40:46 +00:00
< td ng-if = "deviceStats[deviceCfg.deviceID].lastSeenDays < 365" class = "text-right" > {{deviceStats[deviceCfg.deviceID].lastSeen | date:"yyyy-MM-dd HH:mm:ss"}}< / td >
2014-09-10 09:27:21 +00:00
< / tr >
2014-11-29 08:42:16 +00:00
< tr ng-if = "deviceFolders(deviceCfg).length > 0" >
2015-08-10 09:22:37 +00:00
< th > < span class = "fa fa-fw fa-folder" > < / span > < span translate > Folders< / span > < / th >
2017-09-19 15:37:26 +00:00
< td class = "text-right" ng-attr-title = "{{deviceFolders(deviceCfg).map(folderLabel).join(', ')}}" > {{deviceFolders(deviceCfg).map(folderLabel).join(", ")}}< / td >
2014-11-29 08:42:16 +00:00
< / tr >
2014-09-10 09:27:21 +00:00
< / tbody >
< / table >
< / div >
< div class = "panel-footer" >
2015-08-10 09:22:37 +00:00
< span class = "pull-right" >
2016-12-21 18:41:25 +00:00
< button ng-if = "!deviceCfg.paused" type = "button" class = "btn btn-sm btn-default" ng-click = "setDevicePause(deviceCfg.deviceID, true)" >
2015-08-23 19:56:10 +00:00
< span class = "fa fa-pause" > < / span > < span translate > Pause< / span >
< / button >
2016-12-21 18:41:25 +00:00
< button ng-if = "deviceCfg.paused" type = "button" class = "btn btn-sm btn-default" ng-click = "setDevicePause(deviceCfg.deviceID, false)" >
2015-08-23 19:56:10 +00:00
< span class = "fa fa-play" > < / span > < span translate > Resume< / span >
< / button >
2016-06-06 12:39:47 +00:00
< button type = "button" class = "btn btn-sm btn-default" ng-click = "editDevice(deviceCfg)" >
< span class = "fa fa-pencil" > < / span > < span translate > Edit< / span >
< / button >
2015-08-10 09:22:37 +00:00
< / span >
2014-09-10 09:27:21 +00:00
< div class = "clearfix" > < / div >
2014-05-24 19:56:09 +00:00
< / div >
2014-05-20 17:36:37 +00:00
< / div >
2014-04-09 21:00:23 +00:00
< / div >
2014-01-05 22:54:57 +00:00
< / div >
2014-09-27 12:43:11 +00:00
< div class = "form-group" >
2016-12-21 16:35:20 +00:00
< span class = "pull-right" >
< button type = "button" class = "btn btn-sm btn-default" ng-click = "globalChanges()" >
2017-11-03 07:09:10 +00:00
< span class = "fa fa-fw fa-info-circle" > < / span > < span translate > Recent Changes< / span >
2016-12-21 16:35:20 +00:00
< / button >
< button type = "button" class = "btn btn-sm btn-default" ng-click = "addDevice()" >
< span class = "fa fa-plus" > < / span > < span translate > Add Remote Device< / span >
< / button >
< / span >
2014-09-27 12:43:11 +00:00
< div class = "clearfix" > < / div >
< / div >
2014-04-09 21:00:23 +00:00
< / div >
< / div > <!-- /row -->
< / div > <!-- /container -->
<!-- Bottom bar -->
2015-01-10 17:02:27 +00:00
< nav class = "navbar navbar-default navbar-fixed-bottom" >
2014-02-12 11:10:44 +00:00
< div class = "container" >
2014-05-20 17:36:37 +00:00
< ul class = "nav navbar-nav" >
2015-08-10 09:22:37 +00:00
< li > < a class = "navbar-link" href = "https://syncthing.net/" target = "_blank" > < span class = "fa fa-home" > < / span > < span translate > Home page< / span > < / a > < / li >
2016-03-25 07:02:29 +00:00
< li > < a class = "navbar-link" href = "https://docs.syncthing.net/" target = "_blank" > < span class = "fa fa-book" > < / span > < span translate > Documentation< / span > < / a > < / li >
2015-08-10 09:22:37 +00:00
< li > < a class = "navbar-link" href = "https://forum.syncthing.net" target = "_blank" > < span class = "fa fa-question-circle" > < / span > < span translate > Support< / span > < / a > < / li >
< li > < a class = "navbar-link" href = "https://data.syncthing.net/" target = "_blank" > < span class = "fa fa-bar-chart" > < / span > < span translate > Statistics< / span > < / a > < / li >
< li > < a class = "navbar-link" href = "https://github.com/syncthing/syncthing/releases" target = "_blank" > < span class = "fa fa-file-text-o" > < / span > < span translate > Changelog< / span > < / a > < / li >
< li > < a class = "navbar-link" href = "https://github.com/syncthing/syncthing/issues" target = "_blank" > < span class = "fa fa-bug" > < / span > < span translate > Bugs< / span > < / a > < / li >
< li > < a class = "navbar-link" href = "https://github.com/syncthing/syncthing" target = "_blank" > < span class = "fa fa-wrench" > < / span > < span translate > Source Code< / span > < / a > < / li >
< li > < a class = "navbar-link" href = "https://twitter.com/syncthing" target = "_blank" > < span class = "fa fa-twitter" > < / span > Twitter< / a > < / li >
2014-04-09 21:00:23 +00:00
< / ul >
2014-02-12 11:10:44 +00:00
< / div >
2014-04-09 21:00:23 +00:00
< / nav >
2016-06-12 14:06:48 +00:00
< ng-include src = "'syncthing/core/networkErrorDialogView.html'" > < / ng-include >
< ng-include src = "'syncthing/core/httpErrorDialogView.html'" > < / ng-include >
< ng-include src = "'syncthing/core/restartingDialogView.html'" > < / ng-include >
< ng-include src = "'syncthing/core/upgradingDialogView.html'" > < / ng-include >
< ng-include src = "'syncthing/core/shutdownDialogView.html'" > < / ng-include >
< ng-include src = "'syncthing/device/idqrModalView.html'" > < / ng-include >
< ng-include src = "'syncthing/device/editDeviceModalView.html'" > < / ng-include >
2016-12-21 16:35:20 +00:00
< ng-include src = "'syncthing/device/globalChangesModalView.html'" > < / ng-include >
2016-06-12 14:06:48 +00:00
< ng-include src = "'syncthing/folder/editFolderModalView.html'" > < / ng-include >
2018-01-01 14:39:23 +00:00
< ng-include src = "'syncthing/folder/restoreVersionsModalView.html'" > < / ng-include >
< ng-include src = "'syncthing/folder/restoreVersionsConfirmation.html'" > < / ng-include >
2016-06-12 14:06:48 +00:00
< ng-include src = "'syncthing/settings/settingsModalView.html'" > < / ng-include >
< ng-include src = "'syncthing/settings/advancedSettingsModalView.html'" > < / ng-include >
< ng-include src = "'syncthing/usagereport/usageReportModalView.html'" > < / ng-include >
< ng-include src = "'syncthing/usagereport/usageReportPreviewModalView.html'" > < / ng-include >
< ng-include src = "'syncthing/transfer/neededFilesModalView.html'" > < / ng-include >
< ng-include src = "'syncthing/transfer/failedFilesModalView.html'" > < / ng-include >
2017-12-15 20:01:56 +00:00
< ng-include src = "'syncthing/transfer/remoteNeededFilesModalView.html'" > < / ng-include >
2016-06-12 14:06:48 +00:00
< ng-include src = "'syncthing/core/majorUpgradeModalView.html'" > < / ng-include >
< ng-include src = "'syncthing/core/aboutModalView.html'" > < / ng-include >
2017-03-20 13:55:08 +00:00
< ng-include src = "'syncthing/core/discoveryFailuresModalView.html'" > < / ng-include >
2017-12-02 11:28:06 +00:00
< ng-include src = "'syncthing/folder/removeFolderDialogView.html'" > < / ng-include >
< ng-include src = "'syncthing/device/removeDeviceDialogView.html'" > < / ng-include >
2017-12-24 22:26:05 +00:00
< ng-include src = "'syncthing/core/logViewerModalView.html'" > < / ng-include >
2015-07-03 12:07:38 +00:00
2014-11-26 12:39:59 +00:00
<!-- vendor scripts -->
2017-07-15 09:54:37 +00:00
< script type = "text/javascript" src = "vendor/jquery/jquery-2.2.2.js" > < / script >
< script type = "text/javascript" src = "vendor/angular/angular.js" > < / script >
< script type = "text/javascript" src = "vendor/angular/angular-sanitize.js" > < / script >
< script type = "text/javascript" src = "vendor/angular/angular-translate.js" > < / script >
< script type = "text/javascript" src = "vendor/angular/angular-translate-loader-static-files.js" > < / script >
< script type = "text/javascript" src = "vendor/angular/angular-dirPagination.js" > < / script >
2018-01-01 14:39:23 +00:00
< script type = "text/javascript" src = "vendor/moment/moment.js" > < / script >
2017-07-15 09:54:37 +00:00
< script type = "text/javascript" src = "vendor/bootstrap/js/bootstrap.js" > < / script >
2018-01-01 14:39:23 +00:00
< script type = "text/javascript" src = "vendor/bootstrap/js/daterangepicker.js" > < / script >
< script type = "text/javascript" src = "vendor/fancytree/jquery.fancytree-all-deps.js" > < / script >
2014-11-26 12:39:59 +00:00
<!-- / vendor scripts -->
<!-- gui application code -->
2017-07-15 09:54:37 +00:00
< script type = "text/javascript" src = "syncthing/core/module.js" > < / script >
< script type = "text/javascript" src = "syncthing/core/alwaysNumberFilter.js" > < / script >
< script type = "text/javascript" src = "syncthing/core/basenameFilter.js" > < / script >
< script type = "text/javascript" src = "syncthing/core/binaryFilter.js" > < / script >
2018-04-25 08:26:49 +00:00
< script type = "text/javascript" src = "syncthing/core/localeNumberFilter.js" > < / script >
2017-07-15 09:54:37 +00:00
< script type = "text/javascript" src = "syncthing/core/durationFilter.js" > < / script >
< script type = "text/javascript" src = "syncthing/core/eventService.js" > < / script >
< script type = "text/javascript" src = "syncthing/core/identiconDirective.js" > < / script >
< script type = "text/javascript" src = "syncthing/core/languageSelectDirective.js" > < / script >
< script type = "text/javascript" src = "syncthing/core/lastErrorComponentFilter.js" > < / script >
< script type = "text/javascript" src = "syncthing/core/localeService.js" > < / script >
< script type = "text/javascript" src = "syncthing/core/modalDirective.js" > < / script >
< script type = "text/javascript" src = "syncthing/core/metricFilter.js" > < / script >
< script type = "text/javascript" src = "syncthing/core/notificationDirective.js" > < / script >
< script type = "text/javascript" src = "syncthing/core/pathIsSubDirDirective.js" > < / script >
< script type = "text/javascript" src = "syncthing/core/popoverDirective.js" > < / script >
< script type = "text/javascript" src = "syncthing/core/selectOnClickDirective.js" > < / script >
< script type = "text/javascript" src = "syncthing/core/syncthingController.js" > < / script >
< script type = "text/javascript" src = "syncthing/core/tooltipDirective.js" > < / script >
2017-10-17 07:56:36 +00:00
< script type = "text/javascript" src = "syncthing/core/uncamelFilter.js" > < / script >
2017-07-15 09:54:37 +00:00
< script type = "text/javascript" src = "syncthing/core/uniqueFolderDirective.js" > < / script >
< script type = "text/javascript" src = "syncthing/core/validDeviceidDirective.js" > < / script >
< script type = "text/javascript" src = "assets/lang/valid-langs.js" > < / script >
< script type = "text/javascript" src = "assets/lang/prettyprint.js" > < / script >
< script type = "text/javascript" src = "meta.js" > < / script >
< script type = "text/javascript" src = "syncthing/app.js" > < / script >
2014-11-26 12:39:59 +00:00
<!-- / gui application code -->
2014-01-05 22:54:57 +00:00
< / body >
< / html >