Pārlūkot izejas kodu

gui: HTML accessibility updates

GitHub-Pull-Request: https://github.com/syncthing/syncthing/pull/4258
LGTM: calmh
Jose Manuel Delicado 8 gadi atpakaļ
vecāks
revīzija
4405117bea

+ 15 - 15
cmd/strelaypoolsrv/gui/index.html

@@ -2,15 +2,15 @@
 
 <html lang="en" ng-app="syncthing" ng-controller="relayDataController">
   <head>
-    <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="">
+    <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=""/>
 
     <title>Relay stats</title>
-    <link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet">
-    <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.6.1/css/font-awesome.min.css">
+    <link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet"/>
+    <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.6.1/css/font-awesome.min.css"/>
 
     <style>
       #map {
@@ -36,9 +36,9 @@
 
   <body class="ng-cloak">
     <div class="container">
-      <h1>Relay Pool Data</h2>
+      <h1>Relay Pool Data</h1>
       <div ng-if="relays === undefined" class="text-center">
-        <img src="//cdnjs.cloudflare.com/ajax/libs/galleriffic/2.0.1/css/loader.gif"/>
+        <img src="//cdnjs.cloudflare.com/ajax/libs/galleriffic/2.0.1/css/loader.gif" alt=""/>
         <p>Please wait while we gather data</p>
       </div>
       <div>
@@ -184,10 +184,10 @@
     </div>
 
 
-    <script src="//code.jquery.com/jquery-2.1.4.min.js"></script>
-    <script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.8/angular.min.js"></script>
-    <script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
-    <script src="//maps.googleapis.com/maps/api/js"></script>
+    <script type="text/javascript" src="//code.jquery.com/jquery-2.1.4.min.js"></script>
+    <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.8/angular.min.js"></script>
+    <script type="text/javascript" src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
+    <script type="text/javascript" src="//maps.googleapis.com/maps/api/js"></script>
   </body>
 
   <script>
@@ -395,12 +395,12 @@
         <span ng-if="relay.status.options['global-rate'] != undefined">
           <span ng-if="relay.status.options['global-rate'] > 0">Global rate limit: {{ relay.status.options['global-rate'] | bytes }}/s</span>
           <span ng-if="relay.status.options['global-rate'] == 0">Global rate limit: unlimited</span>
-          </br>
+          <br/>
         </span>
         <span ng-if="relay.status.options['per-session-rate'] != undefined">
           <span ng-if="relay.status.options['per-session-rate'] > 0">Session rate limit: {{ relay.status.options['per-session-rate'] | bytes }}/s</span>
           <span ng-if="relay.status.options['per-session-rate'] == 0">Session rate limit: unlimited</span>
-          </br>
+          <br/>
         </span>
       </div>
       <div ng-if="!relay.status">

+ 47 - 47
gui/default/index.html

@@ -9,32 +9,32 @@
 -->
 <html lang="en" ng-app="syncthing" ng-controller="SyncthingController" class="ng-cloak">
 <head>
-  <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">
+  <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"/>
 
   <title ng-bind="thisDeviceName() + ' | Syncthing'"></title>
-  <link href="vendor/bootstrap/css/bootstrap.css" rel="stylesheet">
-  <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">
+  <link href="vendor/bootstrap/css/bootstrap.css" rel="stylesheet"/>
+  <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"/>
 </head>
 
 <body>
-  <script src="syncthing/development/logbar.js"></script>
+  <script type="text/javascript" src="syncthing/development/logbar.js"></script>
   <div ng-if="version.isDevelopmentVersion" ng-include="'syncthing/development/logbar.html'"></div>
   <!-- Top bar -->
 
   <nav class="navbar navbar-top navbar-default" role="navigation">
     <div class="container">
       <span class="navbar-brand" aria-hidden="true">
