+);
InviteUsersResults.propTypes = {
- results: PropTypes.object.isRequired
+ results: shape({
+ invite_results: arrayOf.isRequired,
+ team_name: string.isRequired
+ }).isRequired
};
export default InviteUsersResults;
-
diff --git a/app/javascript/src/components/InviteUsersModal/index.jsx b/app/javascript/src/components/InviteUsersModal/index.jsx
index b4ab3b8be..8d702cfa2 100644
--- a/app/javascript/src/components/InviteUsersModal/index.jsx
+++ b/app/javascript/src/components/InviteUsersModal/index.jsx
@@ -1,107 +1,115 @@
-import React, { Component } from 'react';
-import PropTypes from 'prop-types';
-import { FormattedMessage } from 'react-intl';
-import { Modal, ButtonToolbar, Button } from 'react-bootstrap';
-import styled from 'styled-components';
-import axios from '../../config/axios';
+import React, { Component } from "react";
+import { bool, func, shape, number, string } from "prop-types";
+import { FormattedMessage } from "react-intl";
+import { Modal, ButtonToolbar, Button } from "react-bootstrap";
+import styled from "styled-components";
+import axios from "../../config/axios";
-import { INVITE_USERS_PATH, TEAM_DETAILS_PATH } from '../../config/api_endpoints';
-import InviteUsersForm from './components/InviteUsersForm';
-import InviteUsersResults from './components/InviteUsersResults';
-import InviteUsersButton from './components/InviteUsersButton';
+import {
+ INVITE_USERS_PATH,
+ TEAM_DETAILS_PATH
+} from "../../config/api_endpoints";
+import InviteUsersForm from "./components/InviteUsersForm";
+import InviteUsersResults from "./components/InviteUsersResults";
+import InviteUsersButton from "./components/InviteUsersButton";
-const StyledButtonToolbar = styled(ButtonToolbar)`
- float: right;
-`;
+const StyledButtonToolbar = styled(ButtonToolbar)`float: right;`;
class InviteUsersModal extends Component {
- constructor() {
- super();
- this.state = {
- showInviteUsersResults: false,
- inputTags: [],
- inviteResults: []
- };
- this.handleInputChange = this.handleInputChange.bind(this);
- this.inviteAs = this.inviteAs.bind(this);
- this.handleCloseModal = this.handleCloseModal.bind(this)
- }
+ constructor(props) {
+ super(props);
+ this.state = {
+ showInviteUsersResults: false,
+ inputTags: [],
+ inviteResults: []
+ };
+ this.handleInputChange = this.handleInputChange.bind(this);
+ this.inviteAs = this.inviteAs.bind(this);
+ this.handleCloseModal = this.handleCloseModal.bind(this);
+ }
- handleCloseModal() {
- const path = TEAM_DETAILS_PATH.replace(":team_id", this.props.team.id);
- this.props.onCloseModal();
- this.setState({
- showInviteUsersResults: false,
- inputTags: [],
- inviteResults: []
- });
- // Update team members table
- axios.get(path).then(response => {
- const { users } = response.data.team_details;
- this.props.updateUsersCallback(users);
- })
- }
+ handleCloseModal() {
+ const path = TEAM_DETAILS_PATH.replace(":team_id", this.props.team.id);
+ this.props.onCloseModal();
+ this.setState({
+ showInviteUsersResults: false,
+ inputTags: [],
+ inviteResults: []
+ });
+ // Update team members table
+ axios.get(path).then(response => {
+ const { users } = response.data.team_details;
+ this.props.updateUsersCallback(users);
+ });
+ }
- handleInputChange(inputTags) {
- this.setState({ inputTags });
- }
+ handleInputChange(inputTags) {
+ this.setState({ inputTags });
+ }
- inviteAs(role) {
- axios
- .put(INVITE_USERS_PATH, {
- user_role: role,
- emails: this.state.inputTags,
- team_id: this.props.team.id
- })
- .then(({ data }) => {
- this.setState({ inviteResults: data });
- this.setState({ showInviteUsersResults: true });
- })
- .catch(error => {});
- }
+ inviteAs(role) {
+ axios
+ .put(INVITE_USERS_PATH, {
+ user_role: role,
+ emails: this.state.inputTags,
+ team_id: this.props.team.id
+ })
+ .then(({ data }) => {
+ this.setState({ inviteResults: data });
+ this.setState({ showInviteUsersResults: true });
+ })
+ .catch(error => {});
+ }
- render() {
- let modalBody = null;
- let inviteButton = null;
- if (this.state.showInviteUsersResults) {
- modalBody = ;
- inviteButton = null;
- } else {
- modalBody = ;
- inviteButton = ;
- }
+ render() {
+ let modalBody = null;
+ let inviteButton = null;
+ if (this.state.showInviteUsersResults) {
+ modalBody = ;
+ inviteButton = null;
+ } else {
+ modalBody = (
+
+ );
+ inviteButton = ;
+ }
- return (
-
-
-
-
-
-
-
- {modalBody}
-
-
-
-
- {inviteButton}
-
-
-
- );
- }
+ return (
+
+
+
+
+
+
+ {modalBody}
+
+
+
+ {inviteButton}
+
+
+
+ );
+ }
}
InviteUsersModal.propTypes = {
- showModal: PropTypes.bool.isRequired,
- onCloseModal: PropTypes.func.isRequired,
- team: PropTypes.shape({
- id: PropTypes.number.isRequired,
- name: PropTypes.string.isRequired
- }).isRequired,
- updateUsersCallback: PropTypes.func.isRequired
+ showModal: bool.isRequired,
+ onCloseModal: func.isRequired,
+ team: shape({
+ id: number.isRequired,
+ name: string.isRequired
+ }).isRequired,
+ updateUsersCallback: func.isRequired
};
export default InviteUsersModal;
diff --git a/app/javascript/src/config/api_endpoints.js b/app/javascript/src/config/api_endpoints.js
index 9e1fa0172..9c066088b 100644
--- a/app/javascript/src/config/api_endpoints.js
+++ b/app/javascript/src/config/api_endpoints.js
@@ -39,7 +39,7 @@ export const CHANGE_USER_RECENT_NOTIFICATION_EMAIL_PATH =
"/client_api/users/change_recent_notification_email";
export const CHANGE_USER_SYSTEM_MESSAGE_NOTIFICATION_EMAIL_PATH =
"/client_api/users/change_system_notification_email";
-export const INVITE_USERS_PATH = '/client_api/users/invite_users';
+export const INVITE_USERS_PATH = "/client_api/users/invite_users";
// info dropdown_title
export const CUSTOMER_SUPPORT_LINK = "http://scinote.net/support";
diff --git a/app/javascript/src/config/locales/messages.js b/app/javascript/src/config/locales/messages.js
index 037c2fb8e..b1f64bd33 100644
--- a/app/javascript/src/config/locales/messages.js
+++ b/app/javascript/src/config/locales/messages.js
@@ -1,25 +1,25 @@
export default {
- 'en-US': {
+ "en-US": {
general: {
- close: 'Close',
- cancel: 'Cancel',
- update: 'Update',
- edit: 'Edit',
- loading: 'Loading ...'
+ close: "Close",
+ cancel: "Cancel",
+ update: "Update",
+ edit: "Edit",
+ loading: "Loading ..."
},
error_messages: {
text_too_short: "is too short (minimum is {min_length} characters)",
text_too_long: "is too long (maximum is {max_length} characters)"
},
navbar: {
- page_title: 'sciNote',
- home_label: 'Home',
- protocols_label: 'Protocols',
- repositories_label: 'Repositories',
- activities_label: 'Activities',
- search_label: 'Search',
- notifications_label: 'Notifications',
- info_label: 'Info'
+ page_title: "sciNote",
+ home_label: "Home",
+ protocols_label: "Protocols",
+ repositories_label: "Repositories",
+ activities_label: "Activities",
+ search_label: "Search",
+ notifications_label: "Notifications",
+ info_label: "Info"
},
settings_page: {
all_teams: "All teams",
@@ -54,8 +54,8 @@ export default {
"Assignment notifications appear whenever you get assigned to a team, project, task.",
recent_changes: "Recent changes",
recent_changes_msg:
- 'Recent changes notifications appear whenever there is a change on a task you are assigned to.',
- system_message: 'System message',
+ "Recent changes notifications appear whenever there is a change on a task you are assigned to.",
+ system_message: "System message",
system_message_msg:
"System message notifications are specifically sent by site maintainers to notify all users about a system update.",
show_in_scinote: "Show in sciNote",
@@ -64,20 +64,28 @@ export default {
yes: "Yes",
leave_team_modal: {
title: "Leave team {teamName}",
- subtitle: "Are you sure you wish to leave team My projects? This action is irreversible.",
+ subtitle:
+ "Are you sure you wish to leave team My projects? This action is irreversible.",
warnings: "Leaving team has following consequences:",
- warning_message_one: "you will lose access to all content belonging to the team (including projects, tasks, protocols and activities);",
- warning_message_two: "all projects in the team where you were the sole Owner will receive a new owner from the team administrators;",
- warning_message_three: "all repository protocols in the team belonging to you will be reassigned onto a new owner from team administrators.",
+ warning_message_one:
+ "you will lose access to all content belonging to the team (including projects, tasks, protocols and activities);",
+ warning_message_two:
+ "all projects in the team where you were the sole Owner will receive a new owner from the team administrators;",
+ warning_message_three:
+ "all repository protocols in the team belonging to you will be reassigned onto a new owner from team administrators.",
leave_team: "Leave"
},
remove_user_modal: {
title: "Remove user {user} from team {team}",
- subtitle: "Are you sure you wish to remove user {user} from team {team}?",
+ subtitle:
+ "Are you sure you wish to remove user {user} from team {team}?",
warnings: "Removing user from team has following consequences:",
- warning_message_one: "user will lose access to all content belonging to the team (including projects, tasks, protocols and activities);",
- warning_message_two: "all projects in the team where user was the sole Owner will be reassigned onto you as a new owner;",
- warning_message_three: "all repository protocols in the team belonging to user will be reassigned onto you.",
+ warning_message_one:
+ "user will lose access to all content belonging to the team (including projects, tasks, protocols and activities);",
+ warning_message_two:
+ "all projects in the team where user was the sole Owner will be reassigned onto you as a new owner;",
+ warning_message_three:
+ "all repository protocols in the team belonging to user will be reassigned onto you.",
remove_user: "Remove user"
},
update_team_description_modal: {
@@ -114,61 +122,65 @@ export default {
}
},
activities: {
- modal_title: 'Activities',
- no_data: 'No Data',
- more_activities: 'More Activities'
+ modal_title: "Activities",
+ no_data: "No Data",
+ more_activities: "More Activities"
},
global_team_switch: {
- new_team: 'New team'
+ new_team: "New team"
},
notifications: {
- dropdown_title: 'Notifications',
- dropdown_settings_link: 'Settings',
- dropdown_show_all: 'Show all notifications'
+ dropdown_title: "Notifications",
+ dropdown_settings_link: "Settings",
+ dropdown_show_all: "Show all notifications"
},
info_dropdown: {
- customer_support: 'Customer support',
- tutorials: 'Tutorials',
- release_notes: 'Release notes',
- premium: 'Premium',
- contact_us: 'Contact us'
+ customer_support: "Customer support",
+ tutorials: "Tutorials",
+ release_notes: "Release notes",
+ premium: "Premium",
+ contact_us: "Contact us"
},
user_account_dropdown: {
- greeting: 'Hi, {name}',
- settings: 'Settings',
- log_out: 'Log out'
+ greeting: "Hi, {name}",
+ settings: "Settings",
+ log_out: "Log out"
},
invite_users: {
- modal_title: 'Invite users to team {team}',
- input_text: 'Invite more people to team {team} and start using sciNote.',
- input_help: 'Input one or multiple emails, confirm each email with ENTER key.',
+ modal_title: "Invite users to team {team}",
+ input_text: "Invite more people to team {team} and start using sciNote.",
+ input_help:
+ "Input one or multiple emails, confirm each email with ENTER key.",
dropdown_button: {
- invite: 'Invite user/s',
- guest: 'as Guest/s',
- normal_user: 'as Normal user/s',
- admin: 'as Administrator/s'
+ invite: "Invite user/s",
+ guest: "as Guest/s",
+ normal_user: "as Normal user/s",
+ admin: "as Administrator/s"
},
- results_title: 'Invitation results:',
+ results_title: "Invitation results:",
roles: {
- guest: 'Guest',
- normal_user: 'Normal user',
- admin: 'Administrator'
+ guest: "Guest",
+ normal_user: "Normal user",
+ admin: "Administrator"
},
results_msg: {
- user_exists: 'User is already a member of sciNote.',
+ user_exists: "User is already a member of sciNote.",
user_exists_unconfirmed:
- 'User is already a member of sciNote but is not confirmed yet.',
+ "User is already a member of sciNote but is not confirmed yet.",
user_exists_and_in_team_unconfirmed:
- 'User is already a member of sciNote and team {team} as {role} but is not confirmed yet.',
+ "User is already a member of sciNote and team {team} as {role} but is not confirmed yet.",
user_exists_invited_to_team_unconfirmed:
- 'User is already a member of sciNote but is not confirmed yet - successfully invited to team {team} as {role}.',
- user_exists_and_in_team: 'User is already a member of sciNote and team {team} as {role}.',
+ "User is already a member of sciNote but is not confirmed yet - successfully invited to team {team} as {role}.",
+ user_exists_and_in_team:
+ "User is already a member of sciNote and team {team} as {role}.",
user_exists_invited_to_team:
- 'User was already a member of sciNote - successfully invited to team {team} as {role}.',
- user_created: 'User succesfully invited to sciNote.',
- user_created_invited_to_team: 'User successfully invited to sciNote and team {team} as {role}.',
- user_invalid: 'Invalid email.',
- too_many_emails: 'Only invited first {nr} emails. To invite more users, fill in another invitation form.'
+ "User was already a member of sciNote - successfully invited to team {team} as {role}.",
+ user_created: "User succesfully invited to sciNote.",
+ user_created_invited_to_team:
+ "User successfully invited to sciNote and team {team} as {role}.",
+ user_invalid: "Invalid email.",
+ too_many_emails:
+ "Only invited first {nr} emails. To invite more users, fill in another invitation form."
}
}
}
diff --git a/app/javascript/src/scenes/SettingsPage/scenes/team/components/TeamsMembers.jsx b/app/javascript/src/scenes/SettingsPage/scenes/team/components/TeamsMembers.jsx
index bed7cf04b..8f703018b 100644
--- a/app/javascript/src/scenes/SettingsPage/scenes/team/components/TeamsMembers.jsx
+++ b/app/javascript/src/scenes/SettingsPage/scenes/team/components/TeamsMembers.jsx
@@ -10,7 +10,7 @@ import {
import { FormattedMessage } from "react-intl";
import axios from "../../../../../config/axios";
-import InviteUsersModal from '../../../../../components/InviteUsersModal';
+import InviteUsersModal from "../../../../../components/InviteUsersModal";
import RemoveUserModal from "./RemoveUserModal";
import DataTable from "../../../../../components/data_table";
import { UPDATE_USER_TEAM_ROLE_PATH } from "../../../../../config/api_endpoints";
@@ -30,8 +30,12 @@ class TeamsMembers extends Component {
userToRemove: initalUserToRemove
};
this.memberAction = this.memberAction.bind(this);
- this.showInviteUsersModalCallback = this.showInviteUsersModalCallback.bind(this);
- this.closeInviteUsersModalCallback = this.closeInviteUsersModalCallback.bind(this);
+ this.showInviteUsersModalCallback = this.showInviteUsersModalCallback.bind(
+ this
+ );
+ this.closeInviteUsersModalCallback = this.closeInviteUsersModalCallback.bind(
+ this
+ );
this.hideModal = this.hideModal.bind(this);
}
@@ -184,7 +188,7 @@ class TeamsMembers extends Component {
}
>
-