2
0
Эх сурвалжийг харах

Board: When removing member from board, remove also from assignees.
Admin Panel/People: 1) Allow edit user that does not have email address.
2) When creating new user, require username and email address, and save also fullname.
3) Some in progress code for deleting user, that does not work correctly yet, so deleting user is not enabled yet.

Thanks to airtraxx and xet7.

Related #3396

Lauri Ojansivu 4 жил өмнө
parent
commit
61ae62a83a

+ 25 - 9
client/components/settings/peopleBody.jade

@@ -112,7 +112,7 @@ template(name="editUserPopup")
     label.hide.userId(type="text" value=user._id)
     label
       | {{_ 'fullname'}}
-      input.js-profile-fullname(type="text" value=user.profile.fullname)
+      input.js-profile-fullname(type="text" value=user.profile.fullname required)
     label
       | {{_ 'username'}}
       span.error.hide.username-taken
@@ -120,7 +120,7 @@ template(name="editUserPopup")
       if isLdap
         input.js-profile-username(type="text" value=user.username readonly)
       else
-        input.js-profile-username(type="text" value=user.username)
+        input.js-profile-username(type="text" value=user.username required)
     label
       | {{_ 'email'}}
       span.error.hide.email-taken
@@ -128,7 +128,7 @@ template(name="editUserPopup")
       if isLdap
         input.js-profile-email(type="email" value="{{user.emails.[0].address}}" readonly)
       else
-        input.js-profile-email(type="email" value="{{user.emails.[0].address}}")
+        input.js-profile-email(type="email" value="{{user.emails.[0].address}}" required)
     label
       | {{_ 'admin'}}
       select.select-role.js-profile-isadmin
@@ -153,15 +153,13 @@ template(name="editUserPopup")
       input.js-profile-password(type="password")
     div.buttonsContainer
       input.primary.wide(type="submit" value="{{_ 'save'}}")
-    //  div
-    //  input#deleteButton.primary.wide(type="button" value="{{_ 'delete'}}")
 
 template(name="newUserPopup")
   form
     //label.hide.userId(type="text" value=user._id)
     label
       | {{_ 'fullname'}}
-      input.js-profile-fullname(type="text" value="")
+      input.js-profile-fullname(type="text" value="" required)
     label
       | {{_ 'username'}}
       span.error.hide.username-taken
@@ -169,7 +167,7 @@ template(name="newUserPopup")
       //if isLdap
       //  input.js-profile-username(type="text" value=user.username readonly)
       //else
-      input.js-profile-username(type="text" value="")
+      input.js-profile-username(type="text" value="" required)
     label
       | {{_ 'email'}}
       span.error.hide.email-taken
@@ -177,7 +175,7 @@ template(name="newUserPopup")
       //if isLdap
       //  input.js-profile-email(type="email" value="{{user.emails.[0].address}}" readonly)
       //else
-      input.js-profile-email(type="email" value="")
+      input.js-profile-email(type="email" value="" required)
     label
       | {{_ 'admin'}}
       select.select-role.js-profile-isadmin
@@ -199,7 +197,7 @@ template(name="newUserPopup")
     hr
     label
       | {{_ 'password'}}
-      input.js-profile-password(type="password")
+      input.js-profile-password(type="password" required)
     div.buttonsContainer
       input.primary.wide(type="submit" value="{{_ 'save'}}")
 
@@ -209,3 +207,21 @@ template(name="settingsUserPopup")
       a.impersonate-user
         i.fa.fa-user
         | {{_ 'impersonate-user'}}
+  // Delete is not enabled yet, because it does leave empty user avatars
+  // to boards: boards members, card members and assignees have
+  // empty users. See:
+  // - wekan/client/components/settings/peopleBody.jade deleteButton
+  // - wekan/client/components/settings/peopleBody.js deleteButton
+  // - wekan/client/components/sidebar/sidebar.js Popup.afterConfirm('removeMember'
+  //   that does now remove member from board, card members and assignees correctly,
+  //   but that should be used to remove user from all boards similarly
+  // - wekan/models/users.js Delete is not enabled
+  //li
+  //  br
+  //  br
+  //  hr
+  //li
+  //  form
+  //    label.hide.userId(type="text" value=user._id)
+  //    div.buttonsContainer
+  //      input#deleteButton.card-details-red.right.wide(type="button" value="{{_ 'delete'}}")

+ 61 - 6
client/components/settings/peopleBody.js