-        <img class="logo hidden-xs" src="assets/img/logo-horizontal.svg" height="32" width="117"/>
-        <img class="logo hidden visible-xs" src="assets/img/favicon-default.png" height="32"/>
+        <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=""/>
       </span>
       <p class="navbar-text hidden-xs" ng-class="{'hidden-sm':upgradeInfo && upgradeInfo.newer}">{{thisDeviceName()}}</p>
       <ul class="nav navbar-nav navbar-right">
@@ -721,41 +721,41 @@
   <ng-include src="'syncthing/core/discoveryFailuresModalView.html'"></ng-include>
 
   <!-- vendor scripts -->
-  <script src="vendor/jquery/jquery-2.2.2.js"></script>
-  <script src="vendor/angular/angular.js"></script>
-  <script src="vendor/angular/angular-sanitize.js"></script>
-  <script src="vendor/angular/angular-translate.js"></script>
-  <script src="vendor/angular/angular-translate-loader-static-files.js"></script>
-  <script src="vendor/angular/angular-dirPagination.js"></script>
-  <script src="vendor/bootstrap/js/bootstrap.js"></script>
+  <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>
+  <script type="text/javascript" src="vendor/bootstrap/js/bootstrap.js"></script>
   <!-- / vendor scripts -->
 
   <!-- gui application code -->
-  <script src="syncthing/core/module.js"></script>
-  <script src="syncthing/core/alwaysNumberFilter.js"></script>
-  <script src="syncthing/core/basenameFilter.js"></script>
-  <script src="syncthing/core/binaryFilter.js"></script>
-  <script src="syncthing/core/durationFilter.js"></script>
-  <script src="syncthing/core/eventService.js"></script>
-  <script src="syncthing/core/identiconDirective.js"></script>
-  <script src="syncthing/core/languageSelectDirective.js"></script>
-  <script src="syncthing/core/lastErrorComponentFilter.js"></script>
-  <script src="syncthing/core/localeService.js"></script>
-  <script src="syncthing/core/modalDirective.js"></script>
-  <script src="syncthing/core/naturalFilter.js"></script>
-  <script src="syncthing/core/metricFilter.js"></script>
-  <script src="syncthing/core/notificationDirective.js"></script>
-  <script src="syncthing/core/pathIsSubDirDirective.js"></script>
-  <script src="syncthing/core/popoverDirective.js"></script>
-  <script src="syncthing/core/selectOnClickDirective.js"></script>
-  <script src="syncthing/core/syncthingController.js"></script>
-  <script src="syncthing/core/tooltipDirective.js"></script>
-  <script src="syncthing/core/uniqueFolderDirective.js"></script>
-  <script src="syncthing/core/validDeviceidDirective.js"></script>
-  <script src="assets/lang/valid-langs.js"></script>
-  <script src="assets/lang/prettyprint.js"></script>
-  <script src="meta.js"></script>
-  <script src="syncthing/app.js"></script>
+  <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>
+  <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/naturalFilter.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>
+  <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>
   <!-- / gui application code -->
 
 </body>

+ 1 - 1
gui/default/syncthing/development/logbar.html

@@ -1,5 +1,5 @@
 <div class="dev-top-bar" id="dev-top-bar" style="display: none">
-    <link href="assets/css/dev.css" rel="stylesheet">
+    <link href="assets/css/dev.css" rel="stylesheet"/>
     <div class="row">
         <div class="col-xs-4"><b>DEV</b></div>
         <div id="log" class="col-xs-8">

+ 2 - 2
gui/default/syncthing/device/editDeviceModalView.html

@@ -4,7 +4,7 @@
       <div class="form-group" ng-class="{'has-error': deviceEditor.deviceID.$invalid && deviceEditor.deviceID.$dirty}" ng-init="loadFormIntoScope(deviceEditor)">
         <label translate for="deviceID">Device ID</label>
         <div ng-if="!editingExisting">
-          <input name="deviceID" id="deviceID" class="form-control text-monospace" type="text" ng-model="currentDevice.deviceID" required valid-deviceid list="discovery-list" />
+          <input name="deviceID" id="deviceID" class="form-control text-monospace" type="text" ng-model="currentDevice.deviceID" required="" valid-deviceid list="discovery-list" aria-required="true"/>
           <datalist id="discovery-list">
             <option ng-repeat="id in discovery" value="{{id}}" />
           </datalist>
