@pega/cosmos-react-core 9.0.0-build.19.0 → 9.0.0-build.19.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"SelectionCard.d.ts","sourceRoot":"","sources":["../../../src/components/SelectionCard/SelectionCard.tsx"],"names":[],"mappings":"AA+CA,OAAO,KAAK,EAA+B,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAI7F,eAAO,MAAM,iBAAiB,wFACyD,CAAC;;;;AAsOxF,wBAAmE"}
1
+ {"version":3,"file":"SelectionCard.d.ts","sourceRoot":"","sources":["../../../src/components/SelectionCard/SelectionCard.tsx"],"names":[],"mappings":"AA8CA,OAAO,KAAK,EAA+B,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAK7F,eAAO,MAAM,iBAAiB,wFACyD,CAAC;;;;AAqOxF,wBAAmE"}
@@ -6,12 +6,12 @@ import { useConsolidatedRef, useEscape, useFocusTrap, useFocusWithin, useI18n, u
6
6
  import Grid from '../Grid';
7
7
  import Flex from '../Flex';
8
8
  import FieldValueList from '../FieldValueList';
9
- import Actions from '../Actions';
10
9
  import { StyledImage } from '../Image';
11
10
  import * as pictureIcon from '../Icon/icons/picture.icon';
12
11
  import ShowMoreLess from '../ShowMoreLess';
13
12
  import { getSelectionCardTestIds } from './SelectionCard.test-ids';
14
13
  import { StyledSelectionCard, StyledContentContainer, StyledImageContainer, StyledSelectionCardInline, StyledSelectionCardStacked, StyledValueList, StyledHeader, StyledImageCell, StyledContentCell } from './SelectionCard.styles';
14
+ import SelectionCardActions from './SelectionCardActions';
15
15
  registerIcon(pictureIcon);
16
16
  export const focusableSelector = 'a[href], button, input, textarea, select, details, video[controls], audio[controls]';
17
17
  const useContentHeight = (contentRef, targetRef) => {
@@ -89,7 +89,7 @@ const SelectionCard = forwardRef(function SelectionCard(props, ref) {
89
89
  'data-main-focus': focusOnInput ? true : undefined,
90
90
  'aria-details': hasAdditionalContent ? contentId : undefined
91
91
  }
92
- })) : (_jsx("span", { "data-testid": testIds.label, "aria-details": hasAdditionalContent ? contentId : undefined, children: heading })), actions && (_jsx(Actions, { "data-testid": testIds.actions, items: actions, menuAt: 1, disabled: disabled, contextualLabel: label }))] }), hasAdditionalContent &&
92
+ })) : (_jsx("span", { "data-testid": testIds.label, "aria-details": hasAdditionalContent ? contentId : undefined, children: heading })), actions && (_jsx(SelectionCardActions, { "data-testid": testIds.actions, actions: actions, disabled: disabled, contextualLabel: label }))] }), hasAdditionalContent &&
93
93
  (fields.every(field => isFieldValueListItemProps(field)) ? (_jsx(FieldValueList, { id: contentId, "data-testid": testIds.content, fields: fields })) : (_jsx(Flex, { container: { direction: 'column', gap: 1 }, as: StyledValueList, id: contentId, "data-testid": testIds.content, children: fields.map(field => {
94
94
  return (_jsx("li", { children: field.truncate ? (_jsx(ShowMoreLess, { lines: 3, children: field.value })) : (field.value) }, field.id));
95
95
  }) })))] }) }), image?.placement === 'inline-end' && imageContent] }));
