|  | @@ -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');
 |