diff --git a/api/package-lock.json b/api/package-lock.json index d43af47d4..81ed969ea 100644 --- a/api/package-lock.json +++ b/api/package-lock.json @@ -568,7 +568,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -614,7 +614,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -923,7 +923,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -1462,7 +1462,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -1640,7 +1640,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -4084,6 +4084,11 @@ "iterall": "^1.2.1" } }, + "graphql-tag": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.9.2.tgz", + "integrity": "sha512-qnNmof9pAqj/LUzs3lStP0Gw1qhdVCUS7Ab7+SUB6KD5aX1uqxWQRwMnOGTkhKuLvLNIs1TvNz+iS9kUGl1MhA==" + }, "graphql-tools": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/graphql-tools/-/graphql-tools-3.1.1.tgz", @@ -4997,7 +5002,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -5366,7 +5371,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -6693,7 +6698,7 @@ }, "graphql-import": { "version": "0.4.5", - "resolved": "http://registry.npmjs.org/graphql-import/-/graphql-import-0.4.5.tgz", + "resolved": "https://registry.npmjs.org/graphql-import/-/graphql-import-0.4.5.tgz", "integrity": "sha512-G/+I08Qp6/QGTb9qapknCm3yPHV0ZL7wbaalWFpxsfR8ZhZoTBe//LsbsCKlbALQpcMegchpJhpTSKiJjhaVqQ==", "dev": true, "requires": { @@ -7590,7 +7595,7 @@ "dependencies": { "commander": { "version": "2.8.1", - "resolved": "http://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", "dev": true, "requires": { @@ -8178,7 +8183,7 @@ }, "table": { "version": "4.0.3", - "resolved": "http://registry.npmjs.org/table/-/table-4.0.3.tgz", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.3.tgz", "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", "dev": true, "requires": { @@ -8239,7 +8244,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -8504,7 +8509,7 @@ }, "buffer": { "version": "3.6.0", - "resolved": "http://registry.npmjs.org/buffer/-/buffer-3.6.0.tgz", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-3.6.0.tgz", "integrity": "sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=", "dev": true, "requires": { @@ -9087,7 +9092,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { diff --git a/api/package.json b/api/package.json index 8bc857126..784b66264 100644 --- a/api/package.json +++ b/api/package.json @@ -11,6 +11,7 @@ "dotenv": "^6.0.0", "express-jwt": "^5.3.1", "graphql-import": "^0.6.0", + "graphql-tag": "^2.9.2", "graphql-tools": "3.1.1", "graphql-yoga": "^1.16.1", "jsonwebtoken": "^8.3.0", diff --git a/api/src/graphql/TeamsFragment.js b/api/src/graphql/TeamsFragment.js new file mode 100644 index 000000000..e75ce8382 --- /dev/null +++ b/api/src/graphql/TeamsFragment.js @@ -0,0 +1,29 @@ +const gql = require('graphql-tag') + +const TEAMS_FRAGMENT = gql`{ + id + name + slug + owner + status { + status + reason + createdAt + } + createdAt + profile { + avatar + description + motto + updatedAt + } + members { + role + member { + alias + authId + } + } +}` + +module.exports = TEAMS_FRAGMENT diff --git a/api/src/index.js b/api/src/index.js index 9782f24b9..0386ba61b 100644 --- a/api/src/index.js +++ b/api/src/index.js @@ -13,6 +13,8 @@ const { getMember } = require('./auth/middleware/getMember') const { validateIdToken } = require('./auth/validateIdToken') const { directiveResolvers } = require('./auth/authDirectives') +const TEAMS_FRAGMENT = require('./graphql/TeamsFragment') + const createMember = async function (ctx, info, idToken) { console.log('createMember', idToken) const member = await ctx.db.mutation.upsertMember({ @@ -84,32 +86,7 @@ const resolvers = { }, async teamsByOwner(parent, { ownerId }, ctx, info) { console.log('teamsByOwner: ', ctx.user) - return ctx.db.query.teams({where: { owner: ownerId }}, - `{ - id - name - slug - owner - status { - status - reason - createdAt - } - createdAt - profile { - avatar - description - motto - updatedAt - } - members { - role - member { - alias - authId - } - } - }`) + return ctx.db.query.teams({where: { owner: ownerId }}, TEAMS_FRAGMENT) }, async owner(parent, args, ctx, info) { console.log('resolver.query.owner ctx: ', ctxMember(ctx)) @@ -145,13 +122,7 @@ const resolvers = { return member }, async createTeam(parent, { name, slug, owner }, ctx, info) { - return ctx.db.mutation.createTeam({ - data: { - name: name, - slug: slug, - owner: owner - } - }, info) + return ctx.db.mutation.createTeam({ data: { name: name, slug: slug, owner: owner, members: { create: { member:{ connect:{ authId: owner} }, role: 'OWNER' } } } }, TEAMS_FRAGMENT) .catch((err) => { console.log('createTeam error: ', err) return err diff --git a/client/src/App.js b/client/src/App.js index adf708aa3..e2f28ac3c 100644 --- a/client/src/App.js +++ b/client/src/App.js @@ -21,6 +21,7 @@ import { Callback, Home, Dashboard, + Teams, theme, globalStyles } from './views' @@ -148,6 +149,7 @@ class App extends Component { + { +export const checkGraphQLError = error => { console.log('checkGraphQLError ', ErrorResponse) if (error.search(/unique constraint/)) { const field = error.substring(error.indexOf('=') + 1) diff --git a/client/src/views/dashboard/components/CreateTeam.js b/client/src/views/dashboard/components/CreateTeam.js index c4d884672..90cac23f7 100644 --- a/client/src/views/dashboard/components/CreateTeam.js +++ b/client/src/views/dashboard/components/CreateTeam.js @@ -26,14 +26,16 @@ const CreateTeam = () => { let errors let loader if (loading) { - loader = (Submitting team...) + loader = Submitting team... } if (error) { errors = error.graphQLErrors.map(({ message }, i) => { const displayMessage = checkGraphQLError(message) console.log('createTeam error:', displayMessage) return ( - {message} + + {message} + ) }) } diff --git a/client/src/views/dashboard/components/DashTeam.js b/client/src/views/dashboard/components/DashTeam.js index 8be96d370..d8b2df1ce 100644 --- a/client/src/views/dashboard/components/DashTeam.js +++ b/client/src/views/dashboard/components/DashTeam.js @@ -23,7 +23,7 @@ export const DashTeam = ({ classes, user = null }) => { owner = JSON.parse(user) if (isDefined(owner.authId)) authId = owner.authId } else { - loader = (Loading...) + loader = Loading... } console.log('DashTeam 2: ', owner, authId) @@ -51,7 +51,9 @@ export const DashTeam = ({ classes, user = null }) => { if (error) { errors = error.graphQLErrors.map(({ message }, i) => { return ( - {message} + + {message} + ) }) } @@ -59,9 +61,10 @@ export const DashTeam = ({ classes, user = null }) => { if (data.teamsByOwner.length > 0) { return ( - {!loading && data.teamsByOwner.map(team => ( - - ))} + {!loading && + data.teamsByOwner.map(team => ( + + ))} {queryLoader} {errors} {loader} @@ -98,11 +101,9 @@ const getUserOnMount = lifecycle({ } }) -const mapStateToProps = withStateHandlers( - () => ({ user: null }), { - user: ({ user }) => () => ({ user }) - } -) +const mapStateToProps = withStateHandlers(() => ({ user: null }), { + user: ({ user }) => () => ({ user }) +}) const DashTeamAuthId = compose( mapStateToProps, diff --git a/client/src/views/dashboard/components/DashTeamItem.js b/client/src/views/dashboard/components/DashTeamItem.js index cdf585c8f..1de33a7a4 100644 --- a/client/src/views/dashboard/components/DashTeamItem.js +++ b/client/src/views/dashboard/components/DashTeamItem.js @@ -34,7 +34,7 @@ const styles = theme => ({ } }) -export const DashTeamItem = ({ classes }) => ( +export const DashTeamItem = ({ classes, team }) => (
@@ -44,9 +44,9 @@ export const DashTeamItem = ({ classes }) => ( title='Image title' /> - Goodester + {team.name} - 09.15.2018 + {team.createdAt} Members:6 @@ -66,7 +66,8 @@ export const DashTeamItem = ({ classes }) => ( ) DashTeamItem.propTypes = { - classes: PropTypes.object.isRequired + classes: PropTypes.object.isRequired, + team: PropTypes.object.isRequired } export default withStyles(styles)(DashTeamItem) diff --git a/client/src/views/teams/components/TeamsItem.js b/client/src/views/teams/components/TeamsItem.js new file mode 100644 index 000000000..16d833c32 --- /dev/null +++ b/client/src/views/teams/components/TeamsItem.js @@ -0,0 +1,111 @@ +import React from 'react' +import PropTypes from 'prop-types' + +import Typography from '@material-ui/core/Typography' +import { withStyles } from '@material-ui/core/styles' + +import Grid from '@material-ui/core/Grid' +import Paper from '@material-ui/core/Paper' +import Button from '@material-ui/core/Button' +import ButtonBase from '@material-ui/core/ButtonBase' + +const styles = theme => ({ + layout: { + width: 'auto', + marginLeft: theme.spacing.unit * 2, + marginRight: theme.spacing.unit * 2, + [theme.breakpoints.up(600 + theme.spacing.unit * 2 * 2)]: { + width: 600, + marginLeft: 'auto', + marginRight: 'auto' + } + }, + paper: { + marginTop: theme.spacing.unit * 0.1, + marginBottom: theme.spacing.unit * 0.1, + padding: theme.spacing.unit * 2, + [theme.breakpoints.up(600 + theme.spacing.unit * 3 * 2)]: { + marginTop: theme.spacing.unit * 1, + marginBottom: theme.spacing.unit * 1, + padding: theme.spacing.unit * 3 + } + }, + card: { + display: 'block', + width: '100%' + }, + cardDetails: { + display: 'flex', + flex: 1 + }, + cardContent: { + flex: 1 + }, + buttonRight: { + justifyContent: 'flex-end' + }, + image: { + width: 140, + height: 140 + }, + img: { + margin: 'auto', + display: 'block', + maxWidth: '100%', + maxHeight: '100%' + } +}) + +export const TeamsItem = ({ classes, team }) => ( + +
+ + + + + complex + + + + + + {team.name} + + {team.createdAt} + + + Members: 1 + + + + + Now recruiting! + + + + + + + + + +
+
+) + +TeamsItem.propTypes = { + classes: PropTypes.object.isRequired, + team: PropTypes.object.isRequired +} + +export default withStyles(styles)(TeamsItem) diff --git a/client/src/views/teams/components/TeamsList.js b/client/src/views/teams/components/TeamsList.js new file mode 100644 index 000000000..c156b244b --- /dev/null +++ b/client/src/views/teams/components/TeamsList.js @@ -0,0 +1,61 @@ +import React from 'react' +import PropTypes from 'prop-types' +import { Query } from 'react-apollo' + +import Typography from '@material-ui/core/Typography' +import Grid from '@material-ui/core/Grid' + +import GET_ALL_TEAMS_QUERY from '../../../graphql/teams/GetAllTeamsQuery' + +import TeamsItem from './TeamsItem' + +export const TeamsList = ({ classes }) => ( + + + {({ loading, error, data }) => { + console.log('GET_TEAMS_BY_OWNER: ', loading, error, data) + let errors + let queryLoader + if (error) { + errors = error.graphQLErrors.map(({ message }, i) => { + return ( + + {message} + + ) + }) + } + if (!loading && !error) { + if (data.teams.edges.length > 0) { + return ( + + {!loading && + data.teams.edges.map(team => ( + + ))} + {queryLoader} + {errors} + + ) + } + } else { + return ( + + + Loading... + + {queryLoader} + {errors} + + ) + } + }} + + +) + +TeamsList.propTypes = { + classes: PropTypes.object.isRequired +} + +export default TeamsList diff --git a/client/src/views/teams/index.js b/client/src/views/teams/index.js index 69dbd99aa..96fd0e5c8 100644 --- a/client/src/views/teams/index.js +++ b/client/src/views/teams/index.js @@ -3,8 +3,11 @@ import PropTypes from 'prop-types' import CssBaseline from '@material-ui/core/CssBaseline' import Typography from '@material-ui/core/Typography' +import Grid from '@material-ui/core/Grid' import { withStyles } from '@material-ui/core/styles' +import TeamsList from './components/TeamsList' + const styles = theme => ({ '@global': { body: { @@ -28,7 +31,7 @@ const styles = theme => ({ } }) -const Home = ({ classes }) => ( +const Teams = ({ classes }) => (
@@ -41,13 +44,16 @@ const Home = ({ classes }) => ( > Teams + + +
) -Home.propTypes = { +Teams.propTypes = { classes: PropTypes.object.isRequired } -export default withStyles(styles)(Home) +export default withStyles(styles)(Teams)