@@ -1 +1 @@
1
- {"version":3,"file":"SelectionCard.js","sourceRoot":"","sources":["../../../src/components/SelectionCard/SelectionCard.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n forwardRef,\n useEffect,\n useRef,\n useState,\n useMemo,\n useLayoutEffect,\n useCallback,\n cloneElement\n} from 'react';\nimport type { KeyboardEvent, PropsWithoutRef, RefObject } from 'react';\n\nimport { getActiveElement, withTestIds, isValidElement, hasProp } from '../../utils';\nimport Icon, { registerIcon } from '../Icon';\nimport type { RefElement } from '../../types';\nimport {\n useConsolidatedRef,\n useEscape,\n useFocusTrap,\n useFocusWithin,\n useI18n,\n usePrevious,\n useTestIds,\n useUID\n} from '../../hooks';\nimport Grid from '../Grid';\nimport type { GridProps } from '../Grid';\nimport Flex from '../Flex';\nimport FieldValueList from '../FieldValueList';\nimport type { FieldValueListItemProps } from '../FieldValueList';\nimport Actions from '../Actions';\nimport { StyledImage } from '../Image';\nimport * as pictureIcon from '../Icon/icons/picture.icon';\nimport ShowMoreLess from '../ShowMoreLess';\n\nimport { getSelectionCardTestIds } from './SelectionCard.test-ids';\nimport {\n StyledSelectionCard,\n StyledContentContainer,\n StyledImageContainer,\n StyledSelectionCardInline,\n StyledSelectionCardStacked,\n StyledValueList,\n StyledHeader,\n StyledImageCell,\n StyledContentCell\n} from './SelectionCard.styles';\nimport type { FieldValueItemPropsOmitName, SelectionCardProps } from './SelectionCard.types';\n\nregisterIcon(pictureIcon);\n\nexport const focusableSelector =\n 'a[href], button, input, textarea, select, details, video[controls], audio[controls]';\n\nconst useContentHeight = (\n contentRef: RefObject<HTMLElement>,\n targetRef: RefObject<HTMLElement>\n) => {\n useLayoutEffect(() => {\n if (!contentRef.current || !targetRef.current) return;\n\n const resizeObserver = new ResizeObserver(() => {\n requestAnimationFrame(() => {\n targetRef.current?.style.setProperty(\n '--content-height',\n `${contentRef.current?.scrollHeight}px`\n );\n });\n });\n\n resizeObserver.observe(contentRef.current);\n\n return () => {\n resizeObserver.disconnect();\n };\n }, []);\n};\n\nconst SelectionCard = forwardRef<\n RefElement<SelectionCardProps>,\n PropsWithoutRef<SelectionCardProps>\n>(function SelectionCard(props, ref) {\n const uid = useUID();\n const {\n testId,\n id = uid,\n label,\n heading,\n disabled = false,\n image,\n fields = [],\n onClick,\n onKeyDown,\n actions,\n additionalInfo,\n ...restProps\n } = props;\n\n const t = useI18n();\n\n const contentRef = useRef<HTMLDivElement>(null);\n const containerRef = useConsolidatedRef(ref);\n\n const [focusOnInput, setFocusOnInput] = useState(false);\n const [hasInteractiveElements, setHasInteractiveElements] = useState(0);\n const [isBrokenImage, setIsBrokenImage] = useState(false);\n const prevImageSrc = usePrevious(image?.src);\n const testIds = useTestIds(testId, getSelectionCardTestIds);\n const contentId = `${id}-content`;\n\n const hasAdditionalContent = fields.length > 0;\n\n useEffect(() => {\n const focusables = containerRef.current?.querySelectorAll(focusableSelector);\n setHasInteractiveElements(focusables?.length || 0);\n setFocusOnInput(focusables?.length === 1 && focusables?.[0] instanceof HTMLInputElement);\n focusables?.forEach(el =>\n el.hasAttribute('data-main-focus')\n ? el.removeAttribute('tabindex')\n : el.setAttribute('tabindex', '-1')\n );\n }, [additionalInfo, fields, actions]);\n\n useFocusTrap(focusOnInput ? null : contentRef, false, [contentRef]);\n\n useFocusWithin([focusOnInput ? null : contentRef], focused =>\n contentRef.current\n ?.querySelectorAll(focusableSelector)\n .forEach(el => (focused ? el.removeAttribute('tabindex') : el.setAttribute('tabindex', '-1')))\n );\n\n useEscape(() => containerRef.current?.focus(), focusOnInput ? null : containerRef, [\n containerRef\n ]);\n\n useContentHeight(contentRef, containerRef);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n if (\n event.key === 'Enter' &&\n containerRef.current === getActiveElement() &&\n (!focusOnInput || (focusOnInput && hasInteractiveElements > 1))\n ) {\n event.preventDefault();\n contentRef.current?.querySelectorAll<HTMLElement>(focusableSelector)[0]?.focus();\n }\n onKeyDown?.(event);\n },\n [containerRef, contentRef]\n );\n\n const imageContent = useMemo(() => {\n if (image) {\n const imagery =\n (isBrokenImage && image.src === prevImageSrc) || image.src === undefined ? (\n <Icon name='picture' aria-label={t('image_load_error')} />\n ) : (\n <StyledImage\n data-testid={testIds.image}\n {...image}\n onError={() => setIsBrokenImage(true)}\n onLoad={() => setIsBrokenImage(false)}\n />\n );\n return (\n <Flex\n container={{ justify: 'center', alignItems: 'center' }}\n as={StyledImageCell}\n placement={image.placement}\n size={image.size}\n >\n <Flex\n container={{ justify: 'center', alignItems: 'center' }}\n as={StyledImageContainer}\n placement={image.placement}\n size={image.size}\n >\n {imagery}\n </Flex>\n </Flex>\n );\n }\n }, [isBrokenImage, image?.src, prevImageSrc, image?.placement, image?.size]);\n\n let asProp: GridProps['as'] = StyledSelectionCard;\n if (image) {\n asProp = image.placement?.startsWith('block')\n ? StyledSelectionCardStacked\n : StyledSelectionCardInline;\n }\n\n const isFieldValueListItemProps = (\n item: FieldValueListItemProps | FieldValueItemPropsOmitName\n ): item is FieldValueListItemProps => {\n return hasProp(item, 'name');\n };\n\n return (\n <Grid\n data-testid={testIds.root}\n {...restProps}\n id={id}\n onClick={onClick}\n as={asProp}\n placement={image?.placement}\n size={image?.size}\n container={{ cols: '1fr', rows: 'auto' }}\n disabled={disabled}\n role={hasInteractiveElements ? 'group' : 'article'}\n aria-label={label}\n ref={containerRef}\n data-main-focus={focusOnInput ? undefined : true}\n tabIndex={focusOnInput ? undefined : 0}\n onKeyDown={handleKeyDown}\n >\n {image && image.placement !== 'inline-end' && imageContent}\n {/* element needed to get actual content height of the content container */}\n <StyledContentCell>\n <Flex\n as={StyledContentContainer}\n container={{ direction: 'column', gap: 0.75 }}\n ref={contentRef}\n >\n <Flex as={StyledHeader} container={{ alignItems: 'center', justify: 'between' }}>\n {isValidElement(heading) ? (\n cloneElement(heading, {\n ...{\n tabIndex: focusOnInput ? undefined : -1,\n additionalInfo,\n 'data-main-focus': focusOnInput ? true : undefined,\n 'aria-details': hasAdditionalContent ? contentId : undefined\n }\n })\n ) : (\n <span\n data-testid={testIds.label}\n aria-details={hasAdditionalContent ? contentId : undefined}\n >\n {heading}\n </span>\n )}\n {actions && (\n <Actions\n data-testid={testIds.actions}\n items={actions}\n menuAt={1}\n disabled={disabled}\n contextualLabel={label}\n />\n )}\n </Flex>\n {hasAdditionalContent &&\n (fields.every(field => isFieldValueListItemProps(field)) ? (\n <FieldValueList id={contentId} data-testid={testIds.content} fields={fields} />\n ) : (\n <Flex\n container={{ direction: 'column', gap: 1 }}\n as={StyledValueList}\n id={contentId}\n data-testid={testIds.content}\n >\n {fields.map(field => {\n return (\n <li key={field.id}>\n {field.truncate ? (\n <ShowMoreLess lines={3}>{field.value}</ShowMoreLess>\n ) : (\n field.value\n )}\n </li>\n );\n })}\n </Flex>\n ))}\n </Flex>\n </StyledContentCell>\n {image?.placement === 'inline-end' && imageContent}\n </Grid>\n );\n});\n\nexport default withTestIds(SelectionCard, getSelectionCardTestIds);\n"]}
1
+ {"version":3,"file":"SelectionCard.js","sourceRoot":"","sources":["../../../src/components/SelectionCard/SelectionCard.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n forwardRef,\n useEffect,\n useRef,\n useState,\n useMemo,\n useLayoutEffect,\n useCallback,\n cloneElement\n} from 'react';\nimport type { KeyboardEvent, PropsWithoutRef, RefObject } from 'react';\n\nimport { getActiveElement, withTestIds, isValidElement, hasProp } from '../../utils';\nimport Icon, { registerIcon } from '../Icon';\nimport type { RefElement } from '../../types';\nimport {\n useConsolidatedRef,\n useEscape,\n useFocusTrap,\n useFocusWithin,\n useI18n,\n usePrevious,\n useTestIds,\n useUID\n} from '../../hooks';\nimport Grid from '../Grid';\nimport type { GridProps } from '../Grid';\nimport Flex from '../Flex';\nimport FieldValueList from '../FieldValueList';\nimport type { FieldValueListItemProps } from '../FieldValueList';\nimport { StyledImage } from '../Image';\nimport * as pictureIcon from '../Icon/icons/picture.icon';\nimport ShowMoreLess from '../ShowMoreLess';\n\nimport { getSelectionCardTestIds } from './SelectionCard.test-ids';\nimport {\n StyledSelectionCard,\n StyledContentContainer,\n StyledImageContainer,\n StyledSelectionCardInline,\n StyledSelectionCardStacked,\n StyledValueList,\n StyledHeader,\n StyledImageCell,\n StyledContentCell\n} from './SelectionCard.styles';\nimport type { FieldValueItemPropsOmitName, SelectionCardProps } from './SelectionCard.types';\nimport SelectionCardActions from './SelectionCardActions';\n\nregisterIcon(pictureIcon);\n\nexport const focusableSelector =\n 'a[href], button, input, textarea, select, details, video[controls], audio[controls]';\n\nconst useContentHeight = (\n contentRef: RefObject<HTMLElement>,\n targetRef: RefObject<HTMLElement>\n) => {\n useLayoutEffect(() => {\n if (!contentRef.current || !targetRef.current) return;\n\n const resizeObserver = new ResizeObserver(() => {\n requestAnimationFrame(() => {\n targetRef.current?.style.setProperty(\n '--content-height',\n `${contentRef.current?.scrollHeight}px`\n );\n });\n });\n\n resizeObserver.observe(contentRef.current);\n\n return () => {\n resizeObserver.disconnect();\n };\n }, []);\n};\n\nconst SelectionCard = forwardRef<\n RefElement<SelectionCardProps>,\n PropsWithoutRef<SelectionCardProps>\n>(function SelectionCard(props, ref) {\n const uid = useUID();\n const {\n testId,\n id = uid,\n label,\n heading,\n disabled = false,\n image,\n fields = [],\n onClick,\n onKeyDown,\n actions,\n additionalInfo,\n ...restProps\n } = props;\n\n const t = useI18n();\n\n const contentRef = useRef<HTMLDivElement>(null);\n const containerRef = useConsolidatedRef(ref);\n\n const [focusOnInput, setFocusOnInput] = useState(false);\n const [hasInteractiveElements, setHasInteractiveElements] = useState(0);\n const [isBrokenImage, setIsBrokenImage] = useState(false);\n const prevImageSrc = usePrevious(image?.src);\n const testIds = useTestIds(testId, getSelectionCardTestIds);\n const contentId = `${id}-content`;\n\n const hasAdditionalContent = fields.length > 0;\n\n useEffect(() => {\n const focusables = containerRef.current?.querySelectorAll(focusableSelector);\n setHasInteractiveElements(focusables?.length || 0);\n setFocusOnInput(focusables?.length === 1 && focusables?.[0] instanceof HTMLInputElement);\n focusables?.forEach(el =>\n el.hasAttribute('data-main-focus')\n ? el.removeAttribute('tabindex')\n : el.setAttribute('tabindex', '-1')\n );\n }, [additionalInfo, fields, actions]);\n\n useFocusTrap(focusOnInput ? null : contentRef, false, [contentRef]);\n\n useFocusWithin([focusOnInput ? null : contentRef], focused =>\n contentRef.current\n ?.querySelectorAll(focusableSelector)\n .forEach(el => (focused ? el.removeAttribute('tabindex') : el.setAttribute('tabindex', '-1')))\n );\n\n useEscape(() => containerRef.current?.focus(), focusOnInput ? null : containerRef, [\n containerRef\n ]);\n\n useContentHeight(contentRef, containerRef);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n if (\n event.key === 'Enter' &&\n containerRef.current === getActiveElement() &&\n (!focusOnInput || (focusOnInput && hasInteractiveElements > 1))\n ) {\n event.preventDefault();\n contentRef.current?.querySelectorAll<HTMLElement>(focusableSelector)[0]?.focus();\n }\n onKeyDown?.(event);\n },\n [containerRef, contentRef]\n );\n\n const imageContent = useMemo(() => {\n if (image) {\n const imagery =\n (isBrokenImage && image.src === prevImageSrc) || image.src === undefined ? (\n <Icon name='picture' aria-label={t('image_load_error')} />\n ) : (\n <StyledImage\n data-testid={testIds.image}\n {...image}\n onError={() => setIsBrokenImage(true)}\n onLoad={() => setIsBrokenImage(false)}\n />\n );\n return (\n <Flex\n container={{ justify: 'center', alignItems: 'center' }}\n as={StyledImageCell}\n placement={image.placement}\n size={image.size}\n >\n <Flex\n container={{ justify: 'center', alignItems: 'center' }}\n as={StyledImageContainer}\n placement={image.placement}\n size={image.size}\n >\n {imagery}\n </Flex>\n </Flex>\n );\n }\n }, [isBrokenImage, image?.src, prevImageSrc, image?.placement, image?.size]);\n\n let asProp: GridProps['as'] = StyledSelectionCard;\n if (image) {\n asProp = image.placement?.startsWith('block')\n ? StyledSelectionCardStacked\n : StyledSelectionCardInline;\n }\n\n const isFieldValueListItemProps = (\n item: FieldValueListItemProps | FieldValueItemPropsOmitName\n ): item is FieldValueListItemProps => {\n return hasProp(item, 'name');\n };\n\n return (\n <Grid\n data-testid={testIds.root}\n {...restProps}\n id={id}\n onClick={onClick}\n as={asProp}\n placement={image?.placement}\n size={image?.size}\n container={{ cols: '1fr', rows: 'auto' }}\n disabled={disabled}\n role={hasInteractiveElements ? 'group' : 'article'}\n aria-label={label}\n ref={containerRef}\n data-main-focus={focusOnInput ? undefined : true}\n tabIndex={focusOnInput ? undefined : 0}\n onKeyDown={handleKeyDown}\n >\n {image && image.placement !== 'inline-end' && imageContent}\n {/* element needed to get actual content height of the content container */}\n <StyledContentCell>\n <Flex\n as={StyledContentContainer}\n container={{ direction: 'column', gap: 0.75 }}\n ref={contentRef}\n >\n <Flex as={StyledHeader} container={{ alignItems: 'center', justify: 'between' }}>\n {isValidElement(heading) ? (\n cloneElement(heading, {\n ...{\n tabIndex: focusOnInput ? undefined : -1,\n additionalInfo,\n 'data-main-focus': focusOnInput ? true : undefined,\n 'aria-details': hasAdditionalContent ? contentId : undefined\n }\n })\n ) : (\n <span\n data-testid={testIds.label}\n aria-details={hasAdditionalContent ? contentId : undefined}\n >\n {heading}\n </span>\n )}\n {actions && (\n <SelectionCardActions\n data-testid={testIds.actions}\n actions={actions}\n disabled={disabled}\n contextualLabel={label}\n />\n )}\n </Flex>\n {hasAdditionalContent &&\n (fields.every(field => isFieldValueListItemProps(field)) ? (\n <FieldValueList id={contentId} data-testid={testIds.content} fields={fields} />\n ) : (\n <Flex\n container={{ direction: 'column', gap: 1 }}\n as={StyledValueList}\n id={contentId}\n data-testid={testIds.content}\n >\n {fields.map(field => {\n return (\n <li key={field.id}>\n {field.truncate ? (\n <ShowMoreLess lines={3}>{field.value}</ShowMoreLess>\n ) : (\n field.value\n )}\n </li>\n );\n })}\n </Flex>\n ))}\n </Flex>\n </StyledContentCell>\n {image?.placement === 'inline-end' && imageContent}\n </Grid>\n );\n});\n\nexport default withTestIds(SelectionCard, getSelectionCardTestIds);\n"]}
@@ -35,8 +35,8 @@ export type SelectionCardProps = WithAttributes<'div', NoChildrenProp & TestIdPr
35
35
  additionalInfo?: FormControlProps['additionalInfo'];
