Project managers, board members, auto-update after reconnection, refactoring

This commit is contained in:
Maksim Eltyshev
2021-06-24 01:05:22 +05:00
parent d6cb1f6683
commit b39119ace4
478 changed files with 21226 additions and 19495 deletions

View File

@@ -0,0 +1,59 @@
import { bindActionCreators } from 'redux';
import { connect } from 'react-redux';
import {
filterLabelsForCurrentBoardSelector,
filterUsersForCurrentBoardSelector,
isCurrentUserManagerForCurrentProjectSelector,
labelsForCurrentBoardSelector,
membershipsForCurrentBoardSelector,
usersSelector,
} from '../selectors';
import {
addLabelToFilterInCurrentBoard,
addUserToFilterInCurrentBoard,
createLabelInCurrentBoard,
createMembershipInCurrentBoard,
deleteBoardMembership,
deleteLabel,
removeLabelFromFilterInCurrentBoard,
removeUserFromFilterInCurrentBoard,
updateLabel,
} from '../actions/entry';
import BoardActions from '../components/BoardActions';
const mapStateToProps = (state) => {
const allUsers = usersSelector(state);
const isCurrentUserManager = isCurrentUserManagerForCurrentProjectSelector(state);
const memberships = membershipsForCurrentBoardSelector(state);
const labels = labelsForCurrentBoardSelector(state);
const filterUsers = filterUsersForCurrentBoardSelector(state);
const filterLabels = filterLabelsForCurrentBoardSelector(state);
return {
memberships,
labels,
filterUsers,
filterLabels,
allUsers,
canEditMemberships: isCurrentUserManager,
};
};
const mapDispatchToProps = (dispatch) =>
bindActionCreators(
{
onMembershipCreate: createMembershipInCurrentBoard,
onMembershipDelete: deleteBoardMembership,
onUserToFilterAdd: addUserToFilterInCurrentBoard,
onUserFromFilterRemove: removeUserFromFilterInCurrentBoard,
onLabelToFilterAdd: addLabelToFilterInCurrentBoard,
onLabelFromFilterRemove: removeLabelFromFilterInCurrentBoard,
onLabelCreate: createLabelInCurrentBoard,
onLabelUpdate: updateLabel,
onLabelDelete: deleteLabel,
},
dispatch,
);
export default connect(mapStateToProps, mapDispatchToProps)(BoardActions);

View File

@@ -2,42 +2,22 @@ import { bindActionCreators } from 'redux';
import { connect } from 'react-redux';
import {
filterLabelsForCurrentBoardSelector,
filterUsersForCurrentBoardSelector,
labelsForCurrentBoardSelector,
isCurrentUserMemberForCurrentBoardSelector,
listIdsForCurrentBoardSelector,
membershipsForCurrentProjectSelector,
pathSelector,
} from '../selectors';
import {
addLabelToFilterInCurrentBoard,
addUserToFilterInCurrentBoard,
createLabelInCurrentBoard,
createListInCurrentBoard,
deleteLabel,
moveCard,
moveList,
removeLabelFromFilterInCurrentBoard,
removeUserFromFilterInCurrentBoard,
updateLabel,
} from '../actions/entry';
import { createListInCurrentBoard, moveCard, moveList } from '../actions/entry';
import BoardKanban from '../components/BoardKanban';
const mapStateToProps = (state) => {
const { cardId } = pathSelector(state);
const allProjectMemberships = membershipsForCurrentProjectSelector(state);
const allLabels = labelsForCurrentBoardSelector(state);
const isCurrentUserMember = isCurrentUserMemberForCurrentBoardSelector(state);
const listIds = listIdsForCurrentBoardSelector(state);
const filterUsers = filterUsersForCurrentBoardSelector(state);
const filterLabels = filterLabelsForCurrentBoardSelector(state);
return {
listIds,
filterUsers,
filterLabels,
allProjectMemberships,
allLabels,
isCardModalOpened: !!cardId,
canEdit: isCurrentUserMember,
};
};
@@ -47,13 +27,6 @@ const mapDispatchToProps = (dispatch) =>
onListCreate: createListInCurrentBoard,
onListMove: moveList,
onCardMove: moveCard,
onUserToFilterAdd: addUserToFilterInCurrentBoard,
onUserFromFilterRemove: removeUserFromFilterInCurrentBoard,
onLabelToFilterAdd: addLabelToFilterInCurrentBoard,
onLabelFromFilterRemove: removeLabelFromFilterInCurrentBoard,
onLabelCreate: createLabelInCurrentBoard,
onLabelUpdate: updateLabel,
onLabelDelete: deleteLabel,
},
dispatch,
);

