@pega/cosmos-react-cs 4.0.0-dev.17.1 → 4.0.0-dev.18.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.
- package/lib/components/Article/Article.d.ts +28 -11
- package/lib/components/Article/Article.d.ts.map +1 -1
- package/lib/components/Article/Article.js +40 -17
- package/lib/components/Article/Article.js.map +1 -1
- package/lib/components/Article/ArticleFooter.d.ts +29 -8
- package/lib/components/Article/ArticleFooter.d.ts.map +1 -1
- package/lib/components/Article/ArticleFooter.js +22 -8
- package/lib/components/Article/ArticleFooter.js.map +1 -1
- package/lib/components/Article/ArticleMeta.d.ts +13 -0
- package/lib/components/Article/ArticleMeta.d.ts.map +1 -0
- package/lib/components/Article/ArticleMeta.js +24 -0
- package/lib/components/Article/ArticleMeta.js.map +1 -0
- package/lib/components/ArticleList/ArticleList.d.ts +3 -14
- package/lib/components/ArticleList/ArticleList.d.ts.map +1 -1
- package/lib/components/ArticleList/ArticleList.js +79 -35
- package/lib/components/ArticleList/ArticleList.js.map +1 -1
- package/lib/components/ArticleList/ArticleList.types.d.ts +79 -0
- package/lib/components/ArticleList/ArticleList.types.d.ts.map +1 -0
- package/lib/components/ArticleList/ArticleList.types.js +2 -0
- package/lib/components/ArticleList/ArticleList.types.js.map +1 -0
- package/lib/components/ArticleList/ArticleListFilter.d.ts +6 -0
- package/lib/components/ArticleList/ArticleListFilter.d.ts.map +1 -0
- package/lib/components/ArticleList/ArticleListFilter.js +60 -0
- package/lib/components/ArticleList/ArticleListFilter.js.map +1 -0
- package/lib/components/ArticleList/ArticleListHeader.d.ts +2 -19
- package/lib/components/ArticleList/ArticleListHeader.d.ts.map +1 -1
- package/lib/components/ArticleList/ArticleListHeader.js +11 -58
- package/lib/components/ArticleList/ArticleListHeader.js.map +1 -1
- package/lib/components/ArticleList/ArticleSummary.d.ts +4 -11
- package/lib/components/ArticleList/ArticleSummary.d.ts.map +1 -1
- package/lib/components/ArticleList/ArticleSummary.js +36 -20
- package/lib/components/ArticleList/ArticleSummary.js.map +1 -1
- package/lib/components/ArticleList/index.d.ts +3 -4
- package/lib/components/ArticleList/index.d.ts.map +1 -1
- package/lib/components/ArticleList/index.js +1 -1
- package/lib/components/ArticleList/index.js.map +1 -1
- package/package.json +3 -3
- package/lib/components/Article/ArticleSkeleton.d.ts +0 -8
- package/lib/components/Article/ArticleSkeleton.d.ts.map +0 -1
- package/lib/components/Article/ArticleSkeleton.js +0 -15
- package/lib/components/Article/ArticleSkeleton.js.map +0 -1
- package/lib/components/ArticleList/SummarySkeleton.d.ts +0 -7
- package/lib/components/ArticleList/SummarySkeleton.d.ts.map +0 -1
- package/lib/components/ArticleList/SummarySkeleton.js +0 -9
- package/lib/components/ArticleList/SummarySkeleton.js.map +0 -1
|
@@ -1,31 +1,48 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ReactNode, FunctionComponent, MouseEvent } from 'react';
|
|
2
2
|
import { MenuItemProps, BaseProps, ForwardProps, NoChildrenProp } from '@pega/cosmos-react-core';
|
|
3
|
-
import
|
|
3
|
+
import { ArticleListHeaderProps } from '../ArticleList/ArticleList.types';
|
|
4
|
+
import { ArticleFooterProps } from './ArticleFooter';
|
|
5
|
+
import { ArticleMetaProps } from './ArticleMeta';
|
|
4
6
|
export interface BaseArticleProps extends BaseProps, NoChildrenProp {
|
|
5
|
-
/**
|
|
6
|
-
|
|
7
|
+
/** Header to show icon , title and any actions on the container */
|
|
8
|
+
header?: ArticleListHeaderProps;
|
|
9
|
+
/** Control for navigating back */
|
|
10
|
+
backNavigation?: {
|
|
11
|
+
title: string;
|
|
12
|
+
onClick: (e: MouseEvent<HTMLButtonElement>) => void;
|
|
13
|
+
};
|
|
7
14
|
/** Primary actions which needs to be displayed with an icon */
|
|
8
|
-
primaryActions?:
|
|
15
|
+
primaryActions?: {
|
|
16
|
+
/** Unique id for action, used in onClick callback */
|
|
17
|
+
id: string;
|
|
18
|
+
/** Label for this action, shown in tooltip and used for generating aria-label */
|
|
19
|
+
label: string;
|
|
20
|
+
/** Icon to be displayed in the button */
|
|
21
|
+
icon: string;
|
|
22
|
+
/** Callback triggered when a user clicks of presses enter on the action */
|
|
23
|
+
onClick: (id: string, e: MouseEvent<HTMLButtonElement>) => void;
|
|
24
|
+
}[];
|
|
9
25
|
/** Secondary actions that needs to be pushed under more icon */
|
|
10
26
|
secondaryActions?: {
|
|
11
27
|
id: MenuItemProps['id'];
|
|
12
28
|
text: MenuItemProps['primary'];
|
|
29
|
+
onClick: MenuItemProps['onClick'];
|
|
13
30
|
}[];
|
|
14
31
|
/** Article title */
|
|
15
32
|
title: string;
|
|
16
|
-
/** Array of meta data
|
|
17
|
-
meta?:
|
|
33
|
+
/** Array of meta data */
|
|
34
|
+
meta?: ArticleMetaProps;
|
|
18
35
|
/** Article content */
|
|
19
36
|
content: ReactNode;
|
|
20
37
|
/** Footer */
|
|
21
|
-
footer?:
|
|
38
|
+
footer?: ArticleFooterProps;
|
|
22
39
|
/** Prop to check visibility of skeleton */
|
|
23
|
-
|
|
40
|
+
loading: boolean;
|
|
24
41
|
}
|
|
25
42
|
export type ArticleProps = (BaseArticleProps & {
|
|
26
|
-
|
|
43
|
+
loading?: false;
|
|
27
44
|
}) | (Partial<BaseArticleProps> & {
|
|
28
|
-
|
|
45
|
+
loading: true;
|
|
29
46
|
});
|
|
30
47
|
declare const Article: FunctionComponent<ArticleProps & ForwardProps>;
|
|
31
48
|
export default Article;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Article.d.ts","sourceRoot":"","sources":["../../../src/components/Article/Article.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"Article.d.ts","sourceRoot":"","sources":["../../../src/components/Article/Article.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,UAAU,EAAqB,MAAM,OAAO,CAAC;AAGpF,OAAO,EAEL,aAAa,EAKb,SAAS,EACT,YAAY,EACZ,cAAc,EAOf,MAAM,yBAAyB,CAAC;AAIjC,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAG1E,OAAsB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACpE,OAAoB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAG9D,MAAM,WAAW,gBAAiB,SAAQ,SAAS,EAAE,cAAc;IACjE,mEAAmE;IACnE,MAAM,CAAC,EAAE,sBAAsB,CAAC;IAChC,kCAAkC;IAClC,cAAc,CAAC,EAAE;QACf,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;KACrD,CAAC;IACF,+DAA+D;IAC/D,cAAc,CAAC,EAAE;QACf,qDAAqD;QACrD,EAAE,EAAE,MAAM,CAAC;QACX,iFAAiF;QACjF,KAAK,EAAE,MAAM,CAAC;QACd,yCAAyC;QACzC,IAAI,EAAE,MAAM,CAAC;QACb,2EAA2E;QAC3E,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;KACjE,EAAE,CAAC;IACJ,gEAAgE;IAChE,gBAAgB,CAAC,EAAE;QACjB,EAAE,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;QACxB,IAAI,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;QAC/B,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;KACnC,EAAE,CAAC;IACJ,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,yBAAyB;IACzB,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,sBAAsB;IACtB,OAAO,EAAE,SAAS,CAAC;IACnB,aAAa;IACb,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,2CAA2C;IAC3C,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,YAAY,GACpB,CAAC,gBAAgB,GAAG;IAAE,OAAO,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC,GACxC,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG;IAAE,OAAO,EAAE,IAAI,CAAA;CAAE,CAAC,CAAC;AAiEpD,QAAA,MAAM,OAAO,EAAE,iBAAiB,CAAC,YAAY,GAAG,YAAY,CAqG3D,CAAC;AAEF,eAAe,OAAO,CAAC"}
|
|
@@ -1,7 +1,13 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useRef } from 'react';
|
|
2
3
|
import styled, { css } from 'styled-components';
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
4
|
+
import { registerIcon, Flex, MenuButton, Text, defaultThemeProp, Button, Icon, Progress, useI18n, StyledIcon, useDirection } from '@pega/cosmos-react-core';
|
|
5
|
+
import * as caretLeftIcon from '@pega/cosmos-react-core/lib/components/Icon/icons/caret-left.icon';
|
|
6
|
+
import * as caretRightIcon from '@pega/cosmos-react-core/lib/components/Icon/icons/caret-right.icon';
|
|
7
|
+
import ArticleListHeader from '../ArticleList/ArticleListHeader';
|
|
8
|
+
import ArticleFooter from './ArticleFooter';
|
|
9
|
+
import ArticleMeta from './ArticleMeta';
|
|
10
|
+
registerIcon(caretRightIcon, caretLeftIcon);
|
|
5
11
|
const StyledArticleWrapper = styled.div(props => {
|
|
6
12
|
const { theme } = props;
|
|
7
13
|
return css `
|
|
@@ -21,8 +27,6 @@ const StyledArticleContent = styled.div(props => {
|
|
|
21
27
|
overflow-y: auto;
|
|
22
28
|
padding: 0 calc(1.5 * ${spacing});
|
|
23
29
|
margin: 0 calc(-1.5 * ${spacing});
|
|
24
|
-
|
|
25
|
-
/* TODO - We need to think of handling this such way RTE content is not impacted with the styles inside styles/GlobalStyle.tsx */
|
|
26
30
|
ul,
|
|
27
31
|
ol {
|
|
28
32
|
padding-left: calc(3 * ${spacing});
|
|
@@ -31,24 +35,43 @@ const StyledArticleContent = styled.div(props => {
|
|
|
31
35
|
color: ${theme.components.link.color};
|
|
32
36
|
}
|
|
33
37
|
* {
|
|
34
|
-
margin:
|
|
38
|
+
margin: revert;
|
|
35
39
|
}
|
|
36
40
|
`;
|
|
37
41
|
});
|
|
42
|
+
const StyledBackNavButton = styled(Button)(({ theme: { base: { spacing } } }) => {
|
|
43
|
+
return css `
|
|
44
|
+
display: flex;
|
|
45
|
+
align-items: start;
|
|
46
|
+
gap: calc(0.5 * ${spacing});
|
|
47
|
+
margin-inline-end: calc(1.5 * ${spacing});
|
|
48
|
+
|
|
49
|
+
${StyledIcon} {
|
|
50
|
+
flex-shrink: 0;
|
|
51
|
+
}
|
|
52
|
+
`;
|
|
53
|
+
});
|
|
38
54
|
StyledArticleContent.defaultProps = defaultThemeProp;
|
|
39
55
|
StyledArticleWrapper.defaultProps = defaultThemeProp;
|
|
40
|
-
|
|
41
|
-
// FIXME: TR
|
|
42
|
-
moreActions: 'More actions'
|
|
43
|
-
};
|
|
56
|
+
StyledBackNavButton.defaultProps = defaultThemeProp;
|
|
44
57
|
const Article = (props) => {
|
|
45
|
-
const { meta, title,
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
58
|
+
const { header, meta, title, backNavigation, content, primaryActions, secondaryActions, footer, loading, ...restProps } = props;
|
|
59
|
+
const { rtl, ltr, end, start } = useDirection();
|
|
60
|
+
const t = useI18n();
|
|
61
|
+
const backButtonRef = useRef(null);
|
|
62
|
+
useEffect(() => {
|
|
63
|
+
if (!loading) {
|
|
64
|
+
backButtonRef.current?.focus();
|
|
65
|
+
}
|
|
66
|
+
}, [loading]);
|
|
67
|
+
return (_jsxs(Flex, { ...restProps, container: { direction: 'column', gap: 1 }, as: StyledArticleWrapper, "aria-busy": loading ? true : undefined, children: [header && _jsx(ArticleListHeader, { ...header }), (backNavigation || primaryActions || secondaryActions) && (_jsxs(Flex, { container: { alignItems: 'start' }, item: { grow: 1 }, children: [_jsx(Flex, { container: { pad: [1, undefined, undefined] }, item: { grow: 1 }, children: _jsxs(Button, { as: StyledBackNavButton, onClick: backNavigation?.onClick, variant: 'link', ref: backButtonRef, children: [ltr && _jsx(Icon, { name: `caret-${start}` }), backNavigation?.title, rtl && _jsx(Icon, { name: `caret-${end}` })] }) }), !loading && (_jsxs(_Fragment, { children: [primaryActions?.map(({ id, label, onClick, icon }) => {
|
|
68
|
+
return (_jsx(Button, { onClick: (e) => onClick(id, e), variant: 'simple', label: label, icon: true, children: _jsx(Icon, { name: icon }) }, id));
|
|
69
|
+
}), secondaryActions && (_jsx(MenuButton, { variant: 'simple', text: t('actions'), icon: 'more', iconOnly: true, menu: {
|
|
70
|
+
items: secondaryActions.map(({ text, ...rest }) => ({
|
|
71
|
+
...rest,
|
|
72
|
+
primary: text
|
|
73
|
+
}))
|
|
74
|
+
} }))] }))] })), !loading && (_jsxs(_Fragment, { children: [_jsx(Flex, { container: true, as: StyledArticleHeader, children: _jsx(Text, { variant: 'h2', children: title }) }), meta && (_jsx(Flex, { container: true, item: { shrink: 0 }, children: _jsx(ArticleMeta, { ...meta }) })), _jsx(StyledArticleContent, { children: content }), footer && _jsx(ArticleFooter, { ...footer })] })), _jsx(Progress, { visible: !!loading, focusOnVisible: true, placement: 'block', message: t('loading') })] }));
|
|
52
75
|
};
|
|
53
76
|
export default Article;
|
|
54
77
|
//# sourceMappingURL=Article.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Article.js","sourceRoot":"","sources":["../../../src/components/Article/Article.tsx"],"names":[],"mappings":"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","sourcesContent":["import { ReactElement, ReactNode, FunctionComponent } from 'react';\nimport styled, { css } from 'styled-components';\n\nimport {\n MenuItemProps,\n Flex,\n LineSkeleton,\n MenuButton,\n MetaList,\n Text,\n defaultThemeProp,\n BaseProps,\n ForwardProps,\n NoChildrenProp\n} from '@pega/cosmos-react-core';\n\nimport ArticleFooter from './ArticleFooter';\nimport ArticleSkeleton from './ArticleSkeleton';\n\nexport interface BaseArticleProps extends BaseProps, NoChildrenProp {\n /** Navigation elements */\n navigation?: ReactNode;\n /** Primary actions which needs to be displayed with an icon */\n primaryActions?: ReactNode;\n /** Secondary actions that needs to be pushed under more icon */\n secondaryActions?: {\n id: MenuItemProps['id'];\n text: MenuItemProps['primary'];\n }[];\n /** Article title */\n title: string;\n /** Array of meta data rendered through MetaList component */\n meta?: (ReactElement | string)[];\n /** Article content */\n content: ReactNode;\n /** Footer */\n footer?: ReactElement<typeof ArticleFooter>;\n /** Prop to check visibility of skeleton */\n skeletonize: boolean;\n}\n\nexport type ArticleProps =\n | (BaseArticleProps & { skeletonize?: false })\n | (Partial<BaseArticleProps> & { skeletonize: true });\n\nconst StyledArticleWrapper = styled.div(props => {\n const { theme } = props;\n return css`\n background: ${theme.base.palette['primary-background']};\n padding: calc(1.5 * ${theme.base.spacing});\n border-radius: calc(0.5 * ${theme.base['border-radius']});\n max-height: inherit;\n `;\n});\n\nconst StyledArticleHeader = styled.header`\n flex-shrink: 0;\n`;\n\nconst StyledArticleContent = styled.div(props => {\n const {\n theme,\n theme: {\n base: { spacing }\n }\n } = props;\n\n return css`\n flex-grow: 1;\n overflow-y: auto;\n padding: 0 calc(1.5 * ${spacing});\n margin: 0 calc(-1.5 * ${spacing});\n\n /* TODO - We need to think of handling this such way RTE content is not impacted with the styles inside styles/GlobalStyle.tsx */\n ul,\n ol {\n padding-left: calc(3 * ${spacing});\n }\n a {\n color: ${theme.components.link.color};\n }\n * {\n margin: unset;\n }\n `;\n});\n\nStyledArticleContent.defaultProps = defaultThemeProp;\nStyledArticleWrapper.defaultProps = defaultThemeProp;\n\nconst Locale = {\n // FIXME: TR\n moreActions: 'More actions'\n};\n\nconst Article: FunctionComponent<ArticleProps & ForwardProps> = (props: ArticleProps) => {\n const {\n meta,\n title,\n navigation,\n content,\n primaryActions,\n secondaryActions,\n footer,\n skeletonize,\n ...restProps\n } = props;\n\n return (\n <Flex container={{ direction: 'column', gap: 1 }} as={StyledArticleWrapper} {...restProps}>\n {(navigation || primaryActions || secondaryActions) && (\n <Flex container={{ gap: 1, alignItems: 'center' }}>\n <Flex container item={{ grow: 1 }}>\n {navigation}\n </Flex>\n <Flex container={{ alignItems: 'center' }}>\n {primaryActions}\n {secondaryActions && (\n <MenuButton\n variant='simple'\n text={Locale.moreActions}\n icon='more'\n iconOnly\n menu={{\n items: secondaryActions.map(({ text, ...rest }) => ({ ...rest, primary: text }))\n }}\n />\n )}\n </Flex>\n </Flex>\n )}\n {title ? (\n <Flex container as={StyledArticleHeader}>\n <Text variant='h2'>{title}</Text>\n </Flex>\n ) : (\n skeletonize && <LineSkeleton width='l' />\n )}\n {meta && meta.length > 0 ? (\n <Flex container item={{ shrink: 0 }}>\n <MetaList items={meta} />\n </Flex>\n ) : (\n skeletonize && (\n <Flex container>\n <LineSkeleton width='s' />\n <LineSkeleton width='s' />\n <LineSkeleton width='s' />\n </Flex>\n )\n )}\n {skeletonize ? (\n <StyledArticleContent>\n <ArticleSkeleton />\n </StyledArticleContent>\n ) : (\n <StyledArticleContent>{content}</StyledArticleContent>\n )}\n {footer}\n </Flex>\n );\n};\n\nArticle.defaultProps = {\n skeletonize: false\n};\n\nexport default Article;\n"]}
|
|
1
|
+
{"version":3,"file":"Article.js","sourceRoot":"","sources":["../../../src/components/Article/Article.tsx"],"names":[],"mappings":"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","sourcesContent":["import { ReactNode, FunctionComponent, MouseEvent, useEffect, useRef } from 'react';\nimport styled, { css } from 'styled-components';\n\nimport {\n registerIcon,\n MenuItemProps,\n Flex,\n MenuButton,\n Text,\n defaultThemeProp,\n BaseProps,\n ForwardProps,\n NoChildrenProp,\n Button,\n Icon,\n Progress,\n useI18n,\n StyledIcon,\n useDirection\n} from '@pega/cosmos-react-core';\nimport * as caretLeftIcon from '@pega/cosmos-react-core/lib/components/Icon/icons/caret-left.icon';\nimport * as caretRightIcon from '@pega/cosmos-react-core/lib/components/Icon/icons/caret-right.icon';\n\nimport { ArticleListHeaderProps } from '../ArticleList/ArticleList.types';\nimport ArticleListHeader from '../ArticleList/ArticleListHeader';\n\nimport ArticleFooter, { ArticleFooterProps } from './ArticleFooter';\nimport ArticleMeta, { ArticleMetaProps } from './ArticleMeta';\n\nregisterIcon(caretRightIcon, caretLeftIcon);\nexport interface BaseArticleProps extends BaseProps, NoChildrenProp {\n /** Header to show icon , title and any actions on the container */\n header?: ArticleListHeaderProps;\n /** Control for navigating back */\n backNavigation?: {\n title: string;\n onClick: (e: MouseEvent<HTMLButtonElement>) => void;\n };\n /** Primary actions which needs to be displayed with an icon */\n primaryActions?: {\n /** Unique id for action, used in onClick callback */\n id: string;\n /** Label for this action, shown in tooltip and used for generating aria-label */\n label: string;\n /** Icon to be displayed in the button */\n icon: string;\n /** Callback triggered when a user clicks of presses enter on the action */\n onClick: (id: string, e: MouseEvent<HTMLButtonElement>) => void;\n }[];\n /** Secondary actions that needs to be pushed under more icon */\n secondaryActions?: {\n id: MenuItemProps['id'];\n text: MenuItemProps['primary'];\n onClick: MenuItemProps['onClick'];\n }[];\n /** Article title */\n title: string;\n /** Array of meta data */\n meta?: ArticleMetaProps;\n /** Article content */\n content: ReactNode;\n /** Footer */\n footer?: ArticleFooterProps;\n /** Prop to check visibility of skeleton */\n loading: boolean;\n}\n\nexport type ArticleProps =\n | (BaseArticleProps & { loading?: false })\n | (Partial<BaseArticleProps> & { loading: true });\n\nconst StyledArticleWrapper = styled.div(props => {\n const { theme } = props;\n return css`\n background: ${theme.base.palette['primary-background']};\n padding: calc(1.5 * ${theme.base.spacing});\n border-radius: calc(0.5 * ${theme.base['border-radius']});\n max-height: inherit;\n `;\n});\n\nconst StyledArticleHeader = styled.header`\n flex-shrink: 0;\n`;\n\nconst StyledArticleContent = styled.div(props => {\n const {\n theme,\n theme: {\n base: { spacing }\n }\n } = props;\n\n return css`\n flex-grow: 1;\n overflow-y: auto;\n padding: 0 calc(1.5 * ${spacing});\n margin: 0 calc(-1.5 * ${spacing});\n ul,\n ol {\n padding-left: calc(3 * ${spacing});\n }\n a {\n color: ${theme.components.link.color};\n }\n * {\n margin: revert;\n }\n `;\n});\n\nconst StyledBackNavButton = styled(Button)(\n ({\n theme: {\n base: { spacing }\n }\n }) => {\n return css`\n display: flex;\n align-items: start;\n gap: calc(0.5 * ${spacing});\n margin-inline-end: calc(1.5 * ${spacing});\n\n ${StyledIcon} {\n flex-shrink: 0;\n }\n `;\n }\n);\n\nStyledArticleContent.defaultProps = defaultThemeProp;\nStyledArticleWrapper.defaultProps = defaultThemeProp;\nStyledBackNavButton.defaultProps = defaultThemeProp;\n\nconst Article: FunctionComponent<ArticleProps & ForwardProps> = (props: ArticleProps) => {\n const {\n header,\n meta,\n title,\n backNavigation,\n content,\n primaryActions,\n secondaryActions,\n footer,\n loading,\n ...restProps\n } = props;\n\n const { rtl, ltr, end, start } = useDirection();\n\n const t = useI18n();\n const backButtonRef = useRef<HTMLButtonElement>(null);\n\n useEffect(() => {\n if (!loading) {\n backButtonRef.current?.focus();\n }\n }, [loading]);\n\n return (\n <Flex\n {...restProps}\n container={{ direction: 'column', gap: 1 }}\n as={StyledArticleWrapper}\n aria-busy={loading ? true : undefined}\n >\n {header && <ArticleListHeader {...header} />}\n {(backNavigation || primaryActions || secondaryActions) && (\n <Flex container={{ alignItems: 'start' }} item={{ grow: 1 }}>\n <Flex container={{ pad: [1, undefined, undefined] }} item={{ grow: 1 }}>\n <Button\n as={StyledBackNavButton}\n onClick={backNavigation?.onClick}\n variant='link'\n ref={backButtonRef}\n >\n {ltr && <Icon name={`caret-${start}`} />}\n {backNavigation?.title}\n {rtl && <Icon name={`caret-${end}`} />}\n </Button>\n </Flex>\n\n {!loading && (\n <>\n {primaryActions?.map(({ id, label, onClick, icon }) => {\n return (\n <Button\n key={id}\n onClick={(e: MouseEvent<HTMLButtonElement>) => onClick(id, e)}\n variant='simple'\n label={label}\n icon\n >\n <Icon name={icon} />\n </Button>\n );\n })}\n {secondaryActions && (\n <MenuButton\n variant='simple'\n text={t('actions')}\n icon='more'\n iconOnly\n menu={{\n items: secondaryActions.map(({ text, ...rest }) => ({\n ...rest,\n primary: text\n }))\n }}\n />\n )}\n </>\n )}\n </Flex>\n )}\n {!loading && (\n <>\n <Flex container as={StyledArticleHeader}>\n <Text variant='h2'>{title}</Text>\n </Flex>\n\n {meta && (\n <Flex container item={{ shrink: 0 }}>\n <ArticleMeta {...meta} />\n </Flex>\n )}\n\n <StyledArticleContent>{content}</StyledArticleContent>\n\n {footer && <ArticleFooter {...footer} />}\n </>\n )}\n <Progress visible={!!loading} focusOnVisible placement='block' message={t('loading')} />\n </Flex>\n );\n};\n\nexport default Article;\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { BaseProps, ForwardProps } from '@pega/cosmos-react-core';
|
|
1
|
+
import { FunctionComponent, MouseEvent } from 'react';
|
|
2
|
+
import { BaseProps, ForwardProps, FileUploadItemProps } from '@pega/cosmos-react-core';
|
|
3
3
|
export interface ArticleTag {
|
|
4
4
|
/** Tag name */
|
|
5
5
|
tagName: string;
|
|
@@ -7,12 +7,33 @@ export interface ArticleTag {
|
|
|
7
7
|
id: string;
|
|
8
8
|
}
|
|
9
9
|
export interface ArticleFooterProps extends BaseProps {
|
|
10
|
-
/**
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
10
|
+
/** Feedback for this article */
|
|
11
|
+
feedback?: {
|
|
12
|
+
showThanksMessage?: boolean;
|
|
13
|
+
/** Weather the current article is liked or disliked. Used to determine */
|
|
14
|
+
status?: 'liked' | 'disliked';
|
|
15
|
+
/** Callback triggered on click of like or dislike */
|
|
16
|
+
onFeedbackClick: (button: 'like' | 'dislike', e: MouseEvent<HTMLButtonElement>) => void;
|
|
17
|
+
};
|
|
18
|
+
tags?: {
|
|
19
|
+
/** Article tags */
|
|
20
|
+
list: ArticleTag[];
|
|
21
|
+
/** Callback that triggers on click of tag */
|
|
22
|
+
onTagClick?: (id: ArticleTag['id']) => void;
|
|
23
|
+
};
|
|
24
|
+
/** Links to external sites */
|
|
25
|
+
relatedLinks?: {
|
|
26
|
+
title: string;
|
|
27
|
+
href: string;
|
|
28
|
+
}[];
|
|
29
|
+
/** Links to other articles */
|
|
30
|
+
relatedArticles?: {
|
|
31
|
+
id: string;
|
|
32
|
+
title: string;
|
|
33
|
+
onClick: (id: string, e: MouseEvent<HTMLButtonElement>) => void;
|
|
34
|
+
}[];
|
|
35
|
+
/** Attachments */
|
|
36
|
+
attachments?: FileUploadItemProps[];
|
|
16
37
|
}
|
|
17
38
|
declare const ArticleFooter: FunctionComponent<ArticleFooterProps & ForwardProps>;
|
|
18
39
|
export default ArticleFooter;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ArticleFooter.d.ts","sourceRoot":"","sources":["../../../src/components/Article/ArticleFooter.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"ArticleFooter.d.ts","sourceRoot":"","sources":["../../../src/components/Article/ArticleFooter.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAGtD,OAAO,EAIL,SAAS,EACT,YAAY,EACZ,mBAAmB,EAOpB,MAAM,yBAAyB,CAAC;AAGjC,MAAM,WAAW,UAAU;IACzB,eAAe;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,kDAAkD;IAClD,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,kBAAmB,SAAQ,SAAS;IACnD,gCAAgC;IAChC,QAAQ,CAAC,EAAE;QACT,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAC5B,2EAA2E;QAC3E,MAAM,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;QAC9B,qDAAqD;QACrD,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;KACzF,CAAC;IACF,IAAI,CAAC,EAAE;QACL,mBAAmB;QACnB,IAAI,EAAE,UAAU,EAAE,CAAC;QACnB,6CAA6C;QAC7C,UAAU,CAAC,EAAE,CAAC,EAAE,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;KAC7C,CAAC;IACF,8BAA8B;IAC9B,YAAY,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACjD,8BAA8B;IAC9B,eAAe,CAAC,EAAE;QAChB,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;KACjE,EAAE,CAAC;IACJ,kBAAkB;IAClB,WAAW,CAAC,EAAE,mBAAmB,EAAE,CAAC;CACrC;AAuCD,QAAA,MAAM,aAAa,EAAE,iBAAiB,CAAC,kBAAkB,GAAG,YAAY,CAwHvE,CAAC;AAEF,eAAe,aAAa,CAAC"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { createElement as _createElement } from "react";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
3
|
import styled, { css } from 'styled-components';
|
|
4
|
-
import { Flex, Tag, defaultThemeProp } from '@pega/cosmos-react-core';
|
|
4
|
+
import { Flex, Tag, defaultThemeProp, Button, Text, Link, useI18n, FileUploadItem, Grid } from '@pega/cosmos-react-core';
|
|
5
5
|
import { StyledTag } from '@pega/cosmos-react-core/lib/components/Badges/Tag';
|
|
6
|
+
const StyledRelatedItemsContainer = styled.div ``;
|
|
7
|
+
const StyledRelatedItemsList = styled.div ``;
|
|
6
8
|
const StyledArticleFooter = styled.div(({ theme }) => {
|
|
7
9
|
return css `
|
|
8
10
|
flex-shrink: 0;
|
|
@@ -13,6 +15,13 @@ const StyledArticleFooter = styled.div(({ theme }) => {
|
|
|
13
15
|
height: 0.0625rem;
|
|
14
16
|
margin-bottom: calc(2 * ${theme.base.spacing});
|
|
15
17
|
}
|
|
18
|
+
|
|
19
|
+
${StyledRelatedItemsContainer} {
|
|
20
|
+
margin-block-start: ${theme.base.spacing};
|
|
21
|
+
& > ${StyledRelatedItemsList} * {
|
|
22
|
+
margin-inline-start: 0;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
16
25
|
`;
|
|
17
26
|
});
|
|
18
27
|
StyledArticleFooter.defaultProps = defaultThemeProp;
|
|
@@ -27,14 +36,19 @@ const StyledTags = styled.div(({ theme }) => {
|
|
|
27
36
|
});
|
|
28
37
|
StyledTags.defaultProps = defaultThemeProp;
|
|
29
38
|
const ArticleFooter = (props) => {
|
|
30
|
-
const {
|
|
31
|
-
const
|
|
32
|
-
onTagClick?.(event.currentTarget.dataset.tagId);
|
|
33
|
-
}, [onTagClick]);
|
|
39
|
+
const { tags, relatedLinks, relatedArticles, feedback, attachments, ...restProps } = props;
|
|
40
|
+
const t = useI18n();
|
|
34
41
|
return (_jsxs(Flex, { as: StyledArticleFooter, container: {
|
|
35
42
|
direction: 'column',
|
|
36
43
|
gap: 2
|
|
37
|
-
}, ...restProps, children: [
|
|
44
|
+
}, ...restProps, children: [feedback && (_jsx(Flex, { container: { gap: 2, alignItems: 'center' }, children: feedback.showThanksMessage ? (_jsx(Text, { children: t('article_thank_you_for_your_feedback') })) : (_jsxs(_Fragment, { children: [_jsx(Text, { children: t('article_was_this_helpful') }), _jsxs(Flex, { container: true, children: [_jsx(Button, { variant: feedback.status === 'liked' ? 'primary' : 'secondary', onClick: (e) => feedback.onFeedbackClick('like', e), children: t('yes') }), _jsx(Button, { variant: feedback.status === 'disliked' ? 'primary' : 'secondary', onClick: (e) => feedback.onFeedbackClick('dislike', e), children: t('no') })] })] })) })), tags && (_jsx(Flex, { container: { wrap: 'wrap' }, as: StyledTags, children: tags.list.map(tag => (_jsx(Tag, { tabIndex: 0, type: 'pill', variant: 'light', "data-tag-id": tag.id, ...(tags.onTagClick ? { onClick: () => tags.onTagClick?.(tag.id) } : undefined), rel: 'tag', children: tag.tagName }, tag.id))) })), relatedLinks && (_jsxs(Flex, { as: StyledRelatedItemsContainer, container: { direction: 'column', gap: 1 }, children: [_jsx(Text, { variant: 'h3', children: t('article_related_links') }), _jsx(Flex, { as: StyledRelatedItemsList, container: { direction: 'column', alignItems: 'start', gap: 0.5 }, children: relatedLinks?.map(({ title, href }) => {
|
|
45
|
+
return (_jsx(Link, { href: href, target: '_blank', children: title }, title));
|
|
46
|
+
}) })] })), relatedArticles && (_jsxs(Flex, { as: StyledRelatedItemsContainer, container: { direction: 'column', gap: 1 }, children: [_jsx(Text, { variant: 'h3', children: t('article_more_like_this') }), _jsx(Flex, { as: StyledRelatedItemsList, container: { direction: 'column', alignItems: 'start', gap: 0.5 }, children: relatedArticles?.map(({ id, title, onClick }) => {
|
|
47
|
+
return (_jsx(Button, { variant: 'link', onClick: (e) => onClick(id, e), children: title }, id));
|
|
48
|
+
}) })] })), attachments && (_jsxs(Flex, { as: StyledRelatedItemsContainer, container: { direction: 'column', gap: 1 }, children: [_jsx(Text, { variant: 'h3', children: t('article_attachments') }), _jsx(Grid, { container: {
|
|
49
|
+
cols: 'repeat(auto-fill, minmax(10rem, 1fr))',
|
|
50
|
+
gap: 1
|
|
51
|
+
}, as: 'ul', children: attachments?.map(attachment => (_createElement(FileUploadItem, { ...attachment, key: attachment.name }))) })] }))] }));
|
|
38
52
|
};
|
|
39
53
|
export default ArticleFooter;
|
|
40
54
|
//# sourceMappingURL=ArticleFooter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ArticleFooter.js","sourceRoot":"","sources":["../../../src/components/Article/ArticleFooter.tsx"],"names":[],"mappings":";AAAA,OAAO,EAA4C,WAAW,EAAE,MAAM,OAAO,CAAC;AAC9E,OAAO,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,gBAAgB,EAA2B,MAAM,yBAAyB,CAAC;AAC/F,OAAO,EAAE,SAAS,EAAE,MAAM,mDAAmD,CAAC;AAkB9E,MAAM,mBAAmB,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;IACnD,OAAO,GAAG,CAAA;;;;;oBAKQ,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;;gCAErB,KAAK,CAAC,IAAI,CAAC,OAAO;;GAE/C,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,mBAAmB,CAAC,YAAY,GAAG,gBAAgB,CAAC;AAEpD,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;IAC1C,OAAO,GAAG,CAAA;2BACe,KAAK,CAAC,IAAI,CAAC,OAAO;4BACjB,KAAK,CAAC,IAAI,CAAC,OAAO;UACpC,SAAS;4BACS,KAAK,CAAC,IAAI,CAAC,OAAO;;GAE3C,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,UAAU,CAAC,YAAY,GAAG,gBAAgB,CAAC;AAE3C,MAAM,aAAa,GAAyD,CAC1E,KAAyB,EACzB,EAAE;IACF,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,SAAS,EAAE,GAAG,KAAK,CAAC;IAE1D,MAAM,iBAAiB,GAAG,WAAW,CACnC,CAAC,KAA8B,EAAE,EAAE;QACjC,UAAU,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,KAAM,CAAC,CAAC;IACnD,CAAC,EACD,CAAC,UAAU,CAAC,CACb,CAAC;IAEF,OAAO,CACL,MAAC,IAAI,IACH,EAAE,EAAE,mBAAmB,EACvB,SAAS,EAAE;YACT,SAAS,EAAE,QAAQ;YACnB,GAAG,EAAE,CAAC;SACP,KACG,SAAS,aAEZ,OAAO,EACP,IAAI,IAAI,CACP,KAAC,IAAI,IAAC,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,UAAU,YAC9C,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CACf,KAAC,GAAG,IACF,QAAQ,EAAE,CAAC,EACX,IAAI,EAAC,MAAM,EACX,OAAO,EAAC,OAAO,iBAEF,GAAG,CAAC,EAAE,EACnB,OAAO,EAAE,iBAAiB,EAC1B,GAAG,EAAC,KAAK,YAER,GAAG,CAAC,OAAO,IALP,GAAG,CAAC,EAAE,CAMP,CACP,CAAC,GACG,CACR,IACI,CACR,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,aAAa,CAAC","sourcesContent":["import { ReactNode, FunctionComponent, MouseEvent, useCallback } from 'react';\nimport styled, { css } from 'styled-components';\n\nimport { Flex, Tag, defaultThemeProp, BaseProps, ForwardProps } from '@pega/cosmos-react-core';\nimport { StyledTag } from '@pega/cosmos-react-core/lib/components/Badges/Tag';\n\nexport interface ArticleTag {\n /** Tag name */\n tagName: string;\n /** Tag id. If not set tagName is treated as id */\n id: string;\n}\n\nexport interface ArticleFooterProps extends BaseProps {\n /** Article tags */\n tags?: ArticleTag[];\n /** Callback that triggers on click of tag */\n onTagClick?: (id: ArticleTag['id']) => void;\n /** Footer content */\n content?: ReactNode;\n}\n\nconst StyledArticleFooter = styled.div(({ theme }) => {\n return css`\n flex-shrink: 0;\n &::before {\n content: '';\n display: block;\n background: ${theme.base.palette['border-line']};\n height: 0.0625rem;\n margin-bottom: calc(2 * ${theme.base.spacing});\n }\n `;\n});\n\nStyledArticleFooter.defaultProps = defaultThemeProp;\n\nconst StyledTags = styled.div(({ theme }) => {\n return css`\n padding: calc(0.25 * ${theme.base.spacing});\n margin: 0 calc(-0.5 * ${theme.base.spacing});\n & > ${StyledTag} {\n margin: calc(0.25 * ${theme.base.spacing});\n }\n `;\n});\n\nStyledTags.defaultProps = defaultThemeProp;\n\nconst ArticleFooter: FunctionComponent<ArticleFooterProps & ForwardProps> = (\n props: ArticleFooterProps\n) => {\n const { content, tags, onTagClick, ...restProps } = props;\n\n const onTagClickHandler = useCallback(\n (event: MouseEvent<HTMLElement>) => {\n onTagClick?.(event.currentTarget.dataset.tagId!);\n },\n [onTagClick]\n );\n\n return (\n <Flex\n as={StyledArticleFooter}\n container={{\n direction: 'column',\n gap: 2\n }}\n {...restProps}\n >\n {content}\n {tags && (\n <Flex container={{ wrap: 'wrap' }} as={StyledTags}>\n {tags.map(tag => (\n <Tag\n tabIndex={0}\n type='pill'\n variant='light'\n key={tag.id}\n data-tag-id={tag.id}\n onClick={onTagClickHandler}\n rel='tag'\n >\n {tag.tagName}\n </Tag>\n ))}\n </Flex>\n )}\n </Flex>\n );\n};\n\nexport default ArticleFooter;\n"]}
|
|
1
|
+
{"version":3,"file":"ArticleFooter.js","sourceRoot":"","sources":["../../../src/components/Article/ArticleFooter.tsx"],"names":[],"mappings":"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","sourcesContent":["import { FunctionComponent, MouseEvent } from 'react';\nimport styled, { css } from 'styled-components';\n\nimport {\n Flex,\n Tag,\n defaultThemeProp,\n BaseProps,\n ForwardProps,\n FileUploadItemProps,\n Button,\n Text,\n Link,\n useI18n,\n FileUploadItem,\n Grid\n} from '@pega/cosmos-react-core';\nimport { StyledTag } from '@pega/cosmos-react-core/lib/components/Badges/Tag';\n\nexport interface ArticleTag {\n /** Tag name */\n tagName: string;\n /** Tag id. If not set tagName is treated as id */\n id: string;\n}\n\nexport interface ArticleFooterProps extends BaseProps {\n /** Feedback for this article */\n feedback?: {\n showThanksMessage?: boolean;\n /** Weather the current article is liked or disliked. Used to determine */\n status?: 'liked' | 'disliked';\n /** Callback triggered on click of like or dislike */\n onFeedbackClick: (button: 'like' | 'dislike', e: MouseEvent<HTMLButtonElement>) => void;\n };\n tags?: {\n /** Article tags */\n list: ArticleTag[];\n /** Callback that triggers on click of tag */\n onTagClick?: (id: ArticleTag['id']) => void;\n };\n /** Links to external sites */\n relatedLinks?: { title: string; href: string }[];\n /** Links to other articles */\n relatedArticles?: {\n id: string;\n title: string;\n onClick: (id: string, e: MouseEvent<HTMLButtonElement>) => void;\n }[];\n /** Attachments */\n attachments?: FileUploadItemProps[];\n}\n\nconst StyledRelatedItemsContainer = styled.div``;\nconst StyledRelatedItemsList = styled.div``;\n\nconst StyledArticleFooter = styled.div(({ theme }) => {\n return css`\n flex-shrink: 0;\n &::before {\n content: '';\n display: block;\n background: ${theme.base.palette['border-line']};\n height: 0.0625rem;\n margin-bottom: calc(2 * ${theme.base.spacing});\n }\n\n ${StyledRelatedItemsContainer} {\n margin-block-start: ${theme.base.spacing};\n & > ${StyledRelatedItemsList} * {\n margin-inline-start: 0;\n }\n }\n `;\n});\n\nStyledArticleFooter.defaultProps = defaultThemeProp;\n\nconst StyledTags = styled.div(({ theme }) => {\n return css`\n padding: calc(0.25 * ${theme.base.spacing});\n margin: 0 calc(-0.5 * ${theme.base.spacing});\n & > ${StyledTag} {\n margin: calc(0.25 * ${theme.base.spacing});\n }\n `;\n});\n\nStyledTags.defaultProps = defaultThemeProp;\n\nconst ArticleFooter: FunctionComponent<ArticleFooterProps & ForwardProps> = (\n props: ArticleFooterProps\n) => {\n const { tags, relatedLinks, relatedArticles, feedback, attachments, ...restProps } = props;\n const t = useI18n();\n\n return (\n <Flex\n as={StyledArticleFooter}\n container={{\n direction: 'column',\n gap: 2\n }}\n {...restProps}\n >\n {feedback && (\n <Flex container={{ gap: 2, alignItems: 'center' }}>\n {feedback.showThanksMessage ? (\n <Text>{t('article_thank_you_for_your_feedback')}</Text>\n ) : (\n <>\n <Text>{t('article_was_this_helpful')}</Text>\n <Flex container>\n <Button\n variant={feedback.status === 'liked' ? 'primary' : 'secondary'}\n onClick={(e: MouseEvent<HTMLButtonElement>) =>\n feedback.onFeedbackClick('like', e)\n }\n >\n {t('yes')}\n </Button>\n <Button\n variant={feedback.status === 'disliked' ? 'primary' : 'secondary'}\n onClick={(e: MouseEvent<HTMLButtonElement>) =>\n feedback.onFeedbackClick('dislike', e)\n }\n >\n {t('no')}\n </Button>\n </Flex>\n </>\n )}\n </Flex>\n )}\n {tags && (\n <Flex container={{ wrap: 'wrap' }} as={StyledTags}>\n {tags.list.map(tag => (\n <Tag\n tabIndex={0}\n type='pill'\n variant='light'\n key={tag.id}\n data-tag-id={tag.id}\n {...(tags.onTagClick ? { onClick: () => tags.onTagClick?.(tag.id) } : undefined)}\n rel='tag'\n >\n {tag.tagName}\n </Tag>\n ))}\n </Flex>\n )}\n\n {relatedLinks && (\n <Flex as={StyledRelatedItemsContainer} container={{ direction: 'column', gap: 1 }}>\n <Text variant='h3'>{t('article_related_links')}</Text>\n <Flex\n as={StyledRelatedItemsList}\n container={{ direction: 'column', alignItems: 'start', gap: 0.5 }}\n >\n {relatedLinks?.map(({ title, href }) => {\n return (\n <Link href={href} target='_blank' key={title}>\n {title}\n </Link>\n );\n })}\n </Flex>\n </Flex>\n )}\n\n {relatedArticles && (\n <Flex as={StyledRelatedItemsContainer} container={{ direction: 'column', gap: 1 }}>\n <Text variant='h3'>{t('article_more_like_this')}</Text>\n <Flex\n as={StyledRelatedItemsList}\n container={{ direction: 'column', alignItems: 'start', gap: 0.5 }}\n >\n {relatedArticles?.map(({ id, title, onClick }) => {\n return (\n <Button\n key={id}\n variant='link'\n onClick={(e: MouseEvent<HTMLButtonElement>) => onClick(id, e)}\n >\n {title}\n </Button>\n );\n })}\n </Flex>\n </Flex>\n )}\n\n {attachments && (\n <Flex as={StyledRelatedItemsContainer} container={{ direction: 'column', gap: 1 }}>\n <Text variant='h3'>{t('article_attachments')}</Text>\n <Grid\n container={{\n cols: 'repeat(auto-fill, minmax(10rem, 1fr))',\n gap: 1\n }}\n as='ul'\n >\n {attachments?.map(attachment => (\n <FileUploadItem {...attachment} key={attachment.name} />\n ))}\n </Grid>\n </Flex>\n )}\n </Flex>\n );\n};\n\nexport default ArticleFooter;\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { FunctionComponent } from 'react';
|
|
2
|
+
import { DateTimeDisplayProps } from '@pega/cosmos-react-core';
|
|
3
|
+
export interface ArticleMetaProps {
|
|
4
|
+
category?: string;
|
|
5
|
+
publishedDate?: DateTimeDisplayProps['value'];
|
|
6
|
+
feedback?: {
|
|
7
|
+
likes: number;
|
|
8
|
+
dislikes: number;
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
declare const ArticleMeta: FunctionComponent<ArticleMetaProps>;
|
|
12
|
+
export default ArticleMeta;
|
|
13
|
+
//# sourceMappingURL=ArticleMeta.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ArticleMeta.d.ts","sourceRoot":"","sources":["../../../src/components/Article/ArticleMeta.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAW,MAAM,OAAO,CAAC;AAEnD,OAAO,EAGL,oBAAoB,EAOrB,MAAM,yBAAyB,CAAC;AAKjC,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9C,QAAQ,CAAC,EAAE;QACT,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,QAAA,MAAM,WAAW,EAAE,iBAAiB,CAAC,gBAAgB,CA+CpD,CAAC;AAEF,eAAe,WAAW,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo } from 'react';
|
|
3
|
+
import { registerIcon, DateTimeDisplay, Flex, Icon, MetaList, Text, VisuallyHiddenText, useI18n } from '@pega/cosmos-react-core';
|
|
4
|
+
import * as thumbsUpSolidIcon from '@pega/cosmos-react-core/lib/components/Icon/icons/thumbs-up-solid.icon';
|
|
5
|
+
registerIcon(thumbsUpSolidIcon);
|
|
6
|
+
const ArticleMeta = ({ category, publishedDate, feedback }) => {
|
|
7
|
+
const t = useI18n();
|
|
8
|
+
const metaItems = useMemo(() => {
|
|
9
|
+
const items = [];
|
|
10
|
+
if (category) {
|
|
11
|
+
items.push(category);
|
|
12
|
+
}
|
|
13
|
+
if (publishedDate) {
|
|
14
|
+
items.push(_jsx(DateTimeDisplay, { value: publishedDate, variant: 'date', format: 'long' }));
|
|
15
|
+
}
|
|
16
|
+
if (feedback) {
|
|
17
|
+
items.push(_jsxs(Flex, { container: { gap: 1, alignItems: 'center' }, children: [_jsxs(Flex, { "aria-label": `${feedback.likes} ${t('likes')}`, container: { gap: 0.5, alignItems: 'center' }, children: [_jsx(Icon, { name: 'thumbs-up-solid' }), _jsxs(Text, { variant: 'secondary', children: [feedback.likes, _jsx(VisuallyHiddenText, { children: t('likes') })] })] }), _jsxs(Flex, { "aria-label": `${feedback.dislikes} ${t('dislikes')}`, container: { gap: 0.5, alignItems: 'center' }, children: [_jsx(Icon, { name: 'thumbs-down-solid' }), _jsxs(Text, { variant: 'secondary', children: [feedback.dislikes, _jsx(VisuallyHiddenText, { children: t('dislikes') })] })] })] }, 'likes'));
|
|
18
|
+
}
|
|
19
|
+
return items;
|
|
20
|
+
}, [category, publishedDate, feedback]);
|
|
21
|
+
return _jsx(MetaList, { items: metaItems });
|
|
22
|
+
};
|
|
23
|
+
export default ArticleMeta;
|
|
24
|
+
//# sourceMappingURL=ArticleMeta.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ArticleMeta.js","sourceRoot":"","sources":["../../../src/components/Article/ArticleMeta.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAqB,OAAO,EAAE,MAAM,OAAO,CAAC;AAEnD,OAAO,EACL,YAAY,EACZ,eAAe,EAEf,IAAI,EACJ,IAAI,EACJ,QAAQ,EACR,IAAI,EACJ,kBAAkB,EAClB,OAAO,EACR,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,iBAAiB,MAAM,wEAAwE,CAAC;AAE5G,YAAY,CAAC,iBAAiB,CAAC,CAAC;AAWhC,MAAM,WAAW,GAAwC,CAAC,EACxD,QAAQ,EACR,aAAa,EACb,QAAQ,EACT,EAAE,EAAE;IACH,MAAM,CAAC,GAAG,OAAO,EAAE,CAAC;IACpB,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE;QAC7B,MAAM,KAAK,GAAG,EAAE,CAAC;QACjB,IAAI,QAAQ,EAAE;YACZ,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;SACtB;QAED,IAAI,aAAa,EAAE;YACjB,KAAK,CAAC,IAAI,CAAC,KAAC,eAAe,IAAC,KAAK,EAAE,aAAa,EAAE,OAAO,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,GAAG,CAAC,CAAC;SACpF;QAED,IAAI,QAAQ,EAAE;YACZ,KAAK,CAAC,IAAI,CACR,MAAC,IAAI,IAAC,SAAS,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,aAC/C,MAAC,IAAI,kBACS,GAAG,QAAQ,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,EAC7C,SAAS,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE,aAE7C,KAAC,IAAI,IAAC,IAAI,EAAC,iBAAiB,GAAG,EAC/B,MAAC,IAAI,IAAC,OAAO,EAAC,WAAW,aACtB,QAAQ,CAAC,KAAK,EACf,KAAC,kBAAkB,cAAE,CAAC,CAAC,OAAO,CAAC,GAAsB,IAChD,IACF,EACP,MAAC,IAAI,kBACS,GAAG,QAAQ,CAAC,QAAQ,IAAI,CAAC,CAAC,UAAU,CAAC,EAAE,EACnD,SAAS,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE,aAE7C,KAAC,IAAI,IAAC,IAAI,EAAC,mBAAmB,GAAG,EACjC,MAAC,IAAI,IAAC,OAAO,EAAC,WAAW,aACtB,QAAQ,CAAC,QAAQ,EAClB,KAAC,kBAAkB,cAAE,CAAC,CAAC,UAAU,CAAC,GAAsB,IACnD,IACF,KApB8C,OAAO,CAqBvD,CACR,CAAC;SACH;QAED,OAAO,KAAK,CAAC;IACf,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC,CAAC;IAExC,OAAO,KAAC,QAAQ,IAAC,KAAK,EAAE,SAAS,GAAI,CAAC;AACxC,CAAC,CAAC;AAEF,eAAe,WAAW,CAAC","sourcesContent":["import { FunctionComponent, useMemo } from 'react';\n\nimport {\n registerIcon,\n DateTimeDisplay,\n DateTimeDisplayProps,\n Flex,\n Icon,\n MetaList,\n Text,\n VisuallyHiddenText,\n useI18n\n} from '@pega/cosmos-react-core';\nimport * as thumbsUpSolidIcon from '@pega/cosmos-react-core/lib/components/Icon/icons/thumbs-up-solid.icon';\n\nregisterIcon(thumbsUpSolidIcon);\n\nexport interface ArticleMetaProps {\n category?: string;\n publishedDate?: DateTimeDisplayProps['value'];\n feedback?: {\n likes: number;\n dislikes: number;\n };\n}\n\nconst ArticleMeta: FunctionComponent<ArticleMetaProps> = ({\n category,\n publishedDate,\n feedback\n}) => {\n const t = useI18n();\n const metaItems = useMemo(() => {\n const items = [];\n if (category) {\n items.push(category);\n }\n\n if (publishedDate) {\n items.push(<DateTimeDisplay value={publishedDate} variant='date' format='long' />);\n }\n\n if (feedback) {\n items.push(\n <Flex container={{ gap: 1, alignItems: 'center' }} key='likes'>\n <Flex\n aria-label={`${feedback.likes} ${t('likes')}`}\n container={{ gap: 0.5, alignItems: 'center' }}\n >\n <Icon name='thumbs-up-solid' />\n <Text variant='secondary'>\n {feedback.likes}\n <VisuallyHiddenText>{t('likes')}</VisuallyHiddenText>\n </Text>\n </Flex>\n <Flex\n aria-label={`${feedback.dislikes} ${t('dislikes')}`}\n container={{ gap: 0.5, alignItems: 'center' }}\n >\n <Icon name='thumbs-down-solid' />\n <Text variant='secondary'>\n {feedback.dislikes}\n <VisuallyHiddenText>{t('dislikes')}</VisuallyHiddenText>\n </Text>\n </Flex>\n </Flex>\n );\n }\n\n return items;\n }, [category, publishedDate, feedback]);\n\n return <MetaList items={metaItems} />;\n};\n\nexport default ArticleMeta;\n"]}
|
|
@@ -1,17 +1,6 @@
|
|
|
1
|
-
import { FunctionComponent
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
export interface ArticleListProps extends BaseProps {
|
|
5
|
-
/** Search/filtering criteria for article list */
|
|
6
|
-
header?: ReactElement<typeof ArticleListHeader>;
|
|
7
|
-
/** Content for article list */
|
|
8
|
-
children?: ReactNode;
|
|
9
|
-
/** Prop to check visibility of skeleton */
|
|
10
|
-
skeletonize: boolean;
|
|
11
|
-
/** Footer for article list */
|
|
12
|
-
footer?: ReactNode;
|
|
13
|
-
ref?: Ref<HTMLDivElement>;
|
|
14
|
-
}
|
|
1
|
+
import { FunctionComponent } from 'react';
|
|
2
|
+
import { ForwardProps } from '@pega/cosmos-react-core';
|
|
3
|
+
import { ArticleListProps } from './ArticleList.types';
|
|
15
4
|
declare const ArticleList: FunctionComponent<ArticleListProps & ForwardProps>;
|
|
16
5
|
export default ArticleList;
|
|
17
6
|
//# sourceMappingURL=ArticleList.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ArticleList.d.ts","sourceRoot":"","sources":["../../../src/components/ArticleList/ArticleList.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,
|
|
1
|
+
{"version":3,"file":"ArticleList.d.ts","sourceRoot":"","sources":["../../../src/components/ArticleList/ArticleList.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EAQlB,MAAM,OAAO,CAAC;AAGf,OAAO,EAIL,YAAY,EAOb,MAAM,yBAAyB,CAAC;AAIjC,OAAO,EAAE,gBAAgB,EAAuB,MAAM,qBAAqB,CAAC;AAgC5E,QAAA,MAAM,WAAW,EAAE,iBAAiB,CAAC,gBAAgB,GAAG,YAAY,CA8KnE,CAAC;AAEF,eAAe,WAAW,CAAC"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { jsx as _jsx,
|
|
2
|
-
import { forwardRef } from 'react';
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef, useMemo, useEffect, useRef, useLayoutEffect } from 'react';
|
|
3
3
|
import styled, { css } from 'styled-components';
|
|
4
|
-
import { Flex, useI18n, defaultThemeProp } from '@pega/cosmos-react-core';
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
|
|
4
|
+
import { Flex, useI18n, defaultThemeProp, TabPanel, Tabs, EmptyState, Progress, getFocusables } from '@pega/cosmos-react-core';
|
|
5
|
+
import ArticleListFilter from './ArticleListFilter';
|
|
6
|
+
import ArticleSummary from './ArticleSummary';
|
|
7
|
+
import ArticleListHeader from './ArticleListHeader';
|
|
8
8
|
const StyledSummaryList = styled.ul ``;
|
|
9
9
|
const StyledArticleList = styled.div(props => {
|
|
10
10
|
const { theme } = props;
|
|
@@ -14,9 +14,10 @@ const StyledArticleList = styled.div(props => {
|
|
|
14
14
|
padding: 0 calc(2 * ${theme.base.spacing});
|
|
15
15
|
background: ${theme.base.palette['primary-background']};
|
|
16
16
|
border-radius: ${theme.components.card['border-radius']};
|
|
17
|
-
|
|
18
|
-
margin
|
|
17
|
+
> div {
|
|
18
|
+
margin: ${theme.base.spacing} 0;
|
|
19
19
|
}
|
|
20
|
+
|
|
20
21
|
${StyledSummaryList} {
|
|
21
22
|
flex-grow: 1;
|
|
22
23
|
margin: 0 0 ${theme.base.spacing} 0;
|
|
@@ -31,35 +32,78 @@ const StyledArticleList = styled.div(props => {
|
|
|
31
32
|
`;
|
|
32
33
|
});
|
|
33
34
|
StyledArticleList.defaultProps = defaultThemeProp;
|
|
34
|
-
const StyledArticleListHeader = styled.div(props => {
|
|
35
|
-
const { theme } = props;
|
|
36
|
-
return css `
|
|
37
|
-
flex-shrink: 0;
|
|
38
|
-
position: sticky;
|
|
39
|
-
top: 0;
|
|
40
|
-
background: ${theme.base.palette['primary-background']};
|
|
41
|
-
padding: calc(2 * ${theme.base.spacing}) 0 0 0;
|
|
42
|
-
z-index: 2;
|
|
43
|
-
`;
|
|
44
|
-
});
|
|
45
|
-
StyledArticleListHeader.defaultProps = defaultThemeProp;
|
|
46
|
-
const StyledArticleListFooter = styled.div(props => {
|
|
47
|
-
const { theme } = props;
|
|
48
|
-
return css `
|
|
49
|
-
flex-shrink: 0;
|
|
50
|
-
position: sticky;
|
|
51
|
-
bottom: 0;
|
|
52
|
-
background: ${theme.base.palette['primary-background']};
|
|
53
|
-
padding: ${theme.base.spacing} 0;
|
|
54
|
-
z-index: 2;
|
|
55
|
-
`;
|
|
56
|
-
});
|
|
57
|
-
StyledArticleListFooter.defaultProps = defaultThemeProp;
|
|
58
35
|
const ArticleList = forwardRef((props, ref) => {
|
|
59
|
-
const { header,
|
|
36
|
+
const { header, suggested, followed, search, onTabClick, activeTab, loading = false, onQuickFilterClick, ...restProps } = props;
|
|
60
37
|
const t = useI18n();
|
|
61
|
-
|
|
38
|
+
const articleContentRefs = useRef([]);
|
|
39
|
+
const activeTabContentRef = useRef(null);
|
|
40
|
+
const tabsRef = useRef(null);
|
|
41
|
+
const activeElementRef = useRef(null);
|
|
42
|
+
const tabs = useMemo(() => {
|
|
43
|
+
const tabsArr = [];
|
|
44
|
+
if (suggested)
|
|
45
|
+
tabsArr.push({
|
|
46
|
+
id: t('suggested'),
|
|
47
|
+
name: t('suggested'),
|
|
48
|
+
count: suggested?.count,
|
|
49
|
+
content: suggested.articles ?? []
|
|
50
|
+
});
|
|
51
|
+
if (search)
|
|
52
|
+
tabsArr.push({
|
|
53
|
+
id: t('search'),
|
|
54
|
+
name: t('search'),
|
|
55
|
+
count: search?.count,
|
|
56
|
+
content: search?.articles ?? []
|
|
57
|
+
});
|
|
58
|
+
if (followed)
|
|
59
|
+
tabsArr.push({
|
|
60
|
+
id: t('followed'),
|
|
61
|
+
name: t('followed'),
|
|
62
|
+
count: followed?.count,
|
|
63
|
+
content: followed?.articles ?? []
|
|
64
|
+
});
|
|
65
|
+
return tabsArr;
|
|
66
|
+
}, [suggested, followed, search]);
|
|
67
|
+
useEffect(() => {
|
|
68
|
+
if (tabsRef.current && getFocusables(tabsRef)?.length > 0)
|
|
69
|
+
activeElementRef.current = getFocusables(tabsRef)[0];
|
|
70
|
+
else {
|
|
71
|
+
activeTabContentRef.current =
|
|
72
|
+
articleContentRefs.current[tabs.findIndex(({ id }) => id === activeTab)];
|
|
73
|
+
if (activeTabContentRef && getFocusables(activeTabContentRef)?.length > 0) {
|
|
74
|
+
activeElementRef.current = getFocusables(activeTabContentRef)[0];
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}, []);
|
|
78
|
+
useLayoutEffect(() => {
|
|
79
|
+
if (loading && document.activeElement instanceof HTMLElement) {
|
|
80
|
+
activeElementRef.current = document.activeElement;
|
|
81
|
+
}
|
|
82
|
+
if (!loading && search?.quickFilters?.length === 0) {
|
|
83
|
+
activeElementRef.current?.focus();
|
|
84
|
+
activeElementRef.current = null;
|
|
85
|
+
}
|
|
86
|
+
}, [loading]);
|
|
87
|
+
const articleContent = ({ index, content }) => {
|
|
88
|
+
return (_jsxs("div", { ref: el => {
|
|
89
|
+
if (el)
|
|
90
|
+
articleContentRefs.current[index] = el;
|
|
91
|
+
}, children: [activeTab === t('search') && search && _jsx(ArticleListFilter, { ...search }), activeTab === t('followed') && followed && _jsx(ArticleListFilter, { ...followed }), loading ? (_jsx(Progress, { visible: !!loading, focusOnVisible: true, placement: 'block', message: t('loading') })) : (_jsx(Flex, { container: { direction: 'column' }, as: StyledSummaryList, role: 'feed', children: content.length > 0 ? (content.map(({ href, articleId, title: summaryHeader, abstract, meta, onTitleClick, quickFilters, primaryActions: summaryActions }) => (_jsx(ArticleSummary, { articleId: articleId, href: href, title: summaryHeader, abstract: abstract, onTitleClick: onTitleClick, primaryActions: summaryActions, meta: meta, quickFilters: quickFilters, onQuickFilterClick: onQuickFilterClick }, articleId.toString())))) : (_jsx(EmptyState, {})) }))] }));
|
|
92
|
+
};
|
|
93
|
+
return (_jsxs(Flex, { container: { direction: 'column' }, as: StyledArticleList, "aria-label": t('article_list_label_a11y'), ref: ref, ...(loading ? { 'aria-busy': true } : undefined), ...restProps, children: [header && (_jsx(ArticleListHeader, { icon: header.icon, title: header.title, actions: header.actions })), tabs.length > 1 && (_jsx(Tabs, { ref: tabsRef, tabs: tabs, onTabClick: (name, e) => {
|
|
94
|
+
if (document.activeElement instanceof HTMLElement) {
|
|
95
|
+
activeElementRef.current = document.activeElement;
|
|
96
|
+
onTabClick?.(name, e);
|
|
97
|
+
}
|
|
98
|
+
}, currentTabId: activeTab })), tabs.map(({ id, content }, index) => {
|
|
99
|
+
if (tabs.length > 1) {
|
|
100
|
+
return (_jsx(TabPanel, { tabId: id, currentTabId: activeTab, children: articleContent({ content, index }) }, id));
|
|
101
|
+
}
|
|
102
|
+
if (tabs.length === 1) {
|
|
103
|
+
return articleContent({ content, index });
|
|
104
|
+
}
|
|
105
|
+
return _jsx(EmptyState, {});
|
|
106
|
+
})] }));
|
|
62
107
|
});
|
|
63
|
-
ArticleList.defaultProps = defaultProps;
|
|
64
108
|
export default ArticleList;
|
|
65
109
|
//# sourceMappingURL=ArticleList.js.map
|