@atlaskit/link-datasource 1.0.16 → 1.0.18

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 (30) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/cjs/analytics/constants.js +7 -2
  3. package/dist/cjs/analytics/types.js +30 -0
  4. package/dist/cjs/analytics/utils.js +4 -3
  5. package/dist/cjs/ui/assets-modal/modal/index.js +2 -2
  6. package/dist/cjs/ui/datasource-table-view/datasourceTableView.js +2 -5
  7. package/dist/cjs/ui/jira-issues-modal/modal/index.js +97 -21
  8. package/dist/es2019/analytics/constants.js +5 -1
  9. package/dist/es2019/analytics/types.js +21 -0
  10. package/dist/es2019/analytics/utils.js +4 -3
  11. package/dist/es2019/ui/assets-modal/modal/index.js +2 -2
  12. package/dist/es2019/ui/datasource-table-view/datasourceTableView.js +2 -5
  13. package/dist/es2019/ui/jira-issues-modal/modal/index.js +92 -16
  14. package/dist/esm/analytics/constants.js +5 -1
  15. package/dist/esm/analytics/types.js +21 -0
  16. package/dist/esm/analytics/utils.js +4 -3
  17. package/dist/esm/ui/assets-modal/modal/index.js +2 -2
  18. package/dist/esm/ui/datasource-table-view/datasourceTableView.js +2 -5
  19. package/dist/esm/ui/jira-issues-modal/modal/index.js +97 -22
  20. package/dist/types/analytics/constants.d.ts +2 -0
  21. package/dist/types/analytics/generated/analytics.types.d.ts +6 -1
  22. package/dist/types/analytics/types.d.ts +18 -0
  23. package/dist/types/analytics/utils.d.ts +2 -1
  24. package/dist/types/ui/jira-issues-modal/modal/index.d.ts +6 -0
  25. package/dist/types-ts4.5/analytics/constants.d.ts +2 -0
  26. package/dist/types-ts4.5/analytics/generated/analytics.types.d.ts +6 -1
  27. package/dist/types-ts4.5/analytics/types.d.ts +18 -0
  28. package/dist/types-ts4.5/analytics/utils.d.ts +2 -1
  29. package/dist/types-ts4.5/ui/jira-issues-modal/modal/index.d.ts +6 -0
  30. package/package.json +7 -7
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # @atlaskit/link-datasource
2
2
 
