From 41a4a3f00d5aa65f075d94bce9a08583eed401b2 Mon Sep 17 00:00:00 2001 From: ivan Date: Wed, 24 Aug 2016 20:00:41 -0300 Subject: [PATCH 1/5] Ivan - Frontend - Dashboard Ticket viewer base [skip ci] --- .../dashboard-ticket/dashboard-ticket-page.js | 22 ++++- .../dashboard-ticket-page.scss | 3 + .../dashboard-ticket/ticket-viewer.js | 86 ++++++++++++++++ .../dashboard-ticket/ticket-viewer.scss | 97 +++++++++++++++++++ 4 files changed, 205 insertions(+), 3 deletions(-) create mode 100644 client/src/app/main/dashboard/dashboard-ticket/dashboard-ticket-page.scss create mode 100644 client/src/app/main/dashboard/dashboard-ticket/ticket-viewer.js create mode 100644 client/src/app/main/dashboard/dashboard-ticket/ticket-viewer.scss diff --git a/client/src/app/main/dashboard/dashboard-ticket/dashboard-ticket-page.js b/client/src/app/main/dashboard/dashboard-ticket/dashboard-ticket-page.js index 1235aeb9..fb322cc1 100644 --- a/client/src/app/main/dashboard/dashboard-ticket/dashboard-ticket-page.js +++ b/client/src/app/main/dashboard/dashboard-ticket/dashboard-ticket-page.js @@ -1,14 +1,30 @@ import React from 'react'; +import _ from 'lodash'; +import {connect} from 'react-redux'; + +import TicketViewer from 'app/main/dashboard/dashboard-ticket/ticket-viewer'; class DashboardTicketPage extends React.Component { + static propTypes = { + tickets: React.PropTypes.array + }; + render() { return ( -
- DASHBOARD TICKET PAGE +
+
); } + + getTicketData() { + return _.find(this.props.tickets, {ticketNumber: this.props.params.ticketNumber}); + } } -export default DashboardTicketPage; +export default connect((store) => { + return { + tickets: store.session.userTickets + }; +})(DashboardTicketPage); \ No newline at end of file diff --git a/client/src/app/main/dashboard/dashboard-ticket/dashboard-ticket-page.scss b/client/src/app/main/dashboard/dashboard-ticket/dashboard-ticket-page.scss new file mode 100644 index 00000000..4caad9b2 --- /dev/null +++ b/client/src/app/main/dashboard/dashboard-ticket/dashboard-ticket-page.scss @@ -0,0 +1,3 @@ +.dashboard-ticket-page { + padding: 0 10px; +} \ No newline at end of file diff --git a/client/src/app/main/dashboard/dashboard-ticket/ticket-viewer.js b/client/src/app/main/dashboard/dashboard-ticket/ticket-viewer.js new file mode 100644 index 00000000..dda362e2 --- /dev/null +++ b/client/src/app/main/dashboard/dashboard-ticket/ticket-viewer.js @@ -0,0 +1,86 @@ +import React from 'react'; +import Icon from 'core-components/icon'; + +class TicketViewer extends React.Component { + static propTypes = { + ticket: React.PropTypes.object + }; + + static defaultProps = { + ticket: { + author: {}, + department: {}, + comments: [] + } + }; + + render() { + return ( +
+
+ #{this.props.ticket.ticketNumber} + {this.props.ticket.title} +
+
+
Department
+
Author
+
Date
+
+
+
{this.props.ticket.department.name}
+
{this.props.ticket.author.name}
+
{this.props.ticket.date}
+
+
{this.props.ticket.content}
+ {this.renderFileRow(this.props.ticket.file)} +
+
Responses
+ {this.props.ticket.comments.map(this.renderComment.bind(this))} +
+
+
Respond
+
Response field
+
+
+ ); + } + + renderComment(comment, index) { + return ( +
+
+
{comment.author.name}
+
{comment.date}
+
+
{comment.content}
+ {this.renderFileRow(comment.file)} +
+ ); + } + + renderFileRow(file) { + let node = null; + + if (file) { + node = {this.getFileLink(this.props.ticket.file)} ; + } else { + node = 'No file attachment'; + } + + return ( +
+ {node} +
+ ) + } + + getFileLink(filePath = '') { + const fileName = filePath.replace(/^.*[\\\/]/, ''); + + return ( + {fileName} + ) + } +} + +export default TicketViewer; \ No newline at end of file diff --git a/client/src/app/main/dashboard/dashboard-ticket/ticket-viewer.scss b/client/src/app/main/dashboard/dashboard-ticket/ticket-viewer.scss new file mode 100644 index 00000000..49f05f06 --- /dev/null +++ b/client/src/app/main/dashboard/dashboard-ticket/ticket-viewer.scss @@ -0,0 +1,97 @@ +@import "../../../../scss/vars"; + +.ticket-viewer { + &__header { + background-color: $primary-blue; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + color: white; + font-size: 16px; + padding: 6px 0; + } + + &__number { + color: white; + margin-right: 10px; + font-size: 14px; + } + + &__title { + display: inline-block; + } + + &__info-row-header { + background-color: $light-grey; + font-weight: bold; + } + + &__info-row-values { + background-color: $light-grey; + color: $secondary-blue; + } + + &__date { + + } + + &__author { + + } + + &__department { + + } + + &__content { + background-color: white; + border: 2px solid $light-grey; + padding: 20px 10px; + text-align: left; + margin-top: 10px; + } + + &__file { + background-color: $light-grey; + text-align: right; + padding: 5px 10px; + font-size: 12px; + } + + &__comments { + margin-top: 10px; + } + + &__comments-title { + text-align: left; + background-color: $dark-grey; + color: white; + padding: 5px; + } + + &__comment { + margin-top: 5px; + + &-author { + text-align: left; + float: left; + padding: 10px; + } + + &-date { + text-align: right; + border: 2px solid $light-grey; + border-bottom: none; + padding: 10px; + background-color: $light-grey; + + } + + &-content { + background-color: white; + border: 2px solid $light-grey; + border-top: none; + padding: 20px 10px; + text-align: left; + } + } +} \ No newline at end of file From e09f0298189f1828002d7755255fed8437b9f9b0 Mon Sep 17 00:00:00 2001 From: ivan Date: Wed, 24 Aug 2016 20:36:29 -0300 Subject: [PATCH 2/5] Ivan - Frontend - Add comments icon [skip ci] --- .../dashboard-ticket/ticket-viewer.js | 31 +++++++++++++---- .../dashboard-ticket/ticket-viewer.scss | 34 +++++++++++++------ client/src/index.html | 2 +- 3 files changed, 49 insertions(+), 18 deletions(-) diff --git a/client/src/app/main/dashboard/dashboard-ticket/ticket-viewer.js b/client/src/app/main/dashboard/dashboard-ticket/ticket-viewer.js index dda362e2..106a9c8a 100644 --- a/client/src/app/main/dashboard/dashboard-ticket/ticket-viewer.js +++ b/client/src/app/main/dashboard/dashboard-ticket/ticket-viewer.js @@ -1,4 +1,6 @@ import React from 'react'; +import classNames from 'classnames'; + import Icon from 'core-components/icon'; class TicketViewer extends React.Component { @@ -31,10 +33,10 @@ class TicketViewer extends React.Component {
{this.props.ticket.author.name}
{this.props.ticket.date}
-
{this.props.ticket.content}
- {this.renderFileRow(this.props.ticket.file)} +
+ {this.renderComment(this.props.ticket)} +
-
Responses
{this.props.ticket.comments.map(this.renderComment.bind(this))}
@@ -45,11 +47,19 @@ class TicketViewer extends React.Component { ); } - renderComment(comment, index) { + renderComment(comment) { return ( -
+
-
{comment.author.name}
+
+
+ + + + + {comment.author.name} + +
{comment.date}
{comment.content}
@@ -73,6 +83,15 @@ class TicketViewer extends React.Component {
) } + + getCommentClass(comment) { + let classes = { + 'ticket-viewer__comment': true, + 'ticket-viewer__comment_staff': comment.author.staff + }; + + return classNames(classes); + } getFileLink(filePath = '') { const fileName = filePath.replace(/^.*[\\\/]/, ''); diff --git a/client/src/app/main/dashboard/dashboard-ticket/ticket-viewer.scss b/client/src/app/main/dashboard/dashboard-ticket/ticket-viewer.scss index 49f05f06..92c3aea9 100644 --- a/client/src/app/main/dashboard/dashboard-ticket/ticket-viewer.scss +++ b/client/src/app/main/dashboard/dashboard-ticket/ticket-viewer.scss @@ -43,10 +43,6 @@ } &__content { - background-color: white; - border: 2px solid $light-grey; - padding: 20px 10px; - text-align: left; margin-top: 10px; } @@ -57,10 +53,6 @@ font-size: 12px; } - &__comments { - margin-top: 10px; - } - &__comments-title { text-align: left; background-color: $dark-grey; @@ -69,19 +61,35 @@ } &__comment { - margin-top: 5px; + margin-top: 20px; &-author { text-align: left; float: left; - padding: 10px; + position: relative; + padding-top: 22px; + padding-left: 70px; + + &-icon { + background-color: $secondary-blue; + color: white; + border-radius: 100%; + display: inline-block; + width: 42px; + height: 42px; + padding-left: 8px; + padding-top: 4px; + position: absolute; + top: 10px; + left: 10px; + } } &-date { text-align: right; border: 2px solid $light-grey; border-bottom: none; - padding: 10px; + padding: 22px; background-color: $light-grey; } @@ -93,5 +101,9 @@ padding: 20px 10px; text-align: left; } + + &_staff { + + } } } \ No newline at end of file diff --git a/client/src/index.html b/client/src/index.html index 6aff3455..d6e6adbb 100644 --- a/client/src/index.html +++ b/client/src/index.html @@ -6,7 +6,7 @@ - App Name + OS4 From 3a9d009fff8bddcb5cc9b1653862473f84d817a9 Mon Sep 17 00:00:00 2001 From: ivan Date: Wed, 24 Aug 2016 23:32:30 -0300 Subject: [PATCH 3/5] Ivan - Frontend - Ticket Chat like style [skip ci] --- .../dashboard-ticket/ticket-viewer.js | 39 +++++++---- .../dashboard-ticket/ticket-viewer.scss | 67 ++++++++++++------- client/src/scss/_vars.scss | 1 + 3 files changed, 69 insertions(+), 38 deletions(-) diff --git a/client/src/app/main/dashboard/dashboard-ticket/ticket-viewer.js b/client/src/app/main/dashboard/dashboard-ticket/ticket-viewer.js index 106a9c8a..4cf447a2 100644 --- a/client/src/app/main/dashboard/dashboard-ticket/ticket-viewer.js +++ b/client/src/app/main/dashboard/dashboard-ticket/ticket-viewer.js @@ -48,22 +48,32 @@ class TicketViewer extends React.Component { } renderComment(comment) { - return ( -
-
-
+ const iconNode = ( +
+
+ +
+
+ ); + const commentNode = ( +
+
+
- - - {comment.author.name}
{comment.date}
+
{comment.content}
+ {this.renderFileRow(comment.file)}
-
{comment.content}
- {this.renderFileRow(comment.file)} +
+ ); + + return ( +
+ {comment.author.staff ? [commentNode, iconNode] : [iconNode, commentNode]}
); } @@ -78,16 +88,17 @@ class TicketViewer extends React.Component { } return ( -
+
{node}
) } - - getCommentClass(comment) { + + getActionClass(action) { let classes = { - 'ticket-viewer__comment': true, - 'ticket-viewer__comment_staff': comment.author.staff + 'row': true, + 'ticket-viewer__action': true, + 'ticket-viewer__action_staff': action.author.staff }; return classNames(classes); diff --git a/client/src/app/main/dashboard/dashboard-ticket/ticket-viewer.scss b/client/src/app/main/dashboard/dashboard-ticket/ticket-viewer.scss index 92c3aea9..c5cd478f 100644 --- a/client/src/app/main/dashboard/dashboard-ticket/ticket-viewer.scss +++ b/client/src/app/main/dashboard/dashboard-ticket/ticket-viewer.scss @@ -47,7 +47,7 @@ } &__file { - background-color: $light-grey; + background-color: $very-light-grey; text-align: right; padding: 5px 10px; font-size: 12px; @@ -60,50 +60,69 @@ padding: 5px; } - &__comment { + &__action { margin-top: 20px; + text-align: left; + + + &_staff { + .ticket-viewer__comment-action { + background-color: $primary-blue; + } + + .ticket-viewer__comment-pointer { + left: 100%; + border-right-color: transparent; + border-left-color: $light-grey; + } + } + } + + &__comment { + position: relative; + + &-action { + vertical-align: top; + background-color: $secondary-blue; + color: white; + border-radius: 5px; + width: 42px; + height: 42px; + padding-left: 8px; + padding-top: 4px; + } + + &-pointer { + right: 100%; + border: solid transparent; + position: absolute; + border-right-color: $light-grey; + border-width: 13px; + margin-top: 8px; + } &-author { text-align: left; float: left; position: relative; - padding-top: 22px; - padding-left: 70px; - - &-icon { - background-color: $secondary-blue; - color: white; - border-radius: 100%; - display: inline-block; - width: 42px; - height: 42px; - padding-left: 8px; - padding-top: 4px; - position: absolute; - top: 10px; - left: 10px; - } + padding: 12px; } &-date { text-align: right; border: 2px solid $light-grey; border-bottom: none; - padding: 22px; + padding: 12px; background-color: $light-grey; } &-content { background-color: white; - border: 2px solid $light-grey; + border: 2px solid $very-light-grey; border-top: none; padding: 20px 10px; text-align: left; } - - &_staff { - - } } } \ No newline at end of file diff --git a/client/src/scss/_vars.scss b/client/src/scss/_vars.scss index bf22c61c..5d3b1592 100644 --- a/client/src/scss/_vars.scss +++ b/client/src/scss/_vars.scss @@ -5,6 +5,7 @@ $secondary-red: #FB6362; $primary-blue: #414A59; $secondary-blue: #20B8c5; +$very-light-grey: #F7F7F7; $light-grey: #EEEEEE; $grey: #E7E7E7; $medium-grey: #D9D9D9; From d5514fe62e5cfe0e59c4c020f6866879bfb35c33 Mon Sep 17 00:00:00 2001 From: ivan Date: Tue, 30 Aug 2016 14:53:28 -0300 Subject: [PATCH 4/5] Ivan - Frontend - Create ticket viewer implementation with comments [skip ci] --- .../dashboard-ticket/ticket-action.js | 105 ++++++++++++++++++ .../dashboard-ticket/ticket-action.scss | 83 ++++++++++++++ .../dashboard-ticket/ticket-viewer.js | 87 +++------------ .../dashboard-ticket/ticket-viewer.scss | 73 ++---------- client/src/core-components/text-editor.scss | 1 + client/src/data/languages/en.js | 8 ++ 6 files changed, 227 insertions(+), 130 deletions(-) create mode 100644 client/src/app/main/dashboard/dashboard-ticket/ticket-action.js create mode 100644 client/src/app/main/dashboard/dashboard-ticket/ticket-action.scss diff --git a/client/src/app/main/dashboard/dashboard-ticket/ticket-action.js b/client/src/app/main/dashboard/dashboard-ticket/ticket-action.js new file mode 100644 index 00000000..345a3840 --- /dev/null +++ b/client/src/app/main/dashboard/dashboard-ticket/ticket-action.js @@ -0,0 +1,105 @@ +import React from 'react'; +import classNames from 'classnames'; + +import i18n from 'lib-app/i18n'; +import Icon from 'core-components/icon'; + +class TicketAction extends React.Component { + static propTypes = { + type: React.PropTypes.oneOf(['comment', 'assign']), + config: React.PropTypes.object + }; + + static defaultProps = { + type: 'comment' + }; + + render() { + return ( +
+ +
+
+ +
+
+
+ {this.renderActionDescription()} +
+
+ ); + } + + renderActionDescription() { + const renders = { + 'comment': this.renderComment.bind(this), + 'assign': this.renderAssignment.bind(this) + }; + + return renders[this.props.type](); + } + + renderComment() { + const {config} = this.props; + + return ( +
+ +
+ {config.author.name} + ({i18n((config.author.staff) ? 'STAFF' : 'CUSTOMER')}) +
+
{config.date}
+
{config.content}
+ {this.renderFileRow(config.file)} +
+ ); + } + + renderAssignment() { + // TODO: Add actions architecture instead of just comments + + return ( +
+
+ ) + } + + renderFileRow(file) { + let node = null; + + if (file) { + node = {this.getFileLink(file)} ; + } else { + node = i18n('NO_ATTACHMENT'); + } + + return ( +
+ {node} +
+ ) + } + + getClass() { + const {config} = this.props; + + let classes = { + 'row': true, + 'ticket-action': true, + 'ticket-action_staff': config.author && config.author.staff + }; + + return classNames(classes); + } + + getFileLink(filePath = '') { + const fileName = filePath.replace(/^.*[\\\/]/, ''); + + return ( + {fileName} + ) + } +} + +export default TicketAction; \ No newline at end of file diff --git a/client/src/app/main/dashboard/dashboard-ticket/ticket-action.scss b/client/src/app/main/dashboard/dashboard-ticket/ticket-action.scss new file mode 100644 index 00000000..4b39970b --- /dev/null +++ b/client/src/app/main/dashboard/dashboard-ticket/ticket-action.scss @@ -0,0 +1,83 @@ +@import "../../../../scss/vars"; + +.ticket-action { + margin-top: 20px; + text-align: left; + position: relative; + + &__connector { + position: absolute; + background-color: $light-grey; + width: 3px; + height: 100%; + top: 38px; + left: 33px; + z-index: 0; + } + + &__icon { + vertical-align: top; + background-color: $secondary-blue; + color: white; + border-radius: 5px; + width: 42px; + height: 42px; + padding-left: 8px; + padding-top: 4px; + } + + &__comment { + position: relative; + + &-pointer { + right: 100%; + border: solid transparent; + position: absolute; + border-right-color: $light-grey; + border-width: 13px; + margin-top: 8px; + } + + &-author { + text-align: left; + float: left; + position: relative; + padding: 12px; + color: $primary-black; + + &-type { + font-size: 10px; + padding-left: 10px; + color: $secondary-blue; + font-variant: small-caps; + } + } + + &-date { + text-align: right; + border: 2px solid $light-grey; + border-bottom: none; + padding: 12px; + background-color: $light-grey; + + } + + &-content { + background-color: white; + border: 2px solid $very-light-grey; + border-top: none; + padding: 20px 10px; + text-align: left; + } + } + + &_staff { + .ticket-action__icon { + background-color: $primary-blue; + } + + .ticket-action__comment-author-type { + color: $primary-blue; + } + } +} \ No newline at end of file diff --git a/client/src/app/main/dashboard/dashboard-ticket/ticket-viewer.js b/client/src/app/main/dashboard/dashboard-ticket/ticket-viewer.js index 4cf447a2..857cecd4 100644 --- a/client/src/app/main/dashboard/dashboard-ticket/ticket-viewer.js +++ b/client/src/app/main/dashboard/dashboard-ticket/ticket-viewer.js @@ -1,7 +1,10 @@ import React from 'react'; -import classNames from 'classnames'; -import Icon from 'core-components/icon'; +import i18n from 'lib-app/i18n'; +import TicketAction from 'app/main/dashboard/dashboard-ticket/ticket-action'; +import Form from 'core-components/form'; +import FormField from 'core-components/form-field'; +import SubmitButton from 'core-components/submit-button'; class TicketViewer extends React.Component { static propTypes = { @@ -24,9 +27,9 @@ class TicketViewer extends React.Component { {this.props.ticket.title}
-
Department
-
Author
-
Date
+
{i18n('DEPARTMENT')}
+
{i18n('AUTHOR')}
+
{i18n('DATE')}
{this.props.ticket.department.name}
@@ -34,83 +37,29 @@ class TicketViewer extends React.Component {
{this.props.ticket.date}
- {this.renderComment(this.props.ticket)} +
{this.props.ticket.comments.map(this.renderComment.bind(this))}
-
Respond
-
Response field
-
-
- ); - } - - renderComment(comment) { - const iconNode = ( -
-
- -
-
- ); - const commentNode = ( -
-
- -
- - {comment.author.name} - +
{i18n('RESPOND')}
+
+
+ + {i18n('RESPOND_TICKET')} +
-
{comment.date}
-
{comment.content}
- {this.renderFileRow(comment.file)}
); + } + renderComment(comment, index) { return ( -
- {comment.author.staff ? [commentNode, iconNode] : [iconNode, commentNode]} -
+ ); } - - renderFileRow(file) { - let node = null; - - if (file) { - node = {this.getFileLink(this.props.ticket.file)} ; - } else { - node = 'No file attachment'; - } - - return ( -
- {node} -
- ) - } - - getActionClass(action) { - let classes = { - 'row': true, - 'ticket-viewer__action': true, - 'ticket-viewer__action_staff': action.author.staff - }; - - return classNames(classes); - } - - getFileLink(filePath = '') { - const fileName = filePath.replace(/^.*[\\\/]/, ''); - - return ( - {fileName} - ) - } } export default TicketViewer; \ No newline at end of file diff --git a/client/src/app/main/dashboard/dashboard-ticket/ticket-viewer.scss b/client/src/app/main/dashboard/dashboard-ticket/ticket-viewer.scss index c5cd478f..f133235c 100644 --- a/client/src/app/main/dashboard/dashboard-ticket/ticket-viewer.scss +++ b/client/src/app/main/dashboard/dashboard-ticket/ticket-viewer.scss @@ -53,75 +53,26 @@ font-size: 12px; } - &__comments-title { - text-align: left; - background-color: $dark-grey; - color: white; - padding: 5px; + &__comments { + position: relative; } - &__action { + &__response { margin-top: 20px; - text-align: left; - - - &_staff { - .ticket-viewer__comment-action { - background-color: $primary-blue; - } - - .ticket-viewer__comment-pointer { - left: 100%; - border-right-color: transparent; - border-left-color: $light-grey; - } - } - } - - &__comment { position: relative; - &-action { - vertical-align: top; - background-color: $secondary-blue; - color: white; - border-radius: 5px; - width: 42px; - height: 42px; - padding-left: 8px; - padding-top: 4px; - } - - &-pointer { - right: 100%; - border: solid transparent; - position: absolute; - border-right-color: $light-grey; - border-width: 13px; - margin-top: 8px; - } - - &-author { + &-title { + background-color: $primary-blue; text-align: left; - float: left; - position: relative; - padding: 12px; + padding: 5px; + color: white; + border-top-right-radius: 4px; + border-top-left-radius: 4px; } - &-date { - text-align: right; - border: 2px solid $light-grey; - border-bottom: none; - padding: 12px; - background-color: $light-grey; - - } - - &-content { - background-color: white; - border: 2px solid $very-light-grey; - border-top: none; - padding: 20px 10px; + &-field { + background-color: $very-light-grey; + padding: 20px; text-align: left; } } diff --git a/client/src/core-components/text-editor.scss b/client/src/core-components/text-editor.scss index c1536d01..f54f43c2 100644 --- a/client/src/core-components/text-editor.scss +++ b/client/src/core-components/text-editor.scss @@ -3,6 +3,7 @@ .text-editor { &__editor { + background-color: white; border: 1px solid $grey; border-radius: 3px; padding: 8px; diff --git a/client/src/data/languages/en.js b/client/src/data/languages/en.js index 940b4baf..044c4529 100644 --- a/client/src/data/languages/en.js +++ b/client/src/data/languages/en.js @@ -16,6 +16,14 @@ export default { 'CREATE_TICKET_DESCRIPTION': 'This is a form for creating tickets. Fill the form and send us your issues/doubts/suggestions. Our support system will answer it as soon as possible.', 'TICKET_LIST': 'Ticket List', 'TICKET_LIST_DESCRIPTION': 'Here you can find a list of all tickets you have sent to our support team.', + 'DEPARTMENT': 'Department', + 'AUTHOR': 'Author', + 'DATE': 'Date', + 'RESPOND': 'Respond', + 'RESPOND_TICKET': 'Respond Ticket', + 'NO_ATTACHMENT': 'No file attachment', + 'STAFF': 'Staff', + 'CUSTOMER': 'Customer', //ERRORS 'EMAIL_NOT_EXIST': 'Email does not exist', From d186685673ff4014078cb822ef17415f2ff33c8d Mon Sep 17 00:00:00 2001 From: ivan Date: Tue, 30 Aug 2016 15:44:16 -0300 Subject: [PATCH 5/5] Ivan - Backend - Restore old version google-captcha --- client/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/package.json b/client/package.json index 97e5359d..2cf86903 100644 --- a/client/package.json +++ b/client/package.json @@ -65,7 +65,7 @@ "react": "^15.0.1", "react-document-title": "^1.0.2", "react-dom": "^15.0.1", - "react-google-recaptcha": "^0.5.4", + "react-google-recaptcha": "^0.5.2", "react-motion": "^0.3.0", "react-redux": "^4.4.5", "react-router": "^2.4.0",