Split settings in several sub views. easier to understand that save is needed, ref #796

This commit is contained in:
emeric
2026-06-02 23:24:44 +02:00
parent 5b4eb8db8b
commit 578b869096
34 changed files with 1904 additions and 1069 deletions
+10 -1
View File
@@ -58,7 +58,16 @@
</a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="navbarDropdown">
<li class="dropdown-header">${username}</li>
<li>${settings class="dropdown-item"}</li>
<li>${settings-ui class="dropdown-item"}</li>
<li>${settings-audio class="dropdown-item"}</li>
${<if-has-subsonic-api-menu>}
<li>${settings-subsonic class="dropdown-item"}</li>
${</if-has-subsonic-api-menu>}
<li>${settings-services class="dropdown-item"}</li>
${<if-has-change-password-menu>}
<li>${settings-password class="dropdown-item"}</li>
${</if-has-change-password-menu>}
<li class="dropdown-divider"></li>
<li>${logout class="dropdown-item"}</li>
</ul>
</li>
+5 -1
View File
@@ -354,7 +354,11 @@
<message id="Lms.Settings.enable-transcoding-by-default">Enable transcoding by default</message>
<message id="Lms.Settings.feedback">Feedback</message>
<message id="Lms.Settings.inline-artist-relationships">Types of artist relationships to display</message>
<message id="Lms.Settings.menu-settings"><i class="fa fa-fw fa-cog" aria-hidden="true"></i> Settings</message>
<message id="Lms.Settings.menu-ui"><i class="fa fa-fw fa-paint-brush" aria-hidden="true"></i> User Interface</message>
<message id="Lms.Settings.menu-audio"><i class="fa fa-fw fa-music" aria-hidden="true"></i> Audio</message>
<message id="Lms.Settings.menu-subsonic"><i class="fa fa-fw fa-key" aria-hidden="true"></i> Subsonic API</message>
<message id="Lms.Settings.menu-services"><i class="fa fa-fw fa-exchange" aria-hidden="true"></i> Services</message>
<message id="Lms.Settings.menu-password"><i class="fa fa-fw fa-lock" aria-hidden="true"></i> Change password</message>
<message id="Lms.Settings.name">Album Name</message>
<message id="Lms.Settings.original-date-asc">Original Release Date (Ascending)</message>
<message id="Lms.Settings.original-date-desc">Original Release Date (Descending)</message>
+5 -1
View File
@@ -354,7 +354,11 @@
<message id="Lms.Settings.enable-transcoding-by-default">Activar por defecto la transcodificación</message>
<message id="Lms.Settings.feedback">Feedback</message>
<message id="Lms.Settings.inline-artist-relationships">Tipos de relaciones entre artistas a mostrar</message>
<message id="Lms.Settings.menu-settings"><i class="fa fa-fw fa-cog" aria-hidden="true"></i> Ajustes</message>
<message id="Lms.Settings.menu-ui"><i class="fa fa-fw fa-paint-brush" aria-hidden="true"></i> Interfaz de usuario</message>
<message id="Lms.Settings.menu-audio"><i class="fa fa-fw fa-music" aria-hidden="true"></i> Audio</message>
<message id="Lms.Settings.menu-subsonic"><i class="fa fa-fw fa-key" aria-hidden="true"></i> API Subsonic</message>
<message id="Lms.Settings.menu-services"><i class="fa fa-fw fa-exchange" aria-hidden="true"></i> Servicios</message>
<message id="Lms.Settings.menu-password"><i class="fa fa-fw fa-lock" aria-hidden="true"></i> Cambiar contraseña</message>
<message id="Lms.Settings.name">Nombre del álbum</message>
<message id="Lms.Settings.original-date-asc">Fecha de publicación original (Ascendiente)</message>
<message id="Lms.Settings.original-date-desc">Fecha de publicación original (Descendiente)</message>
+5 -1
View File
@@ -354,7 +354,11 @@
<message id="Lms.Settings.enable-transcoding-by-default">Activer par défaut le transcodage</message>
<message id="Lms.Settings.feedback">Feedback</message>
<message id="Lms.Settings.inline-artist-relationships">Types de relations d'artiste à afficher</message>
<message id="Lms.Settings.menu-settings"><i class="fa fa-fw fa-cog" aria-hidden="true"></i> Paramètres</message>
<message id="Lms.Settings.menu-ui"><i class="fa fa-fw fa-paint-brush" aria-hidden="true"></i> Interface utilisateur</message>
<message id="Lms.Settings.menu-audio"><i class="fa fa-fw fa-music" aria-hidden="true"></i> Audio</message>
<message id="Lms.Settings.menu-subsonic"><i class="fa fa-fw fa-key" aria-hidden="true"></i> API Subsonic</message>
<message id="Lms.Settings.menu-services"><i class="fa fa-fw fa-exchange" aria-hidden="true"></i> Services</message>
<message id="Lms.Settings.menu-password"><i class="fa fa-fw fa-lock" aria-hidden="true"></i> Changement de mot de passe</message>
<message id="Lms.Settings.name">Nom de l'album</message>
<message id="Lms.Settings.original-date-asc">Date de sortie originale (Croissant)</message>
<message id="Lms.Settings.original-date-desc">Date de sortie originale (Décroissant)</message>
+5 -1
View File
@@ -354,7 +354,11 @@
<message id="Lms.Settings.enable-transcoding-by-default">Abilita transcodifica di default</message>
<message id="Lms.Settings.feedback">Feedback</message>
<message id="Lms.Settings.inline-artist-relationships">Tipi di relazioni artistiche da visualizzare</message>
<message id="Lms.Settings.menu-settings"><i class="fa fa-fw fa-cog" aria-hidden="true"></i> Impostazioni</message>
<message id="Lms.Settings.menu-ui"><i class="fa fa-fw fa-paint-brush" aria-hidden="true"></i> Interfaccia utente</message>
<message id="Lms.Settings.menu-audio"><i class="fa fa-fw fa-music" aria-hidden="true"></i> Audio</message>
<message id="Lms.Settings.menu-subsonic"><i class="fa fa-fw fa-key" aria-hidden="true"></i> API Subsonic</message>
<message id="Lms.Settings.menu-services"><i class="fa fa-fw fa-exchange" aria-hidden="true"></i> Servizi</message>
<message id="Lms.Settings.menu-password"><i class="fa fa-fw fa-lock" aria-hidden="true"></i> Cambia password</message>
<message id="Lms.Settings.name">Nome dell'album</message>
<message id="Lms.Settings.original-date-asc">Data di uscita originale (Crescente)</message>
<message id="Lms.Settings.original-date-desc">Data di uscita originale (Decrescente)</message>
+5 -1
View File
@@ -380,7 +380,11 @@
<message id="Lms.Settings.enable-transcoding-by-default">Aktywuj domyślnie transkodowanie</message>
<message id="Lms.Settings.feedback">Feedback</message>
<message id="Lms.Settings.inline-artist-relationships">Typy powiązań artystów do wyświetlenia</message>
<message id="Lms.Settings.menu-settings"><i class="fa fa-fw fa-cog" aria-hidden="true"></i> Ustawienia</message>
<message id="Lms.Settings.menu-ui"><i class="fa fa-fw fa-paint-brush" aria-hidden="true"></i> Interfejs użytkownika</message>
<message id="Lms.Settings.menu-audio"><i class="fa fa-fw fa-music" aria-hidden="true"></i> Dźwięk</message>
<message id="Lms.Settings.menu-subsonic"><i class="fa fa-fw fa-key" aria-hidden="true"></i> API Subsonic</message>
<message id="Lms.Settings.menu-services"><i class="fa fa-fw fa-exchange" aria-hidden="true"></i> Usługi</message>
<message id="Lms.Settings.menu-password"><i class="fa fa-fw fa-lock" aria-hidden="true"></i> Zmień hasło</message>
<message id="Lms.Settings.name">Nazwa albumu</message>
<message id="Lms.Settings.original-date-asc">Oryginalna data wydania (Rosnąco)</message>
<message id="Lms.Settings.original-date-desc">Oryginalna data wydania (Malejąco)</message>
+5 -1
View File
@@ -325,7 +325,11 @@
<message id="Lms.Settings.enable-transcoding-by-default">默认启用转码</message>
<message id="Lms.Settings.feedback">反馈</message>
<message id="Lms.Settings.inline-artist-relationships">要显示的艺术家关系类型</message>
<message id="Lms.Settings.menu-settings"><i class="fa fa-fw fa-cog" aria-hidden="true"></i> 设置</message>
<message id="Lms.Settings.menu-ui"><i class="fa fa-fw fa-paint-brush" aria-hidden="true"></i> 用户界面</message>
<message id="Lms.Settings.menu-audio"><i class="fa fa-fw fa-music" aria-hidden="true"></i> 音频</message>
<message id="Lms.Settings.menu-subsonic"><i class="fa fa-fw fa-key" aria-hidden="true"></i> Subsonic 应用程序接口</message>
<message id="Lms.Settings.menu-services"><i class="fa fa-fw fa-exchange" aria-hidden="true"></i> 服务</message>
<message id="Lms.Settings.menu-password"><i class="fa fa-fw fa-lock" aria-hidden="true"></i> 更改密码</message>
<message id="Lms.Settings.name">专辑名称</message>
<message id="Lms.Settings.original-date-asc">原始发行日期(升序)</message>
<message id="Lms.Settings.original-date-desc">原始发行日期(降序)</message>
+79
View File
@@ -0,0 +1,79 @@
<?xml version="1.0" encoding="UTF-8" ?>
<messages xmlns:if="Wt.WTemplate.conditions">
<message id="Lms.Settings.audio.template">
<form class="row g-3">
<legend>${tr:Lms.Settings.audio}
<button type="button" class="btn btn-sm p-0" data-bs-toggle="tooltip" data-bs-placement="right" title="${tr:Lms.Settings.audio-settings-are-local}">
<i class="fa fa-fw fa-info-circle" aria-hidden="true"></i>
</button>
</legend>
<div class="col-lg-4">
<label class="form-label" for="${id:transcoding-mode}">
${tr:Lms.Settings.transcoding-mode}
</label>
${transcoding-mode class="form-control"}
<div class="invalid-feedback">
${transcoding-mode-info}
</div>
</div>
<div class="col-lg-4">
<label class="form-label" for="${id:transcoding-output-format}">
${tr:Lms.Settings.transcoding-output-format}
</label>
${transcoding-output-format class="form-control"}
<div class="invalid-feedback">
${transcoding-output-format-info}
</div>
</div>
<div class="col-lg-4">
<label class="form-label" for="${id:transcoding-output-bitrate}">
${tr:Lms.Settings.transcoding-output-bitrate}
</label>
<div class="input-group mb-3">
${transcoding-output-bitrate class="form-control"}
<span class="input-group-text">kbps</span>
</div>
<div class="invalid-feedback">
${transcoding-output-bitrate-info}
</div>
</div>
<div class="col-lg-4">
<label class="form-label" for="${id:replaygain-mode}">
${tr:Lms.Settings.replaygain-mode}
</label>
${replaygain-mode class="form-control"}
<div class="invalid-feedback">
${replaygain-mode-info}
</div>
</div>
<div class="col-lg-4">
<label class="form-label" for="${id:replaygain-preamp}">
${tr:Lms.Settings.replaygain-preamp}
</label>
<div class="input-group mb-3">
${replaygain-preamp class="form-control"}
<span class="input-group-text">dB</span>
<div class="invalid-feedback">
${replaygain-preamp-info}
</div>
</div>
</div>
<div class="col-lg-4">
<label class="form-label" for="${id:replaygain-preamp-no-rg-info}">
${tr:Lms.Settings.replaygain-preamp-no-rg-info}
</label>
<div class="input-group mb-3">
${replaygain-preamp-no-rg-info class="form-control"}
<span class="input-group-text">dB</span>
<div class="invalid-feedback">
${replaygain-preamp-no-rg-info-info}
</div>
</div>
</div>
</form>
<hr/>
${save-btn class="btn btn-primary me-1"}${discard-btn class="btn btn-secondary"}
</message>
</messages>
+41
View File
@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8" ?>
<messages xmlns:if="Wt.WTemplate.conditions">
<message id="Lms.Settings.password.template">
<form class="row g-3">
<legend>${tr:Lms.Settings.change-password}</legend>
${<if-has-old-password>}
<div class="col-12">
<label class="form-label" for="${id:password-old}">
${tr:Lms.password-old}
</label>
${password-old class="form-control"}
<div class="invalid-feedback">
${password-old-info class="help-block"}
</div>
</div>
${</if-has-old-password>}
<div class="col-lg-6">
<label class="form-label" for="${id:password}">
${tr:Lms.password-new}
</label>
${password class="form-control"}
<div class="invalid-feedback">
${password-info class="help-block"}
</div>
</div>
<div class="col-lg-6">
<label class="form-label" for="${id:password-confirm}">
${tr:Lms.password-confirm}
</label>
${password-confirm class="form-control"}
<div class="invalid-feedback">
${password-confirm-info class="help-block"}
</div>
</div>
</form>
<hr/>
${save-btn class="btn btn-primary me-1"}${discard-btn class="btn btn-secondary"}
</message>
</messages>
+42
View File
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8" ?>
<messages xmlns:if="Wt.WTemplate.conditions">
<message id="Lms.Settings.services.template">
<form class="row g-3">
<legend>${tr:Lms.Settings.services}</legend>
<div class="col-lg-6">
<label class="form-label" for="${id:scrobbling-backend}">
${tr:Lms.Settings.scrobbling}
</label>
${scrobbling-backend class="form-control"}
<div class="invalid-feedback">
${scrobbling-backend-info class="help-block"}
</div>
</div>
<div class="col-lg-6">
<label class="form-label" for="${id:feedback-backend}">
${tr:Lms.Settings.feedback}
</label>
${feedback-backend class="form-control"}
<div class="invalid-feedback">
${feedback-backend-info class="help-block"}
</div>
</div>
<div class="col-lg-12">
<label class="form-label" for="${id:listenbrainz-token}">
${tr:Lms.Settings.backend.listenbrainz-token}
</label>
<div class="input-group mb-3">
${listenbrainz-token class="form-control"}
${listenbrainz-token-visibility-btn class="btn btn-outline-secondary"}
<div class="invalid-feedback">
${listenbrainz-token-info class="help-block"}
</div>
</div>
</div>
</form>
<hr/>
${save-btn class="btn btn-primary me-1"}${discard-btn class="btn btn-secondary"}
</message>
</messages>
+72
View File
@@ -0,0 +1,72 @@
<?xml version="1.0" encoding="UTF-8" ?>
<messages xmlns:if="Wt.WTemplate.conditions">
<message id="Lms.Settings.subsonic.template">
<form class="row g-3">
<legend>${tr:Lms.Settings.subsonic-api}</legend>
<div class="col-lg-12">
<label class="form-label" for="${id:subsonic-token}">
${tr:Lms.Settings.subsonic-token}
${<if-has-subsonic-token-usage>}
<button type="button" class="btn btn-sm p-0" data-bs-toggle="tooltip" data-bs-placement="right" title="${tr:Lms.Settings.subsonic-token-usage}">
<i class="fa fa-fw fa-info-circle" aria-hidden="true"></i>
</button>
${</if-has-subsonic-token-usage>}
</label>
<div class="input-group mb-3">
${subsonic-token-regen-btn class="btn btn-outline-secondary"}
${subsonic-token-del-btn class="btn btn-outline-warning"}
${subsonic-token class="form-control"}
${subsonic-token-visibility-btn class="btn btn-outline-secondary"}
<div class="invalid-feedback">
${subsonic-token-info class="help-block"}
</div>
</div>
</div>
<div class="col-12">
<div class="form-check">
${subsonic-enable-transcoding-by-default class="form-check-input"}
<label class="form-check-label" for="${id:subsonic-enable-transcoding-by-default}">
${tr:Lms.Settings.enable-transcoding-by-default}
</label>
<div class="invalid-feedback">
${subsonic-enable-transcoding-by-default-info}
</div>
</div>
</div>
<div class="col-lg-6">
<label class="form-label" for="${id:subsonic-transcoding-output-format}">
${tr:Lms.Settings.default-transcoding-output-format}
</label>
${subsonic-transcoding-output-format class="form-control"}
<div class="invalid-feedback">
${subsonic-transcoding-output-format-info class="help-block"}
</div>
</div>
<div class="col-lg-6">
<label class="form-label" for="${id:subsonic-transcoding-output-bitrate}">
${tr:Lms.Settings.default-transcoding-output-bitrate}
</label>
<div class="input-group mb-3">
${subsonic-transcoding-output-bitrate class="form-control"}
<span class="input-group-text">kbps</span>
</div>
<div class="invalid-feedback">
${subsonic-transcoding-output-bitrate-info class="help-block"}
</div>
</div>
<div class="col-12">
<label class="form-label" for="${id:subsonic-artist-list-mode}">
${tr:Lms.Settings.subsonic-artist-list-mode}
</label>
${subsonic-artist-list-mode class="form-control"}
<div class="invalid-feedback">
${subsonic-artist-list-mode-info class="help-block"}
</div>
</div>
</form>
<hr/>
${save-btn class="btn btn-primary me-1"}${discard-btn class="btn btn-secondary"}
</message>
</messages>
+41
View File
@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8" ?>
<messages xmlns:if="Wt.WTemplate.conditions">
<message id="Lms.Settings.ui.template">
<form class="row g-3">
<legend>${tr:Lms.Settings.user-interface}</legend>
<div class="col-12">
<label class="form-label" for="${id:artist-release-sort-method}">
${tr:Lms.Settings.artist-release-sort-method}
</label>
${artist-release-sort-method class="form-control"}
<div class="invalid-feedback">
${artist-release-sort-method-info}
</div>
</div>
<div class="col-12">
<div class="form-check">
${enable-inline-artist-relationships class="form-check-input"}
<label class="form-check-label" for="${id:enable-inline-artist-relationships}">
${tr:Lms.Settings.enable-inline-artist-relationships}
</label>
<div class="invalid-feedback">
${enable-inline-artist-relationships}
</div>
</div>
</div>
<div class="col-12">
<label class="form-label" for="${id:inline-artist-relationships}">
${tr:Lms.Settings.inline-artist-relationships}
</label>
${inline-artist-relationships class="form-control"}
<div class="invalid-feedback">
${inline-artist-relationships-info}
</div>
</div>
</form>
<hr/>
${save-btn class="btn btn-primary me-1"}${discard-btn class="btn btn-secondary"}
</message>
</messages>
-237
View File
@@ -1,237 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<messages xmlns:if="Wt.WTemplate.conditions">
<!--FORMS message blocks-->
<message id="Lms.Settings.template">
<form class="row g-3">
<legend>${tr:Lms.Settings.user-interface}</legend>
<div class="col-12">
<label class="form-label" for="${id:artist-release-sort-method}">
${tr:Lms.Settings.artist-release-sort-method}
</label>
${artist-release-sort-method class="form-control"}
<div class="invalid-feedback">
${artist-release-sort-method-info}
</div>
</div>
<div class="col-12">
<div class="form-check">
${enable-inline-artist-relationships class="form-check-input"}
<label class="form-check-label" for="${id:enable-inline-artist-relationships}">
${tr:Lms.Settings.enable-inline-artist-relationships}
</label>
<div class="invalid-feedback">
${enable-inline-artist-relationships}
</div>
</div>
</div>
<div class="col-12">
<label class="form-label" for="${id:inline-artist-relationships}">
${tr:Lms.Settings.inline-artist-relationships}
</label>
${inline-artist-relationships class="form-control"}
<div class="invalid-feedback">
${inline-artist-relationships-info}
</div>
</div>
<legend>${tr:Lms.Settings.audio}
<button type="button" class="btn btn-sm p-0" data-bs-toggle="tooltip" data-bs-placement="right" title="${tr:Lms.Settings.audio-settings-are-local}">
<i class="fa fa-fw fa-info-circle" aria-hidden="true"></i>
</button>
</legend>
<div class="col-lg-4">
<label class="form-label" for="${id:transcoding-mode}">
${tr:Lms.Settings.transcoding-mode}
</label>
${transcoding-mode class="form-control"}
<div class="invalid-feedback">
${transcoding-mode-info}
</div>
</div>
<div class="col-lg-4">
<label class="form-label" for="${id:transcoding-output-format}">
${tr:Lms.Settings.transcoding-output-format}
</label>
${transcoding-output-format class="form-control"}
<div class="invalid-feedback">
${transcoding-output-format-info}
</div>
</div>
<div class="col-lg-4">
<label class="form-label" for="${id:transcoding-output-bitrate}">
${tr:Lms.Settings.transcoding-output-bitrate}
</label>
<div class="input-group mb-3">
${transcoding-output-bitrate class="form-control"}
<span class="input-group-text">kbps</span>
</div>
<div class="invalid-feedback">
${transcoding-output-bitrate-info}
</div>
</div>
<div class="col-lg-4">
<label class="form-label" for="${id:replaygain-mode}">
${tr:Lms.Settings.replaygain-mode}
</label>
${replaygain-mode class="form-control"}
<div class="invalid-feedback">
${replaygain-mode-info}
</div>
</div>
<div class="col-lg-4">
<label class="form-label" for="${id:replaygain-preamp}">
${tr:Lms.Settings.replaygain-preamp}
</label>
<div class="input-group mb-3">
${replaygain-preamp class="form-control"}
<span class="input-group-text">dB</span>
<div class="invalid-feedback">
${replaygain-preamp-info}
</div>
</div>
</div>
<div class="col-lg-4">
<label class="form-label" for="${id:replaygain-preamp-no-rg-info}">
${tr:Lms.Settings.replaygain-preamp-no-rg-info}
</label>
<div class="input-group mb-3">
${replaygain-preamp-no-rg-info class="form-control"}
<span class="input-group-text">dB</span>
<div class="invalid-feedback">
${replaygain-preamp-no-rg-info-info}
</div>
</div>
</div>
${<if-has-subsonic-api>}
<legend>${tr:Lms.Settings.subsonic-api}</legend>
<div class="col-lg-12">
<label class="form-label" for="${id:subsonic-token}">
${tr:Lms.Settings.subsonic-token}
${<if-has-subsonic-token-usage>}
<button type="button" class="btn btn-sm p-0" data-bs-toggle="tooltip" data-bs-placement="right" title="${tr:Lms.Settings.subsonic-token-usage}">
<i class="fa fa-fw fa-info-circle" aria-hidden="true"></i>
</button>
${</if-has-subsonic-token-usage>}
</label>
<div class="input-group mb-3">
${subsonic-token-regen-btn class="btn btn-outline-secondary"}
${subsonic-token-del-btn class="btn btn-outline-warning"}
${subsonic-token class="form-control"}
${subsonic-token-visibility-btn class="btn btn-outline-secondary"}
<div class="invalid-feedback">
${subsonic-token-info class="help-block"}
</div>
</div>
</div>
<div class="col-12">
<div class="form-check">
${subsonic-enable-transcoding-by-default class="form-check-input"}
<label class="form-check-label" for="${id:subsonic-enable-transcoding-by-default}">
${tr:Lms.Settings.enable-transcoding-by-default}
</label>
<div class="invalid-feedback">
${subsonic-enable-transcoding-by-default-info}
</div>
</div>
</div>
<div class="col-lg-6">
<label class="form-label" for="${id:subsonic-transcoding-output-format}">
${tr:Lms.Settings.default-transcoding-output-format}
</label>
${subsonic-transcoding-output-format class="form-control"}
<div class="invalid-feedback">
${subsonic-transcoding-output-format-info class="help-block"}
</div>
</div>
<div class="col-lg-6">
<label class="form-label" for="${id:subsonic-transcoding-output-bitrate}">
${tr:Lms.Settings.default-transcoding-output-bitrate}
</label>
<div class="input-group mb-3">
${subsonic-transcoding-output-bitrate class="form-control"}
<span class="input-group-text">kbps</span>
</div>
<div class="invalid-feedback">
${subsonic-transcoding-output-bitrate-info class="help-block"}
</div>
</div>
<div class="col-12">
<label class="form-label" for="${id:subsonic-artist-list-mode}">
${tr:Lms.Settings.subsonic-artist-list-mode}
</label>
${subsonic-artist-list-mode class="form-control"}
<div class="invalid-feedback">
${subsonic-artist-list-mode-info class="help-block"}
</div>
</div>
${</if-has-subsonic-api>}
<legend>${tr:Lms.Settings.services}</legend>
<div class="col-lg-6">
<label class="form-label" for="${id:scrobbling-backend}">
${tr:Lms.Settings.scrobbling}
</label>
${scrobbling-backend class="form-control"}
<div class="invalid-feedback">
${scrobbling-backend-info class="help-block"}
</div>
</div>
<div class="col-lg-6">
<label class="form-label" for="${id:feedback-backend}">
${tr:Lms.Settings.feedback}
</label>
${feedback-backend class="form-control"}
<div class="invalid-feedback">
${feedback-backend-info class="help-block"}
</div>
</div>
<div class="col-lg-12">
<label class="form-label" for="${id:listenbrainz-token}">
${tr:Lms.Settings.backend.listenbrainz-token}
</label>
<div class="input-group mb-3">
${listenbrainz-token class="form-control"}
${listenbrainz-token-visibility-btn class="btn btn-outline-secondary"}
<div class="invalid-feedback">
${listenbrainz-token-info class="help-block"}
</div>
</div>
</div>
${<if-has-change-password>}
<legend>${tr:Lms.Settings.change-password}</legend>
${<if-has-old-password>}
<div class="col-12">
<label class="form-label" for="${id:password-old}">
${tr:Lms.password-old}
</label>
${password-old class="form-control"}
<div class="invalid-feedback">
${password-old-info class="help-block"}
</div>
</div>
${</if-has-old-password>}
<div class="col-lg-6">
<label class="form-label" for="${id:password}">
${tr:Lms.password-new}
</label>
${password class="form-control"}
<div class="invalid-feedback">
${password-info class="help-block"}
</div>
</div>
<div class="col-lg-6">
<label class="form-label" for="${id:password-confirm}">
${tr:Lms.password-confirm}
</label>
${password-confirm class="form-control"}
<div class="invalid-feedback">
${password-confirm-info class="help-block"}
</div>
</div>
${</if-has-change-password>}
</form>
<hr/>
${save-btn class="btn btn-primary me-1"}${discard-btn class="btn btn-secondary"}
</message>
</messages>