From 027aacb50e2baf715c89d914e34132458cf11691 Mon Sep 17 00:00:00 2001 From: Xavier Priour Date: Fri, 23 Oct 2015 03:37:34 +0200 Subject: Import members: added UI --- client/components/import/import.jade | 8 +++++++ client/components/import/import.js | 42 +++++++++++++++++++++++++++--------- 2 files changed, 40 insertions(+), 10 deletions(-) (limited to 'client') diff --git a/client/components/import/import.jade b/client/components/import/import.jade index f63661af..799834fa 100644 --- a/client/components/import/import.jade +++ b/client/components/import/import.jade @@ -5,3 +5,11 @@ template(name="importPopup") p: label(for='import-textarea') {{_ getLabel}} textarea#import-textarea.js-import-json(placeholder="{{_ 'import-json-placeholder'}}" autofocus) input.primary.wide(type="submit" value="{{_ 'import'}}") + +template(name="mapMembersPopup") + p {{_ 'import-members-map'}} + ul + each members + li.item {{ fullName }} > world + form + input.primary.wide(type="submit" value="{{_ 'import'}}") diff --git a/client/components/import/import.js b/client/components/import/import.js index c6957fa9..f46f15bc 100644 --- a/client/components/import/import.js +++ b/client/components/import/import.js @@ -13,32 +13,44 @@ const ImportPopup = BlazeComponent.extendComponent({ events() { return [{ - 'submit': (evt) => { + submit(evt) { evt.preventDefault(); const dataJson = $(evt.currentTarget).find('.js-import-json').val(); let dataObject; try { dataObject = JSON.parse(dataJson); + this.setError(''); } catch (e) { this.setError('error-json-malformed'); return; } - Meteor.call(this.getMethodName(), dataObject, this.getAdditionalData(), - (error, response) => { - if (error) { - this.setError(error.error); - } else { - Filter.addException(response); - this.onFinish(response); + if(dataObject.members.length > 0) { + this.data().toImport = dataObject; + members.forEach( + // todo if there is a Wekan user with same name, add it as a field 'wekanUser' + ); + this.data().members = dataObject.members; + // we bind to preserve data context + Popup.open('mapMembers').bind(this)(evt); + } else { + Meteor.call(this.getMethodName(), dataObject, this.getAdditionalData(), + (error, response) => { + if (error) { + this.setError(error.error); + } else { + Filter.addException(response); + this.onFinish(response); + } } - } - ); + ); + } }, }]; }, onCreated() { this.error = new ReactiveVar(''); + this.dataToImport = ''; }, setError(error) { @@ -88,3 +100,13 @@ ImportPopup.extendComponent({ }, }).register('boardImportBoardPopup'); +BlazeComponent.extendComponent({ + events() { + return [{ + 'submit': (evt) => { + evt.preventDefault(); + console.log(this.data()); + }, + }]; + }, +}).register('mapMembersPopup'); -- cgit v1.2.3-1-g7c22 From 3dc70b3ea4d49bccb10d4f2b3e317c794da91e37 Mon Sep 17 00:00:00 2001 From: Xavier Priour Date: Fri, 13 Nov 2015 12:35:41 +0100 Subject: Import members: UI flow ok --- client/components/import/import.jade | 45 ++++++- client/components/import/import.js | 212 ++++++++++++++++++++++++++------- client/components/import/import.styl | 13 ++ client/components/sidebar/sidebar.jade | 2 +- 4 files changed, 220 insertions(+), 52 deletions(-) create mode 100644 client/components/import/import.styl (limited to 'client') diff --git a/client/components/import/import.jade b/client/components/import/import.jade index 799834fa..07e1116b 100644 --- a/client/components/import/import.jade +++ b/client/components/import/import.jade @@ -7,9 +7,42 @@ template(name="importPopup") input.primary.wide(type="submit" value="{{_ 'import'}}") template(name="mapMembersPopup") - p {{_ 'import-members-map'}} - ul - each members - li.item {{ fullName }} > world - form - input.primary.wide(type="submit" value="{{_ 'import'}}") + .map-members + p {{_ 'import-members-map'}} + .mapping-list + each members + .mapping + a.source + div.full-name + = fullName + div.username + | ({{username}}) + .wekan + if wekan + +userAvatar(userId=wekan._id) + else + a.member.add-member.js-add-members + i.fa.fa-plus + form + input.primary.wide(type="submit" value="{{_ 'import'}}") + + template(name="addMemberPopup") + +template(name="mapMembersAddPopup") + .select-member + p Hello world + .js-map-member + +esInput(index="users") + ul.pop-over-list + +esEach(index="users") + li.item.js-member-item + a.name.js-select-member(title="{{profile.name}} ({{username}})" data-id="{{_id}}") + +userAvatar(userId=_id esSearch=true) + span.full-name + = profile.name + | ({{username}}) + +ifEsIsSearching(index='users') + +spinner + +ifEsHasNoResults(index="users") + .manage-member-section + p.quiet {{_ 'no-results'}} diff --git a/client/components/import/import.js b/client/components/import/import.js index f46f15bc..3682afdb 100644 --- a/client/components/import/import.js +++ b/client/components/import/import.js @@ -11,60 +11,76 @@ const ImportPopup = BlazeComponent.extendComponent({ return 'importPopup'; }, - events() { - return [{ - submit(evt) { - evt.preventDefault(); - const dataJson = $(evt.currentTarget).find('.js-import-json').val(); - let dataObject; - try { - dataObject = JSON.parse(dataJson); - this.setError(''); - } catch (e) { - this.setError('error-json-malformed'); - return; + onCreated() { + this.error = new ReactiveVar(''); + this.dataToImport = ''; + }, + + onFinish() { + Popup.close(); + }, + + onSubmit(evt){ + evt.preventDefault(); + const dataJson = $(evt.currentTarget).find('.js-import-json').val(); + let dataObject; + try { + dataObject = JSON.parse(dataJson); + this.setError(''); + } catch (e) { + this.setError('error-json-malformed'); + return; + } + // if there are members listed in the import, we need to map them + if(dataObject.members.length > 0) { + // we will work on the list itself (an ordered array of POJO) + // when a mapping is done, we add a 'wekan' field to the POJO representing the imported member + const membersToMap = dataObject.members; + // todo save initial import object - to save later, on mapping submission + // this.data().toImport = dataObject; + + // auto-map based on username + const wekanMembers = Users; + membersToMap.forEach((importedMember) => { + const wekanUser = Users.findOne({username: importedMember.username}) + if(wekanUser) { + importedMember.wekan = wekanUser; } - if(dataObject.members.length > 0) { - this.data().toImport = dataObject; - members.forEach( - // todo if there is a Wekan user with same name, add it as a field 'wekanUser' - ); - this.data().members = dataObject.members; - // we bind to preserve data context - Popup.open('mapMembers').bind(this)(evt); - } else { - Meteor.call(this.getMethodName(), dataObject, this.getAdditionalData(), - (error, response) => { - if (error) { - this.setError(error.error); - } else { - Filter.addException(response); - this.onFinish(response); - } - } - ); + }); + // store members data and mapping in Session + // (we go deep and 2-way, so storing in data context is not a viable option) + Session.set('import.membersToMap', membersToMap); + Popup.open('mapMembers')(evt); + } else { + Meteor.call(this.getMethodName(), dataObject, this.getAdditionalData(), + (error, response) => { + if (error) { + this.setError(error.error); + } else { + // ensure will display what we just imported + Filter.addException(response); + this.onFinish(response); + } } - }, - }]; + ); + } }, - onCreated() { - this.error = new ReactiveVar(''); - this.dataToImport = ''; + events() { + return [{ + submit: this.onSubmit, + }]; }, setError(error) { this.error.set(error); }, - onFinish() { - Popup.close(); - }, }); ImportPopup.extendComponent({ getAdditionalData() { - const listId = this.data()._id; + const listId = this.currentData()._id; const selector = `#js-list-${this.currentData()._id} .js-minicard:first`; const firstCardDom = $(selector).get(0); const sortIndex = Utils.calculateIndex(null, firstCardDom).base; @@ -100,13 +116,119 @@ ImportPopup.extendComponent({ }, }).register('boardImportBoardPopup'); -BlazeComponent.extendComponent({ +const ImportMapMembers = BlazeComponent.extendComponent({ + members() { + return Session.get('import.membersToMap'); + }, + _refreshMembers(listOfMembers) { + Session.set('import.membersToMap', listOfMembers); + }, + /** + * Will look into the list of members to import for the specified memberId, + * then set its property to the supplied value. + * If unset is true, it will remove the property from the rest of the list as well. + * + * use: + * - memberId = null to use selected member + * - value = null to unset a property + * - unset = true to ensure property is only set on 1 member at a time + */ + _setPropertyForMember(property, value, memberId, unset = false) { + const listOfMembers = this.members(); + let finder = null; + if(memberId) { + finder = (member) => member.id === memberId; + } else { + finder = (member) => member.selected; + } + listOfMembers.forEach((member) => { + if(finder(member)) { + if(value !== null) { + member[property] = true; + } else { + delete member[property]; + } + if(!unset) { + // we shortcut if we don't care about unsetting the others + return false; + } + } else { + if(unset) { + delete member[property]; + } + } + return true; + }); + // Session.get gives us a copy, we have to set it back so it sticks + this._refreshMembers(listOfMembers); + }, + setSelectedMember(memberId) { + return this._setPropertyForMember('selected', true, memberId, true); + }, + /** + * returns the member with specified id, + * or the selected member if memberId is not specified + */ + getMember(memberId = null) { + const allMembers = Session.get('import.membersToMap'); + let finder = null; + if(memberId) { + finder = (user) => user.id === memberId; + } else { + finder = (user) => user.selected; + } + return allMembers.find(finder); + }, + mapSelectedMember(wekan) { + return this._setPropertyForMember('wekan', wekan, null); + }, + unmapMember(memberId){ + return this._setPropertyForMember('wekan', null, memberId); + }, +}); + +ImportMapMembers.extendComponent({ + onSelectMember(evt) { + const memberToMap = this.currentData(); + this.setSelectedMember(memberToMap.id); + console.log(`selected member#${memberToMap.id}`); + Popup.open('mapMembersAdd')(evt); + }, + onRemove(evt){ + const userId = this.currentData()._id; + console.log(`confirm and then call unmapMember ${userId}`); + }, + onSubmit(evt) { + console.log("Mapping:"); + console.log(this.members()); + }, events() { return [{ - 'submit': (evt) => { - evt.preventDefault(); - console.log(this.data()); - }, + 'submit': this.onSubmit, + 'click .js-add-members': this.onSelectMember, + 'click .js-member': this.onRemove, }]; }, }).register('mapMembersPopup'); + +ImportMapMembers.extendComponent({ + //template() { + // return "mapMembersAddPopup"; + //}, + onSelectUser(){ + const wekanUser = this.currentData(); + console.log(`clicked on ${wekanUser._id}`); + console.log(wekanUser); + //this.mapSelectedMember(this.currentData()); + }, + events() { + return [{ + //'click .js-select-member': this.onSelectUser(), + }]; + }, + onRendered() { + console.log('rendered'); + // todo XXX why do I not focus?? + $('.js-map-member input').focus(); + }, +}).register('mapMembersAddPopup'); diff --git a/client/components/import/import.styl b/client/components/import/import.styl new file mode 100644 index 00000000..4934cbcc --- /dev/null +++ b/client/components/import/import.styl @@ -0,0 +1,13 @@ +.map-members + .mapping + margin-bottom: 10px + margin-top: 10px + border-bottom: solid + .source + display: inline-block + width: 80% + .wekan + display: inline-block + width: 35px + .member + float: none diff --git a/client/components/sidebar/sidebar.jade b/client/components/sidebar/sidebar.jade index 91047056..f98ea4ee 100644 --- a/client/components/sidebar/sidebar.jade +++ b/client/components/sidebar/sidebar.jade @@ -89,7 +89,7 @@ template(name="addMemberPopup") a.name.js-select-member(title="{{profile.name}} ({{username}})") +userAvatar(userId=_id esSearch=true) span.full-name - = profile.name + = profile.fullname | ({{username}}) if isBoardMember .quiet ({{_ 'joined'}}) -- cgit v1.2.3-1-g7c22 From f6f41270de1b5a2d3ff6aa4ca7d433915dd29bd9 Mon Sep 17 00:00:00 2001 From: Xavier Priour Date: Fri, 13 Nov 2015 15:52:14 +0100 Subject: Import members: working on card import --- client/components/import/import.jade | 9 +++- client/components/import/import.js | 95 ++++++++++++++++++++++-------------- 2 files changed, 65 insertions(+), 39 deletions(-) (limited to 'client') diff --git a/client/components/import/import.jade b/client/components/import/import.jade index 07e1116b..0f53e4d2 100644 --- a/client/components/import/import.jade +++ b/client/components/import/import.jade @@ -4,6 +4,11 @@ template(name="importPopup") form p: label(for='import-textarea') {{_ getLabel}} textarea#import-textarea.js-import-json(placeholder="{{_ 'import-json-placeholder'}}" autofocus) + | {{jsonText}} + if membersMapping + div + a.show-mapping + | {{_ 'show-mapping'}} input.primary.wide(type="submit" value="{{_ 'import'}}") template(name="mapMembersPopup") @@ -24,7 +29,7 @@ template(name="mapMembersPopup") a.member.add-member.js-add-members i.fa.fa-plus form - input.primary.wide(type="submit" value="{{_ 'import'}}") + input.primary.wide(type="submit" value="{{_ 'done'}}") template(name="addMemberPopup") @@ -36,7 +41,7 @@ template(name="mapMembersAddPopup") ul.pop-over-list +esEach(index="users") li.item.js-member-item - a.name.js-select-member(title="{{profile.name}} ({{username}})" data-id="{{_id}}") + a.name.js-select-import(title="{{profile.name}} ({{username}})" data-id="{{_id}}") +userAvatar(userId=_id esSearch=true) span.full-name = profile.name diff --git a/client/components/import/import.js b/client/components/import/import.js index 3682afdb..b42fcc5d 100644 --- a/client/components/import/import.js +++ b/client/components/import/import.js @@ -11,6 +11,14 @@ const ImportPopup = BlazeComponent.extendComponent({ return 'importPopup'; }, + jsonText() { + return Session.get('import.text'); + }, + + membersMapping() { + return Session.get('import.membersToMap'); + }, + onCreated() { this.error = new ReactiveVar(''); this.dataToImport = ''; @@ -20,9 +28,21 @@ const ImportPopup = BlazeComponent.extendComponent({ Popup.close(); }, + onShowMapping(evt) { + // todo xxx make it work - currently we don't find the text + // this._storeText(evt); + Popup.open('mapMembers')(evt); + }, + + _storeText(evt) { + const dataJson = $(evt.currentTarget).find('.js-import-json').val(); + Session.set('import.text', dataJson); + return dataJson; + }, + onSubmit(evt){ evt.preventDefault(); - const dataJson = $(evt.currentTarget).find('.js-import-json').val(); + const dataJson = this._storeText(evt); let dataObject; try { dataObject = JSON.parse(dataJson); @@ -31,18 +51,14 @@ const ImportPopup = BlazeComponent.extendComponent({ this.setError('error-json-malformed'); return; } - // if there are members listed in the import, we need to map them - if(dataObject.members.length > 0) { + // if there are members listed in the import and we have no mapping for them... + if(dataObject.members.length > 0 && !this.membersMapping()) { // we will work on the list itself (an ordered array of POJO) // when a mapping is done, we add a 'wekan' field to the POJO representing the imported member const membersToMap = dataObject.members; - // todo save initial import object - to save later, on mapping submission - // this.data().toImport = dataObject; - // auto-map based on username - const wekanMembers = Users; membersToMap.forEach((importedMember) => { - const wekanUser = Users.findOne({username: importedMember.username}) + const wekanUser = Users.findOne({username: importedMember.username}); if(wekanUser) { importedMember.wekan = wekanUser; } @@ -52,7 +68,20 @@ const ImportPopup = BlazeComponent.extendComponent({ Session.set('import.membersToMap', membersToMap); Popup.open('mapMembers')(evt); } else { - Meteor.call(this.getMethodName(), dataObject, this.getAdditionalData(), + const additionalData = this.getAdditionalData(); + const membersMapping = this.membersMapping(); + if(membersMapping) { + const mappingById = {}; + membersMapping.forEach((member) => { + if (member.wekan) { + mappingById[member.id] = member.wekan._id; + } + }); + additionalData.membersMapping = mappingById; + } + Session.set('import.membersToMap', null); + Session.set('import.text', null); + Meteor.call(this.getMethodName(), dataObject, additionalData, (error, response) => { if (error) { this.setError(error.error); @@ -69,6 +98,7 @@ const ImportPopup = BlazeComponent.extendComponent({ events() { return [{ submit: this.onSubmit, + 'click .show-mapping': this.onShowMapping, }]; }, @@ -144,7 +174,7 @@ const ImportMapMembers = BlazeComponent.extendComponent({ listOfMembers.forEach((member) => { if(finder(member)) { if(value !== null) { - member[property] = true; + member[property] = value; } else { delete member[property]; } @@ -152,10 +182,8 @@ const ImportMapMembers = BlazeComponent.extendComponent({ // we shortcut if we don't care about unsetting the others return false; } - } else { - if(unset) { - delete member[property]; - } + } else if(unset) { + delete member[property]; } return true; }); @@ -188,47 +216,40 @@ const ImportMapMembers = BlazeComponent.extendComponent({ }); ImportMapMembers.extendComponent({ - onSelectMember(evt) { + onMapMember(evt) { const memberToMap = this.currentData(); - this.setSelectedMember(memberToMap.id); - console.log(`selected member#${memberToMap.id}`); - Popup.open('mapMembersAdd')(evt); - }, - onRemove(evt){ - const userId = this.currentData()._id; - console.log(`confirm and then call unmapMember ${userId}`); + if(memberToMap.wekan) { + // todo xxx ask for confirmation? + this.unmapMember(memberToMap.id); + } else { + this.setSelectedMember(memberToMap.id); + Popup.open('mapMembersAdd')(evt); + } }, onSubmit(evt) { - console.log("Mapping:"); - console.log(this.members()); + evt.preventDefault(); + Popup.back(); }, events() { return [{ 'submit': this.onSubmit, - 'click .js-add-members': this.onSelectMember, - 'click .js-member': this.onRemove, + 'click .mapping': this.onMapMember, }]; }, }).register('mapMembersPopup'); ImportMapMembers.extendComponent({ - //template() { - // return "mapMembersAddPopup"; - //}, onSelectUser(){ - const wekanUser = this.currentData(); - console.log(`clicked on ${wekanUser._id}`); - console.log(wekanUser); - //this.mapSelectedMember(this.currentData()); + this.mapSelectedMember(this.currentData()); + Popup.back(); }, events() { return [{ - //'click .js-select-member': this.onSelectUser(), + 'click .js-select-import': this.onSelectUser, }]; }, onRendered() { - console.log('rendered'); - // todo XXX why do I not focus?? - $('.js-map-member input').focus(); + // todo XXX why do I not get the focus?? + this.find('.js-map-member input').focus(); }, }).register('mapMembersAddPopup'); -- cgit v1.2.3-1-g7c22 From dd0a6e1a8223cbb80ea940985dc9706d468ed72c Mon Sep 17 00:00:00 2001 From: Xavier Priour Date: Fri, 13 Nov 2015 19:17:09 +0100 Subject: Import members: board import --- client/components/import/import.jade | 5 +++-- client/components/import/import.js | 5 ++--- client/components/import/import.styl | 10 +++++++--- 3 files changed, 12 insertions(+), 8 deletions(-) (limited to 'client') diff --git a/client/components/import/import.jade b/client/components/import/import.jade index 0f53e4d2..74b6ca13 100644 --- a/client/components/import/import.jade +++ b/client/components/import/import.jade @@ -8,7 +8,7 @@ template(name="importPopup") if membersMapping div a.show-mapping - | {{_ 'show-mapping'}} + | {{_ 'import-show-user-mapping'}} input.primary.wide(type="submit" value="{{_ 'import'}}") template(name="mapMembersPopup") @@ -35,7 +35,8 @@ template(name="mapMembersPopup") template(name="mapMembersAddPopup") .select-member - p Hello world + p + | {{_ 'import-user-select'}} .js-map-member +esInput(index="users") ul.pop-over-list diff --git a/client/components/import/import.js b/client/components/import/import.js index b42fcc5d..9de649f2 100644 --- a/client/components/import/import.js +++ b/client/components/import/import.js @@ -29,13 +29,12 @@ const ImportPopup = BlazeComponent.extendComponent({ }, onShowMapping(evt) { - // todo xxx make it work - currently we don't find the text - // this._storeText(evt); + this._storeText(evt); Popup.open('mapMembers')(evt); }, _storeText(evt) { - const dataJson = $(evt.currentTarget).find('.js-import-json').val(); + const dataJson = this.$('.js-import-json').val(); Session.set('import.text', dataJson); return dataJson; }, diff --git a/client/components/import/import.styl b/client/components/import/import.styl index 4934cbcc..3c6cfdf3 100644 --- a/client/components/import/import.styl +++ b/client/components/import/import.styl @@ -1,8 +1,9 @@ .map-members + .mapping:first-of-type + border-top: solid 1px #999 .mapping - margin-bottom: 10px - margin-top: 10px - border-bottom: solid + padding: 10px 0 + border-bottom: solid 1px #999 .source display: inline-block width: 80% @@ -11,3 +12,6 @@ width: 35px .member float: none + +a.show-mapping + text-decoration underline -- cgit v1.2.3-1-g7c22 From 475bc70621379733dea364147221cc6a13269994 Mon Sep 17 00:00:00 2001 From: Xavier Priour Date: Sat, 14 Nov 2015 01:54:59 +0100 Subject: Fix build --- client/components/import/import.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'client') diff --git a/client/components/import/import.js b/client/components/import/import.js index 9de649f2..038f485c 100644 --- a/client/components/import/import.js +++ b/client/components/import/import.js @@ -33,7 +33,7 @@ const ImportPopup = BlazeComponent.extendComponent({ Popup.open('mapMembers')(evt); }, - _storeText(evt) { + _storeText() { const dataJson = this.$('.js-import-json').val(); Session.set('import.text', dataJson); return dataJson; -- cgit v1.2.3-1-g7c22 From ad27a59e5790d26f23eb48c2d71d9d3c0a01e81f Mon Sep 17 00:00:00 2001 From: Xavier Priour Date: Mon, 16 Nov 2015 21:41:49 +0100 Subject: Import attachments --- client/components/activities/activities.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'client') diff --git a/client/components/activities/activities.js b/client/components/activities/activities.js index 64e9865d..c1465b04 100644 --- a/client/components/activities/activities.js +++ b/client/components/activities/activities.js @@ -86,7 +86,8 @@ BlazeComponent.extendComponent({ attachmentLink() { const attachment = this.currentData().attachment(); - return attachment && Blaze.toHTML(HTML.A({ + // trying to display url before file is stored generates js errors + return attachment && attachment.url({ download: true }) && Blaze.toHTML(HTML.A({ href: FlowRouter.path(attachment.url({ download: true })), target: '_blank', }, attachment.name())); -- cgit v1.2.3-1-g7c22 From 33193b6f7b610dc463f55e46272c865ae8d1fd44 Mon Sep 17 00:00:00 2001 From: Xavier Priour Date: Tue, 17 Nov 2015 08:52:55 +0100 Subject: code review fixes --- client/components/import/import.js | 109 +++++++++++++++++++++---------------- 1 file changed, 63 insertions(+), 46 deletions(-) (limited to 'client') diff --git a/client/components/import/import.js b/client/components/import/import.js index 038f485c..bb7d0617 100644 --- a/client/components/import/import.js +++ b/client/components/import/import.js @@ -33,12 +33,6 @@ const ImportPopup = BlazeComponent.extendComponent({ Popup.open('mapMembers')(evt); }, - _storeText() { - const dataJson = this.$('.js-import-json').val(); - Session.set('import.text', dataJson); - return dataJson; - }, - onSubmit(evt){ evt.preventDefault(); const dataJson = this._storeText(evt); @@ -50,47 +44,12 @@ const ImportPopup = BlazeComponent.extendComponent({ this.setError('error-json-malformed'); return; } - // if there are members listed in the import and we have no mapping for them... - if(dataObject.members.length > 0 && !this.membersMapping()) { - // we will work on the list itself (an ordered array of POJO) - // when a mapping is done, we add a 'wekan' field to the POJO representing the imported member - const membersToMap = dataObject.members; - // auto-map based on username - membersToMap.forEach((importedMember) => { - const wekanUser = Users.findOne({username: importedMember.username}); - if(wekanUser) { - importedMember.wekan = wekanUser; - } - }); - // store members data and mapping in Session - // (we go deep and 2-way, so storing in data context is not a viable option) - Session.set('import.membersToMap', membersToMap); - Popup.open('mapMembers')(evt); + if(this._hasAllNeededData(dataObject)) { + this._import(dataObject); } else { - const additionalData = this.getAdditionalData(); - const membersMapping = this.membersMapping(); - if(membersMapping) { - const mappingById = {}; - membersMapping.forEach((member) => { - if (member.wekan) { - mappingById[member.id] = member.wekan._id; - } - }); - additionalData.membersMapping = mappingById; - } - Session.set('import.membersToMap', null); - Session.set('import.text', null); - Meteor.call(this.getMethodName(), dataObject, additionalData, - (error, response) => { - if (error) { - this.setError(error.error); - } else { - // ensure will display what we just imported - Filter.addException(response); - this.onFinish(response); - } - } - ); + this._prepareAdditionalData(dataObject); + Popup.open(this._screenAdditionalData())(evt); + } }, @@ -105,6 +64,64 @@ const ImportPopup = BlazeComponent.extendComponent({ this.error.set(error); }, + _import: function (dataObject) { + const additionalData = this.getAdditionalData(); + const membersMapping = this.membersMapping(); + if (membersMapping) { + const mappingById = {}; + membersMapping.forEach((member) => { + if (member.wekan) { + mappingById[member.id] = member.wekan._id; + } + }); + additionalData.membersMapping = mappingById; + } + Session.set('import.membersToMap', null); + Session.set('import.text', null); + Meteor.call(this.getMethodName(), dataObject, additionalData, + (error, response) => { + if (error) { + this.setError(error.error); + } else { + // ensure will display what we just imported + Filter.addException(response); + this.onFinish(response); + } + } + ); + }, + + _hasAllNeededData(dataObject) { + // import has no members or they are already mapped + return dataObject.members.length === 0 || this.membersMapping(); + }, + + _prepareAdditionalData(dataObject) { + // we will work on the list itself (an ordered array of objects) + // when a mapping is done, we add a 'wekan' field to the object representing the imported member + const membersToMap = dataObject.members; + // auto-map based on username + membersToMap.forEach((importedMember) => { + const wekanUser = Users.findOne({username: importedMember.username}); + if(wekanUser) { + importedMember.wekan = wekanUser; + } + }); + // store members data and mapping in Session + // (we go deep and 2-way, so storing in data context is not a viable option) + Session.set('import.membersToMap', membersToMap); + return membersToMap; + }, + + _screenAdditionalData() { + return 'mapMembers'; + }, + + _storeText() { + const dataJson = this.$('.js-import-json').val(); + Session.set('import.text', dataJson); + return dataJson; + }, }); ImportPopup.extendComponent({ -- cgit v1.2.3-1-g7c22 From db90771d9b1330eb8f7183c472545277b8ed9449 Mon Sep 17 00:00:00 2001 From: Xavier Priour Date: Tue, 17 Nov 2015 08:56:58 +0100 Subject: Fix eslint --- client/components/import/import.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'client') diff --git a/client/components/import/import.js b/client/components/import/import.js index bb7d0617..63285e57 100644 --- a/client/components/import/import.js +++ b/client/components/import/import.js @@ -64,7 +64,7 @@ const ImportPopup = BlazeComponent.extendComponent({ this.error.set(error); }, - _import: function (dataObject) { + _import(dataObject) { const additionalData = this.getAdditionalData(); const membersMapping = this.membersMapping(); if (membersMapping) { -- cgit v1.2.3-1-g7c22