@atlaskit/link-datasource 1.10.3 → 1.11.0
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/types.js +1 -0
- package/dist/cjs/hooks/useObjectSchemas.js +23 -13
- package/dist/cjs/ui/assets-modal/modal/index.js +109 -16
- package/dist/cjs/ui/assets-modal/modal/render-assets-content/index.js +5 -3
- package/dist/cjs/ui/assets-modal/search-container/index.js +4 -0
- package/dist/cjs/ui/assets-modal/search-container/object-schema-select/index.js +68 -23
- package/dist/cjs/ui/jira-issues-modal/modal/index.js +2 -1
- package/dist/es2019/analytics/constants.js +1 -1
- package/dist/es2019/analytics/types.js +1 -0
- package/dist/es2019/hooks/useObjectSchemas.js +9 -1
- package/dist/es2019/ui/assets-modal/modal/index.js +112 -15
- package/dist/es2019/ui/assets-modal/modal/render-assets-content/index.js +5 -3
- package/dist/es2019/ui/assets-modal/search-container/index.js +5 -0
- package/dist/es2019/ui/assets-modal/search-container/object-schema-select/index.js +32 -5
- package/dist/es2019/ui/jira-issues-modal/modal/index.js +2 -1
- package/dist/esm/analytics/constants.js +1 -1
- package/dist/esm/analytics/types.js +1 -0
- package/dist/esm/hooks/useObjectSchemas.js +23 -13
- package/dist/esm/ui/assets-modal/modal/index.js +112 -19
- package/dist/esm/ui/assets-modal/modal/render-assets-content/index.js +5 -3
- package/dist/esm/ui/assets-modal/search-container/index.js +4 -0
- package/dist/esm/ui/assets-modal/search-container/object-schema-select/index.js +65 -20
- package/dist/esm/ui/jira-issues-modal/modal/index.js +2 -1
- package/dist/types/analytics/generated/analytics.types.d.ts +7 -2
- package/dist/types/analytics/types.d.ts +2 -1
- package/dist/types/hooks/useObjectSchemas.d.ts +3 -1
- package/dist/types/ui/assets-modal/modal/render-assets-content/index.d.ts +1 -0
- package/dist/types/ui/assets-modal/search-container/index.d.ts +1 -2
- package/dist/types/ui/assets-modal/types.d.ts +2 -1
- package/dist/types-ts4.5/analytics/generated/analytics.types.d.ts +7 -2
- package/dist/types-ts4.5/analytics/types.d.ts +2 -1
- package/dist/types-ts4.5/hooks/useObjectSchemas.d.ts +3 -1
- package/dist/types-ts4.5/ui/assets-modal/modal/render-assets-content/index.d.ts +1 -0
- package/dist/types-ts4.5/ui/assets-modal/search-container/index.d.ts +1 -2
- package/dist/types-ts4.5/ui/assets-modal/types.d.ts +2 -1
- package/package.json +1 -1
- package/report.api.md +4 -1
- package/tmp/api-report-tmp.d.ts +1 -1
|
@@ -1,13 +1,19 @@
|
|
|
1
1
|
import _extends from "@babel/runtime/helpers/extends";
|
|
2
2
|
/** @jsx jsx */
|
|
3
|
-
import { useCallback, useEffect, useMemo, useState } from 'react';
|
|
3
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
4
4
|
import { css, jsx } from '@emotion/react';
|
|
5
5
|
import { FormattedMessage } 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 { IntlMessagesProvider } from '@atlaskit/intl-messages-provider';
|
|
9
10
|
import Modal, { ModalBody, ModalFooter, ModalHeader, ModalTitle, ModalTransition } from '@atlaskit/modal-dialog';
|
|
10
|
-
import { useDatasourceAnalyticsEvents } from '../../../analytics';
|
|
11
|
+
import { EVENT_CHANNEL, useDatasourceAnalyticsEvents } from '../../../analytics';
|
|
12
|
+
import { packageMetaData } from '../../../analytics/constants';
|
|
13
|
+
import { DatasourceAction, DatasourceDisplay, DatasourceSearchMethod } from '../../../analytics/types';
|
|
14
|
+
import { startUfoExperience } from '../../../analytics/ufoExperiences';
|
|
15
|
+
import { useColumnPickerRenderedFailedUfoExperience } from '../../../analytics/ufoExperiences/hooks/useColumnPickerRenderedFailedUfoExperience';
|
|
16
|
+
import { useDataRenderedUfoExperience } from '../../../analytics/ufoExperiences/hooks/useDataRenderedUfoExperience';
|
|
11
17
|
import { fetchMessagesForLocale } from '../../../common/utils/locale/fetch-messages-for-locale';
|
|
12
18
|
import { useAssetsClient } from '../../../hooks/useAssetsClient';
|
|
13
19
|
import { useDatasourceTableState } from '../../../hooks/useDatasourceTableState';
|
|
@@ -38,6 +44,9 @@ const PlainAssetsConfigModal = props => {
|
|
|
38
44
|
const {
|
|
39
45
|
fireEvent
|
|
40
46
|
} = useDatasourceAnalyticsEvents();
|
|
47
|
+
const {
|
|
48
|
+
current: modalRenderInstanceId
|
|
49
|
+
} = useRef(uuidv4());
|
|
41
50
|
|
|
42
51
|
// If a workspaceError occurs this is a critical error
|
|
43
52
|
const {
|
|
@@ -60,18 +69,74 @@ const PlainAssetsConfigModal = props => {
|
|
|
60
69
|
loadDatasourceDetails,
|
|
61
70
|
hasNextPage,
|
|
62
71
|
columns,
|
|
63
|
-
defaultVisibleColumnKeys
|
|
72
|
+
defaultVisibleColumnKeys,
|
|
73
|
+
extensionKey = null,
|
|
74
|
+
destinationObjectTypes,
|
|
75
|
+
totalCount
|
|
64
76
|
} = useDatasourceTableState({
|
|
65
77
|
datasourceId,
|
|
66
78
|
parameters: isParametersSet ? parameters : undefined,
|
|
67
79
|
fieldKeys: isNewSearch ? [] : visibleColumnKeys
|
|
68
80
|
});
|
|
81
|
+
|
|
82
|
+
/* ------------------------------ OBSERVABILITY ------------------------------ */
|
|
83
|
+
const searchCount = useRef(0);
|
|
84
|
+
const userInteractionActions = useRef(new Set());
|
|
85
|
+
const visibleColumnCount = useRef((visibleColumnKeys === null || visibleColumnKeys === void 0 ? void 0 : visibleColumnKeys.length) || 0);
|
|
86
|
+
const isDataReady = (visibleColumnKeys || []).length > 0;
|
|
87
|
+
const analyticsPayload = useMemo(() => {
|
|
88
|
+
return {
|
|
89
|
+
extensionKey: extensionKey,
|
|
90
|
+
destinationObjectTypes: destinationObjectTypes
|
|
91
|
+
};
|
|
92
|
+
}, [destinationObjectTypes, extensionKey]);
|
|
93
|
+
useEffect(() => {
|
|
94
|
+
fireEvent('screen.datasourceModalDialog.viewed', {});
|
|
95
|
+
}, [fireEvent]);
|
|
96
|
+
const fireTableViewedEvent = useCallback(() => {
|
|
97
|
+
if (isDataReady) {
|
|
98
|
+
fireEvent('ui.table.viewed.datasourceConfigModal', {
|
|
99
|
+
...analyticsPayload,
|
|
100
|
+
totalItemCount: totalCount || 0,
|
|
101
|
+
searchMethod: DatasourceSearchMethod.DATASOURCE_SEARCH_QUERY,
|
|
102
|
+
displayedColumnCount: visibleColumnCount.current
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
}, [analyticsPayload, fireEvent, totalCount, isDataReady]);
|
|
106
|
+
useEffect(() => {
|
|
107
|
+
const isResolved = status === 'resolved';
|
|
108
|
+
if (!isResolved || !totalCount) {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
if (totalCount > 1) {
|
|
112
|
+
fireTableViewedEvent();
|
|
113
|
+
}
|
|
114
|
+
}, [fireTableViewedEvent, status, totalCount]);
|
|
115
|
+
useEffect(() => {
|
|
116
|
+
const shouldStartUfoExperience = status === 'loading';
|
|
117
|
+
if (shouldStartUfoExperience) {
|
|
118
|
+
startUfoExperience({
|
|
119
|
+
name: 'datasource-rendered'
|
|
120
|
+
}, modalRenderInstanceId);
|
|
121
|
+
}
|
|
122
|
+
}, [modalRenderInstanceId, status]);
|
|
123
|
+
useDataRenderedUfoExperience({
|
|
124
|
+
status,
|
|
125
|
+
experienceId: modalRenderInstanceId,
|
|
126
|
+
itemCount: responseItems.length,
|
|
127
|
+
canBeLink: false,
|
|
128
|
+
extensionKey
|
|
129
|
+
});
|
|
130
|
+
useColumnPickerRenderedFailedUfoExperience(status, modalRenderInstanceId);
|
|
131
|
+
/* ------------------------------ END OBSERVABILITY ------------------------------ */
|
|
132
|
+
|
|
69
133
|
const onVisibleColumnKeysChange = useCallback(visibleColumnKeys => {
|
|
70
134
|
setVisibleColumnKeys(visibleColumnKeys);
|
|
71
135
|
setIsNewSearch(false);
|
|
72
136
|
}, []);
|
|
73
137
|
useEffect(() => {
|
|
74
138
|
const newVisibleColumnKeys = !initialVisibleColumnKeys || (initialVisibleColumnKeys || []).length === 0 ? defaultVisibleColumnKeys : initialVisibleColumnKeys;
|
|
139
|
+
visibleColumnCount.current = newVisibleColumnKeys.length;
|
|
75
140
|
setVisibleColumnKeys(newVisibleColumnKeys);
|
|
76
141
|
}, [initialVisibleColumnKeys, defaultVisibleColumnKeys]);
|
|
77
142
|
useEffect(() => {
|
|
@@ -79,20 +144,33 @@ const PlainAssetsConfigModal = props => {
|
|
|
79
144
|
setVisibleColumnKeys(defaultVisibleColumnKeys);
|
|
80
145
|
}
|
|
81
146
|
}, [defaultVisibleColumnKeys, isNewSearch]);
|
|
82
|
-
|
|
83
|
-
fireEvent('screen.datasourceModalDialog.viewed', {});
|
|
84
|
-
}, [fireEvent]);
|
|
85
|
-
const isDisabled = !!workspaceError || status === 'rejected' || status === 'loading' || status === 'empty' || !!workspaceError || assetsClientLoading || !aql || !schemaId;
|
|
147
|
+
const isDisabled = !!workspaceError || status === 'rejected' || status === 'loading' || status === 'empty' || assetsClientLoading || !aql || !schemaId;
|
|
86
148
|
const retrieveUrlForSmartCardRender = useCallback(() => {
|
|
87
149
|
var _data$key, _data$key$data;
|
|
88
150
|
const [data] = responseItems;
|
|
89
151
|
// agreement with BE that we will use `key` for rendering smartlink
|
|
90
152
|
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;
|
|
91
153
|
}, [responseItems]);
|
|
92
|
-
const onInsertPressed = useCallback(() => {
|
|
154
|
+
const onInsertPressed = useCallback((e, analyticsEvent) => {
|
|
155
|
+
var _insertButtonClickedE;
|
|
93
156
|
if (!aql || !schemaId || !workspaceId) {
|
|
94
157
|
return;
|
|
95
158
|
}
|
|
159
|
+
const insertButtonClickedEvent = analyticsEvent.update({
|
|
160
|
+
actionSubjectId: 'insert',
|
|
161
|
+
attributes: {
|
|
162
|
+
...analyticsPayload,
|
|
163
|
+
totalItemCount: totalCount || 0,
|
|
164
|
+
displayedColumnCount: visibleColumnCount.current,
|
|
165
|
+
display: DatasourceDisplay.DATASOURCE_TABLE,
|
|
166
|
+
searchCount: searchCount.current,
|
|
167
|
+
searchMethod: DatasourceSearchMethod.DATASOURCE_SEARCH_QUERY,
|
|
168
|
+
actions: Array.from(userInteractionActions.current)
|
|
169
|
+
},
|
|
170
|
+
eventType: 'ui'
|
|
171
|
+
});
|
|
172
|
+
const consumerEvent = (_insertButtonClickedE = insertButtonClickedEvent.clone()) !== null && _insertButtonClickedE !== void 0 ? _insertButtonClickedE : undefined;
|
|
173
|
+
insertButtonClickedEvent.fire(EVENT_CHANNEL);
|
|
96
174
|
const firstAssetUrl = retrieveUrlForSmartCardRender();
|
|
97
175
|
if (responseItems.length === 1 && firstAssetUrl) {
|
|
98
176
|
onInsert({
|
|
@@ -100,7 +178,7 @@ const PlainAssetsConfigModal = props => {
|
|
|
100
178
|
attrs: {
|
|
101
179
|
url: firstAssetUrl
|
|
102
180
|
}
|
|
103
|
-
});
|
|
181
|
+
}, consumerEvent);
|
|
104
182
|
} else {
|
|
105
183
|
onInsert({
|
|
106
184
|
type: 'blockCard',
|
|
@@ -122,11 +200,30 @@ const PlainAssetsConfigModal = props => {
|
|
|
122
200
|
}]
|
|
123
201
|
}
|
|
124
202
|
}
|
|
125
|
-
});
|
|
203
|
+
}, consumerEvent);
|
|
126
204
|
}
|
|
127
|
-
}, [aql, schemaId, workspaceId, retrieveUrlForSmartCardRender, responseItems.length, onInsert, datasourceId, visibleColumnKeys]);
|
|
205
|
+
}, [aql, schemaId, workspaceId, analyticsPayload, totalCount, retrieveUrlForSmartCardRender, responseItems.length, onInsert, datasourceId, visibleColumnKeys]);
|
|
206
|
+
const onCancelClick = useCallback((e, analyticEvent) => {
|
|
207
|
+
analyticEvent.update({
|
|
208
|
+
eventType: 'ui',
|
|
209
|
+
actionSubjectId: 'cancel',
|
|
210
|
+
attributes: {
|
|
211
|
+
...analyticsPayload,
|
|
212
|
+
searchCount: searchCount.current,
|
|
213
|
+
actions: Array.from(userInteractionActions.current)
|
|
214
|
+
}
|
|
215
|
+
}).fire(EVENT_CHANNEL);
|
|
216
|
+
onCancel();
|
|
217
|
+
}, [analyticsPayload, onCancel]);
|
|
128
218
|
const handleOnSearch = useCallback(async (searchAql, searchSchemaId) => {
|
|
129
219
|
if (schemaId !== searchSchemaId || aql !== searchAql) {
|
|
220
|
+
searchCount.current++;
|
|
221
|
+
if (schemaId !== searchSchemaId) {
|
|
222
|
+
userInteractionActions.current.add(DatasourceAction.SCHEMA_UPDATED);
|
|
223
|
+
}
|
|
224
|
+
if (aql !== searchAql) {
|
|
225
|
+
userInteractionActions.current.add(DatasourceAction.QUERY_UPDATED);
|
|
226
|
+
}
|
|
130
227
|
reset({
|
|
131
228
|
shouldResetColumns: true
|
|
132
229
|
});
|
|
@@ -179,10 +276,11 @@ const PlainAssetsConfigModal = props => {
|
|
|
179
276
|
hasNextPage: hasNextPage,
|
|
180
277
|
loadDatasourceDetails: loadDatasourceDetails,
|
|
181
278
|
columns: columns,
|
|
182
|
-
defaultVisibleColumnKeys: defaultVisibleColumnKeys
|
|
279
|
+
defaultVisibleColumnKeys: defaultVisibleColumnKeys,
|
|
280
|
+
modalRenderInstanceId: modalRenderInstanceId
|
|
183
281
|
}))), jsx(ModalFooter, null, jsx(Button, {
|
|
184
282
|
appearance: "default",
|
|
185
|
-
onClick:
|
|
283
|
+
onClick: onCancelClick,
|
|
186
284
|
testId: 'asset-datasource-modal--cancel-button'
|
|
187
285
|
}, jsx(FormattedMessage, modalMessages.cancelButtonText)), jsx(Button, {
|
|
188
286
|
appearance: "primary",
|
|
@@ -199,8 +297,7 @@ const analyticsContextAttributes = {
|
|
|
199
297
|
dataProvider: 'jsm-assets'
|
|
200
298
|
};
|
|
201
299
|
const analyticsContextData = {
|
|
202
|
-
|
|
203
|
-
packageVersion: "1.10.3",
|
|
300
|
+
...packageMetaData,
|
|
204
301
|
source: 'datasourceConfigModal'
|
|
205
302
|
};
|
|
206
303
|
const contextData = {
|
|
@@ -13,7 +13,8 @@ export const RenderAssetsContent = props => {
|
|
|
13
13
|
loadDatasourceDetails,
|
|
14
14
|
columns,
|
|
15
15
|
defaultVisibleColumnKeys,
|
|
16
|
-
onVisibleColumnKeysChange
|
|
16
|
+
onVisibleColumnKeysChange,
|
|
17
|
+
modalRenderInstanceId
|
|
17
18
|
} = props;
|
|
18
19
|
const resolvedWithNoResults = status === 'resolved' && !responseItems.length;
|
|
19
20
|
const issueLikeDataTableView = useMemo(() => /*#__PURE__*/React.createElement(IssueLikeDataTableView, {
|
|
@@ -25,8 +26,9 @@ export const RenderAssetsContent = props => {
|
|
|
25
26
|
visibleColumnKeys: visibleColumnKeys || defaultVisibleColumnKeys,
|
|
26
27
|
onNextPage: onNextPage,
|
|
27
28
|
onLoadDatasourceDetails: loadDatasourceDetails,
|
|
28
|
-
onVisibleColumnKeysChange: onVisibleColumnKeysChange
|
|
29
|
-
|
|
29
|
+
onVisibleColumnKeysChange: onVisibleColumnKeysChange,
|
|
30
|
+
parentContainerRenderInstanceId: modalRenderInstanceId
|
|
31
|
+
}), [columns, defaultVisibleColumnKeys, hasNextPage, loadDatasourceDetails, onNextPage, onVisibleColumnKeysChange, responseItems, status, visibleColumnKeys, modalRenderInstanceId]);
|
|
30
32
|
if (status === 'rejected') {
|
|
31
33
|
return /*#__PURE__*/React.createElement(ModalLoadingError, null);
|
|
32
34
|
} else if (status === 'empty') {
|
|
@@ -2,6 +2,7 @@ import _extends from "@babel/runtime/helpers/extends";
|
|
|
2
2
|
/** @jsx jsx */
|
|
3
3
|
import { jsx } from '@emotion/react';
|
|
4
4
|
import Form from '@atlaskit/form';
|
|
5
|
+
import { useDatasourceAnalyticsEvents } from '../../../analytics';
|
|
5
6
|
import { AqlSearchInput } from './aql-search-input';
|
|
6
7
|
import { AssetsObjectSchemaSelect } from './object-schema-select';
|
|
7
8
|
import { FormContainer, FormRowContainer, SchemaSelectContainer } from './styled';
|
|
@@ -15,12 +16,16 @@ export const AssetsSearchContainer = props => {
|
|
|
15
16
|
modalTitle,
|
|
16
17
|
isSearching
|
|
17
18
|
} = props;
|
|
19
|
+
const {
|
|
20
|
+
fireEvent
|
|
21
|
+
} = useDatasourceAnalyticsEvents();
|
|
18
22
|
const onFormSubmit = searchFormValues => {
|
|
19
23
|
const {
|
|
20
24
|
aql,
|
|
21
25
|
objectSchema
|
|
22
26
|
} = searchFormValues;
|
|
23
27
|
if (objectSchema) {
|
|
28
|
+
fireEvent('ui.aqlEditor.searched', {});
|
|
24
29
|
// Pass the validated aql and object schema back to modal
|
|
25
30
|
onSearch(aql, objectSchema.value);
|
|
26
31
|
}
|
|
@@ -1,18 +1,23 @@
|
|
|
1
1
|
import _extends from "@babel/runtime/helpers/extends";
|
|
2
2
|
/** @jsx jsx */
|
|
3
3
|
|
|
4
|
+
import { useEffect, useState } from 'react';
|
|
4
5
|
import { jsx } from '@emotion/react';
|
|
5
6
|
import debounce from 'debounce-promise';
|
|
6
7
|
import { useIntl } from 'react-intl-next';
|
|
7
8
|
import { Field } from '@atlaskit/form';
|
|
8
9
|
import { AsyncSelect } from '@atlaskit/select';
|
|
9
10
|
import { layers } from '@atlaskit/theme/constants';
|
|
11
|
+
import { useDatasourceAnalyticsEvents } from '../../../../analytics';
|
|
10
12
|
import { useObjectSchemas } from '../../../../hooks/useObjectSchemas';
|
|
11
13
|
import { objectSchemaKey } from '../../../../types/assets/types';
|
|
12
14
|
import { FieldContainer } from '../styled';
|
|
13
15
|
import { objectSchemaSelectMessages } from './messages';
|
|
14
16
|
import { objectSchemaToSelectOption } from './utils';
|
|
15
17
|
export const SEARCH_DEBOUNCE_MS = 350;
|
|
18
|
+
const mapObjectSchemasToOptions = objectSchemas => {
|
|
19
|
+
return objectSchemas ? objectSchemas.map(objectSchema => objectSchemaToSelectOption(objectSchema)) : [];
|
|
20
|
+
};
|
|
16
21
|
|
|
17
22
|
/**
|
|
18
23
|
* Rendering a `<Select>` in a `<Modal>` results in the select options getting cut off by the bottom of the modal and
|
|
@@ -32,6 +37,10 @@ export const AssetsObjectSchemaSelect = ({
|
|
|
32
37
|
workspaceId,
|
|
33
38
|
classNamePrefix = 'assets-datasource-modal--object-schema-select'
|
|
34
39
|
}) => {
|
|
40
|
+
const [defaultOptions, setDefaultOptions] = useState(null);
|
|
41
|
+
const {
|
|
42
|
+
fireEvent
|
|
43
|
+
} = useDatasourceAnalyticsEvents();
|
|
35
44
|
const {
|
|
36
45
|
formatMessage
|
|
37
46
|
} = useIntl();
|
|
@@ -40,10 +49,29 @@ export const AssetsObjectSchemaSelect = ({
|
|
|
40
49
|
objectSchemasLoading
|
|
41
50
|
} = useObjectSchemas(workspaceId);
|
|
42
51
|
const selectedObjectSchema = value ? objectSchemaToSelectOption(value) : undefined;
|
|
52
|
+
useEffect(() => {
|
|
53
|
+
const fetchInitialData = async () => {
|
|
54
|
+
const {
|
|
55
|
+
objectSchemas,
|
|
56
|
+
totalObjectSchemas
|
|
57
|
+
} = await fetchObjectSchemas('');
|
|
58
|
+
// We only want to send modal ready event once after we've fetched the schema count
|
|
59
|
+
fireEvent('ui.modal.ready.datasource', {
|
|
60
|
+
schemasCount: totalObjectSchemas !== null && totalObjectSchemas !== void 0 ? totalObjectSchemas : 0,
|
|
61
|
+
instancesCount: null
|
|
62
|
+
});
|
|
63
|
+
setDefaultOptions(mapObjectSchemasToOptions(objectSchemas));
|
|
64
|
+
};
|
|
65
|
+
if (defaultOptions === null) {
|
|
66
|
+
fetchInitialData();
|
|
67
|
+
}
|
|
68
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
69
|
+
}, []);
|
|
43
70
|
const loadOptions = async inputValue => {
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
|
|
71
|
+
const {
|
|
72
|
+
objectSchemas
|
|
73
|
+
} = await fetchObjectSchemas(inputValue);
|
|
74
|
+
return mapObjectSchemasToOptions(objectSchemas);
|
|
47
75
|
};
|
|
48
76
|
const debouncedLoadOptions = debounce(loadOptions, SEARCH_DEBOUNCE_MS);
|
|
49
77
|
const validateSchema = value => {
|
|
@@ -66,8 +94,7 @@ export const AssetsObjectSchemaSelect = ({
|
|
|
66
94
|
autoFocus: true,
|
|
67
95
|
classNamePrefix: classNamePrefix,
|
|
68
96
|
isLoading: objectSchemasLoading,
|
|
69
|
-
defaultOptions:
|
|
70
|
-
,
|
|
97
|
+
defaultOptions: defaultOptions !== null && defaultOptions !== void 0 ? defaultOptions : [],
|
|
71
98
|
isSearchable: true,
|
|
72
99
|
loadOptions: debouncedLoadOptions,
|
|
73
100
|
placeholder: formatMessage(objectSchemaSelectMessages.placeholder),
|
|
@@ -179,7 +179,8 @@ export const PlainJiraIssuesConfigModal = props => {
|
|
|
179
179
|
const sortedAvailableSites = [...jiraSites].sort((a, b) => a.displayName.localeCompare(b.displayName));
|
|
180
180
|
setAvailableSites(sortedAvailableSites);
|
|
181
181
|
fireEvent('ui.modal.ready.datasource', {
|
|
182
|
-
instancesCount: sortedAvailableSites.length
|
|
182
|
+
instancesCount: sortedAvailableSites.length,
|
|
183
|
+
schemasCount: null
|
|
183
184
|
});
|
|
184
185
|
};
|
|
185
186
|
void fetchSiteDisplayNames();
|
|
@@ -6,6 +6,7 @@ export var DatasourceAction = /*#__PURE__*/function (DatasourceAction) {
|
|
|
6
6
|
DatasourceAction["QUERY_UPDATED"] = "query updated";
|
|
7
7
|
DatasourceAction["DISPLAY_VIEW_CHANGED"] = "display view changed";
|
|
8
8
|
DatasourceAction["NEXT_PAGE_SCROLLED"] = "next page scrolled";
|
|
9
|
+
DatasourceAction["SCHEMA_UPDATED"] = "schema updated";
|
|
9
10
|
return DatasourceAction;
|
|
10
11
|
}({});
|
|
11
12
|
export var DatasourceDisplay = /*#__PURE__*/function (DatasourceDisplay) {
|
|
@@ -14,11 +14,15 @@ export var useObjectSchemas = function useObjectSchemas(workspaceId) {
|
|
|
14
14
|
setObjectSchemas = _useState4[1];
|
|
15
15
|
var _useState5 = useState(),
|
|
16
16
|
_useState6 = _slicedToArray(_useState5, 2),
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
totalObjectSchemas = _useState6[0],
|
|
18
|
+
setTotalObjectSchemas = _useState6[1];
|
|
19
|
+
var _useState7 = useState(),
|
|
20
|
+
_useState8 = _slicedToArray(_useState7, 2),
|
|
21
|
+
error = _useState8[0],
|
|
22
|
+
setError = _useState8[1];
|
|
19
23
|
var request = useCallback( /*#__PURE__*/function () {
|
|
20
24
|
var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(query) {
|
|
21
|
-
var fetchedObjectSchemas, fetchedObjectSchemasResponse;
|
|
25
|
+
var fetchedObjectSchemas, fetchTotalObjectSchemas, fetchedObjectSchemasResponse;
|
|
22
26
|
return _regeneratorRuntime.wrap(function _callee$(_context) {
|
|
23
27
|
while (1) switch (_context.prev = _context.next) {
|
|
24
28
|
case 0:
|
|
@@ -30,28 +34,33 @@ export var useObjectSchemas = function useObjectSchemas(workspaceId) {
|
|
|
30
34
|
case 5:
|
|
31
35
|
fetchedObjectSchemasResponse = _context.sent;
|
|
32
36
|
setObjectSchemas(fetchedObjectSchemasResponse.values);
|
|
37
|
+
setTotalObjectSchemas(fetchedObjectSchemasResponse.total);
|
|
33
38
|
fetchedObjectSchemas = fetchedObjectSchemasResponse.values;
|
|
34
|
-
|
|
39
|
+
fetchTotalObjectSchemas = fetchedObjectSchemasResponse.total;
|
|
40
|
+
_context.next = 15;
|
|
35
41
|
break;
|
|
36
|
-
case
|
|
37
|
-
_context.prev =
|
|
42
|
+
case 12:
|
|
43
|
+
_context.prev = 12;
|
|
38
44
|
_context.t0 = _context["catch"](2);
|
|
39
45
|
if (_context.t0 instanceof Error) {
|
|
40
46
|
setError(_context.t0);
|
|
41
47
|
} else {
|
|
42
48
|
setError(new Error('Unexpected error occured'));
|
|
43
49
|
}
|
|
44
|
-
case
|
|
45
|
-
_context.prev =
|
|
50
|
+
case 15:
|
|
51
|
+
_context.prev = 15;
|
|
46
52
|
setLoading(false);
|
|
47
|
-
return _context.finish(
|
|
48
|
-
case
|
|
49
|
-
return _context.abrupt("return",
|
|
50
|
-
|
|
53
|
+
return _context.finish(15);
|
|
54
|
+
case 18:
|
|
55
|
+
return _context.abrupt("return", {
|
|
56
|
+
objectSchemas: fetchedObjectSchemas,
|
|
57
|
+
totalObjectSchemas: fetchTotalObjectSchemas
|
|
58
|
+
});
|
|
59
|
+
case 19:
|
|
51
60
|
case "end":
|
|
52
61
|
return _context.stop();
|
|
53
62
|
}
|
|
54
|
-
}, _callee, null, [[2,
|
|
63
|
+
}, _callee, null, [[2, 12, 15, 18]]);
|
|
55
64
|
}));
|
|
56
65
|
return function (_x) {
|
|
57
66
|
return _ref.apply(this, arguments);
|
|
@@ -61,6 +70,7 @@ export var useObjectSchemas = function useObjectSchemas(workspaceId) {
|
|
|
61
70
|
objectSchemasLoading: loading,
|
|
62
71
|
objectSchemasError: error,
|
|
63
72
|
objectSchemas: objectSchemas,
|
|
73
|
+
totalObjectSchemas: totalObjectSchemas,
|
|
64
74
|
fetchObjectSchemas: request
|
|
65
75
|
};
|
|
66
76
|
};
|
|
@@ -1,19 +1,25 @@
|
|
|
1
|
-
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
1
|
import _extends from "@babel/runtime/helpers/extends";
|
|
3
2
|
import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
|
|
3
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
4
4
|
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
5
|
+
import _regeneratorRuntime from "@babel/runtime/regenerator";
|
|
5
6
|
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; }
|
|
6
7
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
7
|
-
import _regeneratorRuntime from "@babel/runtime/regenerator";
|
|
8
8
|
/** @jsx jsx */
|
|
9
|
-
import { useCallback, useEffect, useMemo, useState } from 'react';
|
|
9
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
10
10
|
import { css, jsx } from '@emotion/react';
|
|
11
11
|
import { FormattedMessage } 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 { IntlMessagesProvider } from '@atlaskit/intl-messages-provider';
|
|
15
16
|
import Modal, { ModalBody, ModalFooter, ModalHeader, ModalTitle, ModalTransition } from '@atlaskit/modal-dialog';
|
|
16
|
-
import { useDatasourceAnalyticsEvents } from '../../../analytics';
|
|
17
|
+
import { EVENT_CHANNEL, useDatasourceAnalyticsEvents } from '../../../analytics';
|
|
18
|
+
import { packageMetaData } from '../../../analytics/constants';
|
|
19
|
+
import { DatasourceAction, DatasourceDisplay, DatasourceSearchMethod } from '../../../analytics/types';
|
|
20
|
+
import { startUfoExperience } from '../../../analytics/ufoExperiences';
|
|
21
|
+
import { useColumnPickerRenderedFailedUfoExperience } from '../../../analytics/ufoExperiences/hooks/useColumnPickerRenderedFailedUfoExperience';
|
|
22
|
+
import { useDataRenderedUfoExperience } from '../../../analytics/ufoExperiences/hooks/useDataRenderedUfoExperience';
|
|
17
23
|
import { fetchMessagesForLocale } from '../../../common/utils/locale/fetch-messages-for-locale';
|
|
18
24
|
import { useAssetsClient } from '../../../hooks/useAssetsClient';
|
|
19
25
|
import { useDatasourceTableState } from '../../../hooks/useDatasourceTableState';
|
|
@@ -53,6 +59,8 @@ var PlainAssetsConfigModal = function PlainAssetsConfigModal(props) {
|
|
|
53
59
|
setIsNewSearch = _useState8[1];
|
|
54
60
|
var _useDatasourceAnalyti = useDatasourceAnalyticsEvents(),
|
|
55
61
|
fireEvent = _useDatasourceAnalyti.fireEvent;
|
|
62
|
+
var _useRef = useRef(uuidv4()),
|
|
63
|
+
modalRenderInstanceId = _useRef.current;
|
|
56
64
|
|
|
57
65
|
// If a workspaceError occurs this is a critical error
|
|
58
66
|
var _useAssetsClient = useAssetsClient(initialParameters),
|
|
@@ -80,13 +88,69 @@ var PlainAssetsConfigModal = function PlainAssetsConfigModal(props) {
|
|
|
80
88
|
loadDatasourceDetails = _useDatasourceTableSt.loadDatasourceDetails,
|
|
81
89
|
hasNextPage = _useDatasourceTableSt.hasNextPage,
|
|
82
90
|
columns = _useDatasourceTableSt.columns,
|
|
83
|
-
defaultVisibleColumnKeys = _useDatasourceTableSt.defaultVisibleColumnKeys
|
|
91
|
+
defaultVisibleColumnKeys = _useDatasourceTableSt.defaultVisibleColumnKeys,
|
|
92
|
+
_useDatasourceTableSt2 = _useDatasourceTableSt.extensionKey,
|
|
93
|
+
extensionKey = _useDatasourceTableSt2 === void 0 ? null : _useDatasourceTableSt2,
|
|
94
|
+
destinationObjectTypes = _useDatasourceTableSt.destinationObjectTypes,
|
|
95
|
+
totalCount = _useDatasourceTableSt.totalCount;
|
|
96
|
+
|
|
97
|
+
/* ------------------------------ OBSERVABILITY ------------------------------ */
|
|
98
|
+
var searchCount = useRef(0);
|
|
99
|
+
var userInteractionActions = useRef(new Set());
|
|
100
|
+
var visibleColumnCount = useRef((visibleColumnKeys === null || visibleColumnKeys === void 0 ? void 0 : visibleColumnKeys.length) || 0);
|
|
101
|
+
var isDataReady = (visibleColumnKeys || []).length > 0;
|
|
102
|
+
var analyticsPayload = useMemo(function () {
|
|
103
|
+
return {
|
|
104
|
+
extensionKey: extensionKey,
|
|
105
|
+
destinationObjectTypes: destinationObjectTypes
|
|
106
|
+
};
|
|
107
|
+
}, [destinationObjectTypes, extensionKey]);
|
|
108
|
+
useEffect(function () {
|
|
109
|
+
fireEvent('screen.datasourceModalDialog.viewed', {});
|
|
110
|
+
}, [fireEvent]);
|
|
111
|
+
var fireTableViewedEvent = useCallback(function () {
|
|
112
|
+
if (isDataReady) {
|
|
113
|
+
fireEvent('ui.table.viewed.datasourceConfigModal', _objectSpread(_objectSpread({}, analyticsPayload), {}, {
|
|
114
|
+
totalItemCount: totalCount || 0,
|
|
115
|
+
searchMethod: DatasourceSearchMethod.DATASOURCE_SEARCH_QUERY,
|
|
116
|
+
displayedColumnCount: visibleColumnCount.current
|
|
117
|
+
}));
|
|
118
|
+
}
|
|
119
|
+
}, [analyticsPayload, fireEvent, totalCount, isDataReady]);
|
|
120
|
+
useEffect(function () {
|
|
121
|
+
var isResolved = status === 'resolved';
|
|
122
|
+
if (!isResolved || !totalCount) {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
if (totalCount > 1) {
|
|
126
|
+
fireTableViewedEvent();
|
|
127
|
+
}
|
|
128
|
+
}, [fireTableViewedEvent, status, totalCount]);
|
|
129
|
+
useEffect(function () {
|
|
130
|
+
var shouldStartUfoExperience = status === 'loading';
|
|
131
|
+
if (shouldStartUfoExperience) {
|
|
132
|
+
startUfoExperience({
|
|
133
|
+
name: 'datasource-rendered'
|
|
134
|
+
}, modalRenderInstanceId);
|
|
135
|
+
}
|
|
136
|
+
}, [modalRenderInstanceId, status]);
|
|
137
|
+
useDataRenderedUfoExperience({
|
|
138
|
+
status: status,
|
|
139
|
+
experienceId: modalRenderInstanceId,
|
|
140
|
+
itemCount: responseItems.length,
|
|
141
|
+
canBeLink: false,
|
|
142
|
+
extensionKey: extensionKey
|
|
143
|
+
});
|
|
144
|
+
useColumnPickerRenderedFailedUfoExperience(status, modalRenderInstanceId);
|
|
145
|
+
/* ------------------------------ END OBSERVABILITY ------------------------------ */
|
|
146
|
+
|
|
84
147
|
var onVisibleColumnKeysChange = useCallback(function (visibleColumnKeys) {
|
|
85
148
|
setVisibleColumnKeys(visibleColumnKeys);
|
|
86
149
|
setIsNewSearch(false);
|
|
87
150
|
}, []);
|
|
88
151
|
useEffect(function () {
|
|
89
152
|
var newVisibleColumnKeys = !initialVisibleColumnKeys || (initialVisibleColumnKeys || []).length === 0 ? defaultVisibleColumnKeys : initialVisibleColumnKeys;
|
|
153
|
+
visibleColumnCount.current = newVisibleColumnKeys.length;
|
|
90
154
|
setVisibleColumnKeys(newVisibleColumnKeys);
|
|
91
155
|
}, [initialVisibleColumnKeys, defaultVisibleColumnKeys]);
|
|
92
156
|
useEffect(function () {
|
|
@@ -94,10 +158,7 @@ var PlainAssetsConfigModal = function PlainAssetsConfigModal(props) {
|
|
|
94
158
|
setVisibleColumnKeys(defaultVisibleColumnKeys);
|
|
95
159
|
}
|
|
96
160
|
}, [defaultVisibleColumnKeys, isNewSearch]);
|
|
97
|
-
|
|
98
|
-
fireEvent('screen.datasourceModalDialog.viewed', {});
|
|
99
|
-
}, [fireEvent]);
|
|
100
|
-
var isDisabled = !!workspaceError || status === 'rejected' || status === 'loading' || status === 'empty' || !!workspaceError || assetsClientLoading || !aql || !schemaId;
|
|
161
|
+
var isDisabled = !!workspaceError || status === 'rejected' || status === 'loading' || status === 'empty' || assetsClientLoading || !aql || !schemaId;
|
|
101
162
|
var retrieveUrlForSmartCardRender = useCallback(function () {
|
|
102
163
|
var _data$key;
|
|
103
164
|
var _responseItems = _slicedToArray(responseItems, 1),
|
|
@@ -105,10 +166,25 @@ var PlainAssetsConfigModal = function PlainAssetsConfigModal(props) {
|
|
|
105
166
|
// agreement with BE that we will use `key` for rendering smartlink
|
|
106
167
|
return data === null || data === void 0 || (_data$key = data.key) === null || _data$key === void 0 || (_data$key = _data$key.data) === null || _data$key === void 0 ? void 0 : _data$key.url;
|
|
107
168
|
}, [responseItems]);
|
|
108
|
-
var onInsertPressed = useCallback(function () {
|
|
169
|
+
var onInsertPressed = useCallback(function (e, analyticsEvent) {
|
|
170
|
+
var _insertButtonClickedE;
|
|
109
171
|
if (!aql || !schemaId || !workspaceId) {
|
|
110
172
|
return;
|
|
111
173
|
}
|
|
174
|
+
var insertButtonClickedEvent = analyticsEvent.update({
|
|
175
|
+
actionSubjectId: 'insert',
|
|
176
|
+
attributes: _objectSpread(_objectSpread({}, analyticsPayload), {}, {
|
|
177
|
+
totalItemCount: totalCount || 0,
|
|
178
|
+
displayedColumnCount: visibleColumnCount.current,
|
|
179
|
+
display: DatasourceDisplay.DATASOURCE_TABLE,
|
|
180
|
+
searchCount: searchCount.current,
|
|
181
|
+
searchMethod: DatasourceSearchMethod.DATASOURCE_SEARCH_QUERY,
|
|
182
|
+
actions: Array.from(userInteractionActions.current)
|
|
183
|
+
}),
|
|
184
|
+
eventType: 'ui'
|
|
185
|
+
});
|
|
186
|
+
var consumerEvent = (_insertButtonClickedE = insertButtonClickedEvent.clone()) !== null && _insertButtonClickedE !== void 0 ? _insertButtonClickedE : undefined;
|
|
187
|
+
insertButtonClickedEvent.fire(EVENT_CHANNEL);
|
|
112
188
|
var firstAssetUrl = retrieveUrlForSmartCardRender();
|
|
113
189
|
if (responseItems.length === 1 && firstAssetUrl) {
|
|
114
190
|
onInsert({
|
|
@@ -116,7 +192,7 @@ var PlainAssetsConfigModal = function PlainAssetsConfigModal(props) {
|
|
|
116
192
|
attrs: {
|
|
117
193
|
url: firstAssetUrl
|
|
118
194
|
}
|
|
119
|
-
});
|
|
195
|
+
}, consumerEvent);
|
|
120
196
|
} else {
|
|
121
197
|
onInsert({
|
|
122
198
|
type: 'blockCard',
|
|
@@ -140,15 +216,33 @@ var PlainAssetsConfigModal = function PlainAssetsConfigModal(props) {
|
|
|
140
216
|
}]
|
|
141
217
|
}
|
|
142
218
|
}
|
|
143
|
-
});
|
|
219
|
+
}, consumerEvent);
|
|
144
220
|
}
|
|
145
|
-
}, [aql, schemaId, workspaceId, retrieveUrlForSmartCardRender, responseItems.length, onInsert, datasourceId, visibleColumnKeys]);
|
|
221
|
+
}, [aql, schemaId, workspaceId, analyticsPayload, totalCount, retrieveUrlForSmartCardRender, responseItems.length, onInsert, datasourceId, visibleColumnKeys]);
|
|
222
|
+
var onCancelClick = useCallback(function (e, analyticEvent) {
|
|
223
|
+
analyticEvent.update({
|
|
224
|
+
eventType: 'ui',
|
|
225
|
+
actionSubjectId: 'cancel',
|
|
226
|
+
attributes: _objectSpread(_objectSpread({}, analyticsPayload), {}, {
|
|
227
|
+
searchCount: searchCount.current,
|
|
228
|
+
actions: Array.from(userInteractionActions.current)
|
|
229
|
+
})
|
|
230
|
+
}).fire(EVENT_CHANNEL);
|
|
231
|
+
onCancel();
|
|
232
|
+
}, [analyticsPayload, onCancel]);
|
|
146
233
|
var handleOnSearch = useCallback( /*#__PURE__*/function () {
|
|
147
234
|
var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(searchAql, searchSchemaId) {
|
|
148
235
|
return _regeneratorRuntime.wrap(function _callee$(_context) {
|
|
149
236
|
while (1) switch (_context.prev = _context.next) {
|
|
150
237
|
case 0:
|
|
151
238
|
if (schemaId !== searchSchemaId || aql !== searchAql) {
|
|
239
|
+
searchCount.current++;
|
|
240
|
+
if (schemaId !== searchSchemaId) {
|
|
241
|
+
userInteractionActions.current.add(DatasourceAction.SCHEMA_UPDATED);
|
|
242
|
+
}
|
|
243
|
+
if (aql !== searchAql) {
|
|
244
|
+
userInteractionActions.current.add(DatasourceAction.QUERY_UPDATED);
|
|
245
|
+
}
|
|
152
246
|
reset({
|
|
153
247
|
shouldResetColumns: true
|
|
154
248
|
});
|
|
@@ -210,10 +304,11 @@ var PlainAssetsConfigModal = function PlainAssetsConfigModal(props) {
|
|
|
210
304
|
hasNextPage: hasNextPage,
|
|
211
305
|
loadDatasourceDetails: loadDatasourceDetails,
|
|
212
306
|
columns: columns,
|
|
213
|
-
defaultVisibleColumnKeys: defaultVisibleColumnKeys
|
|
307
|
+
defaultVisibleColumnKeys: defaultVisibleColumnKeys,
|
|
308
|
+
modalRenderInstanceId: modalRenderInstanceId
|
|
214
309
|
}))), jsx(ModalFooter, null, jsx(Button, {
|
|
215
310
|
appearance: "default",
|
|
216
|
-
onClick:
|
|
311
|
+
onClick: onCancelClick,
|
|
217
312
|
testId: 'asset-datasource-modal--cancel-button'
|
|
218
313
|
}, jsx(FormattedMessage, modalMessages.cancelButtonText)), jsx(Button, {
|
|
219
314
|
appearance: "primary",
|
|
@@ -229,11 +324,9 @@ var PlainAssetsConfigModal = function PlainAssetsConfigModal(props) {
|
|
|
229
324
|
var analyticsContextAttributes = {
|
|
230
325
|
dataProvider: 'jsm-assets'
|
|
231
326
|
};
|
|
232
|
-
var analyticsContextData = {
|
|
233
|
-
packageName: "@atlaskit/link-datasource",
|
|
234
|
-
packageVersion: "1.10.3",
|
|
327
|
+
var analyticsContextData = _objectSpread(_objectSpread({}, packageMetaData), {}, {
|
|
235
328
|
source: 'datasourceConfigModal'
|
|
236
|
-
};
|
|
329
|
+
});
|
|
237
330
|
var contextData = _objectSpread(_objectSpread({}, analyticsContextData), {}, {
|
|
238
331
|
attributes: _objectSpread({}, analyticsContextAttributes)
|
|
239
332
|
});
|