From fedd7a75fee2c84b9beab085e0eca2f86e8d3eeb Mon Sep 17 00:00:00 2001 From: Jack Reed <phillipjreed@gmail.com> Date: Mon, 20 Apr 2020 18:09:07 -0600 Subject: [PATCH] Setup CompanionArea drawer to be positioned on the right by default in RTL viewing --- __tests__/src/components/CompanionArea.test.js | 17 +++++++++++++++++ __tests__/src/components/WindowSideBar.test.js | 10 ++++++++++ src/components/CompanionArea.js | 9 ++++++--- src/components/WindowSideBar.js | 9 +++++---- src/containers/CompanionArea.js | 5 ++++- src/containers/WindowSideBar.js | 4 ++-- 6 files changed, 44 insertions(+), 10 deletions(-) diff --git a/__tests__/src/components/CompanionArea.test.js b/__tests__/src/components/CompanionArea.test.js index dd5374ea7..97d49996b 100644 --- a/__tests__/src/components/CompanionArea.test.js +++ b/__tests__/src/components/CompanionArea.test.js @@ -27,6 +27,23 @@ describe('CompanionArea', () => { expect(wrapper.find(Slide).prop('direction')).toBe('left'); }); + it('when rtl, the left slide should be from the right', () => { + const wrapper = createWrapper({ + direction: 'rtl', + }); + expect(wrapper.find(CompanionWindowFactory).length).toBe(2); + expect(wrapper.find(Slide).prop('direction')).toBe('right'); + }); + + it('when rtl, the right slide should be from the left', () => { + const wrapper = createWrapper({ + direction: 'rtl', + position: 'left', + }); + expect(wrapper.find(CompanionWindowFactory).length).toBe(2); + expect(wrapper.find(Slide).prop('direction')).toBe('left'); + }); + it('should add the appropriate classes when the companion area fills the full width', () => { const wrapper = createWrapper({ position: 'bottom' }); expect(wrapper.find('div.horizontal').length).toBe(2); diff --git a/__tests__/src/components/WindowSideBar.test.js b/__tests__/src/components/WindowSideBar.test.js index 5eca16b8a..167de0ec0 100644 --- a/__tests__/src/components/WindowSideBar.test.js +++ b/__tests__/src/components/WindowSideBar.test.js @@ -26,4 +26,14 @@ describe('WindowSideBar', () => { expect(wrapper.find(Drawer).length).toBe(1); expect(wrapper.find(Drawer).prop('open')).toBe(true); }); + it('when ltr', () => { + const wrapper = createWrapper(); + expect(wrapper.find(Drawer).prop('anchor')).toBe('left'); + }); + it('when rtl', () => { + const wrapper = createWrapper({ + direction: 'rtl', + }); + expect(wrapper.find(Drawer).prop('anchor')).toBe('right'); + }); }); diff --git a/src/components/CompanionArea.js b/src/components/CompanionArea.js index 0c47963e9..6a2afb58c 100644 --- a/src/components/CompanionArea.js +++ b/src/components/CompanionArea.js @@ -20,17 +20,19 @@ export class CompanionArea extends Component { /** @private */ slideDirection() { - const { position } = this.props; + const { direction, position } = this.props; + const defaultPosition = direction === 'rtl' ? 'left' : 'right'; + const oppositePosition = direction === 'rtl' ? 'right' : 'left'; switch (position) { case 'right': case 'far-right': - return 'left'; + return oppositePosition; case 'bottom': case 'far-bottom': return 'up'; default: - return 'right'; + return defaultPosition; } } @@ -77,6 +79,7 @@ CompanionArea.propTypes = { classes: PropTypes.objectOf(PropTypes.string), companionAreaOpen: PropTypes.bool.isRequired, companionWindowIds: PropTypes.arrayOf(PropTypes.string).isRequired, + direction: PropTypes.string.isRequired, position: PropTypes.string.isRequired, setCompanionAreaOpen: PropTypes.func, sideBarOpen: PropTypes.bool, diff --git a/src/components/WindowSideBar.js b/src/components/WindowSideBar.js index 8396895df..5381a60a3 100644 --- a/src/components/WindowSideBar.js +++ b/src/components/WindowSideBar.js @@ -14,7 +14,7 @@ export class WindowSideBar extends Component { */ render() { const { - classes, t, windowId, sideBarOpen, + classes, direction, t, windowId, sideBarOpen, } = this.props; return ( @@ -23,13 +23,13 @@ export class WindowSideBar extends Component { variant="persistent" className={classNames(classes.drawer)} classes={{ paper: classNames(classes.paper) }} - anchor="left" + anchor={direction === 'rtl' ? 'right' : 'left'} PaperProps={{ 'aria-label': t('sidebarPanelsNavigation'), component: 'nav', - style: { position: 'relative' }, + style: { height: '100%', position: 'relative' }, }} - SlideProps={{ mountOnEnter: true, unmountOnExit: true }} + SlideProps={{ direction: direction === 'rtl' ? 'left' : 'right', mountOnEnter: true, unmountOnExit: true }} open={sideBarOpen} > <WindowSideBarButtons windowId={windowId} /> @@ -41,6 +41,7 @@ export class WindowSideBar extends Component { WindowSideBar.propTypes = { classes: PropTypes.objectOf(PropTypes.string).isRequired, + direction: PropTypes.string.isRequired, sideBarOpen: PropTypes.bool, t: PropTypes.func.isRequired, windowId: PropTypes.string.isRequired, diff --git a/src/containers/CompanionArea.js b/src/containers/CompanionArea.js index ad406f564..f5bb041f7 100644 --- a/src/containers/CompanionArea.js +++ b/src/containers/CompanionArea.js @@ -3,7 +3,9 @@ import { connect } from 'react-redux'; import { withStyles } from '@material-ui/core'; import { withTranslation } from 'react-i18next'; import { withPlugins } from '../extend/withPlugins'; -import { getCompanionWindowIdsForPosition, getCompanionAreaVisibility, getWindow } from '../state/selectors'; +import { + getCompanionWindowIdsForPosition, getCompanionAreaVisibility, getThemeDirection, getWindow, +} from '../state/selectors'; import * as actions from '../state/actions'; import { CompanionArea } from '../components/CompanionArea'; @@ -11,6 +13,7 @@ import { CompanionArea } from '../components/CompanionArea'; const mapStateToProps = (state, { windowId, position }) => ({ companionAreaOpen: getCompanionAreaVisibility(state, { position, windowId }), companionWindowIds: getCompanionWindowIdsForPosition(state, { position, windowId }), + direction: getThemeDirection(state), sideBarOpen: (getWindow(state, { windowId }) || {}).sideBarOpen, }); diff --git a/src/containers/WindowSideBar.js b/src/containers/WindowSideBar.js index c2edce19c..90598c5fa 100644 --- a/src/containers/WindowSideBar.js +++ b/src/containers/WindowSideBar.js @@ -4,7 +4,7 @@ import { withStyles } from '@material-ui/core'; import { withTranslation } from 'react-i18next'; import { withPlugins } from '../extend/withPlugins'; import { WindowSideBar } from '../components/WindowSideBar'; -import { getWindow } from '../state/selectors'; +import { getThemeDirection, getWindow } from '../state/selectors'; /** * mapStateToProps - to hook up connect @@ -13,6 +13,7 @@ import { getWindow } from '../state/selectors'; */ const mapStateToProps = (state, { windowId }) => ( { + direction: getThemeDirection(state), sideBarOpen: (getWindow(state, { windowId }) || {}).sideBarOpen, sideBarPanel: (getWindow(state, { windowId }) || {}).sideBarPanel, } @@ -28,7 +29,6 @@ const styles = theme => ({ drawer: { flexShrink: 0, height: '100%', - left: 0, order: -1000, zIndex: theme.zIndex.appBar - 1, }, -- GitLab