2022-12-26 21:10:50 +01:00
|
|
|
import { attr, fk } from 'redux-orm';
|
2019-08-31 04:07:25 +05:00
|
|
|
|
2022-12-26 21:10:50 +01:00
|
|
|
import BaseModel from './BaseModel';
|
2024-04-22 23:15:31 +02:00
|
|
|
import User from './User';
|
2019-08-31 04:07:25 +05:00
|
|
|
import ActionTypes from '../constants/ActionTypes';
|
|
|
|
|
2022-12-26 21:10:50 +01:00
|
|
|
export default class extends BaseModel {
|
2019-08-31 04:07:25 +05:00
|
|
|
static modelName = 'List';
|
|
|
|
|
|
|
|
static fields = {
|
|
|
|
id: attr(),
|
|
|
|
position: attr(),
|
|
|
|
name: attr(),
|
|
|
|
boardId: fk({
|
|
|
|
to: 'Board',
|
|
|
|
as: 'board',
|
|
|
|
relatedName: 'lists',
|
|
|
|
}),
|
|
|
|
};
|
|
|
|
|
|
|
|
static reducer({ type, payload }, List) {
|
|
|
|
switch (type) {
|
2021-06-24 01:05:22 +05:00
|
|
|
case ActionTypes.LOCATION_CHANGE_HANDLE:
|
|
|
|
case ActionTypes.CORE_INITIALIZE:
|
|
|
|
case ActionTypes.PROJECT_MANAGER_CREATE_HANDLE:
|
|
|
|
case ActionTypes.BOARD_MEMBERSHIP_CREATE_HANDLE:
|
|
|
|
if (payload.lists) {
|
|
|
|
payload.lists.forEach((list) => {
|
|
|
|
List.upsert(list);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
case ActionTypes.SOCKET_RECONNECT_HANDLE:
|
|
|
|
List.all().delete();
|
|
|
|
|
|
|
|
if (payload.lists) {
|
|
|
|
payload.lists.forEach((list) => {
|
|
|
|
List.upsert(list);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
case ActionTypes.BOARD_FETCH__SUCCESS:
|
2020-03-25 00:15:47 +05:00
|
|
|
payload.lists.forEach((list) => {
|
2019-08-31 04:07:25 +05:00
|
|
|
List.upsert(list);
|
|
|
|
});
|
|
|
|
|
|
|
|
break;
|
|
|
|
case ActionTypes.LIST_CREATE:
|
2021-06-24 01:05:22 +05:00
|
|
|
case ActionTypes.LIST_CREATE_HANDLE:
|
|
|
|
case ActionTypes.LIST_UPDATE__SUCCESS:
|
|
|
|
case ActionTypes.LIST_UPDATE_HANDLE:
|
2024-04-22 21:56:07 +02:00
|
|
|
case ActionTypes.LIST_SORT__SUCCESS:
|
|
|
|
case ActionTypes.LIST_SORT_HANDLE:
|
2021-06-24 01:05:22 +05:00
|
|
|
List.upsert(payload.list);
|
|
|
|
|
|
|
|
break;
|
|
|
|
case ActionTypes.LIST_CREATE__SUCCESS:
|
|
|
|
List.withId(payload.localId).delete();
|
2019-08-31 04:07:25 +05:00
|
|
|
List.upsert(payload.list);
|
|
|
|
|
|
|
|
break;
|
|
|
|
case ActionTypes.LIST_UPDATE:
|
|
|
|
List.withId(payload.id).update(payload.data);
|
|
|
|
|
|
|
|
break;
|
|
|
|
case ActionTypes.LIST_DELETE:
|
|
|
|
List.withId(payload.id).deleteWithRelated();
|
|
|
|
|
|
|
|
break;
|
2021-06-24 01:05:22 +05:00
|
|
|
case ActionTypes.LIST_DELETE__SUCCESS:
|
|
|
|
case ActionTypes.LIST_DELETE_HANDLE: {
|
|
|
|
const listModel = List.withId(payload.list.id);
|
2019-08-31 04:07:25 +05:00
|
|
|
|
2021-06-24 01:05:22 +05:00
|
|
|
if (listModel) {
|
|
|
|
listModel.deleteWithRelated();
|
|
|
|
}
|
2019-08-31 04:07:25 +05:00
|
|
|
|
|
|
|
break;
|
2021-06-24 01:05:22 +05:00
|
|
|
}
|
2019-08-31 04:07:25 +05:00
|
|
|
default:
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
getOrderedCardsQuerySet() {
|
|
|
|
return this.cards.orderBy('position');
|
|
|
|
}
|
|
|
|
|
2022-07-29 17:40:18 +02:00
|
|
|
getFilteredOrderedCardsModelArray() {
|
2019-08-31 04:07:25 +05:00
|
|
|
let cardModels = this.getOrderedCardsQuerySet().toModelArray();
|
|
|
|
|
2024-04-22 23:15:31 +02:00
|
|
|
const { filterText } = this.board;
|
|
|
|
|
|
|
|
if (filterText !== '') {
|
|
|
|
let re = null;
|
|
|
|
const posSpace = filterText.indexOf(' ');
|
|
|
|
|
|
|
|
if (filterText.startsWith('/')) {
|
|
|
|
re = new RegExp(filterText.substring(1), 'i');
|
|
|
|
}
|
|
|
|
let doRegularSearch = true;
|
|
|
|
if (re) {
|
2024-04-26 21:52:57 +02:00
|
|
|
cardModels = cardModels.filter(
|
|
|
|
(cardModel) => re.test(cardModel.name) || re.test(cardModel?.description),
|
|
|
|
);
|
2024-04-22 23:15:31 +02:00
|
|
|
doRegularSearch = false;
|
|
|
|
} else if (filterText.startsWith('!') && posSpace > 0) {
|
|
|
|
const creatorUserId = User.findUsersFromText(
|
|
|
|
filterText.substring(1, posSpace),
|
|
|
|
this.board.memberships.toModelArray().map((membership) => membership.user),
|
|
|
|
);
|
|
|
|
if (creatorUserId != null) {
|
|
|
|
doRegularSearch = false;
|
|
|
|
cardModels = cardModels.filter((cardModel) => cardModel.creatorUser.id === creatorUserId);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (doRegularSearch) {
|
|
|
|
const lowerCasedFilter = filterText.toLocaleLowerCase();
|
|
|
|
cardModels = cardModels.filter(
|
2024-04-26 21:52:57 +02:00
|
|
|
(cardModel) =>
|
|
|
|
cardModel.name.toLocaleLowerCase().indexOf(lowerCasedFilter) >= 0 ||
|
|
|
|
cardModel.description?.toLocaleLowerCase().indexOf(lowerCasedFilter) >= 0,
|
2024-04-22 23:15:31 +02:00
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-25 00:15:47 +05:00
|
|
|
const filterUserIds = this.board.filterUsers.toRefArray().map((user) => user.id);
|
|
|
|
const filterLabelIds = this.board.filterLabels.toRefArray().map((label) => label.id);
|
2019-08-31 04:07:25 +05:00
|
|
|
|
|
|
|
if (filterUserIds.length > 0) {
|
2020-03-25 00:15:47 +05:00
|
|
|
cardModels = cardModels.filter((cardModel) => {
|
2019-08-31 04:07:25 +05:00
|
|
|
const users = cardModel.users.toRefArray();
|
|
|
|
|
2020-03-25 00:15:47 +05:00
|
|
|
return users.some((user) => filterUserIds.includes(user.id));
|
2019-08-31 04:07:25 +05:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
if (filterLabelIds.length > 0) {
|
2020-03-25 00:15:47 +05:00
|
|
|
cardModels = cardModels.filter((cardModel) => {
|
2019-08-31 04:07:25 +05:00
|
|
|
const labels = cardModel.labels.toRefArray();
|
|
|
|
|
2020-03-25 00:15:47 +05:00
|
|
|
return labels.some((label) => filterLabelIds.includes(label.id));
|
2019-08-31 04:07:25 +05:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
return cardModels;
|
|
|
|
}
|
|
|
|
|
2021-06-24 01:05:22 +05:00
|
|
|
deleteRelated() {
|
2020-03-25 00:15:47 +05:00
|
|
|
this.cards.toModelArray().forEach((cardModel) => {
|
2019-08-31 04:07:25 +05:00
|
|
|
cardModel.deleteWithRelated();
|
|
|
|
});
|
2021-06-24 01:05:22 +05:00
|
|
|
}
|
2019-08-31 04:07:25 +05:00
|
|
|
|
2021-06-24 01:05:22 +05:00
|
|
|
deleteWithRelated() {
|
|
|
|
this.deleteRelated();
|
2019-08-31 04:07:25 +05:00
|
|
|
this.delete();
|
|
|
|
}
|
|
|
|
}
|