Skip to content
Snippets Groups Projects
Unverified Commit ce3d9fb6 authored by Alexander Polyankin's avatar Alexander Polyankin Committed by GitHub
Browse files

Cleanup icons and checkboxes in collections (#23413)

parent 001055df
No related branches found
No related tags found
No related merge requests found
......@@ -81,7 +81,7 @@ export function BaseTableItem({
const icon = { name: item.getIcon().name };
if (item.model === "card") {
icon.color = color("bg-dark");
icon.color = color("text-light");
}
// Table row can be wrapped with ItemDragSource,
......
......@@ -6,11 +6,11 @@ import { t } from "ttag";
import CheckBox from "metabase/core/components/CheckBox";
import Icon from "metabase/components/Icon";
import Swapper from "metabase/components/Swapper";
import Swapper from "metabase/core/components/Swapper";
import Tooltip from "metabase/components/Tooltip";
import { color as c } from "metabase/lib/colors";
import { IconContainer } from "./ArchiveItem.styled";
import { ItemIcon, ItemIconContainer } from "./ArchivedItem.styled";
const ArchivedItem = ({
name,
......@@ -25,15 +25,19 @@ const ArchivedItem = ({
showSelect,
}) => (
<div className="flex align-center p2 hover-parent hover--visibility border-bottom bg-light-hover">
<IconContainer>
<Swapper
startSwapped={showSelect}
defaultElement={<Icon name={icon} color={color} />}
swappedElement={
<Swapper
defaultElement={
<ItemIconContainer>
<ItemIcon name={icon} color={color} />
</ItemIconContainer>
}
swappedElement={
<ItemIconContainer>
<CheckBox checked={selected} onChange={onToggleSelected} />
}
/>
</IconContainer>
</ItemIconContainer>
}
isSwapped={showSelect}
/>
{name}
{isAdmin && (onUnarchive || onDelete) && (
<span className="ml-auto mr2">
......
import styled from "@emotion/styled";
import IconWrapper from "metabase/components/IconWrapper";
import Icon from "metabase/components/Icon";
export const IconContainer = styled(IconWrapper)`
export const ItemIcon = styled(Icon)`
display: block;
`;
export const ItemIconContainer = styled(IconWrapper)`
padding: 0.5rem;
margin-right: 0.5rem;
line-height: 1;
`;
......@@ -4,7 +4,7 @@ import { t } from "ttag";
import cx from "classnames";
import EntityMenu from "metabase/components/EntityMenu";
import Swapper from "metabase/components/Swapper";
import Swapper from "metabase/core/components/Swapper";
import CheckBox from "metabase/core/components/CheckBox";
import Ellipsified from "metabase/core/components/Ellipsified";
import Icon from "metabase/components/Icon";
......@@ -30,7 +30,7 @@ function EntityIconCheckBox({
onToggleSelected,
...props
}) {
const iconSize = variant === "small" ? 12 : 18;
const iconSize = variant === "small" ? 12 : 16;
const handleClick = e => {
e.preventDefault();
onToggleSelected();
......@@ -47,7 +47,6 @@ function EntityIconCheckBox({
>
{selectable ? (
<Swapper
startSwapped={selected || showCheckbox}
defaultElement={
<Icon
name={icon.name}
......@@ -56,6 +55,7 @@ function EntityIconCheckBox({
/>
}
swappedElement={<CheckBox checked={selected} size={iconSize} />}
isSwapped={selected || showCheckbox}
/>
) : (
<Icon
......
/* eslint-disable react/prop-types */
import React from "react";
import { Motion, spring } from "react-motion";
import { isReducedMotionPreferred } from "metabase/lib/dom";
class Swapper extends React.Component {
state = {
hovered: false,
};
_onMouseEnter() {
this.setState({ hovered: true });
}
_onMouseLeave() {
this.setState({ hovered: false });
}
render() {
const { defaultElement, swappedElement, startSwapped } = this.props;
const { hovered } = this.state;
const preferReducedMotion = isReducedMotionPreferred();
const springOpts = preferReducedMotion
? { stiffness: 500 }
: { stiffness: 170 };
return (
<span
onMouseEnter={() => this._onMouseEnter()}
onMouseLeave={() => this._onMouseLeave()}
className="block relative"
style={{ lineHeight: 1 }}
>
<Motion
defaultStyle={{
scale: 1,
}}
style={{
scale:
hovered || startSwapped
? spring(0, springOpts)
: spring(1, springOpts),
}}
>
{({ scale }) => {
const snapScale = scale < 0.5 ? 0 : 1;
const _scale = preferReducedMotion ? snapScale : scale;
return (
<span
style={{
display: "block",
transform: `scale(${_scale})`,
}}
>
{defaultElement}
</span>
);
}}
</Motion>
<Motion
defaultStyle={{
scale: 0,
}}
style={{
scale:
hovered || startSwapped
? spring(1, springOpts)
: spring(0, springOpts),
}}
>
{({ scale }) => {
const snapScale = scale < 0.5 ? 0 : 1;
const _scale = preferReducedMotion ? snapScale : scale;
return (
<span
className="absolute top left bottom right"
style={{ display: "block", transform: `scale(${_scale})` }}
>
{swappedElement}
</span>
);
}}
</Motion>
</span>
);
}
}
export default Swapper;
import styled from "@emotion/styled";
export interface SwapperElementProps {
isVisible: boolean;
}
export const SwapperRoot = styled.div`
position: relative;
`;
export const SwapperDefaultElement = styled.div<SwapperElementProps>`
transform: scale(${props => (props.isVisible ? 1 : 0)});
`;
export const SwapperLayeredElement = styled.div<SwapperElementProps>`
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
transform: scale(${props => (props.isVisible ? 1 : 0)});
`;
import React, {
forwardRef,
HTMLAttributes,
ReactNode,
Ref,
useCallback,
useState,
} from "react";
import {
SwapperDefaultElement,
SwapperLayeredElement,
SwapperRoot,
} from "./Swapper.styled";
export interface SwapperProps extends HTMLAttributes<HTMLDivElement> {
defaultElement?: ReactNode;
swappedElement?: ReactNode;
isSwapped?: boolean;
}
const Swapper = forwardRef(function Swapper(
{ defaultElement, swappedElement, isSwapped = false, ...props }: SwapperProps,
ref: Ref<HTMLDivElement>,
) {
const [isHovered, setIsHovered] = useState(false);
const isSelected = isHovered || isSwapped;
const handleMouseEnter = useCallback(() => setIsHovered(true), []);
const handleMouseLeave = useCallback(() => setIsHovered(false), []);
return (
<SwapperRoot
{...props}
ref={ref}
onMouseEnter={handleMouseEnter}
onMouseLeave={handleMouseLeave}
>
<SwapperDefaultElement isVisible={!isSelected}>
{defaultElement}
</SwapperDefaultElement>
<SwapperLayeredElement isVisible={isSelected}>
{swappedElement}
</SwapperLayeredElement>
</SwapperRoot>
);
});
export default Swapper;
export { default } from "./Swapper";
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