@@ -26,7 +26,7 @@
       </div>
       <div class="form-group">
         <label translate for="name">Device Name</label>
-        <input id="name" class="form-control" type="text" ng-model="currentDevice.name"></input>
+        <input id="name" class="form-control" type="text" ng-model="currentDevice.name" />
         <p translate ng-if="currentDevice.deviceID == myID" class="help-block">Shown instead of Device ID in the cluster status. Will be advertised to other devices as an optional default name.</p>
         <p translate ng-if="currentDevice.deviceID != myID" class="help-block">Shown instead of Device ID in the cluster status. Will be updated to the name the device advertises if left empty.</p>
       </div>

+ 19 - 15
gui/default/syncthing/device/globalChangesModalView.html

@@ -2,21 +2,25 @@
 <modal id="globalChanges" status="default" icon="{{'history'}}" heading="{{'Global Changes' | translate}}" large="yes" closeable="yes">
     <div class="modal-body">
         <table>
-          <tr>
-            <th translate>Device</th>
-            <th translate>Action</th>
-            <th translate>Type</th>
-            <th translate>Path</th>
-            <th translate>Time</th>
-          </tr>
-          <tr ng-repeat="changeEvent in globalChangeEvents">
-            <td ng-if="changeEvent.data.modifiedBy">{{friendlyNameFromShort(changeEvent.data.modifiedBy)}}</td>
-            <td ng-if="!changeEvent.data.modifiedBy"><span translate>Unknown</span></td>
-            <td>{{changeEvent.data.action}}</td>
-            <td>{{changeEvent.data.type}}</td>
-            <td class="globalChanges-path-col">{{changeEvent.data.path}}</td>
-            <td class="globalChanges-time-col">{{changeEvent.time | date:"yyyy-MM-dd HH:mm:ss"}}</td>
-          </tr>
+          <thead>          
+            <tr>
+              <th translate>Device</th>
+              <th translate>Action</th>
+              <th translate>Type</th>
+              <th translate>Path</th>
+              <th translate>Time</th>
+            </tr>
+          </thead>
+          <tbody>          
+            <tr ng-repeat="changeEvent in globalChangeEvents">
+              <td ng-if="changeEvent.data.modifiedBy">{{friendlyNameFromShort(changeEvent.data.modifiedBy)}}</td>
+              <td ng-if="!changeEvent.data.modifiedBy"><span translate>Unknown</span></td>
+              <td>{{changeEvent.data.action}}</td>
+              <td>{{changeEvent.data.type}}</td>
+              <td class="globalChanges-path-col">{{changeEvent.data.path}}</td>
+              <td class="globalChanges-time-col">{{changeEvent.time | date:"yyyy-MM-dd HH:mm:ss"}}</td>
+            </tr>
+          </tbody>        
         </table>
     </div>
     <div class="modal-footer">

+ 1 - 1
gui/default/syncthing/device/idqrModalView.html

@@ -1,7 +1,7 @@
 <modal id="idqr" status="info" icon="qrcode" heading="{{'Device Identification' | translate}} - {{deviceName(currentDevice)}}" large="yes" closeable="yes">
   <div class="modal-body">
     <div class="well well-sm text-monospace text-center" select-on-click>{{currentDevice.deviceID}}</div>
-    <img ng-if="currentDevice.deviceID" class="center-block img-thumbnail" ng-src="qr/?text={{currentDevice.deviceID}}"/>
+    <img ng-if="currentDevice.deviceID" class="center-block img-thumbnail" ng-src="qr/?text={{currentDevice.deviceID}}" alt="qr code"/>
   </div>
   <div class="modal-footer">
     <button type="button" class="btn btn-default btn-sm" data-dismiss="modal">

