@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.
Files changed (59) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/cjs/services/mocks.js +152 -1
  3. package/dist/cjs/services/useBasicFilterAGG.js +9 -2
  4. package/dist/cjs/services/utils.js +3 -2
  5. package/dist/cjs/ui/common/modal/popup-select/formatOptionLabel.js +7 -10
  6. package/dist/cjs/ui/common/modal/popup-select/index.js +2 -1
  7. package/dist/cjs/ui/common/modal/popup-select/trigger.js +7 -8
  8. package/dist/cjs/ui/confluence-search-modal/basic-filters/filters/edited-or-created-by/index.js +110 -0
  9. package/dist/cjs/ui/confluence-search-modal/basic-filters/filters/edited-or-created-by/messages.js +14 -0
  10. package/dist/cjs/ui/confluence-search-modal/basic-filters/hooks/useCurrentUserInfo.js +48 -0
  11. package/dist/cjs/ui/confluence-search-modal/basic-filters/hooks/useRecommendation.js +120 -0
  12. package/dist/cjs/ui/confluence-search-modal/basic-filters/index.js +12 -3
  13. package/dist/cjs/ui/confluence-search-modal/confluence-search-container/index.js +15 -6
  14. package/dist/cjs/ui/confluence-search-modal/modal/index.js +35 -17
  15. package/dist/es2019/services/mocks.js +151 -0
  16. package/dist/es2019/services/useBasicFilterAGG.js +8 -3
  17. package/dist/es2019/services/utils.js +8 -0
  18. package/dist/es2019/ui/common/modal/popup-select/formatOptionLabel.js +7 -7
  19. package/dist/es2019/ui/common/modal/popup-select/index.js +1 -1
  20. package/dist/es2019/ui/common/modal/popup-select/trigger.js +7 -8
  21. package/dist/es2019/ui/confluence-search-modal/basic-filters/filters/edited-or-created-by/index.js +82 -0
  22. package/dist/es2019/ui/confluence-search-modal/basic-filters/filters/edited-or-created-by/messages.js +8 -0
  23. package/dist/es2019/ui/confluence-search-modal/basic-filters/hooks/useCurrentUserInfo.js +25 -0
  24. package/dist/es2019/ui/confluence-search-modal/basic-filters/hooks/useRecommendation.js +74 -0
  25. package/dist/es2019/ui/confluence-search-modal/basic-filters/index.js +13 -3
  26. package/dist/es2019/ui/confluence-search-modal/confluence-search-container/index.js +16 -9
  27. package/dist/es2019/ui/confluence-search-modal/modal/index.js +22 -6
  28. package/dist/esm/services/mocks.js +151 -0
  29. package/dist/esm/services/useBasicFilterAGG.js +10 -3
  30. package/dist/esm/services/utils.js +2 -1
  31. package/dist/esm/ui/common/modal/popup-select/formatOptionLabel.js +7 -7
  32. package/dist/esm/ui/common/modal/popup-select/index.js +2 -1
  33. package/dist/esm/ui/common/modal/popup-select/trigger.js +7 -8
  34. package/dist/esm/ui/confluence-search-modal/basic-filters/filters/edited-or-created-by/index.js +100 -0
  35. package/dist/esm/ui/confluence-search-modal/basic-filters/filters/edited-or-created-by/messages.js +8 -0
  36. package/dist/esm/ui/confluence-search-modal/basic-filters/hooks/useCurrentUserInfo.js +41 -0
  37. package/dist/esm/ui/confluence-search-modal/basic-filters/hooks/useRecommendation.js +113 -0
  38. package/dist/esm/ui/confluence-search-modal/basic-filters/index.js +12 -3
  39. package/dist/esm/ui/confluence-search-modal/confluence-search-container/index.js +15 -6
  40. package/dist/esm/ui/confluence-search-modal/modal/index.js +35 -17
  41. package/dist/types/services/mocks.d.ts +51 -0
  42. package/dist/types/services/useBasicFilterAGG.d.ts +2 -0
  43. package/dist/types/services/utils.d.ts +1 -0
  44. package/dist/types/ui/common/modal/popup-select/index.d.ts +1 -1
  45. package/dist/types/ui/confluence-search-modal/basic-filters/filters/edited-or-created-by/index.d.ts +10 -0
  46. package/dist/types/ui/confluence-search-modal/basic-filters/filters/edited-or-created-by/messages.d.ts +7 -0
  47. package/dist/types/ui/confluence-search-modal/basic-filters/hooks/useCurrentUserInfo.d.ts +7 -0
  48. package/dist/types/ui/confluence-search-modal/basic-filters/hooks/useRecommendation.d.ts +16 -0
  49. package/dist/types/ui/confluence-search-modal/basic-filters/index.d.ts +4 -2
  50. package/dist/types-ts4.5/services/mocks.d.ts +51 -0
  51. package/dist/types-ts4.5/services/useBasicFilterAGG.d.ts +2 -0
  52. package/dist/types-ts4.5/services/utils.d.ts +1 -0
  53. package/dist/types-ts4.5/ui/common/modal/popup-select/index.d.ts +1 -1
  54. package/dist/types-ts4.5/ui/confluence-search-modal/basic-filters/filters/edited-or-created-by/index.d.ts +10 -0
  55. package/dist/types-ts4.5/ui/confluence-search-modal/basic-filters/filters/edited-or-created-by/messages.d.ts +7 -0
  56. package/dist/types-ts4.5/ui/confluence-search-modal/basic-filters/hooks/useCurrentUserInfo.d.ts +7 -0
  57. package/dist/types-ts4.5/ui/confluence-search-modal/basic-filters/hooks/useRecommendation.d.ts +16 -0
  58. package/dist/types-ts4.5/ui/confluence-search-modal/basic-filters/index.d.ts +4 -2
  59. 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 !== null && filters !== void 0 && filters.lastModified) {
371
- const lastModifiedValue = filters.lastModified.find(range => range.value);
372
- setLastModified(lastModifiedValue === null || lastModifiedValue === void 0 ? void 0 : lastModifiedValue.value);
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, { Fragment } from '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
- return /*#__PURE__*/React.createElement(IconOptionLabel, {
80
- data: data
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 tiggerButtonTestId = "".concat(testId, "-trigger");
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(tiggerButtonTestId, "--loading-button")
49
+ testId: "".concat(triggerButtonTestId, "--loading-button")
51
50
  }, label));
52
- }, [label, tiggerButtonTestId]);
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(tiggerButtonTestId, "--button")
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, tiggerButtonTestId]);
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: tiggerButtonTestId
77
+ testId: triggerButtonTestId
79
78
  }, showButtonLoading ? /*#__PURE__*/React.createElement(LoadingButton, null) : /*#__PURE__*/React.createElement(DefaultButton, null));
80
79
  });
81
80
  export default PopupTrigger;
@@ -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;
@@ -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
+ };