@atlaskit/link-datasource 1.2.0 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/dist/cjs/analytics/constants.js +1 -1
- package/dist/cjs/analytics/ufoExperiences/index.js +51 -0
- package/dist/cjs/analytics/ufoExperiences/types.js +5 -0
- package/dist/cjs/analytics/ufoExperiences/useDataRenderedUfoExperience.js +52 -0
- package/dist/cjs/ui/assets-modal/modal/index.js +1 -1
- package/dist/cjs/ui/datasource-table-view/datasourceTableView.js +21 -1
- package/dist/cjs/ui/issue-like-table/index.js +10 -1
- package/dist/cjs/ui/jira-issues-modal/modal/index.js +23 -2
- package/dist/es2019/analytics/constants.js +1 -1
- package/dist/es2019/analytics/ufoExperiences/index.js +45 -0
- package/dist/es2019/analytics/ufoExperiences/types.js +1 -0
- package/dist/es2019/analytics/ufoExperiences/useDataRenderedUfoExperience.js +46 -0
- package/dist/es2019/ui/assets-modal/modal/index.js +1 -1
- package/dist/es2019/ui/datasource-table-view/datasourceTableView.js +22 -1
- package/dist/es2019/ui/issue-like-table/index.js +10 -1
- package/dist/es2019/ui/jira-issues-modal/modal/index.js +24 -2
- package/dist/esm/analytics/constants.js +1 -1
- package/dist/esm/analytics/ufoExperiences/index.js +41 -0
- package/dist/esm/analytics/ufoExperiences/types.js +1 -0
- package/dist/esm/analytics/ufoExperiences/useDataRenderedUfoExperience.js +45 -0
- package/dist/esm/ui/assets-modal/modal/index.js +1 -1
- package/dist/esm/ui/datasource-table-view/datasourceTableView.js +21 -1
- package/dist/esm/ui/issue-like-table/index.js +10 -1
- package/dist/esm/ui/jira-issues-modal/modal/index.js +23 -2
- package/dist/types/analytics/ufoExperiences/index.d.ts +5 -0
- package/dist/types/analytics/ufoExperiences/types.d.ts +8 -0
- package/dist/types/analytics/ufoExperiences/useDataRenderedUfoExperience.d.ts +22 -0
- package/dist/types/ui/issue-like-table/index.d.ts +1 -1
- package/dist/types/ui/issue-like-table/types.d.ts +4 -0
- package/dist/types-ts4.5/analytics/ufoExperiences/index.d.ts +5 -0
- package/dist/types-ts4.5/analytics/ufoExperiences/types.d.ts +8 -0
- package/dist/types-ts4.5/analytics/ufoExperiences/useDataRenderedUfoExperience.d.ts +22 -0
- package/dist/types-ts4.5/ui/issue-like-table/index.d.ts +1 -1
- package/dist/types-ts4.5/ui/issue-like-table/types.d.ts +4 -0
- package/package.json +5 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# @atlaskit/link-datasource
|
|
2
2
|
|
|
3
|
+
## 1.2.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [`103618b094f`](https://bitbucket.org/atlassian/atlassian-frontend/commits/103618b094f) - Add UFO metrics to measure datasource rendering performance.
|
|
8
|
+
- Updated dependencies
|
|
9
|
+
|
|
3
10
|
## 1.2.0
|
|
4
11
|
|
|
5
12
|
### Minor Changes
|
|
@@ -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,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;
|
|
@@ -231,7 +231,7 @@ var analyticsContextAttributes = {
|
|
|
231
231
|
};
|
|
232
232
|
var analyticsContextData = {
|
|
233
233
|
packageName: "@atlaskit/link-datasource",
|
|
234
|
-
packageVersion: "1.2.
|
|
234
|
+
packageVersion: "1.2.1",
|
|
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");
|
|
@@ -145,6 +148,8 @@ var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(props) {
|
|
|
145
148
|
formatMessage = _useIntl.formatMessage;
|
|
146
149
|
var _useDatasourceAnalyti = (0, _analytics.useDatasourceAnalyticsEvents)(),
|
|
147
150
|
fireEvent = _useDatasourceAnalyti.fireEvent;
|
|
151
|
+
var _useRef = (0, _react.useRef)((0, _uuid.v4)()),
|
|
152
|
+
modalRenderInstanceId = _useRef.current;
|
|
148
153
|
var selectedJiraSite = (0, _react.useMemo)(function () {
|
|
149
154
|
if (cloudId) {
|
|
150
155
|
// if the cloud id we're editing isn't in available sites then user is likely unauthorized for that site
|
|
@@ -169,6 +174,21 @@ var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(props) {
|
|
|
169
174
|
var jqlUrl = selectedJiraSite && jql && "".concat(selectedJiraSite.url, "/issues/?jql=").concat(encodeURI(jql));
|
|
170
175
|
var isInsertDisabled = !isParametersSet || status === 'rejected' || status === 'unauthorized' || status === 'loading' || resolvedWithNoResults;
|
|
171
176
|
var shouldShowIssueCount = !!totalCount && totalCount !== 1 && currentViewMode === 'issue';
|
|
177
|
+
(0, _react.useEffect)(function () {
|
|
178
|
+
var shouldStartUfoExperience = status === 'loading';
|
|
179
|
+
if (shouldStartUfoExperience) {
|
|
180
|
+
(0, _ufoExperiences.startUfoExperience)({
|
|
181
|
+
name: 'datasource-rendered'
|
|
182
|
+
}, modalRenderInstanceId);
|
|
183
|
+
}
|
|
184
|
+
}, [modalRenderInstanceId, status]);
|
|
185
|
+
(0, _useDataRenderedUfoExperience.useDataRenderedUfoExperience)({
|
|
186
|
+
status: status,
|
|
187
|
+
experienceId: modalRenderInstanceId,
|
|
188
|
+
itemCount: responseItems.length,
|
|
189
|
+
canBeLink: currentViewMode === 'count',
|
|
190
|
+
extensionKey: extensionKey
|
|
191
|
+
});
|
|
172
192
|
(0, _react.useEffect)(function () {
|
|
173
193
|
fireEvent('screen.datasourceModalDialog.viewed', {});
|
|
174
194
|
}, [fireEvent]);
|
|
@@ -358,9 +378,10 @@ var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(props) {
|
|
|
358
378
|
visibleColumnKeys: visibleColumnKeys || defaultVisibleColumnKeys,
|
|
359
379
|
onNextPage: handleOnNextPage,
|
|
360
380
|
onLoadDatasourceDetails: loadDatasourceDetails,
|
|
361
|
-
onVisibleColumnKeysChange: handleVisibleColumnKeysChange
|
|
381
|
+
onVisibleColumnKeysChange: handleVisibleColumnKeysChange,
|
|
382
|
+
parentContainerRenderInstanceId: modalRenderInstanceId
|
|
362
383
|
}));
|
|
363
|
-
}, [columns, defaultVisibleColumnKeys,
|
|
384
|
+
}, [columns, defaultVisibleColumnKeys, handleOnNextPage, handleVisibleColumnKeysChange, hasNextPage, loadDatasourceDetails, modalRenderInstanceId, responseItems, status, visibleColumnKeys]);
|
|
364
385
|
var renderCountModeContent = (0, _react.useCallback)(function () {
|
|
365
386
|
var url = selectedJiraSite === null || selectedJiraSite === void 0 ? void 0 : selectedJiraSite.url;
|
|
366
387
|
if (status === 'unauthorized') {
|
|
@@ -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 {};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { useEffect } from 'react';
|
|
2
|
+
import { addMetadataToExperience, failUfoExperience, succeedUfoExperience } from './index';
|
|
3
|
+
/**
|
|
4
|
+
* Hook to mark DataRendered UFO experience as either Success or Failure
|
|
5
|
+
* 1. Success when
|
|
6
|
+
* * its rendered as a link
|
|
7
|
+
* * it returns empty results
|
|
8
|
+
* * the request is unauthorized
|
|
9
|
+
* 2. Fail when
|
|
10
|
+
* * request is rejected
|
|
11
|
+
*
|
|
12
|
+
* Note:
|
|
13
|
+
* * When the request is resolved as a datasource table, it will be marked success in the table component, every other success case is marked by this hook
|
|
14
|
+
*/
|
|
15
|
+
export const useDataRenderedUfoExperience = ({
|
|
16
|
+
status,
|
|
17
|
+
experienceId,
|
|
18
|
+
itemCount,
|
|
19
|
+
canBeLink,
|
|
20
|
+
extensionKey
|
|
21
|
+
}) => {
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
const isEmptyResult = status === 'resolved' && itemCount === 0;
|
|
24
|
+
const isLink = status === 'resolved' && (itemCount === 1 || canBeLink); // this will take care of count-mode/single-item smart-link rendering
|
|
25
|
+
const isUnauthorized = status === 'unauthorized';
|
|
26
|
+
const shouldSucceedUfoExperience = isEmptyResult || isLink || isUnauthorized;
|
|
27
|
+
const shouldFailUfoExperience = status === 'rejected';
|
|
28
|
+
if (extensionKey) {
|
|
29
|
+
addMetadataToExperience({
|
|
30
|
+
name: 'datasource-rendered',
|
|
31
|
+
metadata: {
|
|
32
|
+
extensionKey
|
|
33
|
+
}
|
|
34
|
+
}, experienceId);
|
|
35
|
+
}
|
|
36
|
+
if (shouldFailUfoExperience) {
|
|
37
|
+
failUfoExperience({
|
|
38
|
+
name: 'datasource-rendered'
|
|
39
|
+
}, experienceId);
|
|
40
|
+
} else if (shouldSucceedUfoExperience) {
|
|
41
|
+
succeedUfoExperience({
|
|
42
|
+
name: 'datasource-rendered'
|
|
43
|
+
}, experienceId);
|
|
44
|
+
}
|
|
45
|
+
}, [canBeLink, experienceId, extensionKey, itemCount, status]);
|
|
46
|
+
};
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
/** @jsx jsx */
|
|
2
2
|
import { useCallback, useEffect, useRef } from 'react';
|
|
3
3
|
import { jsx } from '@emotion/react';
|
|
4
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
4
5
|
import { withAnalyticsContext } from '@atlaskit/analytics-next';
|
|
5
6
|
import { useDatasourceAnalyticsEvents } from '../../analytics';
|
|
6
7
|
import { packageMetaData } from '../../analytics/constants';
|
|
8
|
+
import { startUfoExperience } from '../../analytics/ufoExperiences';
|
|
9
|
+
import { useDataRenderedUfoExperience } from '../../analytics/ufoExperiences/useDataRenderedUfoExperience';
|
|
7
10
|
import { useDatasourceTableState } from '../../hooks/useDatasourceTableState';
|
|
8
11
|
import { AccessRequired } from '../common/error-state/access-required';
|
|
9
12
|
import { LoadingError } from '../common/error-state/loading-error';
|
|
@@ -37,6 +40,9 @@ const DatasourceTableViewWithoutAnalytics = ({
|
|
|
37
40
|
const {
|
|
38
41
|
fireEvent
|
|
39
42
|
} = useDatasourceAnalyticsEvents();
|
|
43
|
+
const {
|
|
44
|
+
current: tableRenderInstanceId
|
|
45
|
+
} = useRef(uuidv4());
|
|
40
46
|
|
|
41
47
|
/* Need this to make sure that the datasource in the editor gets updated new info if any edits are made in the modal
|
|
42
48
|
But we don't want to call it on initial load. This screws up useDatasourceTableState's internal
|
|
@@ -54,6 +60,20 @@ const DatasourceTableViewWithoutAnalytics = ({
|
|
|
54
60
|
onVisibleColumnKeysChange(defaultVisibleColumnKeys);
|
|
55
61
|
}
|
|
56
62
|
}, [visibleColumnKeys, defaultVisibleColumnKeys, onVisibleColumnKeysChange]);
|
|
63
|
+
useEffect(() => {
|
|
64
|
+
const shouldStartUfoExperience = datasourceId && parameters && visibleColumnKeys && status === 'loading';
|
|
65
|
+
if (shouldStartUfoExperience) {
|
|
66
|
+
startUfoExperience({
|
|
67
|
+
name: 'datasource-rendered'
|
|
68
|
+
}, tableRenderInstanceId);
|
|
69
|
+
}
|
|
70
|
+
}, [datasourceId, parameters, status, tableRenderInstanceId, visibleColumnKeys]);
|
|
71
|
+
useDataRenderedUfoExperience({
|
|
72
|
+
status,
|
|
73
|
+
experienceId: tableRenderInstanceId,
|
|
74
|
+
itemCount: responseItems.length,
|
|
75
|
+
extensionKey
|
|
76
|
+
});
|
|
57
77
|
const forcedReset = useCallback(() => {
|
|
58
78
|
fireEvent('ui.button.clicked.sync', {
|
|
59
79
|
extensionKey,
|
|
@@ -91,7 +111,8 @@ const DatasourceTableViewWithoutAnalytics = ({
|
|
|
91
111
|
columns: columns,
|
|
92
112
|
visibleColumnKeys: visibleColumnKeys || defaultVisibleColumnKeys,
|
|
93
113
|
onVisibleColumnKeysChange: onVisibleColumnKeysChange,
|
|
94
|
-
scrollableContainerHeight: 590
|
|
114
|
+
scrollableContainerHeight: 590,
|
|
115
|
+
parentContainerRenderInstanceId: tableRenderInstanceId
|
|
95
116
|
}) : jsx(EmptyState, {
|
|
96
117
|
testId: "datasource-table-view-skeleton",
|
|
97
118
|
isCompact: true,
|
|
@@ -12,6 +12,7 @@ import { monitorForElements } from '@atlaskit/pragmatic-drag-and-drop/adapter/el
|
|
|
12
12
|
import { combine } from '@atlaskit/pragmatic-drag-and-drop/util/combine';
|
|
13
13
|
import { N40 } from '@atlaskit/theme/colors';
|
|
14
14
|
import Tooltip from '@atlaskit/tooltip';
|
|
15
|
+
import { succeedUfoExperience } from '../../analytics/ufoExperiences';
|
|
15
16
|
import { ColumnPicker } from './column-picker';
|
|
16
17
|
import { DragColumnPreview } from './drag-column-preview';
|
|
17
18
|
import { DraggableTableHeading } from './draggable-table-heading';
|
|
@@ -123,7 +124,8 @@ export const IssueLikeDataTableView = ({
|
|
|
123
124
|
onVisibleColumnKeysChange,
|
|
124
125
|
status,
|
|
125
126
|
hasNextPage,
|
|
126
|
-
scrollableContainerHeight
|
|
127
|
+
scrollableContainerHeight,
|
|
128
|
+
parentContainerRenderInstanceId
|
|
127
129
|
}) => {
|
|
128
130
|
const tableId = useMemo(() => Symbol('unique-id'), []);
|
|
129
131
|
const [lastRowElement, setLastRowElement] = useState(null);
|
|
@@ -134,6 +136,13 @@ export const IssueLikeDataTableView = ({
|
|
|
134
136
|
useEffect(() => {
|
|
135
137
|
setOrderedColumns(orderColumns([...columns], [...visibleColumnKeys]));
|
|
136
138
|
}, [columns, visibleColumnKeys]);
|
|
139
|
+
useEffect(() => {
|
|
140
|
+
if (parentContainerRenderInstanceId && status === 'resolved') {
|
|
141
|
+
succeedUfoExperience({
|
|
142
|
+
name: 'datasource-rendered'
|
|
143
|
+
}, parentContainerRenderInstanceId);
|
|
144
|
+
}
|
|
145
|
+
}, [parentContainerRenderInstanceId, status]);
|
|
137
146
|
const visibleSortedColumns = useMemo(() => visibleColumnKeys.map(visibleKey => orderedColumns.find(({
|
|
138
147
|
key
|
|
139
148
|
}) => visibleKey === key)).filter(Boolean), [orderedColumns, visibleColumnKeys]);
|
|
@@ -3,6 +3,7 @@ import _extends from "@babel/runtime/helpers/extends";
|
|
|
3
3
|
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
4
4
|
import { css, jsx } from '@emotion/react';
|
|
5
5
|
import { FormattedMessage, FormattedNumber, useIntl } from 'react-intl-next';
|
|
6
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
6
7
|
import { withAnalyticsContext } from '@atlaskit/analytics-next';
|
|
7
8
|
import Button from '@atlaskit/button/standard-button';
|
|
8
9
|
import Modal, { ModalBody, ModalFooter, ModalHeader, ModalTitle, ModalTransition } from '@atlaskit/modal-dialog';
|
|
@@ -10,6 +11,8 @@ import { B400, N0, N40, N800 } from '@atlaskit/theme/colors';
|
|
|
10
11
|
import { EVENT_CHANNEL, useDatasourceAnalyticsEvents } from '../../../analytics';
|
|
11
12
|
import { packageMetaData } from '../../../analytics/constants';
|
|
12
13
|
import { DatasourceAction, DatasourceDisplay } from '../../../analytics/types';
|
|
14
|
+
import { startUfoExperience } from '../../../analytics/ufoExperiences';
|
|
15
|
+
import { useDataRenderedUfoExperience } from '../../../analytics/ufoExperiences/useDataRenderedUfoExperience';
|
|
13
16
|
import { mapSearchMethod } from '../../../analytics/utils';
|
|
14
17
|
import { useDatasourceTableState } from '../../../hooks/useDatasourceTableState';
|
|
15
18
|
import { getAvailableJiraSites } from '../../../services/getAvailableJiraSites';
|
|
@@ -116,6 +119,9 @@ export const PlainJiraIssuesConfigModal = props => {
|
|
|
116
119
|
const {
|
|
117
120
|
fireEvent
|
|
118
121
|
} = useDatasourceAnalyticsEvents();
|
|
122
|
+
const {
|
|
123
|
+
current: modalRenderInstanceId
|
|
124
|
+
} = useRef(uuidv4());
|
|
119
125
|
const selectedJiraSite = useMemo(() => {
|
|
120
126
|
if (cloudId) {
|
|
121
127
|
// if the cloud id we're editing isn't in available sites then user is likely unauthorized for that site
|
|
@@ -136,6 +142,21 @@ export const PlainJiraIssuesConfigModal = props => {
|
|
|
136
142
|
const jqlUrl = selectedJiraSite && jql && `${selectedJiraSite.url}/issues/?jql=${encodeURI(jql)}`;
|
|
137
143
|
const isInsertDisabled = !isParametersSet || status === 'rejected' || status === 'unauthorized' || status === 'loading' || resolvedWithNoResults;
|
|
138
144
|
const shouldShowIssueCount = !!totalCount && totalCount !== 1 && currentViewMode === 'issue';
|
|
145
|
+
useEffect(() => {
|
|
146
|
+
const shouldStartUfoExperience = status === 'loading';
|
|
147
|
+
if (shouldStartUfoExperience) {
|
|
148
|
+
startUfoExperience({
|
|
149
|
+
name: 'datasource-rendered'
|
|
150
|
+
}, modalRenderInstanceId);
|
|
151
|
+
}
|
|
152
|
+
}, [modalRenderInstanceId, status]);
|
|
153
|
+
useDataRenderedUfoExperience({
|
|
154
|
+
status,
|
|
155
|
+
experienceId: modalRenderInstanceId,
|
|
156
|
+
itemCount: responseItems.length,
|
|
157
|
+
canBeLink: currentViewMode === 'count',
|
|
158
|
+
extensionKey
|
|
159
|
+
});
|
|
139
160
|
useEffect(() => {
|
|
140
161
|
fireEvent('screen.datasourceModalDialog.viewed', {});
|
|
141
162
|
}, [fireEvent]);
|
|
@@ -305,8 +326,9 @@ export const PlainJiraIssuesConfigModal = props => {
|
|
|
305
326
|
visibleColumnKeys: visibleColumnKeys || defaultVisibleColumnKeys,
|
|
306
327
|
onNextPage: handleOnNextPage,
|
|
307
328
|
onLoadDatasourceDetails: loadDatasourceDetails,
|
|
308
|
-
onVisibleColumnKeysChange: handleVisibleColumnKeysChange
|
|
309
|
-
|
|
329
|
+
onVisibleColumnKeysChange: handleVisibleColumnKeysChange,
|
|
330
|
+
parentContainerRenderInstanceId: modalRenderInstanceId
|
|
331
|
+
})), [columns, defaultVisibleColumnKeys, handleOnNextPage, handleVisibleColumnKeysChange, hasNextPage, loadDatasourceDetails, modalRenderInstanceId, responseItems, status, visibleColumnKeys]);
|
|
310
332
|
const renderCountModeContent = useCallback(() => {
|
|
311
333
|
const url = selectedJiraSite === null || selectedJiraSite === void 0 ? void 0 : selectedJiraSite.url;
|
|
312
334
|
if (status === 'unauthorized') {
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { ConcurrentExperience, ExperiencePerformanceTypes, ExperienceTypes } from '@atlaskit/ufo';
|
|
2
|
+
var datasourcePageSegmentLoadExperienceConfig = {
|
|
3
|
+
platform: {
|
|
4
|
+
component: 'datasource'
|
|
5
|
+
},
|
|
6
|
+
type: ExperienceTypes.Load,
|
|
7
|
+
performanceType: ExperiencePerformanceTypes.PageSegmentLoad
|
|
8
|
+
};
|
|
9
|
+
var ufoExperiences = {
|
|
10
|
+
'datasource-rendered': new ConcurrentExperience('datasource-rendered', datasourcePageSegmentLoadExperienceConfig)
|
|
11
|
+
};
|
|
12
|
+
export var startUfoExperience = function startUfoExperience(_ref, id) {
|
|
13
|
+
var name = _ref.name,
|
|
14
|
+
metadata = _ref.metadata;
|
|
15
|
+
var experienceInstance = ufoExperiences[name].getInstance(id);
|
|
16
|
+
experienceInstance.start();
|
|
17
|
+
if (metadata) {
|
|
18
|
+
experienceInstance.addMetadata(metadata);
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
export var succeedUfoExperience = function succeedUfoExperience(_ref2, id) {
|
|
22
|
+
var name = _ref2.name,
|
|
23
|
+
metadata = _ref2.metadata;
|
|
24
|
+
var experienceInstance = ufoExperiences[name].getInstance(id);
|
|
25
|
+
experienceInstance.success({
|
|
26
|
+
metadata: metadata
|
|
27
|
+
});
|
|
28
|
+
};
|
|
29
|
+
export var failUfoExperience = function failUfoExperience(_ref3, id) {
|
|
30
|
+
var name = _ref3.name,
|
|
31
|
+
metadata = _ref3.metadata;
|
|
32
|
+
var experienceInstance = ufoExperiences[name].getInstance(id);
|
|
33
|
+
experienceInstance.failure({
|
|
34
|
+
metadata: metadata
|
|
35
|
+
});
|
|
36
|
+
};
|
|
37
|
+
export var addMetadataToExperience = function addMetadataToExperience(_ref4, id) {
|
|
38
|
+
var name = _ref4.name,
|
|
39
|
+
metadata = _ref4.metadata;
|
|
40
|
+
ufoExperiences[name].getInstance(id).addMetadata(metadata);
|
|
41
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { useEffect } from 'react';
|
|
2
|
+
import { addMetadataToExperience, failUfoExperience, succeedUfoExperience } from './index';
|
|
3
|
+
/**
|
|
4
|
+
* Hook to mark DataRendered UFO experience as either Success or Failure
|
|
5
|
+
* 1. Success when
|
|
6
|
+
* * its rendered as a link
|
|
7
|
+
* * it returns empty results
|
|
8
|
+
* * the request is unauthorized
|
|
9
|
+
* 2. Fail when
|
|
10
|
+
* * request is rejected
|
|
11
|
+
*
|
|
12
|
+
* Note:
|
|
13
|
+
* * When the request is resolved as a datasource table, it will be marked success in the table component, every other success case is marked by this hook
|
|
14
|
+
*/
|
|
15
|
+
export var useDataRenderedUfoExperience = function useDataRenderedUfoExperience(_ref) {
|
|
16
|
+
var status = _ref.status,
|
|
17
|
+
experienceId = _ref.experienceId,
|
|
18
|
+
itemCount = _ref.itemCount,
|
|
19
|
+
canBeLink = _ref.canBeLink,
|
|
20
|
+
extensionKey = _ref.extensionKey;
|
|
21
|
+
useEffect(function () {
|
|
22
|
+
var isEmptyResult = status === 'resolved' && itemCount === 0;
|
|
23
|
+
var isLink = status === 'resolved' && (itemCount === 1 || canBeLink); // this will take care of count-mode/single-item smart-link rendering
|
|
24
|
+
var isUnauthorized = status === 'unauthorized';
|
|
25
|
+
var shouldSucceedUfoExperience = isEmptyResult || isLink || isUnauthorized;
|
|
26
|
+
var shouldFailUfoExperience = status === 'rejected';
|
|
27
|
+
if (extensionKey) {
|
|
28
|
+
addMetadataToExperience({
|
|
29
|
+
name: 'datasource-rendered',
|
|
30
|
+
metadata: {
|
|
31
|
+
extensionKey: extensionKey
|
|
32
|
+
}
|
|
33
|
+
}, experienceId);
|
|
34
|
+
}
|
|
35
|
+
if (shouldFailUfoExperience) {
|
|
36
|
+
failUfoExperience({
|
|
37
|
+
name: 'datasource-rendered'
|
|
38
|
+
}, experienceId);
|
|
39
|
+
} else if (shouldSucceedUfoExperience) {
|
|
40
|
+
succeedUfoExperience({
|
|
41
|
+
name: 'datasource-rendered'
|
|
42
|
+
}, experienceId);
|
|
43
|
+
}
|
|
44
|
+
}, [canBeLink, experienceId, extensionKey, itemCount, status]);
|
|
45
|
+
};
|
|
@@ -222,7 +222,7 @@ var analyticsContextAttributes = {
|
|
|
222
222
|
};
|
|
223
223
|
var analyticsContextData = {
|
|
224
224
|
packageName: "@atlaskit/link-datasource",
|
|
225
|
-
packageVersion: "1.2.
|
|
225
|
+
packageVersion: "1.2.1",
|
|
226
226
|
source: 'datasourceConfigModal'
|
|
227
227
|
};
|
|
228
228
|
var contextData = _objectSpread(_objectSpread({}, analyticsContextData), {}, {
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
/** @jsx jsx */
|
|
2
2
|
import { useCallback, useEffect, useRef } from 'react';
|
|
3
3
|
import { jsx } from '@emotion/react';
|
|
4
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
4
5
|
import { withAnalyticsContext } from '@atlaskit/analytics-next';
|
|
5
6
|
import { useDatasourceAnalyticsEvents } from '../../analytics';
|
|
6
7
|
import { packageMetaData } from '../../analytics/constants';
|
|
8
|
+
import { startUfoExperience } from '../../analytics/ufoExperiences';
|
|
9
|
+
import { useDataRenderedUfoExperience } from '../../analytics/ufoExperiences/useDataRenderedUfoExperience';
|
|
7
10
|
import { useDatasourceTableState } from '../../hooks/useDatasourceTableState';
|
|
8
11
|
import { AccessRequired } from '../common/error-state/access-required';
|
|
9
12
|
import { LoadingError } from '../common/error-state/loading-error';
|
|
@@ -35,6 +38,8 @@ var DatasourceTableViewWithoutAnalytics = function DatasourceTableViewWithoutAna
|
|
|
35
38
|
destinationObjectTypes = _useDatasourceTableSt.destinationObjectTypes;
|
|
36
39
|
var _useDatasourceAnalyti = useDatasourceAnalyticsEvents(),
|
|
37
40
|
fireEvent = _useDatasourceAnalyti.fireEvent;
|
|
41
|
+
var _useRef = useRef(uuidv4()),
|
|
42
|
+
tableRenderInstanceId = _useRef.current;
|
|
38
43
|
|
|
39
44
|
/* Need this to make sure that the datasource in the editor gets updated new info if any edits are made in the modal
|
|
40
45
|
But we don't want to call it on initial load. This screws up useDatasourceTableState's internal
|
|
@@ -52,6 +57,20 @@ var DatasourceTableViewWithoutAnalytics = function DatasourceTableViewWithoutAna
|
|
|
52
57
|
onVisibleColumnKeysChange(defaultVisibleColumnKeys);
|
|
53
58
|
}
|
|
54
59
|
}, [visibleColumnKeys, defaultVisibleColumnKeys, onVisibleColumnKeysChange]);
|
|
60
|
+
useEffect(function () {
|
|
61
|
+
var shouldStartUfoExperience = datasourceId && parameters && visibleColumnKeys && status === 'loading';
|
|
62
|
+
if (shouldStartUfoExperience) {
|
|
63
|
+
startUfoExperience({
|
|
64
|
+
name: 'datasource-rendered'
|
|
65
|
+
}, tableRenderInstanceId);
|
|
66
|
+
}
|
|
67
|
+
}, [datasourceId, parameters, status, tableRenderInstanceId, visibleColumnKeys]);
|
|
68
|
+
useDataRenderedUfoExperience({
|
|
69
|
+
status: status,
|
|
70
|
+
experienceId: tableRenderInstanceId,
|
|
71
|
+
itemCount: responseItems.length,
|
|
72
|
+
extensionKey: extensionKey
|
|
73
|
+
});
|
|
55
74
|
var forcedReset = useCallback(function () {
|
|
56
75
|
fireEvent('ui.button.clicked.sync', {
|
|
57
76
|
extensionKey: extensionKey,
|
|
@@ -89,7 +108,8 @@ var DatasourceTableViewWithoutAnalytics = function DatasourceTableViewWithoutAna
|
|
|
89
108
|
columns: columns,
|
|
90
109
|
visibleColumnKeys: visibleColumnKeys || defaultVisibleColumnKeys,
|
|
91
110
|
onVisibleColumnKeysChange: onVisibleColumnKeysChange,
|
|
92
|
-
scrollableContainerHeight: 590
|
|
111
|
+
scrollableContainerHeight: 590,
|
|
112
|
+
parentContainerRenderInstanceId: tableRenderInstanceId
|
|
93
113
|
}) : jsx(EmptyState, {
|
|
94
114
|
testId: "datasource-table-view-skeleton",
|
|
95
115
|
isCompact: true,
|
|
@@ -21,6 +21,7 @@ import { monitorForElements } from '@atlaskit/pragmatic-drag-and-drop/adapter/el
|
|
|
21
21
|
import { combine } from '@atlaskit/pragmatic-drag-and-drop/util/combine';
|
|
22
22
|
import { N40 } from '@atlaskit/theme/colors';
|
|
23
23
|
import Tooltip from '@atlaskit/tooltip';
|
|
24
|
+
import { succeedUfoExperience } from '../../analytics/ufoExperiences';
|
|
24
25
|
import { ColumnPicker } from './column-picker';
|
|
25
26
|
import { DragColumnPreview } from './drag-column-preview';
|
|
26
27
|
import { DraggableTableHeading } from './draggable-table-heading';
|
|
@@ -115,7 +116,8 @@ export var IssueLikeDataTableView = function IssueLikeDataTableView(_ref2) {
|
|
|
115
116
|
onVisibleColumnKeysChange = _ref2.onVisibleColumnKeysChange,
|
|
116
117
|
status = _ref2.status,
|
|
117
118
|
hasNextPage = _ref2.hasNextPage,
|
|
118
|
-
scrollableContainerHeight = _ref2.scrollableContainerHeight
|
|
119
|
+
scrollableContainerHeight = _ref2.scrollableContainerHeight,
|
|
120
|
+
parentContainerRenderInstanceId = _ref2.parentContainerRenderInstanceId;
|
|
119
121
|
var tableId = useMemo(function () {
|
|
120
122
|
return Symbol('unique-id');
|
|
121
123
|
}, []);
|
|
@@ -138,6 +140,13 @@ export var IssueLikeDataTableView = function IssueLikeDataTableView(_ref2) {
|
|
|
138
140
|
useEffect(function () {
|
|
139
141
|
setOrderedColumns(orderColumns(_toConsumableArray(columns), _toConsumableArray(visibleColumnKeys)));
|
|
140
142
|
}, [columns, visibleColumnKeys]);
|
|
143
|
+
useEffect(function () {
|
|
144
|
+
if (parentContainerRenderInstanceId && status === 'resolved') {
|
|
145
|
+
succeedUfoExperience({
|
|
146
|
+
name: 'datasource-rendered'
|
|
147
|
+
}, parentContainerRenderInstanceId);
|
|
148
|
+
}
|
|
149
|
+
}, [parentContainerRenderInstanceId, status]);
|
|
141
150
|
var visibleSortedColumns = useMemo(function () {
|
|
142
151
|
return visibleColumnKeys.map(function (visibleKey) {
|
|
143
152
|
return orderedColumns.find(function (_ref3) {
|
|
@@ -9,6 +9,7 @@ import _regeneratorRuntime from "@babel/runtime/regenerator";
|
|
|
9
9
|
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
10
10
|
import { css, jsx } from '@emotion/react';
|
|
11
11
|
import { FormattedMessage, FormattedNumber, useIntl } from 'react-intl-next';
|
|
12
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
12
13
|
import { withAnalyticsContext } from '@atlaskit/analytics-next';
|
|
13
14
|
import Button from '@atlaskit/button/standard-button';
|
|
14
15
|
import Modal, { ModalBody, ModalFooter, ModalHeader, ModalTitle, ModalTransition } from '@atlaskit/modal-dialog';
|
|
@@ -16,6 +17,8 @@ import { B400, N0, N40, N800 } from '@atlaskit/theme/colors';
|
|
|
16
17
|
import { EVENT_CHANNEL, useDatasourceAnalyticsEvents } from '../../../analytics';
|
|
17
18
|
import { packageMetaData } from '../../../analytics/constants';
|
|
18
19
|
import { DatasourceAction, DatasourceDisplay } from '../../../analytics/types';
|
|
20
|
+
import { startUfoExperience } from '../../../analytics/ufoExperiences';
|
|
21
|
+
import { useDataRenderedUfoExperience } from '../../../analytics/ufoExperiences/useDataRenderedUfoExperience';
|
|
19
22
|
import { mapSearchMethod } from '../../../analytics/utils';
|
|
20
23
|
import { useDatasourceTableState } from '../../../hooks/useDatasourceTableState';
|
|
21
24
|
import { getAvailableJiraSites } from '../../../services/getAvailableJiraSites';
|
|
@@ -135,6 +138,8 @@ export var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(prop
|
|
|
135
138
|
formatMessage = _useIntl.formatMessage;
|
|
136
139
|
var _useDatasourceAnalyti = useDatasourceAnalyticsEvents(),
|
|
137
140
|
fireEvent = _useDatasourceAnalyti.fireEvent;
|
|
141
|
+
var _useRef = useRef(uuidv4()),
|
|
142
|
+
modalRenderInstanceId = _useRef.current;
|
|
138
143
|
var selectedJiraSite = useMemo(function () {
|
|
139
144
|
if (cloudId) {
|
|
140
145
|
// if the cloud id we're editing isn't in available sites then user is likely unauthorized for that site
|
|
@@ -159,6 +164,21 @@ export var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(prop
|
|
|
159
164
|
var jqlUrl = selectedJiraSite && jql && "".concat(selectedJiraSite.url, "/issues/?jql=").concat(encodeURI(jql));
|
|
160
165
|
var isInsertDisabled = !isParametersSet || status === 'rejected' || status === 'unauthorized' || status === 'loading' || resolvedWithNoResults;
|
|
161
166
|
var shouldShowIssueCount = !!totalCount && totalCount !== 1 && currentViewMode === 'issue';
|
|
167
|
+
useEffect(function () {
|
|
168
|
+
var shouldStartUfoExperience = status === 'loading';
|
|
169
|
+
if (shouldStartUfoExperience) {
|
|
170
|
+
startUfoExperience({
|
|
171
|
+
name: 'datasource-rendered'
|
|
172
|
+
}, modalRenderInstanceId);
|
|
173
|
+
}
|
|
174
|
+
}, [modalRenderInstanceId, status]);
|
|
175
|
+
useDataRenderedUfoExperience({
|
|
176
|
+
status: status,
|
|
177
|
+
experienceId: modalRenderInstanceId,
|
|
178
|
+
itemCount: responseItems.length,
|
|
179
|
+
canBeLink: currentViewMode === 'count',
|
|
180
|
+
extensionKey: extensionKey
|
|
181
|
+
});
|
|
162
182
|
useEffect(function () {
|
|
163
183
|
fireEvent('screen.datasourceModalDialog.viewed', {});
|
|
164
184
|
}, [fireEvent]);
|
|
@@ -348,9 +368,10 @@ export var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(prop
|
|
|
348
368
|
visibleColumnKeys: visibleColumnKeys || defaultVisibleColumnKeys,
|
|
349
369
|
onNextPage: handleOnNextPage,
|
|
350
370
|
onLoadDatasourceDetails: loadDatasourceDetails,
|
|
351
|
-
onVisibleColumnKeysChange: handleVisibleColumnKeysChange
|
|
371
|
+
onVisibleColumnKeysChange: handleVisibleColumnKeysChange,
|
|
372
|
+
parentContainerRenderInstanceId: modalRenderInstanceId
|
|
352
373
|
}));
|
|
353
|
-
}, [columns, defaultVisibleColumnKeys,
|
|
374
|
+
}, [columns, defaultVisibleColumnKeys, handleOnNextPage, handleVisibleColumnKeysChange, hasNextPage, loadDatasourceDetails, modalRenderInstanceId, responseItems, status, visibleColumnKeys]);
|
|
354
375
|
var renderCountModeContent = useCallback(function () {
|
|
355
376
|
var url = selectedJiraSite === null || selectedJiraSite === void 0 ? void 0 : selectedJiraSite.url;
|
|
356
377
|
if (status === 'unauthorized') {
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { UfoExperience } from './types';
|
|
2
|
+
export declare const startUfoExperience: ({ name, metadata }: UfoExperience, id: string) => void;
|
|
3
|
+
export declare const succeedUfoExperience: ({ name, metadata }: UfoExperience, id: string) => void;
|
|
4
|
+
export declare const failUfoExperience: ({ name, metadata }: UfoExperience, id: string) => void;
|
|
5
|
+
export declare const addMetadataToExperience: ({ name, metadata }: UfoExperience, id: string) => void;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { DatasourceTableStatusType } from '@atlaskit/linking-types';
|
|
2
|
+
interface DataRenderedUfoExperienceProps {
|
|
3
|
+
status: DatasourceTableStatusType;
|
|
4
|
+
experienceId: string;
|
|
5
|
+
itemCount: number;
|
|
6
|
+
canBeLink?: boolean;
|
|
7
|
+
extensionKey?: string | null;
|
|
8
|
+
}
|
|
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
|
+
export declare const useDataRenderedUfoExperience: ({ status, experienceId, itemCount, canBeLink, extensionKey, }: DataRenderedUfoExperienceProps) => void;
|
|
22
|
+
export {};
|
|
@@ -12,5 +12,5 @@ export interface RowCellType {
|
|
|
12
12
|
content?: React.ReactNode | string;
|
|
13
13
|
maxWidth?: number;
|
|
14
14
|
}
|
|
15
|
-
export declare const IssueLikeDataTableView: ({ testId, onNextPage, onLoadDatasourceDetails, items, columns, renderItem, visibleColumnKeys, onVisibleColumnKeysChange, status, hasNextPage, scrollableContainerHeight, }: IssueLikeDataTableViewProps) => jsx.JSX.Element;
|
|
15
|
+
export declare const IssueLikeDataTableView: ({ testId, onNextPage, onLoadDatasourceDetails, items, columns, renderItem, visibleColumnKeys, onVisibleColumnKeysChange, status, hasNextPage, scrollableContainerHeight, parentContainerRenderInstanceId, }: IssueLikeDataTableViewProps) => jsx.JSX.Element;
|
|
16
16
|
export declare const EmptyState: ({ isCompact, isLoading, testId }: import("./empty-state").Props) => jsx.JSX.Element;
|
|
@@ -4,6 +4,10 @@ import { NextPageType } from '../../hooks/useDatasourceTableState';
|
|
|
4
4
|
export type TableViewPropsRenderType = (item: DatasourceType) => React.ReactNode;
|
|
5
5
|
export interface IssueLikeDataTableViewProps {
|
|
6
6
|
testId?: string;
|
|
7
|
+
/**
|
|
8
|
+
* Unique ID to indicate parent component instance to be used for UFO experiences
|
|
9
|
+
*/
|
|
10
|
+
parentContainerRenderInstanceId?: string;
|
|
7
11
|
/**
|
|
8
12
|
* All available columns/properties.
|
|
9
13
|
* Consumer should not reorder these columns to align with `visibleColumnKeys`.
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { UfoExperience } from './types';
|
|
2
|
+
export declare const startUfoExperience: ({ name, metadata }: UfoExperience, id: string) => void;
|
|
3
|
+
export declare const succeedUfoExperience: ({ name, metadata }: UfoExperience, id: string) => void;
|
|
4
|
+
export declare const failUfoExperience: ({ name, metadata }: UfoExperience, id: string) => void;
|
|
5
|
+
export declare const addMetadataToExperience: ({ name, metadata }: UfoExperience, id: string) => void;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { DatasourceTableStatusType } from '@atlaskit/linking-types';
|
|
2
|
+
interface DataRenderedUfoExperienceProps {
|
|
3
|
+
status: DatasourceTableStatusType;
|
|
4
|
+
experienceId: string;
|
|
5
|
+
itemCount: number;
|
|
6
|
+
canBeLink?: boolean;
|
|
7
|
+
extensionKey?: string | null;
|
|
8
|
+
}
|
|
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
|
+
export declare const useDataRenderedUfoExperience: ({ status, experienceId, itemCount, canBeLink, extensionKey, }: DataRenderedUfoExperienceProps) => void;
|
|
22
|
+
export {};
|
|
@@ -12,5 +12,5 @@ export interface RowCellType {
|
|
|
12
12
|
content?: React.ReactNode | string;
|
|
13
13
|
maxWidth?: number;
|
|
14
14
|
}
|
|
15
|
-
export declare const IssueLikeDataTableView: ({ testId, onNextPage, onLoadDatasourceDetails, items, columns, renderItem, visibleColumnKeys, onVisibleColumnKeysChange, status, hasNextPage, scrollableContainerHeight, }: IssueLikeDataTableViewProps) => jsx.JSX.Element;
|
|
15
|
+
export declare const IssueLikeDataTableView: ({ testId, onNextPage, onLoadDatasourceDetails, items, columns, renderItem, visibleColumnKeys, onVisibleColumnKeysChange, status, hasNextPage, scrollableContainerHeight, parentContainerRenderInstanceId, }: IssueLikeDataTableViewProps) => jsx.JSX.Element;
|
|
16
16
|
export declare const EmptyState: ({ isCompact, isLoading, testId }: import("./empty-state").Props) => jsx.JSX.Element;
|
|
@@ -4,6 +4,10 @@ import { NextPageType } from '../../hooks/useDatasourceTableState';
|
|
|
4
4
|
export type TableViewPropsRenderType = (item: DatasourceType) => React.ReactNode;
|
|
5
5
|
export interface IssueLikeDataTableViewProps {
|
|
6
6
|
testId?: string;
|
|
7
|
+
/**
|
|
8
|
+
* Unique ID to indicate parent component instance to be used for UFO experiences
|
|
9
|
+
*/
|
|
10
|
+
parentContainerRenderInstanceId?: string;
|
|
7
11
|
/**
|
|
8
12
|
* All available columns/properties.
|
|
9
13
|
* Consumer should not reorder these columns to align with `visibleColumnKeys`.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atlaskit/link-datasource",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.1",
|
|
4
4
|
"description": "UI Components to support linking platform dataset feature",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"registry": "https://registry.npmjs.org/"
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
"@atlaskit/pragmatic-drag-and-drop-hitbox": "^0.11.0",
|
|
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
|
-
"@atlaskit/select": "^16.
|
|
55
|
+
"@atlaskit/select": "^16.7.0",
|
|
56
56
|
"@atlaskit/smart-card": "^26.26.0",
|
|
57
57
|
"@atlaskit/spinner": "^15.5.0",
|
|
58
58
|
"@atlaskit/tag": "^11.6.0",
|
|
@@ -60,13 +60,15 @@
|
|
|
60
60
|
"@atlaskit/theme": "^12.6.0",
|
|
61
61
|
"@atlaskit/tokens": "^1.22.0",
|
|
62
62
|
"@atlaskit/tooltip": "^17.8.0",
|
|
63
|
+
"@atlaskit/ufo": "^0.2.4",
|
|
63
64
|
"@atlassianlabs/jql-editor": "^2.0.1",
|
|
64
65
|
"@babel/runtime": "^7.0.0",
|
|
65
66
|
"@emotion/react": "^11.7.1",
|
|
66
67
|
"@emotion/styled": "^11.0.0",
|
|
67
68
|
"debounce-promise": "^3.1.2",
|
|
68
69
|
"react-dom": "^16.8.0",
|
|
69
|
-
"tiny-invariant": "^1.2.0"
|
|
70
|
+
"tiny-invariant": "^1.2.0",
|
|
71
|
+
"uuid": "^3.1.0"
|
|
70
72
|
},
|
|
71
73
|
"peerDependencies": {
|
|
72
74
|
"react": "^16.8.0",
|
|
@@ -88,7 +90,6 @@
|
|
|
88
90
|
"jest-fetch-mock": "^3.0.3",
|
|
89
91
|
"json-ld-types": "3.9.1",
|
|
90
92
|
"typescript": "~4.9.5",
|
|
91
|
-
"uuid": "^3.1.0",
|
|
92
93
|
"wait-for-expect": "^1.2.0"
|
|
93
94
|
},
|
|
94
95
|
"techstack": {
|