@atlaskit/editor-plugin-mentions 0.1.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/.eslintrc.js +7 -0
- package/CHANGELOG.md +1 -0
- package/LICENSE.md +13 -0
- package/README.md +9 -0
- package/dist/cjs/analytics.js +157 -0
- package/dist/cjs/index.js +12 -0
- package/dist/cjs/messages.js +29 -0
- package/dist/cjs/nodeviews/mention.js +117 -0
- package/dist/cjs/plugin.js +135 -0
- package/dist/cjs/pm-plugins/key.js +8 -0
- package/dist/cjs/pm-plugins/main.js +156 -0
- package/dist/cjs/pm-plugins/utils.js +23 -0
- package/dist/cjs/type-ahead/index.js +362 -0
- package/dist/cjs/types.js +5 -0
- package/dist/cjs/ui/InviteItem/index.js +76 -0
- package/dist/cjs/ui/InviteItem/styles.js +19 -0
- package/dist/cjs/ui/Mention/index.js +98 -0
- package/dist/cjs/ui/ToolbarMention/index.js +63 -0
- package/dist/cjs/utils.js +32 -0
- package/dist/es2019/analytics.js +147 -0
- package/dist/es2019/index.js +1 -0
- package/dist/es2019/messages.js +23 -0
- package/dist/es2019/nodeviews/mention.js +80 -0
- package/dist/es2019/plugin.js +123 -0
- package/dist/es2019/pm-plugins/key.js +2 -0
- package/dist/es2019/pm-plugins/main.js +143 -0
- package/dist/es2019/pm-plugins/utils.js +14 -0
- package/dist/es2019/type-ahead/index.js +338 -0
- package/dist/es2019/types.js +1 -0
- package/dist/es2019/ui/InviteItem/index.js +67 -0
- package/dist/es2019/ui/InviteItem/styles.js +47 -0
- package/dist/es2019/ui/Mention/index.js +70 -0
- package/dist/es2019/ui/ToolbarMention/index.js +33 -0
- package/dist/es2019/utils.js +20 -0
- package/dist/esm/analytics.js +150 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/messages.js +23 -0
- package/dist/esm/nodeviews/mention.js +107 -0
- package/dist/esm/plugin.js +129 -0
- package/dist/esm/pm-plugins/key.js +2 -0
- package/dist/esm/pm-plugins/main.js +148 -0
- package/dist/esm/pm-plugins/utils.js +16 -0
- package/dist/esm/type-ahead/index.js +350 -0
- package/dist/esm/types.js +1 -0
- package/dist/esm/ui/InviteItem/index.js +66 -0
- package/dist/esm/ui/InviteItem/styles.js +12 -0
- package/dist/esm/ui/Mention/index.js +90 -0
- package/dist/esm/ui/ToolbarMention/index.js +53 -0
- package/dist/esm/utils.js +26 -0
- package/dist/types/analytics.d.ts +13 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/messages.d.ts +22 -0
- package/dist/types/nodeviews/mention.d.ts +9 -0
- package/dist/types/plugin.d.ts +3 -0
- package/dist/types/pm-plugins/key.d.ts +3 -0
- package/dist/types/pm-plugins/main.d.ts +6 -0
- package/dist/types/pm-plugins/utils.d.ts +4 -0
- package/dist/types/type-ahead/index.d.ts +17 -0
- package/dist/types/types.d.ts +38 -0
- package/dist/types/ui/InviteItem/index.d.ts +24 -0
- package/dist/types/ui/InviteItem/styles.d.ts +8 -0
- package/dist/types/ui/Mention/index.d.ts +19 -0
- package/dist/types/ui/ToolbarMention/index.d.ts +13 -0
- package/dist/types/utils.d.ts +8 -0
- package/dist/types-ts4.5/analytics.d.ts +13 -0
- package/dist/types-ts4.5/index.d.ts +2 -0
- package/dist/types-ts4.5/messages.d.ts +22 -0
- package/dist/types-ts4.5/nodeviews/mention.d.ts +9 -0
- package/dist/types-ts4.5/plugin.d.ts +3 -0
- package/dist/types-ts4.5/pm-plugins/key.d.ts +3 -0
- package/dist/types-ts4.5/pm-plugins/main.d.ts +6 -0
- package/dist/types-ts4.5/pm-plugins/utils.d.ts +4 -0
- package/dist/types-ts4.5/type-ahead/index.d.ts +17 -0
- package/dist/types-ts4.5/types.d.ts +41 -0
- package/dist/types-ts4.5/ui/InviteItem/index.d.ts +24 -0
- package/dist/types-ts4.5/ui/InviteItem/styles.d.ts +8 -0
- package/dist/types-ts4.5/ui/Mention/index.d.ts +19 -0
- package/dist/types-ts4.5/ui/ToolbarMention/index.d.ts +13 -0
- package/dist/types-ts4.5/utils.d.ts +8 -0
- package/package.json +112 -0
- package/report.api.md +92 -0
- package/tmp/api-report-tmp.d.ts +63 -0
package/.eslintrc.js
ADDED
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# @atlaskit/editor-plugin-mentions
|
package/LICENSE.md
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
Copyright 2023 Atlassian Pty Ltd
|
|
2
|
+
|
|
3
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
you may not use this file except in compliance with the License.
|
|
5
|
+
You may obtain a copy of the License at
|
|
6
|
+
|
|
7
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
|
|
9
|
+
Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
See the License for the specific language governing permissions and
|
|
13
|
+
limitations under the License.
|
package/README.md
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# EditorPluginMentions
|
|
2
|
+
|
|
3
|
+
Mentions plugin for @atlaskit/editor-core
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
|
|
7
|
+
`import EditorPluginMentions from '@atlaskit/editor-plugin-mentions';`
|
|
8
|
+
|
|
9
|
+
Detailed docs and example usage can be found [here](https://atlaskit.atlassian.com/packages/editor/editor-plugin-mentions).
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.buildTypeAheadRenderedPayload = exports.buildTypeAheadInviteItemViewedPayload = exports.buildTypeAheadInviteItemClickedPayload = exports.buildTypeAheadInviteExposurePayload = exports.buildTypeAheadInsertedPayload = exports.buildTypeAheadCancelPayload = exports.buildAnalyticsPayload = void 0;
|
|
8
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
9
|
+
var _analyticsGasTypes = require("@atlaskit/analytics-gas-types");
|
|
10
|
+
var _resource = require("@atlaskit/mention/resource");
|
|
11
|
+
var _utils = require("./utils");
|
|
12
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
13
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
14
|
+
var componentName = 'mention';
|
|
15
|
+
var buildAnalyticsPayload = exports.buildAnalyticsPayload = function buildAnalyticsPayload(actionSubject, action, eventType, sessionId) {
|
|
16
|
+
var otherAttributes = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
|
|
17
|
+
var tags = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : [];
|
|
18
|
+
return {
|
|
19
|
+
action: action,
|
|
20
|
+
actionSubject: actionSubject,
|
|
21
|
+
eventType: eventType,
|
|
22
|
+
attributes: _objectSpread({
|
|
23
|
+
componentName: componentName,
|
|
24
|
+
sessionId: sessionId
|
|
25
|
+
}, otherAttributes),
|
|
26
|
+
tags: tags
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
var emptyQueryResponse = {
|
|
30
|
+
queryLength: 0,
|
|
31
|
+
spaceInQuery: false
|
|
32
|
+
};
|
|
33
|
+
var extractAttributesFromQuery = function extractAttributesFromQuery(query) {
|
|
34
|
+
if (query) {
|
|
35
|
+
return {
|
|
36
|
+
queryLength: query.length,
|
|
37
|
+
spaceInQuery: query.indexOf(' ') !== -1
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
return emptyQueryResponse;
|
|
41
|
+
};
|
|
42
|
+
var buildTypeAheadCancelPayload = exports.buildTypeAheadCancelPayload = function buildTypeAheadCancelPayload(duration, upKeyCount, downKeyCount, sessionId, query) {
|
|
43
|
+
var _extractAttributesFro = extractAttributesFromQuery(query),
|
|
44
|
+
queryLength = _extractAttributesFro.queryLength,
|
|
45
|
+
spaceInQuery = _extractAttributesFro.spaceInQuery;
|
|
46
|
+
return buildAnalyticsPayload('mentionTypeahead', 'cancelled', _analyticsGasTypes.UI_EVENT_TYPE, sessionId, {
|
|
47
|
+
duration: duration,
|
|
48
|
+
downKeyCount: downKeyCount,
|
|
49
|
+
upKeyCount: upKeyCount,
|
|
50
|
+
queryLength: queryLength,
|
|
51
|
+
spaceInQuery: spaceInQuery
|
|
52
|
+
});
|
|
53
|
+
};
|
|
54
|
+
var getPosition = function getPosition(mentionList, selectedMention) {
|
|
55
|
+
if (mentionList) {
|
|
56
|
+
var index = mentionList.findIndex(function (mention) {
|
|
57
|
+
return mention.id === selectedMention.id;
|
|
58
|
+
});
|
|
59
|
+
return index === -1 ? undefined : index;
|
|
60
|
+
}
|
|
61
|
+
return;
|
|
62
|
+
};
|
|
63
|
+
var isClicked = function isClicked(insertType) {
|
|
64
|
+
return insertType === 'selected';
|
|
65
|
+
};
|
|
66
|
+
var buildTypeAheadInviteItemViewedPayload = exports.buildTypeAheadInviteItemViewedPayload = function buildTypeAheadInviteItemViewedPayload(sessionId, contextIdentifierProvider, userRole) {
|
|
67
|
+
var _ref = contextIdentifierProvider || {},
|
|
68
|
+
containerId = _ref.containerId,
|
|
69
|
+
objectId = _ref.objectId,
|
|
70
|
+
childObjectId = _ref.childObjectId;
|
|
71
|
+
return buildAnalyticsPayload('inviteItem', 'rendered', _analyticsGasTypes.UI_EVENT_TYPE, sessionId, {
|
|
72
|
+
containerId: containerId,
|
|
73
|
+
objectId: objectId,
|
|
74
|
+
childObjectId: childObjectId,
|
|
75
|
+
userRole: userRole
|
|
76
|
+
});
|
|
77
|
+
};
|
|
78
|
+
var buildTypeAheadInviteExposurePayload = exports.buildTypeAheadInviteExposurePayload = function buildTypeAheadInviteExposurePayload(sessionId, contextIdentifierProvider, inviteExperimentCohort, userRole) {
|
|
79
|
+
var _ref2 = contextIdentifierProvider || {},
|
|
80
|
+
containerId = _ref2.containerId,
|
|
81
|
+
objectId = _ref2.objectId,
|
|
82
|
+
childObjectId = _ref2.childObjectId;
|
|
83
|
+
return buildAnalyticsPayload('feature', 'exposed', _analyticsGasTypes.OPERATIONAL_EVENT_TYPE, sessionId, {
|
|
84
|
+
flagKey: 'confluence.frontend.invite.from.mention',
|
|
85
|
+
value: inviteExperimentCohort || 'not-enrolled',
|
|
86
|
+
containerId: containerId,
|
|
87
|
+
objectId: objectId,
|
|
88
|
+
childObjectId: childObjectId,
|
|
89
|
+
userRole: userRole
|
|
90
|
+
}, ['measurement', 'hasCustomAttributes']);
|
|
91
|
+
};
|
|
92
|
+
var buildTypeAheadInviteItemClickedPayload = exports.buildTypeAheadInviteItemClickedPayload = function buildTypeAheadInviteItemClickedPayload(duration, upKeyCount, downKeyCount, sessionId, insertType, query, contextIdentifierProvider, userRole) {
|
|
93
|
+
var _extractAttributesFro2 = extractAttributesFromQuery(query),
|
|
94
|
+
queryLength = _extractAttributesFro2.queryLength,
|
|
95
|
+
spaceInQuery = _extractAttributesFro2.spaceInQuery;
|
|
96
|
+
var _ref3 = contextIdentifierProvider || {},
|
|
97
|
+
containerId = _ref3.containerId,
|
|
98
|
+
objectId = _ref3.objectId,
|
|
99
|
+
childObjectId = _ref3.childObjectId;
|
|
100
|
+
return buildAnalyticsPayload('inviteItem', isClicked(insertType) ? 'clicked' : 'pressed', _analyticsGasTypes.UI_EVENT_TYPE, sessionId, {
|
|
101
|
+
duration: duration,
|
|
102
|
+
queryLength: queryLength,
|
|
103
|
+
spaceInQuery: spaceInQuery,
|
|
104
|
+
upKeyCount: upKeyCount,
|
|
105
|
+
downKeyCount: downKeyCount,
|
|
106
|
+
containerId: containerId,
|
|
107
|
+
objectId: objectId,
|
|
108
|
+
childObjectId: childObjectId,
|
|
109
|
+
userRole: userRole
|
|
110
|
+
});
|
|
111
|
+
};
|
|
112
|
+
var buildTypeAheadInsertedPayload = exports.buildTypeAheadInsertedPayload = function buildTypeAheadInsertedPayload(duration, upKeyCount, downKeyCount, sessionId, insertType, mention, mentionList, query, contextIdentifierProvider) {
|
|
113
|
+
var _extractAttributesFro3 = extractAttributesFromQuery(query),
|
|
114
|
+
queryLength = _extractAttributesFro3.queryLength,
|
|
115
|
+
spaceInQuery = _extractAttributesFro3.spaceInQuery;
|
|
116
|
+
var analyticsPayload = buildAnalyticsPayload('mentionTypeahead', isClicked(insertType) ? 'clicked' : 'pressed', _analyticsGasTypes.UI_EVENT_TYPE, sessionId, {
|
|
117
|
+
duration: duration,
|
|
118
|
+
position: getPosition(mentionList, mention),
|
|
119
|
+
keyboardKey: isClicked(insertType) ? undefined : insertType,
|
|
120
|
+
source: mention.source,
|
|
121
|
+
queryLength: queryLength,
|
|
122
|
+
spaceInQuery: spaceInQuery,
|
|
123
|
+
isSpecial: (0, _resource.isSpecialMention)(mention),
|
|
124
|
+
accessLevel: mention.accessLevel || '',
|
|
125
|
+
userType: mention.userType,
|
|
126
|
+
userId: mention.id,
|
|
127
|
+
upKeyCount: upKeyCount,
|
|
128
|
+
downKeyCount: downKeyCount,
|
|
129
|
+
memberCount: (0, _utils.isTeamType)(mention.userType) && mention.context ? mention.context.memberCount : null,
|
|
130
|
+
includesYou: (0, _utils.isTeamType)(mention.userType) && mention.context ? mention.context.includesYou : null
|
|
131
|
+
});
|
|
132
|
+
if (contextIdentifierProvider) {
|
|
133
|
+
analyticsPayload.containerId = contextIdentifierProvider.containerId || undefined;
|
|
134
|
+
analyticsPayload.objectId = contextIdentifierProvider.objectId || undefined;
|
|
135
|
+
analyticsPayload.childObjectId = contextIdentifierProvider.childObjectId || undefined;
|
|
136
|
+
}
|
|
137
|
+
return analyticsPayload;
|
|
138
|
+
};
|
|
139
|
+
var buildTypeAheadRenderedPayload = exports.buildTypeAheadRenderedPayload = function buildTypeAheadRenderedPayload(duration, userIds, query, teams) {
|
|
140
|
+
var _extractAttributesFro4 = extractAttributesFromQuery(query),
|
|
141
|
+
queryLength = _extractAttributesFro4.queryLength,
|
|
142
|
+
spaceInQuery = _extractAttributesFro4.spaceInQuery;
|
|
143
|
+
var actionSubject = userIds ? 'mentionTypeahead' : 'teamMentionTypeahead';
|
|
144
|
+
return {
|
|
145
|
+
action: 'rendered',
|
|
146
|
+
actionSubject: actionSubject,
|
|
147
|
+
eventType: _analyticsGasTypes.OPERATIONAL_EVENT_TYPE,
|
|
148
|
+
attributes: {
|
|
149
|
+
componentName: componentName,
|
|
150
|
+
duration: duration,
|
|
151
|
+
userIds: userIds,
|
|
152
|
+
teams: teams,
|
|
153
|
+
queryLength: queryLength,
|
|
154
|
+
spaceInQuery: spaceInQuery
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
Object.defineProperty(exports, "mentionsPlugin", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function get() {
|
|
9
|
+
return _plugin.mentionsPlugin;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
var _plugin = require("./plugin");
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.messages = void 0;
|
|
7
|
+
var _reactIntlNext = require("react-intl-next");
|
|
8
|
+
var messages = exports.messages = (0, _reactIntlNext.defineMessages)({
|
|
9
|
+
inviteItemTitle: {
|
|
10
|
+
id: 'fabric.editor.inviteItem.title',
|
|
11
|
+
defaultMessage: '{userRole, select, admin {Invite} trusted {Invite} other {Add}} teammate to {productName}',
|
|
12
|
+
description: 'Title of the invite teammate item in typeahead plugin'
|
|
13
|
+
},
|
|
14
|
+
mentionsAddLabel: {
|
|
15
|
+
id: 'fabric.editor.mentionsAddLabel',
|
|
16
|
+
defaultMessage: 'add-icon',
|
|
17
|
+
description: 'icon label to describe adding a new mention'
|
|
18
|
+
},
|
|
19
|
+
mentionsIconLabel: {
|
|
20
|
+
id: 'fabric.editor.mentionsIconLabel',
|
|
21
|
+
defaultMessage: 'Mention',
|
|
22
|
+
description: 'icon label to describe the mention icon'
|
|
23
|
+
},
|
|
24
|
+
mentionsNodeLabel: {
|
|
25
|
+
id: 'fabric.editor.mentionNode.label',
|
|
26
|
+
defaultMessage: 'Tagged user',
|
|
27
|
+
description: 'Label to indicate mention node to Screen reader users, that preceeds with user name ex: "Tagged user @XXX'
|
|
28
|
+
}
|
|
29
|
+
});
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.MentionNodeView = void 0;
|
|
9
|
+
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
10
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
11
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
12
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
13
|
+
var _reactIntlNext = require("react-intl-next");
|
|
14
|
+
var _providerFactory = require("@atlaskit/editor-common/provider-factory");
|
|
15
|
+
var _mention = require("@atlaskit/mention");
|
|
16
|
+
var _types = require("@atlaskit/mention/types");
|
|
17
|
+
var _messages = require("../messages");
|
|
18
|
+
var _Mention = _interopRequireDefault(require("../ui/Mention"));
|
|
19
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
20
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
21
|
+
var UNKNOWN_USER_ID = '_|unknown|_';
|
|
22
|
+
var MentionAssistiveTextComponent = function MentionAssistiveTextComponent(_ref) {
|
|
23
|
+
var id = _ref.id,
|
|
24
|
+
text = _ref.text,
|
|
25
|
+
providers = _ref.providers,
|
|
26
|
+
accessLevel = _ref.accessLevel,
|
|
27
|
+
mentionProvider = _ref.mentionProvider;
|
|
28
|
+
var _useState = (0, _react.useState)(text),
|
|
29
|
+
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
|
|
30
|
+
resolvedName = _useState2[0],
|
|
31
|
+
setResolvedName = _useState2[1];
|
|
32
|
+
var intl = (0, _reactIntlNext.useIntl)();
|
|
33
|
+
var processName = function processName(name) {
|
|
34
|
+
if (name.status === _mention.MentionNameStatus.OK) {
|
|
35
|
+
return "@".concat(name.name || '');
|
|
36
|
+
} else {
|
|
37
|
+
return "@".concat(UNKNOWN_USER_ID);
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
(0, _react.useEffect)(function () {
|
|
41
|
+
if (mentionProvider) {
|
|
42
|
+
mentionProvider.then( /*#__PURE__*/function () {
|
|
43
|
+
var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(provider) {
|
|
44
|
+
var nameDetail;
|
|
45
|
+
return _regenerator.default.wrap(function _callee$(_context) {
|
|
46
|
+
while (1) switch (_context.prev = _context.next) {
|
|
47
|
+
case 0:
|
|
48
|
+
if (!(!text && (0, _mention.isResolvingMentionProvider)(provider))) {
|
|
49
|
+
_context.next = 13;
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
nameDetail = provider.resolveMentionName(id);
|
|
53
|
+
if (!(0, _types.isPromise)(nameDetail)) {
|
|
54
|
+
_context.next = 10;
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
_context.t0 = processName;
|
|
58
|
+
_context.next = 6;
|
|
59
|
+
return nameDetail;
|
|
60
|
+
case 6:
|
|
61
|
+
_context.t1 = _context.sent;
|
|
62
|
+
return _context.abrupt("return", (0, _context.t0)(_context.t1));
|
|
63
|
+
case 10:
|
|
64
|
+
return _context.abrupt("return", processName(nameDetail));
|
|
65
|
+
case 11:
|
|
66
|
+
_context.next = 14;
|
|
67
|
+
break;
|
|
68
|
+
case 13:
|
|
69
|
+
return _context.abrupt("return", text);
|
|
70
|
+
case 14:
|
|
71
|
+
case "end":
|
|
72
|
+
return _context.stop();
|
|
73
|
+
}
|
|
74
|
+
}, _callee);
|
|
75
|
+
}));
|
|
76
|
+
return function (_x) {
|
|
77
|
+
return _ref2.apply(this, arguments);
|
|
78
|
+
};
|
|
79
|
+
}()).then(function (resolvedName) {
|
|
80
|
+
setResolvedName(resolvedName);
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}, [id, text, mentionProvider]);
|
|
84
|
+
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("span", {
|
|
85
|
+
className: 'assistive'
|
|
86
|
+
}, "".concat(intl.formatMessage(_messages.messages.mentionsNodeLabel), " ").concat(resolvedName)), /*#__PURE__*/_react.default.createElement("span", {
|
|
87
|
+
"aria-hidden": "true"
|
|
88
|
+
}, /*#__PURE__*/_react.default.createElement(_Mention.default, {
|
|
89
|
+
id: id,
|
|
90
|
+
text: resolvedName,
|
|
91
|
+
accessLevel: accessLevel,
|
|
92
|
+
providers: providers
|
|
93
|
+
})));
|
|
94
|
+
};
|
|
95
|
+
var MentionNodeView = exports.MentionNodeView = function MentionNodeView(props) {
|
|
96
|
+
var providerFactory = props.providerFactory;
|
|
97
|
+
var _props$node$attrs = props.node.attrs,
|
|
98
|
+
id = _props$node$attrs.id,
|
|
99
|
+
text = _props$node$attrs.text,
|
|
100
|
+
accessLevel = _props$node$attrs.accessLevel;
|
|
101
|
+
var renderAssistiveTextWithProviders = function renderAssistiveTextWithProviders(providers) {
|
|
102
|
+
var _ref3 = providers,
|
|
103
|
+
mentionProvider = _ref3.mentionProvider;
|
|
104
|
+
return /*#__PURE__*/_react.default.createElement(MentionAssistiveTextComponent, {
|
|
105
|
+
mentionProvider: mentionProvider,
|
|
106
|
+
id: id,
|
|
107
|
+
text: text,
|
|
108
|
+
providers: providerFactory,
|
|
109
|
+
accessLevel: accessLevel
|
|
110
|
+
});
|
|
111
|
+
};
|
|
112
|
+
return /*#__PURE__*/_react.default.createElement(_providerFactory.WithProviders, {
|
|
113
|
+
providers: ['mentionProvider', 'profilecardProvider'],
|
|
114
|
+
providerFactory: providerFactory,
|
|
115
|
+
renderNode: renderAssistiveTextWithProviders
|
|
116
|
+
});
|
|
117
|
+
};
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.mentionsPlugin = void 0;
|
|
8
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
9
|
+
var _react = _interopRequireDefault(require("react"));
|
|
10
|
+
var _uuid = _interopRequireDefault(require("uuid"));
|
|
11
|
+
var _adfSchema = require("@atlaskit/adf-schema");
|
|
12
|
+
var _analytics = require("@atlaskit/editor-common/analytics");
|
|
13
|
+
var _messages = require("@atlaskit/editor-common/messages");
|
|
14
|
+
var _quickInsert = require("@atlaskit/editor-common/quick-insert");
|
|
15
|
+
var _withPluginState = require("@atlaskit/editor-common/with-plugin-state");
|
|
16
|
+
var _resource = require("@atlaskit/mention/resource");
|
|
17
|
+
var _key = require("./pm-plugins/key");
|
|
18
|
+
var _main = require("./pm-plugins/main");
|
|
19
|
+
var _typeAhead = require("./type-ahead");
|
|
20
|
+
var _ToolbarMention = _interopRequireDefault(require("./ui/ToolbarMention"));
|
|
21
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
22
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
23
|
+
var mentionsPlugin = exports.mentionsPlugin = function mentionsPlugin(_ref) {
|
|
24
|
+
var options = _ref.config,
|
|
25
|
+
api = _ref.api;
|
|
26
|
+
var sessionId = (0, _uuid.default)();
|
|
27
|
+
var fireEvent = function fireEvent(payload) {
|
|
28
|
+
var _api$analytics$shared, _api$analytics;
|
|
29
|
+
var _ref2 = (_api$analytics$shared = api === null || api === void 0 || (_api$analytics = api.analytics) === null || _api$analytics === void 0 ? void 0 : _api$analytics.sharedState.currentState()) !== null && _api$analytics$shared !== void 0 ? _api$analytics$shared : {},
|
|
30
|
+
createAnalyticsEvent = _ref2.createAnalyticsEvent;
|
|
31
|
+
if (!createAnalyticsEvent) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
if (payload.attributes && !payload.attributes.sessionId) {
|
|
35
|
+
payload.attributes.sessionId = sessionId;
|
|
36
|
+
}
|
|
37
|
+
createAnalyticsEvent(payload).fire(_resource.ELEMENTS_CHANNEL);
|
|
38
|
+
};
|
|
39
|
+
var typeAhead = (0, _typeAhead.createTypeAheadConfig)({
|
|
40
|
+
sanitizePrivateContent: options === null || options === void 0 ? void 0 : options.sanitizePrivateContent,
|
|
41
|
+
mentionInsertDisplayName: options === null || options === void 0 ? void 0 : options.insertDisplayName,
|
|
42
|
+
HighlightComponent: options === null || options === void 0 ? void 0 : options.HighlightComponent,
|
|
43
|
+
fireEvent: fireEvent
|
|
44
|
+
});
|
|
45
|
+
return {
|
|
46
|
+
name: 'mention',
|
|
47
|
+
nodes: function nodes() {
|
|
48
|
+
return [{
|
|
49
|
+
name: 'mention',
|
|
50
|
+
node: _adfSchema.mention
|
|
51
|
+
}];
|
|
52
|
+
},
|
|
53
|
+
pmPlugins: function pmPlugins() {
|
|
54
|
+
return [{
|
|
55
|
+
name: 'mention',
|
|
56
|
+
plugin: function plugin(pmPluginFactoryParams) {
|
|
57
|
+
return (0, _main.createMentionPlugin)(pmPluginFactoryParams, fireEvent, options);
|
|
58
|
+
}
|
|
59
|
+
}];
|
|
60
|
+
},
|
|
61
|
+
secondaryToolbarComponent: function secondaryToolbarComponent(_ref3) {
|
|
62
|
+
var editorView = _ref3.editorView,
|
|
63
|
+
disabled = _ref3.disabled;
|
|
64
|
+
var openMentionTypeAhead = function openMentionTypeAhead() {
|
|
65
|
+
var _api$typeAhead;
|
|
66
|
+
api === null || api === void 0 || (_api$typeAhead = api.typeAhead) === null || _api$typeAhead === void 0 || (_api$typeAhead = _api$typeAhead.actions) === null || _api$typeAhead === void 0 || _api$typeAhead.open({
|
|
67
|
+
triggerHandler: typeAhead,
|
|
68
|
+
inputMethod: _analytics.INPUT_METHOD.INSERT_MENU
|
|
69
|
+
});
|
|
70
|
+
};
|
|
71
|
+
return /*#__PURE__*/_react.default.createElement(_withPluginState.WithPluginState, {
|
|
72
|
+
editorView: editorView,
|
|
73
|
+
plugins: {
|
|
74
|
+
mentionState: _key.mentionPluginKey
|
|
75
|
+
},
|
|
76
|
+
render: function render(_ref4) {
|
|
77
|
+
var _ref4$mentionState = _ref4.mentionState,
|
|
78
|
+
mentionState = _ref4$mentionState === void 0 ? {} : _ref4$mentionState;
|
|
79
|
+
return !mentionState.mentionProvider ? null : /*#__PURE__*/_react.default.createElement(_ToolbarMention.default, {
|
|
80
|
+
editorView: editorView,
|
|
81
|
+
onInsertMention: openMentionTypeAhead,
|
|
82
|
+
isDisabled: disabled || (api === null || api === void 0 ? void 0 : api.typeAhead.actions.isAllowed(editorView.state))
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
},
|
|
87
|
+
actions: {
|
|
88
|
+
openTypeAhead: function openTypeAhead(inputMethod) {
|
|
89
|
+
var _api$typeAhead2;
|
|
90
|
+
return Boolean(api === null || api === void 0 || (_api$typeAhead2 = api.typeAhead) === null || _api$typeAhead2 === void 0 || (_api$typeAhead2 = _api$typeAhead2.actions) === null || _api$typeAhead2 === void 0 ? void 0 : _api$typeAhead2.open({
|
|
91
|
+
triggerHandler: typeAhead,
|
|
92
|
+
inputMethod: inputMethod
|
|
93
|
+
}));
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
getSharedState: function getSharedState(editorState) {
|
|
97
|
+
if (!editorState) {
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
var mentionPluginState = _key.mentionPluginKey.getState(editorState);
|
|
101
|
+
return _objectSpread(_objectSpread({}, mentionPluginState), {}, {
|
|
102
|
+
typeAheadHandler: typeAhead
|
|
103
|
+
});
|
|
104
|
+
},
|
|
105
|
+
pluginsOptions: {
|
|
106
|
+
quickInsert: function quickInsert(_ref5) {
|
|
107
|
+
var formatMessage = _ref5.formatMessage;
|
|
108
|
+
return [{
|
|
109
|
+
id: 'mention',
|
|
110
|
+
title: formatMessage(_messages.toolbarInsertBlockMessages.mention),
|
|
111
|
+
description: formatMessage(_messages.toolbarInsertBlockMessages.mentionDescription),
|
|
112
|
+
keywords: ['team', 'user'],
|
|
113
|
+
priority: 400,
|
|
114
|
+
keyshortcut: '@',
|
|
115
|
+
icon: function icon() {
|
|
116
|
+
return /*#__PURE__*/_react.default.createElement(_quickInsert.IconMention, null);
|
|
117
|
+
},
|
|
118
|
+
action: function action(insert, state) {
|
|
119
|
+
var tr = insert(undefined);
|
|
120
|
+
var pluginState = _key.mentionPluginKey.getState(state);
|
|
121
|
+
if (pluginState && pluginState.canInsertMention === false) {
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
api === null || api === void 0 || api.typeAhead.actions.openAtTransaction({
|
|
125
|
+
triggerHandler: typeAhead,
|
|
126
|
+
inputMethod: _analytics.INPUT_METHOD.QUICK_INSERT
|
|
127
|
+
})(tr);
|
|
128
|
+
return tr;
|
|
129
|
+
}
|
|
130
|
+
}];
|
|
131
|
+
},
|
|
132
|
+
typeAhead: typeAhead
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.mentionPluginKey = void 0;
|
|
7
|
+
var _state = require("@atlaskit/editor-prosemirror/state");
|
|
8
|
+
var mentionPluginKey = exports.mentionPluginKey = new _state.PluginKey('mentionPlugin');
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.createMentionPlugin = createMentionPlugin;
|
|
8
|
+
exports.setContext = void 0;
|
|
9
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
10
|
+
var _reactNodeView = require("@atlaskit/editor-common/react-node-view");
|
|
11
|
+
var _safePlugin = require("@atlaskit/editor-common/safe-plugin");
|
|
12
|
+
var _resource = require("@atlaskit/mention/resource");
|
|
13
|
+
var _mention = require("../nodeviews/mention");
|
|
14
|
+
var _key = require("./key");
|
|
15
|
+
var _utils = require("./utils");
|
|
16
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
17
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
18
|
+
var ACTIONS = {
|
|
19
|
+
SET_PROVIDER: 'SET_PROVIDER',
|
|
20
|
+
SET_CONTEXT: 'SET_CONTEXT'
|
|
21
|
+
};
|
|
22
|
+
var setProvider = function setProvider(provider) {
|
|
23
|
+
return function (state, dispatch) {
|
|
24
|
+
if (dispatch) {
|
|
25
|
+
dispatch(state.tr.setMeta(_key.mentionPluginKey, {
|
|
26
|
+
action: ACTIONS.SET_PROVIDER,
|
|
27
|
+
params: {
|
|
28
|
+
provider: provider
|
|
29
|
+
}
|
|
30
|
+
}));
|
|
31
|
+
}
|
|
32
|
+
return true;
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
var setContext = exports.setContext = function setContext(context) {
|
|
36
|
+
return function (state, dispatch) {
|
|
37
|
+
if (dispatch) {
|
|
38
|
+
dispatch(state.tr.setMeta(_key.mentionPluginKey, {
|
|
39
|
+
action: ACTIONS.SET_CONTEXT,
|
|
40
|
+
params: {
|
|
41
|
+
context: context
|
|
42
|
+
}
|
|
43
|
+
}));
|
|
44
|
+
}
|
|
45
|
+
return true;
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
function createMentionPlugin(pmPluginFactoryParams, fireEvent, options) {
|
|
49
|
+
var mentionProvider;
|
|
50
|
+
var sendAnalytics = function sendAnalytics(event, actionSubject, action, attributes) {
|
|
51
|
+
if (event === _resource.SLI_EVENT_TYPE || event === _resource.SMART_EVENT_TYPE) {
|
|
52
|
+
fireEvent((0, _resource.buildSliPayload)(actionSubject, action, attributes));
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
return new _safePlugin.SafePlugin({
|
|
56
|
+
key: _key.mentionPluginKey,
|
|
57
|
+
state: {
|
|
58
|
+
init: function init(_, state) {
|
|
59
|
+
var canInsertMention = (0, _utils.canMentionBeCreatedInRange)(state.selection.from, state.selection.to)(state);
|
|
60
|
+
return {
|
|
61
|
+
canInsertMention: canInsertMention
|
|
62
|
+
};
|
|
63
|
+
},
|
|
64
|
+
apply: function apply(tr, pluginState, oldState, newState) {
|
|
65
|
+
var _ref = tr.getMeta(_key.mentionPluginKey) || {
|
|
66
|
+
action: null,
|
|
67
|
+
params: null
|
|
68
|
+
},
|
|
69
|
+
action = _ref.action,
|
|
70
|
+
params = _ref.params;
|
|
71
|
+
var hasNewPluginState = false;
|
|
72
|
+
var newPluginState = pluginState;
|
|
73
|
+
var hasPositionChanged = oldState.selection.from !== newState.selection.from || oldState.selection.to !== newState.selection.to;
|
|
74
|
+
if (tr.docChanged || tr.selectionSet && hasPositionChanged) {
|
|
75
|
+
newPluginState = _objectSpread(_objectSpread({}, pluginState), {}, {
|
|
76
|
+
canInsertMention: (0, _utils.canMentionBeCreatedInRange)(newState.selection.from, newState.selection.to)(newState)
|
|
77
|
+
});
|
|
78
|
+
hasNewPluginState = true;
|
|
79
|
+
}
|
|
80
|
+
switch (action) {
|
|
81
|
+
case ACTIONS.SET_PROVIDER:
|
|
82
|
+
newPluginState = _objectSpread(_objectSpread({}, newPluginState), {}, {
|
|
83
|
+
mentionProvider: params.provider
|
|
84
|
+
});
|
|
85
|
+
hasNewPluginState = true;
|
|
86
|
+
break;
|
|
87
|
+
case ACTIONS.SET_CONTEXT:
|
|
88
|
+
newPluginState = _objectSpread(_objectSpread({}, newPluginState), {}, {
|
|
89
|
+
contextIdentifierProvider: params.context
|
|
90
|
+
});
|
|
91
|
+
hasNewPluginState = true;
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
if (hasNewPluginState) {
|
|
95
|
+
pmPluginFactoryParams.dispatch(_key.mentionPluginKey, newPluginState);
|
|
96
|
+
}
|
|
97
|
+
return newPluginState;
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
props: {
|
|
101
|
+
nodeViews: {
|
|
102
|
+
mention: (0, _reactNodeView.getInlineNodeViewProducer)({
|
|
103
|
+
pmPluginFactoryParams: pmPluginFactoryParams,
|
|
104
|
+
Component: _mention.MentionNodeView,
|
|
105
|
+
extraComponentProps: {
|
|
106
|
+
providerFactory: pmPluginFactoryParams.providerFactory,
|
|
107
|
+
options: options
|
|
108
|
+
}
|
|
109
|
+
})
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
view: function view(editorView) {
|
|
113
|
+
var providerHandler = function providerHandler(name, providerPromise) {
|
|
114
|
+
switch (name) {
|
|
115
|
+
case 'mentionProvider':
|
|
116
|
+
if (!providerPromise) {
|
|
117
|
+
return setProvider(undefined)(editorView.state, editorView.dispatch);
|
|
118
|
+
}
|
|
119
|
+
providerPromise.then(function (provider) {
|
|
120
|
+
if (mentionProvider) {
|
|
121
|
+
mentionProvider.unsubscribe('mentionPlugin');
|
|
122
|
+
}
|
|
123
|
+
mentionProvider = provider;
|
|
124
|
+
setProvider(provider)(editorView.state, editorView.dispatch);
|
|
125
|
+
provider.subscribe('mentionPlugin', undefined, undefined, undefined, undefined, sendAnalytics);
|
|
126
|
+
}).catch(function () {
|
|
127
|
+
return setProvider(undefined)(editorView.state, editorView.dispatch);
|
|
128
|
+
});
|
|
129
|
+
break;
|
|
130
|
+
case 'contextIdentifierProvider':
|
|
131
|
+
if (!providerPromise) {
|
|
132
|
+
return setContext(undefined)(editorView.state, editorView.dispatch);
|
|
133
|
+
}
|
|
134
|
+
providerPromise.then(function (provider) {
|
|
135
|
+
setContext(provider)(editorView.state, editorView.dispatch);
|
|
136
|
+
});
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
return;
|
|
140
|
+
};
|
|
141
|
+
pmPluginFactoryParams.providerFactory.subscribe('mentionProvider', providerHandler);
|
|
142
|
+
pmPluginFactoryParams.providerFactory.subscribe('contextIdentifierProvider', providerHandler);
|
|
143
|
+
return {
|
|
144
|
+
destroy: function destroy() {
|
|
145
|
+
if (pmPluginFactoryParams.providerFactory) {
|
|
146
|
+
pmPluginFactoryParams.providerFactory.unsubscribe('mentionProvider', providerHandler);
|
|
147
|
+
pmPluginFactoryParams.providerFactory.unsubscribe('contextIdentifierProvider', providerHandler);
|
|
148
|
+
}
|
|
149
|
+
if (mentionProvider) {
|
|
150
|
+
mentionProvider.unsubscribe('mentionPlugin');
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
}
|