+ 11 - 11
gui/default/syncthing/folder/editFolderModalView.html

@@ -12,7 +12,7 @@
           </div>
           <div class="form-group" ng-class="{'has-error': folderEditor.folderID.$invalid && folderEditor.folderID.$dirty}">
             <label for="folderID"><span translate>Folder ID</span></label>
-            <input name="folderID" ng-readonly="editingExisting || (!editingExisting && currentFolder.viewFlags.importFromOtherDevice)" id="folderID" class="form-control" type="text" ng-model="currentFolder.id" required unique-folder value="{{currentFolder.id}}"/>
+            <input name="folderID" ng-readonly="editingExisting || (!editingExisting && currentFolder.viewFlags.importFromOtherDevice)" id="folderID" class="form-control" type="text" ng-model="currentFolder.id" required="" aria-required="true" unique-folder value="{{currentFolder.id}}"/>
             <p class="help-block">
               <span translate ng-if="folderEditor.folderID.$valid || folderEditor.folderID.$pristine">Required identifier for the folder. Must be the same on all cluster devices.</span>
               <span translate ng-if="folderEditor.folderID.$error.uniqueFolder">The folder ID must be unique.</span>
@@ -21,7 +21,7 @@
           </div>
           <div class="form-group" ng-class="{'has-error': folderEditor.folderPath.$invalid && folderEditor.folderPath.$dirty}">
             <label translate for="folderPath">Folder Path</label>
-            <input name="folderPath" ng-readonly="editingExisting" id="folderPath" class="form-control" type="text" ng-model="currentFolder.path" list="directory-list" required path-is-sub-dir/>
+            <input name="folderPath" ng-readonly="editingExisting" id="folderPath" class="form-control" type="text" ng-model="currentFolder.path" list="directory-list" required="" aria-required="true" path-is-sub-dir/>
             <datalist id="directory-list">
               <option ng-repeat="directory in directoryList" value="{{ directory }}" />
             </datalist>
@@ -45,7 +45,7 @@
               <div class="col-md-4" ng-repeat="device in otherDevices()">
                 <div class="checkbox">
                   <label>
-                    <input type="checkbox" ng-model="currentFolder.selectedDevices[device.deviceID]"> {{deviceName(device)}}
+                    <input type="checkbox" ng-model="currentFolder.selectedDevices[device.deviceID]"/> {{deviceName(device)}}
                   </label>
                 </div>
               </div>
@@ -68,7 +68,7 @@
           <div class="col-md-6">
             <div class="form-group" ng-class="{'has-error': folderEditor.rescanIntervalS.$invalid && folderEditor.rescanIntervalS.$dirty}">
               <label for="rescanIntervalS"><span translate>Rescan Interval</span> (s)</label><br/>
-              <input name="rescanIntervalS" id="rescanIntervalS" class="form-control" type="number" ng-model="currentFolder.rescanIntervalS" required min="0">
+              <input name="rescanIntervalS" id="rescanIntervalS" class="form-control" type="number" ng-model="currentFolder.rescanIntervalS" required=""  aria-required="true" min="0"/>
               <p class="help-block">
                 <span translate ng-if="!folderEditor.rescanIntervalS.$valid && folderEditor.rescanIntervalS.$dirty">The rescan interval must be a non-negative number of seconds.</span>
               </p>
@@ -77,7 +77,7 @@
           <div class="col-md-6 form-horizontal">
             <div class="form-group" ng-class="{'has-error': folderEditor.minDiskFree.$invalid && folderEditor.minDiskFree.$dirty}">
               <label class="col-xs-12" for="minDiskFree"><span translate>Minimum Free Disk Space</span></label><br/>
-              <div class="col-xs-9"><input name="minDiskFree" id="minDiskFree" class="form-control" type="number" ng-model="currentFolder.minDiskFree.value" required min="0" step="0.01"></div>
+              <div class="col-xs-9"><input name="minDiskFree" id="minDiskFree" class="form-control" type="number" ng-model="currentFolder.minDiskFree.value" required=""  aria-required="true" min="0" step="0.01"/></div>
               <div class="col-xs-3"><select class="col-sm-3 form-control" ng-model="currentFolder.minDiskFree.unit">
                 <option value="%">%</option>
                 <option value="kB">kB</option>
