Files
planka/client/src/selectors/projects.js
Maksim Eltyshev 2ee1166747 feat: Version 2
Closes #627, closes #1047
2025-05-10 02:09:06 +02:00

335 lines
8.1 KiB
JavaScript

/*!
* Copyright (c) 2024 PLANKA Software GmbH
* Licensed under the Fair Use License: https://github.com/plankanban/planka/blob/master/LICENSE.md
*/
import { createSelector } from 'redux-orm';
import orm from '../orm';
import { selectPath } from './router';
import { selectCurrentUserId } from './users';
import { isLocalId } from '../utils/local-id';
export const makeSelectProjectById = () =>
createSelector(
orm,
(_, id) => id,
({ Project }, id) => {
const projectModel = Project.withId(id);
if (!projectModel) {
return projectModel;
}
return projectModel.ref;
},
);
export const selectProjectById = makeSelectProjectById();
export const makeSelectBoardIdsByProjectId = () =>
createSelector(
orm,
(_, id) => id,
(state) => selectCurrentUserId(state),
({ Project, User }, id, currentUserId) => {
if (!id) {
return id;
}
const projectModel = Project.withId(id);
if (!projectModel) {
return projectModel;
}
const currentUserModel = User.withId(currentUserId);
return projectModel
.getBoardsModelArrayAvailableForUser(currentUserModel)
.map((boardModel) => boardModel.id);
},
);
export const selectBoardIdsByProjectId = makeSelectBoardIdsByProjectId();
export const makeSelectFirstBoardIdByProjectId = () =>
createSelector(
orm,
(_, id) => id,
(state) => selectCurrentUserId(state),
({ Project, User }, id, currentUserId) => {
const projectModel = Project.withId(id);
if (!projectModel) {
return projectModel;
}
const currentUserModel = User.withId(currentUserId);
const boardsModels = projectModel.getBoardsModelArrayAvailableForUser(currentUserModel);
return boardsModels[0] && boardsModels[0].id;
},
);
export const selectFirstBoardIdByProjectId = makeSelectFirstBoardIdByProjectId();
export const makeSelectNotificationsTotalByProjectId = () =>
createSelector(
orm,
(_, id) => id,
(state) => selectCurrentUserId(state),
({ Project, User }, id, currentUserId) => {
const projectModel = Project.withId(id);
if (!projectModel) {
return projectModel;
}
const currentUserModel = User.withId(currentUserId);
const boardsModels = projectModel.getBoardsModelArrayAvailableForUser(currentUserModel);
return boardsModels.reduce(
(result, boardModel) => result + boardModel.getUnreadNotificationsQuerySet().count(),
0,
);
},
);
export const selectNotificationsTotalByProjectId = makeSelectNotificationsTotalByProjectId();
export const makeSelectIsProjectWithIdAvailableForCurrentUser = () =>
createSelector(
orm,
(_, id) => id,
(state) => selectCurrentUserId(state),
({ Project, User }, id, currentUserId) => {
const projectModel = Project.withId(id);
if (!projectModel) {
return false;
}
const currentUserModel = User.withId(currentUserId);
return projectModel.isAvailableForUser(currentUserModel);
},
);
export const selectIsProjectWithIdAvailableForCurrentUser =
makeSelectIsProjectWithIdAvailableForCurrentUser();
export const makeSelectIsProjectWithIdExternalAccessibleForCurrentUser = () =>
createSelector(
orm,
(_, id) => id,
(state) => selectCurrentUserId(state),
({ Project, User }, id, currentUserId) => {
const projectModel = Project.withId(id);
if (!projectModel) {
return false;
}
const currentUserModel = User.withId(currentUserId);
return projectModel.isExternalAccessibleForUser(currentUserModel);
},
);
export const selectIsProjectWithIdExternalAccessibleForCurrentUser =
makeSelectIsProjectWithIdExternalAccessibleForCurrentUser();
export const selectCurrentProject = createSelector(
orm,
(state) => selectPath(state).projectId,
({ Project }, id) => {
if (!id) {
return id;
}
const projectModel = Project.withId(id);
if (!projectModel) {
return projectModel;
}
return projectModel.ref;
},
);
export const selectManagersForCurrentProject = createSelector(
orm,
(state) => selectPath(state).projectId,
({ Project }, id) => {
if (!id) {
return id;
}
const projectModel = Project.withId(id);
if (!projectModel) {
return projectModel;
}
return projectModel
.getManagersQuerySet()
.toModelArray()
.map((projectManagerModel) => ({
...projectManagerModel.ref,
isPersisted: !isLocalId(projectManagerModel.id),
user: projectManagerModel.user.ref,
}));
},
);
export const selectManagerUserIdsForCurrentProject = createSelector(
orm,
(state) => selectPath(state).projectId,
({ Project }, id) => {
if (!id) {
return id;
}
const projectModel = Project.withId(id);
if (!projectModel) {
return projectModel;
}
return projectModel
.getManagersQuerySet()
.toRefArray()
.map((projectManager) => projectManager.userId);
},
);
export const selectBackgroundImageIdsForCurrentProject = createSelector(
orm,
(state) => selectPath(state).projectId,
({ Project }, id) => {
if (!id) {
return id;
}
const projectModel = Project.withId(id);
if (!projectModel) {
return projectModel;
}
return projectModel
.getBackgroundImagesQuerySet()
.toRefArray()
.map((backgroundImage) => backgroundImage.id);
},
);
export const selectBaseCustomFieldGroupIdsForCurrentProject = createSelector(
orm,
(state) => selectPath(state).projectId,
({ Project }, id) => {
if (!id) {
return id;
}
const projectModel = Project.withId(id);
if (!projectModel) {
return projectModel;
}
return projectModel
.getBaseCustomFieldGroupsQuerySet()
.toRefArray()
.map((baseCustomFieldGroup) => baseCustomFieldGroup.id);
},
);
export const selectBaseCustomFieldGroupsForCurrentProject = createSelector(
orm,
(state) => selectPath(state).projectId,
({ Project }, id) => {
if (!id) {
return id;
}
const projectModel = Project.withId(id);
if (!projectModel) {
return projectModel;
}
return projectModel
.getBaseCustomFieldGroupsQuerySet()
.toRefArray()
.map((baseCustomFieldGroup) => ({
...baseCustomFieldGroup,
isPersisted: !isLocalId(baseCustomFieldGroup.id),
}));
},
);
export const selectBoardIdsForCurrentProject = createSelector(
orm,
(state) => selectPath(state).projectId,
(state) => selectCurrentUserId(state),
({ Project, User }, id, currentUserId) => {
if (!id) {
return id;
}
const projectModel = Project.withId(id);
if (!projectModel) {
return projectModel;
}
const currentUserModel = User.withId(currentUserId);
return projectModel
.getBoardsModelArrayAvailableForUser(currentUserModel)
.map((boardModel) => boardModel.id);
},
);
export const selectIsCurrentUserManagerForCurrentProject = createSelector(
orm,
(state) => selectPath(state).projectId,
(state) => selectCurrentUserId(state),
({ Project }, id, currentUserId) => {
if (!id) {
return false;
}
const projectModel = Project.withId(id);
if (!projectModel) {
return false;
}
return projectModel.hasManagerWithUserId(currentUserId);
},
);
export default {
makeSelectProjectById,
selectProjectById,
makeSelectBoardIdsByProjectId,
selectBoardIdsByProjectId,
makeSelectFirstBoardIdByProjectId,
selectFirstBoardIdByProjectId,
makeSelectNotificationsTotalByProjectId,
selectNotificationsTotalByProjectId,
makeSelectIsProjectWithIdAvailableForCurrentUser,
selectIsProjectWithIdAvailableForCurrentUser,
makeSelectIsProjectWithIdExternalAccessibleForCurrentUser,
selectIsProjectWithIdExternalAccessibleForCurrentUser,
selectCurrentProject,
selectManagersForCurrentProject,
selectManagerUserIdsForCurrentProject,
selectBackgroundImageIdsForCurrentProject,
selectBaseCustomFieldGroupIdsForCurrentProject,
selectBaseCustomFieldGroupsForCurrentProject,
selectBoardIdsForCurrentProject,
selectIsCurrentUserManagerForCurrentProject,
};