feat: add built-in "Records" pages back (#2720)

This commit is contained in:
DacongDA 2024-02-20 13:28:29 +08:00 committed by GitHub
parent d731c3c934
commit c4a307b9ec
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
32 changed files with 591 additions and 3 deletions

123
controllers/record.go Normal file
View File

@ -0,0 +1,123 @@
// Copyright 2021 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.
package controllers
import (
"encoding/json"
"github.com/casvisor/casvisor-go-sdk/casvisorsdk"
"github.com/beego/beego/utils/pagination"
"github.com/casdoor/casdoor/object"
"github.com/casdoor/casdoor/util"
)
// GetRecords
// @Title GetRecords
// @Tag Record API
// @Description get all records
// @Param pageSize query string true "The size of each page"
// @Param p query string true "The number of the page"
// @Success 200 {object} object.Record The Response object
// @router /get-records [get]
func (c *ApiController) GetRecords() {
organization, ok := c.RequireAdmin()
if !ok {
return
}
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")
organizationName := c.Input().Get("organizationName")
if limit == "" || page == "" {
records, err := object.GetRecords()
if err != nil {
c.ResponseError(err.Error())
return
}
c.ResponseOk(records)
} else {
limit := util.ParseInt(limit)
if c.IsGlobalAdmin() && organizationName != "" {
organization = organizationName
}
filterRecord := &casvisorsdk.Record{Organization: organization}
count, err := object.GetRecordCount(field, value, filterRecord)
if err != nil {
c.ResponseError(err.Error())
return
}
paginator := pagination.SetPaginator(c.Ctx, limit, count)
records, err := object.GetPaginationRecords(paginator.Offset(), limit, field, value, sortField, sortOrder, filterRecord)
if err != nil {
c.ResponseError(err.Error())
return
}
c.ResponseOk(records, paginator.Nums())
}
}
// GetRecordsByFilter
// @Tag Record API
// @Title GetRecordsByFilter
// @Description get records by filter
// @Param filter body string true "filter Record message"
// @Success 200 {object} object.Record The Response object
// @router /get-records-filter [post]
func (c *ApiController) GetRecordsByFilter() {
body := string(c.Ctx.Input.RequestBody)
record := &casvisorsdk.Record{}
err := util.JsonToStruct(body, record)
if err != nil {
c.ResponseError(err.Error())
return
}
records, err := object.GetRecordsByField(record)
if err != nil {
c.ResponseError(err.Error())
return
}
c.ResponseOk(records)
}
// AddRecord
// @Title AddRecord
// @Tag Record API
// @Description add a record
// @Param body body object.Record true "The details of the record"
// @Success 200 {object} controllers.Response The Response object
// @router /add-record [post]
func (c *ApiController) AddRecord() {
var record casvisorsdk.Record
err := json.Unmarshal(c.Ctx.Input.RequestBody, &record)
if err != nil {
c.ResponseError(err.Error())
return
}
c.Data["json"] = wrapActionResponse(object.AddRecord(&record))
c.ServeJSON()
}

View File

@ -459,6 +459,14 @@ func organizationChangeTrigger(oldName string, newName string) error {
return err
}
record := new(Record)
record.Owner = newName
record.Organization = newName
_, err = session.Where("organization=?", oldName).Update(record)
if err != nil {
return err
}
resource := new(Resource)
resource.Owner = newName
_, err = session.Where("owner=?", oldName).Update(resource)

View File

@ -23,6 +23,8 @@ import (
"runtime"
"strings"
"github.com/casvisor/casvisor-go-sdk/casvisorsdk"
"github.com/beego/beego"
"github.com/casdoor/casdoor/conf"
"github.com/casdoor/casdoor/util"
@ -338,6 +340,11 @@ func (a *Ormer) createTable() {
panic(err)
}
err = a.Engine.Sync2(new(casvisorsdk.Record))
if err != nil {
panic(err)
}
err = a.Engine.Sync2(new(Webhook))
if err != nil {
panic(err)

View File

@ -82,7 +82,12 @@ func AddRecord(record *casvisorsdk.Record) bool {
}
if casvisorsdk.GetClient() == nil {
return false
affected, err := ormer.Engine.Insert(record)
if err != nil {
panic(err)
}
return affected != 0
}
affected, err := casvisorsdk.AddRecord(record)
@ -93,6 +98,42 @@ func AddRecord(record *casvisorsdk.Record) bool {
return affected
}
func GetRecordCount(field, value string, filterRecord *casvisorsdk.Record) (int64, error) {
session := GetSession("", -1, -1, field, value, "", "")
return session.Count(filterRecord)
}
func GetRecords() ([]*casvisorsdk.Record, error) {
records := []*casvisorsdk.Record{}
err := ormer.Engine.Desc("id").Find(&records)
if err != nil {
return records, err
}
return records, nil
}
func GetPaginationRecords(offset, limit int, field, value, sortField, sortOrder string, filterRecord *casvisorsdk.Record) ([]*casvisorsdk.Record, error) {
records := []*casvisorsdk.Record{}
session := GetSession("", offset, limit, field, value, sortField, sortOrder)
err := session.Find(&records, filterRecord)
if err != nil {
return records, err
}
return records, nil
}
func GetRecordsByField(record *casvisorsdk.Record) ([]*casvisorsdk.Record, error) {
records := []*casvisorsdk.Record{}
err := ormer.Engine.Find(&records, record)
if err != nil {
return records, err
}
return records, nil
}
func getFilteredWebhooks(webhooks []*Webhook, action string) []*Webhook {
res := []*Webhook{}
for _, webhook := range webhooks {

View File

@ -261,6 +261,10 @@ func initAPI() {
beego.Router("/api/login/oauth/refresh_token", &controllers.ApiController{}, "POST:RefreshToken")
beego.Router("/api/login/oauth/introspect", &controllers.ApiController{}, "POST:IntrospectToken")
beego.Router("/api/get-records", &controllers.ApiController{}, "GET:GetRecords")
beego.Router("/api/get-records-filter", &controllers.ApiController{}, "POST:GetRecordsByFilter")
beego.Router("/api/add-record", &controllers.ApiController{}, "POST:AddRecord")
beego.Router("/api/send-email", &controllers.ApiController{}, "POST:SendEmail")
beego.Router("/api/send-sms", &controllers.ApiController{}, "POST:SendSms")
beego.Router("/api/send-notification", &controllers.ApiController{}, "POST:SendNotification")

View File

@ -95,6 +95,7 @@ import OpenTour from "./common/OpenTour";
const {Header, Footer, Content} = Layout;
import {setTwoToneColor} from "@ant-design/icons";
import RecordListPage from "./RecordListPage";
setTwoToneColor("rgb(87,52,211)");
@ -466,7 +467,8 @@ class App extends Component {
res.push(Setting.getItem(<Link style={{color: "black"}} to="/sessions">{i18next.t("general:Logging & Auditing")}</Link>, "/logs", <WalletTwoTone />, [
Setting.getItem(<Link to="/sessions">{i18next.t("general:Sessions")}</Link>, "/sessions"),
Setting.getItem(<a target="_blank" rel="noreferrer" href={Conf.CasvisorUrl}>{i18next.t("general:Records")}</a>, "/records"),
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"),
]));
@ -527,6 +529,7 @@ class App extends Component {
<Route exact path="/applications/:organizationName/:applicationName" render={(props) => this.renderLoginIfNotLoggedIn(<ApplicationEditPage account={this.state.account} {...props} />)} />
<Route exact path="/providers" render={(props) => this.renderLoginIfNotLoggedIn(<ProviderListPage account={this.state.account} {...props} />)} />
<Route exact path="/providers/:organizationName/:providerName" render={(props) => this.renderLoginIfNotLoggedIn(<ProviderEditPage account={this.state.account} {...props} />)} />
<Route exact path="/records" render={(props) => this.renderLoginIfNotLoggedIn(<RecordListPage account={this.state.account} {...props} />)} />
<Route exact path="/resources" render={(props) => this.renderLoginIfNotLoggedIn(<ResourceListPage account={this.state.account} {...props} />)} />
<Route exact path="/certs" render={(props) => this.renderLoginIfNotLoggedIn(<CertListPage account={this.state.account} {...props} />)} />
<Route exact path="/certs/:organizationName/:certName" render={(props) => this.renderLoginIfNotLoggedIn(<CertEditPage account={this.state.account} {...props} />)} />

View File

@ -14,7 +14,7 @@
export const DefaultApplication = "app-built-in";
export const CasvisorUrl = "https://github.com/casbin/casvisor";
export const CasvisorUrl = "";
export const ShowGithubCorner = false;
export const IsDemoMode = false;

239
web/src/RecordListPage.js Normal file
View File

@ -0,0 +1,239 @@
// Copyright 2021 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 React from "react";
import {Link} from "react-router-dom";
import {Switch, Table} from "antd";
import * as Setting from "./Setting";
import * as RecordBackend from "./backend/RecordBackend";
import i18next from "i18next";
import moment from "moment";
import BaseListPage from "./BaseListPage";
class RecordListPage extends BaseListPage {
UNSAFE_componentWillMount() {
this.state.pagination.pageSize = 20;
const {pagination} = this.state;
this.fetch({pagination});
}
newRecord() {
return {
owner: "built-in",
name: "1234",
id: "1234",
clientIp: "::1",
timestamp: moment().format(),
organization: "built-in",
username: "admin",
requestUri: "/api/get-account",
action: "login",
isTriggered: false,
};
}
renderTable(records) {
let columns = [
{
title: i18next.t("general:Name"),
dataIndex: "name",
key: "name",
width: "320px",
sorter: true,
...this.getColumnSearchProps("name"),
},
{
title: i18next.t("general:ID"),
dataIndex: "id",
key: "id",
width: "90px",
sorter: true,
...this.getColumnSearchProps("id"),
},
{
title: i18next.t("general:Client IP"),
dataIndex: "clientIp",
key: "clientIp",
width: "150px",
sorter: true,
...this.getColumnSearchProps("clientIp"),
render: (text, record, index) => {
return (
<a target="_blank" rel="noreferrer" href={`https://db-ip.com/${text}`}>
{text}
</a>
);
},
},
{
title: i18next.t("general:Timestamp"),
dataIndex: "createdTime",
key: "createdTime",
width: "180px",
sorter: true,
render: (text, record, index) => {
return Setting.getFormattedDate(text);
},
},
{
title: i18next.t("general:Organization"),
dataIndex: "organization",
key: "organization",
width: "110px",
sorter: true,
...this.getColumnSearchProps("organization"),
render: (text, record, index) => {
return (
<Link to={`/organizations/${text}`}>
{text}
</Link>
);
},
},
{
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.organization}/${record.user}`}>
{text}
</Link>
);
},
},
{
title: i18next.t("general:Method"),
dataIndex: "method",
key: "method",
width: "110px",
sorter: true,
filterMultiple: false,
filters: [
{text: "GET", value: "GET"},
{text: "HEAD", value: "HEAD"},
{text: "POST", value: "POST"},
{text: "PUT", value: "PUT"},
{text: "DELETE", value: "DELETE"},
{text: "CONNECT", value: "CONNECT"},
{text: "OPTIONS", value: "OPTIONS"},
{text: "TRACE", value: "TRACE"},
{text: "PATCH", value: "PATCH"},
],
},
{
title: i18next.t("general:Request URI"),
dataIndex: "requestUri",
key: "requestUri",
// width: '300px',
sorter: true,
...this.getColumnSearchProps("requestUri"),
},
{
title: i18next.t("general:Action"),
dataIndex: "action",
key: "action",
width: "200px",
sorter: true,
...this.getColumnSearchProps("action"),
fixed: (Setting.isMobile()) ? "false" : "right",
render: (text, record, index) => {
return text;
},
},
{
title: i18next.t("record:Is triggered"),
dataIndex: "isTriggered",
key: "isTriggered",
width: "140px",
sorter: true,
fixed: (Setting.isMobile()) ? "false" : "right",
render: (text, record, index) => {
if (!["signup", "login", "logout", "update-user"].includes(record.action)) {
return null;
}
return (
<Switch disabled checkedChildren="ON" unCheckedChildren="OFF" checked={text} />
);
},
},
];
if (Setting.isLocalAdminUser(this.props.account)) {
columns = columns.filter(column => column.key !== "name");
}
const paginationProps = {
total: this.state.pagination.total,
pageSize: this.state.pagination.pageSize,
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={records} rowKey="id" size="middle" bordered pagination={paginationProps}
title={() => (
<div>
{i18next.t("general:Records")}&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.method !== undefined && params.method !== null) {
field = "method";
value = params.method;
}
this.setState({loading: true});
RecordBackend.getRecords(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 (res.data.includes("Please login first")) {
this.setState({
loading: false,
isAuthorized: false,
});
}
}
});
};
}
export default RecordListPage;

View File

@ -0,0 +1,25 @@
// Copyright 2021 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 getRecords(organizationName, page, pageSize, field = "", value = "", sortField = "", sortOrder = "") {
return fetch(`${Setting.ServerUrl}/api/get-records?organizationName=${organizationName}&pageSize=${pageSize}&p=${page}&field=${field}&value=${value}&sortField=${sortField}&sortOrder=${sortOrder}`, {
method: "GET",
credentials: "include",
headers: {
"Accept-Language": Setting.getAcceptLanguage(),
},
}).then(res => res.json());
}

View File

@ -196,6 +196,7 @@
"Cert - Tooltip": "The public key certificate that needs to be verified by the client SDK corresponding to this application",
"Certs": "Certs",
"Click to Upload": "Click to Upload",
"Client IP": "Client IP",
"Close": "Close",
"Confirm": "Confirm",
"Copied to clipboard successfully": "Copied to clipboard successfully",
@ -313,6 +314,7 @@
"Providers - Tooltip": "Providers to be configured, including 3rd-party login, object storage, verification code, etc.",
"Real name": "Real name",
"Records": "Records",
"Request URI": "Request URI",
"Resources": "Resources",
"Role": "Role",
"Role - Tooltip": "Role - Tooltip",
@ -357,6 +359,7 @@
"System Info": "System Info",
"There was a problem signing you in..": "There was a problem signing you in..",
"This is a read-only demo site!": "This is a read-only demo site!",
"Timestamp": "Timestamp",
"Tokens": "Tokens",
"Type": "Type",
"Type - Tooltip": "Type - Tooltip",
@ -858,6 +861,9 @@
"Wallets - Tooltip": "Wallets - Tooltip",
"admin (Shared)": "admin (Shared)"
},
"record": {
"Is triggered": "Is triggered"
},
"resource": {
"Copy Link": "Copy Link",
"File name": "File name",

View File

@ -196,6 +196,7 @@
"Cert - Tooltip": "Das Public-Key-Zertifikat, das vom Client-SDK, das mit dieser Anwendung korrespondiert, verifiziert werden muss",
"Certs": "Zertifikate",
"Click to Upload": "Klicken Sie zum Hochladen",
"Client IP": "Client IP",
"Close": "Schließen",
"Confirm": "Confirm",
"Copied to clipboard successfully": "Copied to clipboard successfully",
@ -313,6 +314,7 @@
"Providers - Tooltip": "Provider, die konfiguriert werden müssen, einschließlich Drittanbieter-Logins, Objektspeicherung, Verifizierungscode usw.",
"Real name": "Echter Name",
"Records": "Datensätze",
"Request URI": "Request URI",
"Resources": "Ressourcen",
"Role": "Role",
"Role - Tooltip": "Role - Tooltip",
@ -357,6 +359,7 @@
"System Info": "Systeminformationen",
"There was a problem signing you in..": "There was a problem signing you in..",
"This is a read-only demo site!": "Dies ist eine schreibgeschützte Demo-Seite!",
"Timestamp": "Timestamp",
"Tokens": "Token",
"Type": "Type",
"Type - Tooltip": "Type - Tooltip",
@ -858,6 +861,9 @@
"Wallets - Tooltip": "Wallets - Tooltip",
"admin (Shared)": "admin (Gemeinsam)"
},
"record": {
"Is triggered": "Is triggered"
},
"resource": {
"Copy Link": "Kopiere den Link",
"File name": "Dateiname",

View File

@ -196,6 +196,7 @@
"Cert - Tooltip": "The public key certificate that needs to be verified by the client SDK corresponding to this application",
"Certs": "Certs",
"Click to Upload": "Click to Upload",
"Client IP": "Client IP",
"Close": "Close",
"Confirm": "Confirm",
"Copied to clipboard successfully": "Copied to clipboard successfully",
@ -313,6 +314,7 @@
"Providers - Tooltip": "Providers to be configured, including 3rd-party login, object storage, verification code, etc.",
"Real name": "Real name",
"Records": "Records",
"Request URI": "Request URI",
"Resources": "Resources",
"Role": "Role",
"Role - Tooltip": "Role - Tooltip",
@ -357,6 +359,7 @@
"System Info": "System Info",
"There was a problem signing you in..": "There was a problem signing you in..",
"This is a read-only demo site!": "This is a read-only demo site!",
"Timestamp": "Timestamp",
"Tokens": "Tokens",
"Type": "Type",
"Type - Tooltip": "Type - Tooltip",
@ -858,6 +861,9 @@
"Wallets - Tooltip": "Wallets - Tooltip",
"admin (Shared)": "admin (Shared)"
},
"record": {
"Is triggered": "Is triggered"
},
"resource": {
"Copy Link": "Copy Link",
"File name": "File name",

View File

@ -196,6 +196,7 @@
"Cert - Tooltip": "El certificado de clave pública que necesita ser verificado por el SDK del cliente correspondiente a esta aplicación",
"Certs": "Certificaciones",
"Click to Upload": "Haz clic para cargar",
"Client IP": "Client IP",
"Close": "Cerca",
"Confirm": "Confirm",
"Copied to clipboard successfully": "Copied to clipboard successfully",
@ -313,6 +314,7 @@
"Providers - Tooltip": "Proveedores a configurar, incluyendo inicio de sesión de terceros, almacenamiento de objetos, código de verificación, etc.",
"Real name": "Nombre real",
"Records": "Registros",
"Request URI": "Request URI",
"Resources": "Recursos",
"Role": "Role",
"Role - Tooltip": "Role - Tooltip",
@ -357,6 +359,7 @@
"System Info": "Información del Sistema",
"There was a problem signing you in..": "There was a problem signing you in..",
"This is a read-only demo site!": "¡Este es un sitio de demostración solo de lectura!",
"Timestamp": "Timestamp",
"Tokens": "Tokens",
"Type": "Type",
"Type - Tooltip": "Type - Tooltip",
@ -858,6 +861,9 @@
"Wallets - Tooltip": "Wallets - Tooltip",
"admin (Shared)": "administrador (compartido)"
},
"record": {
"Is triggered": "Is triggered"
},
"resource": {
"Copy Link": "Copiar enlace",
"File name": "Nombre del archivo",

View File

@ -196,6 +196,7 @@
"Cert - Tooltip": "The public key certificate that needs to be verified by the client SDK corresponding to this application",
"Certs": "Certs",
"Click to Upload": "Click to Upload",
"Client IP": "Client IP",
"Close": "Close",
"Confirm": "Confirm",
"Copied to clipboard successfully": "Copied to clipboard successfully",
@ -313,6 +314,7 @@
"Providers - Tooltip": "Providers to be configured, including 3rd-party login, object storage, verification code, etc.",
"Real name": "Real name",
"Records": "Records",
"Request URI": "Request URI",
"Resources": "Resources",
"Role": "Role",
"Role - Tooltip": "Role - Tooltip",
@ -357,6 +359,7 @@
"System Info": "System Info",
"There was a problem signing you in..": "There was a problem signing you in..",
"This is a read-only demo site!": "This is a read-only demo site!",
"Timestamp": "Timestamp",
"Tokens": "Tokens",
"Type": "Type",
"Type - Tooltip": "Type - Tooltip",
@ -858,6 +861,9 @@
"Wallets - Tooltip": "Wallets - Tooltip",
"admin (Shared)": "admin (Shared)"
},
"record": {
"Is triggered": "Is triggered"
},
"resource": {
"Copy Link": "Copy Link",
"File name": "File name",

View File

@ -196,6 +196,7 @@
"Cert - Tooltip": "The public key certificate that needs to be verified by the client SDK corresponding to this application",
"Certs": "Certs",
"Click to Upload": "Click to Upload",
"Client IP": "Client IP",
"Close": "Close",
"Confirm": "Confirm",
"Copied to clipboard successfully": "Copied to clipboard successfully",
@ -313,6 +314,7 @@
"Providers - Tooltip": "Providers to be configured, including 3rd-party login, object storage, verification code, etc.",
"Real name": "Real name",
"Records": "Records",
"Request URI": "Request URI",
"Resources": "Resources",
"Role": "Role",
"Role - Tooltip": "Role - Tooltip",
@ -357,6 +359,7 @@
"System Info": "System Info",
"There was a problem signing you in..": "There was a problem signing you in..",
"This is a read-only demo site!": "This is a read-only demo site!",
"Timestamp": "Timestamp",
"Tokens": "Tokens",
"Type": "Type",
"Type - Tooltip": "Type - Tooltip",
@ -858,6 +861,9 @@
"Wallets - Tooltip": "Wallets - Tooltip",
"admin (Shared)": "admin (Shared)"
},
"record": {
"Is triggered": "Is triggered"
},
"resource": {
"Copy Link": "Copy Link",
"File name": "File name",

View File

@ -196,6 +196,7 @@
"Cert - Tooltip": "La clé publique du certificat qui doit être vérifiée par le kit de développement client correspondant à cette application",
"Certs": "Certificats",
"Click to Upload": "Cliquer pour télécharger",
"Client IP": "Client IP",
"Close": "Fermer",
"Confirm": "Confirmer",
"Copied to clipboard successfully": "Copied to clipboard successfully",
@ -313,6 +314,7 @@
"Providers - Tooltip": "Les fournisseurs à configurer, tels que la connexion via un service tiers, le stockage d'objets, le code de vérification, etc.",
"Real name": "Nom complet",
"Records": "Enregistrements",
"Request URI": "Request URI",
"Resources": "Ressources",
"Role": "Rôle",
"Role - Tooltip": "Rôle - Infobulle",
@ -357,6 +359,7 @@
"System Info": "Informations système",
"There was a problem signing you in..": "Un problème est survenu lors de votre connexion..",
"This is a read-only demo site!": "Ceci est un site de démonstration en lecture seule !",
"Timestamp": "Timestamp",
"Tokens": "Jetons",
"Type": "Type",
"Type - Tooltip": "Type - Infobulle",
@ -858,6 +861,9 @@
"Wallets - Tooltip": "Portefeuille - Infobulle",
"admin (Shared)": "admin (Partagé)"
},
"record": {
"Is triggered": "Is triggered"
},
"resource": {
"Copy Link": "Copier le lien",
"File name": "Nom de fichier",

View File

@ -196,6 +196,7 @@
"Cert - Tooltip": "The public key certificate that needs to be verified by the client SDK corresponding to this application",
"Certs": "Certs",
"Click to Upload": "Click to Upload",
"Client IP": "Client IP",
"Close": "Close",
"Confirm": "Confirm",
"Copied to clipboard successfully": "Copied to clipboard successfully",
@ -313,6 +314,7 @@
"Providers - Tooltip": "Providers to be configured, including 3rd-party login, object storage, verification code, etc.",
"Real name": "Real name",
"Records": "Records",
"Request URI": "Request URI",
"Resources": "Resources",
"Role": "Role",
"Role - Tooltip": "Role - Tooltip",
@ -357,6 +359,7 @@
"System Info": "System Info",
"There was a problem signing you in..": "There was a problem signing you in..",
"This is a read-only demo site!": "This is a read-only demo site!",
"Timestamp": "Timestamp",
"Tokens": "Tokens",
"Type": "Type",
"Type - Tooltip": "Type - Tooltip",
@ -858,6 +861,9 @@
"Wallets - Tooltip": "Wallets - Tooltip",
"admin (Shared)": "admin (Shared)"
},
"record": {
"Is triggered": "Is triggered"
},
"resource": {
"Copy Link": "Copy Link",
"File name": "File name",

View File

@ -196,6 +196,7 @@
"Cert - Tooltip": "Sertifikat kunci publik yang perlu diverifikasi oleh SDK klien yang sesuai dengan aplikasi ini",
"Certs": "Sertifikat",
"Click to Upload": "Klik untuk Mengunggah",
"Client IP": "Client IP",
"Close": "Tutup",
"Confirm": "Confirm",
"Copied to clipboard successfully": "Copied to clipboard successfully",
@ -313,6 +314,7 @@
"Providers - Tooltip": "Penyedia harus dikonfigurasi, termasuk login pihak ketiga, penyimpanan objek, kode verifikasi, dan lain-lain.",
"Real name": "Nama asli",
"Records": "Catatan",
"Request URI": "Request URI",
"Resources": "Sumber daya",
"Role": "Role",
"Role - Tooltip": "Role - Tooltip",
@ -357,6 +359,7 @@
"System Info": "Informasi Sistem",
"There was a problem signing you in..": "There was a problem signing you in..",
"This is a read-only demo site!": "Ini adalah situs demo hanya untuk dibaca saja!",
"Timestamp": "Timestamp",
"Tokens": "Token-token",
"Type": "Type",
"Type - Tooltip": "Type - Tooltip",
@ -858,6 +861,9 @@
"Wallets - Tooltip": "Wallets - Tooltip",
"admin (Shared)": "Admin (Berbagi)"
},
"record": {
"Is triggered": "Is triggered"
},
"resource": {
"Copy Link": "Salin Tautan",
"File name": "Nama file",

View File

@ -196,6 +196,7 @@
"Cert - Tooltip": "The public key certificate that needs to be verified by the client SDK corresponding to this application",
"Certs": "Certs",
"Click to Upload": "Click to Upload",
"Client IP": "Client IP",
"Close": "Close",
"Confirm": "Confirm",
"Copied to clipboard successfully": "Copied to clipboard successfully",
@ -313,6 +314,7 @@
"Providers - Tooltip": "Providers to be configured, including 3rd-party login, object storage, verification code, etc.",
"Real name": "Real name",
"Records": "Records",
"Request URI": "Request URI",
"Resources": "Resources",
"Role": "Role",
"Role - Tooltip": "Role - Tooltip",
@ -357,6 +359,7 @@
"System Info": "System Info",
"There was a problem signing you in..": "There was a problem signing you in..",
"This is a read-only demo site!": "This is a read-only demo site!",
"Timestamp": "Timestamp",
"Tokens": "Tokens",
"Type": "Type",
"Type - Tooltip": "Type - Tooltip",
@ -858,6 +861,9 @@
"Wallets - Tooltip": "Wallets - Tooltip",
"admin (Shared)": "admin (Shared)"
},
"record": {
"Is triggered": "Is triggered"
},
"resource": {
"Copy Link": "Copy Link",
"File name": "File name",

View File

@ -196,6 +196,7 @@
"Cert - Tooltip": "このアプリケーションに対応するクライアントSDKによって検証する必要がある公開鍵証明書",
"Certs": "証明書",
"Click to Upload": "アップロードするにはクリックしてください",
"Client IP": "Client IP",
"Close": "閉じる",
"Confirm": "Confirm",
"Copied to clipboard successfully": "Copied to clipboard successfully",
@ -313,6 +314,7 @@
"Providers - Tooltip": "設定するプロバイダーには、サードパーティのログイン、オブジェクトストレージ、検証コードなどが含まれます。",
"Real name": "本名",
"Records": "記録",
"Request URI": "Request URI",
"Resources": "リソース",
"Role": "Role",
"Role - Tooltip": "Role - Tooltip",
@ -357,6 +359,7 @@
"System Info": "システム情報",
"There was a problem signing you in..": "There was a problem signing you in..",
"This is a read-only demo site!": "これは読み取り専用のデモサイトです!",
"Timestamp": "Timestamp",
"Tokens": "トークン",
"Type": "Type",
"Type - Tooltip": "Type - Tooltip",
@ -858,6 +861,9 @@
"Wallets - Tooltip": "Wallets - Tooltip",
"admin (Shared)": "管理者(共有)"
},
"record": {
"Is triggered": "Is triggered"
},
"resource": {
"Copy Link": "コピー リンク",
"File name": "ファイル名",

View File

@ -196,6 +196,7 @@
"Cert - Tooltip": "The public key certificate that needs to be verified by the client SDK corresponding to this application",
"Certs": "Certs",
"Click to Upload": "Click to Upload",
"Client IP": "Client IP",
"Close": "Close",
"Confirm": "Confirm",
"Copied to clipboard successfully": "Copied to clipboard successfully",
@ -313,6 +314,7 @@
"Providers - Tooltip": "Providers to be configured, including 3rd-party login, object storage, verification code, etc.",
"Real name": "Real name",
"Records": "Records",
"Request URI": "Request URI",
"Resources": "Resources",
"Role": "Role",
"Role - Tooltip": "Role - Tooltip",
@ -357,6 +359,7 @@
"System Info": "System Info",
"There was a problem signing you in..": "There was a problem signing you in..",
"This is a read-only demo site!": "This is a read-only demo site!",
"Timestamp": "Timestamp",
"Tokens": "Tokens",
"Type": "Type",
"Type - Tooltip": "Type - Tooltip",
@ -858,6 +861,9 @@
"Wallets - Tooltip": "Wallets - Tooltip",
"admin (Shared)": "admin (Shared)"
},
"record": {
"Is triggered": "Is triggered"
},
"resource": {
"Copy Link": "Copy Link",
"File name": "File name",

View File

@ -196,6 +196,7 @@
"Cert - Tooltip": "이 응용 프로그램에 해당하는 클라이언트 SDK에서 확인해야 하는 공개 키 인증서",
"Certs": "증명서",
"Click to Upload": "클릭하여 업로드하세요",
"Client IP": "Client IP",
"Close": "닫다",
"Confirm": "Confirm",
"Copied to clipboard successfully": "Copied to clipboard successfully",
@ -313,6 +314,7 @@
"Providers - Tooltip": "공급 업체는 구성되어야합니다. 3rd-party 로그인, 객체 저장소, 검증 코드 등을 포함합니다.",
"Real name": "실명",
"Records": "기록",
"Request URI": "Request URI",
"Resources": "자원",
"Role": "Role",
"Role - Tooltip": "Role - Tooltip",
@ -357,6 +359,7 @@
"System Info": "시스템 정보",
"There was a problem signing you in..": "There was a problem signing you in..",
"This is a read-only demo site!": "이것은 읽기 전용 데모 사이트입니다!",
"Timestamp": "Timestamp",
"Tokens": "토큰",
"Type": "Type",
"Type - Tooltip": "Type - Tooltip",
@ -858,6 +861,9 @@
"Wallets - Tooltip": "Wallets - Tooltip",
"admin (Shared)": "관리자 (공유)"
},
"record": {
"Is triggered": "Is triggered"
},
"resource": {
"Copy Link": "링크 복사하기",
"File name": "파일 이름",

View File

@ -196,6 +196,7 @@
"Cert - Tooltip": "The public key certificate that needs to be verified by the client SDK corresponding to this application",
"Certs": "Certs",
"Click to Upload": "Click to Upload",
"Client IP": "Client IP",
"Close": "Close",
"Confirm": "Confirm",
"Copied to clipboard successfully": "Copied to clipboard successfully",
@ -313,6 +314,7 @@
"Providers - Tooltip": "Providers to be configured, including 3rd-party login, object storage, verification code, etc.",
"Real name": "Real name",
"Records": "Records",
"Request URI": "Request URI",
"Resources": "Resources",
"Role": "Role",
"Role - Tooltip": "Role - Tooltip",
@ -357,6 +359,7 @@
"System Info": "System Info",
"There was a problem signing you in..": "There was a problem signing you in..",
"This is a read-only demo site!": "This is a read-only demo site!",
"Timestamp": "Timestamp",
"Tokens": "Tokens",
"Type": "Type",
"Type - Tooltip": "Type - Tooltip",
@ -858,6 +861,9 @@
"Wallets - Tooltip": "Wallets - Tooltip",
"admin (Shared)": "admin (Shared)"
},
"record": {
"Is triggered": "Is triggered"
},
"resource": {
"Copy Link": "Copy Link",
"File name": "File name",

View File

@ -196,6 +196,7 @@
"Cert - Tooltip": "The public key certificate that needs to be verified by the client SDK corresponding to this application",
"Certs": "Certs",
"Click to Upload": "Click to Upload",
"Client IP": "Client IP",
"Close": "Close",
"Confirm": "Confirm",
"Copied to clipboard successfully": "Copied to clipboard successfully",
@ -313,6 +314,7 @@
"Providers - Tooltip": "Providers to be configured, including 3rd-party login, object storage, verification code, etc.",
"Real name": "Real name",
"Records": "Records",
"Request URI": "Request URI",
"Resources": "Resources",
"Role": "Role",
"Role - Tooltip": "Role - Tooltip",
@ -357,6 +359,7 @@
"System Info": "System Info",
"There was a problem signing you in..": "There was a problem signing you in..",
"This is a read-only demo site!": "This is a read-only demo site!",
"Timestamp": "Timestamp",
"Tokens": "Tokens",
"Type": "Type",
"Type - Tooltip": "Type - Tooltip",
@ -858,6 +861,9 @@
"Wallets - Tooltip": "Wallets - Tooltip",
"admin (Shared)": "admin (Shared)"
},
"record": {
"Is triggered": "Is triggered"
},
"resource": {
"Copy Link": "Copy Link",
"File name": "File name",

View File

@ -196,6 +196,7 @@
"Cert - Tooltip": "The public key certificate that needs to be verified by the client SDK corresponding to this application",
"Certs": "Certs",
"Click to Upload": "Click to Upload",
"Client IP": "Client IP",
"Close": "Close",
"Confirm": "Confirm",
"Copied to clipboard successfully": "Copied to clipboard successfully",
@ -313,6 +314,7 @@
"Providers - Tooltip": "Providers to be configured, including 3rd-party login, object storage, verification code, etc.",
"Real name": "Real name",
"Records": "Records",
"Request URI": "Request URI",
"Resources": "Resources",
"Role": "Role",
"Role - Tooltip": "Role - Tooltip",
@ -357,6 +359,7 @@
"System Info": "System Info",
"There was a problem signing you in..": "There was a problem signing you in..",
"This is a read-only demo site!": "This is a read-only demo site!",
"Timestamp": "Timestamp",
"Tokens": "Tokens",
"Type": "Type",
"Type - Tooltip": "Type - Tooltip",
@ -858,6 +861,9 @@
"Wallets - Tooltip": "Wallets - Tooltip",
"admin (Shared)": "admin (Shared)"
},
"record": {
"Is triggered": "Is triggered"
},
"resource": {
"Copy Link": "Copy Link",
"File name": "File name",

View File

@ -196,6 +196,7 @@
"Cert - Tooltip": "O certificado da chave pública que precisa ser verificado pelo SDK do cliente correspondente a esta aplicação",
"Certs": "Certificados",
"Click to Upload": "Clique para Enviar",
"Client IP": "Client IP",
"Close": "Fechar",
"Confirm": "Confirmar",
"Copied to clipboard successfully": "Copiado para a área de transferência com sucesso",
@ -313,6 +314,7 @@
"Providers - Tooltip": "Provedores a serem configurados, incluindo login de terceiros, armazenamento de objetos, código de verificação, etc.",
"Real name": "Nome real",
"Records": "Registros",
"Request URI": "Request URI",
"Resources": "Recursos",
"Role": "Role",
"Role - Tooltip": "Role - Tooltip",
@ -357,6 +359,7 @@
"System Info": "Informações do Sistema",
"There was a problem signing you in..": "Ocorreu um problema ao fazer o login.",
"This is a read-only demo site!": "Este é um site de demonstração apenas para leitura!",
"Timestamp": "Timestamp",
"Tokens": "Tokens",
"Type": "Tipo",
"Type - Tooltip": "Type - Tooltip",
@ -858,6 +861,9 @@
"Wallets - Tooltip": "Wallets - Tooltip",
"admin (Shared)": "admin (Compartilhado)"
},
"record": {
"Is triggered": "Is triggered"
},
"resource": {
"Copy Link": "Copiar Link",
"File name": "Nome do arquivo",

View File

@ -196,6 +196,7 @@
"Cert - Tooltip": "Сертификат открытого ключа, который требуется проверить клиентским SDK, соответствующим этому приложению",
"Certs": "сертификаты",
"Click to Upload": "Нажмите, чтобы загрузить",
"Client IP": "Client IP",
"Close": "Близко",
"Confirm": "Подтвердить",
"Copied to clipboard successfully": "Copied to clipboard successfully",
@ -313,6 +314,7 @@
"Providers - Tooltip": "Провайдеры должны быть настроены, включая вход с помощью сторонних сервисов, объектное хранилище, код подтверждения и т.д.",
"Real name": "Реальное имя",
"Records": "Записи",
"Request URI": "Request URI",
"Resources": "Ресурсы",
"Role": "Роль",
"Role - Tooltip": "Role - Tooltip",
@ -357,6 +359,7 @@
"System Info": "Системная информация",
"There was a problem signing you in..": "Возникла проблема с регистрацией..",
"This is a read-only demo site!": "Это демонстрационный сайт только для чтения!",
"Timestamp": "Timestamp",
"Tokens": "Токены",
"Type": "Type",
"Type - Tooltip": "Type - Tooltip",
@ -858,6 +861,9 @@
"Wallets - Tooltip": "Wallets - Tooltip",
"admin (Shared)": "администратор (общий)"
},
"record": {
"Is triggered": "Is triggered"
},
"resource": {
"Copy Link": "Копировать ссылку",
"File name": "Имя файла",

View File

@ -196,6 +196,7 @@
"Cert - Tooltip": "The public key certificate that needs to be verified by the client SDK corresponding to this application",
"Certs": "Certs",
"Click to Upload": "Click to Upload",
"Client IP": "Client IP",
"Close": "Close",
"Confirm": "Confirm",
"Copied to clipboard successfully": "Copied to clipboard successfully",
@ -313,6 +314,7 @@
"Providers - Tooltip": "Providers to be configured, including 3rd-party login, object storage, verification code, etc.",
"Real name": "Real name",
"Records": "Records",
"Request URI": "Request URI",
"Resources": "Resources",
"Role": "Role",
"Role - Tooltip": "Role - Tooltip",
@ -357,6 +359,7 @@
"System Info": "System Info",
"There was a problem signing you in..": "There was a problem signing you in..",
"This is a read-only demo site!": "This is a read-only demo site!",
"Timestamp": "Timestamp",
"Tokens": "Tokens",
"Type": "Type",
"Type - Tooltip": "Type - Tooltip",
@ -858,6 +861,9 @@
"Wallets - Tooltip": "Wallets - Tooltip",
"admin (Shared)": "admin (Shared)"
},
"record": {
"Is triggered": "Is triggered"
},
"resource": {
"Copy Link": "Copy Link",
"File name": "File name",

View File

@ -196,6 +196,7 @@
"Cert - Tooltip": "The public key certificate that needs to be verified by the client SDK corresponding to this application",
"Certs": "Certs",
"Click to Upload": "Yüklemek için tıklayın",
"Client IP": "Client IP",
"Close": "Kapat",
"Confirm": "Onayla",
"Copied to clipboard successfully": "Başarıyla kopyalandı",
@ -313,6 +314,7 @@
"Providers - Tooltip": "Providers to be configured, including 3rd-party login, object storage, verification code, etc.",
"Real name": "Gerçek isim",
"Records": "Records",
"Request URI": "Request URI",
"Resources": "Resources",
"Role": "Role",
"Role - Tooltip": "Role - Tooltip",
@ -357,6 +359,7 @@
"System Info": "Sistem Bilgisi",
"There was a problem signing you in..": "Oturumunuz açılırken bir sorun oluştu..",
"This is a read-only demo site!": "Bu site sadece görüntüleme amaçlıdır!",
"Timestamp": "Timestamp",
"Tokens": "Tokens",
"Type": "Type",
"Type - Tooltip": "Type - Tooltip",
@ -858,6 +861,9 @@
"Wallets - Tooltip": "Wallets - Tooltip",
"admin (Shared)": "admin (Shared)"
},
"record": {
"Is triggered": "Is triggered"
},
"resource": {
"Copy Link": "Copy Link",
"File name": "File name",

View File

@ -196,6 +196,7 @@
"Cert - Tooltip": "The public key certificate that needs to be verified by the client SDK corresponding to this application",
"Certs": "Certs",
"Click to Upload": "Click to Upload",
"Client IP": "Client IP",
"Close": "Close",
"Confirm": "Confirm",
"Copied to clipboard successfully": "Copied to clipboard successfully",
@ -313,6 +314,7 @@
"Providers - Tooltip": "Providers to be configured, including 3rd-party login, object storage, verification code, etc.",
"Real name": "Real name",
"Records": "Records",
"Request URI": "Request URI",
"Resources": "Resources",
"Role": "Role",
"Role - Tooltip": "Role - Tooltip",
@ -357,6 +359,7 @@
"System Info": "System Info",
"There was a problem signing you in..": "There was a problem signing you in..",
"This is a read-only demo site!": "This is a read-only demo site!",
"Timestamp": "Timestamp",
"Tokens": "Tokens",
"Type": "Type",
"Type - Tooltip": "Type - Tooltip",
@ -858,6 +861,9 @@
"Wallets - Tooltip": "Wallets - Tooltip",
"admin (Shared)": "admin (Shared)"
},
"record": {
"Is triggered": "Is triggered"
},
"resource": {
"Copy Link": "Copy Link",
"File name": "File name",

View File

@ -196,6 +196,7 @@
"Cert - Tooltip": "Chứng chỉ khóa công khai cần được xác minh bởi SDK khách hàng tương ứng với ứng dụng này",
"Certs": "Chứng chỉ",
"Click to Upload": "Nhấp để tải lên",
"Client IP": "Client IP",
"Close": "Đóng lại",
"Confirm": "Confirm",
"Copied to clipboard successfully": "Copied to clipboard successfully",
@ -313,6 +314,7 @@
"Providers - Tooltip": "Các nhà cung cấp phải được cấu hình, bao gồm đăng nhập bên thứ ba, lưu trữ đối tượng, mã xác minh, v.v.",
"Real name": "Tên thật",
"Records": "Hồ sơ",
"Request URI": "Request URI",
"Resources": "Tài nguyên",
"Role": "Role",
"Role - Tooltip": "Role - Tooltip",
@ -357,6 +359,7 @@
"System Info": "Thông tin hệ thống",
"There was a problem signing you in..": "There was a problem signing you in..",
"This is a read-only demo site!": "Đây là trang web giới thiệu chỉ có chức năng đọc!",
"Timestamp": "Timestamp",
"Tokens": "Mã thông báo",
"Type": "Type",
"Type - Tooltip": "Type - Tooltip",
@ -858,6 +861,9 @@
"Wallets - Tooltip": "Wallets - Tooltip",
"admin (Shared)": "quản trị viên (Chung)"
},
"record": {
"Is triggered": "Is triggered"
},
"resource": {
"Copy Link": "Sao chép liên kết",
"File name": "Tên tập tin",

View File

@ -196,6 +196,7 @@
"Cert - Tooltip": "该应用所对应的客户端SDK需要验证的公钥证书",
"Certs": "证书",
"Click to Upload": "点击上传",
"Client IP": "客户端IP",
"Close": "关闭",
"Confirm": "确认",
"Copied to clipboard successfully": "已成功复制到剪贴板",
@ -313,6 +314,7 @@
"Providers - Tooltip": "需要配置的提供商,包括第三方登录、对象存储、验证码等",
"Real name": "姓名",
"Records": "日志",
"Request URI": "请求URI",
"Resources": "资源",
"Role": "角色",
"Role - Tooltip": "所对应的角色",
@ -357,6 +359,7 @@
"System Info": "系统信息",
"There was a problem signing you in..": "登录时遇到问题..",
"This is a read-only demo site!": "这是一个只读演示站点!",
"Timestamp": "时间",
"Tokens": "令牌",
"Type": "类型",
"Type - Tooltip": "类型",
@ -858,6 +861,9 @@
"Wallets - Tooltip": "钱包 - 工具提示",
"admin (Shared)": "admin共享"
},
"record": {
"Is triggered": "是否触发"
},
"resource": {
"Copy Link": "复制链接",
"File name": "文件名",