@ndla/image-search 11.0.126-alpha.0 → 11.0.128-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.mjs +7 -0
- package/es/ImageMeta.mjs.map +1 -1
- package/es/ImageSearch.mjs +7 -0
- package/es/ImageSearch.mjs.map +1 -1
- package/es/ImageSearchResult.mjs +7 -0
- package/es/ImageSearchResult.mjs.map +1 -1
- package/es/PreviewImage.mjs +7 -0
- package/es/PreviewImage.mjs.map +1 -1
- package/lib/ImageMeta.d.ts +2 -2
- package/lib/ImageMeta.js +7 -5
- package/lib/ImageMeta.js.map +1 -1
- package/lib/ImageSearch.d.ts +4 -4
- package/lib/ImageSearch.js +7 -6
- package/lib/ImageSearch.js.map +1 -1
- package/lib/ImageSearchResult.d.ts +5 -5
- package/lib/ImageSearchResult.js +7 -4
- package/lib/ImageSearchResult.js.map +1 -1
- package/lib/PreviewImage.d.ts +3 -3
- package/lib/PreviewImage.js +7 -7
- package/lib/PreviewImage.js.map +1 -1
- package/package.json +5 -5
- package/lib/_virtual/rolldown_runtime.js +0 -25
package/es/ImageMeta.mjs
CHANGED
|
@@ -4,6 +4,13 @@ import { humanFileSize } from "@ndla/util";
|
|
|
4
4
|
import { jsx } from "react/jsx-runtime";
|
|
5
5
|
|
|
6
6
|
//#region src/ImageMeta.tsx
|
|
7
|
+
/**
|
|
8
|
+
* Copyright (c) 2022-present, NDLA.
|
|
9
|
+
*
|
|
10
|
+
* This source code is licensed under the GPLv3 license found in the
|
|
11
|
+
* LICENSE file in the root directory of this source tree.
|
|
12
|
+
*
|
|
13
|
+
*/
|
|
7
14
|
const ImageMeta = ({ contentType, fileSize, imageDimensions, locale }) => {
|
|
8
15
|
return /* @__PURE__ */ jsx(Text, { children: `${contentType} - ${useMemo(() => {
|
|
9
16
|
return humanFileSize(fileSize, locale);
|
package/es/ImageMeta.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ImageMeta.mjs","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 {
|
|
1
|
+
{"version":3,"file":"ImageMeta.mjs","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 { ImageDimensionsDTO } from \"@ndla/types-backend/image-api\";\nimport { humanFileSize } from \"@ndla/util\";\n\ninterface Props {\n contentType: string;\n fileSize: number;\n imageDimensions?: ImageDimensionsDTO;\n locale: string;\n}\n\nexport const 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"],"mappings":";;;;;;;;;;;;;AAoBA,MAAa,aAAa,EAAE,aAAa,UAAU,iBAAiB,aAAoB;AAMtF,QAAO,oBAAC,kBAAM,GAAG,YAAY,KALV,cAAc;AAC/B,SAAO,cAAc,UAAU,OAAO;IACrC,CAAC,UAAU,OAAO,CAAC,GAEH,kBAAkB,MAAM,gBAAgB,MAAM,GAAG,gBAAgB,OAAO,OAAO,OAC/B"}
|
package/es/ImageSearch.mjs
CHANGED
|
@@ -6,6 +6,13 @@ import { ArrowLeftShortLine, ArrowRightShortLine, SearchLine } from "@ndla/icons
|
|
|
6
6
|
import { styled } from "@ndla/styled-system/jsx";
|
|
7
7
|
|
|
8
8
|
//#region src/ImageSearch.tsx
|
|
9
|
+
/**
|
|
10
|
+
* Copyright (c) 2017-present, NDLA.
|
|
11
|
+
*
|
|
12
|
+
* This source code is licensed under the GPLv3 license found in the
|
|
13
|
+
* LICENSE file in the root directory of this source tree.
|
|
14
|
+
*
|
|
15
|
+
*/
|
|
9
16
|
const ImageSearchWrapper = styled("div", { base: {
|
|
10
17
|
display: "flex",
|
|
11
18
|
flexDirection: "column",
|
package/es/ImageSearch.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ImageSearch.mjs","names":["queryObject","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\nexport const 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>…</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"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ImageSearch.mjs","names":["queryObject","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 { ImageMetaInformationV3DTO, SearchResultV3DTO, SearchParamsDTO } 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: ImageMetaInformationV3DTO) => void;\n searchImages: (query: string | undefined, page: number | undefined) => Promise<SearchResultV3DTO>;\n onError?: (err: any) => void;\n locale: string;\n noResults?: ReactNode;\n checkboxAction?: (image: ImageMetaInformationV3DTO) => void;\n showCheckbox?: boolean;\n translations: ImageSearchTranslations;\n}\n\nexport const 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<SearchParamsDTO>({\n query: undefined,\n page: 1,\n pageSize: 16,\n });\n const [selectedImage, setSelectedImage] = useState<ImageMetaInformationV3DTO | undefined>();\n const [searching, setSearching] = useState<boolean>(false);\n const [searchResult, setSearchResult] = useState<SearchResultV3DTO | undefined>();\n\n const { page } = queryObject;\n const noResultsFound = !searching && searchResult?.results.length === 0;\n\n const onSelectImage = (image: ImageMetaInformationV3DTO | 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: SearchParamsDTO) => {\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>…</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"],"mappings":"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"}
|
package/es/ImageSearchResult.mjs
CHANGED
|
@@ -5,6 +5,13 @@ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
|
5
5
|
import { styled } from "@ndla/styled-system/jsx";
|
|
6
6
|
|
|
7
7
|
//#region src/ImageSearchResult.tsx
|
|
8
|
+
/**
|
|
9
|
+
* Copyright (c) 2017-present, NDLA.
|
|
10
|
+
*
|
|
11
|
+
* This source code is licensed under the GPLv3 license found in the
|
|
12
|
+
* LICENSE file in the root directory of this source tree.
|
|
13
|
+
*
|
|
14
|
+
*/
|
|
8
15
|
const StyledButton = styled(Button, { base: {
|
|
9
16
|
display: "flex",
|
|
10
17
|
flexDirection: "column",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ImageSearchResult.mjs","names":[],"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 {
|
|
1
|
+
{"version":3,"file":"ImageSearchResult.mjs","names":[],"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 { ImageMetaInformationV3DTO } 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: ImageMetaInformationV3DTO;\n onImageClick: (image: ImageMetaInformationV3DTO) => void;\n selectedImage?: ImageMetaInformationV3DTO;\n onSelectImage: (image: ImageMetaInformationV3DTO | undefined, saveAsMetaImage?: boolean) => void;\n showCheckbox: boolean;\n translations: PreviewTranslations;\n locale: string;\n}\n\nexport const 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;CACd,EACF,CAAC;AAEF,MAAM,cAAc,OAAO,OAAO,EAChC,MAAM;CACJ,WAAW;CACX,OAAO;CACP,QAAQ;CACT,EACF,CAAC;AAEF,MAAM,aAAa,OAAO,MAAM,EAC9B,MAAM,EACJ,WAAW,KACZ,EACF,CAAC;AAYF,MAAa,qBAAqB,EAChC,OACA,cACA,eACA,eACA,cACA,cACA,aACW;CACX,MAAM,kBAAkB,eAAe,OAAO,MAAM;AACpD,QACE,4CACE,qBAAC;EACC,SAAS,kBAAkB,cAAc;EACzC,eAAY;EACZ,eAAe,aAAa,MAAM;EAClC,iBAAe;EACf,iBAAe,iBAAiB,MAAM;aAEtC,oBAAC;GACC,KAAI;GACJ,QAAQ,kBAAkB,MAAM,MAAM,SAAS;GAC/C,KAAK,MAAM,MAAM;GACjB,SAAQ;IACR,EACF,oBAAC;GAAW,WAAU;GAAe;GAAQ;aAC3C,oBAAC,oBACE,MAAM,MAAM,MAAM,MAAM,GAAG,MAAM,MAAM,QAAS,aAAa,wBAAwB,OAAO,MAAM,OAC9F;IACI;GACA,EACd,kBACC,oBAAC;EACC,IAAI,iBAAiB,MAAM;EAC3B,OAAO;EACQ;EACD;EACA;EACN;GACR,GACA,QACH"}
|
package/es/PreviewImage.mjs
CHANGED
|
@@ -8,6 +8,13 @@ import { styled } from "@ndla/styled-system/jsx";
|
|
|
8
8
|
import { getModelReleaseValue } from "@ndla/licenses";
|
|
9
9
|
|
|
10
10
|
//#region src/PreviewImage.tsx
|
|
11
|
+
/**
|
|
12
|
+
* Copyright (c) 2017-present, NDLA.
|
|
13
|
+
*
|
|
14
|
+
* This source code is licensed under the GPLv3 license found in the
|
|
15
|
+
* LICENSE file in the root directory of this source tree.
|
|
16
|
+
*
|
|
17
|
+
*/
|
|
11
18
|
const ImageContainer = styled("div", { base: { flexShrink: "0" } });
|
|
12
19
|
const StyledImage = styled(Image, { base: { maxHeight: "surface.xsmall" } });
|
|
13
20
|
const StyledImageMetadata = styled("div", { base: {
|
package/es/PreviewImage.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PreviewImage.mjs","names":[],"sources":["../src/PreviewImage.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 { useState } from \"react\";\nimport { CloseLine, HashTag, CheckLine } from \"@ndla/icons\";\nimport { getModelReleaseValue } from \"@ndla/licenses\";\nimport {\n Button,\n CheckboxControl,\n CheckboxHiddenInput,\n CheckboxIndicator,\n CheckboxLabel,\n CheckboxRoot,\n Text,\n Image,\n IconButton,\n FieldRoot,\n} from \"@ndla/primitives\";\nimport { styled } from \"@ndla/styled-system/jsx\";\nimport type {
|
|
1
|
+
{"version":3,"file":"PreviewImage.mjs","names":[],"sources":["../src/PreviewImage.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 { useState } from \"react\";\nimport { CloseLine, HashTag, CheckLine } from \"@ndla/icons\";\nimport { getModelReleaseValue } from \"@ndla/licenses\";\nimport {\n Button,\n CheckboxControl,\n CheckboxHiddenInput,\n CheckboxIndicator,\n CheckboxLabel,\n CheckboxRoot,\n Text,\n Image,\n IconButton,\n FieldRoot,\n} from \"@ndla/primitives\";\nimport { styled } from \"@ndla/styled-system/jsx\";\nimport type { ImageMetaInformationV3DTO } from \"@ndla/types-backend/image-api\";\nimport { ImageMeta } from \"./ImageMeta\";\nimport type { PreviewTranslations } from \"./ImageSearch\";\nimport { getSrcSets } from \"./util/imageUtil\";\n\nconst ImageContainer = styled(\"div\", {\n base: {\n flexShrink: \"0\",\n },\n});\n\nconst StyledImage = styled(Image, {\n base: {\n maxHeight: \"surface.xsmall\",\n },\n});\n\nconst StyledImageMetadata = styled(\"div\", {\n base: {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"xxsmall\",\n },\n});\n\nconst HashTagWrapper = styled(\"ul\", {\n base: {\n display: \"flex\",\n gap: \"xxsmall\",\n flexWrap: \"wrap\",\n },\n});\n\nconst HashTagGroup = styled(\"div\", {\n base: {\n display: \"flex\",\n gap: \"xxsmall\",\n flexWrap: \"wrap\",\n },\n});\n\nconst StyledTagItem = styled(\"li\", {\n base: {\n display: \"flex\",\n alignItems: \"center\",\n },\n});\n\nconst StyledPreview = styled(\"div\", {\n base: {\n display: \"flex\",\n gridColumn: \"1 / -1\",\n borderColor: \"stroke.default\",\n border: \"1px solid\",\n borderRadius: \"xsmall\",\n gap: \"small\",\n padding: \"small\",\n flexWrap: \"wrap\",\n overflow: \"hidden\",\n },\n});\n\nconst StyledTopRow = styled(\"div\", {\n base: {\n display: \"flex\",\n justifyContent: \"space-between\",\n },\n});\n\nconst ContentWrapper = styled(\"div\", {\n base: {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"medium\",\n flex: \"2\",\n },\n});\n\nconst ActionsWrapper = styled(\"div\", {\n base: {\n display: \"flex\",\n gap: \"small\",\n marginBlockEnd: \"medium\",\n },\n});\n\nconst StyledFieldRoot = styled(FieldRoot, {\n base: { alignSelf: \"center\" },\n});\n\ninterface Props {\n id: string;\n image: ImageMetaInformationV3DTO;\n onSelectImage: (image: ImageMetaInformationV3DTO | undefined, saveAsMetaImage?: boolean) => void;\n showCheckbox: boolean;\n translations: PreviewTranslations;\n locale: string;\n}\n\nexport const PreviewImage = ({ id, image, onSelectImage, showCheckbox, translations, locale }: Props) => {\n const [saveAsMetaImage, setSaveAsMetaImage] = useState(false);\n\n return (\n <StyledPreview id={id}>\n <ImageContainer>\n <StyledImage\n alt=\"\"\n srcSet={getSrcSets(image.image.imageUrl)}\n sizes=\"(min-width: 800px) 360px, (min-width: 400px) 300px, 100vw\"\n src={image.image.imageUrl}\n aria-label={image.title.title}\n variant=\"rounded\"\n />\n </ImageContainer>\n <ContentWrapper>\n <StyledImageMetadata>\n <StyledTopRow>\n <Text textStyle=\"title.medium\">\n {image.title.title.trim() ? image.title.title : (translations.missingTitleFallback ?? `ID: ${image.id}`)}\n </Text>\n <IconButton\n variant=\"tertiary\"\n onClick={() => onSelectImage(undefined)}\n aria-label={translations.close}\n title={translations.close}\n >\n <CloseLine />\n </IconButton>\n </StyledTopRow>\n {!!image.copyright.creators.length && (\n <Text>\n <b>{`${translations.creatorsLabel}: `}</b>\n {image.copyright.creators.map((creator) => creator.name).join(\", \")}\n </Text>\n )}\n {!!image.copyright.license.description?.trim() && (\n <Text>\n <b>{`${translations.license}: `}</b>\n {image.copyright.license.description}\n </Text>\n )}\n {!!image.caption.caption.trim() && (\n <Text>\n <b>{`${translations.caption}: `}</b>\n {image.caption.caption}\n </Text>\n )}\n {!!image.alttext.alttext.trim() && (\n <Text>\n <b>{`${translations.altText}:`}</b> {image.alttext.alttext}\n </Text>\n )}\n {!!image.modelRelease.trim() && (\n <Text>\n <b>{`${translations.modelRelease}: `}</b>\n {getModelReleaseValue(image.modelRelease, locale)}\n </Text>\n )}\n <ImageMeta\n contentType={image.image.contentType}\n fileSize={image.image.size}\n imageDimensions={image.image.dimensions}\n locale={locale}\n />\n {!!image.tags.tags.length && (\n <HashTagGroup>\n <Text id=\"tags-title\">\n <b>{`${translations.tags}: `}</b>\n </Text>\n <HashTagWrapper aria-describedby=\"tags-title\">\n {image.tags.tags.map((tag) => (\n <StyledTagItem key={tag}>\n <HashTag size=\"small\" />\n {tag}\n </StyledTagItem>\n ))}\n </HashTagWrapper>\n </HashTagGroup>\n )}\n </StyledImageMetadata>\n <ActionsWrapper>\n <Button data-testid=\"use-image\" onClick={() => onSelectImage(image, saveAsMetaImage)}>\n {translations.useImageTitle}\n </Button>\n {!!showCheckbox && (\n <StyledFieldRoot>\n <CheckboxRoot checked={saveAsMetaImage} onCheckedChange={() => setSaveAsMetaImage((prev) => !prev)}>\n <CheckboxControl>\n <CheckboxIndicator asChild>\n <CheckLine />\n </CheckboxIndicator>\n </CheckboxControl>\n <CheckboxLabel>{translations.checkboxLabel}</CheckboxLabel>\n <CheckboxHiddenInput />\n </CheckboxRoot>\n </StyledFieldRoot>\n )}\n </ActionsWrapper>\n </ContentWrapper>\n </StyledPreview>\n );\n};\n"],"mappings":"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"}
|
package/lib/ImageMeta.d.ts
CHANGED
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
6
|
*
|
|
7
7
|
*/
|
|
8
|
-
import type {
|
|
8
|
+
import type { ImageDimensionsDTO } from "@ndla/types-backend/image-api";
|
|
9
9
|
interface Props {
|
|
10
10
|
contentType: string;
|
|
11
11
|
fileSize: number;
|
|
12
|
-
imageDimensions?:
|
|
12
|
+
imageDimensions?: ImageDimensionsDTO;
|
|
13
13
|
locale: string;
|
|
14
14
|
}
|
|
15
15
|
export declare const ImageMeta: ({ contentType, fileSize, imageDimensions, locale }: Props) => import("react/jsx-runtime").JSX.Element;
|
package/lib/ImageMeta.js
CHANGED
|
@@ -1,14 +1,16 @@
|
|
|
1
|
-
const require_rolldown_runtime = require('./_virtual/rolldown_runtime.js');
|
|
2
1
|
let react = require("react");
|
|
3
|
-
react = require_rolldown_runtime.__toESM(react);
|
|
4
2
|
let __ndla_primitives = require("@ndla/primitives");
|
|
5
|
-
__ndla_primitives = require_rolldown_runtime.__toESM(__ndla_primitives);
|
|
6
3
|
let __ndla_util = require("@ndla/util");
|
|
7
|
-
__ndla_util = require_rolldown_runtime.__toESM(__ndla_util);
|
|
8
4
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
9
|
-
react_jsx_runtime = require_rolldown_runtime.__toESM(react_jsx_runtime);
|
|
10
5
|
|
|
11
6
|
//#region src/ImageMeta.tsx
|
|
7
|
+
/**
|
|
8
|
+
* Copyright (c) 2022-present, NDLA.
|
|
9
|
+
*
|
|
10
|
+
* This source code is licensed under the GPLv3 license found in the
|
|
11
|
+
* LICENSE file in the root directory of this source tree.
|
|
12
|
+
*
|
|
13
|
+
*/
|
|
12
14
|
const ImageMeta = ({ contentType, fileSize, imageDimensions, locale }) => {
|
|
13
15
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(__ndla_primitives.Text, { children: `${contentType} - ${(0, react.useMemo)(() => {
|
|
14
16
|
return (0, __ndla_util.humanFileSize)(fileSize, locale);
|
package/lib/ImageMeta.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ImageMeta.js","names":["Text"],"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 {
|
|
1
|
+
{"version":3,"file":"ImageMeta.js","names":["Text"],"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 { ImageDimensionsDTO } from \"@ndla/types-backend/image-api\";\nimport { humanFileSize } from \"@ndla/util\";\n\ninterface Props {\n contentType: string;\n fileSize: number;\n imageDimensions?: ImageDimensionsDTO;\n locale: string;\n}\n\nexport const 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"],"mappings":";;;;;;;;;;;;;AAoBA,MAAa,aAAa,EAAE,aAAa,UAAU,iBAAiB,aAAoB;AAMtF,QAAO,2CAACA,oCAAM,GAAG,YAAY,8BALI;AAC/B,wCAAqB,UAAU,OAAO;IACrC,CAAC,UAAU,OAAO,CAAC,GAEH,kBAAkB,MAAM,gBAAgB,MAAM,GAAG,gBAAgB,OAAO,OAAO,OAC/B"}
|
package/lib/ImageSearch.d.ts
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { type ReactNode } from "react";
|
|
9
9
|
import { type PaginationRootProps } from "@ndla/primitives";
|
|
10
|
-
import type {
|
|
10
|
+
import type { ImageMetaInformationV3DTO, SearchResultV3DTO } from "@ndla/types-backend/image-api";
|
|
11
11
|
export interface PreviewTranslations {
|
|
12
12
|
creatorsLabel: string;
|
|
13
13
|
license: string;
|
|
@@ -27,12 +27,12 @@ export interface ImageSearchTranslations {
|
|
|
27
27
|
paginationTranslations: PaginationRootProps["translations"];
|
|
28
28
|
}
|
|
29
29
|
export interface ImageSearchProps {
|
|
30
|
-
onImageSelect: (image:
|
|
31
|
-
searchImages: (query: string | undefined, page: number | undefined) => Promise<
|
|
30
|
+
onImageSelect: (image: ImageMetaInformationV3DTO) => void;
|
|
31
|
+
searchImages: (query: string | undefined, page: number | undefined) => Promise<SearchResultV3DTO>;
|
|
32
32
|
onError?: (err: any) => void;
|
|
33
33
|
locale: string;
|
|
34
34
|
noResults?: ReactNode;
|
|
35
|
-
checkboxAction?: (image:
|
|
35
|
+
checkboxAction?: (image: ImageMetaInformationV3DTO) => void;
|
|
36
36
|
showCheckbox?: boolean;
|
|
37
37
|
translations: ImageSearchTranslations;
|
|
38
38
|
}
|
package/lib/ImageSearch.js
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
|
-
const require_rolldown_runtime = require('./_virtual/rolldown_runtime.js');
|
|
2
1
|
const require_ImageSearchResult = require('./ImageSearchResult.js');
|
|
3
2
|
let react = require("react");
|
|
4
|
-
react = require_rolldown_runtime.__toESM(react);
|
|
5
3
|
let __ndla_primitives = require("@ndla/primitives");
|
|
6
|
-
__ndla_primitives = require_rolldown_runtime.__toESM(__ndla_primitives);
|
|
7
4
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
8
|
-
react_jsx_runtime = require_rolldown_runtime.__toESM(react_jsx_runtime);
|
|
9
5
|
let __ndla_icons = require("@ndla/icons");
|
|
10
|
-
__ndla_icons = require_rolldown_runtime.__toESM(__ndla_icons);
|
|
11
6
|
let __ndla_styled_system_jsx = require("@ndla/styled-system/jsx");
|
|
12
|
-
__ndla_styled_system_jsx = require_rolldown_runtime.__toESM(__ndla_styled_system_jsx);
|
|
13
7
|
|
|
14
8
|
//#region src/ImageSearch.tsx
|
|
9
|
+
/**
|
|
10
|
+
* Copyright (c) 2017-present, NDLA.
|
|
11
|
+
*
|
|
12
|
+
* This source code is licensed under the GPLv3 license found in the
|
|
13
|
+
* LICENSE file in the root directory of this source tree.
|
|
14
|
+
*
|
|
15
|
+
*/
|
|
15
16
|
const ImageSearchWrapper = (0, __ndla_styled_system_jsx.styled)("div", { base: {
|
|
16
17
|
display: "flex",
|
|
17
18
|
flexDirection: "column",
|
package/lib/ImageSearch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ImageSearch.js","names":["PaginationRoot","Button","PaginationItem","queryObject","Input","IconButton","SearchLine","ImageSearchResult","image","PaginationPrevTrigger","ArrowLeftShortLine","PaginationContext","page","PaginationEllipsis","Text","PaginationNextTrigger","ArrowRightShortLine"],"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\nexport const 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>…</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"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ImageSearch.js","names":["PaginationRoot","Button","PaginationItem","queryObject","Input","IconButton","SearchLine","ImageSearchResult","image","PaginationPrevTrigger","ArrowLeftShortLine","PaginationContext","page","PaginationEllipsis","Text","PaginationNextTrigger","ArrowRightShortLine"],"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 { ImageMetaInformationV3DTO, SearchResultV3DTO, SearchParamsDTO } 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: ImageMetaInformationV3DTO) => void;\n searchImages: (query: string | undefined, page: number | undefined) => Promise<SearchResultV3DTO>;\n onError?: (err: any) => void;\n locale: string;\n noResults?: ReactNode;\n checkboxAction?: (image: ImageMetaInformationV3DTO) => void;\n showCheckbox?: boolean;\n translations: ImageSearchTranslations;\n}\n\nexport const 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<SearchParamsDTO>({\n query: undefined,\n page: 1,\n pageSize: 16,\n });\n const [selectedImage, setSelectedImage] = useState<ImageMetaInformationV3DTO | undefined>();\n const [searching, setSearching] = useState<boolean>(false);\n const [searchResult, setSearchResult] = useState<SearchResultV3DTO | undefined>();\n\n const { page } = queryObject;\n const noResultsFound = !searching && searchResult?.results.length === 0;\n\n const onSelectImage = (image: ImageMetaInformationV3DTO | 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: SearchParamsDTO) => {\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>…</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"],"mappings":"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"}
|
|
@@ -5,13 +5,13 @@
|
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
6
|
*
|
|
7
7
|
*/
|
|
8
|
-
import type {
|
|
8
|
+
import type { ImageMetaInformationV3DTO } from "@ndla/types-backend/image-api";
|
|
9
9
|
import type { PreviewTranslations } from "./ImageSearch";
|
|
10
10
|
interface Props {
|
|
11
|
-
image:
|
|
12
|
-
onImageClick: (image:
|
|
13
|
-
selectedImage?:
|
|
14
|
-
onSelectImage: (image:
|
|
11
|
+
image: ImageMetaInformationV3DTO;
|
|
12
|
+
onImageClick: (image: ImageMetaInformationV3DTO) => void;
|
|
13
|
+
selectedImage?: ImageMetaInformationV3DTO;
|
|
14
|
+
onSelectImage: (image: ImageMetaInformationV3DTO | undefined, saveAsMetaImage?: boolean) => void;
|
|
15
15
|
showCheckbox: boolean;
|
|
16
16
|
translations: PreviewTranslations;
|
|
17
17
|
locale: string;
|
package/lib/ImageSearchResult.js
CHANGED
|
@@ -1,14 +1,17 @@
|
|
|
1
|
-
const require_rolldown_runtime = require('./_virtual/rolldown_runtime.js');
|
|
2
1
|
const require_imageUtil = require('./util/imageUtil.js');
|
|
3
2
|
const require_PreviewImage = require('./PreviewImage.js');
|
|
4
3
|
let __ndla_primitives = require("@ndla/primitives");
|
|
5
|
-
__ndla_primitives = require_rolldown_runtime.__toESM(__ndla_primitives);
|
|
6
4
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
7
|
-
react_jsx_runtime = require_rolldown_runtime.__toESM(react_jsx_runtime);
|
|
8
5
|
let __ndla_styled_system_jsx = require("@ndla/styled-system/jsx");
|
|
9
|
-
__ndla_styled_system_jsx = require_rolldown_runtime.__toESM(__ndla_styled_system_jsx);
|
|
10
6
|
|
|
11
7
|
//#region src/ImageSearchResult.tsx
|
|
8
|
+
/**
|
|
9
|
+
* Copyright (c) 2017-present, NDLA.
|
|
10
|
+
*
|
|
11
|
+
* This source code is licensed under the GPLv3 license found in the
|
|
12
|
+
* LICENSE file in the root directory of this source tree.
|
|
13
|
+
*
|
|
14
|
+
*/
|
|
12
15
|
const StyledButton = (0, __ndla_styled_system_jsx.styled)(__ndla_primitives.Button, { base: {
|
|
13
16
|
display: "flex",
|
|
14
17
|
flexDirection: "column",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ImageSearchResult.js","names":["Button","Image","Text","getPreviewSrcSets","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 {
|
|
1
|
+
{"version":3,"file":"ImageSearchResult.js","names":["Button","Image","Text","getPreviewSrcSets","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 { ImageMetaInformationV3DTO } 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: ImageMetaInformationV3DTO;\n onImageClick: (image: ImageMetaInformationV3DTO) => void;\n selectedImage?: ImageMetaInformationV3DTO;\n onSelectImage: (image: ImageMetaInformationV3DTO | undefined, saveAsMetaImage?: boolean) => void;\n showCheckbox: boolean;\n translations: PreviewTranslations;\n locale: string;\n}\n\nexport const 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,oDAAsBA,0BAAQ,EAClC,MAAM;CACJ,SAAS;CACT,eAAe;CACf,aAAa;CACd,EACF,CAAC;AAEF,MAAM,mDAAqBC,yBAAO,EAChC,MAAM;CACJ,WAAW;CACX,OAAO;CACP,QAAQ;CACT,EACF,CAAC;AAEF,MAAM,kDAAoBC,wBAAM,EAC9B,MAAM,EACJ,WAAW,KACZ,EACF,CAAC;AAYF,MAAa,qBAAqB,EAChC,OACA,cACA,eACA,eACA,cACA,cACA,aACW;CACX,MAAM,kBAAkB,eAAe,OAAO,MAAM;AACpD,QACE,qFACE,4CAAC;EACC,SAAS,kBAAkB,cAAc;EACzC,eAAY;EACZ,eAAe,aAAa,MAAM;EAClC,iBAAe;EACf,iBAAe,iBAAiB,MAAM;aAEtC,2CAAC;GACC,KAAI;GACJ,QAAQC,oCAAkB,MAAM,MAAM,SAAS;GAC/C,KAAK,MAAM,MAAM;GACjB,SAAQ;IACR,EACF,2CAAC;GAAW,WAAU;GAAe;GAAQ;aAC3C,2CAAC,oBACE,MAAM,MAAM,MAAM,MAAM,GAAG,MAAM,MAAM,QAAS,aAAa,wBAAwB,OAAO,MAAM,OAC9F;IACI;GACA,EACd,kBACC,2CAACC;EACC,IAAI,iBAAiB,MAAM;EAC3B,OAAO;EACQ;EACD;EACA;EACN;GACR,GACA,QACH"}
|
package/lib/PreviewImage.d.ts
CHANGED
|
@@ -5,12 +5,12 @@
|
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
6
|
*
|
|
7
7
|
*/
|
|
8
|
-
import type {
|
|
8
|
+
import type { ImageMetaInformationV3DTO } from "@ndla/types-backend/image-api";
|
|
9
9
|
import type { PreviewTranslations } from "./ImageSearch";
|
|
10
10
|
interface Props {
|
|
11
11
|
id: string;
|
|
12
|
-
image:
|
|
13
|
-
onSelectImage: (image:
|
|
12
|
+
image: ImageMetaInformationV3DTO;
|
|
13
|
+
onSelectImage: (image: ImageMetaInformationV3DTO | undefined, saveAsMetaImage?: boolean) => void;
|
|
14
14
|
showCheckbox: boolean;
|
|
15
15
|
translations: PreviewTranslations;
|
|
16
16
|
locale: string;
|
package/lib/PreviewImage.js
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
const require_rolldown_runtime = require('./_virtual/rolldown_runtime.js');
|
|
2
1
|
const require_ImageMeta = require('./ImageMeta.js');
|
|
3
2
|
const require_imageUtil = require('./util/imageUtil.js');
|
|
4
3
|
let react = require("react");
|
|
5
|
-
react = require_rolldown_runtime.__toESM(react);
|
|
6
4
|
let __ndla_primitives = require("@ndla/primitives");
|
|
7
|
-
__ndla_primitives = require_rolldown_runtime.__toESM(__ndla_primitives);
|
|
8
5
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
9
|
-
react_jsx_runtime = require_rolldown_runtime.__toESM(react_jsx_runtime);
|
|
10
6
|
let __ndla_icons = require("@ndla/icons");
|
|
11
|
-
__ndla_icons = require_rolldown_runtime.__toESM(__ndla_icons);
|
|
12
7
|
let __ndla_styled_system_jsx = require("@ndla/styled-system/jsx");
|
|
13
|
-
__ndla_styled_system_jsx = require_rolldown_runtime.__toESM(__ndla_styled_system_jsx);
|
|
14
8
|
let __ndla_licenses = require("@ndla/licenses");
|
|
15
|
-
__ndla_licenses = require_rolldown_runtime.__toESM(__ndla_licenses);
|
|
16
9
|
|
|
17
10
|
//#region src/PreviewImage.tsx
|
|
11
|
+
/**
|
|
12
|
+
* Copyright (c) 2017-present, NDLA.
|
|
13
|
+
*
|
|
14
|
+
* This source code is licensed under the GPLv3 license found in the
|
|
15
|
+
* LICENSE file in the root directory of this source tree.
|
|
16
|
+
*
|
|
17
|
+
*/
|
|
18
18
|
const ImageContainer = (0, __ndla_styled_system_jsx.styled)("div", { base: { flexShrink: "0" } });
|
|
19
19
|
const StyledImage = (0, __ndla_styled_system_jsx.styled)(__ndla_primitives.Image, { base: { maxHeight: "surface.xsmall" } });
|
|
20
20
|
const StyledImageMetadata = (0, __ndla_styled_system_jsx.styled)("div", { base: {
|
package/lib/PreviewImage.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PreviewImage.js","names":["Image","FieldRoot","getSrcSets","Text","IconButton","CloseLine","ImageMeta","HashTag","Button","CheckboxRoot","CheckboxControl","CheckboxIndicator","CheckLine","CheckboxLabel","CheckboxHiddenInput"],"sources":["../src/PreviewImage.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 { useState } from \"react\";\nimport { CloseLine, HashTag, CheckLine } from \"@ndla/icons\";\nimport { getModelReleaseValue } from \"@ndla/licenses\";\nimport {\n Button,\n CheckboxControl,\n CheckboxHiddenInput,\n CheckboxIndicator,\n CheckboxLabel,\n CheckboxRoot,\n Text,\n Image,\n IconButton,\n FieldRoot,\n} from \"@ndla/primitives\";\nimport { styled } from \"@ndla/styled-system/jsx\";\nimport type {
|
|
1
|
+
{"version":3,"file":"PreviewImage.js","names":["Image","FieldRoot","getSrcSets","Text","IconButton","CloseLine","ImageMeta","HashTag","Button","CheckboxRoot","CheckboxControl","CheckboxIndicator","CheckLine","CheckboxLabel","CheckboxHiddenInput"],"sources":["../src/PreviewImage.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 { useState } from \"react\";\nimport { CloseLine, HashTag, CheckLine } from \"@ndla/icons\";\nimport { getModelReleaseValue } from \"@ndla/licenses\";\nimport {\n Button,\n CheckboxControl,\n CheckboxHiddenInput,\n CheckboxIndicator,\n CheckboxLabel,\n CheckboxRoot,\n Text,\n Image,\n IconButton,\n FieldRoot,\n} from \"@ndla/primitives\";\nimport { styled } from \"@ndla/styled-system/jsx\";\nimport type { ImageMetaInformationV3DTO } from \"@ndla/types-backend/image-api\";\nimport { ImageMeta } from \"./ImageMeta\";\nimport type { PreviewTranslations } from \"./ImageSearch\";\nimport { getSrcSets } from \"./util/imageUtil\";\n\nconst ImageContainer = styled(\"div\", {\n base: {\n flexShrink: \"0\",\n },\n});\n\nconst StyledImage = styled(Image, {\n base: {\n maxHeight: \"surface.xsmall\",\n },\n});\n\nconst StyledImageMetadata = styled(\"div\", {\n base: {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"xxsmall\",\n },\n});\n\nconst HashTagWrapper = styled(\"ul\", {\n base: {\n display: \"flex\",\n gap: \"xxsmall\",\n flexWrap: \"wrap\",\n },\n});\n\nconst HashTagGroup = styled(\"div\", {\n base: {\n display: \"flex\",\n gap: \"xxsmall\",\n flexWrap: \"wrap\",\n },\n});\n\nconst StyledTagItem = styled(\"li\", {\n base: {\n display: \"flex\",\n alignItems: \"center\",\n },\n});\n\nconst StyledPreview = styled(\"div\", {\n base: {\n display: \"flex\",\n gridColumn: \"1 / -1\",\n borderColor: \"stroke.default\",\n border: \"1px solid\",\n borderRadius: \"xsmall\",\n gap: \"small\",\n padding: \"small\",\n flexWrap: \"wrap\",\n overflow: \"hidden\",\n },\n});\n\nconst StyledTopRow = styled(\"div\", {\n base: {\n display: \"flex\",\n justifyContent: \"space-between\",\n },\n});\n\nconst ContentWrapper = styled(\"div\", {\n base: {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"medium\",\n flex: \"2\",\n },\n});\n\nconst ActionsWrapper = styled(\"div\", {\n base: {\n display: \"flex\",\n gap: \"small\",\n marginBlockEnd: \"medium\",\n },\n});\n\nconst StyledFieldRoot = styled(FieldRoot, {\n base: { alignSelf: \"center\" },\n});\n\ninterface Props {\n id: string;\n image: ImageMetaInformationV3DTO;\n onSelectImage: (image: ImageMetaInformationV3DTO | undefined, saveAsMetaImage?: boolean) => void;\n showCheckbox: boolean;\n translations: PreviewTranslations;\n locale: string;\n}\n\nexport const PreviewImage = ({ id, image, onSelectImage, showCheckbox, translations, locale }: Props) => {\n const [saveAsMetaImage, setSaveAsMetaImage] = useState(false);\n\n return (\n <StyledPreview id={id}>\n <ImageContainer>\n <StyledImage\n alt=\"\"\n srcSet={getSrcSets(image.image.imageUrl)}\n sizes=\"(min-width: 800px) 360px, (min-width: 400px) 300px, 100vw\"\n src={image.image.imageUrl}\n aria-label={image.title.title}\n variant=\"rounded\"\n />\n </ImageContainer>\n <ContentWrapper>\n <StyledImageMetadata>\n <StyledTopRow>\n <Text textStyle=\"title.medium\">\n {image.title.title.trim() ? image.title.title : (translations.missingTitleFallback ?? `ID: ${image.id}`)}\n </Text>\n <IconButton\n variant=\"tertiary\"\n onClick={() => onSelectImage(undefined)}\n aria-label={translations.close}\n title={translations.close}\n >\n <CloseLine />\n </IconButton>\n </StyledTopRow>\n {!!image.copyright.creators.length && (\n <Text>\n <b>{`${translations.creatorsLabel}: `}</b>\n {image.copyright.creators.map((creator) => creator.name).join(\", \")}\n </Text>\n )}\n {!!image.copyright.license.description?.trim() && (\n <Text>\n <b>{`${translations.license}: `}</b>\n {image.copyright.license.description}\n </Text>\n )}\n {!!image.caption.caption.trim() && (\n <Text>\n <b>{`${translations.caption}: `}</b>\n {image.caption.caption}\n </Text>\n )}\n {!!image.alttext.alttext.trim() && (\n <Text>\n <b>{`${translations.altText}:`}</b> {image.alttext.alttext}\n </Text>\n )}\n {!!image.modelRelease.trim() && (\n <Text>\n <b>{`${translations.modelRelease}: `}</b>\n {getModelReleaseValue(image.modelRelease, locale)}\n </Text>\n )}\n <ImageMeta\n contentType={image.image.contentType}\n fileSize={image.image.size}\n imageDimensions={image.image.dimensions}\n locale={locale}\n />\n {!!image.tags.tags.length && (\n <HashTagGroup>\n <Text id=\"tags-title\">\n <b>{`${translations.tags}: `}</b>\n </Text>\n <HashTagWrapper aria-describedby=\"tags-title\">\n {image.tags.tags.map((tag) => (\n <StyledTagItem key={tag}>\n <HashTag size=\"small\" />\n {tag}\n </StyledTagItem>\n ))}\n </HashTagWrapper>\n </HashTagGroup>\n )}\n </StyledImageMetadata>\n <ActionsWrapper>\n <Button data-testid=\"use-image\" onClick={() => onSelectImage(image, saveAsMetaImage)}>\n {translations.useImageTitle}\n </Button>\n {!!showCheckbox && (\n <StyledFieldRoot>\n <CheckboxRoot checked={saveAsMetaImage} onCheckedChange={() => setSaveAsMetaImage((prev) => !prev)}>\n <CheckboxControl>\n <CheckboxIndicator asChild>\n <CheckLine />\n </CheckboxIndicator>\n </CheckboxControl>\n <CheckboxLabel>{translations.checkboxLabel}</CheckboxLabel>\n <CheckboxHiddenInput />\n </CheckboxRoot>\n </StyledFieldRoot>\n )}\n </ActionsWrapper>\n </ContentWrapper>\n </StyledPreview>\n );\n};\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ndla/image-search",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "11.0.
|
|
4
|
+
"version": "11.0.128-alpha.0",
|
|
5
5
|
"description": "A simple library for searching images from NDLA",
|
|
6
6
|
"license": "GPL-3.0",
|
|
7
7
|
"exports": {
|
|
@@ -31,10 +31,10 @@
|
|
|
31
31
|
],
|
|
32
32
|
"dependencies": {
|
|
33
33
|
"@ndla/icons": "^8.0.71-alpha.0",
|
|
34
|
-
"@ndla/licenses": "^10.0.
|
|
35
|
-
"@ndla/primitives": "^1.0.
|
|
34
|
+
"@ndla/licenses": "^10.0.3-alpha.0",
|
|
35
|
+
"@ndla/primitives": "^1.0.109-alpha.0",
|
|
36
36
|
"@ndla/styled-system": "^0.0.42",
|
|
37
|
-
"@ndla/util": "^5.0.
|
|
37
|
+
"@ndla/util": "^5.0.15-alpha.0"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@ndla/preset-panda": "^0.0.64",
|
|
@@ -48,5 +48,5 @@
|
|
|
48
48
|
"publishConfig": {
|
|
49
49
|
"access": "public"
|
|
50
50
|
},
|
|
51
|
-
"gitHead": "
|
|
51
|
+
"gitHead": "5a949912b848631d194d74fec102e8fe5657f194"
|
|
52
52
|
}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
//#region rolldown:runtime
|
|
2
|
-
var __create = Object.create;
|
|
3
|
-
var __defProp = Object.defineProperty;
|
|
4
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
-
var __copyProps = (to, from, except, desc) => {
|
|
9
|
-
if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
|
|
10
|
-
key = keys[i];
|
|
11
|
-
if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
|
|
12
|
-
get: ((k) => from[k]).bind(null, key),
|
|
13
|
-
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
14
|
-
});
|
|
15
|
-
}
|
|
16
|
-
return to;
|
|
17
|
-
};
|
|
18
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
|
|
19
|
-
value: mod,
|
|
20
|
-
enumerable: true
|
|
21
|
-
}) : target, mod));
|
|
22
|
-
|
|
23
|
-
//#endregion
|
|
24
|
-
|
|
25
|
-
exports.__toESM = __toESM;
|