From c81a5fdce54885127be001f7abe9f1969d4d0d58 Mon Sep 17 00:00:00 2001 From: Allen Shearin Date: Mon, 3 Mar 2025 17:47:19 -0700 Subject: [PATCH 01/25] feat: Role UI implementation Signed-off-by: Allen Shearin --- src/i18n/locales/de.json | 7 + src/i18n/locales/en.json | 7 + src/i18n/locales/es.json | 7 + src/i18n/locales/fr.json | 7 + src/i18n/locales/hi.json | 7 + src/i18n/locales/it.json | 7 + src/i18n/locales/ja.json | 7 + src/i18n/locales/pl.json | 7 + src/i18n/locales/pt-BR.json | 7 + src/i18n/locales/pt.json | 7 + src/i18n/locales/ru.json | 7 + src/i18n/locales/uk-UA.json | 7 + src/i18n/locales/zh.json | 7 + src/router/index.js | 18 ++ src/shared/api.json | 1 + src/views/administration/AdminMenu.vue | 5 + src/views/administration/Administration.vue | 2 + .../accessmanagement/CreateRoleModal.vue | 69 ++++++ .../administration/accessmanagement/Roles.vue | 232 ++++++++++++++++++ 19 files changed, 418 insertions(+) create mode 100644 src/views/administration/accessmanagement/CreateRoleModal.vue create mode 100644 src/views/administration/accessmanagement/Roles.vue diff --git a/src/i18n/locales/de.json b/src/i18n/locales/de.json index f85a09bf9..80df5cde9 100644 --- a/src/i18n/locales/de.json +++ b/src/i18n/locales/de.json @@ -64,6 +64,7 @@ "create_oidc_group": "Gruppe erstellen", "create_oidc_user": "OpenID Connect-Benutzer erstellen", "create_repository": "Repository erstellen", + "create_role": "Rolle erstellen", "create_team": "Team erstellen", "create_template": "Vorlage erstellen", "create_user": "Benutzer erstellen", @@ -78,6 +79,7 @@ "delete_alert": "Alarm löschen", "delete_oidc_group": "Gruppe löschen", "delete_repository": "Repository löschen", + "delete_role": "Rolle löschen", "delete_team": "Team löschen", "delete_template": "Vorlage löschen", "delete_user": "Benutzer löschen", @@ -224,6 +226,7 @@ "required_fullname": "Der vollständige Name ist erforderlich", "required_oidc_group_name": "Name ist erforderlich", "required_password": "Passwort wird benötigt", + "required_role_name": "Rollenname ist erforderlich", "required_team_name": "Teamname ist erforderlich", "required_username": "Benutzername wird benötigt", "restore_default_template": "Standardvorlagen wiederherstellen", @@ -236,6 +239,10 @@ "risk_score_weight_medium": "Mittel (Standard: 3)", "risk_score_weight_unassigned": "Nicht zugewiesen (Standard: 5)", "risk_score_weighting_description": "Sie können die Gewichtung jedes Schweregrads anpassen, um die Risikobewertung anzupassen.", + "role_created": "Rolle erstellt", + "role_deleted": "Rolle gelöscht", + "role_name": "Rollenname", + "roles": "Rollen", "scope": "Scope", "select_ecosystem": "Ökosysteme auswählen", "select_ldap_group": "LDAP-Gruppe auswählen", diff --git a/src/i18n/locales/en.json b/src/i18n/locales/en.json index 9ff5274d3..81bbf4c4a 100644 --- a/src/i18n/locales/en.json +++ b/src/i18n/locales/en.json @@ -64,6 +64,7 @@ "create_oidc_group": "Create Group", "create_oidc_user": "Create OpenID Connect User", "create_repository": "Create Repository", + "create_role": "Create Role", "create_team": "Create Team", "create_template": "Create Template", "create_user": "Create User", @@ -78,6 +79,7 @@ "delete_alert": "Delete Alert", "delete_oidc_group": "Delete Group", "delete_repository": "Delete Repository", + "delete_role": "Delete Role", "delete_team": "Delete Team", "delete_template": "Delete Template", "delete_user": "Delete User", @@ -224,6 +226,7 @@ "required_fullname": "Fullname is required", "required_oidc_group_name": "Name is required", "required_password": "Password is required", + "required_role_name": "Role name is required", "required_team_name": "Team name is required", "required_username": "Username is required", "restore_default_template": "Restore default templates", @@ -236,6 +239,10 @@ "risk_score_weight_medium": "Medium (default: 3)", "risk_score_weight_unassigned": "Unassigned (default: 5)", "risk_score_weighting_description": "You can customize the weighting of each severity to customize the risk score.", + "role_created": "Role created", + "role_deleted": "Role deleted", + "role_name": "Role Name", + "roles": "Roles", "scope": "Scope", "select_ecosystem": "Select Ecosystems", "select_ldap_group": "Select LDAP Group", diff --git a/src/i18n/locales/es.json b/src/i18n/locales/es.json index 3df684da7..714fcfa96 100644 --- a/src/i18n/locales/es.json +++ b/src/i18n/locales/es.json @@ -64,6 +64,7 @@ "create_oidc_group": "Crea un grupo", "create_oidc_user": "Crear usuario de OpenID Connect", "create_repository": "Crear repositorio", + "create_role": "Crear rol", "create_team": "Crear equipo", "create_template": "Crear plantilla", "create_user": "Crear usuario", @@ -78,6 +79,7 @@ "delete_alert": "Eliminar alerta", "delete_oidc_group": "Eliminar grupo", "delete_repository": "Eliminar repositorio", + "delete_role": "Delete Role", "delete_team": "Eliminar equipo", "delete_template": "Eliminar plantilla", "delete_user": "Borrar usuario", @@ -224,6 +226,7 @@ "required_fullname": "Se requiere el nombre completo", "required_oidc_group_name": "Se requiere el nombre", "required_password": "se requiere contraseña", + "required_role_name": "El nombre del rol es obligatorio", "required_team_name": "El nombre del equipo es obligatorio.", "required_username": "Se requiere nombre de usuario", "restore_default_template": "Restaurar plantillas predeterminadas", @@ -236,6 +239,10 @@ "risk_score_weight_medium": "Medio (predeterminado: 3)", "risk_score_weight_unassigned": "No asignado (predeterminado: 5)", "risk_score_weighting_description": "Puede personalizar la ponderación de cada gravedad para personalizar la puntuación de riesgo.", + "role_created": "Rol creado", + "role_deleted": "Rol eliminado", + "role_name": "Nombre del rol", + "roles": "Roles", "scope": "Alcance", "select_ecosystem": "Seleccionar ecosistemas", "select_ldap_group": "Seleccione grupo LDAP", diff --git a/src/i18n/locales/fr.json b/src/i18n/locales/fr.json index 8e7b638e4..5a05bc9bf 100644 --- a/src/i18n/locales/fr.json +++ b/src/i18n/locales/fr.json @@ -64,6 +64,7 @@ "create_oidc_group": "Créer un groupe", "create_oidc_user": "Créer un utilisateur OpenID Connect", "create_repository": "Créer un dépôt", + "create_role": "Créer un rôle", "create_team": "Créer une équipe", "create_template": "Créer un modèle", "create_user": "Créer un utilisateur", @@ -78,6 +79,7 @@ "delete_alert": "Supprimer l'alerte", "delete_oidc_group": "Supprimer le groupe", "delete_repository": "Supprimer le dépôt", + "delete_role": "Supprimer le rôle", "delete_team": "Supprimer l'équipe", "delete_template": "Supprimer le modèle", "delete_user": "Supprimer l'utilisateur", @@ -224,6 +226,7 @@ "required_fullname": "Le nom complet est requis", "required_oidc_group_name": "Le nom est requis", "required_password": "Mot de passe requis", + "required_role_name": "Le nom du rôle est obligatoire", "required_team_name": "Le nom de l'équipe est requis", "required_username": "Nom d'utilisateur est nécessaire", "restore_default_template": "Restaurer les modèles par défaut", @@ -236,6 +239,10 @@ "risk_score_weight_medium": "Moyen (par défaut : 3)", "risk_score_weight_unassigned": "Non attribué (par défaut : 5)", "risk_score_weighting_description": "Vous pouvez personnaliser la pondération de chaque gravité pour personnaliser le score de risque.", + "role_created": "Rôle créé", + "role_deleted": "Rôle supprimé", + "role_name": "Nom du rôle", + "roles": "Rôles", "scope": "Périmètre", "select_ecosystem": "Sélectionner les écosystèmes", "select_ldap_group": "Sélectionner un groupe LDAP", diff --git a/src/i18n/locales/hi.json b/src/i18n/locales/hi.json index e44b617ce..0237361f7 100644 --- a/src/i18n/locales/hi.json +++ b/src/i18n/locales/hi.json @@ -64,6 +64,7 @@ "create_oidc_group": "समूह बनाना", "create_oidc_user": "OpenID कनेक्ट उपयोगकर्ता बनाएँ", "create_repository": "रिपॉजिटरी बनाएं", + "create_role": "भूमिका बनाएँ", "create_team": "टीम बनाएं", "create_template": "टेम्पलेट बनाएं", "create_user": "उपयोगकर्ता बनाइये", @@ -78,6 +79,7 @@ "delete_alert": "अलर्ट हटाएं", "delete_oidc_group": "समूह हटाएं", "delete_repository": "रिपॉजिटरी हटाएँ", + "delete_role": "भूमिका हटाएँ", "delete_team": "टीम हटाएँ", "delete_template": "टेम्पलेट हटाएं", "delete_user": "उपभोक्ता मिटायें", @@ -224,6 +226,7 @@ "required_fullname": "पूरा नाम आवश्यक है", "required_oidc_group_name": "नाम आवश्यक है", "required_password": "पासवर्ड की आवश्यकता है", + "required_role_name": "भूमिका का नाम आवश्यक है", "required_team_name": "टीम का नाम आवश्यक है", "required_username": "उपयोगकर्ता नाम आवश्यक है", "restore_default_template": "डिफ़ॉल्ट टेम्पलेट्स पुनर्स्थापित करें", @@ -236,6 +239,10 @@ "risk_score_weight_medium": "मध्यम (डिफ़ॉल्ट: 3)", "risk_score_weight_unassigned": "असाइन नहीं किया गया (डिफ़ॉल्ट: 5)", "risk_score_weighting_description": "आप जोखिम स्कोर को अनुकूलित करने के लिए प्रत्येक गंभीरता के भार को अनुकूलित कर सकते हैं।", + "role_created": "भूमिका बनाई गई", + "role_deleted": "भूमिका हटा दी गई", + "role_name": "भूमिका का नाम", + "roles": "भूमिकाएँ", "scope": "दायरा", "select_ecosystem": "पारिस्थितिकी तंत्र का चयन करें", "select_ldap_group": "LDAP समूह चुनें", diff --git a/src/i18n/locales/it.json b/src/i18n/locales/it.json index fffd2ed42..151cf5398 100644 --- a/src/i18n/locales/it.json +++ b/src/i18n/locales/it.json @@ -64,6 +64,7 @@ "create_oidc_group": "Creare un gruppo", "create_oidc_user": "Crea utente OpenID Connect", "create_repository": "Crea archivio", + "create_role": "Crea ruolo", "create_team": "Crea squadra", "create_template": "Crea modello", "create_user": "Creare un utente", @@ -78,6 +79,7 @@ "delete_alert": "Elimina avviso", "delete_oidc_group": "Elimina gruppo", "delete_repository": "Elimina archivio", + "delete_role": "Elimina ruolo", "delete_team": "Elimina squadra", "delete_template": "Elimina modello", "delete_user": "Elimina utente", @@ -224,6 +226,7 @@ "required_fullname": "Il nome completo è obbligatorio", "required_oidc_group_name": "Il nome è obbligatorio", "required_password": "E 'richiesta la password", + "required_role_name": "Il nome del ruolo è obbligatorio", "required_team_name": "Il nome della squadra è obbligatorio", "required_username": "è richiesto il nome utente", "restore_default_template": "Ripristina i modelli predefiniti", @@ -236,6 +239,10 @@ "risk_score_weight_medium": "Medio (predefinito: 3)", "risk_score_weight_unassigned": "Non assegnato (impostazione predefinita: 5)", "risk_score_weighting_description": "È possibile personalizzare la ponderazione di ciascuna gravità per personalizzare il punteggio di rischio.", + "role_created": "Ruolo creato", + "role_deleted": "Ruolo eliminato", + "role_name": "Nome del ruolo", + "roles": "Ruoli", "scope": "Scopo", "select_ecosystem": "Seleziona Ecosistemi", "select_ldap_group": "Seleziona Gruppo LDAP", diff --git a/src/i18n/locales/ja.json b/src/i18n/locales/ja.json index c4467180d..cca106419 100644 --- a/src/i18n/locales/ja.json +++ b/src/i18n/locales/ja.json @@ -64,6 +64,7 @@ "create_oidc_group": "グループを作成", "create_oidc_user": "OpenID Connect ユーザーを作成する", "create_repository": "リポジトリの作成", + "create_role": "ロールを作成", "create_team": "チームを作成", "create_template": "テンプレートを作成", "create_user": "ユーザーを作成", @@ -78,6 +79,7 @@ "delete_alert": "アラートを削除", "delete_oidc_group": "グループを削除", "delete_repository": "リポジトリの削除", + "delete_role": "ロールを削除", "delete_team": "チームを削除", "delete_template": "テンプレートを削除", "delete_user": "ユーザーを削除", @@ -224,6 +226,7 @@ "required_fullname": "フルネームは必須です", "required_oidc_group_name": "名前は必須です", "required_password": "パスワードが必要", + "required_role_name": "ロール名は必須です", "required_team_name": "チーム名は必須です", "required_username": "ユーザー名は必須です", "restore_default_template": "デフォルトのテンプレートを復元する", @@ -236,6 +239,10 @@ "risk_score_weight_medium": "中 (デフォルト: 3)", "risk_score_weight_unassigned": "未割り当て (デフォルト: 5)", "risk_score_weighting_description": "各重大度の重み付けをカスタマイズして、リスク スコアをカスタマイズできます。", + "role_created": "ロールを作成しました", + "role_deleted": "ロールを削除しました", + "role_name": "ロール名", + "roles": "ロール", "scope": "スコープ", "select_ecosystem": "エコシステムを選択", "select_ldap_group": "LDAPグループを選択", diff --git a/src/i18n/locales/pl.json b/src/i18n/locales/pl.json index 269c0a774..830ad6f80 100644 --- a/src/i18n/locales/pl.json +++ b/src/i18n/locales/pl.json @@ -64,6 +64,7 @@ "create_oidc_group": "Stworzyć grupę", "create_oidc_user": "Utwórz użytkownika OpenID Connect", "create_repository": "Utwórz repozytorium", + "create_role": "Utwórz rolę", "create_team": "Utwórz zespół", "create_template": "Utwórz szablon", "create_user": "Stwórz użytkownika", @@ -78,6 +79,7 @@ "delete_alert": "Usuń alert", "delete_oidc_group": "Usuń grupę", "delete_repository": "Usuń repozytorium", + "delete_role": "Usuń rolę", "delete_team": "Usuń zespół", "delete_template": "Usuń szablon", "delete_user": "Usuń użytkownika", @@ -224,6 +226,7 @@ "required_fullname": "Imię i nazwisko jest wymagane", "required_oidc_group_name": "imie jest wymagane", "required_password": "Wymagane jest hasło", + "required_role_name": "Nazwa roli jest wymagana", "required_team_name": "Nazwa zespołu jest wymagana", "required_username": "Wymagana jest nazwa użytkownika", "restore_default_template": "Przywróć domyślne szablony", @@ -236,6 +239,10 @@ "risk_score_weight_medium": "Średni (domyślnie: 3)", "risk_score_weight_unassigned": "Nieprzypisane (domyślnie: 5)", "risk_score_weighting_description": "Możesz dostosować wagę każdej wagi, aby dostosować ocenę ryzyka.", + "role_created": "Rola utworzona", + "role_deleted": "Rola usunięta", + "role_name": "Nazwa roli", + "roles": "Role", "scope": "Zakres", "select_ecosystem": "Wybierz Ekosystemy", "select_ldap_group": "Wybierz Grupę LDAP", diff --git a/src/i18n/locales/pt-BR.json b/src/i18n/locales/pt-BR.json index 3c5be780f..692da35a1 100644 --- a/src/i18n/locales/pt-BR.json +++ b/src/i18n/locales/pt-BR.json @@ -64,6 +64,7 @@ "create_oidc_group": "Criar grupo", "create_oidc_user": "Criar usuário OpenID Connect", "create_repository": "Criar repositório", + "create_role": "Criar função", "create_team": "Criar equipe", "create_template": "Criar modelo", "create_user": "Criar usuário", @@ -78,6 +79,7 @@ "delete_alert": "Excluir alerta", "delete_oidc_group": "Excluir grupo", "delete_repository": "Excluir repositório", + "delete_role": "Excluir função", "delete_team": "Excluir equipe", "delete_template": "Excluir modelo", "delete_user": "Deletar usuário", @@ -224,6 +226,7 @@ "required_fullname": "O nome completo é obrigatório", "required_oidc_group_name": "O nome é obrigatório", "required_password": "Senha requerida", + "required_role_name": "O nome da função é obrigatório", "required_team_name": "O nome da equipe é obrigatório", "required_username": "Nome de usuário é requerido", "restore_default_template": "Restaurar modelos padrão", @@ -236,6 +239,10 @@ "risk_score_weight_medium": "Médio (padrão: 3)", "risk_score_weight_unassigned": "Não atribuído (padrão: 5)", "risk_score_weighting_description": "Você pode personalizar a ponderação de cada gravidade para personalizar a pontuação de risco.", + "role_created": "Função criada", + "role_deleted": "Função excluída", + "role_name": "Nome da função", + "roles": "Funções", "scope": "Escopo", "select_ecosystem": "Selecione Ecossistemas", "select_ldap_group": "Selecione o grupo LDAP", diff --git a/src/i18n/locales/pt.json b/src/i18n/locales/pt.json index ef8543f5a..5caa081cd 100644 --- a/src/i18n/locales/pt.json +++ b/src/i18n/locales/pt.json @@ -64,6 +64,7 @@ "create_oidc_group": "Criar grupo", "create_oidc_user": "Criar utilizador OpenID Connect", "create_repository": "Criar repositório", + "create_role": "Criar função", "create_team": "Criar equipe", "create_template": "Criar modelo", "create_user": "Criar utilizador", @@ -78,6 +79,7 @@ "delete_alert": "Excluir alerta", "delete_oidc_group": "Excluir grupo", "delete_repository": "Excluir repositório", + "delete_role": "Excluir função", "delete_team": "Excluir equipe", "delete_template": "Excluir modelo", "delete_user": "Deletar utilizador", @@ -224,6 +226,7 @@ "required_fullname": "O nome completo é obrigatório", "required_oidc_group_name": "O nome é obrigatório", "required_password": "Palavra passe obrigatória", + "required_role_name": "O nome da função é obrigatório", "required_team_name": "O nome da equipe é obrigatório", "required_username": "Nome de utilizador é obrigatório", "restore_default_template": "Restaurar modelos padrão", @@ -236,6 +239,10 @@ "risk_score_weight_medium": "Médio (padrão: 3)", "risk_score_weight_unassigned": "Não atribuído (padrão: 5)", "risk_score_weighting_description": "Você pode personalizar a ponderação de cada gravidade para personalizar a pontuação de risco.", + "role_created": "Função criada", + "role_deleted": "Função excluída", + "role_name": "Nome da função", + "roles": "Funções", "scope": "Escopo", "select_ecosystem": "Selecione Ecossistemas", "select_ldap_group": "Selecione o grupo LDAP", diff --git a/src/i18n/locales/ru.json b/src/i18n/locales/ru.json index 58535e873..7420559ba 100644 --- a/src/i18n/locales/ru.json +++ b/src/i18n/locales/ru.json @@ -64,6 +64,7 @@ "create_oidc_group": "Создать группу", "create_oidc_user": "Создать пользователя OpenID Connect", "create_repository": "Создать репозиторий", + "create_role": "Создать роль", "create_team": "Создать команду", "create_template": "Создать шаблон", "create_user": "Создать пользователя", @@ -78,6 +79,7 @@ "delete_alert": "Удалить оповещение", "delete_oidc_group": "Удалить группу", "delete_repository": "Удалить репозиторий", + "delete_role": "Удалить роль", "delete_team": "Удалить команду", "delete_template": "Удалить шаблон", "delete_user": "Удалить пользователя", @@ -224,6 +226,7 @@ "required_fullname": "Полное имя обязательно", "required_oidc_group_name": "Имя обязательно", "required_password": "Пароль обязателен", + "required_role_name": "Имя роли обязательно", "required_team_name": "Имя команды обязательно", "required_username": "Имя пользователя обязательно", "restore_default_template": "Восстановить шаблоны по умолчанию", @@ -236,6 +239,10 @@ "risk_score_weight_medium": "Средний (по умолчанию: 3)", "risk_score_weight_unassigned": "Не назначено (по умолчанию: 5)", "risk_score_weighting_description": "Вы можете настроить вес каждой серьезности, чтобы настроить оценку риска.", + "role_created": "Роль создана", + "role_deleted": "Роль удалена", + "role_name": "Имя роли", + "roles": "Роли", "scope": "Область", "select_ecosystem": "Выбрать экосистему", "select_ldap_group": "Выбрать группу LDAP", diff --git a/src/i18n/locales/uk-UA.json b/src/i18n/locales/uk-UA.json index 0d299c1d8..761337234 100644 --- a/src/i18n/locales/uk-UA.json +++ b/src/i18n/locales/uk-UA.json @@ -64,6 +64,7 @@ "create_oidc_group": "Створити групу", "create_oidc_user": "Створіть користувача OpenID Connect", "create_repository": "Створити репозиторій", + "create_role": "Створити роль", "create_team": "Створити команду", "create_template": "Створити шаблон", "create_user": "Створити користувача", @@ -78,6 +79,7 @@ "delete_alert": "Видалити сповіщення", "delete_oidc_group": "Видалити групу", "delete_repository": "Видалити репозиторій", + "delete_role": "Видалити роль", "delete_team": "Видалити команду", "delete_template": "Видалити шаблон", "delete_user": "Видалити користувача", @@ -224,6 +226,7 @@ "required_fullname": "Введіть повне ім'я", "required_oidc_group_name": "Необхідно вказати ім'я", "required_password": "Необхідно ввести пароль", + "required_role_name": "Необхідно вказати назву ролі", "required_team_name": "Необхідно вказати назву команди", "required_username": "Потрібно ввести ім'я користувача", "restore_default_template": "Відновити стандартні шаблони", @@ -236,6 +239,10 @@ "risk_score_weight_medium": "Середній (за замовчуванням: 3)", "risk_score_weight_unassigned": "Не призначено (за замовчуванням: 5)", "risk_score_weighting_description": "Ви можете налаштувати зважування кожного рівня серйозності, щоб налаштувати оцінку ризику.", + "role_created": "Роль створено", + "role_deleted": "Роль видалено", + "role_name": "Назва ролі", + "roles": "Ролі", "scope": "Область застосування", "select_ecosystem": "Виберіть Екосистеми", "select_ldap_group": "Виберіть групу LDAP", diff --git a/src/i18n/locales/zh.json b/src/i18n/locales/zh.json index da6eb08ae..e69011e85 100644 --- a/src/i18n/locales/zh.json +++ b/src/i18n/locales/zh.json @@ -64,6 +64,7 @@ "create_oidc_group": "创建 OIDC 组", "create_oidc_user": "创建 OpenID Connect 用户", "create_repository": "创建存储库", + "create_role": "创建角色", "create_team": "创建团队", "create_template": "创建模板", "create_user": "创建用户", @@ -78,6 +79,7 @@ "delete_alert": "删除告警", "delete_oidc_group": "删除 OIDC 组", "delete_repository": "删除存储库", + "delete_role": "删除角色", "delete_team": "删除团队", "delete_template": "删除模板", "delete_user": "删除用户", @@ -224,6 +226,7 @@ "required_fullname": "必填:全名", "required_oidc_group_name": "必填:OIDC 组名", "required_password": "密码是必需的", + "required_role_name": "必填:角色名称", "required_team_name": "必填:团队名称", "required_username": "必填:用户名", "restore_default_template": "恢复默认模板", @@ -236,6 +239,10 @@ "risk_score_weight_medium": "中(默认值:3)", "risk_score_weight_unassigned": "未分配(默认值:5)", "risk_score_weighting_description": "您可以自定义每个严重性的权重来自定义风险评分。", + "role_created": "角色已创建", + "role_deleted": "角色已删除", + "role_name": "角色名称", + "roles": "角色", "scope": "范围", "select_ecosystem": "选择生态系统", "select_ldap_group": "选择 LDAP 组", diff --git a/src/router/index.js b/src/router/index.js index 10f3eb656..20bf9e760 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -94,6 +94,7 @@ const OidcUsers = () => import('@/views/administration/accessmanagement/OidcUsers'); const OidcGroups = () => import('@/views/administration/accessmanagement/OidcGroups'); +const Roles = () => import('@/views/administration/accessmanagement/Roles'); const Teams = () => import('@/views/administration/accessmanagement/Teams'); const Permissions = () => import('@/views/administration/accessmanagement/Permissions'); @@ -1075,6 +1076,23 @@ function configRoutes() { ], }, }, + { + path: 'accessManagement/roles', + component: Roles, + meta: { + title: i18n.t('message.administration'), + i18n: 'message.administration', + sectionPath: '/admin', + sectionName: 'Admin', + permissions: [ + 'ACCESS_MANAGEMENT', + 'ACCESS_MANAGEMENT_CREATE', + 'ACCESS_MANAGEMENT_READ', + 'ACCESS_MANAGEMENT_UPDATE', + 'ACCESS_MANAGEMENT_DELETE', + ], + }, + }, { path: 'accessManagement/teams', component: Teams, diff --git a/src/shared/api.json b/src/shared/api.json index a38230cbf..83a82affc 100644 --- a/src/shared/api.json +++ b/src/shared/api.json @@ -42,6 +42,7 @@ "URL_POLICY_VIOLATION_ANALYSIS": "api/v1/violation/analysis", "URL_PROJECT": "api/v1/project", "URL_REPOSITORY": "api/v1/repository", + "URL_ROLE": "api/v1/role", "URL_SEARCH": "api/v1/search", "URL_SERVICE": "api/v1/service", "URL_TAG": "api/v1/tag", diff --git a/src/views/administration/AdminMenu.vue b/src/views/administration/AdminMenu.vue index 599fb5674..cc65b1e59 100644 --- a/src/views/administration/AdminMenu.vue +++ b/src/views/administration/AdminMenu.vue @@ -377,6 +377,11 @@ export default { name: this.$t('admin.oidc_groups'), route: 'accessManagement/oidcGroups', }, + { + component: 'Roles', + name: this.$t('admin.roles'), + route: 'accessManagement/roles', + }, { component: 'Teams', name: this.$t('admin.teams'), diff --git a/src/views/administration/Administration.vue b/src/views/administration/Administration.vue index 04a6231f4..879ac8225 100644 --- a/src/views/administration/Administration.vue +++ b/src/views/administration/Administration.vue @@ -76,6 +76,7 @@ import OidcGroups from './accessmanagement/OidcGroups'; import OidcUsers from './accessmanagement/OidcUsers'; import Permissions from './accessmanagement/Permissions'; import PortfolioAccessControl from './accessmanagement/PortfolioAccessControl'; +import Roles from './accessmanagement/Roles'; import Teams from './accessmanagement/Teams'; export default { @@ -122,6 +123,7 @@ export default { ManagedUsers, OidcUsers, OidcGroups, + Roles, Teams, Permissions, PortfolioAccessControl, diff --git a/src/views/administration/accessmanagement/CreateRoleModal.vue b/src/views/administration/accessmanagement/CreateRoleModal.vue new file mode 100644 index 000000000..0847b0ed4 --- /dev/null +++ b/src/views/administration/accessmanagement/CreateRoleModal.vue @@ -0,0 +1,69 @@ + + + diff --git a/src/views/administration/accessmanagement/Roles.vue b/src/views/administration/accessmanagement/Roles.vue new file mode 100644 index 000000000..e00e5e393 --- /dev/null +++ b/src/views/administration/accessmanagement/Roles.vue @@ -0,0 +1,232 @@ + + + From 5bd07f81a6f60de825deef64ff45ae6104aae38b Mon Sep 17 00:00:00 2001 From: Ephraim Mensah Date: Mon, 3 Mar 2025 23:29:49 +0000 Subject: [PATCH 02/25] feat: add ldapUser with Role & Project Membership Signed-off-by: Ephraim Mensah --- src/i18n/locales/en.json | 3 + .../accessmanagement/LdapUsers.vue | 135 +++++++++++++++++- .../accessmanagement/SelectRoleModal.vue | 81 +++++++++++ 3 files changed, 218 insertions(+), 1 deletion(-) create mode 100644 src/views/administration/accessmanagement/SelectRoleModal.vue diff --git a/src/i18n/locales/en.json b/src/i18n/locales/en.json index 81bbf4c4a..750c633e5 100644 --- a/src/i18n/locales/en.json +++ b/src/i18n/locales/en.json @@ -199,6 +199,7 @@ "portfolio_access_control": "Portfolio Access Control", "preview": "Preview", "project_access": "Project access", + "project_membership": "Project Membership", "project_retention_enable": "Enable Inactive Project Deletion", "publisher": "Publisher", "publisher_class": "Publisher class", @@ -242,6 +243,7 @@ "role_created": "Role created", "role_deleted": "Role deleted", "role_name": "Role Name", + "role_membership": "Role Membership", "roles": "Roles", "scope": "Scope", "select_ecosystem": "Select Ecosystems", @@ -249,6 +251,7 @@ "select_oidc_group": "Select OpenID Connect Group", "select_permission": "Select permission", "select_project": "Select Project", + "select_role": "Select Role", "select_team": "Select Team", "select_team_as_recipient": "Select team as recipient", "snyk": "Snyk (Beta)", diff --git a/src/views/administration/accessmanagement/LdapUsers.vue b/src/views/administration/accessmanagement/LdapUsers.vue index 62c919067..cd9bebea6 100644 --- a/src/views/administration/accessmanagement/LdapUsers.vue +++ b/src/views/administration/accessmanagement/LdapUsers.vue @@ -19,6 +19,7 @@ + @@ -33,6 +34,8 @@ import ActionableListGroupItem from '../../components/ActionableListGroupItem'; import SelectTeamModal from './SelectTeamModal'; import SelectPermissionModal from './SelectPermissionModal'; import permissionsMixin from '../../../mixins/permissionsMixin'; +import SelectRoleModal from './SelectRoleModal.vue'; +import SelectProjectModal from './SelectProjectModal.vue'; export default { props: { @@ -41,6 +44,7 @@ export default { mixins: [bootstrapTableMixin], components: { CreateLdapUserModal, + SelectProjectModal, }, mounted() { EventBus.$on('admin:ldapusers:rowUpdate', (index, row) => { @@ -86,6 +90,18 @@ export default { : 0; }, }, + { + title: this.$t('admin.roles'), + field: 'roles', + sortable: false, + formatter(value, row, index) { + return value + ? xssFilters.inHTMLData( + common.valueWithDefault(value.length, '0'), + ) + : 0; + }, + }, ], data: [], options: { @@ -118,6 +134,7 @@ export default { +
@@ -126,21 +143,37 @@ export default {
+ +
+ + + + {{ project.name }} + + {{ $t('admin.select_project') }} + + +
+
- +
{{ $t('admin.delete_user') }}
+ + `, mixins: [permissionsMixin], components: { ActionableListGroupItem, + SelectRoleModal, SelectTeamModal, SelectPermissionModal, + SelectProjectModal, }, data() { return { @@ -148,6 +181,8 @@ export default { username: row.username, teams: row.teams, permissions: row.permissions, + projects: row.projects, + roles: row.roles, }; }, methods: { @@ -213,6 +248,103 @@ export default { this.$toastr.w(this.$t('condition.unsuccessful_action')); }); }, + updateRoleSelection: function (selections) { + this.$root.$emit('bv::hide::modal', 'selectRoleModal'); + for (let i = 0; i < selections.length; i++) { + let selection = selections[i]; + let url = `${this.$api.BASE_URL}/${this.$api.URL_USER}/${this.username}/role`; + this.axios + .post(url, { + uuid: selection.uuid, + }) + .then((response) => { + this.syncVariables(response.data); + EventBus.$emit( + 'admin:ldapusers:rowUpdate', + index, + this.ldapUser, + ); + this.$toastr.s(this.$t('message.updated')); + }) + .catch((error) => { + if (error.response.status === 304) { + //this.$toastr.w(this.$t('condition.unsuccessful_action')); + } else { + this.$toastr.w( + this.$t('condition.unsuccessful_action'), + ); + } + }); + } + }, + updateProjectSelection: function (selections) { + this.$root.$emit('bv::hide::modal', 'selectProjectModal'); + for (let i = 0; i < selections.length; i++) { + let selection = selections[i]; + let url = `${this.$api.BASE_URL}/${this.$api.URL_USER}/${this.username}/project`; + this.axios + .post(url, { + uuid: selection.uuid, + }) + .then((response) => { + this.syncVariables(response.data); + EventBus.$emit( + 'admin:ldapusers:rowUpdate', + index, + this.ldapUser, + ); + this.$toastr.s(this.$t('message.updated')); + }) + .catch((error) => { + if (error.response.status === 304) { + //this.$toastr.w(this.$t('condition.unsuccessful_action')); + } else { + this.$toastr.w( + this.$t('condition.unsuccessful_action'), + ); + } + }); + } + }, + removeProjectMembership: function (projectUuid) { + let url = `${this.$api.BASE_URL}/${this.$api.URL_USER}/${this.username}/project`; + this.axios + .delete(url, { data: { uuid: projectUuid } }) + .then((response) => { + this.syncVariables(response.data); + EventBus.$emit( + 'admin:ldapusers:rowUpdate', + index, + this.ldapUser, + ); + this.$toastr.s(this.$t('message.updated')); + }) + .catch((error) => { + this.$toastr.w(this.$t('condition.unsuccessful_action')); + }); + }, + removeRole: function (role) { + let url = `${this.$api.BASE_URL}/${this.$api.URL_USER}/${this.username}/role`; + this.axios + .delete(url, { + data: { + roleName: role.name, + projectName: role.projectName, + }, + }) + .then((response) => { + this.syncVariables(response.data); + EventBus.$emit( + 'admin:ldapusers:rowUpdate', + index, + this.ldapUser, + ); + this.$toastr.s(this.$t('message.updated')); + }) + .catch((error) => { + this.$toastr.w(this.$t('condition.unsuccessful_action')); + }); + }, updatePermissionSelection: function (selections) { this.$root.$emit('bv::hide::modal', 'selectPermissionModal'); for (let i = 0; i < selections.length; i++) { @@ -251,6 +383,7 @@ export default { syncVariables: function (ldapUser) { this.ldapUser = ldapUser; this.username = ldapUser.username; + this.roles = ldapUser.roles; this.teams = ldapUser.teams; this.permissions = ldapUser.permissions; }, diff --git a/src/views/administration/accessmanagement/SelectRoleModal.vue b/src/views/administration/accessmanagement/SelectRoleModal.vue new file mode 100644 index 000000000..724270e03 --- /dev/null +++ b/src/views/administration/accessmanagement/SelectRoleModal.vue @@ -0,0 +1,81 @@ + + + From 577bc18bf440419c7d23eeb5d1ccd129a848e97c Mon Sep 17 00:00:00 2001 From: Allen Shearin Date: Wed, 5 Mar 2025 21:09:21 -0700 Subject: [PATCH 03/25] feat: add role fields for ldap users Signed-off-by: Allen Shearin --- src/i18n/locales/en.json | 3 + .../accessmanagement/LdapUsers.vue | 25 +-- .../accessmanagement/ManagedUsers.vue | 9 + .../accessmanagement/RoleFormInputGroup.vue | 105 +++++++++++ .../accessmanagement/SelectRoleModal.vue | 168 ++++++++++++------ 5 files changed, 239 insertions(+), 71 deletions(-) create mode 100644 src/views/administration/accessmanagement/RoleFormInputGroup.vue diff --git a/src/i18n/locales/en.json b/src/i18n/locales/en.json index 750c633e5..ab036e070 100644 --- a/src/i18n/locales/en.json +++ b/src/i18n/locales/en.json @@ -198,7 +198,9 @@ "personal_access_token": "Personal Access Token", "portfolio_access_control": "Portfolio Access Control", "preview": "Preview", + "project": "Project", "project_access": "Project access", + "project_name": "Project Name", "project_membership": "Project Membership", "project_retention_enable": "Enable Inactive Project Deletion", "publisher": "Publisher", @@ -240,6 +242,7 @@ "risk_score_weight_medium": "Medium (default: 3)", "risk_score_weight_unassigned": "Unassigned (default: 5)", "risk_score_weighting_description": "You can customize the weighting of each severity to customize the risk score.", + "role": "Role", "role_created": "Role created", "role_deleted": "Role deleted", "role_name": "Role Name", diff --git a/src/views/administration/accessmanagement/LdapUsers.vue b/src/views/administration/accessmanagement/LdapUsers.vue index cd9bebea6..377c9ddb4 100644 --- a/src/views/administration/accessmanagement/LdapUsers.vue +++ b/src/views/administration/accessmanagement/LdapUsers.vue @@ -125,7 +125,7 @@ export default { i18n, template: ` - +
@@ -134,34 +134,27 @@ export default {
-
- +
- - - - {{ project.name }} - - {{ $t('admin.select_project') }} + +
-
-
- {{ $t('admin.delete_user') }} -
- - +
+ {{ $t('admin.delete_user') }} +
+ @@ -182,7 +175,7 @@ export default { teams: row.teams, permissions: row.permissions, projects: row.projects, - roles: row.roles, + mappedroles: row.mappedroles, }; }, methods: { diff --git a/src/views/administration/accessmanagement/ManagedUsers.vue b/src/views/administration/accessmanagement/ManagedUsers.vue index 4e793d910..e9ea81ca3 100644 --- a/src/views/administration/accessmanagement/ManagedUsers.vue +++ b/src/views/administration/accessmanagement/ManagedUsers.vue @@ -36,6 +36,8 @@ import SelectPermissionModal from './SelectPermissionModal'; import permissionsMixin from '../../../mixins/permissionsMixin'; import { Switch as cSwitch } from '@coreui/vue'; import BInputGroupFormInput from '../../../forms/BInputGroupFormInput'; +import SelectRoleModal from './SelectRoleModal.vue'; +import RoleFormInputGroup from './RoleFormInputGroup.vue'; export default { props: { @@ -137,6 +139,11 @@ export default { + +
+ +
+
+ + + + + + + + + diff --git a/src/views/administration/accessmanagement/SelectRoleModal.vue b/src/views/administration/accessmanagement/SelectRoleModal.vue index 724270e03..c92ca80c6 100644 --- a/src/views/administration/accessmanagement/SelectRoleModal.vue +++ b/src/views/administration/accessmanagement/SelectRoleModal.vue @@ -1,81 +1,139 @@ From 06ae306ba438e72698ed05e41baa08718b6a5c52 Mon Sep 17 00:00:00 2001 From: Alexis Lamb Date: Mon, 14 Apr 2025 17:11:34 -0400 Subject: [PATCH 04/25] Fix: allow permission selection when creating a new role Signed-off-by: Alexis Lamb --- .../administration/accessmanagement/Roles.vue | 47 ++++++++++++++++++- .../SelectPermissionModal.vue | 1 - 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/src/views/administration/accessmanagement/Roles.vue b/src/views/administration/accessmanagement/Roles.vue index e00e5e393..2f8c1b329 100644 --- a/src/views/administration/accessmanagement/Roles.vue +++ b/src/views/administration/accessmanagement/Roles.vue @@ -5,6 +5,13 @@ {{ $t('admin.create_role') }} + {{ $t('admin.enable_acl') }} { @@ -52,6 +63,11 @@ export default { }, data() { return { + isAclEnabled: false, + labelIcon: { + dataOn: '\u2713', + dataOff: '\u2715', + }, columns: [ { title: this.$t('admin.role_name'), @@ -227,6 +243,35 @@ export default { silent: true, }); }, + updateProperties: function () { + this.updateConfigProperties([ + { + groupName: 'access-management', + propertyName: 'acl.enabled', + propertyValue: this.isAclEnabled, + }, + ]); + }, + }, + watch: { + isAclEnabled() { + this.updateProperties(); + }, + }, + created() { + this.axios.get(this.configUrl).then((response) => { + let configItems = response.data.filter(function (item) { + return item.groupName === 'access-management'; + }); + for (let i = 0; i < configItems.length; i++) { + let item = configItems[i]; + switch (item.propertyName) { + case 'acl.enabled': + this.isAclEnabled = common.toBoolean(item.propertyValue); + break; + } + } + }); }, }; diff --git a/src/views/administration/accessmanagement/SelectPermissionModal.vue b/src/views/administration/accessmanagement/SelectPermissionModal.vue index af05258b3..6c3f80c98 100644 --- a/src/views/administration/accessmanagement/SelectPermissionModal.vue +++ b/src/views/administration/accessmanagement/SelectPermissionModal.vue @@ -3,7 +3,6 @@ id="selectPermissionModal" size="lg" hide-header-close - no-stacking :title="$t('admin.select_permission')" > Date: Mon, 10 Mar 2025 13:04:03 -0600 Subject: [PATCH 05/25] feat: add role permissions refactor: add rolesMixin, use in ldap user file Signed-off-by: Allen Shearin --- src/i18n/locales/de.json | 2 + src/i18n/locales/en.json | 7 +- src/i18n/locales/es.json | 2 + src/i18n/locales/fr.json | 2 + src/i18n/locales/hi.json | 2 + src/i18n/locales/it.json | 2 + src/i18n/locales/ja.json | 2 + src/i18n/locales/pl.json | 2 + src/i18n/locales/pt-BR.json | 2 + src/i18n/locales/pt.json | 2 + src/i18n/locales/ru.json | 2 + src/i18n/locales/uk-UA.json | 2 + src/i18n/locales/zh.json | 2 + src/mixins/rolesMixin.js | 53 ++++++ src/shared/api.json | 1 + src/shared/permissions.js | 58 ++++--- .../accessmanagement/LdapUsers.vue | 160 ++++-------------- .../accessmanagement/ManagedUsers.vue | 9 - .../ProjectRoleListGroupItem.vue | 72 ++++++++ .../accessmanagement/RoleFormInputGroup.vue | 105 ------------ .../accessmanagement/SelectRoleModal.vue | 145 ++++++++-------- 21 files changed, 285 insertions(+), 349 deletions(-) create mode 100644 src/mixins/rolesMixin.js create mode 100644 src/views/administration/accessmanagement/ProjectRoleListGroupItem.vue delete mode 100644 src/views/administration/accessmanagement/RoleFormInputGroup.vue diff --git a/src/i18n/locales/de.json b/src/i18n/locales/de.json index 80df5cde9..622d6ca6e 100644 --- a/src/i18n/locales/de.json +++ b/src/i18n/locales/de.json @@ -41,6 +41,7 @@ "api_keys": "API-Schlüssel", "api_token": "API-Token", "api_token_header": "Header des API-Tokens", + "assign_role": "Rolle zuweisen", "base_url": "Basis-URL", "bearer_token_auth_enable": "Authentifizieren mit einem persönlichen Zugriffstoken", "bom_formats": "BOM-Formate", @@ -372,6 +373,7 @@ "apply_vex": "VEX anwenden", "apply_vex_tooltip": "Wenden Sie Analysen aus einem Vulnerability Exploitability eXchange (VEX)-Dokument auf dieses Projekt an.", "approved": "Genehmigt", + "assign": "Zuweisen", "attributed_on": "Zugeordnet am", "audit_trail": "Buchungskontrolle", "audit_vulnerabilities": "Schwachstellen prüfen", diff --git a/src/i18n/locales/en.json b/src/i18n/locales/en.json index ab036e070..0a0470245 100644 --- a/src/i18n/locales/en.json +++ b/src/i18n/locales/en.json @@ -41,6 +41,7 @@ "api_keys": "API Keys", "api_token": "API token", "api_token_header": "API token header", + "assign_role": "Assign Role", "base_url": "Base URL", "bearer_token_auth_enable": "Authenticate with a personal access token", "bom_formats": "BOM Formats", @@ -243,8 +244,9 @@ "risk_score_weight_unassigned": "Unassigned (default: 5)", "risk_score_weighting_description": "You can customize the weighting of each severity to customize the risk score.", "role": "Role", - "role_created": "Role created", - "role_deleted": "Role deleted", + "role_assigned": "Role Assigned", + "role_created": "Role Created", + "role_deleted": "Role Deleted", "role_name": "Role Name", "role_membership": "Role Membership", "roles": "Roles", @@ -378,6 +380,7 @@ "apply_vex": "Apply VEX", "apply_vex_tooltip": "Apply analyses from a Vulnerability Exploitability eXchange (VEX) document to this project.", "approved": "Approved", + "assign": "Assign", "attributed_on": "Attributed On", "audit_trail": "Audit Trail", "audit_vulnerabilities": "Audit Vulnerabilities", diff --git a/src/i18n/locales/es.json b/src/i18n/locales/es.json index 714fcfa96..2d4a190b7 100644 --- a/src/i18n/locales/es.json +++ b/src/i18n/locales/es.json @@ -41,6 +41,7 @@ "api_keys": "Claves API", "api_token": "token API", "api_token_header": "api_token_header", + "assign_role": "Asignar rol", "base_url": "URL base", "bearer_token_auth_enable": "Autenticarse con un token de acceso personal", "bom_formats": "Formatos de lista de materiales", @@ -372,6 +373,7 @@ "apply_vex": "Aplicar VEX", "apply_vex_tooltip": "Aplique análisis de un documento de Vulnerability Exploitability eXchange (VEX) a este proyecto.", "approved": "Aprobado", + "assign": "Asignar", "attributed_on": "Atribuido el", "audit_trail": "Pista de auditoría", "audit_vulnerabilities": "Vulnerabilidades de auditoría", diff --git a/src/i18n/locales/fr.json b/src/i18n/locales/fr.json index 5a05bc9bf..b4d074407 100644 --- a/src/i18n/locales/fr.json +++ b/src/i18n/locales/fr.json @@ -41,6 +41,7 @@ "api_keys": "Clés d'API", "api_token": "Jeton d'API", "api_token_header": "Entête du jeton d'API", + "assign_role": "Attribuer un rôle", "base_url": "URL de base", "bearer_token_auth_enable": "S'authentifier avec un jeton d'accès personnel", "bom_formats": "Formats de nomenclature (BOM)", @@ -372,6 +373,7 @@ "apply_vex": "Appliquer VEX", "apply_vex_tooltip": "Appliquer les analyses d'un document Vulnerability Exploitability eXchange (VEX) à ce projet.", "approved": "Approuvée", + "assign": "Attribuer", "attributed_on": "Attribuée le", "audit_trail": "Suivi d'audit", "audit_vulnerabilities": "Audit des vulnérabilités", diff --git a/src/i18n/locales/hi.json b/src/i18n/locales/hi.json index 0237361f7..7bae14a93 100644 --- a/src/i18n/locales/hi.json +++ b/src/i18n/locales/hi.json @@ -41,6 +41,7 @@ "api_keys": "एपीआई कुंजियाँ", "api_token": "एपीआई टोकन", "api_token_header": "api_token_header", + "assign_role": "भूमिका सौंपें", "base_url": "आधार यूआरएल", "bearer_token_auth_enable": "व्यक्तिगत एक्सेस टोकन से प्रमाणीकरण करें", "bom_formats": "बीओएम प्रारूप", @@ -372,6 +373,7 @@ "apply_vex": "VEX लागू करें", "apply_vex_tooltip": "इस परियोजना पर भेद्यता शोषण एक्सचेंज (VEX) दस्तावेज़ से विश्लेषण लागू करें।", "approved": "अनुमत", + "assign": "सौंपना", "attributed_on": "पर जिम्मेदार ठहराया", "audit_trail": "लेखापरीक्षा", "audit_vulnerabilities": "ऑडिट कमजोरियाँ", diff --git a/src/i18n/locales/it.json b/src/i18n/locales/it.json index 151cf5398..09157ac84 100644 --- a/src/i18n/locales/it.json +++ b/src/i18n/locales/it.json @@ -41,6 +41,7 @@ "api_keys": "Chiavi API", "api_token": "Token API", "api_token_header": "api_token_header", + "assign_role": "Assegna ruolo", "base_url": "URL di base", "bearer_token_auth_enable": "Autenticarsi con un token di accesso personale", "bom_formats": "Formati distinta base", @@ -372,6 +373,7 @@ "apply_vex": "Applica VEX", "apply_vex_tooltip": "Applicare le analisi da un documento Vulnerability Exploitability eXchange (VEX) a questo progetto.", "approved": "Approvato", + "assign": "Assegnare", "attributed_on": "Attribuito a", "audit_trail": "Traccia di controllo", "audit_vulnerabilities": "Vulnerabilità del controllo", diff --git a/src/i18n/locales/ja.json b/src/i18n/locales/ja.json index cca106419..54beff45a 100644 --- a/src/i18n/locales/ja.json +++ b/src/i18n/locales/ja.json @@ -41,6 +41,7 @@ "api_keys": "APIキー", "api_token": "APIトークン", "api_token_header": "api_token_header", + "assign_role": "ロールを割り当てる", "base_url": "ベースURL", "bearer_token_auth_enable": "パーソナルアクセストークンで認証する", "bom_formats": "BOM 形式", @@ -372,6 +373,7 @@ "apply_vex": "VEXを適用する", "apply_vex_tooltip": "Vulnerability Exploitability eXchange (VEX) ドキュメントからの分析をこのプロジェクトに適用します。", "approved": "承認された", + "assign": "割り当て", "attributed_on": "帰属先", "audit_trail": "監査証跡", "audit_vulnerabilities": "監査の脆弱性", diff --git a/src/i18n/locales/pl.json b/src/i18n/locales/pl.json index 830ad6f80..b3cbe43ec 100644 --- a/src/i18n/locales/pl.json +++ b/src/i18n/locales/pl.json @@ -41,6 +41,7 @@ "api_keys": "Klucze API", "api_token": "Token API", "api_token_header": "api_token_header", + "assign_role": "Przypisz rolę", "base_url": "Bazowy adres URL", "bearer_token_auth_enable": "Uwierzytelnij się za pomocą osobistego tokena dostępu", "bom_formats": "Formaty BOM-ów", @@ -372,6 +373,7 @@ "apply_vex": "Zastosuj VEX", "apply_vex_tooltip": "Zastosuj analizy z dokumentu Vulnerability Exploitability eXchange (VEX) do tego projektu.", "approved": "Zatwierdzony", + "assign": "Przypisać", "attributed_on": "Przypisane", "audit_trail": "Ścieżka audytu", "audit_vulnerabilities": "Audyt luk w zabezpieczeniach", diff --git a/src/i18n/locales/pt-BR.json b/src/i18n/locales/pt-BR.json index 692da35a1..06fd2c3eb 100644 --- a/src/i18n/locales/pt-BR.json +++ b/src/i18n/locales/pt-BR.json @@ -41,6 +41,7 @@ "api_keys": "Chaves de API", "api_token": "Token de API", "api_token_header": "api_token_header", + "assign_role": "Atribuir função", "base_url": "URL base", "bearer_token_auth_enable": "Autenticar com um token de acesso pessoal", "bom_formats": "Formatos de lista de materiais", @@ -372,6 +373,7 @@ "apply_vex": "Aplicar VEX", "apply_vex_tooltip": "Aplique análises de um documento Vulnerability Exploitability eXchange (VEX) a este projeto.", "approved": "Aprovado", + "assign": "Atribuir", "attributed_on": "Atribuído em", "audit_trail": "Trilha de auditoria", "audit_vulnerabilities": "Vulnerabilidades de auditoria", diff --git a/src/i18n/locales/pt.json b/src/i18n/locales/pt.json index 5caa081cd..20ee41bb5 100644 --- a/src/i18n/locales/pt.json +++ b/src/i18n/locales/pt.json @@ -41,6 +41,7 @@ "api_keys": "Chaves de API", "api_token": "Token de API", "api_token_header": "api_token_header", + "assign_role": "Atribuir função", "base_url": "URL base", "bearer_token_auth_enable": "Autenticar com um token de acesso pessoal", "bom_formats": "Formatos de lista de materiais", @@ -373,6 +374,7 @@ "apply_vex_tooltip": "Aplique análises de um documento Vulnerability Exploitability eXchange (VEX) a este projeto.", "approved": "Aprovado", "attributed_on": "Atribuído em", + "assign": "Atribuir", "audit_trail": "Trilha de auditoria", "audit_vulnerabilities": "Vulnerabilidades de auditoria", "auditing_progress": "Progresso da auditoria", diff --git a/src/i18n/locales/ru.json b/src/i18n/locales/ru.json index 7420559ba..ea54b1566 100644 --- a/src/i18n/locales/ru.json +++ b/src/i18n/locales/ru.json @@ -41,6 +41,7 @@ "api_keys": "Ключи API", "api_token": "Токен API", "api_token_header": "Заголовок токена API", + "assign_role": "Назначить роль", "base_url": "Базовый URL", "bearer_token_auth_enable": "Аутентификация с помощью токена доступа", "bom_formats": "Форматы BOM", @@ -373,6 +374,7 @@ "apply_vex_tooltip": "Применить анализ из документа Vulnerability Exploitability eXchange (VEX) к этому проекту.", "approved": "Одобрено", "attributed_on": "Указано на", + "assign": "Назначить", "audit_trail": "Журнал аудита", "audit_vulnerabilities": "Аудит уязвимостей", "auditing_progress": "Прогресс аудита", diff --git a/src/i18n/locales/uk-UA.json b/src/i18n/locales/uk-UA.json index 761337234..e32d0196e 100644 --- a/src/i18n/locales/uk-UA.json +++ b/src/i18n/locales/uk-UA.json @@ -41,6 +41,7 @@ "api_keys": "Ключі API", "api_token": "Маркер API", "api_token_header": "Заголовок маркера API", + "assign_role": "Призначити роль", "base_url": "Базовий URL", "bearer_token_auth_enable": "Автентифікуйте за допомогою особистого маркера доступу", "bom_formats": "Формати BOM", @@ -372,6 +373,7 @@ "apply_vex": "Застосуйте VEX", "apply_vex_tooltip": "Застосуйте до цього проекту аналіз із документа Vulnerability Exploitability eXchange (VEX).", "approved": "Затверджено", + "assign": "Призначити", "attributed_on": "Приписується", "audit_trail": "Аудиторський слід", "audit_vulnerabilities": "Уразливості аудиту", diff --git a/src/i18n/locales/zh.json b/src/i18n/locales/zh.json index e69011e85..72bbb317f 100644 --- a/src/i18n/locales/zh.json +++ b/src/i18n/locales/zh.json @@ -41,6 +41,7 @@ "api_keys": "API 密钥", "api_token": "API 令牌", "api_token_header": "API Token Header", + "assign_role": "分配角色", "base_url": "基本 URL", "bearer_token_auth_enable": "使用个人访问令牌进行身份验证", "bom_formats": "BOM 格式", @@ -373,6 +374,7 @@ "apply_vex_tooltip": "将漏洞可利用性交换 (VEX) 文档的分析应用于该项目。", "approved": "批准", "attributed_on": "归因于", + "assign": "分配", "audit_trail": "审计追踪", "audit_vulnerabilities": "审计漏洞", "auditing_progress": "审计进度", diff --git a/src/mixins/rolesMixin.js b/src/mixins/rolesMixin.js new file mode 100644 index 000000000..e822d0265 --- /dev/null +++ b/src/mixins/rolesMixin.js @@ -0,0 +1,53 @@ +/* eslint-disable prettier/prettier */ +import EventBus from '../shared/eventbus'; + +export default { + data() { + return { + projectRoles: [Object], + }; + }, + mounted() { + EventBus.$on('admin:ldapusers:rowUpdate', (index, row) => { + this.$refs.table.updateRow({ index: index, row: row }); + this.$refs.table.expandRow(index); + }); + EventBus.$on('admin:ldapusers:rowDeleted', (index, row) => { + this.refreshTable(); + }); + }, + methods: { + loadUserRoles: function (username) { + let url = `${this.$api.BASE_URL}/${this.$api.URL_ROLE}/${username}/roles`; + return this.axios + .get(url) + .then((response) => { + this.projectRoles = response.data; + }) + .catch((error) => { + console.error('Error loading user roles:', error); + this.projectRoles = []; + }); + }, + unassignRole: function (projectRole, username) { + let url = `${this.$api.BASE_URL}/${this.$api.URL_USER}/${username}/role`; + this.axios + .delete(url, { + data: { + roleUUID: projectRole.role.uuid, + projectUUID: projectRole.project.uuid, + }, + }) + .then((response) => { + this.syncVariables(response.data); + // Emit an event to update the component + this.$root.$emit('admin:ldapusers:rowUpdate', this.ldapUser); + this.$toastr.s(this.$t('message.updated')); + }) + .catch((error) => { + this.$toastr.w(this.$t('condition.unsuccessful_action')); + }); + }, + }, +}; + diff --git a/src/shared/api.json b/src/shared/api.json index 83a82affc..b6553b8f2 100644 --- a/src/shared/api.json +++ b/src/shared/api.json @@ -13,6 +13,7 @@ "URL_ABOUT": "api/version", "URL_ACL_MAPPING": "api/v1/acl/mapping", "URL_ACL_TEAM": "api/v1/acl/team", + "URL_ACL_USER": "api/v1/acl/user", "URL_ANALYSIS": "api/v1/analysis", "URL_BOM": "api/v1/bom", "URL_CALCULATOR_CVSS": "api/v1/calculator/cvss", diff --git a/src/shared/permissions.js b/src/shared/permissions.js index 632b54541..11bd024c6 100644 --- a/src/shared/permissions.js +++ b/src/shared/permissions.js @@ -1,45 +1,47 @@ /* eslint-disable prettier/prettier */ // API Permissions +export const ACCESS_MANAGEMENT = 'ACCESS_MANAGEMENT'; +export const ACCESS_MANAGEMENT_CREATE = 'ACCESS_MANAGEMENT_CREATE'; +export const ACCESS_MANAGEMENT_DELETE = 'ACCESS_MANAGEMENT_DELETE'; +export const ACCESS_MANAGEMENT_READ = 'ACCESS_MANAGEMENT_READ'; +export const ACCESS_MANAGEMENT_UPDATE = 'ACCESS_MANAGEMENT_UPDATE'; export const BOM_UPLOAD = 'BOM_UPLOAD'; -export const VIEW_PORTFOLIO = 'VIEW_PORTFOLIO'; +export const POLICY_MANAGEMENT = 'POLICY_MANAGEMENT'; +export const POLICY_MANAGEMENT_CREATE = 'POLICY_MANAGEMENT_CREATE'; +export const POLICY_MANAGEMENT_DELETE = 'POLICY_MANAGEMENT_DELETE'; +export const POLICY_MANAGEMENT_READ = 'POLICY_MANAGEMENT_READ'; +export const POLICY_MANAGEMENT_UPDATE = 'POLICY_MANAGEMENT_UPDATE'; +export const POLICY_VIOLATION_ANALYSIS = 'POLICY_VIOLATION_ANALYSIS'; export const PORTFOLIO_MANAGEMENT = 'PORTFOLIO_MANAGEMENT'; export const PORTFOLIO_MANAGEMENT_CREATE = 'PORTFOLIO_MANAGEMENT_CREATE'; +export const PORTFOLIO_MANAGEMENT_DELETE = 'PORTFOLIO_MANAGEMENT_DELETE'; export const PORTFOLIO_MANAGEMENT_READ = 'PORTFOLIO_MANAGEMENT_READ'; export const PORTFOLIO_MANAGEMENT_UPDATE = 'PORTFOLIO_MANAGEMENT_UPDATE'; -export const PORTFOLIO_MANAGEMENT_DELETE = 'PORTFOLIO_MANAGEMENT_DELETE'; +export const PROJECT_CREATION_UPLOAD = 'PROJECT_CREATION_UPLOAD'; +export const ROLE_MANAGEMENT = 'ROLE_MANAGEMENT'; +export const ROLE_MANAGEMENT_CREATE = 'ROLE_MANAGEMENT_CREATE'; +export const ROLE_MANAGEMENT_DELETE = 'ROLE_MANAGEMENT_DELETE'; +export const ROLE_MANAGEMENT_READ = 'ROLE_MANAGEMENT_READ'; +export const ROLE_MANAGEMENT_UPDATE = 'ROLE_MANAGEMENT_UPDATE'; +export const SYSTEM_CONFIGURATION = 'SYSTEM_CONFIGURATION'; +export const SYSTEM_CONFIGURATION_CREATE = 'SYSTEM_CONFIGURATION_CREATE'; +export const SYSTEM_CONFIGURATION_DELETE = 'SYSTEM_CONFIGURATION_DELETE'; +export const SYSTEM_CONFIGURATION_READ = 'SYSTEM_CONFIGURATION_READ'; +export const SYSTEM_CONFIGURATION_UPDATE = 'SYSTEM_CONFIGURATION_UPDATE'; +export const TAG_MANAGEMENT = 'TAG_MANAGEMENT'; +export const TAG_MANAGEMENT_DELETE = 'TAG_MANAGEMENT_DELETE'; +export const VIEW_POLICY_VIOLATION = 'VIEW_POLICY_VIOLATION'; +export const VIEW_PORTFOLIO = 'VIEW_PORTFOLIO'; export const VIEW_VULNERABILITY = 'VIEW_VULNERABILITY'; export const VULNERABILITY_ANALYSIS = 'VULNERABILITY_ANALYSIS'; export const VULNERABILITY_ANALYSIS_CREATE = 'VULNERABILITY_ANALYSIS_CREATE'; export const VULNERABILITY_ANALYSIS_READ = 'VULNERABILITY_ANALYSIS_READ'; export const VULNERABILITY_ANALYSIS_UPDATE = 'VULNERABILITY_ANALYSIS_UPDATE'; -export const VIEW_POLICY_VIOLATION = 'VIEW_POLICY_VIOLATION'; export const VULNERABILITY_MANAGEMENT = 'VULNERABILITY_MANAGEMENT'; -export const VULNERABILITY_MANAGEMENT_CREATE = - 'VULNERABILITY_MANAGEMENT_CREATE'; +export const VULNERABILITY_MANAGEMENT_CREATE = 'VULNERABILITY_MANAGEMENT_CREATE'; +export const VULNERABILITY_MANAGEMENT_DELETE = 'VULNERABILITY_MANAGEMENT_DELETE'; export const VULNERABILITY_MANAGEMENT_READ = 'VULNERABILITY_MANAGEMENT_READ'; -export const VULNERABILITY_MANAGEMENT_UPDATE = - 'VULNERABILITY_MANAGEMENT_UPDATE'; -export const VULNERABILITY_MANAGEMENT_DELETE = - 'VULNERABILITY_MANAGEMENT_DELETE'; -export const POLICY_VIOLATION_ANALYSIS = 'POLICY_VIOLATION_ANALYSIS'; -export const ACCESS_MANAGEMENT = 'ACCESS_MANAGEMENT'; -export const ACCESS_MANAGEMENT_CREATE = 'ACCESS_MANAGEMENT_CREATE'; -export const ACCESS_MANAGEMENT_READ = 'ACCESS_MANAGEMENT_READ'; -export const ACCESS_MANAGEMENT_UPDATE = 'ACCESS_MANAGEMENT_UPDATE'; -export const ACCESS_MANAGEMENT_DELETE = 'ACCESS_MANAGEMENT_DELETE'; -export const SYSTEM_CONFIGURATION = 'SYSTEM_CONFIGURATION'; -export const SYSTEM_CONFIGURATION_CREATE = 'SYSTEM_CONFIGURATION_CREATE'; -export const SYSTEM_CONFIGURATION_READ = 'SYSTEM_CONFIGURATION_READ'; -export const SYSTEM_CONFIGURATION_UPDATE = 'SYSTEM_CONFIGURATION_UPDATE'; -export const SYSTEM_CONFIGURATION_DELETE = 'SYSTEM_CONFIGURATION_DELETE'; -export const PROJECT_CREATION_UPLOAD = 'PROJECT_CREATION_UPLOAD'; -export const POLICY_MANAGEMENT = 'POLICY_MANAGEMENT'; -export const POLICY_MANAGEMENT_CREATE = 'POLICY_MANAGEMENT_CREATE'; -export const POLICY_MANAGEMENT_READ = 'POLICY_MANAGEMENT_READ'; -export const POLICY_MANAGEMENT_UPDATE = 'POLICY_MANAGEMENT_UPDATE'; -export const POLICY_MANAGEMENT_DELETE = 'POLICY_MANAGEMENT_DELETE'; -export const TAG_MANAGEMENT = 'TAG_MANAGEMENT'; -export const TAG_MANAGEMENT_DELETE = 'TAG_MANAGEMENT_DELETE'; +export const VULNERABILITY_MANAGEMENT_UPDATE = 'VULNERABILITY_MANAGEMENT_UPDATE'; /** * Determines if the current logged in user has a specific permission. diff --git a/src/views/administration/accessmanagement/LdapUsers.vue b/src/views/administration/accessmanagement/LdapUsers.vue index 377c9ddb4..2284465d5 100644 --- a/src/views/administration/accessmanagement/LdapUsers.vue +++ b/src/views/administration/accessmanagement/LdapUsers.vue @@ -19,7 +19,6 @@ - @@ -31,11 +30,12 @@ import CreateLdapUserModal from './CreateLdapUserModal'; import bootstrapTableMixin from '../../../mixins/bootstrapTableMixin'; import EventBus from '../../../shared/eventbus'; import ActionableListGroupItem from '../../components/ActionableListGroupItem'; +import ProjectRoleListGroupItem from './ProjectRoleListGroupItem.vue'; import SelectTeamModal from './SelectTeamModal'; import SelectPermissionModal from './SelectPermissionModal'; import permissionsMixin from '../../../mixins/permissionsMixin'; import SelectRoleModal from './SelectRoleModal.vue'; -import SelectProjectModal from './SelectProjectModal.vue'; +import rolesMixin from '../../../mixins/rolesMixin'; export default { props: { @@ -44,7 +44,6 @@ export default { mixins: [bootstrapTableMixin], components: { CreateLdapUserModal, - SelectProjectModal, }, mounted() { EventBus.$on('admin:ldapusers:rowUpdate', (index, row) => { @@ -90,18 +89,6 @@ export default { : 0; }, }, - { - title: this.$t('admin.roles'), - field: 'roles', - sortable: false, - formatter(value, row, index) { - return value - ? xssFilters.inHTMLData( - common.valueWithDefault(value.length, '0'), - ) - : 0; - }, - }, ], data: [], options: { @@ -125,7 +112,7 @@ export default { i18n, template: ` - +
@@ -134,39 +121,40 @@ export default {
- +
- - + + - +
- +
- - + + - +
-
- {{ $t('admin.delete_user') }} -
- + +
+ {{ $t('admin.delete_user') }} +
+
+ -
`, - mixins: [permissionsMixin], + mixins: [permissionsMixin, rolesMixin], components: { ActionableListGroupItem, + ProjectRoleListGroupItem, SelectRoleModal, SelectTeamModal, SelectPermissionModal, - SelectProjectModal, }, data() { return { @@ -174,10 +162,12 @@ export default { username: row.username, teams: row.teams, permissions: row.permissions, - projects: row.projects, - mappedroles: row.mappedroles, + projectRoles: [], }; }, + created() { + this.loadUserRoles(this.username); + }, methods: { deleteUser: function () { let url = `${this.$api.BASE_URL}/${this.$api.URL_USER_LDAP}`; @@ -241,102 +231,8 @@ export default { this.$toastr.w(this.$t('condition.unsuccessful_action')); }); }, - updateRoleSelection: function (selections) { - this.$root.$emit('bv::hide::modal', 'selectRoleModal'); - for (let i = 0; i < selections.length; i++) { - let selection = selections[i]; - let url = `${this.$api.BASE_URL}/${this.$api.URL_USER}/${this.username}/role`; - this.axios - .post(url, { - uuid: selection.uuid, - }) - .then((response) => { - this.syncVariables(response.data); - EventBus.$emit( - 'admin:ldapusers:rowUpdate', - index, - this.ldapUser, - ); - this.$toastr.s(this.$t('message.updated')); - }) - .catch((error) => { - if (error.response.status === 304) { - //this.$toastr.w(this.$t('condition.unsuccessful_action')); - } else { - this.$toastr.w( - this.$t('condition.unsuccessful_action'), - ); - } - }); - } - }, - updateProjectSelection: function (selections) { - this.$root.$emit('bv::hide::modal', 'selectProjectModal'); - for (let i = 0; i < selections.length; i++) { - let selection = selections[i]; - let url = `${this.$api.BASE_URL}/${this.$api.URL_USER}/${this.username}/project`; - this.axios - .post(url, { - uuid: selection.uuid, - }) - .then((response) => { - this.syncVariables(response.data); - EventBus.$emit( - 'admin:ldapusers:rowUpdate', - index, - this.ldapUser, - ); - this.$toastr.s(this.$t('message.updated')); - }) - .catch((error) => { - if (error.response.status === 304) { - //this.$toastr.w(this.$t('condition.unsuccessful_action')); - } else { - this.$toastr.w( - this.$t('condition.unsuccessful_action'), - ); - } - }); - } - }, - removeProjectMembership: function (projectUuid) { - let url = `${this.$api.BASE_URL}/${this.$api.URL_USER}/${this.username}/project`; - this.axios - .delete(url, { data: { uuid: projectUuid } }) - .then((response) => { - this.syncVariables(response.data); - EventBus.$emit( - 'admin:ldapusers:rowUpdate', - index, - this.ldapUser, - ); - this.$toastr.s(this.$t('message.updated')); - }) - .catch((error) => { - this.$toastr.w(this.$t('condition.unsuccessful_action')); - }); - }, removeRole: function (role) { - let url = `${this.$api.BASE_URL}/${this.$api.URL_USER}/${this.username}/role`; - this.axios - .delete(url, { - data: { - roleName: role.name, - projectName: role.projectName, - }, - }) - .then((response) => { - this.syncVariables(response.data); - EventBus.$emit( - 'admin:ldapusers:rowUpdate', - index, - this.ldapUser, - ); - this.$toastr.s(this.$t('message.updated')); - }) - .catch((error) => { - this.$toastr.w(this.$t('condition.unsuccessful_action')); - }); + this.unassignRole(role, this.username); }, updatePermissionSelection: function (selections) { this.$root.$emit('bv::hide::modal', 'selectPermissionModal'); @@ -376,10 +272,16 @@ export default { syncVariables: function (ldapUser) { this.ldapUser = ldapUser; this.username = ldapUser.username; - this.roles = ldapUser.roles; + this.loadUserRoles(); this.teams = ldapUser.teams; this.permissions = ldapUser.permissions; }, + updateRoleSelection: function () { + this.$root.$emit('bv::hide::modal', 'selectRoleModal'); + this.$toastr.s(this.$t('message.updated')); + this.loadUserRoles(); + this.refreshTable(); + }, }, }); }, diff --git a/src/views/administration/accessmanagement/ManagedUsers.vue b/src/views/administration/accessmanagement/ManagedUsers.vue index e9ea81ca3..4e793d910 100644 --- a/src/views/administration/accessmanagement/ManagedUsers.vue +++ b/src/views/administration/accessmanagement/ManagedUsers.vue @@ -36,8 +36,6 @@ import SelectPermissionModal from './SelectPermissionModal'; import permissionsMixin from '../../../mixins/permissionsMixin'; import { Switch as cSwitch } from '@coreui/vue'; import BInputGroupFormInput from '../../../forms/BInputGroupFormInput'; -import SelectRoleModal from './SelectRoleModal.vue'; -import RoleFormInputGroup from './RoleFormInputGroup.vue'; export default { props: { @@ -139,11 +137,6 @@ export default { - -
- -
-
+ +
+ {{ projectRole.role.name }} +
+ + + + + + +
+
+

{{ projectRole.project.name }}

+
+ + + + + diff --git a/src/views/administration/accessmanagement/RoleFormInputGroup.vue b/src/views/administration/accessmanagement/RoleFormInputGroup.vue deleted file mode 100644 index 2ad6fc698..000000000 --- a/src/views/administration/accessmanagement/RoleFormInputGroup.vue +++ /dev/null @@ -1,105 +0,0 @@ - - - diff --git a/src/views/administration/accessmanagement/SelectRoleModal.vue b/src/views/administration/accessmanagement/SelectRoleModal.vue index c92ca80c6..c58606278 100644 --- a/src/views/administration/accessmanagement/SelectRoleModal.vue +++ b/src/views/administration/accessmanagement/SelectRoleModal.vue @@ -7,33 +7,33 @@ no-stacking :title="$t('admin.assign_role')" > - - - -
- - - - -
-
+ + + - + @@ -41,7 +41,7 @@ {{ $t('message.close') }} - {{ + {{ $t('message.assign') }} @@ -50,40 +50,32 @@ diff --git a/src/views/administration/accessmanagement/SelectRoleModal.vue b/src/views/administration/accessmanagement/SelectRoleModal.vue index c58606278..c1aaaf6aa 100644 --- a/src/views/administration/accessmanagement/SelectRoleModal.vue +++ b/src/views/administration/accessmanagement/SelectRoleModal.vue @@ -41,9 +41,12 @@ {{ $t('message.close') }} - {{ - $t('message.assign') - }} + + {{$t('message.assign')}} @@ -83,23 +86,10 @@ export default { }; }, methods: { - createRoleMapping: function () { - let url = `${this.$api.BASE_URL}/${this.$api.URL_USER}/${this.user}/role`; - this.axios - .post(url, { - roleUUID: this.selectedRole, - projectUUID: this.selectedProject, - }) - .then((response) => { - this.$emit('refreshTable'); - this.$toastr.s(this.$t('admin.role_assigned')); - this.$root.$emit('bv::hide::modal', 'selectRoleModal'); - this.$emit('refreshTable'); - }) - .catch((error) => { - this.$toastr.w(this.$t('condition.unsuccessful_action')); - this.$root.$emit('bv::hide::modal', 'selectRoleModal'); - }); + handleSelection: function() { + const selection = {role: this.selectedRole, project: this.selectedProject} + this.$root.$emit("bv::hide::modal", this.$children[0].id) //only one child of @@ -82,34 +80,39 @@ export default { }; }, methods: { - handleSelection: function() { - if(!this.selectedRole || !this.selectedProject) { + handleSelection: function () { + if (!this.selectedRole || !this.selectedProject) { return; } - const selection = {role: this.selectedRole, project: this.selectedProject} - this.$root.$emit("bv::hide::modal", this.$children[0].id) //or just 'selectRoleModal' - this.$emit('selection', selection) + const selection = { + role: this.selectedRole, + project: this.selectedProject, + }; + this.$root.$emit('bv::hide::modal', this.$children[0].id); //or just 'selectRoleModal' + this.$emit('selection', selection); }, loadAvailableRoles: function () { - let url = `${this.$api.BASE_URL}/${this.$api.URL_ROLE}`; + const url = `${this.$api.BASE_URL}/${this.$api.URL_ROLE}`; this.axios .get(url) .then((response) => { this.availableRoles = response.data; }) .catch((error) => { + console.error(error); this.$toastr.w(this.$t('condition.unsuccessful_action')); }); }, loadProjects: function () { - let url = `${this.$api.BASE_URL}/${this.$api.URL_ACL_USER}/${this.user}`; + const url = `${this.$api.BASE_URL}/${this.$api.URL_ACL_USER}/${this.user}`; this.axios .get(url) .then((response) => { this.availableProjects = response.data; }) .catch((error) => { + console.error(error); this.$toastr.w(this.$t('condition.unsuccessful_action')); }); }, From cdbb81869173f867bdbfb5e12486b1c87cf1a612 Mon Sep 17 00:00:00 2001 From: Allen Shearin Date: Wed, 2 Apr 2025 13:14:43 -0600 Subject: [PATCH 14/25] fix: fix projectlist refresh, add translation Signed-off-by: Allen Shearin --- src/i18n/locales/de.json | 25 +++++++------- src/i18n/locales/en.json | 19 ++++++++--- src/i18n/locales/es.json | 25 +++++++------- src/i18n/locales/fr.json | 25 +++++++------- src/i18n/locales/hi.json | 21 +++++------- src/i18n/locales/it.json | 25 +++++++------- src/i18n/locales/ja.json | 27 +++++++-------- src/i18n/locales/pl.json | 24 +++++++------- src/i18n/locales/pt-BR.json | 25 +++++++------- src/i18n/locales/pt.json | 27 +++++++-------- src/i18n/locales/ru.json | 27 +++++++-------- src/i18n/locales/uk-UA.json | 25 +++++++------- src/i18n/locales/zh.json | 27 +++++++-------- src/mixins/userManagementMixin.js | 10 +++--- .../accessmanagement/ManagedUsers.vue | 3 -- .../accessmanagement/SelectRoleModal.vue | 33 +++++++++++++------ 16 files changed, 198 insertions(+), 170 deletions(-) diff --git a/src/i18n/locales/de.json b/src/i18n/locales/de.json index 26500e8fc..99760b35b 100644 --- a/src/i18n/locales/de.json +++ b/src/i18n/locales/de.json @@ -89,6 +89,7 @@ "disabled_for_tags": "Deaktiviert für Tags", "distinguished_name": "Distinguished Name", "edit_api_key_comment": "Kommentar zum API-Schlüssel bearbeiten", + "edit_role": "Rolle bearbeiten", "email": "E-Mail", "email_address": "E-Mail-Adresse", "email_enable_ssltls": "SSL/TLS-Verschlüsselung aktivieren", @@ -175,6 +176,7 @@ "new_api_key": "Dies ist der neu erzeugte API -Schlüssel. \nBitte beachten Sie, dass es nur einmal angezeigt wird und später nicht abgerufen werden kann.", "new_api_key_title": "Neuer API -Schlüssel", "nixpkgs": "Nixpkgs", + "no_unassigned_projects": "Keine nicht zugewiesenen Projekte", "notification_level": "Level", "notifications": "Benachrichtigungen", "npm": "NPM", @@ -199,7 +201,10 @@ "personal_access_token": "Persönlicher Zugriffstoken", "portfolio_access_control": "Portfolio-Zugriffskontrolle", "preview": "Vorschau", + "project": "Projekt", "project_access": "Projektzugriff", + "project_membership": "Projektmitgliedschaft", + "project_name": "Projektname", "project_retention_enable": "Aktivieren Sie das Löschen inaktiver Projekte", "publisher": "Publisher", "publisher_class": "Publisher-Klasse", @@ -217,6 +222,9 @@ "reindex_vulnerabilities": "Sicherheitslücken", "reindex_vulnerable_software": "Anfällige Software", "remove_api_key": "remove_api_key", + "remove_permission": "Erlaubnis entfernen", + "remove_role": "Rolle entfernen", + "remove_team_membership": "Mitgliedschaft entfernen", "repositories": "Repositorys", "repository_authentication": "Authentifizierung erforderlich", "repository_created": "Repository erstellt", @@ -240,8 +248,11 @@ "risk_score_weight_medium": "Mittel (Standard: 3)", "risk_score_weight_unassigned": "Nicht zugewiesen (Standard: 5)", "risk_score_weighting_description": "Sie können die Gewichtung jedes Schweregrads anpassen, um die Risikobewertung anzupassen.", + "role": "Rolle", + "role_assigned": "Rolle zugewiesen", "role_created": "Rolle erstellt", "role_deleted": "Rolle gelöscht", + "role_membership": "Rollenmitgliedschaft", "role_name": "Rollenname", "roles": "Rollen", "scope": "Scope", @@ -250,6 +261,7 @@ "select_oidc_group": "OpenID Connect-Gruppe auswählen", "select_permission": "Berechtigung auswählen", "select_project": "Projekt auswählen", + "select_role": "Rolle auswählen", "select_team": "Team auswählen", "select_team_as_recipient": "Team als Empfänger auswählen", "snyk": "Snyk (Beta)", @@ -310,18 +322,7 @@ "welcome_message_desc": "Passen Sie die Willkommensnachricht an, die auf der Startseite von Dependency-Track angezeigt wird, bevor sich Benutzer anmelden.", "welcome_message_enable": "Willkommensnachricht aktivieren", "workflow_step_timeout": "Schritt-Timeout", - "workflows": "Workflows", - "select_role": "Rolle auswählen", - "role_assigned": "Rolle zugewiesen", - "remove_permission": "Erlaubnis entfernen", - "role_membership": "Rollenmitgliedschaft", - "remove_role": "Rolle entfernen", - "remove_team_membership": "Mitgliedschaft entfernen", - "project_membership": "Projektmitgliedschaft", - "edit_role": "Rolle bearbeiten", - "project": "Projekt", - "project_name": "Projektname", - "role": "Rolle" + "workflows": "Workflows" }, "condition": { "forbidden": "Verboten (403)", diff --git a/src/i18n/locales/en.json b/src/i18n/locales/en.json index 12c0ae444..52adc86fc 100644 --- a/src/i18n/locales/en.json +++ b/src/i18n/locales/en.json @@ -89,6 +89,7 @@ "disabled_for_tags": "Disabled for tags", "distinguished_name": "Distinguished name", "edit_api_key_comment": "Edit API Key Comment", + "edit_role": "Edit Role", "email": "Email", "email_address": "Email address", "email_enable_ssltls": "Enable SSL/TLS encryption", @@ -118,7 +119,6 @@ "general_template_configuration": "General template configuration", "github": "GitHub", "github_advisories": "GitHub Advisories", - "gitlab_integration": "GitLab", "go_modules": "Go Modules", "group": "Group", "hackage": "Hackage", @@ -137,7 +137,6 @@ "integration_defectdojo_enable": "Enable DefectDojo integration", "integration_defectdojo_reimport_enable": "Enable reimport", "integration_fortify_ssc_enable": "Enable Fortify SSC integration", - "integration_gitlab_enable": "Enable GitLab Integration", "integration_kenna_connector_id": "Connector ID", "integration_kenna_enable": "Enable Kenna Security integration", "integrations": "Integrations", @@ -177,6 +176,7 @@ "new_api_key": "This is the newly generated API key. Please note that it will only be displayed once and cannot be retrieved later.", "new_api_key_title": "New API Key", "nixpkgs": "Nixpkgs", + "no_unassigned_projects": "No unassigned projects", "notification_level": "Notification level", "notifications": "Notifications", "npm": "NPM", @@ -222,6 +222,9 @@ "reindex_vulnerabilities": "Vulnerabilities", "reindex_vulnerable_software": "Vulnerable software", "remove_api_key": "Remove API Key", + "remove_permission": "Remove Permission", + "remove_role": "Remove Role", + "remove_team_membership": "Remove Membership", "repositories": "Repositories", "repository_authentication": "Authentication required", "repository_created": "Repository created", @@ -246,8 +249,9 @@ "risk_score_weight_unassigned": "Unassigned (default: 5)", "risk_score_weighting_description": "You can customize the weighting of each severity to customize the risk score.", "role": "Role", - "role_created": "Role created", - "role_deleted": "Role deleted", + "role_assigned": "Role Assigned", + "role_created": "Role Created", + "role_deleted": "Role Deleted", "role_membership": "Role Membership", "role_name": "Role Name", "roles": "Roles", @@ -622,7 +626,14 @@ "object_identifier": "Object Identifier", "object_identifier_desc": "A unique identifier (UUID) that Dependency-Track automatically assigns to every object", "occurred_on": "Occurred On", + "occurrence_line": "Line", + "occurrence_location": "Location", + "occurrence_offset": "Offset", + "occurrence_symbol": "Symbol", + "occurrences": "Occurrences", "occurrences_in_projects": "Occurrences in projects", + "occurrences_none_hint": "Either no occurrences identified, or the tool that generated the BOM does not provide occurrence data.", + "occurrences_of_component": "Occurrences of component {name}", "oidc_availability_check_failed": "Failed to determine availability of OpenID Connect", "oidc_redirect_failed": "An error occurred while redirecting to the OpenID Connect identity provider", "only_direct_tooltip": "Only show direct dependencies, hiding transitive dependencies", diff --git a/src/i18n/locales/es.json b/src/i18n/locales/es.json index b7472db00..c70f208c2 100644 --- a/src/i18n/locales/es.json +++ b/src/i18n/locales/es.json @@ -89,6 +89,7 @@ "disabled_for_tags": "Deshabilitado para etiquetas", "distinguished_name": "Nombre distinguido", "edit_api_key_comment": "edit_api_key_comment", + "edit_role": "Rol de edición", "email": "Correo electrónico", "email_address": "Dirección de correo electrónico", "email_enable_ssltls": "Habilitar el cifrado SSL/TLS", @@ -175,6 +176,7 @@ "new_api_key": "Esta es la clave API recientemente generada. \nTenga en cuenta que solo se mostrará una vez y no se puede recuperar más tarde.", "new_api_key_title": "Nueva clave API", "nixpkgs": "Nixpkgs", + "no_unassigned_projects": "No hay proyectos no asignados", "notification_level": "Nivel de notificación", "notifications": "Notificaciones", "npm": "MNP", @@ -199,7 +201,10 @@ "personal_access_token": "Token de acceso personal", "portfolio_access_control": "Control de acceso al portafolio", "preview": "Avance", + "project": "Proyecto", "project_access": "Acceso al proyecto", + "project_membership": "Membresía del proyecto", + "project_name": "Nombre del proyecto", "project_retention_enable": "Habilitar la eliminación de proyectos inactivos", "publisher": "Editor", "publisher_class": "Clase de editor", @@ -217,6 +222,9 @@ "reindex_vulnerabilities": "Vulnerabilidades", "reindex_vulnerable_software": "software vulnerable", "remove_api_key": "remove_api_key", + "remove_permission": "Eliminar el permiso", + "remove_role": "Eliminar el rol", + "remove_team_membership": "Eliminar la membresía", "repositories": "Repositorios", "repository_authentication": "Autenticacion requerida", "repository_created": "Repositorio creado", @@ -240,8 +248,11 @@ "risk_score_weight_medium": "Medio (predeterminado: 3)", "risk_score_weight_unassigned": "No asignado (predeterminado: 5)", "risk_score_weighting_description": "Puede personalizar la ponderación de cada gravedad para personalizar la puntuación de riesgo.", + "role": "Role", + "role_assigned": "Rol asignado", "role_created": "Rol creado", "role_deleted": "Rol eliminado", + "role_membership": "Membresía de rol", "role_name": "Nombre del rol", "roles": "Roles", "scope": "Alcance", @@ -250,6 +261,7 @@ "select_oidc_group": "Seleccione el grupo de conexión OpenID", "select_permission": "Seleccionar permiso", "select_project": "Seleccionar Proyecto", + "select_role": "Rol de selección", "select_team": "Selecciona un equipo", "select_team_as_recipient": "Seleccionar equipo como destinatario", "snyk": "Snyk (Beta)", @@ -310,18 +322,7 @@ "welcome_message_desc": "Personalice el mensaje de bienvenida que aparece en la página de inicio de Dependency-Track antes de que los usuarios inicien sesión.", "welcome_message_enable": "Habilitar mensaje de bienvenida", "workflow_step_timeout": "Tiempo de espera del paso", - "workflows": "Flujos de trabajo", - "select_role": "Rol de selección", - "role_assigned": "Rol asignado", - "remove_permission": "Eliminar el permiso", - "role_membership": "Membresía de rol", - "remove_role": "Eliminar el rol", - "remove_team_membership": "Eliminar la membresía", - "project_membership": "Membresía del proyecto", - "edit_role": "Rol de edición", - "project": "Proyecto", - "project_name": "Nombre del proyecto", - "role": "Role" + "workflows": "Flujos de trabajo" }, "condition": { "forbidden": "Prohibido (403)", diff --git a/src/i18n/locales/fr.json b/src/i18n/locales/fr.json index 32b245cbe..6d3b26ea9 100644 --- a/src/i18n/locales/fr.json +++ b/src/i18n/locales/fr.json @@ -89,6 +89,7 @@ "disabled_for_tags": "Désactivé pour les balises", "distinguished_name": "Nom distinctif (DN)", "edit_api_key_comment": "Éditer le commentaire de clé d'API", + "edit_role": "Modifier le rôle", "email": "Courriel", "email_address": "Adresse de courriel", "email_enable_ssltls": "Activer le chiffrement SSL/TLS", @@ -175,6 +176,7 @@ "new_api_key": "Il s'agit de la clé API nouvellement générée. \nVeuillez noter qu'il ne sera affiché qu'une seule fois et ne peut pas être récupéré plus tard.", "new_api_key_title": "Nouvelle clé API", "nixpkgs": "Nixpkgs", + "no_unassigned_projects": "Pas de projets non attribués", "notification_level": "Niveau d'alerte", "notifications": "Notifications", "npm": "NPM", @@ -199,7 +201,10 @@ "personal_access_token": "Jeton d'accès personnel", "portfolio_access_control": "Contrôle d'accès au portefolio", "preview": "Aperçu", + "project": "Projet", "project_access": "Accès au projet", + "project_membership": "Adhésion au projet", + "project_name": "Nom du projet", "project_retention_enable": "Activer la suppression des projets inactifs", "publisher": "Éditeur", "publisher_class": "Classe d'éditeur", @@ -217,6 +222,9 @@ "reindex_vulnerabilities": "Vulnérabilités", "reindex_vulnerable_software": "Logiciels vulnérables", "remove_api_key": "Retirer la clé d'API", + "remove_permission": "Supprimer l'autorisation", + "remove_role": "Supprimer le rôle", + "remove_team_membership": "Supprimer", "repositories": "Dépôts", "repository_authentication": "Authentification requise", "repository_created": "Dépôt créé", @@ -240,8 +248,11 @@ "risk_score_weight_medium": "Moyen (par défaut : 3)", "risk_score_weight_unassigned": "Non attribué (par défaut : 5)", "risk_score_weighting_description": "Vous pouvez personnaliser la pondération de chaque gravité pour personnaliser le score de risque.", + "role": "Rôle", + "role_assigned": "Rôle attribué", "role_created": "Rôle créé", "role_deleted": "Rôle supprimé", + "role_membership": "Adhésion au rôle", "role_name": "Nom du rôle", "roles": "Rôles", "scope": "Périmètre", @@ -250,6 +261,7 @@ "select_oidc_group": "Sélectionner le groupe OpenID Connect", "select_permission": "Sélectionner l'autorisation", "select_project": "Sélectionner un projet", + "select_role": "Sélectionner un rôle", "select_team": "Sélectionner une équipe", "select_team_as_recipient": "Sélectionner une équipe comme destinataire", "snyk": "Snyk (bêta)", @@ -310,18 +322,7 @@ "welcome_message_desc": "Personnalisez le message de bienvenue qui apparaît sur la page de démarrage de Dependency-Track avant que les utilisateurs ne se connectent.", "welcome_message_enable": "Activer le message de bienvenue", "workflow_step_timeout": "Délai d'expiration de l'étape", - "workflows": "Flux de travail", - "select_role": "Sélectionner un rôle", - "role_assigned": "Rôle attribué", - "remove_permission": "Supprimer l'autorisation", - "role_membership": "Adhésion au rôle", - "remove_role": "Supprimer le rôle", - "remove_team_membership": "Supprimer", - "project_membership": "Adhésion au projet", - "edit_role": "Modifier le rôle", - "project": "Projet", - "project_name": "Nom du projet", - "role": "Rôle" + "workflows": "Flux de travail" }, "condition": { "forbidden": "Interdit (403)", diff --git a/src/i18n/locales/hi.json b/src/i18n/locales/hi.json index bcb5d5a79..63b7a65c9 100644 --- a/src/i18n/locales/hi.json +++ b/src/i18n/locales/hi.json @@ -89,6 +89,7 @@ "disabled_for_tags": "टैग के लिए अक्षम", "distinguished_name": "विशिष्ट नाम", "edit_api_key_comment": "edit_api_key_comment", + "edit_role": "भूमिका संपादित करें", "email": "ईमेल", "email_address": "मेल पता", "email_enable_ssltls": "SSL/TLS एन्क्रिप्शन सक्षम करें", @@ -175,6 +176,7 @@ "new_api_key": "यह नई उत्पन्न एपीआई कुंजी है। \nकृपया ध्यान दें कि यह केवल एक बार प्रदर्शित किया जाएगा और बाद में पुनर्प्राप्त नहीं किया जा सकता है।", "new_api_key_title": "नई एपीआई कुंजी", "nixpkgs": "Nixpkgs", + "no_unassigned_projects": "कोई अनसुना परियोजना नहीं", "notification_level": "अधिसूचना स्तर", "notifications": "सूचनाएं", "npm": "NPM", @@ -200,6 +202,8 @@ "portfolio_access_control": "पोर्टफोलियो एक्सेस नियंत्रण", "preview": "पूर्व दर्शन", "project_access": "परियोजना तक पहुंच", + "project_membership": "परियोजना सदस्यता", + "project_name": "प्रोजेक्ट नाम", "project_retention_enable": "निष्क्रिय प्रोजेक्ट विलोपन सक्षम करें", "publisher": "प्रकाशक", "publisher_class": "प्रकाशक वर्ग", @@ -240,8 +244,11 @@ "risk_score_weight_medium": "मध्यम (डिफ़ॉल्ट: 3)", "risk_score_weight_unassigned": "असाइन नहीं किया गया (डिफ़ॉल्ट: 5)", "risk_score_weighting_description": "आप जोखिम स्कोर को अनुकूलित करने के लिए प्रत्येक गंभीरता के भार को अनुकूलित कर सकते हैं।", + "role": "भूमिका", + "role_assigned": "सौंपी गई भूमिका", "role_created": "भूमिका बनाई गई", "role_deleted": "भूमिका हटा दी गई", + "role_membership": "भूमिका सदस्यता", "role_name": "भूमिका का नाम", "roles": "भूमिकाएँ", "scope": "दायरा", @@ -250,6 +257,7 @@ "select_oidc_group": "OpenID कनेक्ट समूह का चयन करें", "select_permission": "अनुमति चुनें", "select_project": "प्रोजेक्ट चुनें", + "select_role": "भूमिका का चयन करें", "select_team": "टीम का चयन", "select_team_as_recipient": "प्राप्तकर्ता के रूप में टीम का चयन करें", "snyk": "स्निक (बीटा)", @@ -310,18 +318,7 @@ "welcome_message_desc": "उपयोगकर्ताओं के साइन इन करने से पहले डिपेंडेंसी-ट्रैक के आरंभ पृष्ठ पर दिखाई देने वाले स्वागत संदेश को अनुकूलित करें।", "welcome_message_enable": "स्वागत संदेश सक्षम करें", "workflow_step_timeout": "चरण समयबाह्य", - "workflows": "वर्कफ़्लो", - "select_role": "भूमिका का चयन करें", - "role_assigned": "सौंपी गई भूमिका", - "remove_permission": "अनुमति निकालें", - "role_membership": "भूमिका सदस्यता", - "remove_role": "भूमिका को दूर करना", - "remove_team_membership": "सदस्यता निकालें", - "project_membership": "परियोजना सदस्यता", - "edit_role": "भूमिका संपादित करें", - "project": "परियोजना", - "project_name": "प्रोजेक्ट नाम", - "role": "भूमिका" + "workflows": "वर्कफ़्लो" }, "condition": { "forbidden": "निषिद्ध (403)", diff --git a/src/i18n/locales/it.json b/src/i18n/locales/it.json index 4e65ce5a3..b12a4eb13 100644 --- a/src/i18n/locales/it.json +++ b/src/i18n/locales/it.json @@ -89,6 +89,7 @@ "disabled_for_tags": "Disabilitato per i tag", "distinguished_name": "Nome distinto", "edit_api_key_comment": "edit_api_key_comment", + "edit_role": "Modifica il ruolo", "email": "E-mail", "email_address": "Indirizzo e-mail", "email_enable_ssltls": "Abilita la crittografia SSL/TLS", @@ -175,6 +176,7 @@ "new_api_key": "Questa è la chiave API di recente generazione. \nSi prega di notare che verrà visualizzato solo una volta e non può essere recuperato più tardi.", "new_api_key_title": "Nuova chiave API", "nixpkgs": "Nixpkgs", + "no_unassigned_projects": "Nessun progetto non assegnato", "notification_level": "Livello di notifica", "notifications": "Notifiche", "npm": "NPM", @@ -199,7 +201,10 @@ "personal_access_token": "Token di accesso personale", "portfolio_access_control": "Controllo degli accessi al portafoglio", "preview": "Anteprima", + "project": "Progetto", "project_access": "Accesso al progetto", + "project_membership": "Iscrizione al progetto", + "project_name": "Nome del progetto", "project_retention_enable": "Abilita l'eliminazione del progetto inattivo", "publisher": "Editore", "publisher_class": "Classe editore", @@ -217,6 +222,9 @@ "reindex_vulnerabilities": "Vulnerabilità", "reindex_vulnerable_software": "Software vulnerabile", "remove_api_key": "remove_api_key", + "remove_permission": "Rimuovere l'autorizzazione", + "remove_role": "Rimuovere il ruolo", + "remove_team_membership": "Rimuovere l'adesione", "repositories": "Repository", "repository_authentication": "Autenticazione richiesta", "repository_created": "Archivio creato", @@ -240,8 +248,11 @@ "risk_score_weight_medium": "Medio (predefinito: 3)", "risk_score_weight_unassigned": "Non assegnato (impostazione predefinita: 5)", "risk_score_weighting_description": "È possibile personalizzare la ponderazione di ciascuna gravità per personalizzare il punteggio di rischio.", + "role": "Ruolo", + "role_assigned": "Ruolo assegnato", "role_created": "Ruolo creato", "role_deleted": "Ruolo eliminato", + "role_membership": "Appartenenza al ruolo", "role_name": "Nome del ruolo", "roles": "Ruoli", "scope": "Scopo", @@ -250,6 +261,7 @@ "select_oidc_group": "Seleziona Gruppo OpenID Connect", "select_permission": "Seleziona l'autorizzazione", "select_project": "Seleziona Progetto", + "select_role": "Seleziona il ruolo", "select_team": "Selezionare squadra", "select_team_as_recipient": "Seleziona la squadra come destinatario", "snyk": "Snyk (Beta)", @@ -310,18 +322,7 @@ "welcome_message_desc": "Personalizza il messaggio di benvenuto che appare nella pagina iniziale di Dependency-Track prima che gli utenti accedano.", "welcome_message_enable": "Abilita il messaggio di benvenuto", "workflow_step_timeout": "Passaggio Timeout", - "workflows": "Flussi di lavoro", - "select_role": "Seleziona il ruolo", - "role_assigned": "Ruolo assegnato", - "remove_permission": "Rimuovere l'autorizzazione", - "role_membership": "Appartenenza al ruolo", - "remove_role": "Rimuovere il ruolo", - "remove_team_membership": "Rimuovere l'adesione", - "project_membership": "Iscrizione al progetto", - "edit_role": "Modifica il ruolo", - "project": "Progetto", - "project_name": "Nome del progetto", - "role": "Ruolo" + "workflows": "Flussi di lavoro" }, "condition": { "forbidden": "Proibito (403)", diff --git a/src/i18n/locales/ja.json b/src/i18n/locales/ja.json index 359a4724b..095967e3e 100644 --- a/src/i18n/locales/ja.json +++ b/src/i18n/locales/ja.json @@ -89,6 +89,7 @@ "disabled_for_tags": "タグが無効になっています", "distinguished_name": "識別名", "edit_api_key_comment": "edit_api_key_comment", + "edit_role": "役割を編集します", "email": "Eメール", "email_address": "Eメールアドレス", "email_enable_ssltls": "SSL/TLS暗号化を有効にする", @@ -132,7 +133,7 @@ "index_general_description": "Dependency Track は Apache Lucene を使用して、プロジェクトや脆弱性などのさまざまなエンティティの全文検索を可能にします。", "index_issues_description": "時間の経過とともに、Lucene インデックスは劣化したり、Dependency Track データベースからずれたりすることがあります。DT はずれを最小限に抑えるために最善を尽くしますが、必要に応じてインデックスをチェックしたり復元したりするために、以下の管理機能が提供されています。使用には注意が必要です。", "index_rebuild_description": "一部またはすべてのインデックスの選択的な再構築を即時に開始できます。インデックスの再構築は非同期タスクとして実行されます。Dependency Trackのログから進行状況を確認できます。", - "index_use_cases": "全文検索機能は、主に検索 API (すべてのインデックス) と CPE 上の内部アナライザーのあいまい一致 (脆弱なソフトウェア インデックス) に使用されます。", + "index_use_cases": "全文検索功能は、主に検索 API (すべてのインデックス) と CPE 上の内部アナライザーのあいまい一致 (脆弱なソフトウェア インデックス) に使用されます。", "integration_defectdojo_enable": "DefectDojo統合を有効にする", "integration_defectdojo_reimport_enable": "再インポートを有効にする", "integration_fortify_ssc_enable": "Fortify SSC統合を有効にする", @@ -175,6 +176,7 @@ "new_api_key": "これは、新しく生成されたAPIキーです。\nそれは一度しか表示されず、後で取得することはできないことに注意してください。", "new_api_key_title": "新しいAPIキー", "nixpkgs": "Nixpkgs", + "no_unassigned_projects": "割り当てられていないプロジェクトはありません", "notification_level": "通知レベル", "notifications": "通知", "npm": "NPM", @@ -199,7 +201,10 @@ "personal_access_token": "パーソナルアクセストークン", "portfolio_access_control": "ポートフォリオアクセス制御", "preview": "プレビュー", + "project": "プロジェクト", "project_access": "プロジェクトへのアクセス", + "project_membership": "プロジェクトメンバーシップ", + "project_name": "プロジェクト名", "project_retention_enable": "非アクティブなプロジェクトの削除を有効にする", "publisher": "パブリッシャー", "publisher_class": "パブリッシャークラス", @@ -217,6 +222,9 @@ "reindex_vulnerabilities": "脆弱性", "reindex_vulnerable_software": "脆弱なソフトウェア", "remove_api_key": "remove_api_key", + "remove_permission": "許可を削除します", + "remove_role": "役割を削除します", + "remove_team_membership": "メンバーシップを削除します", "repositories": "リポジトリ", "repository_authentication": "認証が必要", "repository_created": "リポジトリが作成されました", @@ -240,8 +248,11 @@ "risk_score_weight_medium": "中 (デフォルト: 3)", "risk_score_weight_unassigned": "未割り当て (デフォルト: 5)", "risk_score_weighting_description": "各重大度の重み付けをカスタマイズして、リスク スコアをカスタマイズできます。", + "role": "役割", + "role_assigned": "割り当てられた役割", "role_created": "ロールを作成しました", "role_deleted": "ロールを削除しました", + "role_membership": "ロールメンバーシップ", "role_name": "ロール名", "roles": "ロール", "scope": "スコープ", @@ -250,6 +261,7 @@ "select_oidc_group": "OpenID Connectグループを選択", "select_permission": "権限を選択", "select_project": "プロジェクトを選択", + "select_role": "役割を選択します", "select_team": "チームを選ぶ", "select_team_as_recipient": "受信者としてチームを選択", "snyk": "Snyk (ベータ版)", @@ -310,18 +322,7 @@ "welcome_message_desc": "ユーザーがサインインする前に、Dependency-Track の開始ページに表示されるウェルカム メッセージをカスタマイズします。", "welcome_message_enable": "ウェルカムメッセージを有効にする", "workflow_step_timeout": "ステップタイムアウト", - "workflows": "ワークフロー", - "select_role": "役割を選択します", - "role_assigned": "割り当てられた役割", - "remove_permission": "許可を削除します", - "role_membership": "ロールメンバーシップ", - "remove_role": "役割を削除します", - "remove_team_membership": "メンバーシップを削除します", - "project_membership": "プロジェクトメンバーシップ", - "edit_role": "役割を編集します", - "project": "プロジェクト", - "project_name": "プロジェクト名", - "role": "役割" + "workflows": "ワークフロー" }, "condition": { "forbidden": "禁止 (403)", diff --git a/src/i18n/locales/pl.json b/src/i18n/locales/pl.json index 784a356d0..ffec9ffe4 100644 --- a/src/i18n/locales/pl.json +++ b/src/i18n/locales/pl.json @@ -89,6 +89,7 @@ "disabled_for_tags": "Wyłączone dla tagów", "distinguished_name": "Wytworne imię", "edit_api_key_comment": "edit_api_key_comment", + "edit_role": "Edytuj rolę", "email": "E-mail", "email_address": "Adres e-mail", "email_enable_ssltls": "Włącz szyfrowanie SSL/TLS", @@ -175,6 +176,7 @@ "new_api_key": "Jest to nowo wygenerowany klucz API. \nNależy pamiętać, że zostanie wyświetlony tylko raz i nie można go później odzyskać.", "new_api_key_title": "Nowy klucz API", "nixpkgs": "Nixpkgs", + "no_unassigned_projects": "Żadnych nie przypisanych projektów", "notification_level": "Poziom powiadomień", "notifications": "Powiadomienia", "npm": "NPM", @@ -199,7 +201,10 @@ "personal_access_token": "Osobisty token dostępu", "portfolio_access_control": "Kontrola dostępu do portfela", "preview": "Zapowiedź", + "project": "Projekt", "project_access": "Dostęp do projektu", + "project_membership": "Członkostwo w projekcie", + "project_name": "Nazwa projektu", "project_retention_enable": "Włącz usuwanie nieaktywnego projektu", "publisher": "Wydawca", "publisher_class": "Klasa wydawcy", @@ -217,6 +222,9 @@ "reindex_vulnerabilities": "Luki", "reindex_vulnerable_software": "Wrażliwe oprogramowanie", "remove_api_key": "remove_api_key", + "remove_permission": "Usuń pozwolenie", + "remove_role": "Usuń rolę", + "remove_team_membership": "Usuń członkostwo", "repositories": "Repozytoria", "repository_authentication": "Wymagane uwierzytelnienie", "repository_created": "Repozytorium zostało utworzone", @@ -240,8 +248,11 @@ "risk_score_weight_medium": "Średni (domyślnie: 3)", "risk_score_weight_unassigned": "Nieprzypisane (domyślnie: 5)", "risk_score_weighting_description": "Możesz dostosować wagę każdej wagi, aby dostosować ocenę ryzyka.", + "role": "Rola", + "role_assigned": "Przypisana rola", "role_created": "Rola utworzona", "role_deleted": "Rola usunięta", + "role_membership": "Członkostwo ról", "role_name": "Nazwa roli", "roles": "Role", "scope": "Zakres", @@ -250,6 +261,7 @@ "select_oidc_group": "Wybierz grupę OpenID Connect", "select_permission": "Wybierz uprawnienia", "select_project": "Wybierz Projekt", + "select_role": "Wybierz rolę", "select_team": "Wybierz drużynę", "select_team_as_recipient": "Wybierz zespół jako odbiorcę", "snyk": "Snyk (beta)", @@ -310,17 +322,7 @@ "welcome_message_desc": "Dostosuj wiadomość powitalną wyświetlaną na stronie początkowej funkcji Depency-Track przed zalogowaniem się użytkownika.", "welcome_message_enable": "Włącz wiadomość powitalną", "workflow_step_timeout": "Limit czasu kroku", - "workflows": "Przepływy pracy", - "role_assigned": "Przypisana rola", - "remove_permission": "Usuń pozwolenie", - "role_membership": "Członkostwo ról", - "remove_role": "Usuń rolę", - "remove_team_membership": "Usuń członkostwo", - "project_membership": "Członkostwo w projekcie", - "edit_role": "Edytuj rolę", - "project": "Projekt", - "project_name": "Nazwa projektu", - "role": "Rola" + "workflows": "Przepływy pracy" }, "condition": { "forbidden": "Zabronione (403)", diff --git a/src/i18n/locales/pt-BR.json b/src/i18n/locales/pt-BR.json index d88fcdf56..1241b1451 100644 --- a/src/i18n/locales/pt-BR.json +++ b/src/i18n/locales/pt-BR.json @@ -89,6 +89,7 @@ "disabled_for_tags": "Desativado para tags", "distinguished_name": "Nome Distinto", "edit_api_key_comment": "edit_api_key_comment", + "edit_role": "Função de edição", "email": "E-mail", "email_address": "Endereço de email", "email_enable_ssltls": "Habilitar criptografia SSL/TLS", @@ -175,6 +176,7 @@ "new_api_key": "Esta é a chave da API recém -gerada. \nObserve que ele será exibido apenas uma vez e não poderá ser recuperado posteriormente.", "new_api_key_title": "Nova chave da API", "nixpkgs": "Nixpkgs", + "no_unassigned_projects": "Nenhum projeto não atribuído", "notification_level": "Nível de notificação", "notifications": "Notificações", "npm": "NPM", @@ -199,7 +201,10 @@ "personal_access_token": "Token de acesso pessoal", "portfolio_access_control": "Controle de acesso ao portfólio", "preview": "Visualização", + "project": "Projeto", "project_access": "Acesso ao projeto", + "project_membership": "Associação do projeto", + "project_name": "Nome do projeto", "project_retention_enable": "Habilitar exclusão de projetos inativos", "publisher": "Editor", "publisher_class": "Classe de editor", @@ -217,6 +222,9 @@ "reindex_vulnerabilities": "Vulnerabilidades", "reindex_vulnerable_software": "Software vulnerável", "remove_api_key": "remove_api_key", + "remove_permission": "Remova a permissão", + "remove_role": "Remova o papel", + "remove_team_membership": "Remova a associação", "repositories": "Repositórios", "repository_authentication": "Autentificação requerida", "repository_created": "Repositório criado", @@ -240,8 +248,11 @@ "risk_score_weight_medium": "Médio (padrão: 3)", "risk_score_weight_unassigned": "Não atribuído (padrão: 5)", "risk_score_weighting_description": "Você pode personalizar a ponderação de cada gravidade para personalizar a pontuação de risco.", + "role": "Papel", + "role_assigned": "Função atribuída", "role_created": "Função criada", "role_deleted": "Função excluída", + "role_membership": "Associação de papéis", "role_name": "Nome da função", "roles": "Funções", "scope": "Escopo", @@ -250,6 +261,7 @@ "select_oidc_group": "Selecione o grupo OpenID Connect", "select_permission": "Selecione a permissão", "select_project": "Selecione o projeto", + "select_role": "Selecione função", "select_team": "Selecionar time", "select_team_as_recipient": "Selecione a equipe como destinatário", "snyk": "Snyk (beta)", @@ -310,18 +322,7 @@ "welcome_message_desc": "Personalize a mensagem de boas-vindas que aparece na página inicial do Dependency-Track antes dos usuários fazerem login.", "welcome_message_enable": "Ativar mensagem de boas-vindas", "workflow_step_timeout": "Tempo limite da etapa", - "workflows": "Fluxos de trabalho", - "select_role": "Selecione função", - "role_assigned": "Função atribuída", - "remove_permission": "Remova a permissão", - "role_membership": "Associação de papéis", - "remove_role": "Remova o papel", - "remove_team_membership": "Remova a associação", - "project_membership": "Associação do projeto", - "edit_role": "Função de edição", - "project": "Projeto", - "project_name": "Nome do projeto", - "role": "Papel" + "workflows": "Fluxos de trabalho" }, "condition": { "forbidden": "Proibido (403)", diff --git a/src/i18n/locales/pt.json b/src/i18n/locales/pt.json index 3006410b2..5b5cbc48a 100644 --- a/src/i18n/locales/pt.json +++ b/src/i18n/locales/pt.json @@ -89,6 +89,7 @@ "disabled_for_tags": "Desativado para tags", "distinguished_name": "Nome Distinto", "edit_api_key_comment": "edit_api_key_comment", + "edit_role": "Função de edição", "email": "E-mail", "email_address": "Endereço de email", "email_enable_ssltls": "Habilitar criptografia SSL/TLS", @@ -175,6 +176,7 @@ "new_api_key": "Esta é a chave da API recém -gerada. \nObserve que ele será exibido apenas uma vez e não poderá ser recuperado posteriormente.", "new_api_key_title": "Nova chave da API", "nixpkgs": "Nixpkgs", + "no_unassigned_projects": "Nenhum projeto não atribuído", "notification_level": "Nível de notificação", "notifications": "Notificações", "npm": "NPM", @@ -199,7 +201,10 @@ "personal_access_token": "Token de acesso pessoal", "portfolio_access_control": "Controle de acesso ao portfólio", "preview": "Visualização", + "project": "Projeto", "project_access": "Acesso ao projeto", + "project_membership": "Associação do projeto", + "project_name": "Nome do projeto", "project_retention_enable": "Ativar exclusão de projetos inativos", "publisher": "Editor", "publisher_class": "Classe de editor", @@ -217,6 +222,9 @@ "reindex_vulnerabilities": "Vulnerabilidades", "reindex_vulnerable_software": "Software vulnerável", "remove_api_key": "remove_api_key", + "remove_permission": "Remova a permissão", + "remove_role": "Remova o papel", + "remove_team_membership": "Remova a associação", "repositories": "Repositórios", "repository_authentication": "Autentificação requerida", "repository_created": "Repositório criado", @@ -240,8 +248,11 @@ "risk_score_weight_medium": "Médio (padrão: 3)", "risk_score_weight_unassigned": "Não atribuído (padrão: 5)", "risk_score_weighting_description": "Você pode personalizar a ponderação de cada gravidade para personalizar a pontuação de risco.", + "role": "Papel", + "role_assigned": "Função atribuída", "role_created": "Função criada", "role_deleted": "Função excluída", + "role_membership": "Associação de papéis", "role_name": "Nome da função", "roles": "Funções", "scope": "Escopo", @@ -250,6 +261,7 @@ "select_oidc_group": "Selecione o grupo OpenID Connect", "select_permission": "Selecione a permissão", "select_project": "Selecione o projeto", + "select_role": "Selecione função", "select_team": "Selecionar time", "select_team_as_recipient": "Selecione a equipe como destinatário", "snyk": "Snyk (beta)", @@ -310,18 +322,7 @@ "welcome_message_desc": "Personalize a mensagem de boas-vindas que aparece na página inicial do Dependency-Track antes dos usuários fazerem login.", "welcome_message_enable": "Ativar mensagem de boas-vindas", "workflow_step_timeout": "Tempo limite da etapa", - "workflows": "Fluxos de trabalho", - "select_role": "Selecione função", - "role_assigned": "Função atribuída", - "remove_permission": "Remova a permissão", - "role_membership": "Associação de papéis", - "remove_role": "Remova o papel", - "remove_team_membership": "Remova a associação", - "project_membership": "Associação do projeto", - "edit_role": "Função de edição", - "project": "Projeto", - "project_name": "Nome do projeto", - "role": "Papel" + "workflows": "Fluxos de trabalho" }, "condition": { "forbidden": "Proibido (403)", @@ -384,8 +385,8 @@ "apply_vex": "Aplicar VEX", "apply_vex_tooltip": "Aplique análises de um documento Vulnerability Exploitability eXchange (VEX) a este projeto.", "approved": "Aprovado", - "attributed_on": "Atribuído em", "assign": "Atribuir", + "attributed_on": "Atribuído em", "audit_trail": "Trilha de auditoria", "audit_vulnerabilities": "Vulnerabilidades de auditoria", "auditing_progress": "Progresso da auditoria", diff --git a/src/i18n/locales/ru.json b/src/i18n/locales/ru.json index 01fbbac56..7645292f3 100644 --- a/src/i18n/locales/ru.json +++ b/src/i18n/locales/ru.json @@ -89,6 +89,7 @@ "disabled_for_tags": "Отключено для тегов", "distinguished_name": "Уникальное имя", "edit_api_key_comment": "Редактировать комментарий к ключу API", + "edit_role": "Редактировать роль", "email": "Электронная почта", "email_address": "Адрес электронной почты", "email_enable_ssltls": "Включить шифрование SSL/TLS", @@ -175,6 +176,7 @@ "new_api_key": "Это недавно сгенерированный ключ API. \nОбратите внимание, что он будет отображаться только один раз и не может быть получено позже.", "new_api_key_title": "Новый ключ API", "nixpkgs": "Nixpkgs", + "no_unassigned_projects": "Никаких неназначенных проектов", "notification_level": "Уровень уведомления", "notifications": "Уведомления", "npm": "NPM", @@ -199,7 +201,10 @@ "personal_access_token": "Персональный токен доступа", "portfolio_access_control": "Контроль доступа к портфолио", "preview": "Предпросмотр", + "project": "Проект", "project_access": "Доступ к проекту", + "project_membership": "Членство в проекте", + "project_name": "Название проекта", "project_retention_enable": "Включить удаление неактивного проекта", "publisher": "Издатель", "publisher_class": "Класс издателя", @@ -217,6 +222,9 @@ "reindex_vulnerabilities": "Уязвимости", "reindex_vulnerable_software": "Уязвимое ПО", "remove_api_key": "Удалить API-ключ", + "remove_permission": "Удалить разрешение", + "remove_role": "Удалить роль", + "remove_team_membership": "Удалить членство", "repositories": "Репозитории", "repository_authentication": "Требуется аутентификация", "repository_created": "Репозиторий создан", @@ -240,8 +248,11 @@ "risk_score_weight_medium": "Средний (по умолчанию: 3)", "risk_score_weight_unassigned": "Не назначено (по умолчанию: 5)", "risk_score_weighting_description": "Вы можете настроить вес каждой серьезности, чтобы настроить оценку риска.", + "role": "Роль", + "role_assigned": "Роль назначена", "role_created": "Роль создана", "role_deleted": "Роль удалена", + "role_membership": "Ролевое членство", "role_name": "Имя роли", "roles": "Роли", "scope": "Область", @@ -250,6 +261,7 @@ "select_oidc_group": "Выбрать группу OpenID Connect", "select_permission": "Выбрать разрешение", "select_project": "Выбрать проект", + "select_role": "Выберите роль", "select_team": "Выбрать команду", "select_team_as_recipient": "Выбрать команду в качестве получателя", "snyk": "Snyk (бета)", @@ -310,18 +322,7 @@ "welcome_message_desc": "Настройте приветственное сообщение, которое отображается на стартовой странице Dependency-Track перед входом пользователей.", "welcome_message_enable": "Включить приветственное сообщение", "workflow_step_timeout": "Тайм-аут шага", - "workflows": "Рабочие процессы", - "select_role": "Выберите роль", - "role_assigned": "Роль назначена", - "remove_permission": "Удалить разрешение", - "role_membership": "Ролевое членство", - "remove_role": "Удалить роль", - "remove_team_membership": "Удалить членство", - "project_membership": "Членство в проекте", - "edit_role": "Редактировать роль", - "project": "Проект", - "project_name": "Название проекта", - "role": "Роль" + "workflows": "Рабочие процессы" }, "condition": { "forbidden": "Запрещено (403)", @@ -384,8 +385,8 @@ "apply_vex": "Применить VEX", "apply_vex_tooltip": "Применить анализ из документа Vulnerability Exploitability eXchange (VEX) к этому проекту.", "approved": "Одобрено", - "attributed_on": "Указано на", "assign": "Назначить", + "attributed_on": "Указано на", "audit_trail": "Журнал аудита", "audit_vulnerabilities": "Аудит уязвимостей", "auditing_progress": "Прогресс аудита", diff --git a/src/i18n/locales/uk-UA.json b/src/i18n/locales/uk-UA.json index 22ff1571f..4f2c6be24 100644 --- a/src/i18n/locales/uk-UA.json +++ b/src/i18n/locales/uk-UA.json @@ -89,6 +89,7 @@ "disabled_for_tags": "Вимкнено для тегів", "distinguished_name": "Помітне ім'я", "edit_api_key_comment": "Редагувати коментар до ключа API", + "edit_role": "Редагувати роль", "email": "Електронна пошта", "email_address": "Адреса електронної пошти", "email_enable_ssltls": "Увімкніть шифрування SSL/TLS", @@ -175,6 +176,7 @@ "new_api_key": "Це нещодавно створений ключ API. \nЗверніть увагу, що він відображатиметься лише один раз і не може бути отриманий пізніше.", "new_api_key_title": "Новий ключ API", "nixpkgs": "Nixpkgs", + "no_unassigned_projects": "Немає непризначені проекти", "notification_level": "Рівень сповіщення", "notifications": "Сповіщення", "npm": "НПМ", @@ -199,7 +201,10 @@ "personal_access_token": "Персональний маркер доступу", "portfolio_access_control": "Контроль доступу до портфоліо", "preview": "Попередній перегляд", + "project": "Демонструвати", "project_access": "Доступ до проекту", + "project_membership": "Членство проекту", + "project_name": "Назва проекту", "project_retention_enable": "Увімкнути видалення неактивного проекту", "publisher": "Видавець", "publisher_class": "Клас видавця", @@ -217,6 +222,9 @@ "reindex_vulnerabilities": "Вразливі місця", "reindex_vulnerable_software": "Вразливе програмне забезпечення", "remove_api_key": "Видалити ключ API", + "remove_permission": "Видаліть дозвіл", + "remove_role": "Видалити роль", + "remove_team_membership": "Видалити членство", "repositories": "Репозиторії", "repository_authentication": "Потрібна автентифікація", "repository_created": "Репозиторій створено", @@ -240,8 +248,11 @@ "risk_score_weight_medium": "Середній (за замовчуванням: 3)", "risk_score_weight_unassigned": "Не призначено (за замовчуванням: 5)", "risk_score_weighting_description": "Ви можете налаштувати зважування кожного рівня серйозності, щоб налаштувати оцінку ризику.", + "role": "Роль", + "role_assigned": "Роль призначена", "role_created": "Роль створено", "role_deleted": "Роль видалено", + "role_membership": "Рольове членство", "role_name": "Назва ролі", "roles": "Ролі", "scope": "Область застосування", @@ -250,6 +261,7 @@ "select_oidc_group": "Виберіть OpenID Connect Group", "select_permission": "Виберіть дозвіл", "select_project": "Виберіть Проект", + "select_role": "Виберіть роль", "select_team": "Виберіть команду", "select_team_as_recipient": "Виберіть команду як одержувача", "snyk": "Сник (бета)", @@ -310,18 +322,7 @@ "welcome_message_desc": "Налаштуйте вітальне повідомлення, яке з’являється на початковій сторінці Dependency-Track перед входом користувачів.", "welcome_message_enable": "Увімкнути вітальне повідомлення", "workflow_step_timeout": "Час очікування кроку", - "workflows": "Робочі процеси", - "select_role": "Виберіть роль", - "role_assigned": "Роль призначена", - "remove_permission": "Видаліть дозвіл", - "role_membership": "Рольове членство", - "remove_role": "Видалити роль", - "remove_team_membership": "Видалити членство", - "project_membership": "Членство проекту", - "edit_role": "Редагувати роль", - "project": "Демонструвати", - "project_name": "Назва проекту", - "role": "Роль" + "workflows": "Робочі процеси" }, "condition": { "forbidden": "Заборонено (403)", diff --git a/src/i18n/locales/zh.json b/src/i18n/locales/zh.json index 2c6b6fe7b..8a7d79520 100644 --- a/src/i18n/locales/zh.json +++ b/src/i18n/locales/zh.json @@ -89,6 +89,7 @@ "disabled_for_tags": "禁用标签", "distinguished_name": "专有名称", "edit_api_key_comment": "修改 API Key 备注", + "edit_role": "编辑角色", "email": "电子邮件", "email_address": "电子邮件地址", "email_enable_ssltls": "启用 SSL/TLS 加密", @@ -175,6 +176,7 @@ "new_api_key": "这是新生成的API密钥。\n请注意,它将仅显示一次,并且以后不能检索。", "new_api_key_title": "新的API密钥", "nixpkgs": "Nixpkgs", + "no_unassigned_projects": "没有未分配的项目", "notification_level": "通知级别", "notifications": "通知", "npm": "NPM", @@ -199,7 +201,10 @@ "personal_access_token": "个人访问令牌", "portfolio_access_control": "portfolio 访问控制", "preview": "预览", + "project": "项目", "project_access": "项目访问", + "project_membership": "项目会员资格", + "project_name": "项目名称", "project_retention_enable": "启用非活动项目删除", "publisher": "发行商", "publisher_class": "发行商分类", @@ -217,6 +222,9 @@ "reindex_vulnerabilities": "重新生成漏洞索引", "reindex_vulnerable_software": "重新生成软件索引", "remove_api_key": "删除 API Key", + "remove_permission": "删除许可", + "remove_role": "删除角色", + "remove_team_membership": "删除会员资格", "repositories": "存储库", "repository_authentication": "存储库身份验证", "repository_created": "已创建存储库", @@ -240,8 +248,11 @@ "risk_score_weight_medium": "中(默认值:3)", "risk_score_weight_unassigned": "未分配(默认值:5)", "risk_score_weighting_description": "您可以自定义每个严重性的权重来自定义风险评分。", + "role": "角色", + "role_assigned": "角色分配", "role_created": "角色已创建", "role_deleted": "角色已删除", + "role_membership": "角色会员资格", "role_name": "角色名称", "roles": "角色", "scope": "范围", @@ -250,6 +261,7 @@ "select_oidc_group": "选择 OpenID Connect 组", "select_permission": "选择权限", "select_project": "选择项目", + "select_role": "选择角色", "select_team": "选择团队", "select_team_as_recipient": "选择团队作为收件人", "snyk": "Snyk(测试版)", @@ -310,18 +322,7 @@ "welcome_message_desc": "自定义用户登录前 Dependency-Track 起始页上显示的欢迎消息。", "welcome_message_enable": "启用欢迎消息", "workflow_step_timeout": "步骤超时", - "workflows": "工作流程", - "select_role": "选择角色", - "role_assigned": "角色分配", - "remove_permission": "删除许可", - "role_membership": "角色会员资格", - "remove_role": "删除角色", - "remove_team_membership": "删除会员资格", - "project_membership": "项目会员资格", - "edit_role": "编辑角色", - "project": "项目", - "project_name": "项目名称", - "role": "角色" + "workflows": "工作流程" }, "condition": { "forbidden": "禁止 (403)", @@ -384,8 +385,8 @@ "apply_vex": "应用VEX", "apply_vex_tooltip": "将漏洞可利用性交换 (VEX) 文档的分析应用于该项目。", "approved": "批准", - "attributed_on": "归因于", "assign": "分配", + "attributed_on": "归因于", "audit_trail": "审计追踪", "audit_vulnerabilities": "审计漏洞", "auditing_progress": "审计进度", diff --git a/src/mixins/userManagementMixin.js b/src/mixins/userManagementMixin.js index cd7f00de2..0ea4c4746 100644 --- a/src/mixins/userManagementMixin.js +++ b/src/mixins/userManagementMixin.js @@ -9,7 +9,6 @@ export default { } }, methods: { - // this was done to keep the flow of the project. Theres definitely a better way but it work getUserObjectKey: function () { throw new Error( 'getUserObjectKey function must be implemented to use "userManagementMixin".', @@ -72,7 +71,7 @@ export default { // asynchronously process requests Promise.all(request_promises) - .then(() => { + .then((_) => { this.syncVariables({ teams: selections }); //eg ("admin:ldapusers:rowUpdate", index, this.ldapUser) @@ -137,8 +136,7 @@ export default { this.$toastr.w(this.$t('condition.unsuccessful_action')); }); }, - // TODO: update once batch operations are implemented, Account for 304 - _updatePermissionSelection: async function (selections) { + _updatePermissionSelection: function (selections) { const userObj = this.getUserObject(); const currentPermissions = userObj.permissions; @@ -171,7 +169,7 @@ export default { return Promise.all([mappedAdd, mappedRemove]) .then(() => { // sync variables from selections to avoid missing permissions - this.syncVariables({ permissions: newPermissions }); + this.syncVariables({ permissions: selections }); this.$toastr.s(this.$t('message.updated')); }) .catch((error) => { @@ -180,7 +178,7 @@ export default { }); }, - _removePermission: async function (permission) { + _removePermission: function (permission) { const userObj = this.getUserObject(); const url = `${this.$api.BASE_URL}/${this.$api.URL_PERMISSION}/${permission.name}/user/${userObj.username}`; return this.axios diff --git a/src/views/administration/accessmanagement/ManagedUsers.vue b/src/views/administration/accessmanagement/ManagedUsers.vue index 4d5012c0b..1bdc177fc 100644 --- a/src/views/administration/accessmanagement/ManagedUsers.vue +++ b/src/views/administration/accessmanagement/ManagedUsers.vue @@ -228,9 +228,6 @@ export default { getUserObject: function () { return this.managedUser; }, - openPermissionModal() { - this.$root.$emit('bv::show::modal', 'selectPermissionModal'); - }, updateUser: function () { const url = `${this.$api.BASE_URL}/${this.$api.URL_USER_MANAGED}`; this.axios diff --git a/src/views/administration/accessmanagement/SelectRoleModal.vue b/src/views/administration/accessmanagement/SelectRoleModal.vue index 66ed2de0d..2243ae5bb 100644 --- a/src/views/administration/accessmanagement/SelectRoleModal.vue +++ b/src/views/administration/accessmanagement/SelectRoleModal.vue @@ -2,6 +2,7 @@ { + loadProjects: async function () { + try { + const response = await this.axios.get( + `${this.$api.BASE_URL}/${this.$api.URL_ACL_USER}/${this.user}`, + ); + + if (response.status === 204) { + this.availableProjects = [ + { + uuid: null, + name: this.$t('admin.no_unassigned_projects'), + }, + ]; + this.selectedProject = this.$t('admin.no_unassigned_projects'); + this.selectedRole = null; + console.log('No projects available.'); + } else if (response.status === 200 && Array.isArray(response.data)) { this.availableProjects = response.data; - }) - .catch((error) => { - console.error(error); + } else { this.$toastr.w(this.$t('condition.unsuccessful_action')); - }); + } + } catch (error) { + this.$toastr.w(this.$t('condition.unsuccessful_action')); + } }, resetValues: function () { this.selectedProject = this.initialProject; From a30c6480b04f7281ab5289b90c3396db4488fe15 Mon Sep 17 00:00:00 2001 From: Emmanuel Meremikwu Date: Tue, 29 Apr 2025 14:34:09 -0500 Subject: [PATCH 15/25] refactor: Refactor user details views and implement bulk operations for users and roles - Separate detailViews for ldap, managed, oidc and teams to 'UserDetails' files - Implement bulk operations for user and role Signed-off-by: Emmanuel Meremikwu --- src/mixins/userManagementMixin.js | 214 +++---- src/shared/api.json | 2 + .../accessmanagement/CreateRoleModal.vue | 15 +- .../accessmanagement/LdapUsers.vue | 239 -------- .../LdapUsers/UserDetails.vue | 154 +++++ .../accessmanagement/LdapUsers/index.vue | 133 ++++ .../accessmanagement/ManagedUsers.vue | 312 ---------- .../ManagedUsers/UserDetails.vue | 257 ++++++++ .../accessmanagement/ManagedUsers/index.vue | 143 +++++ .../accessmanagement/OidcUsers.vue | 234 -------- .../OidcUsers/UserDetails.vue | 145 +++++ .../accessmanagement/OidcUsers/index.vue | 142 +++++ .../ProjectRoleListGroupItem.vue | 1 + .../SelectPermissionModal.vue | 50 +- .../accessmanagement/SelectRoleModal.vue | 29 +- .../accessmanagement/SelectTeamModal.vue | 58 +- .../administration/accessmanagement/Teams.vue | 566 ------------------ .../accessmanagement/Teams/UserDetails.vue | 438 ++++++++++++++ .../accessmanagement/Teams/index.vue | 138 +++++ 19 files changed, 1774 insertions(+), 1496 deletions(-) delete mode 100644 src/views/administration/accessmanagement/LdapUsers.vue create mode 100644 src/views/administration/accessmanagement/LdapUsers/UserDetails.vue create mode 100644 src/views/administration/accessmanagement/LdapUsers/index.vue delete mode 100644 src/views/administration/accessmanagement/ManagedUsers.vue create mode 100644 src/views/administration/accessmanagement/ManagedUsers/UserDetails.vue create mode 100644 src/views/administration/accessmanagement/ManagedUsers/index.vue delete mode 100644 src/views/administration/accessmanagement/OidcUsers.vue create mode 100644 src/views/administration/accessmanagement/OidcUsers/UserDetails.vue create mode 100644 src/views/administration/accessmanagement/OidcUsers/index.vue delete mode 100644 src/views/administration/accessmanagement/Teams.vue create mode 100644 src/views/administration/accessmanagement/Teams/UserDetails.vue create mode 100644 src/views/administration/accessmanagement/Teams/index.vue diff --git a/src/mixins/userManagementMixin.js b/src/mixins/userManagementMixin.js index 0ea4c4746..23e7e9f03 100644 --- a/src/mixins/userManagementMixin.js +++ b/src/mixins/userManagementMixin.js @@ -2,26 +2,16 @@ import EventBus from '../shared/eventbus'; export default { created: function () { - if (this.index == null || this.row == null) { - throw new Error( - "userManagementMixin requires 'index' and 'row' variables, which are typically provided by a detailFormatter function.", - ); - } + this._userManagementMixin_init(); + }, + data: function () { + return { + _userManagementMixin_ready: false, + }; }, methods: { - getUserObjectKey: function () { - throw new Error( - 'getUserObjectKey function must be implemented to use "userManagementMixin".', - ); - }, - - getUserObject: function () { - throw new Error( - 'getUserObject function must be implemented to use "userManagementMixin".', - ); - }, - loadUserRoles: function (username) { + this._userManagementMixin_checkReady(); let url = `${this.$api.BASE_URL}/${this.$api.URL_ROLE}/${username}/roles`; this.axios .get(url) @@ -35,90 +25,63 @@ export default { }, // TODO: internal server error 500 - _deleteUser: function (endpoint, updateEvent) { - const userObj = this.getUserObject(); + _deleteUser: function (endpoint) { + this._userManagementMixin_checkReady(); this.axios .delete(endpoint, { data: { - username: userObj.username, + username: this.row[this.identifierField], }, }) - .then(() => { - EventBus.$emit(updateEvent, this.index); - this.$toastr.s(this.$t('admin.user_deleted')); - }) - .catch((error) => { - console.error(error); + .then(this._successfulResponseDelete) + .catch(() => { this.$toastr.w(this.$t('condition.unsuccessful_action')); }); }, - // TODO: implement batch selections when apiserver support is implemented - _updateTeamSelection: function (updateEvent, selections) { - const userObj = this.getUserObject(); - const endpoint = `${this.$api.BASE_URL}/${this.$api.URL_USER}/${userObj.username}/membership`; - - // remove selected permissions that are already applied - const filterCallback = (selection) => { - return !userObj.teams.some((team) => team.uuid === selection.uuid); + _updateTeamSelection: function (endpoint, selections) { + this._userManagementMixin_checkReady(); + const requestBody = { + [this.identifierField]: this.row[this.identifierField], + teams: selections.map((team) => team.uuid), }; - const mapCallback = async (selection) => - await this.axios.post(endpoint, { uuid: selection.uuid }); - const request_promises = selections - .filter(filterCallback) - .map(mapCallback); - - // asynchronously process requests - Promise.all(request_promises) - .then((_) => { - this.syncVariables({ teams: selections }); - - //eg ("admin:ldapusers:rowUpdate", index, this.ldapUser) - EventBus.$emit(updateEvent, this.index, userObj); - this.$toastr.s(this.$t('message.updated')); - }) + this.axios + .put(endpoint, requestBody) + .then(this._successfulResponseUpdate) .catch((error) => { - console.error(error); + if (error.response && error.response.status === 304) return; this.$toastr.w(this.$t('condition.unsuccessful_action')); }); }, - _removeTeamMembership: function (endpoint, updateEvent, teamUUID) { - const userObj = this.getUserObject(); + _removeTeamMembership: function (endpoint, teamUUID) { + this._userManagementMixin_checkReady(); this.axios .delete(endpoint, { data: { uuid: teamUUID } }) - .then((response) => { - this.syncVariables(response.data); - EventBus.$emit(updateEvent, this.index, userObj); - this.$toastr.s(this.$t('message.updated')); - }) - .catch((error) => { - console.error(error); + .then(this._successfulResponseUpdate) + .catch(() => { this.$toastr.w(this.$t('condition.unsuccessful_action')); }); }, - // updateEvent not needed here since we don't need to update the row at the moment, this may change later _updateRoleSelection: function (endpoint, selection) { + this._userManagementMixin_checkReady(); this.axios .post(endpoint, { roleUUID: selection.role, projectUUID: selection.project, }) - .then((response) => { - this.$toastr.s(this.$t('admin.role_assigned')); - this.syncVariables(response.data); - }) - .catch((error) => { + .then(this._successfulResponseUpdate) + .catch(() => { this.$toastr.w(this.$t('condition.unsuccessful_action')); - console.error(error); }); }, - // endpoint doesn't change across ldap, managed or oidc _removeRole: function (projectRole) { - const username = this[this.getUserObjectKey()].username; + this._userManagementMixin_checkReady(); + // const username = this[this.getUserObjectKey()].username; + const username = this.row[this.identifierField]; const url = `${this.$api.BASE_URL}/${this.$api.URL_USER}/${username}/role`; this.axios @@ -128,69 +91,82 @@ export default { projectUUID: projectRole.project.uuid, }, }) - .then((response) => { - this.syncVariables(response.data); - this.$toastr.s(this.$t('message.updated')); - }) + .then(this._successfulResponseUpdate) .catch(() => { this.$toastr.w(this.$t('condition.unsuccessful_action')); }); }, - _updatePermissionSelection: function (selections) { - const userObj = this.getUserObject(); - - const currentPermissions = userObj.permissions; - const newPermissions = selections; // could be more or less selected - - // relative complement - // add = (newPermissions - currentPermissions); remove = (currentPermissions - newPermissions), - const permissionsToAdd = newPermissions.filter( - (newPerm) => - !currentPermissions.some( - (currentPerm) => currentPerm.name === newPerm.name, - ), - ); - const permissionsToRemove = currentPermissions.filter( - (currentPerm) => - !newPermissions.some((newPerm) => newPerm.name === currentPerm.name), - ); - - const mappedAdd = permissionsToAdd.map(async (permission) => { - const url = `${this.$api.BASE_URL}/${this.$api.URL_PERMISSION}/${permission.name}/user/${userObj.username}`; - return await this.axios.post(url); - }); - const mappedRemove = permissionsToRemove.map(async (permission) => { - const url = `${this.$api.BASE_URL}/${this.$api.URL_PERMISSION}/${permission.name}/user/${userObj.username}`; - // return await this._removePermission(permission); - return await this.axios.delete(url); - }); - - // response data isn't reliable as promises can resolve too fast and at different times - return Promise.all([mappedAdd, mappedRemove]) - .then(() => { - // sync variables from selections to avoid missing permissions - this.syncVariables({ permissions: selections }); - this.$toastr.s(this.$t('message.updated')); - }) - .catch((error) => { - console.error(error); + + _updatePermissionSelection: async function (endpoint, selections) { + this._userManagementMixin_checkReady(); + const requestBody = { + [this.identifierField]: this.row[this.identifierField], + permissions: selections.map((selection) => selection.name), + }; + + return this.axios + .put(endpoint, requestBody) + .then(this._successfulResponseUpdate) + .catch(() => { this.$toastr.w(this.$t('condition.unsuccessful_action')); }); }, - _removePermission: function (permission) { - const userObj = this.getUserObject(); - const url = `${this.$api.BASE_URL}/${this.$api.URL_PERMISSION}/${permission.name}/user/${userObj.username}`; + _removePermission: async function (permission) { + this._userManagementMixin_checkReady(); + const username = this.row[this.identifierField]; + const url = `${this.$api.BASE_URL}/${this.$api.URL_PERMISSION}/${permission.name}/user/${username}`; return this.axios .delete(url) - .then((response) => { - this.syncVariables(response.data); - this.$toastr.s(this.$t('message.updated')); - }) - .catch((error) => { - console.error(error); + .then(this._successfulResponseUpdate) + .catch(() => { this.$toastr.w(this.$t('condition.unsuccessful_action')); }); }, + + // -- utility methods -- + _successfulResponseUpdate: function (response) { + if (this.rowEvents && this.rowEvents.update) + EventBus.$emit(this.rowEvents.update, this.index, response.data); + this.$toastr.s(this.$t('message.updated')); + }, + + _successfulResponseDelete: function () { + if (this.rowEvents && this.rowEvents.delete) + EventBus.$emit(this.rowEvents.delete, this.index); + this.$toastr.s(this.$t('admin.user_deleted')); + }, + + _userManagementMixin_checkReady: function () { + if (!this._userManagementMixin_ready) { + throw new Error('userManagementMixin is not ready. Init failed'); + } + }, + + _userManagementMixin_init: function () { + if (this.index == null || this.row == null) { + throw new Error( + "userManagementMixin requires 'index' and 'row' variables, which are typically provided by a detailFormatter function.", + ); + } + + if (this.identifierField == null) { + throw new Error( + "userManagementMixin requires 'identifierField' variable.", + ); + } + + const rowEventsReady = + this.rowEvents != null && + this.rowEvents.update != null && + this.rowEvents.delete != null; + if (!rowEventsReady) { + console.warn( + "userManagementMixin: 'rowEvents' object is either undefined or missing properties 'update' or 'delete'. Changes may not reflect properly until refresh.", + ); + } + + this._userManagementMixin_ready = true; + }, }, }; diff --git a/src/shared/api.json b/src/shared/api.json index b6553b8f2..706f585a3 100644 --- a/src/shared/api.json +++ b/src/shared/api.json @@ -49,6 +49,8 @@ "URL_TAG": "api/v1/tag", "URL_TEAM": "api/v1/team", "URL_USER": "api/v1/user", + "URL_USER_MEMBERSHIP": "api/v1/user/membership", + "URL_USER_PERMISSION": "api/v1/permission/user", "URL_USER_LDAP": "api/v1/user/ldap", "URL_USER_MANAGED": "api/v1/user/managed", "URL_USER_OIDC": "api/v1/user/oidc", diff --git a/src/views/administration/accessmanagement/CreateRoleModal.vue b/src/views/administration/accessmanagement/CreateRoleModal.vue index 5ec7e5466..e1688a98f 100644 --- a/src/views/administration/accessmanagement/CreateRoleModal.vue +++ b/src/views/administration/accessmanagement/CreateRoleModal.vue @@ -71,11 +71,12 @@ export default { methods: { createUser() { let url = `${this.$api.BASE_URL}/${this.$api.URL_ROLE}`; + const requestBody = { + name: this.name, + permissions: this.permissions.map((perm) => perm.name), + }; this.axios - .put(url, { - name: this.name, - permissions: this.permissions, - }) + .put(url, requestBody) .then((response) => { this.$emit('refreshTable'); this.$toastr.s(this.$t('admin.role_created')); @@ -100,11 +101,7 @@ export default { this.$root.$emit('bv::show::modal', 'selectPermissionModal'); }, updatePermissionSelection(selections) { - this.$root.$emit('bv::hide::modal', 'selectPermissionModal'); - for (let i = 0; i < selections.length; i++) { - let selection = selections[i]; - this.permissions.push(selection); - } + this.permissions = selections; }, }, }; diff --git a/src/views/administration/accessmanagement/LdapUsers.vue b/src/views/administration/accessmanagement/LdapUsers.vue deleted file mode 100644 index 93a4585ea..000000000 --- a/src/views/administration/accessmanagement/LdapUsers.vue +++ /dev/null @@ -1,239 +0,0 @@ - - - diff --git a/src/views/administration/accessmanagement/LdapUsers/UserDetails.vue b/src/views/administration/accessmanagement/LdapUsers/UserDetails.vue new file mode 100644 index 000000000..1fefe3ad5 --- /dev/null +++ b/src/views/administration/accessmanagement/LdapUsers/UserDetails.vue @@ -0,0 +1,154 @@ + + diff --git a/src/views/administration/accessmanagement/LdapUsers/index.vue b/src/views/administration/accessmanagement/LdapUsers/index.vue new file mode 100644 index 000000000..91b268a70 --- /dev/null +++ b/src/views/administration/accessmanagement/LdapUsers/index.vue @@ -0,0 +1,133 @@ + + + diff --git a/src/views/administration/accessmanagement/ManagedUsers.vue b/src/views/administration/accessmanagement/ManagedUsers.vue deleted file mode 100644 index 1bdc177fc..000000000 --- a/src/views/administration/accessmanagement/ManagedUsers.vue +++ /dev/null @@ -1,312 +0,0 @@ - - - diff --git a/src/views/administration/accessmanagement/ManagedUsers/UserDetails.vue b/src/views/administration/accessmanagement/ManagedUsers/UserDetails.vue new file mode 100644 index 000000000..88c6402fe --- /dev/null +++ b/src/views/administration/accessmanagement/ManagedUsers/UserDetails.vue @@ -0,0 +1,257 @@ + + + diff --git a/src/views/administration/accessmanagement/ManagedUsers/index.vue b/src/views/administration/accessmanagement/ManagedUsers/index.vue new file mode 100644 index 000000000..2d8beface --- /dev/null +++ b/src/views/administration/accessmanagement/ManagedUsers/index.vue @@ -0,0 +1,143 @@ + + + diff --git a/src/views/administration/accessmanagement/OidcUsers.vue b/src/views/administration/accessmanagement/OidcUsers.vue deleted file mode 100644 index 70553c7b6..000000000 --- a/src/views/administration/accessmanagement/OidcUsers.vue +++ /dev/null @@ -1,234 +0,0 @@ - - - diff --git a/src/views/administration/accessmanagement/OidcUsers/UserDetails.vue b/src/views/administration/accessmanagement/OidcUsers/UserDetails.vue new file mode 100644 index 000000000..83cc94dcf --- /dev/null +++ b/src/views/administration/accessmanagement/OidcUsers/UserDetails.vue @@ -0,0 +1,145 @@ + + diff --git a/src/views/administration/accessmanagement/OidcUsers/index.vue b/src/views/administration/accessmanagement/OidcUsers/index.vue new file mode 100644 index 000000000..9e6712f82 --- /dev/null +++ b/src/views/administration/accessmanagement/OidcUsers/index.vue @@ -0,0 +1,142 @@ + + + diff --git a/src/views/administration/accessmanagement/ProjectRoleListGroupItem.vue b/src/views/administration/accessmanagement/ProjectRoleListGroupItem.vue index eaf86b239..bd0bc3143 100644 --- a/src/views/administration/accessmanagement/ProjectRoleListGroupItem.vue +++ b/src/views/administration/accessmanagement/ProjectRoleListGroupItem.vue @@ -8,6 +8,7 @@ class="action-icon" v-b-tooltip.hover :title="$t('admin.edit_role')" + @click="$emit('editClicked')" > diff --git a/src/views/administration/accessmanagement/SelectPermissionModal.vue b/src/views/administration/accessmanagement/SelectPermissionModal.vue index 17d1e6a5d..53204fff2 100644 --- a/src/views/administration/accessmanagement/SelectPermissionModal.vue +++ b/src/views/administration/accessmanagement/SelectPermissionModal.vue @@ -17,9 +17,13 @@ {{ $t('message.cancel') }} - {{ - $t('message.select') - }} + {{ $t('message.select') }} @@ -38,6 +42,7 @@ export default { }, data() { return { + currentSelection: [], columns: [ { field: 'state', @@ -48,7 +53,7 @@ export default { title: this.$t('message.name'), field: 'name', sortable: true, - formatter(value, row, index) { + formatter(value) { return xssFilters.inHTMLData(common.valueWithDefault(value, '')); }, }, @@ -73,7 +78,6 @@ export default { return res; }, url: `${this.$api.BASE_URL}/${this.$api.URL_PERMISSION}`, - // must use function arrow notation to access 'this' onLoadSuccess: () => { // when the addable permissions load const mappedPermissions = this.currentPermissions.map( @@ -84,14 +88,46 @@ export default { values: mappedPermissions, }); }, + onCheck: this.updateCurrentSelection, + onUncheck: this.updateCurrentSelection, + onCheckAll: this.updateCurrentSelection, + onUncheckAll: this.updateCurrentSelection, }, }; }, + computed: { + selectionHasChanged() { + if ( + this.currentSelection.length === 0 && + this.currentPermissions.length === 0 + ) { + return true; + } + + if (this.currentSelection.length !== this.currentPermissions.length) { + return false; + } + + const isEqual = this.currentSelection.every((sel) => + this.currentPermissions.some((team) => team.name === sel.name), + ); + + return ( + isEqual && + this.currentPermissions.every((team) => + this.currentSelection.some((sel) => sel.name === team.name), + ) + ); + }, + }, methods: { handleSelection: function () { - const selections = this.$refs.table.getSelections(); + const cs = this.currentSelection; this.$root.$emit('bv::hide::modal', this.$children[0].id); - this.$emit('selection', selections); + this.$emit('selection', cs); + }, + updateCurrentSelection() { + this.currentSelection = this.$refs.table.getSelections(); }, }, }; diff --git a/src/views/administration/accessmanagement/SelectRoleModal.vue b/src/views/administration/accessmanagement/SelectRoleModal.vue index 2243ae5bb..749f653af 100644 --- a/src/views/administration/accessmanagement/SelectRoleModal.vue +++ b/src/views/administration/accessmanagement/SelectRoleModal.vue @@ -2,7 +2,7 @@ { - console.error(error); + // console.error(error); this.$toastr.w(this.$t('condition.unsuccessful_action')); }); }, @@ -128,6 +136,11 @@ export default { } catch (error) { this.$toastr.w(this.$t('condition.unsuccessful_action')); } + + if (this.currentProject) { + this.selectedProject = this.currentProject.project; + this.selectedRole = this.currentProject.role; + } }, resetValues: function () { this.selectedProject = this.initialProject; diff --git a/src/views/administration/accessmanagement/SelectTeamModal.vue b/src/views/administration/accessmanagement/SelectTeamModal.vue index 8f55252a2..d6169f778 100644 --- a/src/views/administration/accessmanagement/SelectTeamModal.vue +++ b/src/views/administration/accessmanagement/SelectTeamModal.vue @@ -20,7 +20,8 @@ {{ $t('message.select') }} @@ -33,9 +34,16 @@ import permissionsMixin from '../../../mixins/permissionsMixin'; import common from '../../../shared/common'; export default { + props: { + currentTeams: { + type: Array, + default: () => [], + }, + }, mixins: [permissionsMixin], data() { return { + currentSelection: [], labelIcon: { dataOn: '\u2713', dataOff: '\u2715', @@ -50,7 +58,7 @@ export default { title: this.$t('admin.team_name'), field: 'name', sortable: true, - formatter(value, row, index) { + formatter(value) { return xssFilters.inHTMLData(common.valueWithDefault(value, '')); }, }, @@ -74,8 +82,54 @@ export default { return res; }, url: `${this.$api.BASE_URL}/${this.$api.URL_TEAM}`, + onLoadSuccess: () => { + const preSelected = this.currentTeams.map((team) => team.name); + this.$refs.table.checkBy({ + field: 'name', + values: preSelected, + }); + }, + onCheck: this.updateCurrentSelection, + onUncheck: this.updateCurrentSelection, + onCheckAll: this.updateCurrentSelection, + onUncheckAll: this.updateCurrentSelection, }, }; }, + computed: { + selectionHasChanged() { + if ( + this.currentSelection.length === 0 && + this.currentTeams.length === 0 + ) { + return true; + } + + if (this.currentSelection.length !== this.currentTeams.length) { + return false; + } + + const isEqual = this.currentSelection.every((sel) => + this.currentTeams.some((team) => team.name === sel.name), + ); + + return ( + isEqual && + this.currentTeams.every((team) => + this.currentSelection.some((sel) => sel.name === team.name), + ) + ); + }, + }, + methods: { + handleSelection: function () { + // this.$root.$emit('bv::hide::modal', this.$children[0].id); + this.$bvModal.hide('selectTeamModal'); + this.$emit('selection', this.currentSelection); + }, + updateCurrentSelection() { + this.currentSelection = this.$refs.table.getSelections(); + }, + }, }; diff --git a/src/views/administration/accessmanagement/Teams.vue b/src/views/administration/accessmanagement/Teams.vue deleted file mode 100644 index c5acc1341..000000000 --- a/src/views/administration/accessmanagement/Teams.vue +++ /dev/null @@ -1,566 +0,0 @@ - - - diff --git a/src/views/administration/accessmanagement/Teams/UserDetails.vue b/src/views/administration/accessmanagement/Teams/UserDetails.vue new file mode 100644 index 000000000..6040ba53c --- /dev/null +++ b/src/views/administration/accessmanagement/Teams/UserDetails.vue @@ -0,0 +1,438 @@ + + diff --git a/src/views/administration/accessmanagement/Teams/index.vue b/src/views/administration/accessmanagement/Teams/index.vue new file mode 100644 index 000000000..cf3c3b395 --- /dev/null +++ b/src/views/administration/accessmanagement/Teams/index.vue @@ -0,0 +1,138 @@ + + + From bffa3c901c83167f20dfc0b7cafe49b7d4ee2d0b Mon Sep 17 00:00:00 2001 From: Alexis Lamb Date: Wed, 30 Apr 2025 10:18:46 -0400 Subject: [PATCH 16/25] Update the requestBody in CreateRoleModal to work with the API Signed-off-by: Alexis Lamb --- .../accessmanagement/CreateRoleModal.vue | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/views/administration/accessmanagement/CreateRoleModal.vue b/src/views/administration/accessmanagement/CreateRoleModal.vue index e1688a98f..3e48cc37e 100644 --- a/src/views/administration/accessmanagement/CreateRoleModal.vue +++ b/src/views/administration/accessmanagement/CreateRoleModal.vue @@ -40,7 +40,12 @@ {{ $t('message.close') }} - + {{ $t('message.create') }} @@ -69,11 +74,11 @@ export default { }; }, methods: { - createUser() { + createRole() { let url = `${this.$api.BASE_URL}/${this.$api.URL_ROLE}`; const requestBody = { name: this.name, - permissions: this.permissions.map((perm) => perm.name), + permissions: this.permissions.map((permission) => permission.name), }; this.axios .put(url, requestBody) From 098ce8e4fdef543f44c88ff0ddfddfca301540a3 Mon Sep 17 00:00:00 2001 From: Allen Shearin Date: Mon, 5 May 2025 14:46:38 -0600 Subject: [PATCH 17/25] refactor: remove role specific permission constants Signed-off-by: Allen Shearin --- src/shared/permissions.js | 58 +++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 30 deletions(-) diff --git a/src/shared/permissions.js b/src/shared/permissions.js index 11bd024c6..632b54541 100644 --- a/src/shared/permissions.js +++ b/src/shared/permissions.js @@ -1,47 +1,45 @@ /* eslint-disable prettier/prettier */ // API Permissions -export const ACCESS_MANAGEMENT = 'ACCESS_MANAGEMENT'; -export const ACCESS_MANAGEMENT_CREATE = 'ACCESS_MANAGEMENT_CREATE'; -export const ACCESS_MANAGEMENT_DELETE = 'ACCESS_MANAGEMENT_DELETE'; -export const ACCESS_MANAGEMENT_READ = 'ACCESS_MANAGEMENT_READ'; -export const ACCESS_MANAGEMENT_UPDATE = 'ACCESS_MANAGEMENT_UPDATE'; export const BOM_UPLOAD = 'BOM_UPLOAD'; -export const POLICY_MANAGEMENT = 'POLICY_MANAGEMENT'; -export const POLICY_MANAGEMENT_CREATE = 'POLICY_MANAGEMENT_CREATE'; -export const POLICY_MANAGEMENT_DELETE = 'POLICY_MANAGEMENT_DELETE'; -export const POLICY_MANAGEMENT_READ = 'POLICY_MANAGEMENT_READ'; -export const POLICY_MANAGEMENT_UPDATE = 'POLICY_MANAGEMENT_UPDATE'; -export const POLICY_VIOLATION_ANALYSIS = 'POLICY_VIOLATION_ANALYSIS'; +export const VIEW_PORTFOLIO = 'VIEW_PORTFOLIO'; export const PORTFOLIO_MANAGEMENT = 'PORTFOLIO_MANAGEMENT'; export const PORTFOLIO_MANAGEMENT_CREATE = 'PORTFOLIO_MANAGEMENT_CREATE'; -export const PORTFOLIO_MANAGEMENT_DELETE = 'PORTFOLIO_MANAGEMENT_DELETE'; export const PORTFOLIO_MANAGEMENT_READ = 'PORTFOLIO_MANAGEMENT_READ'; export const PORTFOLIO_MANAGEMENT_UPDATE = 'PORTFOLIO_MANAGEMENT_UPDATE'; -export const PROJECT_CREATION_UPLOAD = 'PROJECT_CREATION_UPLOAD'; -export const ROLE_MANAGEMENT = 'ROLE_MANAGEMENT'; -export const ROLE_MANAGEMENT_CREATE = 'ROLE_MANAGEMENT_CREATE'; -export const ROLE_MANAGEMENT_DELETE = 'ROLE_MANAGEMENT_DELETE'; -export const ROLE_MANAGEMENT_READ = 'ROLE_MANAGEMENT_READ'; -export const ROLE_MANAGEMENT_UPDATE = 'ROLE_MANAGEMENT_UPDATE'; -export const SYSTEM_CONFIGURATION = 'SYSTEM_CONFIGURATION'; -export const SYSTEM_CONFIGURATION_CREATE = 'SYSTEM_CONFIGURATION_CREATE'; -export const SYSTEM_CONFIGURATION_DELETE = 'SYSTEM_CONFIGURATION_DELETE'; -export const SYSTEM_CONFIGURATION_READ = 'SYSTEM_CONFIGURATION_READ'; -export const SYSTEM_CONFIGURATION_UPDATE = 'SYSTEM_CONFIGURATION_UPDATE'; -export const TAG_MANAGEMENT = 'TAG_MANAGEMENT'; -export const TAG_MANAGEMENT_DELETE = 'TAG_MANAGEMENT_DELETE'; -export const VIEW_POLICY_VIOLATION = 'VIEW_POLICY_VIOLATION'; -export const VIEW_PORTFOLIO = 'VIEW_PORTFOLIO'; +export const PORTFOLIO_MANAGEMENT_DELETE = 'PORTFOLIO_MANAGEMENT_DELETE'; export const VIEW_VULNERABILITY = 'VIEW_VULNERABILITY'; export const VULNERABILITY_ANALYSIS = 'VULNERABILITY_ANALYSIS'; export const VULNERABILITY_ANALYSIS_CREATE = 'VULNERABILITY_ANALYSIS_CREATE'; export const VULNERABILITY_ANALYSIS_READ = 'VULNERABILITY_ANALYSIS_READ'; export const VULNERABILITY_ANALYSIS_UPDATE = 'VULNERABILITY_ANALYSIS_UPDATE'; +export const VIEW_POLICY_VIOLATION = 'VIEW_POLICY_VIOLATION'; export const VULNERABILITY_MANAGEMENT = 'VULNERABILITY_MANAGEMENT'; -export const VULNERABILITY_MANAGEMENT_CREATE = 'VULNERABILITY_MANAGEMENT_CREATE'; -export const VULNERABILITY_MANAGEMENT_DELETE = 'VULNERABILITY_MANAGEMENT_DELETE'; +export const VULNERABILITY_MANAGEMENT_CREATE = + 'VULNERABILITY_MANAGEMENT_CREATE'; export const VULNERABILITY_MANAGEMENT_READ = 'VULNERABILITY_MANAGEMENT_READ'; -export const VULNERABILITY_MANAGEMENT_UPDATE = 'VULNERABILITY_MANAGEMENT_UPDATE'; +export const VULNERABILITY_MANAGEMENT_UPDATE = + 'VULNERABILITY_MANAGEMENT_UPDATE'; +export const VULNERABILITY_MANAGEMENT_DELETE = + 'VULNERABILITY_MANAGEMENT_DELETE'; +export const POLICY_VIOLATION_ANALYSIS = 'POLICY_VIOLATION_ANALYSIS'; +export const ACCESS_MANAGEMENT = 'ACCESS_MANAGEMENT'; +export const ACCESS_MANAGEMENT_CREATE = 'ACCESS_MANAGEMENT_CREATE'; +export const ACCESS_MANAGEMENT_READ = 'ACCESS_MANAGEMENT_READ'; +export const ACCESS_MANAGEMENT_UPDATE = 'ACCESS_MANAGEMENT_UPDATE'; +export const ACCESS_MANAGEMENT_DELETE = 'ACCESS_MANAGEMENT_DELETE'; +export const SYSTEM_CONFIGURATION = 'SYSTEM_CONFIGURATION'; +export const SYSTEM_CONFIGURATION_CREATE = 'SYSTEM_CONFIGURATION_CREATE'; +export const SYSTEM_CONFIGURATION_READ = 'SYSTEM_CONFIGURATION_READ'; +export const SYSTEM_CONFIGURATION_UPDATE = 'SYSTEM_CONFIGURATION_UPDATE'; +export const SYSTEM_CONFIGURATION_DELETE = 'SYSTEM_CONFIGURATION_DELETE'; +export const PROJECT_CREATION_UPLOAD = 'PROJECT_CREATION_UPLOAD'; +export const POLICY_MANAGEMENT = 'POLICY_MANAGEMENT'; +export const POLICY_MANAGEMENT_CREATE = 'POLICY_MANAGEMENT_CREATE'; +export const POLICY_MANAGEMENT_READ = 'POLICY_MANAGEMENT_READ'; +export const POLICY_MANAGEMENT_UPDATE = 'POLICY_MANAGEMENT_UPDATE'; +export const POLICY_MANAGEMENT_DELETE = 'POLICY_MANAGEMENT_DELETE'; +export const TAG_MANAGEMENT = 'TAG_MANAGEMENT'; +export const TAG_MANAGEMENT_DELETE = 'TAG_MANAGEMENT_DELETE'; /** * Determines if the current logged in user has a specific permission. From c136b934d05e5bae3c393cdf6296fd612c7576a7 Mon Sep 17 00:00:00 2001 From: Emmanuel Meremikwu Date: Tue, 20 May 2025 11:46:30 -0500 Subject: [PATCH 18/25] refactor(introduce UserRolesTable and separation of detailFormatter): - introduced UserRolesTable, supercede SelectRoleModal and editing roles - separate detailFormatter and parent componenet for code clairty - i18n Signed-off-by: Emmanuel Meremikwu --- src/i18n/locales/de.json | 10 +- src/i18n/locales/en.json | 10 +- src/i18n/locales/es.json | 10 +- src/i18n/locales/fr.json | 10 +- src/i18n/locales/hi.json | 10 +- src/i18n/locales/it.json | 10 +- src/i18n/locales/ja.json | 10 +- src/i18n/locales/pl.json | 10 +- src/i18n/locales/pt-BR.json | 10 +- src/i18n/locales/pt.json | 10 +- src/i18n/locales/ru.json | 10 +- src/i18n/locales/uk-UA.json | 10 +- src/i18n/locales/zh.json | 10 +- src/mixins/userManagementMixin.js | 223 ++++---- src/shared/api.json | 6 +- .../accessmanagement/CreateRoleModal.vue | 9 +- .../LdapUsers/UserDetails.vue | 206 ++++---- .../accessmanagement/LdapUsers/index.vue | 11 +- .../ManagedUsers/UserDetails.vue | 307 ++++++----- .../accessmanagement/ManagedUsers/index.vue | 6 +- .../OidcUsers/UserDetails.vue | 191 ++++--- .../accessmanagement/OidcUsers/index.vue | 9 +- .../ProjectRoleListGroupItem.vue | 73 --- .../administration/accessmanagement/Roles.vue | 277 ---------- .../accessmanagement/Roles/RoleDetails.vue | 147 ++++++ .../accessmanagement/Roles/index.vue | 161 ++++++ .../SelectPermissionModal.vue | 3 +- .../accessmanagement/SelectRoleModal.vue | 151 ------ .../accessmanagement/Teams/TeamDetails.vue | 496 ++++++++++++++++++ .../accessmanagement/Teams/index.vue | 11 +- src/views/components/UserRolesTable.vue | 318 +++++++++++ .../portfolio/projects/SelectProjectModal.vue | 40 +- 32 files changed, 1730 insertions(+), 1045 deletions(-) delete mode 100644 src/views/administration/accessmanagement/ProjectRoleListGroupItem.vue delete mode 100644 src/views/administration/accessmanagement/Roles.vue create mode 100644 src/views/administration/accessmanagement/Roles/RoleDetails.vue create mode 100644 src/views/administration/accessmanagement/Roles/index.vue delete mode 100644 src/views/administration/accessmanagement/SelectRoleModal.vue create mode 100644 src/views/administration/accessmanagement/Teams/TeamDetails.vue create mode 100644 src/views/components/UserRolesTable.vue diff --git a/src/i18n/locales/de.json b/src/i18n/locales/de.json index 99760b35b..40ee47009 100644 --- a/src/i18n/locales/de.json +++ b/src/i18n/locales/de.json @@ -6,6 +6,7 @@ }, "admin": { "access_management": "Zugriffsverwaltung", + "add_project": "Projekt hinzufügen", "alert_created": "Alarm erstellt", "alert_deleted": "Alarm gelöscht", "alert_log_successful_publish": "Erfolgreiche Alarmierung protokollieren", @@ -41,7 +42,6 @@ "api_keys": "API-Schlüssel", "api_token": "API-Token", "api_token_header": "Header des API-Tokens", - "assign_role": "Rolle zuweisen", "base_url": "Basis-URL", "bearer_token_auth_enable": "Authentifizieren mit einem persönlichen Zugriffstoken", "bom_formats": "BOM-Formate", @@ -89,7 +89,6 @@ "disabled_for_tags": "Deaktiviert für Tags", "distinguished_name": "Distinguished Name", "edit_api_key_comment": "Kommentar zum API-Schlüssel bearbeiten", - "edit_role": "Rolle bearbeiten", "email": "E-Mail", "email_address": "E-Mail-Adresse", "email_enable_ssltls": "SSL/TLS-Verschlüsselung aktivieren", @@ -168,6 +167,7 @@ "metrics": "Metriken", "mime_type": "Mime Typ", "minutes": "Minuten", + "multiselect_remove_role": "Rollen können nur geändert werden", "name_regex": "Komponentenname Regex", "name_regex_desc": "Gibt einen regulären Ausdruck an, der interne Komponenten anhand des Komponentennamens identifiziert.", "namespace_regex": "Regulärer Ausdruck für den Komponenten-Namespace", @@ -176,7 +176,6 @@ "new_api_key": "Dies ist der neu erzeugte API -Schlüssel. \nBitte beachten Sie, dass es nur einmal angezeigt wird und später nicht abgerufen werden kann.", "new_api_key_title": "Neuer API -Schlüssel", "nixpkgs": "Nixpkgs", - "no_unassigned_projects": "Keine nicht zugewiesenen Projekte", "notification_level": "Level", "notifications": "Benachrichtigungen", "npm": "NPM", @@ -203,8 +202,6 @@ "preview": "Vorschau", "project": "Projekt", "project_access": "Projektzugriff", - "project_membership": "Projektmitgliedschaft", - "project_name": "Projektname", "project_retention_enable": "Aktivieren Sie das Löschen inaktiver Projekte", "publisher": "Publisher", "publisher_class": "Publisher-Klasse", @@ -252,8 +249,8 @@ "role_assigned": "Rolle zugewiesen", "role_created": "Rolle erstellt", "role_deleted": "Rolle gelöscht", - "role_membership": "Rollenmitgliedschaft", "role_name": "Rollenname", + "role_updated": "Rolle aktualisiert", "roles": "Rollen", "scope": "Scope", "select_ecosystem": "Ökosysteme auswählen", @@ -385,7 +382,6 @@ "apply_vex": "VEX anwenden", "apply_vex_tooltip": "Wenden Sie Analysen aus einem Vulnerability Exploitability eXchange (VEX)-Dokument auf dieses Projekt an.", "approved": "Genehmigt", - "assign": "Zuweisen", "attributed_on": "Zugeordnet am", "audit_trail": "Buchungskontrolle", "audit_vulnerabilities": "Schwachstellen prüfen", diff --git a/src/i18n/locales/en.json b/src/i18n/locales/en.json index 52adc86fc..205f3f808 100644 --- a/src/i18n/locales/en.json +++ b/src/i18n/locales/en.json @@ -6,6 +6,7 @@ }, "admin": { "access_management": "Access Management", + "add_project": "Add Project", "alert_created": "Alert created", "alert_deleted": "Alert deleted", "alert_log_successful_publish": "Log successful publish", @@ -41,7 +42,6 @@ "api_keys": "API Keys", "api_token": "API token", "api_token_header": "API token header", - "assign_role": "Assign Role", "base_url": "Base URL", "bearer_token_auth_enable": "Authenticate with a personal access token", "bom_formats": "BOM Formats", @@ -89,7 +89,6 @@ "disabled_for_tags": "Disabled for tags", "distinguished_name": "Distinguished name", "edit_api_key_comment": "Edit API Key Comment", - "edit_role": "Edit Role", "email": "Email", "email_address": "Email address", "email_enable_ssltls": "Enable SSL/TLS encryption", @@ -168,6 +167,7 @@ "metrics": "Metrics", "mime_type": "Mime type", "minutes": "Minutes", + "multiselect_remove_role": "Roles can only be changed", "name_regex": "Component name regex", "name_regex_desc": "Specifies a regular expression that identifies internal components by the components name.", "namespace_regex": "Component namespace regex", @@ -176,7 +176,6 @@ "new_api_key": "This is the newly generated API key. Please note that it will only be displayed once and cannot be retrieved later.", "new_api_key_title": "New API Key", "nixpkgs": "Nixpkgs", - "no_unassigned_projects": "No unassigned projects", "notification_level": "Notification level", "notifications": "Notifications", "npm": "NPM", @@ -203,8 +202,6 @@ "preview": "Preview", "project": "Project", "project_access": "Project access", - "project_membership": "Project Membership", - "project_name": "Project Name", "project_retention_enable": "Enable Inactive Project Deletion", "publisher": "Publisher", "publisher_class": "Publisher class", @@ -252,8 +249,8 @@ "role_assigned": "Role Assigned", "role_created": "Role Created", "role_deleted": "Role Deleted", - "role_membership": "Role Membership", "role_name": "Role Name", + "role_updated": "Role Updated", "roles": "Roles", "scope": "Scope", "select_ecosystem": "Select Ecosystems", @@ -385,7 +382,6 @@ "apply_vex": "Apply VEX", "apply_vex_tooltip": "Apply analyses from a Vulnerability Exploitability eXchange (VEX) document to this project.", "approved": "Approved", - "assign": "Assign", "attributed_on": "Attributed On", "audit_trail": "Audit Trail", "audit_vulnerabilities": "Audit Vulnerabilities", diff --git a/src/i18n/locales/es.json b/src/i18n/locales/es.json index c70f208c2..367a8d292 100644 --- a/src/i18n/locales/es.json +++ b/src/i18n/locales/es.json @@ -6,6 +6,7 @@ }, "admin": { "access_management": "Gestión de Acceso", + "add_project": "Agregar proyecto", "alert_created": "Alerta creada", "alert_deleted": "Alerta eliminada", "alert_log_successful_publish": "Registrar publicación exitosa", @@ -41,7 +42,6 @@ "api_keys": "Claves API", "api_token": "token API", "api_token_header": "api_token_header", - "assign_role": "Asignar rol", "base_url": "URL base", "bearer_token_auth_enable": "Autenticarse con un token de acceso personal", "bom_formats": "Formatos de lista de materiales", @@ -89,7 +89,6 @@ "disabled_for_tags": "Deshabilitado para etiquetas", "distinguished_name": "Nombre distinguido", "edit_api_key_comment": "edit_api_key_comment", - "edit_role": "Rol de edición", "email": "Correo electrónico", "email_address": "Dirección de correo electrónico", "email_enable_ssltls": "Habilitar el cifrado SSL/TLS", @@ -168,6 +167,7 @@ "metrics": "Métrica", "mime_type": "Tipo de Mimica", "minutes": "Minutos", + "multiselect_remove_role": "Los roles solo se pueden cambiar", "name_regex": "Nombre del componente expresión regular", "name_regex_desc": "Especifica una expresión regular que identifica los componentes internos por el nombre de los componentes.", "namespace_regex": "Expresión regular del espacio de nombres del componente", @@ -176,7 +176,6 @@ "new_api_key": "Esta es la clave API recientemente generada. \nTenga en cuenta que solo se mostrará una vez y no se puede recuperar más tarde.", "new_api_key_title": "Nueva clave API", "nixpkgs": "Nixpkgs", - "no_unassigned_projects": "No hay proyectos no asignados", "notification_level": "Nivel de notificación", "notifications": "Notificaciones", "npm": "MNP", @@ -203,8 +202,6 @@ "preview": "Avance", "project": "Proyecto", "project_access": "Acceso al proyecto", - "project_membership": "Membresía del proyecto", - "project_name": "Nombre del proyecto", "project_retention_enable": "Habilitar la eliminación de proyectos inactivos", "publisher": "Editor", "publisher_class": "Clase de editor", @@ -252,8 +249,8 @@ "role_assigned": "Rol asignado", "role_created": "Rol creado", "role_deleted": "Rol eliminado", - "role_membership": "Membresía de rol", "role_name": "Nombre del rol", + "role_updated": "Rol actualizado", "roles": "Roles", "scope": "Alcance", "select_ecosystem": "Seleccionar ecosistemas", @@ -385,7 +382,6 @@ "apply_vex": "Aplicar VEX", "apply_vex_tooltip": "Aplique análisis de un documento de Vulnerability Exploitability eXchange (VEX) a este proyecto.", "approved": "Aprobado", - "assign": "Asignar", "attributed_on": "Atribuido el", "audit_trail": "Pista de auditoría", "audit_vulnerabilities": "Vulnerabilidades de auditoría", diff --git a/src/i18n/locales/fr.json b/src/i18n/locales/fr.json index 6d3b26ea9..3f3af0c6b 100644 --- a/src/i18n/locales/fr.json +++ b/src/i18n/locales/fr.json @@ -6,6 +6,7 @@ }, "admin": { "access_management": "Gestion des accès", + "add_project": "Ajouter un projet", "alert_created": "Alerte créée", "alert_deleted": "Alerte supprimée", "alert_log_successful_publish": "Journaliser les publications réussies", @@ -41,7 +42,6 @@ "api_keys": "Clés d'API", "api_token": "Jeton d'API", "api_token_header": "Entête du jeton d'API", - "assign_role": "Attribuer un rôle", "base_url": "URL de base", "bearer_token_auth_enable": "S'authentifier avec un jeton d'accès personnel", "bom_formats": "Formats de nomenclature (BOM)", @@ -89,7 +89,6 @@ "disabled_for_tags": "Désactivé pour les balises", "distinguished_name": "Nom distinctif (DN)", "edit_api_key_comment": "Éditer le commentaire de clé d'API", - "edit_role": "Modifier le rôle", "email": "Courriel", "email_address": "Adresse de courriel", "email_enable_ssltls": "Activer le chiffrement SSL/TLS", @@ -168,6 +167,7 @@ "metrics": "Métrique", "mime_type": "Type MIME", "minutes": "Minutes", + "multiselect_remove_role": "Les rôles ne peuvent être modifiés que", "name_regex": "Regex du nom du composant", "name_regex_desc": "Spécifie une expression régulière qui identifie les composants internes par le nom des composants.", "namespace_regex": "Regex d'espace de noms de composant", @@ -176,7 +176,6 @@ "new_api_key": "Il s'agit de la clé API nouvellement générée. \nVeuillez noter qu'il ne sera affiché qu'une seule fois et ne peut pas être récupéré plus tard.", "new_api_key_title": "Nouvelle clé API", "nixpkgs": "Nixpkgs", - "no_unassigned_projects": "Pas de projets non attribués", "notification_level": "Niveau d'alerte", "notifications": "Notifications", "npm": "NPM", @@ -203,8 +202,6 @@ "preview": "Aperçu", "project": "Projet", "project_access": "Accès au projet", - "project_membership": "Adhésion au projet", - "project_name": "Nom du projet", "project_retention_enable": "Activer la suppression des projets inactifs", "publisher": "Éditeur", "publisher_class": "Classe d'éditeur", @@ -252,8 +249,8 @@ "role_assigned": "Rôle attribué", "role_created": "Rôle créé", "role_deleted": "Rôle supprimé", - "role_membership": "Adhésion au rôle", "role_name": "Nom du rôle", + "role_updated": "Rôle mis à jour", "roles": "Rôles", "scope": "Périmètre", "select_ecosystem": "Sélectionner les écosystèmes", @@ -385,7 +382,6 @@ "apply_vex": "Appliquer VEX", "apply_vex_tooltip": "Appliquer les analyses d'un document Vulnerability Exploitability eXchange (VEX) à ce projet.", "approved": "Approuvée", - "assign": "Attribuer", "attributed_on": "Attribuée le", "audit_trail": "Suivi d'audit", "audit_vulnerabilities": "Audit des vulnérabilités", diff --git a/src/i18n/locales/hi.json b/src/i18n/locales/hi.json index 63b7a65c9..241d2a922 100644 --- a/src/i18n/locales/hi.json +++ b/src/i18n/locales/hi.json @@ -6,6 +6,7 @@ }, "admin": { "access_management": "उपयोग प्रबंधन", + "add_project": "प्रोजेक्ट जोड़ें", "alert_created": "अलर्ट बनाया गया", "alert_deleted": "अलर्ट हटा दिया गया", "alert_log_successful_publish": "लॉग सफल प्रकाशन", @@ -41,7 +42,6 @@ "api_keys": "एपीआई कुंजियाँ", "api_token": "एपीआई टोकन", "api_token_header": "api_token_header", - "assign_role": "भूमिका सौंपें", "base_url": "आधार यूआरएल", "bearer_token_auth_enable": "व्यक्तिगत एक्सेस टोकन से प्रमाणीकरण करें", "bom_formats": "बीओएम प्रारूप", @@ -89,7 +89,6 @@ "disabled_for_tags": "टैग के लिए अक्षम", "distinguished_name": "विशिष्ट नाम", "edit_api_key_comment": "edit_api_key_comment", - "edit_role": "भूमिका संपादित करें", "email": "ईमेल", "email_address": "मेल पता", "email_enable_ssltls": "SSL/TLS एन्क्रिप्शन सक्षम करें", @@ -168,6 +167,7 @@ "metrics": "मेट्रिक्स", "mime_type": "माइम प्रकार", "minutes": "मिनट", + "multiselect_remove_role": "भूमिकाएँ केवल बदली जा सकती हैं", "name_regex": "घटक नाम रेगेक्स", "name_regex_desc": "एक नियमित अभिव्यक्ति निर्दिष्ट करता है जो घटक नाम से आंतरिक घटकों की पहचान करता है।", "namespace_regex": "घटक नामस्थान regex", @@ -176,7 +176,6 @@ "new_api_key": "यह नई उत्पन्न एपीआई कुंजी है। \nकृपया ध्यान दें कि यह केवल एक बार प्रदर्शित किया जाएगा और बाद में पुनर्प्राप्त नहीं किया जा सकता है।", "new_api_key_title": "नई एपीआई कुंजी", "nixpkgs": "Nixpkgs", - "no_unassigned_projects": "कोई अनसुना परियोजना नहीं", "notification_level": "अधिसूचना स्तर", "notifications": "सूचनाएं", "npm": "NPM", @@ -202,8 +201,6 @@ "portfolio_access_control": "पोर्टफोलियो एक्सेस नियंत्रण", "preview": "पूर्व दर्शन", "project_access": "परियोजना तक पहुंच", - "project_membership": "परियोजना सदस्यता", - "project_name": "प्रोजेक्ट नाम", "project_retention_enable": "निष्क्रिय प्रोजेक्ट विलोपन सक्षम करें", "publisher": "प्रकाशक", "publisher_class": "प्रकाशक वर्ग", @@ -248,8 +245,8 @@ "role_assigned": "सौंपी गई भूमिका", "role_created": "भूमिका बनाई गई", "role_deleted": "भूमिका हटा दी गई", - "role_membership": "भूमिका सदस्यता", "role_name": "भूमिका का नाम", + "role_updated": "अद्यतन की गई भूमिका", "roles": "भूमिकाएँ", "scope": "दायरा", "select_ecosystem": "पारिस्थितिकी तंत्र का चयन करें", @@ -381,7 +378,6 @@ "apply_vex": "VEX लागू करें", "apply_vex_tooltip": "इस परियोजना पर भेद्यता शोषण एक्सचेंज (VEX) दस्तावेज़ से विश्लेषण लागू करें।", "approved": "अनुमत", - "assign": "सौंपना", "attributed_on": "पर जिम्मेदार ठहराया", "audit_trail": "लेखापरीक्षा", "audit_vulnerabilities": "ऑडिट कमजोरियाँ", diff --git a/src/i18n/locales/it.json b/src/i18n/locales/it.json index b12a4eb13..dc19c7572 100644 --- a/src/i18n/locales/it.json +++ b/src/i18n/locales/it.json @@ -6,6 +6,7 @@ }, "admin": { "access_management": "gestione degli accessi", + "add_project": "Aggiungi progetto", "alert_created": "Avviso creato", "alert_deleted": "Avviso eliminato", "alert_log_successful_publish": "Registra la pubblicazione riuscita", @@ -41,7 +42,6 @@ "api_keys": "Chiavi API", "api_token": "Token API", "api_token_header": "api_token_header", - "assign_role": "Assegna ruolo", "base_url": "URL di base", "bearer_token_auth_enable": "Autenticarsi con un token di accesso personale", "bom_formats": "Formati distinta base", @@ -89,7 +89,6 @@ "disabled_for_tags": "Disabilitato per i tag", "distinguished_name": "Nome distinto", "edit_api_key_comment": "edit_api_key_comment", - "edit_role": "Modifica il ruolo", "email": "E-mail", "email_address": "Indirizzo e-mail", "email_enable_ssltls": "Abilita la crittografia SSL/TLS", @@ -168,6 +167,7 @@ "metrics": "Metrica", "mime_type": "Tipo mimo", "minutes": "Minuti", + "multiselect_remove_role": "I ruoli possono essere modificati solo", "name_regex": "Nome del componente regex", "name_regex_desc": "Specifica un'espressione regolare che identifica i componenti interni tramite il nome dei componenti.", "namespace_regex": "Regex dello spazio dei nomi del componente", @@ -176,7 +176,6 @@ "new_api_key": "Questa è la chiave API di recente generazione. \nSi prega di notare che verrà visualizzato solo una volta e non può essere recuperato più tardi.", "new_api_key_title": "Nuova chiave API", "nixpkgs": "Nixpkgs", - "no_unassigned_projects": "Nessun progetto non assegnato", "notification_level": "Livello di notifica", "notifications": "Notifiche", "npm": "NPM", @@ -203,8 +202,6 @@ "preview": "Anteprima", "project": "Progetto", "project_access": "Accesso al progetto", - "project_membership": "Iscrizione al progetto", - "project_name": "Nome del progetto", "project_retention_enable": "Abilita l'eliminazione del progetto inattivo", "publisher": "Editore", "publisher_class": "Classe editore", @@ -252,8 +249,8 @@ "role_assigned": "Ruolo assegnato", "role_created": "Ruolo creato", "role_deleted": "Ruolo eliminato", - "role_membership": "Appartenenza al ruolo", "role_name": "Nome del ruolo", + "role_updated": "Ruolo aggiornato", "roles": "Ruoli", "scope": "Scopo", "select_ecosystem": "Seleziona Ecosistemi", @@ -385,7 +382,6 @@ "apply_vex": "Applica VEX", "apply_vex_tooltip": "Applicare le analisi da un documento Vulnerability Exploitability eXchange (VEX) a questo progetto.", "approved": "Approvato", - "assign": "Assegnare", "attributed_on": "Attribuito a", "audit_trail": "Traccia di controllo", "audit_vulnerabilities": "Vulnerabilità del controllo", diff --git a/src/i18n/locales/ja.json b/src/i18n/locales/ja.json index 095967e3e..8bb880589 100644 --- a/src/i18n/locales/ja.json +++ b/src/i18n/locales/ja.json @@ -6,6 +6,7 @@ }, "admin": { "access_management": "アクセス管理", + "add_project": "プロジェクトを追加します", "alert_created": "アラートを作成しました", "alert_deleted": "アラートを削除しました", "alert_log_successful_publish": "発行成功のログ", @@ -41,7 +42,6 @@ "api_keys": "APIキー", "api_token": "APIトークン", "api_token_header": "api_token_header", - "assign_role": "ロールを割り当てる", "base_url": "ベースURL", "bearer_token_auth_enable": "パーソナルアクセストークンで認証する", "bom_formats": "BOM 形式", @@ -89,7 +89,6 @@ "disabled_for_tags": "タグが無効になっています", "distinguished_name": "識別名", "edit_api_key_comment": "edit_api_key_comment", - "edit_role": "役割を編集します", "email": "Eメール", "email_address": "Eメールアドレス", "email_enable_ssltls": "SSL/TLS暗号化を有効にする", @@ -168,6 +167,7 @@ "metrics": "メトリクス", "mime_type": "MIMEタイプ", "minutes": "分", + "multiselect_remove_role": "役割は変更のみを変更できます", "name_regex": "コンポーネント名の正規表現", "name_regex_desc": "コンポーネント名によって内部コンポーネントを識別する正規表現を指定します。", "namespace_regex": "コンポーネント名前空間の正規表現", @@ -176,7 +176,6 @@ "new_api_key": "これは、新しく生成されたAPIキーです。\nそれは一度しか表示されず、後で取得することはできないことに注意してください。", "new_api_key_title": "新しいAPIキー", "nixpkgs": "Nixpkgs", - "no_unassigned_projects": "割り当てられていないプロジェクトはありません", "notification_level": "通知レベル", "notifications": "通知", "npm": "NPM", @@ -203,8 +202,6 @@ "preview": "プレビュー", "project": "プロジェクト", "project_access": "プロジェクトへのアクセス", - "project_membership": "プロジェクトメンバーシップ", - "project_name": "プロジェクト名", "project_retention_enable": "非アクティブなプロジェクトの削除を有効にする", "publisher": "パブリッシャー", "publisher_class": "パブリッシャークラス", @@ -252,8 +249,8 @@ "role_assigned": "割り当てられた役割", "role_created": "ロールを作成しました", "role_deleted": "ロールを削除しました", - "role_membership": "ロールメンバーシップ", "role_name": "ロール名", + "role_updated": "ロールが更新されました", "roles": "ロール", "scope": "スコープ", "select_ecosystem": "エコシステムを選択", @@ -385,7 +382,6 @@ "apply_vex": "VEXを適用する", "apply_vex_tooltip": "Vulnerability Exploitability eXchange (VEX) ドキュメントからの分析をこのプロジェクトに適用します。", "approved": "承認された", - "assign": "割り当て", "attributed_on": "帰属先", "audit_trail": "監査証跡", "audit_vulnerabilities": "監査の脆弱性", diff --git a/src/i18n/locales/pl.json b/src/i18n/locales/pl.json index ffec9ffe4..c2a058d53 100644 --- a/src/i18n/locales/pl.json +++ b/src/i18n/locales/pl.json @@ -6,6 +6,7 @@ }, "admin": { "access_management": "Zarządzanie dostępem", + "add_project": "Dodaj projekt", "alert_created": "Alert został utworzony", "alert_deleted": "Alert usunięty", "alert_log_successful_publish": "Zaloguj pomyślną publikację", @@ -41,7 +42,6 @@ "api_keys": "Klucze API", "api_token": "Token API", "api_token_header": "api_token_header", - "assign_role": "Przypisz rolę", "base_url": "Bazowy adres URL", "bearer_token_auth_enable": "Uwierzytelnij się za pomocą osobistego tokena dostępu", "bom_formats": "Formaty BOM-ów", @@ -89,7 +89,6 @@ "disabled_for_tags": "Wyłączone dla tagów", "distinguished_name": "Wytworne imię", "edit_api_key_comment": "edit_api_key_comment", - "edit_role": "Edytuj rolę", "email": "E-mail", "email_address": "Adres e-mail", "email_enable_ssltls": "Włącz szyfrowanie SSL/TLS", @@ -168,6 +167,7 @@ "metrics": "Metryka", "mime_type": "Typ mima", "minutes": "Protokół", + "multiselect_remove_role": "Role można tylko zmienić", "name_regex": "Wyrażenie regularne nazwy komponentu", "name_regex_desc": "Określa wyrażenie regularne identyfikujące komponenty wewnętrzne na podstawie ich nazw.", "namespace_regex": "Wyrażenie regularne przestrzeni nazw komponentu", @@ -176,7 +176,6 @@ "new_api_key": "Jest to nowo wygenerowany klucz API. \nNależy pamiętać, że zostanie wyświetlony tylko raz i nie można go później odzyskać.", "new_api_key_title": "Nowy klucz API", "nixpkgs": "Nixpkgs", - "no_unassigned_projects": "Żadnych nie przypisanych projektów", "notification_level": "Poziom powiadomień", "notifications": "Powiadomienia", "npm": "NPM", @@ -203,8 +202,6 @@ "preview": "Zapowiedź", "project": "Projekt", "project_access": "Dostęp do projektu", - "project_membership": "Członkostwo w projekcie", - "project_name": "Nazwa projektu", "project_retention_enable": "Włącz usuwanie nieaktywnego projektu", "publisher": "Wydawca", "publisher_class": "Klasa wydawcy", @@ -252,8 +249,8 @@ "role_assigned": "Przypisana rola", "role_created": "Rola utworzona", "role_deleted": "Rola usunięta", - "role_membership": "Członkostwo ról", "role_name": "Nazwa roli", + "role_updated": "Zaktualizowano rolę", "roles": "Role", "scope": "Zakres", "select_ecosystem": "Wybierz Ekosystemy", @@ -385,7 +382,6 @@ "apply_vex": "Zastosuj VEX", "apply_vex_tooltip": "Zastosuj analizy z dokumentu Vulnerability Exploitability eXchange (VEX) do tego projektu.", "approved": "Zatwierdzony", - "assign": "Przypisać", "attributed_on": "Przypisane", "audit_trail": "Ścieżka audytu", "audit_vulnerabilities": "Audyt luk w zabezpieczeniach", diff --git a/src/i18n/locales/pt-BR.json b/src/i18n/locales/pt-BR.json index 1241b1451..db0de54c6 100644 --- a/src/i18n/locales/pt-BR.json +++ b/src/i18n/locales/pt-BR.json @@ -6,6 +6,7 @@ }, "admin": { "access_management": "Gerenciamento de acesso", + "add_project": "Adicionar projeto", "alert_created": "Alerta criado", "alert_deleted": "Alerta excluído", "alert_log_successful_publish": "Registrar publicação bem-sucedida", @@ -41,7 +42,6 @@ "api_keys": "Chaves de API", "api_token": "Token de API", "api_token_header": "api_token_header", - "assign_role": "Atribuir função", "base_url": "URL base", "bearer_token_auth_enable": "Autenticar com um token de acesso pessoal", "bom_formats": "Formatos de lista de materiais", @@ -89,7 +89,6 @@ "disabled_for_tags": "Desativado para tags", "distinguished_name": "Nome Distinto", "edit_api_key_comment": "edit_api_key_comment", - "edit_role": "Função de edição", "email": "E-mail", "email_address": "Endereço de email", "email_enable_ssltls": "Habilitar criptografia SSL/TLS", @@ -168,6 +167,7 @@ "metrics": "Métricas", "mime_type": "Tipo Mime", "minutes": "Minutos", + "multiselect_remove_role": "Os papéis só podem ser alterados", "name_regex": "Regex do nome do componente", "name_regex_desc": "Especifica uma expressão regular que identifica componentes internos pelo nome dos componentes.", "namespace_regex": "Regex do namespace do componente", @@ -176,7 +176,6 @@ "new_api_key": "Esta é a chave da API recém -gerada. \nObserve que ele será exibido apenas uma vez e não poderá ser recuperado posteriormente.", "new_api_key_title": "Nova chave da API", "nixpkgs": "Nixpkgs", - "no_unassigned_projects": "Nenhum projeto não atribuído", "notification_level": "Nível de notificação", "notifications": "Notificações", "npm": "NPM", @@ -203,8 +202,6 @@ "preview": "Visualização", "project": "Projeto", "project_access": "Acesso ao projeto", - "project_membership": "Associação do projeto", - "project_name": "Nome do projeto", "project_retention_enable": "Habilitar exclusão de projetos inativos", "publisher": "Editor", "publisher_class": "Classe de editor", @@ -252,8 +249,8 @@ "role_assigned": "Função atribuída", "role_created": "Função criada", "role_deleted": "Função excluída", - "role_membership": "Associação de papéis", "role_name": "Nome da função", + "role_updated": "Função atualizada", "roles": "Funções", "scope": "Escopo", "select_ecosystem": "Selecione Ecossistemas", @@ -385,7 +382,6 @@ "apply_vex": "Aplicar VEX", "apply_vex_tooltip": "Aplique análises de um documento Vulnerability Exploitability eXchange (VEX) a este projeto.", "approved": "Aprovado", - "assign": "Atribuir", "attributed_on": "Atribuído em", "audit_trail": "Trilha de auditoria", "audit_vulnerabilities": "Vulnerabilidades de auditoria", diff --git a/src/i18n/locales/pt.json b/src/i18n/locales/pt.json index 5b5cbc48a..a5b0de61d 100644 --- a/src/i18n/locales/pt.json +++ b/src/i18n/locales/pt.json @@ -6,6 +6,7 @@ }, "admin": { "access_management": "Gerir acessos", + "add_project": "Adicionar projeto", "alert_created": "Alerta criado", "alert_deleted": "Alerta excluído", "alert_log_successful_publish": "Registrar publicação bem-sucedida", @@ -41,7 +42,6 @@ "api_keys": "Chaves de API", "api_token": "Token de API", "api_token_header": "api_token_header", - "assign_role": "Atribuir função", "base_url": "URL base", "bearer_token_auth_enable": "Autenticar com um token de acesso pessoal", "bom_formats": "Formatos de lista de materiais", @@ -89,7 +89,6 @@ "disabled_for_tags": "Desativado para tags", "distinguished_name": "Nome Distinto", "edit_api_key_comment": "edit_api_key_comment", - "edit_role": "Função de edição", "email": "E-mail", "email_address": "Endereço de email", "email_enable_ssltls": "Habilitar criptografia SSL/TLS", @@ -168,6 +167,7 @@ "metrics": "Métricas", "mime_type": "Tipo Mime", "minutes": "Minutos", + "multiselect_remove_role": "Os papéis só podem ser alterados", "name_regex": "Regex do nome do componente", "name_regex_desc": "Especifica uma expressão regular que identifica componentes internos pelo nome dos componentes.", "namespace_regex": "Regex do namespace do componente", @@ -176,7 +176,6 @@ "new_api_key": "Esta é a chave da API recém -gerada. \nObserve que ele será exibido apenas uma vez e não poderá ser recuperado posteriormente.", "new_api_key_title": "Nova chave da API", "nixpkgs": "Nixpkgs", - "no_unassigned_projects": "Nenhum projeto não atribuído", "notification_level": "Nível de notificação", "notifications": "Notificações", "npm": "NPM", @@ -203,8 +202,6 @@ "preview": "Visualização", "project": "Projeto", "project_access": "Acesso ao projeto", - "project_membership": "Associação do projeto", - "project_name": "Nome do projeto", "project_retention_enable": "Ativar exclusão de projetos inativos", "publisher": "Editor", "publisher_class": "Classe de editor", @@ -252,8 +249,8 @@ "role_assigned": "Função atribuída", "role_created": "Função criada", "role_deleted": "Função excluída", - "role_membership": "Associação de papéis", "role_name": "Nome da função", + "role_updated": "Função atualizada", "roles": "Funções", "scope": "Escopo", "select_ecosystem": "Selecione Ecossistemas", @@ -385,7 +382,6 @@ "apply_vex": "Aplicar VEX", "apply_vex_tooltip": "Aplique análises de um documento Vulnerability Exploitability eXchange (VEX) a este projeto.", "approved": "Aprovado", - "assign": "Atribuir", "attributed_on": "Atribuído em", "audit_trail": "Trilha de auditoria", "audit_vulnerabilities": "Vulnerabilidades de auditoria", diff --git a/src/i18n/locales/ru.json b/src/i18n/locales/ru.json index 7645292f3..3d87a4c46 100644 --- a/src/i18n/locales/ru.json +++ b/src/i18n/locales/ru.json @@ -6,6 +6,7 @@ }, "admin": { "access_management": "Управление доступом", + "add_project": "Добавить проект", "alert_created": "Оповещение создано", "alert_deleted": "Оповещение удалено", "alert_log_successful_publish": "Успешная публикация журнала", @@ -41,7 +42,6 @@ "api_keys": "Ключи API", "api_token": "Токен API", "api_token_header": "Заголовок токена API", - "assign_role": "Назначить роль", "base_url": "Базовый URL", "bearer_token_auth_enable": "Аутентификация с помощью токена доступа", "bom_formats": "Форматы BOM", @@ -89,7 +89,6 @@ "disabled_for_tags": "Отключено для тегов", "distinguished_name": "Уникальное имя", "edit_api_key_comment": "Редактировать комментарий к ключу API", - "edit_role": "Редактировать роль", "email": "Электронная почта", "email_address": "Адрес электронной почты", "email_enable_ssltls": "Включить шифрование SSL/TLS", @@ -168,6 +167,7 @@ "metrics": "Метрики", "mime_type": "Тип MIME", "minutes": "Минуты", + "multiselect_remove_role": "Роли могут быть изменены только", "name_regex": "Регулярное выражение для имени компонента", "name_regex_desc": "Указывает регулярное выражение, которое определяет внутренние компоненты по их именам.", "namespace_regex": "Регулярное выражение для пространства имен компонента", @@ -176,7 +176,6 @@ "new_api_key": "Это недавно сгенерированный ключ API. \nОбратите внимание, что он будет отображаться только один раз и не может быть получено позже.", "new_api_key_title": "Новый ключ API", "nixpkgs": "Nixpkgs", - "no_unassigned_projects": "Никаких неназначенных проектов", "notification_level": "Уровень уведомления", "notifications": "Уведомления", "npm": "NPM", @@ -203,8 +202,6 @@ "preview": "Предпросмотр", "project": "Проект", "project_access": "Доступ к проекту", - "project_membership": "Членство в проекте", - "project_name": "Название проекта", "project_retention_enable": "Включить удаление неактивного проекта", "publisher": "Издатель", "publisher_class": "Класс издателя", @@ -252,8 +249,8 @@ "role_assigned": "Роль назначена", "role_created": "Роль создана", "role_deleted": "Роль удалена", - "role_membership": "Ролевое членство", "role_name": "Имя роли", + "role_updated": "Роль обновлена", "roles": "Роли", "scope": "Область", "select_ecosystem": "Выбрать экосистему", @@ -385,7 +382,6 @@ "apply_vex": "Применить VEX", "apply_vex_tooltip": "Применить анализ из документа Vulnerability Exploitability eXchange (VEX) к этому проекту.", "approved": "Одобрено", - "assign": "Назначить", "attributed_on": "Указано на", "audit_trail": "Журнал аудита", "audit_vulnerabilities": "Аудит уязвимостей", diff --git a/src/i18n/locales/uk-UA.json b/src/i18n/locales/uk-UA.json index 4f2c6be24..7780e2f5e 100644 --- a/src/i18n/locales/uk-UA.json +++ b/src/i18n/locales/uk-UA.json @@ -6,6 +6,7 @@ }, "admin": { "access_management": "Керування доступом", + "add_project": "Додайте проект", "alert_created": "Сповіщення створено", "alert_deleted": "Сповіщення видалено", "alert_log_successful_publish": "Журнал успішної публікації", @@ -41,7 +42,6 @@ "api_keys": "Ключі API", "api_token": "Маркер API", "api_token_header": "Заголовок маркера API", - "assign_role": "Призначити роль", "base_url": "Базовий URL", "bearer_token_auth_enable": "Автентифікуйте за допомогою особистого маркера доступу", "bom_formats": "Формати BOM", @@ -89,7 +89,6 @@ "disabled_for_tags": "Вимкнено для тегів", "distinguished_name": "Помітне ім'я", "edit_api_key_comment": "Редагувати коментар до ключа API", - "edit_role": "Редагувати роль", "email": "Електронна пошта", "email_address": "Адреса електронної пошти", "email_enable_ssltls": "Увімкніть шифрування SSL/TLS", @@ -168,6 +167,7 @@ "metrics": "Метрики", "mime_type": "Тип пантоміми", "minutes": "хвилин", + "multiselect_remove_role": "Ролі можна лише змінити", "name_regex": "Регулярний вираз імені компонента", "name_regex_desc": "Визначає регулярний вираз, який визначає внутрішні компоненти за назвою компонентів.", "namespace_regex": "Регулярний вираз простору імен компонентів", @@ -176,7 +176,6 @@ "new_api_key": "Це нещодавно створений ключ API. \nЗверніть увагу, що він відображатиметься лише один раз і не може бути отриманий пізніше.", "new_api_key_title": "Новий ключ API", "nixpkgs": "Nixpkgs", - "no_unassigned_projects": "Немає непризначені проекти", "notification_level": "Рівень сповіщення", "notifications": "Сповіщення", "npm": "НПМ", @@ -203,8 +202,6 @@ "preview": "Попередній перегляд", "project": "Демонструвати", "project_access": "Доступ до проекту", - "project_membership": "Членство проекту", - "project_name": "Назва проекту", "project_retention_enable": "Увімкнути видалення неактивного проекту", "publisher": "Видавець", "publisher_class": "Клас видавця", @@ -252,8 +249,8 @@ "role_assigned": "Роль призначена", "role_created": "Роль створено", "role_deleted": "Роль видалено", - "role_membership": "Рольове членство", "role_name": "Назва ролі", + "role_updated": "Роль оновлена", "roles": "Ролі", "scope": "Область застосування", "select_ecosystem": "Виберіть Екосистеми", @@ -385,7 +382,6 @@ "apply_vex": "Застосуйте VEX", "apply_vex_tooltip": "Застосуйте до цього проекту аналіз із документа Vulnerability Exploitability eXchange (VEX).", "approved": "Затверджено", - "assign": "Призначити", "attributed_on": "Приписується", "audit_trail": "Аудиторський слід", "audit_vulnerabilities": "Уразливості аудиту", diff --git a/src/i18n/locales/zh.json b/src/i18n/locales/zh.json index 8a7d79520..b28202506 100644 --- a/src/i18n/locales/zh.json +++ b/src/i18n/locales/zh.json @@ -6,6 +6,7 @@ }, "admin": { "access_management": "用户和权限", + "add_project": "添加项目", "alert_created": "已创建告警", "alert_deleted": "已删除告警", "alert_log_successful_publish": "告警日志成功发送", @@ -41,7 +42,6 @@ "api_keys": "API 密钥", "api_token": "API 令牌", "api_token_header": "API Token Header", - "assign_role": "分配角色", "base_url": "基本 URL", "bearer_token_auth_enable": "使用个人访问令牌进行身份验证", "bom_formats": "BOM 格式", @@ -89,7 +89,6 @@ "disabled_for_tags": "禁用标签", "distinguished_name": "专有名称", "edit_api_key_comment": "修改 API Key 备注", - "edit_role": "编辑角色", "email": "电子邮件", "email_address": "电子邮件地址", "email_enable_ssltls": "启用 SSL/TLS 加密", @@ -168,6 +167,7 @@ "metrics": "指标", "mime_type": "Mime 类型", "minutes": "分钟", + "multiselect_remove_role": "角色只能更改", "name_regex": "组件名称正则表达式", "name_regex_desc": "指定一个正则表达式,通过组件名称来识别内部组件。", "namespace_regex": "组件命名空间正则表达式", @@ -176,7 +176,6 @@ "new_api_key": "这是新生成的API密钥。\n请注意,它将仅显示一次,并且以后不能检索。", "new_api_key_title": "新的API密钥", "nixpkgs": "Nixpkgs", - "no_unassigned_projects": "没有未分配的项目", "notification_level": "通知级别", "notifications": "通知", "npm": "NPM", @@ -203,8 +202,6 @@ "preview": "预览", "project": "项目", "project_access": "项目访问", - "project_membership": "项目会员资格", - "project_name": "项目名称", "project_retention_enable": "启用非活动项目删除", "publisher": "发行商", "publisher_class": "发行商分类", @@ -252,8 +249,8 @@ "role_assigned": "角色分配", "role_created": "角色已创建", "role_deleted": "角色已删除", - "role_membership": "角色会员资格", "role_name": "角色名称", + "role_updated": "角色更新", "roles": "角色", "scope": "范围", "select_ecosystem": "选择生态系统", @@ -385,7 +382,6 @@ "apply_vex": "应用VEX", "apply_vex_tooltip": "将漏洞可利用性交换 (VEX) 文档的分析应用于该项目。", "approved": "批准", - "assign": "分配", "attributed_on": "归因于", "audit_trail": "审计追踪", "audit_vulnerabilities": "审计漏洞", diff --git a/src/mixins/userManagementMixin.js b/src/mixins/userManagementMixin.js index 23e7e9f03..68ca2f035 100644 --- a/src/mixins/userManagementMixin.js +++ b/src/mixins/userManagementMixin.js @@ -1,5 +1,11 @@ import EventBus from '../shared/eventbus'; +/** + * A Vue.js mixin for managing user-related operations such as roles, permissions, and team memberships. + * Provides utility methods for interacting with APIs and handling user management tasks. + * + * @mixin + */ export default { created: function () { this._userManagementMixin_init(); @@ -10,128 +16,161 @@ export default { }; }, methods: { - loadUserRoles: function (username) { - this._userManagementMixin_checkReady(); - let url = `${this.$api.BASE_URL}/${this.$api.URL_ROLE}/${username}/roles`; - this.axios - .get(url) - .then((response) => { - this.projectRoles = response.data; - }) - .catch((error) => { - console.error('Error loading user roles:', error); - this.projectRoles = []; - }); + // -- public methods -- + + // Loads the user roles for a specific user. return data if targetField is null + loadUserProjects: async function (username) { + const endpoint = `${this.$api.BASE_URL}/${this.$api.URL_ROLE}/${username}/roles`; + try { + const response = await this.axios.get(endpoint); + return response.data; + } catch (error) { + console.error(error); + } + }, + + // Loads the user roles for a specific user. return data if targetField is null + loadAvailableProjectRoles: async function () { + const endpoint = `${this.$api.BASE_URL}/${this.$api.URL_ROLE}`; + try { + const response = await this.axios.get(endpoint); + return response.data; + } catch (error) { + console.error(error); + } }, // TODO: internal server error 500 - _deleteUser: function (endpoint) { + _deleteUser: async function (endpoint) { this._userManagementMixin_checkReady(); - - this.axios - .delete(endpoint, { + try { + await this.axios.delete(endpoint, { data: { - username: this.row[this.identifierField], + // e.g { username: 'testuser' } + [this._identifierField]: this.row[this._identifierField], }, - }) - .then(this._successfulResponseDelete) - .catch(() => { - this.$toastr.w(this.$t('condition.unsuccessful_action')); }); + this._successfulResponse_delete(); + } catch (error) { + this.handleError(error); + } }, - _updateTeamSelection: function (endpoint, selections) { + _updateTeamSelection: async function (selections) { + const endpoint = `${this.$api.BASE_URL}/${this.$api.URL_USER_MEMBERSHIP}`; this._userManagementMixin_checkReady(); const requestBody = { - [this.identifierField]: this.row[this.identifierField], + [this._identifierField]: this.row[this._identifierField], teams: selections.map((team) => team.uuid), }; - this.axios - .put(endpoint, requestBody) - .then(this._successfulResponseUpdate) - .catch((error) => { - if (error.response && error.response.status === 304) return; - this.$toastr.w(this.$t('condition.unsuccessful_action')); - }); - }, - - _removeTeamMembership: function (endpoint, teamUUID) { - this._userManagementMixin_checkReady(); - this.axios - .delete(endpoint, { data: { uuid: teamUUID } }) - .then(this._successfulResponseUpdate) - .catch(() => { - this.$toastr.w(this.$t('condition.unsuccessful_action')); - }); + try { + const response = await this.axios.put(endpoint, requestBody); + this._successfulResponse_update(response); + } catch (error) { + if (error.response?.status === 304) return; + this.handleError(error); + } }, - _updateRoleSelection: function (endpoint, selection) { - this._userManagementMixin_checkReady(); - this.axios - .post(endpoint, { - roleUUID: selection.role, - projectUUID: selection.project, - }) - .then(this._successfulResponseUpdate) - .catch(() => { - this.$toastr.w(this.$t('condition.unsuccessful_action')); - }); - }, + _removeTeamMembership: async function (teamUUID) { + const username = this.row[this._identifierField]; + const endpoint = `${this.$api.BASE_URL}/${this.$api.URL_USER}/${username}/membership`; - _removeRole: function (projectRole) { this._userManagementMixin_checkReady(); - // const username = this[this.getUserObjectKey()].username; - const username = this.row[this.identifierField]; - const url = `${this.$api.BASE_URL}/${this.$api.URL_USER}/${username}/role`; - - this.axios - .delete(url, { - data: { - roleUUID: projectRole.role.uuid, - projectUUID: projectRole.project.uuid, - }, - }) - .then(this._successfulResponseUpdate) - .catch(() => { - this.$toastr.w(this.$t('condition.unsuccessful_action')); + try { + const response = await this.axios.delete(endpoint, { + data: { uuid: teamUUID }, }); + this._successfulResponse_update(response); + } catch (error) { + this.handleError(error); + } }, - _updatePermissionSelection: async function (endpoint, selections) { + // Updates the permissions for a user. (essentially adds/removes the user from the permission) + _updatePermissionSelection: async function (selections) { + const endpoint = `${this.$api.BASE_URL}/${this.$api.URL_USER_PERMISSION}`; this._userManagementMixin_checkReady(); const requestBody = { - [this.identifierField]: this.row[this.identifierField], + [this._identifierField]: this.row[this._identifierField], permissions: selections.map((selection) => selection.name), }; - return this.axios - .put(endpoint, requestBody) - .then(this._successfulResponseUpdate) - .catch(() => { - this.$toastr.w(this.$t('condition.unsuccessful_action')); - }); + try { + const response = await this.axios.put(endpoint, requestBody); + this._successfulResponse_update(response); + } catch (error) { + this.handleError(error); + } }, + // Removes a user from a permission. (essentially removes the user from the permission) _removePermission: async function (permission) { this._userManagementMixin_checkReady(); - const username = this.row[this.identifierField]; + const username = this.row[this._identifierField]; const url = `${this.$api.BASE_URL}/${this.$api.URL_PERMISSION}/${permission.name}/user/${username}`; - return this.axios - .delete(url) - .then(this._successfulResponseUpdate) - .catch(() => { - this.$toastr.w(this.$t('condition.unsuccessful_action')); - }); + try { + const response = await this.axios.delete(url); + this._successfulResponse_update(response); + } catch (error) { + this.handleError(error); + } + }, + + _handleProjectRole: async function (action, projectRole, callbacks = null) { + this._userManagementMixin_checkReady(); + + const endpoint = `${this.$api.BASE_URL}/${this.$api.URL_USER_ROLE}`; + const requestBody = { + [this._identifierField]: this.row[this._identifierField], + roleUUID: projectRole.role, + projectUUID: projectRole.project, + }; + + try { + let response; + let successMessage; + switch (action) { + case 'add': + case 'update': + response = await this.axios.put(endpoint, requestBody); + successMessage = + action === 'add' + ? this.$t('admin.role_assigned') + : this.$t('admin.role_updated'); + break; + case 'remove': + response = await this.axios.delete(endpoint, { data: requestBody }); + successMessage = this.$t('admin.role_deleted'); + break; + default: + throw new Error(`Invalid action: ${action}`); + } + + this.$toastr.s(successMessage); + callbacks?.success?.(response); + } catch (error) { + this.handleError(error); + callbacks?.error?.(error); + } }, // -- utility methods -- - _successfulResponseUpdate: function (response) { + + handleError: function ( + error, + toastMessageKey = 'condition.unsuccessful_action', + ) { + console.error(error); + this.$toastr.w(this.$t(toastMessageKey)); + }, + _successfulResponse_update: function (response) { if (this.rowEvents && this.rowEvents.update) EventBus.$emit(this.rowEvents.update, this.index, response.data); this.$toastr.s(this.$t('message.updated')); }, - _successfulResponseDelete: function () { + _successfulResponse_delete: function () { if (this.rowEvents && this.rowEvents.delete) EventBus.$emit(this.rowEvents.delete, this.index); this.$toastr.s(this.$t('admin.user_deleted')); @@ -144,15 +183,19 @@ export default { }, _userManagementMixin_init: function () { - if (this.index == null || this.row == null) { - throw new Error( - "userManagementMixin requires 'index' and 'row' variables, which are typically provided by a detailFormatter function.", - ); + if (!this._identifierField) { + this._identifierField = 'username'; + } + + if (this.umm_bypassInit === true) { + console.warn('userManagementMixin: bypassing init check'); + this._userManagementMixin_ready = true; + return; } - if (this.identifierField == null) { + if (this.index == null || this.row == null) { throw new Error( - "userManagementMixin requires 'identifierField' variable.", + "userManagementMixin requires 'index' and 'row' variables, which are typically provided by a detailFormatter function.", ); } diff --git a/src/shared/api.json b/src/shared/api.json index 706f585a3..061cf7aec 100644 --- a/src/shared/api.json +++ b/src/shared/api.json @@ -48,13 +48,15 @@ "URL_SERVICE": "api/v1/service", "URL_TAG": "api/v1/tag", "URL_TEAM": "api/v1/team", + "URL_TEAM_PERMISSION": "api/v1/permission/team", "URL_USER": "api/v1/user", - "URL_USER_MEMBERSHIP": "api/v1/user/membership", - "URL_USER_PERMISSION": "api/v1/permission/user", "URL_USER_LDAP": "api/v1/user/ldap", "URL_USER_MANAGED": "api/v1/user/managed", + "URL_USER_MEMBERSHIP": "api/v1/user/membership", "URL_USER_OIDC": "api/v1/user/oidc", "URL_USER_OIDC_LOGIN": "api/v1/user/oidc/login", + "URL_USER_PERMISSION": "api/v1/permission/user", + "URL_USER_ROLE": "api/v1/user/role", "URL_USER_SELF": "api/v1/user/self", "URL_VEX": "api/v1/vex", "URL_VULNERABILITY": "api/v1/vulnerability", diff --git a/src/views/administration/accessmanagement/CreateRoleModal.vue b/src/views/administration/accessmanagement/CreateRoleModal.vue index 3e48cc37e..99e02be4f 100644 --- a/src/views/administration/accessmanagement/CreateRoleModal.vue +++ b/src/views/administration/accessmanagement/CreateRoleModal.vue @@ -81,12 +81,15 @@ export default { permissions: this.permissions.map((permission) => permission.name), }; this.axios - .put(url, requestBody) - .then((response) => { + .put(url, { + name: this.name, + permissions: this.permissions.map((perm) => perm.name), + }) + .then(() => { this.$emit('refreshTable'); this.$toastr.s(this.$t('admin.role_created')); }) - .catch((error) => { + .catch(() => { this.$toastr.w(this.$t('condition.unsuccessful_action')); }); this.$root.$emit('bv::hide::modal', 'createRoleModal'); diff --git a/src/views/administration/accessmanagement/LdapUsers/UserDetails.vue b/src/views/administration/accessmanagement/LdapUsers/UserDetails.vue index 1fefe3ad5..34914b967 100644 --- a/src/views/administration/accessmanagement/LdapUsers/UserDetails.vue +++ b/src/views/administration/accessmanagement/LdapUsers/UserDetails.vue @@ -1,89 +1,89 @@ + diff --git a/src/views/administration/accessmanagement/LdapUsers/index.vue b/src/views/administration/accessmanagement/LdapUsers/index.vue index 91b268a70..76f31d5e6 100644 --- a/src/views/administration/accessmanagement/LdapUsers/index.vue +++ b/src/views/administration/accessmanagement/LdapUsers/index.vue @@ -32,6 +32,7 @@ import EventBus from '../../../../shared/eventbus'; import UserDetails from './UserDetails.vue'; export default { + name: 'LdapUsersView', props: { header: String, }, @@ -41,10 +42,10 @@ export default { }, mounted() { EventBus.$on(this.rowEvents.update, (index, row) => { - this.$refs.table.updateRow({ index: index, row: row }); + this.$refs.table.updateRow({ index, row }); this.$refs.table.expandRow(index); }); - EventBus.$on(this.rowEvents.delete, (index, row) => { + EventBus.$on(this.rowEvents.delete, () => { this.refreshTable(); }); }, @@ -63,7 +64,7 @@ export default { title: this.$t('message.username'), field: 'username', sortable: false, - formatter(value, row, index) { + formatter(value) { return xssFilters.inHTMLData(common.valueWithDefault(value, '')); }, }, @@ -71,7 +72,7 @@ export default { title: this.$t('admin.distinguished_name'), field: 'dn', sortable: false, - formatter(value, row, index) { + formatter(value) { return xssFilters.inHTMLData(common.valueWithDefault(value, '')); }, }, @@ -79,7 +80,7 @@ export default { title: this.$t('admin.teams'), field: 'teams', sortable: false, - formatter(value, row, index) { + formatter(value) { return value ? xssFilters.inHTMLData( common.valueWithDefault(value.length, '0'), diff --git a/src/views/administration/accessmanagement/ManagedUsers/UserDetails.vue b/src/views/administration/accessmanagement/ManagedUsers/UserDetails.vue index 88c6402fe..11cf6684a 100644 --- a/src/views/administration/accessmanagement/ManagedUsers/UserDetails.vue +++ b/src/views/administration/accessmanagement/ManagedUsers/UserDetails.vue @@ -1,129 +1,131 @@ diff --git a/src/views/administration/accessmanagement/ManagedUsers/index.vue b/src/views/administration/accessmanagement/ManagedUsers/index.vue index 2d8beface..b28d1c9f4 100644 --- a/src/views/administration/accessmanagement/ManagedUsers/index.vue +++ b/src/views/administration/accessmanagement/ManagedUsers/index.vue @@ -31,6 +31,7 @@ import UserDetails from './UserDetails.vue'; import CreateManagedUserModal from '../CreateManagedUserModal.vue'; export default { + name: 'ManagedUsersView', props: { header: String, }, @@ -40,10 +41,7 @@ export default { }, mounted() { EventBus.$on(this.rowEvents.update, (index, row) => { - this.$refs.table.updateRow({ - index: index, - row: row, - }); + this.$refs.table.updateRow({ index, row }); this.$refs.table.expandRow(index); }); EventBus.$on(this.rowEvents.delete, () => { diff --git a/src/views/administration/accessmanagement/OidcUsers/UserDetails.vue b/src/views/administration/accessmanagement/OidcUsers/UserDetails.vue index 83cc94dcf..4a48f334e 100644 --- a/src/views/administration/accessmanagement/OidcUsers/UserDetails.vue +++ b/src/views/administration/accessmanagement/OidcUsers/UserDetails.vue @@ -1,69 +1,70 @@ diff --git a/src/views/administration/accessmanagement/OidcUsers/index.vue b/src/views/administration/accessmanagement/OidcUsers/index.vue index 9e6712f82..804c4a867 100644 --- a/src/views/administration/accessmanagement/OidcUsers/index.vue +++ b/src/views/administration/accessmanagement/OidcUsers/index.vue @@ -32,6 +32,7 @@ import UserDetails from './UserDetails.vue'; import i18n from '../../../../i18n'; export default { + name: 'OidcUsersView', i18n, props: { header: String, @@ -76,14 +77,6 @@ export default { return xssFilters.inHTMLData(common.valueWithDefault(value, '')); }, }, - { - title: this.$t('admin.subject_identifier'), - field: 'subjectIdentifier', - sortable: false, - formatter(value) { - return xssFilters.inHTMLData(common.valueWithDefault(value, '')); - }, - }, { title: this.$t('admin.teams'), field: 'teams', diff --git a/src/views/administration/accessmanagement/ProjectRoleListGroupItem.vue b/src/views/administration/accessmanagement/ProjectRoleListGroupItem.vue deleted file mode 100644 index bd0bc3143..000000000 --- a/src/views/administration/accessmanagement/ProjectRoleListGroupItem.vue +++ /dev/null @@ -1,73 +0,0 @@ - - - - - diff --git a/src/views/administration/accessmanagement/Roles.vue b/src/views/administration/accessmanagement/Roles.vue deleted file mode 100644 index 2f8c1b329..000000000 --- a/src/views/administration/accessmanagement/Roles.vue +++ /dev/null @@ -1,277 +0,0 @@ - - - diff --git a/src/views/administration/accessmanagement/Roles/RoleDetails.vue b/src/views/administration/accessmanagement/Roles/RoleDetails.vue new file mode 100644 index 000000000..d8b6ee030 --- /dev/null +++ b/src/views/administration/accessmanagement/Roles/RoleDetails.vue @@ -0,0 +1,147 @@ + + diff --git a/src/views/administration/accessmanagement/Roles/index.vue b/src/views/administration/accessmanagement/Roles/index.vue new file mode 100644 index 000000000..0e273ba21 --- /dev/null +++ b/src/views/administration/accessmanagement/Roles/index.vue @@ -0,0 +1,161 @@ + + + diff --git a/src/views/administration/accessmanagement/SelectPermissionModal.vue b/src/views/administration/accessmanagement/SelectPermissionModal.vue index 53204fff2..54e57fb87 100644 --- a/src/views/administration/accessmanagement/SelectPermissionModal.vue +++ b/src/views/administration/accessmanagement/SelectPermissionModal.vue @@ -122,9 +122,8 @@ export default { }, methods: { handleSelection: function () { - const cs = this.currentSelection; this.$root.$emit('bv::hide::modal', this.$children[0].id); - this.$emit('selection', cs); + this.$emit('selection', this.currentSelection); }, updateCurrentSelection() { this.currentSelection = this.$refs.table.getSelections(); diff --git a/src/views/administration/accessmanagement/SelectRoleModal.vue b/src/views/administration/accessmanagement/SelectRoleModal.vue deleted file mode 100644 index 749f653af..000000000 --- a/src/views/administration/accessmanagement/SelectRoleModal.vue +++ /dev/null @@ -1,151 +0,0 @@ - - - diff --git a/src/views/administration/accessmanagement/Teams/TeamDetails.vue b/src/views/administration/accessmanagement/Teams/TeamDetails.vue new file mode 100644 index 000000000..625ed8103 --- /dev/null +++ b/src/views/administration/accessmanagement/Teams/TeamDetails.vue @@ -0,0 +1,496 @@ + + + diff --git a/src/views/administration/accessmanagement/Teams/index.vue b/src/views/administration/accessmanagement/Teams/index.vue index cf3c3b395..79bfd794b 100644 --- a/src/views/administration/accessmanagement/Teams/index.vue +++ b/src/views/administration/accessmanagement/Teams/index.vue @@ -24,9 +24,10 @@ import common from '../../../../shared/common'; import CreateTeamModal from '../CreateTeamModal'; import bootstrapTableMixin from '../../../../mixins/bootstrapTableMixin'; import EventBus from '../../../../shared/eventbus'; -import UserDetail from './UserDetails.vue'; +import TeamDetails from './TeamDetails.vue'; export default { + name: 'TeamsView', props: { header: String, }, @@ -58,7 +59,7 @@ export default { title: this.$t('admin.team_name'), field: 'name', sortable: false, - formatter(value, row, index) { + formatter(value) { return xssFilters.inHTMLData(common.valueWithDefault(value, '')); }, }, @@ -66,7 +67,7 @@ export default { title: this.$t('admin.api_keys'), field: 'apiKeys', sortable: false, - formatter(value, row, index) { + formatter(value) { return value ? xssFilters.inHTMLData( common.valueWithDefault(value.length, '0'), @@ -78,7 +79,7 @@ export default { title: this.$t('admin.members'), field: 'members', sortable: false, - formatter(value, row, _index) { + formatter(value, row) { let count = 0; if (row.managedUsers) { count += row.managedUsers.length; @@ -113,7 +114,7 @@ export default { detailFormatter: (index, row) => { return this.vueFormatter({ render: () => ( - + ), }); }, diff --git a/src/views/components/UserRolesTable.vue b/src/views/components/UserRolesTable.vue new file mode 100644 index 000000000..77c5fcc63 --- /dev/null +++ b/src/views/components/UserRolesTable.vue @@ -0,0 +1,318 @@ + + + + + + diff --git a/src/views/portfolio/projects/SelectProjectModal.vue b/src/views/portfolio/projects/SelectProjectModal.vue index 5aa8ae143..61d52e038 100644 --- a/src/views/portfolio/projects/SelectProjectModal.vue +++ b/src/views/portfolio/projects/SelectProjectModal.vue @@ -18,12 +18,9 @@ {{ $t('message.cancel') }} - {{ $t('message.select') }} + {{ + $t('message.select') + }} @@ -35,15 +32,25 @@ import common from '../../../shared/common'; export default { mixins: [permissionsMixin], + props: { + // Current projects should be a list of UUIDs since names can be duplicate + username: { type: String, default: null }, + }, methods: { apiUrl: function () { - let url = `${this.$api.BASE_URL}/${this.$api.URL_PROJECT}`; + let endpoint = ''; + if (this.username) { + endpoint = `${this.$api.BASE_URL}/${this.$api.URL_ACL_USER}/${this.username}`; + return endpoint; + } + + endpoint = `${this.$api.BASE_URL}/${this.$api.URL_PROJECT}`; if (this.showInactiveProjects === undefined) { - url += '?excludeInactive=true'; + endpoint += '?excludeInactive=true'; } else { - url += '?excludeInactive=' + !this.showInactiveProjects; + endpoint += '?excludeInactive=' + !this.showInactiveProjects; } - return url; + return endpoint; }, refreshTable: function () { this.$refs.table.refresh({ @@ -52,6 +59,10 @@ export default { silent: true, }); }, + handleSelection: function () { + this.$root.$emit('bv::hide::modal', this.$children[0].id); + this.$emit('selection', this.$refs.table.getSelections()); + }, }, watch: { showInactiveProjects() { @@ -75,7 +86,7 @@ export default { title: this.$t('message.project_name'), field: 'name', sortable: true, - formatter(value, row, index) { + formatter(value) { return xssFilters.inHTMLData(common.valueWithDefault(value, '')); }, }, @@ -83,14 +94,14 @@ export default { title: this.$t('message.version'), field: 'version', sortable: true, - formatter(value, row, index) { + formatter(value) { return xssFilters.inHTMLData(common.valueWithDefault(value, '')); }, }, { title: this.$t('message.active'), field: 'active', - formatter(value, row, index) { + formatter(value) { return value === true ? '' : ''; }, align: 'center', @@ -113,7 +124,8 @@ export default { refresh: 'fa-refresh', }, toolbar: '#projectsToolbar', - responseHandler: function (res, xhr) { + responseHandler: (res, xhr) => { + // console.log(this.currentProjects); res.total = xhr.getResponseHeader('X-Total-Count'); return res; }, From d9c3c89074cc7a0f55fa6fa2fc07d59d779496a5 Mon Sep 17 00:00:00 2001 From: Emmanuel Meremikwu Date: Tue, 20 May 2025 13:36:02 -0500 Subject: [PATCH 19/25] refactor: fix sync issues when toggling a team detail Signed-off-by: Emmanuel Meremikwu --- .../accessmanagement/ApiKeyListGroupItem.vue | 8 +- .../accessmanagement/SelectLdapGroupModal.vue | 2 +- .../accessmanagement/SelectOidcGroupModal.vue | 2 +- .../accessmanagement/Teams/TeamDetails.vue | 782 +++++++++--------- 4 files changed, 405 insertions(+), 389 deletions(-) diff --git a/src/views/administration/accessmanagement/ApiKeyListGroupItem.vue b/src/views/administration/accessmanagement/ApiKeyListGroupItem.vue index 44f120b41..d1db8a683 100644 --- a/src/views/administration/accessmanagement/ApiKeyListGroupItem.vue +++ b/src/views/administration/accessmanagement/ApiKeyListGroupItem.vue @@ -1,7 +1,7 @@