@atlaskit/link-datasource 4.32.5 → 4.33.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 CHANGED
@@ -1,5 +1,18 @@
1
1
  # @atlaskit/link-datasource
2
2
 
3
+ ## 4.33.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`52e8d22762662`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/52e8d22762662) -
8
+ Adding functionality to update JQL search with latest JQL query input (if valid) before inserting
9
+ using Jira Work Items Modal in confluence - Insert button remains disabled until search input is
10
+ valid/well-formed. Gated behind navx-1345-issues-modal-jql-submit-fix
11
+
12
+ ### Patch Changes
13
+
14
+ - Updated dependencies
15
+
3
16
  ## 4.32.5
4
17
 
5
18
  ### Patch Changes
@@ -9,6 +9,7 @@ exports.InsertButton = void 0;
9
9
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
10
  var _react = _interopRequireWildcard(require("react"));
11
11
  var _standardButton = _interopRequireDefault(require("@atlaskit/button/standard-button"));
12
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
12
13
  var _analytics = require("../../../../analytics");
13
14
  var _types = require("../../../../analytics/types");
14
15
  var _schemaUtils = require("../../../../common/utils/schema-utils");
@@ -22,7 +23,9 @@ var InsertButton = exports.InsertButton = function InsertButton(_ref) {
22
23
  var testId = _ref.testId,
23
24
  url = _ref.url,
24
25
  getAnalyticsPayload = _ref.getAnalyticsPayload,
25
- children = _ref.children;
26
+ children = _ref.children,
27
+ onBeforeInsert = _ref.onBeforeInsert,
28
+ hasErrors = _ref.hasErrors;
26
29
  var _useDatasourceContext = (0, _datasourceContext.useDatasourceContext)(),
27
30
  datasourceId = _useDatasourceContext.datasourceId,
28
31
  parameters = _useDatasourceContext.parameters,
@@ -38,12 +41,17 @@ var InsertButton = exports.InsertButton = function InsertButton(_ref) {
38
41
  var userInteractions = (0, _userInteractions.useUserInteractions)();
39
42
  var _useViewModeContext = (0, _useViewModeContext2.useViewModeContext)(),
40
43
  currentViewMode = _useViewModeContext.currentViewMode;
41
- var isInsertDisabled = !isValidParameters(parameters) || status === 'rejected' || status === 'unauthorized' || status === 'loading';
44
+ var isJqlSubmitFixEnabled = (0, _platformFeatureFlags.fg)('navx-1345-issues-modal-jql-submit-fix');
45
+ var isInsertDisabled = (isJqlSubmitFixEnabled ? hasErrors : false) || !isValidParameters(parameters) || status === 'rejected' || status === 'unauthorized' || status === 'loading';
42
46
  var onInsertPressed = (0, _react.useCallback)(function (_e, analyticsEvent) {
43
47
  var _insertButtonClickedE;
44
48
  if (!parameters || !isValidParameters(parameters) || !url) {
45
49
  return;
46
50
  }
51
+ if (isJqlSubmitFixEnabled) {
52
+ onBeforeInsert === null || onBeforeInsert === void 0 || onBeforeInsert(parameters);
53
+ }
54
+ ;
47
55
  var insertButtonClickedEvent = analyticsEvent.update({
48
56
  actionSubjectId: 'insert',
49
57
  attributes: _objectSpread({
@@ -86,7 +94,7 @@ var InsertButton = exports.InsertButton = function InsertButton(_ref) {
86
94
  }]
87
95
  }, url), consumerEvent);
88
96
  }
89
- }, [columnCustomSizes, currentViewMode, datasourceId, getAnalyticsPayload, isValidParameters, onInsert, parameters, totalCount, url, userInteractions, visibleColumnCount, visibleColumnKeys, wrappedColumnKeys]);
97
+ }, [columnCustomSizes, currentViewMode, datasourceId, getAnalyticsPayload, isValidParameters, onInsert, parameters, totalCount, url, userInteractions, visibleColumnCount, visibleColumnKeys, wrappedColumnKeys, isJqlSubmitFixEnabled, onBeforeInsert]);
90
98
  return /*#__PURE__*/_react.default.createElement(_standardButton.default, {
91
99
  appearance: "primary",
92
100
  onClick: onInsertPressed,
@@ -15,6 +15,7 @@ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/sli
15
15
  var _react = _interopRequireWildcard(require("react"));
16
16
  var _reactIntlNext = require("react-intl-next");
17
17
  var _useDebounce = require("use-debounce");
18
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
18
19
  var _compiled = require("@atlaskit/primitives/compiled");
19
20
  var _analytics = require("../../../analytics");
20
21
  var _basicSearchInput = require("../../common/modal/basic-search-input");
@@ -48,7 +49,8 @@ var JiraSearchContainer = exports.JiraSearchContainer = function JiraSearchConta
48
49
  setSearchBarJql = props.setSearchBarJql,
49
50
  _props$searchBarJql = props.searchBarJql,
50
51
  searchBarJql = _props$searchBarJql === void 0 ? DEFAULT_JQL_QUERY : _props$searchBarJql,
51
- site = props.site;
52
+ site = props.site,
53
+ setHasJqlSyntaxErrors = props.setHasJqlSyntaxErrors;
52
54
  var _ref = parameters || {},
53
55
  currentCloudId = _ref.cloudId;
54
56
  var _useIntl = (0, _reactIntlNext.useIntl)(),
@@ -118,8 +120,11 @@ var JiraSearchContainer = exports.JiraSearchContainer = function JiraSearchConta
118
120
  orderKey: orderKey
119
121
  }));
