From 4256d554e359cd5ee69e3224dd5e1bd2d95e6029 Mon Sep 17 00:00:00 2001
From: Eliot Berriot <contact@eliotberriot.com>
Date: Sat, 26 Jan 2019 18:06:19 +0100
Subject: [PATCH] Fix #686: Added name attributes on all inputs to improve UX,
 especially with password managers

---
 changes/changelog.d/686.enhancement                      | 1 +
 front/src/components/admin/SettingsGroup.vue             | 5 ++++-
 front/src/components/audio/SearchBar.vue                 | 3 +--
 front/src/components/auth/Login.vue                      | 1 +
 front/src/components/auth/Signup.vue                     | 3 +++
 front/src/components/forms/PasswordInput.vue             | 1 +
 front/src/components/library/Artists.vue                 | 2 +-
 front/src/components/library/FileUpload.vue              | 2 +-
 front/src/components/library/Radios.vue                  | 2 +-
 front/src/components/library/radios/Builder.vue          | 2 +-
 front/src/components/manage/library/FilesTable.vue       | 2 +-
 front/src/components/manage/moderation/AccountsTable.vue | 2 +-
 front/src/components/manage/moderation/DomainsTable.vue  | 2 +-
 front/src/components/manage/users/InvitationForm.vue     | 2 +-
 front/src/components/manage/users/InvitationsTable.vue   | 2 +-
 front/src/components/manage/users/UsersTable.vue         | 2 +-
 front/src/components/playlists/Form.vue                  | 2 +-
 front/src/views/admin/moderation/DomainsList.vue         | 2 +-
 front/src/views/auth/EmailConfirm.vue                    | 2 +-
 front/src/views/auth/PasswordReset.vue                   | 1 +
 front/src/views/content/libraries/FilesTable.vue         | 2 +-
 front/src/views/content/libraries/Form.vue               | 2 +-
 front/src/views/content/remote/ScanForm.vue              | 2 +-
 front/src/views/playlists/List.vue                       | 2 +-
 24 files changed, 29 insertions(+), 20 deletions(-)
 create mode 100644 changes/changelog.d/686.enhancement