@@ -106,7 +106,7 @@
             <div class="form-group">
               <div class="checkbox">
                 <label>
-                  <input type="checkbox" ng-model="currentFolder.ignorePerms"> <span translate>Ignore Permissions</span>
+                  <input type="checkbox" ng-model="currentFolder.ignorePerms"/> <span translate>Ignore Permissions</span>
                 </label>
               </div>
               <p translate class="help-block">File permission bits are ignored when looking for changes. Use on FAT file systems.</p>
@@ -140,7 +140,7 @@
               <p translate class="help-block">Files are moved to .stversions directory when replaced or deleted by Syncthing.</p>
               <label translate for="trashcanClean">Clean out after</label>
               <div class="input-group">
-                <input name="trashcanClean" id="trashcanClean" class="form-control text-right" type="number" ng-model="currentFolder.trashcanClean" required min="0">
+                <input name="trashcanClean" id="trashcanClean" class="form-control text-right" type="number" ng-model="currentFolder.trashcanClean" required="" aria-required="true" min="0"/>
                 <div class="input-group-addon" translate>days</div>
               </div>
               <p class="help-block">
@@ -152,7 +152,7 @@
             <div class="form-group" ng-if="currentFolder.fileVersioningSelector=='simple'" ng-class="{'has-error': folderEditor.simpleKeep.$invalid && folderEditor.simpleKeep.$dirty}">
               <p translate class="help-block">Files are moved to date stamped versions in a .stversions directory when replaced or deleted by Syncthing.</p>
               <label translate for="simpleKeep">Keep Versions</label>
-              <input name="simpleKeep" id="simpleKeep" class="form-control" type="number" ng-model="currentFolder.simpleKeep" required min="1">
+              <input name="simpleKeep" id="simpleKeep" class="form-control" type="number" ng-model="currentFolder.simpleKeep" required="" aria-required="true" min="1"/>
               <p class="help-block">
                 <span translate ng-if="folderEditor.simpleKeep.$valid || folderEditor.simpleKeep.$pristine">The number of old versions to keep, per file.</span>
                 <span translate ng-if="folderEditor.simpleKeep.$error.required && folderEditor.simpleKeep.$dirty">The number of versions must be a number and cannot be blank.</span>
@@ -163,7 +163,7 @@
               <p class="help-block"><span translate>Files are moved to date stamped versions in a .stversions directory when replaced or deleted by Syncthing.</span> <span translate>Versions are automatically deleted if they are older than the maximum age or exceed the number of files allowed in an interval.</span></p>
               <p translate class="help-block">The following intervals are used: for the first hour a version is kept every 30 seconds, for the first day a version is kept every hour, for the first 30 days a version is kept every day, until the maximum age a version is kept every week.</p>
               <label translate for="staggeredMaxAge">Maximum Age</label>
-              <input name="staggeredMaxAge" id="staggeredMaxAge" class="form-control" type="number" ng-model="currentFolder.staggeredMaxAge" required min="0">
+              <input name="staggeredMaxAge" id="staggeredMaxAge" class="form-control" type="number" ng-model="currentFolder.staggeredMaxAge" required=""  aria-required="true" min="0"/>
               <p class="help-block">
                 <span translate ng-if="folderEditor.staggeredMaxAge.$valid || folderEditor.staggeredMaxAge.$pristine">The maximum time to keep a version (in days, set to 0 to keep versions forever).</span>
                 <span translate ng-if="folderEditor.staggeredMaxAge.$error.required && folderEditor.staggeredMaxAge.$dirty">The maximum age must be a number and cannot be blank.</span>
@@ -172,13 +172,13 @@
             </div>
             <div class="form-group" ng-if="currentFolder.fileVersioningSelector == 'staggered'">
               <label translate for="staggeredVersionsPath">Versions Path</label>