36
36
  /** Set the card to disabled state, ie. non-interactive. */
37
37
  disabled?: boolean;
38
- /** Additional actions */
39
- actions?: Action[];
38
+ /** Additional actions as a static array or a fetcher function for on-demand loading. */
39
+ actions?: Action[] | (() => Promise<Action[]>);
40
40
  /** Reference to the component's input element. */
41
41
  ref?: Ref<HTMLDivElement>;
42
42
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"SelectionCard.types.d.ts","sourceRoot":"","sources":["../../../src/components/SelectionCard/SelectionCard.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAErF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,KAAK,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACtF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAElG,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEtE,MAAM,MAAM,cAAc,GAAG,aAAa,GAAG,YAAY,GAAG,cAAc,CAAC;AAC3E,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC;AAEvD,MAAM,MAAM,2BAA2B,GAAG,UAAU,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;AAEtF,MAAM,MAAM,kBAAkB,GAAG,cAAc,CAC7C,KAAK,EACL,cAAc,GACZ,UAAU,CAAC,OAAO,qBAAqB,CAAC,GAAG;IACzC,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,OAAO,EAAE,SAAS,CAAC;IACnB,uCAAuC;IACvC,KAAK,CAAC,EAAE,UAAU,GAAG;QACnB;;;WAGG;QACH,SAAS,CAAC,EAAE,cAAc,CAAC;QAC3B;;;WAGG;QACH,IAAI,CAAC,EAAE,SAAS,CAAC;KAClB,CAAC;IACF,wCAAwC;IACxC,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,sCAAsC;IACtC,SAAS,CAAC,EAAE,oBAAoB,CAAC;IACjC,qDAAqD;IACrD,MAAM,CAAC,EAAE,mBAAmB,CAAC,QAAQ,CAAC,GAAG,2BAA2B,EAAE,CAAC;IACvE,8EAA8E;IAC9E,cAAc,CAAC,EAAE,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;IACpD,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yBAAyB;IACzB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,kDAAkD;IAClD,GAAG,CAAC,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;CAC3B,CACJ,CAAC"}
1
+ {"version":3,"file":"SelectionCard.types.d.ts","sourceRoot":"","sources":["../../../src/components/SelectionCard/SelectionCard.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAErF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,KAAK,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACtF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAElG,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEtE,MAAM,MAAM,cAAc,GAAG,aAAa,GAAG,YAAY,GAAG,cAAc,CAAC;AAC3E,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC;AAEvD,MAAM,MAAM,2BAA2B,GAAG,UAAU,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;AAEtF,MAAM,MAAM,kBAAkB,GAAG,cAAc,CAC7C,KAAK,EACL,cAAc,GACZ,UAAU,CAAC,OAAO,qBAAqB,CAAC,GAAG;IACzC,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,OAAO,EAAE,SAAS,CAAC;IACnB,uCAAuC;IACvC,KAAK,CAAC,EAAE,UAAU,GAAG;QACnB;;;WAGG;QACH,SAAS,CAAC,EAAE,cAAc,CAAC;QAC3B;;;WAGG;QACH,IAAI,CAAC,EAAE,SAAS,CAAC;KAClB,CAAC;IACF,wCAAwC;IACxC,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,sCAAsC;IACtC,SAAS,CAAC,EAAE,oBAAoB,CAAC;IACjC,qDAAqD;IACrD,MAAM,CAAC,EAAE,mBAAmB,CAAC,QAAQ,CAAC,GAAG,2BAA2B,EAAE,CAAC;IACvE,8EAA8E;IAC9E,cAAc,CAAC,EAAE,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;IACpD,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,wFAAwF;IACxF,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC/C,kDAAkD;IAClD,GAAG,CAAC,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;CAC3B,CACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"SelectionCard.types.js","sourceRoot":"","sources":["../../../src/components/SelectionCard/SelectionCard.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Ref, MouseEventHandler, KeyboardEventHandler, ReactNode } from 'react';\n\nimport type { ImageProps } from '../Image';\nimport type { FieldValueListItemProps, FieldValueListProps } from '../FieldValueList';\nimport type { FormControlProps } from '../FormControl';\nimport type { Action, WithAttributes, NoChildrenProp, TestIdProp, OmitStrict } from '../../types';\n\nimport type { selectionCardElements } from './SelectionCard.test-ids';\n\nexport type ImagePlacement = 'block-start' | 'inline-end' | 'inline-start';\nexport type ImageSize = 'flexible' | 'large' | 'small';\n\nexport type FieldValueItemPropsOmitName = OmitStrict<FieldValueListItemProps, 'name'>;\n\nexport type SelectionCardProps = WithAttributes<\n 'div',\n NoChildrenProp &\n TestIdProp<typeof selectionCardElements> & {\n /** Pass a string or a fragment with a string. */\n label: string;\n /** Content to be rendered as a card heading */\n heading: ReactNode;\n /** The image to render in the card. */\n image?: ImageProps & {\n /**\n * Used to determine image placement\n * @default 'inline-start'\n */\n placement?: ImagePlacement;\n /**\n * Used to determine image size\n * @default 'large'\n */\n size?: ImageSize;\n };\n /** The onClick handler for the item. */\n onClick?: MouseEventHandler;\n /** Called when user presses a key. */\n onKeyDown?: KeyboardEventHandler;\n /** The set of field values to render in the card. */\n fields?: FieldValueListProps['fields'] | FieldValueItemPropsOmitName[];\n /** Pass a heading and content to show additional information on the field. */\n additionalInfo?: FormControlProps['additionalInfo'];\n /** Set the card to disabled state, ie. non-interactive. */\n disabled?: boolean;\n /** Additional actions */\n actions?: Action[];\n /** Reference to the component's input element. */\n ref?: Ref<HTMLDivElement>;\n }\n>;\n"]}
1
+ {"version":3,"file":"SelectionCard.types.js","sourceRoot":"","sources":["../../../src/components/SelectionCard/SelectionCard.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Ref, MouseEventHandler, KeyboardEventHandler, ReactNode } from 'react';\n\nimport type { ImageProps } from '../Image';\nimport type { FieldValueListItemProps, FieldValueListProps } from '../FieldValueList';\nimport type { FormControlProps } from '../FormControl';\nimport type { Action, WithAttributes, NoChildrenProp, TestIdProp, OmitStrict } from '../../types';\n\nimport type { selectionCardElements } from './SelectionCard.test-ids';\n\nexport type ImagePlacement = 'block-start' | 'inline-end' | 'inline-start';\nexport type ImageSize = 'flexible' | 'large' | 'small';\n\nexport type FieldValueItemPropsOmitName = OmitStrict<FieldValueListItemProps, 'name'>;\n\nexport type SelectionCardProps = WithAttributes<\n 'div',\n NoChildrenProp &\n TestIdProp<typeof selectionCardElements> & {\n /** Pass a string or a fragment with a string. */\n label: string;\n /** Content to be rendered as a card heading */\n heading: ReactNode;\n /** The image to render in the card. */\n image?: ImageProps & {\n /**\n * Used to determine image placement\n * @default 'inline-start'\n */\n placement?: ImagePlacement;\n /**\n * Used to determine image size\n * @default 'large'\n */\n size?: ImageSize;\n };\n /** The onClick handler for the item. */\n onClick?: MouseEventHandler;\n /** Called when user presses a key. */\n onKeyDown?: KeyboardEventHandler;\n /** The set of field values to render in the card. */\n fields?: FieldValueListProps['fields'] | FieldValueItemPropsOmitName[];\n /** Pass a heading and content to show additional information on the field. */\n additionalInfo?: FormControlProps['additionalInfo'];\n /** Set the card to disabled state, ie. non-interactive. */\n disabled?: boolean;\n /** Additional actions as a static array or a fetcher function for on-demand loading. */\n actions?: Action[] | (() => Promise<Action[]>);\n /** Reference to the component's input element. */\n ref?: Ref<HTMLDivElement>;\n }\n>;\n"]}
@@ -0,0 +1,8 @@
1
+ import type { SelectionCardProps } from './SelectionCard.types';
2
+ interface SelectionCardActionsProps extends Pick<SelectionCardProps, 'disabled'> {
3
+ actions: NonNullable<SelectionCardProps['actions']>;
4
+ contextualLabel?: string;
5
+ }
6
+ declare const SelectionCardActions: import("react").ForwardRefExoticComponent<SelectionCardActionsProps & import("react").RefAttributes<HTMLButtonElement>>;
7
+ export default SelectionCardActions;
8
+ //# sourceMappingURL=SelectionCardActions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectionCardActions.d.ts","sourceRoot":"","sources":["../../../src/components/SelectionCard/SelectionCardActions.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,UAAU,yBAA0B,SAAQ,IAAI,CAAC,kBAAkB,EAAE,UAAU,CAAC;IAC9E,OAAO,EAAE,WAAW,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC;IACpD,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,QAAA,MAAM,oBAAoB,yHAwEzB,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
@@ -0,0 +1,47 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { forwardRef, useState, useCallback } from 'react';
3
+ import { useConsolidatedRef, useI18n } from '../../hooks';
4
+ import Actions from '../Actions';
5
+ import MenuButton from '../MenuButton';
6
+ const SelectionCardActions = forwardRef(function SelectionCardActions({ actions, disabled = false, contextualLabel, ...restProps }, ref) {
7
+ const t = useI18n();
8
+ const menuButtonRef = useConsolidatedRef(ref);
9
+ const [isLoading, setIsLoading] = useState(false);
10
+ const [menuItems, setMenuItems] = useState([]);
11
+ const mapActions = useCallback((fetchedActions) => fetchedActions.map(({ text, onClick, ...action }) => ({
12
+ ...action,
13
+ primary: text,
14
+ onClick: onClick
15
+ ? (id, e) => {
16
+ onClick(id, e, menuButtonRef.current ?? undefined);
17
+ menuButtonRef.current?.focus();
18
+ }
19
+ : undefined
20
+ })), []);
21
+ const handleClick = useCallback(async (e) => {
22
+ if (typeof actions !== 'function')
23
+ return;
24
+ if (e.currentTarget.getAttribute('aria-expanded') === 'true')
25
+ return;
26
+ setIsLoading(true);
27
+ try {
28
+ const fetchedActions = await actions();
29
+ setMenuItems(mapActions(fetchedActions));
30
+ }
31
+ catch {
32
+ setMenuItems([]);
33
+ }
34
+ finally {
35
+ setIsLoading(false);
36
+ }
37
+ }, [actions, mapActions]);
38
+ if (typeof actions === 'function') {
39
+ return (_jsx(MenuButton, { ...restProps, ref: menuButtonRef, text: t('actions'), "aria-label": contextualLabel ? t('actions_for', [contextualLabel]) : undefined, iconOnly: true, icon: 'more', variant: 'simple', disabled: disabled, onClick: handleClick, menu: {
40
+ items: menuItems,
41
+ loading: isLoading
42
+ } }));
43
+ }
44
+ return (_jsx(Actions, { ...restProps, items: actions, menuAt: 1, disabled: disabled, contextualLabel: contextualLabel }));
45
+ });
46
+ export default SelectionCardActions;
47
+ //# sourceMappingURL=SelectionCardActions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectionCardActions.js","sourceRoot":"","sources":["../../../src/components/SelectionCard/SelectionCardActions.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAI1D,OAAO,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,OAAO,MAAM,YAAY,CAAC;AAEjC,OAAO,UAAU,MAAM,eAAe,CAAC;AASvC,MAAM,oBAAoB,GAAG,UAAU,CACrC,SAAS,oBAAoB,CAAC,EAAE,OAAO,EAAE,QAAQ,GAAG,KAAK,EAAE,eAAe,EAAE,GAAG,SAAS,EAAE,EAAE,GAAG;IAC7F,MAAM,CAAC,GAAG,OAAO,EAAE,CAAC;IACpB,MAAM,aAAa,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAE9C,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAkB,EAAE,CAAC,CAAC;IAEhE,MAAM,UAAU,GAAG,WAAW,CAC5B,CAAC,cAAwB,EAAmB,EAAE,CAC5C,cAAc,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;QACpD,GAAG,MAAM;QACT,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,OAAO;YACd,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;gBACR,OAAO,CAAC,EAAE,EAAE,CAAC,EAAE,aAAa,CAAC,OAAO,IAAI,SAAS,CAAC,CAAC;gBACnD,aAAa,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;YACjC,CAAC;YACH,CAAC,CAAC,SAAS;KACd,CAAC,CAAC,EACL,EAAE,CACH,CAAC;IAEF,MAAM,WAAW,GAAG,WAAW,CAC7B,KAAK,EAAE,CAAgC,EAAE,EAAE;QACzC,IAAI,OAAO,OAAO,KAAK,UAAU;YAAE,OAAO;QAC1C,IAAI,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC,eAAe,CAAC,KAAK,MAAM;YAAE,OAAO;QAErE,YAAY,CAAC,IAAI,CAAC,CAAC;QAEnB,IAAI,CAAC;YACH,MAAM,cAAc,GAAG,MAAM,OAAO,EAAE,CAAC;YACvC,YAAY,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,YAAY,CAAC,EAAE,CAAC,CAAC;QACnB,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,EACD,CAAC,OAAO,EAAE,UAAU,CAAC,CACtB,CAAC;IAEF,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;QAClC,OAAO,CACL,KAAC,UAAU,OACL,SAAS,EACb,GAAG,EAAE,aAAa,EAClB,IAAI,EAAE,CAAC,CAAC,SAAS,CAAC,gBACN,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAC7E,QAAQ,QACR,IAAI,EAAC,MAAM,EACX,OAAO,EAAC,QAAQ,EAChB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE;gBACJ,KAAK,EAAE,SAAS;gBAChB,OAAO,EAAE,SAAS;aACnB,GACD,CACH,CAAC;IACJ,CAAC;IAED,OAAO,CACL,KAAC,OAAO,OACF,SAAS,EACb,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,CAAC,EACT,QAAQ,EAAE,QAAQ,EAClB,eAAe,EAAE,eAAe,GAChC,CACH,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,eAAe,oBAAoB,CAAC","sourcesContent":["import { forwardRef, useState, useCallback } from 'react';\nimport type { MouseEvent } from 'react';\n\nimport type { Action } from '../../types';\nimport { useConsolidatedRef, useI18n } from '../../hooks';\nimport Actions from '../Actions';\nimport type { MenuItemProps } from '../Menu/Menu.types';\nimport MenuButton from '../MenuButton';\n\nimport type { SelectionCardProps } from './SelectionCard.types';\n\ninterface SelectionCardActionsProps extends Pick<SelectionCardProps, 'disabled'> {\n actions: NonNullable<SelectionCardProps['actions']>;\n contextualLabel?: string;\n}\n\nconst SelectionCardActions = forwardRef<HTMLButtonElement, SelectionCardActionsProps>(\n function SelectionCardActions({ actions, disabled = false, contextualLabel, ...restProps }, ref) {\n const t = useI18n();\n const menuButtonRef = useConsolidatedRef(ref);\n\n const [isLoading, setIsLoading] = useState(false);\n const [menuItems, setMenuItems] = useState<MenuItemProps[]>([]);\n\n const mapActions = useCallback(\n (fetchedActions: Action[]): MenuItemProps[] =>\n fetchedActions.map(({ text, onClick, ...action }) => ({\n ...action,\n primary: text,\n onClick: onClick\n ? (id, e) => {\n onClick(id, e, menuButtonRef.current ?? undefined);\n menuButtonRef.current?.focus();\n }\n : undefined\n })),\n []\n );\n\n const handleClick = useCallback(\n async (e: MouseEvent<HTMLButtonElement>) => {\n if (typeof actions !== 'function') return;\n if (e.currentTarget.getAttribute('aria-expanded') === 'true') return;\n\n setIsLoading(true);\n\n try {\n const fetchedActions = await actions();\n setMenuItems(mapActions(fetchedActions));\n } catch {\n setMenuItems([]);\n } finally {\n setIsLoading(false);\n }\n },\n [actions, mapActions]\n );\n\n if (typeof actions === 'function') {\n return (\n <MenuButton\n {...restProps}\n ref={menuButtonRef}\n text={t('actions')}\n aria-label={contextualLabel ? t('actions_for', [contextualLabel]) : undefined}\n iconOnly\n icon='more'\n variant='simple'\n disabled={disabled}\n onClick={handleClick}\n menu={{\n items: menuItems,\n loading: isLoading\n }}\n />\n );\n }\n\n return (\n <Actions\n {...restProps}\n items={actions}\n menuAt={1}\n disabled={disabled}\n contextualLabel={contextualLabel}\n />\n );\n }\n);\n\nexport default SelectionCardActions;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pega/cosmos-react-core",
3
- "version": "9.0.0-build.19.0",
3
+ "version": "9.0.0-build.19.1",
4
4
  "description": "Cosmos is a visual design system and UI component collection. Its goal is to empower application developers in their pursuit to create engaging and rewarding user experiences.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "author": "Pegasystems",