mirror of
https://github.com/discourse/discourse.git
synced 2025-05-24 03:36:18 +08:00
197 lines
6.1 KiB
JavaScript
197 lines
6.1 KiB
JavaScript
import { setting } from 'discourse/lib/computed';
|
|
import logout from 'discourse/lib/logout';
|
|
import showModal from 'discourse/lib/show-modal';
|
|
import OpenComposer from "discourse/mixins/open-composer";
|
|
|
|
function unlessReadOnly(method) {
|
|
return function() {
|
|
if (this.site.get("isReadOnly")) {
|
|
bootbox.alert(I18n.t("read_only_mode.login_disabled"));
|
|
} else {
|
|
this[method]();
|
|
}
|
|
};
|
|
}
|
|
|
|
const ApplicationRoute = Discourse.Route.extend(OpenComposer, {
|
|
siteTitle: setting('title'),
|
|
|
|
actions: {
|
|
|
|
logout() {
|
|
this.currentUser.destroySession().then(() => logout(this.siteSettings));
|
|
},
|
|
|
|
_collectTitleTokens(tokens) {
|
|
tokens.push(this.get('siteTitle'));
|
|
Discourse.set('_docTitle', tokens.join(' - '));
|
|
},
|
|
|
|
// Ember doesn't provider a router `willTransition` event so let's make one
|
|
willTransition() {
|
|
var router = this.container.lookup('router:main');
|
|
Ember.run.once(router, router.trigger, 'willTransition');
|
|
return this._super();
|
|
},
|
|
|
|
// This is here as a bugfix for when an Ember Cloaked view triggers
|
|
// a scroll after a controller has been torn down. The real fix
|
|
// should be to fix ember cloaking to not do that, but this catches
|
|
// it safely just in case.
|
|
postChangedRoute: Ember.K,
|
|
|
|
showTopicEntrance(data) {
|
|
this.controllerFor('topic-entrance').send('show', data);
|
|
},
|
|
|
|
postWasEnqueued(details) {
|
|
const title = details.reason ? 'queue_reason.' + details.reason + '.title' : 'queue.approval.title';
|
|
showModal('post-enqueued', {model: details, title });
|
|
},
|
|
|
|
composePrivateMessage(user, post) {
|
|
const self = this;
|
|
this.transitionTo('userActivity', user).then(function () {
|
|
self.controllerFor('user-activity').send('composePrivateMessage', user, post);
|
|
});
|
|
},
|
|
|
|
error(err, transition) {
|
|
if (err.status === 404) {
|
|
// 404
|
|
this.transitionTo('unknown');
|
|
return;
|
|
}
|
|
|
|
const exceptionController = this.controllerFor('exception'),
|
|
stack = err.stack;
|
|
|
|
// If we have a stack call `toString` on it. It gives us a better
|
|
// stack trace since `console.error` uses the stack track of this
|
|
// error callback rather than the original error.
|
|
let errorString = err.toString();
|
|
if (stack) { errorString = stack.toString(); }
|
|
|
|
if (err.statusText) { errorString = err.statusText; }
|
|
|
|
const c = window.console;
|
|
if (c && c.error) {
|
|
c.error(errorString);
|
|
}
|
|
exceptionController.setProperties({ lastTransition: transition, thrown: err });
|
|
|
|
this.intermediateTransitionTo('exception');
|
|
},
|
|
|
|
showLogin: unlessReadOnly('handleShowLogin'),
|
|
|
|
showCreateAccount: unlessReadOnly('handleShowCreateAccount'),
|
|
|
|
showForgotPassword() {
|
|
showModal('forgotPassword', { title: 'forgot_password.title' });
|
|
},
|
|
|
|
showNotActivated(props) {
|
|
const controller = showModal('not-activated', {title: 'log_in' });
|
|
controller.setProperties(props);
|
|
},
|
|
|
|
showUploadSelector(composerView) {
|
|
showModal('uploadSelector');
|
|
this.controllerFor('upload-selector').setProperties({ composerView: composerView });
|
|
},
|
|
|
|
showKeyboardShortcutsHelp() {
|
|
showModal('keyboard-shortcuts-help', { title: 'keyboard_shortcuts_help.title'});
|
|
},
|
|
|
|
// Close the current modal, and destroy its state.
|
|
closeModal() {
|
|
this.render('hide-modal', { into: 'modal', outlet: 'modalBody' });
|
|
},
|
|
|
|
/**
|
|
Hide the modal, but keep it with all its state so that it can be shown again later.
|
|
This is useful if you want to prompt for confirmation. hideModal, ask "Are you sure?",
|
|
user clicks "No", reopenModal. If user clicks "Yes", be sure to call closeModal.
|
|
**/
|
|
hideModal() {
|
|
$('#discourse-modal').modal('hide');
|
|
},
|
|
|
|
reopenModal() {
|
|
$('#discourse-modal').modal('show');
|
|
},
|
|
|
|
editCategory(category) {
|
|
const self = this;
|
|
Discourse.Category.reloadById(category.get('id')).then(function (model) {
|
|
self.site.updateCategory(model);
|
|
showModal('editCategory', { model });
|
|
self.controllerFor('editCategory').set('selectedTab', 'general');
|
|
});
|
|
},
|
|
|
|
deleteSpammer(user) {
|
|
this.send('closeModal');
|
|
user.deleteAsSpammer(function() { window.location.reload(); });
|
|
},
|
|
|
|
checkEmail(user) {
|
|
user.checkEmail();
|
|
},
|
|
|
|
changeBulkTemplate(w) {
|
|
const controllerName = w.replace('modal/', ''),
|
|
factory = this.container.lookupFactory('controller:' + controllerName);
|
|
|
|
this.render(w, {into: 'modal/topic-bulk-actions', outlet: 'bulkOutlet', controller: factory ? controllerName : 'topic-bulk-actions'});
|
|
},
|
|
|
|
createNewTopicViaParams(title, body, category_id, category) {
|
|
this.openComposerWithParams(this.controllerFor('discovery/topics'), title, body, category_id, category);
|
|
}
|
|
},
|
|
|
|
activate() {
|
|
this._super();
|
|
Em.run.next(function() {
|
|
// Support for callbacks once the application has activated
|
|
ApplicationRoute.trigger('activate');
|
|
});
|
|
},
|
|
|
|
handleShowLogin() {
|
|
if (this.siteSettings.enable_sso) {
|
|
const returnPath = encodeURIComponent(window.location.pathname);
|
|
window.location = Discourse.getURL('/session/sso?return_path=' + returnPath);
|
|
} else {
|
|
this._autoLogin('login', 'login-modal', () => this.controllerFor('login').resetForm());
|
|
}
|
|
},
|
|
|
|
handleShowCreateAccount() {
|
|
if (this.siteSettings.enable_sso) {
|
|
const returnPath = encodeURIComponent(window.location.pathname);
|
|
window.location = Discourse.getURL('/session/sso?return_path=' + returnPath);
|
|
} else {
|
|
this._autoLogin('createAccount', 'create-account');
|
|
}
|
|
},
|
|
|
|
_autoLogin(modal, modalClass, notAuto) {
|
|
const methods = Em.get('Discourse.LoginMethod.all');
|
|
if (!this.siteSettings.enable_local_logins && methods.length === 1) {
|
|
this.controllerFor('login').send('externalLogin', methods[0]);
|
|
} else {
|
|
showModal(modal);
|
|
this.controllerFor('modal').set('modalClass', modalClass);
|
|
if (notAuto) { notAuto(); }
|
|
}
|
|
},
|
|
|
|
});
|
|
|
|
RSVP.EventTarget.mixin(ApplicationRoute);
|
|
export default ApplicationRoute;
|