瀏覽代碼

Add methods to models for archived entities

John R. Supplee 4 年之前
父節點
當前提交
bbcb236a46
共有 5 個文件被更改,包括 115 次插入44 次删除
  1. 44 0
      client/components/main/globalSearch.js
  2. 20 0
      models/boards.js
  3. 10 0
      models/lists.js
  4. 10 0
      models/swimlanes.js
  5. 31 44
      server/publications/cards.js

+ 44 - 0
client/components/main/globalSearch.js

@@ -88,6 +88,7 @@ BlazeComponent.extendComponent({
             s: 'swimlanes',
             s: 'swimlanes',
             list: 'lists',
             list: 'lists',
             l: 'lists',
             l: 'lists',
+            is: 'is',
           };
           };
           const selector = {
           const selector = {
             boards: [],
             boards: [],
@@ -95,6 +96,7 @@ BlazeComponent.extendComponent({
             lists: [],
             lists: [],
             users: [],
             users: [],
             labels: [],
             labels: [],
+            is: [],
           };
           };
           let text = '';
           let text = '';
           while (query) {
           while (query) {
@@ -150,6 +152,48 @@ BlazeComponent.extendComponent({
           // eslint-disable-next-line no-console
           // eslint-disable-next-line no-console
           console.log('text:', text);
           console.log('text:', text);
 
 
+          if (selector.boards.length) {
+            selector.boardsSelector = {
+              archived: false,
+              title: { $in: [] },
+            };
+            selector.boards.forEach(term => {
+              selector.boardsSelector.title.$in.push(term);
+            });
+          }
+
+          if (selector.lists.length) {
+            selector.listsSelector = {
+              archived: false,
+              title: { $in: [] },
+            };
+            selector.lists.forEach(term => {
+              selector.listsSelector.title.$in.push(term);
+            });
+          }
+
+          if (selector.swimlanes.length) {
+            selector.swimlanesSelector = {
+              archived: false,
+              title: { $in: [] },
+            };
+            selector.swimlanes.forEach(term => {
+              selector.swimlanesSelector.title.$in.push(term);
+            });
+          }
+
+          if (selector.labels.length) {
+            selector.labelsSelector = {
+              archived: false,
+              title: { $in: [] },
+            };
+            selector.labels.forEach(term => {
+              selector.labelsSelector.title.$in.push(term);
+            });
+          }
+
+          selector.text = text;
+
           this.autorun(() => {
           this.autorun(() => {
             const handle = subManager.subscribe('globalSearch', selector);
             const handle = subManager.subscribe('globalSearch', selector);
             Tracker.nonreactive(() => {
             Tracker.nonreactive(() => {

+ 20 - 0
models/boards.js

@@ -1208,6 +1208,26 @@ function boardRemover(userId, doc) {
   );
   );
 }
 }
 
 
+Boards.userBoards = (userId, includeArchived = false, selector = {}) => {
+  if (!includeArchived) {
+    selector = {
+      archived: false,
+    };
+  }
+  selector.$or = [
+    { permission: 'public' },
+    { members: { $elemMatch: { userId, isActive: true } } },
+  ];
+
+  return Boards.find(selector);
+};
+
+Boards.userBoardIds = (userId, includeArchived = false, selector = {}) => {
+  return Boards.userBoards(userId, includeArchived, selector).map(board => {
+    return board._id;
+  });
+};
+
 if (Meteor.isServer) {
 if (Meteor.isServer) {
   Boards.allow({
   Boards.allow({
     insert: Meteor.userId,
     insert: Meteor.userId,

+ 10 - 0
models/lists.js

@@ -328,6 +328,16 @@ Lists.mutations({
   },
   },
 });
 });
 
 
+Lists.archivedLists = () => {
+  return Lists.find({ archived: true });
+};
+
+Lists.archivedListIds = () => {
+  return Lists.archivedLists().map(list => {
+    return list._id;
+  });
+};
+
 Meteor.methods({
 Meteor.methods({
   applyWipLimit(listId, limit) {
   applyWipLimit(listId, limit) {
     check(listId, String);
     check(listId, String);

+ 10 - 0
models/swimlanes.js

@@ -283,6 +283,16 @@ Swimlanes.mutations({
   },
   },
 });
 });
 
 
+Swimlanes.archivedSwimlanes = () => {
+  return Swimlanes.find({ archived: true });
+};
+
+Swimlanes.archivedSwimlaneIds = () => {
+  return Swimlanes.archivedSwimlanes().map(swim => {
+    return swim._id;
+  });
+};
+
 Swimlanes.hookOptions.after.update = { fetchPrevious: false };
 Swimlanes.hookOptions.after.update = { fetchPrevious: false };
 
 
 if (Meteor.isServer) {
 if (Meteor.isServer) {

+ 31 - 44
server/publications/cards.js

@@ -179,56 +179,26 @@ Meteor.publish('globalSearch', function(queryParams) {
   check(queryParams, Object);
   check(queryParams, Object);
 
 
   // eslint-disable-next-line no-console
   // eslint-disable-next-line no-console
-  console.log('selector:', queryParams);
+  console.log('queryParams:', queryParams);
 
 
   const user = Users.findOne(this.userId);
   const user = Users.findOne(this.userId);
 
 
-  const archivedBoards = [];
-  Boards.find({ archived: true }).forEach(board => {
-    archivedBoards.push(board._id);
-  });
+  // const archivedSwimlanes = Swimlanes.archivedSwimlaneIds();
 
 
-  const archivedSwimlanes = [];
-  Swimlanes.find({ archived: true }).forEach(swimlane => {
-    archivedSwimlanes.push(swimlane._id);
-  });
-
-  const archivedLists = [];
-  Lists.find({ archived: true }).forEach(list => {
-    archivedLists.push(list._id);
-  });
+  // const permiitedBoards = Boards.userBoardIds(user._id);
 
 
-  const permiitedBoards = [];
   let selector = {
   let selector = {
     archived: false,
     archived: false,
   };
   };
-  // if user is not an admin allow her to see cards only from boards where
-  // she is a member
-  if (!user.isAdmin) {
-    selector.$or = [
-      { permission: 'public' },
-      { members: { $elemMatch: { userId: user._id, isActive: true } } },
-    ];
-  }
-  if (queryParams.boards.length) {
-    selector.title = { $in: [] };
-    queryParams.boards.forEach(term => {
-      selector.title.$in.push(term);
-    });
-  }
-  Boards.find(selector).forEach(board => {
-    permiitedBoards.push(board._id);
-  });
-
   const searchLists = [];
   const searchLists = [];
-  if (queryParams.lists.length) {
-    selector = {
-      archived: false,
-      title: { $in: [] },
-    };
-    queryParams.lists.forEach(term => {
-      selector.title.$in.push(term);
-    });
+  // eslint-disable-next-line no-console
+  // console.log('listsSelector:', queryParams.keys());
+  if ('listsSelector' in queryParams) {
+    // eslint-disable-next-line no-console
+    // console.log('listsSelector:', queryParams.listsSelector.keys());
+    for (const key in queryParams.listsSelector) {
+      selector[key] = queryParams.listsSelector[key];
+    }
 
 
     // eslint-disable-next-line no-console
     // eslint-disable-next-line no-console
     console.log('search list selector:', selector);
     console.log('search list selector:', selector);
@@ -239,17 +209,34 @@ Meteor.publish('globalSearch', function(queryParams) {
     console.log('search lists:', searchLists);
     console.log('search lists:', searchLists);
   }
   }
 
 
+  const searchSwimlanes = [];
+  if ('swimlanesSelector' in queryParams) {
+    for (const key in queryParams.swimlanesSelector) {
+      selector[key] = queryParams.swimlanesSelector[key];
+    }
+
+    Lists.find(selector).forEach(swim => {
+      searchSwimlanes.push(swim._id);
+    });
+  }
+
   selector = {
   selector = {
     archived: false,
     archived: false,
-    boardId: { $nin: archivedBoards, $in: permiitedBoards },
-    swimlaneId: { $nin: archivedSwimlanes },
-    listId: { $nin: archivedLists },
+    boardId: { $in: Boards.userBoardIds(user._id) },
+    swimlaneId: { $nin: Swimlanes.archivedSwimlaneIds() },
+    listId: { $nin: Lists.archivedListIds() },
   };
   };
 
 
+  if (searchSwimlanes.length) {
+    selector.swimlaneId.$in = searchSwimlanes;
+  }
+
   if (searchLists.length) {
   if (searchLists.length) {
     selector.listId.$in = searchLists;
     selector.listId.$in = searchLists;
   }
   }
 
 
+  // eslint-disable-next-line no-console
+  console.log('selector:', selector);
   const cards = Cards.find(selector, {
   const cards = Cards.find(selector, {
     fields: {
     fields: {
       _id: 1,
       _id: 1,