summaryrefslogtreecommitdiffstats
path: root/config
diff options
context:
space:
mode:
authorMaxime Quandalle <maxime@quandalle.com>2015-12-28 22:59:39 +0100
committerMaxime Quandalle <maxime@quandalle.com>2015-12-28 23:13:20 +0100
commit6dc7404f23796784c212e6db1b4fca22c7a1ac82 (patch)
tree1a9dc8df304eb76359b5f049e58e436b75fa43fc /config
parent592aa6d5762b6d04e4f66364da4a58cea6b25d67 (diff)
downloadwekan-6dc7404f23796784c212e6db1b4fca22c7a1ac82.tar.gz
wekan-6dc7404f23796784c212e6db1b4fca22c7a1ac82.tar.bz2
wekan-6dc7404f23796784c212e6db1b4fca22c7a1ac82.zip
Share the router configuration between the client and the server
Diffstat (limited to 'config')
-rw-r--r--config/router.js125
1 files changed, 125 insertions, 0 deletions
diff --git a/config/router.js b/config/router.js
new file mode 100644
index 00000000..99d5bff6
--- /dev/null
+++ b/config/router.js
@@ -0,0 +1,125 @@
+let previousPath;
+FlowRouter.triggers.exit([({path}) => {
+ previousPath = path;
+}]);
+
+FlowRouter.route('/', {
+ name: 'home',
+ triggersEnter: [AccountsTemplates.ensureSignedIn],
+ action() {
+ Session.set('currentBoard', null);
+ Session.set('currentCard', null);
+
+ Filter.reset();
+ EscapeActions.executeAll();
+
+ BlazeLayout.render('defaultLayout', {
+ headerBar: 'boardListHeaderBar',
+ content: 'boardList',
+ });
+ },
+});
+
+FlowRouter.route('/b/:id/:slug', {
+ name: 'board',
+ action(params) {
+ const currentBoard = params.id;
+ const previousBoard = Session.get('currentBoard');
+ Session.set('currentBoard', currentBoard);
+ Session.set('currentCard', null);
+
+ // If we close a card, we'll execute again this route action but we don't
+ // want to excape every current actions (filters, etc.)
+ if (previousBoard !== currentBoard) {
+ EscapeActions.executeAll();
+ } else {
+ EscapeActions.executeUpTo('popup-close');
+ }
+
+ BlazeLayout.render('defaultLayout', {
+ headerBar: 'boardHeaderBar',
+ content: 'board',
+ });
+ },
+});
+
+FlowRouter.route('/b/:boardId/:slug/:cardId', {
+ name: 'card',
+ action(params) {
+ EscapeActions.executeUpTo('inlinedForm');
+
+ Session.set('currentBoard', params.boardId);
+ Session.set('currentCard', params.cardId);
+
+ BlazeLayout.render('defaultLayout', {
+ headerBar: 'boardHeaderBar',
+ content: 'board',
+ });
+ },
+});
+
+FlowRouter.route('/shortcuts', {
+ name: 'shortcuts',
+ action() {
+ const shortcutsTemplate = 'keyboardShortcuts';
+
+ EscapeActions.executeUpTo('popup-close');
+
+ if (previousPath) {
+ Modal.open(shortcutsTemplate, {
+ header: 'shortcutsModalTitle',
+ onCloseGoTo: previousPath,
+ });
+ } else {
+ BlazeLayout.render('defaultLayout', {
+ headerBar: 'shortcutsHeaderBar',
+ content: shortcutsTemplate,
+ });
+ }
+ },
+});
+
+FlowRouter.notFound = {
+ action() {
+ BlazeLayout.render('defaultLayout', { content: 'notFound' });
+ },
+};
+
+// We maintain a list of redirections to ensure that we don't break old URLs
+// when we change our routing scheme.
+const redirections = {
+ '/boards': '/',
+ '/boards/:id/:slug': '/b/:id/:slug',
+ '/boards/:id/:slug/:cardId': '/b/:id/:slug/:cardId',
+};
+
+_.each(redirections, (newPath, oldPath) => {
+ FlowRouter.route(oldPath, {
+ triggersEnter: [(context, redirect) => {
+ redirect(FlowRouter.path(newPath, context.params));
+ }],
+ });
+});
+
+// As it is not possible to use template helpers in the page <head> we create a
+// reactive function whose role is to set any page-specific tag in the <head>
+// using the `kadira:dochead` package. Currently we only use it to display the
+// board title if we are in a board page (see #364) but we may want to support
+// some <meta> tags in the future.
+const appTitle = 'Wekan';
+
+// XXX The `Meteor.startup` should not be necessary -- we don't need to wait for
+// the complete DOM to be ready to call `DocHead.setTitle`. But the problem is
+// that the global variable `Boards` is undefined when this file loads so we
+// wait a bit until hopefully all files are loaded. This will be fixed in a
+// clean way once Meteor will support ES6 modules -- hopefully in Meteor 1.3.
+Meteor.isClient && Meteor.startup(() => {
+ Tracker.autorun(() => {
+ const currentBoard = Boards.findOne(Session.get('currentBoard'));
+ const titleStack = [appTitle];
+ if (currentBoard) {
+ titleStack.push(currentBoard.title);
+ }
+ DocHead.setTitle(titleStack.reverse().join(' - '));
+ });
+});