diff --git a/.gitignore b/.gitignore
index 447d9cf..f0d4e07 100644
--- a/.gitignore
+++ b/.gitignore
@@ -26,3 +26,4 @@ yarn-error.log*
*dev.log
*prod.log
+packages/scrum-server/dist/*
\ No newline at end of file
diff --git a/packages/scrum-client/src/components/TeamList/TeamList.js b/packages/scrum-client/src/components/TeamList/TeamList.js
index d8712e6..d6400be 100644
--- a/packages/scrum-client/src/components/TeamList/TeamList.js
+++ b/packages/scrum-client/src/components/TeamList/TeamList.js
@@ -1,8 +1,49 @@
import React from 'react';
import { Badge, Row, Col, Figure } from 'react-bootstrap';
+import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, LabelList, Label } from 'recharts';
import PropTypes from 'prop-types';
import './TeamList.css';
+const data = [
+ {
+ name: 'S',
+ numberOfVotes: 2,
+ voters: 'Carlos, Pedro, Luis',
+ },
+ {
+ name: 'M',
+ numberOfVotes: 5,
+ voters: 'Carlos, Miguel',
+ },
+ {
+ name: 'L',
+ numberOfVotes: 3,
+ voters: 'Jose, Juan',
+ },
+ {
+ name: 'XL',
+ numberOfVotes: 1,
+ voters: 'El chavito seguia bailando',
+ },
+ {
+ name: 'XS',
+ numberOfVotes: 2,
+ voters: 'A, B, C',
+ },
+];
+// const CustomTooltip = ({ active, payload, label }) => {
+// if (active && payload && payload.length) {
+// return (
+//
+//
{`${label} : ${payload[0].value}`}
+//
+//
+// );
+// }
+
+// return null;
+// };
+
const getUserVote = (storyVotes, user) => {
// eslint-disable-next-line
const storyVote = storyVotes.find(([id]) => id === user._id);
@@ -28,7 +69,35 @@ const TeamList = props => {
-
+
+
+
+
+
+
+
+
+
+
+ {' '}
+
+
+
+
+
+
+ Fastest responder: Luis
+
+
+ Most accurate responder so far: Luis
+
+
+
Average [{summaryVotes.avgVote}]
diff --git a/packages/scrum-client/src/content/ParticipateSession/ParticipateSession.js b/packages/scrum-client/src/content/ParticipateSession/ParticipateSession.js
index 572aebe..2559659 100644
--- a/packages/scrum-client/src/content/ParticipateSession/ParticipateSession.js
+++ b/packages/scrum-client/src/content/ParticipateSession/ParticipateSession.js
@@ -62,11 +62,7 @@ export default function ParticipateSession() {
useEffect(() => {
if (!!sessionInformation && sessionInformation.cardDeck !== undefined) {
const cardDeck = DECKS.byLabels(sessionInformation.cardDeck);
- if (JSON.stringify(storyVotes) !== '{}') {
- setSummaryVotes(cardDeck.getSummaryVote(storyVotes));
- } else {
- console.log('storyVotes', storyVotes);
- }
+ setSummaryVotes(cardDeck.getSummaryVote(storyVotes));
}
}, [sessionInformation, storyVotes]);
diff --git a/packages/scrum-client/src/content/VotingCards/VotingCards.js b/packages/scrum-client/src/content/VotingCards/VotingCards.js
index 708f674..f8ffbb5 100644
--- a/packages/scrum-client/src/content/VotingCards/VotingCards.js
+++ b/packages/scrum-client/src/content/VotingCards/VotingCards.js
@@ -33,7 +33,6 @@ export default function VotingCards() {
const { roomId } = useParams();
const [cardDeck, setCardDeck] = useState([]);
const [sessionInformation, setSessionInformation] = useState({});
- // TODO remove next line and keep this
const { story, socketEvents } = useSocket(roomId);
const userDetails = useAuthState();
diff --git a/packages/scrum-client/src/hooks/ClientSocketEvents.js b/packages/scrum-client/src/hooks/ClientSocketEvents.js
index 194cede..70ba398 100644
--- a/packages/scrum-client/src/hooks/ClientSocketEvents.js
+++ b/packages/scrum-client/src/hooks/ClientSocketEvents.js
@@ -8,8 +8,17 @@ import { API_CONSTANTS } from '../constants';
* @param {string} uri The uri of the IO server, default value is ${API_BASE_URL}
*/
const ClientSocketEvents = (ioUri = API_CONSTANTS.API_BASE_URL) => {
+ console.log('client--connectionSocket: ');
const socket = io(ioUri);
- console.log('client--connectionSocket: ', ioUri);
+
+ const connectSocket = () => {
+ console.log('client--connectSocket', socket.id);
+ };
+
+ const disconnectSocket = () => {
+ console.log('client--disconnectSocket', socket.id);
+ if (socket) socket.disconnect();
+ };
/**
* Joins a user to a room.
* @param {Object} data The data sent to the event.
@@ -19,10 +28,7 @@ const ClientSocketEvents = (ioUri = API_CONSTANTS.API_BASE_URL) => {
const joinToRoom = data => {
socket.emit(EVENT.JOIN, data);
};
- const disconnectSocket = () => {
- console.log('client--disconnectSocket');
- if (socket) socket.disconnect();
- };
+
const onRoomMessages = cb => {
console.log('onRoomMessages');
socket.on(EVENT.SEND_MESSAGE, data => {
@@ -41,8 +47,6 @@ const ClientSocketEvents = (ioUri = API_CONSTANTS.API_BASE_URL) => {
const onStoryVotesUpdate = cb => {
console.log('onStoryVotesUpdate');
socket.on(EVENT.STORY_VOTES_UPDATE, data => {
- console.log('data', data);
- console.log('data.storyVote', data.storyVotes);
return cb(data.storyVotes);
});
};
@@ -62,9 +66,10 @@ const ClientSocketEvents = (ioUri = API_CONSTANTS.API_BASE_URL) => {
return {
socket,
+ connectSocket,
+ disconnectSocket,
onUserJoined,
joinToRoom,
- disconnectSocket,
onRoomMessages,
sendMessageToRoom,
onStoryUpdate,
diff --git a/packages/scrum-client/src/hooks/useSocket.js b/packages/scrum-client/src/hooks/useSocket.js
index 3592e03..a489807 100644
--- a/packages/scrum-client/src/hooks/useSocket.js
+++ b/packages/scrum-client/src/hooks/useSocket.js
@@ -12,10 +12,12 @@ const useSocket = (roomId, socketServerURL = API_CONSTANTS.API_BASE_URL) => {
const userDetails = useAuthState();
useEffect(() => {
+ // eslint-disable-next-line
+ console.log('WARNING!!! creating new connection?. ');
const socketEventsRef = ClientSocketEvents();
const {
- joinToRoom,
disconnectSocket,
+ joinToRoom,
onRoomMessages,
onUserJoined,
onStoryUpdate,
@@ -31,6 +33,8 @@ const useSocket = (roomId, socketServerURL = API_CONSTANTS.API_BASE_URL) => {
setSocketEvents(socketEventsRef);
return () => {
+ // eslint-disable-next-line
+ console.log('WARNING!!! executing disconnection. ');
disconnectSocket();
};
}, [roomId, socketServerURL, userDetails.user, story, storyVotes]);
diff --git a/packages/scrum-server/doc/ClientAdmin.png b/packages/scrum-server/doc/ClientAdmin.png
new file mode 100644
index 0000000..9408072
Binary files /dev/null and b/packages/scrum-server/doc/ClientAdmin.png differ
diff --git a/packages/scrum-server/doc/ClientAdmin.vsdx b/packages/scrum-server/doc/ClientAdmin.vsdx
new file mode 100644
index 0000000..cfa8962
Binary files /dev/null and b/packages/scrum-server/doc/ClientAdmin.vsdx differ
diff --git a/packages/scrum-server/locales/en.json b/packages/scrum-server/locales/en.json
index 0a88f8a..e5c53a0 100644
--- a/packages/scrum-server/locales/en.json
+++ b/packages/scrum-server/locales/en.json
@@ -1,4 +1,5 @@
{
+ "TODO": "MOVE this file into src?",
"lblWelcome": "Welcome!",
"apiWorking": "API is working properly",
"apiPasswordDoNotMatch": "password do not match",
diff --git a/packages/scrum-server/src/app.js b/packages/scrum-server/src/app.js
index e03abbe..bec7404 100644
--- a/packages/scrum-server/src/app.js
+++ b/packages/scrum-server/src/app.js
@@ -35,7 +35,7 @@ i18n.configure({
});
-const CLIENT_PATH = '/../scrum-client/build/';
+const CLIENT_PATH = '/../../scrum-client/build/';
app.use(cors(corsOptions));
app.use(i18n.init);
app.use(httpLogger(keys.httpLogging.httpLogFormat, { skip: (req, res) => keys.httpLogging.httpLoggingEnabled === 'false' }));
diff --git a/packages/scrum-server/src/locales/en.json b/packages/scrum-server/src/locales/en.json
index 9e26dfe..8ed6a5c 100644
--- a/packages/scrum-server/src/locales/en.json
+++ b/packages/scrum-server/src/locales/en.json
@@ -1 +1,18 @@
-{}
\ No newline at end of file
+{
+ "lblWelcome": "Welcome!",
+ "apiWorking": "API is working properly",
+ "apiPasswordDoNotMatch": "password do not match",
+ "apiEmailExist": "email exits",
+ "apiEmailNotFound": "Auth failed ,email not found",
+ "apiUserAlreadyLoggedIn": "You are already logged in",
+ "apiFillTheFields": "Please fill in all fields",
+ "apiPasswordMinLength": "Password must be at least 6 characters",
+ "apiEmailAlreadyRegistered": "Email already ",
+ "apiSuccessRegister": "You have now ",
+ "apiNowLoggedOut": "Now logged out",
+ "serviceSaveError": "Error while saving",
+ "serviceFindError": "Object not found",
+ "serviceInvalidId": "Invalid id",
+ "apiPlanningSessionInvalidId": "Invalid session id",
+ "apiPlanningSessionNotFound": "Planning session not found."
+}
\ No newline at end of file
diff --git a/packages/scrum-server/src/services/socket/ServerSocketService.js b/packages/scrum-server/src/services/socket/ServerSocketService.js
index a6b590a..2270b2f 100644
--- a/packages/scrum-server/src/services/socket/ServerSocketService.js
+++ b/packages/scrum-server/src/services/socket/ServerSocketService.js
@@ -1,6 +1,5 @@
/* eslint-disable */
// TODO fix eslint
-// TODO Is this really used?
const socketIo = require('socket.io');
const { EVENT } = require('scrum-common');
const {Logger} = require('../../utils/Logger');
@@ -14,14 +13,14 @@ class ServerSocketService {
const socketEventIO = ServerSocketEvents(this.io);
this.io.on(EVENT.CONNECTION, socket => {
- this.logger.info('socket connected');
+ this.logger.info(`socket connected [${socket.id}]`);
const socketEvent = socketEventIO(socket);
socket.on(EVENT.JOIN, socketEvent.onJoinUserToRoom);
socket.on(EVENT.SEND_MESSAGE, socketEvent.onSendMessageToRoom);
socket.on(EVENT.STORY_UPDATE, socketEvent.onStoryUpdate);
socket.on(EVENT.STORY_VOTES_UPDATE, socketEvent.onStoryVotesUpdate);
socket.on(EVENT.DISCONNECT, () => {
- this.logger.info("socket disconnected");
+ this.logger.info(`socket disconnected [${socket.id}]`);
});
});
}
diff --git a/packages/scrum-server/src/services/socket/ServerSocketState.js b/packages/scrum-server/src/services/socket/ServerSocketState.js
index 12f9186..5ae562f 100644
--- a/packages/scrum-server/src/services/socket/ServerSocketState.js
+++ b/packages/scrum-server/src/services/socket/ServerSocketState.js
@@ -11,12 +11,12 @@ const buildRoom = ({ id, users = new Map(), storyVotes = new Map(), story = '' }
const ServerSocketState = (initialState = []) => {
const logger = Logger(__filename);
const rooms = new Map(...initialState);
- logger.info(`Initializing rooms`);
+ logger.info(`Initializing rooms ${JSON.stringify(rooms)}`);
const addRoomIfDoesNotExists = (room) => {
if (!rooms.has(room.id)) {
rooms.set(room.id, buildRoom(room.id));
- logger.debug(`addRoom building room {${room.id}}`);
+ logger.debug(`addRoom building room {${room.id}} resulting in ${JSON.stringify(rooms)}`);
}
return rooms.get(room.id);
};
@@ -27,6 +27,7 @@ const ServerSocketState = (initialState = []) => {
if (!_room.users.has(userId)) {
logger.debug(`assignUserToRoom adding user {${userId}} to the room {${room.id}}`);
_room.users.set(userId, user);
+ logger.silly(`assignUserToRoom adding user {${userId}} to the room {${room.id}} resulting in ${JSON.stringify(_room.users)}`);
}
return rooms.get(room.id);
};
@@ -34,7 +35,9 @@ const ServerSocketState = (initialState = []) => {
const setRoomStory = (room, story) => {
logger.debug(`setRoomStory on ${room.id} with ${story.storyTitle}`);
const _room = rooms.get(room.id);
- _room.story = story;
+ if (_room !== undefined) {
+ _room.story = story;
+ }
return _room;
};
@@ -43,6 +46,7 @@ const ServerSocketState = (initialState = []) => {
logger.debug(`setRoomStoryVote on room {${room.id}} for user {${userId}} with value {${vote}}`);
const _room = rooms.get(room.id);
_room.storyVotes.set(userId, vote);
+ logger.silly(`setRoomStoryVote on room {${room.id}} for user {${userId}} has {${JSON.stringify(_room.storyVotes)}}`);
return _room.storyVotes;
};
const getRoom = room => {
diff --git a/packages/scrum-server/template.env b/packages/scrum-server/template.env
index c5625d0..3fc0623 100644
--- a/packages/scrum-server/template.env
+++ b/packages/scrum-server/template.env
@@ -5,4 +5,7 @@ DB_NAME=
SESSION_SECRET=
PORT=
CORS_WHITELIST_URL=
-DEBUG_LEVEL=info
\ No newline at end of file
+LOG_LEVEL=(silly|debug|info|warn|error)
+LOG_DATEFORMAT='MMM-DD-YYYY HH:mm:ss'
+HTTP_LOG_FORMAT=(tiny|)
+HTTP_LOG_ENABLED=(true|false)
\ No newline at end of file
diff --git a/packages/scrum-server/tests/babelTranspileTest.js b/packages/scrum-server/tests/babelTranspileTest.js
new file mode 100644
index 0000000..412364a
--- /dev/null
+++ b/packages/scrum-server/tests/babelTranspileTest.js
@@ -0,0 +1,44 @@
+const assert = require('assert');
+
+describe('Map', () => {
+ describe('set', () => {
+ it('should add an element to the map', done => {
+ const k1 = { id: 1 };
+ const k2 = { id: 2 };
+ const storyVotes = new Map();
+ console.log(storyVotes);
+ storyVotes.set(k1.id, k1);
+ console.log(storyVotes);
+ const foundK1 = storyVotes.get(k1.id);
+ storyVotes.should.have.key(k1.id);
+ storyVotes.should.not.have.key(k2.id);
+ assert.equal(k1, foundK1);
+ done();
+ });
+ });
+});
+
+describe('Array', () => {
+ describe('find', () => {
+ it('should return an element to the array', done => {
+ const storyVotes = [5, 12, 8, 130, 44];
+ const idToFind = 8;
+ const found = storyVotes.find(id => id === idToFind);
+ // console.log(found);
+ assert.equal(found, idToFind);
+ done();
+ });
+ });
+});
+
+const inventory = [
+ { name: 'apples', quantity: 2 },
+ { name: 'cherries', quantity: 8 },
+ { name: 'bananas', quantity: 0 },
+ { name: 'cherries', quantity: 5 },
+ { name: 'cherries', quantity: 15 },
+];
+
+const result = inventory.find(({ name }) => name === 'cherries');
+
+console.log(result); // { name: 'cherries', quantity: 5 }