@atlaskit/jql-editor 5.12.8 → 5.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 +11 -0
- package/dist/cjs/analytics/util.js +1 -1
- package/dist/cjs/plugins/autocomplete/view.js +16 -1
- package/dist/cjs/plugins/rich-inline-nodes/nodes/base/index.compiled.css +3 -1
- package/dist/cjs/plugins/rich-inline-nodes/nodes/base/index.js +2 -2
- package/dist/cjs/plugins/rich-inline-nodes/nodes/index.js +3 -1
- package/dist/cjs/plugins/rich-inline-nodes/nodes/project/index.js +9 -65
- package/dist/cjs/plugins/rich-inline-nodes/nodes/project/{index.compiled.css → project-node.compiled.css} +2 -2
- package/dist/cjs/plugins/rich-inline-nodes/nodes/project/project-node.js +78 -0
- package/dist/cjs/plugins/rich-inline-nodes/util/replace-nodes-transaction.js +8 -1
- package/dist/cjs/state/index.js +40 -31
- package/dist/es2019/analytics/util.js +1 -1
- package/dist/es2019/plugins/autocomplete/view.js +16 -1
- package/dist/es2019/plugins/rich-inline-nodes/nodes/base/index.compiled.css +3 -1
- package/dist/es2019/plugins/rich-inline-nodes/nodes/base/index.js +2 -2
- package/dist/es2019/plugins/rich-inline-nodes/nodes/index.js +3 -1
- package/dist/es2019/plugins/rich-inline-nodes/nodes/project/index.js +8 -56
- package/dist/es2019/plugins/rich-inline-nodes/nodes/project/{index.compiled.css → project-node.compiled.css} +2 -2
- package/dist/es2019/plugins/rich-inline-nodes/nodes/project/project-node.js +63 -0
- package/dist/es2019/plugins/rich-inline-nodes/util/replace-nodes-transaction.js +9 -1
- package/dist/es2019/state/index.js +12 -2
- package/dist/esm/analytics/util.js +1 -1
- package/dist/esm/plugins/autocomplete/view.js +16 -1
- package/dist/esm/plugins/rich-inline-nodes/nodes/base/index.compiled.css +3 -1
- package/dist/esm/plugins/rich-inline-nodes/nodes/base/index.js +2 -2
- package/dist/esm/plugins/rich-inline-nodes/nodes/index.js +3 -1
- package/dist/esm/plugins/rich-inline-nodes/nodes/project/index.js +8 -59
- package/dist/esm/plugins/rich-inline-nodes/nodes/project/{index.compiled.css → project-node.compiled.css} +2 -2
- package/dist/esm/plugins/rich-inline-nodes/nodes/project/project-node.js +67 -0
- package/dist/esm/plugins/rich-inline-nodes/util/replace-nodes-transaction.js +8 -1
- package/dist/esm/state/index.js +39 -30
- package/dist/types/index.d.ts +1 -1
- package/dist/types/plugins/rich-inline-nodes/nodes/index.d.ts +1 -0
- package/dist/types/plugins/rich-inline-nodes/nodes/project/index.d.ts +3 -10
- package/dist/types/plugins/rich-inline-nodes/nodes/project/project-node.d.ts +10 -0
- package/dist/types/plugins/rich-inline-nodes/nodes/project/types.d.ts +6 -4
- package/dist/types/state/index.d.ts +36 -1
- package/dist/types/types.d.ts +1 -1
- package/dist/types/ui/jql-editor/types.d.ts +9 -2
- package/dist/types/ui/types.d.ts +1 -1
- package/dist/types-ts4.5/index.d.ts +1 -1
- package/dist/types-ts4.5/plugins/rich-inline-nodes/nodes/index.d.ts +1 -0
- package/dist/types-ts4.5/plugins/rich-inline-nodes/nodes/project/index.d.ts +3 -10
- package/dist/types-ts4.5/plugins/rich-inline-nodes/nodes/project/project-node.d.ts +10 -0
- package/dist/types-ts4.5/plugins/rich-inline-nodes/nodes/project/types.d.ts +6 -4
- package/dist/types-ts4.5/state/index.d.ts +36 -1
- package/dist/types-ts4.5/types.d.ts +1 -1
- package/dist/types-ts4.5/ui/jql-editor/types.d.ts +9 -2
- package/dist/types-ts4.5/ui/types.d.ts +1 -1
- package/package.json +6 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# @atlaskit/jql-editor
|
|
2
2
|
|
|
3
|
+
## 5.13.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [`daf5c2659939b`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/daf5c2659939b) -
|
|
8
|
+
[ux] Added Project (Atlas) node to the JQL Editor
|
|
9
|
+
|
|
10
|
+
### Patch Changes
|
|
11
|
+
|
|
12
|
+
- Updated dependencies
|
|
13
|
+
|
|
3
14
|
## 5.12.8
|
|
4
15
|
|
|
5
16
|
### 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.12.8", _jqlEditorCommon.ANALYTICS_CHANNEL);
|
|
10
10
|
};
|
|
@@ -62,7 +62,7 @@ var AutocompletePluginView = exports.default = /*#__PURE__*/function (_ReactPlug
|
|
|
62
62
|
if (_this.enableRichInlineNodes && option.type === 'value' && option.valueType === 'user') {
|
|
63
63
|
transaction.setMeta('hydrate', true);
|
|
64
64
|
}
|
|
65
|
-
if (_this.enableRichInlineNodes && option.type === 'value' && option.valueType === 'team' && (0, _platformFeatureFlags.fg)('jira_update_jql_teams')) {
|
|
65
|
+
if (_this.enableRichInlineNodes && option.type === 'value' && (option.valueType === 'team' && (0, _platformFeatureFlags.fg)('jira_update_jql_teams') || option.valueType === 'project' && (0, _platformFeatureFlags.fg)('projects_in_jira_eap_drop2'))) {
|
|
66
66
|
transaction.setMeta('hydrate', true);
|
|
67
67
|
}
|
|
68
68
|
var documentFrom = (0, _getDocumentPosition.default)(transaction.doc, from);
|
|
@@ -117,6 +117,21 @@ var AutocompletePluginView = exports.default = /*#__PURE__*/function (_ReactPlug
|
|
|
117
117
|
}
|
|
118
118
|
break;
|
|
119
119
|
}
|
|
120
|
+
case 'project':
|
|
121
|
+
{
|
|
122
|
+
if ((0, _platformFeatureFlags.fg)('projects_in_jira_eap_drop2')) {
|
|
123
|
+
var _attributes2 = {
|
|
124
|
+
type: 'project',
|
|
125
|
+
id: value,
|
|
126
|
+
name: nameOnRichInlineNode !== null && nameOnRichInlineNode !== void 0 ? nameOnRichInlineNode : name,
|
|
127
|
+
fieldName: context === null || context === void 0 ? void 0 : context.field
|
|
128
|
+
};
|
|
129
|
+
nodes.push(_this.view.state.schema.nodes.project.create(_attributes2, textContent));
|
|
130
|
+
} else {
|
|
131
|
+
nodes.push(textContent);
|
|
132
|
+
}
|
|
133
|
+
break;
|
|
134
|
+
}
|
|
120
135
|
default:
|
|
121
136
|
{
|
|
122
137
|
nodes.push(textContent);
|
|
@@ -2,10 +2,11 @@
|
|
|
2
2
|
._2rko12b0{border-radius:var(--ds-radius-small,4px)}
|
|
3
3
|
._1h6dq98m{border-color:var(--ds-border-selected,#1868db)}
|
|
4
4
|
._1rjcidpf{padding-block:0}
|
|
5
|
+
._1e0c116y{display:inline-flex}
|
|
5
6
|
._1e0c1txw{display:flex}
|
|
6
7
|
._1hms8stv{text-decoration-line:underline}
|
|
7
8
|
._1kegt94y{text-decoration-thickness:1px}
|
|
8
|
-
.
|
|
9
|
+
._1wpz1q9y{align-self:baseline}
|
|
9
10
|
._4bfu1r31{text-decoration-color:currentColor}
|
|
10
11
|
._4bfu1tmw{text-decoration-color:var(--ds-text-danger,#ae2e24)}
|
|
11
12
|
._4cvr1h6o{align-items:center}
|
|
@@ -17,6 +18,7 @@
|
|
|
17
18
|
._bfhki8nm{background-color:var(--ds-background-neutral,#0515240f)}
|
|
18
19
|
._bozgv77o{padding-inline-start:var(--ds-space-025,2px)}
|
|
19
20
|
._ect4zzfg{font-family:var(--ds-font-family-code,"Atlassian Mono",ui-monospace,Menlo,"Segoe UI Mono","Ubuntu Mono",monospace)}
|
|
21
|
+
._s7n4z0dk{vertical-align:text-top}
|
|
20
22
|
._tdi7glyw{-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}
|
|
21
23
|
._y4ti1b66{padding-inline-end:var(--ds-space-050,4px)}
|
|
22
24
|
._irr31yvi:hover{background-color:var(--ds-background-danger-hovered,#ffd5d2)}
|
|
@@ -13,12 +13,12 @@ var _css = require("@atlaskit/css");
|
|
|
13
13
|
var _lockLocked = _interopRequireDefault(require("@atlaskit/icon/core/lock-locked"));
|
|
14
14
|
var _compiled = require("@atlaskit/primitives/compiled");
|
|
15
15
|
var styles = {
|
|
16
|
-
nodeWrapper: "_19it145i _2rko12b0 _1rjcidpf
|
|
16
|
+
nodeWrapper: "_19it145i _2rko12b0 _1rjcidpf _1e0c116y _s7n4z0dk _4cvr1h6o _1wpz1q9y _bfhki8nm _4t3igktf _bozgv77o _y4ti1b66 _irr3plhp",
|
|
17
17
|
nodeWrapperSelected: "_1h6dq98m _bfhk15s3 _irr3ufnl",
|
|
18
18
|
nodeWrapperError: "_4bfu1r31 _1hms8stv _ajmm1khm _1kegt94y _tdi7glyw _4bfu1tmw",
|
|
19
19
|
nodeWrapperErrorSelected: "_bfhk1gly _irr31yvi",
|
|
20
20
|
textWrapper: "_ect4zzfg",
|
|
21
|
-
iconBeforeWrapper: "_1e0c1txw _4t3i7vkz _4cvr1h6o
|
|
21
|
+
iconBeforeWrapper: "_1e0c1txw _4t3i7vkz _4cvr1h6o",
|
|
22
22
|
iconAfterWrapper: ""
|
|
23
23
|
};
|
|
24
24
|
|
|
@@ -4,9 +4,11 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.richInlineNodes = void 0;
|
|
7
|
+
var _project = require("./project");
|
|
7
8
|
var _team = require("./team");
|
|
8
9
|
var _user = require("./user");
|
|
9
10
|
var richInlineNodes = exports.richInlineNodes = {
|
|
10
11
|
user: _user.user,
|
|
11
|
-
team: _team.team
|
|
12
|
+
team: _team.team,
|
|
13
|
+
project: _project.project
|
|
12
14
|
};
|
|
@@ -1,71 +1,15 @@
|
|
|
1
|
-
/* index.tsx generated by @compiled/babel-plugin v0.38.1 */
|
|
2
1
|
"use strict";
|
|
3
2
|
|
|
4
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
5
3
|
Object.defineProperty(exports, "__esModule", {
|
|
6
4
|
value: true
|
|
7
5
|
});
|
|
8
|
-
exports.
|
|
9
|
-
require("./
|
|
10
|
-
var
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
var _project = _interopRequireDefault(require("@atlaskit/icon/core/project"));
|
|
18
|
-
var _compiled = require("@atlaskit/primitives/compiled");
|
|
19
|
-
var _state = require("../../../../state");
|
|
20
|
-
var _base = require("../base");
|
|
21
|
-
var _messages = require("./messages");
|
|
22
|
-
var _excluded = ["emojiName", "isRestricted", "text"];
|
|
23
|
-
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" != (0, _typeof2.default)(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); }
|
|
24
|
-
var styles = {
|
|
25
|
-
emojiWrapper: "_1e0c1txw _4t3i7vkz _4cvr1h6o _1pfh1i6y",
|
|
26
|
-
projectIconWrapper: "_ca0qv77o _u5f3v77o _n3tdv77o _19bvv77o"
|
|
27
|
-
};
|
|
28
|
-
var getTownsquareEmojiProvider = function getTownsquareEmojiProvider() {
|
|
29
|
-
// Dynamically import the emoji provider to prevent an unnecessary network call from being made on module import
|
|
30
|
-
return Promise.resolve().then(function () {
|
|
31
|
-
return _interopRequireWildcard(require( /* webpackChunkName: "@atlaskit-internal_@atlaskit/jql-editor/plugins/rich-inline-nodes/nodes/base" */'@atlaskit/townsquare-emoji-provider'));
|
|
32
|
-
}).then(function (mod) {
|
|
33
|
-
return mod.emojiProvider;
|
|
34
|
-
});
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* ProjectNode Component
|
|
39
|
-
*
|
|
40
|
-
* This component is a component for rendering a pill-like view for Project (Atlas) node type
|
|
41
|
-
* in the JQL editor
|
|
42
|
-
*/
|
|
43
|
-
var ProjectNode = exports.ProjectNode = function ProjectNode(props) {
|
|
44
|
-
var emojiName = props.emojiName,
|
|
45
|
-
isRestricted = props.isRestricted,
|
|
46
|
-
text = props.text,
|
|
47
|
-
rest = (0, _objectWithoutProperties2.default)(props, _excluded);
|
|
48
|
-
var _useIntl = (0, _state.useIntl)(),
|
|
49
|
-
_useIntl2 = (0, _slicedToArray2.default)(_useIntl, 1),
|
|
50
|
-
formatMessage = _useIntl2[0].formatMessage;
|
|
51
|
-
var townsquareEmojiProvider = getTownsquareEmojiProvider();
|
|
52
|
-
return /*#__PURE__*/_react.default.createElement(_base.NodeBase, (0, _extends2.default)({
|
|
53
|
-
iconBefore: emojiName ? /*#__PURE__*/_react.default.createElement(_compiled.Box, {
|
|
54
|
-
xcss: styles.emojiWrapper
|
|
55
|
-
}, /*#__PURE__*/_react.default.createElement(_emoji.ResourcedEmoji, {
|
|
56
|
-
emojiProvider: townsquareEmojiProvider,
|
|
57
|
-
emojiId: {
|
|
58
|
-
shortName: emojiName
|
|
59
|
-
},
|
|
60
|
-
fitToHeight: 16
|
|
61
|
-
})) : /*#__PURE__*/_react.default.createElement(_compiled.Box, {
|
|
62
|
-
xcss: styles.projectIconWrapper
|
|
63
|
-
}, /*#__PURE__*/_react.default.createElement(_project.default, {
|
|
64
|
-
size: "small",
|
|
65
|
-
label: ""
|
|
66
|
-
})),
|
|
67
|
-
text: isRestricted ? formatMessage(_messages.messages.restrictedProject) : text
|
|
68
|
-
}, rest, {
|
|
69
|
-
isLocked: isRestricted
|
|
70
|
-
}));
|
|
6
|
+
exports.project = void 0;
|
|
7
|
+
var _projectNode = require("./project-node");
|
|
8
|
+
var project = exports.project = {
|
|
9
|
+
component: _projectNode.ProjectNode,
|
|
10
|
+
attrs: {
|
|
11
|
+
id: {},
|
|
12
|
+
name: {},
|
|
13
|
+
fieldName: {}
|
|
14
|
+
}
|
|
71
15
|
};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
+
._154i1i6y{top:var(--ds-space-negative-025,-2px)}
|
|
1
2
|
._19bvv77o{padding-left:var(--ds-space-025,2px)}
|
|
2
3
|
._1e0c1txw{display:flex}
|
|
3
|
-
._1pfh1i6y{margin-block-start:var(--ds-space-negative-025,-2px)}
|
|
4
|
-
._4cvr1h6o{align-items:center}
|
|
5
4
|
._4t3i7vkz{height:1pc}
|
|
6
5
|
._ca0qv77o{padding-top:var(--ds-space-025,2px)}
|
|
6
|
+
._kqswh2mm{position:relative}
|
|
7
7
|
._n3tdv77o{padding-bottom:var(--ds-space-025,2px)}
|
|
8
8
|
._u5f3v77o{padding-right:var(--ds-space-025,2px)}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/* project-node.tsx generated by @compiled/babel-plugin v0.38.1 */
|
|
2
|
+
"use strict";
|
|
3
|
+
|
|
4
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.ProjectNode = void 0;
|
|
9
|
+
require("./project-node.compiled.css");
|
|
10
|
+
var _runtime = require("@compiled/react/runtime");
|
|
11
|
+
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
|
|
12
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
13
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
14
|
+
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
|
|
15
|
+
var _react = _interopRequireDefault(require("react"));
|
|
16
|
+
var _reactIntlNext = require("react-intl-next");
|
|
17
|
+
var _emoji = require("@atlaskit/emoji");
|
|
18
|
+
var _project = _interopRequireDefault(require("@atlaskit/icon/core/project"));
|
|
19
|
+
var _compiled = require("@atlaskit/primitives/compiled");
|
|
20
|
+
var _state = require("../../../../state");
|
|
21
|
+
var _base = require("../base");
|
|
22
|
+
var _messages = require("./messages");
|
|
23
|
+
var _excluded = ["id", "fieldName", "name", "privateProject"];
|
|
24
|
+
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" != (0, _typeof2.default)(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); }
|
|
25
|
+
var styles = {
|
|
26
|
+
emojiWrapper: "_1e0c1txw _4t3i7vkz _kqswh2mm _154i1i6y",
|
|
27
|
+
projectIconWrapper: "_ca0qv77o _u5f3v77o _n3tdv77o _19bvv77o"
|
|
28
|
+
};
|
|
29
|
+
var getTownsquareEmojiProvider = function getTownsquareEmojiProvider() {
|
|
30
|
+
// Dynamically import the emoji provider to prevent an unnecessary network call from being made on module import
|
|
31
|
+
return Promise.resolve().then(function () {
|
|
32
|
+
return _interopRequireWildcard(require( /* webpackChunkName: "@atlaskit-internal_@atlaskit/jql-editor/plugins/rich-inline-nodes/nodes/base" */'@atlaskit/townsquare-emoji-provider'));
|
|
33
|
+
}).then(function (mod) {
|
|
34
|
+
return mod.emojiProvider;
|
|
35
|
+
});
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* ProjectNode Component
|
|
40
|
+
*
|
|
41
|
+
* This component is a component for rendering a pill-like view for Project (Atlas) node type
|
|
42
|
+
* in the JQL editor
|
|
43
|
+
*/
|
|
44
|
+
var ProjectNode = exports.ProjectNode = function ProjectNode(props) {
|
|
45
|
+
var id = props.id,
|
|
46
|
+
fieldName = props.fieldName,
|
|
47
|
+
name = props.name,
|
|
48
|
+
privateProject = props.privateProject,
|
|
49
|
+
rest = (0, _objectWithoutProperties2.default)(props, _excluded);
|
|
50
|
+
var _useIntl = (0, _reactIntlNext.useIntl)(),
|
|
51
|
+
formatMessage = _useIntl.formatMessage;
|
|
52
|
+
var _useHydratedProject = (0, _state.useHydratedProject)({
|
|
53
|
+
id: id,
|
|
54
|
+
fieldName: fieldName
|
|
55
|
+
}),
|
|
56
|
+
_useHydratedProject2 = (0, _slicedToArray2.default)(_useHydratedProject, 1),
|
|
57
|
+
project = _useHydratedProject2[0];
|
|
58
|
+
var townsquareEmojiProvider = getTownsquareEmojiProvider();
|
|
59
|
+
return /*#__PURE__*/_react.default.createElement(_base.NodeBase, (0, _extends2.default)({
|
|
60
|
+
iconBefore: project !== null && project !== void 0 && project.iconName ? /*#__PURE__*/_react.default.createElement(_compiled.Box, {
|
|
61
|
+
xcss: styles.emojiWrapper
|
|
62
|
+
}, /*#__PURE__*/_react.default.createElement(_emoji.ResourcedEmoji, {
|
|
63
|
+
emojiProvider: townsquareEmojiProvider,
|
|
64
|
+
emojiId: {
|
|
65
|
+
shortName: project.iconName
|
|
66
|
+
},
|
|
67
|
+
fitToHeight: 16
|
|
68
|
+
})) : /*#__PURE__*/_react.default.createElement(_compiled.Box, {
|
|
69
|
+
xcss: styles.projectIconWrapper
|
|
70
|
+
}, /*#__PURE__*/_react.default.createElement(_project.default, {
|
|
71
|
+
size: "small",
|
|
72
|
+
label: ""
|
|
73
|
+
})),
|
|
74
|
+
text: privateProject || project !== null && project !== void 0 && project.privateProject ? formatMessage(_messages.messages.restrictedProject) : name
|
|
75
|
+
}, rest, {
|
|
76
|
+
isLocked: project === null || project === void 0 ? void 0 : project.privateProject
|
|
77
|
+
}));
|
|
78
|
+
};
|
|
@@ -33,7 +33,7 @@ var replaceRichInlineNodes = exports.replaceRichInlineNodes = function replaceRi
|
|
|
33
33
|
fieldName = _ref2[0],
|
|
34
34
|
values = _ref2[1];
|
|
35
35
|
values.forEach(function (value) {
|
|
36
|
-
if (value.type === 'user' || value.type === 'team' && (0, _platformFeatureFlags.fg)('jira_update_jql_teams')) {
|
|
36
|
+
if (value.type === 'user' || value.type === 'team' && (0, _platformFeatureFlags.fg)('jira_update_jql_teams') || value.type === 'project' && (0, _platformFeatureFlags.fg)('projects_in_jira_eap_drop2')) {
|
|
37
37
|
// First try to find as direct value operand (e.g., Team[Team] = uuid)
|
|
38
38
|
var astNodes = getValueNodes(ast, fieldName, value.id);
|
|
39
39
|
|
|
@@ -75,6 +75,13 @@ var getRichInlineNode = function getRichInlineNode(fieldName, value, text) {
|
|
|
75
75
|
fieldName: fieldName
|
|
76
76
|
}), _textContent);
|
|
77
77
|
}
|
|
78
|
+
case 'project':
|
|
79
|
+
{
|
|
80
|
+
var _textContent2 = _schema.JQLEditorSchema.text(text);
|
|
81
|
+
return _schema.JQLEditorSchema.nodes.project.create(_objectSpread(_objectSpread({}, value), {}, {
|
|
82
|
+
fieldName: fieldName
|
|
83
|
+
}), _textContent2);
|
|
84
|
+
}
|
|
78
85
|
default:
|
|
79
86
|
{
|
|
80
87
|
throw new Error("Unsupported hydrated value type ".concat(value.type));
|
package/dist/cjs/state/index.js
CHANGED
|
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
4
4
|
Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
|
-
exports.useStoreActions = exports.useScopedId = exports.useRichInlineNodesEnabled = exports.useOnSyntaxHelp = exports.useLineNumbersVisible = exports.useJqlError = exports.useIsSearching = exports.useIntl = exports.useIdPrefix = exports.useHydratedValue = exports.useHydratedUser = exports.useHydratedTeam = exports.useHydratedDeprecations = exports.useExternalMessages = exports.useEditorViewHasFocus = exports.useEditorView = exports.useEditorStateHasJqlError = exports.useEditorState = exports.useCustomErrorComponent = exports.useAutocompleteProvider = exports.useAutocompletePosition = exports.useAutocompleteOptions = exports.useAutocompleteLoading = exports.useAutocompleteIsOpen = exports.useAutocomplete = exports.initialState = exports.actions = exports.EditorStateContainer = void 0;
|
|
7
|
+
exports.useStoreActions = exports.useScopedId = exports.useRichInlineNodesEnabled = exports.useOnSyntaxHelp = exports.useLineNumbersVisible = exports.useJqlError = exports.useIsSearching = exports.useIntl = exports.useIdPrefix = exports.useHydratedValue = exports.useHydratedUser = exports.useHydratedTeam = exports.useHydratedProject = exports.useHydratedDeprecations = exports.useExternalMessages = exports.useEditorViewHasFocus = exports.useEditorView = exports.useEditorStateHasJqlError = exports.useEditorState = exports.useCustomErrorComponent = exports.useAutocompleteProvider = exports.useAutocompletePosition = exports.useAutocompleteOptions = exports.useAutocompleteLoading = exports.useAutocompleteIsOpen = exports.useAutocomplete = exports.initialState = exports.actions = exports.EditorStateContainer = void 0;
|
|
8
8
|
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
9
9
|
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
10
10
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
@@ -918,16 +918,25 @@ var useHydratedTeam = exports.useHydratedTeam = (0, _reactSweetState.createHook)
|
|
|
918
918
|
return team && team.type === 'team' ? team : undefined;
|
|
919
919
|
}
|
|
920
920
|
});
|
|
921
|
+
var useHydratedProject = exports.useHydratedProject = (0, _reactSweetState.createHook)(Store, {
|
|
922
|
+
selector: function selector(state, _ref41) {
|
|
923
|
+
var _state$hydratedValues4;
|
|
924
|
+
var id = _ref41.id,
|
|
925
|
+
fieldName = _ref41.fieldName;
|
|
926
|
+
var project = (_state$hydratedValues4 = state.hydratedValues[fieldName]) === null || _state$hydratedValues4 === void 0 ? void 0 : _state$hydratedValues4.get(id);
|
|
927
|
+
return project && project.type === 'project' ? project : undefined;
|
|
928
|
+
}
|
|
929
|
+
});
|
|
921
930
|
var useHydratedDeprecations = exports.useHydratedDeprecations = (0, _reactSweetState.createHook)(Store, {
|
|
922
931
|
selector: function selector(state) {
|
|
923
932
|
var ast = (0, _jqlAst2.getJastFromState)(state.editorState);
|
|
924
933
|
var fieldsInQuery = (0, _util.getFieldNodes)(ast);
|
|
925
934
|
var toReturn = [];
|
|
926
|
-
Object.entries(state.hydratedValues).forEach(function (
|
|
927
|
-
var _state$
|
|
928
|
-
var
|
|
929
|
-
fieldName =
|
|
930
|
-
(_state$
|
|
935
|
+
Object.entries(state.hydratedValues).forEach(function (_ref42) {
|
|
936
|
+
var _state$hydratedValues5;
|
|
937
|
+
var _ref43 = (0, _slicedToArray2.default)(_ref42, 1),
|
|
938
|
+
fieldName = _ref43[0];
|
|
939
|
+
(_state$hydratedValues5 = state.hydratedValues[fieldName]) === null || _state$hydratedValues5 === void 0 || _state$hydratedValues5.forEach(function (value) {
|
|
931
940
|
if (value.type === 'deprecated-field') {
|
|
932
941
|
if (fieldsInQuery.has(value.id.toLowerCase())) {
|
|
933
942
|
toReturn.push(value);
|
|
@@ -950,19 +959,19 @@ var useOnSyntaxHelp = exports.useOnSyntaxHelp = (0, _reactSweetState.createHook)
|
|
|
950
959
|
});
|
|
951
960
|
var EditorStateContainer = exports.EditorStateContainer = (0, _reactSweetState.createContainer)(Store, {
|
|
952
961
|
onInit: function onInit() {
|
|
953
|
-
return function (
|
|
954
|
-
var getState =
|
|
955
|
-
setState =
|
|
956
|
-
dispatch =
|
|
957
|
-
var intlRef =
|
|
958
|
-
query =
|
|
959
|
-
isSearching =
|
|
960
|
-
autocompleteProvider =
|
|
961
|
-
externalMessages =
|
|
962
|
-
enableRichInlineNodes =
|
|
963
|
-
onDebugUnsafeMessage =
|
|
964
|
-
onSyntaxHelp =
|
|
965
|
-
customComponents =
|
|
962
|
+
return function (_ref44, _ref45) {
|
|
963
|
+
var getState = _ref44.getState,
|
|
964
|
+
setState = _ref44.setState,
|
|
965
|
+
dispatch = _ref44.dispatch;
|
|
966
|
+
var intlRef = _ref45.intlRef,
|
|
967
|
+
query = _ref45.query,
|
|
968
|
+
isSearching = _ref45.isSearching,
|
|
969
|
+
autocompleteProvider = _ref45.autocompleteProvider,
|
|
970
|
+
externalMessages = _ref45.externalMessages,
|
|
971
|
+
enableRichInlineNodes = _ref45.enableRichInlineNodes,
|
|
972
|
+
onDebugUnsafeMessage = _ref45.onDebugUnsafeMessage,
|
|
973
|
+
onSyntaxHelp = _ref45.onSyntaxHelp,
|
|
974
|
+
customComponents = _ref45.customComponents;
|
|
966
975
|
setState({
|
|
967
976
|
controlledQuery: query,
|
|
968
977
|
query: query,
|
|
@@ -991,18 +1000,18 @@ var EditorStateContainer = exports.EditorStateContainer = (0, _reactSweetState.c
|
|
|
991
1000
|
};
|
|
992
1001
|
},
|
|
993
1002
|
onUpdate: function onUpdate() {
|
|
994
|
-
return function (
|
|
995
|
-
var getState =
|
|
996
|
-
setState =
|
|
997
|
-
dispatch =
|
|
998
|
-
var controlledQueryProp =
|
|
999
|
-
isSearching =
|
|
1000
|
-
autocompleteProvider =
|
|
1001
|
-
externalMessages =
|
|
1002
|
-
enableRichInlineNodes =
|
|
1003
|
-
onDebugUnsafeMessage =
|
|
1004
|
-
onSyntaxHelp =
|
|
1005
|
-
customComponents =
|
|
1003
|
+
return function (_ref46, _ref47) {
|
|
1004
|
+
var getState = _ref46.getState,
|
|
1005
|
+
setState = _ref46.setState,
|
|
1006
|
+
dispatch = _ref46.dispatch;
|
|
1007
|
+
var controlledQueryProp = _ref47.query,
|
|
1008
|
+
isSearching = _ref47.isSearching,
|
|
1009
|
+
autocompleteProvider = _ref47.autocompleteProvider,
|
|
1010
|
+
externalMessages = _ref47.externalMessages,
|
|
1011
|
+
enableRichInlineNodes = _ref47.enableRichInlineNodes,
|
|
1012
|
+
onDebugUnsafeMessage = _ref47.onDebugUnsafeMessage,
|
|
1013
|
+
onSyntaxHelp = _ref47.onSyntaxHelp,
|
|
1014
|
+
customComponents = _ref47.customComponents;
|
|
1006
1015
|
var _getState12 = getState(),
|
|
1007
1016
|
controlledQuery = _getState12.controlledQuery,
|
|
1008
1017
|
query = _getState12.query;
|
|
@@ -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.12.8", ANALYTICS_CHANNEL);
|
|
4
4
|
};
|
|
@@ -45,7 +45,7 @@ export default class AutocompletePluginView extends ReactPluginView {
|
|
|
45
45
|
if (this.enableRichInlineNodes && option.type === 'value' && option.valueType === 'user') {
|
|
46
46
|
transaction.setMeta('hydrate', true);
|
|
47
47
|
}
|
|
48
|
-
if (this.enableRichInlineNodes && option.type === 'value' && option.valueType === 'team' && fg('jira_update_jql_teams')) {
|
|
48
|
+
if (this.enableRichInlineNodes && option.type === 'value' && (option.valueType === 'team' && fg('jira_update_jql_teams') || option.valueType === 'project' && fg('projects_in_jira_eap_drop2'))) {
|
|
49
49
|
transaction.setMeta('hydrate', true);
|
|
50
50
|
}
|
|
51
51
|
const documentFrom = getDocumentPosition(transaction.doc, from);
|
|
@@ -102,6 +102,21 @@ export default class AutocompletePluginView extends ReactPluginView {
|
|
|
102
102
|
}
|
|
103
103
|
break;
|
|
104
104
|
}
|
|
105
|
+
case 'project':
|
|
106
|
+
{
|
|
107
|
+
if (fg('projects_in_jira_eap_drop2')) {
|
|
108
|
+
const attributes = {
|
|
109
|
+
type: 'project',
|
|
110
|
+
id: value,
|
|
111
|
+
name: nameOnRichInlineNode !== null && nameOnRichInlineNode !== void 0 ? nameOnRichInlineNode : name,
|
|
112
|
+
fieldName: context === null || context === void 0 ? void 0 : context.field
|
|
113
|
+
};
|
|
114
|
+
nodes.push(this.view.state.schema.nodes.project.create(attributes, textContent));
|
|
115
|
+
} else {
|
|
116
|
+
nodes.push(textContent);
|
|
117
|
+
}
|
|
118
|
+
break;
|
|
119
|
+
}
|
|
105
120
|
default:
|
|
106
121
|
{
|
|
107
122
|
nodes.push(textContent);
|
|
@@ -2,10 +2,11 @@
|
|
|
2
2
|
._2rko12b0{border-radius:var(--ds-radius-small,4px)}
|
|
3
3
|
._1h6dq98m{border-color:var(--ds-border-selected,#1868db)}
|
|
4
4
|
._1rjcidpf{padding-block:0}
|
|
5
|
+
._1e0c116y{display:inline-flex}
|
|
5
6
|
._1e0c1txw{display:flex}
|
|
6
7
|
._1hms8stv{text-decoration-line:underline}
|
|
7
8
|
._1kegt94y{text-decoration-thickness:1px}
|
|
8
|
-
.
|
|
9
|
+
._1wpz1q9y{align-self:baseline}
|
|
9
10
|
._4bfu1r31{text-decoration-color:currentColor}
|
|
10
11
|
._4bfu1tmw{text-decoration-color:var(--ds-text-danger,#ae2e24)}
|
|
11
12
|
._4cvr1h6o{align-items:center}
|
|
@@ -17,6 +18,7 @@
|
|
|
17
18
|
._bfhki8nm{background-color:var(--ds-background-neutral,#0515240f)}
|
|
18
19
|
._bozgv77o{padding-inline-start:var(--ds-space-025,2px)}
|
|
19
20
|
._ect4zzfg{font-family:var(--ds-font-family-code,"Atlassian Mono",ui-monospace,Menlo,"Segoe UI Mono","Ubuntu Mono",monospace)}
|
|
21
|
+
._s7n4z0dk{vertical-align:text-top}
|
|
20
22
|
._tdi7glyw{-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}
|
|
21
23
|
._y4ti1b66{padding-inline-end:var(--ds-space-050,4px)}
|
|
22
24
|
._irr31yvi:hover{background-color:var(--ds-background-danger-hovered,#ffd5d2)}
|
|
@@ -6,12 +6,12 @@ import { cx } from '@atlaskit/css';
|
|
|
6
6
|
import LockLockedIcon from '@atlaskit/icon/core/lock-locked';
|
|
7
7
|
import { Box, Inline, Pressable } from '@atlaskit/primitives/compiled';
|
|
8
8
|
const styles = {
|
|
9
|
-
nodeWrapper: "_19it145i _2rko12b0 _1rjcidpf
|
|
9
|
+
nodeWrapper: "_19it145i _2rko12b0 _1rjcidpf _1e0c116y _s7n4z0dk _4cvr1h6o _1wpz1q9y _bfhki8nm _4t3igktf _bozgv77o _y4ti1b66 _irr3plhp",
|
|
10
10
|
nodeWrapperSelected: "_1h6dq98m _bfhk15s3 _irr3ufnl",
|
|
11
11
|
nodeWrapperError: "_4bfu1r31 _1hms8stv _ajmm1khm _1kegt94y _tdi7glyw _4bfu1tmw",
|
|
12
12
|
nodeWrapperErrorSelected: "_bfhk1gly _irr31yvi",
|
|
13
13
|
textWrapper: "_ect4zzfg",
|
|
14
|
-
iconBeforeWrapper: "_1e0c1txw _4t3i7vkz _4cvr1h6o
|
|
14
|
+
iconBeforeWrapper: "_1e0c1txw _4t3i7vkz _4cvr1h6o",
|
|
15
15
|
iconAfterWrapper: ""
|
|
16
16
|
};
|
|
17
17
|
|
|
@@ -1,57 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
import { useIntl } from '../../../../state';
|
|
10
|
-
import { NodeBase } from '../base';
|
|
11
|
-
import { messages } from './messages';
|
|
12
|
-
const styles = {
|
|
13
|
-
emojiWrapper: "_1e0c1txw _4t3i7vkz _4cvr1h6o _1pfh1i6y",
|
|
14
|
-
projectIconWrapper: "_ca0qv77o _u5f3v77o _n3tdv77o _19bvv77o"
|
|
15
|
-
};
|
|
16
|
-
const getTownsquareEmojiProvider = () => {
|
|
17
|
-
// Dynamically import the emoji provider to prevent an unnecessary network call from being made on module import
|
|
18
|
-
return import( /* webpackChunkName: "@atlaskit-internal_@atlaskit/jql-editor/plugins/rich-inline-nodes/nodes/base" */'@atlaskit/townsquare-emoji-provider').then(mod => mod.emojiProvider);
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* ProjectNode Component
|
|
23
|
-
*
|
|
24
|
-
* This component is a component for rendering a pill-like view for Project (Atlas) node type
|
|
25
|
-
* in the JQL editor
|
|
26
|
-
*/
|
|
27
|
-
export const ProjectNode = props => {
|
|
28
|
-
const {
|
|
29
|
-
emojiName,
|
|
30
|
-
isRestricted,
|
|
31
|
-
text,
|
|
32
|
-
...rest
|
|
33
|
-
} = props;
|
|
34
|
-
const [{
|
|
35
|
-
formatMessage
|
|
36
|
-
}] = useIntl();
|
|
37
|
-
const townsquareEmojiProvider = getTownsquareEmojiProvider();
|
|
38
|
-
return /*#__PURE__*/React.createElement(NodeBase, _extends({
|
|
39
|
-
iconBefore: emojiName ? /*#__PURE__*/React.createElement(Box, {
|
|
40
|
-
xcss: styles.emojiWrapper
|
|
41
|
-
}, /*#__PURE__*/React.createElement(ResourcedEmoji, {
|
|
42
|
-
emojiProvider: townsquareEmojiProvider,
|
|
43
|
-
emojiId: {
|
|
44
|
-
shortName: emojiName
|
|
45
|
-
},
|
|
46
|
-
fitToHeight: 16
|
|
47
|
-
})) : /*#__PURE__*/React.createElement(Box, {
|
|
48
|
-
xcss: styles.projectIconWrapper
|
|
49
|
-
}, /*#__PURE__*/React.createElement(ProjectIcon, {
|
|
50
|
-
size: "small",
|
|
51
|
-
label: ""
|
|
52
|
-
})),
|
|
53
|
-
text: isRestricted ? formatMessage(messages.restrictedProject) : text
|
|
54
|
-
}, rest, {
|
|
55
|
-
isLocked: isRestricted
|
|
56
|
-
}));
|
|
1
|
+
import { ProjectNode } from './project-node';
|
|
2
|
+
export const project = {
|
|
3
|
+
component: ProjectNode,
|
|
4
|
+
attrs: {
|
|
5
|
+
id: {},
|
|
6
|
+
name: {},
|
|
7
|
+
fieldName: {}
|
|
8
|
+
}
|
|
57
9
|
};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
+
._154i1i6y{top:var(--ds-space-negative-025,-2px)}
|
|
1
2
|
._19bvv77o{padding-left:var(--ds-space-025,2px)}
|
|
2
3
|
._1e0c1txw{display:flex}
|
|
3
|
-
._1pfh1i6y{margin-block-start:var(--ds-space-negative-025,-2px)}
|
|
4
|
-
._4cvr1h6o{align-items:center}
|
|
5
4
|
._4t3i7vkz{height:1pc}
|
|
6
5
|
._ca0qv77o{padding-top:var(--ds-space-025,2px)}
|
|
6
|
+
._kqswh2mm{position:relative}
|
|
7
7
|
._n3tdv77o{padding-bottom:var(--ds-space-025,2px)}
|
|
8
8
|
._u5f3v77o{padding-right:var(--ds-space-025,2px)}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/* project-node.tsx generated by @compiled/babel-plugin v0.38.1 */
|
|
2
|
+
import _extends from "@babel/runtime/helpers/extends";
|
|
3
|
+
import "./project-node.compiled.css";
|
|
4
|
+
import { ax, ix } from "@compiled/react/runtime";
|
|
5
|
+
import React from 'react';
|
|
6
|
+
import { useIntl } from 'react-intl-next';
|
|
7
|
+
import { ResourcedEmoji } from '@atlaskit/emoji';
|
|
8
|
+
import ProjectIcon from '@atlaskit/icon/core/project';
|
|
9
|
+
import { Box } from '@atlaskit/primitives/compiled';
|
|
10
|
+
import { useHydratedProject } from '../../../../state';
|
|
11
|
+
import { NodeBase } from '../base';
|
|
12
|
+
import { messages } from './messages';
|
|
13
|
+
const styles = {
|
|
14
|
+
emojiWrapper: "_1e0c1txw _4t3i7vkz _kqswh2mm _154i1i6y",
|
|
15
|
+
projectIconWrapper: "_ca0qv77o _u5f3v77o _n3tdv77o _19bvv77o"
|
|
16
|
+
};
|
|
17
|
+
const getTownsquareEmojiProvider = () => {
|
|
18
|
+
// Dynamically import the emoji provider to prevent an unnecessary network call from being made on module import
|
|
19
|
+
return import( /* webpackChunkName: "@atlaskit-internal_@atlaskit/jql-editor/plugins/rich-inline-nodes/nodes/base" */'@atlaskit/townsquare-emoji-provider').then(mod => mod.emojiProvider);
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* ProjectNode Component
|
|
24
|
+
*
|
|
25
|
+
* This component is a component for rendering a pill-like view for Project (Atlas) node type
|
|
26
|
+
* in the JQL editor
|
|
27
|
+
*/
|
|
28
|
+
export const ProjectNode = props => {
|
|
29
|
+
const {
|
|
30
|
+
id,
|
|
31
|
+
fieldName,
|
|
32
|
+
name,
|
|
33
|
+
privateProject,
|
|
34
|
+
...rest
|
|
35
|
+
} = props;
|
|
36
|
+
const {
|
|
37
|
+
formatMessage
|
|
38
|
+
} = useIntl();
|
|
39
|
+
const [project] = useHydratedProject({
|
|
40
|
+
id,
|
|
41
|
+
fieldName
|
|
42
|
+
});
|
|
43
|
+
const townsquareEmojiProvider = getTownsquareEmojiProvider();
|
|
44
|
+
return /*#__PURE__*/React.createElement(NodeBase, _extends({
|
|
45
|
+
iconBefore: project !== null && project !== void 0 && project.iconName ? /*#__PURE__*/React.createElement(Box, {
|
|
46
|
+
xcss: styles.emojiWrapper
|
|
47
|
+
}, /*#__PURE__*/React.createElement(ResourcedEmoji, {
|
|
48
|
+
emojiProvider: townsquareEmojiProvider,
|
|
49
|
+
emojiId: {
|
|
50
|
+
shortName: project.iconName
|
|
51
|
+
},
|
|
52
|
+
fitToHeight: 16
|
|
53
|
+
})) : /*#__PURE__*/React.createElement(Box, {
|
|
54
|
+
xcss: styles.projectIconWrapper
|
|
55
|
+
}, /*#__PURE__*/React.createElement(ProjectIcon, {
|
|
56
|
+
size: "small",
|
|
57
|
+
label: ""
|
|
58
|
+
})),
|
|
59
|
+
text: privateProject || project !== null && project !== void 0 && project.privateProject ? formatMessage(messages.restrictedProject) : name
|
|
60
|
+
}, rest, {
|
|
61
|
+
isLocked: project === null || project === void 0 ? void 0 : project.privateProject
|
|
62
|
+
}));
|
|
63
|
+
};
|