@ndla/image-search 11.0.103-alpha.0 → 11.0.105-alpha.0

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.
package/es/ImageMeta.js CHANGED
@@ -1,28 +1,18 @@
1
- /**
2
- * Copyright (c) 2022-present, NDLA.
3
- *
4
- * This source code is licensed under the GPLv3 license found in the
5
- * LICENSE file in the root directory of this source tree.
6
- *
7
- */
8
-
9
1
  import { useMemo } from "react";
10
2
  import { Text } from "@ndla/primitives";
11
3
  import { humanFileSize } from "@ndla/util";
12
- import { jsx as _jsx } from "react/jsx-runtime";
13
- const ImageMeta = _ref => {
14
- let {
15
- contentType,
16
- fileSize,
17
- imageDimensions,
18
- locale
19
- } = _ref;
20
- const prettySize = useMemo(() => {
21
- return humanFileSize(fileSize, locale);
22
- }, [fileSize, locale]);
23
- const dimensions = imageDimensions ? ` - ${imageDimensions.width}x${imageDimensions.height} px` : "";
24
- return /*#__PURE__*/_jsx(Text, {
25
- children: `${contentType} - ${prettySize}${dimensions}`
26
- });
4
+ import { jsx } from "react/jsx-runtime";
5
+
6
+ //#region src/ImageMeta.tsx
7
+ const ImageMeta = ({ contentType, fileSize, imageDimensions, locale }) => {
8
+ const prettySize = useMemo(() => {
9
+ return humanFileSize(fileSize, locale);
10
+ }, [fileSize, locale]);
11
+ const dimensions = imageDimensions ? ` - ${imageDimensions.width}x${imageDimensions.height} px` : "";
12
+ return /* @__PURE__ */ jsx(Text, { children: `${contentType} - ${prettySize}${dimensions}` });
27
13
  };
28
- export default ImageMeta;
14
+ var ImageMeta_default = ImageMeta;
15
+
16
+ //#endregion
17
+ export { ImageMeta_default };
18
+ //# sourceMappingURL=ImageMeta.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageMeta.js","names":[],"sources":["../src/ImageMeta.tsx"],"sourcesContent":["/**\n * Copyright (c) 2022-present, NDLA.\n *\n * This source code is licensed under the GPLv3 license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport { useMemo } from \"react\";\nimport { Text } from \"@ndla/primitives\";\nimport type { IImageDimensionsDTO } from \"@ndla/types-backend/image-api\";\nimport { humanFileSize } from \"@ndla/util\";\n\ninterface Props {\n contentType: string;\n fileSize: number;\n imageDimensions?: IImageDimensionsDTO;\n locale: string;\n}\n\nconst ImageMeta = ({ contentType, fileSize, imageDimensions, locale }: Props) => {\n const prettySize = useMemo(() => {\n return humanFileSize(fileSize, locale);\n }, [fileSize, locale]);\n\n const dimensions = imageDimensions ? ` - ${imageDimensions.width}x${imageDimensions.height} px` : \"\";\n return <Text>{`${contentType} - ${prettySize}${dimensions}`}</Text>;\n};\n\nexport default ImageMeta;\n"],"mappings":";;;;;;AAoBA,MAAM,YAAY,CAAC,EAAE,aAAa,UAAU,iBAAiB,QAAe,KAAK;CAC/E,MAAM,aAAa,QAAQ,MAAM;AAC/B,SAAO,cAAc,UAAU,OAAO;CACvC,GAAE,CAAC,UAAU,MAAO,EAAC;CAEtB,MAAM,aAAa,mBAAmB,KAAK,gBAAgB,MAAM,GAAG,gBAAgB,OAAO,OAAO;AAClG,wBAAO,IAAC,mBAAO,EAAE,YAAY,KAAK,WAAW,EAAE,WAAW,IAAS;AACpE;AAED,wBAAe"}
package/es/ImageSearch.js CHANGED
@@ -1,213 +1,161 @@
1
- /**
2
- * Copyright (c) 2017-present, NDLA.
3
- *
4
- * This source code is licensed under the GPLv3 license found in the
5
- * LICENSE file in the root directory of this source tree.
6
- *
7
- */
8
-
1
+ import { ImageSearchResult } from "./ImageSearchResult.js";
9
2
  import { useEffect, useState } from "react";
10
- import { ArrowLeftShortLine, ArrowRightShortLine, SearchLine } from "@ndla/icons";
11
3
  import { Button, IconButton, Input, PaginationContext, PaginationEllipsis, PaginationItem, PaginationNextTrigger, PaginationPrevTrigger, PaginationRoot, Text } from "@ndla/primitives";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ import { ArrowLeftShortLine, ArrowRightShortLine, SearchLine } from "@ndla/icons";
12
6
  import { styled } from "@ndla/styled-system/jsx";
13
- import ImageSearchResult from "./ImageSearchResult";
14
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
15
- const ImageSearchWrapper = styled("div", {
16
- base: {
17
- display: "flex",
18
- flexDirection: "column",
19
- gap: "small"
20
- }
21
- });
22
- const StyledSearchResults = styled("div", {
23
- base: {
24
- display: "grid",
25
- gridTemplateColumns: "repeat(auto-fit, minmax(200px, 1fr))",
26
- gridGap: "xsmall",
27
- gridAutoFlow: "dense"
28
- }
29
- });
30
- const InputWrapper = styled("div", {
31
- base: {
32
- display: "flex",
33
- gap: "xsmall"
34
- }
35
- });
36
- const StyledPaginationRoot = styled(PaginationRoot, {
37
- base: {
38
- flexWrap: "wrap"
39
- }
40
- });
41
- const StyledButton = styled(Button, {
42
- base: {
43
- tabletWideDown: {
44
- paddingInline: "xsmall",
45
- "& span": {
46
- display: "none"
47
- }
48
- }
49
- }
50
- });
51
- const StyledPaginationItem = styled(PaginationItem, {
52
- base: {
53
- tabletWideDown: {
54
- "&:nth-child(2)": {
55
- display: "none"
56
- },
57
- "&:nth-last-child(2)": {
58
- display: "none"
59
- }
60
- }
61
- }
62
- });
63
- const ImageSearch = _ref => {
64
- let {
65
- onImageSelect,
66
- searchImages: search,
67
- onError,
68
- locale,
69
- noResults,
70
- checkboxAction,
71
- showCheckbox,
72
- translations
73
- } = _ref;
74
- const [queryObject, setQueryObject] = useState({
75
- query: undefined,
76
- page: 1,
77
- pageSize: 16
78
- });
79
- const [selectedImage, setSelectedImage] = useState();
80
- const [searching, setSearching] = useState(false);
81
- const [searchResult, setSearchResult] = useState();
82
- const {
83
- page
84
- } = queryObject;
85
- const noResultsFound = !searching && searchResult?.results.length === 0;
86
- const onSelectImage = (image, saveAsMetaImage) => {
87
- setSelectedImage(undefined);
88
- if (!image) return;
89
- onImageSelect(image);
90
- if (saveAsMetaImage) {
91
- checkboxAction?.(image);
92
- }
93
- };
94
- const searchImages = queryObject => {
95
- setSearching(true);
96
- search(queryObject.query, queryObject.page).then(result => {
97
- setQueryObject({
98
- query: queryObject.query,
99
- pageSize: result.pageSize,
100
- page: queryObject.page
101
- });
102
- setSearchResult(result);
103
- setSearching(false);
104
- }).catch(err => {
105
- onError?.(err);
106
- setSearching(false);
107
- });
108
- };
109
- const handleQueryChange = _ref2 => {
110
- let {
111
- target: {
112
- value
113
- }
114
- } = _ref2;
115
- setQueryObject(prevState => ({
116
- ...prevState,
117
- query: value
118
- }));
119
- };
120
- const onEnter = e => {
121
- if (e.key === "Enter") {
122
- searchImages(queryObject);
123
- }
124
- };
125
- useEffect(() => {
126
- searchImages(queryObject);
127
- // eslint-disable-next-line react-hooks/exhaustive-deps
128
- }, []);
129
- return /*#__PURE__*/_jsxs(ImageSearchWrapper, {
130
- children: [/*#__PURE__*/_jsxs(InputWrapper, {
131
- role: "search",
132
- children: [/*#__PURE__*/_jsx(Input, {
133
- type: "search",
134
- placeholder: translations.searchPlaceholder,
135
- value: queryObject?.query ?? "",
136
- onChange: handleQueryChange,
137
- onKeyDown: onEnter
138
- }), /*#__PURE__*/_jsx(IconButton, {
139
- variant: "primary",
140
- "aria-label": translations.searchButtonTitle,
141
- title: translations.searchButtonTitle,
142
- onKeyDown: onEnter,
143
- onClick: () => searchImages(queryObject),
144
- children: /*#__PURE__*/_jsx(SearchLine, {})
145
- })]
146
- }), !!noResultsFound && noResults, /*#__PURE__*/_jsx(StyledSearchResults, {
147
- children: searchResult?.results.map(image => /*#__PURE__*/_jsx(ImageSearchResult, {
148
- image: image,
149
- onImageClick: image => setSelectedImage(image),
150
- selectedImage: selectedImage,
151
- onSelectImage: onSelectImage,
152
- showCheckbox: !!showCheckbox,
153
- translations: translations.imagePreview,
154
- locale: locale
155
- }, image.id))
156
- }), /*#__PURE__*/_jsxs(StyledPaginationRoot, {
157
- page: page ?? 1,
158
- onPageChange: details => searchImages({
159
- ...queryObject,
160
- page: details.page
161
- }),
162
- translations: translations.paginationTranslations,
163
- count: searchResult?.totalCount ?? 0,
164
- pageSize: searchResult?.pageSize,
165
- hidden: noResultsFound,
166
- children: [/*#__PURE__*/_jsx(PaginationPrevTrigger, {
167
- asChild: true,
168
- children: /*#__PURE__*/_jsxs(StyledButton, {
169
- variant: "tertiary",
170
- "aria-label": translations.paginationTranslations?.prevTriggerLabel,
171
- title: translations.paginationTranslations?.prevTriggerLabel,
172
- children: [/*#__PURE__*/_jsx(ArrowLeftShortLine, {}), /*#__PURE__*/_jsx("span", {
173
- children: translations.paginationTranslations?.prevTriggerLabel
174
- })]
175
- })
176
- }), /*#__PURE__*/_jsx(PaginationContext, {
177
- children: pagination => pagination.pages.map((page, index, full) => {
178
- // Hide last page to not trigger RESULT_WINDOW_TOO_LARGE error
179
- if (index === full.length - 1) return null;
180
- return page.type === "page" ? /*#__PURE__*/_jsx(StyledPaginationItem, {
181
- ...page,
182
- asChild: true,
183
- children: /*#__PURE__*/_jsx(Button, {
184
- variant: page.value === pagination.page ? "primary" : "tertiary",
185
- children: page.value
186
- })
187
- }, index) : /*#__PURE__*/_jsx(PaginationEllipsis, {
188
- index: index,
189
- asChild: true,
190
- children: /*#__PURE__*/_jsx(Text, {
191
- asChild: true,
192
- consumeCss: true,
193
- children: /*#__PURE__*/_jsx("div", {
194
- children: "\u2026"
195
- })
196
- })
197
- }, index);
198
- })
199
- }), /*#__PURE__*/_jsx(PaginationNextTrigger, {
200
- asChild: true,
201
- children: /*#__PURE__*/_jsxs(StyledButton, {
202
- variant: "tertiary",
203
- "aria-label": translations.paginationTranslations?.nextTriggerLabel,
204
- title: translations.paginationTranslations?.nextTriggerLabel,
205
- children: [/*#__PURE__*/_jsx("span", {
206
- children: translations.paginationTranslations?.nextTriggerLabel
207
- }), /*#__PURE__*/_jsx(ArrowRightShortLine, {})]
208
- })
209
- })]
210
- })]
211
- });
7
+
8
+ //#region src/ImageSearch.tsx
9
+ const ImageSearchWrapper = styled("div", { base: {
10
+ display: "flex",
11
+ flexDirection: "column",
12
+ gap: "small"
13
+ } });
14
+ const StyledSearchResults = styled("div", { base: {
15
+ display: "grid",
16
+ gridTemplateColumns: "repeat(auto-fit, minmax(200px, 1fr))",
17
+ gridGap: "xsmall",
18
+ gridAutoFlow: "dense"
19
+ } });
20
+ const InputWrapper = styled("div", { base: {
21
+ display: "flex",
22
+ gap: "xsmall"
23
+ } });
24
+ const StyledPaginationRoot = styled(PaginationRoot, { base: { flexWrap: "wrap" } });
25
+ const StyledButton = styled(Button, { base: { tabletWideDown: {
26
+ paddingInline: "xsmall",
27
+ "& span": { display: "none" }
28
+ } } });
29
+ const StyledPaginationItem = styled(PaginationItem, { base: { tabletWideDown: {
30
+ "&:nth-child(2)": { display: "none" },
31
+ "&:nth-last-child(2)": { display: "none" }
32
+ } } });
33
+ const ImageSearch = ({ onImageSelect, searchImages: search, onError, locale, noResults, checkboxAction, showCheckbox, translations }) => {
34
+ const [queryObject, setQueryObject] = useState({
35
+ query: void 0,
36
+ page: 1,
37
+ pageSize: 16
38
+ });
39
+ const [selectedImage, setSelectedImage] = useState();
40
+ const [searching, setSearching] = useState(false);
41
+ const [searchResult, setSearchResult] = useState();
42
+ const { page } = queryObject;
43
+ const noResultsFound = !searching && searchResult?.results.length === 0;
44
+ const onSelectImage = (image, saveAsMetaImage) => {
45
+ setSelectedImage(void 0);
46
+ if (!image) return;
47
+ onImageSelect(image);
48
+ if (saveAsMetaImage) checkboxAction?.(image);
49
+ };
50
+ const searchImages = (queryObject$1) => {
51
+ setSearching(true);
52
+ search(queryObject$1.query, queryObject$1.page).then((result) => {
53
+ setQueryObject({
54
+ query: queryObject$1.query,
55
+ pageSize: result.pageSize,
56
+ page: queryObject$1.page
57
+ });
58
+ setSearchResult(result);
59
+ setSearching(false);
60
+ }).catch((err) => {
61
+ onError?.(err);
62
+ setSearching(false);
63
+ });
64
+ };
65
+ const handleQueryChange = ({ target: { value } }) => {
66
+ setQueryObject((prevState) => ({
67
+ ...prevState,
68
+ query: value
69
+ }));
70
+ };
71
+ const onEnter = (e) => {
72
+ if (e.key === "Enter") searchImages(queryObject);
73
+ };
74
+ useEffect(() => {
75
+ searchImages(queryObject);
76
+ }, []);
77
+ return /* @__PURE__ */ jsxs(ImageSearchWrapper, { children: [
78
+ /* @__PURE__ */ jsxs(InputWrapper, {
79
+ role: "search",
80
+ children: [/* @__PURE__ */ jsx(Input, {
81
+ type: "search",
82
+ placeholder: translations.searchPlaceholder,
83
+ value: queryObject?.query ?? "",
84
+ onChange: handleQueryChange,
85
+ onKeyDown: onEnter
86
+ }), /* @__PURE__ */ jsx(IconButton, {
87
+ variant: "primary",
88
+ "aria-label": translations.searchButtonTitle,
89
+ title: translations.searchButtonTitle,
90
+ onKeyDown: onEnter,
91
+ onClick: () => searchImages(queryObject),
92
+ children: /* @__PURE__ */ jsx(SearchLine, {})
93
+ })]
94
+ }),
95
+ !!noResultsFound && noResults,
96
+ /* @__PURE__ */ jsx(StyledSearchResults, { children: searchResult?.results.map((image) => /* @__PURE__ */ jsx(ImageSearchResult, {
97
+ image,
98
+ onImageClick: (image$1) => setSelectedImage(image$1),
99
+ selectedImage,
100
+ onSelectImage,
101
+ showCheckbox: !!showCheckbox,
102
+ translations: translations.imagePreview,
103
+ locale
104
+ }, image.id)) }),
105
+ /* @__PURE__ */ jsxs(StyledPaginationRoot, {
106
+ page: page ?? 1,
107
+ onPageChange: (details) => searchImages({
108
+ ...queryObject,
109
+ page: details.page
110
+ }),
111
+ translations: translations.paginationTranslations,
112
+ count: searchResult?.totalCount ?? 0,
113
+ pageSize: searchResult?.pageSize,
114
+ hidden: noResultsFound,
115
+ children: [
116
+ /* @__PURE__ */ jsx(PaginationPrevTrigger, {
117
+ asChild: true,
118
+ children: /* @__PURE__ */ jsxs(StyledButton, {
119
+ variant: "tertiary",
120
+ "aria-label": translations.paginationTranslations?.prevTriggerLabel,
121
+ title: translations.paginationTranslations?.prevTriggerLabel,
122
+ children: [/* @__PURE__ */ jsx(ArrowLeftShortLine, {}), /* @__PURE__ */ jsx("span", { children: translations.paginationTranslations?.prevTriggerLabel })]
123
+ })
124
+ }),
125
+ /* @__PURE__ */ jsx(PaginationContext, { children: (pagination) => pagination.pages.map((page$1, index, full) => {
126
+ if (index === full.length - 1) return null;
127
+ return page$1.type === "page" ? /* @__PURE__ */ jsx(StyledPaginationItem, {
128
+ ...page$1,
129
+ asChild: true,
130
+ children: /* @__PURE__ */ jsx(Button, {
131
+ variant: page$1.value === pagination.page ? "primary" : "tertiary",
132
+ children: page$1.value
133
+ })
134
+ }, index) : /* @__PURE__ */ jsx(PaginationEllipsis, {
135
+ index,
136
+ asChild: true,
137
+ children: /* @__PURE__ */ jsx(Text, {
138
+ asChild: true,
139
+ consumeCss: true,
140
+ children: /* @__PURE__ */ jsx("div", { children: "…" })
141
+ })
142
+ }, index);
143
+ }) }),
144
+ /* @__PURE__ */ jsx(PaginationNextTrigger, {
145
+ asChild: true,
146
+ children: /* @__PURE__ */ jsxs(StyledButton, {
147
+ variant: "tertiary",
148
+ "aria-label": translations.paginationTranslations?.nextTriggerLabel,
149
+ title: translations.paginationTranslations?.nextTriggerLabel,
150
+ children: [/* @__PURE__ */ jsx("span", { children: translations.paginationTranslations?.nextTriggerLabel }), /* @__PURE__ */ jsx(ArrowRightShortLine, {})]
151
+ })
152
+ })
153
+ ]
154
+ })
155
+ ] });
212
156
  };
213
- export default ImageSearch;
157
+ var ImageSearch_default = ImageSearch;
158
+
159
+ //#endregion
160
+ export { ImageSearch_default };
161
+ //# sourceMappingURL=ImageSearch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageSearch.js","names":["image: IImageMetaInformationV3DTO | undefined","saveAsMetaImage?: boolean","queryObject: ISearchParamsDTO","queryObject","e: KeyboardEvent<HTMLInputElement | HTMLButtonElement>","image","page"],"sources":["../src/ImageSearch.tsx"],"sourcesContent":["/**\n * Copyright (c) 2017-present, NDLA.\n *\n * This source code is licensed under the GPLv3 license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport { type ChangeEvent, type ReactNode, type KeyboardEvent, useEffect, useState } from \"react\";\nimport { ArrowLeftShortLine, ArrowRightShortLine, SearchLine } from \"@ndla/icons\";\nimport {\n Button,\n IconButton,\n Input,\n PaginationContext,\n PaginationEllipsis,\n PaginationItem,\n PaginationNextTrigger,\n PaginationPrevTrigger,\n PaginationRoot,\n Text,\n type PaginationRootProps,\n} from \"@ndla/primitives\";\nimport { styled } from \"@ndla/styled-system/jsx\";\nimport type { IImageMetaInformationV3DTO, ISearchResultV3DTO, ISearchParamsDTO } from \"@ndla/types-backend/image-api\";\nimport ImageSearchResult from \"./ImageSearchResult\";\n\nconst ImageSearchWrapper = styled(\"div\", {\n base: {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"small\",\n },\n});\n\nconst StyledSearchResults = styled(\"div\", {\n base: {\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fit, minmax(200px, 1fr))\",\n gridGap: \"xsmall\",\n gridAutoFlow: \"dense\",\n },\n});\n\nconst InputWrapper = styled(\"div\", {\n base: {\n display: \"flex\",\n gap: \"xsmall\",\n },\n});\n\nconst StyledPaginationRoot = styled(PaginationRoot, {\n base: {\n flexWrap: \"wrap\",\n },\n});\n\nconst StyledButton = styled(Button, {\n base: {\n tabletWideDown: {\n paddingInline: \"xsmall\",\n \"& span\": {\n display: \"none\",\n },\n },\n },\n});\n\nconst StyledPaginationItem = styled(PaginationItem, {\n base: {\n tabletWideDown: {\n \"&:nth-child(2)\": {\n display: \"none\",\n },\n \"&:nth-last-child(2)\": {\n display: \"none\",\n },\n },\n },\n});\n\nexport interface PreviewTranslations {\n creatorsLabel: string;\n license: string;\n caption: string;\n altText: string;\n modelRelease: string;\n tags: string;\n close: string;\n checkboxLabel?: string;\n missingTitleFallback?: string;\n useImageTitle: string;\n}\n\nexport interface ImageSearchTranslations {\n searchPlaceholder: string;\n searchButtonTitle: string;\n imagePreview: PreviewTranslations;\n paginationTranslations: PaginationRootProps[\"translations\"];\n}\n\nexport interface ImageSearchProps {\n onImageSelect: (image: IImageMetaInformationV3DTO) => void;\n searchImages: (query: string | undefined, page: number | undefined) => Promise<ISearchResultV3DTO>;\n onError?: (err: any) => void;\n locale: string;\n noResults?: ReactNode;\n checkboxAction?: (image: IImageMetaInformationV3DTO) => void;\n showCheckbox?: boolean;\n translations: ImageSearchTranslations;\n}\n\nconst ImageSearch = ({\n onImageSelect,\n searchImages: search,\n onError,\n locale,\n noResults,\n checkboxAction,\n showCheckbox,\n translations,\n}: ImageSearchProps) => {\n const [queryObject, setQueryObject] = useState<ISearchParamsDTO>({\n query: undefined,\n page: 1,\n pageSize: 16,\n });\n const [selectedImage, setSelectedImage] = useState<IImageMetaInformationV3DTO | undefined>();\n const [searching, setSearching] = useState<boolean>(false);\n const [searchResult, setSearchResult] = useState<ISearchResultV3DTO | undefined>();\n\n const { page } = queryObject;\n const noResultsFound = !searching && searchResult?.results.length === 0;\n\n const onSelectImage = (image: IImageMetaInformationV3DTO | undefined, saveAsMetaImage?: boolean) => {\n setSelectedImage(undefined);\n if (!image) return;\n onImageSelect(image);\n if (saveAsMetaImage) {\n checkboxAction?.(image);\n }\n };\n\n const searchImages = (queryObject: ISearchParamsDTO) => {\n setSearching(true);\n search(queryObject.query, queryObject.page)\n .then((result) => {\n setQueryObject({\n query: queryObject.query,\n pageSize: result.pageSize,\n page: queryObject.page,\n });\n setSearchResult(result);\n setSearching(false);\n })\n .catch((err) => {\n onError?.(err);\n setSearching(false);\n });\n };\n\n const handleQueryChange = ({ target: { value } }: ChangeEvent<HTMLInputElement>) => {\n setQueryObject((prevState) => ({\n ...prevState,\n query: value,\n }));\n };\n\n const onEnter = (e: KeyboardEvent<HTMLInputElement | HTMLButtonElement>) => {\n if (e.key === \"Enter\") {\n searchImages(queryObject);\n }\n };\n\n useEffect(() => {\n searchImages(queryObject);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n <ImageSearchWrapper>\n <InputWrapper role=\"search\">\n <Input\n type=\"search\"\n placeholder={translations.searchPlaceholder}\n value={queryObject?.query ?? \"\"}\n onChange={handleQueryChange}\n onKeyDown={onEnter}\n />\n <IconButton\n variant=\"primary\"\n aria-label={translations.searchButtonTitle}\n title={translations.searchButtonTitle}\n onKeyDown={onEnter}\n onClick={() => searchImages(queryObject)}\n >\n <SearchLine />\n </IconButton>\n </InputWrapper>\n {!!noResultsFound && noResults}\n <StyledSearchResults>\n {searchResult?.results.map((image) => (\n <ImageSearchResult\n key={image.id}\n image={image}\n onImageClick={(image) => setSelectedImage(image)}\n selectedImage={selectedImage}\n onSelectImage={onSelectImage}\n showCheckbox={!!showCheckbox}\n translations={translations.imagePreview}\n locale={locale}\n />\n ))}\n </StyledSearchResults>\n <StyledPaginationRoot\n page={page ?? 1}\n onPageChange={(details) => searchImages({ ...queryObject, page: details.page })}\n translations={translations.paginationTranslations}\n count={searchResult?.totalCount ?? 0}\n pageSize={searchResult?.pageSize}\n hidden={noResultsFound}\n >\n <PaginationPrevTrigger asChild>\n <StyledButton\n variant=\"tertiary\"\n aria-label={translations.paginationTranslations?.prevTriggerLabel}\n title={translations.paginationTranslations?.prevTriggerLabel}\n >\n <ArrowLeftShortLine />\n <span>{translations.paginationTranslations?.prevTriggerLabel}</span>\n </StyledButton>\n </PaginationPrevTrigger>\n <PaginationContext>\n {(pagination) =>\n pagination.pages.map((page, index, full) => {\n // Hide last page to not trigger RESULT_WINDOW_TOO_LARGE error\n if (index === full.length - 1) return null;\n return page.type === \"page\" ? (\n <StyledPaginationItem key={index} {...page} asChild>\n <Button variant={page.value === pagination.page ? \"primary\" : \"tertiary\"}>{page.value}</Button>\n </StyledPaginationItem>\n ) : (\n <PaginationEllipsis key={index} index={index} asChild>\n <Text asChild consumeCss>\n <div>&#8230;</div>\n </Text>\n </PaginationEllipsis>\n );\n })\n }\n </PaginationContext>\n <PaginationNextTrigger asChild>\n <StyledButton\n variant=\"tertiary\"\n aria-label={translations.paginationTranslations?.nextTriggerLabel}\n title={translations.paginationTranslations?.nextTriggerLabel}\n >\n <span>{translations.paginationTranslations?.nextTriggerLabel}</span>\n <ArrowRightShortLine />\n </StyledButton>\n </PaginationNextTrigger>\n </StyledPaginationRoot>\n </ImageSearchWrapper>\n );\n};\n\nexport default ImageSearch;\n"],"mappings":"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"}
@@ -1,73 +1,50 @@
1
- /**
2
- * Copyright (c) 2017-present, NDLA.
3
- *
4
- * This source code is licensed under the GPLv3 license found in the
5
- * LICENSE file in the root directory of this source tree.
6
- *
7
- */
8
-
9
- import { Text, Image, Button } from "@ndla/primitives";
1
+ import { getPreviewSrcSets } from "./util/imageUtil.js";
2
+ import { PreviewImage_default } from "./PreviewImage.js";
3
+ import { Button, Image, Text } from "@ndla/primitives";
4
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
10
5
  import { styled } from "@ndla/styled-system/jsx";
11
- import PreviewImage from "./PreviewImage";
12
- import { getPreviewSrcSets } from "./util/imageUtil";
13
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
14
- const StyledButton = styled(Button, {
15
- base: {
16
- display: "flex",
17
- flexDirection: "column",
18
- borderColor: "stroke.subtle"
19
- }
20
- });
21
- const StyledImage = styled(Image, {
22
- base: {
23
- maxHeight: "135px",
24
- width: "100%",
25
- height: "100%"
26
- }
27
- });
28
- const StyledText = styled(Text, {
29
- base: {
30
- lineClamp: "3"
31
- }
32
- });
33
- export default function ImageSearchResult(_ref) {
34
- let {
35
- image,
36
- onImageClick,
37
- selectedImage,
38
- onSelectImage,
39
- showCheckbox,
40
- translations,
41
- locale
42
- } = _ref;
43
- const isSelectedImage = selectedImage?.id === image.id;
44
- return /*#__PURE__*/_jsxs(_Fragment, {
45
- children: [/*#__PURE__*/_jsxs(StyledButton, {
46
- variant: isSelectedImage ? "secondary" : "tertiary",
47
- "data-testid": "select-image-from-list",
48
- onClick: () => onImageClick(image),
49
- "aria-expanded": isSelectedImage,
50
- "aria-controls": `image-preview-${image.id}`,
51
- children: [/*#__PURE__*/_jsx(StyledImage, {
52
- alt: "",
53
- srcSet: getPreviewSrcSets(image.image.imageUrl),
54
- src: image.image.imageUrl,
55
- variant: "rounded"
56
- }), /*#__PURE__*/_jsx(StyledText, {
57
- textStyle: "label.medium",
58
- asChild: true,
59
- consumeCss: true,
60
- children: /*#__PURE__*/_jsx("span", {
61
- children: image.title.title.trim() ? image.title.title : translations.missingTitleFallback ?? `ID: ${image.id}`
62
- })
63
- })]
64
- }), isSelectedImage ? /*#__PURE__*/_jsx(PreviewImage, {
65
- id: `image-preview-${image.id}`,
66
- image: selectedImage,
67
- onSelectImage: onSelectImage,
68
- translations: translations,
69
- showCheckbox: showCheckbox,
70
- locale: locale
71
- }) : null]
72
- });
73
- }
6
+
7
+ //#region src/ImageSearchResult.tsx
8
+ const StyledButton = styled(Button, { base: {
9
+ display: "flex",
10
+ flexDirection: "column",
11
+ borderColor: "stroke.subtle"
12
+ } });
13
+ const StyledImage = styled(Image, { base: {
14
+ maxHeight: "135px",
15
+ width: "100%",
16
+ height: "100%"
17
+ } });
18
+ const StyledText = styled(Text, { base: { lineClamp: "3" } });
19
+ function ImageSearchResult({ image, onImageClick, selectedImage, onSelectImage, showCheckbox, translations, locale }) {
20
+ const isSelectedImage = selectedImage?.id === image.id;
21
+ return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs(StyledButton, {
22
+ variant: isSelectedImage ? "secondary" : "tertiary",
23
+ "data-testid": "select-image-from-list",
24
+ onClick: () => onImageClick(image),
25
+ "aria-expanded": isSelectedImage,
26
+ "aria-controls": `image-preview-${image.id}`,
27
+ children: [/* @__PURE__ */ jsx(StyledImage, {
28
+ alt: "",
29
+ srcSet: getPreviewSrcSets(image.image.imageUrl),
30
+ src: image.image.imageUrl,
31
+ variant: "rounded"
32
+ }), /* @__PURE__ */ jsx(StyledText, {
33
+ textStyle: "label.medium",
34
+ asChild: true,
35
+ consumeCss: true,
36
+ children: /* @__PURE__ */ jsx("span", { children: image.title.title.trim() ? image.title.title : translations.missingTitleFallback ?? `ID: ${image.id}` })
37
+ })]
38
+ }), isSelectedImage ? /* @__PURE__ */ jsx(PreviewImage_default, {
39
+ id: `image-preview-${image.id}`,
40
+ image: selectedImage,
41
+ onSelectImage,
42
+ translations,
43
+ showCheckbox,
44
+ locale
45
+ }) : null] });
46
+ }
47
+
48
+ //#endregion
49
+ export { ImageSearchResult };
50
+ //# sourceMappingURL=ImageSearchResult.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageSearchResult.js","names":["PreviewImage"],"sources":["../src/ImageSearchResult.tsx"],"sourcesContent":["/**\n * Copyright (c) 2017-present, NDLA.\n *\n * This source code is licensed under the GPLv3 license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport { Text, Image, Button } from \"@ndla/primitives\";\nimport { styled } from \"@ndla/styled-system/jsx\";\nimport type { IImageMetaInformationV3DTO } from \"@ndla/types-backend/image-api\";\nimport type { PreviewTranslations } from \"./ImageSearch\";\nimport PreviewImage from \"./PreviewImage\";\nimport { getPreviewSrcSets } from \"./util/imageUtil\";\n\nconst StyledButton = styled(Button, {\n base: {\n display: \"flex\",\n flexDirection: \"column\",\n borderColor: \"stroke.subtle\",\n },\n});\n\nconst StyledImage = styled(Image, {\n base: {\n maxHeight: \"135px\",\n width: \"100%\",\n height: \"100%\",\n },\n});\n\nconst StyledText = styled(Text, {\n base: {\n lineClamp: \"3\",\n },\n});\n\ninterface Props {\n image: IImageMetaInformationV3DTO;\n onImageClick: (image: IImageMetaInformationV3DTO) => void;\n selectedImage?: IImageMetaInformationV3DTO;\n onSelectImage: (image: IImageMetaInformationV3DTO | undefined, saveAsMetaImage?: boolean) => void;\n showCheckbox: boolean;\n translations: PreviewTranslations;\n locale: string;\n}\n\nexport default function ImageSearchResult({\n image,\n onImageClick,\n selectedImage,\n onSelectImage,\n showCheckbox,\n translations,\n locale,\n}: Props) {\n const isSelectedImage = selectedImage?.id === image.id;\n return (\n <>\n <StyledButton\n variant={isSelectedImage ? \"secondary\" : \"tertiary\"}\n data-testid=\"select-image-from-list\"\n onClick={() => onImageClick(image)}\n aria-expanded={isSelectedImage}\n aria-controls={`image-preview-${image.id}`}\n >\n <StyledImage\n alt=\"\"\n srcSet={getPreviewSrcSets(image.image.imageUrl)}\n src={image.image.imageUrl}\n variant=\"rounded\"\n />\n <StyledText textStyle=\"label.medium\" asChild consumeCss>\n <span>\n {image.title.title.trim() ? image.title.title : (translations.missingTitleFallback ?? `ID: ${image.id}`)}\n </span>\n </StyledText>\n </StyledButton>\n {isSelectedImage ? (\n <PreviewImage\n id={`image-preview-${image.id}`}\n image={selectedImage}\n onSelectImage={onSelectImage}\n translations={translations}\n showCheckbox={showCheckbox}\n locale={locale}\n />\n ) : null}\n </>\n );\n}\n"],"mappings":";;;;;;;AAeA,MAAM,eAAe,OAAO,QAAQ,EAClC,MAAM;CACJ,SAAS;CACT,eAAe;CACf,aAAa;AACd,EACF,EAAC;AAEF,MAAM,cAAc,OAAO,OAAO,EAChC,MAAM;CACJ,WAAW;CACX,OAAO;CACP,QAAQ;AACT,EACF,EAAC;AAEF,MAAM,aAAa,OAAO,MAAM,EAC9B,MAAM,EACJ,WAAW,IACZ,EACF,EAAC;AAYF,SAAwB,kBAAkB,EACxC,OACA,cACA,eACA,eACA,cACA,cACA,QACM,EAAE;CACR,MAAM,kBAAkB,eAAe,OAAO,MAAM;AACpD,wBACE,4CACE,KAAC;EACC,SAAS,kBAAkB,cAAc;EACzC,eAAY;EACZ,SAAS,MAAM,aAAa,MAAM;EAClC,iBAAe;EACf,kBAAgB,gBAAgB,MAAM,GAAG;6BAEzC,IAAC;GACC,KAAI;GACJ,QAAQ,kBAAkB,MAAM,MAAM,SAAS;GAC/C,KAAK,MAAM,MAAM;GACjB,SAAQ;IACR,kBACF,IAAC;GAAW,WAAU;GAAe;GAAQ;6BAC3C,IAAC,oBACE,MAAM,MAAM,MAAM,MAAM,GAAG,MAAM,MAAM,QAAS,aAAa,yBAAyB,MAAM,MAAM,GAAG,IACjG;IACI;GACA,EACd,kCACC,IAACA;EACC,KAAK,gBAAgB,MAAM,GAAG;EAC9B,OAAO;EACQ;EACD;EACA;EACN;GACR,GACA,QACH;AAEN"}