@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
package/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # @atlaskit/link-datasource
2
2
 
3
+ ## 1.2.2
4
+
5
+ ### Patch Changes
6
+
7
+ - [`ce3de76af77`](https://bitbucket.org/atlassian/atlassian-frontend/commits/ce3de76af77) - Added ui.table.viewed event
8
+ - Updated dependencies
9
+
10
+ ## 1.2.1
11
+
12
+ ### Patch Changes
13
+
14
+ - [`103618b094f`](https://bitbucket.org/atlassian/atlassian-frontend/commits/103618b094f) - Add UFO metrics to measure datasource rendering performance.
15
+ - Updated dependencies
16
+
3
17
  ## 1.2.0
4
18
 
5
19
  ### Minor Changes
@@ -8,6 +8,6 @@ var EVENT_CHANNEL = 'media';
8
8
  exports.EVENT_CHANNEL = EVENT_CHANNEL;
9
9
  var packageMetaData = {
10
10
  packageName: "@atlaskit/link-datasource",
11
- packageVersion: "1.2.0"
11
+ packageVersion: "1.2.2"
12
12
  };
13
13
  exports.packageMetaData = packageMetaData;
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.succeedUfoExperience = exports.startUfoExperience = exports.failUfoExperience = exports.addMetadataToExperience = void 0;
7
+ var _ufo = require("@atlaskit/ufo");
8
+ var datasourcePageSegmentLoadExperienceConfig = {
9
+ platform: {
10
+ component: 'datasource'
11
+ },
12
+ type: _ufo.ExperienceTypes.Load,
13
+ performanceType: _ufo.ExperiencePerformanceTypes.PageSegmentLoad
14
+ };
15
+ var ufoExperiences = {
16
+ 'datasource-rendered': new _ufo.ConcurrentExperience('datasource-rendered', datasourcePageSegmentLoadExperienceConfig)
17
+ };
18
+ var startUfoExperience = function startUfoExperience(_ref, id) {
19
+ var name = _ref.name,
20
+ metadata = _ref.metadata;
21
+ var experienceInstance = ufoExperiences[name].getInstance(id);
22
+ experienceInstance.start();
23
+ if (metadata) {
24
+ experienceInstance.addMetadata(metadata);
25
+ }
26
+ };
27
+ exports.startUfoExperience = startUfoExperience;
28
+ var succeedUfoExperience = function succeedUfoExperience(_ref2, id) {
29
+ var name = _ref2.name,
30
+ metadata = _ref2.metadata;
31
+ var experienceInstance = ufoExperiences[name].getInstance(id);
32
+ experienceInstance.success({
33
+ metadata: metadata
34
+ });
35
+ };
36
+ exports.succeedUfoExperience = succeedUfoExperience;
37
+ var failUfoExperience = function failUfoExperience(_ref3, id) {
38
+ var name = _ref3.name,
39
+ metadata = _ref3.metadata;
40
+ var experienceInstance = ufoExperiences[name].getInstance(id);
41
+ experienceInstance.failure({
42
+ metadata: metadata
43
+ });
44
+ };
45
+ exports.failUfoExperience = failUfoExperience;
46
+ var addMetadataToExperience = function addMetadataToExperience(_ref4, id) {
47
+ var name = _ref4.name,
48
+ metadata = _ref4.metadata;
49
+ ufoExperiences[name].getInstance(id).addMetadata(metadata);
50
+ };
51
+ exports.addMetadataToExperience = addMetadataToExperience;
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useDataRenderedUfoExperience = void 0;
7
+ var _react = require("react");
8
+ var _index = require("./index");
9
+ /**
10
+ * Hook to mark DataRendered UFO experience as either Success or Failure
11
+ * 1. Success when
12
+ * * its rendered as a link
13
+ * * it returns empty results
14
+ * * the request is unauthorized
15
+ * 2. Fail when
16
+ * * request is rejected
17
+ *
18
+ * Note:
19
+ * * 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
20
+ */
21
+ var useDataRenderedUfoExperience = function useDataRenderedUfoExperience(_ref) {
22
+ var status = _ref.status,
23
+ experienceId = _ref.experienceId,
24
+ itemCount = _ref.itemCount,
25
+ canBeLink = _ref.canBeLink,
26
+ extensionKey = _ref.extensionKey;
27
+ (0, _react.useEffect)(function () {
28
+ var isEmptyResult = status === 'resolved' && itemCount === 0;
29
+ var isLink = status === 'resolved' && (itemCount === 1 || canBeLink); // this will take care of count-mode/single-item smart-link rendering
30
+ var isUnauthorized = status === 'unauthorized';
31
+ var shouldSucceedUfoExperience = isEmptyResult || isLink || isUnauthorized;
32
+ var shouldFailUfoExperience = status === 'rejected';
33
+ if (extensionKey) {
34
+ (0, _index.addMetadataToExperience)({
35
+ name: 'datasource-rendered',
36
+ metadata: {
37
+ extensionKey: extensionKey
38
+ }
39
+ }, experienceId);
40
+ }
41
+ if (shouldFailUfoExperience) {
42
+ (0, _index.failUfoExperience)({
43
+ name: 'datasource-rendered'
44
+ }, experienceId);
45
+ } else if (shouldSucceedUfoExperience) {
46
+ (0, _index.succeedUfoExperience)({
47
+ name: 'datasource-rendered'
48
+ }, experienceId);
49
+ }
50
+ }, [canBeLink, experienceId, extensionKey, itemCount, status]);
51
+ };
52
+ exports.useDataRenderedUfoExperience = useDataRenderedUfoExperience;
@@ -67,7 +67,7 @@ var useDatasourceTableState = function useDatasourceTableState(_ref) {
67
67
  getDatasourceData = _useDatasourceClientE.getDatasourceData,
68
68
  getDatasourceDetails = _useDatasourceClientE.getDatasourceDetails;
69
69
  var loadDatasourceDetails = (0, _react.useCallback)( /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
70
- var _yield$getDatasourceD, _yield$getDatasourceD2, access, _destinationObjectTypes, _extensionKey, schema, isColumnNotPresentInCurrentColumnsList, allColumns, newColumns;
70
+ var _yield$getDatasourceD, access, schema, isColumnNotPresentInCurrentColumnsList, allColumns, newColumns;
71
71
  return _regenerator.default.wrap(function _callee$(_context) {
72
72
  while (1) switch (_context.prev = _context.next) {
73
73
  case 0:
@@ -84,20 +84,15 @@ var useDatasourceTableState = function useDatasourceTableState(_ref) {
84
84
  });
85
85
  case 5:
86
86
  _yield$getDatasourceD = _context.sent;
87
- _yield$getDatasourceD2 = _yield$getDatasourceD.meta;
88
- access = _yield$getDatasourceD2.access;
89
- _destinationObjectTypes = _yield$getDatasourceD2.destinationObjectTypes;
90
- _extensionKey = _yield$getDatasourceD2.extensionKey;
87
+ access = _yield$getDatasourceD.meta.access;
91
88
  schema = _yield$getDatasourceD.data.schema;
92
89
  if (!(access === 'forbidden' || access === 'unauthorized')) {
93
- _context.next = 14;
90
+ _context.next = 11;
94
91
  break;
95
92
  }
96
93
  setStatus('unauthorized');
97
94
  return _context.abrupt("return");
98
- case 14:
99
- setExtensionKey(_extensionKey);
100
- setDestinationObjectTypes(_destinationObjectTypes);
95
+ case 11:
101
96
  isColumnNotPresentInCurrentColumnsList = function isColumnNotPresentInCurrentColumnsList(col) {
102
97
  return !columns.find(function (column) {
103
98
  return column.key === col.key;
@@ -106,17 +101,17 @@ var useDatasourceTableState = function useDatasourceTableState(_ref) {
106
101
  allColumns = schema.properties;
107
102
  newColumns = allColumns.filter(isColumnNotPresentInCurrentColumnsList);
108
103
  newColumns.length > 0 && setColumns([].concat((0, _toConsumableArray2.default)(columns), (0, _toConsumableArray2.default)(newColumns)));
109
- _context.next = 25;
104
+ _context.next = 20;
110
105
  break;
111
- case 22:
112
- _context.prev = 22;
106
+ case 17:
107
+ _context.prev = 17;
113
108
  _context.t0 = _context["catch"](2);
114
109
  setStatus('rejected');
115
- case 25:
110
+ case 20:
116
111
  case "end":
117
112
  return _context.stop();
118
113
  }
119
- }, _callee, null, [[2, 22]]);
114
+ }, _callee, null, [[2, 17]]);
120
115
  })), [columns, datasourceId, getDatasourceDetails, parameters]);
121
116
  var applySchemaProperties = (0, _react.useCallback)(function (properties) {
122
117
  if (columns.length === 0) {
@@ -144,12 +139,12 @@ var useDatasourceTableState = function useDatasourceTableState(_ref) {
144
139
  shouldForceRequest,
145
140
  sortedFieldKeys,
146
141
  datasourceDataRequest,
142
+ _yield$getDatasourceD2,
147
143
  _yield$getDatasourceD3,
148
- _yield$getDatasourceD4,
149
144
  access,
150
- _destinationObjectTypes2,
151
- _extensionKey2,
152
- _yield$getDatasourceD5,
145
+ _destinationObjectTypes,
146
+ _extensionKey,
147
+ _yield$getDatasourceD4,
153
148
  items,
154
149
  nextPageCursor,
155
150
  _totalCount,
@@ -183,16 +178,16 @@ var useDatasourceTableState = function useDatasourceTableState(_ref) {
183
178
  _context2.next = 11;
184
179
  return getDatasourceData(datasourceId, datasourceDataRequest, shouldForceRequest);
185
180
  case 11:
186
- _yield$getDatasourceD3 = _context2.sent;
187
- _yield$getDatasourceD4 = _yield$getDatasourceD3.meta;
188
- access = _yield$getDatasourceD4.access;
189
- _destinationObjectTypes2 = _yield$getDatasourceD4.destinationObjectTypes;
190
- _extensionKey2 = _yield$getDatasourceD4.extensionKey;
191
- _yield$getDatasourceD5 = _yield$getDatasourceD3.data;
192
- items = _yield$getDatasourceD5.items;
193
- nextPageCursor = _yield$getDatasourceD5.nextPageCursor;
194
- _totalCount = _yield$getDatasourceD5.totalCount;
195
- schema = _yield$getDatasourceD5.schema;
181
+ _yield$getDatasourceD2 = _context2.sent;
182
+ _yield$getDatasourceD3 = _yield$getDatasourceD2.meta;
183
+ access = _yield$getDatasourceD3.access;
184
+ _destinationObjectTypes = _yield$getDatasourceD3.destinationObjectTypes;
185
+ _extensionKey = _yield$getDatasourceD3.extensionKey;
186
+ _yield$getDatasourceD4 = _yield$getDatasourceD2.data;
187
+ items = _yield$getDatasourceD4.items;
188
+ nextPageCursor = _yield$getDatasourceD4.nextPageCursor;
189
+ _totalCount = _yield$getDatasourceD4.totalCount;
190
+ schema = _yield$getDatasourceD4.schema;
196
191
  if (!(access === 'forbidden' || access === 'unauthorized')) {
197
192
  _context2.next = 24;
198
193
  break;
@@ -200,8 +195,8 @@ var useDatasourceTableState = function useDatasourceTableState(_ref) {
200
195
  setStatus('unauthorized');
201
196
  return _context2.abrupt("return");
202
197
  case 24:
203
- setExtensionKey(_extensionKey2);
204
- setDestinationObjectTypes(_destinationObjectTypes2);
198
+ setExtensionKey(_extensionKey);
199
+ setDestinationObjectTypes(_destinationObjectTypes);
205
200
  setTotalCount(_totalCount);
206
201
  setNextCursor(nextPageCursor);
207
202
  setResponseItems(function (currentResponseItems) {
@@ -210,7 +205,6 @@ var useDatasourceTableState = function useDatasourceTableState(_ref) {
210
205
  }
211
206
  return [].concat((0, _toConsumableArray2.default)(currentResponseItems), (0, _toConsumableArray2.default)(items));
212
207
  });
213
- setStatus('resolved');
214
208
  setHasNextPage(Boolean(nextPageCursor));
215
209
  if (fieldKeys.length > 0) {
216
210
  setLastRequestedFieldKeys(fieldKeys);
@@ -223,11 +217,12 @@ var useDatasourceTableState = function useDatasourceTableState(_ref) {
223
217
  currentLoadedItemCount = (responseItems === null || responseItems === void 0 ? void 0 : responseItems.length) || 0;
224
218
  newlyLoadedItemCount = (items === null || items === void 0 ? void 0 : items.length) || 0;
225
219
  fireEvent('track.nextItem.loaded', {
226
- extensionKey: _extensionKey2,
227
- destinationObjectTypes: _destinationObjectTypes2,
220
+ extensionKey: _extensionKey,
221
+ destinationObjectTypes: _destinationObjectTypes,
228
222
  loadedItemCount: currentLoadedItemCount + newlyLoadedItemCount
229
223
  });
230
224
  }
225
+ setStatus('resolved');
231
226
  _context2.next = 40;
232
227
  break;
233
228
  case 37:
@@ -231,7 +231,7 @@ var analyticsContextAttributes = {
231
231
  };
232
232
  var analyticsContextData = {
233
233
  packageName: "@atlaskit/link-datasource",
234
- packageVersion: "1.2.0",
234
+ packageVersion: "1.2.2",
235
235
  source: 'datasourceConfigModal'
236
236
  };
237
237
  var contextData = _objectSpread(_objectSpread({}, analyticsContextData), {}, {
@@ -7,9 +7,12 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.DatasourceTableView = void 0;
8
8
  var _react = require("react");
9
9
  var _react2 = require("@emotion/react");
10
+ var _uuid = require("uuid");
10
11
  var _analyticsNext = require("@atlaskit/analytics-next");
11
12
  var _analytics = require("../../analytics");
12
13
  var _constants = require("../../analytics/constants");
14
+ var _ufoExperiences = require("../../analytics/ufoExperiences");
15
+ var _useDataRenderedUfoExperience = require("../../analytics/ufoExperiences/useDataRenderedUfoExperience");
13
16
  var _useDatasourceTableState = require("../../hooks/useDatasourceTableState");
14
17
  var _accessRequired = require("../common/error-state/access-required");
15
18
  var _loadingError = require("../common/error-state/loading-error");
@@ -43,6 +46,8 @@ var DatasourceTableViewWithoutAnalytics = function DatasourceTableViewWithoutAna
43
46
  destinationObjectTypes = _useDatasourceTableSt.destinationObjectTypes;
44
47
  var _useDatasourceAnalyti = (0, _analytics.useDatasourceAnalyticsEvents)(),
45
48
  fireEvent = _useDatasourceAnalyti.fireEvent;
49
+ var _useRef = (0, _react.useRef)((0, _uuid.v4)()),
50
+ tableRenderInstanceId = _useRef.current;
46
51
 
47
52
  /* Need this to make sure that the datasource in the editor gets updated new info if any edits are made in the modal
48
53
  But we don't want to call it on initial load. This screws up useDatasourceTableState's internal
@@ -60,6 +65,20 @@ var DatasourceTableViewWithoutAnalytics = function DatasourceTableViewWithoutAna
60
65
  onVisibleColumnKeysChange(defaultVisibleColumnKeys);
61
66
  }
62
67
  }, [visibleColumnKeys, defaultVisibleColumnKeys, onVisibleColumnKeysChange]);
68
+ (0, _react.useEffect)(function () {
69
+ var shouldStartUfoExperience = datasourceId && parameters && visibleColumnKeys && status === 'loading';
70
+ if (shouldStartUfoExperience) {
71
+ (0, _ufoExperiences.startUfoExperience)({
72
+ name: 'datasource-rendered'
73
+ }, tableRenderInstanceId);
74
+ }
75
+ }, [datasourceId, parameters, status, tableRenderInstanceId, visibleColumnKeys]);
76
+ (0, _useDataRenderedUfoExperience.useDataRenderedUfoExperience)({
77
+ status: status,
78
+ experienceId: tableRenderInstanceId,
79
+ itemCount: responseItems.length,
80
+ extensionKey: extensionKey
81
+ });
63
82
  var forcedReset = (0, _react.useCallback)(function () {
64
83
  fireEvent('ui.button.clicked.sync', {
65
84
  extensionKey: extensionKey,
@@ -97,7 +116,8 @@ var DatasourceTableViewWithoutAnalytics = function DatasourceTableViewWithoutAna
97
116
  columns: columns,
98
117
  visibleColumnKeys: visibleColumnKeys || defaultVisibleColumnKeys,
99
118
  onVisibleColumnKeysChange: onVisibleColumnKeysChange,
100
- scrollableContainerHeight: 590
119
+ scrollableContainerHeight: 590,
120
+ parentContainerRenderInstanceId: tableRenderInstanceId
101
121
  }) : (0, _react2.jsx)(_emptyState.default, {
102
122
  testId: "datasource-table-view-skeleton",
103
123
  isCompact: true,
@@ -24,6 +24,7 @@ var _element = require("@atlaskit/pragmatic-drag-and-drop/adapter/element");
24
24
  var _combine = require("@atlaskit/pragmatic-drag-and-drop/util/combine");
25
25
  var _colors = require("@atlaskit/theme/colors");
26
26
  var _tooltip = _interopRequireDefault(require("@atlaskit/tooltip"));
27
+ var _ufoExperiences = require("../../analytics/ufoExperiences");
27
28
  var _columnPicker = require("./column-picker");
28
29
  var _dragColumnPreview = require("./drag-column-preview");
29
30
  var _draggableTableHeading = require("./draggable-table-heading");
@@ -122,7 +123,8 @@ var IssueLikeDataTableView = function IssueLikeDataTableView(_ref2) {
122
123
  onVisibleColumnKeysChange = _ref2.onVisibleColumnKeysChange,
123
124
  status = _ref2.status,
124
125
  hasNextPage = _ref2.hasNextPage,
125
- scrollableContainerHeight = _ref2.scrollableContainerHeight;
126
+ scrollableContainerHeight = _ref2.scrollableContainerHeight,
127
+ parentContainerRenderInstanceId = _ref2.parentContainerRenderInstanceId;
126
128
  var tableId = (0, _react.useMemo)(function () {
127
129
  return Symbol('unique-id');
128
130
  }, []);
@@ -145,6 +147,13 @@ var IssueLikeDataTableView = function IssueLikeDataTableView(_ref2) {
145
147
  (0, _react.useEffect)(function () {
146
148
  setOrderedColumns(orderColumns((0, _toConsumableArray2.default)(columns), (0, _toConsumableArray2.default)(visibleColumnKeys)));
147
149
  }, [columns, visibleColumnKeys]);
150
+ (0, _react.useEffect)(function () {
151
+ if (parentContainerRenderInstanceId && status === 'resolved') {
152
+ (0, _ufoExperiences.succeedUfoExperience)({
153
+ name: 'datasource-rendered'
154
+ }, parentContainerRenderInstanceId);
155
+ }
156
+ }, [parentContainerRenderInstanceId, status]);
148
157
  var visibleSortedColumns = (0, _react.useMemo)(function () {
149
158
  return visibleColumnKeys.map(function (visibleKey) {
150
159
  return orderedColumns.find(function (_ref3) {
@@ -14,6 +14,7 @@ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/sli
14
14
  var _react = require("react");
15
15
  var _react2 = require("@emotion/react");
16
16
  var _reactIntlNext = require("react-intl-next");
17
+ var _uuid = require("uuid");
17
18
  var _analyticsNext = require("@atlaskit/analytics-next");
18
19
  var _standardButton = _interopRequireDefault(require("@atlaskit/button/standard-button"));
19
20
  var _modalDialog = _interopRequireWildcard(require("@atlaskit/modal-dialog"));
@@ -21,6 +22,8 @@ var _colors = require("@atlaskit/theme/colors");
21
22
  var _analytics = require("../../../analytics");
22
23
  var _constants = require("../../../analytics/constants");
23
24
  var _types = require("../../../analytics/types");
25
+ var _ufoExperiences = require("../../../analytics/ufoExperiences");
26
+ var _useDataRenderedUfoExperience = require("../../../analytics/ufoExperiences/useDataRenderedUfoExperience");
24
27
  var _utils = require("../../../analytics/utils");
25
28
  var _useDatasourceTableState = require("../../../hooks/useDatasourceTableState");
26
29
  var _getAvailableJiraSites = require("../../../services/getAvailableJiraSites");
@@ -117,6 +120,7 @@ var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(props) {
117
120
  var searchCount = (0, _react.useRef)(0);
118
121
  var userInteractionActions = (0, _react.useRef)(new Set());
119
122
  var lastSearchMethodRef = (0, _react.useRef)(null);
123
+ var visibleColumnCount = (0, _react.useRef)((visibleColumnKeys === null || visibleColumnKeys === void 0 ? void 0 : visibleColumnKeys.length) || 0);
120
124
  var parameters = (0, _react.useMemo)(function () {
121
125
  return !!cloudId ? {
122
126
  cloudId: cloudId,
@@ -145,6 +149,8 @@ var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(props) {
145
149
  formatMessage = _useIntl.formatMessage;
146
150
  var _useDatasourceAnalyti = (0, _analytics.useDatasourceAnalyticsEvents)(),
147
151
  fireEvent = _useDatasourceAnalyti.fireEvent;
152
+ var _useRef = (0, _react.useRef)((0, _uuid.v4)()),
153
+ modalRenderInstanceId = _useRef.current;
148
154
  var selectedJiraSite = (0, _react.useMemo)(function () {
149
155
  if (cloudId) {
150
156
  // if the cloud id we're editing isn't in available sites then user is likely unauthorized for that site
@@ -159,7 +165,7 @@ var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(props) {
159
165
  }) || availableSites[0];
160
166
  }
161
167
  }, [availableSites, cloudId]);
162
- var buttonClickedAnalyticsPayload = (0, _react.useMemo)(function () {
168
+ var analyticsPayload = (0, _react.useMemo)(function () {
163
169
  return {
164
170
  extensionKey: extensionKey,
165
171
  destinationObjectTypes: destinationObjectTypes
@@ -169,11 +175,28 @@ var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(props) {
169
175
  var jqlUrl = selectedJiraSite && jql && "".concat(selectedJiraSite.url, "/issues/?jql=").concat(encodeURI(jql));
170
176
  var isInsertDisabled = !isParametersSet || status === 'rejected' || status === 'unauthorized' || status === 'loading' || resolvedWithNoResults;
171
177
  var shouldShowIssueCount = !!totalCount && totalCount !== 1 && currentViewMode === 'issue';
178
+ var isDataReady = (visibleColumnKeys || []).length > 0;
179
+ (0, _react.useEffect)(function () {
180
+ var shouldStartUfoExperience = status === 'loading';
181
+ if (shouldStartUfoExperience) {
182
+ (0, _ufoExperiences.startUfoExperience)({
183
+ name: 'datasource-rendered'
184
+ }, modalRenderInstanceId);
185
+ }
186
+ }, [modalRenderInstanceId, status]);
187
+ (0, _useDataRenderedUfoExperience.useDataRenderedUfoExperience)({
188
+ status: status,
189
+ experienceId: modalRenderInstanceId,
190
+ itemCount: responseItems.length,
191
+ canBeLink: currentViewMode === 'count',
192
+ extensionKey: extensionKey
193
+ });
172
194
  (0, _react.useEffect)(function () {
173
195
  fireEvent('screen.datasourceModalDialog.viewed', {});
174
196
  }, [fireEvent]);
175
197
  (0, _react.useEffect)(function () {
176
198
  var newVisibleColumnKeys = !initialVisibleColumnKeys || (initialVisibleColumnKeys || []).length === 0 ? defaultVisibleColumnKeys : initialVisibleColumnKeys;
199
+ visibleColumnCount.current = newVisibleColumnKeys.length;
177
200
  setVisibleColumnKeys(newVisibleColumnKeys);
178
201
  }, [initialVisibleColumnKeys, defaultVisibleColumnKeys]);
179
202
  (0, _react.useEffect)(function () {
@@ -209,32 +232,48 @@ var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(props) {
209
232
  }
210
233
  }, [cloudId, selectedJiraSite]);
211
234
  var fireSingleItemViewedEvent = (0, _react.useCallback)(function () {
212
- fireEvent('ui.link.viewed.singleItem', {
213
- destinationObjectTypes: destinationObjectTypes,
214
- searchMethod: (0, _utils.mapSearchMethod)(lastSearchMethodRef.current),
215
- extensionKey: extensionKey
216
- });
217
- }, [extensionKey, fireEvent, destinationObjectTypes]);
235
+ fireEvent('ui.link.viewed.singleItem', _objectSpread(_objectSpread({}, analyticsPayload), {}, {
236
+ searchMethod: (0, _utils.mapSearchMethod)(lastSearchMethodRef.current)
237
+ }));
238
+ }, [analyticsPayload, fireEvent]);
218
239
  var fireCountViewedEvent = (0, _react.useCallback)(function () {
219
- fireEvent('ui.link.viewed.count', {
220
- destinationObjectTypes: destinationObjectTypes,
240
+ fireEvent('ui.link.viewed.count', _objectSpread(_objectSpread({}, analyticsPayload), {}, {
221
241
  searchMethod: (0, _utils.mapSearchMethod)(lastSearchMethodRef.current),
222
- extensionKey: extensionKey,
223
242
  totalItemCount: totalCount || 0
224
- });
225
- }, [extensionKey, fireEvent, totalCount, destinationObjectTypes]);
243
+ }));
244
+ }, [analyticsPayload, fireEvent, totalCount]);
245
+ var fireTableViewedEvent = (0, _react.useCallback)(function () {
246
+ if (isDataReady) {
247
+ fireEvent('ui.table.viewed.datasourceConfigModal', _objectSpread(_objectSpread({}, analyticsPayload), {}, {
248
+ totalItemCount: totalCount || 0,
249
+ searchMethod: (0, _utils.mapSearchMethod)(lastSearchMethodRef.current),
250
+ displayedColumnCount: visibleColumnCount.current
251
+ }));
252
+ }
253
+ }, [analyticsPayload, fireEvent, totalCount, isDataReady]);
254
+ var fireIssueViewAnalytics = (0, _react.useCallback)(function () {
255
+ if (!totalCount) {
256
+ return;
257
+ }
258
+ if (totalCount > 1) {
259
+ fireTableViewedEvent();
260
+ } else if (totalCount === 1) {
261
+ fireSingleItemViewedEvent();
262
+ }
263
+ }, [fireSingleItemViewedEvent, fireTableViewedEvent, totalCount]);
226
264
  (0, _react.useEffect)(function () {
227
265
  var isResolved = status === 'resolved';
228
- var isSingleItemViewed = currentViewMode === 'issue' && totalCount === 1;
229
- var isCountViewed = currentViewMode === 'count';
230
- if (isResolved) {
231
- if (isSingleItemViewed) {
232
- fireSingleItemViewedEvent();
233
- } else if (isCountViewed && totalCount) {
234
- fireCountViewedEvent();
235
- }
266
+ var isIssueViewMode = currentViewMode === 'issue';
267
+ var isCountViewMode = currentViewMode === 'count';
268
+ if (!isResolved) {
269
+ return;
236
270
  }
237
- }, [currentViewMode, totalCount, status, fireSingleItemViewedEvent, fireCountViewedEvent]);
271
+ if (isIssueViewMode) {
272
+ fireIssueViewAnalytics();
273
+ } else if (isCountViewMode) {
274
+ fireCountViewedEvent();
275
+ }
276
+ }, [currentViewMode, status, fireIssueViewAnalytics, fireCountViewedEvent]);
238
277
  var onSearch = (0, _react.useCallback)(function (newParameters, searchMethod) {
239
278
  searchCount.current++;
240
279
  lastSearchMethodRef.current = searchMethod;
@@ -250,13 +289,13 @@ var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(props) {
250
289
  analyticEvent.update({
251
290
  eventType: 'ui',
252
291
  actionSubjectId: 'cancel',
253
- attributes: _objectSpread(_objectSpread({}, buttonClickedAnalyticsPayload), {}, {
254
- actions: Array.from(userInteractionActions.current),
255
- searchCount: searchCount.current
292
+ attributes: _objectSpread(_objectSpread({}, analyticsPayload), {}, {
293
+ searchCount: searchCount.current,
294
+ actions: Array.from(userInteractionActions.current)
256
295
  })
257
296
  }).fire(_analytics.EVENT_CHANNEL);
258
297
  onCancel();
259
- }, [buttonClickedAnalyticsPayload, onCancel]);
298
+ }, [analyticsPayload, onCancel]);
260
299
  var onSiteSelection = (0, _react.useCallback)(function (site) {
261
300
  userInteractionActions.current.add(_types.DatasourceAction.INSTANCE_UPDATED);
262
301
  setCloudId(site.cloudId);
@@ -278,13 +317,13 @@ var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(props) {
278
317
  }
279
318
  var insertButtonClickedEvent = analyticsEvent.update({
280
319
  actionSubjectId: 'insert',
281
- attributes: _objectSpread(_objectSpread({}, buttonClickedAnalyticsPayload), {}, {
282
- actions: Array.from(userInteractionActions.current),
320
+ attributes: _objectSpread(_objectSpread({}, analyticsPayload), {}, {
283
321
  totalItemCount: totalCount || 0,
284
- displayedColumnCount: (visibleColumnKeys === null || visibleColumnKeys === void 0 ? void 0 : visibleColumnKeys.length) || 0,
322
+ displayedColumnCount: visibleColumnCount.current,
285
323
  display: getDisplayValue(currentViewMode, totalCount || 0),
286
324
  searchCount: searchCount.current,
287
- searchMethod: (0, _utils.mapSearchMethod)(lastSearchMethodRef.current)
325
+ searchMethod: (0, _utils.mapSearchMethod)(lastSearchMethodRef.current),
326
+ actions: Array.from(userInteractionActions.current)
288
327
  }),
289
328
  eventType: 'ui'
290
329
  });
@@ -331,7 +370,7 @@ var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(props) {
331
370
  }
332
371
  }, consumerEvent);
333
372
  }
334
- }, [isParametersSet, jql, selectedJiraSite, buttonClickedAnalyticsPayload, totalCount, visibleColumnKeys, currentViewMode, retrieveUrlForSmartCardRender, responseItems.length, onInsert, jqlUrl, datasourceId, cloudId]);
373
+ }, [isParametersSet, jql, selectedJiraSite, analyticsPayload, totalCount, visibleColumnKeys, currentViewMode, retrieveUrlForSmartCardRender, responseItems.length, onInsert, jqlUrl, datasourceId, cloudId]);
335
374
  var handleViewModeChange = function handleViewModeChange(selectedMode) {
336
375
  userInteractionActions.current.add(_types.DatasourceAction.DISPLAY_VIEW_CHANGED);
337
376
  setCurrentViewMode(selectedMode);
@@ -344,6 +383,7 @@ var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(props) {
344
383
  var newVisibleColumnKeys = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
345
384
  var columnAction = getColumnAction(visibleColumnKeys || [], newVisibleColumnKeys);
346
385
  userInteractionActions.current.add(columnAction);
386
+ visibleColumnCount.current = newVisibleColumnKeys.length;
347
387
  setVisibleColumnKeys(newVisibleColumnKeys);
348
388
  }, [visibleColumnKeys]);
349
389
  var issueLikeDataTableView = (0, _react.useMemo)(function () {
@@ -358,9 +398,10 @@ var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(props) {
358
398
  visibleColumnKeys: visibleColumnKeys || defaultVisibleColumnKeys,
359
399
  onNextPage: handleOnNextPage,
360
400
  onLoadDatasourceDetails: loadDatasourceDetails,
361
- onVisibleColumnKeysChange: handleVisibleColumnKeysChange
401
+ onVisibleColumnKeysChange: handleVisibleColumnKeysChange,
402
+ parentContainerRenderInstanceId: modalRenderInstanceId
362
403
  }));
363
- }, [columns, defaultVisibleColumnKeys, hasNextPage, handleVisibleColumnKeysChange, loadDatasourceDetails, handleOnNextPage, responseItems, status, visibleColumnKeys]);
404
+ }, [columns, defaultVisibleColumnKeys, handleOnNextPage, handleVisibleColumnKeysChange, hasNextPage, loadDatasourceDetails, modalRenderInstanceId, responseItems, status, visibleColumnKeys]);
364
405
  var renderCountModeContent = (0, _react.useCallback)(function () {
365
406
  var url = selectedJiraSite === null || selectedJiraSite === void 0 ? void 0 : selectedJiraSite.url;
366
407
  if (status === 'unauthorized') {
@@ -1,5 +1,5 @@
1
1
  export const EVENT_CHANNEL = 'media';
2
2
  export const packageMetaData = {
3
3
  packageName: "@atlaskit/link-datasource",
4
- packageVersion: "1.2.0"
4
+ packageVersion: "1.2.2"
5
5
  };
@@ -0,0 +1,45 @@
1
+ import { ConcurrentExperience, ExperiencePerformanceTypes, ExperienceTypes } from '@atlaskit/ufo';
2
+ const datasourcePageSegmentLoadExperienceConfig = {
3
+ platform: {
4
+ component: 'datasource'
5
+ },
6
+ type: ExperienceTypes.Load,
7
+ performanceType: ExperiencePerformanceTypes.PageSegmentLoad
8
+ };
9
+ const ufoExperiences = {
10
+ 'datasource-rendered': new ConcurrentExperience('datasource-rendered', datasourcePageSegmentLoadExperienceConfig)
11
+ };
12
+ export const startUfoExperience = ({
13
+ name,
14
+ metadata
15
+ }, id) => {
16
+ const experienceInstance = ufoExperiences[name].getInstance(id);
17
+ experienceInstance.start();
18
+ if (metadata) {
19
+ experienceInstance.addMetadata(metadata);
20
+ }
21
+ };
22
+ export const succeedUfoExperience = ({
23
+ name,
24
+ metadata
25
+ }, id) => {
26
+ const experienceInstance = ufoExperiences[name].getInstance(id);
27
+ experienceInstance.success({
28
+ metadata
29
+ });
30
+ };
31
+ export const failUfoExperience = ({
32
+ name,
33
+ metadata
34
+ }, id) => {
35
+ const experienceInstance = ufoExperiences[name].getInstance(id);
36
+ experienceInstance.failure({
37
+ metadata
38
+ });
39
+ };
40
+ export const addMetadataToExperience = ({
41
+ name,
42
+ metadata
43
+ }, id) => {
44
+ ufoExperiences[name].getInstance(id).addMetadata(metadata);
45
+ };
@@ -0,0 +1 @@
1
+ export {};