120
122
  }, [setSearchBarJql, filterSelections, orderDirection, orderKey]);
121
- var onQueryChange = (0, _react.useCallback)(function (query) {
123
+ var onQueryChange = (0, _react.useCallback)(function (query, jast) {
122
124
  var _query$split$map$filt, _fragments$at, _fragments$at2, _fragments$at3;
125
+ if ((0, _platformFeatureFlags.fg)('navx-1345-issues-modal-jql-submit-fix')) {
126
+ setHasJqlSyntaxErrors === null || setHasJqlSyntaxErrors === void 0 || setHasJqlSyntaxErrors(jast.errors.length > 0);
127
+ }
123
128
  // determine if order keys have been set so they can be saved and persisted when changes occur in basic search
124
129
  var fragments = (_query$split$map$filt = query === null || query === void 0 ? void 0 : query.split(/(^| )(order by)( |$)/i).map(function (item) {
125
130
  return item.trim();
@@ -134,7 +139,7 @@ var JiraSearchContainer = exports.JiraSearchContainer = function JiraSearchConta
134
139
  setOrderDirection(order);
135
140
  }
136
141
  setSearchBarJql(query);
137
- }, [setSearchBarJql]);
142
+ }, [setSearchBarJql, setHasJqlSyntaxErrors]);
138
143
  var handleSearch = (0, _react.useCallback)(function () {
139
144
  var isCurrentQueryComplex = (0, _isQueryTooComplex.isQueryTooComplex)(searchBarJql);
140
145
  onSearch({
@@ -100,24 +100,30 @@ var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(props) {
100
100
  var _useState = (0, _react.useState)(jql),
101
101
  _useState2 = (0, _slicedToArray2.default)(_useState, 1),
102
102
  initialJql = _useState2[0];
103
+ var isJqlSubmitFixEnabled = (0, _platformFeatureFlags.fg)('navx-1345-issues-modal-jql-submit-fix');
104
+ var _useState3 = (0, _react.useState)(false),
105
+ _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
106
+ hasJqlSyntaxErrors = _useState4[0],
107
+ setHasJqlSyntaxErrors = _useState4[1]; // Tracks if current jql input has syntax errors
108
+
103
109
  var _useViewModeContext = (0, _useViewModeContext2.useViewModeContext)(),
104
110
  currentViewMode = _useViewModeContext.currentViewMode;
105
111
  var _useAvailableSites = (0, _useAvailableSites2.useAvailableSites)('jira', cloudId),
106
112
  availableSites = _useAvailableSites.availableSites,
107
113
  selectedJiraSite = _useAvailableSites.selectedSite;
108
- var _useState3 = (0, _react.useState)(jql),
109
- _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
110
- searchBarJql = _useState4[0],
111
- setSearchBarJql = _useState4[1];
114
+ var _useState5 = (0, _react.useState)(jql),
115
+ _useState6 = (0, _slicedToArray2.default)(_useState5, 2),
116
+ searchBarJql = _useState6[0],
117
+ setSearchBarJql = _useState6[1];
112
118
 
113
119
  // analytics related parameters
114
120
  var searchCount = (0, _react.useRef)(0);
115
121
  var userInteractions = (0, _userInteractions.useUserInteractions)();
116
122
  var initialSearchMethod = !(0, _isQueryTooComplex.isQueryTooComplex)(initialJql || '') ? 'basic' : 'jql';
117
- var _useState5 = (0, _react.useState)(initialSearchMethod),
118
- _useState6 = (0, _slicedToArray2.default)(_useState5, 2),
119
- currentSearchMethod = _useState6[0],
120
- setCurrentSearchMethod = _useState6[1];
123
+ var _useState7 = (0, _react.useState)(initialSearchMethod),
124
+ _useState8 = (0, _slicedToArray2.default)(_useState7, 2),
125
+ currentSearchMethod = _useState8[0],
126
+ setCurrentSearchMethod = _useState8[1];
121
127
  var searchMethodSearchedWith = (0, _react.useRef)(null);
122
128
  var basicFilterSelectionsSearchedWith = (0, _react.useRef)({});
123
129
  var isSearchedWithComplexQuery = (0, _react.useRef)(false);
@@ -374,6 +380,9 @@ var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(props) {
374
380
  var upToDateJqlUrl = "".concat(selectedJiraSite.url, "/issues/?jql=").concat(encodeURIComponent(jql));
375
381
  return currentViewMode === 'inline' && responseItems.length === 1 ? retrieveUrlForSmartCardRender() : upToDateJqlUrl;
376
382
  }, [currentViewMode, parameters === null || parameters === void 0 ? void 0 : parameters.jql, responseItems, retrieveUrlForSmartCardRender, selectedJiraSite === null || selectedJiraSite === void 0 ? void 0 : selectedJiraSite.url]);
383
+ var updateParametersJql = (0, _react.useCallback)(function (parameters) {
384
+ parameters.jql = searchBarJql;
385
+ }, [searchBarJql]);
377
386
  return /*#__PURE__*/_react.default.createElement(_intlMessagesProvider.IntlMessagesProvider, {
378
387
  defaultMessages: _en.default,
379
388
  loaderFn: _fetchMessagesForLocale.fetchMessagesForLocale
@@ -402,6 +411,7 @@ var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(props) {
402
411
  }))))), /*#__PURE__*/_react.default.createElement(_modalDialog.ModalBody, null, !hasNoJiraSites ? /*#__PURE__*/_react.default.createElement(_react.Fragment, null, /*#__PURE__*/_react.default.createElement(_jiraSearchContainer.JiraSearchContainer, {
403
412
  setSearchBarJql: setSearchBarJql,
404
413
  searchBarJql: searchBarJql,
414
+ setHasJqlSyntaxErrors: isJqlSubmitFixEnabled ? setHasJqlSyntaxErrors : undefined,
405
415
  isSearching: status === 'loading',
406
416
  parameters: parameters,
407
417
  onSearch: onSearch,
@@ -425,11 +435,14 @@ var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(props) {
425
435
  onCancel: onCancel,
426
436
  getAnalyticsPayload: getCancelButtonAnalyticsPayload,
427
437
  testId: "jira-datasource-modal--cancel-button"
428
- }), !hasNoJiraSites && /*#__PURE__*/_react.default.createElement(_insertButton.InsertButton, {
438
+ }), !hasNoJiraSites && /*#__PURE__*/_react.default.createElement(_insertButton.InsertButton, (0, _extends2.default)({
429
439
  testId: "jira-datasource-modal--insert-button",
430
440
  url: urlToInsert,
431
441
  getAnalyticsPayload: getInsertButtonAnalyticsPayload
432
- }, /*#__PURE__*/_react.default.createElement(_reactIntlNext.FormattedMessage, _messages3.modalMessages.insertIssuesButtonTextIssueTermSllv))))));
442
+ }, isJqlSubmitFixEnabled ? {
443
+ onBeforeInsert: updateParametersJql,
444
+ hasErrors: hasJqlSyntaxErrors
445
+ } : {}), /*#__PURE__*/_react.default.createElement(_reactIntlNext.FormattedMessage, _messages3.modalMessages.insertIssuesButtonTextIssueTermSllv))))));
433
446
  };
