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

274 lines
6.9 KiB
JavaScript
Raw Normal View History

2022-12-26 21:10:50 +01:00
import { attr, fk, many } from 'redux-orm';
2019-08-31 04:07:25 +05:00
2022-12-26 21:10:50 +01:00
import BaseModel from './BaseModel';
2019-08-31 04:07:25 +05:00
import ActionTypes from '../constants/ActionTypes';
import User from './User';
import Label from './Label';
2022-12-26 21:10:50 +01:00
export default class extends BaseModel {
2019-08-31 04:07:25 +05:00
static modelName = 'Board';
static fields = {
id: attr(),
position: attr(),
name: attr(),
isFetching: attr({
getDefault: () => null,
}),
projectId: fk({
to: 'Project',
as: 'project',
relatedName: 'boards',
}),
memberUsers: many({
to: 'User',
through: 'BoardMembership',
relatedName: 'boards',
}),
2019-08-31 04:07:25 +05:00
filterUsers: many('User', 'filterBoards'),
filterLabels: many('Label', 'filterBoards'),
filterText: attr({
getDefault: () => '',
}),
2019-08-31 04:07:25 +05:00
};
static reducer({ type, payload }, Board) {
switch (type) {
case ActionTypes.LOCATION_CHANGE_HANDLE:
if (payload.board) {
Board.upsert({
...payload.board,
isFetching: false,
});
}
break;
case ActionTypes.LOCATION_CHANGE_HANDLE__BOARD_FETCH:
case ActionTypes.BOARD_FETCH:
Board.withId(payload.id).update({
isFetching: true,
});
break;
case ActionTypes.SOCKET_RECONNECT_HANDLE:
Board.all().delete();
if (payload.board) {
Board.upsert({
...payload.board,
isFetching: false,
});
}
payload.boards.forEach((board) => {
Board.upsert(board);
});
break;
case ActionTypes.SOCKET_RECONNECT_HANDLE__CORE_FETCH:
Board.all()
.toModelArray()
.forEach((boardModel) => {
if (boardModel.id !== payload.currentBoardId) {
boardModel.update({
isFetching: null,
});
boardModel.deleteRelated(payload.currentUserId);
}
});
break;
case ActionTypes.CORE_INITIALIZE:
if (payload.board) {
Board.upsert({
...payload.board,
isFetching: false,
});
}
payload.boards.forEach((board) => {
Board.upsert(board);
});
break;
2019-08-31 04:07:25 +05:00
case ActionTypes.USER_TO_BOARD_FILTER_ADD:
Board.withId(payload.boardId).filterUsers.add(payload.id);
break;
case ActionTypes.USER_FROM_BOARD_FILTER_REMOVE:
Board.withId(payload.boardId).filterUsers.remove(payload.id);
break;
case ActionTypes.PROJECT_CREATE_HANDLE:
2020-03-25 00:15:47 +05:00
payload.boards.forEach((board) => {
2019-08-31 04:07:25 +05:00
Board.upsert(board);
});
break;
case ActionTypes.PROJECT_MANAGER_CREATE_HANDLE:
case ActionTypes.BOARD_MEMBERSHIP_CREATE_HANDLE:
if (payload.boards) {
payload.boards.forEach((board) => {
Board.upsert({
...board,
...(payload.board &&
payload.board.id === board.id && {
isFetching: false,
}),
});
});
}
2019-08-31 04:07:25 +05:00
break;
case ActionTypes.BOARD_CREATE:
case ActionTypes.BOARD_CREATE_HANDLE:
case ActionTypes.BOARD_UPDATE__SUCCESS:
case ActionTypes.BOARD_UPDATE_HANDLE:
Board.upsert(payload.board);
2019-08-31 04:07:25 +05:00
break;
case ActionTypes.BOARD_CREATE__SUCCESS:
2019-08-31 04:07:25 +05:00
Board.withId(payload.localId).delete();
Board.upsert(payload.board);
2019-08-31 04:07:25 +05:00
break;
case ActionTypes.BOARD_FETCH__SUCCESS:
Board.upsert({
...payload.board,
isFetching: false,
});
2019-08-31 04:07:25 +05:00
break;
case ActionTypes.BOARD_FETCH__FAILURE:
2019-08-31 04:07:25 +05:00
Board.withId(payload.id).update({
isFetching: null,
2019-08-31 04:07:25 +05:00
});
break;
case ActionTypes.BOARD_UPDATE:
Board.withId(payload.id).update(payload.data);
2019-08-31 04:07:25 +05:00
break;
case ActionTypes.BOARD_DELETE:
Board.withId(payload.id).deleteWithRelated();
2019-08-31 04:07:25 +05:00
break;
case ActionTypes.BOARD_DELETE__SUCCESS:
case ActionTypes.BOARD_DELETE_HANDLE: {
const boardModel = Board.withId(payload.board.id);
if (boardModel) {
boardModel.deleteWithRelated();
}
2019-08-31 04:07:25 +05:00
break;
}
2019-08-31 04:07:25 +05:00
case ActionTypes.LABEL_TO_BOARD_FILTER_ADD:
Board.withId(payload.boardId).filterLabels.add(payload.id);
break;
case ActionTypes.LABEL_FROM_BOARD_FILTER_REMOVE:
Board.withId(payload.boardId).filterLabels.remove(payload.id);
break;
case ActionTypes.TEXT_FILTER_IN_CURRENT_BOARD: {
const board = Board.withId(payload.boardId);
let filterText = payload.text;
const posSpace = filterText.indexOf(' ');
// Shortcut to user filters
const posAT = filterText.indexOf('@');
if (posAT >= 0 && posSpace > 0 && posAT < posSpace) {
const userId = User.findUsersFromText(
filterText.substring(posAT + 1, posSpace),
board.memberships.toModelArray().map((membership) => membership.user),
);
if (
userId &&
board.filterUsers.toModelArray().filter((user) => user.id === userId).length === 0
) {
board.filterUsers.add(userId);
filterText = filterText.substring(0, posAT);
}
}
// Shortcut to label filters
const posSharp = filterText.indexOf('#');
if (posSharp >= 0 && posSpace > 0 && posSharp < posSpace) {
const labelId = Label.findLabelsFromText(
filterText.substring(posSharp + 1, posSpace),
board.labels.toModelArray(),
);
if (
labelId &&
board.filterLabels.toModelArray().filter((label) => label.id === labelId).length === 0
) {
board.filterLabels.add(labelId);
filterText = filterText.substring(0, posSharp);
}
}
board.update({ filterText });
break;
}
2019-08-31 04:07:25 +05:00
default:
}
}
getOrderedMembershipsQuerySet() {
return this.memberships.orderBy('createdAt');
}
2023-01-09 12:17:06 +01:00
getOrderedLabelsQuerySet() {
return this.labels.orderBy('position');
}
2019-08-31 04:07:25 +05:00
getOrderedListsQuerySet() {
return this.lists.orderBy('position');
}
2022-12-26 21:10:50 +01:00
getMembershipModelForUser(userId) {
return this.memberships
.filter({
userId,
})
.first();
}
2022-12-26 21:10:50 +01:00
hasMembershipForUser(userId) {
return this.memberships
.filter({
userId,
})
.exists();
}
2022-12-26 21:10:50 +01:00
isAvailableForUser(userId) {
return (
this.project && (this.project.hasManagerForUser(userId) || this.hasMembershipForUser(userId))
);
}
deleteRelated(exceptMemberUserId) {
this.memberships.toModelArray().forEach((boardMembershipModel) => {
if (boardMembershipModel.userId !== exceptMemberUserId) {
boardMembershipModel.deleteWithRelated();
}
2019-08-31 04:07:25 +05:00
});
this.labels.delete();
this.lists.toModelArray().forEach((listModel) => {
listModel.deleteWithRelated();
});
}
deleteWithRelated() {
this.deleteRelated();
2019-08-31 04:07:25 +05:00
this.delete();
}
}