mirror of
https://github.com/apache/superset.git
synced 2026-04-27 20:14:54 +00:00
style(listview): dynamic card size and grid spacing (#11111)
This commit is contained in:
@@ -34,7 +34,7 @@ fetchMock.get(
|
||||
},
|
||||
);
|
||||
|
||||
describe('ListViewCard', () => {
|
||||
describe('ImageLoader', () => {
|
||||
const defaultProps = {
|
||||
src: '/thumbnail',
|
||||
fallback: '/fallback',
|
||||
@@ -55,19 +55,19 @@ describe('ListViewCard', () => {
|
||||
|
||||
it('fetches loads the image in the background', async () => {
|
||||
const wrapper = factory();
|
||||
expect(wrapper.find('img').props().src).toBe('/fallback');
|
||||
expect(wrapper.find('div').props().src).toBe('/fallback');
|
||||
await waitForComponentToPaint(wrapper);
|
||||
expect(fetchMock.calls(/thumbnail/)).toHaveLength(1);
|
||||
expect(global.URL.createObjectURL).toHaveBeenCalled();
|
||||
expect(wrapper.find('img').props().src).toBe('/local_url');
|
||||
expect(wrapper.find('div').props().src).toBe('/local_url');
|
||||
});
|
||||
|
||||
it('displays fallback image when response is not an image', async () => {
|
||||
fetchMock.once('/thumbnail2', {});
|
||||
const wrapper = factory({ src: '/thumbnail2' });
|
||||
expect(wrapper.find('img').props().src).toBe('/fallback');
|
||||
expect(wrapper.find('div').props().src).toBe('/fallback');
|
||||
await waitForComponentToPaint(wrapper);
|
||||
expect(fetchMock.calls(/thumbnail2/)).toHaveLength(1);
|
||||
expect(wrapper.find('img').props().src).toBe('/fallback');
|
||||
expect(wrapper.find('div').props().src).toBe('/fallback');
|
||||
});
|
||||
});
|
||||
|
||||
@@ -17,22 +17,32 @@
|
||||
* under the License.
|
||||
*/
|
||||
import React, { useEffect } from 'react';
|
||||
import { logging } from '@superset-ui/core';
|
||||
import { styled, logging } from '@superset-ui/core';
|
||||
|
||||
interface ImageLoaderProps
|
||||
extends React.DetailedHTMLProps<
|
||||
React.ImgHTMLAttributes<HTMLImageElement>,
|
||||
HTMLImageElement
|
||||
React.HTMLAttributes<HTMLDivElement>,
|
||||
HTMLDivElement
|
||||
> {
|
||||
fallback: string;
|
||||
src: string;
|
||||
isLoading: boolean;
|
||||
}
|
||||
type ImageContainerProps = {
|
||||
src: string;
|
||||
};
|
||||
|
||||
const ImageContainer = styled.div`
|
||||
background-image: url(${({ src }: ImageContainerProps) => src});
|
||||
background-size: cover;
|
||||
display: inline-block;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
`;
|
||||
|
||||
export default function ImageLoader({
|
||||
src,
|
||||
fallback,
|
||||
alt,
|
||||
isLoading,
|
||||
...rest
|
||||
}: ImageLoaderProps) {
|
||||
@@ -61,5 +71,5 @@ export default function ImageLoader({
|
||||
};
|
||||
}, [src, fallback]);
|
||||
|
||||
return <img alt={alt || ''} src={isLoading ? fallback : imgSrc} {...rest} />;
|
||||
return <ImageContainer src={isLoading ? fallback : imgSrc} {...rest} />;
|
||||
}
|
||||
|
||||
@@ -36,8 +36,6 @@ const ActionsWrapper = styled.div`
|
||||
`;
|
||||
|
||||
const StyledCard = styled(Card)`
|
||||
width: 459px;
|
||||
|
||||
.ant-card-body {
|
||||
padding: ${({ theme }) => theme.gridUnit * 4}px
|
||||
${({ theme }) => theme.gridUnit * 2}px;
|
||||
@@ -65,7 +63,7 @@ const Cover = styled.div`
|
||||
|
||||
const GradientContainer = styled.div`
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
height: 100%;
|
||||
|
||||
&:after {
|
||||
content: '';
|
||||
@@ -83,12 +81,6 @@ const GradientContainer = styled.div`
|
||||
);
|
||||
}
|
||||
`;
|
||||
const CardCoverImg = styled(ImageLoader)`
|
||||
display: block;
|
||||
object-fit: cover;
|
||||
width: 459px;
|
||||
height: 264px;
|
||||
`;
|
||||
|
||||
const TitleContainer = styled.div`
|
||||
display: flex;
|
||||
@@ -173,7 +165,7 @@ function ListViewCard({
|
||||
<Cover>
|
||||
<a href={url}>
|
||||
<GradientContainer>
|
||||
<CardCoverImg
|
||||
<ImageLoader
|
||||
src={imgURL}
|
||||
fallback={imgFallbackURL}
|
||||
isLoading={loading}
|
||||
|
||||
Reference in New Issue
Block a user