434
447
  var ConnectedJiraIssueConfigModal = (0, _createDatasourceModal.createDatasourceModal)({
435
448
  isValidParameters: isValidParameters,
@@ -1,5 +1,6 @@
1
1
  import React, { useCallback } from 'react';
2
2
  import Button from '@atlaskit/button/standard-button';
3
+ import { fg } from '@atlaskit/platform-feature-flags';
3
4
  import { EVENT_CHANNEL } from '../../../../analytics';
4
5
  import { DatasourceDisplay, DatasourceSearchMethod } from '../../../../analytics/types';
5
6
  import { buildDatasourceAdf } from '../../../../common/utils/schema-utils';
@@ -10,7 +11,9 @@ export const InsertButton = ({
10
11
  testId,
11
12
  url,
12
13
  getAnalyticsPayload,
13
- children
14
+ children,
15
+ onBeforeInsert,
16
+ hasErrors
14
17
  }) => {
15
18
  const {
16
19
  datasourceId,
@@ -30,12 +33,17 @@ export const InsertButton = ({
30
33
  const {
31
34
  currentViewMode
32
35
  } = useViewModeContext();
33
- const isInsertDisabled = !isValidParameters(parameters) || status === 'rejected' || status === 'unauthorized' || status === 'loading';
36
+ const isJqlSubmitFixEnabled = fg('navx-1345-issues-modal-jql-submit-fix');
37
+ const isInsertDisabled = (isJqlSubmitFixEnabled ? hasErrors : false) || !isValidParameters(parameters) || status === 'rejected' || status === 'unauthorized' || status === 'loading';
34
38
  const onInsertPressed = useCallback((_e, analyticsEvent) => {
35
39
  var _insertButtonClickedE;
36
40
  if (!parameters || !isValidParameters(parameters) || !url) {
37
41
  return;
38
42
  }
43
+ if (isJqlSubmitFixEnabled) {
44
+ onBeforeInsert === null || onBeforeInsert === void 0 ? void 0 : onBeforeInsert(parameters);
45
+ }
46
+ ;
39
47
  const insertButtonClickedEvent = analyticsEvent.update({
40
48
  actionSubjectId: 'insert',
41
49
  attributes: {
@@ -81,7 +89,7 @@ export const InsertButton = ({
81
89
  }]
82
90
  }, url), consumerEvent);
83
91
  }
84
- }, [columnCustomSizes, currentViewMode, datasourceId, getAnalyticsPayload, isValidParameters, onInsert, parameters, totalCount, url, userInteractions, visibleColumnCount, visibleColumnKeys, wrappedColumnKeys]);
92
+ }, [columnCustomSizes, currentViewMode, datasourceId, getAnalyticsPayload, isValidParameters, onInsert, parameters, totalCount, url, userInteractions, visibleColumnCount, visibleColumnKeys, wrappedColumnKeys, isJqlSubmitFixEnabled, onBeforeInsert]);
85
93
  return /*#__PURE__*/React.createElement(Button, {
86
94
  appearance: "primary",
87
95
  onClick: onInsertPressed,
@@ -4,6 +4,7 @@ import { ax, ix } from "@compiled/react/runtime";
4
4
  import React, { useCallback, useEffect, useMemo, useState } from 'react';
5
5
  import { useIntl } from 'react-intl-next';
6
6
  import { useDebouncedCallback } from 'use-debounce';
7
+ import { fg } from '@atlaskit/platform-feature-flags';
7
8
  import { Box, Flex, Text } from '@atlaskit/primitives/compiled';
8
9
  import { useDatasourceAnalyticsEvents } from '../../../analytics';
9
10
  import { BasicSearchInput } from '../../common/modal/basic-search-input';
@@ -33,7 +34,8 @@ export const JiraSearchContainer = props => {
33
34
  initialSearchMethod,
34
35
  setSearchBarJql,
35
36
  searchBarJql = DEFAULT_JQL_QUERY,
36
- site
37
+ site,
38
+ setHasJqlSyntaxErrors
37
39
  } = props;
38
40
  const {
39
41
  cloudId: currentCloudId
@@ -83,8 +85,11 @@ export const JiraSearchContainer = props => {
83
85
  orderKey
84
86
  }));
85
87
  }, [setSearchBarJql, filterSelections, orderDirection, orderKey]);
86
- const onQueryChange = useCallback(query => {
88
+ const onQueryChange = useCallback((query, jast) => {
87
89
  var _query$split$map$filt, _fragments$at, _fragments$at2, _fragments$at3;
90
+ if (fg('navx-1345-issues-modal-jql-submit-fix')) {
91
+ setHasJqlSyntaxErrors === null || setHasJqlSyntaxErrors === void 0 ? void 0 : setHasJqlSyntaxErrors(jast.errors.length > 0);
92
+ }
88
93
  // determine if order keys have been set so they can be saved and persisted when changes occur in basic search
89
94
  const fragments = (_query$split$map$filt = query === null || query === void 0 ? void 0 : query.split(/(^| )(order by)( |$)/i).map(item => item.trim()).filter(Boolean)) !== null && _query$split$map$filt !== void 0 ? _query$split$map$filt : [];
90
95
  const hasOrder = ((_fragments$at = fragments.at(-2)) === null || _fragments$at === void 0 ? void 0 : _fragments$at.toLowerCase()) === 'order by';
@@ -97,7 +102,7 @@ export const JiraSearchContainer = props => {
97
102
  setOrderDirection(order);
98
103
  }
99
104
  setSearchBarJql(query);
100
- }, [setSearchBarJql]);
105
+ }, [setSearchBarJql, setHasJqlSyntaxErrors]);
101
106
  const handleSearch = useCallback(() => {
102
107
  const isCurrentQueryComplex = isQueryTooComplex(searchBarJql);
103
108
  onSearch({
@@ -89,6 +89,9 @@ const PlainJiraIssuesConfigModal = props => {
89
89
  jql
90
90
  } = parameters !== null && parameters !== void 0 ? parameters : {};
91
91
  const [initialJql] = useState(jql);
92
+ const isJqlSubmitFixEnabled = fg('navx-1345-issues-modal-jql-submit-fix');
93
+ const [hasJqlSyntaxErrors, setHasJqlSyntaxErrors] = useState(false); // Tracks if current jql input has syntax errors
94
+
92
95
  const {
93
96
  currentViewMode
94
97
  } = useViewModeContext();
@@ -360,6 +363,9 @@ const PlainJiraIssuesConfigModal = props => {
360
363
  const upToDateJqlUrl = `${selectedJiraSite.url}/issues/?jql=${encodeURIComponent(jql)}`;
361
364
  return currentViewMode === 'inline' && responseItems.length === 1 ? retrieveUrlForSmartCardRender() : upToDateJqlUrl;
362
365
  }, [currentViewMode, parameters === null || parameters === void 0 ? void 0 : parameters.jql, responseItems, retrieveUrlForSmartCardRender, selectedJiraSite === null || selectedJiraSite === void 0 ? void 0 : selectedJiraSite.url]);
366
+ const updateParametersJql = useCallback(parameters => {
367
+ parameters.jql = searchBarJql;
368
+ }, [searchBarJql]);
363
369
  return /*#__PURE__*/React.createElement(IntlMessagesProvider, {
364
370
  defaultMessages: i18nEN,
365
371
  loaderFn: fetchMessagesForLocale
@@ -388,6 +394,7 @@ const PlainJiraIssuesConfigModal = props => {
388
394
  }))))), /*#__PURE__*/React.createElement(ModalBody, null, !hasNoJiraSites ? /*#__PURE__*/React.createElement(Fragment, null, /*#__PURE__*/React.createElement(JiraSearchContainer, {
389
395
  setSearchBarJql: setSearchBarJql,
390
396
  searchBarJql: searchBarJql,
397
+ setHasJqlSyntaxErrors: isJqlSubmitFixEnabled ? setHasJqlSyntaxErrors : undefined,
391
398
  isSearching: status === 'loading',
392
399
  parameters: parameters,
393
400
  onSearch: onSearch,
@@ -411,11 +418,14 @@ const PlainJiraIssuesConfigModal = props => {
411
418
  onCancel: onCancel,
412
419
  getAnalyticsPayload: getCancelButtonAnalyticsPayload,
413
420
  testId: "jira-datasource-modal--cancel-button"
414
- }), !hasNoJiraSites && /*#__PURE__*/React.createElement(InsertButton, {
421
+ }), !hasNoJiraSites && /*#__PURE__*/React.createElement(InsertButton, _extends({
415
422
  testId: "jira-datasource-modal--insert-button",
416
423
  url: urlToInsert,
417
424
  getAnalyticsPayload: getInsertButtonAnalyticsPayload
418
- }, /*#__PURE__*/React.createElement(FormattedMessage, modalMessages.insertIssuesButtonTextIssueTermSllv))))));
425
+ }, isJqlSubmitFixEnabled ? {
426
+ onBeforeInsert: updateParametersJql,
427
+ hasErrors: hasJqlSyntaxErrors
428
+ } : {}), /*#__PURE__*/React.createElement(FormattedMessage, modalMessages.insertIssuesButtonTextIssueTermSllv))))));
419
429
  };