-              <input name="staggeredVersionsPath" id="staggeredVersionsPath" class="form-control" type="text" ng-model="currentFolder.staggeredVersionsPath">
+              <input name="staggeredVersionsPath" id="staggeredVersionsPath" class="form-control" type="text" ng-model="currentFolder.staggeredVersionsPath"/>
               <p translate class="help-block">Path where versions should be stored (leave empty for the default .stversions directory in the shared folder).</p>
             </div>
             <div class="form-group" ng-if="currentFolder.fileVersioningSelector=='external'" ng-class="{'has-error': folderEditor.externalCommand.$invalid && folderEditor.externalCommand.$dirty}">
               <p translate class="help-block">An external command handles the versioning. It has to remove the file from the shared folder.</p>
               <label translate for="externalCommand">Command</label>
-              <input name="externalCommand" id="externalCommand" class="form-control" type="text" ng-model="currentFolder.externalCommand" required>
+              <input name="externalCommand" id="externalCommand" class="form-control" type="text" ng-model="currentFolder.externalCommand" required="" aria-required="true" />
               <p class="help-block">
                 <span translate ng-if="folderEditor.externalCommand.$valid || folderEditor.externalCommand.$pristine">The first command line parameter is the folder path and the second parameter is the relative path in the folder.</span>
                 <span translate ng-if="folderEditor.externalCommand.$error.required && folderEditor.externalCommand.$dirty">The path cannot be blank.</span>

+ 16 - 16
gui/default/syncthing/settings/settingsModalView.html

@@ -6,18 +6,18 @@
         <div class="col-md-6">
           <div class="form-group">
             <label translate for="DeviceName">Device Name</label>
-            <input id="DeviceName" class="form-control" type="text" ng-model="tmpOptions.deviceName">
+            <input id="DeviceName" class="form-control" type="text" ng-model="tmpOptions.deviceName"/>
           </div>
 
           <div class="form-group">
             <label translate for="ListenAddressesStr">Sync Protocol Listen Addresses</label>&emsp;<a href="https://docs.syncthing.net/users/config.html#listen-addresses" target="_blank"><span class="fa fa-fw fa-book"></span>&nbsp;<span translate>Help</span></a>
 
-            <input id="ListenAddressesStr" class="form-control" type="text" ng-model="tmpOptions._listenAddressesStr">
+            <input id="ListenAddressesStr" class="form-control" type="text" ng-model="tmpOptions._listenAddressesStr"/>
           </div>
 
           <div class="form-group" ng-class="{'has-error': settingsEditor.MaxRecvKbps.$invalid && settingsEditor.MaxRecvKbps.$dirty}">
             <label translate for="MaxRecvKbps">Incoming Rate Limit (KiB/s)</label>
-            <input id="MaxRecvKbps" name="MaxRecvKbps" class="form-control" type="number" ng-model="tmpOptions.maxRecvKbps" min="0">
+            <input id="MaxRecvKbps" name="MaxRecvKbps" class="form-control" type="number" ng-model="tmpOptions.maxRecvKbps" min="0"/>
             <p class="help-block">
               <span translate ng-if="settingsEditor.MaxRecvKbps.$error.min && settingsEditor.MaxRecvKbps.$dirty">The rate limit must be a non-negative number (0: no limit)</span>
             </p>
@@ -25,7 +25,7 @@
 
           <div class="form-group" ng-class="{'has-error': settingsEditor.MaxSendKbps.$invalid && settingsEditor.MaxSendKbps.$dirty}">
             <label translate for="MaxSendKbps">Outgoing Rate Limit (KiB/s)</label>
-            <input id="MaxSendKbps" name="MaxSendKbps" class="form-control" type="number" ng-model="tmpOptions.maxSendKbps" min="0">
+            <input id="MaxSendKbps" name="MaxSendKbps" class="form-control" type="number" ng-model="tmpOptions.maxSendKbps" min="0"/>
             <p class="help-block">
               <span translate ng-if="settingsEditor.MaxSendKbps.$error.min && settingsEditor.MaxSendKbps.$dirty">The rate limit must be a non-negative number (0: no limit)</span>
             </p>
