@atlaskit/link-datasource 1.12.3 → 1.13.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 +13 -0
- package/dist/cjs/analytics/constants.js +1 -1
- package/dist/cjs/services/useBasicFilterAGG.js +40 -82
- package/dist/cjs/services/utils.js +1 -1
- package/dist/cjs/ui/issue-like-table/draggable-table-heading.js +0 -12
- package/dist/cjs/ui/issue-like-table/styled.js +1 -1
- package/dist/cjs/ui/jira-issues-modal/basic-filters/hooks/useFilterOptions.js +94 -0
- package/dist/cjs/ui/jira-issues-modal/basic-filters/ui/async-popup-select/index.js +24 -13
- package/dist/cjs/ui/jira-issues-modal/basic-filters/ui/index.js +3 -1
- package/dist/cjs/ui/jira-issues-modal/basic-filters/utils/isClauseTooComplex.js +93 -0
- package/dist/cjs/ui/jira-issues-modal/basic-filters/utils/isQueryTooComplex.js +146 -0
- package/dist/cjs/ui/jira-issues-modal/basic-filters/utils/transformers.js +15 -3
- package/dist/cjs/ui/jira-issues-modal/jira-search-container/buildJQL.js +3 -2
- package/dist/cjs/ui/jira-issues-modal/jira-search-container/index.js +23 -9
- package/dist/cjs/ui/jira-issues-modal/jira-search-container/messages.js +5 -0
- package/dist/cjs/ui/jira-issues-modal/mode-switcher/index.js +28 -16
- package/dist/es2019/analytics/constants.js +1 -1
- package/dist/es2019/services/useBasicFilterAGG.js +30 -53
- package/dist/es2019/services/utils.js +1 -1
- package/dist/es2019/ui/issue-like-table/draggable-table-heading.js +0 -12
- package/dist/es2019/ui/issue-like-table/styled.js +16 -4
- package/dist/es2019/ui/jira-issues-modal/basic-filters/hooks/useFilterOptions.js +52 -0
- package/dist/es2019/ui/jira-issues-modal/basic-filters/ui/async-popup-select/index.js +15 -7
- package/dist/es2019/ui/jira-issues-modal/basic-filters/ui/index.js +3 -1
- package/dist/es2019/ui/jira-issues-modal/basic-filters/utils/isClauseTooComplex.js +77 -0
- package/dist/es2019/ui/jira-issues-modal/basic-filters/utils/isQueryTooComplex.js +105 -0
- package/dist/es2019/ui/jira-issues-modal/basic-filters/utils/transformers.js +14 -2
- package/dist/es2019/ui/jira-issues-modal/jira-search-container/buildJQL.js +2 -1
- package/dist/es2019/ui/jira-issues-modal/jira-search-container/index.js +15 -4
- package/dist/es2019/ui/jira-issues-modal/jira-search-container/messages.js +5 -0
- package/dist/es2019/ui/jira-issues-modal/mode-switcher/index.js +19 -9
- package/dist/esm/analytics/constants.js +1 -1
- package/dist/esm/services/useBasicFilterAGG.js +41 -83
- package/dist/esm/services/utils.js +1 -1
- package/dist/esm/ui/issue-like-table/draggable-table-heading.js +0 -12
- package/dist/esm/ui/issue-like-table/styled.js +1 -1
- package/dist/esm/ui/jira-issues-modal/basic-filters/hooks/useFilterOptions.js +87 -0
- package/dist/esm/ui/jira-issues-modal/basic-filters/ui/async-popup-select/index.js +24 -13
- package/dist/esm/ui/jira-issues-modal/basic-filters/ui/index.js +3 -1
- package/dist/esm/ui/jira-issues-modal/basic-filters/utils/isClauseTooComplex.js +86 -0
- package/dist/esm/ui/jira-issues-modal/basic-filters/utils/isQueryTooComplex.js +140 -0
- package/dist/esm/ui/jira-issues-modal/basic-filters/utils/transformers.js +12 -2
- package/dist/esm/ui/jira-issues-modal/jira-search-container/buildJQL.js +2 -1
- package/dist/esm/ui/jira-issues-modal/jira-search-container/index.js +23 -9
- package/dist/esm/ui/jira-issues-modal/jira-search-container/messages.js +5 -0
- package/dist/esm/ui/jira-issues-modal/mode-switcher/index.js +29 -17
- package/dist/types/services/useBasicFilterAGG.d.ts +9 -1
- package/dist/types/services/utils.d.ts +1 -1
- package/dist/types/ui/jira-issues-modal/basic-filters/hooks/useFilterOptions.d.ts +18 -0
- package/dist/types/ui/jira-issues-modal/basic-filters/ui/async-popup-select/index.d.ts +2 -1
- package/dist/types/ui/jira-issues-modal/basic-filters/ui/index.d.ts +2 -1
- package/dist/types/ui/jira-issues-modal/basic-filters/utils/isClauseTooComplex.d.ts +2 -0
- package/dist/types/ui/jira-issues-modal/basic-filters/utils/isQueryTooComplex.d.ts +1 -0
- package/dist/types/ui/jira-issues-modal/basic-filters/utils/transformers.d.ts +3 -1
- package/dist/types/ui/jira-issues-modal/jira-search-container/buildJQL.d.ts +1 -0
- package/dist/types/ui/jira-issues-modal/jira-search-container/index.d.ts +1 -0
- package/dist/types/ui/jira-issues-modal/jira-search-container/messages.d.ts +5 -0
- package/dist/types/ui/jira-issues-modal/mode-switcher/index.d.ts +2 -0
- package/dist/types-ts4.5/services/useBasicFilterAGG.d.ts +9 -1
- package/dist/types-ts4.5/services/utils.d.ts +1 -1
- package/dist/types-ts4.5/ui/jira-issues-modal/basic-filters/hooks/useFilterOptions.d.ts +18 -0
- package/dist/types-ts4.5/ui/jira-issues-modal/basic-filters/ui/async-popup-select/index.d.ts +2 -1
- package/dist/types-ts4.5/ui/jira-issues-modal/basic-filters/ui/index.d.ts +2 -1
- package/dist/types-ts4.5/ui/jira-issues-modal/basic-filters/utils/isClauseTooComplex.d.ts +2 -0
- package/dist/types-ts4.5/ui/jira-issues-modal/basic-filters/utils/isQueryTooComplex.d.ts +1 -0
- package/dist/types-ts4.5/ui/jira-issues-modal/basic-filters/utils/transformers.d.ts +3 -1
- package/dist/types-ts4.5/ui/jira-issues-modal/jira-search-container/buildJQL.d.ts +1 -0
- package/dist/types-ts4.5/ui/jira-issues-modal/jira-search-container/index.d.ts +1 -0
- package/dist/types-ts4.5/ui/jira-issues-modal/jira-search-container/messages.d.ts +5 -0
- package/dist/types-ts4.5/ui/jira-issues-modal/mode-switcher/index.d.ts +2 -0
- package/package.json +1 -2
- package/dist/cjs/ui/jira-issues-modal/basic-filters/hooks/useFieldValues.js +0 -75
- package/dist/cjs/ui/jira-issues-modal/basic-filters/hooks/useIsComplexQuery.js +0 -12
- package/dist/cjs/ui/jira-issues-modal/basic-filters/mocks/fieldValuesEmptyResponse.js +0 -20
- package/dist/cjs/ui/jira-issues-modal/basic-filters/mocks/fieldValuesExpectedResponseForAssignees.js +0 -155
- package/dist/cjs/ui/jira-issues-modal/basic-filters/mocks/fieldValuesStandardResponseForProjects.js +0 -82
- package/dist/cjs/ui/jira-issues-modal/basic-filters/mocks/fieldValuesStandardResponseForStatuses.js +0 -87
- package/dist/cjs/ui/jira-issues-modal/basic-filters/mocks/fieldValuesStandardResponseForTypes.js +0 -97
- package/dist/cjs/ui/jira-issues-modal/basic-filters/mocks/hydrateJqlEmptyResponse.js +0 -18
- package/dist/cjs/ui/jira-issues-modal/basic-filters/mocks/hydrateJqlStandardResponse.js +0 -111
- package/dist/es2019/ui/jira-issues-modal/basic-filters/hooks/useFieldValues.js +0 -39
- package/dist/es2019/ui/jira-issues-modal/basic-filters/hooks/useIsComplexQuery.js +0 -6
- package/dist/es2019/ui/jira-issues-modal/basic-filters/mocks/fieldValuesEmptyResponse.js +0 -14
- package/dist/es2019/ui/jira-issues-modal/basic-filters/mocks/fieldValuesExpectedResponseForAssignees.js +0 -149
- package/dist/es2019/ui/jira-issues-modal/basic-filters/mocks/fieldValuesStandardResponseForProjects.js +0 -76
- package/dist/es2019/ui/jira-issues-modal/basic-filters/mocks/fieldValuesStandardResponseForStatuses.js +0 -81
- package/dist/es2019/ui/jira-issues-modal/basic-filters/mocks/fieldValuesStandardResponseForTypes.js +0 -91
- package/dist/es2019/ui/jira-issues-modal/basic-filters/mocks/hydrateJqlEmptyResponse.js +0 -12
- package/dist/es2019/ui/jira-issues-modal/basic-filters/mocks/hydrateJqlStandardResponse.js +0 -105
- package/dist/esm/ui/jira-issues-modal/basic-filters/hooks/useFieldValues.js +0 -68
- package/dist/esm/ui/jira-issues-modal/basic-filters/hooks/useIsComplexQuery.js +0 -6
- package/dist/esm/ui/jira-issues-modal/basic-filters/mocks/fieldValuesEmptyResponse.js +0 -14
- package/dist/esm/ui/jira-issues-modal/basic-filters/mocks/fieldValuesExpectedResponseForAssignees.js +0 -149
- package/dist/esm/ui/jira-issues-modal/basic-filters/mocks/fieldValuesStandardResponseForProjects.js +0 -76
- package/dist/esm/ui/jira-issues-modal/basic-filters/mocks/fieldValuesStandardResponseForStatuses.js +0 -81
- package/dist/esm/ui/jira-issues-modal/basic-filters/mocks/fieldValuesStandardResponseForTypes.js +0 -91
- package/dist/esm/ui/jira-issues-modal/basic-filters/mocks/hydrateJqlEmptyResponse.js +0 -12
- package/dist/esm/ui/jira-issues-modal/basic-filters/mocks/hydrateJqlStandardResponse.js +0 -105
- package/dist/types/ui/jira-issues-modal/basic-filters/hooks/useFieldValues.d.ts +0 -12
- package/dist/types/ui/jira-issues-modal/basic-filters/hooks/useIsComplexQuery.d.ts +0 -3
- package/dist/types/ui/jira-issues-modal/basic-filters/mocks/fieldValuesEmptyResponse.d.ts +0 -3
- package/dist/types/ui/jira-issues-modal/basic-filters/mocks/fieldValuesExpectedResponseForAssignees.d.ts +0 -17
- package/dist/types/ui/jira-issues-modal/basic-filters/mocks/fieldValuesStandardResponseForProjects.d.ts +0 -8
- package/dist/types/ui/jira-issues-modal/basic-filters/mocks/fieldValuesStandardResponseForStatuses.d.ts +0 -8
- package/dist/types/ui/jira-issues-modal/basic-filters/mocks/fieldValuesStandardResponseForTypes.d.ts +0 -8
- package/dist/types/ui/jira-issues-modal/basic-filters/mocks/hydrateJqlEmptyResponse.d.ts +0 -3
- package/dist/types/ui/jira-issues-modal/basic-filters/mocks/hydrateJqlStandardResponse.d.ts +0 -29
- package/dist/types-ts4.5/ui/jira-issues-modal/basic-filters/hooks/useFieldValues.d.ts +0 -12
- package/dist/types-ts4.5/ui/jira-issues-modal/basic-filters/hooks/useIsComplexQuery.d.ts +0 -3
- package/dist/types-ts4.5/ui/jira-issues-modal/basic-filters/mocks/fieldValuesEmptyResponse.d.ts +0 -3
- package/dist/types-ts4.5/ui/jira-issues-modal/basic-filters/mocks/fieldValuesExpectedResponseForAssignees.d.ts +0 -17
- package/dist/types-ts4.5/ui/jira-issues-modal/basic-filters/mocks/fieldValuesStandardResponseForProjects.d.ts +0 -8
- package/dist/types-ts4.5/ui/jira-issues-modal/basic-filters/mocks/fieldValuesStandardResponseForStatuses.d.ts +0 -8
- package/dist/types-ts4.5/ui/jira-issues-modal/basic-filters/mocks/fieldValuesStandardResponseForTypes.d.ts +0 -8
- package/dist/types-ts4.5/ui/jira-issues-modal/basic-filters/mocks/hydrateJqlEmptyResponse.d.ts +0 -3
- package/dist/types-ts4.5/ui/jira-issues-modal/basic-filters/mocks/hydrateJqlStandardResponse.d.ts +0 -29
|
@@ -7,7 +7,7 @@ import _regeneratorRuntime from "@babel/runtime/regenerator";
|
|
|
7
7
|
import React, { useCallback, useEffect, useRef, useState } from 'react';
|
|
8
8
|
import { useIntl } from 'react-intl-next';
|
|
9
9
|
import { CheckboxOption, PopupSelect } from '@atlaskit/select';
|
|
10
|
-
import {
|
|
10
|
+
import { useFilterOptions } from '../../hooks/useFilterOptions';
|
|
11
11
|
import CustomControl from './control';
|
|
12
12
|
import PopupFooter from './footer';
|
|
13
13
|
import formatOptionLabel from './formatOptionLabel';
|
|
@@ -19,6 +19,7 @@ var noFilterOptions = function noFilterOptions() {
|
|
|
19
19
|
};
|
|
20
20
|
var AsyncPopupSelect = function AsyncPopupSelect(_ref) {
|
|
21
21
|
var filterType = _ref.filterType,
|
|
22
|
+
cloudId = _ref.cloudId,
|
|
22
23
|
selection = _ref.selection,
|
|
23
24
|
_ref$onSelectionChang = _ref.onSelectionChange,
|
|
24
25
|
onSelectionChange = _ref$onSelectionChang === void 0 ? function () {} : _ref$onSelectionChang;
|
|
@@ -33,13 +34,14 @@ var AsyncPopupSelect = function AsyncPopupSelect(_ref) {
|
|
|
33
34
|
_useState4 = _slicedToArray(_useState3, 2),
|
|
34
35
|
selectedOptions = _useState4[0],
|
|
35
36
|
setSelectedOptions = _useState4[1];
|
|
36
|
-
var
|
|
37
|
-
filterType: filterType
|
|
37
|
+
var _useFilterOptions = useFilterOptions({
|
|
38
|
+
filterType: filterType,
|
|
39
|
+
cloudId: cloudId
|
|
38
40
|
}),
|
|
39
|
-
filterOptions =
|
|
40
|
-
fetchFilterOptions =
|
|
41
|
-
totalCount =
|
|
42
|
-
status =
|
|
41
|
+
filterOptions = _useFilterOptions.filterOptions,
|
|
42
|
+
fetchFilterOptions = _useFilterOptions.fetchFilterOptions,
|
|
43
|
+
totalCount = _useFilterOptions.totalCount,
|
|
44
|
+
status = _useFilterOptions.status;
|
|
43
45
|
var handleInputChange = useCallback(function (searchString, actionMeta) {
|
|
44
46
|
if (actionMeta.action === 'input-change' && searchString !== searchTerm) {
|
|
45
47
|
setSearchTerm(searchString);
|
|
@@ -53,10 +55,13 @@ var AsyncPopupSelect = function AsyncPopupSelect(_ref) {
|
|
|
53
55
|
return _regeneratorRuntime.wrap(function _callee$(_context) {
|
|
54
56
|
while (1) switch (_context.prev = _context.next) {
|
|
55
57
|
case 0:
|
|
56
|
-
if (status === 'empty') {
|
|
57
|
-
|
|
58
|
+
if (!(status === 'empty')) {
|
|
59
|
+
_context.next = 3;
|
|
60
|
+
break;
|
|
58
61
|
}
|
|
59
|
-
|
|
62
|
+
_context.next = 3;
|
|
63
|
+
return fetchFilterOptions();
|
|
64
|
+
case 3:
|
|
60
65
|
case "end":
|
|
61
66
|
return _context.stop();
|
|
62
67
|
}
|
|
@@ -69,18 +74,24 @@ var AsyncPopupSelect = function AsyncPopupSelect(_ref) {
|
|
|
69
74
|
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();
|
|
70
75
|
}
|
|
71
76
|
}, [status]);
|
|
77
|
+
var isLoading = status === 'loading' || status === 'empty';
|
|
72
78
|
return /*#__PURE__*/React.createElement(PopupSelect, {
|
|
73
79
|
isMulti: true,
|
|
74
80
|
maxMenuWidth: 300,
|
|
75
81
|
minMenuWidth: 300,
|
|
76
82
|
ref: pickerRef,
|
|
77
83
|
testId: "jlol-basic-filter-popup-select",
|
|
78
|
-
inputId: "jlol-basic-filter-popup-select--input"
|
|
79
|
-
|
|
84
|
+
inputId: "jlol-basic-filter-popup-select--input"
|
|
85
|
+
/*
|
|
86
|
+
this threshold controls the display of the search control (input field for search)
|
|
87
|
+
if this threshold is less than 0, when typing a search string that returns no results it will not remove the search control
|
|
88
|
+
if this threshold is 0 or higher, it will remove the search control when there are no results, the user will be unable to clear the search to see more results
|
|
89
|
+
*/,
|
|
90
|
+
searchThreshold: -1,
|
|
80
91
|
inputValue: searchTerm,
|
|
81
92
|
closeMenuOnSelect: false,
|
|
82
93
|
hideSelectedOptions: false,
|
|
83
|
-
isLoading:
|
|
94
|
+
isLoading: isLoading,
|
|
84
95
|
placeholder: formatMessage(asyncPopupSelectMessages.selectPlaceholder),
|
|
85
96
|
components: {
|
|
86
97
|
/* @ts-expect-error - This component has stricter OptionType, hence a temp setup untill its made generic */
|
|
@@ -5,7 +5,8 @@ import { isValidJql } from '../utils';
|
|
|
5
5
|
import AsyncPopupSelect from './async-popup-select';
|
|
6
6
|
var availableBasicFilterTypes = ['project', 'issuetype', 'status', 'assignee'];
|
|
7
7
|
var BasicFilterContainer = function BasicFilterContainer(_ref) {
|
|
8
|
-
var jql = _ref.jql
|
|
8
|
+
var jql = _ref.jql,
|
|
9
|
+
cloudId = _ref.cloudId;
|
|
9
10
|
var _useState = useState([]),
|
|
10
11
|
_useState2 = _slicedToArray(_useState, 1),
|
|
11
12
|
selection = _useState2[0];
|
|
@@ -20,6 +21,7 @@ var BasicFilterContainer = function BasicFilterContainer(_ref) {
|
|
|
20
21
|
testId: "jlol-basic-filter-container"
|
|
21
22
|
}, availableBasicFilterTypes.map(function (filter) {
|
|
22
23
|
return /*#__PURE__*/React.createElement(AsyncPopupSelect, {
|
|
24
|
+
cloudId: cloudId,
|
|
23
25
|
filterType: filter,
|
|
24
26
|
key: filter,
|
|
25
27
|
selection: selection,
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
2
|
+
import { CLAUSE_TYPE_COMPOUND, CLAUSE_TYPE_TERMINAL, OPERAND_TYPE_VALUE } from '@atlaskit/jql-ast';
|
|
3
|
+
import { fuzzyCharacter } from '../../jira-search-container/buildJQL';
|
|
4
|
+
var removeFuzzyCharacter = function removeFuzzyCharacter(value) {
|
|
5
|
+
if (value !== null && value !== void 0 && value.endsWith(fuzzyCharacter)) {
|
|
6
|
+
return value.slice(0, -1);
|
|
7
|
+
}
|
|
8
|
+
return value;
|
|
9
|
+
};
|
|
10
|
+
var getValueFromTerminalClause = function getValueFromTerminalClause(clause) {
|
|
11
|
+
var operand = clause.operand;
|
|
12
|
+
return operand !== undefined && operand.operandType === OPERAND_TYPE_VALUE && removeFuzzyCharacter(operand.value) || undefined;
|
|
13
|
+
};
|
|
14
|
+
var areClauseFieldValuesEqual = function areClauseFieldValuesEqual(clauseA, clauseB, clauseC) {
|
|
15
|
+
var valueA = clauseA && getValueFromTerminalClause(clauseA);
|
|
16
|
+
var valueB = clauseB && getValueFromTerminalClause(clauseB);
|
|
17
|
+
var valueC = clauseC && getValueFromTerminalClause(clauseC);
|
|
18
|
+
var values = [valueA, valueB, valueC].filter(Boolean);
|
|
19
|
+
|
|
20
|
+
// checks if valid fields, text, summary and key have the same value, if not, its a complex query and cannnot be recreated in basic mode
|
|
21
|
+
return values.length > 1 && values.every(function (value) {
|
|
22
|
+
return value === values[0];
|
|
23
|
+
});
|
|
24
|
+
};
|
|
25
|
+
var areClauseFieldKeysAllowed = function areClauseFieldKeysAllowed(clauseA, clauseB, clauseC) {
|
|
26
|
+
var fieldA = clauseA.field.value;
|
|
27
|
+
var fieldB = clauseB.field.value;
|
|
28
|
+
var fieldC = clauseC === null || clauseC === void 0 ? void 0 : clauseC.field.value; // clauseC only if jql with 3 OR clauses, 'text ~ "EDM-6023*" or summary ~ "EDM-6023*" or key = EDM-6023 ORDER BY created DESC',
|
|
29
|
+
|
|
30
|
+
return [fieldA, fieldB, fieldC].filter(Boolean).every(function (field) {
|
|
31
|
+
return ['summary', 'text', 'key'].includes(field);
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
var doesCompoundClauseContainAllTerminalClauses = function doesCompoundClauseContainAllTerminalClauses(clauses) {
|
|
35
|
+
return clauses.every(function (clauses) {
|
|
36
|
+
return clauses.clauseType === CLAUSE_TYPE_TERMINAL;
|
|
37
|
+
});
|
|
38
|
+
};
|
|
39
|
+
export var isClauseTooComplex = function isClauseTooComplex(clauses, key) {
|
|
40
|
+
if (key === 'text') {
|
|
41
|
+
var _clauses = _slicedToArray(clauses, 1),
|
|
42
|
+
clause = _clauses[0];
|
|
43
|
+
if (clause.clauseType === CLAUSE_TYPE_COMPOUND) {
|
|
44
|
+
var textClauses = clause.clauses;
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* valid: text ~ "test*" or summary ~ "test*" ORDER BY created DESC
|
|
48
|
+
* valid: text ~ "EDM-6023*" or summary ~ "EDM-6023*" or key = EDM-6023 ORDER BY created DESC
|
|
49
|
+
* invalid: assignee = "me" or text ~ "EDM-6023*" or summary ~ "EDM-6023*" or key = EDM-6023 ORDER BY created DESC
|
|
50
|
+
*/
|
|
51
|
+
if (textClauses.length !== 2 && textClauses.length !== 3) {
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* valid: text ~ "test*" or summary ~ "test*"
|
|
57
|
+
* invalid: text ~ "test" or (summary ~ "test" or key = "test")
|
|
58
|
+
*/
|
|
59
|
+
if (!doesCompoundClauseContainAllTerminalClauses(textClauses)) {
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
var _textClauses = _slicedToArray(textClauses, 3),
|
|
63
|
+
clauseA = _textClauses[0],
|
|
64
|
+
clauseB = _textClauses[1],
|
|
65
|
+
clauseC = _textClauses[2];
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* valid: text ~ "EDM-6023*" or summary ~ "EDM-6023*" or key = EDM-6023 ORDER BY created DESC
|
|
69
|
+
* invalid: text ~ "EDM-6023*" or summary ~ "anotherValue" ORDER BY created DESC
|
|
70
|
+
* invalid: text ~ "EDM-6023*" or text ~ "anotherValue" ORDER BY created DESC
|
|
71
|
+
*/
|
|
72
|
+
if (!areClauseFieldValuesEqual(clauseA, clauseB, clauseC)) {
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* valid: text ~ "EDM-6023*" ORDER BY created DESC
|
|
78
|
+
* invalid: resolution = 40134 ORDER BY created DESC
|
|
79
|
+
*/
|
|
80
|
+
if (!areClauseFieldKeysAllowed(clauseA, clauseB, clauseC)) {
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return clauses.length > 1;
|
|
86
|
+
};
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
2
|
+
import _assertThisInitialized from "@babel/runtime/helpers/assertThisInitialized";
|
|
3
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
4
|
+
import _createClass from "@babel/runtime/helpers/createClass";
|
|
5
|
+
import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
|
|
6
|
+
import _inherits from "@babel/runtime/helpers/inherits";
|
|
7
|
+
import _possibleConstructorReturn from "@babel/runtime/helpers/possibleConstructorReturn";
|
|
8
|
+
import _getPrototypeOf from "@babel/runtime/helpers/getPrototypeOf";
|
|
9
|
+
import _wrapNativeSuper from "@babel/runtime/helpers/wrapNativeSuper";
|
|
10
|
+
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
|
|
11
|
+
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
|
|
12
|
+
import mergeWith from 'lodash/mergeWith';
|
|
13
|
+
import { AbstractJastVisitor, COMPOUND_OPERATOR_AND, COMPOUND_OPERATOR_OR, JastBuilder, OPERATOR_EQUALS, OPERATOR_GT_EQUALS, OPERATOR_IN, OPERATOR_LIKE } from '@atlaskit/jql-ast';
|
|
14
|
+
import { getBooleanFF } from '@atlaskit/platform-feature-flags';
|
|
15
|
+
import { ALLOWED_ORDER_BY_KEYS } from '../../jira-search-container';
|
|
16
|
+
import { isClauseTooComplex } from './isClauseTooComplex';
|
|
17
|
+
import { isValidJql } from './index';
|
|
18
|
+
|
|
19
|
+
// Map of field keys to their respective clauses in the Jast
|
|
20
|
+
|
|
21
|
+
var allowedFields = [
|
|
22
|
+
// basic filter fields
|
|
23
|
+
'assignee', 'issuetype', 'project', 'status',
|
|
24
|
+
// search input fields
|
|
25
|
+
'text', 'summary', 'key',
|
|
26
|
+
// orderby field
|
|
27
|
+
'created'];
|
|
28
|
+
var fallbackOperators = [OPERATOR_IN];
|
|
29
|
+
var fieldSpecificOperators = {
|
|
30
|
+
text: [OPERATOR_LIKE, OPERATOR_EQUALS],
|
|
31
|
+
summary: [OPERATOR_LIKE, OPERATOR_EQUALS],
|
|
32
|
+
key: [OPERATOR_EQUALS],
|
|
33
|
+
created: [OPERATOR_GT_EQUALS],
|
|
34
|
+
project: [OPERATOR_IN, OPERATOR_EQUALS],
|
|
35
|
+
issuetype: [OPERATOR_IN, OPERATOR_EQUALS],
|
|
36
|
+
status: [OPERATOR_IN, OPERATOR_EQUALS],
|
|
37
|
+
assignee: [OPERATOR_IN, OPERATOR_EQUALS]
|
|
38
|
+
};
|
|
39
|
+
var JqlClauseCollectingVisitorError = /*#__PURE__*/function (_Error) {
|
|
40
|
+
_inherits(JqlClauseCollectingVisitorError, _Error);
|
|
41
|
+
var _super = _createSuper(JqlClauseCollectingVisitorError);
|
|
42
|
+
function JqlClauseCollectingVisitorError() {
|
|
43
|
+
_classCallCheck(this, JqlClauseCollectingVisitorError);
|
|
44
|
+
return _super.apply(this, arguments);
|
|
45
|
+
}
|
|
46
|
+
return _createClass(JqlClauseCollectingVisitorError);
|
|
47
|
+
}( /*#__PURE__*/_wrapNativeSuper(Error));
|
|
48
|
+
/**
|
|
49
|
+
* Rather than having to navigate the entire tree structure ourself, we extend AbstractJastVisitor
|
|
50
|
+
* class and implement visitor functions for node types that we wish to process.
|
|
51
|
+
* A list of available visitor can be viewed in packages/jql/jql-ast/src/types/api/jast-visitor.ts
|
|
52
|
+
* more info - https://atlaskit.atlassian.com/packages/jql/jql-ast/docs/traversing-the-ast
|
|
53
|
+
* */
|
|
54
|
+
var JqlClauseCollectingVisitor = /*#__PURE__*/function (_AbstractJastVisitor) {
|
|
55
|
+
_inherits(JqlClauseCollectingVisitor, _AbstractJastVisitor);
|
|
56
|
+
var _super2 = _createSuper(JqlClauseCollectingVisitor);
|
|
57
|
+
function JqlClauseCollectingVisitor() {
|
|
58
|
+
var _this;
|
|
59
|
+
_classCallCheck(this, JqlClauseCollectingVisitor);
|
|
60
|
+
_this = _super2.call(this);
|
|
61
|
+
_defineProperty(_assertThisInitialized(_this), "visitNotClause", function () {
|
|
62
|
+
throw new JqlClauseCollectingVisitorError('Visited an unsupported node while traversing the AST');
|
|
63
|
+
});
|
|
64
|
+
_defineProperty(_assertThisInitialized(_this), "visitOrderByField", function (orderByField) {
|
|
65
|
+
var _orderByField$field$v;
|
|
66
|
+
var fieldValue = (_orderByField$field$v = orderByField.field.value) === null || _orderByField$field$v === void 0 ? void 0 : _orderByField$field$v.toLowerCase();
|
|
67
|
+
if (fieldValue && !ALLOWED_ORDER_BY_KEYS.includes(fieldValue)) {
|
|
68
|
+
throw new JqlClauseCollectingVisitorError("query with order by field '".concat(fieldValue, "' is not supported"));
|
|
69
|
+
}
|
|
70
|
+
return {};
|
|
71
|
+
});
|
|
72
|
+
_defineProperty(_assertThisInitialized(_this), "visitCompoundClause", function (compoundClause) {
|
|
73
|
+
var clauseMap = {};
|
|
74
|
+
var operator = compoundClause.operator.value;
|
|
75
|
+
if (operator === COMPOUND_OPERATOR_AND) {
|
|
76
|
+
return compoundClause.clauses.reduce(function (result, clause) {
|
|
77
|
+
return _this.aggregateResult(clause.accept(_assertThisInitialized(_this)), result);
|
|
78
|
+
}, clauseMap);
|
|
79
|
+
}
|
|
80
|
+
if (operator === COMPOUND_OPERATOR_OR) {
|
|
81
|
+
// this is delt with in isClauseTooComplex
|
|
82
|
+
return _this.aggregateResult({
|
|
83
|
+
text: [compoundClause]
|
|
84
|
+
}, clauseMap);
|
|
85
|
+
}
|
|
86
|
+
throw new JqlClauseCollectingVisitorError("Compound clauses using the operator '".concat(operator, "' is not supported"));
|
|
87
|
+
});
|
|
88
|
+
_defineProperty(_assertThisInitialized(_this), "visitTerminalClause", function (terminalClause) {
|
|
89
|
+
var _terminalClause$opera;
|
|
90
|
+
var fieldName = terminalClause.field.value.toLowerCase();
|
|
91
|
+
if (!allowedFields.includes(fieldName)) {
|
|
92
|
+
throw new JqlClauseCollectingVisitorError("Field with name '".concat(fieldName, "' of type ").concat(terminalClause.clauseType, " is not supported"));
|
|
93
|
+
}
|
|
94
|
+
var operator = (_terminalClause$opera = terminalClause.operator) === null || _terminalClause$opera === void 0 ? void 0 : _terminalClause$opera.value;
|
|
95
|
+
var allowedOperators = fieldSpecificOperators[fieldName] || fallbackOperators;
|
|
96
|
+
if (operator && !allowedOperators.includes(operator.toLowerCase())) {
|
|
97
|
+
throw new JqlClauseCollectingVisitorError("Field with name '".concat(fieldName, "' using operator ").concat(operator, " is not supported"));
|
|
98
|
+
}
|
|
99
|
+
return _defineProperty({}, terminalClause.field.value.toLowerCase(), [terminalClause]);
|
|
100
|
+
});
|
|
101
|
+
return _this;
|
|
102
|
+
}
|
|
103
|
+
_createClass(JqlClauseCollectingVisitor, [{
|
|
104
|
+
key: "aggregateResult",
|
|
105
|
+
value: function aggregateResult(aggregate, nextResult) {
|
|
106
|
+
return mergeWith(aggregate, nextResult, function (destValue, srcValue) {
|
|
107
|
+
return srcValue.concat(destValue !== null && destValue !== void 0 ? destValue : []);
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
}, {
|
|
111
|
+
key: "defaultResult",
|
|
112
|
+
value: function defaultResult() {
|
|
113
|
+
return {};
|
|
114
|
+
}
|
|
115
|
+
}]);
|
|
116
|
+
return JqlClauseCollectingVisitor;
|
|
117
|
+
}(AbstractJastVisitor);
|
|
118
|
+
export var isQueryTooComplex = function isQueryTooComplex(jql) {
|
|
119
|
+
if (!getBooleanFF('platform.linking-platform.datasource.show-jlol-basic-filters') || !jql) {
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
if (!isValidJql(jql)) {
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
var jast = new JastBuilder().build(jql);
|
|
126
|
+
try {
|
|
127
|
+
var jqlClauseCollectingVisitor = new JqlClauseCollectingVisitor();
|
|
128
|
+
var clauseMap = jast.query ? jast.query.accept(jqlClauseCollectingVisitor) : {}; // jast.query is defined as void | Query, hence the fallback
|
|
129
|
+
|
|
130
|
+
var hasAnyKeyWithComplexClause = Object.entries(clauseMap).some(function (_ref2) {
|
|
131
|
+
var _ref3 = _slicedToArray(_ref2, 2),
|
|
132
|
+
key = _ref3[0],
|
|
133
|
+
clauses = _ref3[1];
|
|
134
|
+
return isClauseTooComplex(clauses, key);
|
|
135
|
+
});
|
|
136
|
+
return hasAnyKeyWithComplexClause;
|
|
137
|
+
} catch (error) {
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
140
|
+
};
|
|
@@ -30,7 +30,7 @@ function mapNodeToOption(_ref) {
|
|
|
30
30
|
return _objectSpread(_objectSpread({}, baseProps), {}, {
|
|
31
31
|
optionType: 'avatarLabel',
|
|
32
32
|
avatar: user.picture,
|
|
33
|
-
isSquare:
|
|
33
|
+
isSquare: false
|
|
34
34
|
});
|
|
35
35
|
}
|
|
36
36
|
if (group) {
|
|
@@ -80,10 +80,20 @@ export function mapHydrateResponseData(_ref2) {
|
|
|
80
80
|
});
|
|
81
81
|
return transformedHydrateResponseData;
|
|
82
82
|
}
|
|
83
|
-
export function
|
|
83
|
+
export function mapFieldValuesToFilterOptions(_ref5) {
|
|
84
84
|
var _data$jira2;
|
|
85
85
|
var data = _ref5.data;
|
|
86
86
|
return (data === null || data === void 0 || (_data$jira2 = data.jira) === null || _data$jira2 === void 0 || (_data$jira2 = _data$jira2.jqlBuilder) === null || _data$jira2 === void 0 || (_data$jira2 = _data$jira2.fieldValues) === null || _data$jira2 === void 0 || (_data$jira2 = _data$jira2.edges) === null || _data$jira2 === void 0 ? void 0 : _data$jira2.map(function (edge) {
|
|
87
87
|
return edge.node ? mapNodeToOption(edge.node) : null;
|
|
88
88
|
}).filter(isNonNullSelectOption)) || [];
|
|
89
|
+
}
|
|
90
|
+
export function mapFieldValuesToTotalCount(_ref6) {
|
|
91
|
+
var _data$jira3;
|
|
92
|
+
var data = _ref6.data;
|
|
93
|
+
return (data === null || data === void 0 || (_data$jira3 = data.jira) === null || _data$jira3 === void 0 || (_data$jira3 = _data$jira3.jqlBuilder) === null || _data$jira3 === void 0 || (_data$jira3 = _data$jira3.fieldValues) === null || _data$jira3 === void 0 ? void 0 : _data$jira3.totalCount) || 0;
|
|
94
|
+
}
|
|
95
|
+
export function mapFieldValuesToPageCursor(_ref7) {
|
|
96
|
+
var _data$jira4;
|
|
97
|
+
var data = _ref7.data;
|
|
98
|
+
return data === null || data === void 0 || (_data$jira4 = data.jira) === null || _data$jira4 === void 0 || (_data$jira4 = _data$jira4.jqlBuilder) === null || _data$jira4 === void 0 || (_data$jira4 = _data$jira4.fieldValues) === null || _data$jira4 === void 0 || (_data$jira4 = _data$jira4.pageInfo) === null || _data$jira4 === void 0 ? void 0 : _data$jira4.endCursor;
|
|
89
99
|
}
|
|
@@ -2,6 +2,7 @@ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
|
2
2
|
import { COMPOUND_OPERATOR_AND, COMPOUND_OPERATOR_OR, creators, JastBuilder, OPERATOR_EQUALS, OPERATOR_GT_EQUALS, OPERATOR_IN, OPERATOR_LIKE, ORDER_BY_DIRECTION_ASC, ORDER_BY_DIRECTION_DESC, print } from '@atlaskit/jql-ast';
|
|
3
3
|
var fuzzySearchRegExp = /^"(.+)"$/;
|
|
4
4
|
var jiraIssueKeyRegExp = /[A-Z]+-\d+/;
|
|
5
|
+
export var fuzzyCharacter = '*';
|
|
5
6
|
var constructTerminalClause = function constructTerminalClause(field, operator, value) {
|
|
6
7
|
return creators.terminalClause(creators.field(field), creators.operator(operator), creators.valueOperand(value));
|
|
7
8
|
};
|
|
@@ -23,7 +24,7 @@ export var buildJQL = function buildJQL(input) {
|
|
|
23
24
|
return '';
|
|
24
25
|
}
|
|
25
26
|
if (trimmedRawSearch) {
|
|
26
|
-
var fuzzy = !trimmedRawSearch.match(fuzzySearchRegExp) ?
|
|
27
|
+
var fuzzy = !trimmedRawSearch.match(fuzzySearchRegExp) ? fuzzyCharacter : '';
|
|
27
28
|
var basicSearch = trimmedRawSearch.replace(/['"?*]+/g, '');
|
|
28
29
|
var text = constructTerminalClause('text', OPERATOR_LIKE, "".concat(basicSearch).concat(fuzzy));
|
|
29
30
|
var summary = constructTerminalClause('summary', OPERATOR_LIKE, "".concat(basicSearch).concat(fuzzy));
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
2
2
|
/** @jsx jsx */
|
|
3
|
-
import React, { useCallback, useMemo, useState } from 'react';
|
|
3
|
+
import React, { useCallback, useEffect, useMemo, useState } from 'react';
|
|
4
4
|
import { css, jsx } from '@emotion/react';
|
|
5
5
|
import { useIntl } from 'react-intl-next';
|
|
6
6
|
import { getBooleanFF } from '@atlaskit/platform-feature-flags';
|
|
7
7
|
import { useDatasourceAnalyticsEvents } from '../../../analytics';
|
|
8
8
|
import { BasicFilters } from '../basic-filters';
|
|
9
|
+
import { isQueryTooComplex } from '../basic-filters/utils/isQueryTooComplex';
|
|
9
10
|
import { BasicSearchInput } from '../basic-search-input';
|
|
10
11
|
import { JiraJQLEditor } from '../jql-editor';
|
|
11
12
|
import { ModeSwitcher } from '../mode-switcher';
|
|
@@ -18,6 +19,7 @@ var inputContainerStyles = css({
|
|
|
18
19
|
minHeight: '60px'
|
|
19
20
|
});
|
|
20
21
|
var DEFAULT_JQL_QUERY = 'created >= -30d order by created DESC';
|
|
22
|
+
export var ALLOWED_ORDER_BY_KEYS = ['key', 'summary', 'assignee', 'status', 'created'];
|
|
21
23
|
var JiraSearchMethodSwitcher = ModeSwitcher;
|
|
22
24
|
export var JiraSearchContainer = function JiraSearchContainer(props) {
|
|
23
25
|
var isSearching = props.isSearching,
|
|
@@ -42,14 +44,18 @@ export var JiraSearchContainer = function JiraSearchContainer(props) {
|
|
|
42
44
|
_useState6 = _slicedToArray(_useState5, 2),
|
|
43
45
|
jql = _useState6[0],
|
|
44
46
|
setJql = _useState6[1];
|
|
45
|
-
var _useState7 = useState(),
|
|
47
|
+
var _useState7 = useState(false),
|
|
46
48
|
_useState8 = _slicedToArray(_useState7, 2),
|
|
47
|
-
|
|
48
|
-
|
|
49
|
+
isComplexQuery = _useState8[0],
|
|
50
|
+
setIsComplexQuery = _useState8[1];
|
|
49
51
|
var _useState9 = useState(),
|
|
50
52
|
_useState10 = _slicedToArray(_useState9, 2),
|
|
51
|
-
|
|
52
|
-
|
|
53
|
+
orderKey = _useState10[0],
|
|
54
|
+
setOrderKey = _useState10[1];
|
|
55
|
+
var _useState11 = useState(),
|
|
56
|
+
_useState12 = _slicedToArray(_useState11, 2),
|
|
57
|
+
orderDirection = _useState12[0],
|
|
58
|
+
setOrderDirection = _useState12[1];
|
|
53
59
|
var _useDatasourceAnalyti = useDatasourceAnalyticsEvents(),
|
|
54
60
|
fireEvent = _useDatasourceAnalyti.fireEvent;
|
|
55
61
|
var onSearchMethodChange = useCallback(function (searchMethod) {
|
|
@@ -76,7 +82,7 @@ export var JiraSearchContainer = function JiraSearchContainer(props) {
|
|
|
76
82
|
var order = hasOrder ? (_fragments$at3 = fragments.at(-1)) === null || _fragments$at3 === void 0 ? void 0 : _fragments$at3.split(' ').at(-1) : undefined;
|
|
77
83
|
|
|
78
84
|
// TODO: confirm if these are the only order keys we want to preserve - existing whiteboard logic
|
|
79
|
-
if (key &&
|
|
85
|
+
if (key && ALLOWED_ORDER_BY_KEYS.includes(key)) {
|
|
80
86
|
setOrderKey(key);
|
|
81
87
|
setOrderDirection(order);
|
|
82
88
|
}
|
|
@@ -86,6 +92,7 @@ export var JiraSearchContainer = function JiraSearchContainer(props) {
|
|
|
86
92
|
onSearch({
|
|
87
93
|
jql: jql
|
|
88
94
|
}, currentSearchMethod);
|
|
95
|
+
setIsComplexQuery(isQueryTooComplex(jql));
|
|
89
96
|
if (currentSearchMethod === 'basic') {
|
|
90
97
|
fireEvent('ui.form.submitted.basicSearch', {});
|
|
91
98
|
} else if (currentSearchMethod === 'jql') {
|
|
@@ -98,6 +105,10 @@ export var JiraSearchContainer = function JiraSearchContainer(props) {
|
|
|
98
105
|
}
|
|
99
106
|
return false;
|
|
100
107
|
}, []);
|
|
108
|
+
useEffect(function () {
|
|
109
|
+
setIsComplexQuery(isQueryTooComplex(jql));
|
|
110
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
111
|
+
}, []);
|
|
101
112
|
return jsx("div", {
|
|
102
113
|
css: inputContainerStyles
|
|
103
114
|
}, currentSearchMethod === 'basic' && jsx(React.Fragment, null, jsx(BasicSearchInput, {
|
|
@@ -106,7 +117,8 @@ export var JiraSearchContainer = function JiraSearchContainer(props) {
|
|
|
106
117
|
onSearch: handleSearch,
|
|
107
118
|
searchTerm: basicSearchTerm
|
|
108
119
|
}), showBasicFilters && jsx(BasicFilters, {
|
|
109
|
-
jql: jql
|
|
120
|
+
jql: jql,
|
|
121
|
+
cloudId: cloudId || ''
|
|
110
122
|
})), currentSearchMethod === 'jql' && jsx(JiraJQLEditor, {
|
|
111
123
|
cloudId: cloudId || '',
|
|
112
124
|
isSearching: isSearching,
|
|
@@ -121,7 +133,9 @@ export var JiraSearchContainer = function JiraSearchContainer(props) {
|
|
|
121
133
|
value: 'jql'
|
|
122
134
|
}, {
|
|
123
135
|
label: formatMessage(modeSwitcherMessages.basicTextSearchLabel),
|
|
124
|
-
value: 'basic'
|
|
136
|
+
value: 'basic',
|
|
137
|
+
disabled: isComplexQuery,
|
|
138
|
+
tooltipText: isComplexQuery ? formatMessage(modeSwitcherMessages.basicModeSwitchDisabledTooltipText) : ''
|
|
125
139
|
}]
|
|
126
140
|
}));
|
|
127
141
|
};
|
|
@@ -4,5 +4,10 @@ export var modeSwitcherMessages = defineMessages({
|
|
|
4
4
|
id: 'linkDataSource.jira-issues.configmodal.basicModeText',
|
|
5
5
|
description: 'Display text for basic text search toggle button',
|
|
6
6
|
defaultMessage: 'Basic'
|
|
7
|
+
},
|
|
8
|
+
basicModeSwitchDisabledTooltipText: {
|
|
9
|
+
id: 'linkDataSource.jira-issues.configmodal.basicModeSwitchDisabledTooltipText',
|
|
10
|
+
description: 'Display tooltip text when basic mode switch is disabled',
|
|
11
|
+
defaultMessage: "You can't switch to basic for this query."
|
|
7
12
|
}
|
|
8
13
|
});
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import _extends from "@babel/runtime/helpers/extends";
|
|
1
2
|
/** @jsx jsx */
|
|
2
3
|
import React from 'react';
|
|
3
4
|
import { css, jsx } from '@emotion/react';
|
|
4
|
-
import { N0, N20, N30A, N700 } from '@atlaskit/theme/colors';
|
|
5
|
+
import { N0, N20, N30A, N60, N700 } from '@atlaskit/theme/colors';
|
|
6
|
+
import Tooltip from '@atlaskit/tooltip';
|
|
5
7
|
var modeSwitcherStyles = css({
|
|
6
8
|
alignItems: 'center',
|
|
7
9
|
background: "var(--ds-background-neutral, ".concat(N20, ")"),
|
|
@@ -44,8 +46,12 @@ var modeSwitcherLabelSelectedStyles = css({
|
|
|
44
46
|
}
|
|
45
47
|
});
|
|
46
48
|
var modeSwitcherLabelDisabledStyles = css({
|
|
49
|
+
color: "var(--ds-text-disabled, ".concat(N60, ")")
|
|
50
|
+
});
|
|
51
|
+
var modeSwitcherDisabledStyles = css({
|
|
47
52
|
':hover': {
|
|
48
|
-
cursor: 'not-allowed'
|
|
53
|
+
cursor: 'not-allowed',
|
|
54
|
+
background: 'transparent'
|
|
49
55
|
}
|
|
50
56
|
});
|
|
51
57
|
var compactModeSwitcherLabelStyles = css({
|
|
@@ -68,21 +74,27 @@ export var ModeSwitcher = function ModeSwitcher(props) {
|
|
|
68
74
|
disabled: isDisabled
|
|
69
75
|
}, options.map(function (_ref) {
|
|
70
76
|
var value = _ref.value,
|
|
71
|
-
label = _ref.label
|
|
77
|
+
label = _ref.label,
|
|
78
|
+
isOptionDisabled = _ref.disabled,
|
|
79
|
+
tooltipText = _ref.tooltipText;
|
|
72
80
|
var isSelected = value === selectedOptionValue;
|
|
73
|
-
return jsx(
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
"
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
81
|
+
return jsx(Tooltip, {
|
|
82
|
+
content: tooltipText
|
|
83
|
+
}, function (tooltipProps) {
|
|
84
|
+
return jsx("label", _extends({}, tooltipProps, {
|
|
85
|
+
key: value,
|
|
86
|
+
css: [modeSwitcherLabelStyles, isCompact && compactModeSwitcherLabelStyles, isSelected && modeSwitcherLabelSelectedStyles, isDisabled && modeSwitcherDisabledStyles, isOptionDisabled && [modeSwitcherLabelDisabledStyles, modeSwitcherDisabledStyles]],
|
|
87
|
+
"data-testid": "mode-toggle-".concat(value)
|
|
88
|
+
}), label, jsx("input", {
|
|
89
|
+
"aria-checked": isSelected,
|
|
90
|
+
"aria-disabled": isOptionDisabled,
|
|
91
|
+
checked: isSelected,
|
|
92
|
+
css: modeInputStyles,
|
|
93
|
+
disabled: isOptionDisabled,
|
|
94
|
+
onChange: handleModeChange,
|
|
95
|
+
type: "radio",
|
|
96
|
+
value: value
|
|
97
|
+
}));
|
|
98
|
+
});
|
|
87
99
|
})) : null;
|
|
88
100
|
};
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import { BasicFilterFieldType, FieldValuesResponse, HydrateResponse } from '../ui/jira-issues-modal/basic-filters/types';
|
|
2
|
+
interface GetFieldValuesProps {
|
|
3
|
+
cloudId: string;
|
|
4
|
+
jql: string;
|
|
5
|
+
jqlTerm: BasicFilterFieldType;
|
|
6
|
+
searchString: string;
|
|
7
|
+
pageCursor?: string;
|
|
8
|
+
}
|
|
2
9
|
export declare const useBasicFilterAGG: () => {
|
|
3
10
|
getHydratedJQL: (cloudId: string, jql: string) => Promise<HydrateResponse>;
|
|
4
|
-
getFieldValues: (cloudId
|
|
11
|
+
getFieldValues: ({ cloudId, jql, jqlTerm, searchString, pageCursor, }: GetFieldValuesProps) => Promise<FieldValuesResponse>;
|
|
5
12
|
};
|
|
13
|
+
export {};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export declare const hydrateJQLQuery = "query hydrate($cloudId: ID!, $jql: String!) {\n jira {\n jqlBuilder(cloudId: $cloudId) {\n hydrateJqlQuery(query: $jql) {\n ... on JiraJqlHydratedQuery {\n fields {\n ... on JiraJqlQueryHydratedField {\n jqlTerm\n values {\n ... on JiraJqlQueryHydratedValue {\n values {\n ... on JiraJqlProjectFieldValue {\n jqlTerm\n displayName\n project {\n avatar {\n small\n }\n }\n }\n ... on JiraJqlStatusFieldValue {\n jqlTerm\n displayName\n statusCategory {\n colorName\n }\n }\n ... on JiraJqlIssueTypeFieldValue {\n jqlTerm\n displayName\n issueTypes {\n avatar {\n small\n }\n }\n }\n ... on JiraJqlUserFieldValue {\n jqlTerm\n displayName\n user {\n picture\n }\n }\n ... on JiraJqlGroupFieldValue {\n jqlTerm\n displayName\n group {\n name\n }\n }\n }\n }\n }\n }\n }\n }\n }\n }\n }\n}";
|
|
2
|
-
export declare const fieldValuesQuery = "query fieldValues($cloudId: ID!, $first: Int = 10, $jqlTerm: String!, $jql: String!, $searchString: String!, $after: String
|
|
2
|
+
export declare const fieldValuesQuery = "query fieldValues($cloudId: ID!, $first: Int = 10, $jqlTerm: String!, $jql: String!, $searchString: String!, $after: String) {\n jira {\n jqlBuilder(cloudId: $cloudId) {\n fieldValues(\n first: $first\n jqlTerm: $jqlTerm\n jqlContext: $jql\n searchString: $searchString\n after: $after\n ) {\n totalCount\n pageInfo {\n endCursor\n }\n edges {\n node {\n jqlTerm\n displayName\n ... on JiraJqlProjectFieldValue {\n project {\n avatar {\n small\n }\n }\n }\n ... on JiraJqlIssueTypeFieldValue {\n issueTypes {\n avatar {\n small\n }\n }\n }\n ... on JiraJqlStatusFieldValue {\n statusCategory {\n colorName\n }\n }\n ... on JiraJqlUserFieldValue {\n user {\n picture\n }\n }\n ... on JiraJqlGroupFieldValue {\n group {\n name\n }\n }\n }\n }\n }\n }\n }\n}";
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { BasicFilterFieldType, SelectOption } from '../types';
|
|
2
|
+
interface FilterOptionsProps {
|
|
3
|
+
filterType: BasicFilterFieldType;
|
|
4
|
+
cloudId: string;
|
|
5
|
+
}
|
|
6
|
+
export interface FetchFilterOptionsProps {
|
|
7
|
+
pageCursor?: string;
|
|
8
|
+
searchString?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface FilterOptionsState {
|
|
11
|
+
filterOptions: SelectOption[];
|
|
12
|
+
fetchFilterOptions: (prop?: FetchFilterOptionsProps) => Promise<void>;
|
|
13
|
+
totalCount: number;
|
|
14
|
+
pageCursor?: string;
|
|
15
|
+
status: 'empty' | 'loading' | 'resolved' | 'rejected';
|
|
16
|
+
}
|
|
17
|
+
export declare const useFilterOptions: ({ filterType, cloudId, }: FilterOptionsProps) => FilterOptionsState;
|
|
18
|
+
export {};
|
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
import { BasicFilterFieldType, SelectOption } from '../../types';
|
|
3
3
|
export interface AsyncPopupSelectProps {
|
|
4
4
|
filterType: BasicFilterFieldType;
|
|
5
|
+
cloudId: string;
|
|
5
6
|
selection: SelectOption[];
|
|
6
7
|
onSelectionChange?: (selection: SelectOption[]) => void;
|
|
7
8
|
}
|
|
8
|
-
declare const AsyncPopupSelect: ({ filterType, selection, onSelectionChange, }: AsyncPopupSelectProps) => JSX.Element;
|
|
9
|
+
declare const AsyncPopupSelect: ({ filterType, cloudId, selection, onSelectionChange, }: AsyncPopupSelectProps) => JSX.Element;
|
|
9
10
|
export default AsyncPopupSelect;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
2
|
interface BasicFilterContainerProps {
|
|
3
3
|
jql: string;
|
|
4
|
+
cloudId: string;
|
|
4
5
|
}
|
|
5
|
-
declare const BasicFilterContainer: ({ jql }: BasicFilterContainerProps) => JSX.Element;
|
|
6
|
+
declare const BasicFilterContainer: ({ jql, cloudId }: BasicFilterContainerProps) => JSX.Element;
|
|
6
7
|
export default BasicFilterContainer;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const isQueryTooComplex: (jql: string) => boolean;
|
|
@@ -5,4 +5,6 @@ export declare function mapHydrateResponseData({ data }: HydrateResponse): {
|
|
|
5
5
|
project?: SelectOption[] | undefined;
|
|
6
6
|
issuetype?: SelectOption[] | undefined;
|
|
7
7
|
};
|
|
8
|
-
export declare function
|
|
8
|
+
export declare function mapFieldValuesToFilterOptions({ data, }: FieldValuesResponse): SelectOption[];
|
|
9
|
+
export declare function mapFieldValuesToTotalCount({ data, }: FieldValuesResponse): number;
|
|
10
|
+
export declare function mapFieldValuesToPageCursor({ data, }: FieldValuesResponse): string | undefined;
|