feat: add verification list page and related API (#2822)

* feat: add verification list page and relevant api

* feat: improve code format

* fix: fix timestamp display error
This commit is contained in:
DacongDA 2024-03-19 19:10:52 +08:00 committed by GitHub
parent 44ae76503e
commit fc4fa2e8b6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
29 changed files with 538 additions and 30 deletions

View File

@ -20,6 +20,7 @@ import (
"fmt"
"strings"
"github.com/beego/beego/utils/pagination"
"github.com/casdoor/casdoor/captcha"
"github.com/casdoor/casdoor/form"
"github.com/casdoor/casdoor/object"
@ -35,6 +36,90 @@ const (
MfaAuthVerification = "mfaAuth"
)
// GetVerifications
// @Title GetVerifications
// @Tag Verification API
// @Description get payments
// @Param owner query string true "The owner of payments"
// @Success 200 {array} object.Verification The Response object
// @router /get-payments [get]
func (c *ApiController) GetVerifications() {
owner := c.Input().Get("owner")
limit := c.Input().Get("pageSize")
page := c.Input().Get("p")
field := c.Input().Get("field")
value := c.Input().Get("value")
sortField := c.Input().Get("sortField")
sortOrder := c.Input().Get("sortOrder")
if limit == "" || page == "" {
payments, err := object.GetVerifications(owner)
if err != nil {
c.ResponseError(err.Error())
return
}
c.ResponseOk(payments)
} else {
limit := util.ParseInt(limit)
count, err := object.GetVerificationCount(owner, field, value)
if err != nil {
c.ResponseError(err.Error())
return
}
paginator := pagination.SetPaginator(c.Ctx, limit, count)
payments, err := object.GetPaginationVerifications(owner, paginator.Offset(), limit, field, value, sortField, sortOrder)
if err != nil {
c.ResponseError(err.Error())
return
}
c.ResponseOk(payments, paginator.Nums())
}
}
// GetUserVerifications
// @Title GetUserVerifications
// @Tag Verification API
// @Description get payments for a user
// @Param owner query string true "The owner of payments"
// @Param organization query string true "The organization of the user"
// @Param user query string true "The username of the user"
// @Success 200 {array} object.Verification The Response object
// @router /get-user-payments [get]
func (c *ApiController) GetUserVerifications() {
owner := c.Input().Get("owner")
user := c.Input().Get("user")
payments, err := object.GetUserVerifications(owner, user)
if err != nil {
c.ResponseError(err.Error())
return
}
c.ResponseOk(payments)
}
// GetVerification
// @Title GetVerification
// @Tag Verification API
// @Description get payment
// @Param id query string true "The id ( owner/name ) of the payment"
// @Success 200 {object} object.Verification The Response object
// @router /get-payment [get]
func (c *ApiController) GetVerification() {
id := c.Input().Get("id")
payment, err := object.GetVerification(id)
if err != nil {
c.ResponseError(err.Error())
return
}
c.ResponseOk(payment)
}
// SendVerificationCode ...
// @Title SendVerificationCode
// @Tag Verification API

View File

@ -50,13 +50,13 @@ type VerificationRecord struct {
Name string `xorm:"varchar(100) notnull pk" json:"name"`
CreatedTime string `xorm:"varchar(100)" json:"createdTime"`
RemoteAddr string `xorm:"varchar(100)"`
Type string `xorm:"varchar(10)"`
User string `xorm:"varchar(100) notnull"`
Provider string `xorm:"varchar(100) notnull"`
Receiver string `xorm:"varchar(100) index notnull"`
Code string `xorm:"varchar(10) notnull"`
Time int64 `xorm:"notnull"`
RemoteAddr string `xorm:"varchar(100)" json:"remoteAddr"`
Type string `xorm:"varchar(10)" json:"type"`
User string `xorm:"varchar(100) notnull" json:"user"`
Provider string `xorm:"varchar(100) notnull" json:"provider"`
Receiver string `xorm:"varchar(100) index notnull" json:"receiver"`
Code string `xorm:"varchar(10) notnull" json:"code"`
Time int64 `xorm:"notnull" json:"time"`
IsUsed bool
}
@ -278,3 +278,62 @@ func getRandomCode(length int) string {
}
return string(result)
}
func GetVerificationCount(owner, field, value string) (int64, error) {
session := GetSession(owner, -1, -1, field, value, "", "")
return session.Count(&VerificationRecord{Owner: owner})
}
func GetVerifications(owner string) ([]*VerificationRecord, error) {
verifications := []*VerificationRecord{}
err := ormer.Engine.Desc("created_time").Find(&verifications, &VerificationRecord{Owner: owner})
if err != nil {
return nil, err
}
return verifications, nil
}
func GetUserVerifications(owner, user string) ([]*VerificationRecord, error) {
verifications := []*VerificationRecord{}
err := ormer.Engine.Desc("created_time").Find(&verifications, &VerificationRecord{Owner: owner, User: user})
if err != nil {
return nil, err
}
return verifications, nil
}
func GetPaginationVerifications(owner string, offset, limit int, field, value, sortField, sortOrder string) ([]*VerificationRecord, error) {
verifications := []*VerificationRecord{}
session := GetSession(owner, offset, limit, field, value, sortField, sortOrder)
err := session.Find(&verifications, &VerificationRecord{Owner: owner})
if err != nil {
return nil, err
}
return verifications, nil
}
func getVerification(owner string, name string) (*VerificationRecord, error) {
if owner == "" || name == "" {
return nil, nil
}
verification := VerificationRecord{Owner: owner, Name: name}
existed, err := ormer.Engine.Get(&verification)
if err != nil {
return nil, err
}
if existed {
return &verification, nil
} else {
return nil, nil
}
}
func GetVerification(id string) (*VerificationRecord, error) {
owner, name := util.GetOwnerAndNameFromId(id)
return getVerification(owner, name)
}

View File

@ -255,6 +255,7 @@ func initAPI() {
beego.Router("/api/verify-captcha", &controllers.ApiController{}, "POST:VerifyCaptcha")
beego.Router("/api/reset-email-or-phone", &controllers.ApiController{}, "POST:ResetEmailOrPhone")
beego.Router("/api/get-captcha", &controllers.ApiController{}, "GET:GetCaptcha")
beego.Router("/api/get-verifications", &controllers.ApiController{}, "GET:GetVerifications")
beego.Router("/api/get-ldap-users", &controllers.ApiController{}, "GET:GetLdapUsers")
beego.Router("/api/get-ldaps", &controllers.ApiController{}, "GET:GetLdaps")

View File

@ -92,6 +92,7 @@ import * as AuthBackend from "./auth/AuthBackend";
import {clearWeb3AuthToken} from "./auth/Web3Auth";
import TransactionListPage from "./TransactionListPage";
import TransactionEditPage from "./TransactionEditPage";
import VerificationListPage from "./VerificationListPage";
function ManagementPage(props) {
@ -293,6 +294,7 @@ function ManagementPage(props) {
Conf.CasvisorUrl ? Setting.getItem(<a target="_blank" rel="noreferrer" href={Conf.CasvisorUrl}>{i18next.t("general:Records")}</a>, "/records")
: Setting.getItem(<Link to="/records">{i18next.t("general:Records")}</Link>, "/records"),
Setting.getItem(<Link to="/tokens">{i18next.t("general:Tokens")}</Link>, "/tokens"),
Setting.getItem(<Link to="/verifications">{i18next.t("general:Verifications")}</Link>, "/verifications"),
]));
res.push(Setting.getItem(<Link style={{color: textColor}} to="/products">{i18next.t("general:Business & Payments")}</Link>, "/business", <DollarTwoTone twoToneColor={twoToneColor} />, [
@ -360,6 +362,7 @@ function ManagementPage(props) {
<Route exact path="/resources" render={(props) => renderLoginIfNotLoggedIn(<ResourceListPage account={account} {...props} />)} />
<Route exact path="/certs" render={(props) => renderLoginIfNotLoggedIn(<CertListPage account={account} {...props} />)} />
<Route exact path="/certs/:organizationName/:certName" render={(props) => renderLoginIfNotLoggedIn(<CertEditPage account={account} {...props} />)} />
<Route exact path="/verifications" render={(props) => renderLoginIfNotLoggedIn(<VerificationListPage account={account} {...props} />)} />
<Route exact path="/roles" render={(props) => renderLoginIfNotLoggedIn(<RoleListPage account={account} {...props} />)} />
<Route exact path="/roles/:organizationName/:roleName" render={(props) => renderLoginIfNotLoggedIn(<RoleEditPage account={account} {...props} />)} />
<Route exact path="/permissions" render={(props) => renderLoginIfNotLoggedIn(<PermissionListPage account={account} {...props} />)} />

View File

@ -0,0 +1,187 @@
// Copyright 2024 The Casdoor Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
import BaseListPage from "./BaseListPage";
import * as Setting from "./Setting";
import moment from "moment/moment";
import * as VerificationBackend from "./backend/VerificationBackend";
import i18next from "i18next";
import {Link} from "react-router-dom";
import React from "react";
import {Table} from "antd";
class VerificationListPage extends BaseListPage {
newVerification() {
const randomName = Setting.getRandomName();
return {
owner: "admin",
name: `Verification_${randomName}`,
createdTime: moment().format(),
};
}
renderTable(verifications) {
const columns = [
{
title: i18next.t("general:Name"),
dataIndex: "name",
key: "name",
width: "150px",
fixed: "left",
sorter: true,
...this.getColumnSearchProps("name"),
render: (text, record, index) => {
return (
<Link to={`/syncers/${text}`}>
{text}
</Link>
);
},
},
{
title: i18next.t("provider:Type"),
dataIndex: "type",
key: "type",
width: "120px",
sorter: true,
...this.getColumnSearchProps("type"),
},
{
title: i18next.t("general:User"),
dataIndex: "user",
key: "user",
width: "120px",
sorter: true,
...this.getColumnSearchProps("user"),
render: (text, record, index) => {
return (
<Link to={`/users/${record.owner}/${text}`}>
{text}
</Link>
);
},
},
{
title: i18next.t("general:Provider"),
dataIndex: "provider",
key: "provider",
width: "150px",
sorter: true,
...this.getColumnSearchProps("provider"),
render: (text, record, index) => {
return (
<Link to={`/providers/${record.owner}/${text}`}>
{text}
</Link>
);
},
},
{
title: i18next.t("verification:Receiver"),
dataIndex: "receiver",
key: "receiver",
width: "120px",
sorter: true,
...this.getColumnSearchProps("receiver"),
},
{
title: i18next.t("login:Verification code"),
dataIndex: "code",
key: "code",
width: "120px",
sorter: true,
...this.getColumnSearchProps("code"),
},
{
title: i18next.t("general:Timestamp"),
dataIndex: "time",
key: "time",
width: "160px",
sorter: true,
render: (text, record, index) => {
return Setting.getFormattedDate(text * 1000);
},
},
{
title: i18next.t("general:Created time"),
dataIndex: "createdTime",
key: "createdTime",
width: "160px",
sorter: true,
render: (text, record, index) => {
return Setting.getFormattedDate(text);
},
},
];
const paginationProps = {
total: this.state.pagination.total,
showQuickJumper: true,
showSizeChanger: true,
showTotal: () => i18next.t("general:{total} in total").replace("{total}", this.state.pagination.total),
};
return (
<div>
<Table scroll={{x: "max-content"}} columns={columns} dataSource={verifications} rowKey={(record) => `${record.owner}/${record.name}`} size="middle" bordered pagination={paginationProps}
title={() => (
<div>
{i18next.t("general:Verifications")}&nbsp;&nbsp;&nbsp;&nbsp;
</div>
)}
loading={this.state.loading}
onChange={this.handleTableChange}
/>
</div>
);
}
fetch = (params = {}) => {
let field = params.searchedColumn, value = params.searchText;
const sortField = params.sortField, sortOrder = params.sortOrder;
if (params.type !== undefined && params.type !== null) {
field = "type";
value = params.type;
}
this.setState({loading: true});
VerificationBackend.getVerifications("admin", Setting.isDefaultOrganizationSelected(this.props.account) ? "" : Setting.getRequestOrganization(this.props.account), params.pagination.current, params.pagination.pageSize, field, value, sortField, sortOrder)
.then((res) => {
this.setState({
loading: false,
});
if (res.status === "ok") {
this.setState({
data: res.data,
pagination: {
...params.pagination,
total: res.data2,
},
searchText: params.searchText,
searchedColumn: params.searchedColumn,
});
} else {
if (Setting.isResponseDenied(res)) {
this.setState({
isAuthorized: false,
});
} else {
Setting.showMessage("error", res.msg);
}
}
});
};
}
export default VerificationListPage;

View File

@ -0,0 +1,35 @@
// Copyright 2024 The Casdoor Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
import * as Setting from "../Setting";
export function getVerifications(owner, organization, page = "", pageSize = "", field = "", value = "", sortField = "", sortOrder = "") {
return fetch(`${Setting.ServerUrl}/api/get-verifications?owner=${owner}&p=${page}&pageSize=${pageSize}&field=${field}&value=${value}&sortField=${sortField}&sortOrder=${sortOrder}`, {
method: "GET",
credentials: "include",
headers: {
"Accept-Language": Setting.getAcceptLanguage(),
},
}).then(res => res.json());
}
export function getVerification(owner, name) {
return fetch(`${Setting.ServerUrl}/api/get-verification?id=${owner}/${encodeURIComponent(name)}`, {
method: "GET",
credentials: "include",
headers: {
"Accept-Language": Setting.getAcceptLanguage(),
},
}).then(res => res.json());
}

View File

@ -392,6 +392,7 @@
"User type - Tooltip": "Tags that the user belongs to, defaulting to \"normal-user\"",
"Users": "Users",
"Users under all organizations": "Users under all organizations",
"Verifications": "Verifications",
"Webhooks": "Webhooks",
"You can only select one physical group": "You can only select one physical group",
"empty": "empty",
@ -870,6 +871,7 @@
"Test Email - Tooltip": "Email address to receive test mails",
"Test SMTP Connection": "Test SMTP Connection",
"Third-party": "Third-party",
"This field is required": "This field is required",
"Token URL": "Token URL",
"Token URL - Tooltip": "Token URL",
"Type": "Type",
@ -889,7 +891,8 @@
"admin (Shared)": "admin (Shared)"
},
"record": {
"Is triggered": "Is triggered"
"Is triggered": "Is triggered",
"Object": "Object"
},
"resource": {
"Copy Link": "Copy Link",
@ -1160,6 +1163,9 @@
"WebAuthn credentials": "WebAuthn credentials",
"input password": "input password"
},
"verification": {
"Receiver": "Receiver"
},
"webhook": {
"Content type": "Content type",
"Content type - Tooltip": "Content type",

View File

@ -392,6 +392,7 @@
"User type - Tooltip": "Tags, denen der Benutzer angehört, standardmäßig auf \"normaler Benutzer\" festgelegt",
"Users": "Benutzer",
"Users under all organizations": "Benutzer unter allen Organisationen",
"Verifications": "Verifications",
"Webhooks": "Webhooks",
"You can only select one physical group": "You can only select one physical group",
"empty": "leere",
@ -870,6 +871,7 @@
"Test Email - Tooltip": "E-Mail-Adresse zum Empfangen von Test-E-Mails",
"Test SMTP Connection": "Testen Sie die SMTP-Verbindung",
"Third-party": "Third-party",
"This field is required": "This field is required",
"Token URL": "Token-URL",
"Token URL - Tooltip": "Token-URL",
"Type": "Typ",
@ -889,7 +891,8 @@
"admin (Shared)": "admin (Gemeinsam)"
},
"record": {
"Is triggered": "Is triggered"
"Is triggered": "Is triggered",
"Object": "Object"
},
"resource": {
"Copy Link": "Kopiere den Link",
@ -1160,6 +1163,9 @@
"WebAuthn credentials": "WebAuthn-Anmeldeinformationen",
"input password": "Eingabe des Passworts"
},
"verification": {
"Receiver": "Receiver"
},
"webhook": {
"Content type": "Content-Type",
"Content type - Tooltip": "Inhaltstyp",

View File

@ -392,6 +392,7 @@
"User type - Tooltip": "Tags that the user belongs to, defaulting to \"normal-user\"",
"Users": "Users",
"Users under all organizations": "Users under all organizations",
"Verifications": "Verifications",
"Webhooks": "Webhooks",
"You can only select one physical group": "You can only select one physical group",
"empty": "empty",
@ -870,6 +871,7 @@
"Test Email - Tooltip": "Email address to receive test mails",
"Test SMTP Connection": "Test SMTP Connection",
"Third-party": "Third-party",
"This field is required": "This field is required",
"Token URL": "Token URL",
"Token URL - Tooltip": "Token URL",
"Type": "Type",
@ -889,7 +891,8 @@
"admin (Shared)": "admin (Shared)"
},
"record": {
"Is triggered": "Is triggered"
"Is triggered": "Is triggered",
"Object": "Object"
},
"resource": {
"Copy Link": "Copy Link",
@ -1160,6 +1163,9 @@
"WebAuthn credentials": "WebAuthn credentials",
"input password": "input password"
},
"verification": {
"Receiver": "Receiver"
},
"webhook": {
"Content type": "Content type",
"Content type - Tooltip": "Content type",

View File

@ -392,6 +392,7 @@
"User type - Tooltip": "Etiquetas a las que el usuario pertenece, con una configuración predeterminada en \"usuario-normal\"",
"Users": "Usuarios",
"Users under all organizations": "Usuarios bajo todas las organizaciones",
"Verifications": "Verifications",
"Webhooks": "Webhooks",
"You can only select one physical group": "You can only select one physical group",
"empty": "vacío",
@ -870,6 +871,7 @@
"Test Email - Tooltip": "Dirección de correo electrónico para recibir mensajes de prueba",
"Test SMTP Connection": "Prueba de conexión SMTP",
"Third-party": "Third-party",
"This field is required": "This field is required",
"Token URL": "Token URL",
"Token URL - Tooltip": "URL de token",
"Type": "Tipo",
@ -889,7 +891,8 @@
"admin (Shared)": "administrador (compartido)"
},
"record": {
"Is triggered": "Is triggered"
"Is triggered": "Is triggered",
"Object": "Object"
},
"resource": {
"Copy Link": "Copiar enlace",
@ -1160,6 +1163,9 @@
"WebAuthn credentials": "Credenciales de WebAuthn",
"input password": "Ingresar contraseña"
},
"verification": {
"Receiver": "Receiver"
},
"webhook": {
"Content type": "Tipo de contenido",
"Content type - Tooltip": "Tipo de contenido",

View File

@ -392,6 +392,7 @@
"User type - Tooltip": "Tags that the user belongs to, defaulting to \"normal-user\"",
"Users": "Users",
"Users under all organizations": "Users under all organizations",
"Verifications": "Verifications",
"Webhooks": "Webhooks",
"You can only select one physical group": "You can only select one physical group",
"empty": "empty",
@ -870,6 +871,7 @@
"Test Email - Tooltip": "Email address to receive test mails",
"Test SMTP Connection": "Test SMTP Connection",
"Third-party": "Third-party",
"This field is required": "This field is required",
"Token URL": "Token URL",
"Token URL - Tooltip": "Token URL",
"Type": "Type",
@ -889,7 +891,8 @@
"admin (Shared)": "admin (Shared)"
},
"record": {
"Is triggered": "Is triggered"
"Is triggered": "Is triggered",
"Object": "Object"
},
"resource": {
"Copy Link": "Copy Link",
@ -1160,6 +1163,9 @@
"WebAuthn credentials": "WebAuthn credentials",
"input password": "input password"
},
"verification": {
"Receiver": "Receiver"
},
"webhook": {
"Content type": "Content type",
"Content type - Tooltip": "Content type",

View File

@ -392,6 +392,7 @@
"User type - Tooltip": "Tags that the user belongs to, defaulting to \"normal-user\"",
"Users": "Users",
"Users under all organizations": "Users under all organizations",
"Verifications": "Verifications",
"Webhooks": "Webhooks",
"You can only select one physical group": "You can only select one physical group",
"empty": "empty",
@ -870,6 +871,7 @@
"Test Email - Tooltip": "Email address to receive test mails",
"Test SMTP Connection": "Test SMTP Connection",
"Third-party": "Third-party",
"This field is required": "This field is required",
"Token URL": "Token URL",
"Token URL - Tooltip": "Token URL",
"Type": "Type",
@ -889,7 +891,8 @@
"admin (Shared)": "admin (Shared)"
},
"record": {
"Is triggered": "Is triggered"
"Is triggered": "Is triggered",
"Object": "Object"
},
"resource": {
"Copy Link": "Copy Link",
@ -1160,6 +1163,9 @@
"WebAuthn credentials": "WebAuthn credentials",
"input password": "input password"
},
"verification": {
"Receiver": "Receiver"
},
"webhook": {
"Content type": "Content type",
"Content type - Tooltip": "Content type",

View File

@ -392,6 +392,7 @@
"User type - Tooltip": "Étiquettes associées au compte, avec une valeur par défaut \"normal-user\"",
"Users": "Comptes",
"Users under all organizations": "Comptes sous toutes les organisations",
"Verifications": "Verifications",
"Webhooks": "Crochets web",
"You can only select one physical group": "Vous ne pouvez sélectionner qu'un seul groupe physique",
"empty": "vide",
@ -870,6 +871,7 @@
"Test Email - Tooltip": "Adresse e-mail pour recevoir des courriels de test",
"Test SMTP Connection": "Test de connexion SMTP",
"Third-party": "Tierce partie",
"This field is required": "This field is required",
"Token URL": "URL de jeton",
"Token URL - Tooltip": "URL de jeton",
"Type": "Type de texte",
@ -889,7 +891,8 @@
"admin (Shared)": "admin (Partagé)"
},
"record": {
"Is triggered": "Is triggered"
"Is triggered": "Is triggered",
"Object": "Object"
},
"resource": {
"Copy Link": "Copier le lien",
@ -1160,6 +1163,9 @@
"WebAuthn credentials": "Identifiants WebAuthn",
"input password": "saisir le mot de passe"
},
"verification": {
"Receiver": "Receiver"
},
"webhook": {
"Content type": "Type de contenu",
"Content type - Tooltip": "Type de contenu",

View File

@ -392,6 +392,7 @@
"User type - Tooltip": "Tags that the user belongs to, defaulting to \"normal-user\"",
"Users": "Users",
"Users under all organizations": "Users under all organizations",
"Verifications": "Verifications",
"Webhooks": "Webhooks",
"You can only select one physical group": "You can only select one physical group",
"empty": "empty",
@ -870,6 +871,7 @@
"Test Email - Tooltip": "Email address to receive test mails",
"Test SMTP Connection": "Test SMTP Connection",
"Third-party": "Third-party",
"This field is required": "This field is required",
"Token URL": "Token URL",
"Token URL - Tooltip": "Token URL",
"Type": "Type",
@ -889,7 +891,8 @@
"admin (Shared)": "admin (Shared)"
},
"record": {
"Is triggered": "Is triggered"
"Is triggered": "Is triggered",
"Object": "Object"
},
"resource": {
"Copy Link": "Copy Link",
@ -1160,6 +1163,9 @@
"WebAuthn credentials": "WebAuthn credentials",
"input password": "input password"
},
"verification": {
"Receiver": "Receiver"
},
"webhook": {
"Content type": "Content type",
"Content type - Tooltip": "Content type",

View File

@ -392,6 +392,7 @@
"User type - Tooltip": "Tag yang dimiliki oleh pengguna, defaultnya adalah \"normal-user\"",
"Users": "Pengguna-pengguna",
"Users under all organizations": "Pengguna di bawah semua organisasi",
"Verifications": "Verifications",
"Webhooks": "Webhooks",
"You can only select one physical group": "You can only select one physical group",
"empty": "kosong",
@ -870,6 +871,7 @@
"Test Email - Tooltip": "Alamat email untuk menerima email percobaan",
"Test SMTP Connection": "Tes Koneksi SMTP",
"Third-party": "Third-party",
"This field is required": "This field is required",
"Token URL": "Token URL: Tautan Token",
"Token URL - Tooltip": "Token URL: URL Token",
"Type": "Jenis",
@ -889,7 +891,8 @@
"admin (Shared)": "Admin (Berbagi)"
},
"record": {
"Is triggered": "Is triggered"
"Is triggered": "Is triggered",
"Object": "Object"
},
"resource": {
"Copy Link": "Salin Tautan",
@ -1160,6 +1163,9 @@
"WebAuthn credentials": "Kredensial WebAuthn",
"input password": "masukkan kata sandi"
},
"verification": {
"Receiver": "Receiver"
},
"webhook": {
"Content type": "Jenis konten",
"Content type - Tooltip": "Tipe konten",

View File

@ -392,6 +392,7 @@
"User type - Tooltip": "Tags that the user belongs to, defaulting to \"normal-user\"",
"Users": "Users",
"Users under all organizations": "Users under all organizations",
"Verifications": "Verifications",
"Webhooks": "Webhooks",
"You can only select one physical group": "You can only select one physical group",
"empty": "empty",
@ -870,6 +871,7 @@
"Test Email - Tooltip": "Email address to receive test mails",
"Test SMTP Connection": "Test SMTP Connection",
"Third-party": "Third-party",
"This field is required": "This field is required",
"Token URL": "Token URL",
"Token URL - Tooltip": "Token URL",
"Type": "Type",
@ -889,7 +891,8 @@
"admin (Shared)": "admin (Shared)"
},
"record": {
"Is triggered": "Is triggered"
"Is triggered": "Is triggered",
"Object": "Object"
},
"resource": {
"Copy Link": "Copy Link",
@ -1160,6 +1163,9 @@
"WebAuthn credentials": "WebAuthn credentials",
"input password": "input password"
},
"verification": {
"Receiver": "Receiver"
},
"webhook": {
"Content type": "Content type",
"Content type - Tooltip": "Content type",

View File

@ -392,6 +392,7 @@
"User type - Tooltip": "ユーザーが属するタグは、デフォルトでは「通常ユーザー」となります",
"Users": "ユーザー",
"Users under all organizations": "すべての組織のユーザー",
"Verifications": "Verifications",
"Webhooks": "Webhooks",
"You can only select one physical group": "You can only select one physical group",
"empty": "空",
@ -870,6 +871,7 @@
"Test Email - Tooltip": "テストメールを受け取るためのメールアドレス",
"Test SMTP Connection": "SMTP接続をテストする",
"Third-party": "Third-party",
"This field is required": "This field is required",
"Token URL": "トークンのURL",
"Token URL - Tooltip": "トークンURL",
"Type": "タイプ",
@ -889,7 +891,8 @@
"admin (Shared)": "管理者(共有)"
},
"record": {
"Is triggered": "Is triggered"
"Is triggered": "Is triggered",
"Object": "Object"
},
"resource": {
"Copy Link": "コピー リンク",
@ -1160,6 +1163,9 @@
"WebAuthn credentials": "WebAuthnの資格情報",
"input password": "パスワードを入力してください"
},
"verification": {
"Receiver": "Receiver"
},
"webhook": {
"Content type": "コンテンツタイプ",
"Content type - Tooltip": "コンテンツタイプ",

View File

@ -392,6 +392,7 @@
"User type - Tooltip": "Tags that the user belongs to, defaulting to \"normal-user\"",
"Users": "Users",
"Users under all organizations": "Users under all organizations",
"Verifications": "Verifications",
"Webhooks": "Webhooks",
"You can only select one physical group": "You can only select one physical group",
"empty": "empty",
@ -870,6 +871,7 @@
"Test Email - Tooltip": "Email address to receive test mails",
"Test SMTP Connection": "Test SMTP Connection",
"Third-party": "Third-party",
"This field is required": "This field is required",
"Token URL": "Token URL",
"Token URL - Tooltip": "Token URL",
"Type": "Type",
@ -889,7 +891,8 @@
"admin (Shared)": "admin (Shared)"
},
"record": {
"Is triggered": "Is triggered"
"Is triggered": "Is triggered",
"Object": "Object"
},
"resource": {
"Copy Link": "Copy Link",
@ -1160,6 +1163,9 @@
"WebAuthn credentials": "WebAuthn credentials",
"input password": "input password"
},
"verification": {
"Receiver": "Receiver"
},
"webhook": {
"Content type": "Content type",
"Content type - Tooltip": "Content type",

View File

@ -392,6 +392,7 @@
"User type - Tooltip": "사용자가 속한 태그는 기본적으로 \"보통 사용자\"로 설정됩니다",
"Users": "사용자",
"Users under all organizations": "모든 조직의 사용자",
"Verifications": "Verifications",
"Webhooks": "Webhooks",
"You can only select one physical group": "You can only select one physical group",
"empty": "빈",
@ -870,6 +871,7 @@
"Test Email - Tooltip": "테스트 메일을 받을 이메일 주소",
"Test SMTP Connection": "테스트 SMTP 연결",
"Third-party": "Third-party",
"This field is required": "This field is required",
"Token URL": "토큰 URL",
"Token URL - Tooltip": "토큰 URL",
"Type": "타입",
@ -889,7 +891,8 @@
"admin (Shared)": "관리자 (공유)"
},
"record": {
"Is triggered": "Is triggered"
"Is triggered": "Is triggered",
"Object": "Object"
},
"resource": {
"Copy Link": "링크 복사하기",
@ -1160,6 +1163,9 @@
"WebAuthn credentials": "웹 인증 자격증명",
"input password": "비밀번호를 입력해주세요"
},
"verification": {
"Receiver": "Receiver"
},
"webhook": {
"Content type": "콘텐츠 유형",
"Content type - Tooltip": "콘텐츠 유형",

View File

@ -392,6 +392,7 @@
"User type - Tooltip": "Tags that the user belongs to, defaulting to \"normal-user\"",
"Users": "Users",
"Users under all organizations": "Users under all organizations",
"Verifications": "Verifications",
"Webhooks": "Webhooks",
"You can only select one physical group": "You can only select one physical group",
"empty": "empty",
@ -870,6 +871,7 @@
"Test Email - Tooltip": "Email address to receive test mails",
"Test SMTP Connection": "Test SMTP Connection",
"Third-party": "Third-party",
"This field is required": "This field is required",
"Token URL": "Token URL",
"Token URL - Tooltip": "Token URL",
"Type": "Type",
@ -889,7 +891,8 @@
"admin (Shared)": "admin (Shared)"
},
"record": {
"Is triggered": "Is triggered"
"Is triggered": "Is triggered",
"Object": "Object"
},
"resource": {
"Copy Link": "Copy Link",
@ -1160,6 +1163,9 @@
"WebAuthn credentials": "WebAuthn credentials",
"input password": "input password"
},
"verification": {
"Receiver": "Receiver"
},
"webhook": {
"Content type": "Content type",
"Content type - Tooltip": "Content type",

View File

@ -392,6 +392,7 @@
"User type - Tooltip": "Tags that the user belongs to, defaulting to \"normal-user\"",
"Users": "Users",
"Users under all organizations": "Users under all organizations",
"Verifications": "Verifications",
"Webhooks": "Webhooks",
"You can only select one physical group": "You can only select one physical group",
"empty": "empty",
@ -870,6 +871,7 @@
"Test Email - Tooltip": "Email address to receive test mails",
"Test SMTP Connection": "Test SMTP Connection",
"Third-party": "Third-party",
"This field is required": "This field is required",
"Token URL": "Token URL",
"Token URL - Tooltip": "Token URL",
"Type": "Type",
@ -889,7 +891,8 @@
"admin (Shared)": "admin (Shared)"
},
"record": {
"Is triggered": "Is triggered"
"Is triggered": "Is triggered",
"Object": "Object"
},
"resource": {
"Copy Link": "Copy Link",
@ -1160,6 +1163,9 @@
"WebAuthn credentials": "WebAuthn credentials",
"input password": "input password"
},
"verification": {
"Receiver": "Receiver"
},
"webhook": {
"Content type": "Content type",
"Content type - Tooltip": "Content type",

View File

@ -392,6 +392,7 @@
"User type - Tooltip": "Tags that the user belongs to, defaulting to \"normal-user\"",
"Users": "Users",
"Users under all organizations": "Users under all organizations",
"Verifications": "Verifications",
"Webhooks": "Webhooks",
"You can only select one physical group": "You can only select one physical group",
"empty": "empty",
@ -870,6 +871,7 @@
"Test Email - Tooltip": "Email address to receive test mails",
"Test SMTP Connection": "Test SMTP Connection",
"Third-party": "Third-party",
"This field is required": "This field is required",
"Token URL": "Token URL",
"Token URL - Tooltip": "Token URL",
"Type": "Type",
@ -889,7 +891,8 @@
"admin (Shared)": "admin (Shared)"
},
"record": {
"Is triggered": "Is triggered"
"Is triggered": "Is triggered",
"Object": "Object"
},
"resource": {
"Copy Link": "Copy Link",
@ -1160,6 +1163,9 @@
"WebAuthn credentials": "WebAuthn credentials",
"input password": "input password"
},
"verification": {
"Receiver": "Receiver"
},
"webhook": {
"Content type": "Content type",
"Content type - Tooltip": "Content type",

View File

@ -392,6 +392,7 @@
"User type - Tooltip": "Tags às quais o usuário pertence, com valor padrão de \"usuário-normal\"",
"Users": "Usuários",
"Users under all organizations": "Usuários em todas as organizações",
"Verifications": "Verifications",
"Webhooks": "Webhooks",
"You can only select one physical group": "You can only select one physical group",
"empty": "vazio",
@ -870,6 +871,7 @@
"Test Email - Tooltip": "Endereço de e-mail para receber e-mails de teste",
"Test SMTP Connection": "Testar Conexão SMTP",
"Third-party": "Terceiros",
"This field is required": "This field is required",
"Token URL": "URL do Token",
"Token URL - Tooltip": "URL do Token",
"Type": "Tipo",
@ -889,7 +891,8 @@
"admin (Shared)": "admin (Compartilhado)"
},
"record": {
"Is triggered": "Is triggered"
"Is triggered": "Is triggered",
"Object": "Object"
},
"resource": {
"Copy Link": "Copiar Link",
@ -1160,6 +1163,9 @@
"WebAuthn credentials": "Credenciais WebAuthn",
"input password": "Digite a senha"
},
"verification": {
"Receiver": "Receiver"
},
"webhook": {
"Content type": "Tipo de conteúdo",
"Content type - Tooltip": "Tipo de conteúdo",

View File

@ -392,6 +392,7 @@
"User type - Tooltip": "Теги, к которым принадлежит пользователь, по умолчанию \"обычный пользователь\"",
"Users": "Пользователи",
"Users under all organizations": "Пользователи всех организаций",
"Verifications": "Verifications",
"Webhooks": "Вебхуки",
"You can only select one physical group": "You can only select one physical group",
"empty": "пустые",
@ -870,6 +871,7 @@
"Test Email - Tooltip": "Адрес электронной почты для получения тестовых писем",
"Test SMTP Connection": "Тестирование соединения SMTP",
"Third-party": "Third-party",
"This field is required": "This field is required",
"Token URL": "Токен URL (URL-адрес маркера)",
"Token URL - Tooltip": "Токен URL",
"Type": "Тип",
@ -889,7 +891,8 @@
"admin (Shared)": "администратор (общий)"
},
"record": {
"Is triggered": "Is triggered"
"Is triggered": "Is triggered",
"Object": "Object"
},
"resource": {
"Copy Link": "Копировать ссылку",
@ -1160,6 +1163,9 @@
"WebAuthn credentials": "WebAuthn удостоверения",
"input password": "введите пароль"
},
"verification": {
"Receiver": "Receiver"
},
"webhook": {
"Content type": "Тип содержания",
"Content type - Tooltip": "Тип содержимого",

View File

@ -392,6 +392,7 @@
"User type - Tooltip": "Tags that the user belongs to, defaulting to \"normal-user\"",
"Users": "Users",
"Users under all organizations": "Users under all organizations",
"Verifications": "Verifications",
"Webhooks": "Webhooks",
"You can only select one physical group": "You can only select one physical group",
"empty": "empty",
@ -870,6 +871,7 @@
"Test Email - Tooltip": "Email address to receive test mails",
"Test SMTP Connection": "Test SMTP Connection",
"Third-party": "Third-party",
"This field is required": "This field is required",
"Token URL": "Token URL",
"Token URL - Tooltip": "Token URL",
"Type": "Type",
@ -889,7 +891,8 @@
"admin (Shared)": "admin (Shared)"
},
"record": {
"Is triggered": "Is triggered"
"Is triggered": "Is triggered",
"Object": "Object"
},
"resource": {
"Copy Link": "Copy Link",
@ -1160,6 +1163,9 @@
"WebAuthn credentials": "WebAuthn credentials",
"input password": "input password"
},
"verification": {
"Receiver": "Receiver"
},
"webhook": {
"Content type": "Content type",
"Content type - Tooltip": "Content type",

View File

@ -392,6 +392,7 @@
"User type - Tooltip": "Tags that the user belongs to, defaulting to \"normal-user\"",
"Users": "Kullanıcılar",
"Users under all organizations": "Users under all organizations",
"Verifications": "Verifications",
"Webhooks": "Webhooks",
"You can only select one physical group": "You can only select one physical group",
"empty": "empty",
@ -870,6 +871,7 @@
"Test Email - Tooltip": "Email address to receive test mails",
"Test SMTP Connection": "Test SMTP Connection",
"Third-party": "Third-party",
"This field is required": "This field is required",
"Token URL": "Token URL",
"Token URL - Tooltip": "Token URL",
"Type": "Type",
@ -889,7 +891,8 @@
"admin (Shared)": "admin (Shared)"
},
"record": {
"Is triggered": "Is triggered"
"Is triggered": "Is triggered",
"Object": "Object"
},
"resource": {
"Copy Link": "Copy Link",
@ -1160,6 +1163,9 @@
"WebAuthn credentials": "WebAuthn credentials",
"input password": "şifreyi girin"
},
"verification": {
"Receiver": "Receiver"
},
"webhook": {
"Content type": "Content type",
"Content type - Tooltip": "Content type",

View File

@ -392,6 +392,7 @@
"User type - Tooltip": "Tags that the user belongs to, defaulting to \"normal-user\"",
"Users": "Users",
"Users under all organizations": "Users under all organizations",
"Verifications": "Verifications",
"Webhooks": "Webhooks",
"You can only select one physical group": "You can only select one physical group",
"empty": "empty",
@ -870,6 +871,7 @@
"Test Email - Tooltip": "Email address to receive test mails",
"Test SMTP Connection": "Test SMTP Connection",
"Third-party": "Third-party",
"This field is required": "This field is required",
"Token URL": "Token URL",
"Token URL - Tooltip": "Token URL",
"Type": "Type",
@ -889,7 +891,8 @@
"admin (Shared)": "admin (Shared)"
},
"record": {
"Is triggered": "Is triggered"
"Is triggered": "Is triggered",
"Object": "Object"
},
"resource": {
"Copy Link": "Copy Link",
@ -1160,6 +1163,9 @@
"WebAuthn credentials": "WebAuthn credentials",
"input password": "input password"
},
"verification": {
"Receiver": "Receiver"
},
"webhook": {
"Content type": "Content type",
"Content type - Tooltip": "Content type",

View File

@ -392,6 +392,7 @@
"User type - Tooltip": "Các thẻ mà người dùng thuộc vào, mặc định là \"người dùng bình thường\"",
"Users": "Người dùng",
"Users under all organizations": "Người dùng trong tất cả các tổ chức",
"Verifications": "Verifications",
"Webhooks": "Webhooks",
"You can only select one physical group": "You can only select one physical group",
"empty": "trống",
@ -870,6 +871,7 @@
"Test Email - Tooltip": "Địa chỉ email để nhận thư kiểm tra",
"Test SMTP Connection": "Kiểm tra kết nối SMTP",
"Third-party": "Bên thứ ba",
"This field is required": "This field is required",
"Token URL": "Đường dẫn mã thông báo",
"Token URL - Tooltip": "Địa chỉ của mã thông báo",
"Type": "Kiểu",
@ -889,7 +891,8 @@
"admin (Shared)": "quản trị viên (Chung)"
},
"record": {
"Is triggered": "Is triggered"
"Is triggered": "Is triggered",
"Object": "Object"
},
"resource": {
"Copy Link": "Sao chép liên kết",
@ -1160,6 +1163,9 @@
"WebAuthn credentials": "Chứng chỉ WebAuthn",
"input password": "Nhập mật khẩu"
},
"verification": {
"Receiver": "Receiver"
},
"webhook": {
"Content type": "Loại nội dung",
"Content type - Tooltip": "Loại nội dung",

View File

@ -392,6 +392,7 @@
"User type - Tooltip": "用户所属的标签,默认为\"normal-user\"",
"Users": "用户",
"Users under all organizations": "所有组织里的用户",
"Verifications": "验证",
"Webhooks": "Webhooks",
"You can only select one physical group": "只能选择一个实体组",
"empty": "无",
@ -870,6 +871,7 @@
"Test Email - Tooltip": "接收测试邮件的Email邮箱",
"Test SMTP Connection": "测试SMTP连接",
"Third-party": "第三方",
"This field is required": "此字段是必需的",
"Token URL": "Token URL",
"Token URL - Tooltip": "自定义OAuth的Token URL",
"Type": "类型",
@ -889,7 +891,8 @@
"admin (Shared)": "admin共享"
},
"record": {
"Is triggered": "是否触发"
"Is triggered": "是否触发",
"Object": "实体"
},
"resource": {
"Copy Link": "复制链接",
@ -1160,6 +1163,9 @@
"WebAuthn credentials": "WebAuthn凭据",
"input password": "输入密码"
},
"verification": {
"Receiver": "接收者"
},
"webhook": {
"Content type": "内容类型",
"Content type - Tooltip": "内容类型",