Add methods to models for archived entities

This commit is contained in:
John R. Supplee 2021-01-11 18:18:26 +02:00
parent 01bd94d2b3
commit bbcb236a46
5 changed files with 115 additions and 44 deletions

View file

@ -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(() => {

View file

@ -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,

View file

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

View file

@ -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) {

View file

@ -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 = []; // const archivedSwimlanes = Swimlanes.archivedSwimlaneIds();
Boards.find({ archived: true }).forEach(board => {
archivedBoards.push(board._id);
});
const archivedSwimlanes = []; // const permiitedBoards = Boards.userBoardIds(user._id);
Swimlanes.find({ archived: true }).forEach(swimlane => {
archivedSwimlanes.push(swimlane._id);
});
const archivedLists = [];
Lists.find({ archived: true }).forEach(list => {
archivedLists.push(list._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) { // eslint-disable-next-line no-console
selector = { // console.log('listsSelector:', queryParams.keys());
archived: false, if ('listsSelector' in queryParams) {
title: { $in: [] }, // eslint-disable-next-line no-console
}; // console.log('listsSelector:', queryParams.listsSelector.keys());
queryParams.lists.forEach(term => { for (const key in queryParams.listsSelector) {
selector.title.$in.push(term); 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 }, boardId: { $in: Boards.userBoardIds(user._id) },
swimlaneId: { $nin: archivedSwimlanes }, swimlaneId: { $nin: Swimlanes.archivedSwimlaneIds() },
listId: { $nin: archivedLists }, 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,