@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.
Files changed (41) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/cjs/analytics/constants.js +1 -1
  3. package/dist/cjs/analytics/ufoExperiences/index.js +51 -0
  4. package/dist/cjs/analytics/ufoExperiences/types.js +5 -0
  5. package/dist/cjs/analytics/ufoExperiences/useDataRenderedUfoExperience.js +52 -0
  6. package/dist/cjs/hooks/useDatasourceTableState.js +28 -33
  7. package/dist/cjs/ui/assets-modal/modal/index.js +1 -1
  8. package/dist/cjs/ui/datasource-table-view/datasourceTableView.js +21 -1
  9. package/dist/cjs/ui/issue-like-table/index.js +10 -1
  10. package/dist/cjs/ui/jira-issues-modal/modal/index.js +73 -32
  11. package/dist/es2019/analytics/constants.js +1 -1
  12. package/dist/es2019/analytics/ufoExperiences/index.js +45 -0
  13. package/dist/es2019/analytics/ufoExperiences/types.js +1 -0
  14. package/dist/es2019/analytics/ufoExperiences/useDataRenderedUfoExperience.js +46 -0
  15. package/dist/es2019/hooks/useDatasourceTableState.js +2 -6
  16. package/dist/es2019/ui/assets-modal/modal/index.js +1 -1
  17. package/dist/es2019/ui/datasource-table-view/datasourceTableView.js +22 -1
  18. package/dist/es2019/ui/issue-like-table/index.js +10 -1
  19. package/dist/es2019/ui/jira-issues-modal/modal/index.js +73 -28
  20. package/dist/esm/analytics/constants.js +1 -1
  21. package/dist/esm/analytics/ufoExperiences/index.js +41 -0
  22. package/dist/esm/analytics/ufoExperiences/types.js +1 -0
  23. package/dist/esm/analytics/ufoExperiences/useDataRenderedUfoExperience.js +45 -0
  24. package/dist/esm/hooks/useDatasourceTableState.js +28 -33
  25. package/dist/esm/ui/assets-modal/modal/index.js +1 -1
  26. package/dist/esm/ui/datasource-table-view/datasourceTableView.js +21 -1
  27. package/dist/esm/ui/issue-like-table/index.js +10 -1
  28. package/dist/esm/ui/jira-issues-modal/modal/index.js +73 -32
  29. package/dist/types/analytics/generated/analytics.types.d.ts +5 -4
  30. package/dist/types/analytics/ufoExperiences/index.d.ts +5 -0
  31. package/dist/types/analytics/ufoExperiences/types.d.ts +8 -0
  32. package/dist/types/analytics/ufoExperiences/useDataRenderedUfoExperience.d.ts +22 -0
  33. package/dist/types/ui/issue-like-table/index.d.ts +1 -1
  34. package/dist/types/ui/issue-like-table/types.d.ts +4 -0
  35. package/dist/types-ts4.5/analytics/generated/analytics.types.d.ts +5 -4
  36. package/dist/types-ts4.5/analytics/ufoExperiences/index.d.ts +5 -0
  37. package/dist/types-ts4.5/analytics/ufoExperiences/types.d.ts +8 -0
  38. package/dist/types-ts4.5/analytics/ufoExperiences/useDataRenderedUfoExperience.d.ts +22 -0
  39. package/dist/types-ts4.5/ui/issue-like-table/index.d.ts +1 -1
  40. package/dist/types-ts4.5/ui/issue-like-table/types.d.ts +4 -0
  41. 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
  }
@@ -205,7 +205,7 @@ const analyticsContextAttributes = {
205
205
  };
206
206
  const analyticsContextData = {
207
207
  packageName: "@atlaskit/link-datasource",
208
- packageVersion: "1.2.0",
208
+ packageVersion: "1.2.2",
209
209
  source: 'datasourceConfigModal'
210
210
  };