420
430
  const ConnectedJiraIssueConfigModal = createDatasourceModal({
421
431
  isValidParameters,
@@ -3,6 +3,7 @@ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbol
3
3
  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; }
4
4
  import React, { useCallback } from 'react';
5
5
  import Button from '@atlaskit/button/standard-button';
6
+ import { fg } from '@atlaskit/platform-feature-flags';
6
7
  import { EVENT_CHANNEL } from '../../../../analytics';
7
8
  import { DatasourceDisplay, DatasourceSearchMethod } from '../../../../analytics/types';
8
9
  import { buildDatasourceAdf } from '../../../../common/utils/schema-utils';
@@ -13,7 +14,9 @@ export var InsertButton = function InsertButton(_ref) {
13
14
  var testId = _ref.testId,
14
15
  url = _ref.url,
15
16
  getAnalyticsPayload = _ref.getAnalyticsPayload,
16
- children = _ref.children;
17
+ children = _ref.children,
18
+ onBeforeInsert = _ref.onBeforeInsert,
19
+ hasErrors = _ref.hasErrors;
17
20
  var _useDatasourceContext = useDatasourceContext(),
18
21
  datasourceId = _useDatasourceContext.datasourceId,
19
22
  parameters = _useDatasourceContext.parameters,
@@ -29,12 +32,17 @@ export var InsertButton = function InsertButton(_ref) {
29
32
  var userInteractions = useUserInteractions();
30
33
  var _useViewModeContext = useViewModeContext(),
31
34
  currentViewMode = _useViewModeContext.currentViewMode;
32
- var isInsertDisabled = !isValidParameters(parameters) || status === 'rejected' || status === 'unauthorized' || status === 'loading';
35
+ var isJqlSubmitFixEnabled = fg('navx-1345-issues-modal-jql-submit-fix');
36
+ var isInsertDisabled = (isJqlSubmitFixEnabled ? hasErrors : false) || !isValidParameters(parameters) || status === 'rejected' || status === 'unauthorized' || status === 'loading';
33
37
  var onInsertPressed = useCallback(function (_e, analyticsEvent) {
34
38
  var _insertButtonClickedE;
35
39
  if (!parameters || !isValidParameters(parameters) || !url) {
36
40
  return;
37
41
  }
42
+ if (isJqlSubmitFixEnabled) {
43
+ onBeforeInsert === null || onBeforeInsert === void 0 || onBeforeInsert(parameters);
44
+ }
45
+ ;
38
46
  var insertButtonClickedEvent = analyticsEvent.update({
39
47
  actionSubjectId: 'insert',
40
48
  attributes: _objectSpread({
@@ -77,7 +85,7 @@ export var InsertButton = function InsertButton(_ref) {
77
85
  }]
78
86
  }, url), consumerEvent);
79
87
  }
80
- }, [columnCustomSizes, currentViewMode, datasourceId, getAnalyticsPayload, isValidParameters, onInsert, parameters, totalCount, url, userInteractions, visibleColumnCount, visibleColumnKeys, wrappedColumnKeys]);
88
+ }, [columnCustomSizes, currentViewMode, datasourceId, getAnalyticsPayload, isValidParameters, onInsert, parameters, totalCount, url, userInteractions, visibleColumnCount, visibleColumnKeys, wrappedColumnKeys, isJqlSubmitFixEnabled, onBeforeInsert]);
81
89
  return /*#__PURE__*/React.createElement(Button, {
82
90
  appearance: "primary",
83
91
  onClick: onInsertPressed,
@@ -10,6 +10,7 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
10
10
  import React, { useCallback, useEffect, useMemo, useState } from 'react';
11
11
  import { useIntl } from 'react-intl-next';
12
12
  import { useDebouncedCallback } from 'use-debounce';
13
+ import { fg } from '@atlaskit/platform-feature-flags';
13
14
  import { Box, Flex, Text } from '@atlaskit/primitives/compiled';
14
15
  import { useDatasourceAnalyticsEvents } from '../../../analytics';
15
16
  import { BasicSearchInput } from '../../common/modal/basic-search-input';
@@ -39,7 +40,8 @@ export var JiraSearchContainer = function JiraSearchContainer(props) {
39
40
  setSearchBarJql = props.setSearchBarJql,
40
41
  _props$searchBarJql = props.searchBarJql,
41
42
  searchBarJql = _props$searchBarJql === void 0 ? DEFAULT_JQL_QUERY : _props$searchBarJql,
42
- site = props.site;
43
+ site = props.site,
44
+ setHasJqlSyntaxErrors = props.setHasJqlSyntaxErrors;
43
45
  var _ref = parameters || {},
44
46
  currentCloudId = _ref.cloudId;
45
47
  var _useIntl = useIntl(),
@@ -109,8 +111,11 @@ export var JiraSearchContainer = function JiraSearchContainer(props) {
109
111
  orderKey: orderKey
110
112
  }));
111
113
  }, [setSearchBarJql, filterSelections, orderDirection, orderKey]);
