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

Make sure user data is retrieved before proceeding with import

John R. Supplee 4 жил өмнө
parent
commit
d647884b91

+ 30 - 27
client/components/import/import.jade

@@ -13,38 +13,41 @@ template(name="import")
 template(name="importTextarea")
 template(name="importTextarea")
   form
   form
     p: label(for='import-textarea') {{_ instruction}} {{_ 'import-board-instruction-about-errors'}}
     p: label(for='import-textarea') {{_ instruction}} {{_ 'import-board-instruction-about-errors'}}
-    textarea.js-import-json(placeholder="{{_ importPlaceHolder}}" autofocus)
+    textarea.js-import-json(id='import-textarea' placeholder="{{_ importPlaceHolder}}" autofocus)
       | {{jsonText}}
       | {{jsonText}}
     input.primary.wide(type="submit" value="{{_ 'import'}}")
     input.primary.wide(type="submit" value="{{_ 'import'}}")
 
 
 template(name="importMapMembers")
 template(name="importMapMembers")
   h2 {{_ 'import-map-members'}}
   h2 {{_ 'import-map-members'}}
-  .map-members
-    p {{_ 'import-members-map'}}
-    .mapping-list
-      each members
-        a.mapping-item.js-select-member(class="{{#if wekanId}}filled{{/if}}")
-          .profile-source
-            .full-name= fullName
-            .username
-              | ({{username}})
-          .wekan
-            if wekanId
-              +userAvatar(userId=wekanId)
-            else
-              a.member.add-member
-                i.fa.fa-plus
-      //-
-        Due to the way the flewbox layout is working, we need to set some
-        invisible items so that the last row items have a consistent width.
-        See http://jsfiddle.net/Ln4h3c4n/ for an minimal example of the issue.
-      .mapping-item.ghost-item
-      .mapping-item.ghost-item
-      .mapping-item.ghost-item
-      .mapping-item.ghost-item
-      .mapping-item.ghost-item
-    form
-      input.primary.wide(type="submit" value="{{_ 'done'}}")
+  if usersLoaded.get
+    .map-members
+      p {{_ 'import-members-map'}}
+      .mapping-list
+        each members
+          a.mapping-item.js-select-member(class="{{#if wekanId}}filled{{/if}}")
+            .profile-source
+              .full-name= fullName
+              .username
+                | ({{username}})
+            .wekan
+              if wekanId
+                +userAvatar(userId=wekanId)
+              else
+                a.member.add-member
+                  i.fa.fa-plus
+        //-
+          Due to the way the flewbox layout is working, we need to set some
+          invisible items so that the last row items have a consistent width.
+          See http://jsfiddle.net/Ln4h3c4n/ for an minimal example of the issue.
+        .mapping-item.ghost-item
+        .mapping-item.ghost-item
+        .mapping-item.ghost-item
+        .mapping-item.ghost-item
+        .mapping-item.ghost-item
+      form
+        input.primary.wide(type="submit" value="{{_ 'done'}}")
+  else
+    +spinner
 
 
 template(name="importMapMembersAddPopup")
 template(name="importMapMembersAddPopup")
   .select-member
   .select-member

+ 30 - 5
client/components/import/import.js

@@ -150,14 +150,39 @@ BlazeComponent.extendComponent({
 
 
 BlazeComponent.extendComponent({
 BlazeComponent.extendComponent({
   onCreated() {
   onCreated() {
+    this.usersLoaded = new ReactiveVar(false);
+
     this.autorun(() => {
     this.autorun(() => {
-      this.parentComponent()
-        .membersToMap.get()
-        .forEach(({ wekanId }) => {
-          if (wekanId) {
-            this.subscribe('user-miniprofile', wekanId);
+      const handle = this.subscribe(
+        'user-miniprofile',
+        this.members().map(member => {
+          return member.username;
+        }),
+      );
+      Tracker.nonreactive(() => {
+        Tracker.autorun(() => {
+          if (
+            handle.ready() &&
+            !this.usersLoaded.get() &&
+            this.members().length
+          ) {
+            this._refreshMembers(
+              this.members().map(member => {
+                if (!member.wekanId) {
+                  const user = Users.findOne({ username: member.username });
+                  if (user) {
+                    // eslint-disable-next-line no-console
+                    console.log('found username:', user.username);
+                    member.wekanId = user._id;
+                  }
+                }
+                return member;
+              }),
+            );
           }
           }
+          this.usersLoaded.set(handle.ready());
         });
         });
+      });
     });
     });
   },
   },
 
 

+ 8 - 10
server/publications/users.js

@@ -1,14 +1,12 @@
-Meteor.publish('user-miniprofile', function(userId) {
-  check(userId, String);
+Meteor.publish('user-miniprofile', function(usernames) {
+  check(usernames, Array);
 
 
-  return Users.find(userId, {
-    fields: {
-      username: 1,
-      'profile.fullname': 1,
-      'profile.avatarUrl': 1,
-      'profile.initials': 1,
-    },
-  });
+  // eslint-disable-next-line no-console
+  // console.log('usernames:', usernames);
+  return Users.find(
+    { username: { $in: usernames } },
+    { fields: Users.safeFields },
+  );
 });
 });
 
 
 Meteor.publish('user-admin', function() {
 Meteor.publish('user-admin', function() {