mirror of
https://github.com/casdoor/casdoor.git
synced 2025-07-26 01:20:29 +08:00
Compare commits
5 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
bfcfb56336 | ||
![]() |
c48306d117 | ||
![]() |
6efec6b4b5 | ||
![]() |
2daf26aa88 | ||
![]() |
21c151bcf8 |
@@ -20,6 +20,7 @@ import (
|
||||
"strings"
|
||||
|
||||
"github.com/beego/beego/utils/pagination"
|
||||
"github.com/casdoor/casdoor/conf"
|
||||
"github.com/casdoor/casdoor/object"
|
||||
"github.com/casdoor/casdoor/util"
|
||||
)
|
||||
@@ -293,6 +294,11 @@ func (c *ApiController) UpdateUser() {
|
||||
return
|
||||
}
|
||||
|
||||
isUsernameLowered := conf.GetConfigBool("isUsernameLowered")
|
||||
if isUsernameLowered {
|
||||
user.Name = strings.ToLower(user.Name)
|
||||
}
|
||||
|
||||
isAdmin := c.IsAdmin()
|
||||
if pass, err := object.CheckPermissionForUpdateUser(oldUser, &user, isAdmin, c.GetAcceptLanguage()); !pass {
|
||||
c.ResponseError(err)
|
||||
|
@@ -46,6 +46,7 @@ type SigninItem struct {
|
||||
Name string `json:"name"`
|
||||
Visible bool `json:"visible"`
|
||||
Label string `json:"label"`
|
||||
CustomCss string `json:"customCss"`
|
||||
Placeholder string `json:"placeholder"`
|
||||
Rule string `json:"rule"`
|
||||
IsCustom bool `json:"isCustom"`
|
||||
@@ -209,7 +210,7 @@ func extendApplicationWithSigninItems(application *Application) (err error) {
|
||||
signinItem := &SigninItem{
|
||||
Name: "Back button",
|
||||
Visible: true,
|
||||
Label: ".back-button {\n top: 65px;\n left: 15px;\n position: absolute;\n}\n.back-inner-button{}",
|
||||
CustomCss: ".back-button {\n top: 65px;\n left: 15px;\n position: absolute;\n}\n.back-inner-button{}",
|
||||
Placeholder: "",
|
||||
Rule: "None",
|
||||
}
|
||||
@@ -217,7 +218,7 @@ func extendApplicationWithSigninItems(application *Application) (err error) {
|
||||
signinItem = &SigninItem{
|
||||
Name: "Languages",
|
||||
Visible: true,
|
||||
Label: ".login-languages {\n top: 55px;\n right: 5px;\n position: absolute;\n}",
|
||||
CustomCss: ".login-languages {\n top: 55px;\n right: 5px;\n position: absolute;\n}",
|
||||
Placeholder: "",
|
||||
Rule: "None",
|
||||
}
|
||||
@@ -225,7 +226,7 @@ func extendApplicationWithSigninItems(application *Application) (err error) {
|
||||
signinItem = &SigninItem{
|
||||
Name: "Logo",
|
||||
Visible: true,
|
||||
Label: ".login-logo-box {}",
|
||||
CustomCss: ".login-logo-box {}",
|
||||
Placeholder: "",
|
||||
Rule: "None",
|
||||
}
|
||||
@@ -233,7 +234,7 @@ func extendApplicationWithSigninItems(application *Application) (err error) {
|
||||
signinItem = &SigninItem{
|
||||
Name: "Signin methods",
|
||||
Visible: true,
|
||||
Label: ".signin-methods {}",
|
||||
CustomCss: ".signin-methods {}",
|
||||
Placeholder: "",
|
||||
Rule: "None",
|
||||
}
|
||||
@@ -241,7 +242,7 @@ func extendApplicationWithSigninItems(application *Application) (err error) {
|
||||
signinItem = &SigninItem{
|
||||
Name: "Username",
|
||||
Visible: true,
|
||||
Label: ".login-username {}\n.login-username-input{}",
|
||||
CustomCss: ".login-username {}\n.login-username-input{}",
|
||||
Placeholder: "",
|
||||
Rule: "None",
|
||||
}
|
||||
@@ -249,7 +250,7 @@ func extendApplicationWithSigninItems(application *Application) (err error) {
|
||||
signinItem = &SigninItem{
|
||||
Name: "Password",
|
||||
Visible: true,
|
||||
Label: ".login-password {}\n.login-password-input{}",
|
||||
CustomCss: ".login-password {}\n.login-password-input{}",
|
||||
Placeholder: "",
|
||||
Rule: "None",
|
||||
}
|
||||
@@ -257,7 +258,7 @@ func extendApplicationWithSigninItems(application *Application) (err error) {
|
||||
signinItem = &SigninItem{
|
||||
Name: "Agreement",
|
||||
Visible: true,
|
||||
Label: ".login-agreement {}",
|
||||
CustomCss: ".login-agreement {}",
|
||||
Placeholder: "",
|
||||
Rule: "None",
|
||||
}
|
||||
@@ -265,7 +266,7 @@ func extendApplicationWithSigninItems(application *Application) (err error) {
|
||||
signinItem = &SigninItem{
|
||||
Name: "Forgot password?",
|
||||
Visible: true,
|
||||
Label: ".login-forget-password {\n display: inline-flex;\n justify-content: space-between;\n width: 320px;\n margin-bottom: 25px;\n}",
|
||||
CustomCss: ".login-forget-password {\n display: inline-flex;\n justify-content: space-between;\n width: 320px;\n margin-bottom: 25px;\n}",
|
||||
Placeholder: "",
|
||||
Rule: "None",
|
||||
}
|
||||
@@ -273,7 +274,7 @@ func extendApplicationWithSigninItems(application *Application) (err error) {
|
||||
signinItem = &SigninItem{
|
||||
Name: "Login button",
|
||||
Visible: true,
|
||||
Label: ".login-button-box {\n margin-bottom: 5px;\n}\n.login-button {\n width: 100%;\n}",
|
||||
CustomCss: ".login-button-box {\n margin-bottom: 5px;\n}\n.login-button {\n width: 100%;\n}",
|
||||
Placeholder: "",
|
||||
Rule: "None",
|
||||
}
|
||||
@@ -281,7 +282,7 @@ func extendApplicationWithSigninItems(application *Application) (err error) {
|
||||
signinItem = &SigninItem{
|
||||
Name: "Signup link",
|
||||
Visible: true,
|
||||
Label: ".login-signup-link {\n margin-bottom: 24px;\n display: flex;\n justify-content: end;\n}",
|
||||
CustomCss: ".login-signup-link {\n margin-bottom: 24px;\n display: flex;\n justify-content: end;\n}",
|
||||
Placeholder: "",
|
||||
Rule: "None",
|
||||
}
|
||||
@@ -289,12 +290,18 @@ func extendApplicationWithSigninItems(application *Application) (err error) {
|
||||
signinItem = &SigninItem{
|
||||
Name: "Providers",
|
||||
Visible: true,
|
||||
Label: ".provider-img {\n width: 30px;\n margin: 5px;\n}\n.provider-big-img {\n margin-bottom: 10px;\n}",
|
||||
CustomCss: ".provider-img {\n width: 30px;\n margin: 5px;\n}\n.provider-big-img {\n margin-bottom: 10px;\n}",
|
||||
Placeholder: "",
|
||||
Rule: "None",
|
||||
}
|
||||
application.SigninItems = append(application.SigninItems, signinItem)
|
||||
}
|
||||
for idx, item := range application.SigninItems {
|
||||
if item.Label != "" && item.CustomCss == "" {
|
||||
application.SigninItems[idx].CustomCss = item.Label
|
||||
application.SigninItems[idx].Label = ""
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
|
@@ -155,7 +155,8 @@ func GetMaskedSyncers(syncers []*Syncer, errs ...error) ([]*Syncer, error) {
|
||||
|
||||
func UpdateSyncer(id string, syncer *Syncer) (bool, error) {
|
||||
owner, name := util.GetOwnerAndNameFromId(id)
|
||||
if s, err := getSyncer(owner, name); err != nil {
|
||||
s, err := getSyncer(owner, name)
|
||||
if err != nil {
|
||||
return false, err
|
||||
} else if s == nil {
|
||||
return false, nil
|
||||
@@ -163,7 +164,7 @@ func UpdateSyncer(id string, syncer *Syncer) (bool, error) {
|
||||
|
||||
session := ormer.Engine.ID(core.PK{owner, name}).AllCols()
|
||||
if syncer.Password == "***" {
|
||||
session.Omit("password")
|
||||
syncer.Password = s.Password
|
||||
}
|
||||
affected, err := session.Update(syncer)
|
||||
if err != nil {
|
||||
|
@@ -877,6 +877,7 @@ func AddUsers(users []*User) (bool, error) {
|
||||
}
|
||||
}
|
||||
|
||||
user.Name = strings.TrimSpace(user.Name)
|
||||
if isUsernameLowered {
|
||||
user.Name = strings.ToLower(user.Name)
|
||||
}
|
||||
|
@@ -21,12 +21,11 @@ import (
|
||||
"regexp"
|
||||
"strings"
|
||||
|
||||
"github.com/casdoor/casdoor/conf"
|
||||
"github.com/casdoor/casdoor/i18n"
|
||||
|
||||
jsoniter "github.com/json-iterator/go"
|
||||
|
||||
"github.com/casdoor/casdoor/idp"
|
||||
"github.com/casdoor/casdoor/util"
|
||||
jsoniter "github.com/json-iterator/go"
|
||||
"github.com/xorm-io/core"
|
||||
)
|
||||
|
||||
@@ -57,6 +56,13 @@ func HasUserByField(organizationName string, field string, value string) bool {
|
||||
}
|
||||
|
||||
func GetUserByFields(organization string, field string) (*User, error) {
|
||||
isUsernameLowered := conf.GetConfigBool("isUsernameLowered")
|
||||
if isUsernameLowered {
|
||||
field = strings.ToLower(field)
|
||||
}
|
||||
|
||||
field = strings.TrimSpace(field)
|
||||
|
||||
// check username
|
||||
user, err := GetUserByField(organization, "name", field)
|
||||
if err != nil || user != nil {
|
||||
|
@@ -202,7 +202,7 @@ class UserEditPage extends React.Component {
|
||||
return value;
|
||||
}
|
||||
|
||||
updateUserField(key, value) {
|
||||
updateUserField(key, value, idx) {
|
||||
if (this.props.account === null) {
|
||||
return;
|
||||
}
|
||||
@@ -210,7 +210,12 @@ class UserEditPage extends React.Component {
|
||||
value = this.parseUserField(key, value);
|
||||
|
||||
const user = this.state.user;
|
||||
user[key] = value;
|
||||
if (key === "address") {
|
||||
user[key][idx] = value;
|
||||
} else {
|
||||
user[key] = value;
|
||||
}
|
||||
|
||||
this.setState({
|
||||
user: user,
|
||||
});
|
||||
@@ -501,16 +506,33 @@ class UserEditPage extends React.Component {
|
||||
);
|
||||
} else if (accountItem.name === "Address") {
|
||||
return (
|
||||
<Row style={{marginTop: "20px"}} >
|
||||
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
|
||||
{Setting.getLabel(i18next.t("user:Address"), i18next.t("user:Address - Tooltip"))} :
|
||||
</Col>
|
||||
<Col span={22} >
|
||||
<Input value={this.state.user.address} onChange={e => {
|
||||
this.updateUserField("address", e.target.value);
|
||||
}} />
|
||||
</Col>
|
||||
</Row>
|
||||
<React.Fragment>
|
||||
<Row style={{marginTop: "20px"}} >
|
||||
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
|
||||
{Setting.getLabel(i18next.t("user:Address"), i18next.t("user:Address - Tooltip"))} :
|
||||
</Col>
|
||||
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
|
||||
<span>{i18next.t("user:Address line") + " 1"}</span> :
|
||||
</Col>
|
||||
<Col span={20} >
|
||||
<Input value={this.state.user.address[0]} onChange={e => {
|
||||
this.updateUserField("address", e.target.value, 0);
|
||||
}} />
|
||||
</Col>
|
||||
</Row>
|
||||
<Row style={{marginTop: "20px"}} >
|
||||
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
|
||||
</Col>
|
||||
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
|
||||
<span>{i18next.t("user:Address line") + " 2"}</span> :
|
||||
</Col>
|
||||
<Col span={20} >
|
||||
<Input value={this.state.user.address[1]} onChange={e => {
|
||||
this.updateUserField("address", e.target.value, 1);
|
||||
}} />
|
||||
</Col>
|
||||
</Row>
|
||||
</React.Fragment>
|
||||
);
|
||||
} else if (accountItem.name === "Affiliation") {
|
||||
return (
|
||||
|
@@ -532,7 +532,7 @@ class LoginPage extends React.Component {
|
||||
if (signinItem.name === "Logo") {
|
||||
return (
|
||||
<div className="login-logo-box">
|
||||
<div dangerouslySetInnerHTML={{__html: ("<style>" + signinItem.label?.replaceAll("<style>", "").replaceAll("</style>", "") + "</style>")}} />
|
||||
<div dangerouslySetInnerHTML={{__html: ("<style>" + signinItem.customCss?.replaceAll("<style>", "").replaceAll("</style>", "") + "</style>")}} />
|
||||
{
|
||||
Setting.renderHelmet(application)
|
||||
}
|
||||
@@ -544,7 +544,7 @@ class LoginPage extends React.Component {
|
||||
} else if (signinItem.name === "Back button") {
|
||||
return (
|
||||
<div className="back-button">
|
||||
<div dangerouslySetInnerHTML={{__html: ("<style>" + signinItem.label?.replaceAll("<style>", "").replaceAll("</style>", "") + "</style>")}} />
|
||||
<div dangerouslySetInnerHTML={{__html: ("<style>" + signinItem.customCss?.replaceAll("<style>", "").replaceAll("</style>", "") + "</style>")}} />
|
||||
{
|
||||
this.renderBackButton()
|
||||
}
|
||||
@@ -562,14 +562,14 @@ class LoginPage extends React.Component {
|
||||
|
||||
return (
|
||||
<div className="login-languages">
|
||||
<div dangerouslySetInnerHTML={{__html: ("<style>" + signinItem.label?.replaceAll("<style>", "").replaceAll("</style>", "") + "</style>")}} />
|
||||
<div dangerouslySetInnerHTML={{__html: ("<style>" + signinItem.customCss?.replaceAll("<style>", "").replaceAll("</style>", "") + "</style>")}} />
|
||||
<LanguageSelect languages={application.organizationObj.languages} />
|
||||
</div>
|
||||
);
|
||||
} else if (signinItem.name === "Signin methods") {
|
||||
return (
|
||||
<div>
|
||||
<div dangerouslySetInnerHTML={{__html: ("<style>" + signinItem.label?.replaceAll("<style>", "").replaceAll("</style>", "") + "</style>")}} />
|
||||
<div dangerouslySetInnerHTML={{__html: ("<style>" + signinItem.customCss?.replaceAll("<style>", "").replaceAll("</style>", "") + "</style>")}} />
|
||||
{this.renderMethodChoiceBox()}
|
||||
</div>
|
||||
)
|
||||
@@ -577,10 +577,11 @@ class LoginPage extends React.Component {
|
||||
} else if (signinItem.name === "Username") {
|
||||
return (
|
||||
<div>
|
||||
<div dangerouslySetInnerHTML={{__html: ("<style>" + signinItem.label?.replaceAll("<style>", "").replaceAll("</style>", "") + "</style>")}} />
|
||||
<div dangerouslySetInnerHTML={{__html: ("<style>" + signinItem.customCss?.replaceAll("<style>", "").replaceAll("</style>", "") + "</style>")}} />
|
||||
<Form.Item
|
||||
name="username"
|
||||
className="login-username"
|
||||
label={signinItem.label ? signinItem.label : null}
|
||||
rules={[
|
||||
{
|
||||
required: true,
|
||||
@@ -653,14 +654,14 @@ class LoginPage extends React.Component {
|
||||
} else if (signinItem.name === "Password") {
|
||||
return (
|
||||
<div>
|
||||
<div dangerouslySetInnerHTML={{__html: ("<style>" + signinItem.label?.replaceAll("<style>", "").replaceAll("</style>", "") + "</style>")}} />
|
||||
{this.renderPasswordOrCodeInput()}
|
||||
<div dangerouslySetInnerHTML={{__html: ("<style>" + signinItem.customCss?.replaceAll("<style>", "").replaceAll("</style>", "") + "</style>")}} />
|
||||
{this.renderPasswordOrCodeInput(signinItem)}
|
||||
</div>
|
||||
);
|
||||
} else if (signinItem.name === "Forgot password?") {
|
||||
return (
|
||||
<div>
|
||||
<div dangerouslySetInnerHTML={{__html: ("<style>" + signinItem.label?.replaceAll("<style>", "").replaceAll("</style>", "") + "</style>")}} />
|
||||
<div dangerouslySetInnerHTML={{__html: ("<style>" + signinItem.customCss?.replaceAll("<style>", "").replaceAll("</style>", "") + "</style>")}} />
|
||||
<div className="login-forget-password">
|
||||
<Form.Item name="autoSignin" valuePropName="checked" noStyle>
|
||||
<Checkbox style={{float: "left"}}>
|
||||
@@ -668,7 +669,7 @@ class LoginPage extends React.Component {
|
||||
</Checkbox>
|
||||
</Form.Item>
|
||||
{
|
||||
signinItem.visible ? Setting.renderForgetLink(application, i18next.t("login:Forgot password?")) : null
|
||||
signinItem.visible ? Setting.renderForgetLink(application, signinItem.label ? signinItem.label : i18next.t("login:Forgot password?")) : null
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
@@ -678,7 +679,7 @@ class LoginPage extends React.Component {
|
||||
} else if (signinItem.name === "Login button") {
|
||||
return (
|
||||
<Form.Item className="login-button-box">
|
||||
<div dangerouslySetInnerHTML={{__html: ("<style>" + signinItem.label?.replaceAll("<style>", "").replaceAll("</style>", "") + "</style>")}} />
|
||||
<div dangerouslySetInnerHTML={{__html: ("<style>" + signinItem.customCss?.replaceAll("<style>", "").replaceAll("</style>", "") + "</style>")}} />
|
||||
<Button
|
||||
type="primary"
|
||||
htmlType="submit"
|
||||
@@ -687,7 +688,7 @@ class LoginPage extends React.Component {
|
||||
{
|
||||
this.state.loginMethod === "webAuthn" ? i18next.t("login:Sign in with WebAuthn") :
|
||||
this.state.loginMethod === "faceId" ? i18next.t("login:Sign in with Face ID") :
|
||||
i18next.t("login:Sign In")
|
||||
signinItem.label ? signinItem.label : i18next.t("login:Sign In")
|
||||
}
|
||||
</Button>
|
||||
{
|
||||
@@ -722,7 +723,7 @@ class LoginPage extends React.Component {
|
||||
|
||||
return (
|
||||
<div>
|
||||
<div dangerouslySetInnerHTML={{__html: ("<style>" + signinItem.label?.replaceAll("<style>", "").replaceAll("</style>", "") + "</style>")}} />
|
||||
<div dangerouslySetInnerHTML={{__html: ("<style>" + signinItem.customCss?.replaceAll("<style>", "").replaceAll("</style>", "") + "</style>")}} />
|
||||
<Form.Item>
|
||||
{
|
||||
application.providers.filter(providerItem => this.isProviderVisible(providerItem)).map(providerItem => {
|
||||
@@ -737,13 +738,13 @@ class LoginPage extends React.Component {
|
||||
);
|
||||
} else if (signinItem.name.startsWith("Text ") || signinItem?.isCustom) {
|
||||
return (
|
||||
<div dangerouslySetInnerHTML={{__html: signinItem.label}} />
|
||||
<div dangerouslySetInnerHTML={{__html: signinItem.customCss}} />
|
||||
);
|
||||
} else if (signinItem.name === "Signup link") {
|
||||
return (
|
||||
<div style={{width: "100%"}} className="login-signup-link">
|
||||
<div dangerouslySetInnerHTML={{__html: ("<style>" + signinItem.label?.replaceAll("<style>", "").replaceAll("</style>", "") + "</style>")}} />
|
||||
{this.renderFooter(application)}
|
||||
<div dangerouslySetInnerHTML={{__html: ("<style>" + signinItem.customCss?.replaceAll("<style>", "").replaceAll("</style>", "") + "</style>")}} />
|
||||
{this.renderFooter(application, signinItem)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -896,17 +897,20 @@ class LoginPage extends React.Component {
|
||||
/>;
|
||||
}
|
||||
|
||||
renderFooter(application) {
|
||||
renderFooter(application, signinItem) {
|
||||
return (
|
||||
<div>
|
||||
{
|
||||
!application.enableSignUp ? null : (
|
||||
<React.Fragment>
|
||||
{i18next.t("login:No account?")}
|
||||
{
|
||||
Setting.renderSignupLink(application, i18next.t("login:sign up now"))
|
||||
}
|
||||
</React.Fragment>
|
||||
signinItem.label ? Setting.renderSignupLink(application, signinItem.label) :
|
||||
(
|
||||
<React.Fragment>
|
||||
{i18next.t("login:No account?")}
|
||||
{
|
||||
Setting.renderSignupLink(application, i18next.t("login:sign up now"))
|
||||
}
|
||||
</React.Fragment>
|
||||
)
|
||||
)
|
||||
}
|
||||
</div>
|
||||
@@ -1022,7 +1026,7 @@ class LoginPage extends React.Component {
|
||||
});
|
||||
}
|
||||
|
||||
renderPasswordOrCodeInput() {
|
||||
renderPasswordOrCodeInput(signinItem) {
|
||||
const application = this.getApplicationObj();
|
||||
if (this.state.loginMethod === "password" || this.state.loginMethod === "ldap") {
|
||||
return (
|
||||
@@ -1031,6 +1035,7 @@ class LoginPage extends React.Component {
|
||||
<Form.Item
|
||||
name="password"
|
||||
className="login-password"
|
||||
label={signinItem.label ? signinItem.label : null}
|
||||
rules={[{required: true, message: i18next.t("login:Please input your password!")}]}
|
||||
>
|
||||
<Input.Password
|
||||
|
@@ -389,6 +389,14 @@ class SignupPage extends React.Component {
|
||||
return Promise.reject(i18next.t("signup:The input is not valid Email!"));
|
||||
}
|
||||
|
||||
if (signupItem.regex) {
|
||||
const reg = new RegExp(signupItem.regex);
|
||||
if (!reg.test(this.state.email)) {
|
||||
this.setState({validEmail: false});
|
||||
return Promise.reject(i18next.t("signup:The input Email doesn't match the signup item regex!"));
|
||||
}
|
||||
}
|
||||
|
||||
this.setState({validEmail: true});
|
||||
return Promise.resolve();
|
||||
},
|
||||
|
@@ -954,6 +954,7 @@
|
||||
"Text 3": "Text 3",
|
||||
"Text 4": "Text 4",
|
||||
"Text 5": "Text 5",
|
||||
"The input Email doesn't match the signup item regex!": "The input Email doesn't match the signup item regex!",
|
||||
"The input is not invoice Tax ID!": "The input is not invoice Tax ID!",
|
||||
"The input is not invoice title!": "The input is not invoice title!",
|
||||
"The input is not valid Email!": "The input is not valid Email!",
|
||||
@@ -1074,6 +1075,7 @@
|
||||
"3rd-party logins - Tooltip": "Social logins linked by the user",
|
||||
"Address": "Address",
|
||||
"Address - Tooltip": "Residential address",
|
||||
"Address line": "Address line",
|
||||
"Affiliation": "Affiliation",
|
||||
"Affiliation - Tooltip": "Employer, such as company name or organization name",
|
||||
"Bio": "Bio",
|
||||
|
@@ -954,6 +954,7 @@
|
||||
"Text 3": "Text 3",
|
||||
"Text 4": "Text 4",
|
||||
"Text 5": "Text 5",
|
||||
"The input Email doesn't match the signup item regex!": "The input Email doesn't match the signup item regex!",
|
||||
"The input is not invoice Tax ID!": "Die Eingabe ist keine Rechnungssteuer-ID!",
|
||||
"The input is not invoice title!": "Der Eingabewert ist nicht die Rechnungsbezeichnung!",
|
||||
"The input is not valid Email!": "Die Eingabe ist keine gültige E-Mail-Adresse!",
|
||||
@@ -1074,6 +1075,7 @@
|
||||
"3rd-party logins - Tooltip": "Drittanbieter-Anmeldungen, die mit dem Benutzer verknüpft sind",
|
||||
"Address": "Adresse",
|
||||
"Address - Tooltip": "Wohnadresse",
|
||||
"Address line": "Address line",
|
||||
"Affiliation": "Zugehörigkeit",
|
||||
"Affiliation - Tooltip": "Arbeitgeber, wie Firmenname oder Organisationsname",
|
||||
"Bio": "Bio",
|
||||
|
@@ -954,6 +954,7 @@
|
||||
"Text 3": "Text 3",
|
||||
"Text 4": "Text 4",
|
||||
"Text 5": "Text 5",
|
||||
"The input Email doesn't match the signup item regex!": "The input Email doesn't match the signup item regex!",
|
||||
"The input is not invoice Tax ID!": "The input is not invoice Tax ID!",
|
||||
"The input is not invoice title!": "The input is not invoice title!",
|
||||
"The input is not valid Email!": "The input is not valid Email!",
|
||||
@@ -1074,6 +1075,7 @@
|
||||
"3rd-party logins - Tooltip": "Social logins linked by the user",
|
||||
"Address": "Address",
|
||||
"Address - Tooltip": "Residential address",
|
||||
"Address line": "Address line",
|
||||
"Affiliation": "Affiliation",
|
||||
"Affiliation - Tooltip": "Employer, such as company name or organization name",
|
||||
"Bio": "Bio",
|
||||
|
@@ -954,6 +954,7 @@
|
||||
"Text 3": "Text 3",
|
||||
"Text 4": "Text 4",
|
||||
"Text 5": "Text 5",
|
||||
"The input Email doesn't match the signup item regex!": "The input Email doesn't match the signup item regex!",
|
||||
"The input is not invoice Tax ID!": "¡La entrada no es el ID fiscal de la factura!",
|
||||
"The input is not invoice title!": "¡El entrada no es el título de la factura!",
|
||||
"The input is not valid Email!": "¡La entrada no es un correo electrónico válido!",
|
||||
@@ -1074,6 +1075,7 @@
|
||||
"3rd-party logins - Tooltip": "Accesos sociales ligados por el usuario",
|
||||
"Address": "Dirección",
|
||||
"Address - Tooltip": "Dirección residencial",
|
||||
"Address line": "Address line",
|
||||
"Affiliation": "Afiliación",
|
||||
"Affiliation - Tooltip": "Empleador, como el nombre de una empresa u organización",
|
||||
"Bio": "Bio - Biografía",
|
||||
|
@@ -954,6 +954,7 @@
|
||||
"Text 3": "Text 3",
|
||||
"Text 4": "Text 4",
|
||||
"Text 5": "Text 5",
|
||||
"The input Email doesn't match the signup item regex!": "The input Email doesn't match the signup item regex!",
|
||||
"The input is not invoice Tax ID!": "The input is not invoice Tax ID!",
|
||||
"The input is not invoice title!": "The input is not invoice title!",
|
||||
"The input is not valid Email!": "The input is not valid Email!",
|
||||
@@ -1074,6 +1075,7 @@
|
||||
"3rd-party logins - Tooltip": "Social logins linked by the user",
|
||||
"Address": "Address",
|
||||
"Address - Tooltip": "Residential address",
|
||||
"Address line": "Address line",
|
||||
"Affiliation": "Affiliation",
|
||||
"Affiliation - Tooltip": "Employer, such as company name or organization name",
|
||||
"Bio": "Bio",
|
||||
|
@@ -954,6 +954,7 @@
|
||||
"Text 3": "Text 3",
|
||||
"Text 4": "Text 4",
|
||||
"Text 5": "Text 5",
|
||||
"The input Email doesn't match the signup item regex!": "The input Email doesn't match the signup item regex!",
|
||||
"The input is not invoice Tax ID!": "The input is not invoice Tax ID!",
|
||||
"The input is not invoice title!": "The input is not invoice title!",
|
||||
"The input is not valid Email!": "The input is not valid Email!",
|
||||
@@ -1074,6 +1075,7 @@
|
||||
"3rd-party logins - Tooltip": "Social logins linked by the user",
|
||||
"Address": "Address",
|
||||
"Address - Tooltip": "Residential address",
|
||||
"Address line": "Address line",
|
||||
"Affiliation": "Affiliation",
|
||||
"Affiliation - Tooltip": "Employer, such as company name or organization name",
|
||||
"Bio": "Bio",
|
||||
|
@@ -954,6 +954,7 @@
|
||||
"Text 3": "Text 3",
|
||||
"Text 4": "Text 4",
|
||||
"Text 5": "Text 5",
|
||||
"The input Email doesn't match the signup item regex!": "The input Email doesn't match the signup item regex!",
|
||||
"The input is not invoice Tax ID!": "L'entrée n'est pas l'identifiant fiscal de la facture !",
|
||||
"The input is not invoice title!": "L'entrée n'est pas un nom ou une dénomination sociale !",
|
||||
"The input is not valid Email!": "L'entrée n'est pas une adresse e-mail valide !",
|
||||
@@ -1074,6 +1075,7 @@
|
||||
"3rd-party logins - Tooltip": "Service de connexions tiers liés au compte",
|
||||
"Address": "Adresse",
|
||||
"Address - Tooltip": "Adresse résidentielle",
|
||||
"Address line": "Address line",
|
||||
"Affiliation": "Affiliation",
|
||||
"Affiliation - Tooltip": "Employeur, tel que le nom de l'entreprise ou de l'organisation",
|
||||
"Bio": "Bio",
|
||||
|
@@ -954,6 +954,7 @@
|
||||
"Text 3": "Text 3",
|
||||
"Text 4": "Text 4",
|
||||
"Text 5": "Text 5",
|
||||
"The input Email doesn't match the signup item regex!": "The input Email doesn't match the signup item regex!",
|
||||
"The input is not invoice Tax ID!": "The input is not invoice Tax ID!",
|
||||
"The input is not invoice title!": "The input is not invoice title!",
|
||||
"The input is not valid Email!": "The input is not valid Email!",
|
||||
@@ -1074,6 +1075,7 @@
|
||||
"3rd-party logins - Tooltip": "Social logins linked by the user",
|
||||
"Address": "Address",
|
||||
"Address - Tooltip": "Residential address",
|
||||
"Address line": "Address line",
|
||||
"Affiliation": "Affiliation",
|
||||
"Affiliation - Tooltip": "Employer, such as company name or organization name",
|
||||
"Bio": "Bio",
|
||||
|
@@ -954,6 +954,7 @@
|
||||
"Text 3": "Text 3",
|
||||
"Text 4": "Text 4",
|
||||
"Text 5": "Text 5",
|
||||
"The input Email doesn't match the signup item regex!": "The input Email doesn't match the signup item regex!",
|
||||
"The input is not invoice Tax ID!": "Input ini bukan Tax ID faktur!",
|
||||
"The input is not invoice title!": "Masukan bukan judul faktur!",
|
||||
"The input is not valid Email!": "Input yang dimasukkan bukan sesuai dengan format Email yang valid!",
|
||||
@@ -1074,6 +1075,7 @@
|
||||
"3rd-party logins - Tooltip": "Masuk sosial yang terhubung oleh pengguna",
|
||||
"Address": "Alamat",
|
||||
"Address - Tooltip": "Alamat tempat tinggal",
|
||||
"Address line": "Address line",
|
||||
"Affiliation": "Afiliasi",
|
||||
"Affiliation - Tooltip": "Pemberi Kerja, seperti nama perusahaan atau nama organisasi",
|
||||
"Bio": "Bio: Biografi",
|
||||
|
@@ -954,6 +954,7 @@
|
||||
"Text 3": "Text 3",
|
||||
"Text 4": "Text 4",
|
||||
"Text 5": "Text 5",
|
||||
"The input Email doesn't match the signup item regex!": "The input Email doesn't match the signup item regex!",
|
||||
"The input is not invoice Tax ID!": "The input is not invoice Tax ID!",
|
||||
"The input is not invoice title!": "The input is not invoice title!",
|
||||
"The input is not valid Email!": "The input is not valid Email!",
|
||||
@@ -1074,6 +1075,7 @@
|
||||
"3rd-party logins - Tooltip": "Social logins linked by the user",
|
||||
"Address": "Address",
|
||||
"Address - Tooltip": "Residential address",
|
||||
"Address line": "Address line",
|
||||
"Affiliation": "Affiliation",
|
||||
"Affiliation - Tooltip": "Employer, such as company name or organization name",
|
||||
"Bio": "Bio",
|
||||
|
@@ -954,6 +954,7 @@
|
||||
"Text 3": "Text 3",
|
||||
"Text 4": "Text 4",
|
||||
"Text 5": "Text 5",
|
||||
"The input Email doesn't match the signup item regex!": "The input Email doesn't match the signup item regex!",
|
||||
"The input is not invoice Tax ID!": "入力されたものは請求書の税番号ではありません!",
|
||||
"The input is not invoice title!": "インプットは請求書タイトルではありません!",
|
||||
"The input is not valid Email!": "入力されたものは有効なメールではありません",
|
||||
@@ -1074,6 +1075,7 @@
|
||||
"3rd-party logins - Tooltip": "ユーザーによってリンクされたソーシャルログイン",
|
||||
"Address": "住所",
|
||||
"Address - Tooltip": "住所",
|
||||
"Address line": "Address line",
|
||||
"Affiliation": "所属",
|
||||
"Affiliation - Tooltip": "企業名や団体名などの雇用主",
|
||||
"Bio": "バイオ技術",
|
||||
|
@@ -954,6 +954,7 @@
|
||||
"Text 3": "Text 3",
|
||||
"Text 4": "Text 4",
|
||||
"Text 5": "Text 5",
|
||||
"The input Email doesn't match the signup item regex!": "The input Email doesn't match the signup item regex!",
|
||||
"The input is not invoice Tax ID!": "The input is not invoice Tax ID!",
|
||||
"The input is not invoice title!": "The input is not invoice title!",
|
||||
"The input is not valid Email!": "The input is not valid Email!",
|
||||
@@ -1074,6 +1075,7 @@
|
||||
"3rd-party logins - Tooltip": "Social logins linked by the user",
|
||||
"Address": "Address",
|
||||
"Address - Tooltip": "Residential address",
|
||||
"Address line": "Address line",
|
||||
"Affiliation": "Affiliation",
|
||||
"Affiliation - Tooltip": "Employer, such as company name or organization name",
|
||||
"Bio": "Bio",
|
||||
|
@@ -954,6 +954,7 @@
|
||||
"Text 3": "Text 3",
|
||||
"Text 4": "Text 4",
|
||||
"Text 5": "Text 5",
|
||||
"The input Email doesn't match the signup item regex!": "The input Email doesn't match the signup item regex!",
|
||||
"The input is not invoice Tax ID!": "입력한 것은 송장 세금 ID가 아닙니다!",
|
||||
"The input is not invoice title!": "입력값은 송장 제목이 아닙니다!",
|
||||
"The input is not valid Email!": "입력 값은 유효한 이메일이 아닙니다!",
|
||||
@@ -1074,6 +1075,7 @@
|
||||
"3rd-party logins - Tooltip": "사용자가 연결한 소셜 로그인",
|
||||
"Address": "주소",
|
||||
"Address - Tooltip": "주거지 주소",
|
||||
"Address line": "Address line",
|
||||
"Affiliation": "소속",
|
||||
"Affiliation - Tooltip": "고용주, 회사명 또는 조직명",
|
||||
"Bio": "바이오",
|
||||
|
@@ -954,6 +954,7 @@
|
||||
"Text 3": "Text 3",
|
||||
"Text 4": "Text 4",
|
||||
"Text 5": "Text 5",
|
||||
"The input Email doesn't match the signup item regex!": "The input Email doesn't match the signup item regex!",
|
||||
"The input is not invoice Tax ID!": "The input is not invoice Tax ID!",
|
||||
"The input is not invoice title!": "The input is not invoice title!",
|
||||
"The input is not valid Email!": "The input is not valid Email!",
|
||||
@@ -1074,6 +1075,7 @@
|
||||
"3rd-party logins - Tooltip": "Social logins linked by the user",
|
||||
"Address": "Address",
|
||||
"Address - Tooltip": "Residential address",
|
||||
"Address line": "Address line",
|
||||
"Affiliation": "Affiliation",
|
||||
"Affiliation - Tooltip": "Employer, such as company name or organization name",
|
||||
"Bio": "Bio",
|
||||
|
@@ -954,6 +954,7 @@
|
||||
"Text 3": "Text 3",
|
||||
"Text 4": "Text 4",
|
||||
"Text 5": "Text 5",
|
||||
"The input Email doesn't match the signup item regex!": "The input Email doesn't match the signup item regex!",
|
||||
"The input is not invoice Tax ID!": "The input is not invoice Tax ID!",
|
||||
"The input is not invoice title!": "The input is not invoice title!",
|
||||
"The input is not valid Email!": "The input is not valid Email!",
|
||||
@@ -1074,6 +1075,7 @@
|
||||
"3rd-party logins - Tooltip": "Social logins linked by the user",
|
||||
"Address": "Address",
|
||||
"Address - Tooltip": "Residential address",
|
||||
"Address line": "Address line",
|
||||
"Affiliation": "Affiliation",
|
||||
"Affiliation - Tooltip": "Employer, such as company name or organization name",
|
||||
"Bio": "Bio",
|
||||
|
@@ -954,6 +954,7 @@
|
||||
"Text 3": "Text 3",
|
||||
"Text 4": "Text 4",
|
||||
"Text 5": "Text 5",
|
||||
"The input Email doesn't match the signup item regex!": "The input Email doesn't match the signup item regex!",
|
||||
"The input is not invoice Tax ID!": "The input is not invoice Tax ID!",
|
||||
"The input is not invoice title!": "The input is not invoice title!",
|
||||
"The input is not valid Email!": "The input is not valid Email!",
|
||||
@@ -1074,6 +1075,7 @@
|
||||
"3rd-party logins - Tooltip": "Social logins linked by the user",
|
||||
"Address": "Address",
|
||||
"Address - Tooltip": "Residential address",
|
||||
"Address line": "Address line",
|
||||
"Affiliation": "Affiliation",
|
||||
"Affiliation - Tooltip": "Employer, such as company name or organization name",
|
||||
"Bio": "Bio",
|
||||
|
@@ -954,6 +954,7 @@
|
||||
"Text 3": "Text 3",
|
||||
"Text 4": "Text 4",
|
||||
"Text 5": "Text 5",
|
||||
"The input Email doesn't match the signup item regex!": "The input Email doesn't match the signup item regex!",
|
||||
"The input is not invoice Tax ID!": "A entrada não é um ID fiscal de fatura válido!",
|
||||
"The input is not invoice title!": "A entrada não é um título de fatura válido!",
|
||||
"The input is not valid Email!": "A entrada não é um Email válido!",
|
||||
@@ -1074,6 +1075,7 @@
|
||||
"3rd-party logins - Tooltip": "Logins sociais vinculados pelo usuário",
|
||||
"Address": "Endereço",
|
||||
"Address - Tooltip": "Endereço residencial",
|
||||
"Address line": "Address line",
|
||||
"Affiliation": "Afiliação",
|
||||
"Affiliation - Tooltip": "Empregador, como nome da empresa ou organização",
|
||||
"Bio": "Biografia",
|
||||
|
@@ -954,6 +954,7 @@
|
||||
"Text 3": "Text 3",
|
||||
"Text 4": "Text 4",
|
||||
"Text 5": "Text 5",
|
||||
"The input Email doesn't match the signup item regex!": "The input Email doesn't match the signup item regex!",
|
||||
"The input is not invoice Tax ID!": "Входные данные не являются идентификатором налога по счету-фактуре!",
|
||||
"The input is not invoice title!": "Входные данные не являются названием счета-фактуры!",
|
||||
"The input is not valid Email!": "Ввод не является действительным адресом электронной почты!",
|
||||
@@ -1074,6 +1075,7 @@
|
||||
"3rd-party logins - Tooltip": "Социальные логины, связанные пользователем",
|
||||
"Address": "Адрес",
|
||||
"Address - Tooltip": "Адрес проживания",
|
||||
"Address line": "Address line",
|
||||
"Affiliation": "Принадлежность",
|
||||
"Affiliation - Tooltip": "Работодатель, такой как название компании или организации",
|
||||
"Bio": "Био",
|
||||
|
@@ -954,6 +954,7 @@
|
||||
"Text 3": "Text 3",
|
||||
"Text 4": "Text 4",
|
||||
"Text 5": "Text 5",
|
||||
"The input Email doesn't match the signup item regex!": "The input Email doesn't match the signup item regex!",
|
||||
"The input is not invoice Tax ID!": "The input is not invoice Tax ID!",
|
||||
"The input is not invoice title!": "The input is not invoice title!",
|
||||
"The input is not valid Email!": "The input is not valid Email!",
|
||||
@@ -1074,6 +1075,7 @@
|
||||
"3rd-party logins - Tooltip": "Social logins linked by the user",
|
||||
"Address": "Address",
|
||||
"Address - Tooltip": "Residential address",
|
||||
"Address line": "Address line",
|
||||
"Affiliation": "Affiliation",
|
||||
"Affiliation - Tooltip": "Employer, such as company name or organization name",
|
||||
"Bio": "Bio",
|
||||
|
@@ -954,6 +954,7 @@
|
||||
"Text 3": "Text 3",
|
||||
"Text 4": "Text 4",
|
||||
"Text 5": "Text 5",
|
||||
"The input Email doesn't match the signup item regex!": "The input Email doesn't match the signup item regex!",
|
||||
"The input is not invoice Tax ID!": "The input is not invoice Tax ID!",
|
||||
"The input is not invoice title!": "The input is not invoice title!",
|
||||
"The input is not valid Email!": "The input is not valid Email!",
|
||||
@@ -1074,6 +1075,7 @@
|
||||
"3rd-party logins - Tooltip": "Social logins linked by the user",
|
||||
"Address": "Address",
|
||||
"Address - Tooltip": "Residential address",
|
||||
"Address line": "Address line",
|
||||
"Affiliation": "Affiliation",
|
||||
"Affiliation - Tooltip": "Employer, such as company name or organization name",
|
||||
"Bio": "Bio",
|
||||
|
@@ -954,6 +954,7 @@
|
||||
"Text 3": "Текст 3",
|
||||
"Text 4": "Текст 4",
|
||||
"Text 5": "Текст 5",
|
||||
"The input Email doesn't match the signup item regex!": "The input Email doesn't match the signup item regex!",
|
||||
"The input is not invoice Tax ID!": "Введені дані не є ідентифікаційним номером платника податків!",
|
||||
"The input is not invoice title!": "Введені дані не є назвою рахунку!",
|
||||
"The input is not valid Email!": "Введена недійсна адреса електронної пошти!",
|
||||
@@ -1074,6 +1075,7 @@
|
||||
"3rd-party logins - Tooltip": "Соціальні входи, пов’язані користувачем",
|
||||
"Address": "Адреса",
|
||||
"Address - Tooltip": "Адреса місця проживання",
|
||||
"Address line": "Address line",
|
||||
"Affiliation": "Приналежність",
|
||||
"Affiliation - Tooltip": "Роботодавець, наприклад назва компанії чи організації",
|
||||
"Bio": "біографія",
|
||||
|
@@ -954,6 +954,7 @@
|
||||
"Text 3": "Text 3",
|
||||
"Text 4": "Text 4",
|
||||
"Text 5": "Text 5",
|
||||
"The input Email doesn't match the signup item regex!": "The input Email doesn't match the signup item regex!",
|
||||
"The input is not invoice Tax ID!": "Đầu vào không phải là Mã số thuế của hóa đơn!",
|
||||
"The input is not invoice title!": "Đầu vào không phải là tiêu đề hóa đơn!",
|
||||
"The input is not valid Email!": "Đầu vào không phải là địa chỉ Email hợp lệ!",
|
||||
@@ -1074,6 +1075,7 @@
|
||||
"3rd-party logins - Tooltip": "Đăng nhập xã hội liên kết bởi người dùng",
|
||||
"Address": "Địa chỉ",
|
||||
"Address - Tooltip": "Địa chỉ cư trú",
|
||||
"Address line": "Address line",
|
||||
"Affiliation": "Liên kết",
|
||||
"Affiliation - Tooltip": "Nhà tuyển dụng, chẳng hạn như tên công ty hoặc tổ chức",
|
||||
"Bio": "bản vẻ đời sống",
|
||||
|
@@ -954,6 +954,7 @@
|
||||
"Text 3": "文本3",
|
||||
"Text 4": "文本4",
|
||||
"Text 5": "文本5",
|
||||
"The input Email doesn't match the signup item regex!": "您输入的邮箱地址与注册项的regex表达式不匹配!",
|
||||
"The input is not invoice Tax ID!": "您输入的纳税人识别号有误!",
|
||||
"The input is not invoice title!": "您输入的发票抬头有误!",
|
||||
"The input is not valid Email!": "您输入的电子邮箱格式有误!",
|
||||
@@ -1074,6 +1075,7 @@
|
||||
"3rd-party logins - Tooltip": "用户所绑定的社会化登录",
|
||||
"Address": "地址",
|
||||
"Address - Tooltip": "居住地址",
|
||||
"Address line": "地址",
|
||||
"Affiliation": "工作单位",
|
||||
"Affiliation - Tooltip": "工作单位,如公司、组织名称",
|
||||
"Bio": "自我介绍",
|
||||
|
@@ -134,7 +134,7 @@ class SigninTable extends React.Component {
|
||||
value={getItemDisplayName(text)}
|
||||
onChange={value => {
|
||||
this.updateField(table, index, "name", value);
|
||||
this.updateField(table, index, "label", SigninTableDefaultCssMap[value]);
|
||||
this.updateField(table, index, "customCss", SigninTableDefaultCssMap[value]);
|
||||
}} >
|
||||
{
|
||||
Setting.getDeduplicatedArray(items, table, "name").map((item, index) => <Option key={index} value={item.name}>{item.displayName}</Option>)
|
||||
@@ -166,7 +166,7 @@ class SigninTable extends React.Component {
|
||||
},
|
||||
},
|
||||
{
|
||||
title: i18next.t("signup:Label HTML"),
|
||||
title: i18next.t("signup:Label"),
|
||||
dataIndex: "label",
|
||||
key: "label",
|
||||
width: "200px",
|
||||
@@ -188,14 +188,18 @@ class SigninTable extends React.Component {
|
||||
}} />
|
||||
</Popover>
|
||||
);
|
||||
} else if (["Username", "Password", "Signup link", "Forgot password?", "Login button"].includes(record.name)) {
|
||||
return <Input value={text} style={{marginBottom: "10px"}} onChange={e => {
|
||||
this.updateField(table, index, "label", e.target.value);
|
||||
}} />;
|
||||
}
|
||||
return null;
|
||||
},
|
||||
},
|
||||
{
|
||||
title: i18next.t("application:Custom CSS"),
|
||||
dataIndex: "label",
|
||||
key: "label",
|
||||
dataIndex: "customCss",
|
||||
key: "customCss",
|
||||
width: "200px",
|
||||
render: (text, record, index) => {
|
||||
if (!record.name.startsWith("Text ") && !record?.isCustom) {
|
||||
@@ -205,13 +209,13 @@ class SigninTable extends React.Component {
|
||||
<CodeMirror value={text?.replaceAll("<style>", "").replaceAll("</style>", "")}
|
||||
options={{mode: "css", theme: "material-darker"}}
|
||||
onBeforeChange={(editor, data, value) => {
|
||||
this.updateField(table, index, "label", value);
|
||||
this.updateField(table, index, "customCss", value);
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
} title={i18next.t("application:CSS style")} trigger="click">
|
||||
<Input value={text?.replaceAll("<style>", "").replaceAll("</style>", "")} onChange={e => {
|
||||
this.updateField(table, index, "label", e.target.value);
|
||||
this.updateField(table, index, "customCss", e.target.value);
|
||||
}} />
|
||||
</Popover>
|
||||
);
|
||||
|
Reference in New Issue
Block a user