211
211
  const contextData = {
@@ -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 buttonClickedAnalyticsPayload = useMemo(() => {
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
- destinationObjectTypes: destinationObjectTypes,
164
- searchMethod: mapSearchMethod(lastSearchMethodRef.current),
165
- extensionKey: extensionKey
187
+ ...analyticsPayload,
188
+ searchMethod: mapSearchMethod(lastSearchMethodRef.current)
166
189
  });
167
- }, [extensionKey, fireEvent, destinationObjectTypes]);
190
+ }, [analyticsPayload, fireEvent]);
168
191
  const fireCountViewedEvent = useCallback(() => {
169
192
  fireEvent('ui.link.viewed.count', {
170
- destinationObjectTypes: destinationObjectTypes,
193
+ ...analyticsPayload,
171
194
  searchMethod: mapSearchMethod(lastSearchMethodRef.current),
172
- extensionKey: extensionKey,
173
195
  totalItemCount: totalCount || 0
174
196
  });
175
- }, [extensionKey, fireEvent, totalCount, destinationObjectTypes]);
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 isSingleItemViewed = currentViewMode === 'issue' && totalCount === 1;
179
- const isCountViewed = currentViewMode === 'count';
180
- if (isResolved) {
181
- if (isSingleItemViewed) {
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
- }, [currentViewMode, totalCount, status, fireSingleItemViewedEvent, fireCountViewedEvent]);
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
- ...buttonClickedAnalyticsPayload,
205
- actions: Array.from(userInteractionActions.current),
206
- searchCount: searchCount.current
247
+ ...analyticsPayload,
248
+ searchCount: searchCount.current,
249
+ actions: Array.from(userInteractionActions.current)
207
250
  }
208
251
  }).fire(EVENT_CHANNEL);
209
252
  onCancel();
210
- }, [buttonClickedAnalyticsPayload, onCancel]);
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
- ...buttonClickedAnalyticsPayload,
233
- actions: Array.from(userInteractionActions.current),
275
+ ...analyticsPayload,
234
276
  totalItemCount: totalCount || 0,
235
- displayedColumnCount: (visibleColumnKeys === null || visibleColumnKeys === void 0 ? void 0 : visibleColumnKeys.length) || 0,
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, buttonClickedAnalyticsPayload, totalCount, visibleColumnKeys, currentViewMode, retrieveUrlForSmartCardRender, responseItems.length, onInsert, jqlUrl, datasourceId, cloudId]);
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
- })), [columns, defaultVisibleColumnKeys, hasNextPage, handleVisibleColumnKeysChange, loadDatasourceDetails, handleOnNextPage, responseItems, status, visibleColumnKeys]);
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') {
@@ -1,5 +1,5 @@
1
1
  export var EVENT_CHANNEL = 'media';
2
2
  export var packageMetaData = {
3
3
  packageName: "@atlaskit/link-datasource",
4
- packageVersion: "1.2.0"
4
+ packageVersion: "1.2.2"
5
5
  };
@@ -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, _yield$getDatasourceD2, access, _destinationObjectTypes, _extensionKey, schema, isColumnNotPresentInCurrentColumnsList, allColumns, newColumns;
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
- _yield$getDatasourceD2 = _yield$getDatasourceD.meta;
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 = 14;
83
+ _context.next = 11;
87
84
  break;
88
85
  }
89
86
  setStatus('unauthorized');
90
87
  return _context.abrupt("return");
91
- case 14:
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 = 25;
97
+ _context.next = 20;
103
98
  break;
104
- case 22:
105
- _context.prev = 22;
99
+ case 17:
100
+ _context.prev = 17;
106
101
  _context.t0 = _context["catch"](2);
107
102
  setStatus('rejected');
108
- case 25:
103
+ case 20:
109
104
  case "end":
110
105
  return _context.stop();
111
106
  }
112
- }, _callee, null, [[2, 22]]);
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
- _destinationObjectTypes2,
144
- _extensionKey2,
145
- _yield$getDatasourceD5,
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$getDatasourceD3 = _context2.sent;
180
- _yield$getDatasourceD4 = _yield$getDatasourceD3.meta;
181
- access = _yield$getDatasourceD4.access;
182
- _destinationObjectTypes2 = _yield$getDatasourceD4.destinationObjectTypes;
183
- _extensionKey2 = _yield$getDatasourceD4.extensionKey;
184
- _yield$getDatasourceD5 = _yield$getDatasourceD3.data;
185
- items = _yield$getDatasourceD5.items;
186
- nextPageCursor = _yield$getDatasourceD5.nextPageCursor;
187
- _totalCount = _yield$getDatasourceD5.totalCount;
188
- schema = _yield$getDatasourceD5.schema;
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(_extensionKey2);
197
- setDestinationObjectTypes(_destinationObjectTypes2);
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: _extensionKey2,
220
- destinationObjectTypes: _destinationObjectTypes2,
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.0",
225
+ packageVersion: "1.2.2",
226
226
  source: 'datasourceConfigModal'
227
227
  };
228
228
  var contextData = _objectSpread(_objectSpread({}, analyticsContextData), {}, {