From ae4ab9902b18924cf977754c674b1fd48595aae4 Mon Sep 17 00:00:00 2001 From: Gucheng Wang Date: Sat, 18 Jun 2022 01:41:21 +0800 Subject: [PATCH] Add accountTable. --- object/init.go | 25 +++ object/organization.go | 9 + web/src/AccountTable.js | 242 +++++++++++++++++++++++++ web/src/OrganizationEditPage.js | 13 ++ web/src/OrganizationListPage.js | 25 +++ web/src/SignupTable.js | 2 +- web/src/UserEditPage.js | 310 +++++++++++++++++++++----------- web/src/locales/de/data.json | 10 +- web/src/locales/en/data.json | 10 +- web/src/locales/fr/data.json | 10 +- web/src/locales/ja/data.json | 10 +- web/src/locales/ko/data.json | 10 +- web/src/locales/ru/data.json | 10 +- web/src/locales/zh/data.json | 10 +- 14 files changed, 566 insertions(+), 130 deletions(-) create mode 100644 web/src/AccountTable.js diff --git a/object/init.go b/object/init.go index 339500d8..917bdd71 100644 --- a/object/init.go +++ b/object/init.go @@ -47,6 +47,31 @@ func initBuiltInOrganization() bool { PhonePrefix: "86", DefaultAvatar: "https://casbin.org/img/casbin.svg", Tags: []string{}, + AccountItems: []*AccountItem{ + {Name: "Organization", Visible: true, ViewRule: "Public", ModifyRule: "Admin"}, + {Name: "ID", Visible: true, ViewRule: "Public", ModifyRule: "Immutable"}, + {Name: "Name", Visible: true, ViewRule: "Public", ModifyRule: "Admin"}, + {Name: "Display name", Visible: true, ViewRule: "Public", ModifyRule: "Self"}, + {Name: "Avatar", Visible: true, ViewRule: "Public", ModifyRule: "Self"}, + {Name: "User type", Visible: true, ViewRule: "Public", ModifyRule: "Admin"}, + {Name: "Password", Visible: true, ViewRule: "Self", ModifyRule: "Self"}, + {Name: "Email", Visible: true, ViewRule: "Public", ModifyRule: "Self"}, + {Name: "Phone", Visible: true, ViewRule: "Public", ModifyRule: "Self"}, + {Name: "Country/Region", Visible: true, ViewRule: "Public", ModifyRule: "Self"}, + {Name: "Location", Visible: true, ViewRule: "Public", ModifyRule: "Self"}, + {Name: "Affiliation", Visible: true, ViewRule: "Public", ModifyRule: "Self"}, + {Name: "Title", Visible: true, ViewRule: "Public", ModifyRule: "Self"}, + {Name: "Homepage", Visible: true, ViewRule: "Public", ModifyRule: "Self"}, + {Name: "Bio", Visible: true, ViewRule: "Public", ModifyRule: "Self"}, + {Name: "Tag", Visible: true, ViewRule: "Public", ModifyRule: "Admin"}, + {Name: "Signup application", Visible: true, ViewRule: "Public", ModifyRule: "Admin"}, + {Name: "3rd-party logins", Visible: true, ViewRule: "Self", ModifyRule: "Self"}, + {Name: "Properties", Visible: false, ViewRule: "Admin", ModifyRule: "Admin"}, + {Name: "Is admin", Visible: true, ViewRule: "Admin", ModifyRule: "Admin"}, + {Name: "Is global admin", Visible: true, ViewRule: "Admin", ModifyRule: "Admin"}, + {Name: "Is forbidden", Visible: true, ViewRule: "Admin", ModifyRule: "Admin"}, + {Name: "Is deleted", Visible: true, ViewRule: "Admin", ModifyRule: "Admin"}, + }, } AddOrganization(organization) return false diff --git a/object/organization.go b/object/organization.go index e5ec48d9..20aeb222 100644 --- a/object/organization.go +++ b/object/organization.go @@ -20,6 +20,13 @@ import ( "xorm.io/core" ) +type AccountItem struct { + Name string `json:"name"` + Visible bool `json:"visible"` + ViewRule string `json:"viewRule"` + ModifyRule string `json:"modifyRule"` +} + type Organization struct { Owner string `xorm:"varchar(100) notnull pk" json:"owner"` Name string `xorm:"varchar(100) notnull pk" json:"name"` @@ -36,6 +43,8 @@ type Organization struct { MasterPassword string `xorm:"varchar(100)" json:"masterPassword"` EnableSoftDeletion bool `json:"enableSoftDeletion"` IsProfilePublic bool `json:"isProfilePublic"` + + AccountItems []*AccountItem `xorm:"varchar(2000)" json:"accountItems"` } func GetOrganizationCount(owner, field, value string) int { diff --git a/web/src/AccountTable.js b/web/src/AccountTable.js new file mode 100644 index 00000000..49405adb --- /dev/null +++ b/web/src/AccountTable.js @@ -0,0 +1,242 @@ +// Copyright 2022 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 {DownOutlined, DeleteOutlined, UpOutlined} from '@ant-design/icons'; +import {Button, Col, Row, Select, Switch, Table, Tooltip} from 'antd'; +import * as Setting from "./Setting"; +import i18next from "i18next"; + +const { Option } = Select; + +class AccountTable extends React.Component { + constructor(props) { + super(props); + this.state = { + classes: props, + }; + } + + updateTable(table) { + this.props.onUpdateTable(table); + } + + updateField(table, index, key, value) { + table[index][key] = value; + this.updateTable(table); + } + + addRow(table) { + let row = {name: Setting.getNewRowNameForTable(table, "Please select an account item"), visible: true}; + if (table === undefined) { + table = []; + } + table = Setting.addRow(table, row); + this.updateTable(table); + } + + deleteRow(table, i) { + table = Setting.deleteRow(table, i); + this.updateTable(table); + } + + upRow(table, i) { + table = Setting.swapRow(table, i - 1, i); + this.updateTable(table); + } + + downRow(table, i) { + table = Setting.swapRow(table, i, i + 1); + this.updateTable(table); + } + + renderTable(table) { + const columns = [ + { + title: i18next.t("provider:Name"), + dataIndex: 'name', + key: 'name', + render: (text, record, index) => { + const items = [ + {name: "Organization", displayName: i18next.t("general:Organization")}, + {name: "ID", displayName: i18next.t("general:ID")}, + {name: "Name", displayName: i18next.t("general:Name")}, + {name: "Display name", displayName: i18next.t("general:Display name")}, + {name: "Avatar", displayName: i18next.t("general:Avatar")}, + {name: "User type", displayName: i18next.t("general:User type")}, + {name: "Password", displayName: i18next.t("general:Password")}, + {name: "Email", displayName: i18next.t("general:Email")}, + {name: "Phone", displayName: i18next.t("general:Phone")}, + {name: "Country/Region", displayName: i18next.t("user:Country/Region")}, + {name: "Location", displayName: i18next.t("user:Location")}, + {name: "Affiliation", displayName: i18next.t("user:Affiliation")}, + {name: "Title", displayName: i18next.t("user:Title")}, + {name: "Homepage", displayName: i18next.t("user:Homepage")}, + {name: "Bio", displayName: i18next.t("user:Bio")}, + {name: "Tag", displayName: i18next.t("user:Tag")}, + {name: "Signup application", displayName: i18next.t("general:Signup application")}, + {name: "3rd-party logins", displayName: i18next.t("user:3rd-party logins")}, + {name: "Properties", displayName: i18next.t("user:Properties")}, + {name: "Is admin", displayName: i18next.t("user:Is admin")}, + {name: "Is global admin", displayName: i18next.t("user:Is global admin")}, + {name: "Is forbidden", displayName: i18next.t("user:Is forbidden")}, + {name: "Is deleted", displayName: i18next.t("user:Is deleted")}, + ]; + + const getItemDisplayName = (text) => { + const item = items.filter(item => item.name === text); + if (item.length === 0) { + return ""; + } + return item[0].displayName; + }; + + return ( + + ) + } + }, + { + title: i18next.t("provider:visible"), + dataIndex: 'visible', + key: 'visible', + width: '120px', + render: (text, record, index) => { + return ( + { + this.updateField(table, index, 'visible', checked); + }} /> + ) + } + }, + { + title: i18next.t("organization:viewRule"), + dataIndex: 'viewRule', + key: 'viewRule', + width: '155px', + render: (text, record, index) => { + if (!record.visible) { + return null; + } + + let options = [ + {id: 'Public', name: 'Public'}, + {id: 'Self', name: 'Self'}, + {id: 'Admin', name: 'Admin'}, + ]; + + return ( + + ) + } + }, + { + title: i18next.t("organization:modifyRule"), + dataIndex: 'modifyRule', + key: 'modifyRule', + width: '155px', + render: (text, record, index) => { + if (!record.visible) { + return null; + } + + let options; + if (record.viewRule === "Admin") { + options = [ + {id: 'Admin', name: 'Admin'}, + {id: 'Immutable', name: 'Immutable'}, + ]; + } else { + options = [ + {id: 'Self', name: 'Self'}, + {id: 'Admin', name: 'Admin'}, + {id: 'Immutable', name: 'Immutable'}, + ]; + } + + return ( + + ) + } + }, + { + title: i18next.t("general:Action"), + key: 'action', + width: '100px', + render: (text, record, index) => { + return ( +
+ +
+ ); + } + }, + ]; + + return ( + ( +
+ {this.props.title}     + +
+ )} + /> + ); + } + + render() { + return ( +
+ +
+ { + this.renderTable(this.props.table) + } + + + + ) + } +} + +export default AccountTable; diff --git a/web/src/OrganizationEditPage.js b/web/src/OrganizationEditPage.js index 1e4e0330..427d9191 100644 --- a/web/src/OrganizationEditPage.js +++ b/web/src/OrganizationEditPage.js @@ -20,6 +20,7 @@ import * as Setting from "./Setting"; import i18next from "i18next"; import {LinkOutlined} from "@ant-design/icons"; import LdapTable from "./LdapTable"; +import AccountTable from "./AccountTable"; const { Option } = Select; @@ -250,6 +251,18 @@ class OrganizationEditPage extends React.Component { }} /> + + + {Setting.getLabel(i18next.t("organization:Account items"), i18next.t("organization:Account items - Tooltip"))} : + + + { this.updateOrganizationField('accountItems', value)}} + /> + + {Setting.getLabel(i18next.t("general:LDAPs"), i18next.t("general:LDAPs - Tooltip"))} : diff --git a/web/src/OrganizationListPage.js b/web/src/OrganizationListPage.js index a3f6d8fa..98d075d5 100644 --- a/web/src/OrganizationListPage.js +++ b/web/src/OrganizationListPage.js @@ -40,6 +40,31 @@ class OrganizationListPage extends BaseListPage { masterPassword: "", enableSoftDeletion: false, isProfilePublic: true, + accountItems: [ + {name: "Organization", visible: true, viewRule: "Public", modifyRule: "Admin"}, + {name: "ID", visible: true, viewRule: "Public", modifyRule: "Immutable"}, + {name: "Name", visible: true, viewRule: "Public", modifyRule: "Admin"}, + {name: "Display name", visible: true, viewRule: "Public", modifyRule: "Self"}, + {name: "Avatar", visible: true, viewRule: "Public", modifyRule: "Self"}, + {name: "User type", visible: true, viewRule: "Public", modifyRule: "Admin"}, + {name: "Password", visible: true, viewRule: "Self", modifyRule: "Self"}, + {name: "Email", visible: true, viewRule: "Public", modifyRule: "Self"}, + {name: "Phone", visible: true, viewRule: "Public", modifyRule: "Self"}, + {name: "Country/Region", visible: true, viewRule: "Public", modifyRule: "Self"}, + {name: "Location", visible: true, viewRule: "Public", modifyRule: "Self"}, + {name: "Affiliation", visible: true, viewRule: "Public", modifyRule: "Self"}, + {name: "Title", visible: true, viewRule: "Public", modifyRule: "Self"}, + {name: "Homepage", visible: true, viewRule: "Public", modifyRule: "Self"}, + {name: "Bio", visible: true, viewRule: "Public", modifyRule: "Self"}, + {name: "Tag", visible: true, viewRule: "Public", modifyRule: "Admin"}, + {name: "Signup application", visible: true, viewRule: "Public", modifyRule: "Admin"}, + {name: "3rd-party logins", visible: true, viewRule: "Self", modifyRule: "Self"}, + {name: "Properties", visible: false, viewRule: "Admin", modifyRule: "Admin"}, + {name: "Is admin", visible: true, viewRule: "Admin", modifyRule: "Admin"}, + {name: "Is global admin", visible: true, viewRule: "Admin", modifyRule: "Admin"}, + {name: "Is forbidden", visible: true, viewRule: "Admin", modifyRule: "Admin"}, + {name: "Is deleted", visible: true, viewRule: "Admin", modifyRule: "Admin"}, + ], } } diff --git a/web/src/SignupTable.js b/web/src/SignupTable.js index 2093a973..508d6092 100644 --- a/web/src/SignupTable.js +++ b/web/src/SignupTable.js @@ -164,7 +164,7 @@ class SignupTable extends React.Component { } }, { - title: i18next.t("provider:rule"), + title: i18next.t("application:rule"), dataIndex: 'rule', key: 'rule', width: '155px', diff --git a/web/src/UserEditPage.js b/web/src/UserEditPage.js index 9aca455d..d5a9e73e 100644 --- a/web/src/UserEditPage.js +++ b/web/src/UserEditPage.js @@ -28,10 +28,10 @@ import OAuthWidget from "./common/OAuthWidget"; import SamlWidget from "./common/SamlWidget"; import SelectRegionBox from "./SelectRegionBox"; -// import {Controlled as CodeMirror} from 'react-codemirror2'; -// import "codemirror/lib/codemirror.css"; -// require('codemirror/theme/material-darker.css'); -// require("codemirror/mode/javascript/javascript"); +import {Controlled as CodeMirror} from 'react-codemirror2'; +import "codemirror/lib/codemirror.css"; +require('codemirror/theme/material-darker.css'); +require("codemirror/mode/javascript/javascript"); const { Option } = Select; @@ -124,46 +124,78 @@ class UserEditPage extends React.Component { return (this.state.user.id === this.props.account?.id) || Setting.isAdminUser(this.props.account); } - renderUser() { - return ( - - {this.state.mode === "add" ? i18next.t("user:New User") : i18next.t("user:Edit User")}     - - - {this.state.mode === "add" ? : null} - - } style={(Setting.isMobile())? {margin: '5px'}:{}} type="inner"> + renderAccountItem(accountItem) { + if (!accountItem.visible) { + return null; + } + + const isSelf = this.state.user.id === this.props.account; + const isAdmin = Setting.isAdminUser(this.props.account); + + if (accountItem.viewRule === "Self") { + if (!isSelf && !isAdmin) { + return null; + } + } else if (accountItem.viewRule === "Admin") { + if (!isAdmin) { + return null; + } + } + + let disabled = false; + if (accountItem.modifyRule === "Self") { + if (!isSelf && !isAdmin) { + disabled = true; + } + } else if (accountItem.modifyRule === "Admin") { + if (!isAdmin) { + disabled = true; + } + } else if (accountItem.modifyRule === "Immutable") { + disabled = true; + } + + if (accountItem.name === "Organization") { + return ( {Setting.getLabel(i18next.t("general:Organization"), i18next.t("general:Organization - Tooltip"))} : - {this.updateUserField('owner', value);})}> { this.state.organizations.map((organization, index) => ) } + ) + } else if (accountItem.name === "ID") { + return ( {Setting.getLabel("ID", i18next.t("general:ID - Tooltip"))} : - + + ) + } else if (accountItem.name === "Name") { + return ( {Setting.getLabel(i18next.t("general:Name"), i18next.t("general:Name - Tooltip"))} : - { + { this.updateUserField('name', e.target.value); }} /> + ) + } else if (accountItem.name === "Display name") { + return ( {Setting.getLabel(i18next.t("general:Display name"), i18next.t("general:Display name - Tooltip"))} : @@ -174,6 +206,9 @@ class UserEditPage extends React.Component { }} /> + ) + } else if (accountItem.name === "Avatar") { + return ( {Setting.getLabel(i18next.t("general:Avatar"), i18next.t("general:Avatar - Tooltip"))} : @@ -204,6 +239,9 @@ class UserEditPage extends React.Component { + ) + } else if (accountItem.name === "User type") { + return ( {Setting.getLabel(i18next.t("general:User type"), i18next.t("general:User type - Tooltip"))} : @@ -217,44 +255,56 @@ class UserEditPage extends React.Component { + ) + } else if (accountItem.name === "Password") { + return ( {Setting.getLabel(i18next.t("general:Password"), i18next.t("general:Password - Tooltip"))} : - + + ) + } else if (accountItem.name === "Email") { + return ( {Setting.getLabel(i18next.t("general:Email"), i18next.t("general:Email - Tooltip"))} : { - this.updateUserField('email', e.target.value); - }} /> + this.updateUserField('email', e.target.value); + }} /> { this.state.user.id === this.props.account?.id ? () : null} + ) + } else if (accountItem.name === "Phone") { + return ( {Setting.getLabel(i18next.t("general:Phone"), i18next.t("general:Phone - Tooltip"))} : { - this.updateUserField('phone', e.target.value); + this.updateUserField('phone', e.target.value); }}/> { this.state.user.id === this.props.account?.id ? () : null} + ) + } else if (accountItem.name === "Country/Region") { + return ( {Setting.getLabel(i18next.t("user:Country/Region"), i18next.t("user:Country/Region - Tooltip"))} : @@ -265,6 +315,9 @@ class UserEditPage extends React.Component { }} /> + ) + } else if (accountItem.name === "Location") { + return ( {Setting.getLabel(i18next.t("user:Location"), i18next.t("user:Location - Tooltip"))} : @@ -275,11 +328,15 @@ class UserEditPage extends React.Component { }} /> - { - (this.state.application === null || this.state.user === null) ? null : ( - { return this.updateUserField(key, value)}} /> - ) - } + ) + } else if (accountItem.name === "Affiliation") { + return ( + (this.state.application === null || this.state.user === null) ? null : ( + { return this.updateUserField(key, value)}} /> + ) + ) + } else if (accountItem.name === "Title") { + return ( {Setting.getLabel(i18next.t("user:Title"), i18next.t("user:Title - Tooltip"))} : @@ -290,6 +347,9 @@ class UserEditPage extends React.Component { }} /> + ) + } else if (accountItem.name === "Homepage") { + return ( {Setting.getLabel(i18next.t("user:Homepage"), i18next.t("user:Homepage - Tooltip"))} : @@ -300,6 +360,9 @@ class UserEditPage extends React.Component { }} /> + ) + } else if (accountItem.name === "Bio") { + return ( {Setting.getLabel(i18next.t("user:Bio"), i18next.t("user:Bio - Tooltip"))} : @@ -310,6 +373,9 @@ class UserEditPage extends React.Component { }} /> + ) + } else if (accountItem.name === "Tag") { + return ( {Setting.getLabel(i18next.t("user:Tag"), i18next.t("user:Tag - Tooltip"))} : @@ -335,102 +401,130 @@ class UserEditPage extends React.Component { } + ) + } else if (accountItem.name === "Signup application") { + return ( {Setting.getLabel(i18next.t("general:Signup application"), i18next.t("general:Signup application - Tooltip"))} : - {this.updateUserField('signupApplication', value);})}> { this.state.applications.map((application, index) => ) } - { - !this.isSelfOrAdmin() ? null : ( - - - {Setting.getLabel(i18next.t("user:3rd-party logins"), i18next.t("user:3rd-party logins - Tooltip"))} : - - -
- { - (this.state.application === null || this.state.user === null) ? null : ( - this.state.application?.providers.filter(providerItem => Setting.isProviderVisible(providerItem)).map((providerItem, index) => - (providerItem.provider.category === "OAuth") ? ( - { return this.unlinked()}} /> - ) : ( - { return this.unlinked()}} /> - ) + ) + } else if (accountItem.name === "3rd-party logins") { + return ( + !this.isSelfOrAdmin() ? null : ( + +
+ {Setting.getLabel(i18next.t("user:3rd-party logins"), i18next.t("user:3rd-party logins - Tooltip"))} : + + +
+ { + (this.state.application === null || this.state.user === null) ? null : ( + this.state.application?.providers.filter(providerItem => Setting.isProviderVisible(providerItem)).map((providerItem, index) => + (providerItem.provider.category === "OAuth") ? ( + { return this.unlinked()}} /> + ) : ( + { return this.unlinked()}} /> ) ) - } -
- - - ) - } + ) + } + + + + ) + ) + } else if (accountItem.name === "Properties") { + return ( + + + {i18next.t("user:Properties")}: + + + + + + ) + } else if (accountItem.name === "Is admin") { + return ( + + + {Setting.getLabel(i18next.t("user:Is admin"), i18next.t("user:Is admin - Tooltip"))} : + + + { + this.updateUserField('isAdmin', checked); + }} /> + + + ) + } else if (accountItem.name === "Is global admin") { + return ( + + + {Setting.getLabel(i18next.t("user:Is global admin"), i18next.t("user:Is global admin - Tooltip"))} : + + + { + this.updateUserField('isGlobalAdmin', checked); + }} /> + + + ) + } else if (accountItem.name === "Is forbidden") { + return ( + + + {Setting.getLabel(i18next.t("user:Is forbidden"), i18next.t("user:Is forbidden - Tooltip"))} : + + + { + this.updateUserField('isForbidden', checked); + }} /> + + + ) + } else if (accountItem.name === "Is deleted") { + return ( + + + {Setting.getLabel(i18next.t("user:Is deleted"), i18next.t("user:Is deleted - Tooltip"))} : + + + { + this.updateUserField('isDeleted', checked); + }} /> + + + ) + } + } + + renderUser() { + return ( + + {this.state.mode === "add" ? i18next.t("user:New User") : i18next.t("user:Edit User")}     + + + {this.state.mode === "add" ? : null} + + } style={(Setting.isMobile())? {margin: '5px'}:{}} type="inner"> { - !Setting.isAdminUser(this.props.account) ? null : ( - - {/**/} - {/* */} - {/* {i18next.t("user:Properties")}:*/} - {/* */} - {/* */} - {/* */} - {/* */} - {/**/} - - - {Setting.getLabel(i18next.t("user:Is admin"), i18next.t("user:Is admin - Tooltip"))} : - - - { - this.updateUserField('isAdmin', checked); - }} /> - - - - - {Setting.getLabel(i18next.t("user:Is global admin"), i18next.t("user:Is global admin - Tooltip"))} : - - - { - this.updateUserField('isGlobalAdmin', checked); - }} /> - - - - - {Setting.getLabel(i18next.t("user:Is forbidden"), i18next.t("user:Is forbidden - Tooltip"))} : - - - { - this.updateUserField('isForbidden', checked); - }} /> - - - - - {Setting.getLabel(i18next.t("user:Is deleted"), i18next.t("user:Is deleted - Tooltip"))} : - - - { - this.updateUserField('isDeleted', checked); - }} /> - - - - ) + this.state.application?.organizationObj.accountItems?.map(accountItem => this.renderAccountItem(accountItem)) } - - ) } diff --git a/web/src/locales/de/data.json b/web/src/locales/de/data.json index 48c4ff12..208aec0f 100644 --- a/web/src/locales/de/data.json +++ b/web/src/locales/de/data.json @@ -38,7 +38,8 @@ "Token expire": "Token läuft ab", "Token expire - Tooltip": "Token läuft ab - Tooltip", "Token format": "Token-Format", - "Token format - Tooltip": "Token-Format - Tooltip" + "Token format - Tooltip": "Token-Format - Tooltip", + "rule": "rule" }, "cert": { "Bit size": "Bitgröße", @@ -259,6 +260,8 @@ "New Model": "New Model" }, "organization": { + "Account items": "Account items", + "Account items - Tooltip": "Account items - Tooltip", "Default avatar": "Standard Avatar", "Edit Organization": "Organisation bearbeiten", "Favicon": "Févicon", @@ -270,7 +273,9 @@ "Tags": "Tags", "Tags - Tooltip": "Tags - Tooltip", "Website URL": "Website-URL", - "Website URL - Tooltip": "Unique string-style identifier" + "Website URL - Tooltip": "Unique string-style identifier", + "modifyRule": "modifyRule", + "viewRule": "viewRule" }, "payment": { "Confirm your invoice information": "Confirm your invoice information", @@ -469,7 +474,6 @@ "canUnlink": "canUnlink", "prompted": "gefragt", "required": "benötigt", - "rule": "regel", "visible": "sichtbar" }, "record": { diff --git a/web/src/locales/en/data.json b/web/src/locales/en/data.json index 39a1973d..0b652e8e 100644 --- a/web/src/locales/en/data.json +++ b/web/src/locales/en/data.json @@ -38,7 +38,8 @@ "Token expire": "Token expire", "Token expire - Tooltip": "Token expire - Tooltip", "Token format": "Token format", - "Token format - Tooltip": "Token format - Tooltip" + "Token format - Tooltip": "Token format - Tooltip", + "rule": "rule" }, "cert": { "Bit size": "Bit size", @@ -259,6 +260,8 @@ "New Model": "New Model" }, "organization": { + "Account items": "Account items", + "Account items - Tooltip": "Account items - Tooltip", "Default avatar": "Default avatar", "Edit Organization": "Edit Organization", "Favicon": "Favicon", @@ -270,7 +273,9 @@ "Tags": "Tags", "Tags - Tooltip": "Tags - Tooltip", "Website URL": "Website URL", - "Website URL - Tooltip": "Website URL - Tooltip" + "Website URL - Tooltip": "Website URL - Tooltip", + "modifyRule": "modifyRule", + "viewRule": "viewRule" }, "payment": { "Confirm your invoice information": "Confirm your invoice information", @@ -469,7 +474,6 @@ "canUnlink": "canUnlink", "prompted": "prompted", "required": "required", - "rule": "rule", "visible": "visible" }, "record": { diff --git a/web/src/locales/fr/data.json b/web/src/locales/fr/data.json index 0644a6c3..9c8abd78 100644 --- a/web/src/locales/fr/data.json +++ b/web/src/locales/fr/data.json @@ -38,7 +38,8 @@ "Token expire": "Expiration du jeton", "Token expire - Tooltip": "Expiration du jeton - Info-bulle", "Token format": "Format du jeton", - "Token format - Tooltip": "Format du jeton - infobulle" + "Token format - Tooltip": "Format du jeton - infobulle", + "rule": "rule" }, "cert": { "Bit size": "Taille du bit", @@ -259,6 +260,8 @@ "New Model": "New Model" }, "organization": { + "Account items": "Account items", + "Account items - Tooltip": "Account items - Tooltip", "Default avatar": "Avatar par défaut", "Edit Organization": "Modifier l'organisation", "Favicon": "Favicon", @@ -270,7 +273,9 @@ "Tags": "Tags", "Tags - Tooltip": "Tags - Tooltip", "Website URL": "URL du site web", - "Website URL - Tooltip": "Unique string-style identifier" + "Website URL - Tooltip": "Unique string-style identifier", + "modifyRule": "modifyRule", + "viewRule": "viewRule" }, "payment": { "Confirm your invoice information": "Confirm your invoice information", @@ -469,7 +474,6 @@ "canUnlink": "canUnlink", "prompted": "invitée", "required": "Obligatoire", - "rule": "règle", "visible": "Visible" }, "record": { diff --git a/web/src/locales/ja/data.json b/web/src/locales/ja/data.json index c5714383..900db1d3 100644 --- a/web/src/locales/ja/data.json +++ b/web/src/locales/ja/data.json @@ -38,7 +38,8 @@ "Token expire": "トークンの有効期限", "Token expire - Tooltip": "トークンの有効期限 - ツールチップ", "Token format": "トークンのフォーマット", - "Token format - Tooltip": "トークンフォーマット - ツールチップ" + "Token format - Tooltip": "トークンフォーマット - ツールチップ", + "rule": "rule" }, "cert": { "Bit size": "ビットサイズ", @@ -259,6 +260,8 @@ "New Model": "New Model" }, "organization": { + "Account items": "Account items", + "Account items - Tooltip": "Account items - Tooltip", "Default avatar": "デフォルトのアバター", "Edit Organization": "組織を編集", "Favicon": "ファビコン", @@ -270,7 +273,9 @@ "Tags": "Tags", "Tags - Tooltip": "Tags - Tooltip", "Website URL": "Website URL", - "Website URL - Tooltip": "Unique string-style identifier" + "Website URL - Tooltip": "Unique string-style identifier", + "modifyRule": "modifyRule", + "viewRule": "viewRule" }, "payment": { "Confirm your invoice information": "Confirm your invoice information", @@ -469,7 +474,6 @@ "canUnlink": "canUnlink", "prompted": "プロンプトされた", "required": "必須", - "rule": "ルール", "visible": "表示" }, "record": { diff --git a/web/src/locales/ko/data.json b/web/src/locales/ko/data.json index d508008f..8e41401d 100644 --- a/web/src/locales/ko/data.json +++ b/web/src/locales/ko/data.json @@ -38,7 +38,8 @@ "Token expire": "Token expire", "Token expire - Tooltip": "Token expire - Tooltip", "Token format": "Token format", - "Token format - Tooltip": "Token format - Tooltip" + "Token format - Tooltip": "Token format - Tooltip", + "rule": "rule" }, "cert": { "Bit size": "Bit size", @@ -259,6 +260,8 @@ "New Model": "New Model" }, "organization": { + "Account items": "Account items", + "Account items - Tooltip": "Account items - Tooltip", "Default avatar": "Default avatar", "Edit Organization": "Edit Organization", "Favicon": "Favicon", @@ -270,7 +273,9 @@ "Tags": "Tags", "Tags - Tooltip": "Tags - Tooltip", "Website URL": "Website URL", - "Website URL - Tooltip": "Unique string-style identifier" + "Website URL - Tooltip": "Unique string-style identifier", + "modifyRule": "modifyRule", + "viewRule": "viewRule" }, "payment": { "Confirm your invoice information": "Confirm your invoice information", @@ -469,7 +474,6 @@ "canUnlink": "canUnlink", "prompted": "prompted", "required": "required", - "rule": "rule", "visible": "visible" }, "record": { diff --git a/web/src/locales/ru/data.json b/web/src/locales/ru/data.json index ed1b336f..28f46baf 100644 --- a/web/src/locales/ru/data.json +++ b/web/src/locales/ru/data.json @@ -38,7 +38,8 @@ "Token expire": "Токен истекает", "Token expire - Tooltip": "Истек токен - Подсказка", "Token format": "Формат токена", - "Token format - Tooltip": "Формат токена - Подсказка" + "Token format - Tooltip": "Формат токена - Подсказка", + "rule": "rule" }, "cert": { "Bit size": "Размер бита", @@ -259,6 +260,8 @@ "New Model": "New Model" }, "organization": { + "Account items": "Account items", + "Account items - Tooltip": "Account items - Tooltip", "Default avatar": "Аватар по умолчанию", "Edit Organization": "Изменить организацию", "Favicon": "Иконка", @@ -270,7 +273,9 @@ "Tags": "Tags", "Tags - Tooltip": "Tags - Tooltip", "Website URL": "URL сайта", - "Website URL - Tooltip": "Unique string-style identifier" + "Website URL - Tooltip": "Unique string-style identifier", + "modifyRule": "modifyRule", + "viewRule": "viewRule" }, "payment": { "Confirm your invoice information": "Confirm your invoice information", @@ -469,7 +474,6 @@ "canUnlink": "canUnlink", "prompted": "запрошено", "required": "обязательный", - "rule": "правило", "visible": "видимый" }, "record": { diff --git a/web/src/locales/zh/data.json b/web/src/locales/zh/data.json index 5bc7159f..efc73c4b 100644 --- a/web/src/locales/zh/data.json +++ b/web/src/locales/zh/data.json @@ -38,7 +38,8 @@ "Token expire": "Access Token过期", "Token expire - Tooltip": "Access Token过期时间", "Token format": "Access Token格式", - "Token format - Tooltip": "Access Token格式" + "Token format - Tooltip": "Access Token格式", + "rule": "规则" }, "cert": { "Bit size": "位大小", @@ -259,6 +260,8 @@ "New Model": "添加模型" }, "organization": { + "Account items": "个人页设置项", + "Account items - Tooltip": "个人设置页面中的项目", "Default avatar": "默认头像", "Edit Organization": "编辑组织", "Favicon": "图标", @@ -270,7 +273,9 @@ "Tags": "标签集合", "Tags - Tooltip": "可供用户选择的标签的集合", "Website URL": "网页地址", - "Website URL - Tooltip": "网页地址" + "Website URL - Tooltip": "网页地址", + "modifyRule": "修改规则", + "viewRule": "查看规则" }, "payment": { "Confirm your invoice information": "确认您的发票信息", @@ -469,7 +474,6 @@ "canUnlink": "可解绑定", "prompted": "注册后提醒绑定", "required": "是否必填项", - "rule": "规则", "visible": "是否可见" }, "record": {