112
- var onQueryChange = useCallback(function (query) {
114
+ var onQueryChange = useCallback(function (query, jast) {
113
115
  var _query$split$map$filt, _fragments$at, _fragments$at2, _fragments$at3;
116
+ if (fg('navx-1345-issues-modal-jql-submit-fix')) {
117
+ setHasJqlSyntaxErrors === null || setHasJqlSyntaxErrors === void 0 || setHasJqlSyntaxErrors(jast.errors.length > 0);
118
+ }
114
119
  // determine if order keys have been set so they can be saved and persisted when changes occur in basic search
115
120
  var fragments = (_query$split$map$filt = query === null || query === void 0 ? void 0 : query.split(/(^| )(order by)( |$)/i).map(function (item) {
116
121
  return item.trim();
@@ -125,7 +130,7 @@ export var JiraSearchContainer = function JiraSearchContainer(props) {
125
130
  setOrderDirection(order);
126
131
  }
127
132
  setSearchBarJql(query);
128
- }, [setSearchBarJql]);
133
+ }, [setSearchBarJql, setHasJqlSyntaxErrors]);
129
134
  var handleSearch = useCallback(function () {
130
135
  var isCurrentQueryComplex = isQueryTooComplex(searchBarJql);
131
136
  onSearch({
@@ -92,24 +92,30 @@ var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(props) {
92
92
  var _useState = useState(jql),
93
93
  _useState2 = _slicedToArray(_useState, 1),
94
94
  initialJql = _useState2[0];
95
+ var isJqlSubmitFixEnabled = fg('navx-1345-issues-modal-jql-submit-fix');
96
+ var _useState3 = useState(false),
97
+ _useState4 = _slicedToArray(_useState3, 2),
98
+ hasJqlSyntaxErrors = _useState4[0],
99
+ setHasJqlSyntaxErrors = _useState4[1]; // Tracks if current jql input has syntax errors
100
+
95
101
  var _useViewModeContext = useViewModeContext(),
96
102
  currentViewMode = _useViewModeContext.currentViewMode;
97
103
  var _useAvailableSites = useAvailableSites('jira', cloudId),
98
104
  availableSites = _useAvailableSites.availableSites,
99
105
  selectedJiraSite = _useAvailableSites.selectedSite;
100
- var _useState3 = useState(jql),
101
- _useState4 = _slicedToArray(_useState3, 2),
102
- searchBarJql = _useState4[0],
103
- setSearchBarJql = _useState4[1];
106
+ var _useState5 = useState(jql),
107
+ _useState6 = _slicedToArray(_useState5, 2),
108
+ searchBarJql = _useState6[0],
109
+ setSearchBarJql = _useState6[1];
104
110
 
105
111
  // analytics related parameters
106
112
  var searchCount = useRef(0);
107
113
  var userInteractions = useUserInteractions();
108
114
  var initialSearchMethod = !isQueryTooComplex(initialJql || '') ? 'basic' : 'jql';
109
- var _useState5 = useState(initialSearchMethod),
110
- _useState6 = _slicedToArray(_useState5, 2),
111
- currentSearchMethod = _useState6[0],
112
- setCurrentSearchMethod = _useState6[1];
115
+ var _useState7 = useState(initialSearchMethod),
116
+ _useState8 = _slicedToArray(_useState7, 2),
117
+ currentSearchMethod = _useState8[0],
118
+ setCurrentSearchMethod = _useState8[1];
113
119
  var searchMethodSearchedWith = useRef(null);
114
120
  var basicFilterSelectionsSearchedWith = useRef({});
115
121
  var isSearchedWithComplexQuery = useRef(false);
@@ -366,6 +372,9 @@ var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(props) {
366
372
  var upToDateJqlUrl = "".concat(selectedJiraSite.url, "/issues/?jql=").concat(encodeURIComponent(jql));
367
373
  return currentViewMode === 'inline' && responseItems.length === 1 ? retrieveUrlForSmartCardRender() : upToDateJqlUrl;
368
374
  }, [currentViewMode, parameters === null || parameters === void 0 ? void 0 : parameters.jql, responseItems, retrieveUrlForSmartCardRender, selectedJiraSite === null || selectedJiraSite === void 0 ? void 0 : selectedJiraSite.url]);
375
+ var updateParametersJql = useCallback(function (parameters) {
376
+ parameters.jql = searchBarJql;
377
+ }, [searchBarJql]);
369
378
  return /*#__PURE__*/React.createElement(IntlMessagesProvider, {
370
379
  defaultMessages: i18nEN,
371
380
  loaderFn: fetchMessagesForLocale
@@ -394,6 +403,7 @@ var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(props) {
394
403
  }))))), /*#__PURE__*/React.createElement(ModalBody, null, !hasNoJiraSites ? /*#__PURE__*/React.createElement(Fragment, null, /*#__PURE__*/React.createElement(JiraSearchContainer, {
395
404
  setSearchBarJql: setSearchBarJql,
396
405
  searchBarJql: searchBarJql,
406
+ setHasJqlSyntaxErrors: isJqlSubmitFixEnabled ? setHasJqlSyntaxErrors : undefined,
397
407
  isSearching: status === 'loading',
398
408
  parameters: parameters,
399
409
  onSearch: onSearch,
@@ -417,11 +427,14 @@ var PlainJiraIssuesConfigModal = function PlainJiraIssuesConfigModal(props) {
417
427
  onCancel: onCancel,
418
428
  getAnalyticsPayload: getCancelButtonAnalyticsPayload,
419
429
  testId: "jira-datasource-modal--cancel-button"
420
- }), !hasNoJiraSites && /*#__PURE__*/React.createElement(InsertButton, {
430
+ }), !hasNoJiraSites && /*#__PURE__*/React.createElement(InsertButton, _extends({
421
431
  testId: "jira-datasource-modal--insert-button",
422
432
  url: urlToInsert,
423
433
  getAnalyticsPayload: getInsertButtonAnalyticsPayload
424
- }, /*#__PURE__*/React.createElement(FormattedMessage, modalMessages.insertIssuesButtonTextIssueTermSllv))))));
434
+ }, isJqlSubmitFixEnabled ? {
435
+ onBeforeInsert: updateParametersJql,
436
+ hasErrors: hasJqlSyntaxErrors
437
+ } : {}), /*#__PURE__*/React.createElement(FormattedMessage, modalMessages.insertIssuesButtonTextIssueTermSllv))))));
425
438
  };