View File

@@ -1,19 +1,23 @@
import { bindActionCreators } from 'redux';
import { connect } from 'react-redux';
import { boardsForCurrentProjectSelector, currentUserSelector, pathSelector } from '../selectors';
import {
boardsForCurrentProjectSelector,
isCurrentUserManagerForCurrentProjectSelector,
pathSelector,
} from '../selectors';
import { createBoardInCurrentProject, deleteBoard, moveBoard, updateBoard } from '../actions/entry';
import Boards from '../components/Boards';
const mapStateToProps = (state) => {
const { boardId } = pathSelector(state);
const { isAdmin } = currentUserSelector(state);
const boards = boardsForCurrentProjectSelector(state);
const isCurrentUserManager = isCurrentUserManagerForCurrentProjectSelector(state);
return {
items: boards,
currentId: boardId,
isEditable: isAdmin,
canEdit: isCurrentUserManager,
};
};

View File

@@ -2,13 +2,14 @@ import { bindActionCreators } from 'redux';
import { connect } from 'react-redux';
import {
isCurrentUserMemberForCurrentBoardSelector,
labelsForCurrentBoardSelector,
makeCardByIdSelector,
makeLabelsByCardIdSelector,
makeNotificationsTotalByCardIdSelector,
makeTasksByCardIdSelector,
makeUsersByCardIdSelector,
membershipsForCurrentProjectSelector,
membershipsForCurrentBoardSelector,
pathSelector,
projectsToListsForCurrentUserSelector,
} from '../selectors';
@@ -38,8 +39,9 @@ const makeMapStateToProps = () => {
return (state, { id, index }) => {
const { projectId } = pathSelector(state);
const allProjectsToLists = projectsToListsForCurrentUserSelector(state);
const allProjectMemberships = membershipsForCurrentProjectSelector(state);
const allBoardMemberships = membershipsForCurrentBoardSelector(state);
const allLabels = labelsForCurrentBoardSelector(state);
const isCurrentUserMember = isCurrentUserMemberForCurrentBoardSelector(state);
const { name, dueDate, timer, coverUrl, boardId, listId, isPersisted } = cardByIdSelector(
state,
@@ -67,8 +69,9 @@ const makeMapStateToProps = () => {
labels,
tasks,
allProjectsToLists,
allProjectMemberships,
allBoardMemberships,
allLabels,
canEdit: isCurrentUserMember,
};
};
};

View File

@@ -7,10 +7,11 @@ import {
actionsForCurrentCardSelector,
attachmentsForCurrentCardSelector,
currentCardSelector,
currentUserSelector,
isCurrentUserManagerForCurrentProjectSelector,
isCurrentUserMemberForCurrentBoardSelector,
labelsForCurrentBoardSelector,
labelsForCurrentCardSelector,
membershipsForCurrentProjectSelector,
membershipsForCurrentBoardSelector,
pathSelector,
projectsToListsForCurrentUserSelector,
tasksForCurrentCardSelector,
@@ -45,10 +46,11 @@ import CardModal from '../components/CardModal';
const mapStateToProps = (state) => {
const { projectId } = pathSelector(state);
const { isAdmin } = currentUserSelector(state);
const allProjectsToLists = projectsToListsForCurrentUserSelector(state);
const allProjectMemberships = membershipsForCurrentProjectSelector(state);
const isCurrentUserManager = isCurrentUserManagerForCurrentProjectSelector(state);
const allBoardMemberships = membershipsForCurrentBoardSelector(state);
const allLabels = labelsForCurrentBoardSelector(state);
const isCurrentUserMember = isCurrentUserMemberForCurrentBoardSelector(state);
const {
name,
@@ -85,9 +87,10 @@ const mapStateToProps = (state) => {
attachments,
actions,
allProjectsToLists,
allProjectMemberships,
allBoardMemberships,
allLabels,
isEditable: isAdmin,
canEdit: isCurrentUserMember,
canEditAllCommentActions: isCurrentUserManager,
};
};

View File

@@ -8,6 +8,7 @@ const mapStateToProps = (state) => {
return {
isInitializing: isCoreInitializing,
isSocketDisconnected: state.socket.isDisconnected,
};
};

View File

@@ -1,13 +1,15 @@
import { connect } from 'react-redux';
import { pathSelector } from '../selectors';
import { currentBoardSelector, pathSelector } from '../selectors';
import Fixed from '../components/Fixed';
const mapStateToProps = (state) => {
const { projectId } = pathSelector(state);
const currentBoard = currentBoardSelector(state);
return {
projectId,
board: currentBoard,
};
};

View File

@@ -1,10 +1,16 @@
import { bindActionCreators } from 'redux';
import { connect } from 'react-redux';
import { currentUserSelector, notificationsForCurrentUserSelector } from '../selectors';
import {
currentProjectSelector,
currentUserSelector,
isCurrentUserManagerForCurrentProjectSelector,
notificationsForCurrentUserSelector,
} from '../selectors';
import {
deleteNotification,
logout,
openProjectSettingsModal,
openUserSettingsModal,
openUsersModal,
} from '../actions/entry';
@@ -12,21 +18,26 @@ import Header from '../components/Header';
const mapStateToProps = (state) => {
const currentUser = currentUserSelector(state);
const currentProject = currentProjectSelector(state);
const notifications = notificationsForCurrentUserSelector(state);
const isCurrentUserManager = isCurrentUserManagerForCurrentProjectSelector(state);
return {
notifications,
project: currentProject,
user: currentUser,
isEditable: currentUser.isAdmin,
canEditProject: isCurrentUserManager,
canEditUsers: currentUser.isAdmin,
};
};
const mapDispatchToProps = (dispatch) =>
bindActionCreators(
{
onUsers: openUsersModal, // TODO: rename
onProjectSettingsClick: openProjectSettingsModal,
onUsersClick: openUsersModal,
onNotificationDelete: deleteNotification,
onUserSettings: openUserSettingsModal,
onUserSettingsClick: openUserSettingsModal,
onLogout: logout,
},
dispatch,

View File

@@ -1,9 +1,8 @@
import { bindActionCreators } from 'redux';
import { connect } from 'react-redux';
import omit from 'lodash/omit';
import {
isAnyFilterActiveForCurrentBoardSelector,
isCurrentUserMemberForCurrentBoardSelector,
makeCardIdsByListIdSelector,
makeListByIdSelector,
} from '../selectors';
@@ -17,7 +16,7 @@ const makeMapStateToProps = () => {
return (state, { id, index }) => {
const { name, isPersisted } = listByIdSelector(state, id);
const cardIds = cardIdsByListIdSelector(state, id);
const isAnyFilterActive = isAnyFilterActiveForCurrentBoardSelector(state);
const isCurrentUserMember = isCurrentUserMemberForCurrentBoardSelector(state);
return {
id,
@@ -25,7 +24,7 @@ const makeMapStateToProps = () => {
name,
isPersisted,
cardIds,
isDeletable: !isAnyFilterActive,
canEdit: isCurrentUserMember,
};
};
};
@@ -40,9 +39,4 @@ const mapDispatchToProps = (dispatch, { id }) =>
dispatch,
);
const mergeProps = (stateProps, dispatchProps) => ({
...omit(stateProps, 'isDeletable'),
...(stateProps.isDeletable ? dispatchProps : omit(dispatchProps, 'onDelete')),
});
export default connect(makeMapStateToProps, mapDispatchToProps, mergeProps)(List);
export default connect(makeMapStateToProps, mapDispatchToProps)(List);

View File

@@ -4,7 +4,11 @@ import { connect } from 'react-redux';
import { authenticate, clearAuthenticateError } from '../actions/entry';
import Login from '../components/Login';
const mapStateToProps = ({ authenticateForm: { data: defaultData, isSubmitting, error } }) => ({
const mapStateToProps = ({
ui: {
authenticateForm: { data: defaultData, isSubmitting, error },
},
}) => ({
defaultData,
isSubmitting,
error,

View File

@@ -4,7 +4,11 @@ import { connect } from 'react-redux';
import { closeModal, createProject } from '../actions/entry';
import ProjectAddModal from '../components/ProjectAddModal';
const mapStateToProps = ({ projectCreateForm: { data: defaultData, isSubmitting } }) => ({
const mapStateToProps = ({
ui: {
projectCreateForm: { data: defaultData, isSubmitting },
},
}) => ({
defaultData,
isSubmitting,
});

View File

@@ -1,50 +1,15 @@
import { bindActionCreators } from 'redux';
import { connect } from 'react-redux';
import {
allUsersSelector,
currentProjectSelector,
currentUserSelector,
membershipsForCurrentProjectSelector,
} from '../selectors';
import {
createMembershipInCurrentProject,
deleteCurrentProject,
deleteProjectMembership,
updateCurrentProject,
updateCurrentProjectBackgroundImage,
} from '../actions/entry';
import { currentModalSelector } from '../selectors';
import ModalTypes from '../constants/ModalTypes';
import Project from '../components/Project';
const mapStateToProps = (state) => {
const allUsers = allUsersSelector(state);
const { isAdmin } = currentUserSelector(state);
const { name, background, backgroundImage, isBackgroundImageUpdating } = currentProjectSelector(
state,
);
const memberships = membershipsForCurrentProjectSelector(state);
const currentModal = currentModalSelector(state);
return {
name,
background,
backgroundImage,
isBackgroundImageUpdating,
memberships,
allUsers,
isEditable: isAdmin,
isSettingsModalOpened: currentModal === ModalTypes.PROJECT_SETTINGS,
};
};
const mapDispatchToProps = (dispatch) =>
bindActionCreators(
{
onUpdate: updateCurrentProject,
onBackgroundImageUpdate: updateCurrentProjectBackgroundImage,
onDelete: deleteCurrentProject,
onMembershipCreate: createMembershipInCurrentProject,
onMembershipDelete: deleteProjectMembership,
},
dispatch,
);
export default connect(mapStateToProps, mapDispatchToProps)(Project);
export default connect(mapStateToProps)(Project);

View File

@@ -0,0 +1,50 @@
import { bindActionCreators } from 'redux';
import { connect } from 'react-redux';
import {
currentProjectSelector,
managersForCurrentProjectSelector,
usersSelector,
} from '../selectors';
import {
closeModal,
createManagerInCurrentProject,
deleteCurrentProject,
deleteProjectManager,
updateCurrentProject,
updateCurrentProjectBackgroundImage,
} from '../actions/entry';
import ProjectSettingsModal from '../components/ProjectSettingsModal';
const mapStateToProps = (state) => {
const users = usersSelector(state);
const { name, background, backgroundImage, isBackgroundImageUpdating } =
currentProjectSelector(state);
const managers = managersForCurrentProjectSelector(state);
return {
name,
background,
backgroundImage,
isBackgroundImageUpdating,
managers,
allUsers: users,
};
};
const mapDispatchToProps = (dispatch) =>
bindActionCreators(
{
onUpdate: updateCurrentProject,
onBackgroundImageUpdate: updateCurrentProjectBackgroundImage,
onDelete: deleteCurrentProject,
onManagerCreate: createManagerInCurrentProject,
onManagerDelete: deleteProjectManager,
onClose: closeModal,
},
dispatch,
);
export default connect(mapStateToProps, mapDispatchToProps)(ProjectSettingsModal);

View File

@@ -7,11 +7,11 @@ import Projects from '../components/Projects';
const mapStateToProps = (state) => {
const { isAdmin } = currentUserSelector(state);
const projects = projectsForCurrentUserSelector(state);
const project = projectsForCurrentUserSelector(state);
return {
items: projects,
isEditable: isAdmin,
items: project,
canAdd: isAdmin,
};
};

View File

@@ -1,11 +0,0 @@
import { connect } from 'react-redux';
import SocketStatuses from '../constants/SocketStatuses';
import SocketStatus from '../components/SocketStatus';
const mapStateToProps = ({ socket: { status } }) => ({
isDisconnected: status === SocketStatuses.DISCONNECTED,
isReconnected: status === SocketStatuses.RECONNECTED,
});
export default connect(mapStateToProps)(SocketStatus);

View File

@@ -4,7 +4,11 @@ import { connect } from 'react-redux';
import { clearUserCreateError, createUser } from '../actions/entry';
import UserAddPopup from '../components/UserAddPopup';
const mapStateToProps = ({ userCreateForm: { data: defaultData, isSubmitting, error } }) => ({
const mapStateToProps = ({
ui: {
userCreateForm: { data: defaultData, isSubmitting, error },
},
}) => ({
defaultData,
isSubmitting,
error,

View File

@@ -1,15 +1,15 @@
import { bindActionCreators } from 'redux';
import { connect } from 'react-redux';
import { allUsersExceptCurrentSelector } from '../selectors';
import { usersExceptCurrentSelector } from '../selectors';
import { closeModal, deleteUser, updateUser } from '../actions/entry';
import UsersModal from '../components/UsersModal';
const mapStateToProps = (state) => {
const items = allUsersExceptCurrentSelector(state);
const users = usersExceptCurrentSelector(state);
return {
items,
items: users,
};
};