@atlaskit/link-datasource 1.16.5 → 1.17.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 +12 -0
- package/dist/cjs/analytics/constants.js +1 -1
- package/dist/cjs/hooks/useDatasourceTableState.js +83 -52
- package/dist/cjs/ui/jira-issues-modal/basic-filters/ui/async-popup-select/index.js +58 -15
- package/dist/cjs/ui/jira-issues-modal/basic-filters/ui/async-popup-select/trigger.js +26 -3
- package/dist/cjs/ui/jira-issues-modal/basic-filters/ui/index.js +6 -3
- package/dist/es2019/analytics/constants.js +1 -1
- package/dist/es2019/hooks/useDatasourceTableState.js +40 -12
- package/dist/es2019/ui/jira-issues-modal/basic-filters/ui/async-popup-select/index.js +41 -16
- package/dist/es2019/ui/jira-issues-modal/basic-filters/ui/async-popup-select/trigger.js +23 -3
- package/dist/es2019/ui/jira-issues-modal/basic-filters/ui/index.js +5 -3
- package/dist/esm/analytics/constants.js +1 -1
- package/dist/esm/hooks/useDatasourceTableState.js +83 -52
- package/dist/esm/ui/jira-issues-modal/basic-filters/ui/async-popup-select/index.js +59 -16
- package/dist/esm/ui/jira-issues-modal/basic-filters/ui/async-popup-select/trigger.js +26 -3
- package/dist/esm/ui/jira-issues-modal/basic-filters/ui/index.js +7 -4
- package/dist/types/ui/jira-issues-modal/basic-filters/ui/async-popup-select/trigger.d.ts +2 -1
- package/dist/types-ts4.5/ui/jira-issues-modal/basic-filters/ui/async-popup-select/trigger.d.ts +2 -1
- package/package.json +3 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @atlaskit/link-datasource
|
|
2
2
|
|
|
3
|
+
## 1.17.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#43023](https://bitbucket.org/atlassian/atlassian-frontend/pull-requests/43023) [`312be02e858`](https://bitbucket.org/atlassian/atlassian-frontend/commits/312be02e858) - [ux] Basic filter dropdown button label now includes first selected item's name. If multiple items are selected then a badge now indicates the remaining number of items. Selected options are also reordered to the top of the select list.
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- [#42504](https://bitbucket.org/atlassian/atlassian-frontend/pull-requests/42504) [`8ee7afb2d85`](https://bitbucket.org/atlassian/atlassian-frontend/commits/8ee7afb2d85) - Added DatasourceDataSchema model.
|
|
12
|
+
Used fields in the request for applying schema.
|
|
13
|
+
- Updated dependencies
|
|
14
|
+
|
|
3
15
|
## 1.16.5
|
|
4
16
|
|
|
5
17
|
### Patch Changes
|
|
@@ -20,6 +20,8 @@ var useDatasourceTableState = exports.useDatasourceTableState = function useData
|
|
|
20
20
|
fieldKeys = _ref$fieldKeys === void 0 ? [] : _ref$fieldKeys;
|
|
21
21
|
var _useDatasourceAnalyti = (0, _analytics.useDatasourceAnalyticsEvents)(),
|
|
22
22
|
fireEvent = _useDatasourceAnalyti.fireEvent;
|
|
23
|
+
var idFieldCount = 1;
|
|
24
|
+
var keyFieldCount = 1;
|
|
23
25
|
var _useState = (0, _react.useState)([]),
|
|
24
26
|
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
|
|
25
27
|
defaultVisibleColumnKeys = _useState2[0],
|
|
@@ -28,42 +30,48 @@ var useDatasourceTableState = exports.useDatasourceTableState = function useData
|
|
|
28
30
|
_useState4 = (0, _slicedToArray2.default)(_useState3, 2),
|
|
29
31
|
lastRequestedFieldKeys = _useState4[0],
|
|
30
32
|
setLastRequestedFieldKeys = _useState4[1];
|
|
31
|
-
var _useState5 = (0, _react.useState)(
|
|
33
|
+
var _useState5 = (0, _react.useState)({
|
|
34
|
+
properties: []
|
|
35
|
+
}),
|
|
32
36
|
_useState6 = (0, _slicedToArray2.default)(_useState5, 2),
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
var _useState7 = (0, _react.useState)(
|
|
37
|
+
fullSchema = _useState6[0],
|
|
38
|
+
setFullSchema = _useState6[1];
|
|
39
|
+
var _useState7 = (0, _react.useState)('empty'),
|
|
36
40
|
_useState8 = (0, _slicedToArray2.default)(_useState7, 2),
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
var _useState9 = (0, _react.useState)(
|
|
41
|
+
status = _useState8[0],
|
|
42
|
+
setStatus = _useState8[1];
|
|
43
|
+
var _useState9 = (0, _react.useState)([]),
|
|
40
44
|
_useState10 = (0, _slicedToArray2.default)(_useState9, 2),
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
var _useState11 = (0, _react.useState)(
|
|
45
|
+
responseItems = _useState10[0],
|
|
46
|
+
setResponseItems = _useState10[1];
|
|
47
|
+
var _useState11 = (0, _react.useState)(true),
|
|
44
48
|
_useState12 = (0, _slicedToArray2.default)(_useState11, 2),
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
var _useState13 = (0, _react.useState)(
|
|
49
|
+
hasNextPage = _useState12[0],
|
|
50
|
+
setHasNextPage = _useState12[1];
|
|
51
|
+
var _useState13 = (0, _react.useState)(undefined),
|
|
48
52
|
_useState14 = (0, _slicedToArray2.default)(_useState13, 2),
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
var _useState15 = (0, _react.useState)(
|
|
53
|
+
nextCursor = _useState14[0],
|
|
54
|
+
setNextCursor = _useState14[1];
|
|
55
|
+
var _useState15 = (0, _react.useState)([]),
|
|
52
56
|
_useState16 = (0, _slicedToArray2.default)(_useState15, 2),
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
var _useState17 = (0, _react.useState)(
|
|
57
|
+
columns = _useState16[0],
|
|
58
|
+
setColumns = _useState16[1];
|
|
59
|
+
var _useState17 = (0, _react.useState)(undefined),
|
|
56
60
|
_useState18 = (0, _slicedToArray2.default)(_useState17, 2),
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
var _useState19 = (0, _react.useState)(
|
|
61
|
+
totalCount = _useState18[0],
|
|
62
|
+
setTotalCount = _useState18[1];
|
|
63
|
+
var _useState19 = (0, _react.useState)(false),
|
|
60
64
|
_useState20 = (0, _slicedToArray2.default)(_useState19, 2),
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
var _useState21 = (0, _react.useState)(),
|
|
65
|
+
shouldForceRequest = _useState20[0],
|
|
66
|
+
setShouldForceRequest = _useState20[1];
|
|
67
|
+
var _useState21 = (0, _react.useState)([]),
|
|
64
68
|
_useState22 = (0, _slicedToArray2.default)(_useState21, 2),
|
|
65
|
-
|
|
66
|
-
|
|
69
|
+
destinationObjectTypes = _useState22[0],
|
|
70
|
+
setDestinationObjectTypes = _useState22[1];
|
|
71
|
+
var _useState23 = (0, _react.useState)(),
|
|
72
|
+
_useState24 = (0, _slicedToArray2.default)(_useState23, 2),
|
|
73
|
+
extensionKey = _useState24[0],
|
|
74
|
+
setExtensionKey = _useState24[1];
|
|
67
75
|
var _useDatasourceClientE = (0, _linkClientExtension.useDatasourceClientExtension)(),
|
|
68
76
|
getDatasourceData = _useDatasourceClientE.getDatasourceData,
|
|
69
77
|
getDatasourceDetails = _useDatasourceClientE.getDatasourceDetails;
|
|
@@ -121,21 +129,39 @@ var useDatasourceTableState = exports.useDatasourceTableState = function useData
|
|
|
121
129
|
}
|
|
122
130
|
}, _callee, null, [[2, 17]]);
|
|
123
131
|
})), [columns, datasourceId, getDatasourceDetails, parameters]);
|
|
124
|
-
var applySchemaProperties = (0, _react.useCallback)(function (
|
|
125
|
-
|
|
126
|
-
|
|
132
|
+
var applySchemaProperties = (0, _react.useCallback)(function (schema, fieldKeys) {
|
|
133
|
+
var properties = schema.properties,
|
|
134
|
+
_schema$defaultProper = schema.defaultProperties,
|
|
135
|
+
defaultProperties = _schema$defaultProper === void 0 ? [] : _schema$defaultProper;
|
|
136
|
+
var propertiesToBeUsed = properties;
|
|
137
|
+
var propertyKeysToBeUsed = Array.isArray(fieldKeys) && fieldKeys.length > 0 ? fieldKeys : defaultProperties;
|
|
138
|
+
if (fieldKeys.length > 0 || defaultProperties.length > 0) {
|
|
139
|
+
propertiesToBeUsed = properties.filter(function (property) {
|
|
140
|
+
return propertyKeysToBeUsed.includes(property.key);
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/*Jira adds identifier fields like id and key to all data responses
|
|
145
|
+
Since defaultProperties already send back the keyField, we are accounting only
|
|
146
|
+
for the idField when we are using defaulProperties
|
|
147
|
+
*/
|
|
148
|
+
if (properties.length > fieldKeys.length + idFieldCount + keyFieldCount && properties.length > defaultProperties.length + idFieldCount) {
|
|
149
|
+
setFullSchema(schema);
|
|
127
150
|
}
|
|
128
|
-
|
|
151
|
+
if (!(0, _isEqual.default)(columns, propertiesToBeUsed)) {
|
|
152
|
+
setColumns(propertiesToBeUsed);
|
|
153
|
+
}
|
|
154
|
+
var newProperties = propertiesToBeUsed.map(function (prop) {
|
|
129
155
|
return prop.key;
|
|
130
156
|
});
|
|
131
157
|
|
|
132
158
|
// when loading for the first time, we will need to set default visible props as /data does not give you that info
|
|
133
159
|
// also, since we dont pass any fields, we will need to set this info as lastRequestedFieldKeys
|
|
134
|
-
if (!(0, _isEqual.default)(defaultVisibleColumnKeys,
|
|
135
|
-
setDefaultVisibleColumnKeys(
|
|
160
|
+
if (!(0, _isEqual.default)(defaultVisibleColumnKeys, newProperties)) {
|
|
161
|
+
setDefaultVisibleColumnKeys(newProperties);
|
|
136
162
|
}
|
|
137
|
-
if (!(0, _isEqual.default)(lastRequestedFieldKeys,
|
|
138
|
-
setLastRequestedFieldKeys(
|
|
163
|
+
if (!(0, _isEqual.default)(lastRequestedFieldKeys, newProperties)) {
|
|
164
|
+
setLastRequestedFieldKeys(newProperties);
|
|
139
165
|
}
|
|
140
166
|
}, [columns, defaultVisibleColumnKeys, lastRequestedFieldKeys]);
|
|
141
167
|
var onNextPage = (0, _react.useCallback)( /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2() {
|
|
@@ -145,6 +171,7 @@ var useDatasourceTableState = exports.useDatasourceTableState = function useData
|
|
|
145
171
|
shouldRequestFirstPage,
|
|
146
172
|
_requestInfo$shouldFo,
|
|
147
173
|
shouldForceRequest,
|
|
174
|
+
isFullSchemaLoaded,
|
|
148
175
|
datasourceDataRequest,
|
|
149
176
|
_yield$getDatasourceD2,
|
|
150
177
|
_yield$getDatasourceD3,
|
|
@@ -171,18 +198,19 @@ var useDatasourceTableState = exports.useDatasourceTableState = function useData
|
|
|
171
198
|
return _context2.abrupt("return");
|
|
172
199
|
case 3:
|
|
173
200
|
_requestInfo$isSchema = requestInfo.isSchemaFromData, isSchemaFromData = _requestInfo$isSchema === void 0 ? true : _requestInfo$isSchema, shouldRequestFirstPage = requestInfo.shouldRequestFirstPage, _requestInfo$shouldFo = requestInfo.shouldForceRequest, shouldForceRequest = _requestInfo$shouldFo === void 0 ? false : _requestInfo$shouldFo;
|
|
201
|
+
isFullSchemaLoaded = fullSchema.properties.length > 0;
|
|
174
202
|
datasourceDataRequest = {
|
|
175
203
|
parameters: parameters,
|
|
176
204
|
pageSize: _linkClientExtension.DEFAULT_GET_DATASOURCE_DATA_PAGE_SIZE,
|
|
177
205
|
pageCursor: shouldRequestFirstPage ? undefined : nextCursor,
|
|
178
206
|
fields: fieldKeys,
|
|
179
|
-
includeSchema: isSchemaFromData
|
|
207
|
+
includeSchema: isFullSchemaLoaded ? false : isSchemaFromData
|
|
180
208
|
};
|
|
181
209
|
setStatus('loading');
|
|
182
|
-
_context2.prev =
|
|
183
|
-
_context2.next =
|
|
210
|
+
_context2.prev = 7;
|
|
211
|
+
_context2.next = 10;
|
|
184
212
|
return getDatasourceData(datasourceId, datasourceDataRequest, shouldForceRequest);
|
|
185
|
-
case
|
|
213
|
+
case 10:
|
|
186
214
|
_yield$getDatasourceD2 = _context2.sent;
|
|
187
215
|
_yield$getDatasourceD3 = _yield$getDatasourceD2.meta;
|
|
188
216
|
access = _yield$getDatasourceD3.access;
|
|
@@ -194,12 +222,12 @@ var useDatasourceTableState = exports.useDatasourceTableState = function useData
|
|
|
194
222
|
_totalCount = _yield$getDatasourceD4.totalCount;
|
|
195
223
|
schema = _yield$getDatasourceD4.schema;
|
|
196
224
|
if (!(access === 'forbidden' || access === 'unauthorized')) {
|
|
197
|
-
_context2.next =
|
|
225
|
+
_context2.next = 23;
|
|
198
226
|
break;
|
|
199
227
|
}
|
|
200
228
|
setStatus('unauthorized');
|
|
201
229
|
return _context2.abrupt("return");
|
|
202
|
-
case
|
|
230
|
+
case 23:
|
|
203
231
|
setExtensionKey(_extensionKey);
|
|
204
232
|
setDestinationObjectTypes(_destinationObjectTypes);
|
|
205
233
|
setTotalCount(_totalCount);
|
|
@@ -214,8 +242,8 @@ var useDatasourceTableState = exports.useDatasourceTableState = function useData
|
|
|
214
242
|
if (fieldKeys.length > 0) {
|
|
215
243
|
setLastRequestedFieldKeys(fieldKeys);
|
|
216
244
|
}
|
|
217
|
-
if (isSchemaFromData && schema && items.length > 0) {
|
|
218
|
-
applySchemaProperties(schema
|
|
245
|
+
if ((isSchemaFromData && schema || fullSchema.properties.length > 0) && items.length > 0) {
|
|
246
|
+
applySchemaProperties(schema || fullSchema, fieldKeys);
|
|
219
247
|
}
|
|
220
248
|
isUserLoadingNextPage = (responseItems === null || responseItems === void 0 ? void 0 : responseItems.length) !== 0 && !shouldRequestFirstPage;
|
|
221
249
|
if (isUserLoadingNextPage) {
|
|
@@ -228,25 +256,25 @@ var useDatasourceTableState = exports.useDatasourceTableState = function useData
|
|
|
228
256
|
});
|
|
229
257
|
}
|
|
230
258
|
setStatus('resolved');
|
|
231
|
-
_context2.next =
|
|
259
|
+
_context2.next = 42;
|
|
232
260
|
break;
|
|
233
|
-
case
|
|
234
|
-
_context2.prev =
|
|
235
|
-
_context2.t0 = _context2["catch"](
|
|
261
|
+
case 36:
|
|
262
|
+
_context2.prev = 36;
|
|
263
|
+
_context2.t0 = _context2["catch"](7);
|
|
236
264
|
if (!(_context2.t0 instanceof Response && (_context2.t0.status === 401 || _context2.t0.status === 403))) {
|
|
237
|
-
_context2.next =
|
|
265
|
+
_context2.next = 41;
|
|
238
266
|
break;
|
|
239
267
|
}
|
|
240
268
|
setStatus('unauthorized');
|
|
241
269
|
return _context2.abrupt("return");
|
|
242
|
-
case 40:
|
|
243
|
-
setStatus('rejected');
|
|
244
270
|
case 41:
|
|
271
|
+
setStatus('rejected');
|
|
272
|
+
case 42:
|
|
245
273
|
case "end":
|
|
246
274
|
return _context2.stop();
|
|
247
275
|
}
|
|
248
|
-
}, _callee2, null, [[
|
|
249
|
-
})), [parameters, fieldKeys, nextCursor, getDatasourceData, datasourceId, responseItems === null || responseItems === void 0 ? void 0 : responseItems.length, applySchemaProperties, fireEvent]);
|
|
276
|
+
}, _callee2, null, [[7, 36]]);
|
|
277
|
+
})), [parameters, fieldKeys, nextCursor, getDatasourceData, datasourceId, responseItems === null || responseItems === void 0 ? void 0 : responseItems.length, applySchemaProperties, fireEvent, fullSchema]);
|
|
250
278
|
var reset = (0, _react.useCallback)(function (options) {
|
|
251
279
|
setStatus('empty');
|
|
252
280
|
setResponseItems([]);
|
|
@@ -254,6 +282,9 @@ var useDatasourceTableState = exports.useDatasourceTableState = function useData
|
|
|
254
282
|
setNextCursor(undefined);
|
|
255
283
|
setTotalCount(undefined);
|
|
256
284
|
setLastRequestedFieldKeys([]);
|
|
285
|
+
setFullSchema({
|
|
286
|
+
properties: []
|
|
287
|
+
});
|
|
257
288
|
setShouldForceRequest((options === null || options === void 0 ? void 0 : options.shouldForceRequest) || false);
|
|
258
289
|
if (options !== null && options !== void 0 && options.shouldResetColumns) {
|
|
259
290
|
setColumns([]);
|
|
@@ -9,6 +9,7 @@ exports.default = exports.SEARCH_DEBOUNCE_MS = void 0;
|
|
|
9
9
|
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
|
|
10
10
|
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
11
11
|
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
12
|
+
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
12
13
|
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
13
14
|
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
14
15
|
var _react = _interopRequireWildcard(require("react"));
|
|
@@ -41,7 +42,6 @@ var AsyncPopupSelect = function AsyncPopupSelect(_ref) {
|
|
|
41
42
|
isDisabled = _ref$isDisabled === void 0 ? false : _ref$isDisabled;
|
|
42
43
|
var _useIntl = (0, _reactIntlNext.useIntl)(),
|
|
43
44
|
formatMessage = _useIntl.formatMessage;
|
|
44
|
-
var pickerRef = (0, _react.useRef)(null);
|
|
45
45
|
var _useState = (0, _react.useState)(''),
|
|
46
46
|
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
|
|
47
47
|
searchTerm = _useState2[0],
|
|
@@ -50,6 +50,10 @@ var AsyncPopupSelect = function AsyncPopupSelect(_ref) {
|
|
|
50
50
|
_useState4 = (0, _slicedToArray2.default)(_useState3, 2),
|
|
51
51
|
selectedOptions = _useState4[0],
|
|
52
52
|
setSelectedOptions = _useState4[1];
|
|
53
|
+
var _useState5 = (0, _react.useState)(selectedOptions),
|
|
54
|
+
_useState6 = (0, _slicedToArray2.default)(_useState5, 2),
|
|
55
|
+
sortedOptions = _useState6[0],
|
|
56
|
+
setSortedOptions = _useState6[1];
|
|
53
57
|
var _useFilterOptions = (0, _useFilterOptions2.useFilterOptions)({
|
|
54
58
|
filterType: filterType,
|
|
55
59
|
cloudId: cloudId
|
|
@@ -90,14 +94,46 @@ var AsyncPopupSelect = function AsyncPopupSelect(_ref) {
|
|
|
90
94
|
setSelectedOptions(newValue);
|
|
91
95
|
onSelectionChange(newValue);
|
|
92
96
|
};
|
|
93
|
-
var
|
|
94
|
-
if (
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
97
|
+
var sortOptionsOnPopupOpen = (0, _react.useCallback)(function () {
|
|
98
|
+
if (selectedOptions.length === 0) {
|
|
99
|
+
setSortedOptions(filterOptions);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
var nonSelectedOptions = filterOptions.filter(function (option) {
|
|
103
|
+
return !selectedOptions.find(function (selectedOption) {
|
|
104
|
+
return selectedOption.value === option.value;
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
var newOptions = [].concat((0, _toConsumableArray2.default)(selectedOptions), (0, _toConsumableArray2.default)(nonSelectedOptions));
|
|
108
|
+
setSortedOptions(newOptions);
|
|
109
|
+
}, [selectedOptions, filterOptions]);
|
|
110
|
+
var sortOptionsOnResolve = (0, _react.useCallback)(function () {
|
|
111
|
+
var newOptions = filterOptions.filter(function (option) {
|
|
112
|
+
return !sortedOptions.find(function (sortedOption) {
|
|
113
|
+
return sortedOption.value === option.value;
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
var shouldSetSortOptions = false;
|
|
117
|
+
if (sortedOptions.length !== filterOptions.length) {
|
|
118
|
+
shouldSetSortOptions = true;
|
|
119
|
+
} else {
|
|
120
|
+
sortedOptions.forEach(function (sortedOption) {
|
|
121
|
+
if (!filterOptions.some(function (filterOption) {
|
|
122
|
+
return filterOption.value === sortedOption.value;
|
|
123
|
+
})) {
|
|
124
|
+
shouldSetSortOptions = true;
|
|
125
|
+
}
|
|
98
126
|
});
|
|
99
127
|
}
|
|
100
|
-
|
|
128
|
+
if (shouldSetSortOptions) {
|
|
129
|
+
var sortedOptionsFiltered = sortedOptions.filter(function (sortedOption) {
|
|
130
|
+
return filterOptions.some(function (filterOption) {
|
|
131
|
+
return filterOption.value === sortedOption.value;
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
setSortedOptions([].concat((0, _toConsumableArray2.default)(sortedOptionsFiltered), (0, _toConsumableArray2.default)(newOptions)));
|
|
135
|
+
}
|
|
136
|
+
}, [filterOptions, sortedOptions]);
|
|
101
137
|
var handleShowMore = (0, _react.useCallback)(function () {
|
|
102
138
|
if (pageCursor) {
|
|
103
139
|
fetchFilterOptions({
|
|
@@ -106,28 +142,34 @@ var AsyncPopupSelect = function AsyncPopupSelect(_ref) {
|
|
|
106
142
|
});
|
|
107
143
|
}
|
|
108
144
|
}, [fetchFilterOptions, pageCursor, searchTerm]);
|
|
145
|
+
var handleOpenPopup = (0, _react.useCallback)(function () {
|
|
146
|
+
if (status === 'empty' || status === 'rejected') {
|
|
147
|
+
// if user searches and gets status as rejected, we want the dropdown to try load the request with searchString when the user reopens the dropdown
|
|
148
|
+
fetchFilterOptions({
|
|
149
|
+
searchString: searchTerm
|
|
150
|
+
});
|
|
151
|
+
} else if (status === 'resolved') {
|
|
152
|
+
sortOptionsOnPopupOpen();
|
|
153
|
+
}
|
|
154
|
+
}, [fetchFilterOptions, searchTerm, sortOptionsOnPopupOpen, status]);
|
|
109
155
|
(0, _react.useEffect)(function () {
|
|
110
156
|
if (status === 'resolved') {
|
|
111
|
-
|
|
112
|
-
// necessary to refocus the search input after the loading state
|
|
113
|
-
pickerRef === null || pickerRef === void 0 || (_pickerRef$current = pickerRef.current) === null || _pickerRef$current === void 0 || (_pickerRef$current = _pickerRef$current.selectRef) === null || _pickerRef$current === void 0 || (_pickerRef$current = _pickerRef$current.inputRef) === null || _pickerRef$current === void 0 || _pickerRef$current.focus();
|
|
157
|
+
sortOptionsOnResolve();
|
|
114
158
|
}
|
|
115
|
-
}, [status]);
|
|
159
|
+
}, [sortOptionsOnResolve, status]);
|
|
116
160
|
var filterOptionsLength = filterOptions.length;
|
|
117
161
|
var isError = status === 'rejected';
|
|
118
162
|
var isLoading = status === 'loading' || status === 'empty';
|
|
119
163
|
var isLoadingMore = status === 'loadingMore';
|
|
120
164
|
var isEmpty = status === 'resolved' && filterOptionsLength === 0;
|
|
165
|
+
var popupSelectOptions = isLoading || isError ? [] : sortedOptions; // if not set to [], then on loading, no loading UI will be shown
|
|
121
166
|
var areAllResultsLoaded = filterOptions.length === totalCount;
|
|
122
167
|
var shouldShowFooter = (status === 'resolved' || isLoadingMore) && filterOptions.length > 0; // footer should not disappear when there is an inline spinner for loading more data
|
|
123
168
|
var shouldDisplayShowMoreButton = status === 'resolved' && !!pageCursor && !areAllResultsLoaded;
|
|
124
|
-
var options = isLoading || isError ? [] : filterOptions; // if not set to [], for eg: on loading, no loading UI will be shown
|
|
125
|
-
|
|
126
169
|
return /*#__PURE__*/_react.default.createElement(_select.PopupSelect, {
|
|
127
170
|
isMulti: true,
|
|
128
171
|
maxMenuWidth: 300,
|
|
129
172
|
minMenuWidth: 300,
|
|
130
|
-
ref: pickerRef,
|
|
131
173
|
testId: "jlol-basic-filter-popup-select",
|
|
132
174
|
inputId: "jlol-basic-filter-popup-select--input"
|
|
133
175
|
/*
|
|
@@ -163,7 +205,7 @@ var AsyncPopupSelect = function AsyncPopupSelect(_ref) {
|
|
|
163
205
|
IndicatorSeparator: undefined // disables the | separator between search input and icon
|
|
164
206
|
},
|
|
165
207
|
|
|
166
|
-
options:
|
|
208
|
+
options: popupSelectOptions,
|
|
167
209
|
value: selectedOptions,
|
|
168
210
|
filterOption: noFilterOptions,
|
|
169
211
|
formatOptionLabel: _formatOptionLabel.default,
|
|
@@ -174,6 +216,7 @@ var AsyncPopupSelect = function AsyncPopupSelect(_ref) {
|
|
|
174
216
|
triggerProps = (0, _objectWithoutProperties2.default)(_ref3, _excluded);
|
|
175
217
|
return /*#__PURE__*/_react.default.createElement(_trigger.default, (0, _extends2.default)({}, triggerProps, {
|
|
176
218
|
filterType: filterType,
|
|
219
|
+
selectedOptions: selectedOptions,
|
|
177
220
|
isSelected: isOpen,
|
|
178
221
|
onClick: handleOpenPopup,
|
|
179
222
|
isDisabled: isDisabled
|
|
@@ -6,28 +6,51 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
value: true
|
|
7
7
|
});
|
|
8
8
|
exports.default = void 0;
|
|
9
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
9
10
|
var _react = _interopRequireWildcard(require("react"));
|
|
10
11
|
var _reactIntlNext = require("react-intl-next");
|
|
12
|
+
var _badge = _interopRequireDefault(require("@atlaskit/badge"));
|
|
11
13
|
var _standardButton = _interopRequireDefault(require("@atlaskit/button/standard-button"));
|
|
12
14
|
var _chevronDown = _interopRequireDefault(require("@atlaskit/icon/glyph/chevron-down"));
|
|
15
|
+
var _primitives = require("@atlaskit/primitives");
|
|
13
16
|
var _messages = require("./messages");
|
|
14
17
|
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
15
18
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
19
|
+
var triggerButtonLabelStyles = (0, _primitives.xcss)({
|
|
20
|
+
textOverflow: 'ellipsis',
|
|
21
|
+
overflow: 'hidden',
|
|
22
|
+
maxWidth: '150px'
|
|
23
|
+
});
|
|
24
|
+
var badgeStyles = (0, _primitives.xcss)({
|
|
25
|
+
marginLeft: 'space.050'
|
|
26
|
+
});
|
|
16
27
|
var PopupTrigger = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
|
|
17
28
|
var filterType = _ref.filterType,
|
|
18
29
|
isSelected = _ref.isSelected,
|
|
19
30
|
isDisabled = _ref.isDisabled,
|
|
20
|
-
onClick = _ref.onClick
|
|
31
|
+
onClick = _ref.onClick,
|
|
32
|
+
selectedOptions = _ref.selectedOptions;
|
|
33
|
+
var _ref2 = selectedOptions || [],
|
|
34
|
+
_ref3 = (0, _slicedToArray2.default)(_ref2, 1),
|
|
35
|
+
firstOption = _ref3[0];
|
|
36
|
+
var hasOptions = selectedOptions && selectedOptions.length > 0;
|
|
21
37
|
return /*#__PURE__*/_react.default.createElement(_standardButton.default, {
|
|
22
38
|
ref: ref,
|
|
23
39
|
appearance: "default",
|
|
24
|
-
isSelected: isSelected,
|
|
40
|
+
isSelected: isSelected || hasOptions,
|
|
25
41
|
isDisabled: isDisabled,
|
|
26
42
|
onClick: onClick,
|
|
27
43
|
testId: "jlol-basic-filter-".concat(filterType, "-trigger"),
|
|
28
44
|
iconAfter: /*#__PURE__*/_react.default.createElement(_chevronDown.default, {
|
|
29
45
|
label: ""
|
|
30
46
|
})
|
|
31
|
-
}, /*#__PURE__*/_react.default.createElement(
|
|
47
|
+
}, /*#__PURE__*/_react.default.createElement(_primitives.Flex, null, /*#__PURE__*/_react.default.createElement(_primitives.Box, {
|
|
48
|
+
xcss: triggerButtonLabelStyles
|
|
49
|
+
}, /*#__PURE__*/_react.default.createElement(_reactIntlNext.FormattedMessage, _messages.asyncPopupSelectMessages["".concat(filterType, "Label")]), firstOption && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, ": ", firstOption.label)), selectedOptions && selectedOptions.length > 1 && /*#__PURE__*/_react.default.createElement(_primitives.Flex, {
|
|
50
|
+
xcss: badgeStyles,
|
|
51
|
+
alignItems: "center"
|
|
52
|
+
}, /*#__PURE__*/_react.default.createElement(_badge.default, {
|
|
53
|
+
appearance: "primary"
|
|
54
|
+
}, "+", selectedOptions.length - 1))));
|
|
32
55
|
});
|
|
33
56
|
var _default = exports.default = PopupTrigger;
|
|
@@ -21,14 +21,17 @@ var BasicFilterContainer = function BasicFilterContainer(_ref) {
|
|
|
21
21
|
var jql = _ref.jql,
|
|
22
22
|
cloudId = _ref.cloudId;
|
|
23
23
|
var _useState = (0, _react.useState)([]),
|
|
24
|
-
_useState2 = (0, _slicedToArray2.default)(_useState,
|
|
25
|
-
selection = _useState2[0]
|
|
24
|
+
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
|
|
25
|
+
selection = _useState2[0],
|
|
26
|
+
setSelection = _useState2[1];
|
|
26
27
|
(0, _react.useEffect)(function () {
|
|
27
28
|
if ((0, _utils.isValidJql)(jql)) {
|
|
28
29
|
// hydrate hook call goes in here
|
|
29
30
|
}
|
|
30
31
|
}, [jql]);
|
|
31
|
-
var handleSelectionChange = function
|
|
32
|
+
var handleSelectionChange = (0, _react.useCallback)(function (options) {
|
|
33
|
+
setSelection(options);
|
|
34
|
+
}, [setSelection]);
|
|
32
35
|
return /*#__PURE__*/_react.default.createElement(_primitives.Flex, {
|
|
33
36
|
xcss: basicFilterContainerStyles,
|
|
34
37
|
gap: "space.100",
|
|
@@ -10,8 +10,13 @@ export const useDatasourceTableState = ({
|
|
|
10
10
|
const {
|
|
11
11
|
fireEvent
|
|
12
12
|
} = useDatasourceAnalyticsEvents();
|
|
13
|
+
const idFieldCount = 1;
|
|
14
|
+
const keyFieldCount = 1;
|
|
13
15
|
const [defaultVisibleColumnKeys, setDefaultVisibleColumnKeys] = useState([]);
|
|
14
16
|
const [lastRequestedFieldKeys, setLastRequestedFieldKeys] = useState([]);
|
|
17
|
+
const [fullSchema, setFullSchema] = useState({
|
|
18
|
+
properties: []
|
|
19
|
+
});
|
|
15
20
|
const [status, setStatus] = useState('empty');
|
|
16
21
|
const [responseItems, setResponseItems] = useState([]);
|
|
17
22
|
const [hasNextPage, setHasNextPage] = useState(true);
|
|
@@ -56,19 +61,38 @@ export const useDatasourceTableState = ({
|
|
|
56
61
|
setStatus('rejected');
|
|
57
62
|
}
|
|
58
63
|
}, [columns, datasourceId, getDatasourceDetails, parameters]);
|
|
59
|
-
const applySchemaProperties = useCallback(
|
|
60
|
-
|
|
61
|
-
|
|
64
|
+
const applySchemaProperties = useCallback((schema, fieldKeys) => {
|
|
65
|
+
let {
|
|
66
|
+
properties,
|
|
67
|
+
defaultProperties = []
|
|
68
|
+
} = schema;
|
|
69
|
+
let propertiesToBeUsed = properties;
|
|
70
|
+
const propertyKeysToBeUsed = Array.isArray(fieldKeys) && fieldKeys.length > 0 ? fieldKeys : defaultProperties;
|
|
71
|
+
if (fieldKeys.length > 0 || defaultProperties.length > 0) {
|
|
72
|
+
propertiesToBeUsed = properties.filter(property => {
|
|
73
|
+
return propertyKeysToBeUsed.includes(property.key);
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/*Jira adds identifier fields like id and key to all data responses
|
|
78
|
+
Since defaultProperties already send back the keyField, we are accounting only
|
|
79
|
+
for the idField when we are using defaulProperties
|
|
80
|
+
*/
|
|
81
|
+
if (properties.length > fieldKeys.length + idFieldCount + keyFieldCount && properties.length > defaultProperties.length + idFieldCount) {
|
|
82
|
+
setFullSchema(schema);
|
|
83
|
+
}
|
|
84
|
+
if (!isEqual(columns, propertiesToBeUsed)) {
|
|
85
|
+
setColumns(propertiesToBeUsed);
|
|
62
86
|
}
|
|
63
|
-
const
|
|
87
|
+
const newProperties = propertiesToBeUsed.map(prop => prop.key);
|
|
64
88
|
|
|
65
89
|
// when loading for the first time, we will need to set default visible props as /data does not give you that info
|
|
66
90
|
// also, since we dont pass any fields, we will need to set this info as lastRequestedFieldKeys
|
|
67
|
-
if (!isEqual(defaultVisibleColumnKeys,
|
|
68
|
-
setDefaultVisibleColumnKeys(
|
|
91
|
+
if (!isEqual(defaultVisibleColumnKeys, newProperties)) {
|
|
92
|
+
setDefaultVisibleColumnKeys(newProperties);
|
|
69
93
|
}
|
|
70
|
-
if (!isEqual(lastRequestedFieldKeys,
|
|
71
|
-
setLastRequestedFieldKeys(
|
|
94
|
+
if (!isEqual(lastRequestedFieldKeys, newProperties)) {
|
|
95
|
+
setLastRequestedFieldKeys(newProperties);
|
|
72
96
|
}
|
|
73
97
|
}, [columns, defaultVisibleColumnKeys, lastRequestedFieldKeys]);
|
|
74
98
|
const onNextPage = useCallback(async (requestInfo = {}) => {
|
|
@@ -80,12 +104,13 @@ export const useDatasourceTableState = ({
|
|
|
80
104
|
shouldRequestFirstPage,
|
|
81
105
|
shouldForceRequest = false
|
|
82
106
|
} = requestInfo;
|
|
107
|
+
const isFullSchemaLoaded = fullSchema.properties.length > 0;
|
|
83
108
|
const datasourceDataRequest = {
|
|
84
109
|
parameters,
|
|
85
110
|
pageSize: DEFAULT_GET_DATASOURCE_DATA_PAGE_SIZE,
|
|
86
111
|
pageCursor: shouldRequestFirstPage ? undefined : nextCursor,
|
|
87
112
|
fields: fieldKeys,
|
|
88
|
-
includeSchema: isSchemaFromData
|
|
113
|
+
includeSchema: isFullSchemaLoaded ? false : isSchemaFromData
|
|
89
114
|
};
|
|
90
115
|
setStatus('loading');
|
|
91
116
|
try {
|
|
@@ -120,8 +145,8 @@ export const useDatasourceTableState = ({
|
|
|
120
145
|
if (fieldKeys.length > 0) {
|
|
121
146
|
setLastRequestedFieldKeys(fieldKeys);
|
|
122
147
|
}
|
|
123
|
-
if (isSchemaFromData && schema && items.length > 0) {
|
|
124
|
-
applySchemaProperties(schema
|
|
148
|
+
if ((isSchemaFromData && schema || fullSchema.properties.length > 0) && items.length > 0) {
|
|
149
|
+
applySchemaProperties(schema || fullSchema, fieldKeys);
|
|
125
150
|
}
|
|
126
151
|
const isUserLoadingNextPage = (responseItems === null || responseItems === void 0 ? void 0 : responseItems.length) !== 0 && !shouldRequestFirstPage;
|
|
127
152
|
if (isUserLoadingNextPage) {
|
|
@@ -141,7 +166,7 @@ export const useDatasourceTableState = ({
|
|
|
141
166
|
}
|
|
142
167
|
setStatus('rejected');
|
|
143
168
|
}
|
|
144
|
-
}, [parameters, fieldKeys, nextCursor, getDatasourceData, datasourceId, responseItems === null || responseItems === void 0 ? void 0 : responseItems.length, applySchemaProperties, fireEvent]);
|
|
169
|
+
}, [parameters, fieldKeys, nextCursor, getDatasourceData, datasourceId, responseItems === null || responseItems === void 0 ? void 0 : responseItems.length, applySchemaProperties, fireEvent, fullSchema]);
|
|
145
170
|
const reset = useCallback(options => {
|
|
146
171
|
setStatus('empty');
|
|
147
172
|
setResponseItems([]);
|
|
@@ -149,6 +174,9 @@ export const useDatasourceTableState = ({
|
|
|
149
174
|
setNextCursor(undefined);
|
|
150
175
|
setTotalCount(undefined);
|
|
151
176
|
setLastRequestedFieldKeys([]);
|
|
177
|
+
setFullSchema({
|
|
178
|
+
properties: []
|
|
179
|
+
});
|
|
152
180
|
setShouldForceRequest((options === null || options === void 0 ? void 0 : options.shouldForceRequest) || false);
|
|
153
181
|
if (options !== null && options !== void 0 && options.shouldResetColumns) {
|
|
154
182
|
setColumns([]);
|