@atlaskit/smart-card 26.41.2 → 26.42.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/CHANGELOG.md +12 -0
- package/dist/cjs/ssr.js +2 -2
- package/dist/cjs/utils/analytics/analytics.js +1 -1
- package/dist/cjs/view/CardWithUrl/component-lazy/LazyFallback.js +2 -19
- package/dist/cjs/view/CardWithUrl/component-lazy/LazyIntersectionObserverCard.js +2 -2
- package/dist/cjs/view/CardWithUrl/component-lazy/LazyLazilyRenderCard.js +2 -2
- package/dist/cjs/view/CardWithUrl/component-lazy/LoadingCardLink.js +24 -0
- package/dist/cjs/view/CardWithUrl/loader.js +2 -2
- package/dist/cjs/view/FlexibleCard/components/blocks/related-urls-block/analytics.js +30 -0
- package/dist/cjs/view/FlexibleCard/components/blocks/related-urls-block/index.js +19 -8
- package/dist/cjs/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/index.js +11 -16
- package/dist/cjs/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/related-url-item/index.js +9 -1
- package/dist/cjs/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/resolved-result-stack/analytics.js +51 -0
- package/dist/cjs/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/resolved-result-stack/index.js +54 -0
- package/dist/cjs/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/resolved-result-stack/types.js +5 -0
- package/dist/cjs/view/FlexibleCard/components/blocks/related-urls-block/types.js +5 -0
- package/dist/cjs/view/LinkUrl/index.js +1 -1
- package/dist/es2019/ssr.js +1 -1
- package/dist/es2019/utils/analytics/analytics.js +1 -1
- package/dist/es2019/view/CardWithUrl/component-lazy/LazyFallback.js +1 -18
- package/dist/es2019/view/CardWithUrl/component-lazy/LazyIntersectionObserverCard.js +1 -1
- package/dist/es2019/view/CardWithUrl/component-lazy/LazyLazilyRenderCard.js +1 -1
- package/dist/es2019/view/CardWithUrl/component-lazy/LoadingCardLink.js +18 -0
- package/dist/es2019/view/CardWithUrl/loader.js +1 -1
- package/dist/es2019/view/FlexibleCard/components/blocks/related-urls-block/analytics.js +19 -0
- package/dist/es2019/view/FlexibleCard/components/blocks/related-urls-block/index.js +14 -1
- package/dist/es2019/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/index.js +12 -15
- package/dist/es2019/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/related-url-item/index.js +11 -2
- package/dist/es2019/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/resolved-result-stack/analytics.js +42 -0
- package/dist/es2019/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/resolved-result-stack/index.js +44 -0
- package/dist/es2019/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/resolved-result-stack/types.js +1 -0
- package/dist/es2019/view/FlexibleCard/components/blocks/related-urls-block/types.js +1 -0
- package/dist/es2019/view/LinkUrl/index.js +1 -1
- package/dist/esm/ssr.js +1 -1
- package/dist/esm/utils/analytics/analytics.js +1 -1
- package/dist/esm/view/CardWithUrl/component-lazy/LazyFallback.js +1 -17
- package/dist/esm/view/CardWithUrl/component-lazy/LazyIntersectionObserverCard.js +1 -1
- package/dist/esm/view/CardWithUrl/component-lazy/LazyLazilyRenderCard.js +1 -1
- package/dist/esm/view/CardWithUrl/component-lazy/LoadingCardLink.js +17 -0
- package/dist/esm/view/CardWithUrl/loader.js +1 -1
- package/dist/esm/view/FlexibleCard/components/blocks/related-urls-block/analytics.js +23 -0
- package/dist/esm/view/FlexibleCard/components/blocks/related-urls-block/index.js +19 -8
- package/dist/esm/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/index.js +12 -17
- package/dist/esm/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/related-url-item/index.js +10 -2
- package/dist/esm/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/resolved-result-stack/analytics.js +44 -0
- package/dist/esm/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/resolved-result-stack/index.js +44 -0
- package/dist/esm/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/resolved-result-stack/types.js +1 -0
- package/dist/esm/view/FlexibleCard/components/blocks/related-urls-block/types.js +1 -0
- package/dist/esm/view/LinkUrl/index.js +1 -1
- package/dist/types/utils/types.d.ts +2 -2
- package/dist/types/view/CardWithUrl/component-lazy/LazyFallback.d.ts +0 -3
- package/dist/types/view/CardWithUrl/component-lazy/LoadingCardLink.d.ts +3 -0
- package/dist/types/view/FlexibleCard/components/blocks/related-urls-block/analytics.d.ts +3 -0
- package/dist/types/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/resolved-result-stack/analytics.d.ts +11 -0
- package/dist/types/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/resolved-result-stack/index.d.ts +4 -0
- package/dist/types/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/resolved-result-stack/types.d.ts +10 -0
- package/dist/types/view/FlexibleCard/components/blocks/related-urls-block/types.d.ts +3 -0
- package/dist/types-ts4.5/utils/types.d.ts +2 -2
- package/dist/types-ts4.5/view/CardWithUrl/component-lazy/LazyFallback.d.ts +0 -3
- package/dist/types-ts4.5/view/CardWithUrl/component-lazy/LoadingCardLink.d.ts +3 -0
- package/dist/types-ts4.5/view/FlexibleCard/components/blocks/related-urls-block/analytics.d.ts +3 -0
- package/dist/types-ts4.5/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/resolved-result-stack/analytics.d.ts +11 -0
- package/dist/types-ts4.5/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/resolved-result-stack/index.d.ts +4 -0
- package/dist/types-ts4.5/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/resolved-result-stack/types.d.ts +10 -0
- package/dist/types-ts4.5/view/FlexibleCard/components/blocks/related-urls-block/types.d.ts +3 -0
- package/package.json +3 -3
- package/report.api.md +2 -0
- package/tmp/api-report-tmp.d.ts +2 -2
|
@@ -2,10 +2,12 @@ import _extends from "@babel/runtime/helpers/extends";
|
|
|
2
2
|
import React, { useEffect, useState } from 'react';
|
|
3
3
|
import { di } from 'react-magnetic-di';
|
|
4
4
|
import { css } from '@emotion/react';
|
|
5
|
+
import { useAnalyticsEvents } from '@atlaskit/analytics-next';
|
|
5
6
|
import useRelatedUrls from '../../../../../state/hooks/use-related-urls';
|
|
6
7
|
import { RelatedUrlsBlockErroredView } from './errored';
|
|
7
8
|
import { RelatedUrlsResolvedView } from './resolved';
|
|
8
9
|
import { RelatedUrlsBlockResolvingView } from './resolving';
|
|
10
|
+
import { fireRelatedLinksLoadedEvent } from './analytics';
|
|
9
11
|
/**
|
|
10
12
|
* Represents a block to display related resources of a url
|
|
11
13
|
*/
|
|
@@ -15,6 +17,9 @@ const RelatedUrlsBlock = ({
|
|
|
15
17
|
renderers,
|
|
16
18
|
...blockProps
|
|
17
19
|
}) => {
|
|
20
|
+
const {
|
|
21
|
+
createAnalyticsEvent
|
|
22
|
+
} = useAnalyticsEvents();
|
|
18
23
|
const [loadingRelatedUrls, setLoadingRelatedUrls] = useState(true);
|
|
19
24
|
const [err, setErr] = useState();
|
|
20
25
|
const [relatedUrls, setRelatedUrls] = useState();
|
|
@@ -22,15 +27,23 @@ const RelatedUrlsBlock = ({
|
|
|
22
27
|
useEffect(() => {
|
|
23
28
|
const fetchRelatedUrls = async () => {
|
|
24
29
|
try {
|
|
30
|
+
var _relUrls$resolvedResu, _relUrls$resolvedResu2;
|
|
25
31
|
const relUrls = await getRelatedUrls(url);
|
|
26
32
|
setRelatedUrls(relUrls);
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Fire TrackRelatedLinksLoadedEvent
|
|
36
|
+
*/
|
|
37
|
+
fireRelatedLinksLoadedEvent(createAnalyticsEvent)({
|
|
38
|
+
relatedLinksCount: (_relUrls$resolvedResu = (_relUrls$resolvedResu2 = relUrls.resolvedResults) === null || _relUrls$resolvedResu2 === void 0 ? void 0 : _relUrls$resolvedResu2.length) !== null && _relUrls$resolvedResu !== void 0 ? _relUrls$resolvedResu : 0
|
|
39
|
+
});
|
|
27
40
|
} catch (error) {
|
|
28
41
|
setErr(error);
|
|
29
42
|
}
|
|
30
43
|
setLoadingRelatedUrls(false);
|
|
31
44
|
};
|
|
32
45
|
fetchRelatedUrls();
|
|
33
|
-
}, [getRelatedUrls, url]);
|
|
46
|
+
}, [createAnalyticsEvent, getRelatedUrls, url]);
|
|
34
47
|
if (loadingRelatedUrls) {
|
|
35
48
|
return /*#__PURE__*/React.createElement(RelatedUrlsBlockResolvingView, _extends({
|
|
36
49
|
testId: `${testId}-resolving-view`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, { useCallback,
|
|
1
|
+
import React, { useCallback, useState } from 'react';
|
|
2
2
|
import { useIntl } from 'react-intl-next';
|
|
3
3
|
import ChevronDownIcon from '@atlaskit/icon/glyph/chevron-down';
|
|
4
4
|
import ChevronUpIcon from '@atlaskit/icon/glyph/chevron-up';
|
|
@@ -7,7 +7,7 @@ import { css } from '@emotion/react';
|
|
|
7
7
|
import { messages } from '../../../../../../../messages';
|
|
8
8
|
import { getFormattedMessageAsString } from '../../../../../components/utils';
|
|
9
9
|
import Text from '../../../../elements/text';
|
|
10
|
-
import
|
|
10
|
+
import ResolvedResultsStack from './resolved-result-stack';
|
|
11
11
|
const RelatedUrlList = ({
|
|
12
12
|
resolvedResults,
|
|
13
13
|
title,
|
|
@@ -19,17 +19,6 @@ const RelatedUrlList = ({
|
|
|
19
19
|
const chevronClickHandler = useCallback(() => setIsOpen(!isOpen), [isOpen]);
|
|
20
20
|
const ChevronComponent = isOpen ? ChevronUpIcon : ChevronDownIcon;
|
|
21
21
|
const intl = useIntl();
|
|
22
|
-
const resolvedResultsStack = useMemo(() => {
|
|
23
|
-
return /*#__PURE__*/React.createElement(Stack, {
|
|
24
|
-
space: "space.050",
|
|
25
|
-
testId: `${testId}-items-wrapper`
|
|
26
|
-
}, resolvedResults.map((resolvedResults, idx) => /*#__PURE__*/React.createElement(RelatedUrlItem, {
|
|
27
|
-
testId: `${testId}-item`,
|
|
28
|
-
key: idx,
|
|
29
|
-
results: resolvedResults,
|
|
30
|
-
renderers: renderers
|
|
31
|
-
})));
|
|
32
|
-
}, [renderers, resolvedResults, testId]);
|
|
33
22
|
return resolvedResults.length > 0 ? /*#__PURE__*/React.createElement(Stack, {
|
|
34
23
|
testId: testId,
|
|
35
24
|
xcss: xcss({
|
|
@@ -37,7 +26,11 @@ const RelatedUrlList = ({
|
|
|
37
26
|
})
|
|
38
27
|
}, /*#__PURE__*/React.createElement(Box, {
|
|
39
28
|
onClick: chevronClickHandler,
|
|
40
|
-
testId: `${testId}-expand-title
|
|
29
|
+
testId: `${testId}-expand-title`,
|
|
30
|
+
as: "button",
|
|
31
|
+
backgroundColor: "color.background.neutral.subtle",
|
|
32
|
+
"aria-expanded": !!isOpen,
|
|
33
|
+
padding: "space.0"
|
|
41
34
|
}, /*#__PURE__*/React.createElement(Inline, {
|
|
42
35
|
alignBlock: "center",
|
|
43
36
|
spread: "space-between"
|
|
@@ -51,7 +44,11 @@ const RelatedUrlList = ({
|
|
|
51
44
|
}), /*#__PURE__*/React.createElement(ChevronComponent, {
|
|
52
45
|
label: getFormattedMessageAsString(intl, title),
|
|
53
46
|
size: 'medium'
|
|
54
|
-
}))), isOpen &&
|
|
47
|
+
}))), isOpen && /*#__PURE__*/React.createElement(ResolvedResultsStack, {
|
|
48
|
+
resolvedResults: resolvedResults,
|
|
49
|
+
testId: testId,
|
|
50
|
+
renderers: renderers
|
|
51
|
+
})) : /*#__PURE__*/React.createElement(Text, {
|
|
55
52
|
testId: testId,
|
|
56
53
|
message: {
|
|
57
54
|
descriptor: messages.related_work_items_not_found
|
|
@@ -1,19 +1,27 @@
|
|
|
1
1
|
import _extends from "@babel/runtime/helpers/extends";
|
|
2
|
-
import React, { useMemo } from 'react';
|
|
2
|
+
import React, { useCallback, useMemo } from 'react';
|
|
3
3
|
import { Inline } from '@atlaskit/primitives';
|
|
4
|
+
import { useAnalyticsEvents } from '@atlaskit/analytics-next';
|
|
4
5
|
import { SmartLinkSize } from '../../../../../../../../constants';
|
|
5
6
|
import extractFlexibleUiContext from '../../../../../../../../extractors/flexible';
|
|
6
7
|
import Icon from '../../../../../elements/icon';
|
|
7
8
|
import Link from '../../../../../elements/link';
|
|
9
|
+
import { fireLinkClickedEvent } from '../../../../../../../../utils/analytics/click';
|
|
8
10
|
const RelatedUrlItem = ({
|
|
9
11
|
results,
|
|
10
12
|
renderers,
|
|
11
13
|
testId
|
|
12
14
|
}) => {
|
|
15
|
+
const {
|
|
16
|
+
createAnalyticsEvent
|
|
17
|
+
} = useAnalyticsEvents();
|
|
13
18
|
const flexibleDataContext = useMemo(() => extractFlexibleUiContext({
|
|
14
19
|
response: results,
|
|
15
20
|
renderers
|
|
16
21
|
}), [renderers, results]);
|
|
22
|
+
const onClick = useCallback(event => {
|
|
23
|
+
fireLinkClickedEvent(createAnalyticsEvent)(event);
|
|
24
|
+
}, [createAnalyticsEvent]);
|
|
17
25
|
return /*#__PURE__*/React.createElement(Inline, {
|
|
18
26
|
alignBlock: "center",
|
|
19
27
|
space: "space.050",
|
|
@@ -26,7 +34,8 @@ const RelatedUrlItem = ({
|
|
|
26
34
|
text: flexibleDataContext === null || flexibleDataContext === void 0 ? void 0 : flexibleDataContext.title,
|
|
27
35
|
url: flexibleDataContext === null || flexibleDataContext === void 0 ? void 0 : flexibleDataContext.url,
|
|
28
36
|
size: SmartLinkSize.Small,
|
|
29
|
-
maxLines: 1
|
|
37
|
+
maxLines: 1,
|
|
38
|
+
onClick: onClick
|
|
30
39
|
}));
|
|
31
40
|
};
|
|
32
41
|
export default RelatedUrlItem;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { AnalyticsContext } from '@atlaskit/analytics-next';
|
|
3
|
+
import { getResolvedAttributes } from '@atlaskit/link-analytics/resolved-attributes';
|
|
4
|
+
import { ANALYTICS_CHANNEL } from '../../../../../../../../utils/analytics';
|
|
5
|
+
const createUiRelatedLinksViewedEventPayload = ({
|
|
6
|
+
relatedLinksCount
|
|
7
|
+
}) => ({
|
|
8
|
+
action: 'viewed',
|
|
9
|
+
actionSubject: 'relatedLinks',
|
|
10
|
+
eventType: 'ui',
|
|
11
|
+
attributes: {
|
|
12
|
+
relatedLinksCount
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
export const fireRelatedLinksViewedEvent = createAnalyticsEvent => attributes => {
|
|
16
|
+
const payload = createUiRelatedLinksViewedEventPayload(attributes);
|
|
17
|
+
if (payload) {
|
|
18
|
+
createAnalyticsEvent({
|
|
19
|
+
...payload
|
|
20
|
+
}).fire(ANALYTICS_CHANNEL);
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
export const RelatedUrlItemAnalyticsContext = props => {
|
|
24
|
+
const {
|
|
25
|
+
children,
|
|
26
|
+
details
|
|
27
|
+
} = props;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* We don't really need the `url` to get the attributes here so set
|
|
31
|
+
* it to an empty string to just make typescript happy
|
|
32
|
+
*/
|
|
33
|
+
const attributes = getResolvedAttributes({
|
|
34
|
+
url: ''
|
|
35
|
+
}, details);
|
|
36
|
+
return /*#__PURE__*/React.createElement(AnalyticsContext, {
|
|
37
|
+
data: {
|
|
38
|
+
attributes,
|
|
39
|
+
component: 'relatedLink'
|
|
40
|
+
}
|
|
41
|
+
}, children);
|
|
42
|
+
};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import React, { useEffect } from 'react';
|
|
2
|
+
import { Stack, xcss } from '@atlaskit/primitives';
|
|
3
|
+
import { AnalyticsContext, useAnalyticsEvents } from '@atlaskit/analytics-next';
|
|
4
|
+
import RelatedUrlItem from '../related-url-item';
|
|
5
|
+
import { RelatedUrlItemAnalyticsContext, fireRelatedLinksViewedEvent } from './analytics';
|
|
6
|
+
const ResolvedResultsStack = ({
|
|
7
|
+
resolvedResults,
|
|
8
|
+
testId,
|
|
9
|
+
renderers
|
|
10
|
+
}) => {
|
|
11
|
+
const {
|
|
12
|
+
createAnalyticsEvent
|
|
13
|
+
} = useAnalyticsEvents();
|
|
14
|
+
useEffect(() => {
|
|
15
|
+
// This event will fire each time the component is loaded
|
|
16
|
+
fireRelatedLinksViewedEvent(createAnalyticsEvent)({
|
|
17
|
+
relatedLinksCount: resolvedResults.length
|
|
18
|
+
});
|
|
19
|
+
}, [resolvedResults.length, createAnalyticsEvent]);
|
|
20
|
+
return /*#__PURE__*/React.createElement(Stack, {
|
|
21
|
+
space: "space.050",
|
|
22
|
+
testId: `${testId}-items-wrapper`,
|
|
23
|
+
as: "ul",
|
|
24
|
+
xcss: xcss({
|
|
25
|
+
paddingLeft: '0px',
|
|
26
|
+
marginTop: '0px'
|
|
27
|
+
})
|
|
28
|
+
}, resolvedResults.map((resolvedResults, idx) => /*#__PURE__*/React.createElement(RelatedUrlItemAnalyticsContext, {
|
|
29
|
+
details: resolvedResults,
|
|
30
|
+
key: idx
|
|
31
|
+
}, /*#__PURE__*/React.createElement(RelatedUrlItem, {
|
|
32
|
+
testId: `${testId}-item`,
|
|
33
|
+
results: resolvedResults,
|
|
34
|
+
renderers: renderers
|
|
35
|
+
}))));
|
|
36
|
+
};
|
|
37
|
+
const ResolvedResultsStackWithAnalytics = props => {
|
|
38
|
+
return /*#__PURE__*/React.createElement(AnalyticsContext, {
|
|
39
|
+
data: {
|
|
40
|
+
component: 'relatedLinksSection'
|
|
41
|
+
}
|
|
42
|
+
}, /*#__PURE__*/React.createElement(ResolvedResultsStack, props));
|
|
43
|
+
};
|
|
44
|
+
export default ResolvedResultsStackWithAnalytics;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -8,7 +8,7 @@ import LinkWarningModal from './LinkWarningModal';
|
|
|
8
8
|
import { getBooleanFF } from '@atlaskit/platform-feature-flags';
|
|
9
9
|
const PACKAGE_DATA = {
|
|
10
10
|
packageName: "@atlaskit/smart-card",
|
|
11
|
-
packageVersion: "26.
|
|
11
|
+
packageVersion: "26.42.0",
|
|
12
12
|
componentName: 'linkUrl'
|
|
13
13
|
};
|
|
14
14
|
const Link = withLinkClickedEvent('a');
|
package/dist/esm/ssr.js
CHANGED
|
@@ -8,7 +8,7 @@ import uuid from 'uuid';
|
|
|
8
8
|
import { ErrorBoundary } from 'react-error-boundary';
|
|
9
9
|
import { AnalyticsContext } from '@atlaskit/analytics-next';
|
|
10
10
|
import { CardWithUrlContent } from './view/CardWithUrl/component';
|
|
11
|
-
import { LoadingCardLink } from './view/CardWithUrl/component-lazy/
|
|
11
|
+
import { LoadingCardLink } from './view/CardWithUrl/component-lazy/LoadingCardLink';
|
|
12
12
|
import { context } from './utils/analytics/analytics';
|
|
13
13
|
// SSR friendly version of smart-card
|
|
14
14
|
// simplifies the logic around rendering and loading placeholders and
|
|
@@ -15,7 +15,7 @@ export var ANALYTICS_CHANNEL = 'media';
|
|
|
15
15
|
export var context = {
|
|
16
16
|
componentName: 'smart-cards',
|
|
17
17
|
packageName: "@atlaskit/smart-card",
|
|
18
|
-
packageVersion: "26.
|
|
18
|
+
packageVersion: "26.42.0"
|
|
19
19
|
};
|
|
20
20
|
export var TrackQuickActionType = /*#__PURE__*/function (TrackQuickActionType) {
|
|
21
21
|
TrackQuickActionType["StatusUpdate"] = "StatusUpdate";
|
|
@@ -1,17 +1 @@
|
|
|
1
|
-
|
|
2
|
-
import { CardLinkView } from '../../../view/LinkView';
|
|
3
|
-
export var loadingPlaceholderClassName = 'smart-link-loading-placeholder';
|
|
4
|
-
export var LoadingCardLink = function LoadingCardLink(_ref) {
|
|
5
|
-
var isSelected = _ref.isSelected,
|
|
6
|
-
url = _ref.url,
|
|
7
|
-
placeholder = _ref.placeholder;
|
|
8
|
-
return /*#__PURE__*/React.createElement(CardLinkView, {
|
|
9
|
-
key: 'lazy-render-key',
|
|
10
|
-
testId: 'lazy-render-placeholder',
|
|
11
|
-
"data-trello-do-not-use-override": "lazy-render-placeholder-trello",
|
|
12
|
-
isSelected: isSelected,
|
|
13
|
-
link: url,
|
|
14
|
-
className: loadingPlaceholderClassName,
|
|
15
|
-
placeholder: placeholder
|
|
16
|
-
});
|
|
17
|
-
};
|
|
1
|
+
export var loadingPlaceholderClassName = 'smart-link-loading-placeholder';
|
|
@@ -3,7 +3,7 @@ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
|
3
3
|
import React, { useCallback, useState } from 'react';
|
|
4
4
|
import { usePrefetch } from '../../../state';
|
|
5
5
|
import { CardWithUrlContent } from '../component';
|
|
6
|
-
import { LoadingCardLink } from './
|
|
6
|
+
import { LoadingCardLink } from './LoadingCardLink';
|
|
7
7
|
import { startUfoExperience } from '../../../state/analytics/ufoExperiences';
|
|
8
8
|
|
|
9
9
|
// This property enables the intersection observer to be run once the
|
|
@@ -2,7 +2,7 @@ import _extends from "@babel/runtime/helpers/extends";
|
|
|
2
2
|
import React, { useState } from 'react';
|
|
3
3
|
import LazilyRender from 'react-lazily-render';
|
|
4
4
|
import { CardWithUrlContent } from '../component';
|
|
5
|
-
import { LoadingCardLink } from './
|
|
5
|
+
import { LoadingCardLink } from './LoadingCardLink';
|
|
6
6
|
import { startUfoExperience } from '../../../state/analytics/ufoExperiences';
|
|
7
7
|
export function LazyLazilyRenderCard(props) {
|
|
8
8
|
var appearance = props.appearance,
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { CardLinkView } from '../../../view/LinkView';
|
|
3
|
+
import { loadingPlaceholderClassName } from './LazyFallback';
|
|
4
|
+
export var LoadingCardLink = function LoadingCardLink(_ref) {
|
|
5
|
+
var isSelected = _ref.isSelected,
|
|
6
|
+
url = _ref.url,
|
|
7
|
+
placeholder = _ref.placeholder;
|
|
8
|
+
return /*#__PURE__*/React.createElement(CardLinkView, {
|
|
9
|
+
key: 'lazy-render-key',
|
|
10
|
+
testId: 'lazy-render-placeholder',
|
|
11
|
+
"data-trello-do-not-use-override": "lazy-render-placeholder-trello",
|
|
12
|
+
isSelected: isSelected,
|
|
13
|
+
link: url,
|
|
14
|
+
className: loadingPlaceholderClassName,
|
|
15
|
+
placeholder: placeholder
|
|
16
|
+
});
|
|
17
|
+
};
|
|
@@ -4,7 +4,7 @@ import uuid from 'uuid';
|
|
|
4
4
|
import { clearMarks, clearMeasures } from '../../utils/performance';
|
|
5
5
|
import { ErrorBoundary } from 'react-error-boundary';
|
|
6
6
|
import { useSmartLinkAnalytics } from '../../state/analytics';
|
|
7
|
-
import { LoadingCardLink } from './component-lazy/
|
|
7
|
+
import { LoadingCardLink } from './component-lazy/LoadingCardLink';
|
|
8
8
|
import { importWithRetry } from '../../utils';
|
|
9
9
|
import { isFlexibleUiCard } from '../../utils/flexible';
|
|
10
10
|
var LazyCardWithUrlContent = /*#__PURE__*/lazy(function () {
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
3
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
4
|
+
import { ANALYTICS_CHANNEL } from '../../../../../utils/analytics';
|
|
5
|
+
var createTrackRelatedLinksLoadedEventPayload = function createTrackRelatedLinksLoadedEventPayload(_ref) {
|
|
6
|
+
var relatedLinksCount = _ref.relatedLinksCount;
|
|
7
|
+
return {
|
|
8
|
+
action: 'loaded',
|
|
9
|
+
actionSubject: 'relatedLinks',
|
|
10
|
+
eventType: 'track',
|
|
11
|
+
attributes: {
|
|
12
|
+
relatedLinksCount: relatedLinksCount
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
export var fireRelatedLinksLoadedEvent = function fireRelatedLinksLoadedEvent(createAnalyticsEvent) {
|
|
17
|
+
return function (attributes) {
|
|
18
|
+
var payload = createTrackRelatedLinksLoadedEventPayload(attributes);
|
|
19
|
+
if (payload) {
|
|
20
|
+
createAnalyticsEvent(_objectSpread({}, payload)).fire(ANALYTICS_CHANNEL);
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
};
|
|
@@ -9,10 +9,12 @@ import _regeneratorRuntime from "@babel/runtime/regenerator";
|
|
|
9
9
|
import React, { useEffect, useState } from 'react';
|
|
10
10
|
import { di } from 'react-magnetic-di';
|
|
11
11
|
import { css } from '@emotion/react';
|
|
12
|
+
import { useAnalyticsEvents } from '@atlaskit/analytics-next';
|
|
12
13
|
import useRelatedUrls from '../../../../../state/hooks/use-related-urls';
|
|
13
14
|
import { RelatedUrlsBlockErroredView } from './errored';
|
|
14
15
|
import { RelatedUrlsResolvedView } from './resolved';
|
|
15
16
|
import { RelatedUrlsBlockResolvingView } from './resolving';
|
|
17
|
+
import { fireRelatedLinksLoadedEvent } from './analytics';
|
|
16
18
|
/**
|
|
17
19
|
* Represents a block to display related resources of a url
|
|
18
20
|
*/
|
|
@@ -22,6 +24,8 @@ var RelatedUrlsBlock = function RelatedUrlsBlock(_ref) {
|
|
|
22
24
|
url = _ref.url,
|
|
23
25
|
renderers = _ref.renderers,
|
|
24
26
|
blockProps = _objectWithoutProperties(_ref, _excluded);
|
|
27
|
+
var _useAnalyticsEvents = useAnalyticsEvents(),
|
|
28
|
+
createAnalyticsEvent = _useAnalyticsEvents.createAnalyticsEvent;
|
|
25
29
|
var _useState = useState(true),
|
|
26
30
|
_useState2 = _slicedToArray(_useState, 2),
|
|
27
31
|
loadingRelatedUrls = _useState2[0],
|
|
@@ -38,7 +42,7 @@ var RelatedUrlsBlock = function RelatedUrlsBlock(_ref) {
|
|
|
38
42
|
useEffect(function () {
|
|
39
43
|
var fetchRelatedUrls = /*#__PURE__*/function () {
|
|
40
44
|
var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
|
|
41
|
-
var relUrls;
|
|
45
|
+
var _relUrls$resolvedResu, _relUrls$resolvedResu2, relUrls;
|
|
42
46
|
return _regeneratorRuntime.wrap(function _callee$(_context) {
|
|
43
47
|
while (1) switch (_context.prev = _context.next) {
|
|
44
48
|
case 0:
|
|
@@ -48,26 +52,33 @@ var RelatedUrlsBlock = function RelatedUrlsBlock(_ref) {
|
|
|
48
52
|
case 3:
|
|
49
53
|
relUrls = _context.sent;
|
|
50
54
|
setRelatedUrls(relUrls);
|
|
51
|
-
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Fire TrackRelatedLinksLoadedEvent
|
|
58
|
+
*/
|
|
59
|
+
fireRelatedLinksLoadedEvent(createAnalyticsEvent)({
|
|
60
|
+
relatedLinksCount: (_relUrls$resolvedResu = (_relUrls$resolvedResu2 = relUrls.resolvedResults) === null || _relUrls$resolvedResu2 === void 0 ? void 0 : _relUrls$resolvedResu2.length) !== null && _relUrls$resolvedResu !== void 0 ? _relUrls$resolvedResu : 0
|
|
61
|
+
});
|
|
62
|
+
_context.next = 11;
|
|
52
63
|
break;
|
|
53
|
-
case
|
|
54
|
-
_context.prev =
|
|
64
|
+
case 8:
|
|
65
|
+
_context.prev = 8;
|
|
55
66
|
_context.t0 = _context["catch"](0);
|
|
56
67
|
setErr(_context.t0);
|
|
57
|
-
case 10:
|
|
58
|
-
setLoadingRelatedUrls(false);
|
|
59
68
|
case 11:
|
|
69
|
+
setLoadingRelatedUrls(false);
|
|
70
|
+
case 12:
|
|
60
71
|
case "end":
|
|
61
72
|
return _context.stop();
|
|
62
73
|
}
|
|
63
|
-
}, _callee, null, [[0,
|
|
74
|
+
}, _callee, null, [[0, 8]]);
|
|
64
75
|
}));
|
|
65
76
|
return function fetchRelatedUrls() {
|
|
66
77
|
return _ref2.apply(this, arguments);
|
|
67
78
|
};
|
|
68
79
|
}();
|
|
69
80
|
fetchRelatedUrls();
|
|
70
|
-
}, [getRelatedUrls, url]);
|
|
81
|
+
}, [createAnalyticsEvent, getRelatedUrls, url]);
|
|
71
82
|
if (loadingRelatedUrls) {
|
|
72
83
|
return /*#__PURE__*/React.createElement(RelatedUrlsBlockResolvingView, _extends({
|
|
73
84
|
testId: "".concat(testId, "-resolving-view")
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import _taggedTemplateLiteral from "@babel/runtime/helpers/taggedTemplateLiteral";
|
|
2
2
|
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
3
3
|
var _templateObject;
|
|
4
|
-
import React, { useCallback,
|
|
4
|
+
import React, { useCallback, useState } from 'react';
|
|
5
5
|
import { useIntl } from 'react-intl-next';
|
|
6
6
|
import ChevronDownIcon from '@atlaskit/icon/glyph/chevron-down';
|
|
7
7
|
import ChevronUpIcon from '@atlaskit/icon/glyph/chevron-up';
|
|
@@ -10,7 +10,7 @@ import { css } from '@emotion/react';
|
|
|
10
10
|
import { messages } from '../../../../../../../messages';
|
|
11
11
|
import { getFormattedMessageAsString } from '../../../../../components/utils';
|
|
12
12
|
import Text from '../../../../elements/text';
|
|
13
|
-
import
|
|
13
|
+
import ResolvedResultsStack from './resolved-result-stack';
|
|
14
14
|
var RelatedUrlList = function RelatedUrlList(_ref) {
|
|
15
15
|
var resolvedResults = _ref.resolvedResults,
|
|
16
16
|
title = _ref.title,
|
|
@@ -26,19 +26,6 @@ var RelatedUrlList = function RelatedUrlList(_ref) {
|
|
|
26
26
|
}, [isOpen]);
|
|
27
27
|
var ChevronComponent = isOpen ? ChevronUpIcon : ChevronDownIcon;
|
|
28
28
|
var intl = useIntl();
|
|
29
|
-
var resolvedResultsStack = useMemo(function () {
|
|
30
|
-
return /*#__PURE__*/React.createElement(Stack, {
|
|
31
|
-
space: "space.050",
|
|
32
|
-
testId: "".concat(testId, "-items-wrapper")
|
|
33
|
-
}, resolvedResults.map(function (resolvedResults, idx) {
|
|
34
|
-
return /*#__PURE__*/React.createElement(RelatedUrlItem, {
|
|
35
|
-
testId: "".concat(testId, "-item"),
|
|
36
|
-
key: idx,
|
|
37
|
-
results: resolvedResults,
|
|
38
|
-
renderers: renderers
|
|
39
|
-
});
|
|
40
|
-
}));
|
|
41
|
-
}, [renderers, resolvedResults, testId]);
|
|
42
29
|
return resolvedResults.length > 0 ? /*#__PURE__*/React.createElement(Stack, {
|
|
43
30
|
testId: testId,
|
|
44
31
|
xcss: xcss({
|
|
@@ -46,7 +33,11 @@ var RelatedUrlList = function RelatedUrlList(_ref) {
|
|
|
46
33
|
})
|
|
47
34
|
}, /*#__PURE__*/React.createElement(Box, {
|
|
48
35
|
onClick: chevronClickHandler,
|
|
49
|
-
testId: "".concat(testId, "-expand-title")
|
|
36
|
+
testId: "".concat(testId, "-expand-title"),
|
|
37
|
+
as: "button",
|
|
38
|
+
backgroundColor: "color.background.neutral.subtle",
|
|
39
|
+
"aria-expanded": !!isOpen,
|
|
40
|
+
padding: "space.0"
|
|
50
41
|
}, /*#__PURE__*/React.createElement(Inline, {
|
|
51
42
|
alignBlock: "center",
|
|
52
43
|
spread: "space-between"
|
|
@@ -58,7 +49,11 @@ var RelatedUrlList = function RelatedUrlList(_ref) {
|
|
|
58
49
|
}), /*#__PURE__*/React.createElement(ChevronComponent, {
|
|
59
50
|
label: getFormattedMessageAsString(intl, title),
|
|
60
51
|
size: 'medium'
|
|
61
|
-
}))), isOpen &&
|
|
52
|
+
}))), isOpen && /*#__PURE__*/React.createElement(ResolvedResultsStack, {
|
|
53
|
+
resolvedResults: resolvedResults,
|
|
54
|
+
testId: testId,
|
|
55
|
+
renderers: renderers
|
|
56
|
+
})) : /*#__PURE__*/React.createElement(Text, {
|
|
62
57
|
testId: testId,
|
|
63
58
|
message: {
|
|
64
59
|
descriptor: messages.related_work_items_not_found
|
|
@@ -1,20 +1,27 @@
|
|
|
1
1
|
import _extends from "@babel/runtime/helpers/extends";
|
|
2
|
-
import React, { useMemo } from 'react';
|
|
2
|
+
import React, { useCallback, useMemo } from 'react';
|
|
3
3
|
import { Inline } from '@atlaskit/primitives';
|
|
4
|
+
import { useAnalyticsEvents } from '@atlaskit/analytics-next';
|
|
4
5
|
import { SmartLinkSize } from '../../../../../../../../constants';
|
|
5
6
|
import extractFlexibleUiContext from '../../../../../../../../extractors/flexible';
|
|
6
7
|
import Icon from '../../../../../elements/icon';
|
|
7
8
|
import Link from '../../../../../elements/link';
|
|
9
|
+
import { fireLinkClickedEvent } from '../../../../../../../../utils/analytics/click';
|
|
8
10
|
var RelatedUrlItem = function RelatedUrlItem(_ref) {
|
|
9
11
|
var results = _ref.results,
|
|
10
12
|
renderers = _ref.renderers,
|
|
11
13
|
testId = _ref.testId;
|
|
14
|
+
var _useAnalyticsEvents = useAnalyticsEvents(),
|
|
15
|
+
createAnalyticsEvent = _useAnalyticsEvents.createAnalyticsEvent;
|
|
12
16
|
var flexibleDataContext = useMemo(function () {
|
|
13
17
|
return extractFlexibleUiContext({
|
|
14
18
|
response: results,
|
|
15
19
|
renderers: renderers
|
|
16
20
|
});
|
|
17
21
|
}, [renderers, results]);
|
|
22
|
+
var onClick = useCallback(function (event) {
|
|
23
|
+
fireLinkClickedEvent(createAnalyticsEvent)(event);
|
|
24
|
+
}, [createAnalyticsEvent]);
|
|
18
25
|
return /*#__PURE__*/React.createElement(Inline, {
|
|
19
26
|
alignBlock: "center",
|
|
20
27
|
space: "space.050",
|
|
@@ -27,7 +34,8 @@ var RelatedUrlItem = function RelatedUrlItem(_ref) {
|
|
|
27
34
|
text: flexibleDataContext === null || flexibleDataContext === void 0 ? void 0 : flexibleDataContext.title,
|
|
28
35
|
url: flexibleDataContext === null || flexibleDataContext === void 0 ? void 0 : flexibleDataContext.url,
|
|
29
36
|
size: SmartLinkSize.Small,
|
|
30
|
-
maxLines: 1
|
|
37
|
+
maxLines: 1,
|
|
38
|
+
onClick: onClick
|
|
31
39
|
}));
|
|
32
40
|
};
|
|
33
41
|
export default RelatedUrlItem;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
3
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
4
|
+
import React from 'react';
|
|
5
|
+
import { AnalyticsContext } from '@atlaskit/analytics-next';
|
|
6
|
+
import { getResolvedAttributes } from '@atlaskit/link-analytics/resolved-attributes';
|
|
7
|
+
import { ANALYTICS_CHANNEL } from '../../../../../../../../utils/analytics';
|
|
8
|
+
var createUiRelatedLinksViewedEventPayload = function createUiRelatedLinksViewedEventPayload(_ref) {
|
|
9
|
+
var relatedLinksCount = _ref.relatedLinksCount;
|
|
10
|
+
return {
|
|
11
|
+
action: 'viewed',
|
|
12
|
+
actionSubject: 'relatedLinks',
|
|
13
|
+
eventType: 'ui',
|
|
14
|
+
attributes: {
|
|
15
|
+
relatedLinksCount: relatedLinksCount
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
export var fireRelatedLinksViewedEvent = function fireRelatedLinksViewedEvent(createAnalyticsEvent) {
|
|
20
|
+
return function (attributes) {
|
|
21
|
+
var payload = createUiRelatedLinksViewedEventPayload(attributes);
|
|
22
|
+
if (payload) {
|
|
23
|
+
createAnalyticsEvent(_objectSpread({}, payload)).fire(ANALYTICS_CHANNEL);
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
export var RelatedUrlItemAnalyticsContext = function RelatedUrlItemAnalyticsContext(props) {
|
|
28
|
+
var children = props.children,
|
|
29
|
+
details = props.details;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* We don't really need the `url` to get the attributes here so set
|
|
33
|
+
* it to an empty string to just make typescript happy
|
|
34
|
+
*/
|
|
35
|
+
var attributes = getResolvedAttributes({
|
|
36
|
+
url: ''
|
|
37
|
+
}, details);
|
|
38
|
+
return /*#__PURE__*/React.createElement(AnalyticsContext, {
|
|
39
|
+
data: {
|
|
40
|
+
attributes: attributes,
|
|
41
|
+
component: 'relatedLink'
|
|
42
|
+
}
|
|
43
|
+
}, children);
|
|
44
|
+
};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import React, { useEffect } from 'react';
|
|
2
|
+
import { Stack, xcss } from '@atlaskit/primitives';
|
|
3
|
+
import { AnalyticsContext, useAnalyticsEvents } from '@atlaskit/analytics-next';
|
|
4
|
+
import RelatedUrlItem from '../related-url-item';
|
|
5
|
+
import { RelatedUrlItemAnalyticsContext, fireRelatedLinksViewedEvent } from './analytics';
|
|
6
|
+
var ResolvedResultsStack = function ResolvedResultsStack(_ref) {
|
|
7
|
+
var resolvedResults = _ref.resolvedResults,
|
|
8
|
+
testId = _ref.testId,
|
|
9
|
+
renderers = _ref.renderers;
|
|
10
|
+
var _useAnalyticsEvents = useAnalyticsEvents(),
|
|
11
|
+
createAnalyticsEvent = _useAnalyticsEvents.createAnalyticsEvent;
|
|
12
|
+
useEffect(function () {
|
|
13
|
+
// This event will fire each time the component is loaded
|
|
14
|
+
fireRelatedLinksViewedEvent(createAnalyticsEvent)({
|
|
15
|
+
relatedLinksCount: resolvedResults.length
|
|
16
|
+
});
|
|
17
|
+
}, [resolvedResults.length, createAnalyticsEvent]);
|
|
18
|
+
return /*#__PURE__*/React.createElement(Stack, {
|
|
19
|
+
space: "space.050",
|
|
20
|
+
testId: "".concat(testId, "-items-wrapper"),
|
|
21
|
+
as: "ul",
|
|
22
|
+
xcss: xcss({
|
|
23
|
+
paddingLeft: '0px',
|
|
24
|
+
marginTop: '0px'
|
|
25
|
+
})
|
|
26
|
+
}, resolvedResults.map(function (resolvedResults, idx) {
|
|
27
|
+
return /*#__PURE__*/React.createElement(RelatedUrlItemAnalyticsContext, {
|
|
28
|
+
details: resolvedResults,
|
|
29
|
+
key: idx
|
|
30
|
+
}, /*#__PURE__*/React.createElement(RelatedUrlItem, {
|
|
31
|
+
testId: "".concat(testId, "-item"),
|
|
32
|
+
results: resolvedResults,
|
|
33
|
+
renderers: renderers
|
|
34
|
+
}));
|
|
35
|
+
}));
|
|
36
|
+
};
|
|
37
|
+
var ResolvedResultsStackWithAnalytics = function ResolvedResultsStackWithAnalytics(props) {
|
|
38
|
+
return /*#__PURE__*/React.createElement(AnalyticsContext, {
|
|
39
|
+
data: {
|
|
40
|
+
component: 'relatedLinksSection'
|
|
41
|
+
}
|
|
42
|
+
}, /*#__PURE__*/React.createElement(ResolvedResultsStack, props));
|
|
43
|
+
};
|
|
44
|
+
export default ResolvedResultsStackWithAnalytics;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -11,7 +11,7 @@ import LinkWarningModal from './LinkWarningModal';
|
|
|
11
11
|
import { getBooleanFF } from '@atlaskit/platform-feature-flags';
|
|
12
12
|
var PACKAGE_DATA = {
|
|
13
13
|
packageName: "@atlaskit/smart-card",
|
|
14
|
-
packageVersion: "26.
|
|
14
|
+
packageVersion: "26.42.0",
|
|
15
15
|
componentName: 'linkUrl'
|
|
16
16
|
};
|
|
17
17
|
var Link = withLinkClickedEvent('a');
|