diff --git a/app/javascript/gabsocial/components/home_column_header.js b/app/javascript/gabsocial/components/home_column_header.js index 34a1488f..60b3bbd9 100644 --- a/app/javascript/gabsocial/components/home_column_header.js +++ b/app/javascript/gabsocial/components/home_column_header.js @@ -1,20 +1,39 @@ 'use strict'; import React from 'react'; +import { connect } from 'react-redux'; import PropTypes from 'prop-types'; +import ImmutablePropTypes from 'react-immutable-proptypes'; import classNames from 'classnames'; import { FormattedMessage, injectIntl, defineMessages } from 'react-intl'; import { Link } from 'react-router-dom'; import Icon from 'gabsocial/components/icon'; +import { me } from 'gabsocial/initial_state'; +import { fetchLists } from 'gabsocial/actions/lists'; +import { createSelector } from 'reselect'; const messages = defineMessages({ show: { id: 'column_header.show_settings', defaultMessage: 'Show settings' }, hide: { id: 'column_header.hide_settings', defaultMessage: 'Hide settings' }, homeTitle: { id: 'home_column_header.home', defaultMessage: 'Home' }, allTitle: { id: 'home_column_header.all', defaultMessage: 'All' }, + listTitle: { id: 'home_column.lists', defaultMessage: 'Lists' }, }); -export default @injectIntl +const getOrderedLists = createSelector([state => state.get('lists')], lists => { + if (!lists) { + return lists; + } + + return lists.toList().filter(item => !!item).sort((a, b) => a.get('title').localeCompare(b.get('title'))); +}); + +const mapStateToProps = state => { + return { + lists: getOrderedLists(state), + }; +}; + class ColumnHeader extends React.PureComponent { static contextTypes = { @@ -23,16 +42,24 @@ class ColumnHeader extends React.PureComponent { static propTypes = { intl: PropTypes.object.isRequired, + dispatch: PropTypes.func.isRequired, active: PropTypes.bool, children: PropTypes.node, activeItem: PropTypes.string, + activeSubItem: PropTypes.string, + lists: ImmutablePropTypes.list, }; state = { collapsed: true, animating: false, + expandedFor: null, //lists, groups, etc. }; + componentDidMount() { + this.props.dispatch(fetchLists()); + } + handleToggleClick = (e) => { e.stopPropagation(); this.setState({ collapsed: !this.state.collapsed, animating: true }); @@ -42,9 +69,15 @@ class ColumnHeader extends React.PureComponent { this.setState({ animating: false }); } + expandLists = () => { + this.setState({ + expandedFor: 'lists', + }); + } + render () { - const { active, children, intl: { formatMessage }, activeItem } = this.props; - const { collapsed, animating } = this.state; + const { active, children, intl: { formatMessage }, activeItem, activeSubItem, lists } = this.props; + const { collapsed, animating, expandedFor } = this.state; const wrapperClassName = classNames('column-header__wrapper', { 'active': active, @@ -63,6 +96,10 @@ class ColumnHeader extends React.PureComponent { 'active': !collapsed, }); + const expansionClassName = classNames('column-header column-header__expansion', { + 'open': expandedFor, + }); + let extraContent, collapseButton; if (children) { @@ -79,6 +116,23 @@ class ColumnHeader extends React.PureComponent { extraContent, ]; + let expandedContent = null; + if ((expandedFor === 'lists' || activeItem === 'lists') && lists) { + expandedContent = lists.map(list => + + {list.get('title')} + + ) + } + return (

@@ -92,11 +146,25 @@ class ColumnHeader extends React.PureComponent { {formatMessage(messages.allTitle)} + { + + + {formatMessage(messages.listTitle)} + + } +
{collapseButton}

+ { + expandedContent && +

+ {expandedContent} +

+ } +
{(!collapsed || animating) && collapsedContent} @@ -105,5 +173,6 @@ class ColumnHeader extends React.PureComponent {
); } - } + +export default injectIntl(connect(mapStateToProps)(ColumnHeader)); diff --git a/app/javascript/gabsocial/features/home_timeline/index.js b/app/javascript/gabsocial/features/home_timeline/index.js index 1448d44f..91beee39 100644 --- a/app/javascript/gabsocial/features/home_timeline/index.js +++ b/app/javascript/gabsocial/features/home_timeline/index.js @@ -70,10 +70,7 @@ class HomeTimeline extends React.PureComponent { return ( - + - +
-
-
-
+
+ + + + + +
+ - - + + diff --git a/app/javascript/styles/gabsocial/components.scss b/app/javascript/styles/gabsocial/components.scss index 8ee1c6f2..2edecdb0 100644 --- a/app/javascript/styles/gabsocial/components.scss +++ b/app/javascript/styles/gabsocial/components.scss @@ -2495,11 +2495,14 @@ a.status-card.compact:hover { background: transparent; font: inherit; text-align: left; - text-overflow: ellipsis; text-decoration: none; - overflow: hidden; white-space: nowrap; + &--sub { + font-size: 14px; + padding: 6px 10px; + } + &.grouped { margin: 6px; } @@ -2597,6 +2600,13 @@ a.status-card.compact:hover { } .column-header__setting-btn { + &--link { + text-decoration: none; + + .fa { + margin-left: 10px; + } + } &:hover { color: $darker-text-color; text-decoration: underline; @@ -2615,6 +2625,12 @@ a.status-card.compact:hover { } } +.column-header__expansion { + overflow-x: scroll; + overflow-y: hidden; + white-space: nowrap; +} + .text-btn { display: inline-block; padding: 0;