From f20b5d04f5e095de3348251ba669c5b13789298f Mon Sep 17 00:00:00 2001 From: Xavier Priour Date: Wed, 9 Dec 2015 00:35:45 +0100 Subject: export board to Wekan JSON --- client/components/boards/boardHeader.jade | 1 + client/components/boards/boardHeader.js | 6 ++++++ 2 files changed, 7 insertions(+) (limited to 'client/components/boards') diff --git a/client/components/boards/boardHeader.jade b/client/components/boards/boardHeader.jade index a0160382..3e608d4a 100644 --- a/client/components/boards/boardHeader.jade +++ b/client/components/boards/boardHeader.jade @@ -56,6 +56,7 @@ template(name="boardMenuPopup") if currentUser.isBoardAdmin hr ul.pop-over-list + li: a.js-export-board(href="{{urlExport}}", download) {{_ 'export-board'}} li: a.js-archive-board {{_ 'archive-board'}} template(name="boardVisibilityList") diff --git a/client/components/boards/boardHeader.js b/client/components/boards/boardHeader.js index 3dc6d754..3503cbfb 100644 --- a/client/components/boards/boardHeader.js +++ b/client/components/boards/boardHeader.js @@ -15,6 +15,12 @@ Template.boardMenuPopup.events({ }), }); +Template.boardMenuPopup.helpers({ + urlExport() { + return Meteor.absoluteUrl(`api/b/${Session.get('currentBoard')}`); + }, +}); + Template.boardChangeTitlePopup.events({ submit(evt, tpl) { const newTitle = tpl.$('.js-board-name').val().trim(); -- cgit v1.2.3-1-g7c22 From 18697d45f652a119ba21b0cef42fbf732902bfa9 Mon Sep 17 00:00:00 2001 From: Xavier Priour Date: Sun, 13 Dec 2015 20:02:34 +0100 Subject: board export now checks authentication --- client/components/boards/boardHeader.jade | 2 +- client/components/boards/boardHeader.js | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) (limited to 'client/components/boards') diff --git a/client/components/boards/boardHeader.jade b/client/components/boards/boardHeader.jade index 3e608d4a..f264a6d9 100644 --- a/client/components/boards/boardHeader.jade +++ b/client/components/boards/boardHeader.jade @@ -56,7 +56,7 @@ template(name="boardMenuPopup") if currentUser.isBoardAdmin hr ul.pop-over-list - li: a.js-export-board(href="{{urlExport}}", download) {{_ 'export-board'}} + li: a.js-export-board {{_ 'export-board'}} li: a.js-archive-board {{_ 'archive-board'}} template(name="boardVisibilityList") diff --git a/client/components/boards/boardHeader.js b/client/components/boards/boardHeader.js index 3503cbfb..34204a46 100644 --- a/client/components/boards/boardHeader.js +++ b/client/components/boards/boardHeader.js @@ -13,6 +13,20 @@ Template.boardMenuPopup.events({ // confirm that the board was successfully archived. FlowRouter.go('home'); }), + 'click .js-export-board'() { + const boardId = Session.get('currentBoard'); + Meteor.call('exportBoard', boardId, (error, response) => { + if(error) { + // the only error we can anticipate is accessing a non-authorized board + // and this should have been caugh by UI before. + // So no treatment here for the time being. + } else { + const dataToSave = new Blob([JSON.stringify(response)], {type: 'application/json;charset=utf-8'}); + const filename = `wekan-export-board-${boardId}.json`; + saveAs(dataToSave, filename); + } + }); + } }); Template.boardMenuPopup.helpers({ -- cgit v1.2.3-1-g7c22 From f5eba16a50056c20d86044f7fa025bf21eef1264 Mon Sep 17 00:00:00 2001 From: Xavier Priour Date: Sun, 13 Dec 2015 21:38:22 +0100 Subject: fix eslint --- client/components/boards/boardHeader.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'client/components/boards') diff --git a/client/components/boards/boardHeader.js b/client/components/boards/boardHeader.js index b5a31754..b5bb0dbb 100644 --- a/client/components/boards/boardHeader.js +++ b/client/components/boards/boardHeader.js @@ -1,3 +1,4 @@ +/* global saveAs */ Template.boardMenuPopup.events({ 'click .js-rename-board': Popup.open('boardChangeTitle'), 'click .js-open-archives'() { @@ -26,7 +27,7 @@ Template.boardMenuPopup.events({ saveAs(dataToSave, filename); } }); - } + }, }); Template.boardMenuPopup.helpers({ -- cgit v1.2.3-1-g7c22 From d08e1cc45b7f894f360f3a8a89e235ccc47b8f96 Mon Sep 17 00:00:00 2001 From: Xavier Priour Date: Wed, 16 Dec 2015 21:54:35 +0100 Subject: Export Wekan now server-based with proper auth --- client/components/boards/boardHeader.jade | 2 +- client/components/boards/boardHeader.js | 26 +++++++++----------------- 2 files changed, 10 insertions(+), 18 deletions(-) (limited to 'client/components/boards') diff --git a/client/components/boards/boardHeader.jade b/client/components/boards/boardHeader.jade index eb7ca984..a743311b 100644 --- a/client/components/boards/boardHeader.jade +++ b/client/components/boards/boardHeader.jade @@ -56,7 +56,7 @@ template(name="boardMenuPopup") if currentUser.isBoardAdmin hr ul.pop-over-list - li: a.js-export-board {{_ 'export-board'}} + li: a(href="{{exportUrl}}", download="{{exportFilename}}") {{_ 'export-board'}} li: a.js-archive-board {{_ 'archive-board'}} template(name="boardVisibilityList") diff --git a/client/components/boards/boardHeader.js b/client/components/boards/boardHeader.js index b5bb0dbb..0c9b5794 100644 --- a/client/components/boards/boardHeader.js +++ b/client/components/boards/boardHeader.js @@ -1,4 +1,3 @@ -/* global saveAs */ Template.boardMenuPopup.events({ 'click .js-rename-board': Popup.open('boardChangeTitle'), 'click .js-open-archives'() { @@ -14,25 +13,18 @@ Template.boardMenuPopup.events({ // confirm that the board was successfully archived. FlowRouter.go('home'); }), - 'click .js-export-board'() { - const boardId = Session.get('currentBoard'); - Meteor.call('exportBoard', boardId, (error, response) => { - if(error) { - // the only error we can anticipate is accessing a non-authorized board - // and this should have been caugh by UI before. - // So no treatment here for the time being. - } else { - const dataToSave = new Blob([JSON.stringify(response)], {type: 'application/json;charset=utf-8'}); - const filename = `wekan-export-board-${boardId}.json`; - saveAs(dataToSave, filename); - } - }); - }, }); Template.boardMenuPopup.helpers({ - urlExport() { - return Meteor.absoluteUrl(`api/b/${Session.get('currentBoard')}`); + exportUrl() { + const boardId = Session.get('currentBoard'); + const userId = Meteor.userId(); + const loginToken = Accounts._storedLoginToken(); + return Meteor.absoluteUrl(`api/b/${boardId}/${userId}/${loginToken}`); + }, + exportFilename() { + const boardId = Session.get('currentBoard'); + return `wekan-export-board-${boardId}.json`; }, }); -- cgit v1.2.3-1-g7c22 From 115ea533f621dcc51543f131f05ea9276e9aabc5 Mon Sep 17 00:00:00 2001 From: Xavier Priour Date: Thu, 17 Dec 2015 23:57:28 +0100 Subject: Export: improved API routes - use an explicit "boards" domain: /api/boards/:boardId - pass authToken as a request parameter: /api/boards/:boardId?authToken=:token - in the future, same route can be used with authToken set in the Authenticate: header easily --- client/components/boards/boardHeader.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'client/components/boards') diff --git a/client/components/boards/boardHeader.js b/client/components/boards/boardHeader.js index 0c9b5794..2bf68a41 100644 --- a/client/components/boards/boardHeader.js +++ b/client/components/boards/boardHeader.js @@ -18,9 +18,8 @@ Template.boardMenuPopup.events({ Template.boardMenuPopup.helpers({ exportUrl() { const boardId = Session.get('currentBoard'); - const userId = Meteor.userId(); const loginToken = Accounts._storedLoginToken(); - return Meteor.absoluteUrl(`api/b/${boardId}/${userId}/${loginToken}`); + return Meteor.absoluteUrl(`api/boards/${boardId}?authToken=${loginToken}`); }, exportFilename() { const boardId = Session.get('currentBoard'); -- cgit v1.2.3-1-g7c22