`${record.owner}/${record.name}`} size="middle" bordered pagination={paginationProps}
title={() => (
{i18next.t("general:Groups")}
diff --git a/web/src/GroupTreePage.js b/web/src/GroupTreePage.js
index 2b4c205b..912211a5 100644
--- a/web/src/GroupTreePage.js
+++ b/web/src/GroupTreePage.js
@@ -27,11 +27,12 @@ class GroupTreePage extends React.Component {
super(props);
this.state = {
classes: props,
+ owner: Setting.isAdminUser(this.props.account) ? "" : this.props.account.owner,
organizationName: props.organizationName !== undefined ? props.organizationName : props.match.params.organizationName,
groupName: this.props.match?.params.groupName,
- groupId: "",
+ groupId: undefined,
treeData: [],
- selectedKeys: [],
+ selectedKeys: [this.props.match?.params.groupName],
};
}
@@ -52,9 +53,9 @@ class GroupTreePage extends React.Component {
getTreeData() {
GroupBackend.getGroups(this.state.organizationName, true).then((res) => {
if (res.status === "ok") {
- const tree = res.data;
this.setState({
- treeData: tree,
+ treeData: res.data,
+ groupId: this.findNodeId({children: res.data}, this.state.groupName),
});
} else {
Setting.showMessage("error", res.msg);
@@ -62,6 +63,21 @@ class GroupTreePage extends React.Component {
});
}
+ findNodeId(node, targetName) {
+ if (node.key === targetName) {
+ return node.id;
+ }
+ if (node.children) {
+ for (let i = 0; i < node.children.length; i++) {
+ const result = this.findNodeId(node.children[i], targetName);
+ if (result) {
+ return result;
+ }
+ }
+ }
+ return null;
+ }
+
setTreeTitle(treeData) {
const haveChildren = Array.isArray(treeData.children) && treeData.children.length > 0;
const isSelected = this.state.groupName === treeData.key;
@@ -121,6 +137,7 @@ class GroupTreePage extends React.Component {
this.props.history.push(`/groups/${this.state.organizationName}/${treeData.key}`);
}}
/>
+ {!haveChildren &&
+ }
)}
,
@@ -185,7 +203,7 @@ class GroupTreePage extends React.Component {
groupName: info.node.key,
groupId: info.node.id,
});
- this.props.history.push(`/group-tree/${this.state.organizationName}/${info.node.key}`);
+ this.props.history.push(`/trees/${this.state.organizationName}/${info.node.key}`);
};
const onExpand = (expandedKeysValue) => {
this.setState({
@@ -203,6 +221,7 @@ class GroupTreePage extends React.Component {
blockNode={true}
defaultSelectedKeys={[this.state.groupName]}
defaultExpandAll={true}
+ selectedKeys={this.state.selectedKeys}
expandedKeys={this.state.expandedKeys}
onSelect={onSelect}
onExpand={onExpand}
@@ -213,16 +232,20 @@ class GroupTreePage extends React.Component {
}
renderOrganizationSelect() {
- return {
- this.setState({
- organizationName: value,
- });
- this.props.history.push(`/group-tree/${value}`);
- }}
- />;
+ if (Setting.isAdminUser(this.props.account)) {
+ return (
+ {
+ this.setState({
+ organizationName: value,
+ });
+ this.props.history.push(`/trees/${value}`);
+ }}
+ />
+ );
+ }
}
newGroup(isRoot) {
@@ -234,7 +257,7 @@ class GroupTreePage extends React.Component {
updatedTime: moment().format(),
displayName: `New Group - ${randomName}`,
type: "Virtual",
- parentGroupId: isRoot ? this.state.organizationName : this.state.groupId,
+ parentId: isRoot ? this.state.organizationName : this.state.groupId,
isTopGroup: isRoot,
isEnabled: true,
};
@@ -267,25 +290,25 @@ class GroupTreePage extends React.Component {
-
+
{this.renderOrganizationSelect()}
-
-
diff --git a/web/src/OrganizationEditPage.js b/web/src/OrganizationEditPage.js
index ca5dfd78..1122c90c 100644
--- a/web/src/OrganizationEditPage.js
+++ b/web/src/OrganizationEditPage.js
@@ -49,15 +49,20 @@ class OrganizationEditPage extends React.Component {
getOrganization() {
OrganizationBackend.getOrganization("admin", this.state.organizationName)
- .then((organization) => {
- if (organization === null) {
- this.props.history.push("/404");
- return;
- }
+ .then((res) => {
+ if (res.status === "ok") {
+ const organization = res.data;
+ if (organization === null) {
+ this.props.history.push("/404");
+ return;
+ }
- this.setState({
- organization: organization,
- });
+ this.setState({
+ organization: organization,
+ });
+ } else {
+ Setting.showMessage("error", res.msg);
+ }
});
}
diff --git a/web/src/OrganizationListPage.js b/web/src/OrganizationListPage.js
index 2439a4e2..e5ab7dc3 100644
--- a/web/src/OrganizationListPage.js
+++ b/web/src/OrganizationListPage.js
@@ -228,7 +228,7 @@ class OrganizationListPage extends BaseListPage {
render: (text, record, index) => {
return (
-
this.props.history.push(`/group-tree/${record.name}`)}>{i18next.t("general:Groups")}
+
this.props.history.push(`/trees/${record.name}`)}>{i18next.t("general:Groups")}
this.props.history.push(`/organizations/${record.name}/users`)}>{i18next.t("general:Users")}
this.props.history.push(`/organizations/${record.name}`)}>{i18next.t("general:Edit")}
(
{i18next.t("general:Organizations")}
- {i18next.t("general:Add")}
+ {i18next.t("general:Add")}
)}
loading={this.state.loading}
diff --git a/web/src/UserListPage.js b/web/src/UserListPage.js
index 7c8a16a9..ef710ff6 100644
--- a/web/src/UserListPage.js
+++ b/web/src/UserListPage.js
@@ -14,7 +14,7 @@
import React from "react";
import {Link} from "react-router-dom";
-import {Button, Switch, Table, Upload} from "antd";
+import {Button, Space, Switch, Table, Upload} from "antd";
import {UploadOutlined} from "@ant-design/icons";
import moment from "moment";
import * as OrganizationBackend from "./backend/OrganizationBackend";
@@ -75,7 +75,7 @@ class UserListPage extends BaseListPage {
phone: Setting.getRandomNumber(),
countryCode: this.state.organization.countryCodes?.length > 0 ? this.state.organization.countryCodes[0] : "",
address: [],
- groups: this.props.groupId !== undefined ? [this.props.groupId] : [],
+ groups: this.props.groupId ? [this.props.groupId] : [],
affiliation: "Example Inc.",
tag: "staff",
region: "",
@@ -124,6 +124,26 @@ class UserListPage extends BaseListPage {
});
}
+ removeUserFromGroup(i) {
+ const user = this.state.data[i];
+ const group = this.props.groupId;
+ UserBackend.removeUserFromGroup({groupId: group, owner: user.owner, name: user.name})
+ .then((res) => {
+ if (res.status === "ok") {
+ Setting.showMessage("success", i18next.t("general:Successfully removed"));
+ this.setState({
+ data: Setting.deleteRow(this.state.data, i),
+ pagination: {total: this.state.pagination.total - 1},
+ });
+ } else {
+ Setting.showMessage("error", `${i18next.t("general:Failed to remove")}: ${res.msg}`);
+ }
+ })
+ .catch(error => {
+ Setting.showMessage("error", `${i18next.t("general:Failed to connect to server")}: ${error}`);
+ });
+ }
+
uploadFile(info) {
const {status, response: res} = info.file;
if (status === "done") {
@@ -142,10 +162,14 @@ class UserListPage extends BaseListPage {
getOrganization(organizationName) {
OrganizationBackend.getOrganization("admin", organizationName)
- .then((organization) => {
- this.setState({
- organization: organization,
- });
+ .then((res) => {
+ if (res.status === "ok") {
+ this.setState({
+ organization: res.data,
+ });
+ } else {
+ Setting.showMessage("error", `Failed to get organization: ${res.msg}`);
+ }
});
}
@@ -372,20 +396,30 @@ class UserListPage extends BaseListPage {
width: "190px",
fixed: (Setting.isMobile()) ? "false" : "right",
render: (text, record, index) => {
+ const isTreePage = this.props.groupId !== undefined;
const disabled = (record.owner === this.props.account.owner && record.name === this.props.account.name) || (record.owner === "built-in" && record.name === "admin");
return (
-
-
{
+
+ {
sessionStorage.setItem("userListUrl", window.location.pathname);
this.props.history.push(`/users/${record.owner}/${record.name}`);
- }}>{i18next.t("general:Edit")}
+ }}>{i18next.t("general:Edit")}
+
+ {isTreePage ?
+
this.removeUserFromGroup(index)}
+ disabled={disabled}
+ size="small"
+ /> : null}
this.deleteUser(index)}
disabled={disabled}
- >
-
-
+ size={isTreePage ? "small" : "default"}
+ />
+
);
},
},
diff --git a/web/src/backend/UserBackend.js b/web/src/backend/UserBackend.js
index e4743ea3..c5d935a1 100644
--- a/web/src/backend/UserBackend.js
+++ b/web/src/backend/UserBackend.js
@@ -222,3 +222,18 @@ export function checkUserPassword(values) {
body: JSON.stringify(values),
}).then(res => res.json());
}
+
+export function removeUserFromGroup({owner, name, groupId}) {
+ const formData = new FormData();
+ formData.append("owner", owner);
+ formData.append("name", name);
+ formData.append("groupId", groupId);
+ return fetch(`${Setting.ServerUrl}/api/remove-user-from-group`, {
+ method: "POST",
+ credentials: "include",
+ body: formData,
+ headers: {
+ "Accept-Language": Setting.getAcceptLanguage(),
+ },
+ }).then(res => res.json());
+}
diff --git a/web/src/common/modal/PopconfirmModal.js b/web/src/common/modal/PopconfirmModal.js
index 126b5d80..5c9b1f9f 100644
--- a/web/src/common/modal/PopconfirmModal.js
+++ b/web/src/common/modal/PopconfirmModal.js
@@ -17,6 +17,8 @@ import i18next from "i18next";
import React from "react";
export const PopconfirmModal = (props) => {
+ const text = props.text ? props.text : i18next.t("general:Delete");
+ const size = props.size ? props.size : "middle";
return (
{
okText={i18next.t("general:OK")}
cancelText={i18next.t("general:Cancel")}
>
- {i18next.t("general:Delete")}
+ {text}
);
};
diff --git a/web/src/locales/de/data.json b/web/src/locales/de/data.json
index cf445b2f..c4c31147 100644
--- a/web/src/locales/de/data.json
+++ b/web/src/locales/de/data.json
@@ -188,6 +188,7 @@
"Close": "Schließen",
"Confirm": "Confirm",
"Created time": "Erstellte Zeit",
+ "Custom": "Custom",
"Default application": "Standard Anwendung",
"Default application - Tooltip": "Standard-Anwendung für Benutzer, die direkt von der Organisationsseite registriert wurden",
"Default avatar": "Standard-Avatar",
@@ -209,6 +210,7 @@
"Failed to delete": "Konnte nicht gelöscht werden",
"Failed to enable": "Failed to enable",
"Failed to get answer": "Failed to get answer",
+ "Failed to remove": "Failed to remove",
"Failed to save": "Konnte nicht gespeichert werden",
"Failed to verify": "Failed to verify",
"Favicon": "Favicon",
@@ -301,10 +303,12 @@
"Subscriptions": "Abonnements",
"Successfully added": "Erfolgreich hinzugefügt",
"Successfully deleted": "Erfolgreich gelöscht",
+ "Successfully removed": "Successfully removed",
"Successfully saved": "Erfolgreich gespeichert",
"Supported country codes": "Unterstützte Ländercodes",
"Supported country codes - Tooltip": "Ländercodes, die von der Organisation unterstützt werden. Diese Codes können als Präfix ausgewählt werden, wenn SMS-Verifizierungscodes gesendet werden",
"Sure to delete": "Sicher zu löschen",
+ "Sure to remove": "Sure to remove",
"Swagger": "Swagger",
"Sync": "Synchronisieren",
"Syncers": "Syncers",
@@ -329,6 +333,7 @@
"Webhooks": "Webhooks",
"You can only select one physical group": "You can only select one physical group",
"empty": "leere",
+ "remove": "remove",
"{total} in total": "Insgesamt {total}"
},
"group": {
@@ -337,6 +342,7 @@
"Parent group": "Parent group",
"Parent group - Tooltip": "Parent group - Tooltip",
"Physical": "Physical",
+ "Show all": "Show all",
"Virtual": "Virtual"
},
"ldap": {
diff --git a/web/src/locales/en/data.json b/web/src/locales/en/data.json
index 0cd7d768..093be9c4 100644
--- a/web/src/locales/en/data.json
+++ b/web/src/locales/en/data.json
@@ -188,6 +188,7 @@
"Close": "Close",
"Confirm": "Confirm",
"Created time": "Created time",
+ "Custom": "Custom",
"Default application": "Default application",
"Default application - Tooltip": "Default application for users registered directly from the organization page",
"Default avatar": "Default avatar",
@@ -209,6 +210,7 @@
"Failed to delete": "Failed to delete",
"Failed to enable": "Failed to enable",
"Failed to get answer": "Failed to get answer",
+ "Failed to remove": "Failed to remove",
"Failed to save": "Failed to save",
"Failed to verify": "Failed to verify",
"Favicon": "Favicon",
@@ -301,10 +303,12 @@
"Subscriptions": "Subscriptions",
"Successfully added": "Successfully added",
"Successfully deleted": "Successfully deleted",
+ "Successfully removed": "Successfully removed",
"Successfully saved": "Successfully saved",
"Supported country codes": "Supported country codes",
"Supported country codes - Tooltip": "Country codes supported by the organization. These codes can be selected as a prefix when sending SMS verification codes",
"Sure to delete": "Sure to delete",
+ "Sure to remove": "Sure to remove",
"Swagger": "Swagger",
"Sync": "Sync",
"Syncers": "Syncers",
@@ -329,6 +333,7 @@
"Webhooks": "Webhooks",
"You can only select one physical group": "You can only select one physical group",
"empty": "empty",
+ "remove": "remove",
"{total} in total": "{total} in total"
},
"group": {
@@ -337,6 +342,7 @@
"Parent group": "Parent group",
"Parent group - Tooltip": "Parent group - Tooltip",
"Physical": "Physical",
+ "Show all": "Show all",
"Virtual": "Virtual"
},
"ldap": {
diff --git a/web/src/locales/es/data.json b/web/src/locales/es/data.json
index 1d55b873..e01e0d7d 100644
--- a/web/src/locales/es/data.json
+++ b/web/src/locales/es/data.json
@@ -188,6 +188,7 @@
"Close": "Cerca",
"Confirm": "Confirm",
"Created time": "Tiempo creado",
+ "Custom": "Custom",
"Default application": "Aplicación predeterminada",
"Default application - Tooltip": "Aplicación predeterminada para usuarios registrados directamente desde la página de la organización",
"Default avatar": "Avatar predeterminado",
@@ -209,6 +210,7 @@
"Failed to delete": "No se pudo eliminar",
"Failed to enable": "Failed to enable",
"Failed to get answer": "Failed to get answer",
+ "Failed to remove": "Failed to remove",
"Failed to save": "No se pudo guardar",
"Failed to verify": "Failed to verify",
"Favicon": "Favicon",
@@ -301,10 +303,12 @@
"Subscriptions": "Suscripciones",
"Successfully added": "Éxito al agregar",
"Successfully deleted": "Éxito en la eliminación",
+ "Successfully removed": "Successfully removed",
"Successfully saved": "Guardado exitosamente",
"Supported country codes": "Códigos de país admitidos",
"Supported country codes - Tooltip": "Códigos de país compatibles con la organización. Estos códigos se pueden seleccionar como prefijo al enviar códigos de verificación SMS",
"Sure to delete": "Seguro que eliminar",
+ "Sure to remove": "Sure to remove",
"Swagger": "Swagger",
"Sync": "Sincronización",
"Syncers": "Sincronizadores",
@@ -329,6 +333,7 @@
"Webhooks": "Webhooks",
"You can only select one physical group": "You can only select one physical group",
"empty": "vacío",
+ "remove": "remove",
"{total} in total": "{total} en total"
},
"group": {
@@ -337,6 +342,7 @@
"Parent group": "Parent group",
"Parent group - Tooltip": "Parent group - Tooltip",
"Physical": "Physical",
+ "Show all": "Show all",
"Virtual": "Virtual"
},
"ldap": {
diff --git a/web/src/locales/fr/data.json b/web/src/locales/fr/data.json
index 9c389579..4d4e5c5f 100644
--- a/web/src/locales/fr/data.json
+++ b/web/src/locales/fr/data.json
@@ -188,6 +188,7 @@
"Close": "Fermer",
"Confirm": "Confirm",
"Created time": "Temps créé",
+ "Custom": "Custom",
"Default application": "Application par défaut",
"Default application - Tooltip": "Application par défaut pour les utilisateurs enregistrés directement depuis la page de l'organisation",
"Default avatar": "Avatar par défaut",
@@ -209,6 +210,7 @@
"Failed to delete": "Échec de la suppression",
"Failed to enable": "Failed to enable",
"Failed to get answer": "Failed to get answer",
+ "Failed to remove": "Failed to remove",
"Failed to save": "Échec de sauvegarde",
"Failed to verify": "Failed to verify",
"Favicon": "Favicon",
@@ -301,10 +303,12 @@
"Subscriptions": "Abonnements",
"Successfully added": "Ajouté avec succès",
"Successfully deleted": "Supprimé avec succès",
+ "Successfully removed": "Successfully removed",
"Successfully saved": "Succès enregistré",
"Supported country codes": "Codes de pays pris en charge",
"Supported country codes - Tooltip": "Codes de pays pris en charge par l'organisation. Ces codes peuvent être sélectionnés comme préfixe lors de l'envoi de codes de vérification SMS",
"Sure to delete": "Sûr de supprimer",
+ "Sure to remove": "Sure to remove",
"Swagger": "Swagger",
"Sync": "Synchronisation",
"Syncers": "Synchroniseurs",
@@ -329,6 +333,7 @@
"Webhooks": "Webhooks",
"You can only select one physical group": "You can only select one physical group",
"empty": "vide",
+ "remove": "remove",
"{total} in total": "{total} au total"
},
"group": {
@@ -337,6 +342,7 @@
"Parent group": "Parent group",
"Parent group - Tooltip": "Parent group - Tooltip",
"Physical": "Physical",
+ "Show all": "Show all",
"Virtual": "Virtual"
},
"ldap": {
diff --git a/web/src/locales/id/data.json b/web/src/locales/id/data.json
index 6a9d6f19..da624d11 100644
--- a/web/src/locales/id/data.json
+++ b/web/src/locales/id/data.json
@@ -188,6 +188,7 @@
"Close": "Tutup",
"Confirm": "Confirm",
"Created time": "Waktu dibuat",
+ "Custom": "Custom",
"Default application": "Aplikasi default",
"Default application - Tooltip": "Aplikasi default untuk pengguna yang terdaftar langsung dari halaman organisasi",
"Default avatar": "Avatar default",
@@ -209,6 +210,7 @@
"Failed to delete": "Gagal menghapus",
"Failed to enable": "Failed to enable",
"Failed to get answer": "Failed to get answer",
+ "Failed to remove": "Failed to remove",
"Failed to save": "Gagal menyimpan",
"Failed to verify": "Failed to verify",
"Favicon": "Favicon",
@@ -301,10 +303,12 @@
"Subscriptions": "Langganan",
"Successfully added": "Berhasil ditambahkan",
"Successfully deleted": "Berhasil dihapus",
+ "Successfully removed": "Successfully removed",
"Successfully saved": "Berhasil disimpan",
"Supported country codes": "Kode negara yang didukung",
"Supported country codes - Tooltip": "Kode negara yang didukung oleh organisasi. Kode-kode ini dapat dipilih sebagai awalan saat mengirim kode verifikasi SMS",
"Sure to delete": "Pasti untuk menghapus",
+ "Sure to remove": "Sure to remove",
"Swagger": "Swagger",
"Sync": "Sinkronisasi",
"Syncers": "Sinkronisasi",
@@ -329,6 +333,7 @@
"Webhooks": "Webhooks",
"You can only select one physical group": "You can only select one physical group",
"empty": "kosong",
+ "remove": "remove",
"{total} in total": "{total} secara keseluruhan"
},
"group": {
@@ -337,6 +342,7 @@
"Parent group": "Parent group",
"Parent group - Tooltip": "Parent group - Tooltip",
"Physical": "Physical",
+ "Show all": "Show all",
"Virtual": "Virtual"
},
"ldap": {
diff --git a/web/src/locales/ja/data.json b/web/src/locales/ja/data.json
index 1386ac84..27eda2e7 100644
--- a/web/src/locales/ja/data.json
+++ b/web/src/locales/ja/data.json
@@ -188,6 +188,7 @@
"Close": "閉じる",
"Confirm": "Confirm",
"Created time": "作成された時間",
+ "Custom": "Custom",
"Default application": "デフォルトアプリケーション",
"Default application - Tooltip": "組織ページから直接登録されたユーザーのデフォルトアプリケーション",
"Default avatar": "デフォルトのアバター",
@@ -209,6 +210,7 @@
"Failed to delete": "削除に失敗しました",
"Failed to enable": "Failed to enable",
"Failed to get answer": "Failed to get answer",
+ "Failed to remove": "Failed to remove",
"Failed to save": "保存に失敗しました",
"Failed to verify": "Failed to verify",
"Favicon": "ファビコン",
@@ -301,10 +303,12 @@
"Subscriptions": "サブスクリプション",
"Successfully added": "正常に追加されました",
"Successfully deleted": "正常に削除されました",
+ "Successfully removed": "Successfully removed",
"Successfully saved": "成功的に保存されました",
"Supported country codes": "サポートされている国コード",
"Supported country codes - Tooltip": "組織でサポートされている国コード。これらのコードは、SMS認証コードのプレフィックスとして選択できます",
"Sure to delete": "削除することが確実です",
+ "Sure to remove": "Sure to remove",
"Swagger": "Swagger",
"Sync": "同期",
"Syncers": "シンカーズ",
@@ -329,6 +333,7 @@
"Webhooks": "Webhooks",
"You can only select one physical group": "You can only select one physical group",
"empty": "空",
+ "remove": "remove",
"{total} in total": "総計{total}"
},
"group": {
@@ -337,6 +342,7 @@
"Parent group": "Parent group",
"Parent group - Tooltip": "Parent group - Tooltip",
"Physical": "Physical",
+ "Show all": "Show all",
"Virtual": "Virtual"
},
"ldap": {
diff --git a/web/src/locales/ko/data.json b/web/src/locales/ko/data.json
index bddc926c..96d84d58 100644
--- a/web/src/locales/ko/data.json
+++ b/web/src/locales/ko/data.json
@@ -188,6 +188,7 @@
"Close": "닫다",
"Confirm": "Confirm",
"Created time": "작성한 시간",
+ "Custom": "Custom",
"Default application": "기본 애플리케이션",
"Default application - Tooltip": "조직 페이지에서 직접 등록한 사용자의 기본 응용 프로그램",
"Default avatar": "기본 아바타",
@@ -209,6 +210,7 @@
"Failed to delete": "삭제에 실패했습니다",
"Failed to enable": "Failed to enable",
"Failed to get answer": "Failed to get answer",
+ "Failed to remove": "Failed to remove",
"Failed to save": "저장에 실패했습니다",
"Failed to verify": "Failed to verify",
"Favicon": "파비콘",
@@ -301,10 +303,12 @@
"Subscriptions": "구독",
"Successfully added": "성공적으로 추가되었습니다",
"Successfully deleted": "성공적으로 삭제되었습니다",
+ "Successfully removed": "Successfully removed",
"Successfully saved": "성공적으로 저장되었습니다",
"Supported country codes": "지원되는 국가 코드들",
"Supported country codes - Tooltip": "조직에서 지원하는 국가 코드입니다. 이 코드들은 SMS 인증 코드를 보낼 때 접두사로 선택할 수 있습니다",
"Sure to delete": "삭제하시겠습니까?",
+ "Sure to remove": "Sure to remove",
"Swagger": "Swagger",
"Sync": "싱크",
"Syncers": "싱크어스",
@@ -329,6 +333,7 @@
"Webhooks": "Webhooks",
"You can only select one physical group": "You can only select one physical group",
"empty": "빈",
+ "remove": "remove",
"{total} in total": "총 {total}개"
},
"group": {
@@ -337,6 +342,7 @@
"Parent group": "Parent group",
"Parent group - Tooltip": "Parent group - Tooltip",
"Physical": "Physical",
+ "Show all": "Show all",
"Virtual": "Virtual"
},
"ldap": {
diff --git a/web/src/locales/pt/data.json b/web/src/locales/pt/data.json
index 0e548b44..84721f9e 100644
--- a/web/src/locales/pt/data.json
+++ b/web/src/locales/pt/data.json
@@ -188,6 +188,7 @@
"Close": "Fechar",
"Confirm": "Confirm",
"Created time": "Hora de Criação",
+ "Custom": "Custom",
"Default application": "Aplicação padrão",
"Default application - Tooltip": "Aplicação padrão para usuários registrados diretamente na página da organização",
"Default avatar": "Avatar padrão",
@@ -209,6 +210,7 @@
"Failed to delete": "Falha ao excluir",
"Failed to enable": "Falha ao habilitar",
"Failed to get answer": "Falha ao obter resposta",
+ "Failed to remove": "Failed to remove",
"Failed to save": "Falha ao salvar",
"Failed to verify": "Falha ao verificar",
"Favicon": "Favicon",
@@ -301,10 +303,12 @@
"Subscriptions": "Đăng ký",
"Successfully added": "Adicionado com sucesso",
"Successfully deleted": "Excluído com sucesso",
+ "Successfully removed": "Successfully removed",
"Successfully saved": "Salvo com sucesso",
"Supported country codes": "Códigos de país suportados",
"Supported country codes - Tooltip": "Códigos de país suportados pela organização. Esses códigos podem ser selecionados como prefixo ao enviar códigos de verificação SMS",
"Sure to delete": "Tem certeza que deseja excluir",
+ "Sure to remove": "Sure to remove",
"Swagger": "Swagger",
"Sync": "Sincronizar",
"Syncers": "Sincronizadores",
@@ -329,6 +333,7 @@
"Webhooks": "Webhooks",
"You can only select one physical group": "You can only select one physical group",
"empty": "vazio",
+ "remove": "remove",
"{total} in total": "{total} no total"
},
"group": {
@@ -337,6 +342,7 @@
"Parent group": "Parent group",
"Parent group - Tooltip": "Parent group - Tooltip",
"Physical": "Physical",
+ "Show all": "Show all",
"Virtual": "Virtual"
},
"ldap": {
diff --git a/web/src/locales/ru/data.json b/web/src/locales/ru/data.json
index 591b97e0..e5d35eaa 100644
--- a/web/src/locales/ru/data.json
+++ b/web/src/locales/ru/data.json
@@ -188,6 +188,7 @@
"Close": "Близко",
"Confirm": "Confirm",
"Created time": "Созданное время",
+ "Custom": "Custom",
"Default application": "Приложение по умолчанию",
"Default application - Tooltip": "По умолчанию приложение для пользователей, зарегистрированных непосредственно со страницы организации",
"Default avatar": "Стандартный аватар",
@@ -209,6 +210,7 @@
"Failed to delete": "Не удалось удалить",
"Failed to enable": "Failed to enable",
"Failed to get answer": "Failed to get answer",
+ "Failed to remove": "Failed to remove",
"Failed to save": "Не удалось сохранить",
"Failed to verify": "Failed to verify",
"Favicon": "Фавикон",
@@ -301,10 +303,12 @@
"Subscriptions": "Подписки",
"Successfully added": "Успешно добавлено",
"Successfully deleted": "Успешно удалено",
+ "Successfully removed": "Successfully removed",
"Successfully saved": "Успешно сохранено",
"Supported country codes": "Поддерживаемые коды стран",
"Supported country codes - Tooltip": "Коды стран, поддерживаемые организацией. Эти коды могут быть выбраны в качестве префикса при отправке SMS-кодов подтверждения",
"Sure to delete": "Обязательное удаление",
+ "Sure to remove": "Sure to remove",
"Swagger": "Swagger",
"Sync": "Синхронизация",
"Syncers": "Синкеры",
@@ -329,6 +333,7 @@
"Webhooks": "Webhooks",
"You can only select one physical group": "You can only select one physical group",
"empty": "пустые",
+ "remove": "remove",
"{total} in total": "{total} в общей сложности"
},
"group": {
@@ -337,6 +342,7 @@
"Parent group": "Parent group",
"Parent group - Tooltip": "Parent group - Tooltip",
"Physical": "Physical",
+ "Show all": "Show all",
"Virtual": "Virtual"
},
"ldap": {
diff --git a/web/src/locales/vi/data.json b/web/src/locales/vi/data.json
index 64fb0c24..4124c096 100644
--- a/web/src/locales/vi/data.json
+++ b/web/src/locales/vi/data.json
@@ -188,6 +188,7 @@
"Close": "Đóng lại",
"Confirm": "Confirm",
"Created time": "Thời gian tạo",
+ "Custom": "Custom",
"Default application": "Ứng dụng mặc định",
"Default application - Tooltip": "Ứng dụng mặc định cho người dùng đăng ký trực tiếp từ trang tổ chức",
"Default avatar": "Hình đại diện mặc định",
@@ -209,6 +210,7 @@
"Failed to delete": "Không thể xoá",
"Failed to enable": "Failed to enable",
"Failed to get answer": "Failed to get answer",
+ "Failed to remove": "Failed to remove",
"Failed to save": "Không thể lưu được",
"Failed to verify": "Failed to verify",
"Favicon": "Favicon",
@@ -301,10 +303,12 @@
"Subscriptions": "Đăng ký",
"Successfully added": "Đã thêm thành công",
"Successfully deleted": "Đã xóa thành công",
+ "Successfully removed": "Successfully removed",
"Successfully saved": "Thành công đã được lưu lại",
"Supported country codes": "Các mã quốc gia được hỗ trợ",
"Supported country codes - Tooltip": "Mã quốc gia được hỗ trợ bởi tổ chức. Những mã này có thể được chọn làm tiền tố khi gửi mã xác nhận SMS",
"Sure to delete": "Chắc chắn muốn xóa",
+ "Sure to remove": "Sure to remove",
"Swagger": "Swagger",
"Sync": "Đồng bộ hoá",
"Syncers": "Đồng bộ hóa",
@@ -329,6 +333,7 @@
"Webhooks": "Webhooks",
"You can only select one physical group": "You can only select one physical group",
"empty": "trống",
+ "remove": "remove",
"{total} in total": "Trong tổng số {total}"
},
"group": {
@@ -337,6 +342,7 @@
"Parent group": "Parent group",
"Parent group - Tooltip": "Parent group - Tooltip",
"Physical": "Physical",
+ "Show all": "Show all",
"Virtual": "Virtual"
},
"ldap": {
diff --git a/web/src/locales/zh/data.json b/web/src/locales/zh/data.json
index ebeaa106..a612d201 100644
--- a/web/src/locales/zh/data.json
+++ b/web/src/locales/zh/data.json
@@ -188,6 +188,7 @@
"Close": "关闭",
"Confirm": "确认",
"Created time": "创建时间",
+ "Custom": "自定义",
"Default application": "默认应用",
"Default application - Tooltip": "直接从组织页面注册的用户默认所属的应用",
"Default avatar": "默认头像",
@@ -209,6 +210,7 @@
"Failed to delete": "删除失败",
"Failed to enable": "启用失败",
"Failed to get answer": "获取回答失败",
+ "Failed to remove": "移除失败",
"Failed to save": "保存失败",
"Failed to verify": "验证失败",
"Favicon": "Favicon",
@@ -301,10 +303,12 @@
"Subscriptions": "订阅",
"Successfully added": "添加成功",
"Successfully deleted": "删除成功",
+ "Successfully removed": "移除成功",
"Successfully saved": "保存成功",
"Supported country codes": "支持的国家代码",
"Supported country codes - Tooltip": "该组织所支持的国家代码,发送短信验证码时可以选择这些国家的代码前缀",
"Sure to delete": "确定删除",
+ "Sure to remove": "确定移除",
"Swagger": "API文档",
"Sync": "同步",
"Syncers": "同步器",
@@ -329,6 +333,7 @@
"Webhooks": "Webhooks",
"You can only select one physical group": "只能选择一个实体组",
"empty": "无",
+ "remove": "移除",
"{total} in total": "{total} 总计"
},
"group": {
@@ -337,6 +342,7 @@
"Parent group": "上级组",
"Parent group - Tooltip": "上级组",
"Physical": "物理组",
+ "Show all": "显示全部",
"Virtual": "虚拟组"
},
"ldap": {