From f7b04f0f275cb70e8dc045a1257cedade81e6a8e Mon Sep 17 00:00:00 2001 From: hmhealey Date: Thu, 25 Feb 2016 11:25:16 -0500 Subject: Merged contents of MoreDirectChannelsModal and ChannelMembersModal into UserList --- web/react/components/channel_members_modal.jsx | 94 +++++------ web/react/components/filtered_user_list.jsx | 129 +++++++++++++++ web/react/components/more_direct_channels.jsx | 215 ++++--------------------- web/react/components/user_list.jsx | 53 ++++++ web/react/components/user_list_row.jsx | 79 +++++++++ web/sass-files/sass/partials/_modal.scss | 22 +++ 6 files changed, 349 insertions(+), 243 deletions(-) create mode 100644 web/react/components/filtered_user_list.jsx create mode 100644 web/react/components/user_list.jsx create mode 100644 web/react/components/user_list_row.jsx diff --git a/web/react/components/channel_members_modal.jsx b/web/react/components/channel_members_modal.jsx index fd452f206..44de0266b 100644 --- a/web/react/components/channel_members_modal.jsx +++ b/web/react/components/channel_members_modal.jsx @@ -1,8 +1,8 @@ // Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. +import FilteredUserList from './filtered_user_list.jsx'; import LoadingScreen from './loading_screen.jsx'; -import MemberList from './member_list.jsx'; import ChannelInviteModal from './channel_invite_modal.jsx'; import UserStore from '../stores/user_store.jsx'; @@ -24,6 +24,8 @@ export default class ChannelMembersModal extends React.Component { this.onChange = this.onChange.bind(this); this.handleRemove = this.handleRemove.bind(this); + this.createRemoveMemberButton = this.createRemoveMemberButton.bind(this); + // the rest of the state gets populated when the modal is shown this.state = { showInviteModal: false @@ -51,24 +53,10 @@ export default class ChannelMembersModal extends React.Component { }; } - const users = UserStore.getActiveOnlyProfiles(); - const memberList = extraInfo.members; - - const nonmemberList = []; - for (const id in users) { - if (users.hasOwnProperty(id)) { - let found = false; - for (let i = 0; i < memberList.length; i++) { - if (memberList[i].id === id) { - found = true; - break; - } - } - if (!found) { - nonmemberList.push(users[id]); - } - } - } + // clone the member list since we mutate it later on + const memberList = extraInfo.members.map((member) => { + return Object.assign({}, member); + }); function compareByUsername(a, b) { if (a.username < b.username) { @@ -81,15 +69,14 @@ export default class ChannelMembersModal extends React.Component { } memberList.sort(compareByUsername); - nonmemberList.sort(compareByUsername); return { - nonmemberList, memberList, loading: false }; } onShow() { + // TODO ugh if ($(window).width() > 768) { $(ReactDOM.findDOMNode(this.refs.modalBody)).perfectScrollbar(); } @@ -116,41 +103,25 @@ export default class ChannelMembersModal extends React.Component { this.setState(newState); } } - handleRemove(userId) { - // Make sure the user is a member of the channel - const memberList = this.state.memberList; - let found = false; - for (let i = 0; i < memberList.length; i++) { - if (memberList[i].id === userId) { - found = true; - break; - } - } - - if (!found) { - return; - } + handleRemove(user) { + const userId = user.id; const data = {}; data.user_id = userId; - Client.removeChannelMember(ChannelStore.getCurrentId(), data, + Client.removeChannelMember( + ChannelStore.getCurrentId(), + data, () => { - let oldMember; + const memberList = this.state.memberList.slice(); for (let i = 0; i < memberList.length; i++) { if (userId === memberList[i].id) { - oldMember = memberList[i]; memberList.splice(i, 1); break; } } - const nonmemberList = this.state.nonmemberList; - if (oldMember) { - nonmemberList.push(oldMember); - } - - this.setState({memberList, nonmemberList}); + this.setState({memberList}); AsyncClient.getChannelExtraInfo(); }, (err) => { @@ -158,30 +129,39 @@ export default class ChannelMembersModal extends React.Component { } ); } + createRemoveMemberButton({user}) { + if (user.id === UserStore.getCurrentId()) { + return null; + } + + return ( + + ); + } render() { var maxHeight = 1000; if (Utils.windowHeight() <= 1200) { maxHeight = Utils.windowHeight() - 300; } - const currentMember = ChannelStore.getCurrentMember(); - let isAdmin = false; - if (currentMember) { - isAdmin = Utils.isAdmin(currentMember.roles) || Utils.isAdmin(UserStore.getCurrentUser().roles); - } - let content; if (this.state.loading) { content = (); } else { content = ( -
- -
+ ); } diff --git a/web/react/components/filtered_user_list.jsx b/web/react/components/filtered_user_list.jsx new file mode 100644 index 000000000..dc8abd4c1 --- /dev/null +++ b/web/react/components/filtered_user_list.jsx @@ -0,0 +1,129 @@ +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. +// See License.txt for license information. + +import UserList from './user_list.jsx'; + +import {intlShape, injectIntl, defineMessages, FormattedMessage} from 'mm-intl'; + +const holders = defineMessages({ + member: { + id: 'more_direct_channels.member', + defaultMessage: 'Member' + }, + search: { + id: 'more_direct_channels.search', + defaultMessage: 'Search members' + } +}); + +class FilteredUserList extends React.Component { + constructor(props) { + super(props); + + this.handleFilterChange = this.handleFilterChange.bind(this); + + this.state = { + filter: '' + }; + } + + componentDidUpdate(prevProps, prevState) { + if (prevState.filter !== this.state.filter) { + $(ReactDOM.findDOMNode(this.refs.userList)).scrollTop(0); + } + } + + handleFilterChange(e) { + this.setState({ + filter: e.target.value + }); + } + + render() { + const {formatMessage} = this.props.intl; + + let users = this.props.users; + + if (this.state.filter) { + const filter = this.state.filter.toLowerCase(); + + users = users.filter((user) => { + return user.username.toLowerCase().indexOf(filter) !== -1 || + (user.first_name && user.first_name.toLowerCase().indexOf(filter) !== -1) || + (user.last_name && user.last_name.toLowerCase().indexOf(filter) !== -1) || + (user.nickname && user.nickname.toLowerCase().indexOf(filter) !== -1); + }); + } + + let memberString = formatMessage(holders.member); + if (users.length !== 1) { + memberString += 's'; + } + + let count; + if (users.length === this.props.users.length) { + count = ( + + ); + } else { + count = ( + + ); + } + + return ( +
+
+
+ +
+
+ {count} +
+
+
+ +
+
+ ); + } +} + +FilteredUserList.defaultProps = { + users: [], + actions: [] +}; + +FilteredUserList.propTypes = { + intl: intlShape.isRequired, + users: React.PropTypes.arrayOf(React.PropTypes.object), + actions: React.PropTypes.arrayOf(React.PropTypes.func) +}; + +export default injectIntl(FilteredUserList); diff --git a/web/react/components/more_direct_channels.jsx b/web/react/components/more_direct_channels.jsx index 3b72b251c..c85b5e9c5 100644 --- a/web/react/components/more_direct_channels.jsx +++ b/web/react/components/more_direct_channels.jsx @@ -2,36 +2,24 @@ // See License.txt for license information. const Modal = ReactBootstrap.Modal; +import FilteredUserList from './filtered_user_list.jsx'; import UserStore from '../stores/user_store.jsx'; import * as Utils from '../utils/utils.jsx'; -import {intlShape, injectIntl, defineMessages, FormattedMessage} from 'mm-intl'; +import {FormattedMessage} from 'mm-intl'; -const holders = defineMessages({ - member: { - id: 'more_direct_channels.member', - defaultMessage: 'Member' - }, - search: { - id: 'more_direct_channels.search', - defaultMessage: 'Search members' - } -}); - -class MoreDirectChannels extends React.Component { +export default class MoreDirectChannels extends React.Component { constructor(props) { super(props); - this.handleFilterChange = this.handleFilterChange.bind(this); this.handleHide = this.handleHide.bind(this); this.handleShowDirectChannel = this.handleShowDirectChannel.bind(this); this.handleUserChange = this.handleUserChange.bind(this); - this.createRowForUser = this.createRowForUser.bind(this); + this.createJoinDirectChannelButton = this.createJoinDirectChannelButton.bind(this); this.state = { users: this.getUsersFromStore(), - filter: '', loadingDMChannel: -1 }; } @@ -67,32 +55,20 @@ class MoreDirectChannels extends React.Component { } onShow() { - if (Utils.isMobile()) { - $(ReactDOM.findDOMNode(this.refs.userList)).css('max-height', $(window).height() - 250); + // TODO ugh + /*if (Utils.isMobile()) { + $(ReactDOM.findDOMNode(this.refs.modal)).css('max-height', $(window).height() - 250); } else { - $(ReactDOM.findDOMNode(this.refs.userList)).perfectScrollbar(); - $(ReactDOM.findDOMNode(this.refs.userList)).css('max-height', $(window).height() - 300); - } - } - - handleFilterChange() { - const filter = ReactDOM.findDOMNode(this.refs.filter).value; - - if ($(window).width() > 768) { - $(ReactDOM.findDOMNode(this.refs.userList)).scrollTop(0); - } - - if (filter !== this.state.filter) { - this.setState({filter}); - } + console.log(ReactDOM.findDOMNode(this.refs.modal)); + console.log($(ReactDOM.findDOMNode(this.refs.modal))); + $(ReactDOM.findDOMNode(this.refs.modal)).css('max-height', $(window).height() - 300); + }*/ } handleHide() { if (this.props.onModalDismissed) { this.props.onModalDismissed(); } - - this.setState({filter: ''}); } handleShowDirectChannel(teammate, e) { @@ -120,145 +96,34 @@ class MoreDirectChannels extends React.Component { this.setState({users: this.getUsersFromStore()}); } - createRowForUser(user) { - const details = []; - - const fullName = Utils.getFullName(user); - if (fullName) { - details.push( - - {fullName} - - ); - } - - if (user.nickname) { - const separator = fullName ? ' - ' : ''; - details.push( - - {separator + user.nickname} - - ); - } - - let joinButton; + createJoinDirectChannelButton({user}) { if (this.state.loadingDMChannel === user.id) { - joinButton = ( + return ( ); - } else { - joinButton = ( - - ); } return ( - - - -
- {user.username} -
-
- {details} -
- - - {joinButton} - - + ); } render() { - const {formatMessage} = this.props.intl; - if (!this.props.show) { - return null; - } - - let users = this.state.users; - if (this.state.filter) { - const filter = this.state.filter.toLowerCase(); - - users = users.filter((user) => { - return user.username.toLowerCase().indexOf(filter) !== -1 || - user.first_name.toLowerCase().indexOf(filter) !== -1 || - user.last_name.toLowerCase().indexOf(filter) !== -1 || - user.nickname.toLowerCase().indexOf(filter) !== -1; - }); - } - - const userEntries = users.map(this.createRowForUser); - - if (userEntries.length === 0) { - userEntries.push( - - - ); - } - - let memberString = formatMessage(holders.member); - if (users.length !== 1) { - memberString += 's'; - } - - let count; - if (users.length === this.state.users.length) { - count = ( - - ); - } else { - count = ( - - ); - } - return ( @@ -270,30 +135,11 @@ class MoreDirectChannels extends React.Component { /> - -
-
- -
-
- {count} -
-
-
- - - {userEntries} - -
-
+ +
@@ -55,13 +55,13 @@ export default class ConfirmModal extends React.Component { ConfirmModal.defaultProps = { title: '', message: '', - confirm_button: '' + confirmButton: '' }; ConfirmModal.propTypes = { show: React.PropTypes.bool.isRequired, - title: React.PropTypes.string, - message: React.PropTypes.string, - confirm_button: React.PropTypes.string, + title: React.PropTypes.node, + message: React.PropTypes.node, + confirmButton: React.PropTypes.node, onConfirm: React.PropTypes.func.isRequired, onCancel: React.PropTypes.func.isRequired }; diff --git a/web/react/components/member_list_team.jsx b/web/react/components/member_list_team.jsx index f1c31131f..0787bf8d8 100644 --- a/web/react/components/member_list_team.jsx +++ b/web/react/components/member_list_team.jsx @@ -1,7 +1,8 @@ // Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. -import MemberListTeamItem from './member_list_team_item.jsx'; +import FilteredUserList from './filtered_user_list.jsx'; +import TeamMembersDropdown from './team_members_dropdown.jsx'; import UserStore from '../stores/user_store.jsx'; export default class MemberListTeam extends React.Component { @@ -44,21 +45,11 @@ export default class MemberListTeam extends React.Component { } render() { - const memberList = this.state.users.map((user) => { - return ( - - ); - }); - return ( - - - {memberList} - -
+ ); } } diff --git a/web/react/components/member_list_team_item.jsx b/web/react/components/member_list_team_item.jsx deleted file mode 100644 index 23bc10781..000000000 --- a/web/react/components/member_list_team_item.jsx +++ /dev/null @@ -1,339 +0,0 @@ -// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. -// See License.txt for license information. - -import UserStore from '../stores/user_store.jsx'; -import ChannelStore from '../stores/channel_store.jsx'; -import * as Client from '../utils/client.jsx'; -import * as AsyncClient from '../utils/async_client.jsx'; -import * as Utils from '../utils/utils.jsx'; -import ConfirmModal from './confirm_modal.jsx'; -import TeamStore from '../stores/team_store.jsx'; - -import {injectIntl, intlShape, defineMessages, FormattedMessage} from 'mm-intl'; - -var holders = defineMessages({ - confirmDemoteRoleTitle: { - id: 'member_team_item.confirmDemoteRoleTitle', - defaultMessage: 'Confirm demotion from System Admin role' - }, - confirmDemotion: { - id: 'member_team_item.confirmDemotion', - defaultMessage: 'Confirm Demotion' - }, - confirmDemoteDescription: { - id: 'member_team_item.confirmDemoteDescription', - defaultMessage: 'If you demote yourself from the System Admin role and there is not another user with System Admin privileges, you\'ll need to re-assign a System Admin by accessing the Mattermost server through a terminal and running the following command.' - }, - confirmDemotionCmd: { - id: 'member_team_item.confirmDemotionCmd', - defaultMessage: 'platform -assign_role -team_name="yourteam" -email="name@yourcompany.com" -role="system_admin"' - } -}); - -export default class MemberListTeamItem extends React.Component { - constructor(props) { - super(props); - - this.handleMakeMember = this.handleMakeMember.bind(this); - this.handleMakeActive = this.handleMakeActive.bind(this); - this.handleMakeNotActive = this.handleMakeNotActive.bind(this); - this.handleMakeAdmin = this.handleMakeAdmin.bind(this); - this.handleDemote = this.handleDemote.bind(this); - this.handleDemoteSubmit = this.handleDemoteSubmit.bind(this); - this.handleDemoteCancel = this.handleDemoteCancel.bind(this); - - this.state = { - serverError: null, - showDemoteModal: false, - user: null, - role: null - }; - } - handleMakeMember() { - const me = UserStore.getCurrentUser(); - if (this.props.user.id === me.id) { - this.handleDemote(this.props.user, ''); - } else { - const data = { - user_id: this.props.user.id, - new_roles: '' - }; - Client.updateRoles(data, - () => { - AsyncClient.getProfiles(); - }, - (err) => { - this.setState({serverError: err.message}); - } - ); - } - } - handleMakeActive() { - Client.updateActive(this.props.user.id, true, - () => { - AsyncClient.getProfiles(); - AsyncClient.getChannelExtraInfo(ChannelStore.getCurrentId()); - }, - (err) => { - this.setState({serverError: err.message}); - } - ); - } - handleMakeNotActive() { - Client.updateActive(this.props.user.id, false, - () => { - AsyncClient.getProfiles(); - AsyncClient.getChannelExtraInfo(ChannelStore.getCurrentId()); - }, - (err) => { - this.setState({serverError: err.message}); - } - ); - } - handleMakeAdmin() { - const me = UserStore.getCurrentUser(); - if (this.props.user.id === me.id) { - this.handleDemote(this.props.user, 'admin'); - } else { - const data = { - user_id: this.props.user.id, - new_roles: 'admin' - }; - - Client.updateRoles(data, - () => { - AsyncClient.getProfiles(); - }, - (err) => { - this.setState({serverError: err.message}); - } - ); - } - } - handleDemote(user, role) { - this.setState({ - serverError: this.state.serverError, - showDemoteModal: true, - user, - role - }); - } - handleDemoteCancel() { - this.setState({ - serverError: null, - showDemoteModal: false, - user: null, - role: null - }); - } - handleDemoteSubmit() { - const data = { - user_id: this.props.user.id, - new_roles: this.state.role - }; - - Client.updateRoles(data, - () => { - const teamUrl = TeamStore.getCurrentTeamUrl(); - if (teamUrl) { - window.location.href = teamUrl; - } else { - window.location.href = '/'; - } - }, - (err) => { - this.setState({serverError: err.message}); - } - ); - } - render() { - let serverError = null; - if (this.state.serverError) { - serverError = ( -
- -
- ); - } - - const user = this.props.user; - let currentRoles = ( - - ); - const timestamp = UserStore.getCurrentUser().update_at; - - if (user.roles.length > 0) { - if (Utils.isSystemAdmin(user.roles)) { - currentRoles = ( - - ); - } else if (Utils.isAdmin(user.roles)) { - currentRoles = ( - - ); - } else { - currentRoles = user.roles.charAt(0).toUpperCase() + user.roles.slice(1); - } - } - - const email = user.email; - let showMakeMember = user.roles === 'admin' || user.roles === 'system_admin'; - let showMakeAdmin = user.roles === '' || user.roles === 'system_admin'; - let showMakeActive = false; - let showMakeNotActive = user.roles !== 'system_admin'; - - if (user.delete_at > 0) { - currentRoles = ( - - ); - showMakeMember = false; - showMakeAdmin = false; - showMakeActive = true; - showMakeNotActive = false; - } - - let makeAdmin = null; - if (showMakeAdmin) { - makeAdmin = ( -
  • - - - -
  • - ); - } - - let makeMember = null; - if (showMakeMember) { - makeMember = ( -
  • - - - -
  • - ); - } - - let makeActive = null; - if (showMakeActive) { - makeActive = ( -
  • - - - -
  • - ); - } - - let makeNotActive = null; - if (showMakeNotActive) { - makeNotActive = ( -
  • - - - -
  • - ); - } - const me = UserStore.getCurrentUser(); - const {formatMessage} = this.props.intl; - let makeDemoteModal = null; - if (this.props.user.id === me.id) { - makeDemoteModal = ( - - ); - } - - return ( - - - - {Utils.displayUsername(user.id)} - {email} -
    - - - {currentRoles} - -
      - {makeAdmin} - {makeMember} - {makeActive} - {makeNotActive} -
    -
    - {makeDemoteModal} - {serverError} - - - ); - } -} - -MemberListTeamItem.propTypes = { - intl: intlShape.isRequired, - user: React.PropTypes.object.isRequired -}; - -export default injectIntl(MemberListTeamItem); diff --git a/web/react/components/team_members_dropdown.jsx b/web/react/components/team_members_dropdown.jsx new file mode 100644 index 000000000..35ec66519 --- /dev/null +++ b/web/react/components/team_members_dropdown.jsx @@ -0,0 +1,331 @@ +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. +// See License.txt for license information. + +import UserStore from '../stores/user_store.jsx'; +import ChannelStore from '../stores/channel_store.jsx'; +import * as Client from '../utils/client.jsx'; +import * as AsyncClient from '../utils/async_client.jsx'; +import * as Utils from '../utils/utils.jsx'; +import ConfirmModal from './confirm_modal.jsx'; +import TeamStore from '../stores/team_store.jsx'; + +import {FormattedMessage} from 'mm-intl'; + +export default class TeamMembersDropdown extends React.Component { + constructor(props) { + super(props); + + this.handleMakeMember = this.handleMakeMember.bind(this); + this.handleMakeActive = this.handleMakeActive.bind(this); + this.handleMakeNotActive = this.handleMakeNotActive.bind(this); + this.handleMakeAdmin = this.handleMakeAdmin.bind(this); + this.handleDemote = this.handleDemote.bind(this); + this.handleDemoteSubmit = this.handleDemoteSubmit.bind(this); + this.handleDemoteCancel = this.handleDemoteCancel.bind(this); + + this.state = { + serverError: null, + showDemoteModal: false, + user: null, + role: null + }; + } + handleMakeMember() { + const me = UserStore.getCurrentUser(); + if (this.props.user.id === me.id) { + this.handleDemote(this.props.user, ''); + } else { + const data = { + user_id: this.props.user.id, + new_roles: '' + }; + Client.updateRoles(data, + () => { + AsyncClient.getProfiles(); + }, + (err) => { + this.setState({serverError: err.message}); + } + ); + } + } + handleMakeActive() { + Client.updateActive(this.props.user.id, true, + () => { + AsyncClient.getProfiles(); + AsyncClient.getChannelExtraInfo(ChannelStore.getCurrentId()); + }, + (err) => { + this.setState({serverError: err.message}); + } + ); + } + handleMakeNotActive() { + Client.updateActive(this.props.user.id, false, + () => { + AsyncClient.getProfiles(); + AsyncClient.getChannelExtraInfo(ChannelStore.getCurrentId()); + }, + (err) => { + this.setState({serverError: err.message}); + } + ); + } + handleMakeAdmin() { + const me = UserStore.getCurrentUser(); + if (this.props.user.id === me.id) { + this.handleDemote(this.props.user, 'admin'); + } else { + const data = { + user_id: this.props.user.id, + new_roles: 'admin' + }; + + Client.updateRoles(data, + () => { + AsyncClient.getProfiles(); + }, + (err) => { + this.setState({serverError: err.message}); + } + ); + } + } + handleDemote(user, role) { + this.setState({ + serverError: this.state.serverError, + showDemoteModal: true, + user, + role + }); + } + handleDemoteCancel() { + this.setState({ + serverError: null, + showDemoteModal: false, + user: null, + role: null + }); + } + handleDemoteSubmit() { + const data = { + user_id: this.props.user.id, + new_roles: this.state.role + }; + + Client.updateRoles(data, + () => { + const teamUrl = TeamStore.getCurrentTeamUrl(); + if (teamUrl) { + window.location.href = teamUrl; + } else { + window.location.href = '/'; + } + }, + (err) => { + this.setState({serverError: err.message}); + } + ); + } + render() { + let serverError = null; + if (this.state.serverError) { + serverError = ( +
    + +
    + ); + } + + const user = this.props.user; + let currentRoles = ( + + ); + + if (user.roles.length > 0) { + if (Utils.isSystemAdmin(user.roles)) { + currentRoles = ( + + ); + } else if (Utils.isAdmin(user.roles)) { + currentRoles = ( + + ); + } else { + currentRoles = user.roles.charAt(0).toUpperCase() + user.roles.slice(1); + } + } + + let showMakeMember = user.roles === 'admin' || user.roles === 'system_admin'; + let showMakeAdmin = user.roles === '' || user.roles === 'system_admin'; + let showMakeActive = false; + let showMakeNotActive = user.roles !== 'system_admin'; + + if (user.delete_at > 0) { + currentRoles = ( + + ); + showMakeMember = false; + showMakeAdmin = false; + showMakeActive = true; + showMakeNotActive = false; + } + + let makeAdmin = null; + if (showMakeAdmin) { + makeAdmin = ( +
  • + + + +
  • + ); + } + + let makeMember = null; + if (showMakeMember) { + makeMember = ( +
  • + + + +
  • + ); + } + + let makeActive = null; + if (showMakeActive) { + makeActive = ( +
  • + + + +
  • + ); + } + + let makeNotActive = null; + if (showMakeNotActive) { + makeNotActive = ( +
  • + + + +
  • + ); + } + const me = UserStore.getCurrentUser(); + let makeDemoteModal = null; + if (this.props.user.id === me.id) { + const title = ( + + ); + const message = ( +
    + +
    +
    + + {serverError} +
    + ); + + const confirmButton = ( + + ); + + makeDemoteModal = ( + + ); + } + + return ( +
    + + + {currentRoles} + +
      + {makeAdmin} + {makeMember} + {makeActive} + {makeNotActive} +
    + {makeDemoteModal} + {serverError} +
    + ); + } +} + +TeamMembersDropdown.propTypes = { + user: React.PropTypes.object.isRequired +}; diff --git a/web/react/components/team_members_modal.jsx b/web/react/components/team_members_modal.jsx index 8ac435742..dfd48b614 100644 --- a/web/react/components/team_members_modal.jsx +++ b/web/react/components/team_members_modal.jsx @@ -28,12 +28,13 @@ export default class TeamMembersModal extends React.Component { } onShow() { - if ($(window).width() > 768) { + // TODO ugh + /*if ($(window).width() > 768) { $(ReactDOM.findDOMNode(this.refs.modalBody)).perfectScrollbar(); $(ReactDOM.findDOMNode(this.refs.modalBody)).css('max-height', $(window).height() - 200); } else { $(ReactDOM.findDOMNode(this.refs.modalBody)).css('max-height', $(window).height() - 150); - } + }*/ } render() { @@ -41,7 +42,7 @@ export default class TeamMembersModal extends React.Component { return ( @@ -54,10 +55,8 @@ export default class TeamMembersModal extends React.Component { }} /> - -
    - -
    + + diff --git a/web/react/components/filtered_user_list.jsx b/web/react/components/filtered_user_list.jsx index dc8abd4c1..67e75af47 100644 --- a/web/react/components/filtered_user_list.jsx +++ b/web/react/components/filtered_user_list.jsx @@ -7,11 +7,11 @@ import {intlShape, injectIntl, defineMessages, FormattedMessage} from 'mm-intl'; const holders = defineMessages({ member: { - id: 'more_direct_channels.member', + id: 'filtered_user_list.member', defaultMessage: 'Member' }, search: { - id: 'more_direct_channels.search', + id: 'filtered_user_list.search', defaultMessage: 'Search members' } }); @@ -64,7 +64,7 @@ class FilteredUserList extends React.Component { if (users.length === this.props.users.length) { count = ( ); @@ -149,14 +149,14 @@ export default class TeamMembersDropdown extends React.Component { if (Utils.isSystemAdmin(user.roles)) { currentRoles = ( ); } else if (Utils.isAdmin(user.roles)) { currentRoles = ( ); @@ -173,7 +173,7 @@ export default class TeamMembersDropdown extends React.Component { if (user.delete_at > 0) { currentRoles = ( ); @@ -193,7 +193,7 @@ export default class TeamMembersDropdown extends React.Component { onClick={this.handleMakeAdmin} > @@ -211,7 +211,7 @@ export default class TeamMembersDropdown extends React.Component { onClick={this.handleMakeMember} > @@ -229,7 +229,7 @@ export default class TeamMembersDropdown extends React.Component { onClick={this.handleMakeActive} > @@ -247,7 +247,7 @@ export default class TeamMembersDropdown extends React.Component { onClick={this.handleMakeNotActive} > @@ -259,20 +259,20 @@ export default class TeamMembersDropdown extends React.Component { if (this.props.user.id === me.id) { const title = ( ); const message = (


    {serverError} @@ -281,7 +281,7 @@ export default class TeamMembersDropdown extends React.Component { const confirmButton = ( ); diff --git a/web/react/components/user_list.jsx b/web/react/components/user_list.jsx index e3c2ad08d..39453a827 100644 --- a/web/react/components/user_list.jsx +++ b/web/react/components/user_list.jsx @@ -24,7 +24,7 @@ export default class UserList extends React.Component { diff --git a/web/static/i18n/en.json b/web/static/i18n/en.json index dc4633594..0057b3f9a 100644 --- a/web/static/i18n/en.json +++ b/web/static/i18n/en.json @@ -544,6 +544,7 @@ "channel_info.notFound": "No Channel Found", "channel_info.purpose": "Channel Purpose:", "channel_info.url": "Channel URL:", + "channel_invite.add": " Add", "channel_invite.addNewMembers": "Add New Members to ", "channel_invite.close": "Close", "channel_loader.connection_error": "There appears to be a problem with your internet connection.", @@ -557,6 +558,7 @@ "channel_loader.wrote": " wrote: ", "channel_members_modal.addNew": " Add New Members", "channel_members_modal.close": "Close", + "channel_members_modal.removeMember": "Remove Member", "channel_memebers_modal.members": " Members", "channel_modal.cancel": "Cancel", "channel_modal.channel": "Channel", @@ -664,6 +666,10 @@ "file_upload.filesAbove": "Files above {max}MB could not be uploaded: {filenames}", "file_upload.limited": "Uploads limited to {count} files maximum. Please use additional posts for more files.", "file_upload.pasted": "Image Pasted at ", + "filtered_user_list.count": "{count} {member}", + "filtered_user_list.countTotal": "{count} {member} of {total} Total", + "filtered_user_list.member": "Member", + "filtered_user_list.search": "Search members", "find_team.email": "Email", "find_team.findDescription": "An email was sent with links to any teams to which you are a member.", "find_team.findTitle": "Find Your Team", @@ -761,23 +767,9 @@ "login_username.username": "Username", "login_username.usernameReq": "A username is required", "login_username.verifyEmailError": "Please verify your email address. Check your inbox for an email.", - "member_item.add": " Add", "member_item.makeAdmin": "Make Admin", "member_item.member": "Member", - "member_item.removeMember": "Remove Member", "member_list.noUsersAdd": "No users to add.", - "member_team_item.confirmDemoteDescription": "If you demote yourself from the System Admin role and there is not another user with System Admin privileges, you'll need to re-assign a System Admin by accessing the Mattermost server through a terminal and running the following command.", - "member_team_item.confirmDemoteRoleTitle": "Confirm demotion from System Admin role", - "member_team_item.confirmDemotion": "Confirm Demotion", - "member_team_item.confirmDemotionCmd": "platform -assign_role -team_name=\"yourteam\" -email=\"name@yourcompany.com\" -role=\"system_admin\"", - "member_team_item.inactive": "Inactive", - "member_team_item.makeActive": "Make Active", - "member_team_item.makeAdmin": "Make Team Admin", - "member_team_item.makeInactive": "Make Inactive", - "member_team_item.makeMember": "Make Member", - "member_team_item.member": "Member", - "member_team_item.systemAdmin": "System Admin", - "member_team_item.teamAdmin": "Team Admin", "members_popover.msg": "Message", "members_popover.title": "Members", "more_channels.close": "Close", @@ -787,12 +779,7 @@ "more_channels.noMore": "No more channels to join", "more_channels.title": "More Channels", "more_direct_channels.close": "Close", - "more_direct_channels.count": "{count} {member}", - "more_direct_channels.countTotal": "{count} {member} of {total} Total", - "more_direct_channels.member": "Member", "more_direct_channels.message": "Message", - "more_direct_channels.notFound": "No users found :(", - "more_direct_channels.search": "Search members", "more_direct_channels.title": "Direct Messages", "msg_typing.areTyping": "{users} and {last} are typing...", "msg_typing.isTyping": "{user} is typing...", @@ -994,6 +981,18 @@ "team_import_tab.summary": "View Summary", "team_member_modal.close": "Close", "team_member_modal.members": "{team} Members", + "team_members_dropdown.confirmDemoteDescription": "If you demote yourself from the System Admin role and there is not another user with System Admin privileges, you'll need to re-assign a System Admin by accessing the Mattermost server through a terminal and running the following command.", + "team_members_dropdown.confirmDemoteRoleTitle": "Confirm demotion from System Admin role", + "team_members_dropdown.confirmDemotion": "Confirm Demotion", + "team_members_dropdown.confirmDemotionCmd": "platform -assign_role -team_name=\"yourteam\" -email=\"name@yourcompany.com\" -role=\"system_admin\"", + "team_members_dropdown.inactive": "Inactive", + "team_members_dropdown.makeActive": "Make Active", + "team_members_dropdown.makeAdmin": "Make Team Admin", + "team_members_dropdown.makeInactive": "Make Inactive", + "team_members_dropdown.makeMember": "Make Member", + "team_members_dropdown.member": "Member", + "team_members_dropdown.systemAdmin": "System Admin", + "team_members_dropdown.teamAdmin": "Team Admin", "team_settings_modal.exportTab": "Export", "team_settings_modal.generalTab": "General", "team_settings_modal.importTab": "Import", @@ -1283,6 +1282,7 @@ "user.settings.security.switchGoogle": "Switch to using Google SSO", "user.settings.security.title": "Security Settings", "user.settings.security.viewHistory": "View Access History", + "user_list.notFound": "No users found :(", "user_profile.notShared": "Email not shared", "view_image.loading": "Loading ", "view_image_popover.download": "Download", diff --git a/web/static/i18n/es.json b/web/static/i18n/es.json index 026d8eec6..5b44b051e 100644 --- a/web/static/i18n/es.json +++ b/web/static/i18n/es.json @@ -544,6 +544,7 @@ "channel_info.notFound": "Canal no encontrado", "channel_info.purpose": "Propósito del Canal:", "channel_info.url": "URL del Canal:", + "channel_invite.add": " Agregar", "channel_invite.addNewMembers": "Agregar nuevos Miembros a ", "channel_invite.close": "Cerrar", "channel_loader.connection_error": "Parece haber un problema con tu conexión a internet.", @@ -557,6 +558,7 @@ "channel_loader.wrote": " escribió: ", "channel_members_modal.addNew": " Agregar nuevos Miembros", "channel_members_modal.close": "Cerrar", + "channel_members_modal.removeMember": "Elminar Miembro", "channel_memebers_modal.members": " Miembros", "channel_modal.cancel": "Cancelar", "channel_modal.channel": "Canal", @@ -664,6 +666,10 @@ "file_upload.filesAbove": "No se pueden subir archivos de más de {max}MB: {filenames}", "file_upload.limited": "Se pueden subir un máximo de {count} archivos. Por favor envía otros mensajes para adjuntar más archivos.", "file_upload.pasted": "Imagen Pegada el ", + "filtered_user_list.count": "{count} {member}", + "filtered_user_list.countTotal": "{count} {member} de {total} Total", + "filtered_user_list.member": "Miembro", + "filtered_user_list.search": "Buscar miembros", "find_team.email": "Correo electrónico", "find_team.findDescription": "Enviamos un correo electrónico con los equipos a los que perteneces.", "find_team.findTitle": "Encuentra tu equipo", @@ -761,23 +767,9 @@ "login_username.username": "Nombre de usuario", "login_username.usernameReq": "El nombre de usuario es obligatorio", "login_username.verifyEmailError": "Por favor válida tu dirección de correo electrónico. Te hemos enviado un correo, revisa tu bandeja de entrada.", - "member_item.add": " Agregar", "member_item.makeAdmin": "Convertir en Admin de Equipo", "member_item.member": "Miembro", - "member_item.removeMember": "Elminar Miembro", "member_list.noUsersAdd": "No hay usuarios que agregar.", - "member_team_item.confirmDemoteDescription": "Si te degradas a ti mismo de la función de Administrador de Sistema y no hay otro usuario con privilegios de Administrador de Sistema, tendrás que volver a asignar un Administrador del Sistema accediendo al servidor de Mattermost a través de un terminal y ejecutar el siguiente comando.", - "member_team_item.confirmDemoteRoleTitle": "Confirmar el decenso del rol de Administrador de Sistema", - "member_team_item.confirmDemotion": "Confirmar decenso", - "member_team_item.confirmDemotionCmd": "platform -assign_role -team_name=\"tuequipo\" -email=\"nombre@tuempresa.com\" -role=\"system_admin\"", - "member_team_item.inactive": "Inactivo", - "member_team_item.makeActive": "Activar", - "member_team_item.makeAdmin": "Convertir a Admin de Equipo", - "member_team_item.makeInactive": "Desactivar", - "member_team_item.makeMember": "Convertir en Miembro", - "member_team_item.member": "Miembro", - "member_team_item.systemAdmin": "Administrador de Sistema", - "member_team_item.teamAdmin": "Admin de Equipo", "members_popover.msg": "Mensaje", "members_popover.title": "Miembros", "more_channels.close": "Cerrar", @@ -787,12 +779,7 @@ "more_channels.noMore": "No hay más canales para unirse", "more_channels.title": "Más Canales", "more_direct_channels.close": "Cerrar", - "more_direct_channels.count": "{count} {member}", - "more_direct_channels.countTotal": "{count} {member} de {total} Total", - "more_direct_channels.member": "Miembro", "more_direct_channels.message": "Mensaje", - "more_direct_channels.notFound": "No se encontraron usuarios :(", - "more_direct_channels.search": "Buscar miembros", "more_direct_channels.title": "Mensajes Directos", "msg_typing.areTyping": "{users} y {last} están escribiendo...", "msg_typing.isTyping": "{user} está escribiendo...", @@ -994,6 +981,18 @@ "team_import_tab.summary": "Ver Resumen", "team_member_modal.close": "Cerrar", "team_member_modal.members": "{team} Miembros", + "team_members_modal.confirmDemoteDescription": "Si te degradas a ti mismo de la función de Administrador de Sistema y no hay otro usuario con privilegios de Administrador de Sistema, tendrás que volver a asignar un Administrador del Sistema accediendo al servidor de Mattermost a través de un terminal y ejecutar el siguiente comando.", + "team_members_modal.confirmDemoteRoleTitle": "Confirmar el decenso del rol de Administrador de Sistema", + "team_members_modal.confirmDemotion": "Confirmar decenso", + "team_members_modal.confirmDemotionCmd": "platform -assign_role -team_name=\"tuequipo\" -email=\"nombre@tuempresa.com\" -role=\"system_admin\"", + "team_members_modal.inactive": "Inactivo", + "team_members_modal.makeActive": "Activar", + "team_members_modal.makeAdmin": "Convertir a Admin de Equipo", + "team_members_modal.makeInactive": "Desactivar", + "team_members_modal.makeMember": "Convertir en Miembro", + "team_members_modal.member": "Miembro", + "team_members_modal.systemAdmin": "Administrador de Sistema", + "team_members_modal.teamAdmin": "Admin de Equipo", "team_settings_modal.exportTab": "Exportar", "team_settings_modal.generalTab": "General", "team_settings_modal.importTab": "Importar", @@ -1283,6 +1282,7 @@ "user.settings.security.switchGoogle": "Cambiar para utilizar Google SSO", "user.settings.security.title": "Configuración de Seguridad", "user.settings.security.viewHistory": "Visualizar historial de acceso", + "user_list.notFound": "No se encontraron usuarios :(", "user_profile.notShared": "Correo no compartido", "view_image.loading": "Cargando ", "view_image_popover.download": "Descargar", diff --git a/web/static/i18n/pt.json b/web/static/i18n/pt.json index 1088c961c..0ae0ddbe5 100644 --- a/web/static/i18n/pt.json +++ b/web/static/i18n/pt.json @@ -544,6 +544,7 @@ "channel_info.notFound": "Nenhum Canal Encontrado", "channel_info.purpose": "Propósito do Canal:", "channel_info.url": "URL do Canal:", + "channel_invite.add": " Adicionar", "channel_invite.addNewMembers": "Adicionar Novo Membro para ", "channel_invite.close": "Fechar", "channel_loader.posted": "Postado", @@ -557,6 +558,7 @@ "channel_loader.unknown_error": "Recebido um código de status inesperado do servidor.", "channel_members_modal.addNew": " Adicionar Novos Membros", "channel_members_modal.close": "Fechar", + "channel_members_modal.removeMember": "Remover Membro", "channel_memebers_modal.members": " Membros", "channel_modal.cancel": "Cancelar", "channel_modal.channel": "Canal", @@ -664,6 +666,10 @@ "file_upload.filesAbove": "Arquivos acima {max}MB não podem ser enviados: {filenames}", "file_upload.limited": "Limite máximo de uploads de {count} arquivos. Por favor use um post adicional para mais arquivos.", "file_upload.pasted": "Imagem Colada em ", + "filtered_user_list.count": "{count} {member}", + "filtered_user_list.countTotal": "{count} {member} de {total} Total", + "filtered_user_list.message": "Mensagem", + "filtered_user_list.search": "Procurar membros", "find_team.email": "E-mail", "find_team.findDescription": "Foi enviado um e-mail com links para todas as equipes do qual você é membro.", "find_team.findTitle": "Encontre Sua Equipe", @@ -761,23 +767,8 @@ "login_username.username": "Usuário", "login_username.usernameReq": "Um nome de usuário é necessário", "login_username.verifyEmailError": "Por favor verifique seu endereço de email. Verifique por um email na sua caixa de entrada.", - "member_item.add": " Adicionar", "member_item.makeAdmin": "Tornar Admin", "member_item.member": "Membro", - "member_item.removeMember": "Remover Membro", - "member_list.noUsersAdd": "Nenhum usuário para adicionar.", - "member_team_item.confirmDemoteDescription": "Se você rebaixar você mesmo de Admin de Sistema e não exista outro usuário como privilegios de Admin de Sistema, você precisa-rá re-inscrever um Admin de Sistema acessando o servidor Mattermost através do terminal e executando o seguinte comando.", - "member_team_item.confirmDemoteRoleTitle": "Confirmar o rebaixamento de Admin Sistema", - "member_team_item.confirmDemotion": "Confirmar Rebaixamento", - "member_team_item.confirmDemotionCmd": "platform -assign_role -team_name=\"yourteam\" -email=\"name@yourcompany.com\" -role=\"system_admin\"", - "member_team_item.inactive": "Inativo", - "member_team_item.makeActive": "Tornar Ativo", - "member_team_item.makeAdmin": "Tornar Admin de Equipe", - "member_team_item.makeInactive": "Tornar Inativo", - "member_team_item.makeMember": "Tornar Membro", - "member_team_item.member": "Membro", - "member_team_item.systemAdmin": "Admin do Sistema", - "member_team_item.teamAdmin": "Admin Equipe", "members_popover.msg": "Mensagem", "members_popover.title": "Membros", "more_channels.close": "Fechar", @@ -787,12 +778,7 @@ "more_channels.noMore": "Não há mais canais para participar", "more_channels.title": "Mais Canais", "more_direct_channels.close": "Fechar", - "more_direct_channels.count": "{count} {member}", - "more_direct_channels.countTotal": "{count} {member} de {total} Total", "more_direct_channels.member": "Membro", - "more_direct_channels.message": "Mensagem", - "more_direct_channels.notFound": "Nenhum usuário encontrado :(", - "more_direct_channels.search": "Procurar membros", "more_direct_channels.title": "Mensagens Diretas", "msg_typing.areTyping": "{users} e {last} estão digitando...", "msg_typing.isTyping": "{user} está digitando...", @@ -994,6 +980,18 @@ "team_import_tab.summary": "Ver Resumo", "team_member_modal.close": "Fechar", "team_member_modal.members": "{team} Membros", + "team_members_dropdown.confirmDemoteDescription": "Se você rebaixar você mesmo de Admin de Sistema e não exista outro usuário como privilegios de Admin de Sistema, você precisa-rá re-inscrever um Admin de Sistema acessando o servidor Mattermost através do terminal e executando o seguinte comando.", + "team_members_dropdown.confirmDemoteRoleTitle": "Confirmar o rebaixamento de Admin Sistema", + "team_members_dropdown.confirmDemotion": "Confirmar Rebaixamento", + "team_members_dropdown.confirmDemotionCmd": "platform -assign_role -team_name=\"yourteam\" -email=\"name@yourcompany.com\" -role=\"system_admin\"", + "team_members_dropdown.inactive": "Inativo", + "team_members_dropdown.makeActive": "Tornar Ativo", + "team_members_dropdown.makeAdmin": "Tornar Admin de Equipe", + "team_members_dropdown.makeInactive": "Tornar Inativo", + "team_members_dropdown.makeMember": "Tornar Membro", + "team_members_dropdown.member": "Membro", + "team_members_dropdown.systemAdmin": "Admin do Sistema", + "team_members_dropdown.teamAdmin": "Admin Equipe", "team_settings_modal.exportTab": "Exportar", "team_settings_modal.generalTab": "Geral", "team_settings_modal.importTab": "Importar", @@ -1283,9 +1281,10 @@ "user.settings.security.switchGoogle": "Trocar para usar Google SSO", "user.settings.security.title": "Configurações de Segurança", "user.settings.security.viewHistory": "Ver Histórico de Acesso", + "user_list.notFound": "Nenhum usuário encontrado :(", "user_profile.notShared": "E-mail não compartilhado", "view_image.loading": "Carregando ", "view_image_popover.download": "Download", "view_image_popover.file": "Arquivo {count} de {total}", "view_image_popover.publicLink": "Obter O Link Público" -} \ No newline at end of file +} -- cgit v1.2.3-1-g7c22 From 366bc4fd575cca2d5b1a48a6f05008d1fdcd4b87 Mon Sep 17 00:00:00 2001 From: hmhealey Date: Wed, 2 Mar 2016 12:08:55 -0500 Subject: Fixed '0 of X users' in FilteredUserList and cleaned up pluralization of 'member' --- web/react/components/filtered_user_list.jsx | 19 +++++++++---------- web/static/i18n/en.json | 4 ++-- web/static/i18n/es.json | 4 ++-- web/static/i18n/pt.json | 4 ++-- 4 files changed, 15 insertions(+), 16 deletions(-) diff --git a/web/react/components/filtered_user_list.jsx b/web/react/components/filtered_user_list.jsx index 67e75af47..7099f99af 100644 --- a/web/react/components/filtered_user_list.jsx +++ b/web/react/components/filtered_user_list.jsx @@ -55,20 +55,17 @@ class FilteredUserList extends React.Component { }); } - let memberString = formatMessage(holders.member); - if (users.length !== 1) { - memberString += 's'; - } - let count; if (users.length === this.props.users.length) { count = ( ); @@ -76,10 +73,12 @@ class FilteredUserList extends React.Component { count = ( diff --git a/web/static/i18n/en.json b/web/static/i18n/en.json index 0057b3f9a..0f5aca0c8 100644 --- a/web/static/i18n/en.json +++ b/web/static/i18n/en.json @@ -666,8 +666,8 @@ "file_upload.filesAbove": "Files above {max}MB could not be uploaded: {filenames}", "file_upload.limited": "Uploads limited to {count} files maximum. Please use additional posts for more files.", "file_upload.pasted": "Image Pasted at ", - "filtered_user_list.count": "{count} {member}", - "filtered_user_list.countTotal": "{count} {member} of {total} Total", + "filtered_user_list.count": "{count, number} {count, plural, one {member} other {members}}", + "filtered_user_list.countTotal": "{count, number} {count, plural, one {member} other {members}} of {total} Total", "filtered_user_list.member": "Member", "filtered_user_list.search": "Search members", "find_team.email": "Email", diff --git a/web/static/i18n/es.json b/web/static/i18n/es.json index 5b44b051e..10a389438 100644 --- a/web/static/i18n/es.json +++ b/web/static/i18n/es.json @@ -666,8 +666,8 @@ "file_upload.filesAbove": "No se pueden subir archivos de más de {max}MB: {filenames}", "file_upload.limited": "Se pueden subir un máximo de {count} archivos. Por favor envía otros mensajes para adjuntar más archivos.", "file_upload.pasted": "Imagen Pegada el ", - "filtered_user_list.count": "{count} {member}", - "filtered_user_list.countTotal": "{count} {member} de {total} Total", + "filtered_user_list.count": "{count, number} {count, plural, one {Miembro} other {Miembros}}", + "filtered_user_list.countTotal": "{count, number} {count, plural, one {Miembro} other {Miembros}} de {total} Total", "filtered_user_list.member": "Miembro", "filtered_user_list.search": "Buscar miembros", "find_team.email": "Correo electrónico", diff --git a/web/static/i18n/pt.json b/web/static/i18n/pt.json index 0ae0ddbe5..6c56526b3 100644 --- a/web/static/i18n/pt.json +++ b/web/static/i18n/pt.json @@ -666,8 +666,8 @@ "file_upload.filesAbove": "Arquivos acima {max}MB não podem ser enviados: {filenames}", "file_upload.limited": "Limite máximo de uploads de {count} arquivos. Por favor use um post adicional para mais arquivos.", "file_upload.pasted": "Imagem Colada em ", - "filtered_user_list.count": "{count} {member}", - "filtered_user_list.countTotal": "{count} {member} de {total} Total", + "filtered_user_list.count": "{count, number} {count, plural, one {Mensagem} other {Mensagems}}", + "filtered_user_list.countTotal": "{count, number} {count, plural, one {Mensagem} other {Mensagems}} de {total} Total", "filtered_user_list.message": "Mensagem", "filtered_user_list.search": "Procurar membros", "find_team.email": "E-mail", -- cgit v1.2.3-1-g7c22 From c2eab07be058d45b586dc4a36546ef0ba8f22792 Mon Sep 17 00:00:00 2001 From: hmhealey Date: Wed, 2 Mar 2016 12:30:28 -0500 Subject: Fixed localization issues with ChannelMembersModal --- web/react/components/channel_members_modal.jsx | 2 +- web/static/i18n/en.json | 1 - web/static/i18n/es.json | 1 - web/static/i18n/pt.json | 7 +++---- 4 files changed, 4 insertions(+), 7 deletions(-) diff --git a/web/react/components/channel_members_modal.jsx b/web/react/components/channel_members_modal.jsx index 9c40d93e0..51f36a4f2 100644 --- a/web/react/components/channel_members_modal.jsx +++ b/web/react/components/channel_members_modal.jsx @@ -141,7 +141,7 @@ export default class ChannelMembersModal extends React.Component { onClick={this.handleRemove.bind(this, user)} > diff --git a/web/static/i18n/en.json b/web/static/i18n/en.json index 0f5aca0c8..a80aba130 100644 --- a/web/static/i18n/en.json +++ b/web/static/i18n/en.json @@ -668,7 +668,6 @@ "file_upload.pasted": "Image Pasted at ", "filtered_user_list.count": "{count, number} {count, plural, one {member} other {members}}", "filtered_user_list.countTotal": "{count, number} {count, plural, one {member} other {members}} of {total} Total", - "filtered_user_list.member": "Member", "filtered_user_list.search": "Search members", "find_team.email": "Email", "find_team.findDescription": "An email was sent with links to any teams to which you are a member.", diff --git a/web/static/i18n/es.json b/web/static/i18n/es.json index 10a389438..573cc200f 100644 --- a/web/static/i18n/es.json +++ b/web/static/i18n/es.json @@ -668,7 +668,6 @@ "file_upload.pasted": "Imagen Pegada el ", "filtered_user_list.count": "{count, number} {count, plural, one {Miembro} other {Miembros}}", "filtered_user_list.countTotal": "{count, number} {count, plural, one {Miembro} other {Miembros}} de {total} Total", - "filtered_user_list.member": "Miembro", "filtered_user_list.search": "Buscar miembros", "find_team.email": "Correo electrónico", "find_team.findDescription": "Enviamos un correo electrónico con los equipos a los que perteneces.", diff --git a/web/static/i18n/pt.json b/web/static/i18n/pt.json index 6c56526b3..741602017 100644 --- a/web/static/i18n/pt.json +++ b/web/static/i18n/pt.json @@ -666,9 +666,8 @@ "file_upload.filesAbove": "Arquivos acima {max}MB não podem ser enviados: {filenames}", "file_upload.limited": "Limite máximo de uploads de {count} arquivos. Por favor use um post adicional para mais arquivos.", "file_upload.pasted": "Imagem Colada em ", - "filtered_user_list.count": "{count, number} {count, plural, one {Mensagem} other {Mensagems}}", - "filtered_user_list.countTotal": "{count, number} {count, plural, one {Mensagem} other {Mensagems}} de {total} Total", - "filtered_user_list.message": "Mensagem", + "filtered_user_list.count": "{count, number} {count, plural, one {Membro} other {Membros}}", + "filtered_user_list.countTotal": "{count, number} {count, plural, one {Membro} other {Membros}} de {total} Total", "filtered_user_list.search": "Procurar membros", "find_team.email": "E-mail", "find_team.findDescription": "Foi enviado um e-mail com links para todas as equipes do qual você é membro.", @@ -778,7 +777,7 @@ "more_channels.noMore": "Não há mais canais para participar", "more_channels.title": "Mais Canais", "more_direct_channels.close": "Fechar", - "more_direct_channels.member": "Membro", + "more_direct_channels.message": "Mensagem", "more_direct_channels.title": "Mensagens Diretas", "msg_typing.areTyping": "{users} e {last} estão digitando...", "msg_typing.isTyping": "{user} está digitando...", -- cgit v1.2.3-1-g7c22 From 62c09209430e74fb0863cd998497f6ef1c475342 Mon Sep 17 00:00:00 2001 From: hmhealey Date: Wed, 2 Mar 2016 16:10:14 -0500 Subject: Fixed max height for all modals using FilteredUserLists --- web/react/components/channel_invite_modal.jsx | 28 +++++++------------- web/react/components/channel_members_modal.jsx | 23 +++++----------- web/react/components/filtered_user_list.jsx | 12 +++++++-- web/react/components/member_list_team.jsx | 5 ++++ web/react/components/more_direct_channels.jsx | 23 +++++----------- web/react/components/team_members_modal.jsx | 36 +++++--------------------- web/sass-files/sass/partials/_modal.scss | 17 ++++++++++-- 7 files changed, 59 insertions(+), 85 deletions(-) diff --git a/web/react/components/channel_invite_modal.jsx b/web/react/components/channel_invite_modal.jsx index f0c8a9030..6c8d51abb 100644 --- a/web/react/components/channel_invite_modal.jsx +++ b/web/react/components/channel_invite_modal.jsx @@ -25,7 +25,9 @@ export default class ChannelInviteModal extends React.Component { this.createInviteButton = this.createInviteButton.bind(this); // the state gets populated when the modal is shown - this.state = {}; + this.state = { + loading: true + }; } shouldComponentUpdate(nextProps, nextState) { if (!this.props.show && !nextProps.show) { @@ -79,20 +81,6 @@ export default class ChannelInviteModal extends React.Component { loading: false }; } - onShow() { - // TODO ugh - /*if ($(window).width() > 768) { - $(ReactDOM.findDOMNode(this.refs.modalBody)).perfectScrollbar(); - $(ReactDOM.findDOMNode(this.refs.modalBody)).css('max-height', $(window).height() - 200); - } else { - $(ReactDOM.findDOMNode(this.refs.modalBody)).css('max-height', $(window).height() - 150); - }*/ - } - componentDidUpdate(prevProps) { - if (this.props.show && !prevProps.show) { - this.onShow(); - } - } componentWillReceiveProps(nextProps) { if (!this.props.show && nextProps.show) { ChannelStore.addExtraInfoChangeListener(this.onListenerChange); @@ -152,8 +140,14 @@ export default class ChannelInviteModal extends React.Component { if (this.state.loading) { content = (); } else { + let maxHeight = 1000; + if (Utils.windowHeight() <= 1200) { + maxHeight = Utils.windowHeight() - 300; + } + content = ( @@ -175,9 +169,7 @@ export default class ChannelInviteModal extends React.Component { {this.props.channel.display_name} - + {inviteError} {content} diff --git a/web/react/components/channel_members_modal.jsx b/web/react/components/channel_members_modal.jsx index 51f36a4f2..688ab7dd2 100644 --- a/web/react/components/channel_members_modal.jsx +++ b/web/react/components/channel_members_modal.jsx @@ -75,17 +75,6 @@ export default class ChannelMembersModal extends React.Component { loading: false }; } - onShow() { - // TODO ugh - if ($(window).width() > 768) { - $(ReactDOM.findDOMNode(this.refs.modalBody)).perfectScrollbar(); - } - } - componentDidUpdate(prevProps) { - if (this.props.show && !prevProps.show) { - this.onShow(); - } - } componentWillReceiveProps(nextProps) { if (!this.props.show && nextProps.show) { ChannelStore.addExtraInfoChangeListener(this.onChange); @@ -148,17 +137,18 @@ export default class ChannelMembersModal extends React.Component { ); } render() { - var maxHeight = 1000; - if (Utils.windowHeight() <= 1200) { - maxHeight = Utils.windowHeight() - 300; - } - let content; if (this.state.loading) { content = (); } else { + let maxHeight = 1000; + if (Utils.windowHeight() <= 1200) { + maxHeight = Utils.windowHeight() - 300; + } + content = ( @@ -197,7 +187,6 @@ export default class ChannelMembersModal extends React.Component { {content} diff --git a/web/react/components/filtered_user_list.jsx b/web/react/components/filtered_user_list.jsx index 7099f99af..ffd6ebf53 100644 --- a/web/react/components/filtered_user_list.jsx +++ b/web/react/components/filtered_user_list.jsx @@ -27,6 +27,10 @@ class FilteredUserList extends React.Component { }; } + componentDidMount() { + $(ReactDOM.findDOMNode(this.refs.userList)).perfectScrollbar(); + } + componentDidUpdate(prevProps, prevState) { if (prevState.filter !== this.state.filter) { $(ReactDOM.findDOMNode(this.refs.userList)).scrollTop(0); @@ -86,7 +90,10 @@ class FilteredUserList extends React.Component { } return ( -
    +
    ); } } + +MemberListTeam.propTypes = { + style: React.PropTypes.object +}; diff --git a/web/react/components/more_direct_channels.jsx b/web/react/components/more_direct_channels.jsx index c85b5e9c5..0814ac1b3 100644 --- a/web/react/components/more_direct_channels.jsx +++ b/web/react/components/more_direct_channels.jsx @@ -48,23 +48,6 @@ export default class MoreDirectChannels extends React.Component { UserStore.removeChangeListener(this.handleUserChange); } - componentDidUpdate(prevProps) { - if (!prevProps.show && this.props.show) { - this.onShow(); - } - } - - onShow() { - // TODO ugh - /*if (Utils.isMobile()) { - $(ReactDOM.findDOMNode(this.refs.modal)).css('max-height', $(window).height() - 250); - } else { - console.log(ReactDOM.findDOMNode(this.refs.modal)); - console.log($(ReactDOM.findDOMNode(this.refs.modal))); - $(ReactDOM.findDOMNode(this.refs.modal)).css('max-height', $(window).height() - 300); - }*/ - } - handleHide() { if (this.props.onModalDismissed) { this.props.onModalDismissed(); @@ -121,6 +104,11 @@ export default class MoreDirectChannels extends React.Component { } render() { + let maxHeight = 1000; + if (Utils.windowHeight() <= 1200) { + maxHeight = Utils.windowHeight() - 300; + } + return ( diff --git a/web/react/components/team_members_modal.jsx b/web/react/components/team_members_modal.jsx index dfd48b614..9bdb16438 100644 --- a/web/react/components/team_members_modal.jsx +++ b/web/react/components/team_members_modal.jsx @@ -3,43 +3,21 @@ import MemberListTeam from './member_list_team.jsx'; import TeamStore from '../stores/team_store.jsx'; +import * as Utils from '../utils/utils.jsx'; import {FormattedMessage} from 'mm-intl'; const Modal = ReactBootstrap.Modal; export default class TeamMembersModal extends React.Component { - constructor(props) { - super(props); - - this.onShow = this.onShow.bind(this); - } - - componentDidMount() { - if (this.props.show) { - this.onShow(); - } - } - - componentDidUpdate(prevProps) { - if (this.props.show && !prevProps.show) { - this.onShow(); - } - } - - onShow() { - // TODO ugh - /*if ($(window).width() > 768) { - $(ReactDOM.findDOMNode(this.refs.modalBody)).perfectScrollbar(); - $(ReactDOM.findDOMNode(this.refs.modalBody)).css('max-height', $(window).height() - 200); - } else { - $(ReactDOM.findDOMNode(this.refs.modalBody)).css('max-height', $(window).height() - 150); - }*/ - } - render() { const team = TeamStore.getCurrent(); + let maxHeight = 1000; + if (Utils.windowHeight() <= 1200) { + maxHeight = Utils.windowHeight() - 300; + } + return ( - +