@@ -226,8 +226,14 @@ Template.editUserPopup.events({
 
     const isChangePassword = password.length > 0;
     const isChangeUserName = username !== user.username;
+
+    // If previously email address has not been set, it is undefined,
+    // check for undefined, and allow adding email address.
     const isChangeEmail =
-      email.toLowerCase() !== user.emails[0].address.toLowerCase();
+      email.toLowerCase() !==
+      (typeof user.emails !== 'undefined'
+        ? user.emails[0].address.toLowerCase()
+        : false);
 
     Users.update(this.userId, {
       $set: {
@@ -297,11 +303,6 @@ Template.editUserPopup.events({
       });
     } else Popup.close();
   },
-
-  'click #deleteButton': Popup.afterConfirm('userDelete', function() {
-    Users.remove(this.userId);
-    Popup.close();
-  }),
 });
 
 Template.newUserPopup.events({
@@ -356,4 +357,58 @@ Template.settingsUserPopup.events({
       }
     });
   },
+  'click #deleteButton'(event) {
+    event.preventDefault();
+    /*
+    // Delete is not enabled yet, because it does leave empty user avatars
+    // to boards: boards members, card members and assignees have
+    // empty users. See:
+    // - wekan/client/components/settings/peopleBody.jade deleteButton
+    // - wekan/client/components/settings/peopleBody.js deleteButton
+    // - wekan/client/components/sidebar/sidebar.js Popup.afterConfirm('removeMember'
+    //   that does now remove member from board, card members and assignees correctly,
+    //   but that should be used to remove user from all boards similarly
+    // - wekan/models/users.js Delete is not enabled
+    //
+    //console.log('user id: ' + this.userId);
+    //Popup.afterConfirm('userDelete', function(event) {
+    //Boards.find({ members: this.userId }).forEach(board => {
+    //  console.log('board id: ' + board._id);
+      //Cards.find({ boardId: board._id, members: this.userId }).forEach(card => {
+      //  card.unassignMember(this.userId);
+      //});
+      //Cards.find({ boardId: board._id, members: this.userId }).forEach(card => {
+      //  card.unassignMember(this.userId);
+      //});
+      //Cards.find({ boardId: board._id, assignees: this.userId }).forEach(card => {
+      //  card.unassignAssignee(this.userId);
+      //});
+      //Boards.findOne({ boardId: board._id }).removeMember(this.userId);
+    //});
+    //Users.remove(this.userId);
+    */
+    Popup.close();
+  },
+});
+
+Template.settingsUserPopup.helpers({
+  user() {
+    return Users.findOne(this.userId);
+  },
+  authentications() {
+    return Template.instance().authenticationMethods.get();
+  },
+  isSelected(match) {
+    const userId = Template.instance().data.userId;
+    const selected = Users.findOne(userId).authenticationMethod;
+    return selected === match;
+  },
+  isLdap() {
+    const userId = Template.instance().data.userId;
+    const selected = Users.findOne(userId).authenticationMethod;
+    return selected === 'ldap';
+  },
+  errorMessage() {
+    return Template.instance().errorMessage.get();
+  },
 });

+ 4 - 0
client/components/sidebar/sidebar.js

@@ -255,11 +255,15 @@ Template.memberPopup.events({
   },
   'click .js-change-role': Popup.open('changePermissions'),
   'click .js-remove-member': Popup.afterConfirm('removeMember', function() {
+    // This works from removing member from board, card members and assignees.
     const boardId = Session.get('currentBoard');
     const memberId = this.userId;
     Cards.find({ boardId, members: memberId }).forEach(card => {
       card.unassignMember(memberId);
     });
+    Cards.find({ boardId, assignees: memberId }).forEach(card => {
+      card.unassignAssignee(memberId);
+    });
     Boards.findOne(boardId).removeMember(memberId);
     Popup.close();
   }),

+ 25 - 2
models/users.js

@@ -616,6 +616,15 @@ Users.mutations({
       },
     };
   },
+
+  setName(value) {
+    return {
+      $set: {
+        'profile.fullname': value,
+      },
+    };
+  },
+
   toggleDesktopHandles(value = false) {
     return {
       $set: {
@@ -752,7 +761,6 @@ if (Meteor.isServer) {
           throw new Meteor.Error('email-already-taken');
         } else {
           Accounts.createUser({
-            fullname,
             username,
             password,
             isAdmin,
@@ -760,6 +768,12 @@ if (Meteor.isServer) {
             email: email.toLowerCase(),
             from: 'admin',
           });
+          user = Users.findOne(username) || Users.findOne({ username });
+          if (user) {
+            Users.update(user._id, {
+              $set: { 'profile.fullname': fullname },
+            });
+          }
         }
       }
     },
@@ -1631,7 +1645,16 @@ if (Meteor.isServer) {
     try {
       Authentication.checkUserId(req.userId);
       const id = req.params.userId;
-      Meteor.users.remove({ _id: id });
+      // Delete is not enabled yet, because it does leave empty user avatars
+      // to boards: boards members, card members and assignees have
+      // empty users. See:
+      // - wekan/client/components/settings/peopleBody.jade deleteButton
+      // - wekan/client/components/settings/peopleBody.js deleteButton
+      // - wekan/client/components/sidebar/sidebar.js Popup.afterConfirm('removeMember'
+      //   that does now remove member from board, card members and assignees correctly,
+      //   but that should be used to remove user from all boards similarly
+      // - wekan/models/users.js Delete is not enabled
+      // Meteor.users.remove({ _id: id });
       JsonRoutes.sendResult(res, {
         code: 200,
         data: {