@evergis/uilib-gl 1.0.98 → 1.0.100

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -29,4 +29,9 @@ declare type SlideShowImageProps = ImageProps & {
29
29
  };
30
30
  export declare const SlideShowImageContainer: import("styled-components").StyledComponent<"div", import("styled-components").DefaultTheme, {}, never>;
31
31
  export declare const ChoosableImage: import("styled-components").StyledComponent<import("react").FC<ImageProps>, import("styled-components").DefaultTheme, SlideShowImageProps, never>;
32
+ export declare const PreviewImageError: import("styled-components").StyledComponent<"div", import("styled-components").DefaultTheme, {}, never>;
33
+ export declare const PreviewImageErrorText: import("styled-components").StyledComponent<"div", import("styled-components").DefaultTheme, {}, never>;
34
+ export declare const SlideShowImageStatus: import("styled-components").StyledComponent<"div", import("styled-components").DefaultTheme, {
35
+ chosen?: boolean | undefined;
36
+ }, never>;
32
37
  export {};
@@ -2,6 +2,8 @@ import { RefObject } from "react";
2
2
  export declare type IPreviewImage = {
3
3
  src: string;
4
4
  fileName: string;
5
+ hasError?: boolean;
6
+ isLoading?: boolean;
5
7
  };
6
8
  export declare type ControlText = {
7
9
  downloadTitleText?: string;
@@ -9,6 +11,7 @@ export declare type ControlText = {
9
11
  closeTitleText?: string;
10
12
  prevImgTitleText?: string;
11
13
  nextImgTitleText?: string;
14
+ errorTitleText?: string;
12
15
  };
13
16
  export declare type IPreviewProps = ControlText & {
14
17
  images?: IPreviewImage[];
@@ -40,10 +43,10 @@ export declare type IPreviewControlsProps = ControlText & {
40
43
  export interface IPreviewSlideShowProps {
41
44
  chosenImageIndex?: number;
42
45
  setPreview?: (idx: number) => void;
43
- images?: string[];
46
+ images?: IPreviewImage[];
44
47
  }
45
48
  export interface IGalleryImageProps {
46
- image: string;
49
+ image: IPreviewImage;
47
50
  isChosen: boolean;
48
51
  slideShowRef: RefObject<HTMLDivElement>;
49
52
  adjustSlider: (px: number) => void;
@@ -19849,25 +19849,27 @@ const DropdownField = /*#__PURE__*/styled.div.attrs(props => ({
19849
19849
  border-color: ${_ref4 => {
19850
19850
  let {
19851
19851
  theme: {
19852
- input
19852
+ input,
19853
+ palette
19853
19854
  },
19854
19855
  error,
19855
19856
  active,
19856
19857
  focused
19857
19858
  } = _ref4;
19858
- return error ? input.error : active ? "transparent" : focused ? input.hoverBorderColor : "";
19859
+ return error ? input.error : active ? palette.primary : focused ? input.hoverBorderColor : "";
19859
19860
  }};
19860
19861
 
19861
19862
  :hover {
19862
19863
  border-color: ${_ref5 => {
19863
19864
  let {
19864
19865
  theme: {
19865
- input
19866
+ input,
19867
+ palette
19866
19868
  },
19867
19869
  error,
19868
19870
  active
19869
19871
  } = _ref5;
19870
- return error ? input.error : active ? "transparent" : input.hoverBorderColor;
19872
+ return error ? input.error : active ? palette.primary : input.hoverBorderColor;
19871
19873
  }};
19872
19874
  }
19873
19875
  `;
@@ -27019,6 +27021,70 @@ const ChoosableImage = /*#__PURE__*/styled(Image).attrs(() => ({
27019
27021
  border-radius: 2px;
27020
27022
  box-sizing: border-box;
27021
27023
  `;
27024
+ const PreviewImageError = styled.div`
27025
+ display: flex;
27026
+ flex-direction: column;
27027
+ align-items: center;
27028
+ justify-content: center;
27029
+ gap: 0.5rem;
27030
+ width: 100%;
27031
+ height: 100%;
27032
+ color: rgba(255, 255, 255, 0.54);
27033
+ background: rgba(0, 0, 0, 0.24);
27034
+ border-radius: 0.25rem;
27035
+
27036
+ ${Icon} {
27037
+ width: 3rem;
27038
+ height: 3rem;
27039
+ }
27040
+
27041
+ ${Icon}:after {
27042
+ font-size: 3rem;
27043
+ color: rgba(255, 255, 255, 0.54);
27044
+ }
27045
+ `;
27046
+ const PreviewImageErrorText = styled.div`
27047
+ font-size: 0.875rem;
27048
+ color: rgba(255, 255, 255, 0.7);
27049
+ `;
27050
+ const SlideShowImageStatus = styled.div`
27051
+ display: flex;
27052
+ align-items: center;
27053
+ justify-content: center;
27054
+ width: 4.5rem;
27055
+ height: 4.5rem;
27056
+ margin: 0 0.25rem;
27057
+ border: ${_ref11 => {
27058
+ let {
27059
+ chosen
27060
+ } = _ref11;
27061
+ return chosen ? 2 : 1;
27062
+ }}px solid #fff;
27063
+ opacity: ${_ref12 => {
27064
+ let {
27065
+ chosen
27066
+ } = _ref12;
27067
+ return chosen ? 1 : 0.54;
27068
+ }};
27069
+ border-radius: 2px;
27070
+ box-sizing: border-box;
27071
+ background: rgba(0, 0, 0, 0.24);
27072
+
27073
+ ${Icon} {
27074
+ width: 1.5rem;
27075
+ height: 1.5rem;
27076
+ }
27077
+
27078
+ ${Icon}:after {
27079
+ font-size: 1.5rem;
27080
+ color: rgba(255, 255, 255, 0.7);
27081
+ }
27082
+
27083
+ ${LinearProgress} {
27084
+ width: 60%;
27085
+ border-radius: 0.25rem;
27086
+ }
27087
+ `;
27022
27088
 
27023
27089
  const PreviewControlsComponent = _ref => {
27024
27090
  let {
@@ -27177,12 +27243,22 @@ const SlideShowImage = /*#__PURE__*/memo(_ref => {
27177
27243
  onClick
27178
27244
  } = _ref;
27179
27245
  const ref = useAdjustSlideShowImage(isChosen, slideShowRef, adjustSlider);
27246
+ const [hasLoadError, setHasLoadError] = useState(false);
27247
+ const showError = image.hasError || hasLoadError;
27248
+ const showLoader = !showError && (image.isLoading || !image.src);
27180
27249
  return React.createElement(SlideShowImageContainer, {
27181
27250
  ref: ref,
27182
27251
  onClick: onClick
27183
- }, React.createElement(ChoosableImage, {
27184
- src: image,
27252
+ }, showError ? React.createElement(SlideShowImageStatus, {
27253
+ chosen: isChosen
27254
+ }, React.createElement(Icon, {
27255
+ kind: "alert"
27256
+ })) : showLoader ? React.createElement(SlideShowImageStatus, {
27185
27257
  chosen: isChosen
27258
+ }, React.createElement(LinearProgress, null)) : React.createElement(ChoosableImage, {
27259
+ src: image.src,
27260
+ chosen: isChosen,
27261
+ onError: () => setHasLoadError(true)
27186
27262
  }));
27187
27263
  });
27188
27264
 
@@ -27201,7 +27277,7 @@ const PreviewSlideShow = /*#__PURE__*/memo(_ref => {
27201
27277
  ref: slideShowRef,
27202
27278
  left: left
27203
27279
  }, images && images.map((image, index) => React.createElement(SlideShowImage, {
27204
- key: `${index}_${image}`,
27280
+ key: `${index}_${image.src}`,
27205
27281
  isChosen: index === chosenImageIndex,
27206
27282
  image: image,
27207
27283
  slideShowRef: slideShowRef,
@@ -27247,7 +27323,13 @@ const PreviewComponent = _ref => {
27247
27323
  images = [],
27248
27324
  isOpen,
27249
27325
  root,
27250
- onClose
27326
+ onClose,
27327
+ downloadTitleText,
27328
+ fullScreenTitleText,
27329
+ closeTitleText,
27330
+ prevImgTitleText,
27331
+ nextImgTitleText,
27332
+ errorTitleText
27251
27333
  } = _ref;
27252
27334
  const [{
27253
27335
  chosenImageIndex,
@@ -27259,33 +27341,46 @@ const PreviewComponent = _ref => {
27259
27341
  next,
27260
27342
  toggleFullscreen
27261
27343
  }] = useImageSlideShow(images);
27344
+ const [failedSrcs, setFailedSrcs] = useState({});
27345
+ const handleImageError = useCallback(src => {
27346
+ if (!src) return;
27347
+ setFailedSrcs(prev => prev[src] ? prev : { ...prev,
27348
+ [src]: true
27349
+ });
27350
+ }, []);
27351
+ const decoratedImages = useMemo(() => images.map(image => failedSrcs[image.src] ? { ...image,
27352
+ hasError: true
27353
+ } : image), [images, failedSrcs]);
27354
+ const decoratedChosenImage = useMemo(() => chosenImage ? decoratedImages[chosenImageIndex] ?? chosenImage : undefined, [chosenImage, chosenImageIndex, decoratedImages]);
27262
27355
  const shouldOpenPreview = useMemo(() => images.length > 0 && isOpen, [images, isOpen]);
27263
- const imageSources = useMemo(() => images.map(_ref2 => {
27264
- let {
27265
- src
27266
- } = _ref2;
27267
- return src;
27268
- }), [images]);
27269
27356
  return !shouldOpenPreview ? null : React.createElement(Portal, {
27270
27357
  root: root
27271
27358
  }, React.createElement(ThemeProvider, {
27272
27359
  theme: theme$1
27273
27360
  }, React.createElement(PreviewOverlay, null, React.createElement(PreviewControls, {
27274
- chosenImage: chosenImage,
27361
+ chosenImage: decoratedChosenImage,
27275
27362
  fullscreen: fullscreen,
27276
27363
  toggleFullscreen: toggleFullscreen,
27277
27364
  prev: prev,
27278
27365
  next: next,
27279
- close: onClose
27366
+ close: onClose,
27367
+ downloadTitleText: downloadTitleText,
27368
+ fullScreenTitleText: fullScreenTitleText,
27369
+ closeTitleText: closeTitleText,
27370
+ prevImgTitleText: prevImgTitleText,
27371
+ nextImgTitleText: nextImgTitleText
27280
27372
  }), React.createElement(PreviewSlideShow, {
27281
- images: imageSources,
27373
+ images: decoratedImages,
27282
27374
  chosenImageIndex: chosenImageIndex,
27283
27375
  setPreview: setChosenImageIndex
27284
- }), chosenImage && React.createElement(PreviewImageContainer, {
27285
- fullscreen: fullscreen
27286
- }, React.createElement(PreviewImage, {
27287
- src: chosenImage.src,
27376
+ }), decoratedChosenImage && React.createElement(PreviewImageContainer, {
27288
27377
  fullscreen: fullscreen
27378
+ }, decoratedChosenImage.hasError ? React.createElement(PreviewImageError, null, React.createElement(Icon, {
27379
+ kind: "alert"
27380
+ }), React.createElement(PreviewImageErrorText, null, errorTitleText || "Ресурс недоступен")) : React.createElement(PreviewImage, {
27381
+ src: decoratedChosenImage.src,
27382
+ fullscreen: fullscreen,
27383
+ onError: () => handleImageError(decoratedChosenImage.src)
27289
27384
  })))));
27290
27385
  };
27291
27386