feat(settings): admin-gated User Management tab via Navidrome REST API

Adds a dedicated Settings tab for managing Navidrome users (list, create,
edit, delete). Only visible to admins — gated by `/auth/login` probe on
mount. Uses Navidrome's native /api/user endpoints instead of Subsonic
(getUsers.view etc. return only the caller on Navidrome). All HTTP calls
go through new Rust commands to bypass WebView CORS.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Psychotoxical
2026-04-19 23:35:14 +02:00
parent 69dd374e80
commit dc819f3a2c
11 changed files with 814 additions and 2 deletions
+29
View File
@@ -474,6 +474,34 @@ export const ruTranslation = {
testBtn: 'Проверить',
testingBtn: 'Проверка…',
serverCompatible: 'Совместимость: Navidrome · Gonic · Airsonic · Subsonic',
userMgmtTitle: 'Управление пользователями',
userMgmtDesc: 'Управляйте пользователями этого сервера. Требуются права администратора.',
userMgmtNoAdmin: 'Для управления пользователями на этом сервере нужны права администратора.',
userMgmtLoadError: 'Не удалось загрузить пользователей.',
userMgmtEmpty: 'Пользователи не найдены.',
userMgmtYouBadge: 'Вы',
userMgmtAdminBadge: 'Админ',
userMgmtAddUser: 'Добавить пользователя',
userMgmtAddUserTitle: 'Новый пользователь',
userMgmtEditUserTitle: 'Изменить пользователя',
userMgmtUsername: 'Имя пользователя',
userMgmtName: 'Отображаемое имя',
userMgmtEmail: 'E-mail',
userMgmtPassword: 'Пароль',
userMgmtPasswordEditHint: 'Введите новый пароль, чтобы изменить его.',
userMgmtRoleAdmin: 'Админ',
userMgmtSave: 'Сохранить',
userMgmtCancel: 'Отмена',
userMgmtDelete: 'Удалить',
userMgmtEdit: 'Изменить',
userMgmtConfirmDelete: 'Удалить пользователя «{{username}}»? Действие нельзя отменить.',
userMgmtCreateError: 'Не удалось создать пользователя.',
userMgmtUpdateError: 'Не удалось обновить пользователя.',
userMgmtDeleteError: 'Не удалось удалить пользователя.',
userMgmtCreated: 'Пользователь создан.',
userMgmtUpdated: 'Пользователь обновлён.',
userMgmtDeleted: 'Пользователь удалён.',
userMgmtValidationMissing: 'Требуются имя пользователя, отображаемое имя и пароль.',
audiomuseTitle: 'AudioMuse-AI (Navidrome)',
audiomuseDesc:
'Включите, если на этом сервере настроен <pluginLink>плагин AudioMuse-AI для Navidrome</pluginLink>. Появится Instant Mix для треков, а на странице исполнителя похожие будут браться с сервера вместо Last.fm.',
@@ -642,6 +670,7 @@ export const ruTranslation = {
randomNavSplitDesc: 'Показывать «Случайный микс» и «Случайные альбомы» как отдельные пункты боковой панели вместо хаба «Собрать микс».',
tabInput: 'Ввод',
tabServer: 'Сервер',
tabUsers: 'Пользователи',
tabSystem: 'Система',
tabGeneral: 'Общие',
ratingsSectionTitle: 'Рейтинги',