426
439
  var ConnectedJiraIssueConfigModal = createDatasourceModal({
427
440
  isValidParameters: isValidParameters,
@@ -1,8 +1,10 @@
1
1
  import React, { type PropsWithChildren } from 'react';
2
2
  import { type DatasourceParameters } from '@atlaskit/linking-types';
3
- export type InsertButtonProps<_Parameters extends DatasourceParameters> = PropsWithChildren<{
3
+ export type InsertButtonProps<Parameters extends DatasourceParameters> = PropsWithChildren<{
4
4
  getAnalyticsPayload: () => Record<string, any>;
5
+ hasErrors?: boolean;
6
+ onBeforeInsert?: (parameters: Parameters) => void;
5
7
  testId?: string;
6
8
  url: string | undefined;
7
9
  }>;
8
- export declare const InsertButton: <Parameters extends DatasourceParameters>({ testId, url, getAnalyticsPayload, children, }: InsertButtonProps<Parameters>) => React.JSX.Element;
10
+ export declare const InsertButton: <Parameters extends DatasourceParameters>({ testId, url, getAnalyticsPayload, children, onBeforeInsert, hasErrors, }: InsertButtonProps<Parameters>) => React.JSX.Element;
@@ -14,6 +14,7 @@ export interface SearchContainerProps {
14
14
  onSearchMethodChange: (searchMethod: JiraSearchMethod) => void;
15
15
  parameters?: JiraIssueDatasourceParameters;
16
16
  searchBarJql?: string;
17
+ setHasJqlSyntaxErrors?: (hasErrors: boolean) => void;
17
18
  setSearchBarJql: (jql: string) => void;
18
19
  site?: Site;
19
20
  }
@@ -1,8 +1,9 @@
1
1
  import React from 'react';
2
+ import { type Jast } from '@atlaskit/jql-ast';
2
3
  export interface JiraJQLEditorProps {
3
4
  cloudId: string;
4
5
  isSearching?: boolean;
5
- onChange?: (query: string) => void;
6
+ onChange?: (query: string, jast: Jast) => void;
6
7
  onSearch: () => void;
7
8
  query: string;
8
9
  }
@@ -1,8 +1,10 @@
1
1
  import React, { type PropsWithChildren } from 'react';
2
2
  import { type DatasourceParameters } from '@atlaskit/linking-types';
3
- export type InsertButtonProps<_Parameters extends DatasourceParameters> = PropsWithChildren<{
3
+ export type InsertButtonProps<Parameters extends DatasourceParameters> = PropsWithChildren<{
4
4
  getAnalyticsPayload: () => Record<string, any>;
5
+ hasErrors?: boolean;
6
+ onBeforeInsert?: (parameters: Parameters) => void;
5
7
  testId?: string;
6
8
  url: string | undefined;
7
9
  }>;
8
- export declare const InsertButton: <Parameters extends DatasourceParameters>({ testId, url, getAnalyticsPayload, children, }: InsertButtonProps<Parameters>) => React.JSX.Element;
10
+ export declare const InsertButton: <Parameters extends DatasourceParameters>({ testId, url, getAnalyticsPayload, children, onBeforeInsert, hasErrors, }: InsertButtonProps<Parameters>) => React.JSX.Element;
@@ -14,6 +14,7 @@ export interface SearchContainerProps {
14
14
  onSearchMethodChange: (searchMethod: JiraSearchMethod) => void;
15
15
  parameters?: JiraIssueDatasourceParameters;
16
16
  searchBarJql?: string;
17
+ setHasJqlSyntaxErrors?: (hasErrors: boolean) => void;
17
18
  setSearchBarJql: (jql: string) => void;
18
19
  site?: Site;
19
20
  }
@@ -1,8 +1,9 @@
1
1
  import React from 'react';
2
+ import { type Jast } from '@atlaskit/jql-ast';
2
3
  export interface JiraJQLEditorProps {
3
4
  cloudId: string;
4
5
  isSearching?: boolean;
5
- onChange?: (query: string) => void;
6
+ onChange?: (query: string, jast: Jast) => void;
6
7
  onSearch: () => void;
7
8
  query: string;
8
9
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/link-datasource",
3
- "version": "4.32.5",
3
+ "version": "4.33.0",
4
4
  "description": "UI Components to support linking platform dataset feature",
5
5
  "author": "Atlassian Pty Ltd",
6
6
  "license": "Apache-2.0",
@@ -80,10 +80,10 @@
80
80
  "@atlaskit/primitives": "^17.1.0",
81
81
  "@atlaskit/react-select": "^3.13.0",
82
82
  "@atlaskit/select": "^21.7.0",
83
- "@atlaskit/smart-card": "^43.22.0",
83
+ "@atlaskit/smart-card": "^43.23.0",
84
84
  "@atlaskit/smart-user-picker": "^8.9.0",
85
85
  "@atlaskit/spinner": "^19.0.0",
86
- "@atlaskit/tag": "^14.2.0",
86
+ "@atlaskit/tag": "^14.3.0",
87
87
  "@atlaskit/textfield": "^8.2.0",
88
88
  "@atlaskit/theme": "^21.0.0",
89
89
  "@atlaskit/tokens": "^10.1.0",
@@ -176,6 +176,9 @@
176
176
  "navx-1895-new-logo-design": {
177
177
  "type": "boolean"
178
178
  },
179
+ "navx-1345-issues-modal-jql-submit-fix": {
180
+ "type": "boolean"
181
+ },
179
182
  "platform_navx_jira_sllv_rich_text_gate": {
180
183
  "type": "boolean"
181
184
  },