diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/actions/projects.js | 8 | ||||
| -rw-r--r-- | src/components/modals/Modal.js | 2 | ||||
| -rw-r--r-- | src/components/projects/ProjectActionButtons.js | 24 | ||||
| -rw-r--r-- | src/components/projects/ProjectAuth.js | 2 | ||||
| -rw-r--r-- | src/components/projects/ProjectAuthList.js | 33 | ||||
| -rw-r--r-- | src/components/projects/ProjectAuthList.sass | 87 | ||||
| -rw-r--r-- | src/containers/projects/NewProjectModal.js | 2 | ||||
| -rw-r--r-- | src/containers/projects/ProjectActions.js | 22 | ||||
| -rw-r--r-- | src/reducers/projects.js | 3 |
9 files changed, 125 insertions, 58 deletions
diff --git a/src/actions/projects.js b/src/actions/projects.js index 57304326..0ab1f820 100644 --- a/src/actions/projects.js +++ b/src/actions/projects.js @@ -3,6 +3,7 @@ export const OPEN_NEW_PROJECT_MODAL = "OPEN_NEW_PROJECT_MODAL"; export const CLOSE_NEW_PROJECT_MODAL = "CLOSE_PROJECT_POPUP"; export const ADD_PROJECT = "ADD_PROJECT"; export const DELETE_PROJECT = "DELETE_PROJECT"; +export const OPEN_PROJECT = "OPEN_PROJECT"; export const setAuthVisibilityFilter = (filter) => { return { @@ -36,3 +37,10 @@ export const deleteProject = (id) => { id }; }; + +export const openProject = (id) => { + return { + type: OPEN_PROJECT, + id + }; +}; diff --git a/src/components/modals/Modal.js b/src/components/modals/Modal.js index e2d19fcb..bb8fa00f 100644 --- a/src/components/modals/Modal.js +++ b/src/components/modals/Modal.js @@ -17,6 +17,8 @@ class Modal extends React.Component { componentDidMount() { this.openOrCloseModal(); + + window["$"]("#" + this.id).on("hide.bs.modal", this.props.onCancel.bind(this)); } componentDidUpdate() { diff --git a/src/components/projects/ProjectActionButtons.js b/src/components/projects/ProjectActionButtons.js new file mode 100644 index 00000000..085438d8 --- /dev/null +++ b/src/components/projects/ProjectActionButtons.js @@ -0,0 +1,24 @@ +import PropTypes from "prop-types"; +import React from 'react'; + +const ProjectActionButtons = ({onOpen, onViewUsers, onDelete}) => ( + <div className="project-icons"> + <div className="open" title="Open this project" onClick={onOpen}> + <span className="fa fa-play"/> + </div> + <div className="users" title="View and edit collaborators on this project" onClick={onViewUsers}> + <span className="fa fa-users"/> + </div> + <div className="delete" title="Delete this project" onClick={onDelete}> + <span className="fa fa-trash"/> + </div> + </div> +); + +ProjectActionButtons.propTypes = { + onOpen: PropTypes.func.isRequired, + onViewUsers: PropTypes.func.isRequired, + onDelete: PropTypes.func.isRequired, +}; + +export default ProjectActionButtons; diff --git a/src/components/projects/ProjectAuth.js b/src/components/projects/ProjectAuth.js index 7e3abae1..e58ac92b 100644 --- a/src/components/projects/ProjectAuth.js +++ b/src/components/projects/ProjectAuth.js @@ -1,5 +1,6 @@ import classNames from 'classnames'; import React from 'react'; +import ProjectActions from "../../containers/projects/ProjectActions"; import Shapes from "../../shapes/index"; import {AUTH_DESCRIPTION_MAP, AUTH_ICON_MAP} from "../../util/authorizations"; import {parseAndFormatDateTime} from "../../util/date-time"; @@ -12,6 +13,7 @@ const ProjectAuth = ({projectAuth}) => ( <span className={classNames("fa", "fa-" + AUTH_ICON_MAP[projectAuth.authorizationLevel])}/> {AUTH_DESCRIPTION_MAP[projectAuth.authorizationLevel]} </div> + <ProjectActions/> </div> ); diff --git a/src/components/projects/ProjectAuthList.js b/src/components/projects/ProjectAuthList.js index 093b3279..217a8375 100644 --- a/src/components/projects/ProjectAuthList.js +++ b/src/components/projects/ProjectAuthList.js @@ -5,23 +5,26 @@ import NoProjectsAlert from "./NoProjectsAlert"; import ProjectAuth from "./ProjectAuth"; import "./ProjectAuthList.css"; -const ProjectAuthList = ({authorizations, onProjectClick}) => ( - <div className="project-list"> - <div className="list-head"> - <div>Project name</div> - <div>Last edited</div> - <div>Access rights</div> - </div> - <div className="list-body"> - {authorizations.length === 0 ? - <NoProjectsAlert/> : - authorizations.map(authorization => ( +const ProjectAuthList = ({authorizations}) => { + if (authorizations.length === 0) { + return <NoProjectsAlert/>; + } + + return ( + <div className="project-list"> + <div className="list-head"> + <div>Project name</div> + <div>Last edited</div> + <div>Access rights</div> + </div> + <div className="list-body"> + {authorizations.map(authorization => ( <ProjectAuth projectAuth={authorization} key={authorization.simulation.id}/> - )) - } + ))} + </div> </div> - </div> -); + ); +}; ProjectAuthList.propTypes = { authorizations: PropTypes.arrayOf(Shapes.Authorization).isRequired, diff --git a/src/components/projects/ProjectAuthList.sass b/src/components/projects/ProjectAuthList.sass index 86e1123c..1c65305e 100644 --- a/src/components/projects/ProjectAuthList.sass +++ b/src/components/projects/ProjectAuthList.sass @@ -28,25 +28,19 @@ line-height: 40px clear: both - +transition(background, $transition-length) - +clickable - -.project-row:hover - background: #fff - -.project-row:active - background: #cccccc - .project-row:not(:first-of-type) margin-top: -1px // Sizing of table columns .project-row, .project-list .list-head div:first-of-type - width: 50% + width: 40% div:nth-of-type(2) - width: 30% + width: 20% + + div:nth-of-type(3) + width: 20% div:last-of-type width: 20% @@ -54,45 +48,54 @@ span margin-right: 10px -.project-row.active - border-bottom: 0 - background: #3442b1 - color: #eee +.project-row .project-icons div + display: inline + position: relative + top: 5px + width: 30px + height: 30px + margin-right: 5px + font-size: 12pt + color: white + +border-radius(100%) + +clickable + +transition(background, $transition-length) -.project-view - padding: 10px - overflow: hidden - border: 1px solid #b6b6b6 - border-top: 0 + span + position: relative + top: -4px + left: -1px - background: #3442b1 - color: #eee + &.open + $icon-color: #0c60bf + background: $icon-color - .participants - display: inline-block - float: left + &:hover + background: lighten($icon-color, 10%) - .access-buttons - display: inline-block - float: right + &:active + background: darken($icon-color, 10%) - .inline-btn - margin-left: 10px + &.users + font-size: 10pt + $icon-color: #17bf55 + background: $icon-color - .open - background: #e38829 + span + left: -2px - .open:hover - background: #ff992e + &:hover + background: lighten($icon-color, 10%) - .open:active - background: #ba6f21 + &:active + background: darken($icon-color, 10%) - .edit - background: #2c3897 + &.delete + $icon-color: #e3474d + background: $icon-color - .edit:hover - background: #3a4ac8 + &:hover + background: lighten($icon-color, 10%) - .edit:active - background: #242d7a + &:active + background: darken($icon-color, 10%) diff --git a/src/containers/projects/NewProjectModal.js b/src/containers/projects/NewProjectModal.js index 7321cb4d..affaf794 100644 --- a/src/containers/projects/NewProjectModal.js +++ b/src/containers/projects/NewProjectModal.js @@ -20,8 +20,8 @@ const mapDispatchToProps = dispatch => { callback: (text) => { if (text) { dispatch(addProject(text)); - dispatch(closeNewProjectModal()); } + dispatch(closeNewProjectModal()); } }; }; diff --git a/src/containers/projects/ProjectActions.js b/src/containers/projects/ProjectActions.js new file mode 100644 index 00000000..3746bdb8 --- /dev/null +++ b/src/containers/projects/ProjectActions.js @@ -0,0 +1,22 @@ +import {connect} from "react-redux"; +import {deleteProject, openProject} from "../../actions/projects"; +import ProjectActionButtons from "../../components/projects/ProjectActionButtons"; + +const mapStateToProps = state => { + return {}; +}; + +const mapDispatchToProps = dispatch => { + return { + onOpen: (id) => dispatch(openProject(id)), + onViewUsers: (id) => {}, + onDelete: (id) => dispatch(deleteProject(id)), + }; +}; + +const ProjectActions = connect( + mapStateToProps, + mapDispatchToProps +)(ProjectActionButtons); + +export default ProjectActions; diff --git a/src/reducers/projects.js b/src/reducers/projects.js index 20f17a3c..ff5c37cd 100644 --- a/src/reducers/projects.js +++ b/src/reducers/projects.js @@ -1,6 +1,7 @@ import { ADD_PROJECT, CLOSE_NEW_PROJECT_MODAL, + DELETE_PROJECT, OPEN_NEW_PROJECT_MODAL, SET_AUTH_VISIBILITY_FILTER } from "../actions/projects"; @@ -16,6 +17,8 @@ export const authorizations = (state = [], action) => { authorizationLevel: "OWN" } ]; + case DELETE_PROJECT: + return []; default: return state; } |