@@ -36,7 +36,7 @@
               <div class="form-group">
                 <div class="checkbox">
                   <label>
-                    <input id="NATEnabled" type="checkbox" ng-model="tmpOptions.natEnabled"> <span translate>Enable NAT traversal</span>
+                    <input id="NATEnabled" type="checkbox" ng-model="tmpOptions.natEnabled"/> <span translate>Enable NAT traversal</span>
                   </label>
                 </div>
               </div>
@@ -45,7 +45,7 @@
               <div class="form-group">
                 <div class="checkbox">
                   <label>
-                    <input id="LocalAnnEnabled" type="checkbox" ng-model="tmpOptions.localAnnounceEnabled"> <span translate>Local Discovery</span>
+                    <input id="LocalAnnEnabled" type="checkbox" ng-model="tmpOptions.localAnnounceEnabled"/> <span translate>Local Discovery</span>
                   </label>
                 </div>
               </div>
@@ -57,7 +57,7 @@
               <div class="form-group">
                 <div class="checkbox">
                   <label>
-                    <input id="GlobalAnnEnabled" type="checkbox" ng-model="tmpOptions.globalAnnounceEnabled"> <span translate>Global Discovery</span>
+                    <input id="GlobalAnnEnabled" type="checkbox" ng-model="tmpOptions.globalAnnounceEnabled"/> <span translate>Global Discovery</span>
                   </label>
                 </div>
               </div>
@@ -66,7 +66,7 @@
               <div class="form-group">
                 <div class="checkbox">
                   <label>
-                    <input id="RelaysEnabled" type="checkbox" ng-model="tmpOptions.relaysEnabled"> <span translate>Enable Relaying</span>
+                    <input id="RelaysEnabled" type="checkbox" ng-model="tmpOptions.relaysEnabled"/> <span translate>Enable Relaying</span>
                   </label>
                 </div>
               </div>
@@ -76,13 +76,13 @@
           <div class="clearfix"></div>
           <div class="form-group">
             <label translate for="GlobalAnnServersStr">Global Discovery Servers</label>
-            <input ng-disabled="!tmpOptions.globalAnnounceEnabled" id="GlobalAnnServersStr" class="form-control" type="text" ng-model="tmpOptions._globalAnnounceServersStr">
+            <input ng-disabled="!tmpOptions.globalAnnounceEnabled" id="GlobalAnnServersStr" class="form-control" type="text" ng-model="tmpOptions._globalAnnounceServersStr"/>
           </div>
 
           <div class="form-horizontal">
             <div class="form-group" ng-class="{'has-error': settingsEditor.minHomeDiskFree.$invalid && settingsEditor.minHomeDiskFree.$dirty}">
               <label class="col-xs-12" for="minHomeDiskFree"><span translate>Minimum Free Disk Space</span></label><br/>
-              <div class="col-xs-9"><input name="minHomeDiskFree" id="minHomeDiskFree" class="form-control" type="number" ng-model="tmpOptions.minHomeDiskFree.value" required min="0" step="0.01"></div>
+              <div class="col-xs-9"><input name="minHomeDiskFree" id="minHomeDiskFree" class="form-control" type="number" ng-model="tmpOptions.minHomeDiskFree.value" required=""  aria-required="true" min="0" step="0.01"/></div>
               <div class="col-xs-3"><select class="col-sm-3 form-control" ng-model="tmpOptions.minHomeDiskFree.unit">
                 <option value="%">%</option>
                 <option value="kB">kB</option>
@@ -102,30 +102,30 @@
         <div class="col-md-6">
           <div class="form-group"  ng-class="{'has-error': settingsEditor.Address.$invalid && settingsEditor.Address.$dirty}">
             <label translate for="Address">GUI Listen Address</label>&emsp;<a href="https://docs.syncthing.net/users/guilisten.html" target="_blank"><span class="fa fa-fw fa-book"></span>&nbsp;<span translate>Help</span></a>
