This is an automated email from the ASF dual-hosted git repository.

RosiKyu pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/main by this push:
     new 6358dc3bd08 ui: link account to LDAP - #13950 (#13950)
6358dc3bd08 is described below

commit 6358dc3bd08d0a5bac8a5ffa2caf2af37e4cf4f0
Author: dahn <[email protected]>
AuthorDate: Thu Nov 12 08:03:28 2026 +0100

    ui: link account to LDAP - #13950 (#13950)
---
 .../api/command/LinkAccountToLdapCmd.java          |  4 +-
 .../api/command/LinkAccountToLdapCmdTest.java      |  8 ++++
 ui/public/locales/ar.json                          |  3 ++
 ui/public/locales/ca.json                          |  3 ++
 ui/public/locales/de_DE.json                       |  3 ++
 ui/public/locales/el_GR.json                       |  3 ++
 ui/public/locales/en.json                          |  3 ++
 ui/public/locales/es.json                          |  3 ++
 ui/public/locales/fr_FR.json                       |  3 ++
 ui/public/locales/hi.json                          |  2 +
 ui/public/locales/hu.json                          |  3 ++
 ui/public/locales/it_IT.json                       |  3 ++
 ui/public/locales/ja_JP.json                       |  3 ++
 ui/public/locales/ko_KR.json                       |  3 ++
 ui/public/locales/nb_NO.json                       |  3 ++
 ui/public/locales/nl_NL.json                       |  3 ++
 ui/public/locales/pl.json                          |  3 ++
 ui/public/locales/pt_BR.json                       |  3 ++
 ui/public/locales/ru_RU.json                       |  3 ++
 ui/public/locales/te.json                          |  3 ++
 ui/public/locales/zh_CN.json                       |  3 ++
 ui/src/config/section/account.js                   | 28 ++++++++++++++
 ui/src/config/section/domain.js                    |  5 ++-
 ui/src/views/AutogenView.vue                       |  7 ++--
 ui/src/views/iam/DomainActionForm.vue              | 10 +++--
 ui/tests/unit/views/AutogenView.spec.js            | 45 ++++++++++++++++++++++
 26 files changed, 154 insertions(+), 9 deletions(-)

diff --git 
a/plugins/user-authenticators/ldap/src/main/java/org/apache/cloudstack/api/command/LinkAccountToLdapCmd.java
 
