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 --- client/config/router.js | 125 ------------------------------------------------ config/router.js | 125 ++++++++++++++++++++++++++++++++++++++++++++++++ sandstorm.js | 6 +-- 3 files changed, 127 insertions(+), 129 deletions(-) delete mode 100644 client/config/router.js create mode 100644 config/router.js diff --git a/client/config/router.js b/client/config/router.js deleted file mode 100644 index ddd69db4..00000000 --- a/client/config/router.js +++ /dev/null @@ -1,125 +0,0 @@ -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.startup(() => { - Tracker.autorun(() => { - const currentBoard = Boards.findOne(Session.get('currentBoard')); - const titleStack = [appTitle]; - if (currentBoard) { - titleStack.push(currentBoard.title); - } - DocHead.setTitle(titleStack.reverse().join(' - ')); - }); -}); 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(' - ')); + }); +}); diff --git a/sandstorm.js b/sandstorm.js index 11bafa10..def07eea 100644 --- a/sandstorm.js +++ b/sandstorm.js @@ -51,10 +51,8 @@ if (isSandstorm && Meteor.isServer) { // XXX Maybe the sandstorm http-bridge could provide some kind of "home URL" // in the manifest? const base = req.headers['x-sandstorm-base-path']; - // XXX If this routing scheme changes, this will break. We should generate - // the location URL using the router, but at the time of writing, the - // it is only accessible on the client. - const boardPath = `/b/${sandstormBoard._id}/${sandstormBoard.slug}`; + const { _id, slug } = sandstormBoard; + const boardPath = FlowRouter.path('board', { id: _id, slug }); res.writeHead(301, { Location: base + boardPath, -- cgit v1.2.3-1-g7c22