1
0
Fork 0
mirror of https://github.com/plankanban/planka.git synced 2025-07-19 05:09:43 +02:00
planka/client/src/models/Card.js

169 lines
4.3 KiB
JavaScript
Raw Normal View History

import { Model, attr, fk, many } from 'redux-orm';
2019-08-31 04:07:25 +05:00
import ActionTypes from '../constants/ActionTypes';
import Config from '../constants/Config';
export default class extends Model {
static modelName = 'Card';
static fields = {
id: attr(),
position: attr(),
name: attr(),
description: attr(),
dueDate: attr(),
2019-08-31 04:07:25 +05:00
timer: attr(),
isSubscribed: attr({
getDefault: () => false,
}),
isActionsFetching: attr({
getDefault: () => false,
}),
isAllActionsFetched: attr({
getDefault: () => false,
}),
listId: fk({
to: 'List',
as: 'list',
relatedName: 'cards',
}),
boardId: fk({
to: 'Board',
as: 'board',
relatedName: 'cards',
}),
users: many('User', 'cards'),
labels: many('Label', 'cards'),
};
static reducer({ type, payload }, Card) {
switch (type) {
case ActionTypes.USER_TO_CARD_ADD: {
const cardModel = Card.withId(payload.cardId);
cardModel.users.add(payload.id);
if (payload.isCurrent) {
cardModel.isSubscribed = true;
}
break;
}
case ActionTypes.USER_FROM_CARD_REMOVE:
Card.withId(payload.cardId).users.remove(payload.id);
break;
case ActionTypes.BOARD_FETCH_SUCCEEDED:
2020-03-25 00:15:47 +05:00
payload.cards.forEach((card) => {
2019-08-31 04:07:25 +05:00
Card.upsert(card);
});
payload.cardMemberships.forEach(({ cardId, userId }) => {
Card.withId(cardId).users.add(userId);
});
payload.cardLabels.forEach(({ cardId, labelId }) => {
Card.withId(cardId).labels.add(labelId);
});
break;
case ActionTypes.LABEL_TO_CARD_ADD:
Card.withId(payload.cardId).labels.add(payload.id);
break;
case ActionTypes.LABEL_FROM_CARD_REMOVE:
Card.withId(payload.cardId).labels.remove(payload.id);
break;
case ActionTypes.CARD_CREATE:
case ActionTypes.CARD_CREATE_RECEIVED:
case ActionTypes.CARD_FETCH_SUCCEEDED:
case ActionTypes.NOTIFICATION_CREATE_RECEIVED:
Card.upsert(payload.card);
break;
case ActionTypes.CARD_UPDATE:
Card.withId(payload.id).update(payload.data);
break;
case ActionTypes.CARD_DELETE:
Card.withId(payload.id).deleteWithRelated();
break;
case ActionTypes.CARD_CREATE_SUCCEEDED:
Card.withId(payload.localId).delete();
Card.upsert(payload.card);
break;
case ActionTypes.CARD_UPDATE_RECEIVED:
Card.withId(payload.card.id).update(payload.card);
break;
case ActionTypes.CARD_DELETE_RECEIVED:
Card.withId(payload.card.id).deleteWithRelated();
break;
case ActionTypes.CARD_MEMBERSHIP_CREATE_RECEIVED:
Card.withId(payload.cardMembership.cardId).users.add(payload.cardMembership.userId);
break;
case ActionTypes.CARD_MEMBERSHIP_DELETE_RECEIVED:
Card.withId(payload.cardMembership.cardId).users.remove(payload.cardMembership.userId);
break;
case ActionTypes.CARD_LABEL_CREATE_RECEIVED:
Card.withId(payload.cardLabel.cardId).labels.add(payload.cardLabel.labelId);
break;
case ActionTypes.CARD_LABEL_DELETE_RECEIVED:
Card.withId(payload.cardLabel.cardId).labels.remove(payload.cardLabel.labelId);
break;
case ActionTypes.ACTIONS_FETCH_REQUESTED:
Card.withId(payload.cardId).update({
isActionsFetching: true,
});
break;
case ActionTypes.ACTIONS_FETCH_SUCCEEDED:
Card.withId(payload.cardId).update({
isActionsFetching: false,
isAllActionsFetched: payload.actions.length < Config.ACTIONS_LIMIT,
});
break;
case ActionTypes.NOTIFICATIONS_FETCH_SUCCEEDED:
2020-03-25 00:15:47 +05:00
payload.cards.forEach((card) => {
2019-08-31 04:07:25 +05:00
Card.upsert(card);
});
break;
default:
}
}
getOrderedTasksQuerySet() {
return this.tasks.orderBy('id');
}
2020-04-21 05:04:34 +05:00
getOrderedAttachmentsQuerySet() {
return this.attachments.orderBy('id', false);
}
2019-08-31 04:07:25 +05:00
getOrderedInCardActionsQuerySet() {
return this.actions.orderBy('id', false);
2019-08-31 04:07:25 +05:00
}
getUnreadNotificationsQuerySet() {
return this.notifications.filter({
isRead: false,
});
}
deleteWithRelated() {
this.tasks.delete();
this.actions.delete();
this.delete();
}
}