diff --git a/components/sidebar/sidebar_category/sidebar_category_menu/__snapshots__/sidebar_category_menu.test.tsx.snap b/components/sidebar/sidebar_category/sidebar_category_menu/__snapshots__/sidebar_category_menu.test.tsx.snap index 2fa2970526d0..4c2265e877f3 100644 --- a/components/sidebar/sidebar_category/sidebar_category_menu/__snapshots__/sidebar_category_menu.test.tsx.snap +++ b/components/sidebar/sidebar_category/sidebar_category_menu/__snapshots__/sidebar_category_menu.test.tsx.snap @@ -8,6 +8,7 @@ exports[`components/sidebar/sidebar_category/sidebar_category_menu should match id="SidebarCategoryMenu-category1" isMenuOpen={false} onToggleMenu={[Function]} + refCallback={[Function]} tooltipText="Category options" > @@ -46,6 +47,45 @@ exports[`components/sidebar/sidebar_category/sidebar_category_menu should match text="Delete Category" /> + + + } + id="sortChannels" + openUp={false} + selectedValueText="Alphabetically" + show={true} + styleSelectableItem={true} + subMenu={ + Array [ + Object { + "action": [Function], + "direction": "right", + "id": "sortAlphabetical", + "text": "Alphabetically", + }, + Object { + "action": [Function], + "direction": "right", + "id": "sortByMostRecent", + "text": "Recent Activity", + }, + Object { + "action": [Function], + "direction": "right", + "id": "sortManual", + "text": "Manually", + }, + ] + } + text="Sort" + xOffset={0} + /> + @@ -86,6 +127,45 @@ exports[`components/sidebar/sidebar_category/sidebar_category_menu should match text="Mute Category" /> + + + } + id="sortChannels" + openUp={false} + selectedValueText="Alphabetically" + show={true} + styleSelectableItem={true} + subMenu={ + Array [ + Object { + "action": [Function], + "direction": "right", + "id": "sortAlphabetical", + "text": "Alphabetically", + }, + Object { + "action": [Function], + "direction": "right", + "id": "sortByMostRecent", + "text": "Recent Activity", + }, + Object { + "action": [Function], + "direction": "right", + "id": "sortManual", + "text": "Manually", + }, + ] + } + text="Sort" + xOffset={0} + /> + ; setCategoryMuted: (categoryId: string, muted: boolean) => Promise; + setCategorySorting: (categoryId: string, sorting: CategorySorting) => void; } function mapDispatchToProps(dispatch: Dispatch) { @@ -35,6 +37,7 @@ function mapDispatchToProps(dispatch: Dispatch) { actions: bindActionCreators, Actions>({ openModal, setCategoryMuted, + setCategorySorting, }, dispatch), }; } diff --git a/components/sidebar/sidebar_category/sidebar_category_menu/sidebar_category_menu.test.tsx b/components/sidebar/sidebar_category/sidebar_category_menu/sidebar_category_menu.test.tsx index 98635b45d5af..1588290f6c23 100644 --- a/components/sidebar/sidebar_category/sidebar_category_menu/sidebar_category_menu.test.tsx +++ b/components/sidebar/sidebar_category/sidebar_category_menu/sidebar_category_menu.test.tsx @@ -29,6 +29,7 @@ describe('components/sidebar/sidebar_category/sidebar_category_menu', () => { actions: { openModal: jest.fn(), setCategoryMuted: jest.fn(), + setCategorySorting: jest.fn(), }, }; diff --git a/components/sidebar/sidebar_category/sidebar_category_menu/sidebar_category_menu.tsx b/components/sidebar/sidebar_category/sidebar_category_menu/sidebar_category_menu.tsx index 15f2c895f6d0..6d952461b287 100644 --- a/components/sidebar/sidebar_category/sidebar_category_menu/sidebar_category_menu.tsx +++ b/components/sidebar/sidebar_category/sidebar_category_menu/sidebar_category_menu.tsx @@ -5,14 +5,16 @@ import React from 'react'; import {IntlShape, injectIntl} from 'react-intl'; import {CategoryTypes} from 'mattermost-redux/constants/channel_categories'; -import {ChannelCategory} from 'mattermost-redux/types/channel_categories'; +import {ChannelCategory, CategorySorting} from 'mattermost-redux/types/channel_categories'; import {trackEvent} from 'actions/telemetry_actions'; import DeleteCategoryModal from 'components/delete_category_modal'; import EditCategoryModal from 'components/edit_category_modal'; import SidebarMenu from 'components/sidebar/sidebar_menu'; +import SidebarMenuType from 'components/sidebar/sidebar_menu/sidebar_menu'; import Menu from 'components/widgets/menu/menu'; import {ModalIdentifiers} from 'utils/constants'; +import {Props as SubmenuItemProps} from 'components/widgets/menu/menu_items/submenu_item'; type Props = { currentTeamId: string; @@ -25,11 +27,14 @@ type Props = { data: boolean; }>; setCategoryMuted: (categoryId: string, muted: boolean) => Promise; + setCategorySorting: (categoryId: string, sorting: CategorySorting) => void; }; }; type State = { showDeleteCategoryModal: boolean; + openUp: boolean; + width: number; } class SidebarCategoryMenu extends React.PureComponent { @@ -38,6 +43,8 @@ class SidebarCategoryMenu extends React.PureComponent { this.state = { showDeleteCategoryModal: false, + openUp: false, + width: 0, }; } @@ -74,6 +81,13 @@ class SidebarCategoryMenu extends React.PureComponent { trackEvent('ui', 'ui_sidebar_category_menu_createCategory'); } + handleSortChannels = (sorting: CategorySorting) => { + const {category} = this.props; + + this.props.actions.setCategorySorting(category.id, sorting); + trackEvent('ui', `ui_sidebar_sort_dm_${sorting}`); + } + onToggleMenu = (open: boolean) => { this.props.onToggleMenu(open); @@ -104,6 +118,25 @@ class SidebarCategoryMenu extends React.PureComponent { ); } + const sortMenuItems: SubmenuItemProps[] = [{ + id: 'sortAlphabetical', + direction: 'right' as any, + text: intl.formatMessage({id: 'user.settings.sidebar.sortAlpha', defaultMessage: 'Alphabetically'}), + action: () => this.handleSortChannels(CategorySorting.Alphabetical), + }, + { + id: 'sortByMostRecent', + direction: 'right' as any, + text: intl.formatMessage({id: 'sidebar.sortedByRecencyLabel', defaultMessage: 'Recent Activity'}), + action: () => this.handleSortChannels(CategorySorting.Recency), + }, + { + id: 'sortManual', + direction: 'right' as any, + text: intl.formatMessage({id: 'sidebar.sortedManually', defaultMessage: 'Manually'}), + action: () => this.handleSortChannels(CategorySorting.Manual), + }]; + let deleteCategory; let renameCategory; if (category.type === CategoryTypes.CUSTOM) { @@ -127,6 +160,32 @@ class SidebarCategoryMenu extends React.PureComponent { ); } + let selectedValueText; + + switch (category.sorting) { + case CategorySorting.Alphabetical: + selectedValueText = intl.formatMessage({id: 'user.settings.sidebar.sortAlpha', defaultMessage: 'Alphabetically'}); + break; + case CategorySorting.Recency: + selectedValueText = intl.formatMessage({id: 'user.settings.sidebar.recent', defaultMessage: 'Recent Activity'}); + break; + default: + selectedValueText = intl.formatMessage({id: 'sidebar.sortedManually', defaultMessage: 'Manually'}); + } + + let icon; + + switch (category.sorting) { + case CategorySorting.Alphabetical: + icon = ; + break; + case CategorySorting.Recency: + icon = ; + break; + default: + icon = ; + } + return ( @@ -134,6 +193,19 @@ class SidebarCategoryMenu extends React.PureComponent { {renameCategory} {deleteCategory} + + + { ); } + refCallback = (ref: SidebarMenuType) => { + if (ref) { + this.setState({ + openUp: ref.state.openUp, + width: ref.state.width, + }); + } + } + render() { const {intl, category} = this.props; return (