mirror of https://github.com/wekan/wekan
The Open Source kanban (built with Meteor). Keep variable/table/field names camelCase. For translations, only add Pull Request changes to wekan/i18n/en.i18n.json , other translations are done at https://transifex.com/wekan/wekan only.
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
183 lines
4.5 KiB
183 lines
4.5 KiB
BlazeLayout.setRoot('body');
|
|
|
|
const i18nTagToT9n = i18nTag => {
|
|
// t9n/i18n tags are same now, see: https://github.com/softwarerero/meteor-accounts-t9n/pull/129
|
|
// but we keep this conversion function here, to be aware that that they are different system.
|
|
return i18nTag;
|
|
};
|
|
|
|
const validator = {
|
|
set(obj, prop, value) {
|
|
if (prop === 'state' && value !== 'signIn') {
|
|
$('.at-form-authentication').hide();
|
|
} else if (prop === 'state' && value === 'signIn') {
|
|
$('.at-form-authentication').show();
|
|
}
|
|
// The default behavior to store the value
|
|
obj[prop] = value;
|
|
// Indicate success
|
|
return true;
|
|
},
|
|
};
|
|
|
|
Template.userFormsLayout.onCreated(function() {
|
|
const templateInstance = this;
|
|
templateInstance.currentSetting = new ReactiveVar();
|
|
templateInstance.isLoading = new ReactiveVar(false);
|
|
|
|
Meteor.subscribe('setting', {
|
|
onReady() {
|
|
templateInstance.currentSetting.set(Settings.findOne());
|
|
return this.stop();
|
|
},
|
|
});
|
|
});
|
|
|
|
Template.userFormsLayout.onRendered(() => {
|
|
AccountsTemplates.state.form.keys = new Proxy(
|
|
AccountsTemplates.state.form.keys,
|
|
validator,
|
|
);
|
|
|
|
const i18nTag = navigator.language;
|
|
if (i18nTag) {
|
|
T9n.setLanguage(i18nTagToT9n(i18nTag));
|
|
}
|
|
EscapeActions.executeAll();
|
|
});
|
|
|
|
Template.userFormsLayout.helpers({
|
|
currentSetting() {
|
|
return Template.instance().currentSetting.get();
|
|
},
|
|
|
|
isLoading() {
|
|
return Template.instance().isLoading.get();
|
|
},
|
|
|
|
afterBodyStart() {
|
|
return currentSetting.customHTMLafterBodyStart;
|
|
},
|
|
|
|
beforeBodyEnd() {
|
|
return currentSetting.customHTMLbeforeBodyEnd;
|
|
},
|
|
|
|
languages() {
|
|
return _.map(TAPi18n.getLanguages(), (lang, code) => {
|
|
const tag = code;
|
|
let name = lang.name;
|
|
if (lang.name === 'br') {
|
|
name = 'Brezhoneg';
|
|
} else if (lang.name === 'ig') {
|
|
name = 'Igbo';
|
|
} else if (lang.name === 'oc') {
|
|
name = 'Occitan';
|
|
} else if (lang.name === '繁体中文(台湾)') {
|
|
name = '繁體中文(台灣)';
|
|
}
|
|
return { tag, name };
|
|
}).sort(function(a, b) {
|
|
if (a.name === b.name) {
|
|
return 0;
|
|
} else {
|
|
return a.name > b.name ? 1 : -1;
|
|
}
|
|
});
|
|
},
|
|
|
|
isCurrentLanguage() {
|
|
const t9nTag = i18nTagToT9n(this.tag);
|
|
const curLang = T9n.getLanguage() || 'en';
|
|
return t9nTag === curLang;
|
|
},
|
|
});
|
|
|
|
Template.userFormsLayout.events({
|
|
'change .js-userform-set-language'(event) {
|
|
const i18nTag = $(event.currentTarget).val();
|
|
T9n.setLanguage(i18nTagToT9n(i18nTag));
|
|
event.preventDefault();
|
|
},
|
|
'click #at-btn'(event, templateInstance) {
|
|
if (FlowRouter.getRouteName() === 'atSignIn') {
|
|
templateInstance.isLoading.set(true);
|
|
authentication(event, templateInstance).then(() => {
|
|
templateInstance.isLoading.set(false);
|
|
});
|
|
}
|
|
},
|
|
});
|
|
|
|
Template.defaultLayout.events({
|
|
'click .js-close-modal': () => {
|
|
Modal.close();
|
|
},
|
|
});
|
|
|
|
async function authentication(event, templateInstance) {
|
|
const match = $('#at-field-username_and_email').val();
|
|
const password = $('#at-field-password').val();
|
|
|
|
if (!match || !password) return undefined;
|
|
|
|
const result = await getAuthenticationMethod(
|
|
templateInstance.currentSetting.get(),
|
|
match,
|
|
);
|
|
|
|
if (result === 'password') return undefined;
|
|
|
|
// Stop submit #at-pwd-form
|
|
event.preventDefault();
|
|
event.stopImmediatePropagation();
|
|
|
|
switch (result) {
|
|
case 'ldap':
|
|
return new Promise(resolve => {
|
|
Meteor.loginWithLDAP(match, password, function() {
|
|
resolve(FlowRouter.go('/'));
|
|
});
|
|
});
|
|
|
|
case 'cas':
|
|
return new Promise(resolve => {
|
|
Meteor.loginWithCas(match, password, function() {
|
|
resolve(FlowRouter.go('/'));
|
|
});
|
|
});
|
|
|
|
default:
|
|
return undefined;
|
|
}
|
|
}
|
|
|
|
function getAuthenticationMethod(
|
|
{ displayAuthenticationMethod, defaultAuthenticationMethod },
|
|
match,
|
|
) {
|
|
if (displayAuthenticationMethod) {
|
|
return $('.select-authentication').val();
|
|
}
|
|
return getUserAuthenticationMethod(defaultAuthenticationMethod, match);
|
|
}
|
|
|
|
function getUserAuthenticationMethod(defaultAuthenticationMethod, match) {
|
|
return new Promise(resolve => {
|
|
try {
|
|
Meteor.subscribe('user-authenticationMethod', match, {
|
|
onReady() {
|
|
const user = Users.findOne();
|
|
|
|
const authenticationMethod = user
|
|
? user.authenticationMethod
|
|
: defaultAuthenticationMethod;
|
|
|
|
resolve(authenticationMethod);
|
|
},
|
|
});
|
|
} catch (error) {
|
|
resolve(defaultAuthenticationMethod);
|
|
}
|
|
});
|
|
}
|
|
|