UNPKG

keystone

Version:

Web Application Framework and Admin GUI / Content Management System built on Express.js and Mongoose

197 lines (178 loc) 4.27 kB
import React, { PropTypes } from 'react'; import { GlyphButton, InlineGroup as Group, InlineGroupSection as Section, ResponsiveText, } from '../../../elemental'; import theme from '../../../../theme'; import ListColumnsForm from './ListColumnsForm'; import ListDownloadForm from './ListDownloadForm'; import ListHeaderSearch from './ListHeaderSearch'; import ListFiltersAdd from './Filtering/ListFiltersAdd'; function ButtonDivider ({ style, ...props }) { props.style = { borderLeft: '1px solid rgba(0, 0, 0, 0.1)', paddingLeft: '0.75em', ...style, }; return <div {...props} />; }; function CreateButton ({ listName, onClick, ...props }) { return ( <GlyphButton block color="success" data-e2e-list-create-button="header" glyph="plus" onClick={onClick} position="left" title={`Create ${listName}`} {...props} > <ResponsiveText visibleSM="Create" visibleMD="Create" visibleLG={`Create ${listName}`} /> </GlyphButton> ); }; function ListHeaderToolbar ({ // common dispatch, list, // expand expandIsActive, expandOnClick, // list createIsAvailable, createListName, createOnClick, // search searchHandleChange, searchHandleClear, searchHandleKeyup, searchValue, // filters filtersActive, filtersAvailable, // columns columnsAvailable, columnsActive, ...props }) { return ( <Group block cssStyles={classes.wrapper}> <Section grow cssStyles={classes.search}> <ListHeaderSearch handleChange={searchHandleChange} handleClear={searchHandleClear} handleKeyup={searchHandleKeyup} value={searchValue} /> </Section> <Section grow cssStyles={classes.buttons}> <Group block> <Section cssStyles={classes.filter}> <ListFiltersAdd dispatch={dispatch} activeFilters={filtersActive} availableFilters={filtersAvailable} /> </Section> <Section cssStyles={classes.columns}> <ListColumnsForm availableColumns={columnsAvailable} activeColumns={columnsActive} dispatch={dispatch} /> </Section> <Section cssStyles={classes.download}> <ListDownloadForm activeColumns={columnsActive} dispatch={dispatch} list={list} /> </Section> <Section cssStyles={classes.expand}> <ButtonDivider> <GlyphButton active={expandIsActive} glyph="mirror" onClick={expandOnClick} title="Expand table width" /> </ButtonDivider> </Section> {createIsAvailable && <Section cssStyles={classes.create}> <ButtonDivider> <CreateButton listName={createListName} onClick={createOnClick} /> </ButtonDivider> </Section>} </Group> </Section> </Group> ); }; ListHeaderToolbar.propTypes = { columnsActive: PropTypes.array, columnsAvailable: PropTypes.array, createIsAvailable: PropTypes.bool, createListName: PropTypes.string, createOnClick: PropTypes.func.isRequired, dispatch: PropTypes.func.isRequired, expandIsActive: PropTypes.bool, expandOnClick: PropTypes.func.isRequired, filtersActive: PropTypes.array, filtersAvailable: PropTypes.array, list: PropTypes.object, searchHandleChange: PropTypes.func.isRequired, searchHandleClear: PropTypes.func.isRequired, searchHandleKeyup: PropTypes.func.isRequired, searchValue: PropTypes.string, }; const tabletGrowStyles = { [`@media (max-width: ${theme.breakpoint.tabletPortraitMax})`]: { flexGrow: 1, }, }; const classes = { // main wrapper wrapper: { [`@media (max-width: ${theme.breakpoint.tabletPortraitMax})`]: { flexWrap: 'wrap', }, }, // button wrapper buttons: { [`@media (max-width: ${theme.breakpoint.tabletPortraitMax})`]: { paddingLeft: 0, }, }, // cols expand: { [`@media (max-width: ${theme.breakpoint.desktopMax})`]: { display: 'none', }, }, filter: { [`@media (max-width: ${theme.breakpoint.tabletPortraitMax})`]: { paddingLeft: 0, flexGrow: 1, }, }, columns: tabletGrowStyles, create: tabletGrowStyles, download: tabletGrowStyles, search: { [`@media (max-width: ${theme.breakpoint.tabletPortraitMax})`]: { marginBottom: '0.75em', minWidth: '100%', }, }, }; module.exports = ListHeaderToolbar;