From 6dc7404f23796784c212e6db1b4fca22c7a1ac82 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Mon, 28 Dec 2015 22:59:39 +0100 Subject: Share the router configuration between the client and the server --- config/router.js | 125 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 config/router.js (limited to 'config/router.js') 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 we create a +// reactive function whose role is to set any page-specific tag in the +// 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 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(' - ')); + }); +}); -- cgit v1.2.3-1-g7c22