@atlaskit/link-datasource 1.28.0 → 1.28.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -0
- package/dist/cjs/services/mocks.js +152 -1
- package/dist/cjs/services/useBasicFilterAGG.js +9 -2
- package/dist/cjs/services/utils.js +3 -2
- package/dist/cjs/ui/common/modal/popup-select/formatOptionLabel.js +7 -10
- package/dist/cjs/ui/common/modal/popup-select/index.js +2 -1
- package/dist/cjs/ui/common/modal/popup-select/trigger.js +7 -8
- package/dist/cjs/ui/confluence-search-modal/basic-filters/filters/edited-or-created-by/index.js +110 -0
- package/dist/cjs/ui/confluence-search-modal/basic-filters/filters/edited-or-created-by/messages.js +14 -0
- package/dist/cjs/ui/confluence-search-modal/basic-filters/hooks/useCurrentUserInfo.js +48 -0
- package/dist/cjs/ui/confluence-search-modal/basic-filters/hooks/useRecommendation.js +120 -0
- package/dist/cjs/ui/confluence-search-modal/basic-filters/index.js +12 -3
- package/dist/cjs/ui/confluence-search-modal/confluence-search-container/index.js +15 -6
- package/dist/cjs/ui/confluence-search-modal/modal/index.js +35 -17
- package/dist/es2019/services/mocks.js +151 -0
- package/dist/es2019/services/useBasicFilterAGG.js +8 -3
- package/dist/es2019/services/utils.js +8 -0
- package/dist/es2019/ui/common/modal/popup-select/formatOptionLabel.js +7 -7
- package/dist/es2019/ui/common/modal/popup-select/index.js +1 -1
- package/dist/es2019/ui/common/modal/popup-select/trigger.js +7 -8
- package/dist/es2019/ui/confluence-search-modal/basic-filters/filters/edited-or-created-by/index.js +82 -0
- package/dist/es2019/ui/confluence-search-modal/basic-filters/filters/edited-or-created-by/messages.js +8 -0
- package/dist/es2019/ui/confluence-search-modal/basic-filters/hooks/useCurrentUserInfo.js +25 -0
- package/dist/es2019/ui/confluence-search-modal/basic-filters/hooks/useRecommendation.js +74 -0
- package/dist/es2019/ui/confluence-search-modal/basic-filters/index.js +13 -3
- package/dist/es2019/ui/confluence-search-modal/confluence-search-container/index.js +16 -9
- package/dist/es2019/ui/confluence-search-modal/modal/index.js +22 -6
- package/dist/esm/services/mocks.js +151 -0
- package/dist/esm/services/useBasicFilterAGG.js +10 -3
- package/dist/esm/services/utils.js +2 -1
- package/dist/esm/ui/common/modal/popup-select/formatOptionLabel.js +7 -7
- package/dist/esm/ui/common/modal/popup-select/index.js +2 -1
- package/dist/esm/ui/common/modal/popup-select/trigger.js +7 -8
- package/dist/esm/ui/confluence-search-modal/basic-filters/filters/edited-or-created-by/index.js +100 -0
- package/dist/esm/ui/confluence-search-modal/basic-filters/filters/edited-or-created-by/messages.js +8 -0
- package/dist/esm/ui/confluence-search-modal/basic-filters/hooks/useCurrentUserInfo.js +41 -0
- package/dist/esm/ui/confluence-search-modal/basic-filters/hooks/useRecommendation.js +113 -0
- package/dist/esm/ui/confluence-search-modal/basic-filters/index.js +12 -3
- package/dist/esm/ui/confluence-search-modal/confluence-search-container/index.js +15 -6
- package/dist/esm/ui/confluence-search-modal/modal/index.js +35 -17
- package/dist/types/services/mocks.d.ts +51 -0
- package/dist/types/services/useBasicFilterAGG.d.ts +2 -0
- package/dist/types/services/utils.d.ts +1 -0
- package/dist/types/ui/common/modal/popup-select/index.d.ts +1 -1
- package/dist/types/ui/confluence-search-modal/basic-filters/filters/edited-or-created-by/index.d.ts +10 -0
- package/dist/types/ui/confluence-search-modal/basic-filters/filters/edited-or-created-by/messages.d.ts +7 -0
- package/dist/types/ui/confluence-search-modal/basic-filters/hooks/useCurrentUserInfo.d.ts +7 -0
- package/dist/types/ui/confluence-search-modal/basic-filters/hooks/useRecommendation.d.ts +16 -0
- package/dist/types/ui/confluence-search-modal/basic-filters/index.d.ts +4 -2
- package/dist/types-ts4.5/services/mocks.d.ts +51 -0
- package/dist/types-ts4.5/services/useBasicFilterAGG.d.ts +2 -0
- package/dist/types-ts4.5/services/utils.d.ts +1 -0
- package/dist/types-ts4.5/ui/common/modal/popup-select/index.d.ts +1 -1
- package/dist/types-ts4.5/ui/confluence-search-modal/basic-filters/filters/edited-or-created-by/index.d.ts +10 -0
- package/dist/types-ts4.5/ui/confluence-search-modal/basic-filters/filters/edited-or-created-by/messages.d.ts +7 -0
- package/dist/types-ts4.5/ui/confluence-search-modal/basic-filters/hooks/useCurrentUserInfo.d.ts +7 -0
- package/dist/types-ts4.5/ui/confluence-search-modal/basic-filters/hooks/useRecommendation.d.ts +16 -0
- package/dist/types-ts4.5/ui/confluence-search-modal/basic-filters/index.d.ts +4 -2
- package/package.json +7 -6
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
2
|
+
import { useDebouncedCallback } from 'use-debounce';
|
|
2
3
|
import { getBooleanFF } from '@atlaskit/platform-feature-flags';
|
|
3
4
|
import { Flex, xcss } from '@atlaskit/primitives';
|
|
4
5
|
import { BasicSearchInput } from '../../common/modal/basic-search-input';
|
|
6
|
+
import { FILTER_SELECTION_DEBOUNCE_MS } from '../../common/modal/popup-select/constants';
|
|
5
7
|
import BasicFilters from '../basic-filters';
|
|
6
8
|
import { searchMessages } from './messages';
|
|
7
9
|
const basicSearchInputContainerStyles = xcss({
|
|
@@ -20,24 +22,27 @@ const ConfluenceSearchContainer = ({
|
|
|
20
22
|
const rawSearch = e.currentTarget.value;
|
|
21
23
|
setSearchBarSearchString(rawSearch);
|
|
22
24
|
}, []);
|
|
25
|
+
const [debouncedBasicFilterSelectionChange] = useDebouncedCallback(filterValues => {
|
|
26
|
+
onSearch(searchBarSearchString, filterValues);
|
|
27
|
+
}, FILTER_SELECTION_DEBOUNCE_MS);
|
|
28
|
+
const handleBasicFilterSelectionChange = useCallback((filterType, options) => {
|
|
29
|
+
const updatedSelection = {
|
|
30
|
+
...filterSelections,
|
|
31
|
+
[filterType]: options
|
|
32
|
+
};
|
|
33
|
+
setFilterSelections(updatedSelection);
|
|
34
|
+
debouncedBasicFilterSelectionChange(updatedSelection);
|
|
35
|
+
}, [debouncedBasicFilterSelectionChange, filterSelections]);
|
|
23
36
|
|
|
24
37
|
// TODO: further refactoring in EDM-9573
|
|
25
38
|
// https://stash.atlassian.com/projects/ATLASSIAN/repos/atlassian-frontend-monorepo/pull-requests/82725/overview?commentId=6827913
|
|
26
39
|
useEffect(() => {
|
|
27
40
|
if (currentCloudId.current !== cloudId) {
|
|
28
41
|
setSearchBarSearchString('');
|
|
42
|
+
setFilterSelections({});
|
|
29
43
|
currentCloudId.current = cloudId;
|
|
30
44
|
}
|
|
31
45
|
}, [cloudId]);
|
|
32
|
-
const handleBasicFilterSelectionChange = useCallback((filterType, options) => {
|
|
33
|
-
const updatedSelection = {
|
|
34
|
-
...filterSelections,
|
|
35
|
-
[filterType]: options
|
|
36
|
-
};
|
|
37
|
-
setFilterSelections(updatedSelection);
|
|
38
|
-
//TODO: move to debounce fn in https://product-fabric.atlassian.net/browse/EDM-9485
|
|
39
|
-
onSearch(searchBarSearchString, updatedSelection);
|
|
40
|
-
}, [filterSelections, onSearch, searchBarSearchString]);
|
|
41
46
|
const showBasicFilters = useMemo(() => {
|
|
42
47
|
if (getBooleanFF('platform.linking-platform.datasource.show-clol-basic-filters')) {
|
|
43
48
|
return true;
|
|
@@ -56,6 +61,8 @@ const ConfluenceSearchContainer = ({
|
|
|
56
61
|
placeholder: searchMessages.searchLabel,
|
|
57
62
|
fullWidth: !showBasicFilters
|
|
58
63
|
}), showBasicFilters && /*#__PURE__*/React.createElement(BasicFilters, {
|
|
64
|
+
cloudId: cloudId,
|
|
65
|
+
selections: filterSelections,
|
|
59
66
|
onChange: handleBasicFilterSelectionChange
|
|
60
67
|
}));
|
|
61
68
|
};
|
|
@@ -78,7 +78,8 @@ export const PlainConfluenceSearchConfigModal = props => {
|
|
|
78
78
|
const [cloudId, setCloudId] = useState(initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.cloudId);
|
|
79
79
|
const [searchString, setSearchString] = useState(initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.searchString);
|
|
80
80
|
const [visibleColumnKeys, setVisibleColumnKeys] = useState(initialVisibleColumnKeys);
|
|
81
|
-
const [lastModified, setLastModified] = useState();
|
|
81
|
+
const [lastModified, setLastModified] = useState(initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.lastModified);
|
|
82
|
+
const [contributorAccountIds, setContributorAccountIds] = useState((initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.contributorAccountIds) || []);
|
|
82
83
|
|
|
83
84
|
// analytics related parameters
|
|
84
85
|
const searchCount = useRef(0);
|
|
@@ -91,10 +92,13 @@ export const PlainConfluenceSearchConfigModal = props => {
|
|
|
91
92
|
...initialParameters,
|
|
92
93
|
cloudId,
|
|
93
94
|
searchString,
|
|
94
|
-
...(lastModified && {
|
|
95
|
+
...(((initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.lastModified) || lastModified) && {
|
|
95
96
|
lastModified
|
|
97
|
+
}),
|
|
98
|
+
...(((initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.contributorAccountIds) || (contributorAccountIds === null || contributorAccountIds === void 0 ? void 0 : contributorAccountIds.length) > 0) && {
|
|
99
|
+
contributorAccountIds
|
|
96
100
|
})
|
|
97
|
-
}), [cloudId, lastModified, initialParameters, searchString /** Add more parameters when more filters are added */]);
|
|
101
|
+
}), [cloudId, lastModified, contributorAccountIds, initialParameters, searchString /** Add more parameters when more filters are added */]);
|
|
98
102
|
const isParametersSet = useMemo(() => !!cloudId && Object.values(parameters !== null && parameters !== void 0 ? parameters : {}).filter(v => v !== undefined).length > 1, [cloudId, parameters]);
|
|
99
103
|
const parametersToSend = useMemo(() => {
|
|
100
104
|
if (!isParametersSet) {
|
|
@@ -154,6 +158,8 @@ export const PlainConfluenceSearchConfigModal = props => {
|
|
|
154
158
|
const onSiteSelection = useCallback(site => {
|
|
155
159
|
userInteractionActions.current.add(DatasourceAction.INSTANCE_UPDATED);
|
|
156
160
|
setSearchString(undefined);
|
|
161
|
+
setLastModified(undefined);
|
|
162
|
+
setContributorAccountIds([]);
|
|
157
163
|
setCloudId(site.cloudId);
|
|
158
164
|
reset({
|
|
159
165
|
shouldForceRequest: true
|
|
@@ -367,9 +373,19 @@ export const PlainConfluenceSearchConfigModal = props => {
|
|
|
367
373
|
const onSearch = useCallback((newSearchString, filters) => {
|
|
368
374
|
searchCount.current++;
|
|
369
375
|
userInteractionActions.current.add(DatasourceAction.QUERY_UPDATED);
|
|
370
|
-
if (filters
|
|
371
|
-
const
|
|
372
|
-
|
|
376
|
+
if (filters) {
|
|
377
|
+
const {
|
|
378
|
+
editedOrCreatedBy,
|
|
379
|
+
lastModified
|
|
380
|
+
} = filters;
|
|
381
|
+
if (lastModified) {
|
|
382
|
+
const lastModifiedValue = lastModified.find(range => range.value);
|
|
383
|
+
setLastModified(lastModifiedValue === null || lastModifiedValue === void 0 ? void 0 : lastModifiedValue.value);
|
|
384
|
+
}
|
|
385
|
+
if (editedOrCreatedBy) {
|
|
386
|
+
const accountIds = editedOrCreatedBy.map(user => user.value);
|
|
387
|
+
setContributorAccountIds(accountIds);
|
|
388
|
+
}
|
|
373
389
|
}
|
|
374
390
|
setSearchString(newSearchString);
|
|
375
391
|
reset({
|
|
@@ -125,4 +125,155 @@ export var mockFieldValuesResponse = {
|
|
|
125
125
|
}
|
|
126
126
|
}
|
|
127
127
|
}
|
|
128
|
+
};
|
|
129
|
+
export var mockUserRecommendationsResponse = {
|
|
130
|
+
recommendedUsers: [{
|
|
131
|
+
entityType: 'USER',
|
|
132
|
+
id: '5ffe1efc34847e0069446bf8',
|
|
133
|
+
name: 'Atlassian Assist (staging)',
|
|
134
|
+
avatarUrl: '',
|
|
135
|
+
nickname: 'Atlassian Assist (staging)',
|
|
136
|
+
matchPositions: {},
|
|
137
|
+
accessLevel: 'CONTAINER',
|
|
138
|
+
accountStatus: 'ACTIVE',
|
|
139
|
+
notMentionable: false,
|
|
140
|
+
userType: 'APP',
|
|
141
|
+
attributes: {
|
|
142
|
+
isConfluenceExternalCollaborator: false
|
|
143
|
+
}
|
|
144
|
+
}, {
|
|
145
|
+
entityType: 'USER',
|
|
146
|
+
id: '62df272c3aaeedcae755c533',
|
|
147
|
+
name: 'Atlas for Jira (staging)',
|
|
148
|
+
avatarUrl: '',
|
|
149
|
+
nickname: 'Atlas for Jira (staging)',
|
|
150
|
+
matchPositions: {},
|
|
151
|
+
accessLevel: 'CONTAINER',
|
|
152
|
+
accountStatus: 'ACTIVE',
|
|
153
|
+
notMentionable: false,
|
|
154
|
+
userType: 'APP',
|
|
155
|
+
attributes: {
|
|
156
|
+
isConfluenceExternalCollaborator: false
|
|
157
|
+
}
|
|
158
|
+
}, {
|
|
159
|
+
entityType: 'USER',
|
|
160
|
+
id: '6232be743eacc50071fe13ba',
|
|
161
|
+
name: 'Stephen',
|
|
162
|
+
email: 'sdemontfort+10@atlassian.com',
|
|
163
|
+
avatarUrl: '',
|
|
164
|
+
nickname: 'Stephen',
|
|
165
|
+
matchPositions: {},
|
|
166
|
+
accessLevel: 'CONTAINER',
|
|
167
|
+
accountStatus: 'ACTIVE',
|
|
168
|
+
notMentionable: false,
|
|
169
|
+
locale: 'en-GB',
|
|
170
|
+
userType: 'DEFAULT',
|
|
171
|
+
attributes: {
|
|
172
|
+
isConfluenceExternalCollaborator: false
|
|
173
|
+
}
|
|
174
|
+
}, {
|
|
175
|
+
entityType: 'USER',
|
|
176
|
+
id: '608b253e2911000071b6e6d6',
|
|
177
|
+
name: 'Pranay Test 1773',
|
|
178
|
+
email: 'pmarella+1773@atlassian.com',
|
|
179
|
+
avatarUrl: '',
|
|
180
|
+
nickname: 'Pranay Test 1773',
|
|
181
|
+
matchPositions: {},
|
|
182
|
+
accessLevel: 'CONTAINER',
|
|
183
|
+
accountStatus: 'ACTIVE',
|
|
184
|
+
notMentionable: false,
|
|
185
|
+
locale: 'en-US',
|
|
186
|
+
userType: 'DEFAULT',
|
|
187
|
+
attributes: {
|
|
188
|
+
isConfluenceExternalCollaborator: false
|
|
189
|
+
}
|
|
190
|
+
}, {
|
|
191
|
+
entityType: 'USER',
|
|
192
|
+
id: '6202a8cfc4e2c9006ae620b1',
|
|
193
|
+
name: 'Jacob Test3',
|
|
194
|
+
email: 'jbrunson+test3@atlassian.com',
|
|
195
|
+
avatarUrl: '',
|
|
196
|
+
nickname: 'Jacob Test3',
|
|
197
|
+
matchPositions: {},
|
|
198
|
+
accessLevel: 'CONTAINER',
|
|
199
|
+
accountStatus: 'ACTIVE',
|
|
200
|
+
notMentionable: false,
|
|
201
|
+
locale: 'en-US',
|
|
202
|
+
userType: 'DEFAULT',
|
|
203
|
+
attributes: {
|
|
204
|
+
isConfluenceExternalCollaborator: false
|
|
205
|
+
}
|
|
206
|
+
}, {
|
|
207
|
+
entityType: 'USER',
|
|
208
|
+
id: '61428180ff23ba00717b7d78',
|
|
209
|
+
name: 'Test Themes',
|
|
210
|
+
avatarUrl: '',
|
|
211
|
+
nickname: 'Test Themes',
|
|
212
|
+
matchPositions: {},
|
|
213
|
+
accessLevel: 'CONTAINER',
|
|
214
|
+
accountStatus: 'ACTIVE',
|
|
215
|
+
notMentionable: false,
|
|
216
|
+
userType: 'APP',
|
|
217
|
+
attributes: {
|
|
218
|
+
isConfluenceExternalCollaborator: false
|
|
219
|
+
}
|
|
220
|
+
}, {
|
|
221
|
+
entityType: 'USER',
|
|
222
|
+
id: '5d9e2c300d44fc0dca5428bb',
|
|
223
|
+
name: 'Confluence Connect Test - AP methods',
|
|
224
|
+
avatarUrl: '',
|
|
225
|
+
nickname: 'Confluence Connect Test - AP methods',
|
|
226
|
+
matchPositions: {},
|
|
227
|
+
accessLevel: 'CONTAINER',
|
|
228
|
+
accountStatus: 'ACTIVE',
|
|
229
|
+
notMentionable: false,
|
|
230
|
+
userType: 'APP',
|
|
231
|
+
attributes: {
|
|
232
|
+
isConfluenceExternalCollaborator: false
|
|
233
|
+
}
|
|
234
|
+
}, {
|
|
235
|
+
entityType: 'USER',
|
|
236
|
+
id: '655363:1276a696-f0d0-4f3a-a022-636723eb5148',
|
|
237
|
+
name: 'Confluence Google Drive',
|
|
238
|
+
avatarUrl: '',
|
|
239
|
+
nickname: 'Confluence Google Drive',
|
|
240
|
+
matchPositions: {},
|
|
241
|
+
accessLevel: 'CONTAINER',
|
|
242
|
+
accountStatus: 'ACTIVE',
|
|
243
|
+
notMentionable: false,
|
|
244
|
+
userType: 'APP',
|
|
245
|
+
attributes: {
|
|
246
|
+
isConfluenceExternalCollaborator: false
|
|
247
|
+
}
|
|
248
|
+
}, {
|
|
249
|
+
entityType: 'USER',
|
|
250
|
+
id: '712020:413e43c0-7202-4016-a318-a004892e7f8c',
|
|
251
|
+
name: 'arthur chen nth user',
|
|
252
|
+
avatarUrl: '',
|
|
253
|
+
nickname: 'arthur chen nth user',
|
|
254
|
+
matchPositions: {},
|
|
255
|
+
accessLevel: 'CONTAINER',
|
|
256
|
+
accountStatus: 'ACTIVE',
|
|
257
|
+
notMentionable: false,
|
|
258
|
+
locale: 'en-US',
|
|
259
|
+
userType: 'DEFAULT',
|
|
260
|
+
attributes: {
|
|
261
|
+
isConfluenceExternalCollaborator: false
|
|
262
|
+
}
|
|
263
|
+
}, {
|
|
264
|
+
entityType: 'USER',
|
|
265
|
+
id: '712020:9219bf5f-0358-4782-99dc-bc73258b2ddc',
|
|
266
|
+
name: 'jeff mellis',
|
|
267
|
+
avatarUrl: '',
|
|
268
|
+
nickname: 'jeff mellis',
|
|
269
|
+
matchPositions: {},
|
|
270
|
+
accessLevel: 'CONTAINER',
|
|
271
|
+
accountStatus: 'ACTIVE',
|
|
272
|
+
notMentionable: false,
|
|
273
|
+
locale: 'en-US',
|
|
274
|
+
userType: 'DEFAULT',
|
|
275
|
+
attributes: {
|
|
276
|
+
isConfluenceExternalCollaborator: false
|
|
277
|
+
}
|
|
278
|
+
}]
|
|
128
279
|
};
|
|
@@ -2,7 +2,7 @@ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
|
|
|
2
2
|
import _regeneratorRuntime from "@babel/runtime/regenerator";
|
|
3
3
|
import { useCallback, useMemo } from 'react';
|
|
4
4
|
import { request } from '@atlaskit/linking-common';
|
|
5
|
-
import { fieldValuesQuery, hydrateJQLQuery } from './utils';
|
|
5
|
+
import { fieldValuesQuery, hydrateJQLQuery, userQuery } from './utils';
|
|
6
6
|
var AGG_BASE_URL = '/gateway/api/graphql';
|
|
7
7
|
export var useBasicFilterAGG = function useBasicFilterAGG() {
|
|
8
8
|
var requestCall = useCallback( /*#__PURE__*/function () {
|
|
@@ -54,10 +54,17 @@ export var useBasicFilterAGG = function useBasicFilterAGG() {
|
|
|
54
54
|
query: fieldValuesQuery
|
|
55
55
|
});
|
|
56
56
|
}, [requestCall]);
|
|
57
|
+
var getCurrentUserInfo = useCallback(function () {
|
|
58
|
+
return requestCall({
|
|
59
|
+
operationName: 'userQuery',
|
|
60
|
+
query: userQuery
|
|
61
|
+
});
|
|
62
|
+
}, [requestCall]);
|
|
57
63
|
return useMemo(function () {
|
|
58
64
|
return {
|
|
59
65
|
getHydratedJQL: getHydratedJQL,
|
|
60
|
-
getFieldValues: getFieldValues
|
|
66
|
+
getFieldValues: getFieldValues,
|
|
67
|
+
getCurrentUserInfo: getCurrentUserInfo
|
|
61
68
|
};
|
|
62
|
-
}, [getHydratedJQL, getFieldValues]);
|
|
69
|
+
}, [getHydratedJQL, getFieldValues, getCurrentUserInfo]);
|
|
63
70
|
};
|
|
@@ -6,4 +6,5 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
export var hydrateJQLQuery = "query hydrate($cloudId: ID!, $jql: String!) {\n jira {\n jqlBuilder(cloudId: $cloudId) {\n hydrateJqlQuery(query: $jql) {\n ... on JiraJqlHydratedQuery {\n fields {\n ... on JiraJqlQueryHydratedField {\n jqlTerm\n values {\n ... on JiraJqlQueryHydratedValue {\n values {\n ... on JiraJqlProjectFieldValue {\n jqlTerm\n displayName\n project {\n avatar {\n small\n }\n }\n }\n ... on JiraJqlStatusFieldValue {\n jqlTerm\n displayName\n statusCategory {\n colorName\n }\n }\n ... on JiraJqlIssueTypeFieldValue {\n jqlTerm\n displayName\n issueTypes {\n avatar {\n small\n }\n }\n }\n ... on JiraJqlUserFieldValue {\n jqlTerm\n displayName\n user {\n picture\n }\n }\n ... on JiraJqlGroupFieldValue {\n jqlTerm\n displayName\n group {\n name\n }\n }\n }\n }\n }\n }\n }\n }\n }\n }\n }\n}";
|
|
9
|
-
export var fieldValuesQuery = "query fieldValues($cloudId: ID!, $first: Int = 10, $jqlTerm: String!, $jql: String!, $searchString: String!, $after: String) {\n jira {\n jqlBuilder(cloudId: $cloudId) {\n fieldValues(\n first: $first\n jqlTerm: $jqlTerm\n jqlContext: $jql\n searchString: $searchString\n after: $after\n ) {\n totalCount\n pageInfo {\n endCursor\n }\n edges {\n node {\n jqlTerm\n displayName\n ... on JiraJqlProjectFieldValue {\n project {\n avatar {\n small\n }\n }\n }\n ... on JiraJqlIssueTypeFieldValue {\n issueTypes {\n avatar {\n small\n }\n }\n }\n ... on JiraJqlStatusFieldValue {\n statusCategory {\n colorName\n }\n }\n ... on JiraJqlUserFieldValue {\n user {\n picture\n }\n }\n ... on JiraJqlGroupFieldValue {\n group {\n name\n }\n }\n }\n }\n }\n }\n }\n}";
|
|
9
|
+
export var fieldValuesQuery = "query fieldValues($cloudId: ID!, $first: Int = 10, $jqlTerm: String!, $jql: String!, $searchString: String!, $after: String) {\n jira {\n jqlBuilder(cloudId: $cloudId) {\n fieldValues(\n first: $first\n jqlTerm: $jqlTerm\n jqlContext: $jql\n searchString: $searchString\n after: $after\n ) {\n totalCount\n pageInfo {\n endCursor\n }\n edges {\n node {\n jqlTerm\n displayName\n ... on JiraJqlProjectFieldValue {\n project {\n avatar {\n small\n }\n }\n }\n ... on JiraJqlIssueTypeFieldValue {\n issueTypes {\n avatar {\n small\n }\n }\n }\n ... on JiraJqlStatusFieldValue {\n statusCategory {\n colorName\n }\n }\n ... on JiraJqlUserFieldValue {\n user {\n picture\n }\n }\n ... on JiraJqlGroupFieldValue {\n group {\n name\n }\n }\n }\n }\n }\n }\n }\n}";
|
|
10
|
+
export var userQuery = "query userQuery {\n me {\n user {\n id\n accountId\n }\n }\n}";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React
|
|
1
|
+
import React from 'react';
|
|
2
2
|
import Avatar from '@atlaskit/avatar';
|
|
3
3
|
import PeopleGroupIcon from '@atlaskit/icon/glyph/people-group';
|
|
4
4
|
import Lozenge from '@atlaskit/lozenge';
|
|
@@ -63,9 +63,6 @@ var AvatarOptionLabel = function AvatarOptionLabel(_ref3) {
|
|
|
63
63
|
}, data.label));
|
|
64
64
|
};
|
|
65
65
|
var formatOptionLabel = function formatOptionLabel(data) {
|
|
66
|
-
if (data.optionType === 'defaultOption') {
|
|
67
|
-
return /*#__PURE__*/React.createElement(Fragment, null);
|
|
68
|
-
}
|
|
69
66
|
if (data.optionType === 'lozengeLabel') {
|
|
70
67
|
return /*#__PURE__*/React.createElement(LozengeOptionLabel, {
|
|
71
68
|
data: data
|
|
@@ -76,8 +73,11 @@ var formatOptionLabel = function formatOptionLabel(data) {
|
|
|
76
73
|
data: data
|
|
77
74
|
});
|
|
78
75
|
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
76
|
+
if (data.optionType === 'iconLabel') {
|
|
77
|
+
return /*#__PURE__*/React.createElement(IconOptionLabel, {
|
|
78
|
+
data: data
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null);
|
|
82
82
|
};
|
|
83
83
|
export default formatOptionLabel;
|
|
@@ -23,7 +23,8 @@ var noFilterOptions = function noFilterOptions() {
|
|
|
23
23
|
};
|
|
24
24
|
export var FilterPopupSelect = function FilterPopupSelect(_ref) {
|
|
25
25
|
var filterName = _ref.filterName,
|
|
26
|
-
totalCount = _ref.totalCount,
|
|
26
|
+
_ref$totalCount = _ref.totalCount,
|
|
27
|
+
totalCount = _ref$totalCount === void 0 ? 0 : _ref$totalCount,
|
|
27
28
|
status = _ref.status,
|
|
28
29
|
buttonLabel = _ref.buttonLabel,
|
|
29
30
|
_ref$showLoading = _ref.showLoading,
|
|
@@ -8,8 +8,7 @@ import { Box, Flex, xcss } from '@atlaskit/primitives';
|
|
|
8
8
|
import Spinner from '@atlaskit/spinner';
|
|
9
9
|
var triggerButtonLabelStyles = xcss({
|
|
10
10
|
textOverflow: 'ellipsis',
|
|
11
|
-
overflow: 'hidden'
|
|
12
|
-
maxWidth: '150px'
|
|
11
|
+
overflow: 'hidden'
|
|
13
12
|
});
|
|
14
13
|
var badgeStyles = xcss({
|
|
15
14
|
marginLeft: 'space.050'
|
|
@@ -41,15 +40,15 @@ var PopupTrigger = /*#__PURE__*/forwardRef(function (_ref, ref) {
|
|
|
41
40
|
firstOption = _ref3[0];
|
|
42
41
|
var hasOptions = selectedOptions && selectedOptions.length > 0;
|
|
43
42
|
var showButtonLoading = !isDisabled && isLoading;
|
|
44
|
-
var
|
|
43
|
+
var triggerButtonTestId = "".concat(testId, "-trigger");
|
|
45
44
|
var LoadingButton = useCallback(function () {
|
|
46
45
|
return /*#__PURE__*/React.createElement(LoadingStateAnimationWrapper, null, /*#__PURE__*/React.createElement(Button, {
|
|
47
46
|
iconAfter: /*#__PURE__*/React.createElement(Spinner, {
|
|
48
47
|
size: 'xsmall'
|
|
49
48
|
}),
|
|
50
|
-
testId: "".concat(
|
|
49
|
+
testId: "".concat(triggerButtonTestId, "--loading-button")
|
|
51
50
|
}, label));
|
|
52
|
-
}, [label,
|
|
51
|
+
}, [label, triggerButtonTestId]);
|
|
53
52
|
var DefaultButton = useCallback(function () {
|
|
54
53
|
return /*#__PURE__*/React.createElement(Button, {
|
|
55
54
|
appearance: "default",
|
|
@@ -58,7 +57,7 @@ var PopupTrigger = /*#__PURE__*/forwardRef(function (_ref, ref) {
|
|
|
58
57
|
iconAfter: /*#__PURE__*/React.createElement(ChevronDownIcon, {
|
|
59
58
|
label: ""
|
|
60
59
|
}),
|
|
61
|
-
testId: "".concat(
|
|
60
|
+
testId: "".concat(triggerButtonTestId, "--button")
|
|
62
61
|
}, /*#__PURE__*/React.createElement(Flex, null, /*#__PURE__*/React.createElement(Box, {
|
|
63
62
|
xcss: triggerButtonLabelStyles
|
|
64
63
|
}, label, firstOption && /*#__PURE__*/React.createElement(React.Fragment, null, ": ", firstOption.label)), selectedOptions && selectedOptions.length > 1 && /*#__PURE__*/React.createElement(Flex, {
|
|
@@ -67,7 +66,7 @@ var PopupTrigger = /*#__PURE__*/forwardRef(function (_ref, ref) {
|
|
|
67
66
|
}, /*#__PURE__*/React.createElement(Badge, {
|
|
68
67
|
appearance: "primary"
|
|
69
68
|
}, "+", selectedOptions.length - 1))));
|
|
70
|
-
}, [firstOption, hasOptions, isDisabled, isSelected, label, selectedOptions,
|
|
69
|
+
}, [firstOption, hasOptions, isDisabled, isSelected, label, selectedOptions, triggerButtonTestId]);
|
|
71
70
|
|
|
72
71
|
/**
|
|
73
72
|
* We had an issue with the popup component referencing a stale DOM ref for the trigger button.
|
|
@@ -75,7 +74,7 @@ var PopupTrigger = /*#__PURE__*/forwardRef(function (_ref, ref) {
|
|
|
75
74
|
*/
|
|
76
75
|
return /*#__PURE__*/React.createElement(Box, {
|
|
77
76
|
ref: ref,
|
|
78
|
-
testId:
|
|
77
|
+
testId: triggerButtonTestId
|
|
79
78
|
}, showButtonLoading ? /*#__PURE__*/React.createElement(LoadingButton, null) : /*#__PURE__*/React.createElement(DefaultButton, null));
|
|
80
79
|
});
|
|
81
80
|
export default PopupTrigger;
|
package/dist/esm/ui/confluence-search-modal/basic-filters/filters/edited-or-created-by/index.js
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
|
|
2
|
+
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
3
|
+
import _regeneratorRuntime from "@babel/runtime/regenerator";
|
|
4
|
+
import React, { useCallback, useState } from 'react';
|
|
5
|
+
import { useIntl } from 'react-intl-next';
|
|
6
|
+
import { useDebouncedCallback } from 'use-debounce';
|
|
7
|
+
import { FilterPopupSelect } from '../../../../common/modal/popup-select';
|
|
8
|
+
import { SEARCH_DEBOUNCE_MS } from '../../../../common/modal/popup-select/constants';
|
|
9
|
+
import { useCurrentUserInfo } from '../../hooks/useCurrentUserInfo';
|
|
10
|
+
import useRecommendation from '../../hooks/useRecommendation';
|
|
11
|
+
import { CLOLBasicFilters } from '../../types';
|
|
12
|
+
import { editedOrCreatedByMessage } from './messages';
|
|
13
|
+
var filterName = "clol-basic-filter-".concat(CLOLBasicFilters.editedOrCreatedBy);
|
|
14
|
+
var EditedOrCreatedByFilter = function EditedOrCreatedByFilter(_ref) {
|
|
15
|
+
var cloudId = _ref.cloudId,
|
|
16
|
+
onSelectionChange = _ref.onSelectionChange,
|
|
17
|
+
_ref$selection = _ref.selection,
|
|
18
|
+
selection = _ref$selection === void 0 ? [] : _ref$selection;
|
|
19
|
+
var _useCurrentUserInfo = useCurrentUserInfo(),
|
|
20
|
+
user = _useCurrentUserInfo.user;
|
|
21
|
+
var _useIntl = useIntl(),
|
|
22
|
+
formatMessage = _useIntl.formatMessage;
|
|
23
|
+
var _useRecommendation = useRecommendation(),
|
|
24
|
+
status = _useRecommendation.status,
|
|
25
|
+
filterOptions = _useRecommendation.filterOptions,
|
|
26
|
+
fetchFilterOptions = _useRecommendation.fetchFilterOptions,
|
|
27
|
+
errors = _useRecommendation.errors;
|
|
28
|
+
var _useState = useState(''),
|
|
29
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
30
|
+
searchTerm = _useState2[0],
|
|
31
|
+
setSearchTerm = _useState2[1];
|
|
32
|
+
var _useDebouncedCallback = useDebouncedCallback(function (searchTerm) {
|
|
33
|
+
if (cloudId && user !== null && user !== void 0 && user.accountId) {
|
|
34
|
+
fetchFilterOptions({
|
|
35
|
+
searchTerm: searchTerm,
|
|
36
|
+
cloudId: cloudId,
|
|
37
|
+
userId: user.accountId
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
}, SEARCH_DEBOUNCE_MS),
|
|
41
|
+
_useDebouncedCallback2 = _slicedToArray(_useDebouncedCallback, 1),
|
|
42
|
+
handleDebouncedFetchFilterOptions = _useDebouncedCallback2[0];
|
|
43
|
+
var handleInputChange = useCallback( /*#__PURE__*/function () {
|
|
44
|
+
var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(newSearchTerm) {
|
|
45
|
+
return _regeneratorRuntime.wrap(function _callee$(_context) {
|
|
46
|
+
while (1) switch (_context.prev = _context.next) {
|
|
47
|
+
case 0:
|
|
48
|
+
setSearchTerm(newSearchTerm);
|
|
49
|
+
handleDebouncedFetchFilterOptions(newSearchTerm);
|
|
50
|
+
case 2:
|
|
51
|
+
case "end":
|
|
52
|
+
return _context.stop();
|
|
53
|
+
}
|
|
54
|
+
}, _callee);
|
|
55
|
+
}));
|
|
56
|
+
return function (_x) {
|
|
57
|
+
return _ref2.apply(this, arguments);
|
|
58
|
+
};
|
|
59
|
+
}(), [handleDebouncedFetchFilterOptions]);
|
|
60
|
+
var handleOptionSelection = useCallback(function (newValue) {
|
|
61
|
+
onSelectionChange(CLOLBasicFilters.editedOrCreatedBy, newValue);
|
|
62
|
+
}, [onSelectionChange]);
|
|
63
|
+
var handleMenuOpen = useCallback(function () {
|
|
64
|
+
if ((status === 'empty' || status === 'rejected') && cloudId && user !== null && user !== void 0 && user.accountId) {
|
|
65
|
+
// if user searches and gets status as rejected, we want the dropdown to try load the request with searchString when the user reopens the dropdown
|
|
66
|
+
fetchFilterOptions({
|
|
67
|
+
cloudId: cloudId,
|
|
68
|
+
userId: user.accountId,
|
|
69
|
+
searchTerm: searchTerm
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}, [fetchFilterOptions, status, cloudId, user === null || user === void 0 ? void 0 : user.accountId, searchTerm]);
|
|
73
|
+
var filterOptionsLength = filterOptions.length;
|
|
74
|
+
var isError = status === 'rejected';
|
|
75
|
+
var isLoading = status === 'loading' || status === 'empty';
|
|
76
|
+
var isEmpty = status === 'resolved' && filterOptionsLength === 0;
|
|
77
|
+
var isDisabled = !cloudId || !(user !== null && user !== void 0 && user.accountId);
|
|
78
|
+
return /*#__PURE__*/React.createElement(FilterPopupSelect, {
|
|
79
|
+
buttonLabel: formatMessage(editedOrCreatedByMessage.buttonLabel),
|
|
80
|
+
filterName: filterName,
|
|
81
|
+
isDisabled: isDisabled,
|
|
82
|
+
options: filterOptions,
|
|
83
|
+
showLoading: isLoading,
|
|
84
|
+
selectedOptions: selection,
|
|
85
|
+
onSelectionChange: handleOptionSelection,
|
|
86
|
+
onInputChange: handleInputChange,
|
|
87
|
+
showHydrating: false,
|
|
88
|
+
shouldShowFooter: false,
|
|
89
|
+
status: status,
|
|
90
|
+
onMenuOpen: handleMenuOpen,
|
|
91
|
+
menuListProps: {
|
|
92
|
+
filterName: filterName,
|
|
93
|
+
errors: errors,
|
|
94
|
+
isLoading: isLoading,
|
|
95
|
+
isError: isError,
|
|
96
|
+
isEmpty: isEmpty
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
};
|
|
100
|
+
export default EditedOrCreatedByFilter;
|
package/dist/esm/ui/confluence-search-modal/basic-filters/filters/edited-or-created-by/messages.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { defineMessages } from 'react-intl-next';
|
|
2
|
+
export var editedOrCreatedByMessage = defineMessages({
|
|
3
|
+
buttonLabel: {
|
|
4
|
+
id: 'linkDataSource.clol-basic-filter.editedOrCreatedBy.label',
|
|
5
|
+
description: 'Label to be displayed for "Edited or created by" filter dropdown button.',
|
|
6
|
+
defaultMessage: 'Edited or created by'
|
|
7
|
+
}
|
|
8
|
+
});
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
|
|
2
|
+
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
3
|
+
import _regeneratorRuntime from "@babel/runtime/regenerator";
|
|
4
|
+
import { useCallback, useEffect, useState } from 'react';
|
|
5
|
+
import { useBasicFilterAGG } from '../../../../services/useBasicFilterAGG';
|
|
6
|
+
export var useCurrentUserInfo = function useCurrentUserInfo() {
|
|
7
|
+
var _useState = useState(),
|
|
8
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
9
|
+
user = _useState2[0],
|
|
10
|
+
setUser = _useState2[1];
|
|
11
|
+
var _useBasicFilterAGG = useBasicFilterAGG(),
|
|
12
|
+
getCurrentUserInfoFromAGG = _useBasicFilterAGG.getCurrentUserInfo;
|
|
13
|
+
var getCurrentUserInfo = useCallback( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
|
|
14
|
+
var _user$data;
|
|
15
|
+
var user, _user$data2;
|
|
16
|
+
return _regeneratorRuntime.wrap(function _callee$(_context) {
|
|
17
|
+
while (1) switch (_context.prev = _context.next) {
|
|
18
|
+
case 0:
|
|
19
|
+
_context.next = 2;
|
|
20
|
+
return getCurrentUserInfoFromAGG();
|
|
21
|
+
case 2:
|
|
22
|
+
user = _context.sent;
|
|
23
|
+
if (user !== null && user !== void 0 && (_user$data = user.data) !== null && _user$data !== void 0 && _user$data.me.user) {
|
|
24
|
+
setUser((_user$data2 = user.data) === null || _user$data2 === void 0 ? void 0 : _user$data2.me.user);
|
|
25
|
+
} else {
|
|
26
|
+
setUser(undefined);
|
|
27
|
+
}
|
|
28
|
+
case 4:
|
|
29
|
+
case "end":
|
|
30
|
+
return _context.stop();
|
|
31
|
+
}
|
|
32
|
+
}, _callee);
|
|
33
|
+
})), [getCurrentUserInfoFromAGG]);
|
|
34
|
+
useEffect(function () {
|
|
35
|
+
getCurrentUserInfo();
|
|
36
|
+
}, [getCurrentUserInfo]);
|
|
37
|
+
return {
|
|
38
|
+
user: user,
|
|
39
|
+
getCurrentUserInfo: getCurrentUserInfo
|
|
40
|
+
};
|
|
41
|
+
};
|