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',
list: 'lists',
l: 'lists',
is: 'is',
};
const selector = {
boards: [],
@ -95,6 +96,7 @@ BlazeComponent.extendComponent({
lists: [],
users: [],
labels: [],
is: [],
};
let text = '';
while (query) {
@ -150,6 +152,48 @@ BlazeComponent.extendComponent({
// eslint-disable-next-line no-console
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(() => {
const handle = subManager.subscribe('globalSearch', selector);
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) {
Boards.allow({
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({
applyWipLimit(listId, limit) {
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 };
if (Meteor.isServer) {

View file

@ -179,56 +179,26 @@ Meteor.publish('globalSearch', function(queryParams) {
check(queryParams, Object);
// eslint-disable-next-line no-console
console.log('selector:', queryParams);
console.log('queryParams:', queryParams);
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 permiitedBoards = Boards.userBoardIds(user._id);
const archivedLists = [];
Lists.find({ archived: true }).forEach(list => {
archivedLists.push(list._id);
});
const permiitedBoards = [];
let selector = {
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 = [];
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
console.log('search list selector:', selector);
@ -239,17 +209,34 @@ Meteor.publish('globalSearch', function(queryParams) {
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 = {
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) {
selector.listId.$in = searchLists;
}
// eslint-disable-next-line no-console
console.log('selector:', selector);
const cards = Cards.find(selector, {
fields: {
_id: 1,