From 9d779703670cd54e3760627ed79adff03e727fa6 Mon Sep 17 00:00:00 2001
From: David Quartey <42542676+DavidQuartz@users.noreply.github.com>
Date: Thu, 18 Aug 2022 09:35:48 +0000
Subject: [PATCH] [Fixes #1022] Thumbnail placeholders (#1142)
---
.../components/DetailsPanel/DetailsPanel.jsx | 46 ++++++++++++-------
.../js/components/MediaViewer/Media.jsx | 4 +-
.../components/ResourceCard/ResourceCard.jsx | 6 ++-
.../client/js/routes/Detail.jsx | 4 +-
.../client/js/routes/Search.jsx | 3 +-
.../client/js/routes/Viewer.jsx | 3 +-
.../client/js/utils/ResourceUtils.js | 5 ++
.../themes/geonode/less/_details-panel.less | 4 ++
.../themes/geonode/less/_resource-card.less | 14 ++++--
9 files changed, 61 insertions(+), 28 deletions(-)
diff --git a/geonode_mapstore_client/client/js/components/DetailsPanel/DetailsPanel.jsx b/geonode_mapstore_client/client/js/components/DetailsPanel/DetailsPanel.jsx
index cffc448503..acd7bfefea 100644
--- a/geonode_mapstore_client/client/js/components/DetailsPanel/DetailsPanel.jsx
+++ b/geonode_mapstore_client/client/js/components/DetailsPanel/DetailsPanel.jsx
@@ -17,7 +17,7 @@ import Spinner from '@js/components/Spinner';
import Message from '@mapstore/framework/components/I18N/Message';
import tooltip from '@mapstore/framework/components/misc/enhancers/tooltip';
import moment from 'moment';
-import { getResourceTypesInfo, getMetadataDetailUrl, ResourceTypes, GXP_PTYPES } from '@js/utils/ResourceUtils';
+import { getResourceTypesInfo, getMetadataDetailUrl, ResourceTypes, GXP_PTYPES, getResourceImageSource } from '@js/utils/ResourceUtils';
import debounce from 'lodash/debounce';
import CopyToClipboardCmp from 'react-copy-to-clipboard';
import { TextEditable, ThumbnailEditable } from '@js/components/ContentsEditable/';
@@ -82,6 +82,7 @@ function formatResourceLinkUrl(resourceUrl = '') {
function ThumbnailPreview({
src,
style,
+ icon,
...props
}) {
@@ -94,19 +95,29 @@ function ThumbnailPreview({
}, [src]);
return (
-
setLoading(false)}
- onError={() => setLoading(false)}
- style={{
+ <>
+ {!src ?
+ width: 250,
+ height: 184,
+ outline: '1px solid #eee'
+ }}>
+
+
+ :
setLoading(false)}
+ onError={() => setLoading(false)}
+ style={{
+ ...style,
+ ...(loading && {
+ backgroundColor: 'transparent'
+ }),
+ objectFit: 'contain'
+ }}
+ />}
+ >
);
}
@@ -460,6 +471,7 @@ function DetailsPanel({
/>
: (!embedUrl && !editThumbnail ? (
{editThumbnail &&
- {!activeEditMode &&
}
+ {!activeEditMode &&
}
{activeEditMode &&
- {!enableMapViewer ? <>
getResourceImageSource(resource?.thumbnail_url)}
thumbnailUpdating={resourceThumbnailUpdating}
- />
+ />
{
((resource.resource_type === ResourceTypes.MAP || resource.resource_type === ResourceTypes.DATASET) && (resource.ptype !== GXP_PTYPES.REST_IMG || resource.ptype !== GXP_PTYPES.REST_MAP)) &&
( <> import('@js/components/MediaViewer/Scene3DViewer'));
@@ -66,7 +66,7 @@ const Media = ({ resource, ...props }) => {
{...props[mediaType]}
description={resource.abstract}
id={resource.pk}
- thumbnail={resource.thumbnail_url}
+ thumbnail={() => getResourceImageSource(resource?.thumbnail_url)}
src={resource.href}
/>
);
diff --git a/geonode_mapstore_client/client/js/components/ResourceCard/ResourceCard.jsx b/geonode_mapstore_client/client/js/components/ResourceCard/ResourceCard.jsx
index 25b7413356..66c58689e1 100644
--- a/geonode_mapstore_client/client/js/components/ResourceCard/ResourceCard.jsx
+++ b/geonode_mapstore_client/client/js/components/ResourceCard/ResourceCard.jsx
@@ -86,8 +86,10 @@ const ResourceCard = forwardRef(({
/>
)}
- {imgError ? (
-
+ {(imgError || !res.thumbnail_url) ? (
+
+
+
) : (
getResourceImageSource(resource?.thumbnail_url) : window.location.origin + config?.navbar?.logo[0]?.src}
title={(resource?.title) ? resource?.title + " - " + siteName : siteName }
siteName={siteName}
contentURL={resource?.detail_url}
diff --git a/geonode_mapstore_client/client/js/routes/Search.jsx b/geonode_mapstore_client/client/js/routes/Search.jsx
index 942d4acd53..a865dcc9cc 100644
--- a/geonode_mapstore_client/client/js/routes/Search.jsx
+++ b/geonode_mapstore_client/client/js/routes/Search.jsx
@@ -34,6 +34,7 @@ import { withResizeDetector } from 'react-resize-detector';
import { getCategories, getRegions, getOwners, getKeywords } from '@js/api/geonode/v2';
import MetaTags from "@js/components/MetaTags";
+import { getResourceImageSource } from '@js/utils/ResourceUtils';
import {
getThemeLayoutSize
@@ -174,7 +175,7 @@ function Search({
return (
<>
getResourceImageSource(resource?.thumbnail_url) : window.location.origin + config?.navbar?.logo[0]?.src}
title={(resource?.title) ? resource?.title + " - " + siteName : siteName }
siteName={siteName}
contentURL={resource?.detail_url}
diff --git a/geonode_mapstore_client/client/js/routes/Viewer.jsx b/geonode_mapstore_client/client/js/routes/Viewer.jsx
index 69dc3966d9..aeeb5690e4 100644
--- a/geonode_mapstore_client/client/js/routes/Viewer.jsx
+++ b/geonode_mapstore_client/client/js/routes/Viewer.jsx
@@ -21,6 +21,7 @@ import MetaTags from '@js/components/MetaTags';
import MainEventView from '@js/components/MainEventView';
import ViewerLayout from '@js/components/ViewerLayout';
import { createShallowSelector } from '@mapstore/framework/utils/ReselectUtils';
+import { getResourceImageSource } from '@js/utils/ResourceUtils';
const urlQuery = url.parse(window.location.href, true).query;
@@ -123,7 +124,7 @@ function ViewerRoute({
return (
<>
{resource && getResourceImageSource(resource?.thumbnail_url)}
title={(resource?.title) ? `${resource?.title} - ${siteName}` : siteName }
siteName={siteName}
contentURL={resource?.detail_url}
diff --git a/geonode_mapstore_client/client/js/utils/ResourceUtils.js b/geonode_mapstore_client/client/js/utils/ResourceUtils.js
index 2dc6aa05df..b86e2f61f3 100644
--- a/geonode_mapstore_client/client/js/utils/ResourceUtils.js
+++ b/geonode_mapstore_client/client/js/utils/ResourceUtils.js
@@ -685,3 +685,8 @@ export const parseUploadFiles = (data) => {
};
}, {});
};
+
+
+export const getResourceImageSource = (image) => {
+ return image ? image : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPAAAADICAIAAABZHvsFAAAACXBIWXMAAC4jAAAuIwF4pT92AAABiklEQVR42u3SAQ0AAAjDMMC/5+MAAaSVsKyTFHwxEmBoMDQYGgyNocHQYGgwNBgaQ4OhwdBgaDA0hgZDg6HB0GBoDA2GBkODocHQGBoMDYYGQ4OhMTQYGgwNhgZDY2gwNBgaDI2hwdBgaDA0GBpDg6HB0GBoMDSGBkODocHQYGgMDYYGQ4OhwdAYGgwNhgZDg6ExNBgaDA2GBkNjaDA0GBoMDYbG0GBoMDQYGkODocHQYGgwNIYGQ4OhwdBgaAwNhgZDg6HB0BgaDA2GBkODoTE0GBoMDYYGQ2NoMDQYGgwNhsbQYGgwNBgaQ4OhwdBgaDA0hgZDg6HB0GBoDA2GBkODocHQGBoMDYYGQ4OhMTQYGgwNhgZDY2gwNBgaDA2GxtBgaDA0GBoMjaHB0GBoMDSGBkODocHQYGgMDYYGQ4OhwdAYGgwNhgZDg6ExNBgaDA2GBkNjaDA0GBoMDYbG0GBoMDQYGgyNocHQYGgwNIYGQ4OhwdBgaAwNhgZDg6HB0BgaDA2GBkPDbQH4OQSN0W8qegAAAABJRU5ErkJggg==';
+};
diff --git a/geonode_mapstore_client/client/themes/geonode/less/_details-panel.less b/geonode_mapstore_client/client/themes/geonode/less/_details-panel.less
index 71da7bad3f..5b98341a0e 100644
--- a/geonode_mapstore_client/client/themes/geonode/less/_details-panel.less
+++ b/geonode_mapstore_client/client/themes/geonode/less/_details-panel.less
@@ -58,6 +58,10 @@
.color-var(@theme-vars[danger]);
}
}
+ .card-img-placeholder {
+ .background-color-var(@theme-vars[main-bg]);
+ .color-var(@theme-vars[primary]);
+ }
}
// **************
diff --git a/geonode_mapstore_client/client/themes/geonode/less/_resource-card.less b/geonode_mapstore_client/client/themes/geonode/less/_resource-card.less
index 697ba25eae..49f3f610b4 100644
--- a/geonode_mapstore_client/client/themes/geonode/less/_resource-card.less
+++ b/geonode_mapstore_client/client/themes/geonode/less/_resource-card.less
@@ -38,12 +38,13 @@
.color-var(@theme-vars[main-color]);
.background-color-var(@theme-vars[main-bg]);
}
- .card-img-placeholder {
- .background-color-var(@theme-vars[main-variant-bg]);
- }
.gn-card-options {
.border-color-var(@theme-vars[main-border-color]);
}
+ .card-img-placeholder {
+ .background-color-var(@theme-vars[main-bg]);
+ .color-var(@theme-vars[primary]);
+ }
}
}
@@ -297,6 +298,13 @@ button.btn.btn-default.gn-resource-status.gn-status-button {
}
}
+.card-img-placeholder {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ font-size: 3rem;
+}
+
@media screen and (min-width: 1649px) {
.gn-resource-card {
.card-resource-list {