Project managers, board members, auto-update after reconnection, refactoring
This commit is contained in:
59
client/src/containers/BoardActionsContainer.js
Normal file
59
client/src/containers/BoardActionsContainer.js
Normal 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);
|
||||
@@ -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,
|
||||
);
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@ const mapStateToProps = (state) => {
|
||||
|
||||
return {
|
||||
isInitializing: isCoreInitializing,
|
||||
isSocketDisconnected: state.socket.isDisconnected,
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
});
|
||||
|
||||
@@ -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);
|
||||
|
||||
50
client/src/containers/ProjectSettingsModalContainer.js
Normal file
50
client/src/containers/ProjectSettingsModalContainer.js
Normal 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);
|
||||
@@ -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,
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -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);
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user