@atlaskit/link-datasource 1.2.0 → 1.2.2
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 +14 -0
- package/dist/cjs/analytics/constants.js +1 -1
- package/dist/cjs/analytics/ufoExperiences/index.js +51 -0
- package/dist/cjs/analytics/ufoExperiences/types.js +5 -0
- package/dist/cjs/analytics/ufoExperiences/useDataRenderedUfoExperience.js +52 -0
- package/dist/cjs/hooks/useDatasourceTableState.js +28 -33
- package/dist/cjs/ui/assets-modal/modal/index.js +1 -1
- package/dist/cjs/ui/datasource-table-view/datasourceTableView.js +21 -1
- package/dist/cjs/ui/issue-like-table/index.js +10 -1
- package/dist/cjs/ui/jira-issues-modal/modal/index.js +73 -32
- package/dist/es2019/analytics/constants.js +1 -1
- package/dist/es2019/analytics/ufoExperiences/index.js +45 -0
- package/dist/es2019/analytics/ufoExperiences/types.js +1 -0
- package/dist/es2019/analytics/ufoExperiences/useDataRenderedUfoExperience.js +46 -0
- package/dist/es2019/hooks/useDatasourceTableState.js +2 -6
- package/dist/es2019/ui/assets-modal/modal/index.js +1 -1
- package/dist/es2019/ui/datasource-table-view/datasourceTableView.js +22 -1
- package/dist/es2019/ui/issue-like-table/index.js +10 -1
- package/dist/es2019/ui/jira-issues-modal/modal/index.js +73 -28
- package/dist/esm/analytics/constants.js +1 -1
- package/dist/esm/analytics/ufoExperiences/index.js +41 -0
- package/dist/esm/analytics/ufoExperiences/types.js +1 -0
- package/dist/esm/analytics/ufoExperiences/useDataRenderedUfoExperience.js +45 -0
- package/dist/esm/hooks/useDatasourceTableState.js +28 -33
- package/dist/esm/ui/assets-modal/modal/index.js +1 -1
- package/dist/esm/ui/datasource-table-view/datasourceTableView.js +21 -1
- package/dist/esm/ui/issue-like-table/index.js +10 -1
- package/dist/esm/ui/jira-issues-modal/modal/index.js +73 -32
- package/dist/types/analytics/generated/analytics.types.d.ts +5 -4
- package/dist/types/analytics/ufoExperiences/index.d.ts +5 -0
- package/dist/types/analytics/ufoExperiences/types.d.ts +8 -0
- package/dist/types/analytics/ufoExperiences/useDataRenderedUfoExperience.d.ts +22 -0
- package/dist/types/ui/issue-like-table/index.d.ts +1 -1
- package/dist/types/ui/issue-like-table/types.d.ts +4 -0
- package/dist/types-ts4.5/analytics/generated/analytics.types.d.ts +5 -4
- package/dist/types-ts4.5/analytics/ufoExperiences/index.d.ts +5 -0
- package/dist/types-ts4.5/analytics/ufoExperiences/types.d.ts +8 -0
- package/dist/types-ts4.5/analytics/ufoExperiences/useDataRenderedUfoExperience.d.ts +22 -0
- package/dist/types-ts4.5/ui/issue-like-table/index.d.ts +1 -1
- package/dist/types-ts4.5/ui/issue-like-table/types.d.ts +4 -0
- package/package.json +8 -7
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { useEffect } from 'react';
|
|
2
|
+
import { addMetadataToExperience, failUfoExperience, succeedUfoExperience } from './index';
|
|
3
|
+
/**
|
|
4
|
+
* Hook to mark DataRendered UFO experience as either Success or Failure
|
|
5
|
+
* 1. Success when
|
|
6
|
+
* * its rendered as a link
|
|
7
|
+
* * it returns empty results
|
|
8
|
+
* * the request is unauthorized
|
|
9
|
+
* 2. Fail when
|
|
10
|
+
* * request is rejected
|
|
11
|
+
*
|
|
12
|
+
* Note:
|
|
13
|
+
* * When the request is resolved as a datasource table, it will be marked success in the table component, every other success case is marked by this hook
|
|
14
|
+
*/
|
|
15
|
+
export const useDataRenderedUfoExperience = ({
|
|
16
|
+
status,
|
|
17
|
+
experienceId,
|
|
18
|
+
itemCount,
|
|
19
|
+
canBeLink,
|
|
20
|
+
extensionKey
|
|
21
|
+
}) => {
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
const isEmptyResult = status === 'resolved' && itemCount === 0;
|
|
24
|
+
const isLink = status === 'resolved' && (itemCount === 1 || canBeLink); // this will take care of count-mode/single-item smart-link rendering
|
|
25
|
+
const isUnauthorized = status === 'unauthorized';
|
|
26
|
+
const shouldSucceedUfoExperience = isEmptyResult || isLink || isUnauthorized;
|
|
27
|
+
const shouldFailUfoExperience = status === 'rejected';
|
|
28
|
+
if (extensionKey) {
|
|
29
|
+
addMetadataToExperience({
|
|
30
|
+
name: 'datasource-rendered',
|
|
31
|
+
metadata: {
|
|
32
|
+
extensionKey
|
|
33
|
+
}
|
|
34
|
+
}, experienceId);
|
|
35
|
+
}
|
|
36
|
+
if (shouldFailUfoExperience) {
|
|
37
|
+
failUfoExperience({
|
|
38
|
+
name: 'datasource-rendered'
|
|
39
|
+
}, experienceId);
|
|
40
|
+
} else if (shouldSucceedUfoExperience) {
|
|
41
|
+
succeedUfoExperience({
|
|
42
|
+
name: 'datasource-rendered'
|
|
43
|
+
}, experienceId);
|
|
44
|
+
}
|
|
45
|
+
}, [canBeLink, experienceId, extensionKey, itemCount, status]);
|
|
46
|
+
};
|
|
@@ -31,9 +31,7 @@ export const useDatasourceTableState = ({
|
|
|
31
31
|
try {
|
|
32
32
|
const {
|
|
33
33
|
meta: {
|
|
34
|
-
access
|
|
35
|
-
destinationObjectTypes,
|
|
36
|
-
extensionKey
|
|
34
|
+
access
|
|
37
35
|
},
|
|
38
36
|
data: {
|
|
39
37
|
schema
|
|
@@ -45,8 +43,6 @@ export const useDatasourceTableState = ({
|
|
|
45
43
|
setStatus('unauthorized');
|
|
46
44
|
return;
|
|
47
45
|
}
|
|
48
|
-
setExtensionKey(extensionKey);
|
|
49
|
-
setDestinationObjectTypes(destinationObjectTypes);
|
|
50
46
|
const isColumnNotPresentInCurrentColumnsList = col => !columns.find(column => column.key === col.key);
|
|
51
47
|
const allColumns = schema.properties;
|
|
52
48
|
const newColumns = allColumns.filter(isColumnNotPresentInCurrentColumnsList);
|
|
@@ -118,7 +114,6 @@ export const useDatasourceTableState = ({
|
|
|
118
114
|
}
|
|
119
115
|
return [...currentResponseItems, ...items];
|
|
120
116
|
});
|
|
121
|
-
setStatus('resolved');
|
|
122
117
|
setHasNextPage(Boolean(nextPageCursor));
|
|
123
118
|
if (fieldKeys.length > 0) {
|
|
124
119
|
setLastRequestedFieldKeys(fieldKeys);
|
|
@@ -136,6 +131,7 @@ export const useDatasourceTableState = ({
|
|
|
136
131
|
loadedItemCount: currentLoadedItemCount + newlyLoadedItemCount
|
|
137
132
|
});
|
|
138
133
|
}
|
|
134
|
+
setStatus('resolved');
|
|
139
135
|
} catch (e) {
|
|
140
136
|
setStatus('rejected');
|
|
141
137
|
}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
/** @jsx jsx */
|
|
2
2
|
import { useCallback, useEffect, useRef } from 'react';
|
|
3
3
|
import { jsx } from '@emotion/react';
|
|
4
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
4
5
|
import { withAnalyticsContext } from '@atlaskit/analytics-next';
|
|
5
6
|
import { useDatasourceAnalyticsEvents } from '../../analytics';
|
|
6
7
|
import { packageMetaData } from '../../analytics/constants';
|
|
8
|
+
import { startUfoExperience } from '../../analytics/ufoExperiences';
|
|
9
|
+
import { useDataRenderedUfoExperience } from '../../analytics/ufoExperiences/useDataRenderedUfoExperience';
|
|
7
10
|
import { useDatasourceTableState } from '../../hooks/useDatasourceTableState';
|
|
8
11
|
import { AccessRequired } from '../common/error-state/access-required';
|
|
9
12
|
import { LoadingError } from '../common/error-state/loading-error';
|
|
@@ -37,6 +40,9 @@ const DatasourceTableViewWithoutAnalytics = ({
|
|
|
37
40
|
const {
|
|
38
41
|
fireEvent
|
|
39
42
|
} = useDatasourceAnalyticsEvents();
|
|
43
|
+
const {
|
|
44
|
+
current: tableRenderInstanceId
|
|
45
|
+
} = useRef(uuidv4());
|
|
40
46
|
|
|
41
47
|
/* Need this to make sure that the datasource in the editor gets updated new info if any edits are made in the modal
|
|
42
48
|
But we don't want to call it on initial load. This screws up useDatasourceTableState's internal
|
|
@@ -54,6 +60,20 @@ const DatasourceTableViewWithoutAnalytics = ({
|
|
|
54
60
|
onVisibleColumnKeysChange(defaultVisibleColumnKeys);
|
|
55
61
|
}
|
|
56
62
|
}, [visibleColumnKeys, defaultVisibleColumnKeys, onVisibleColumnKeysChange]);
|
|
63
|
+
useEffect(() => {
|
|
64
|
+
const shouldStartUfoExperience = datasourceId && parameters && visibleColumnKeys && status === 'loading';
|
|
65
|
+
if (shouldStartUfoExperience) {
|
|
66
|
+
startUfoExperience({
|
|
67
|
+
name: 'datasource-rendered'
|
|
68
|
+
}, tableRenderInstanceId);
|
|
69
|
+
}
|
|
70
|
+
}, [datasourceId, parameters, status, tableRenderInstanceId, visibleColumnKeys]);
|
|
71
|
+
useDataRenderedUfoExperience({
|
|
72
|
+
status,
|
|
73
|
+
experienceId: tableRenderInstanceId,
|
|
74
|
+
itemCount: responseItems.length,
|
|
75
|
+
extensionKey
|
|
76
|
+
});
|
|
57
77
|
const forcedReset = useCallback(() => {
|
|
58
78
|
fireEvent('ui.button.clicked.sync', {
|
|
59
79
|
extensionKey,
|
|
@@ -91,7 +111,8 @@ const DatasourceTableViewWithoutAnalytics = ({
|
|
|
91
111
|
columns: columns,
|
|
92
112
|
visibleColumnKeys: visibleColumnKeys || defaultVisibleColumnKeys,
|
|
93
113
|
onVisibleColumnKeysChange: onVisibleColumnKeysChange,
|
|
94
|
-
scrollableContainerHeight: 590
|
|
114
|
+
scrollableContainerHeight: 590,
|
|
115
|
+
parentContainerRenderInstanceId: tableRenderInstanceId
|
|
95
116
|
}) : jsx(EmptyState, {
|
|
96
117
|
testId: "datasource-table-view-skeleton",
|
|
97
118
|
isCompact: true,
|
|
@@ -12,6 +12,7 @@ import { monitorForElements } from '@atlaskit/pragmatic-drag-and-drop/adapter/el
|
|
|
12
12
|
import { combine } from '@atlaskit/pragmatic-drag-and-drop/util/combine';
|
|
13
13
|
import { N40 } from '@atlaskit/theme/colors';
|
|
14
14
|
import Tooltip from '@atlaskit/tooltip';
|
|
15
|
+
import { succeedUfoExperience } from '../../analytics/ufoExperiences';
|
|
15
16
|
import { ColumnPicker } from './column-picker';
|
|
16
17
|
import { DragColumnPreview } from './drag-column-preview';
|
|
17
18
|
import { DraggableTableHeading } from './draggable-table-heading';
|
|
@@ -123,7 +124,8 @@ export const IssueLikeDataTableView = ({
|
|
|
123
124
|
onVisibleColumnKeysChange,
|
|
124
125
|
status,
|
|
125
126
|
hasNextPage,
|
|
126
|
-
scrollableContainerHeight
|
|
127
|
+
scrollableContainerHeight,
|
|
128
|
+
parentContainerRenderInstanceId
|
|
127
129
|
}) => {
|
|
128
130
|
const tableId = useMemo(() => Symbol('unique-id'), []);
|
|
129
131
|
const [lastRowElement, setLastRowElement] = useState(null);
|
|
@@ -134,6 +136,13 @@ export const IssueLikeDataTableView = ({
|
|
|
134
136
|
useEffect(() => {
|
|
135
137
|
setOrderedColumns(orderColumns([...columns], [...visibleColumnKeys]));
|
|
136
138
|
}, [columns, visibleColumnKeys]);
|
|
139
|
+
useEffect(() => {
|
|
140
|
+
if (parentContainerRenderInstanceId && status === 'resolved') {
|
|
141
|
+
succeedUfoExperience({
|
|
142
|
+
name: 'datasource-rendered'
|
|
143
|
+
}, parentContainerRenderInstanceId);
|
|
144
|
+
}
|
|
145
|
+
}, [parentContainerRenderInstanceId, status]);
|
|
137
146
|
const visibleSortedColumns = useMemo(() => visibleColumnKeys.map(visibleKey => orderedColumns.find(({
|
|
138
147
|
key
|
|
139
148
|
}) => visibleKey === key)).filter(Boolean), [orderedColumns, visibleColumnKeys]);
|
|
@@ -3,6 +3,7 @@ import _extends from "@babel/runtime/helpers/extends";
|
|
|
3
3
|
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
4
4
|
import { css, jsx } from '@emotion/react';
|
|
5
5
|
import { FormattedMessage, FormattedNumber, useIntl } from 'react-intl-next';
|
|
6
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
6
7
|
import { withAnalyticsContext } from '@atlaskit/analytics-next';
|
|
7
8
|
import Button from '@atlaskit/button/standard-button';
|
|
8
9
|
import Modal, { ModalBody, ModalFooter, ModalHeader, ModalTitle, ModalTransition } from '@atlaskit/modal-dialog';
|
|
@@ -10,6 +11,8 @@ import { B400, N0, N40, N800 } from '@atlaskit/theme/colors';
|
|
|
10
11
|
import { EVENT_CHANNEL, useDatasourceAnalyticsEvents } from '../../../analytics';
|
|
11
12
|
import { packageMetaData } from '../../../analytics/constants';
|
|
12
13
|
import { DatasourceAction, DatasourceDisplay } from '../../../analytics/types';
|
|
14
|
+
import { startUfoExperience } from '../../../analytics/ufoExperiences';
|
|
15
|
+
import { useDataRenderedUfoExperience } from '../../../analytics/ufoExperiences/useDataRenderedUfoExperience';
|
|
13
16
|
import { mapSearchMethod } from '../../../analytics/utils';
|
|
14
17
|
import { useDatasourceTableState } from '../../../hooks/useDatasourceTableState';
|
|
15
18
|
import { getAvailableJiraSites } from '../../../services/getAvailableJiraSites';
|
|
@@ -88,6 +91,7 @@ export const PlainJiraIssuesConfigModal = props => {
|
|
|
88
91
|
const searchCount = useRef(0);
|
|
89
92
|
const userInteractionActions = useRef(new Set());
|
|
90
93
|
const lastSearchMethodRef = useRef(null);
|
|
94
|
+
const visibleColumnCount = useRef((visibleColumnKeys === null || visibleColumnKeys === void 0 ? void 0 : visibleColumnKeys.length) || 0);
|
|
91
95
|
const parameters = useMemo(() => !!cloudId ? {
|
|
92
96
|
cloudId,
|
|
93
97
|
jql: jql || ''
|
|
@@ -116,6 +120,9 @@ export const PlainJiraIssuesConfigModal = props => {
|
|
|
116
120
|
const {
|
|
117
121
|
fireEvent
|
|
118
122
|
} = useDatasourceAnalyticsEvents();
|
|
123
|
+
const {
|
|
124
|
+
current: modalRenderInstanceId
|
|
125
|
+
} = useRef(uuidv4());
|
|
119
126
|
const selectedJiraSite = useMemo(() => {
|
|
120
127
|
if (cloudId) {
|
|
121
128
|
// if the cloud id we're editing isn't in available sites then user is likely unauthorized for that site
|
|
@@ -126,7 +133,7 @@ export const PlainJiraIssuesConfigModal = props => {
|
|
|
126
133
|
return availableSites.find(jiraSite => jiraSite.url === currentlyLoggedInSiteUrl) || availableSites[0];
|
|
127
134
|
}
|
|
128
135
|
}, [availableSites, cloudId]);
|
|
129
|
-
const
|
|
136
|
+
const analyticsPayload = useMemo(() => {
|
|
130
137
|
return {
|
|
131
138
|
extensionKey: extensionKey,
|
|
132
139
|
destinationObjectTypes: destinationObjectTypes
|
|
@@ -136,11 +143,28 @@ export const PlainJiraIssuesConfigModal = props => {
|
|
|
136
143
|
const jqlUrl = selectedJiraSite && jql && `${selectedJiraSite.url}/issues/?jql=${encodeURI(jql)}`;
|
|
137
144
|
const isInsertDisabled = !isParametersSet || status === 'rejected' || status === 'unauthorized' || status === 'loading' || resolvedWithNoResults;
|
|
138
145
|
const shouldShowIssueCount = !!totalCount && totalCount !== 1 && currentViewMode === 'issue';
|
|
146
|
+
const isDataReady = (visibleColumnKeys || []).length > 0;
|
|
147
|
+
useEffect(() => {
|
|
148
|
+
const shouldStartUfoExperience = status === 'loading';
|
|
149
|
+
if (shouldStartUfoExperience) {
|
|
150
|
+
startUfoExperience({
|
|
151
|
+
name: 'datasource-rendered'
|
|
152
|
+
}, modalRenderInstanceId);
|
|
153
|
+
}
|
|
154
|
+
}, [modalRenderInstanceId, status]);
|
|
155
|
+
useDataRenderedUfoExperience({
|
|
156
|
+
status,
|
|
157
|
+
experienceId: modalRenderInstanceId,
|
|
158
|
+
itemCount: responseItems.length,
|
|
159
|
+
canBeLink: currentViewMode === 'count',
|
|
160
|
+
extensionKey
|
|
161
|
+
});
|
|
139
162
|
useEffect(() => {
|
|
140
163
|
fireEvent('screen.datasourceModalDialog.viewed', {});
|
|
141
164
|
}, [fireEvent]);
|
|
142
165
|
useEffect(() => {
|
|
143
166
|
const newVisibleColumnKeys = !initialVisibleColumnKeys || (initialVisibleColumnKeys || []).length === 0 ? defaultVisibleColumnKeys : initialVisibleColumnKeys;
|
|
167
|
+
visibleColumnCount.current = newVisibleColumnKeys.length;
|
|
144
168
|
setVisibleColumnKeys(newVisibleColumnKeys);
|
|
145
169
|
}, [initialVisibleColumnKeys, defaultVisibleColumnKeys]);
|
|
146
170
|
useEffect(() => {
|
|
@@ -160,31 +184,50 @@ export const PlainJiraIssuesConfigModal = props => {
|
|
|
160
184
|
}, [cloudId, selectedJiraSite]);
|
|
161
185
|
const fireSingleItemViewedEvent = useCallback(() => {
|
|
162
186
|
fireEvent('ui.link.viewed.singleItem', {
|
|
163
|
-
|
|
164
|
-
searchMethod: mapSearchMethod(lastSearchMethodRef.current)
|
|
165
|
-
extensionKey: extensionKey
|
|
187
|
+
...analyticsPayload,
|
|
188
|
+
searchMethod: mapSearchMethod(lastSearchMethodRef.current)
|
|
166
189
|
});
|
|
167
|
-
}, [
|
|
190
|
+
}, [analyticsPayload, fireEvent]);
|
|
168
191
|
const fireCountViewedEvent = useCallback(() => {
|
|
169
192
|
fireEvent('ui.link.viewed.count', {
|
|
170
|
-
|
|
193
|
+
...analyticsPayload,
|
|
171
194
|
searchMethod: mapSearchMethod(lastSearchMethodRef.current),
|
|
172
|
-
extensionKey: extensionKey,
|
|
173
195
|
totalItemCount: totalCount || 0
|
|
174
196
|
});
|
|
175
|
-
}, [
|
|
197
|
+
}, [analyticsPayload, fireEvent, totalCount]);
|
|
198
|
+
const fireTableViewedEvent = useCallback(() => {
|
|
199
|
+
if (isDataReady) {
|
|
200
|
+
fireEvent('ui.table.viewed.datasourceConfigModal', {
|
|
201
|
+
...analyticsPayload,
|
|
202
|
+
totalItemCount: totalCount || 0,
|
|
203
|
+
searchMethod: mapSearchMethod(lastSearchMethodRef.current),
|
|
204
|
+
displayedColumnCount: visibleColumnCount.current
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
}, [analyticsPayload, fireEvent, totalCount, isDataReady]);
|
|
208
|
+
const fireIssueViewAnalytics = useCallback(() => {
|
|
209
|
+
if (!totalCount) {
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
if (totalCount > 1) {
|
|
213
|
+
fireTableViewedEvent();
|
|
214
|
+
} else if (totalCount === 1) {
|
|
215
|
+
fireSingleItemViewedEvent();
|
|
216
|
+
}
|
|
217
|
+
}, [fireSingleItemViewedEvent, fireTableViewedEvent, totalCount]);
|
|
176
218
|
useEffect(() => {
|
|
177
219
|
const isResolved = status === 'resolved';
|
|
178
|
-
const
|
|
179
|
-
const
|
|
180
|
-
if (isResolved) {
|
|
181
|
-
|
|
182
|
-
fireSingleItemViewedEvent();
|
|
183
|
-
} else if (isCountViewed && totalCount) {
|
|
184
|
-
fireCountViewedEvent();
|
|
185
|
-
}
|
|
220
|
+
const isIssueViewMode = currentViewMode === 'issue';
|
|
221
|
+
const isCountViewMode = currentViewMode === 'count';
|
|
222
|
+
if (!isResolved) {
|
|
223
|
+
return;
|
|
186
224
|
}
|
|
187
|
-
|
|
225
|
+
if (isIssueViewMode) {
|
|
226
|
+
fireIssueViewAnalytics();
|
|
227
|
+
} else if (isCountViewMode) {
|
|
228
|
+
fireCountViewedEvent();
|
|
229
|
+
}
|
|
230
|
+
}, [currentViewMode, status, fireIssueViewAnalytics, fireCountViewedEvent]);
|
|
188
231
|
const onSearch = useCallback((newParameters, searchMethod) => {
|
|
189
232
|
searchCount.current++;
|
|
190
233
|
lastSearchMethodRef.current = searchMethod;
|
|
@@ -201,13 +244,13 @@ export const PlainJiraIssuesConfigModal = props => {
|
|
|
201
244
|
eventType: 'ui',
|
|
202
245
|
actionSubjectId: 'cancel',
|
|
203
246
|
attributes: {
|
|
204
|
-
...
|
|
205
|
-
|
|
206
|
-
|
|
247
|
+
...analyticsPayload,
|
|
248
|
+
searchCount: searchCount.current,
|
|
249
|
+
actions: Array.from(userInteractionActions.current)
|
|
207
250
|
}
|
|
208
251
|
}).fire(EVENT_CHANNEL);
|
|
209
252
|
onCancel();
|
|
210
|
-
}, [
|
|
253
|
+
}, [analyticsPayload, onCancel]);
|
|
211
254
|
const onSiteSelection = useCallback(site => {
|
|
212
255
|
userInteractionActions.current.add(DatasourceAction.INSTANCE_UPDATED);
|
|
213
256
|
setCloudId(site.cloudId);
|
|
@@ -229,13 +272,13 @@ export const PlainJiraIssuesConfigModal = props => {
|
|
|
229
272
|
const insertButtonClickedEvent = analyticsEvent.update({
|
|
230
273
|
actionSubjectId: 'insert',
|
|
231
274
|
attributes: {
|
|
232
|
-
...
|
|
233
|
-
actions: Array.from(userInteractionActions.current),
|
|
275
|
+
...analyticsPayload,
|
|
234
276
|
totalItemCount: totalCount || 0,
|
|
235
|
-
displayedColumnCount:
|
|
277
|
+
displayedColumnCount: visibleColumnCount.current,
|
|
236
278
|
display: getDisplayValue(currentViewMode, totalCount || 0),
|
|
237
279
|
searchCount: searchCount.current,
|
|
238
|
-
searchMethod: mapSearchMethod(lastSearchMethodRef.current)
|
|
280
|
+
searchMethod: mapSearchMethod(lastSearchMethodRef.current),
|
|
281
|
+
actions: Array.from(userInteractionActions.current)
|
|
239
282
|
},
|
|
240
283
|
eventType: 'ui'
|
|
241
284
|
});
|
|
@@ -280,7 +323,7 @@ export const PlainJiraIssuesConfigModal = props => {
|
|
|
280
323
|
}
|
|
281
324
|
}, consumerEvent);
|
|
282
325
|
}
|
|
283
|
-
}, [isParametersSet, jql, selectedJiraSite,
|
|
326
|
+
}, [isParametersSet, jql, selectedJiraSite, analyticsPayload, totalCount, visibleColumnKeys, currentViewMode, retrieveUrlForSmartCardRender, responseItems.length, onInsert, jqlUrl, datasourceId, cloudId]);
|
|
284
327
|
const handleViewModeChange = selectedMode => {
|
|
285
328
|
userInteractionActions.current.add(DatasourceAction.DISPLAY_VIEW_CHANGED);
|
|
286
329
|
setCurrentViewMode(selectedMode);
|
|
@@ -292,6 +335,7 @@ export const PlainJiraIssuesConfigModal = props => {
|
|
|
292
335
|
const handleVisibleColumnKeysChange = useCallback((newVisibleColumnKeys = []) => {
|
|
293
336
|
const columnAction = getColumnAction(visibleColumnKeys || [], newVisibleColumnKeys);
|
|
294
337
|
userInteractionActions.current.add(columnAction);
|
|
338
|
+
visibleColumnCount.current = newVisibleColumnKeys.length;
|
|
295
339
|
setVisibleColumnKeys(newVisibleColumnKeys);
|
|
296
340
|
}, [visibleColumnKeys]);
|
|
297
341
|
const issueLikeDataTableView = useMemo(() => jsx("div", {
|
|
@@ -305,8 +349,9 @@ export const PlainJiraIssuesConfigModal = props => {
|
|
|
305
349
|
visibleColumnKeys: visibleColumnKeys || defaultVisibleColumnKeys,
|
|
306
350
|
onNextPage: handleOnNextPage,
|
|
307
351
|
onLoadDatasourceDetails: loadDatasourceDetails,
|
|
308
|
-
onVisibleColumnKeysChange: handleVisibleColumnKeysChange
|
|
309
|
-
|
|
352
|
+
onVisibleColumnKeysChange: handleVisibleColumnKeysChange,
|
|
353
|
+
parentContainerRenderInstanceId: modalRenderInstanceId
|
|
354
|
+
})), [columns, defaultVisibleColumnKeys, handleOnNextPage, handleVisibleColumnKeysChange, hasNextPage, loadDatasourceDetails, modalRenderInstanceId, responseItems, status, visibleColumnKeys]);
|
|
310
355
|
const renderCountModeContent = useCallback(() => {
|
|
311
356
|
const url = selectedJiraSite === null || selectedJiraSite === void 0 ? void 0 : selectedJiraSite.url;
|
|
312
357
|
if (status === 'unauthorized') {
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { ConcurrentExperience, ExperiencePerformanceTypes, ExperienceTypes } from '@atlaskit/ufo';
|
|
2
|
+
var datasourcePageSegmentLoadExperienceConfig = {
|
|
3
|
+
platform: {
|
|
4
|
+
component: 'datasource'
|
|
5
|
+
},
|
|
6
|
+
type: ExperienceTypes.Load,
|
|
7
|
+
performanceType: ExperiencePerformanceTypes.PageSegmentLoad
|
|
8
|
+
};
|
|
9
|
+
var ufoExperiences = {
|
|
10
|
+
'datasource-rendered': new ConcurrentExperience('datasource-rendered', datasourcePageSegmentLoadExperienceConfig)
|
|
11
|
+
};
|
|
12
|
+
export var startUfoExperience = function startUfoExperience(_ref, id) {
|
|
13
|
+
var name = _ref.name,
|
|
14
|
+
metadata = _ref.metadata;
|
|
15
|
+
var experienceInstance = ufoExperiences[name].getInstance(id);
|
|
16
|
+
experienceInstance.start();
|
|
17
|
+
if (metadata) {
|
|
18
|
+
experienceInstance.addMetadata(metadata);
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
export var succeedUfoExperience = function succeedUfoExperience(_ref2, id) {
|
|
22
|
+
var name = _ref2.name,
|
|
23
|
+
metadata = _ref2.metadata;
|
|
24
|
+
var experienceInstance = ufoExperiences[name].getInstance(id);
|
|
25
|
+
experienceInstance.success({
|
|
26
|
+
metadata: metadata
|
|
27
|
+
});
|
|
28
|
+
};
|
|
29
|
+
export var failUfoExperience = function failUfoExperience(_ref3, id) {
|
|
30
|
+
var name = _ref3.name,
|
|
31
|
+
metadata = _ref3.metadata;
|
|
32
|
+
var experienceInstance = ufoExperiences[name].getInstance(id);
|
|
33
|
+
experienceInstance.failure({
|
|
34
|
+
metadata: metadata
|
|
35
|
+
});
|
|
36
|
+
};
|
|
37
|
+
export var addMetadataToExperience = function addMetadataToExperience(_ref4, id) {
|
|
38
|
+
var name = _ref4.name,
|
|
39
|
+
metadata = _ref4.metadata;
|
|
40
|
+
ufoExperiences[name].getInstance(id).addMetadata(metadata);
|
|
41
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { useEffect } from 'react';
|
|
2
|
+
import { addMetadataToExperience, failUfoExperience, succeedUfoExperience } from './index';
|
|
3
|
+
/**
|
|
4
|
+
* Hook to mark DataRendered UFO experience as either Success or Failure
|
|
5
|
+
* 1. Success when
|
|
6
|
+
* * its rendered as a link
|
|
7
|
+
* * it returns empty results
|
|
8
|
+
* * the request is unauthorized
|
|
9
|
+
* 2. Fail when
|
|
10
|
+
* * request is rejected
|
|
11
|
+
*
|
|
12
|
+
* Note:
|
|
13
|
+
* * When the request is resolved as a datasource table, it will be marked success in the table component, every other success case is marked by this hook
|
|
14
|
+
*/
|
|
15
|
+
export var useDataRenderedUfoExperience = function useDataRenderedUfoExperience(_ref) {
|
|
16
|
+
var status = _ref.status,
|
|
17
|
+
experienceId = _ref.experienceId,
|
|
18
|
+
itemCount = _ref.itemCount,
|
|
19
|
+
canBeLink = _ref.canBeLink,
|
|
20
|
+
extensionKey = _ref.extensionKey;
|
|
21
|
+
useEffect(function () {
|
|
22
|
+
var isEmptyResult = status === 'resolved' && itemCount === 0;
|
|
23
|
+
var isLink = status === 'resolved' && (itemCount === 1 || canBeLink); // this will take care of count-mode/single-item smart-link rendering
|
|
24
|
+
var isUnauthorized = status === 'unauthorized';
|
|
25
|
+
var shouldSucceedUfoExperience = isEmptyResult || isLink || isUnauthorized;
|
|
26
|
+
var shouldFailUfoExperience = status === 'rejected';
|
|
27
|
+
if (extensionKey) {
|
|
28
|
+
addMetadataToExperience({
|
|
29
|
+
name: 'datasource-rendered',
|
|
30
|
+
metadata: {
|
|
31
|
+
extensionKey: extensionKey
|
|
32
|
+
}
|
|
33
|
+
}, experienceId);
|
|
34
|
+
}
|
|
35
|
+
if (shouldFailUfoExperience) {
|
|
36
|
+
failUfoExperience({
|
|
37
|
+
name: 'datasource-rendered'
|
|
38
|
+
}, experienceId);
|
|
39
|
+
} else if (shouldSucceedUfoExperience) {
|
|
40
|
+
succeedUfoExperience({
|
|
41
|
+
name: 'datasource-rendered'
|
|
42
|
+
}, experienceId);
|
|
43
|
+
}
|
|
44
|
+
}, [canBeLink, experienceId, extensionKey, itemCount, status]);
|
|
45
|
+
};
|
|
@@ -60,7 +60,7 @@ export var useDatasourceTableState = function useDatasourceTableState(_ref) {
|
|
|
60
60
|
getDatasourceData = _useDatasourceClientE.getDatasourceData,
|
|
61
61
|
getDatasourceDetails = _useDatasourceClientE.getDatasourceDetails;
|
|
62
62
|
var loadDatasourceDetails = useCallback( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
|
|
63
|
-
var _yield$getDatasourceD,
|
|
63
|
+
var _yield$getDatasourceD, access, schema, isColumnNotPresentInCurrentColumnsList, allColumns, newColumns;
|
|
64
64
|
return _regeneratorRuntime.wrap(function _callee$(_context) {
|
|
65
65
|
while (1) switch (_context.prev = _context.next) {
|
|
66
66
|
case 0:
|
|
@@ -77,20 +77,15 @@ export var useDatasourceTableState = function useDatasourceTableState(_ref) {
|
|
|
77
77
|
});
|
|
78
78
|
case 5:
|
|
79
79
|
_yield$getDatasourceD = _context.sent;
|
|
80
|
-
|
|
81
|
-
access = _yield$getDatasourceD2.access;
|
|
82
|
-
_destinationObjectTypes = _yield$getDatasourceD2.destinationObjectTypes;
|
|
83
|
-
_extensionKey = _yield$getDatasourceD2.extensionKey;
|
|
80
|
+
access = _yield$getDatasourceD.meta.access;
|
|
84
81
|
schema = _yield$getDatasourceD.data.schema;
|
|
85
82
|
if (!(access === 'forbidden' || access === 'unauthorized')) {
|
|
86
|
-
_context.next =
|
|
83
|
+
_context.next = 11;
|
|
87
84
|
break;
|
|
88
85
|
}
|
|
89
86
|
setStatus('unauthorized');
|
|
90
87
|
return _context.abrupt("return");
|
|
91
|
-
case
|
|
92
|
-
setExtensionKey(_extensionKey);
|
|
93
|
-
setDestinationObjectTypes(_destinationObjectTypes);
|
|
88
|
+
case 11:
|
|
94
89
|
isColumnNotPresentInCurrentColumnsList = function isColumnNotPresentInCurrentColumnsList(col) {
|
|
95
90
|
return !columns.find(function (column) {
|
|
96
91
|
return column.key === col.key;
|
|
@@ -99,17 +94,17 @@ export var useDatasourceTableState = function useDatasourceTableState(_ref) {
|
|
|
99
94
|
allColumns = schema.properties;
|
|
100
95
|
newColumns = allColumns.filter(isColumnNotPresentInCurrentColumnsList);
|
|
101
96
|
newColumns.length > 0 && setColumns([].concat(_toConsumableArray(columns), _toConsumableArray(newColumns)));
|
|
102
|
-
_context.next =
|
|
97
|
+
_context.next = 20;
|
|
103
98
|
break;
|
|
104
|
-
case
|
|
105
|
-
_context.prev =
|
|
99
|
+
case 17:
|
|
100
|
+
_context.prev = 17;
|
|
106
101
|
_context.t0 = _context["catch"](2);
|
|
107
102
|
setStatus('rejected');
|
|
108
|
-
case
|
|
103
|
+
case 20:
|
|
109
104
|
case "end":
|
|
110
105
|
return _context.stop();
|
|
111
106
|
}
|
|
112
|
-
}, _callee, null, [[2,
|
|
107
|
+
}, _callee, null, [[2, 17]]);
|
|
113
108
|
})), [columns, datasourceId, getDatasourceDetails, parameters]);
|
|
114
109
|
var applySchemaProperties = useCallback(function (properties) {
|
|
115
110
|
if (columns.length === 0) {
|
|
@@ -137,12 +132,12 @@ export var useDatasourceTableState = function useDatasourceTableState(_ref) {
|
|
|
137
132
|
shouldForceRequest,
|
|
138
133
|
sortedFieldKeys,
|
|
139
134
|
datasourceDataRequest,
|
|
135
|
+
_yield$getDatasourceD2,
|
|
140
136
|
_yield$getDatasourceD3,
|
|
141
|
-
_yield$getDatasourceD4,
|
|
142
137
|
access,
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
_yield$
|
|
138
|
+
_destinationObjectTypes,
|
|
139
|
+
_extensionKey,
|
|
140
|
+
_yield$getDatasourceD4,
|
|
146
141
|
items,
|
|
147
142
|
nextPageCursor,
|
|
148
143
|
_totalCount,
|
|
@@ -176,16 +171,16 @@ export var useDatasourceTableState = function useDatasourceTableState(_ref) {
|
|
|
176
171
|
_context2.next = 11;
|
|
177
172
|
return getDatasourceData(datasourceId, datasourceDataRequest, shouldForceRequest);
|
|
178
173
|
case 11:
|
|
179
|
-
_yield$
|
|
180
|
-
_yield$
|
|
181
|
-
access = _yield$
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
_yield$
|
|
185
|
-
items = _yield$
|
|
186
|
-
nextPageCursor = _yield$
|
|
187
|
-
_totalCount = _yield$
|
|
188
|
-
schema = _yield$
|
|
174
|
+
_yield$getDatasourceD2 = _context2.sent;
|
|
175
|
+
_yield$getDatasourceD3 = _yield$getDatasourceD2.meta;
|
|
176
|
+
access = _yield$getDatasourceD3.access;
|
|
177
|
+
_destinationObjectTypes = _yield$getDatasourceD3.destinationObjectTypes;
|
|
178
|
+
_extensionKey = _yield$getDatasourceD3.extensionKey;
|
|
179
|
+
_yield$getDatasourceD4 = _yield$getDatasourceD2.data;
|
|
180
|
+
items = _yield$getDatasourceD4.items;
|
|
181
|
+
nextPageCursor = _yield$getDatasourceD4.nextPageCursor;
|
|
182
|
+
_totalCount = _yield$getDatasourceD4.totalCount;
|
|
183
|
+
schema = _yield$getDatasourceD4.schema;
|
|
189
184
|
if (!(access === 'forbidden' || access === 'unauthorized')) {
|
|
190
185
|
_context2.next = 24;
|
|
191
186
|
break;
|
|
@@ -193,8 +188,8 @@ export var useDatasourceTableState = function useDatasourceTableState(_ref) {
|
|
|
193
188
|
setStatus('unauthorized');
|
|
194
189
|
return _context2.abrupt("return");
|
|
195
190
|
case 24:
|
|
196
|
-
setExtensionKey(
|
|
197
|
-
setDestinationObjectTypes(
|
|
191
|
+
setExtensionKey(_extensionKey);
|
|
192
|
+
setDestinationObjectTypes(_destinationObjectTypes);
|
|
198
193
|
setTotalCount(_totalCount);
|
|
199
194
|
setNextCursor(nextPageCursor);
|
|
200
195
|
setResponseItems(function (currentResponseItems) {
|
|
@@ -203,7 +198,6 @@ export var useDatasourceTableState = function useDatasourceTableState(_ref) {
|
|
|
203
198
|
}
|
|
204
199
|
return [].concat(_toConsumableArray(currentResponseItems), _toConsumableArray(items));
|
|
205
200
|
});
|
|
206
|
-
setStatus('resolved');
|
|
207
201
|
setHasNextPage(Boolean(nextPageCursor));
|
|
208
202
|
if (fieldKeys.length > 0) {
|
|
209
203
|
setLastRequestedFieldKeys(fieldKeys);
|
|
@@ -216,11 +210,12 @@ export var useDatasourceTableState = function useDatasourceTableState(_ref) {
|
|
|
216
210
|
currentLoadedItemCount = (responseItems === null || responseItems === void 0 ? void 0 : responseItems.length) || 0;
|
|
217
211
|
newlyLoadedItemCount = (items === null || items === void 0 ? void 0 : items.length) || 0;
|
|
218
212
|
fireEvent('track.nextItem.loaded', {
|
|
219
|
-
extensionKey:
|
|
220
|
-
destinationObjectTypes:
|
|
213
|
+
extensionKey: _extensionKey,
|
|
214
|
+
destinationObjectTypes: _destinationObjectTypes,
|
|
221
215
|
loadedItemCount: currentLoadedItemCount + newlyLoadedItemCount
|
|
222
216
|
});
|
|
223
217
|
}
|
|
218
|
+
setStatus('resolved');
|
|
224
219
|
_context2.next = 40;
|
|
225
220
|
break;
|
|
226
221
|
case 37:
|
|
@@ -222,7 +222,7 @@ var analyticsContextAttributes = {
|
|
|
222
222
|
};
|
|
223
223
|
var analyticsContextData = {
|
|
224
224
|
packageName: "@atlaskit/link-datasource",
|
|
225
|
-
packageVersion: "1.2.
|
|
225
|
+
packageVersion: "1.2.2",
|
|
226
226
|
source: 'datasourceConfigModal'
|
|
227
227
|
};
|
|
228
228
|
var contextData = _objectSpread(_objectSpread({}, analyticsContextData), {}, {
|