@atlaskit/link-datasource 6.14.1 → 6.14.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # @atlaskit/link-datasource
2
2
 
3
+ ## 6.14.2
4
+
5
+ ### Patch Changes
6
+
7
+ - [`3f172371c9b66`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/3f172371c9b66) -
8
+ Preserve the selected Assets columns when only the AQL query changes, and persist datasource
9
+ updates that only change parameters. Both behind feature gate
10
+ `platform_lp_sllv_preserve_assets_columns`.
11
+ - Updated dependencies
12
+
3
13
  ## 6.14.1
4
14
 
5
15
  ### Patch Changes
@@ -23,6 +23,7 @@ var _modalFooter = _interopRequireDefault(require("@atlaskit/modal-dialog/modal-
23
23
  var _modalHeader = _interopRequireDefault(require("@atlaskit/modal-dialog/modal-header"));
24
24
  var _modalTitle = _interopRequireDefault(require("@atlaskit/modal-dialog/modal-title"));
25
25
  var _modalTransition = _interopRequireDefault(require("@atlaskit/modal-dialog/modal-transition"));
26
+ var _fg = require("@atlaskit/platform-feature-flags/fg");
26
27
  var _constants = require("../../../analytics/constants");
27
28
  var _index = require("../../../analytics/index");
28
29
  var _types = require("../../../analytics/types");
@@ -77,10 +78,15 @@ var PlainAssetsConfigModal = function PlainAssetsConfigModal(props) {
77
78
  _useState8 = (0, _slicedToArray2.default)(_useState7, 2),
78
79
  isNewSearch = _useState8[0],
79
80
  setIsNewSearch = _useState8[1];
80
- var _useState9 = (0, _react.useState)(),
81
+ // State rather than a ref because the reconciliation below reads it during render
82
+ var _useState9 = (0, _react.useState)(false),
81
83
  _useState0 = (0, _slicedToArray2.default)(_useState9, 2),
82
- errorState = _useState0[0],
83
- setErrorState = _useState0[1];
84
+ hasPreservedColumns = _useState0[0],
85
+ setHasPreservedColumns = _useState0[1];
86
+ var _useState1 = (0, _react.useState)(),
87
+ _useState10 = (0, _slicedToArray2.default)(_useState1, 2),
88
+ errorState = _useState10[0],
89
+ setErrorState = _useState10[1];
84
90
  var _useDatasourceAnalyti = (0, _index.useDatasourceAnalyticsEvents)(),
85
91
  fireEvent = _useDatasourceAnalyti.fireEvent;
86
92
  var experienceId = (0, _useDatasourceExperienceId.useDatasourceExperienceId)();
@@ -151,6 +157,26 @@ var PlainAssetsConfigModal = function PlainAssetsConfigModal(props) {
151
157
  destinationObjectTypes = _useDatasourceTableSt.destinationObjectTypes,
152
158
  totalCount = _useDatasourceTableSt.totalCount;
153
159
 
160
+ // A preserved selection must drop whatever the edited query stopped reporting. This is adjusted
161
+ // during render, not in an effect: the table hook is called before this component's own effects
162
+ // are registered, so its effects run first and would read the columns still awaiting removal as
163
+ // newly selected ones - refetching for them, and throwing away the results just received. The
164
+ // re-render this schedules is discarded before commit, so the hook only ever sees the reconciled
165
+ // selection.
166
+ if ((0, _fg.fg)('platform_lp_sllv_preserve_assets_columns') && hasPreservedColumns && status === 'resolved' && columns.length > 0) {
167
+ var availableKeys = new Set(columns.map(function (_ref) {
168
+ var key = _ref.key;
169
+ return key;
170
+ }));
171
+ var selectedKeys = visibleColumnKeys !== null && visibleColumnKeys !== void 0 ? visibleColumnKeys : [];
172
+ var retainedKeys = selectedKeys.filter(function (key) {
173
+ return availableKeys.has(key);
174
+ });
175
+ if (retainedKeys.length !== selectedKeys.length) {
176
+ setVisibleColumnKeys(retainedKeys.length > 0 ? retainedKeys : defaultVisibleColumnKeys);
177
+ }
178
+ }
179
+
154
180
  /* ------------------------------ OBSERVABILITY ------------------------------ */
155
181
  var searchCount = (0, _react.useRef)(0);
156
182
  var userInteractions = (0, _useUserInteractions.useUserInteractions)();
@@ -212,9 +238,28 @@ var PlainAssetsConfigModal = function PlainAssetsConfigModal(props) {
212
238
  setIsNewSearch(false);
213
239
  }, []);
214
240
  (0, _react.useEffect)(function () {
241
+ // A preserved selection owns the columns, so restoring the saved or default ones would undo it
242
+ if ((0, _fg.fg)('platform_lp_sllv_preserve_assets_columns') && hasPreservedColumns) {
243
+ return;
244
+ }
215
245
  var newVisibleColumnKeys = initialVisibleColumnKeys && initialVisibleColumnKeys.length > 0 && apiVersion === VERSION_TWO ? initialVisibleColumnKeys : defaultVisibleColumnKeys;
216
246
  setVisibleColumnKeys(newVisibleColumnKeys);
217
- }, [initialVisibleColumnKeys, defaultVisibleColumnKeys, apiVersion]);
247
+ }, [initialVisibleColumnKeys, defaultVisibleColumnKeys, apiVersion, hasPreservedColumns]);
248
+ (0, _react.useEffect)(function () {
249
+ // The response described none of the requested fields, so there is nothing valid to keep and
250
+ // no reported defaults to fall back to. Give up preserving and re-request the schema's own
251
+ // defaults. This one has to stay an effect because it issues a request.
252
+ if (!(0, _fg.fg)('platform_lp_sllv_preserve_assets_columns') || !hasPreservedColumns || status !== 'resolved' || columns.length > 0) {
253
+ return;
254
+ }
255
+ setHasPreservedColumns(false);
256
+ setVisibleColumnKeys([]);
257
+ setIsNewSearch(true);
258
+ reset({
259
+ shouldForceRequest: true,
260
+ shouldResetColumns: true
261
+ });
262
+ }, [columns, hasPreservedColumns, reset, status]);
218
263
  (0, _react.useEffect)(function () {
219
264
  if (isNewSearch) {
220
265
  setVisibleColumnKeys(defaultVisibleColumnKeys);
@@ -290,16 +335,22 @@ var PlainAssetsConfigModal = function PlainAssetsConfigModal(props) {
290
335
  if (aql !== searchAql) {
291
336
  userInteractions.add(_types.DatasourceAction.QUERY_UPDATED);
292
337
  }
338
+ // An empty selection has nothing worth preserving, and keeping it would stop the
339
+ // response's defaults from being adopted
340
+ var shouldPreserveColumns = (0, _fg.fg)('platform_lp_sllv_preserve_assets_columns') && schemaId === searchSchemaId && (visibleColumnKeys !== null && visibleColumnKeys !== void 0 ? visibleColumnKeys : []).length > 0;
341
+ setHasPreservedColumns(shouldPreserveColumns);
293
342
  setAql(searchAql);
294
343
  setSchemaId(searchSchemaId);
295
- setVisibleColumnKeys([]);
296
- setIsNewSearch(true);
344
+ if (!shouldPreserveColumns) {
345
+ setVisibleColumnKeys([]);
346
+ }
347
+ setIsNewSearch(!shouldPreserveColumns);
297
348
  reset({
298
349
  shouldForceRequest: true,
299
- shouldResetColumns: true
350
+ shouldResetColumns: !shouldPreserveColumns
300
351
  });
301
352
  }
302
- }, [aql, reset, schemaId, status, userInteractions]);
353
+ }, [aql, reset, schemaId, status, userInteractions, visibleColumnKeys]);
303
354
  var renderErrorState = (0, _react.useCallback)(function () {
304
355
  if (errorState) {
305
356
  switch (errorState) {
@@ -13,6 +13,7 @@ import ModalFooter from '@atlaskit/modal-dialog/modal-footer';
13
13
  import ModalHeader from '@atlaskit/modal-dialog/modal-header';
14
14
  import ModalTitle from '@atlaskit/modal-dialog/modal-title';
15
15
  import ModalTransition from '@atlaskit/modal-dialog/modal-transition';
16
+ import { fg } from '@atlaskit/platform-feature-flags/fg';
16
17
  import { EVENT_CHANNEL } from '../../../analytics/constants';
17
18
  import { componentMetadata } from '../../../analytics/constants';
18
19
  import { useDatasourceAnalyticsEvents } from '../../../analytics/index';
@@ -55,6 +56,8 @@ const PlainAssetsConfigModal = props => {
55
56
  const apiVersion = initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.version;
56
57
  const [visibleColumnKeys, setVisibleColumnKeys] = useState(apiVersion !== VERSION_TWO ? [] : initialVisibleColumnKeys);
57
58
  const [isNewSearch, setIsNewSearch] = useState(false);
59
+ // State rather than a ref because the reconciliation below reads it during render
60
+ const [hasPreservedColumns, setHasPreservedColumns] = useState(false);
58
61
  const [errorState, setErrorState] = useState();
59
62
  const {
60
63
  fireEvent
@@ -126,6 +129,23 @@ const PlainAssetsConfigModal = props => {
126
129
  fieldKeys: isNewSearch ? [] : visibleColumnKeys
127
130
  });
128
131
 
132
+ // A preserved selection must drop whatever the edited query stopped reporting. This is adjusted
133
+ // during render, not in an effect: the table hook is called before this component's own effects
134
+ // are registered, so its effects run first and would read the columns still awaiting removal as
135
+ // newly selected ones - refetching for them, and throwing away the results just received. The
136
+ // re-render this schedules is discarded before commit, so the hook only ever sees the reconciled
137
+ // selection.
138
+ if (fg('platform_lp_sllv_preserve_assets_columns') && hasPreservedColumns && status === 'resolved' && columns.length > 0) {
139
+ const availableKeys = new Set(columns.map(({
140
+ key
141
+ }) => key));
142
+ const selectedKeys = visibleColumnKeys !== null && visibleColumnKeys !== void 0 ? visibleColumnKeys : [];
143
+ const retainedKeys = selectedKeys.filter(key => availableKeys.has(key));
144
+ if (retainedKeys.length !== selectedKeys.length) {
145
+ setVisibleColumnKeys(retainedKeys.length > 0 ? retainedKeys : defaultVisibleColumnKeys);
146
+ }
147
+ }
148
+
129
149
  /* ------------------------------ OBSERVABILITY ------------------------------ */
130
150
  const searchCount = useRef(0);
131
151
  const userInteractions = useUserInteractions();
@@ -188,9 +208,28 @@ const PlainAssetsConfigModal = props => {
188
208
  setIsNewSearch(false);
189
209
  }, []);
190
210
  useEffect(() => {
211
+ // A preserved selection owns the columns, so restoring the saved or default ones would undo it
212
+ if (fg('platform_lp_sllv_preserve_assets_columns') && hasPreservedColumns) {
213
+ return;
214
+ }
191
215
  const newVisibleColumnKeys = initialVisibleColumnKeys && initialVisibleColumnKeys.length > 0 && apiVersion === VERSION_TWO ? initialVisibleColumnKeys : defaultVisibleColumnKeys;
192
216
  setVisibleColumnKeys(newVisibleColumnKeys);
193
- }, [initialVisibleColumnKeys, defaultVisibleColumnKeys, apiVersion]);
217
+ }, [initialVisibleColumnKeys, defaultVisibleColumnKeys, apiVersion, hasPreservedColumns]);
218
+ useEffect(() => {
219
+ // The response described none of the requested fields, so there is nothing valid to keep and
220
+ // no reported defaults to fall back to. Give up preserving and re-request the schema's own
221
+ // defaults. This one has to stay an effect because it issues a request.
222
+ if (!fg('platform_lp_sllv_preserve_assets_columns') || !hasPreservedColumns || status !== 'resolved' || columns.length > 0) {
223
+ return;
224
+ }
225
+ setHasPreservedColumns(false);
226
+ setVisibleColumnKeys([]);
227
+ setIsNewSearch(true);
228
+ reset({
229
+ shouldForceRequest: true,
230
+ shouldResetColumns: true
231
+ });
232
+ }, [columns, hasPreservedColumns, reset, status]);
194
233
  useEffect(() => {
195
234
  if (isNewSearch) {
196
235
  setVisibleColumnKeys(defaultVisibleColumnKeys);
@@ -264,16 +303,22 @@ const PlainAssetsConfigModal = props => {
264
303
  if (aql !== searchAql) {
265
304
  userInteractions.add(DatasourceAction.QUERY_UPDATED);
266
305
  }
306
+ // An empty selection has nothing worth preserving, and keeping it would stop the
307
+ // response's defaults from being adopted
308
+ const shouldPreserveColumns = fg('platform_lp_sllv_preserve_assets_columns') && schemaId === searchSchemaId && (visibleColumnKeys !== null && visibleColumnKeys !== void 0 ? visibleColumnKeys : []).length > 0;
309
+ setHasPreservedColumns(shouldPreserveColumns);
267
310
  setAql(searchAql);
268
311
  setSchemaId(searchSchemaId);
269
- setVisibleColumnKeys([]);
270
- setIsNewSearch(true);
312
+ if (!shouldPreserveColumns) {
313
+ setVisibleColumnKeys([]);
314
+ }
315
+ setIsNewSearch(!shouldPreserveColumns);
271
316
  reset({
272
317
  shouldForceRequest: true,
273
- shouldResetColumns: true
318
+ shouldResetColumns: !shouldPreserveColumns
274
319
  });
275
320
  }
276
- }, [aql, reset, schemaId, status, userInteractions]);
321
+ }, [aql, reset, schemaId, status, userInteractions, visibleColumnKeys]);
277
322
  const renderErrorState = useCallback(() => {
278
323
  if (errorState) {
279
324
  switch (errorState) {
@@ -17,6 +17,7 @@ import ModalFooter from '@atlaskit/modal-dialog/modal-footer';
17
17
  import ModalHeader from '@atlaskit/modal-dialog/modal-header';
18
18
  import ModalTitle from '@atlaskit/modal-dialog/modal-title';
19
19
  import ModalTransition from '@atlaskit/modal-dialog/modal-transition';
20
+ import { fg } from '@atlaskit/platform-feature-flags/fg';
20
21
  import { EVENT_CHANNEL } from '../../../analytics/constants';
21
22
  import { componentMetadata } from '../../../analytics/constants';
22
23
  import { useDatasourceAnalyticsEvents } from '../../../analytics/index';
@@ -69,10 +70,15 @@ var PlainAssetsConfigModal = function PlainAssetsConfigModal(props) {
69
70
  _useState8 = _slicedToArray(_useState7, 2),
70
71
  isNewSearch = _useState8[0],
71
72
  setIsNewSearch = _useState8[1];
72
- var _useState9 = useState(),
73
+ // State rather than a ref because the reconciliation below reads it during render
74
+ var _useState9 = useState(false),
73
75
  _useState0 = _slicedToArray(_useState9, 2),
74
- errorState = _useState0[0],
75
- setErrorState = _useState0[1];
76
+ hasPreservedColumns = _useState0[0],
77
+ setHasPreservedColumns = _useState0[1];
78
+ var _useState1 = useState(),
79
+ _useState10 = _slicedToArray(_useState1, 2),
80
+ errorState = _useState10[0],
81
+ setErrorState = _useState10[1];
76
82
  var _useDatasourceAnalyti = useDatasourceAnalyticsEvents(),
77
83
  fireEvent = _useDatasourceAnalyti.fireEvent;
78
84
  var experienceId = useDatasourceExperienceId();
@@ -143,6 +149,26 @@ var PlainAssetsConfigModal = function PlainAssetsConfigModal(props) {
143
149
  destinationObjectTypes = _useDatasourceTableSt.destinationObjectTypes,
144
150
  totalCount = _useDatasourceTableSt.totalCount;
145
151
 
152
+ // A preserved selection must drop whatever the edited query stopped reporting. This is adjusted
153
+ // during render, not in an effect: the table hook is called before this component's own effects
154
+ // are registered, so its effects run first and would read the columns still awaiting removal as
155
+ // newly selected ones - refetching for them, and throwing away the results just received. The
156
+ // re-render this schedules is discarded before commit, so the hook only ever sees the reconciled
157
+ // selection.
158
+ if (fg('platform_lp_sllv_preserve_assets_columns') && hasPreservedColumns && status === 'resolved' && columns.length > 0) {
159
+ var availableKeys = new Set(columns.map(function (_ref) {
160
+ var key = _ref.key;
161
+ return key;
162
+ }));
163
+ var selectedKeys = visibleColumnKeys !== null && visibleColumnKeys !== void 0 ? visibleColumnKeys : [];
164
+ var retainedKeys = selectedKeys.filter(function (key) {
165
+ return availableKeys.has(key);
166
+ });
167
+ if (retainedKeys.length !== selectedKeys.length) {
168
+ setVisibleColumnKeys(retainedKeys.length > 0 ? retainedKeys : defaultVisibleColumnKeys);
169
+ }
170
+ }
171
+
146
172
  /* ------------------------------ OBSERVABILITY ------------------------------ */
147
173
  var searchCount = useRef(0);
148
174
  var userInteractions = useUserInteractions();
@@ -204,9 +230,28 @@ var PlainAssetsConfigModal = function PlainAssetsConfigModal(props) {
204
230
  setIsNewSearch(false);
205
231
  }, []);
206
232
  useEffect(function () {
233
+ // A preserved selection owns the columns, so restoring the saved or default ones would undo it
234
+ if (fg('platform_lp_sllv_preserve_assets_columns') && hasPreservedColumns) {
235
+ return;
236
+ }
207
237
  var newVisibleColumnKeys = initialVisibleColumnKeys && initialVisibleColumnKeys.length > 0 && apiVersion === VERSION_TWO ? initialVisibleColumnKeys : defaultVisibleColumnKeys;
208
238
  setVisibleColumnKeys(newVisibleColumnKeys);
209
- }, [initialVisibleColumnKeys, defaultVisibleColumnKeys, apiVersion]);
239
+ }, [initialVisibleColumnKeys, defaultVisibleColumnKeys, apiVersion, hasPreservedColumns]);
240
+ useEffect(function () {
241
+ // The response described none of the requested fields, so there is nothing valid to keep and
242
+ // no reported defaults to fall back to. Give up preserving and re-request the schema's own
243
+ // defaults. This one has to stay an effect because it issues a request.
244
+ if (!fg('platform_lp_sllv_preserve_assets_columns') || !hasPreservedColumns || status !== 'resolved' || columns.length > 0) {
245
+ return;
246
+ }
247
+ setHasPreservedColumns(false);
248
+ setVisibleColumnKeys([]);
249
+ setIsNewSearch(true);
250
+ reset({
251
+ shouldForceRequest: true,
252
+ shouldResetColumns: true
253
+ });
254
+ }, [columns, hasPreservedColumns, reset, status]);
210
255
  useEffect(function () {
211
256
  if (isNewSearch) {
212
257
  setVisibleColumnKeys(defaultVisibleColumnKeys);
@@ -282,16 +327,22 @@ var PlainAssetsConfigModal = function PlainAssetsConfigModal(props) {
282
327
  if (aql !== searchAql) {
283
328
  userInteractions.add(DatasourceAction.QUERY_UPDATED);
284
329
  }
330
+ // An empty selection has nothing worth preserving, and keeping it would stop the
331
+ // response's defaults from being adopted
332
+ var shouldPreserveColumns = fg('platform_lp_sllv_preserve_assets_columns') && schemaId === searchSchemaId && (visibleColumnKeys !== null && visibleColumnKeys !== void 0 ? visibleColumnKeys : []).length > 0;
333
+ setHasPreservedColumns(shouldPreserveColumns);
285
334
  setAql(searchAql);
286
335
  setSchemaId(searchSchemaId);
287
- setVisibleColumnKeys([]);
288
- setIsNewSearch(true);
336
+ if (!shouldPreserveColumns) {
337
+ setVisibleColumnKeys([]);
338
+ }
339
+ setIsNewSearch(!shouldPreserveColumns);
289
340
  reset({
290
341
  shouldForceRequest: true,
291
- shouldResetColumns: true
342
+ shouldResetColumns: !shouldPreserveColumns
292
343
  });
293
344
  }
294
- }, [aql, reset, schemaId, status, userInteractions]);
345
+ }, [aql, reset, schemaId, status, userInteractions, visibleColumnKeys]);
295
346
  var renderErrorState = useCallback(function () {
296
347
  if (errorState) {
297
348
  switch (errorState) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/link-datasource",
3
- "version": "6.14.1",
3
+ "version": "6.14.2",
4
4
  "description": "UI Components to support linking platform dataset feature",
5
5
  "author": "Atlassian Pty Ltd",
6
6
  "license": "Apache-2.0",
@@ -183,6 +183,9 @@
183
183
  "platform_lp_sllv_ux_improvements": {
184
184
  "type": "boolean"
185
185
  },
186
+ "platform_lp_sllv_preserve_assets_columns": {
187
+ "type": "boolean"
188
+ },
186
189
  "platform_lp_sllv_table_settings_menu": {
187
190
  "type": "boolean"
188
191
  },