Skip to content
Snippets Groups Projects
Unverified Commit 34be2ccc authored by Kyle Doherty's avatar Kyle Doherty
Browse files

action bar for collections

parent aa78f200
No related branches found
No related tags found
No related merge requests found
...@@ -2,18 +2,16 @@ import React from "react"; ...@@ -2,18 +2,16 @@ import React from "react";
import { Box, Flex, Subhead, Truncate } from "rebass"; import { Box, Flex, Subhead, Truncate } from "rebass";
import { t } from "c-3po"; import { t } from "c-3po";
import { connect } from "react-redux"; import { connect } from "react-redux";
import { withRouter } from "react-router";
import _ from "underscore"; import _ from "underscore";
import listSelect from "metabase/hoc/ListSelect"; import listSelect from "metabase/hoc/ListSelect";
import BulkActionBar from "metabase/components/BulkActionBar"
import Question from "metabase/entities/questions";
import Dashboard from "metabase/entities/dashboards";
import * as Urls from "metabase/lib/urls"; import * as Urls from "metabase/lib/urls";
import { normal } from "metabase/lib/colors"; import { normal } from "metabase/lib/colors";
import Button from "metabase/components/Button";
import Card from "metabase/components/Card"; import Card from "metabase/components/Card";
import CheckBox from "metabase/components/CheckBox"; import StackedCheckBox from "metabase/components/StackedCheckBox";
import EntityItem from "metabase/components/EntityItem"; import EntityItem from "metabase/components/EntityItem";
import { Grid, GridItem } from "metabase/components/Grid"; import { Grid, GridItem } from "metabase/components/Grid";
import Icon from "metabase/components/Icon"; import Icon from "metabase/components/Icon";
...@@ -35,11 +33,6 @@ const mapStateToProps = (state, props) => ({ ...@@ -35,11 +33,6 @@ const mapStateToProps = (state, props) => ({
}) || {}, }) || {},
}); });
const mapDispatchToProps = {
updateQuestion: Question.actions.update,
updateDashboard: Dashboard.actions.update,
};
const CollectionItem = ({ collection }) => ( const CollectionItem = ({ collection }) => (
<Link <Link
to={`collection/${collection.id}`} to={`collection/${collection.id}`}
...@@ -98,7 +91,7 @@ class DefaultLanding extends React.Component { ...@@ -98,7 +91,7 @@ class DefaultLanding extends React.Component {
}; };
render() { render() {
const { collectionId, list, onToggleSelected, selection } = this.props; const { collectionId, list, onToggleSelected, selection, selected } = this.props;
// Show the // Show the
const showCollectionList = collectionId === "root"; const showCollectionList = collectionId === "root";
...@@ -184,6 +177,7 @@ class DefaultLanding extends React.Component { ...@@ -184,6 +177,7 @@ class DefaultLanding extends React.Component {
<Box key={item.type + item.id}> <Box key={item.type + item.id}>
<Link to={item.getUrl()}> <Link to={item.getUrl()}>
<EntityItem <EntityItem
showSelect={selected.length > 0}
selectable selectable
item={item} item={item}
type={item.type} type={item.type}
...@@ -214,6 +208,11 @@ class DefaultLanding extends React.Component { ...@@ -214,6 +208,11 @@ class DefaultLanding extends React.Component {
); );
}} }}
</CollectionLoader> </CollectionLoader>
<BulkActionBar showing={selected.length > 0}>
<SelectionControls {...this.props} />
<BulkActionControls {...this.props} />
<Box ml="auto">{t`${selected.length} items selected`}</Box>
</BulkActionBar>
</Box> </Box>
</Box> </Box>
</Flex> </Flex>
...@@ -221,6 +220,45 @@ class DefaultLanding extends React.Component { ...@@ -221,6 +220,45 @@ class DefaultLanding extends React.Component {
} }
} }
const BulkActionControls = ({ selected, reload }) => (
<Box>
<Button
ml={1}
medium
onClick={async () => {
try {
await Promise.all(selected.map(item => item.setArchived(true)));
} finally {
reload();
}
}}
>{t`Archive`}</Button>
<Button
ml={1}
medium
onClick={async () => {
try {
await Promise.all(selected.map(item => item.setArchived(true)));
} finally {
reload();
}
}}
>{t`Move`}</Button>
</Box>
);
const SelectionControls = ({
selected,
deselected,
onSelectAll,
onSelectNone,
}) =>
deselected.length === 0 ? (
<StackedCheckBox checked={true} onChange={onSelectNone} />
) : (
<StackedCheckBox checked={false} onChange={onSelectAll} />
);
@connect(mapStateToProps) @connect(mapStateToProps)
class CollectionLanding extends React.Component { class CollectionLanding extends React.Component {
render() { render() {
......
...@@ -37,7 +37,8 @@ const EntityItem = ({ ...@@ -37,7 +37,8 @@ const EntityItem = ({
onFavorite, onFavorite,
selected, selected,
onToggleSelected, onToggleSelected,
selectable selectable,
showSelect
}) => { }) => {
return ( return (
<EntityItemWrapper py={2} px={2} className="hover-parent hover--visibility"> <EntityItemWrapper py={2} px={2} className="hover-parent hover--visibility">
...@@ -49,6 +50,7 @@ const EntityItem = ({ ...@@ -49,6 +50,7 @@ const EntityItem = ({
> >
{ selectable ? ( { selectable ? (
<Swapper <Swapper
startSwapped={showSelect}
defaultElement={<Icon name={iconName} color={iconColor} />} defaultElement={<Icon name={iconName} color={iconColor} />}
swappedElement={ swappedElement={
<CheckBox <CheckBox
...@@ -122,7 +124,7 @@ class Swapper extends React.Component { ...@@ -122,7 +124,7 @@ class Swapper extends React.Component {
} }
render () { render () {
const { defaultElement, swappedElement } = this.props const { defaultElement, swappedElement, startSwapped } = this.props
const { hovered } = this.state const { hovered } = this.state
return ( return (
...@@ -136,7 +138,7 @@ class Swapper extends React.Component { ...@@ -136,7 +138,7 @@ class Swapper extends React.Component {
scale: 1 scale: 1
}} }}
style={{ style={{
scale: hovered ? spring(0): spring(1) scale: hovered || startSwapped ? spring(0): spring(1)
}} }}
> >
{({ scale }) => { {({ scale }) => {
...@@ -152,7 +154,7 @@ class Swapper extends React.Component { ...@@ -152,7 +154,7 @@ class Swapper extends React.Component {
scale: 0 scale: 0
}} }}
style={{ style={{
scale: hovered ? spring(1): spring(0) scale: hovered || startSwapped ? spring(1): spring(0)
}} }}
> >
{({ scale }) => { {({ scale }) => {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment