diff --git a/src/chrome/ExportDataPluginSheet.tsx b/src/chrome/ExportDataPluginSheet.tsx index 7686423ac..906e0eb12 100644 --- a/src/chrome/ExportDataPluginSheet.tsx +++ b/src/chrome/ExportDataPluginSheet.tsx @@ -21,7 +21,7 @@ import { setActiveSheet as getActiveSheetAction, setExportDataToFileActiveSheet as getExportDataToFileActiveSheetAction, } from '../reducers/application'; -import SelectPluginSheet from './SelectPluginSheet'; +import ListView from './ListView'; import {Dispatch, Action} from 'redux'; type OwnProps = { @@ -48,7 +48,9 @@ class ExportDataPluginSheet extends Component { render() { const {plugins, pluginStates, onHide} = this.props; return ( - { this.props.selectedPlugins(selectedArray); const {share} = this.props; @@ -75,17 +77,21 @@ class ExportDataPluginSheet extends Component { } } }} - plugins={getActivePersistentPlugins(pluginStates, plugins).reduce( + elements={getActivePersistentPlugins(pluginStates, plugins)} + selectedElements={getActivePersistentPlugins( + pluginStates, + plugins, + ).reduce( (acc, plugin) => { - acc.set( - plugin, - plugins.selectedPlugins.length <= 0 - ? true - : plugins.selectedPlugins.includes(plugin), - ); + if ( + plugins.selectedPlugins.length <= 0 || + plugins.selectedPlugins.includes(plugin) + ) { + acc.add(plugin); + } return acc; }, - new Map(), + new Set([]) as Set, )} onHide={onHide} /> diff --git a/src/chrome/SelectPluginSheet.tsx b/src/chrome/ListView.tsx similarity index 59% rename from src/chrome/SelectPluginSheet.tsx rename to src/chrome/ListView.tsx index cfcb56799..d4532a6d1 100644 --- a/src/chrome/SelectPluginSheet.tsx +++ b/src/chrome/ListView.tsx @@ -22,20 +22,31 @@ import {unsetShare} from '../reducers/application'; import React, {Component} from 'react'; import PropTypes from 'prop-types'; -export type PluginSelection = Map; +export type SelectionType = 'multiple' | 'single'; + +type SubType = + | { + selectedElements: Set; + type: 'multiple'; + } + | { + selectedElement: string; + type: 'single'; + }; type Props = { - onSelect: (plugins: Array) => void; + onSelect: (elements: Array) => void; onHide: () => any; - plugins: PluginSelection; -}; + elements: Array; + title: string; +} & SubType; const Title = styled(Text)({ margin: 6, }); type State = { - plugins: PluginSelection; + selectedElements: Set; }; const Container = styled(FlexColumn)({ @@ -51,7 +62,7 @@ const Line = styled(View)({ flexShrink: 0, }); -const PluginRowComponentContainer = styled(FlexColumn)({ +const RowComponentContainer = styled(FlexColumn)({ overflow: 'scroll', height: 'auto', backgroundColor: colors.white, @@ -77,13 +88,13 @@ const Padder = styled('div')( }), ); -type PluginRowComponentProps = { +type RowComponentProps = { name: string; selected: boolean; onChange: (name: string, selected: boolean) => void; }; -class PluginRowComponent extends Component { +class RowComponent extends Component { render() { const {name, selected, onChange} = this.props; return ( @@ -110,59 +121,67 @@ class PluginRowComponent extends Component { } } -export default class SelectPluginSheet extends Component { +export default class ListView extends Component { static contextTypes = { store: PropTypes.object.isRequired, }; - state = {plugins: new Map()}; + state: State = {selectedElements: new Set([])}; static getDerivedStateFromProps(props: Props, state: State) { - if (state.plugins.size > 0) { + if (state.selectedElements.size > 0) { return null; } - return {plugins: props.plugins}; + if (props.type === 'multiple') { + return {selectedElements: props.selectedElements}; + } else if (props.type === 'single') { + return {selectedElements: new Set([props.selectedElement])}; + } + + return null; } - onSubmit(plugins: PluginSelection) { - const selectedArray = Array.from(plugins.entries()).reduce( - (acc, [plugin, selected]) => { - if (selected) { - acc.push(plugin); - } - return acc; - }, - [], - ); - this.props.onSelect(selectedArray); - } + handleChange = (id: string, selected: boolean) => { + if (this.props.type === 'single') { + if (!selected) { + this.setState({selectedElements: new Set([])}); + } else { + this.setState({selectedElements: new Set([id])}); + } + } else { + if (selected) { + this.setState({ + selectedElements: new Set([...this.state.selectedElements, id]), + }); + } else { + const selectedElements = new Set([...this.state.selectedElements]); + selectedElements.delete(id); + this.setState({selectedElements}); + } + } + }; + render() { const onHide = () => { this.context.store.dispatch(unsetShare()); this.props.onHide(); }; - const {plugins} = this.state; return ( - - Select the plugins for which you want to export the data - - - {Array.from(plugins.entries()).map(([pluginID, selected]) => { + {this.props.title} + + {this.props.elements.map(id => { return ( - { - plugins.set(id, selected); - this.setState({plugins}); - }} + ); })} - + @@ -175,7 +194,7 @@ export default class SelectPluginSheet extends Component { padded type="primary" onClick={() => { - this.onSubmit(this.state.plugins); + this.props.onSelect([...this.state.selectedElements]); }}> Submit