-            <input id="Address" name="Address" class="form-control" type="text" ng-model="tmpGUI.address" ng-pattern="/.*:0*((102[4-9])|(10[3-9][0-9])|(1[1-9][0-9][0-9])|([2-9][0-9][0-9][0-9])|([1-6]\d{4}))$/">
+            <input id="Address" name="Address" class="form-control" type="text" ng-model="tmpGUI.address" ng-pattern="/.*:0*((102[4-9])|(10[3-9][0-9])|(1[1-9][0-9][0-9])|([2-9][0-9][0-9][0-9])|([1-6]\d{4}))$/"/>
               <p class="help-block" ng-show="settingsEditor.Address.$invalid" translate>
                 Enter a non-privileged port number (1024 - 65535).
               </p>
           </div>
           <div class="form-group">
             <label translate for="User">GUI Authentication User</label>
-            <input id="User" class="form-control" type="text" ng-model="tmpGUI.user">
+            <input id="User" class="form-control" type="text" ng-model="tmpGUI.user"/>
           </div>
           <div class="form-group">
             <label translate for="Password">GUI Authentication Password</label>
-            <input id="Password" class="form-control" type="password" ng-model="tmpGUI.password" ng-trim="false">
+            <input id="Password" class="form-control" type="password" ng-model="tmpGUI.password" ng-trim="false"/>
           </div>
           <div class="form-group">
             <div class="checkbox">
               <label>
-                <input id="UseTLS" type="checkbox" ng-model="tmpGUI.useTLS"> <span translate>Use HTTPS for GUI</span>
+                <input id="UseTLS" type="checkbox" ng-model="tmpGUI.useTLS"/> <span translate>Use HTTPS for GUI</span>
               </label>
             </div>
           </div>
           <div class="form-group">
             <div class="checkbox">
               <label>
-                <input id="StartBrowser" type="checkbox" ng-model="tmpOptions.startBrowser"> <span translate>Start Browser</span>
+                <input id="StartBrowser" type="checkbox" ng-model="tmpOptions.startBrowser"/> <span translate>Start Browser</span>
               </label>
             </div>
           </div>
@@ -141,7 +141,7 @@
           <div class="form-group">
             <div class="checkbox" ng-if="tmpOptions.upgrades != 'candidate'">
               <label>
-                <input id="UREnabled" type="checkbox" ng-model="tmpOptions.urEnabled"> <span translate>Anonymous Usage Reporting</span> (<a href="" translate data-toggle="modal" data-target="#urPreview">Preview</a>)
+                <input id="UREnabled" type="checkbox" ng-model="tmpOptions.urEnabled"/> <span translate>Anonymous Usage Reporting</span> (<a href="" translate data-toggle="modal" data-target="#urPreview">Preview</a>)
               </label>
             </div>
             <p class="help-block" ng-if="tmpOptions.upgrades == 'candidate'">

+ 1 - 1
gui/default/syncthing/transfer/failedFilesModalView.html

@@ -14,7 +14,7 @@
     <ul class="pagination pull-right">
       <li ng-repeat="option in [10, 25, 50]" ng-class="{ active: failedPageSize == option }">
         <a href="#" ng-click="failedChangePageSize(option)">{{option}}</a>
-      <li>
+      </li>
     </ul>
     <div class="clearfix"></div>
   </div>

+ 1 - 1
gui/default/syncthing/transfer/neededFilesModalView.html

@@ -60,7 +60,7 @@
     <ul class="pagination pull-right">
       <li ng-repeat="option in [10, 25, 50]" ng-class="{ active: neededPageSize == option }">
         <a href="#" ng-click="neededChangePageSize(option)">{{option}}</a>
-      <li>
+      </li>
     </ul>
     <div class="clearfix"></div>
   </div>