@atlaskit/jql-editor 5.8.5 → 5.9.1
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 +14 -0
- package/dist/cjs/analytics/util.js +1 -1
- package/dist/cjs/plugins/rich-inline-nodes/nodes/user/index.js +7 -2
- package/dist/cjs/plugins/rich-inline-nodes/nodes/user/styled.js +18 -0
- package/dist/cjs/plugins/rich-inline-nodes/util/replace-nodes-transaction.js +112 -28
- package/dist/cjs/state/hydration/util.js +16 -3
- package/dist/cjs/ui/jql-editor-layout/index.js +3 -1
- package/dist/es2019/analytics/util.js +1 -1
- package/dist/es2019/plugins/rich-inline-nodes/nodes/user/index.js +5 -2
- package/dist/es2019/plugins/rich-inline-nodes/nodes/user/styled.js +18 -0
- package/dist/es2019/plugins/rich-inline-nodes/util/replace-nodes-transaction.js +93 -23
- package/dist/es2019/state/hydration/util.js +13 -2
- package/dist/es2019/ui/jql-editor-layout/index.js +3 -1
- package/dist/esm/analytics/util.js +1 -1
- package/dist/esm/plugins/rich-inline-nodes/nodes/user/index.js +5 -2
- package/dist/esm/plugins/rich-inline-nodes/nodes/user/styled.js +18 -0
- package/dist/esm/plugins/rich-inline-nodes/util/replace-nodes-transaction.js +112 -28
- package/dist/esm/state/hydration/util.js +16 -3
- package/dist/esm/ui/jql-editor-layout/index.js +3 -1
- package/dist/types/plugins/autocomplete/components/autocomplete-dropdown/index.d.ts +1 -1
- package/dist/types/state/hydration/util.d.ts +2 -1
- package/dist/types/ui/index.d.ts +1 -1
- package/dist/types/ui/jql-editor/types.d.ts +1 -0
- package/dist/types/ui/jql-editor-controls-content/base-expand-toggle/index.d.ts +1 -1
- package/dist/types/ui/jql-editor-controls-content/base-search/index.d.ts +1 -1
- package/dist/types/ui/jql-editor-controls-content/base-syntax-help/index.d.ts +1 -1
- package/dist/types/ui/jql-editor-footer-content/jql-messages/format/index.d.ts +2 -2
- package/dist/types/ui/jql-editor-portal-provider/index.d.ts +1 -1
- package/dist/types/ui/jql-editor-view/index.d.ts +1 -1
- package/dist/types-ts4.5/plugins/autocomplete/components/autocomplete-dropdown/index.d.ts +1 -1
- package/dist/types-ts4.5/state/hydration/util.d.ts +2 -1
- package/dist/types-ts4.5/ui/index.d.ts +1 -1
- package/dist/types-ts4.5/ui/jql-editor/types.d.ts +1 -0
- package/dist/types-ts4.5/ui/jql-editor-controls-content/base-expand-toggle/index.d.ts +1 -1
- package/dist/types-ts4.5/ui/jql-editor-controls-content/base-search/index.d.ts +1 -1
- package/dist/types-ts4.5/ui/jql-editor-controls-content/base-syntax-help/index.d.ts +1 -1
- package/dist/types-ts4.5/ui/jql-editor-footer-content/jql-messages/format/index.d.ts +2 -2
- package/dist/types-ts4.5/ui/jql-editor-portal-provider/index.d.ts +1 -1
- package/dist/types-ts4.5/ui/jql-editor-view/index.d.ts +1 -1
- package/package.json +13 -6
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# @atlaskit/jql-editor
|
|
2
2
|
|
|
3
|
+
## 5.9.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [`965e86d051f6d`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/965e86d051f6d) -
|
|
8
|
+
[ux] Lozenege support(avatar + disaply name) added for membersOf(id:<team_id>) in JQL
|
|
9
|
+
|
|
10
|
+
## 5.9.0
|
|
11
|
+
|
|
12
|
+
### Minor Changes
|
|
13
|
+
|
|
14
|
+
- [`ba2562ba99b34`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/ba2562ba99b34) -
|
|
15
|
+
display avatar appearance based on appType (e.g. hexagon for appType 'agent')
|
|
16
|
+
|
|
3
17
|
## 5.8.5
|
|
4
18
|
|
|
5
19
|
### Patch Changes
|
|
@@ -6,5 +6,5 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.useJqlEditorAnalytics = void 0;
|
|
7
7
|
var _jqlEditorCommon = require("@atlaskit/jql-editor-common");
|
|
8
8
|
var useJqlEditorAnalytics = exports.useJqlEditorAnalytics = function useJqlEditorAnalytics(analyticsSource) {
|
|
9
|
-
return (0, _jqlEditorCommon.useJqlPackageAnalytics)(analyticsSource, "@atlaskit/jql-editor", "
|
|
9
|
+
return (0, _jqlEditorCommon.useJqlPackageAnalytics)(analyticsSource, "@atlaskit/jql-editor", "5.9.0", _jqlEditorCommon.ANALYTICS_CHANNEL);
|
|
10
10
|
};
|
|
@@ -1,16 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
4
5
|
Object.defineProperty(exports, "__esModule", {
|
|
5
6
|
value: true
|
|
6
7
|
});
|
|
7
8
|
exports.user = void 0;
|
|
8
9
|
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
9
10
|
var _react = _interopRequireDefault(require("react"));
|
|
10
|
-
var _avatar =
|
|
11
|
+
var _avatar = _interopRequireWildcard(require("@atlaskit/avatar"));
|
|
12
|
+
var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
|
|
11
13
|
var _state = require("../../../../state");
|
|
12
14
|
var _styled = require("./styled");
|
|
15
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
|
|
13
16
|
var User = function User(_ref) {
|
|
17
|
+
var _user$appType;
|
|
14
18
|
var id = _ref.id,
|
|
15
19
|
name = _ref.name,
|
|
16
20
|
fieldName = _ref.fieldName,
|
|
@@ -28,7 +32,8 @@ var User = function User(_ref) {
|
|
|
28
32
|
}, /*#__PURE__*/_react.default.createElement(_styled.AvatarWrapper, null, /*#__PURE__*/_react.default.createElement(_avatar.default, {
|
|
29
33
|
src: user === null || user === void 0 ? void 0 : user.avatarUrl,
|
|
30
34
|
borderColor: "transparent",
|
|
31
|
-
size: "xsmall"
|
|
35
|
+
size: "xsmall",
|
|
36
|
+
appearance: (0, _platformFeatureFlags.fg)('jira_ai_agent_avatar_with_apptype_for_jql') ? (0, _avatar.getAppearanceForAppType)((_user$appType = user === null || user === void 0 ? void 0 : user.appType) !== null && _user$appType !== void 0 ? _user$appType : null) : undefined
|
|
32
37
|
})), /*#__PURE__*/_react.default.createElement(_styled.NameContainer, null, name));
|
|
33
38
|
};
|
|
34
39
|
var user = exports.user = {
|
|
@@ -7,6 +7,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
7
7
|
exports.UserContainer = exports.NameContainer = exports.AvatarWrapper = void 0;
|
|
8
8
|
var _react = require("@emotion/react");
|
|
9
9
|
var _styled = _interopRequireDefault(require("@emotion/styled"));
|
|
10
|
+
var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
|
|
10
11
|
var _colors = require("@atlaskit/theme/colors");
|
|
11
12
|
// eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766
|
|
12
13
|
|
|
@@ -96,4 +97,21 @@ var AvatarWrapper = exports.AvatarWrapper = _styled.default.div({
|
|
|
96
97
|
position: 'relative',
|
|
97
98
|
top: '-2px'
|
|
98
99
|
}
|
|
100
|
+
},
|
|
101
|
+
// Feature-flagged styles for hexagon avatar alignment
|
|
102
|
+
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-dynamic-styles -- Ignored via go/DSP-18766
|
|
103
|
+
function () {
|
|
104
|
+
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-imported-style-values -- Ignored via go/DSP-18766
|
|
105
|
+
if ((0, _platformFeatureFlags.fg)('jira_ai_agent_avatar_with_apptype_for_jql')) {
|
|
106
|
+
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-imported-style-values -- Ignored via go/DSP-18766
|
|
107
|
+
return (0, _react.css)({
|
|
108
|
+
// Fix hexagon avatar alignment by targeting the hexagon focus container
|
|
109
|
+
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-nested-selectors, @atlaskit/ui-styling-standard/no-unsafe-selectors -- Ignored via go/DSP-18766
|
|
110
|
+
'> div [data-testid="hexagon-focus-container"]': {
|
|
111
|
+
// eslint-disable-next-line @atlaskit/design-system/use-tokens-space -- This design is very particular, and there is not a design token for this
|
|
112
|
+
marginTop: '-3.5px'
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
return null;
|
|
99
117
|
});
|
|
@@ -34,7 +34,13 @@ var replaceRichInlineNodes = exports.replaceRichInlineNodes = function replaceRi
|
|
|
34
34
|
values = _ref2[1];
|
|
35
35
|
values.forEach(function (value) {
|
|
36
36
|
if (value.type === 'user' || value.type === 'team' && (0, _platformFeatureFlags.fg)('jira_update_jql_teams')) {
|
|
37
|
+
// First try to find as direct value operand (e.g., Team[Team] = uuid)
|
|
37
38
|
var astNodes = getValueNodes(ast, fieldName, value.id);
|
|
39
|
+
|
|
40
|
+
// If not found as direct value and it's a team, try to find in membersOf function arguments
|
|
41
|
+
if (astNodes.length === 0 && value.type === 'team' && (0, _platformFeatureFlags.fg)('jira_update_jql_membersof_teams')) {
|
|
42
|
+
astNodes = getMembersOfArgumentNodes(ast, value.id);
|
|
43
|
+
}
|
|
38
44
|
astNodes.forEach(function (astNode) {
|
|
39
45
|
if (astNode.position) {
|
|
40
46
|
var _astNode$position = (0, _slicedToArray2.default)(astNode.position, 2),
|
|
@@ -85,11 +91,25 @@ var getValueNodes = function getValueNodes(ast, field, value) {
|
|
|
85
91
|
}
|
|
86
92
|
return ast.query.accept(new FindValuesVisitor(field, value));
|
|
87
93
|
};
|
|
88
|
-
var
|
|
89
|
-
|
|
94
|
+
var getMembersOfArgumentNodes = function getMembersOfArgumentNodes(ast, teamId) {
|
|
95
|
+
if (!ast.query) {
|
|
96
|
+
return [];
|
|
97
|
+
}
|
|
98
|
+
return ast.query.accept(new FindMembersOfArgumentsVisitor(teamId));
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Base visitor class for traversing JQL AST to find specific nodes.
|
|
103
|
+
* Provides common traversal logic - subclasses implement specific matching.
|
|
104
|
+
*/
|
|
105
|
+
var BaseAstNodeFinder = /*#__PURE__*/function (_AbstractJastVisitor) {
|
|
106
|
+
function BaseAstNodeFinder() {
|
|
90
107
|
var _this;
|
|
91
|
-
(0, _classCallCheck2.default)(this,
|
|
92
|
-
|
|
108
|
+
(0, _classCallCheck2.default)(this, BaseAstNodeFinder);
|
|
109
|
+
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
110
|
+
args[_key] = arguments[_key];
|
|
111
|
+
}
|
|
112
|
+
_this = _callSuper(this, BaseAstNodeFinder, [].concat(args));
|
|
93
113
|
(0, _defineProperty2.default)(_this, "visitQuery", function (query) {
|
|
94
114
|
if (query.where === undefined) {
|
|
95
115
|
return [];
|
|
@@ -97,39 +117,22 @@ var FindValuesVisitor = /*#__PURE__*/function (_AbstractJastVisitor) {
|
|
|
97
117
|
return query.where.accept(_this);
|
|
98
118
|
});
|
|
99
119
|
(0, _defineProperty2.default)(_this, "visitCompoundClause", function (compoundClause) {
|
|
100
|
-
return compoundClause.clauses.reduce(function (
|
|
101
|
-
return [].concat((0, _toConsumableArray2.default)(
|
|
120
|
+
return compoundClause.clauses.reduce(function (results, clause) {
|
|
121
|
+
return [].concat((0, _toConsumableArray2.default)(results), (0, _toConsumableArray2.default)(clause.accept(_this)));
|
|
102
122
|
}, []);
|
|
103
123
|
});
|
|
104
|
-
(0, _defineProperty2.default)(_this, "visitTerminalClause", function (terminalClause) {
|
|
105
|
-
if (!_this.equalsIgnoreCase(terminalClause.field.value, _this.field)) {
|
|
106
|
-
return [];
|
|
107
|
-
}
|
|
108
|
-
if (terminalClause.operand === undefined) {
|
|
109
|
-
return [];
|
|
110
|
-
}
|
|
111
|
-
return terminalClause.operand.accept(_this);
|
|
112
|
-
});
|
|
113
124
|
(0, _defineProperty2.default)(_this, "visitNotClause", function (notClause) {
|
|
114
125
|
return notClause.clause.accept(_this);
|
|
115
126
|
});
|
|
116
|
-
(0, _defineProperty2.default)(_this, "visitValueOperand", function (valueOperand) {
|
|
117
|
-
if (!_this.equalsIgnoreCase(valueOperand.value, _this.value)) {
|
|
118
|
-
return [];
|
|
119
|
-
}
|
|
120
|
-
return [valueOperand];
|
|
121
|
-
});
|
|
122
127
|
(0, _defineProperty2.default)(_this, "visitListOperand", function (listOperand) {
|
|
123
|
-
return listOperand.values.reduce(function (
|
|
124
|
-
return [].concat((0, _toConsumableArray2.default)(
|
|
128
|
+
return listOperand.values.reduce(function (results, operand) {
|
|
129
|
+
return [].concat((0, _toConsumableArray2.default)(results), (0, _toConsumableArray2.default)(operand.accept(_this)));
|
|
125
130
|
}, []);
|
|
126
131
|
});
|
|
127
|
-
_this.field = field;
|
|
128
|
-
_this.value = value;
|
|
129
132
|
return _this;
|
|
130
133
|
}
|
|
131
|
-
(0, _inherits2.default)(
|
|
132
|
-
return (0, _createClass2.default)(
|
|
134
|
+
(0, _inherits2.default)(BaseAstNodeFinder, _AbstractJastVisitor);
|
|
135
|
+
return (0, _createClass2.default)(BaseAstNodeFinder, [{
|
|
133
136
|
key: "aggregateResult",
|
|
134
137
|
value: function aggregateResult(aggregate, nextResult) {
|
|
135
138
|
return [].concat((0, _toConsumableArray2.default)(aggregate), (0, _toConsumableArray2.default)(nextResult));
|
|
@@ -147,4 +150,85 @@ var FindValuesVisitor = /*#__PURE__*/function (_AbstractJastVisitor) {
|
|
|
147
150
|
}) === 0;
|
|
148
151
|
}
|
|
149
152
|
}]);
|
|
150
|
-
}(_jqlAst.AbstractJastVisitor);
|
|
153
|
+
}(_jqlAst.AbstractJastVisitor);
|
|
154
|
+
/**
|
|
155
|
+
* Visitor that finds value operands matching a specific field and value.
|
|
156
|
+
* Used for direct value queries like "assignee = john-doe" or "Team[team] = uuid".
|
|
157
|
+
*/
|
|
158
|
+
var FindValuesVisitor = /*#__PURE__*/function (_BaseAstNodeFinder2) {
|
|
159
|
+
function FindValuesVisitor(field, value) {
|
|
160
|
+
var _this2;
|
|
161
|
+
(0, _classCallCheck2.default)(this, FindValuesVisitor);
|
|
162
|
+
_this2 = _callSuper(this, FindValuesVisitor);
|
|
163
|
+
(0, _defineProperty2.default)(_this2, "visitTerminalClause", function (terminalClause) {
|
|
164
|
+
if (!_this2.equalsIgnoreCase(terminalClause.field.value, _this2.field)) {
|
|
165
|
+
return [];
|
|
166
|
+
}
|
|
167
|
+
if (terminalClause.operand === undefined) {
|
|
168
|
+
return [];
|
|
169
|
+
}
|
|
170
|
+
return terminalClause.operand.accept(_this2);
|
|
171
|
+
});
|
|
172
|
+
(0, _defineProperty2.default)(_this2, "visitValueOperand", function (valueOperand) {
|
|
173
|
+
if (!_this2.equalsIgnoreCase(valueOperand.value, _this2.value)) {
|
|
174
|
+
return [];
|
|
175
|
+
}
|
|
176
|
+
return [valueOperand];
|
|
177
|
+
});
|
|
178
|
+
_this2.field = field;
|
|
179
|
+
_this2.value = value;
|
|
180
|
+
return _this2;
|
|
181
|
+
}
|
|
182
|
+
(0, _inherits2.default)(FindValuesVisitor, _BaseAstNodeFinder2);
|
|
183
|
+
return (0, _createClass2.default)(FindValuesVisitor);
|
|
184
|
+
}(BaseAstNodeFinder);
|
|
185
|
+
/**
|
|
186
|
+
* Visitor that finds membersOf function arguments matching a specific team ID.
|
|
187
|
+
* Used for queries like "assignee in membersOf("id: <uuid>")".
|
|
188
|
+
*/
|
|
189
|
+
var FindMembersOfArgumentsVisitor = /*#__PURE__*/function (_BaseAstNodeFinder3) {
|
|
190
|
+
function FindMembersOfArgumentsVisitor(teamId) {
|
|
191
|
+
var _this3;
|
|
192
|
+
(0, _classCallCheck2.default)(this, FindMembersOfArgumentsVisitor);
|
|
193
|
+
_this3 = _callSuper(this, FindMembersOfArgumentsVisitor);
|
|
194
|
+
(0, _defineProperty2.default)(_this3, "visitTerminalClause", function (terminalClause) {
|
|
195
|
+
if (terminalClause.operand === undefined) {
|
|
196
|
+
return [];
|
|
197
|
+
}
|
|
198
|
+
return terminalClause.operand.accept(_this3);
|
|
199
|
+
});
|
|
200
|
+
(0, _defineProperty2.default)(_this3, "visitFunctionOperand", function (functionOperand) {
|
|
201
|
+
var functionName = functionOperand.function.value.toLowerCase();
|
|
202
|
+
|
|
203
|
+
// Only process membersOf function
|
|
204
|
+
if (functionName !== 'membersof') {
|
|
205
|
+
return [];
|
|
206
|
+
}
|
|
207
|
+
var matchingArgs = [];
|
|
208
|
+
functionOperand.arguments.forEach(function (arg) {
|
|
209
|
+
// Normalize both values by removing extra whitespace for comparison
|
|
210
|
+
// This handles both "id: uuid" and "id:uuid" formats
|
|
211
|
+
var normalizedArgValue = _this3.normalizeValue(arg.value);
|
|
212
|
+
var normalizedTeamId = _this3.normalizeValue(_this3.teamId);
|
|
213
|
+
if (_this3.equalsIgnoreCase(normalizedArgValue, normalizedTeamId)) {
|
|
214
|
+
matchingArgs.push(arg);
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
return matchingArgs;
|
|
218
|
+
});
|
|
219
|
+
_this3.teamId = teamId;
|
|
220
|
+
return _this3;
|
|
221
|
+
}
|
|
222
|
+
(0, _inherits2.default)(FindMembersOfArgumentsVisitor, _BaseAstNodeFinder3);
|
|
223
|
+
return (0, _createClass2.default)(FindMembersOfArgumentsVisitor, [{
|
|
224
|
+
key: "normalizeValue",
|
|
225
|
+
value:
|
|
226
|
+
/**
|
|
227
|
+
* Normalize value by removing extra whitespace around colons and trimming.
|
|
228
|
+
* This handles variations like "id: uuid" vs "id:uuid" vs "id: uuid".
|
|
229
|
+
*/
|
|
230
|
+
function normalizeValue(value) {
|
|
231
|
+
return value.replace(/\s*:\s*/g, ':').trim();
|
|
232
|
+
}
|
|
233
|
+
}]);
|
|
234
|
+
}(BaseAstNodeFinder);
|
|
@@ -12,6 +12,7 @@ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/ge
|
|
|
12
12
|
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
|
|
13
13
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
14
14
|
var _jqlAst = require("@atlaskit/jql-ast");
|
|
15
|
+
var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
|
|
15
16
|
function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2.default)(o), (0, _possibleConstructorReturn2.default)(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2.default)(t).constructor) : o.apply(t, e)); }
|
|
16
17
|
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
|
|
17
18
|
/**
|
|
@@ -31,10 +32,10 @@ var ValidQueryVisitor = exports.ValidQueryVisitor = /*#__PURE__*/function (_Abst
|
|
|
31
32
|
function ValidQueryVisitor() {
|
|
32
33
|
var _this;
|
|
33
34
|
(0, _classCallCheck2.default)(this, ValidQueryVisitor);
|
|
34
|
-
for (var _len = arguments.length,
|
|
35
|
-
|
|
35
|
+
for (var _len = arguments.length, _args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
36
|
+
_args[_key] = arguments[_key];
|
|
36
37
|
}
|
|
37
|
-
_this = _callSuper(this, ValidQueryVisitor, [].concat(
|
|
38
|
+
_this = _callSuper(this, ValidQueryVisitor, [].concat(_args));
|
|
38
39
|
(0, _defineProperty2.default)(_this, "visitQuery", function (query) {
|
|
39
40
|
if (!query.where) {
|
|
40
41
|
return '';
|
|
@@ -74,6 +75,18 @@ var ValidQueryVisitor = exports.ValidQueryVisitor = /*#__PURE__*/function (_Abst
|
|
|
74
75
|
return !!value;
|
|
75
76
|
}).join(', '), ")");
|
|
76
77
|
});
|
|
78
|
+
(0, _defineProperty2.default)(_this, "visitFunctionOperand", function (functionOperand) {
|
|
79
|
+
// Only include membersOf function as it has arguments that need hydration
|
|
80
|
+
// Other functions like currentUser() don't have hydratable arguments
|
|
81
|
+
var functionName = functionOperand.function.value.toLowerCase();
|
|
82
|
+
if (functionName !== 'membersof' || !(0, _platformFeatureFlags.fg)('jira_update_jql_membersof_teams')) {
|
|
83
|
+
return '';
|
|
84
|
+
}
|
|
85
|
+
var args = functionOperand.arguments.map(function (arg) {
|
|
86
|
+
return arg.text;
|
|
87
|
+
}).join(', ');
|
|
88
|
+
return "".concat(functionOperand.function.text, "(").concat(args, ")");
|
|
89
|
+
});
|
|
77
90
|
return _this;
|
|
78
91
|
}
|
|
79
92
|
(0, _inherits2.default)(ValidQueryVisitor, _AbstractJastVisitor);
|
|
@@ -93,7 +93,9 @@ var JQLEditorReadOnlyWithoutTheme = function JQLEditorReadOnlyWithoutTheme(_ref)
|
|
|
93
93
|
// Therefore the autocomplete combobox is never shown to the users
|
|
94
94
|
,
|
|
95
95
|
"aria-expanded": false,
|
|
96
|
-
"aria-controls": "dummy-jql-editor-auto-complete-id"
|
|
96
|
+
"aria-controls": "dummy-jql-editor-auto-complete-id"
|
|
97
|
+
// eslint-disable-next-line @atlassian/i18n/no-literal-string-in-jsx
|
|
98
|
+
,
|
|
97
99
|
"aria-label": "JQL query",
|
|
98
100
|
defaultRows: defaultRows
|
|
99
101
|
}, blocks.map(function (block, index) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { ANALYTICS_CHANNEL, useJqlPackageAnalytics } from '@atlaskit/jql-editor-common';
|
|
2
2
|
export const useJqlEditorAnalytics = analyticsSource => {
|
|
3
|
-
return useJqlPackageAnalytics(analyticsSource, "@atlaskit/jql-editor", "
|
|
3
|
+
return useJqlPackageAnalytics(analyticsSource, "@atlaskit/jql-editor", "5.9.0", ANALYTICS_CHANNEL);
|
|
4
4
|
};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import Avatar from '@atlaskit/avatar';
|
|
2
|
+
import Avatar, { getAppearanceForAppType } from '@atlaskit/avatar';
|
|
3
|
+
import { fg } from '@atlaskit/platform-feature-flags';
|
|
3
4
|
import { useHydratedUser } from '../../../../state';
|
|
4
5
|
import { AvatarWrapper, NameContainer, UserContainer } from './styled';
|
|
5
6
|
const User = ({
|
|
@@ -9,6 +10,7 @@ const User = ({
|
|
|
9
10
|
selected,
|
|
10
11
|
error
|
|
11
12
|
}) => {
|
|
13
|
+
var _user$appType;
|
|
12
14
|
const [user] = useHydratedUser({
|
|
13
15
|
id,
|
|
14
16
|
fieldName
|
|
@@ -19,7 +21,8 @@ const User = ({
|
|
|
19
21
|
}, /*#__PURE__*/React.createElement(AvatarWrapper, null, /*#__PURE__*/React.createElement(Avatar, {
|
|
20
22
|
src: user === null || user === void 0 ? void 0 : user.avatarUrl,
|
|
21
23
|
borderColor: "transparent",
|
|
22
|
-
size: "xsmall"
|
|
24
|
+
size: "xsmall",
|
|
25
|
+
appearance: fg('jira_ai_agent_avatar_with_apptype_for_jql') ? getAppearanceForAppType((_user$appType = user === null || user === void 0 ? void 0 : user.appType) !== null && _user$appType !== void 0 ? _user$appType : null) : undefined
|
|
23
26
|
})), /*#__PURE__*/React.createElement(NameContainer, null, name));
|
|
24
27
|
};
|
|
25
28
|
export const user = {
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { css } from '@emotion/react';
|
|
3
3
|
// eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766
|
|
4
4
|
import styled from '@emotion/styled';
|
|
5
|
+
import { fg } from '@atlaskit/platform-feature-flags';
|
|
5
6
|
import { N0, N40, N50, N500, R400 } from '@atlaskit/theme/colors';
|
|
6
7
|
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-styled, @atlaskit/ui-styling-standard/no-exported-styles -- Ignored via go/DSP-18766
|
|
7
8
|
export const UserContainer = styled.span({
|
|
@@ -88,4 +89,21 @@ export const AvatarWrapper = styled.div({
|
|
|
88
89
|
position: 'relative',
|
|
89
90
|
top: '-2px'
|
|
90
91
|
}
|
|
92
|
+
},
|
|
93
|
+
// Feature-flagged styles for hexagon avatar alignment
|
|
94
|
+
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-dynamic-styles -- Ignored via go/DSP-18766
|
|
95
|
+
() => {
|
|
96
|
+
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-imported-style-values -- Ignored via go/DSP-18766
|
|
97
|
+
if (fg('jira_ai_agent_avatar_with_apptype_for_jql')) {
|
|
98
|
+
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-imported-style-values -- Ignored via go/DSP-18766
|
|
99
|
+
return css({
|
|
100
|
+
// Fix hexagon avatar alignment by targeting the hexagon focus container
|
|
101
|
+
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-nested-selectors, @atlaskit/ui-styling-standard/no-unsafe-selectors -- Ignored via go/DSP-18766
|
|
102
|
+
'> div [data-testid="hexagon-focus-container"]': {
|
|
103
|
+
// eslint-disable-next-line @atlaskit/design-system/use-tokens-space -- This design is very particular, and there is not a design token for this
|
|
104
|
+
marginTop: '-3.5px'
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
return null;
|
|
91
109
|
});
|
|
@@ -13,7 +13,13 @@ export const replaceRichInlineNodes = (editorState, hydratedValues) => {
|
|
|
13
13
|
Object.entries(hydratedValues).forEach(([fieldName, values]) => {
|
|
14
14
|
values.forEach(value => {
|
|
15
15
|
if (value.type === 'user' || value.type === 'team' && fg('jira_update_jql_teams')) {
|
|
16
|
-
|
|
16
|
+
// First try to find as direct value operand (e.g., Team[Team] = uuid)
|
|
17
|
+
let astNodes = getValueNodes(ast, fieldName, value.id);
|
|
18
|
+
|
|
19
|
+
// If not found as direct value and it's a team, try to find in membersOf function arguments
|
|
20
|
+
if (astNodes.length === 0 && value.type === 'team' && fg('jira_update_jql_membersof_teams')) {
|
|
21
|
+
astNodes = getMembersOfArgumentNodes(ast, value.id);
|
|
22
|
+
}
|
|
17
23
|
astNodes.forEach(astNode => {
|
|
18
24
|
if (astNode.position) {
|
|
19
25
|
const [from, to] = astNode.position;
|
|
@@ -64,9 +70,20 @@ const getValueNodes = (ast, field, value) => {
|
|
|
64
70
|
}
|
|
65
71
|
return ast.query.accept(new FindValuesVisitor(field, value));
|
|
66
72
|
};
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
73
|
+
const getMembersOfArgumentNodes = (ast, teamId) => {
|
|
74
|
+
if (!ast.query) {
|
|
75
|
+
return [];
|
|
76
|
+
}
|
|
77
|
+
return ast.query.accept(new FindMembersOfArgumentsVisitor(teamId));
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Base visitor class for traversing JQL AST to find specific nodes.
|
|
82
|
+
* Provides common traversal logic - subclasses implement specific matching.
|
|
83
|
+
*/
|
|
84
|
+
class BaseAstNodeFinder extends AbstractJastVisitor {
|
|
85
|
+
constructor(...args) {
|
|
86
|
+
super(...args);
|
|
70
87
|
_defineProperty(this, "visitQuery", query => {
|
|
71
88
|
if (query.where === undefined) {
|
|
72
89
|
return [];
|
|
@@ -74,10 +91,39 @@ class FindValuesVisitor extends AbstractJastVisitor {
|
|
|
74
91
|
return query.where.accept(this);
|
|
75
92
|
});
|
|
76
93
|
_defineProperty(this, "visitCompoundClause", compoundClause => {
|
|
77
|
-
return compoundClause.clauses.reduce((
|
|
78
|
-
return [...
|
|
94
|
+
return compoundClause.clauses.reduce((results, clause) => {
|
|
95
|
+
return [...results, ...clause.accept(this)];
|
|
79
96
|
}, []);
|
|
80
97
|
});
|
|
98
|
+
_defineProperty(this, "visitNotClause", notClause => {
|
|
99
|
+
return notClause.clause.accept(this);
|
|
100
|
+
});
|
|
101
|
+
_defineProperty(this, "visitListOperand", listOperand => {
|
|
102
|
+
return listOperand.values.reduce((results, operand) => {
|
|
103
|
+
return [...results, ...operand.accept(this)];
|
|
104
|
+
}, []);
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
aggregateResult(aggregate, nextResult) {
|
|
108
|
+
return [...aggregate, ...nextResult];
|
|
109
|
+
}
|
|
110
|
+
defaultResult() {
|
|
111
|
+
return [];
|
|
112
|
+
}
|
|
113
|
+
equalsIgnoreCase(a, b) {
|
|
114
|
+
return a.localeCompare(b, undefined, {
|
|
115
|
+
sensitivity: 'base'
|
|
116
|
+
}) === 0;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Visitor that finds value operands matching a specific field and value.
|
|
122
|
+
* Used for direct value queries like "assignee = john-doe" or "Team[team] = uuid".
|
|
123
|
+
*/
|
|
124
|
+
class FindValuesVisitor extends BaseAstNodeFinder {
|
|
125
|
+
constructor(field, value) {
|
|
126
|
+
super();
|
|
81
127
|
_defineProperty(this, "visitTerminalClause", terminalClause => {
|
|
82
128
|
if (!this.equalsIgnoreCase(terminalClause.field.value, this.field)) {
|
|
83
129
|
return [];
|
|
@@ -87,32 +133,56 @@ class FindValuesVisitor extends AbstractJastVisitor {
|
|
|
87
133
|
}
|
|
88
134
|
return terminalClause.operand.accept(this);
|
|
89
135
|
});
|
|
90
|
-
_defineProperty(this, "visitNotClause", notClause => {
|
|
91
|
-
return notClause.clause.accept(this);
|
|
92
|
-
});
|
|
93
136
|
_defineProperty(this, "visitValueOperand", valueOperand => {
|
|
94
137
|
if (!this.equalsIgnoreCase(valueOperand.value, this.value)) {
|
|
95
138
|
return [];
|
|
96
139
|
}
|
|
97
140
|
return [valueOperand];
|
|
98
141
|
});
|
|
99
|
-
_defineProperty(this, "visitListOperand", listOperand => {
|
|
100
|
-
return listOperand.values.reduce((values, operand) => {
|
|
101
|
-
return [...values, ...operand.accept(this)];
|
|
102
|
-
}, []);
|
|
103
|
-
});
|
|
104
142
|
this.field = field;
|
|
105
143
|
this.value = value;
|
|
106
144
|
}
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Visitor that finds membersOf function arguments matching a specific team ID.
|
|
149
|
+
* Used for queries like "assignee in membersOf("id: <uuid>")".
|
|
150
|
+
*/
|
|
151
|
+
class FindMembersOfArgumentsVisitor extends BaseAstNodeFinder {
|
|
152
|
+
constructor(teamId) {
|
|
153
|
+
super();
|
|
154
|
+
_defineProperty(this, "visitTerminalClause", terminalClause => {
|
|
155
|
+
if (terminalClause.operand === undefined) {
|
|
156
|
+
return [];
|
|
157
|
+
}
|
|
158
|
+
return terminalClause.operand.accept(this);
|
|
159
|
+
});
|
|
160
|
+
_defineProperty(this, "visitFunctionOperand", functionOperand => {
|
|
161
|
+
const functionName = functionOperand.function.value.toLowerCase();
|
|
162
|
+
|
|
163
|
+
// Only process membersOf function
|
|
164
|
+
if (functionName !== 'membersof') {
|
|
165
|
+
return [];
|
|
166
|
+
}
|
|
167
|
+
const matchingArgs = [];
|
|
168
|
+
functionOperand.arguments.forEach(arg => {
|
|
169
|
+
// Normalize both values by removing extra whitespace for comparison
|
|
170
|
+
// This handles both "id: uuid" and "id:uuid" formats
|
|
171
|
+
const normalizedArgValue = this.normalizeValue(arg.value);
|
|
172
|
+
const normalizedTeamId = this.normalizeValue(this.teamId);
|
|
173
|
+
if (this.equalsIgnoreCase(normalizedArgValue, normalizedTeamId)) {
|
|
174
|
+
matchingArgs.push(arg);
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
return matchingArgs;
|
|
178
|
+
});
|
|
179
|
+
this.teamId = teamId;
|
|
112
180
|
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
181
|
+
/**
|
|
182
|
+
* Normalize value by removing extra whitespace around colons and trimming.
|
|
183
|
+
* This handles variations like "id: uuid" vs "id:uuid" vs "id: uuid".
|
|
184
|
+
*/
|
|
185
|
+
normalizeValue(value) {
|
|
186
|
+
return value.replace(/\s*:\s*/g, ':').trim();
|
|
117
187
|
}
|
|
118
188
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
2
|
import { AbstractJastVisitor } from '@atlaskit/jql-ast';
|
|
3
|
+
import { fg } from '@atlaskit/platform-feature-flags';
|
|
3
4
|
|
|
4
5
|
/**
|
|
5
6
|
* Given an AST with parse errors, this visitor returns a valid query that is equivalent for hydration purposes
|
|
@@ -15,8 +16,8 @@ import { AbstractJastVisitor } from '@atlaskit/jql-ast';
|
|
|
15
16
|
* - Equivalent query: "project = EM and status in (Done)"
|
|
16
17
|
*/
|
|
17
18
|
export class ValidQueryVisitor extends AbstractJastVisitor {
|
|
18
|
-
constructor(...
|
|
19
|
-
super(...
|
|
19
|
+
constructor(..._args) {
|
|
20
|
+
super(..._args);
|
|
20
21
|
_defineProperty(this, "visitQuery", query => {
|
|
21
22
|
if (!query.where) {
|
|
22
23
|
return '';
|
|
@@ -50,6 +51,16 @@ export class ValidQueryVisitor extends AbstractJastVisitor {
|
|
|
50
51
|
_defineProperty(this, "visitListOperand", listOperand => {
|
|
51
52
|
return `(${listOperand.values.map(value => value.accept(this)).filter(value => !!value).join(', ')})`;
|
|
52
53
|
});
|
|
54
|
+
_defineProperty(this, "visitFunctionOperand", functionOperand => {
|
|
55
|
+
// Only include membersOf function as it has arguments that need hydration
|
|
56
|
+
// Other functions like currentUser() don't have hydratable arguments
|
|
57
|
+
const functionName = functionOperand.function.value.toLowerCase();
|
|
58
|
+
if (functionName !== 'membersof' || !fg('jira_update_jql_membersof_teams')) {
|
|
59
|
+
return '';
|
|
60
|
+
}
|
|
61
|
+
const args = functionOperand.arguments.map(arg => arg.text).join(', ');
|
|
62
|
+
return `${functionOperand.function.text}(${args})`;
|
|
63
|
+
});
|
|
53
64
|
}
|
|
54
65
|
defaultResult() {
|
|
55
66
|
return '';
|
|
@@ -90,7 +90,9 @@ const JQLEditorReadOnlyWithoutTheme = ({
|
|
|
90
90
|
// Therefore the autocomplete combobox is never shown to the users
|
|
91
91
|
,
|
|
92
92
|
"aria-expanded": false,
|
|
93
|
-
"aria-controls": "dummy-jql-editor-auto-complete-id"
|
|
93
|
+
"aria-controls": "dummy-jql-editor-auto-complete-id"
|
|
94
|
+
// eslint-disable-next-line @atlassian/i18n/no-literal-string-in-jsx
|
|
95
|
+
,
|
|
94
96
|
"aria-label": "JQL query",
|
|
95
97
|
defaultRows: defaultRows
|
|
96
98
|
}, blocks.map((block, index) => /*#__PURE__*/React.createElement(Box, {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { ANALYTICS_CHANNEL, useJqlPackageAnalytics } from '@atlaskit/jql-editor-common';
|
|
2
2
|
export var useJqlEditorAnalytics = function useJqlEditorAnalytics(analyticsSource) {
|
|
3
|
-
return useJqlPackageAnalytics(analyticsSource, "@atlaskit/jql-editor", "
|
|
3
|
+
return useJqlPackageAnalytics(analyticsSource, "@atlaskit/jql-editor", "5.9.0", ANALYTICS_CHANNEL);
|
|
4
4
|
};
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
2
2
|
import React from 'react';
|
|
3
|
-
import Avatar from '@atlaskit/avatar';
|
|
3
|
+
import Avatar, { getAppearanceForAppType } from '@atlaskit/avatar';
|
|
4
|
+
import { fg } from '@atlaskit/platform-feature-flags';
|
|
4
5
|
import { useHydratedUser } from '../../../../state';
|
|
5
6
|
import { AvatarWrapper, NameContainer, UserContainer } from './styled';
|
|
6
7
|
var User = function User(_ref) {
|
|
8
|
+
var _user$appType;
|
|
7
9
|
var id = _ref.id,
|
|
8
10
|
name = _ref.name,
|
|
9
11
|
fieldName = _ref.fieldName,
|
|
@@ -21,7 +23,8 @@ var User = function User(_ref) {
|
|
|
21
23
|
}, /*#__PURE__*/React.createElement(AvatarWrapper, null, /*#__PURE__*/React.createElement(Avatar, {
|
|
22
24
|
src: user === null || user === void 0 ? void 0 : user.avatarUrl,
|
|
23
25
|
borderColor: "transparent",
|
|
24
|
-
size: "xsmall"
|
|
26
|
+
size: "xsmall",
|
|
27
|
+
appearance: fg('jira_ai_agent_avatar_with_apptype_for_jql') ? getAppearanceForAppType((_user$appType = user === null || user === void 0 ? void 0 : user.appType) !== null && _user$appType !== void 0 ? _user$appType : null) : undefined
|
|
25
28
|
})), /*#__PURE__*/React.createElement(NameContainer, null, name));
|
|
26
29
|
};
|
|
27
30
|
export var user = {
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { css } from '@emotion/react';
|
|
3
3
|
// eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766
|
|
4
4
|
import styled from '@emotion/styled';
|
|
5
|
+
import { fg } from '@atlaskit/platform-feature-flags';
|
|
5
6
|
import { N0, N40, N50, N500, R400 } from '@atlaskit/theme/colors';
|
|
6
7
|
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-styled, @atlaskit/ui-styling-standard/no-exported-styles -- Ignored via go/DSP-18766
|
|
7
8
|
export var UserContainer = styled.span({
|
|
@@ -87,4 +88,21 @@ export var AvatarWrapper = styled.div({
|
|
|
87
88
|
position: 'relative',
|
|
88
89
|
top: '-2px'
|
|
89
90
|
}
|
|
91
|
+
},
|
|
92
|
+
// Feature-flagged styles for hexagon avatar alignment
|
|
93
|
+
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-dynamic-styles -- Ignored via go/DSP-18766
|
|
94
|
+
function () {
|
|
95
|
+
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-imported-style-values -- Ignored via go/DSP-18766
|
|
96
|
+
if (fg('jira_ai_agent_avatar_with_apptype_for_jql')) {
|
|
97
|
+
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-imported-style-values -- Ignored via go/DSP-18766
|
|
98
|
+
return css({
|
|
99
|
+
// Fix hexagon avatar alignment by targeting the hexagon focus container
|
|
100
|
+
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-nested-selectors, @atlaskit/ui-styling-standard/no-unsafe-selectors -- Ignored via go/DSP-18766
|
|
101
|
+
'> div [data-testid="hexagon-focus-container"]': {
|
|
102
|
+
// eslint-disable-next-line @atlaskit/design-system/use-tokens-space -- This design is very particular, and there is not a design token for this
|
|
103
|
+
marginTop: '-3.5px'
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
return null;
|
|
90
108
|
});
|
|
@@ -27,7 +27,13 @@ export var replaceRichInlineNodes = function replaceRichInlineNodes(editorState,
|
|
|
27
27
|
values = _ref2[1];
|
|
28
28
|
values.forEach(function (value) {
|
|
29
29
|
if (value.type === 'user' || value.type === 'team' && fg('jira_update_jql_teams')) {
|
|
30
|
+
// First try to find as direct value operand (e.g., Team[Team] = uuid)
|
|
30
31
|
var astNodes = getValueNodes(ast, fieldName, value.id);
|
|
32
|
+
|
|
33
|
+
// If not found as direct value and it's a team, try to find in membersOf function arguments
|
|
34
|
+
if (astNodes.length === 0 && value.type === 'team' && fg('jira_update_jql_membersof_teams')) {
|
|
35
|
+
astNodes = getMembersOfArgumentNodes(ast, value.id);
|
|
36
|
+
}
|
|
31
37
|
astNodes.forEach(function (astNode) {
|
|
32
38
|
if (astNode.position) {
|
|
33
39
|
var _astNode$position = _slicedToArray(astNode.position, 2),
|
|
@@ -78,11 +84,25 @@ var getValueNodes = function getValueNodes(ast, field, value) {
|
|
|
78
84
|
}
|
|
79
85
|
return ast.query.accept(new FindValuesVisitor(field, value));
|
|
80
86
|
};
|
|
81
|
-
var
|
|
82
|
-
|
|
87
|
+
var getMembersOfArgumentNodes = function getMembersOfArgumentNodes(ast, teamId) {
|
|
88
|
+
if (!ast.query) {
|
|
89
|
+
return [];
|
|
90
|
+
}
|
|
91
|
+
return ast.query.accept(new FindMembersOfArgumentsVisitor(teamId));
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Base visitor class for traversing JQL AST to find specific nodes.
|
|
96
|
+
* Provides common traversal logic - subclasses implement specific matching.
|
|
97
|
+
*/
|
|
98
|
+
var BaseAstNodeFinder = /*#__PURE__*/function (_AbstractJastVisitor) {
|
|
99
|
+
function BaseAstNodeFinder() {
|
|
83
100
|
var _this;
|
|
84
|
-
_classCallCheck(this,
|
|
85
|
-
|
|
101
|
+
_classCallCheck(this, BaseAstNodeFinder);
|
|
102
|
+
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
103
|
+
args[_key] = arguments[_key];
|
|
104
|
+
}
|
|
105
|
+
_this = _callSuper(this, BaseAstNodeFinder, [].concat(args));
|
|
86
106
|
_defineProperty(_this, "visitQuery", function (query) {
|
|
87
107
|
if (query.where === undefined) {
|
|
88
108
|
return [];
|
|
@@ -90,39 +110,22 @@ var FindValuesVisitor = /*#__PURE__*/function (_AbstractJastVisitor) {
|
|
|
90
110
|
return query.where.accept(_this);
|
|
91
111
|
});
|
|
92
112
|
_defineProperty(_this, "visitCompoundClause", function (compoundClause) {
|
|
93
|
-
return compoundClause.clauses.reduce(function (
|
|
94
|
-
return [].concat(_toConsumableArray(
|
|
113
|
+
return compoundClause.clauses.reduce(function (results, clause) {
|
|
114
|
+
return [].concat(_toConsumableArray(results), _toConsumableArray(clause.accept(_this)));
|
|
95
115
|
}, []);
|
|
96
116
|
});
|
|
97
|
-
_defineProperty(_this, "visitTerminalClause", function (terminalClause) {
|
|
98
|
-
if (!_this.equalsIgnoreCase(terminalClause.field.value, _this.field)) {
|
|
99
|
-
return [];
|
|
100
|
-
}
|
|
101
|
-
if (terminalClause.operand === undefined) {
|
|
102
|
-
return [];
|
|
103
|
-
}
|
|
104
|
-
return terminalClause.operand.accept(_this);
|
|
105
|
-
});
|
|
106
117
|
_defineProperty(_this, "visitNotClause", function (notClause) {
|
|
107
118
|
return notClause.clause.accept(_this);
|
|
108
119
|
});
|
|
109
|
-
_defineProperty(_this, "visitValueOperand", function (valueOperand) {
|
|
110
|
-
if (!_this.equalsIgnoreCase(valueOperand.value, _this.value)) {
|
|
111
|
-
return [];
|
|
112
|
-
}
|
|
113
|
-
return [valueOperand];
|
|
114
|
-
});
|
|
115
120
|
_defineProperty(_this, "visitListOperand", function (listOperand) {
|
|
116
|
-
return listOperand.values.reduce(function (
|
|
117
|
-
return [].concat(_toConsumableArray(
|
|
121
|
+
return listOperand.values.reduce(function (results, operand) {
|
|
122
|
+
return [].concat(_toConsumableArray(results), _toConsumableArray(operand.accept(_this)));
|
|
118
123
|
}, []);
|
|
119
124
|
});
|
|
120
|
-
_this.field = field;
|
|
121
|
-
_this.value = value;
|
|
122
125
|
return _this;
|
|
123
126
|
}
|
|
124
|
-
_inherits(
|
|
125
|
-
return _createClass(
|
|
127
|
+
_inherits(BaseAstNodeFinder, _AbstractJastVisitor);
|
|
128
|
+
return _createClass(BaseAstNodeFinder, [{
|
|
126
129
|
key: "aggregateResult",
|
|
127
130
|
value: function aggregateResult(aggregate, nextResult) {
|
|
128
131
|
return [].concat(_toConsumableArray(aggregate), _toConsumableArray(nextResult));
|
|
@@ -140,4 +143,85 @@ var FindValuesVisitor = /*#__PURE__*/function (_AbstractJastVisitor) {
|
|
|
140
143
|
}) === 0;
|
|
141
144
|
}
|
|
142
145
|
}]);
|
|
143
|
-
}(AbstractJastVisitor);
|
|
146
|
+
}(AbstractJastVisitor);
|
|
147
|
+
/**
|
|
148
|
+
* Visitor that finds value operands matching a specific field and value.
|
|
149
|
+
* Used for direct value queries like "assignee = john-doe" or "Team[team] = uuid".
|
|
150
|
+
*/
|
|
151
|
+
var FindValuesVisitor = /*#__PURE__*/function (_BaseAstNodeFinder2) {
|
|
152
|
+
function FindValuesVisitor(field, value) {
|
|
153
|
+
var _this2;
|
|
154
|
+
_classCallCheck(this, FindValuesVisitor);
|
|
155
|
+
_this2 = _callSuper(this, FindValuesVisitor);
|
|
156
|
+
_defineProperty(_this2, "visitTerminalClause", function (terminalClause) {
|
|
157
|
+
if (!_this2.equalsIgnoreCase(terminalClause.field.value, _this2.field)) {
|
|
158
|
+
return [];
|
|
159
|
+
}
|
|
160
|
+
if (terminalClause.operand === undefined) {
|
|
161
|
+
return [];
|
|
162
|
+
}
|
|
163
|
+
return terminalClause.operand.accept(_this2);
|
|
164
|
+
});
|
|
165
|
+
_defineProperty(_this2, "visitValueOperand", function (valueOperand) {
|
|
166
|
+
if (!_this2.equalsIgnoreCase(valueOperand.value, _this2.value)) {
|
|
167
|
+
return [];
|
|
168
|
+
}
|
|
169
|
+
return [valueOperand];
|
|
170
|
+
});
|
|
171
|
+
_this2.field = field;
|
|
172
|
+
_this2.value = value;
|
|
173
|
+
return _this2;
|
|
174
|
+
}
|
|
175
|
+
_inherits(FindValuesVisitor, _BaseAstNodeFinder2);
|
|
176
|
+
return _createClass(FindValuesVisitor);
|
|
177
|
+
}(BaseAstNodeFinder);
|
|
178
|
+
/**
|
|
179
|
+
* Visitor that finds membersOf function arguments matching a specific team ID.
|
|
180
|
+
* Used for queries like "assignee in membersOf("id: <uuid>")".
|
|
181
|
+
*/
|
|
182
|
+
var FindMembersOfArgumentsVisitor = /*#__PURE__*/function (_BaseAstNodeFinder3) {
|
|
183
|
+
function FindMembersOfArgumentsVisitor(teamId) {
|
|
184
|
+
var _this3;
|
|
185
|
+
_classCallCheck(this, FindMembersOfArgumentsVisitor);
|
|
186
|
+
_this3 = _callSuper(this, FindMembersOfArgumentsVisitor);
|
|
187
|
+
_defineProperty(_this3, "visitTerminalClause", function (terminalClause) {
|
|
188
|
+
if (terminalClause.operand === undefined) {
|
|
189
|
+
return [];
|
|
190
|
+
}
|
|
191
|
+
return terminalClause.operand.accept(_this3);
|
|
192
|
+
});
|
|
193
|
+
_defineProperty(_this3, "visitFunctionOperand", function (functionOperand) {
|
|
194
|
+
var functionName = functionOperand.function.value.toLowerCase();
|
|
195
|
+
|
|
196
|
+
// Only process membersOf function
|
|
197
|
+
if (functionName !== 'membersof') {
|
|
198
|
+
return [];
|
|
199
|
+
}
|
|
200
|
+
var matchingArgs = [];
|
|
201
|
+
functionOperand.arguments.forEach(function (arg) {
|
|
202
|
+
// Normalize both values by removing extra whitespace for comparison
|
|
203
|
+
// This handles both "id: uuid" and "id:uuid" formats
|
|
204
|
+
var normalizedArgValue = _this3.normalizeValue(arg.value);
|
|
205
|
+
var normalizedTeamId = _this3.normalizeValue(_this3.teamId);
|
|
206
|
+
if (_this3.equalsIgnoreCase(normalizedArgValue, normalizedTeamId)) {
|
|
207
|
+
matchingArgs.push(arg);
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
return matchingArgs;
|
|
211
|
+
});
|
|
212
|
+
_this3.teamId = teamId;
|
|
213
|
+
return _this3;
|
|
214
|
+
}
|
|
215
|
+
_inherits(FindMembersOfArgumentsVisitor, _BaseAstNodeFinder3);
|
|
216
|
+
return _createClass(FindMembersOfArgumentsVisitor, [{
|
|
217
|
+
key: "normalizeValue",
|
|
218
|
+
value:
|
|
219
|
+
/**
|
|
220
|
+
* Normalize value by removing extra whitespace around colons and trimming.
|
|
221
|
+
* This handles variations like "id: uuid" vs "id:uuid" vs "id: uuid".
|
|
222
|
+
*/
|
|
223
|
+
function normalizeValue(value) {
|
|
224
|
+
return value.replace(/\s*:\s*/g, ':').trim();
|
|
225
|
+
}
|
|
226
|
+
}]);
|
|
227
|
+
}(BaseAstNodeFinder);
|
|
@@ -7,6 +7,7 @@ import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
|
7
7
|
function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
|
|
8
8
|
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
|
|
9
9
|
import { AbstractJastVisitor } from '@atlaskit/jql-ast';
|
|
10
|
+
import { fg } from '@atlaskit/platform-feature-flags';
|
|
10
11
|
|
|
11
12
|
/**
|
|
12
13
|
* Given an AST with parse errors, this visitor returns a valid query that is equivalent for hydration purposes
|
|
@@ -25,10 +26,10 @@ export var ValidQueryVisitor = /*#__PURE__*/function (_AbstractJastVisitor) {
|
|
|
25
26
|
function ValidQueryVisitor() {
|
|
26
27
|
var _this;
|
|
27
28
|
_classCallCheck(this, ValidQueryVisitor);
|
|
28
|
-
for (var _len = arguments.length,
|
|
29
|
-
|
|
29
|
+
for (var _len = arguments.length, _args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
30
|
+
_args[_key] = arguments[_key];
|
|
30
31
|
}
|
|
31
|
-
_this = _callSuper(this, ValidQueryVisitor, [].concat(
|
|
32
|
+
_this = _callSuper(this, ValidQueryVisitor, [].concat(_args));
|
|
32
33
|
_defineProperty(_this, "visitQuery", function (query) {
|
|
33
34
|
if (!query.where) {
|
|
34
35
|
return '';
|
|
@@ -68,6 +69,18 @@ export var ValidQueryVisitor = /*#__PURE__*/function (_AbstractJastVisitor) {
|
|
|
68
69
|
return !!value;
|
|
69
70
|
}).join(', '), ")");
|
|
70
71
|
});
|
|
72
|
+
_defineProperty(_this, "visitFunctionOperand", function (functionOperand) {
|
|
73
|
+
// Only include membersOf function as it has arguments that need hydration
|
|
74
|
+
// Other functions like currentUser() don't have hydratable arguments
|
|
75
|
+
var functionName = functionOperand.function.value.toLowerCase();
|
|
76
|
+
if (functionName !== 'membersof' || !fg('jira_update_jql_membersof_teams')) {
|
|
77
|
+
return '';
|
|
78
|
+
}
|
|
79
|
+
var args = functionOperand.arguments.map(function (arg) {
|
|
80
|
+
return arg.text;
|
|
81
|
+
}).join(', ');
|
|
82
|
+
return "".concat(functionOperand.function.text, "(").concat(args, ")");
|
|
83
|
+
});
|
|
71
84
|
return _this;
|
|
72
85
|
}
|
|
73
86
|
_inherits(ValidQueryVisitor, _AbstractJastVisitor);
|
|
@@ -87,7 +87,9 @@ var JQLEditorReadOnlyWithoutTheme = function JQLEditorReadOnlyWithoutTheme(_ref)
|
|
|
87
87
|
// Therefore the autocomplete combobox is never shown to the users
|
|
88
88
|
,
|
|
89
89
|
"aria-expanded": false,
|
|
90
|
-
"aria-controls": "dummy-jql-editor-auto-complete-id"
|
|
90
|
+
"aria-controls": "dummy-jql-editor-auto-complete-id"
|
|
91
|
+
// eslint-disable-next-line @atlassian/i18n/no-literal-string-in-jsx
|
|
92
|
+
,
|
|
91
93
|
"aria-label": "JQL query",
|
|
92
94
|
defaultRows: defaultRows
|
|
93
95
|
}, blocks.map(function (block, index) {
|
|
@@ -7,5 +7,5 @@ type Props = {
|
|
|
7
7
|
onClick: (option: SelectableAutocompleteOption, analyticsAttributes: AutocompleteAnalyticsAttributes) => void;
|
|
8
8
|
options: SelectableAutocompleteOption[];
|
|
9
9
|
};
|
|
10
|
-
declare const AutocompleteDropdown: ({ options, loading, keymap, onClick }: Props) => React.JSX.Element | null;
|
|
10
|
+
declare const AutocompleteDropdown: ({ options, loading, keymap, onClick, }: Props) => React.JSX.Element | null;
|
|
11
11
|
export default AutocompleteDropdown;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AbstractJastVisitor, type CompoundClause, type ListOperand, type NotClause, type Query, type TerminalClause, type ValueOperand } from '@atlaskit/jql-ast';
|
|
1
|
+
import { AbstractJastVisitor, type CompoundClause, type FunctionOperand, type ListOperand, type NotClause, type Query, type TerminalClause, type ValueOperand } from '@atlaskit/jql-ast';
|
|
2
2
|
/**
|
|
3
3
|
* Given an AST with parse errors, this visitor returns a valid query that is equivalent for hydration purposes
|
|
4
4
|
* (i.e. just fields, operators and values). Resulting query is generated on a best-effort basis and depends on
|
|
@@ -19,5 +19,6 @@ export declare class ValidQueryVisitor extends AbstractJastVisitor<string> {
|
|
|
19
19
|
visitNotClause: (notClause: NotClause) => string;
|
|
20
20
|
visitValueOperand: (valueOperand: ValueOperand) => string;
|
|
21
21
|
visitListOperand: (listOperand: ListOperand) => string;
|
|
22
|
+
visitFunctionOperand: (functionOperand: FunctionOperand) => string;
|
|
22
23
|
protected defaultResult(): string;
|
|
23
24
|
}
|
package/dist/types/ui/index.d.ts
CHANGED
|
@@ -6,5 +6,5 @@ type Props = {
|
|
|
6
6
|
label: string;
|
|
7
7
|
onClick: () => void;
|
|
8
8
|
};
|
|
9
|
-
export declare const BaseExpandToggle: ({ expanded, editorId, isDisabled, label, onClick }: Props) => React.JSX.Element;
|
|
9
|
+
export declare const BaseExpandToggle: ({ expanded, editorId, isDisabled, label, onClick, }: Props) => React.JSX.Element;
|
|
10
10
|
export {};
|
|
@@ -5,5 +5,5 @@ type Props = {
|
|
|
5
5
|
label: string;
|
|
6
6
|
onSearch: () => void;
|
|
7
7
|
};
|
|
8
|
-
export declare const BaseSearch: ({ isDisabled, isSearching, label, onSearch }: Props) => React.JSX.Element;
|
|
8
|
+
export declare const BaseSearch: ({ isDisabled, isSearching, label, onSearch, }: Props) => React.JSX.Element;
|
|
9
9
|
export {};
|
|
@@ -5,5 +5,5 @@ type Props = {
|
|
|
5
5
|
label: string;
|
|
6
6
|
onClick: (e: MouseEvent<HTMLElement>) => void;
|
|
7
7
|
};
|
|
8
|
-
export declare const BaseSyntaxHelp: ({ describedby, isDisabled, label, onClick }: Props) => React.JSX.Element;
|
|
8
|
+
export declare const BaseSyntaxHelp: ({ describedby, isDisabled, label, onClick, }: Props) => React.JSX.Element;
|
|
9
9
|
export {};
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { type ExternalMessage } from '../../../../state/types';
|
|
3
|
-
export declare const MessageContainer: ({ children }: {
|
|
3
|
+
export declare const MessageContainer: ({ children, }: {
|
|
4
4
|
children: React.ReactNode;
|
|
5
5
|
}) => React.JSX.Element;
|
|
6
|
-
export declare const FormatMessages: ({ messages }: {
|
|
6
|
+
export declare const FormatMessages: ({ messages, }: {
|
|
7
7
|
messages: ExternalMessage[];
|
|
8
8
|
}) => React.JSX.Element | null;
|
|
9
9
|
/**
|
|
@@ -2,6 +2,6 @@ import React, { type ReactNode } from 'react';
|
|
|
2
2
|
/**
|
|
3
3
|
* Provides actions to manage portals via context and renders portalled components into the React tree.
|
|
4
4
|
*/
|
|
5
|
-
export declare const JQLEditorPortalRenderer: ({ children }: {
|
|
5
|
+
export declare const JQLEditorPortalRenderer: ({ children, }: {
|
|
6
6
|
children: ReactNode;
|
|
7
7
|
}) => React.JSX.Element;
|
|
@@ -7,5 +7,5 @@ type Props = {
|
|
|
7
7
|
onClick: (option: SelectableAutocompleteOption, analyticsAttributes: AutocompleteAnalyticsAttributes) => void;
|
|
8
8
|
options: SelectableAutocompleteOption[];
|
|
9
9
|
};
|
|
10
|
-
declare const AutocompleteDropdown: ({ options, loading, keymap, onClick }: Props) => React.JSX.Element | null;
|
|
10
|
+
declare const AutocompleteDropdown: ({ options, loading, keymap, onClick, }: Props) => React.JSX.Element | null;
|
|
11
11
|
export default AutocompleteDropdown;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AbstractJastVisitor, type CompoundClause, type ListOperand, type NotClause, type Query, type TerminalClause, type ValueOperand } from '@atlaskit/jql-ast';
|
|
1
|
+
import { AbstractJastVisitor, type CompoundClause, type FunctionOperand, type ListOperand, type NotClause, type Query, type TerminalClause, type ValueOperand } from '@atlaskit/jql-ast';
|
|
2
2
|
/**
|
|
3
3
|
* Given an AST with parse errors, this visitor returns a valid query that is equivalent for hydration purposes
|
|
4
4
|
* (i.e. just fields, operators and values). Resulting query is generated on a best-effort basis and depends on
|
|
@@ -19,5 +19,6 @@ export declare class ValidQueryVisitor extends AbstractJastVisitor<string> {
|
|
|
19
19
|
visitNotClause: (notClause: NotClause) => string;
|
|
20
20
|
visitValueOperand: (valueOperand: ValueOperand) => string;
|
|
21
21
|
visitListOperand: (listOperand: ListOperand) => string;
|
|
22
|
+
visitFunctionOperand: (functionOperand: FunctionOperand) => string;
|
|
22
23
|
protected defaultResult(): string;
|
|
23
24
|
}
|
|
@@ -6,5 +6,5 @@ type Props = {
|
|
|
6
6
|
label: string;
|
|
7
7
|
onClick: () => void;
|
|
8
8
|
};
|
|
9
|
-
export declare const BaseExpandToggle: ({ expanded, editorId, isDisabled, label, onClick }: Props) => React.JSX.Element;
|
|
9
|
+
export declare const BaseExpandToggle: ({ expanded, editorId, isDisabled, label, onClick, }: Props) => React.JSX.Element;
|
|
10
10
|
export {};
|
|
@@ -5,5 +5,5 @@ type Props = {
|
|
|
5
5
|
label: string;
|
|
6
6
|
onSearch: () => void;
|
|
7
7
|
};
|
|
8
|
-
export declare const BaseSearch: ({ isDisabled, isSearching, label, onSearch }: Props) => React.JSX.Element;
|
|
8
|
+
export declare const BaseSearch: ({ isDisabled, isSearching, label, onSearch, }: Props) => React.JSX.Element;
|
|
9
9
|
export {};
|
|
@@ -5,5 +5,5 @@ type Props = {
|
|
|
5
5
|
label: string;
|
|
6
6
|
onClick: (e: MouseEvent<HTMLElement>) => void;
|
|
7
7
|
};
|
|
8
|
-
export declare const BaseSyntaxHelp: ({ describedby, isDisabled, label, onClick }: Props) => React.JSX.Element;
|
|
8
|
+
export declare const BaseSyntaxHelp: ({ describedby, isDisabled, label, onClick, }: Props) => React.JSX.Element;
|
|
9
9
|
export {};
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { type ExternalMessage } from '../../../../state/types';
|
|
3
|
-
export declare const MessageContainer: ({ children }: {
|
|
3
|
+
export declare const MessageContainer: ({ children, }: {
|
|
4
4
|
children: React.ReactNode;
|
|
5
5
|
}) => React.JSX.Element;
|
|
6
|
-
export declare const FormatMessages: ({ messages }: {
|
|
6
|
+
export declare const FormatMessages: ({ messages, }: {
|
|
7
7
|
messages: ExternalMessage[];
|
|
8
8
|
}) => React.JSX.Element | null;
|
|
9
9
|
/**
|
|
@@ -2,6 +2,6 @@ import React, { type ReactNode } from 'react';
|
|
|
2
2
|
/**
|
|
3
3
|
* Provides actions to manage portals via context and renders portalled components into the React tree.
|
|
4
4
|
*/
|
|
5
|
-
export declare const JQLEditorPortalRenderer: ({ children }: {
|
|
5
|
+
export declare const JQLEditorPortalRenderer: ({ children, }: {
|
|
6
6
|
children: ReactNode;
|
|
7
7
|
}) => React.JSX.Element;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atlaskit/jql-editor",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.9.1",
|
|
4
4
|
"description": "This package allows consumers to render an advanced JQL editor component to enable autocomplete-assisted authoring and validation of JQL queries.",
|
|
5
5
|
"author": "Atlassian Pty Ltd",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -36,9 +36,9 @@
|
|
|
36
36
|
"@atlaskit/analytics-gas-types": "^5.1.0",
|
|
37
37
|
"@atlaskit/analytics-next": "^11.1.0",
|
|
38
38
|
"@atlaskit/avatar": "^25.5.0",
|
|
39
|
-
"@atlaskit/button": "^23.
|
|
39
|
+
"@atlaskit/button": "^23.7.0",
|
|
40
40
|
"@atlaskit/editor-prosemirror": "7.0.0",
|
|
41
|
-
"@atlaskit/form": "^14.
|
|
41
|
+
"@atlaskit/form": "^14.4.0",
|
|
42
42
|
"@atlaskit/icon": "^29.0.0",
|
|
43
43
|
"@atlaskit/jql-ast": "^3.3.0",
|
|
44
44
|
"@atlaskit/jql-autocomplete": "^2.0.0",
|
|
@@ -48,13 +48,13 @@
|
|
|
48
48
|
"@atlaskit/link": "^3.2.0",
|
|
49
49
|
"@atlaskit/platform-feature-flags": "^1.1.0",
|
|
50
50
|
"@atlaskit/popper": "^7.1.0",
|
|
51
|
-
"@atlaskit/primitives": "^16.
|
|
51
|
+
"@atlaskit/primitives": "^16.4.0",
|
|
52
52
|
"@atlaskit/prosemirror-history": "^0.2.0",
|
|
53
53
|
"@atlaskit/spinner": "^19.0.0",
|
|
54
54
|
"@atlaskit/teams-avatar": "^2.4.0",
|
|
55
55
|
"@atlaskit/theme": "^21.0.0",
|
|
56
|
-
"@atlaskit/tokens": "^8.
|
|
57
|
-
"@atlaskit/tooltip": "^20.
|
|
56
|
+
"@atlaskit/tokens": "^8.4.0",
|
|
57
|
+
"@atlaskit/tooltip": "^20.11.0",
|
|
58
58
|
"@babel/runtime": "^7.0.0",
|
|
59
59
|
"@emotion/react": "^11.7.1",
|
|
60
60
|
"@emotion/styled": "^11.0.0",
|
|
@@ -76,6 +76,7 @@
|
|
|
76
76
|
},
|
|
77
77
|
"devDependencies": {
|
|
78
78
|
"@af/integration-testing": "workspace:^",
|
|
79
|
+
"@af/visual-regression": "workspace:^",
|
|
79
80
|
"@atlaskit/docs": "^11.2.0",
|
|
80
81
|
"@atlaskit/jql-editor-autocomplete-rest": "^3.0.0",
|
|
81
82
|
"@atlassian/feature-flags-storybook-utils": "^0.3.0",
|
|
@@ -145,8 +146,14 @@
|
|
|
145
146
|
"jira_update_jql_teams": {
|
|
146
147
|
"type": "boolean"
|
|
147
148
|
},
|
|
149
|
+
"jira_update_jql_membersof_teams": {
|
|
150
|
+
"type": "boolean"
|
|
151
|
+
},
|
|
148
152
|
"list_lovability_improving_filters": {
|
|
149
153
|
"type": "boolean"
|
|
154
|
+
},
|
|
155
|
+
"jira_ai_agent_avatar_with_apptype_for_jql": {
|
|
156
|
+
"type": "boolean"
|
|
150
157
|
}
|
|
151
158
|
}
|
|
152
159
|
}
|