3
+ ## 1.0.18
4
+
5
+ ### Patch Changes
6
+
7
+ - [`e682c758801`](https://bitbucket.org/atlassian/atlassian-frontend/commits/e682c758801) - Added button clicked (cancel) and button clicked (insert) UI events
8
+
9
+ ## 1.0.17
10
+
11
+ ### Patch Changes
12
+
13
+ - [`882e4e88358`](https://bitbucket.org/atlassian/atlassian-frontend/commits/882e4e88358) - Add playwright tests and add test ids to find elements
14
+ - Updated dependencies
15
+
3
16
  ## 1.0.16
4
17
 
5
18
  ### Patch Changes
@@ -3,6 +3,11 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.EVENT_CHANNEL = void 0;
6
+ exports.packageMetaData = exports.EVENT_CHANNEL = void 0;
7
7
  var EVENT_CHANNEL = 'media';
8
- exports.EVENT_CHANNEL = EVENT_CHANNEL;
8
+ exports.EVENT_CHANNEL = EVENT_CHANNEL;
9
+ var packageMetaData = {
10
+ packageName: "@atlaskit/link-datasource",
11
+ packageVersion: "1.0.18"
12
+ };
13
+ exports.packageMetaData = packageMetaData;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.DatasourceSearchMethod = exports.DatasourceDisplay = exports.DatasourceAction = void 0;
7
+ var DatasourceAction = /*#__PURE__*/function (DatasourceAction) {
8
+ DatasourceAction["COLUMN_ADDED"] = "column added";
9
+ DatasourceAction["COLUMN_REMOVED"] = "column removed";
10
+ DatasourceAction["COLUMN_REORDERED"] = "column reordered";
11
+ DatasourceAction["INSTANCE_UPDATED"] = "instance updated";
12
+ DatasourceAction["QUERY_UPDATED"] = "query updated";
13
+ DatasourceAction["DISPLAY_VIEW_CHANGED"] = "display view changed";
14
+ DatasourceAction["NEXT_PAGE_SCROLLED"] = "next page scrolled";
15
+ return DatasourceAction;
16
+ }({});
17
+ exports.DatasourceAction = DatasourceAction;
18
+ var DatasourceDisplay = /*#__PURE__*/function (DatasourceDisplay) {
19
+ DatasourceDisplay["DATASOURCE_TABLE"] = "datasource_table";
20
+ DatasourceDisplay["DATASOURCE_INLINE"] = "datasource_inline";
21
+ DatasourceDisplay["INLINE"] = "inline";
22
+ return DatasourceDisplay;
23
+ }({});
24
+ exports.DatasourceDisplay = DatasourceDisplay;
25
+ var DatasourceSearchMethod = /*#__PURE__*/function (DatasourceSearchMethod) {
26
+ DatasourceSearchMethod["DATASOURCE_BASIC_FILTER"] = "datasource_basic_filter";
27
+ DatasourceSearchMethod["DATASOURCE_SEARCH_QUERY"] = "datasource_search_query";
28
+ return DatasourceSearchMethod;
29
+ }({});
30
+ exports.DatasourceSearchMethod = DatasourceSearchMethod;
@@ -4,14 +4,15 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.mapSearchMethod = void 0;
7
+ var _types = require("./types");
7
8
  var mapSearchMethod = function mapSearchMethod(searchMethod) {
8
9
  switch (searchMethod) {
9
10
  case 'basic':
10
- return 'datasource_basic_filter';
11
+ return _types.DatasourceSearchMethod.DATASOURCE_BASIC_FILTER;
11
12
  case 'jql':
12
- return 'datasource_search_query';
13
+ return _types.DatasourceSearchMethod.DATASOURCE_SEARCH_QUERY;
13
14
  default:
14
- return 'unknown';
15
+ return null;
15
16
  }
16
17
  };
17
18
  exports.mapSearchMethod = mapSearchMethod;
@@ -219,7 +219,7 @@ var PlainAssetsConfigModal = function PlainAssetsConfigModal(props) {
219
219
  appearance: "primary",
220
220
  onClick: onInsertPressed,
221
221
  isDisabled: isDisabled,
222
- testId: 'asset-datasource-modal--insert-button'
222
+ testId: 'assets-datasource-modal--insert-button'
223
223
  }, (0, _react2.jsx)(_reactIntlNext.FormattedMessage, (0, _extends2.default)({}, _messages.modalMessages.insertIssuesButtonText, {
224
224
  values: {
225
225
  objectsCount: responseItems.length
@@ -231,7 +231,7 @@ var analyticsContextAttributes = {
231
231
  };
232
232
  var analyticsContextData = {
233
233
  packageName: "@atlaskit/link-datasource",
234
- packageVersion: "1.0.16",
234
+ packageVersion: "1.0.18",
235
235
  source: 'datasourceConfigModal'
236
236
  };
237
237
  var contextData = _objectSpread(_objectSpread({}, analyticsContextData), {}, {
@@ -9,6 +9,7 @@ var _react = require("react");
9
9
  var _react2 = require("@emotion/react");
10
10
  var _analyticsNext = require("@atlaskit/analytics-next");
11
11
  var _analytics = require("../../analytics");
12
+ var _constants = require("../../analytics/constants");
12
13
  var _useDatasourceTableState = require("../../hooks/useDatasourceTableState");
13
14
  var _accessRequired = require("../common/error-state/access-required");
14
15
  var _loadingError = require("../common/error-state/loading-error");
@@ -108,9 +109,5 @@ var DatasourceTableViewWithoutAnalytics = function DatasourceTableViewWithoutAna
108
109
  }))
109
110
  );
110
111
  };
111
- var analyticsContextData = {
112
- packageName: "@atlaskit/link-datasource",
113
- packageVersion: "1.0.16"
114
- };
115
- var DatasourceTableView = (0, _analyticsNext.withAnalyticsContext)(analyticsContextData)(DatasourceTableViewWithoutAnalytics);
112
+ var DatasourceTableView = (0, _analyticsNext.withAnalyticsContext)(_constants.packageMetaData)(DatasourceTableViewWithoutAnalytics);
116
113
  exports.DatasourceTableView = DatasourceTableView;
@@ -5,10 +5,10 @@ var _typeof = require("@babel/runtime/helpers/typeof");
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.PlainJiraIssuesConfigModal = exports.JiraIssuesConfigModal = void 0;
8
+ exports.getColumnAction = exports.PlainJiraIssuesConfigModal = exports.JiraIssuesConfigModal = void 0;
9
9
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
10
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
10
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
11
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
12
12
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
13
13
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
14
14
  var _react = require("react");
@@ -19,6 +19,9 @@ var _standardButton = _interopRequireDefault(require("@atlaskit/button/standard-
19
19
  var _modalDialog = _interopRequireWildcard(require("@atlaskit/modal-dialog"));
20
20
  var _colors = require("@atlaskit/theme/colors");
21
21
  var _analytics = require("../../../analytics");
22
+ var _constants = require("../../../analytics/constants");
23
+ var _types = require("../../../analytics/types");
24
+ var _utils = require("../../../analytics/utils");
22
25
  var _useDatasourceTableState = require("../../../hooks/useDatasourceTableState");
23
26
  var _getAvailableJiraSites = require("../../../services/getAvailableJiraSites");
24
27
  var _accessRequired = require("../../common/error-state/access-required");
@@ -59,6 +62,29 @@ var issueCountStyles = (0, _react2.css)({
59
62
  var smartLinkContainerStyles = (0, _react2.css)({
60
63
  paddingLeft: '1px'
61
64
  });
65
+ var getDisplayValue = function getDisplayValue(currentViewMode, itemCount) {
66
+ if (currentViewMode === 'count') {
67
+ return _types.DatasourceDisplay.DATASOURCE_INLINE;
68
+ }
69
+ return itemCount > 1 ? _types.DatasourceDisplay.DATASOURCE_TABLE : _types.DatasourceDisplay.INLINE;
70
+ };
71
+
72
+ /**
73
+ * This method should be called when one atomic action is performed on columns: adding new item, removing one item, changing items order.
74
+ * The assumption is that since only one action is changed at each time, we don't have to verify the actual contents of the lists.
75
+ */
76
+ var getColumnAction = function getColumnAction(oldVisibleColumnKeys, newVisibleColumnKeys) {
77
+ var newColumnSize = newVisibleColumnKeys.length;
78
+ var oldColumnSize = oldVisibleColumnKeys.length;
79
+ if (newColumnSize > oldColumnSize) {
80
+ return _types.DatasourceAction.COLUMN_ADDED;
81
+ } else if (newColumnSize < oldColumnSize) {
82
+ return _types.DatasourceAction.COLUMN_REMOVED;
83
+ } else {
84
+ return _types.DatasourceAction.COLUMN_REORDERED;
85
+ }
86
+ };
87
+ exports.getColumnAction = getColumnAction;
62
88
  var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(props) {
63
89
  var datasourceId = props.datasourceId,
64
90
  initialParameters = props.parameters,
@@ -81,17 +107,22 @@ var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(props) {
81
107
  _useState8 = (0, _slicedToArray2.default)(_useState7, 2),
82
108
  jql = _useState8[0],
83
109
  setJql = _useState8[1];
84
- var isParametersSet = !!(jql && cloudId);
110
+ var _useState9 = (0, _react.useState)(initialVisibleColumnKeys),
111
+ _useState10 = (0, _slicedToArray2.default)(_useState9, 2),
112
+ visibleColumnKeys = _useState10[0],
113
+ setVisibleColumnKeys = _useState10[1];
114
+
115
+ // analytics related parameters
116
+ var searchCount = (0, _react.useRef)(0);
117
+ var userInteractionActions = (0, _react.useRef)(new Set());
118
+ var lastSearchMethodRef = (0, _react.useRef)(null);
85
119
  var parameters = (0, _react.useMemo)(function () {
86
120
  return !!cloudId ? {
87
121
  cloudId: cloudId,
88
122
  jql: jql || ''
89
123
  } : undefined;
90
124
  }, [cloudId, jql]);
91
- var _useState9 = (0, _react.useState)(initialVisibleColumnKeys),
92
- _useState10 = (0, _slicedToArray2.default)(_useState9, 2),
93
- visibleColumnKeys = _useState10[0],
94
- setVisibleColumnKeys = _useState10[1];
125
+ var isParametersSet = !!(jql && cloudId);
95
126
  var _useDatasourceTableSt = (0, _useDatasourceTableState.useDatasourceTableState)({
96
127
  datasourceId: datasourceId,
97
128
  parameters: isParametersSet ? parameters : undefined,
@@ -105,8 +136,10 @@ var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(props) {
105
136
  columns = _useDatasourceTableSt.columns,
106
137
  defaultVisibleColumnKeys = _useDatasourceTableSt.defaultVisibleColumnKeys,
107
138
  loadDatasourceDetails = _useDatasourceTableSt.loadDatasourceDetails,
108
- totalCount = _useDatasourceTableSt.totalCount;
109
- var lastSearchMethodRef = (0, _react.useRef)((0, _jiraSearchContainer.getInitialSearchMethod)(parameters === null || parameters === void 0 ? void 0 : parameters.jql));
139
+ totalCount = _useDatasourceTableSt.totalCount,
140
+ _useDatasourceTableSt2 = _useDatasourceTableSt.extensionKey,
141
+ extensionKey = _useDatasourceTableSt2 === void 0 ? null : _useDatasourceTableSt2,
142
+ destinationObjectTypes = _useDatasourceTableSt.destinationObjectTypes;
110
143
  var _useIntl = (0, _reactIntlNext.useIntl)(),
111
144
  formatMessage = _useIntl.formatMessage;
112
145
  var _useDatasourceAnalyti = (0, _analytics.useDatasourceAnalyticsEvents)(),
@@ -116,6 +149,13 @@ var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(props) {
116
149
  return jiraSite.cloudId === cloudId;
117
150
  }) || availableSites[0];
118
151
  }, [availableSites, cloudId]);
152
+ var buttonClickedAnalyticsPayload = (0, _react.useMemo)(function () {
153
+ return {
154
+ extensionKey: extensionKey,
155
+ destinationObjectTypes: destinationObjectTypes,
156
+ actions: userInteractionActions.current
157
+ };
158
+ }, [destinationObjectTypes, extensionKey]);
119
159
  var resolvedWithNoResults = status === 'resolved' && !responseItems.length;
120
160
  var jqlUrl = selectedJiraSite && jql && "".concat(selectedJiraSite.url, "/issues/?jql=").concat(encodeURI(jql));
121
161
  var isInsertDisabled = !isParametersSet || status === 'rejected' || status === 'unauthorized' || status === 'loading' || resolvedWithNoResults;
@@ -160,13 +200,28 @@ var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(props) {
160
200
  }
161
201
  }, [cloudId, selectedJiraSite]);
162
202
  var onSearch = (0, _react.useCallback)(function (newParameters, searchMethod) {
203
+ searchCount.current++;
163
204
  lastSearchMethodRef.current = searchMethod;
205
+ if (jql !== newParameters.jql) {
206
+ userInteractionActions.current.add(_types.DatasourceAction.QUERY_UPDATED);
207
+ }
164
208
  setJql(newParameters.jql);
165
209
  reset({
166
210
  shouldForceRequest: true
167
211
  });
168
- }, [reset]);
212
+ }, [jql, reset]);
213
+ var onCancelClick = (0, _react.useCallback)(function (e, analyticEvent) {
214
+ analyticEvent.update({
215
+ eventType: 'ui',
216
+ actionSubjectId: 'cancel',
217
+ attributes: _objectSpread(_objectSpread({}, buttonClickedAnalyticsPayload), {}, {
218
+ searchCount: searchCount.current
219
+ })
220
+ }).fire(_analytics.EVENT_CHANNEL);
221
+ onCancel();
222
+ }, [buttonClickedAnalyticsPayload, onCancel]);
169
223
  var onSiteSelection = (0, _react.useCallback)(function (site) {
224
+ userInteractionActions.current.add(_types.DatasourceAction.INSTANCE_UPDATED);
170
225
  setCloudId(site.cloudId);
171
226
  reset({
172
227
  shouldForceRequest: true
@@ -176,13 +231,25 @@ var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(props) {
176
231
  var _data$key, _data$key$data;
177
232
  var _responseItems = (0, _slicedToArray2.default)(responseItems, 1),
178
233
  data = _responseItems[0];
179
- // agrement with BE that we will use `key` for rendering smartlink
234
+ // agreement with BE that we will use `key` for rendering smartlink
180
235
  return data === null || data === void 0 ? void 0 : (_data$key = data.key) === null || _data$key === void 0 ? void 0 : (_data$key$data = _data$key.data) === null || _data$key$data === void 0 ? void 0 : _data$key$data.url;
181
236
  }, [responseItems]);
182
- var onInsertPressed = (0, _react.useCallback)(function () {
237
+ var onInsertPressed = (0, _react.useCallback)(function (e, analyticEvent) {
183
238
  if (!isParametersSet || !jql || !selectedJiraSite) {
184
239
  return;
185
240
  }
241
+ var insertButtonClickedEvent = analyticEvent.update({
242
+ actionSubjectId: 'insert',
243
+ attributes: _objectSpread(_objectSpread({}, buttonClickedAnalyticsPayload), {}, {
244
+ totalItemCount: totalCount || 0,
245
+ displayedColumnCount: (visibleColumnKeys === null || visibleColumnKeys === void 0 ? void 0 : visibleColumnKeys.length) || 0,
246
+ display: getDisplayValue(currentViewMode, totalCount || 0),
247
+ searchCount: searchCount.current,
248
+ searchMethod: (0, _utils.mapSearchMethod)(lastSearchMethodRef.current)
249
+ }),
250
+ eventType: 'ui'
251
+ });
252
+ insertButtonClickedEvent.fire(_analytics.EVENT_CHANNEL);
186
253
  var firstIssueUrl = retrieveUrlForSmartCardRender();
187
254
  if (currentViewMode === 'count') {
188
255
  onInsert({
@@ -224,10 +291,21 @@ var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(props) {
224
291
  }
225
292
  });
226
293
  }
227
- }, [isParametersSet, jql, jqlUrl, selectedJiraSite, retrieveUrlForSmartCardRender, currentViewMode, responseItems.length, onInsert, datasourceId, cloudId, visibleColumnKeys]);
294
+ }, [isParametersSet, jql, selectedJiraSite, buttonClickedAnalyticsPayload, totalCount, visibleColumnKeys, currentViewMode, retrieveUrlForSmartCardRender, responseItems.length, onInsert, jqlUrl, datasourceId, cloudId]);
228
295
  var handleViewModeChange = function handleViewModeChange(selectedMode) {
296
+ userInteractionActions.current.add(_types.DatasourceAction.DISPLAY_VIEW_CHANGED);
229
297
  setCurrentViewMode(selectedMode);
230
298
  };
299
+ var handleOnNextPage = (0, _react.useCallback)(function () {
300
+ userInteractionActions.current.add(_types.DatasourceAction.NEXT_PAGE_SCROLLED);
301
+ onNextPage();
302
+ }, [onNextPage]);
303
+ var handleVisibleColumnKeysChange = (0, _react.useCallback)(function () {
304
+ var newVisibleColumnKeys = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
305
+ var columnAction = getColumnAction(visibleColumnKeys || [], newVisibleColumnKeys);
306
+ userInteractionActions.current.add(columnAction);
307
+ setVisibleColumnKeys(newVisibleColumnKeys);
308
+ }, [visibleColumnKeys]);
231
309
  var issueLikeDataTableView = (0, _react.useMemo)(function () {
232
310
  return (0, _react2.jsx)("div", {
233
311
  css: contentContainerStyles
@@ -238,11 +316,11 @@ var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(props) {
238
316
  items: responseItems,
239
317
  hasNextPage: hasNextPage,
240
318
  visibleColumnKeys: visibleColumnKeys || defaultVisibleColumnKeys,
241
- onNextPage: onNextPage,
319
+ onNextPage: handleOnNextPage,
242
320
  onLoadDatasourceDetails: loadDatasourceDetails,
243
- onVisibleColumnKeysChange: setVisibleColumnKeys
321
+ onVisibleColumnKeysChange: handleVisibleColumnKeysChange
244
322
  }));
245
- }, [columns, defaultVisibleColumnKeys, hasNextPage, loadDatasourceDetails, onNextPage, responseItems, status, visibleColumnKeys]);
323
+ }, [columns, defaultVisibleColumnKeys, hasNextPage, handleVisibleColumnKeysChange, loadDatasourceDetails, handleOnNextPage, responseItems, status, visibleColumnKeys]);
246
324
  var renderCountModeContent = (0, _react.useCallback)(function () {
247
325
  var url = selectedJiraSite === null || selectedJiraSite === void 0 ? void 0 : selectedJiraSite.url;
248
326
  if (status === 'unauthorized') {
@@ -336,7 +414,7 @@ var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(props) {
336
414
  }
337
415
  }))), (0, _react2.jsx)(_standardButton.default, {
338
416
  appearance: "default",
339
- onClick: onCancel
417
+ onClick: onCancelClick
340
418
  }, (0, _react2.jsx)(_reactIntlNext.FormattedMessage, _messages.modalMessages.cancelButtonText)), (0, _react2.jsx)(_standardButton.default, {
341
419
  appearance: "primary",
342
420
  onClick: onInsertPressed,
@@ -348,11 +426,9 @@ exports.PlainJiraIssuesConfigModal = PlainJiraIssuesConfigModal;
348
426
  var analyticsContextAttributes = {
349
427
  dataProvider: 'jira-issues'
350
428
  };
351
- var analyticsContextData = {
352
- packageName: "@atlaskit/link-datasource",
353
- packageVersion: "1.0.16",
429
+ var analyticsContextData = _objectSpread(_objectSpread({}, _constants.packageMetaData), {}, {
354
430
  source: 'datasourceConfigModal'
355
- };
431
+ });
356
432
  var contextData = _objectSpread(_objectSpread({}, analyticsContextData), {}, {
357
433
  attributes: _objectSpread({}, analyticsContextAttributes)
358
434
  });
@@ -1 +1,5 @@
1
- export const EVENT_CHANNEL = 'media';
1
+ export const EVENT_CHANNEL = 'media';
2
+ export const packageMetaData = {
3
+ packageName: "@atlaskit/link-datasource",
4
+ packageVersion: "1.0.18"
5
+ };
@@ -0,0 +1,21 @@
1
+ export let DatasourceAction = /*#__PURE__*/function (DatasourceAction) {
2
+ DatasourceAction["COLUMN_ADDED"] = "column added";
3
+ DatasourceAction["COLUMN_REMOVED"] = "column removed";
4
+ DatasourceAction["COLUMN_REORDERED"] = "column reordered";
5
+ DatasourceAction["INSTANCE_UPDATED"] = "instance updated";
6
+ DatasourceAction["QUERY_UPDATED"] = "query updated";
7
+ DatasourceAction["DISPLAY_VIEW_CHANGED"] = "display view changed";
8
+ DatasourceAction["NEXT_PAGE_SCROLLED"] = "next page scrolled";
9
+ return DatasourceAction;
10
+ }({});
11
+ export let DatasourceDisplay = /*#__PURE__*/function (DatasourceDisplay) {
12
+ DatasourceDisplay["DATASOURCE_TABLE"] = "datasource_table";
13
+ DatasourceDisplay["DATASOURCE_INLINE"] = "datasource_inline";
14
+ DatasourceDisplay["INLINE"] = "inline";
15
+ return DatasourceDisplay;
16
+ }({});
17
+ export let DatasourceSearchMethod = /*#__PURE__*/function (DatasourceSearchMethod) {
18
+ DatasourceSearchMethod["DATASOURCE_BASIC_FILTER"] = "datasource_basic_filter";
19
+ DatasourceSearchMethod["DATASOURCE_SEARCH_QUERY"] = "datasource_search_query";
20
+ return DatasourceSearchMethod;
21
+ }({});
@@ -1,10 +1,11 @@
1
+ import { DatasourceSearchMethod } from './types';
1
2
  export const mapSearchMethod = searchMethod => {
2
3
  switch (searchMethod) {
3
4
  case 'basic':
4
- return 'datasource_basic_filter';
5
+ return DatasourceSearchMethod.DATASOURCE_BASIC_FILTER;
5
6
  case 'jql':
6
- return 'datasource_search_query';
7
+ return DatasourceSearchMethod.DATASOURCE_SEARCH_QUERY;
7
8
  default:
8
- return 'unknown';
9
+ return null;
9
10
  }
10
11
  };
@@ -193,7 +193,7 @@ const PlainAssetsConfigModal = props => {
193
193
  appearance: "primary",
194
194
  onClick: onInsertPressed,
195
195
  isDisabled: isDisabled,
196
- testId: 'asset-datasource-modal--insert-button'
196
+ testId: 'assets-datasource-modal--insert-button'
197
197
  }, jsx(FormattedMessage, _extends({}, modalMessages.insertIssuesButtonText, {
198
198
  values: {
199
199
  objectsCount: responseItems.length
@@ -205,7 +205,7 @@ const analyticsContextAttributes = {
205
205
  };
206
206
  const analyticsContextData = {
207
207
  packageName: "@atlaskit/link-datasource",
208
- packageVersion: "1.0.16",
208
+ packageVersion: "1.0.18",
209
209
  source: 'datasourceConfigModal'
210
210
  };
211
211
  const contextData = {
@@ -3,6 +3,7 @@ import { useCallback, useEffect, useRef } from 'react';
3
3
  import { jsx } from '@emotion/react';
4
4
  import { withAnalyticsContext } from '@atlaskit/analytics-next';
5
5
  import { useDatasourceAnalyticsEvents } from '../../analytics';
6
+ import { packageMetaData } from '../../analytics/constants';
6
7
  import { useDatasourceTableState } from '../../hooks/useDatasourceTableState';
7
8
  import { AccessRequired } from '../common/error-state/access-required';
8
9
  import { LoadingError } from '../common/error-state/loading-error';
@@ -102,8 +103,4 @@ const DatasourceTableViewWithoutAnalytics = ({
102
103
  }))
103
104
  );
104
105
  };
105
- const analyticsContextData = {
106
- packageName: "@atlaskit/link-datasource",
107
- packageVersion: "1.0.16"
108
- };
109
- export const DatasourceTableView = withAnalyticsContext(analyticsContextData)(DatasourceTableViewWithoutAnalytics);
106
+ export const DatasourceTableView = withAnalyticsContext(packageMetaData)(DatasourceTableViewWithoutAnalytics);
@@ -7,7 +7,10 @@ import { withAnalyticsContext } from '@atlaskit/analytics-next';
7
7
  import Button from '@atlaskit/button/standard-button';
8
8
  import Modal, { ModalBody, ModalFooter, ModalHeader, ModalTitle, ModalTransition } from '@atlaskit/modal-dialog';
9
9
  import { B400, N0, N40, N800 } from '@atlaskit/theme/colors';
10
- import { useDatasourceAnalyticsEvents } from '../../../analytics';
10
+ import { EVENT_CHANNEL, useDatasourceAnalyticsEvents } from '../../../analytics';
11
+ import { packageMetaData } from '../../../analytics/constants';
12
+ import { DatasourceAction, DatasourceDisplay } from '../../../analytics/types';
13
+ import { mapSearchMethod } from '../../../analytics/utils';
11
14
  import { useDatasourceTableState } from '../../../hooks/useDatasourceTableState';
12
15
  import { getAvailableJiraSites } from '../../../services/getAvailableJiraSites';
13
16
  import { AccessRequired } from '../../common/error-state/access-required';
@@ -15,7 +18,7 @@ import { ModalLoadingError } from '../../common/error-state/modal-loading-error'
15
18
  import { NoResults } from '../../common/error-state/no-results';
16
19
  import { EmptyState, IssueLikeDataTableView } from '../../issue-like-table';
17
20
  import LinkRenderType from '../../issue-like-table/render-type/link';
18
- import { getInitialSearchMethod, JiraSearchContainer } from '../jira-search-container';
21
+ import { JiraSearchContainer } from '../jira-search-container';
19
22
  import { ModeSwitcher } from '../mode-switcher';
20
23
  import { JiraSiteSelector } from '../site-selector';
21
24
  import { modalMessages } from './messages';
@@ -44,6 +47,28 @@ const issueCountStyles = css({
44
47
  const smartLinkContainerStyles = css({
45
48
  paddingLeft: '1px'
46
49
  });
50
+ const getDisplayValue = (currentViewMode, itemCount) => {
51
+ if (currentViewMode === 'count') {
52
+ return DatasourceDisplay.DATASOURCE_INLINE;
53
+ }
54
+ return itemCount > 1 ? DatasourceDisplay.DATASOURCE_TABLE : DatasourceDisplay.INLINE;
55
+ };
56
+
57
+ /**
58
+ * This method should be called when one atomic action is performed on columns: adding new item, removing one item, changing items order.
59
+ * The assumption is that since only one action is changed at each time, we don't have to verify the actual contents of the lists.
60
+ */
61
+ export const getColumnAction = (oldVisibleColumnKeys, newVisibleColumnKeys) => {
62
+ const newColumnSize = newVisibleColumnKeys.length;
63
+ const oldColumnSize = oldVisibleColumnKeys.length;
64
+ if (newColumnSize > oldColumnSize) {
65
+ return DatasourceAction.COLUMN_ADDED;
66
+ } else if (newColumnSize < oldColumnSize) {
67
+ return DatasourceAction.COLUMN_REMOVED;
68
+ } else {
69
+ return DatasourceAction.COLUMN_REORDERED;
70
+ }
71
+ };
47
72
  export const PlainJiraIssuesConfigModal = props => {
48
73
  const {
49
74
  datasourceId,
@@ -56,12 +81,17 @@ export const PlainJiraIssuesConfigModal = props => {
56
81
  const [currentViewMode, setCurrentViewMode] = useState('issue');
57
82
  const [cloudId, setCloudId] = useState(initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.cloudId);
58
83
  const [jql, setJql] = useState(initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.jql);
59
- const isParametersSet = !!(jql && cloudId);
84
+ const [visibleColumnKeys, setVisibleColumnKeys] = useState(initialVisibleColumnKeys);
85
+
86
+ // analytics related parameters
87
+ const searchCount = useRef(0);
88
+ const userInteractionActions = useRef(new Set());
89
+ const lastSearchMethodRef = useRef(null);
60
90
  const parameters = useMemo(() => !!cloudId ? {
61
91
  cloudId,
62
92
  jql: jql || ''
63
93
  } : undefined, [cloudId, jql]);
64
- const [visibleColumnKeys, setVisibleColumnKeys] = useState(initialVisibleColumnKeys);
94
+ const isParametersSet = !!(jql && cloudId);
65
95
  const {
66
96
  reset,
67
97
  status,
@@ -71,13 +101,14 @@ export const PlainJiraIssuesConfigModal = props => {
71
101
  columns,
72
102
  defaultVisibleColumnKeys,
73
103
  loadDatasourceDetails,
74
- totalCount
104
+ totalCount,
105
+ extensionKey = null,
106
+ destinationObjectTypes
75
107
  } = useDatasourceTableState({
76
108
  datasourceId,
77
109
  parameters: isParametersSet ? parameters : undefined,
78
110
  fieldKeys: visibleColumnKeys
79
111
  });
80
- const lastSearchMethodRef = useRef(getInitialSearchMethod(parameters === null || parameters === void 0 ? void 0 : parameters.jql));
81
112
  const {
82
113
  formatMessage
83
114
  } = useIntl();
@@ -85,6 +116,13 @@ export const PlainJiraIssuesConfigModal = props => {
85
116
  fireEvent
86
117
  } = useDatasourceAnalyticsEvents();
87
118
  const selectedJiraSite = useMemo(() => availableSites.find(jiraSite => jiraSite.cloudId === cloudId) || availableSites[0], [availableSites, cloudId]);
119
+ const buttonClickedAnalyticsPayload = useMemo(() => {
120
+ return {
121
+ extensionKey: extensionKey,
122
+ destinationObjectTypes: destinationObjectTypes,
123
+ actions: userInteractionActions.current
124
+ };
125
+ }, [destinationObjectTypes, extensionKey]);
88
126
  const resolvedWithNoResults = status === 'resolved' && !responseItems.length;
89
127
  const jqlUrl = selectedJiraSite && jql && `${selectedJiraSite.url}/issues/?jql=${encodeURI(jql)}`;
90
128
  const isInsertDisabled = !isParametersSet || status === 'rejected' || status === 'unauthorized' || status === 'loading' || resolvedWithNoResults;
@@ -112,13 +150,29 @@ export const PlainJiraIssuesConfigModal = props => {
112
150
  }
113
151
  }, [cloudId, selectedJiraSite]);
114
152
  const onSearch = useCallback((newParameters, searchMethod) => {
153
+ searchCount.current++;
115
154
  lastSearchMethodRef.current = searchMethod;
155
+ if (jql !== newParameters.jql) {
156
+ userInteractionActions.current.add(DatasourceAction.QUERY_UPDATED);
157
+ }
116
158
  setJql(newParameters.jql);
117
159
  reset({
118
160
  shouldForceRequest: true
119
161
  });
120
- }, [reset]);
162
+ }, [jql, reset]);
163
+ const onCancelClick = useCallback((e, analyticEvent) => {
164
+ analyticEvent.update({
165
+ eventType: 'ui',
166
+ actionSubjectId: 'cancel',
167
+ attributes: {
168
+ ...buttonClickedAnalyticsPayload,
169
+ searchCount: searchCount.current
170
+ }
171
+ }).fire(EVENT_CHANNEL);
172
+ onCancel();
173
+ }, [buttonClickedAnalyticsPayload, onCancel]);
121
174
  const onSiteSelection = useCallback(site => {
175
+ userInteractionActions.current.add(DatasourceAction.INSTANCE_UPDATED);
122
176
  setCloudId(site.cloudId);
123
177
  reset({
124
178
  shouldForceRequest: true
@@ -127,13 +181,26 @@ export const PlainJiraIssuesConfigModal = props => {
127
181
  const retrieveUrlForSmartCardRender = useCallback(() => {
128
182
  var _data$key, _data$key$data;
129
183
  const [data] = responseItems;
130
- // agrement with BE that we will use `key` for rendering smartlink
184
+ // agreement with BE that we will use `key` for rendering smartlink
131
185
  return data === null || data === void 0 ? void 0 : (_data$key = data.key) === null || _data$key === void 0 ? void 0 : (_data$key$data = _data$key.data) === null || _data$key$data === void 0 ? void 0 : _data$key$data.url;
132
186
  }, [responseItems]);
133
- const onInsertPressed = useCallback(() => {
187
+ const onInsertPressed = useCallback((e, analyticEvent) => {
134
188
  if (!isParametersSet || !jql || !selectedJiraSite) {
135
189
  return;
136
190
  }
191
+ const insertButtonClickedEvent = analyticEvent.update({
192
+ actionSubjectId: 'insert',
193
+ attributes: {
194
+ ...buttonClickedAnalyticsPayload,
195
+ totalItemCount: totalCount || 0,
196
+ displayedColumnCount: (visibleColumnKeys === null || visibleColumnKeys === void 0 ? void 0 : visibleColumnKeys.length) || 0,
197
+ display: getDisplayValue(currentViewMode, totalCount || 0),
198
+ searchCount: searchCount.current,
199
+ searchMethod: mapSearchMethod(lastSearchMethodRef.current)
200
+ },
201
+ eventType: 'ui'
202
+ });
203
+ insertButtonClickedEvent.fire(EVENT_CHANNEL);
137
204
  const firstIssueUrl = retrieveUrlForSmartCardRender();
138
205
  if (currentViewMode === 'count') {
139
206
  onInsert({
@@ -173,10 +240,20 @@ export const PlainJiraIssuesConfigModal = props => {
173
240
  }
174
241
  });
175
242
  }
176
- }, [isParametersSet, jql, jqlUrl, selectedJiraSite, retrieveUrlForSmartCardRender, currentViewMode, responseItems.length, onInsert, datasourceId, cloudId, visibleColumnKeys]);
243
+ }, [isParametersSet, jql, selectedJiraSite, buttonClickedAnalyticsPayload, totalCount, visibleColumnKeys, currentViewMode, retrieveUrlForSmartCardRender, responseItems.length, onInsert, jqlUrl, datasourceId, cloudId]);
177
244
  const handleViewModeChange = selectedMode => {
245
+ userInteractionActions.current.add(DatasourceAction.DISPLAY_VIEW_CHANGED);
178
246
  setCurrentViewMode(selectedMode);
179
247
  };
248
+ const handleOnNextPage = useCallback(() => {
249
+ userInteractionActions.current.add(DatasourceAction.NEXT_PAGE_SCROLLED);
250
+ onNextPage();
251
+ }, [onNextPage]);
252
+ const handleVisibleColumnKeysChange = useCallback((newVisibleColumnKeys = []) => {
253
+ const columnAction = getColumnAction(visibleColumnKeys || [], newVisibleColumnKeys);
254
+ userInteractionActions.current.add(columnAction);
255
+ setVisibleColumnKeys(newVisibleColumnKeys);
256
+ }, [visibleColumnKeys]);
180
257
  const issueLikeDataTableView = useMemo(() => jsx("div", {
181
258
  css: contentContainerStyles
182
259
  }, jsx(IssueLikeDataTableView, {
@@ -186,10 +263,10 @@ export const PlainJiraIssuesConfigModal = props => {
186
263
  items: responseItems,
187
264
  hasNextPage: hasNextPage,
188
265
  visibleColumnKeys: visibleColumnKeys || defaultVisibleColumnKeys,
189
- onNextPage: onNextPage,
266
+ onNextPage: handleOnNextPage,
190
267
  onLoadDatasourceDetails: loadDatasourceDetails,
191
- onVisibleColumnKeysChange: setVisibleColumnKeys
192
- })), [columns, defaultVisibleColumnKeys, hasNextPage, loadDatasourceDetails, onNextPage, responseItems, status, visibleColumnKeys]);
268
+ onVisibleColumnKeysChange: handleVisibleColumnKeysChange
269
+ })), [columns, defaultVisibleColumnKeys, hasNextPage, handleVisibleColumnKeysChange, loadDatasourceDetails, handleOnNextPage, responseItems, status, visibleColumnKeys]);
193
270
  const renderCountModeContent = useCallback(() => {
194
271
  const url = selectedJiraSite === null || selectedJiraSite === void 0 ? void 0 : selectedJiraSite.url;
195
272
  if (status === 'unauthorized') {
@@ -283,7 +360,7 @@ export const PlainJiraIssuesConfigModal = props => {
283
360
  }
284
361
  }))), jsx(Button, {
285
362
  appearance: "default",
286
- onClick: onCancel
363
+ onClick: onCancelClick
287
364
  }, jsx(FormattedMessage, modalMessages.cancelButtonText)), jsx(Button, {
288
365
  appearance: "primary",
289
366
  onClick: onInsertPressed,
@@ -295,8 +372,7 @@ const analyticsContextAttributes = {
295
372
  dataProvider: 'jira-issues'
296
373
  };
297
374
  const analyticsContextData = {
298
- packageName: "@atlaskit/link-datasource",
299
- packageVersion: "1.0.16",
375
+ ...packageMetaData,
300
376
  source: 'datasourceConfigModal'
301
377
  };
302
378
  const contextData = {
@@ -1 +1,5 @@
1
- export var EVENT_CHANNEL = 'media';
1
+ export var EVENT_CHANNEL = 'media';
2
+ export var packageMetaData = {
3
+ packageName: "@atlaskit/link-datasource",
4
+ packageVersion: "1.0.18"
5
+ };
@@ -0,0 +1,21 @@
1
+ export var DatasourceAction = /*#__PURE__*/function (DatasourceAction) {
2
+ DatasourceAction["COLUMN_ADDED"] = "column added";
3
+ DatasourceAction["COLUMN_REMOVED"] = "column removed";
4
+ DatasourceAction["COLUMN_REORDERED"] = "column reordered";
5
+ DatasourceAction["INSTANCE_UPDATED"] = "instance updated";
6
+ DatasourceAction["QUERY_UPDATED"] = "query updated";
7
+ DatasourceAction["DISPLAY_VIEW_CHANGED"] = "display view changed";
8
+ DatasourceAction["NEXT_PAGE_SCROLLED"] = "next page scrolled";
9
+ return DatasourceAction;
10
+ }({});
11
+ export var DatasourceDisplay = /*#__PURE__*/function (DatasourceDisplay) {
12
+ DatasourceDisplay["DATASOURCE_TABLE"] = "datasource_table";
13
+ DatasourceDisplay["DATASOURCE_INLINE"] = "datasource_inline";
14
+ DatasourceDisplay["INLINE"] = "inline";
15
+ return DatasourceDisplay;
16
+ }({});
17
+ export var DatasourceSearchMethod = /*#__PURE__*/function (DatasourceSearchMethod) {
18
+ DatasourceSearchMethod["DATASOURCE_BASIC_FILTER"] = "datasource_basic_filter";
19
+ DatasourceSearchMethod["DATASOURCE_SEARCH_QUERY"] = "datasource_search_query";
20
+ return DatasourceSearchMethod;
21
+ }({});
@@ -1,10 +1,11 @@
1
+ import { DatasourceSearchMethod } from './types';
1
2
  export var mapSearchMethod = function mapSearchMethod(searchMethod) {
2
3
  switch (searchMethod) {
3
4
  case 'basic':
4
- return 'datasource_basic_filter';
5
+ return DatasourceSearchMethod.DATASOURCE_BASIC_FILTER;
5
6
  case 'jql':
6
- return 'datasource_search_query';
7
+ return DatasourceSearchMethod.DATASOURCE_SEARCH_QUERY;
7
8
  default:
8
- return 'unknown';
9
+ return null;
9
10
  }
10
11
  };
@@ -210,7 +210,7 @@ var PlainAssetsConfigModal = function PlainAssetsConfigModal(props) {
210
210
  appearance: "primary",
211
211
  onClick: onInsertPressed,
212
212
  isDisabled: isDisabled,
213
- testId: 'asset-datasource-modal--insert-button'
213
+ testId: 'assets-datasource-modal--insert-button'
214
214
  }, jsx(FormattedMessage, _extends({}, modalMessages.insertIssuesButtonText, {
215
215
  values: {
216
216
  objectsCount: responseItems.length
@@ -222,7 +222,7 @@ var analyticsContextAttributes = {
222
222
  };
223
223
  var analyticsContextData = {
224
224
  packageName: "@atlaskit/link-datasource",
225
- packageVersion: "1.0.16",
225
+ packageVersion: "1.0.18",
226
226
  source: 'datasourceConfigModal'
227
227
  };
228
228
  var contextData = _objectSpread(_objectSpread({}, analyticsContextData), {}, {
@@ -3,6 +3,7 @@ import { useCallback, useEffect, useRef } from 'react';
3
3
  import { jsx } from '@emotion/react';
4
4
  import { withAnalyticsContext } from '@atlaskit/analytics-next';
5
5
  import { useDatasourceAnalyticsEvents } from '../../analytics';
6
+ import { packageMetaData } from '../../analytics/constants';
6
7
  import { useDatasourceTableState } from '../../hooks/useDatasourceTableState';
7
8
  import { AccessRequired } from '../common/error-state/access-required';
8
9
  import { LoadingError } from '../common/error-state/loading-error';
@@ -100,8 +101,4 @@ var DatasourceTableViewWithoutAnalytics = function DatasourceTableViewWithoutAna
100
101
  }))
101
102
  );
102
103
  };
103
- var analyticsContextData = {
104
- packageName: "@atlaskit/link-datasource",
105
- packageVersion: "1.0.16"
106
- };
107
- export var DatasourceTableView = withAnalyticsContext(analyticsContextData)(DatasourceTableViewWithoutAnalytics);
104
+ export var DatasourceTableView = withAnalyticsContext(packageMetaData)(DatasourceTableViewWithoutAnalytics);
@@ -1,5 +1,5 @@
1
- import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
1
  import _extends from "@babel/runtime/helpers/extends";
2
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
3
  import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
4
4
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
5
5
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
@@ -13,7 +13,10 @@ import { withAnalyticsContext } from '@atlaskit/analytics-next';
13
13
  import Button from '@atlaskit/button/standard-button';
14
14
  import Modal, { ModalBody, ModalFooter, ModalHeader, ModalTitle, ModalTransition } from '@atlaskit/modal-dialog';
15
15
  import { B400, N0, N40, N800 } from '@atlaskit/theme/colors';
16
- import { useDatasourceAnalyticsEvents } from '../../../analytics';
16
+ import { EVENT_CHANNEL, useDatasourceAnalyticsEvents } from '../../../analytics';
17
+ import { packageMetaData } from '../../../analytics/constants';
18
+ import { DatasourceAction, DatasourceDisplay } from '../../../analytics/types';
19
+ import { mapSearchMethod } from '../../../analytics/utils';
17
20
  import { useDatasourceTableState } from '../../../hooks/useDatasourceTableState';
18
21
  import { getAvailableJiraSites } from '../../../services/getAvailableJiraSites';
19
22
  import { AccessRequired } from '../../common/error-state/access-required';
@@ -21,7 +24,7 @@ import { ModalLoadingError } from '../../common/error-state/modal-loading-error'
21
24
  import { NoResults } from '../../common/error-state/no-results';
22
25
  import { EmptyState, IssueLikeDataTableView } from '../../issue-like-table';
23
26
  import LinkRenderType from '../../issue-like-table/render-type/link';
24
- import { getInitialSearchMethod, JiraSearchContainer } from '../jira-search-container';
27
+ import { JiraSearchContainer } from '../jira-search-container';
25
28
  import { ModeSwitcher } from '../mode-switcher';
26
29
  import { JiraSiteSelector } from '../site-selector';
27
30
  import { modalMessages } from './messages';
@@ -50,6 +53,28 @@ var issueCountStyles = css({
50
53
  var smartLinkContainerStyles = css({
51
54
  paddingLeft: '1px'
52
55
  });
56
+ var getDisplayValue = function getDisplayValue(currentViewMode, itemCount) {
57
+ if (currentViewMode === 'count') {
58
+ return DatasourceDisplay.DATASOURCE_INLINE;
59
+ }
60
+ return itemCount > 1 ? DatasourceDisplay.DATASOURCE_TABLE : DatasourceDisplay.INLINE;
61
+ };
62
+
63
+ /**
64
+ * This method should be called when one atomic action is performed on columns: adding new item, removing one item, changing items order.
65
+ * The assumption is that since only one action is changed at each time, we don't have to verify the actual contents of the lists.
66
+ */
67
+ export var getColumnAction = function getColumnAction(oldVisibleColumnKeys, newVisibleColumnKeys) {
68
+ var newColumnSize = newVisibleColumnKeys.length;
69
+ var oldColumnSize = oldVisibleColumnKeys.length;
70
+ if (newColumnSize > oldColumnSize) {
71
+ return DatasourceAction.COLUMN_ADDED;
72
+ } else if (newColumnSize < oldColumnSize) {
73
+ return DatasourceAction.COLUMN_REMOVED;
74
+ } else {
75
+ return DatasourceAction.COLUMN_REORDERED;
76
+ }
77
+ };
53
78
  export var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(props) {
54
79
  var datasourceId = props.datasourceId,
55
80
  initialParameters = props.parameters,
@@ -72,17 +97,22 @@ export var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(prop
72
97
  _useState8 = _slicedToArray(_useState7, 2),
73
98
  jql = _useState8[0],
74
99
  setJql = _useState8[1];
75
- var isParametersSet = !!(jql && cloudId);
100
+ var _useState9 = useState(initialVisibleColumnKeys),
101
+ _useState10 = _slicedToArray(_useState9, 2),
102
+ visibleColumnKeys = _useState10[0],
103
+ setVisibleColumnKeys = _useState10[1];
104
+
105
+ // analytics related parameters
106
+ var searchCount = useRef(0);
107
+ var userInteractionActions = useRef(new Set());
108
+ var lastSearchMethodRef = useRef(null);
76
109
  var parameters = useMemo(function () {
77
110
  return !!cloudId ? {
78
111
  cloudId: cloudId,
79
112
  jql: jql || ''
80
113
  } : undefined;
81
114
  }, [cloudId, jql]);
82
- var _useState9 = useState(initialVisibleColumnKeys),
83
- _useState10 = _slicedToArray(_useState9, 2),
84
- visibleColumnKeys = _useState10[0],
85
- setVisibleColumnKeys = _useState10[1];
115
+ var isParametersSet = !!(jql && cloudId);
86
116
  var _useDatasourceTableSt = useDatasourceTableState({
87
117
  datasourceId: datasourceId,
88
118
  parameters: isParametersSet ? parameters : undefined,
@@ -96,8 +126,10 @@ export var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(prop
96
126
  columns = _useDatasourceTableSt.columns,
97
127
  defaultVisibleColumnKeys = _useDatasourceTableSt.defaultVisibleColumnKeys,
98
128
  loadDatasourceDetails = _useDatasourceTableSt.loadDatasourceDetails,
99
- totalCount = _useDatasourceTableSt.totalCount;
100
- var lastSearchMethodRef = useRef(getInitialSearchMethod(parameters === null || parameters === void 0 ? void 0 : parameters.jql));
129
+ totalCount = _useDatasourceTableSt.totalCount,
130
+ _useDatasourceTableSt2 = _useDatasourceTableSt.extensionKey,
131
+ extensionKey = _useDatasourceTableSt2 === void 0 ? null : _useDatasourceTableSt2,
132
+ destinationObjectTypes = _useDatasourceTableSt.destinationObjectTypes;
101
133
  var _useIntl = useIntl(),
102
134
  formatMessage = _useIntl.formatMessage;
103
135
  var _useDatasourceAnalyti = useDatasourceAnalyticsEvents(),
@@ -107,6 +139,13 @@ export var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(prop
107
139
  return jiraSite.cloudId === cloudId;
108
140
  }) || availableSites[0];
109
141
  }, [availableSites, cloudId]);
142
+ var buttonClickedAnalyticsPayload = useMemo(function () {
143
+ return {
144
+ extensionKey: extensionKey,
145
+ destinationObjectTypes: destinationObjectTypes,
146
+ actions: userInteractionActions.current
147
+ };
148
+ }, [destinationObjectTypes, extensionKey]);
110
149
  var resolvedWithNoResults = status === 'resolved' && !responseItems.length;
111
150
  var jqlUrl = selectedJiraSite && jql && "".concat(selectedJiraSite.url, "/issues/?jql=").concat(encodeURI(jql));
112
151
  var isInsertDisabled = !isParametersSet || status === 'rejected' || status === 'unauthorized' || status === 'loading' || resolvedWithNoResults;
@@ -151,13 +190,28 @@ export var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(prop
151
190
  }
152
191
  }, [cloudId, selectedJiraSite]);
153
192
  var onSearch = useCallback(function (newParameters, searchMethod) {
193
+ searchCount.current++;
154
194
  lastSearchMethodRef.current = searchMethod;
195
+ if (jql !== newParameters.jql) {
196
+ userInteractionActions.current.add(DatasourceAction.QUERY_UPDATED);
197
+ }
155
198
  setJql(newParameters.jql);
156
199
  reset({
157
200
  shouldForceRequest: true
158
201
  });
159
- }, [reset]);
202
+ }, [jql, reset]);
203
+ var onCancelClick = useCallback(function (e, analyticEvent) {
204
+ analyticEvent.update({
205
+ eventType: 'ui',
206
+ actionSubjectId: 'cancel',
207
+ attributes: _objectSpread(_objectSpread({}, buttonClickedAnalyticsPayload), {}, {
208
+ searchCount: searchCount.current
209
+ })
210
+ }).fire(EVENT_CHANNEL);
211
+ onCancel();
212
+ }, [buttonClickedAnalyticsPayload, onCancel]);
160
213
  var onSiteSelection = useCallback(function (site) {
214
+ userInteractionActions.current.add(DatasourceAction.INSTANCE_UPDATED);
161
215
  setCloudId(site.cloudId);
162
216
  reset({
163
217
  shouldForceRequest: true
@@ -167,13 +221,25 @@ export var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(prop
167
221
  var _data$key, _data$key$data;
168
222
  var _responseItems = _slicedToArray(responseItems, 1),
169
223
  data = _responseItems[0];
170
- // agrement with BE that we will use `key` for rendering smartlink
224
+ // agreement with BE that we will use `key` for rendering smartlink
171
225
  return data === null || data === void 0 ? void 0 : (_data$key = data.key) === null || _data$key === void 0 ? void 0 : (_data$key$data = _data$key.data) === null || _data$key$data === void 0 ? void 0 : _data$key$data.url;
172
226
  }, [responseItems]);
173
- var onInsertPressed = useCallback(function () {
227
+ var onInsertPressed = useCallback(function (e, analyticEvent) {
174
228
  if (!isParametersSet || !jql || !selectedJiraSite) {
175
229
  return;
176
230
  }
231
+ var insertButtonClickedEvent = analyticEvent.update({
232
+ actionSubjectId: 'insert',
233
+ attributes: _objectSpread(_objectSpread({}, buttonClickedAnalyticsPayload), {}, {
234
+ totalItemCount: totalCount || 0,
235
+ displayedColumnCount: (visibleColumnKeys === null || visibleColumnKeys === void 0 ? void 0 : visibleColumnKeys.length) || 0,
236
+ display: getDisplayValue(currentViewMode, totalCount || 0),
237
+ searchCount: searchCount.current,
238
+ searchMethod: mapSearchMethod(lastSearchMethodRef.current)
239
+ }),
240
+ eventType: 'ui'
241
+ });
242
+ insertButtonClickedEvent.fire(EVENT_CHANNEL);
177
243
  var firstIssueUrl = retrieveUrlForSmartCardRender();
178
244
  if (currentViewMode === 'count') {
179
245
  onInsert({
@@ -215,10 +281,21 @@ export var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(prop
215
281
  }
216
282
  });
217
283
  }
218
- }, [isParametersSet, jql, jqlUrl, selectedJiraSite, retrieveUrlForSmartCardRender, currentViewMode, responseItems.length, onInsert, datasourceId, cloudId, visibleColumnKeys]);
284
+ }, [isParametersSet, jql, selectedJiraSite, buttonClickedAnalyticsPayload, totalCount, visibleColumnKeys, currentViewMode, retrieveUrlForSmartCardRender, responseItems.length, onInsert, jqlUrl, datasourceId, cloudId]);
219
285
  var handleViewModeChange = function handleViewModeChange(selectedMode) {
286
+ userInteractionActions.current.add(DatasourceAction.DISPLAY_VIEW_CHANGED);
220
287
  setCurrentViewMode(selectedMode);
221
288
  };
289
+ var handleOnNextPage = useCallback(function () {
290
+ userInteractionActions.current.add(DatasourceAction.NEXT_PAGE_SCROLLED);
291
+ onNextPage();
292
+ }, [onNextPage]);
293
+ var handleVisibleColumnKeysChange = useCallback(function () {
294
+ var newVisibleColumnKeys = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
295
+ var columnAction = getColumnAction(visibleColumnKeys || [], newVisibleColumnKeys);
296
+ userInteractionActions.current.add(columnAction);
297
+ setVisibleColumnKeys(newVisibleColumnKeys);
298
+ }, [visibleColumnKeys]);
222
299
  var issueLikeDataTableView = useMemo(function () {
223
300
  return jsx("div", {
224
301
  css: contentContainerStyles
@@ -229,11 +306,11 @@ export var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(prop
229
306
  items: responseItems,
230
307
  hasNextPage: hasNextPage,
231
308
  visibleColumnKeys: visibleColumnKeys || defaultVisibleColumnKeys,
232
- onNextPage: onNextPage,
309
+ onNextPage: handleOnNextPage,
233
310
  onLoadDatasourceDetails: loadDatasourceDetails,
234
- onVisibleColumnKeysChange: setVisibleColumnKeys
311
+ onVisibleColumnKeysChange: handleVisibleColumnKeysChange
235
312
  }));
236
- }, [columns, defaultVisibleColumnKeys, hasNextPage, loadDatasourceDetails, onNextPage, responseItems, status, visibleColumnKeys]);
313
+ }, [columns, defaultVisibleColumnKeys, hasNextPage, handleVisibleColumnKeysChange, loadDatasourceDetails, handleOnNextPage, responseItems, status, visibleColumnKeys]);
237
314
  var renderCountModeContent = useCallback(function () {
238
315
  var url = selectedJiraSite === null || selectedJiraSite === void 0 ? void 0 : selectedJiraSite.url;
239
316
  if (status === 'unauthorized') {
@@ -327,7 +404,7 @@ export var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(prop
327
404
  }
328
405
  }))), jsx(Button, {
329
406
  appearance: "default",
330
- onClick: onCancel
407
+ onClick: onCancelClick
331
408
  }, jsx(FormattedMessage, modalMessages.cancelButtonText)), jsx(Button, {
332
409
  appearance: "primary",
333
410
  onClick: onInsertPressed,
@@ -338,11 +415,9 @@ export var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(prop
338
415
  var analyticsContextAttributes = {
339
416
  dataProvider: 'jira-issues'
340
417
  };
341
- var analyticsContextData = {
342
- packageName: "@atlaskit/link-datasource",
343
- packageVersion: "1.0.16",
418
+ var analyticsContextData = _objectSpread(_objectSpread({}, packageMetaData), {}, {
344
419
  source: 'datasourceConfigModal'
345
- };
420
+ });
346
421
  var contextData = _objectSpread(_objectSpread({}, analyticsContextData), {}, {
347
422
  attributes: _objectSpread({}, analyticsContextAttributes)
348
423
  });
@@ -1 +1,3 @@
1
+ import { PackageMetaDataType } from './generated/analytics.types';
1
2
  export declare const EVENT_CHANNEL = "media";
3
+ export declare const packageMetaData: PackageMetaDataType;
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Generates Typescript types for analytics events from analytics.spec.yaml
5
5
  *
6
- * @codegen <<SignedSource::cebde8a5da8d6359c36559622f48971b>>
6
+ * @codegen <<SignedSource::2d36fde4f879983a499f53e3fb70509b>>
7
7
  * @codegenCommand yarn workspace @atlassian/analytics-tooling run analytics:codegen link-datasource
8
8
  */
9
9
  export type PackageMetaDataType = {
@@ -37,9 +37,14 @@ export type ButtonClickedInsertAttributesType = {
37
37
  display: 'datasource_inline' | 'datasource_table' | 'inline';
38
38
  destinationObjectTypes: unknown[];
39
39
  searchMethod: 'datasource_search_query' | 'datasource_basic_filter' | 'datasource_saved_filter' | null;
40
+ extensionKey: string | null;
41
+ actions: unknown[];
40
42
  };
41
43
  export type ButtonClickedCancelAttributesType = {
42
44
  searchCount: number;
45
+ destinationObjectTypes: unknown[];
46
+ extensionKey: string | null;
47
+ actions: unknown[];
43
48
  };
44
49
  export type LinkClickedSingleItemAttributesType = {
45
50
  extensionKey: string | null;
@@ -0,0 +1,18 @@
1
+ export declare enum DatasourceAction {
2
+ COLUMN_ADDED = "column added",
3
+ COLUMN_REMOVED = "column removed",
4
+ COLUMN_REORDERED = "column reordered",
5
+ INSTANCE_UPDATED = "instance updated",
6
+ QUERY_UPDATED = "query updated",
7
+ DISPLAY_VIEW_CHANGED = "display view changed",
8
+ NEXT_PAGE_SCROLLED = "next page scrolled"
9
+ }
10
+ export declare enum DatasourceDisplay {
11
+ DATASOURCE_TABLE = "datasource_table",
12
+ DATASOURCE_INLINE = "datasource_inline",
13
+ INLINE = "inline"
14
+ }
15
+ export declare enum DatasourceSearchMethod {
16
+ DATASOURCE_BASIC_FILTER = "datasource_basic_filter",
17
+ DATASOURCE_SEARCH_QUERY = "datasource_search_query"
18
+ }
@@ -1,2 +1,3 @@
1
1
  import type { JiraSearchMethod } from '../common/types';
2
- export declare const mapSearchMethod: (searchMethod: JiraSearchMethod) => "datasource_search_query" | "datasource_basic_filter" | "unknown";
2
+ import { DatasourceSearchMethod } from './types';
3
+ export declare const mapSearchMethod: (searchMethod: JiraSearchMethod | null) => DatasourceSearchMethod | null;
@@ -1,5 +1,11 @@
1
1
  /// <reference types="react" />
2
2
  import { jsx } from '@emotion/react';
3
+ import { DatasourceAction } from '../../../analytics/types';
3
4
  import { JiraIssuesConfigModalProps } from '../types';
5
+ /**
6
+ * This method should be called when one atomic action is performed on columns: adding new item, removing one item, changing items order.
7
+ * The assumption is that since only one action is changed at each time, we don't have to verify the actual contents of the lists.
8
+ */
9
+ export declare const getColumnAction: (oldVisibleColumnKeys: string[], newVisibleColumnKeys: string[]) => DatasourceAction;
4
10
  export declare const PlainJiraIssuesConfigModal: (props: JiraIssuesConfigModalProps) => jsx.JSX.Element;
5
11
  export declare const JiraIssuesConfigModal: import("react").ForwardRefExoticComponent<JiraIssuesConfigModalProps & import("@atlaskit/analytics-next").WithContextProps & import("react").RefAttributes<any>>;
@@ -1 +1,3 @@
1
+ import { PackageMetaDataType } from './generated/analytics.types';
1
2
  export declare const EVENT_CHANNEL = "media";
3
+ export declare const packageMetaData: PackageMetaDataType;
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Generates Typescript types for analytics events from analytics.spec.yaml
5
5
  *
6
- * @codegen <<SignedSource::cebde8a5da8d6359c36559622f48971b>>
6
+ * @codegen <<SignedSource::2d36fde4f879983a499f53e3fb70509b>>
7
7
  * @codegenCommand yarn workspace @atlassian/analytics-tooling run analytics:codegen link-datasource
8
8
  */
9
9
  export type PackageMetaDataType = {
@@ -37,9 +37,14 @@ export type ButtonClickedInsertAttributesType = {
37
37
  display: 'datasource_inline' | 'datasource_table' | 'inline';
38
38
  destinationObjectTypes: unknown[];
39
39
  searchMethod: 'datasource_search_query' | 'datasource_basic_filter' | 'datasource_saved_filter' | null;
40
+ extensionKey: string | null;
41
+ actions: unknown[];
40
42
  };
41
43
  export type ButtonClickedCancelAttributesType = {
42
44
  searchCount: number;
45
+ destinationObjectTypes: unknown[];
46
+ extensionKey: string | null;
47
+ actions: unknown[];
43
48
  };
44
49
  export type LinkClickedSingleItemAttributesType = {
45
50
  extensionKey: string | null;
@@ -0,0 +1,18 @@
1
+ export declare enum DatasourceAction {
2
+ COLUMN_ADDED = "column added",
3
+ COLUMN_REMOVED = "column removed",
4
+ COLUMN_REORDERED = "column reordered",
5
+ INSTANCE_UPDATED = "instance updated",
6
+ QUERY_UPDATED = "query updated",
7
+ DISPLAY_VIEW_CHANGED = "display view changed",
8
+ NEXT_PAGE_SCROLLED = "next page scrolled"
9
+ }
10
+ export declare enum DatasourceDisplay {
11
+ DATASOURCE_TABLE = "datasource_table",
12
+ DATASOURCE_INLINE = "datasource_inline",
13
+ INLINE = "inline"
14
+ }
15
+ export declare enum DatasourceSearchMethod {
16
+ DATASOURCE_BASIC_FILTER = "datasource_basic_filter",
17
+ DATASOURCE_SEARCH_QUERY = "datasource_search_query"
18
+ }
@@ -1,2 +1,3 @@
1
1
  import type { JiraSearchMethod } from '../common/types';
2
- export declare const mapSearchMethod: (searchMethod: JiraSearchMethod) => "datasource_search_query" | "datasource_basic_filter" | "unknown";
2
+ import { DatasourceSearchMethod } from './types';
3
+ export declare const mapSearchMethod: (searchMethod: JiraSearchMethod | null) => DatasourceSearchMethod | null;
@@ -1,5 +1,11 @@
1
1
  /// <reference types="react" />
2
2
  import { jsx } from '@emotion/react';
3
+ import { DatasourceAction } from '../../../analytics/types';
3
4
  import { JiraIssuesConfigModalProps } from '../types';
5
+ /**
6
+ * This method should be called when one atomic action is performed on columns: adding new item, removing one item, changing items order.
7
+ * The assumption is that since only one action is changed at each time, we don't have to verify the actual contents of the lists.
8
+ */
9
+ export declare const getColumnAction: (oldVisibleColumnKeys: string[], newVisibleColumnKeys: string[]) => DatasourceAction;
4
10
  export declare const PlainJiraIssuesConfigModal: (props: JiraIssuesConfigModalProps) => jsx.JSX.Element;
5
11
  export declare const JiraIssuesConfigModal: import("react").ForwardRefExoticComponent<JiraIssuesConfigModalProps & import("@atlaskit/analytics-next").WithContextProps & import("react").RefAttributes<any>>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/link-datasource",
3
- "version": "1.0.16",
3
+ "version": "1.0.18",
4
4
  "description": "UI Components to support linking platform dataset feature",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/"
@@ -33,8 +33,8 @@
33
33
  "@atlaskit/adf-schema": "28.1.2",
34
34
  "@atlaskit/analytics-next": "^9.1.3",
35
35
  "@atlaskit/avatar": "^21.3.0",
36
- "@atlaskit/button": "^16.9.0",
37
- "@atlaskit/dropdown-menu": "^11.12.0",
36
+ "@atlaskit/button": "^16.10.0",
37
+ "@atlaskit/dropdown-menu": "^11.13.0",
38
38
  "@atlaskit/editor-prosemirror": "1.1.0",
39
39
  "@atlaskit/empty-state": "^7.5.0",
40
40
  "@atlaskit/form": "^8.11.0",
@@ -45,7 +45,7 @@
45
45
  "@atlaskit/jql-editor-autocomplete-rest": "^1.0.0",
46
46
  "@atlaskit/link-client-extension": "^1.6.0",
47
47
  "@atlaskit/linking-common": "^4.6.0",
48
- "@atlaskit/linking-types": "^8.2.0",
48
+ "@atlaskit/linking-types": "^8.3.0",
49
49
  "@atlaskit/lozenge": "^11.4.0",
50
50
  "@atlaskit/modal-dialog": "^12.6.0",
51
51
  "@atlaskit/pragmatic-drag-and-drop": "^0.23.0",
@@ -53,12 +53,12 @@
53
53
  "@atlaskit/pragmatic-drag-and-drop-react-beautiful-dnd-autoscroll": "^0.6.0",
54
54
  "@atlaskit/pragmatic-drag-and-drop-react-indicator": "^0.16.0",
55
55
  "@atlaskit/select": "^16.5.0",
56
- "@atlaskit/smart-card": "^26.20.0",
56
+ "@atlaskit/smart-card": "^26.23.0",
57
57
  "@atlaskit/spinner": "^15.5.0",
58
- "@atlaskit/tag": "^11.5.0",
58
+ "@atlaskit/tag": "^11.6.0",
59
59
  "@atlaskit/textfield": "5.6.6",
60
60
  "@atlaskit/theme": "^12.6.0",
61
- "@atlaskit/tokens": "^1.20.0",
61
+ "@atlaskit/tokens": "^1.21.0",
62
62
  "@atlaskit/tooltip": "^17.8.0",
63
63
  "@atlassianlabs/jql-editor": "^2.0.1",
64
64
  "@babel/runtime": "^7.0.0",