b/plugins/user-authenticators/ldap/src/main/java/org/apache/cloudstack/api/command/LinkAccountToLdapCmd.java
index d3ab463cffb..dbf61c006eb 100644
--- 
a/plugins/user-authenticators/ldap/src/main/java/org/apache/cloudstack/api/command/LinkAccountToLdapCmd.java
+++ 
b/plugins/user-authenticators/ldap/src/main/java/org/apache/cloudstack/api/command/LinkAccountToLdapCmd.java
@@ -79,7 +79,7 @@ public class LinkAccountToLdapCmd extends BaseCmd {
             if (admin != null) {
                 LdapUser ldapUser = null;
                 try {
-                    ldapUser = _ldapManager.getUser(admin, type, ldapDomain, 
domainId);
+                    ldapUser = _ldapManager.getUser(admin, getType(), 
ldapDomain, domainId);
                 } catch (NoLdapUserMatchingQueryException e) {
                     logger.debug("no ldap user matching username {} in the 
given group/ou", admin, e);
                 }
@@ -120,7 +120,7 @@ public class LinkAccountToLdapCmd extends BaseCmd {
     }
 
     public String getType() {
-        return type;
+        return type == null ? LdapManager.LinkType.GROUP.name() : type;
     }
 
     public String getLdapDomain() {
diff --git 
a/plugins/user-authenticators/ldap/src/test/java/org/apache/cloudstack/api/command/LinkAccountToLdapCmdTest.java
 
b/plugins/user-authenticators/ldap/src/test/java/org/apache/cloudstack/api/command/LinkAccountToLdapCmdTest.java
index e616bd57378..5816da8f6c4 100644
--- 
a/plugins/user-authenticators/ldap/src/test/java/org/apache/cloudstack/api/command/LinkAccountToLdapCmdTest.java
+++ 
b/plugins/user-authenticators/ldap/src/test/java/org/apache/cloudstack/api/command/LinkAccountToLdapCmdTest.java
@@ -100,4 +100,12 @@ public class LinkAccountToLdapCmdTest implements 
LdapConfigurationChanger {
         assertEquals("accountId", String.valueOf(accountId), 
result.getAdminId());
         assertEquals("accountName", String.valueOf(accountName), 
result.getAccountName());
     }
+
+    @Test
+    public void getTypeDefaultsToGroup() throws Exception {
+        assertEquals("GROUP", linkAccountToLdapCmd.getType());
+
+        setHiddenField(linkAccountToLdapCmd, "type", "OU");
+        assertEquals("OU", linkAccountToLdapCmd.getType());
+    }
 }
diff --git a/ui/public/locales/ar.json b/ui/public/locales/ar.json
index e8e4db66cb5..1509eebd541 100644
--- a/ui/public/locales/ar.json
+++ b/ui/public/locales/ar.json
@@ -12,6 +12,8 @@
 "label.account.id": "Account ID",
 "label.account.name": "Account Name",
 "label.account.specific": "Account-Specific",
+"label.account.type.domain.admin": "مسؤول النطاق",
+"label.account.type.normal": "عادي (مستخدم)",
 "label.accounts": "Accounts",
 "label.accounttype": "Account Type",
 "label.acl.export": "Export ACL rules",
@@ -650,6 +652,7 @@
 "label.ldap.group.name": "LDAP Group",
 "label.level": "Level",
 "label.limitcpuuse": "CPU Cap",
+"label.link.account.to.ldap": "Link Account to LDAP",
 "label.link.domain.to.ldap": "Link Domain to LDAP",
 "label.linklocalip": "Control IP Address",
 "label.load.balancer": "Load Balancer",
diff --git a/ui/public/locales/ca.json b/ui/public/locales/ca.json
index d3e417eb821..9bb8d9ff0d0 100644
--- a/ui/public/locales/ca.json
+++ b/ui/public/locales/ca.json
@@ -12,6 +12,8 @@
 "label.account.id": "Account ID",
 "label.account.name": "Account Name",
 "label.account.specific": "Account-Specific",
+"label.account.type.domain.admin": "Administrador de domini",
+"label.account.type.normal": "Normal (Usuari)",
 "label.accounts": "Accounts",
 "label.accounttype": "Account Type",
 "label.acl.export": "Export ACL rules",
@@ -650,6 +652,7 @@
 "label.ldap.group.name": "LDAP Group",
 "label.level": "Level",
 "label.limitcpuuse": "CPU Cap",
+"label.link.account.to.ldap": "Link Account to LDAP",
 "label.link.domain.to.ldap": "Link Domain to LDAP",
 "label.linklocalip": "Control IP Address",
 "label.load.balancer": "Load Balancer",
diff --git a/ui/public/locales/de_DE.json b/ui/public/locales/de_DE.json
index 2fee9202163..fc026513563 100644
--- a/ui/public/locales/de_DE.json
+++ b/ui/public/locales/de_DE.json
@@ -24,6 +24,8 @@
 "label.account.id": "Benutzerkonto-ID",
 "label.account.name": "Benutzerkonto-Name",
 "label.account.specific": "Besonderheiten des Benutzerkontos",
+"label.account.type.domain.admin": "Domänen-Administrator",
+"label.account.type.normal": "Normal (Benutzer)",
 "label.accounts": "Benutzerkonten",
 "label.accounttype": "Benutzerkontotyp",
 "label.acl.export": "Export ACL rules",
@@ -836,6 +838,7 @@
 "label.limit": "Limit",
 "label.limitcpuuse": "CPU Obergrenze",
 "label.limits": "Limits konfigurieren",
+"label.link.account.to.ldap": "Verbinde Benutzerkonto mit LDAP",
 "label.link.domain.to.ldap": "Verbinde Domain mit LDAP",
 "label.linklocalip": "Link-Local IP-Adresse",
 "label.linux": "Linux",
diff --git a/ui/public/locales/el_GR.json b/ui/public/locales/el_GR.json
index c5506383752..ea86c1ad13a 100644
--- a/ui/public/locales/el_GR.json
+++ b/ui/public/locales/el_GR.json
@@ -39,6 +39,8 @@
 "label.account.id": "Αναγνωριστικό λογαριασμού",
 "label.account.name": "Όνομα λογαριασμού",
 "label.account.specific": "Ανά λογαριασμό",
+"label.account.type.domain.admin": "Διαχειριστής Τομέα",
+"label.account.type.normal": "Κανονικός (Χρήστης)",
 "label.accounts": "Λογαριασμοί",
 "label.accountstate": "Κατάσταση λογαριασμού",
 "label.accounttype": "Τύπος λογαριασμού",
@@ -1630,6 +1632,7 @@
 "label.limits": "Όρια",
 "label.limits.configure": "Ρύθμιση ορίων",
 "label.link": "Σύνδεσμος",
+"label.link.account.to.ldap": "Σύνδεση λογαριασμού με LDAP",
 "label.link.domain.to.ldap": "Σύνδεση τομέα με LDAP",
 "label.linklocalip": "Διεύθυνση IP Link-local/ελέγχου",
 "label.linux": "Linux",
diff --git a/ui/public/locales/en.json b/ui/public/locales/en.json
index d2ca3b7f536..ef1d5e5889f 100644
--- a/ui/public/locales/en.json
+++ b/ui/public/locales/en.json
@@ -40,6 +40,8 @@
 "label.account.id": "Account ID",
 "label.account.name": "Account name",
 "label.account.specific": "Account-specific",
+"label.account.type.domain.admin": "Domain Admin",
+"label.account.type.normal": "Normal (User)",
 "label.accounts": "Accounts",
 "label.accountstate": "Account state",
 "label.accounttype": "Account type",
@@ -1635,6 +1637,7 @@
 "label.limits": "Limits",
 "label.limits.configure": "Configure limits",
 "label.link": "Link",
+"label.link.account.to.ldap": "Link account to LDAP",
 "label.link.domain.to.ldap": "Link domain to LDAP",
 "label.linklocalip": "Link-local/Control IP address",
 "label.linux": "Linux",
diff --git a/ui/public/locales/es.json b/ui/public/locales/es.json
index b7a409adad1..33e34687351 100644
--- a/ui/public/locales/es.json
+++ b/ui/public/locales/es.json
@@ -12,6 +12,8 @@
 "label.account.id": "ID de la cuenta",
 "label.account.name": "Nombre de cuenta",
 "label.account.specific": "espec\u00edficas de la cuenta",
+"label.account.type.domain.admin": "Administrador de dominio",
+"label.account.type.normal": "Normal (Usuario)",
 "label.accounts": "Cuentas",
 "label.accounttype": "Tipo de Cuenta",
 "label.acl.export": "Export ACL rules",
@@ -667,6 +669,7 @@
 "label.ldap.group.name": "Grupo LDAP",
 "label.level": "Nivel",
 "label.limitcpuuse": "CPU Cap",
+"label.link.account.to.ldap": "Enlazar Cuenta a LDAP",
 "label.link.domain.to.ldap": "Enlazar Dominio a LDAP",
 "label.linklocalip": "Direcci\u00f3n IP de Enlace Local",
 "label.load.balancer": "Balanceador de carga",
diff --git a/ui/public/locales/fr_FR.json b/ui/public/locales/fr_FR.json
index 424f4749aa3..63fefbc049f 100644
--- a/ui/public/locales/fr_FR.json
+++ b/ui/public/locales/fr_FR.json
@@ -12,6 +12,8 @@
 "label.account.id": "ID de compte",
 "label.account.name": "Nom de compte",
 "label.account.specific": "Sp\u00e9cifique au compte",
+"label.account.type.domain.admin": "Administrateur de domaine",
+"label.account.type.normal": "Normal (Utilisateur)",
 "label.accounts": "Comptes",
 "label.accounttype": "Type Compte",
 "label.acl.export": "Export ACL rules",
@@ -650,6 +652,7 @@
 "label.ldap.group.name": "Groupe LDAP",
 "label.level": "Niveau",
 "label.limitcpuuse": "Limitation CPU",
+"label.link.account.to.ldap": "Lien Compte vers LDAP",
 "label.link.domain.to.ldap": "Lien Domaine vers LDAP",
 "label.linklocalip": "Adresse IP lien local",
 "label.load.balancer": "R\u00e9partiteur de charge",
diff --git a/ui/public/locales/hi.json b/ui/public/locales/hi.json
index 9d7440b9262..9a04301378a 100644
--- a/ui/public/locales/hi.json
+++ b/ui/public/locales/hi.json
@@ -3,6 +3,8 @@
 "label.access": "एक्सेस",
 "label.accesskey": "एक्सेस की",
 "label.account": "खाता",
+"label.account.type.domain.admin": "डोमेन व्यवस्थापक",
+"label.account.type.normal": "सामान्य (उपयोगकर्ता)",
 "label.accounts": "लेखा",
 "label.accounttype": "खाता प्रकार",
 "label.aclid": "ACL",
diff --git a/ui/public/locales/hu.json b/ui/public/locales/hu.json
index ae58379d343..c22d5c521e6 100644
--- a/ui/public/locales/hu.json
+++ b/ui/public/locales/hu.json
@@ -12,6 +12,8 @@
 "label.account.id": "Sz\u00e1mla azonos\u00edt\u00f3",
 "label.account.name": "Sz\u00e1mla n\u00e9v",
 "label.account.specific": "Sz\u00e1mla-specifikus",
+"label.account.type.domain.admin": "Tartomány rendszergazda",
+"label.account.type.normal": "Normál (Felhasználó)",
 "label.accounts": "Sz\u00e1ml\u00e1k",
 "label.accounttype": "Sz\u00e1mla t\u00edpus",
 "label.acl.export": "Export ACL rules",
@@ -650,6 +652,7 @@
 "label.ldap.group.name": "LDAP csoport",
 "label.level": "Szint",
 "label.limitcpuuse": "CPU Cap",
+"label.link.account.to.ldap": "Link Account to LDAP",
 "label.link.domain.to.ldap": "Link Domain to LDAP",
 "label.linklocalip": "Control IP Address",
 "label.load.balancer": "Terhel\u00e9seloszt\u00f3",
diff --git a/ui/public/locales/it_IT.json b/ui/public/locales/it_IT.json
index a2907b71f23..7bb3ed88ac3 100644
--- a/ui/public/locales/it_IT.json
+++ b/ui/public/locales/it_IT.json
@@ -12,6 +12,8 @@
 "label.account.id": "ID dell'Account",
 "label.account.name": "Nome Account",
 "label.account.specific": "Specifico dell'Account",
+"label.account.type.domain.admin": "Amministratore di dominio",
+"label.account.type.normal": "Normale (Utente)",
 "label.accounts": "Utenti",
 "label.accounttype": "Account Type",
 "label.acl.export": "Export ACL rules",
@@ -650,6 +652,7 @@
 "label.ldap.group.name": "LDAP Group",
 "label.level": "Livello",
 "label.limitcpuuse": "Limite CPU",
+"label.link.account.to.ldap": "Link Account to LDAP",
 "label.link.domain.to.ldap": "Link Domain to LDAP",
 "label.linklocalip": "Control IP Address",
 "label.load.balancer": "Load Balancer",
diff --git a/ui/public/locales/ja_JP.json b/ui/public/locales/ja_JP.json
index b7f32d7a2e1..3272c52d982 100644
--- a/ui/public/locales/ja_JP.json
+++ b/ui/public/locales/ja_JP.json
@@ -53,6 +53,8 @@
   "label.account.id": "アカウントID",
   "label.account.name": "アカウント名",
   "label.account.specific": "アカウント固有",
+  "label.account.type.domain.admin": "ドメイン管理者",
+  "label.account.type.normal": "通常 (ユーザー)",
   "label.accounts": "アカウント",
   "label.accounttype": "アカウントタイプ",
   "label.access.kubernetes.nodes": "Kubernetesノードに接続",
@@ -1316,6 +1318,7 @@
   "label.limit": "制限",
   "label.limitcpuuse": "CPUキャップ",
   "label.limits": "制限設定",
+  "label.link.account.to.ldap": "アカウントをLDAPにリンクする",
   "label.link.domain.to.ldap": "ドメインをLDAPにリンクする",
   "label.linklocalip": "リンクローカルIPアドレス",
   "label.linux": "Linux",
diff --git a/ui/public/locales/ko_KR.json b/ui/public/locales/ko_KR.json
index a951b859b48..fd1aeb13301 100644
--- a/ui/public/locales/ko_KR.json
+++ b/ui/public/locales/ko_KR.json
@@ -28,6 +28,8 @@
 "label.account.id": "\uacc4\uc815 ID",
 "label.account.name": "\uacc4\uc815 \uc774\ub984",
 "label.account.specific": "\uace0\uc720 \uacc4\uc815",
+"label.account.type.domain.admin": "도메인 관리자",
+"label.account.type.normal": "일반 (사용자)",
 "label.accounts": "\uacc4\uc815",
 "label.accounttype": "\uacc4\uc815 \uc720\ud615",
 "label.acl.export": "ACL \ub0b4\ubcf4\ub0b4\uae30",
@@ -868,6 +870,7 @@
 "label.limit": "\uc81c\ud55c",
 "label.limitcpuuse": "CPU \uc81c\ud55c",
 "label.limits": "\uc81c\ud55c \uad6c\uc131",
+"label.link.account.to.ldap": "LDAP에 계정 연결",
 "label.link.domain.to.ldap": "LDAP\uc5d0 \ub3c4\uba54\uc778 \uc5f0\uacb0",
 "label.linklocalip": "\ub85c\uceec \uc5f0\uacb0 IP \uc8fc\uc18c",
 "label.linux": "Linux",
diff --git a/ui/public/locales/nb_NO.json b/ui/public/locales/nb_NO.json
index 586d1fc5b25..d3828ed91a5 100644
--- a/ui/public/locales/nb_NO.json
+++ b/ui/public/locales/nb_NO.json
@@ -12,6 +12,8 @@
 "label.account.id": "Konto ID",
 "label.account.name": "Kontonavn",
 "label.account.specific": "Kontospesifikk",
+"label.account.type.domain.admin": "Domeneadministrator",
+"label.account.type.normal": "Normal (Bruker)",
 "label.accounts": "Kontoer",
 "label.accounttype": "Kontotype",
 "label.acl.export": "Export ACL rules",
@@ -650,6 +652,7 @@
 "label.ldap.group.name": "LDAP Gruppe",
 "label.level": "Niv\u00e5",
 "label.limitcpuuse": "CPU begrensning",
+"label.link.account.to.ldap": "Knytt konto til LDAP",
 "label.link.domain.to.ldap": "Knytt domene til LDAP",
 "label.linklocalip": "Link-lokal IP-adresse",
 "label.load.balancer": "Lastbalanserer",
diff --git a/ui/public/locales/nl_NL.json b/ui/public/locales/nl_NL.json
index 15b1bbb1394..758bdb2ee00 100644
--- a/ui/public/locales/nl_NL.json
+++ b/ui/public/locales/nl_NL.json
@@ -12,6 +12,8 @@
 "label.account.id": "Account ID",
 "label.account.name": "Account Naam",
 "label.account.specific": "Account-specifiek",
+"label.account.type.domain.admin": "Domeinbeheerder",
+"label.account.type.normal": "Normaal (Gebruiker)",
 "label.accounts": "Accounts",
 "label.accounttype": "Account type",
 "label.acl.export": "Export ACL rules",
@@ -651,6 +653,7 @@
 "label.ldap.group.name": "LDAP Groep",
 "label.level": "Level",
 "label.limitcpuuse": "CPU Cap",
+"label.link.account.to.ldap": "link account aan LDAP",
 "label.link.domain.to.ldap": "link domein aan LDAP",
 "label.linklocalip": "Control IP Adres",
 "label.load.balancer": "Load Balancer",
diff --git a/ui/public/locales/pl.json b/ui/public/locales/pl.json
index fbbbf612bc1..f089b6cd441 100644
--- a/ui/public/locales/pl.json
+++ b/ui/public/locales/pl.json
@@ -12,6 +12,8 @@
 "label.account.id": "ID konta",
 "label.account.name": "Nazwa konta",
 "label.account.specific": "Account-Specific",
+"label.account.type.domain.admin": "Administrator domeny",
+"label.account.type.normal": "Zwykły (Użytkownik)",
 "label.accounts": "Konta",
 "label.accounttype": "Account Type",
 "label.acl.export": "Export ACL rules",
@@ -650,6 +652,7 @@
 "label.ldap.group.name": "LDAP Group",
 "label.level": "Poziom",
 "label.limitcpuuse": "CPU Cap",
+"label.link.account.to.ldap": "Link Account to LDAP",
 "label.link.domain.to.ldap": "Link Domain to LDAP",
 "label.linklocalip": "Control IP Address",
 "label.load.balancer": "Load Balancer",
diff --git a/ui/public/locales/pt_BR.json b/ui/public/locales/pt_BR.json
index 1efd99f40d1..154c046099d 100644
--- a/ui/public/locales/pt_BR.json
+++ b/ui/public/locales/pt_BR.json
@@ -36,6 +36,8 @@
 "label.account.id": "ID da conta",
 "label.account.name": "Nome da conta",
 "label.account.specific": "Espec\u00edfico da conta",
+"label.account.type.domain.admin": "Administrador de domínio",
+"label.account.type.normal": "Normal (Usuário)",
 "label.accounts": "Contas",
 "label.accountstate": "Estado da conta",
 "label.accounttype": "Tipo de conta",
@@ -1388,6 +1390,7 @@
 "label.limits": "Configurar limites",
 "label.limits.configure": "Configurar limites",
 "label.link": "Link",
+"label.link.account.to.ldap": "Link conta para LDAP",
 "label.link.domain.to.ldap": "Link dom\u00ednio para LDAP",
 "label.linklocalip": "Endere\u00e7o IP do Control",
 "label.linux": "Linux",
diff --git a/ui/public/locales/ru_RU.json b/ui/public/locales/ru_RU.json
index 4fb3788bc51..0a7da67a902 100644
--- a/ui/public/locales/ru_RU.json
+++ b/ui/public/locales/ru_RU.json
@@ -12,6 +12,8 @@
 "label.account.id": "ID \u0443\u0447\u0451\u0442\u043d\u043e\u0439 
\u0437\u0430\u043f\u0438\u0441\u0438",
 "label.account.name": "\u0418\u043c\u044f 
\u0443\u0447\u0451\u0442\u043d\u043e\u0439 
\u0437\u0430\u043f\u0438\u0441\u0438",
 "label.account.specific": 
"\u0421\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430 
\u0430\u043a\u043a\u0430\u0443\u043d\u043d\u0442\u0430",
+"label.account.type.domain.admin": "Администратор домена",
+"label.account.type.normal": "Обычный (Пользователь)",
 "label.accounts": "\u0423\u0447\u0451\u0442\u043d\u044b\u0435 
\u0437\u0430\u043f\u0438\u0441\u0438",
 "label.accounttype": "Account Type",
 "label.acl.export": "Export ACL rules",
@@ -649,6 +651,7 @@
 "label.ldap.group.name": "LDAP Group",
 "label.level": "\u0423\u0440\u043e\u0432\u0435\u043d\u044c",
 "label.limitcpuuse": "CPU Cap",
+"label.link.account.to.ldap": "Link Account to LDAP",
 "label.link.domain.to.ldap": "Link Domain to LDAP",
 "label.linklocalip": "\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 
IP \u0430\u0434\u0440\u0435\u0441",
 "label.load.balancer": 
"\u0411\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a 
\u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438",
diff --git a/ui/public/locales/te.json b/ui/public/locales/te.json
index 0c332af53ae..e298a5352d1 100644
--- a/ui/public/locales/te.json
+++ b/ui/public/locales/te.json
@@ -37,6 +37,8 @@
   "label.account.id": "ఖాతా ID",
   "label.account.name": "ఖాతా పేరు",
   "label.account.specific": "ఖాతా-నిర్దిష్ట",
+  "label.account.type.domain.admin": "డొమైన్ నిర్వాహకుడు",
+  "label.account.type.normal": "సాధారణ (వినియోగదారు)",
   "label.accounts": "ఖాతాలు",
   "label.accountstate": "ఖాతా స్థితి",
   "label.accounttype": "ఖాతా రకం",
@@ -1327,6 +1329,7 @@
   "label.limits": "పరిమితులు",
   "label.limits.configure": "పరిమితులను కాన్ఫిగర్ చేయండి",
   "label.link": "లింక్",
+  "label.link.account.to.ldap": "ఖాతాను LDAPకి లింక్ చేయండి",
   "label.link.domain.to.ldap": "డొమైన్‌ను LDAPకి లింక్ చేయండి",
   "label.linklocalip": "లింక్-స్థానిక/నియంత్రణ IP చిరునామా",
   "label.linux": "Linux",
diff --git a/ui/public/locales/zh_CN.json b/ui/public/locales/zh_CN.json
index 9536bab7ee4..689b026cb42 100644
--- a/ui/public/locales/zh_CN.json
+++ b/ui/public/locales/zh_CN.json
@@ -61,6 +61,8 @@
   "label.account.id": "\u5E10\u6237\u6807\u8BC6\u7801",
   "label.account.name": "\u5E10\u6237\u540D\u79F0",
   "label.account.specific": "\u5E10\u6237\u4E13\u7528",
+  "label.account.type.domain.admin": "域管理员",
+  "label.account.type.normal": "普通(用户)",
   "label.accounts": "\u5E10\u6237",
   "label.accounttype": "\u5E10\u53F7\u7C7B\u578B",
 
@@ -1515,6 +1517,7 @@
   "label.limit": "\u9650\u5236",
   "label.limitcpuuse": "CPU \u4E0A\u9650",
   "label.limits": "\u914D\u7F6E\u9650\u5236",
+  "label.link.account.to.ldap": "帐户链接至 LDAP",
   "label.link.domain.to.ldap": "\u57DF\u94FE\u63A5\u81F3 LDAP",
   "label.linklocalip": "\u672C\u5730\u5730\u5740",
   "label.linux": "Linux",
diff --git a/ui/src/config/section/account.js b/ui/src/config/section/account.js
index 5766fd8a0f9..d04c683817e 100644
--- a/ui/src/config/section/account.js
+++ b/ui/src/config/section/account.js
@@ -121,6 +121,34 @@ export default {
       },
       component: shallowRef(defineAsyncComponent(() => 
import('@/views/iam/AddLdapAccount.vue')))
     },
+    {
+      api: 'linkAccountToLdap',
+      icon: 'LinkOutlined',
+      label: 'label.link.account.to.ldap',
+      docHelp: 
'adminguide/accounts.html#using-an-ldap-server-for-user-authentication',
+      dataView: true,
+      show: (record, store) => {
+        return store.isLdapEnabled
+      },
+      args: ['type', 'domainid', 'ldapdomain', 'account', 'accounttype', 
'roleid', 'admin'],
+      mapping: {
+        type: {
+          options: ['GROUP', 'OU']
+        },
+        accounttype: {
+          options: [
+            { id: '0', description: 'label.account.type.normal' },
+            { id: '2', description: 'label.account.type.domain.admin' }
+          ]
+        },
+        domainid: {
+          value: (record) => { return record.domainid }
+        },
+        account: {
+          value: (record) => { return record.name }
+        }
+      }
+    },
     {
       api: 'updateAccount',
       icon: 'edit-outlined',
diff --git a/ui/src/config/section/domain.js b/ui/src/config/section/domain.js
index 706cbf805cf..db1e72fac20 100644
--- a/ui/src/config/section/domain.js
+++ b/ui/src/config/section/domain.js
@@ -150,7 +150,10 @@ export default {
           options: ['GROUP', 'OU']
         },
         accounttype: {
-          options: ['0', '2']
+          options: [
+            { id: '0', description: 'label.account.type.normal' },
+            { id: '2', description: 'label.account.type.domain.admin' }
+          ]
         },
         domainid: {
           value: (record) => { return record.id }
diff --git a/ui/src/views/AutogenView.vue b/ui/src/views/AutogenView.vue
index 264ba0040af..889e9bdcaa4 100644
--- a/ui/src/views/AutogenView.vue
+++ b/ui/src/views/AutogenView.vue
@@ -339,9 +339,9 @@
                   <a-select-option
                     v-for="(opt, optIndex) in 
currentAction.mapping[field.name].options"
                     :key="optIndex"
-                    :label="opt"
+                    :label="opt.description ? $t(opt.description) : opt"
                   >
-                    {{ opt }}
+                    {{ opt.description ? $t(opt.description) : opt }}
                   </a-select-option>
                 </a-select>
                 <a-select
@@ -1886,7 +1886,8 @@ export default {
               break
             }
             if (action.mapping && key in action.mapping && 
action.mapping[key].options) {
-              params[key] = action.mapping[key].options[input]
+              const mappedOption = action.mapping[key].options[input]
+              params[key] = (mappedOption && typeof mappedOption === 'object') 
? mappedOption.id : mappedOption
               if (['createAffinityGroup'].includes(action.api) && key === 
'type') {
                 if (params[key] === 'host anti-affinity (Strict)') {
                   params[key] = 'host anti-affinity'
diff --git a/ui/src/views/iam/DomainActionForm.vue 
b/ui/src/views/iam/DomainActionForm.vue
index 8ee185f7e28..58b23252f66 100644
--- a/ui/src/views/iam/DomainActionForm.vue
+++ b/ui/src/views/iam/DomainActionForm.vue
@@ -67,8 +67,11 @@
                 :filterOption="(input, option) => {
                   return 
option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
                 }" >
-                <a-select-option v-for="(opt, optIndex) in 
action.mapping[field.name].options" :key="optIndex" :label="opt">
-                  {{ opt }}
+                <a-select-option
+                  v-for="(opt, optIndex) in action.mapping[field.name].options"
+                  :key="optIndex"
+                  :label="opt.description ? $t(opt.description) : opt">
+                  {{ opt.description ? $t(opt.description) : opt }}
                 </a-select-option>
               </a-select>
               <a-select
@@ -205,7 +208,8 @@ export default {
                 break
               }
               if (this.action.mapping && key in this.action.mapping && 
this.action.mapping[key].options) {
-                params[key] = this.action.mapping[key].options[input]
+                const mappedOption = this.action.mapping[key].options[input]
+                params[key] = (mappedOption && typeof mappedOption === 
'object') ? mappedOption.id : mappedOption
               } else if (param.type === 'uuid') {
                 params[key] = param.opts[input].id
               } else if (param.type === 'list') {
diff --git a/ui/tests/unit/views/AutogenView.spec.js 
b/ui/tests/unit/views/AutogenView.spec.js
index 3b06e2722e1..9375285ed37 100644
--- a/ui/tests/unit/views/AutogenView.spec.js
+++ b/ui/tests/unit/views/AutogenView.spec.js
@@ -2609,6 +2609,51 @@ describe('Views > AutogenView.vue', () => {
         done()
       })
 
+      it('API should be called with the option id when currentAction.mapping 
option is an {id, description} object', async (done) => {
+        originalFunc.handleResponse = wrapper.vm.handleResponse
+        originalFunc.shouldNavigateBack = wrapper.vm.shouldNavigateBack
+        originalFunc.fetchData = wrapper.vm.fetchData
+        wrapper.vm.handleResponse = jest.fn(async (json, resourceName, action) 
=> { return Promise.resolve() })
+        wrapper.vm.shouldNavigateBack = jest.fn((args) => { return false })
+        wrapper.vm.fetchData = jest.fn()
+        wrapper.vm.form = { column1: 1 }
+
+        const event = document.createEvent('Event')
+        await mockAxios.mockResolvedValue({})
+        await wrapper.setData({
+          showAction: true,
+          currentAction: {
+            api: 'testApiNameCase1',
+            label: 'label.name',
+            params: [{ name: 'column1', type: 'list' }],
+            paramFields: [{ name: 'column1', type: 'list' }],
+            mapping: {
+              column1: {
+                options: [
+                  { id: 'column-id-1', description: 'label.column.value.one' },
+                  { id: 'column-id-2', description: 'label.column.value.two' }
+                ]
+              }
+            }
+          },
+          resource: {}
+        })
+        await wrapper.vm.execSubmit(event)
+        await flushPromises()
+
+        expect(mockAxios).toHaveBeenCalled()
+        expect(mockAxios).toHaveBeenLastCalledWith({
+          url: '/',
+          method: 'POST',
+          data: common.createDataParams({
+            command: 'testApiNameCase1',
+            response: 'json',
+            column1: 'column-id-2'
+          })
+        })
+        done()
+      })
+
       it('API should be called when form has input key not exist in 
currentAction.mapping, type is list and currentAction.params[input] has id', 
async (done) => {
         originalFunc.handleResponse = wrapper.vm.handleResponse
         originalFunc.shouldNavigateBack = wrapper.vm.shouldNavigateBack

Reply via email to