Skip to content
Snippets Groups Projects
Commit 1c88cca3 authored by Jack Reed's avatar Jack Reed
Browse files

Improve thumbnail navigation styling

parent 6de82635
No related branches found
No related tags found
No related merge requests found
...@@ -64,8 +64,7 @@ describe('ThumbnailNavigation', () => { ...@@ -64,8 +64,7 @@ describe('ThumbnailNavigation', () => {
expect(setCanvas).toHaveBeenCalledWith('foobar', 0); expect(setCanvas).toHaveBeenCalledWith('foobar', 0);
}); });
it('sets up calculated width based off of height of area and dimensions of canvas', () => { it('sets up calculated width based off of height of area and dimensions of canvas', () => {
expect(renderedGrid.find('.mirador-thumbnail-nav-container').first().prop('style').width).toEqual(108); expect(renderedGrid.find('.mirador-thumbnail-nav-container').first().prop('style').width).toEqual(93);
expect(renderedGrid.find('.mirador-thumbnail-nav-canvas').first().prop('style').width).toEqual(100);
}); });
it('renders canvas thumbnails', () => { it('renders canvas thumbnails', () => {
expect(renderedGrid.find('CanvasThumbnail').length).toBe(3); expect(renderedGrid.find('CanvasThumbnail').length).toBe(3);
...@@ -109,7 +108,7 @@ describe('ThumbnailNavigation', () => { ...@@ -109,7 +108,7 @@ describe('ThumbnailNavigation', () => {
}); });
it('style', () => { it('style', () => {
expect(wrapper.instance().style()).toMatchObject({ height: '150px', width: '100%' }); expect(wrapper.instance().style()).toMatchObject({ height: '150px', width: '100%' });
expect(rightWrapper.instance().style()).toMatchObject({ height: '100%', width: '100px' }); expect(rightWrapper.instance().style()).toMatchObject({ height: '100%', width: '122px' });
}); });
it('rightWidth', () => { it('rightWidth', () => {
expect(wrapper.instance().rightWidth()).toEqual(100); expect(wrapper.instance().rightWidth()).toEqual(100);
...@@ -126,12 +125,12 @@ describe('ThumbnailNavigation', () => { ...@@ -126,12 +125,12 @@ describe('ThumbnailNavigation', () => {
expect(wrapper.instance().rightWidth()).toEqual(200); expect(wrapper.instance().rightWidth()).toEqual(200);
}); });
it('calculateScaledWidth', () => { it('calculateScaledWidth', () => {
expect(wrapper.instance().calculateScaledWidth({ index: 0 })).toEqual(108); expect(wrapper.instance().calculateScaledWidth({ index: 0 })).toEqual(93);
expect(rightWrapper.instance().calculateScaledWidth({ index: 0 })).toEqual(100); expect(rightWrapper.instance().calculateScaledWidth({ index: 0 })).toEqual(100);
}); });
it('calculateScaledHeight', () => { it('calculateScaledHeight', () => {
expect(wrapper.instance().calculateScaledHeight({ index: 0 })).toEqual(150); expect(wrapper.instance().calculateScaledHeight({ index: 0 })).toEqual(140);
expect(rightWrapper.instance().calculateScaledHeight({ index: 0 })).toEqual(150); expect(rightWrapper.instance().calculateScaledHeight({ index: 0 })).toEqual(132);
}); });
it('columnCount', () => { it('columnCount', () => {
......
...@@ -2,9 +2,11 @@ import React, { Component } from 'react'; ...@@ -2,9 +2,11 @@ import React, { Component } from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import AutoSizer from 'react-virtualized/dist/commonjs/AutoSizer'; import AutoSizer from 'react-virtualized/dist/commonjs/AutoSizer';
import Grid from 'react-virtualized/dist/commonjs/Grid'; import Grid from 'react-virtualized/dist/commonjs/Grid';
import GridList from '@material-ui/core/GridList';
import GridListTile from '@material-ui/core/GridListTile'; import GridListTile from '@material-ui/core/GridListTile';
import GridListTileBar from '@material-ui/core/GridListTileBar'; import GridListTileBar from '@material-ui/core/GridListTileBar';
import Typography from '@material-ui/core/Typography'; import Typography from '@material-ui/core/Typography';
import classNames from 'classnames';
import { CanvasThumbnail } from './CanvasThumbnail'; import { CanvasThumbnail } from './CanvasThumbnail';
import ManifestoCanvas from '../lib/ManifestoCanvas'; import ManifestoCanvas from '../lib/ManifestoCanvas';
import ns from '../config/css-ns'; import ns from '../config/css-ns';
...@@ -18,6 +20,8 @@ export class ThumbnailNavigation extends Component { ...@@ -18,6 +20,8 @@ export class ThumbnailNavigation extends Component {
constructor(props) { constructor(props) {
super(props); super(props);
this.scrollbarSize = 10;
this.spacing = 12; // 2 * (2px margin + 2px border + 2px padding)
this.cellRenderer = this.cellRenderer.bind(this); this.cellRenderer = this.cellRenderer.bind(this);
this.calculateScaledHeight = this.calculateScaledHeight.bind(this); this.calculateScaledHeight = this.calculateScaledHeight.bind(this);
this.calculateScaledWidth = this.calculateScaledWidth.bind(this); this.calculateScaledWidth = this.calculateScaledWidth.bind(this);
...@@ -58,7 +62,8 @@ export class ThumbnailNavigation extends Component { ...@@ -58,7 +62,8 @@ export class ThumbnailNavigation extends Component {
classes, window, setCanvas, config, canvasGroupings, position, classes, window, setCanvas, config, canvasGroupings, position,
} = this.props; } = this.props;
const currentIndex = (position === 'far-right') ? rowIndex : columnIndex; const currentIndex = (position === 'far-right') ? rowIndex : columnIndex;
const maxHeight = (position === 'far-right') ? null : config.thumbnailNavigation.height - (this.scrollbarSize + 12);
const maxWidth = (position === 'far-right') ? config.thumbnailNavigation.width : null;
const currentGroupings = canvasGroupings.groupings()[currentIndex]; const currentGroupings = canvasGroupings.groupings()[currentIndex];
return ( return (
<div <div
...@@ -66,30 +71,35 @@ export class ThumbnailNavigation extends Component { ...@@ -66,30 +71,35 @@ export class ThumbnailNavigation extends Component {
style={style} style={style}
className={ns('thumbnail-nav-container')} className={ns('thumbnail-nav-container')}
> >
<div <GridList
style={{ component="div"
width: style.width - 8, spacing={0}
}} className={classNames(
className={ns(['thumbnail-nav-canvas', `thumbnail-nav-canvas-${currentIndex}`, this.currentCanvasClass(currentGroupings.map(canvas => canvas.index))])} ns(['thumbnail-nav-canvas', `thumbnail-nav-canvas-${currentIndex}`, this.currentCanvasClass(currentGroupings.map(canvas => canvas.index))]),
classes.canvas,
{
[classes.currentCanvas]: currentGroupings
.map(canvas => canvas.index).includes(window.canvasIndex),
},
)}
> >
{currentGroupings.map((canvas, i) => { {currentGroupings.map((canvas, i) => {
const { height } = config.thumbnailNavigation;
const manifestoCanvas = new ManifestoCanvas(canvas); const manifestoCanvas = new ManifestoCanvas(canvas);
return ( return (
<GridListTile <GridListTile
component="div" component="div"
key={canvas.index} key={canvas.index}
onClick={() => setCanvas(window.id, currentGroupings[0].index)} onClick={() => setCanvas(window.id, currentGroupings[0].index)}
style={{ style={{
position: 'absolute', left: (style.width - 8) * i / 2, top: 2, height: style.height - this.spacing / 2,
width: currentGroupings.length === 2 ? '50%' : '100%',
}} }}
> >
<CanvasThumbnail <CanvasThumbnail
imageUrl={manifestoCanvas.thumbnail(null, height)} imageUrl={manifestoCanvas.thumbnail(null, maxHeight)}
isValid={manifestoCanvas.hasValidDimensions} isValid={manifestoCanvas.hasValidDimensions}
maxHeight={config.thumbnailNavigation.height} maxHeight={maxHeight}
maxWidth={style.width} maxWidth={maxWidth}
aspectRatio={manifestoCanvas.aspectRatio} aspectRatio={manifestoCanvas.aspectRatio}
/> />
<GridListTileBar <GridListTileBar
...@@ -103,7 +113,7 @@ export class ThumbnailNavigation extends Component { ...@@ -103,7 +113,7 @@ export class ThumbnailNavigation extends Component {
</GridListTile> </GridListTile>
); );
})} })}
</div> </GridList>
</div> </div>
); );
} }
...@@ -122,7 +132,7 @@ export class ThumbnailNavigation extends Component { ...@@ -122,7 +132,7 @@ export class ThumbnailNavigation extends Component {
default: default:
return canvasGroupings.getCanvases(options.index) return canvasGroupings.getCanvases(options.index)
.map(canvas => new ManifestoCanvas(canvas)) .map(canvas => new ManifestoCanvas(canvas))
.reduce((acc, currentCanvas) => { return acc + (currentCanvas.hasValidDimensions ? Math.floor(config.thumbnailNavigation.height * currentCanvas.aspectRatio) : config.thumbnailNavigation.width); }, 8); // eslint-disable-line arrow-body-style, max-len .reduce((acc, currentCanvas) => { return acc + (currentCanvas.hasValidDimensions ? Math.floor((config.thumbnailNavigation.height - this.scrollbarSize) * currentCanvas.aspectRatio) : config.thumbnailNavigation.width); }, 0); // eslint-disable-line arrow-body-style, max-len
} }
} }
...@@ -138,11 +148,11 @@ export class ThumbnailNavigation extends Component { ...@@ -138,11 +148,11 @@ export class ThumbnailNavigation extends Component {
return Math.max( return Math.max(
...canvasGroupings.getCanvases(options.index) ...canvasGroupings.getCanvases(options.index)
.map(canvas => new ManifestoCanvas(canvas)) .map(canvas => new ManifestoCanvas(canvas))
.map(canvas => (canvas.hasValidDimensions ? Math.floor(config.thumbnailNavigation.width / canvas.aspectRatio) : config.thumbnailNavigation.height)), // eslint-disable-line arrow-body-style, max-len .map(canvas => (canvas.hasValidDimensions ? Math.floor((config.thumbnailNavigation.width - this.spacing) / canvas.aspectRatio) : config.thumbnailNavigation.height - 12)), // eslint-disable-line arrow-body-style, max-len
); );
// Default case bottom // Default case bottom
default: default:
return config.thumbnailNavigation.height; return config.thumbnailNavigation.height - this.scrollbarSize;
} }
} }
...@@ -167,7 +177,7 @@ export class ThumbnailNavigation extends Component { ...@@ -167,7 +177,7 @@ export class ThumbnailNavigation extends Component {
case 'far-right': case 'far-right':
return { return {
height: '100%', height: '100%',
width: `${this.rightWidth()}px`, width: `${this.rightWidth() + this.scrollbarSize + this.spacing}px`,
display: 'flex', display: 'flex',
minHeight: 0, minHeight: 0,
}; };
...@@ -185,7 +195,7 @@ export class ThumbnailNavigation extends Component { ...@@ -185,7 +195,7 @@ export class ThumbnailNavigation extends Component {
const { window, config } = this.props; const { window, config } = this.props;
switch (window.view) { switch (window.view) {
case 'book': case 'book':
return config.thumbnailNavigation.width * 2; return (config.thumbnailNavigation.width * 2);
default: default:
return config.thumbnailNavigation.width; return config.thumbnailNavigation.width;
} }
......
...@@ -36,14 +36,24 @@ const mapDispatchToProps = { ...@@ -36,14 +36,24 @@ const mapDispatchToProps = {
/** /**
* Styles for withStyles HOC * Styles for withStyles HOC
*/ */
const styles = { const styles = theme => ({
currentCanvas: {
},
canvas: {
border: '2px solid transparent',
color: theme.palette.common.white,
cursor: 'pointer',
'&$currentCanvas': {
border: `2px solid ${theme.palette.secondary.main}`,
},
},
root: { root: {
background: 'linear-gradient(to top, rgba(0,0,0,0.7) 0%, rgba(0,0,0,0.3) 70%, rgba(0,0,0,0) 100%)', background: 'linear-gradient(to top, rgba(0,0,0,0.7) 0%, rgba(0,0,0,0.3) 70%, rgba(0,0,0,0) 100%)',
}, },
title: { title: {
color: '#ffffff', color: '#ffffff',
}, },
}; });
const enhance = compose( const enhance = compose(
withStyles(styles), withStyles(styles),
......
...@@ -183,17 +183,8 @@ ...@@ -183,17 +183,8 @@
} }
&-thumb-navigation { &-thumb-navigation {
margin: 2px;
.mirador-thumbnail-nav-canvas { padding: 2px;
border: 1px solid $black;
color: $white;
cursor: pointer;
height: 100%;
&.mirador-current-canvas {
border: 3px solid $blue;
}
}
} }
&-label-value-metadata { &-label-value-metadata {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment