浏览代码

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 年之前
父节点
当前提交
61ae62a83a

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

@@ -112,7 +112,7 @@ template(name="editUserPopup")
     label.hide.userId(type="text" value=user._id)
     label.hide.userId(type="text" value=user._id)
     label
     label
       | {{_ 'fullname'}}
       | {{_ 'fullname'}}
-      input.js-profile-fullname(type="text" value=user.profile.fullname)
+      input.js-profile-fullname(type="text" value=user.profile.fullname required)
     label
     label
       | {{_ 'username'}}
       | {{_ 'username'}}
       span.error.hide.username-taken
       span.error.hide.username-taken
@@ -120,7 +120,7 @@ template(name="editUserPopup")
       if isLdap
       if isLdap
         input.js-profile-username(type="text" value=user.username readonly)
         input.js-profile-username(type="text" value=user.username readonly)
       else
       else
-        input.js-profile-username(type="text" value=user.username)
+        input.js-profile-username(type="text" value=user.username required)
     label
     label
       | {{_ 'email'}}
       | {{_ 'email'}}
       span.error.hide.email-taken
       span.error.hide.email-taken
@@ -128,7 +128,7 @@ template(name="editUserPopup")
       if isLdap
       if isLdap
         input.js-profile-email(type="email" value="{{user.emails.[0].address}}" readonly)
         input.js-profile-email(type="email" value="{{user.emails.[0].address}}" readonly)
       else
       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
     label
       | {{_ 'admin'}}
       | {{_ 'admin'}}
       select.select-role.js-profile-isadmin
       select.select-role.js-profile-isadmin
@@ -153,15 +153,13 @@ template(name="editUserPopup")
       input.js-profile-password(type="password")
       input.js-profile-password(type="password")
     div.buttonsContainer
     div.buttonsContainer
       input.primary.wide(type="submit" value="{{_ 'save'}}")
       input.primary.wide(type="submit" value="{{_ 'save'}}")
-    //  div
-    //  input#deleteButton.primary.wide(type="button" value="{{_ 'delete'}}")
 
 
 template(name="newUserPopup")
 template(name="newUserPopup")
   form
   form
     //label.hide.userId(type="text" value=user._id)
     //label.hide.userId(type="text" value=user._id)
     label
     label
       | {{_ 'fullname'}}
       | {{_ 'fullname'}}
-      input.js-profile-fullname(type="text" value="")
+      input.js-profile-fullname(type="text" value="" required)
     label
     label
       | {{_ 'username'}}
       | {{_ 'username'}}
       span.error.hide.username-taken
       span.error.hide.username-taken
@@ -169,7 +167,7 @@ template(name="newUserPopup")
       //if isLdap
       //if isLdap
       //  input.js-profile-username(type="text" value=user.username readonly)
       //  input.js-profile-username(type="text" value=user.username readonly)
       //else
       //else
-      input.js-profile-username(type="text" value="")
+      input.js-profile-username(type="text" value="" required)
     label
     label
       | {{_ 'email'}}
       | {{_ 'email'}}
       span.error.hide.email-taken
       span.error.hide.email-taken
@@ -177,7 +175,7 @@ template(name="newUserPopup")
       //if isLdap
       //if isLdap
       //  input.js-profile-email(type="email" value="{{user.emails.[0].address}}" readonly)
       //  input.js-profile-email(type="email" value="{{user.emails.[0].address}}" readonly)
       //else
       //else
-      input.js-profile-email(type="email" value="")
+      input.js-profile-email(type="email" value="" required)
     label
     label
       | {{_ 'admin'}}
       | {{_ 'admin'}}
       select.select-role.js-profile-isadmin
       select.select-role.js-profile-isadmin
@@ -199,7 +197,7 @@ template(name="newUserPopup")
     hr
     hr
     label
     label
       | {{_ 'password'}}
       | {{_ 'password'}}
-      input.js-profile-password(type="password")
+      input.js-profile-password(type="password" required)
     div.buttonsContainer
     div.buttonsContainer
       input.primary.wide(type="submit" value="{{_ 'save'}}")
       input.primary.wide(type="submit" value="{{_ 'save'}}")
 
 
@@ -209,3 +207,21 @@ template(name="settingsUserPopup")
       a.impersonate-user
       a.impersonate-user
         i.fa.fa-user
         i.fa.fa-user
         | {{_ 'impersonate-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 isChangePassword = password.length > 0;
     const isChangeUserName = username !== user.username;
     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 =
     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, {
     Users.update(this.userId, {
       $set: {
       $set: {
@@ -297,11 +303,6 @@ Template.editUserPopup.events({
       });
       });
     } else Popup.close();
     } else Popup.close();
   },
   },
-
-  'click #deleteButton': Popup.afterConfirm('userDelete', function() {
-    Users.remove(this.userId);
-    Popup.close();
-  }),
 });
 });
 
 
 Template.newUserPopup.events({
 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-change-role': Popup.open('changePermissions'),
   'click .js-remove-member': Popup.afterConfirm('removeMember', function() {
   '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 boardId = Session.get('currentBoard');
     const memberId = this.userId;
     const memberId = this.userId;
     Cards.find({ boardId, members: memberId }).forEach(card => {
     Cards.find({ boardId, members: memberId }).forEach(card => {
       card.unassignMember(memberId);
       card.unassignMember(memberId);
     });
     });
+    Cards.find({ boardId, assignees: memberId }).forEach(card => {
+      card.unassignAssignee(memberId);
+    });
     Boards.findOne(boardId).removeMember(memberId);
     Boards.findOne(boardId).removeMember(memberId);
     Popup.close();
     Popup.close();
   }),
   }),

+ 25 - 2
models/users.js

@@ -616,6 +616,15 @@ Users.mutations({
       },
       },
     };
     };
   },
   },
+
+  setName(value) {
+    return {
+      $set: {
+        'profile.fullname': value,
+      },
+    };
+  },
+
   toggleDesktopHandles(value = false) {
   toggleDesktopHandles(value = false) {
     return {
     return {
       $set: {
       $set: {
@@ -752,7 +761,6 @@ if (Meteor.isServer) {
           throw new Meteor.Error('email-already-taken');
           throw new Meteor.Error('email-already-taken');
         } else {
         } else {
           Accounts.createUser({
           Accounts.createUser({
-            fullname,
             username,
             username,
             password,
             password,
             isAdmin,
             isAdmin,
@@ -760,6 +768,12 @@ if (Meteor.isServer) {
             email: email.toLowerCase(),
             email: email.toLowerCase(),
             from: 'admin',
             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 {
     try {
       Authentication.checkUserId(req.userId);
       Authentication.checkUserId(req.userId);
       const id = req.params.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, {
       JsonRoutes.sendResult(res, {
         code: 200,
         code: 200,
         data: {
         data: {