diff --git a/changes/changelog.d/686.enhancement b/changes/changelog.d/686.enhancement
new file mode 100644
index 00000000..c346a9ab
--- /dev/null
+++ b/changes/changelog.d/686.enhancement
@@ -0,0 +1 @@
+Added name attributes on all inputs to improve UX, especially with password managers (#686)
diff --git a/front/src/components/admin/SettingsGroup.vue b/front/src/components/admin/SettingsGroup.vue
index c732213e..85bb9eea 100644
--- a/front/src/components/admin/SettingsGroup.vue
+++ b/front/src/components/admin/SettingsGroup.vue
@@ -19,24 +19,28 @@
       </template>
       <input
         :id="setting.identifier"
+        :name="setting.identifier"
         v-if="setting.field.widget.class === 'PasswordInput'"
         type="password"
         class="ui input"
         v-model="values[setting.identifier]" />
       <input
         :id="setting.identifier"
+        :name="setting.identifier"
         v-if="setting.field.widget.class === 'TextInput'"
         type="text"
         class="ui input"
         v-model="values[setting.identifier]" />
       <input
         :id="setting.identifier"
+        :name="setting.identifier"
         v-if="setting.field.class === 'IntegerField'"
         type="number"
         class="ui input"
         v-model.number="values[setting.identifier]" />
       <textarea
         :id="setting.identifier"
+        :name="setting.identifier"
         v-else-if="setting.field.widget.class === 'Textarea'"
         type="text"
         class="ui input"
@@ -120,7 +124,6 @@ export default {
 
 <!-- Add "scoped" attribute to limit CSS to this component only -->
 <style scoped>
-
 .ui.checkbox p {
   margin-top: 1rem;
 }
diff --git a/front/src/components/audio/SearchBar.vue b/front/src/components/audio/SearchBar.vue
index 25a3b182..534ac0ac 100644
--- a/front/src/components/audio/SearchBar.vue
+++ b/front/src/components/audio/SearchBar.vue
@@ -1,7 +1,7 @@
 <template>
   <div class="ui fluid category search">
     <slot></slot><div class="ui icon input">
-      <input class="prompt" :placeholder="labels.placeholder" type="text">
+      <input class="prompt" name="search" :placeholder="labels.placeholder" type="text">
       <i class="search icon"></i>
     </div>
     <div class="results"></div>
@@ -110,5 +110,4 @@ export default {
 
 <!-- Add "scoped" attribute to limit CSS to this component only -->
 <style scoped>
-
 </style>
diff --git a/front/src/components/auth/Login.vue b/front/src/components/auth/Login.vue
index 3bfba25e..09a9c6c2 100644
--- a/front/src/components/auth/Login.vue
+++ b/front/src/components/auth/Login.vue
@@ -22,6 +22,7 @@
             ref="username"
             tabindex="1"
             required
+            name="username"
             type="text"
             autofocus
             :placeholder="labels.usernamePlaceholder"
diff --git a/front/src/components/auth/Signup.vue b/front/src/components/auth/Signup.vue
index 35bb2f6e..815f0253 100644
--- a/front/src/components/auth/Signup.vue
+++ b/front/src/components/auth/Signup.vue
@@ -20,6 +20,7 @@
             <label><translate>Username</translate></label>
             <input
             ref="username"
+            name="username"
             required
             type="text"
             autofocus
@@ -30,6 +31,7 @@
             <label><translate>Email</translate></label>
             <input
             ref="email"
+            name="email"
             required
             type="email"
             :placeholder="labels.emailPlaceholder"
@@ -44,6 +46,7 @@
             <input
             required
             type="text"
+            name="invitation"
             :placeholder="labels.placeholder"
             v-model="invitation">
           </div>
diff --git a/front/src/components/forms/PasswordInput.vue b/front/src/components/forms/PasswordInput.vue
index 377b2d3e..26454048 100644
--- a/front/src/components/forms/PasswordInput.vue
+++ b/front/src/components/forms/PasswordInput.vue
@@ -2,6 +2,7 @@
   <div class="ui action input">
     <input
     required
+    name="password"
     :tabindex="index"
     :type="passwordInputType"
     @input="$emit('input', $event.target.value)"
diff --git a/front/src/components/library/Artists.vue b/front/src/components/library/Artists.vue
index 93312ec2..ca7e2a5a 100644
--- a/front/src/components/library/Artists.vue
+++ b/front/src/components/library/Artists.vue
@@ -10,7 +10,7 @@
             <label>
               <translate>Search</translate>
             </label>
-            <input type="text" v-model="query" :placeholder="labels.searchPlaceholder"/>
+            <input type="text" name="search" v-model="query" :placeholder="labels.searchPlaceholder"/>
           </div>
           <div class="field">
             <label><translate>Ordering</translate></label>
diff --git a/front/src/components/library/FileUpload.vue b/front/src/components/library/FileUpload.vue
index 7c462851..e385384b 100644
--- a/front/src/components/library/FileUpload.vue
+++ b/front/src/components/library/FileUpload.vue
@@ -51,7 +51,7 @@
           <div class="ui four wide field">
             <label><translate>Import reference</translate></label>
             <p><translate>This reference will be used to group imported files together.</translate></p>
-            <input type="text" v-model="importReference" />
+            <input name="import-ref" type="text" v-model="importReference" />
           </div>
         </div>
 
diff --git a/front/src/components/library/Radios.vue b/front/src/components/library/Radios.vue
index 6b8051cd..7aec1d61 100644
--- a/front/src/components/library/Radios.vue
+++ b/front/src/components/library/Radios.vue
@@ -28,7 +28,7 @@
         <div class="fields">
           <div class="field">
             <label><translate>Search</translate></label>
-            <input type="text" v-model="query" :placeholder="labels.searchPlaceholder"/>
+            <input name="search" type="text" v-model="query" :placeholder="labels.searchPlaceholder"/>
           </div>
           <div class="field">
             <label><translate>Ordering</translate></label>
diff --git a/front/src/components/library/radios/Builder.vue b/front/src/components/library/radios/Builder.vue
index 0a869586..77a63b86 100644
--- a/front/src/components/library/radios/Builder.vue
+++ b/front/src/components/library/radios/Builder.vue
@@ -20,7 +20,7 @@
           <div class="">
             <div class="field">
               <label for="name"><translate>Radio name</translate></label>
-              <input id="name" type="text" v-model="radioName" :placeholder="labels.placeholder.name" />
+              <input id="name" name="name" type="text" v-model="radioName" :placeholder="labels.placeholder.name" />
             </div>
             <div class="field">
               <label for="description"><translate>Description</translate></label>
diff --git a/front/src/components/manage/library/FilesTable.vue b/front/src/components/manage/library/FilesTable.vue
index 430291a2..23f33d0f 100644
--- a/front/src/components/manage/library/FilesTable.vue
+++ b/front/src/components/manage/library/FilesTable.vue
@@ -4,7 +4,7 @@
       <div class="fields">
         <div class="ui field">
           <label><translate>Search</translate></label>
-          <input type="text" v-model="search" :placeholder="labels.searchPlaceholder" />
+          <input name="search" type="text" v-model="search" :placeholder="labels.searchPlaceholder" />
         </div>
         <div class="field">
           <label><translate>Ordering</translate></label>
diff --git a/front/src/components/manage/moderation/AccountsTable.vue b/front/src/components/manage/moderation/AccountsTable.vue
index d8050ecb..1e97ebaf 100644
--- a/front/src/components/manage/moderation/AccountsTable.vue
+++ b/front/src/components/manage/moderation/AccountsTable.vue
@@ -5,7 +5,7 @@
         <div class="ui six wide field">
           <label><translate>Search</translate></label>
           <form @submit.prevent="search.query = $refs.search.value">
-            <input ref="search" type="text" :value="search.query" :placeholder="labels.searchPlaceholder" />
+            <input name="search" ref="search" type="text" :value="search.query" :placeholder="labels.searchPlaceholder" />
           </form>
         </div>
         <div class="field">
diff --git a/front/src/components/manage/moderation/DomainsTable.vue b/front/src/components/manage/moderation/DomainsTable.vue
index 835b04db..28698ba6 100644
--- a/front/src/components/manage/moderation/DomainsTable.vue
+++ b/front/src/components/manage/moderation/DomainsTable.vue
@@ -4,7 +4,7 @@
       <div class="fields">
         <div class="ui field">
           <label><translate>Search</translate></label>
-          <input type="text" v-model="search" :placeholder="labels.searchPlaceholder" />
+          <input name="search" type="text" v-model="search" :placeholder="labels.searchPlaceholder" />
         </div>
         <div class="field">
           <label><translate>Ordering</translate></label>
diff --git a/front/src/components/manage/users/InvitationForm.vue b/front/src/components/manage/users/InvitationForm.vue
index 8ee5d052..02cfba5a 100644
--- a/front/src/components/manage/users/InvitationForm.vue
+++ b/front/src/components/manage/users/InvitationForm.vue
@@ -10,7 +10,7 @@
       <div class="inline fields">
         <div class="ui field">
           <label><translate>Invitation code</translate></label>
-          <input type="text" v-model="code" :placeholder="labels.placeholder" />
+          <input name="code" type="text" v-model="code" :placeholder="labels.placeholder" />
         </div>
         <div class="ui field">
           <button :class="['ui', {loading: isLoading}, 'button']" :disabled="isLoading" type="submit">
diff --git a/front/src/components/manage/users/InvitationsTable.vue b/front/src/components/manage/users/InvitationsTable.vue
index 2fb767ad..ee9eb503 100644
--- a/front/src/components/manage/users/InvitationsTable.vue
+++ b/front/src/components/manage/users/InvitationsTable.vue
@@ -4,7 +4,7 @@
       <div class="fields">
         <div class="ui field">
           <label><translate>Search</translate></label>
-          <input type="text" v-model="search" :placeholder="labels.searchPlaceholder" />
+          <input name="search" type="text" v-model="search" :placeholder="labels.searchPlaceholder" />
         </div>
         <div class="field">
           <label><translate>Ordering</translate></label>
diff --git a/front/src/components/manage/users/UsersTable.vue b/front/src/components/manage/users/UsersTable.vue
index f44ae89a..d76634a3 100644
--- a/front/src/components/manage/users/UsersTable.vue
+++ b/front/src/components/manage/users/UsersTable.vue
@@ -4,7 +4,7 @@
       <div class="fields">
         <div class="ui field">
           <label><translate>Search</translate></label>
-          <input type="text" v-model="search" :placeholder="labels.searchPlaceholder" />
+          <input name="search" type="text" v-model="search" :placeholder="labels.searchPlaceholder" />
         </div>
         <div class="field">
           <label><translate>Ordering</translate></label>
diff --git a/front/src/components/playlists/Form.vue b/front/src/components/playlists/Form.vue
index 34c75eb9..1fe97406 100644
--- a/front/src/components/playlists/Form.vue
+++ b/front/src/components/playlists/Form.vue
@@ -20,7 +20,7 @@
     <div class="three fields">
       <div class="field">
         <label><translate>Playlist name</translate></label>
-        <input v-model="name" required type="text" :placeholder="labels.placeholder" />
+        <input name="name" v-model="name" required type="text" :placeholder="labels.placeholder" />
       </div>
       <div class="field">
         <label><translate>Playlist visibility</translate></label>
diff --git a/front/src/views/admin/moderation/DomainsList.vue b/front/src/views/admin/moderation/DomainsList.vue
index 259d05f0..8872c2cd 100644
--- a/front/src/views/admin/moderation/DomainsList.vue
+++ b/front/src/views/admin/moderation/DomainsList.vue
@@ -12,7 +12,7 @@
         <div class="inline fields">
           <div class="field">
             <label for="domain"><translate>Add a domain</translate></label>
-            <input type="text" id="domain" v-model="domainName">
+            <input type="text" name="domain" id="domain" v-model="domainName">
           </div>
           <div class="field">
             <button :class="['ui', {'loading': isCreating}, 'green', 'button']" type="submit" :disabled="isCreating">
diff --git a/front/src/views/auth/EmailConfirm.vue b/front/src/views/auth/EmailConfirm.vue
index 6389b453..fd509272 100644
--- a/front/src/views/auth/EmailConfirm.vue
+++ b/front/src/views/auth/EmailConfirm.vue
@@ -12,7 +12,7 @@
           </div>
           <div class="field">
             <label><translate>Confirmation code</translate></label>
-            <input type="text" required v-model="key" />
+            <input name="confirmation-code" type="text" required v-model="key" />
           </div>
           <router-link :to="{path: '/login'}">
             <translate>Return to login</translate>
diff --git a/front/src/views/auth/PasswordReset.vue b/front/src/views/auth/PasswordReset.vue
index e7759113..7940c170 100644
--- a/front/src/views/auth/PasswordReset.vue
+++ b/front/src/views/auth/PasswordReset.vue
@@ -17,6 +17,7 @@
               required
               ref="email"
               type="email"
+              name="email"
               autofocus
               :placeholder="labels.placeholder"
               v-model="email">
diff --git a/front/src/views/content/libraries/FilesTable.vue b/front/src/views/content/libraries/FilesTable.vue
index 6d076193..d63ad6ce 100644
--- a/front/src/views/content/libraries/FilesTable.vue
+++ b/front/src/views/content/libraries/FilesTable.vue
@@ -5,7 +5,7 @@
         <div class="ui six wide field">
           <label><translate>Search</translate></label>
           <form @submit.prevent="search.query = $refs.search.value">
-            <input ref="search" type="text" :value="search.query" :placeholder="labels.searchPlaceholder" />
+            <input name="search" ref="search" type="text" :value="search.query" :placeholder="labels.searchPlaceholder" />
           </form>
         </div>
         <div class="field">
diff --git a/front/src/views/content/libraries/Form.vue b/front/src/views/content/libraries/Form.vue
index 96d28829..d197e4d5 100644
--- a/front/src/views/content/libraries/Form.vue
+++ b/front/src/views/content/libraries/Form.vue
@@ -9,7 +9,7 @@
     </div>
     <div class="required field">
       <label><translate>Name</translate></label>
-      <input v-model="currentName" :placeholder="labels.namePlaceholder" required maxlength="100">
+      <input name="name" v-model="currentName" :placeholder="labels.namePlaceholder" required maxlength="100">
     </div>
     <div class="field">
       <label><translate>Description</translate></label>
diff --git a/front/src/views/content/remote/ScanForm.vue b/front/src/views/content/remote/ScanForm.vue
index 44cb19cf..dc1b2b78 100644
--- a/front/src/views/content/remote/ScanForm.vue
+++ b/front/src/views/content/remote/ScanForm.vue
@@ -9,7 +9,7 @@
     <div class="ui field">
       <label><translate>Search a remote library</translate></label>
       <div :class="['ui', 'action', {loading: isLoading}, 'input']">
-        <input v-model="query" :placeholder="labels.placeholder" type="url">
+        <input name="url" v-model="query" :placeholder="labels.placeholder" type="url">
         <button type="submit" class="ui icon button">
           <i class="search icon"></i>
         </button>
diff --git a/front/src/views/playlists/List.vue b/front/src/views/playlists/List.vue
index be639530..15cc94be 100644
--- a/front/src/views/playlists/List.vue
+++ b/front/src/views/playlists/List.vue
@@ -12,7 +12,7 @@
         <div class="fields">
           <div class="field">
             <label><translate>Search</translate></label>
-            <input type="text" v-model="query" :placeholder="labels.searchPlaceholder"/>
+            <input type="text" name="search" v-model="query" :placeholder="labels.searchPlaceholder"/>
           </div>
           <div class="field">
             <label><translate>Ordering</translate></label>
-- 
GitLab