@atlaskit/link-picker 1.8.4 → 1.8.5

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 (64) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/cjs/controllers/use-fix-height/index.js +27 -0
  3. package/dist/cjs/ui/link-picker/form-footer/index.js +76 -0
  4. package/dist/cjs/ui/link-picker/form-footer/styled.js +17 -0
  5. package/dist/cjs/ui/link-picker/index.js +29 -74
  6. package/dist/cjs/ui/link-picker/link-search-error/index.js +47 -6
  7. package/dist/cjs/ui/link-picker/link-search-list/index.js +89 -20
  8. package/dist/cjs/ui/link-picker/link-search-list/link-search-no-results/index.js +54 -0
  9. package/dist/cjs/ui/link-picker/{link-search-no-results → link-search-list/link-search-no-results}/no-results-svg/index.js +0 -0
  10. package/dist/cjs/ui/link-picker/{link-search-no-results → link-search-list/link-search-no-results}/no-results-svg/styled.js +0 -0
  11. package/dist/cjs/ui/link-picker/link-search-list/link-search-no-results/styled.js +17 -0
  12. package/dist/cjs/ui/link-picker/link-search-list/styled.js +13 -6
  13. package/dist/cjs/ui/link-picker/messages.js +0 -50
  14. package/dist/cjs/ui/link-picker/styled.js +16 -11
  15. package/dist/cjs/ui/link-picker/text-input/styled.js +1 -1
  16. package/dist/cjs/version.json +1 -1
  17. package/dist/es2019/controllers/use-fix-height/index.js +19 -0
  18. package/dist/es2019/ui/link-picker/form-footer/index.js +51 -0
  19. package/dist/es2019/ui/link-picker/form-footer/styled.js +5 -0
  20. package/dist/es2019/ui/link-picker/index.js +24 -66
  21. package/dist/es2019/ui/link-picker/link-search-error/index.js +40 -4
  22. package/dist/es2019/ui/link-picker/link-search-list/index.js +60 -14
  23. package/dist/es2019/ui/link-picker/link-search-list/link-search-no-results/index.js +35 -0
  24. package/dist/es2019/ui/link-picker/{link-search-no-results → link-search-list/link-search-no-results}/no-results-svg/index.js +0 -0
  25. package/dist/es2019/ui/link-picker/{link-search-no-results → link-search-list/link-search-no-results}/no-results-svg/styled.js +0 -0
  26. package/dist/es2019/ui/link-picker/link-search-list/link-search-no-results/styled.js +6 -0
  27. package/dist/es2019/ui/link-picker/link-search-list/styled.js +23 -2
  28. package/dist/es2019/ui/link-picker/messages.js +0 -50
  29. package/dist/es2019/ui/link-picker/styled.js +20 -15
  30. package/dist/es2019/ui/link-picker/text-input/styled.js +3 -1
  31. package/dist/es2019/version.json +1 -1
  32. package/dist/esm/controllers/use-fix-height/index.js +19 -0
  33. package/dist/esm/ui/link-picker/form-footer/index.js +53 -0
  34. package/dist/esm/ui/link-picker/form-footer/styled.js +6 -0
  35. package/dist/esm/ui/link-picker/index.js +25 -71
  36. package/dist/esm/ui/link-picker/link-search-error/index.js +41 -5
  37. package/dist/esm/ui/link-picker/link-search-list/index.js +67 -13
  38. package/dist/esm/ui/link-picker/link-search-list/link-search-no-results/index.js +37 -0
  39. package/dist/esm/ui/link-picker/{link-search-no-results → link-search-list/link-search-no-results}/no-results-svg/index.js +0 -0
  40. package/dist/esm/ui/link-picker/{link-search-no-results → link-search-list/link-search-no-results}/no-results-svg/styled.js +0 -0
  41. package/dist/esm/ui/link-picker/link-search-list/link-search-no-results/styled.js +6 -0
  42. package/dist/esm/ui/link-picker/link-search-list/styled.js +11 -5
  43. package/dist/esm/ui/link-picker/messages.js +0 -50
  44. package/dist/esm/ui/link-picker/styled.js +14 -11
  45. package/dist/esm/ui/link-picker/text-input/styled.js +1 -1
  46. package/dist/esm/version.json +1 -1
  47. package/dist/types/controllers/use-fix-height/index.d.ts +8 -0
  48. package/dist/types/ui/link-picker/form-footer/index.d.ts +13 -0
  49. package/dist/types/ui/link-picker/form-footer/styled.d.ts +1 -0
  50. package/dist/types/ui/link-picker/index.d.ts +16 -16
  51. package/dist/types/ui/link-picker/link-search-error/index.d.ts +19 -3
  52. package/dist/types/ui/link-picker/link-search-list/index.d.ts +30 -5
  53. package/dist/types/ui/link-picker/link-search-list/link-search-no-results/index.d.ts +19 -0
  54. package/dist/types/ui/link-picker/{link-search-no-results → link-search-list/link-search-no-results}/no-results-svg/index.d.ts +0 -0
  55. package/dist/types/ui/link-picker/{link-search-no-results → link-search-list/link-search-no-results}/no-results-svg/styled.d.ts +0 -0
  56. package/dist/types/ui/link-picker/link-search-list/link-search-no-results/styled.d.ts +1 -0
  57. package/dist/types/ui/link-picker/link-search-list/styled.d.ts +1 -0
  58. package/dist/types/ui/link-picker/messages.d.ts +0 -50
  59. package/dist/types/ui/link-picker/styled.d.ts +5 -1
  60. package/package.json +6 -6
  61. package/dist/cjs/ui/link-picker/link-search-no-results/index.js +0 -27
  62. package/dist/es2019/ui/link-picker/link-search-no-results/index.js +0 -10
  63. package/dist/esm/ui/link-picker/link-search-no-results/index.js +0 -14
  64. package/dist/types/ui/link-picker/link-search-no-results/index.d.ts +0 -4
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @atlaskit/link-picker
2
2
 
3
+ ## 1.8.5
4
+
5
+ ### Patch Changes
6
+
7
+ - [`47c9a0a3331`](https://bitbucket.org/atlassian/atlassian-frontend/commits/47c9a0a3331) - Improves spacing and reduced jitter of height when loading items.
8
+
3
9
  ## 1.8.4
4
10
 
5
11
  ### Patch Changes
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _react = require("react");
9
+
10
+ var useFixHeight = function useFixHeight(shouldFixHeight) {
11
+ var ref = (0, _react.useRef)(null);
12
+ var currentHeight = (0, _react.useRef)(null);
13
+ (0, _react.useLayoutEffect)(function () {
14
+ if (ref.current) {
15
+ currentHeight.current = ref.current.getBoundingClientRect().height;
16
+ }
17
+ });
18
+ return {
19
+ ref: ref,
20
+ style: shouldFixHeight ? {
21
+ minHeight: currentHeight.current || 'auto'
22
+ } : undefined
23
+ };
24
+ };
25
+
26
+ var _default = useFixHeight;
27
+ exports.default = _default;
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+
7
+ Object.defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+ exports.testIds = exports.default = void 0;
11
+
12
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
13
+
14
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
15
+
16
+ var _react = require("@emotion/react");
17
+
18
+ var _reactIntlNext = require("react-intl-next");
19
+
20
+ var _button = _interopRequireWildcard(require("@atlaskit/button"));
21
+
22
+ var _styled = require("./styled");
23
+
24
+ var _react2 = require("react");
25
+
26
+ var _excluded = ["isEditing", "onCancel"];
27
+
28
+ 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); }
29
+
30
+ 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; }
31
+
32
+ var messages = (0, _reactIntlNext.defineMessages)({
33
+ cancelButton: {
34
+ id: 'fabric.linkPicker.button.cancel',
35
+ defaultMessage: 'Cancel',
36
+ description: 'Button to cancel and dismiss the link picker'
37
+ },
38
+ saveButton: {
39
+ id: 'fabric.linkPicker.button.save',
40
+ defaultMessage: 'Save',
41
+ description: 'Button to save edited link'
42
+ },
43
+ insertButton: {
44
+ id: 'fabric.linkPicker.button.insert',
45
+ defaultMessage: 'Insert',
46
+ description: 'Button to insert searched or selected link'
47
+ }
48
+ });
49
+ var testIds = {
50
+ insertButton: 'link-picker-insert-button',
51
+ cancelButton: 'link-picker-cancel-button'
52
+ };
53
+ exports.testIds = testIds;
54
+
55
+ var FormFooter = function FormFooter(_ref) {
56
+ var isEditing = _ref.isEditing,
57
+ onCancel = _ref.onCancel,
58
+ restProps = (0, _objectWithoutProperties2.default)(_ref, _excluded);
59
+ var intl = (0, _reactIntlNext.useIntl)();
60
+ var insertButtonMsg = isEditing ? messages.saveButton : messages.insertButton;
61
+ return (0, _react.jsx)("footer", (0, _extends2.default)({
62
+ css: _styled.formFooterStyles
63
+ }, restProps), (0, _react.jsx)(_button.ButtonGroup, null, (0, _react.jsx)(_button.default, {
64
+ appearance: "default",
65
+ onClick: onCancel,
66
+ testId: testIds.cancelButton
67
+ }, intl.formatMessage(messages.cancelButton)), (0, _react.jsx)(_button.default, {
68
+ type: "submit",
69
+ appearance: "primary",
70
+ testId: testIds.insertButton
71
+ }, intl.formatMessage(insertButtonMsg))));
72
+ };
73
+
74
+ var _default = /*#__PURE__*/(0, _react2.memo)(FormFooter);
75
+
76
+ exports.default = _default;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.formFooterStyles = void 0;
9
+
10
+ var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
11
+
12
+ var _react = require("@emotion/react");
13
+
14
+ var _templateObject;
15
+
16
+ var formFooterStyles = (0, _react.css)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n display: flex;\n justify-content: flex-end;\n"])));
17
+ exports.formFooterStyles = formFooterStyles;
@@ -23,10 +23,6 @@ var _reactIntlNext = require("react-intl-next");
23
23
 
24
24
  var _analyticsNext = require("@atlaskit/analytics-next");
25
25
 
26
- var _button = _interopRequireWildcard(require("@atlaskit/button"));
27
-
28
- var _form = require("@atlaskit/form");
29
-
30
26
  var _search = _interopRequireDefault(require("@atlaskit/icon/glyph/editor/search"));
31
27
 
32
28
  var _tabs = _interopRequireWildcard(require("@atlaskit/tabs"));
@@ -47,21 +43,23 @@ var _messages = require("./messages");
47
43
 
48
44
  var _textInput = _interopRequireDefault(require("./text-input"));
49
45
 
50
- var _linkSearchList = _interopRequireDefault(require("./link-search-list"));
51
-
52
46
  var _url2 = require("../../common/utils/url");
53
47
 
48
+ var _useFixHeight = _interopRequireDefault(require("../../controllers/use-fix-height"));
49
+
54
50
  var _styled = require("./styled");
55
51
 
56
52
  var _browser = require("./browser");
57
53
 
58
54
  var _announcer = _interopRequireDefault(require("./announcer"));
59
55
 
60
- var _linkSearchNoResults = _interopRequireDefault(require("./link-search-no-results"));
61
-
62
56
  var _transformTimeStamp = require("./transformTimeStamp");
63
57
 
64
- var _linkSearchError = _interopRequireDefault(require("./link-search-error"));
58
+ var _linkSearchList = _interopRequireWildcard(require("./link-search-list"));
59
+
60
+ var _linkSearchError = _interopRequireWildcard(require("./link-search-error"));
61
+
62
+ var _formFooter = _interopRequireWildcard(require("./form-footer"));
65
63
 
66
64
  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); }
67
65
 
@@ -75,24 +73,19 @@ var RECENT_SEARCH_LIST_SIZE = 5;
75
73
  exports.RECENT_SEARCH_LIST_SIZE = RECENT_SEARCH_LIST_SIZE;
76
74
  var CONTACT_SUPPORT_LINK = 'https://support.atlassian.com/contact/';
77
75
  exports.CONTACT_SUPPORT_LINK = CONTACT_SUPPORT_LINK;
78
- var testIds = {
76
+
77
+ var testIds = _objectSpread(_objectSpread(_objectSpread(_objectSpread({
79
78
  linkPicker: 'link-picker',
80
79
  urlInputField: 'link-url',
81
80
  textInputField: 'link-text',
82
- searchIcon: 'link-picker-search-icon',
83
- insertButton: 'link-picker-insert-button',
84
- cancelButton: 'link-picker-cancel-button',
81
+ searchIcon: 'link-picker-search-icon'
82
+ }, _formFooter.testIds), _linkSearchError.testIds), _linkSearchList.testIds), {}, {
85
83
  clearUrlButton: 'clear-text',
86
- resultListTitle: 'link-picker-list-title',
87
- emptyResultPage: 'link-search-no-results',
88
- searchResultList: 'link-search-list',
89
- searchResultItem: 'link-search-list-item',
90
- searchResultLoadingIndicator: 'link-picker.results-loading-indicator',
91
84
  urlError: 'link-error',
92
85
  tabList: 'link-picker-tabs',
93
- tabItem: 'link-picker-tab',
94
- searchError: 'link-search-error'
95
- };
86
+ tabItem: 'link-picker-tab'
87
+ });
88
+
96
89
  exports.testIds = testIds;
97
90
  var initState = {
98
91
  url: '',
@@ -115,7 +108,7 @@ function reducer(state, payload) {
115
108
  }
116
109
 
117
110
  function LinkPicker(_ref) {
118
- var _queryState$query, _items$length, _errorFallback;
111
+ var _errorFallback;
119
112
 
120
113
  var onSubmit = _ref.onSubmit,
121
114
  onCancel = _ref.onCancel,
@@ -153,6 +146,7 @@ function LinkPicker(_ref) {
153
146
  retry = _usePlugins.retry,
154
147
  errorFallback = _usePlugins.errorFallback;
155
148
 
149
+ var fixListHeightProps = (0, _useFixHeight.default)(isLoading);
156
150
  var isEditing = !!initUrl;
157
151
  var selectedItem = items === null || items === void 0 ? void 0 : items[selectedIndex];
158
152
  var isSelectedItem = (selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.url) === url;
@@ -281,9 +275,6 @@ function LinkPicker(_ref) {
281
275
  });
282
276
  }, [handleInsert, isSelectedItem, selectedItem, url]);
283
277
  var linkPlaceHolder = isActivePlugin ? _messages.messages.placeholder : _messages.messages.linkPlaceholder;
284
- var linkListTitle = (queryState === null || queryState === void 0 ? void 0 : (_queryState$query = queryState.query) === null || _queryState$query === void 0 ? void 0 : _queryState$query.length) !== 0 ? _messages.messages.titleResults : _messages.messages.titleRecentlyViewed;
285
- var insertButtonMsg = isEditing ? _messages.messages.saveButton : _messages.messages.insertButton;
286
- var noResults = (items === null || items === void 0 ? void 0 : items.length) === 0 && !error;
287
278
  var screenReaderDescriptionId = 'search-recent-links-field-description';
288
279
  var linkSearchListId = 'link-picker-search-list';
289
280
  var ariaActiveDescendant = selectedIndex > -1 ? "link-search-list-item-".concat(selectedIndex) : ''; // Added workaround with a screen reader Announcer specifically for VoiceOver + Safari
@@ -341,7 +332,7 @@ function LinkPicker(_ref) {
341
332
  onClear: handleClear,
342
333
  onKeyDown: handleKeyDown,
343
334
  onChange: handleChangeText
344
- }), queryState && (0, _react2.jsx)(_react.Fragment, null, tabs.length > 0 && (0, _react2.jsx)("div", {
335
+ }), isActivePlugin && !!queryState && (0, _react2.jsx)(_react.Fragment, null, tabs.length > 0 && (0, _react2.jsx)("div", {
345
336
  css: _styled.tabsWrapperStyles
346
337
  }, (0, _react2.jsx)(_tabs.default, {
347
338
  id: testIds.tabList,
@@ -359,61 +350,25 @@ function LinkPicker(_ref) {
359
350
  key: tab.tabTitle,
360
351
  testId: testIds.tabItem
361
352
  }, tab.tabTitle);
362
- })))), !!(items !== null && items !== void 0 && items.length) && (0, _react2.jsx)("div", {
363
- css: _styled.listTitleStyles,
364
- id: testIds.resultListTitle,
365
- "data-testid": testIds.resultListTitle
366
- }, (0, _react2.jsx)(_reactIntlNext.FormattedMessage, linkListTitle)), (0, _react2.jsx)(_visuallyHidden.default, {
367
- id: "fabric.smartcard.linkpicker.suggested.results"
368
- }, url && (0, _react2.jsx)(_reactIntlNext.FormattedMessage, (0, _extends2.default)({}, _messages.messages.searchLinkResults, {
369
- values: {
370
- count: (_items$length = items === null || items === void 0 ? void 0 : items.length) !== null && _items$length !== void 0 ? _items$length : 0
371
- },
372
- "aria-live": "polite",
373
- "aria-atomic": "true"
374
- }))), (0, _react2.jsx)(_linkSearchList.default, {
375
- ariaLabelledBy: testIds.resultListTitle,
376
- ariaControls: "fabric.smartcard.linkpicker.suggested.results",
353
+ })))), (0, _react2.jsx)("div", (0, _extends2.default)({
354
+ css: _styled.flexColumnStyles
355
+ }, fixListHeightProps), !error && (0, _react2.jsx)(_linkSearchList.default, {
377
356
  id: linkSearchListId,
378
357
  role: "listbox",
379
- items: items !== null && items !== void 0 ? items : [],
358
+ items: items,
380
359
  isLoading: isLoading,
381
360
  selectedIndex: selectedIndex,
382
361
  activeIndex: activeIndex,
383
362
  onSelect: handleSelected,
384
363
  onMouseEnter: handleMouseEnterResultItem,
385
- onMouseLeave: handleMouseLeaveResultItem
386
- }), error && ((_errorFallback = errorFallback === null || errorFallback === void 0 ? void 0 : errorFallback(error, retry)) !== null && _errorFallback !== void 0 ? _errorFallback : (0, _react2.jsx)(_linkSearchError.default, {
387
- testId: testIds.searchError,
388
- header: intl.formatMessage(_messages.messages.searchErrorHeader),
389
- description: (0, _react2.jsx)(_reactIntlNext.FormattedMessage, (0, _extends2.default)({}, _messages.messages.searchErrorDescription, {
390
- values: {
391
- a: function a(label) {
392
- return (0, _react2.jsx)(_button.default, {
393
- appearance: "link",
394
- spacing: "none",
395
- href: CONTACT_SUPPORT_LINK,
396
- target: "_blank",
397
- rel: "noopener noreferrer"
398
- }, label);
399
- }
400
- }
401
- }))
402
- })), noResults && (0, _react2.jsx)(_linkSearchNoResults.default, {
403
- testId: testIds.emptyResultPage,
404
- header: intl.formatMessage(_messages.messages.noResults),
405
- description: intl.formatMessage(_messages.messages.noResultsDescription)
406
- })), (0, _react2.jsx)(_form.FormFooter, {
407
- align: "end"
408
- }, (0, _react2.jsx)(_button.ButtonGroup, null, (0, _react2.jsx)(_button.default, {
409
- appearance: "default",
410
- onClick: onCancel,
411
- testId: testIds.cancelButton
412
- }, intl.formatMessage(_messages.messages.cancelButton)), (0, _react2.jsx)(_button.default, {
413
- type: "submit",
414
- appearance: "primary",
415
- testId: testIds.insertButton
416
- }, intl.formatMessage(insertButtonMsg)))));
364
+ onMouseLeave: handleMouseLeaveResultItem,
365
+ error: error,
366
+ hasSearchTerm: !!(queryState !== null && queryState !== void 0 && queryState.query.length)
367
+ }), error && ((_errorFallback = errorFallback === null || errorFallback === void 0 ? void 0 : errorFallback(error, retry)) !== null && _errorFallback !== void 0 ? _errorFallback : (0, _react2.jsx)(_linkSearchError.default, null)))), (0, _react2.jsx)(_formFooter.default, {
368
+ css: !queryState || !(plugins !== null && plugins !== void 0 && plugins.length) ? _styled.formFooterMargin : undefined,
369
+ isEditing: isEditing,
370
+ onCancel: onCancel
371
+ }));
417
372
  }
418
373
 
419
374
  var _default = (0, _withLinkPickerAnalytics.withLinkPickerAnalyticsContext)( /*#__PURE__*/(0, _react.memo)(LinkPicker));
@@ -5,22 +5,63 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.default = void 0;
8
+ exports.testIds = exports.messages = exports.default = exports.CONTACT_SUPPORT_LINK = void 0;
9
9
 
10
10
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
11
11
 
12
- var _react = _interopRequireDefault(require("react"));
12
+ var _react = require("@emotion/react");
13
+
14
+ var _reactIntlNext = require("react-intl-next");
15
+
16
+ var _button = _interopRequireDefault(require("@atlaskit/button"));
13
17
 
14
18
  var _emptyState = _interopRequireDefault(require("@atlaskit/empty-state"));
15
19
 
16
20
  var _genericErrorSvg = _interopRequireDefault(require("../../../common/generic-error-svg"));
17
21
 
18
- var LinkSearchError = function LinkSearchError(props) {
19
- return /*#__PURE__*/_react.default.createElement(_emptyState.default, (0, _extends2.default)({}, props, {
22
+ /** @jsx jsx */
23
+ var CONTACT_SUPPORT_LINK = 'https://support.atlassian.com/contact/';
24
+ exports.CONTACT_SUPPORT_LINK = CONTACT_SUPPORT_LINK;
25
+ var messages = (0, _reactIntlNext.defineMessages)({
26
+ searchErrorHeader: {
27
+ id: 'fabric.linkPicker.search.error.heading',
28
+ defaultMessage: 'We’re having trouble loading data.',
29
+ description: 'Heading message shown when a search throws an error'
30
+ },
31
+ searchErrorDescription: {
32
+ id: 'fabric.linkPicker.search.error.description',
33
+ defaultMessage: 'Refresh the page, or contact <a>Atlassian Support</a> if this keeps happening.',
34
+ description: 'Describes possible actions when search throws an error'
35
+ }
36
+ });
37
+ exports.messages = messages;
38
+ var testIds = {
39
+ searchError: 'link-search-error'
40
+ };
41
+ exports.testIds = testIds;
42
+
43
+ var LinkSearchError = function LinkSearchError() {
44
+ var intl = (0, _reactIntlNext.useIntl)();
45
+ return (0, _react.jsx)(_emptyState.default, {
46
+ testId: testIds.searchError,
47
+ header: intl.formatMessage(messages.searchErrorHeader),
48
+ description: (0, _react.jsx)(_reactIntlNext.FormattedMessage, (0, _extends2.default)({}, messages.searchErrorDescription, {
49
+ values: {
50
+ a: function a(label) {
51
+ return (0, _react.jsx)(_button.default, {
52
+ appearance: "link",
53
+ spacing: "none",
54
+ href: CONTACT_SUPPORT_LINK,
55
+ target: "_blank",
56
+ rel: "noopener noreferrer"
57
+ }, label);
58
+ }
59
+ }
60
+ })),
20
61
  renderImage: function renderImage() {
21
- return /*#__PURE__*/_react.default.createElement(_genericErrorSvg.default, null);
62
+ return (0, _react.jsx)(_genericErrorSvg.default, null);
22
63
  }
23
- }));
64
+ });
24
65
  };
25
66
 
26
67
  var _default = LinkSearchError;
@@ -2,23 +2,73 @@
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
4
 
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+
5
7
  Object.defineProperty(exports, "__esModule", {
6
8
  value: true
7
9
  });
8
- exports.default = void 0;
10
+ exports.testIds = exports.messages = exports.default = void 0;
11
+
12
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
13
+
14
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
15
+
16
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
17
+
18
+ var _react = require("react");
19
+
20
+ var _react2 = require("@emotion/react");
9
21
 
10
- var _react = require("@emotion/react");
22
+ var _reactIntlNext = require("react-intl-next");
11
23
 
12
24
  var _spinner = _interopRequireDefault(require("@atlaskit/spinner"));
13
25
 
26
+ var _visuallyHidden = _interopRequireDefault(require("@atlaskit/visually-hidden"));
27
+
14
28
  var _listItem = _interopRequireDefault(require("../list-item"));
15
29
 
16
30
  var _styled = require("./styled");
17
31
 
18
- var _ = require("../");
32
+ var _linkSearchNoResults = _interopRequireWildcard(require("./link-search-no-results"));
33
+
34
+ var _excluded = ["onSelect", "onMouseEnter", "onMouseLeave", "items", "activeIndex", "selectedIndex", "isLoading", "ariaControls", "ariaLabelledBy", "role", "id", "hasSearchTerm"];
35
+
36
+ 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); }
37
+
38
+ 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; }
39
+
40
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
19
41
 
20
- /** @jsx jsx */
21
- var LinkSearchList = function LinkSearchList(_ref) {
42
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
43
+
44
+ var messages = (0, _reactIntlNext.defineMessages)({
45
+ titleRecentlyViewed: {
46
+ id: 'fabric.linkPicker.listTitle.recentlyViewed',
47
+ defaultMessage: 'Recently Viewed',
48
+ description: 'Describes type of items shown in the list for screen-reader users'
49
+ },
50
+ titleResults: {
51
+ id: 'fabric.linkPicker.listTitle.results',
52
+ defaultMessage: 'Results',
53
+ description: 'Describes type of items shown in the list for screen-reader users'
54
+ },
55
+ searchLinkResults: {
56
+ id: 'fabric.linkPicker.hyperlink.searchLinkResults',
57
+ defaultMessage: '{count, plural, =0 {no results} one {# result} other {# results}} found',
58
+ description: 'Announce search results for screen-reader users.'
59
+ }
60
+ });
61
+ exports.messages = messages;
62
+
63
+ var testIds = _objectSpread(_objectSpread({}, _linkSearchNoResults.testIds), {}, {
64
+ resultListTitle: 'link-picker-list-title',
65
+ searchResultItem: 'link-search-list-item',
66
+ searchResultList: 'link-search-list',
67
+ searchResultLoadingIndicator: 'link-picker.results-loading-indicator'
68
+ });
69
+
70
+ exports.testIds = testIds;
71
+ var LinkSearchList = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
22
72
  var onSelect = _ref.onSelect,
23
73
  onMouseEnter = _ref.onMouseEnter,
24
74
  onMouseLeave = _ref.onMouseLeave,
@@ -29,21 +79,40 @@ var LinkSearchList = function LinkSearchList(_ref) {
29
79
  ariaControls = _ref.ariaControls,
30
80
  ariaLabelledBy = _ref.ariaLabelledBy,
31
81
  role = _ref.role,
32
- id = _ref.id;
82
+ id = _ref.id,
83
+ hasSearchTerm = _ref.hasSearchTerm,
84
+ restProps = (0, _objectWithoutProperties2.default)(_ref, _excluded);
33
85
  var itemsContent;
34
86
  var loadingContent;
87
+ var linkListTitle = hasSearchTerm ? messages.titleResults : messages.titleRecentlyViewed;
88
+
89
+ if ((items === null || items === void 0 ? void 0 : items.length) === 0) {
90
+ return (0, _react2.jsx)(_linkSearchNoResults.default, null);
91
+ }
35
92
 
36
93
  if (items && items.length > 0) {
37
- itemsContent = (0, _react.jsx)("ul", {
94
+ itemsContent = (0, _react2.jsx)(_react.Fragment, null, (0, _react2.jsx)("div", {
95
+ css: _styled.listTitleStyles,
96
+ id: testIds.resultListTitle,
97
+ "data-testid": testIds.resultListTitle
98
+ }, (0, _react2.jsx)(_reactIntlNext.FormattedMessage, linkListTitle)), (0, _react2.jsx)(_visuallyHidden.default, {
99
+ id: "fabric.smartcard.linkpicker.suggested.results"
100
+ }, hasSearchTerm && (0, _react2.jsx)(_reactIntlNext.FormattedMessage, (0, _extends2.default)({}, messages.searchLinkResults, {
101
+ values: {
102
+ count: items.length
103
+ },
104
+ "aria-live": "polite",
105
+ "aria-atomic": "true"
106
+ }))), (0, _react2.jsx)("ul", {
38
107
  id: id,
39
108
  role: role,
40
109
  css: _styled.listStyles,
41
- "aria-controls": ariaControls,
42
- "aria-labelledby": ariaLabelledBy,
43
- "data-testid": _.testIds.searchResultList
110
+ "aria-controls": "fabric.smartcard.linkpicker.suggested.results",
111
+ "aria-labelledby": testIds.resultListTitle,
112
+ "data-testid": testIds.searchResultList
44
113
  }, items.map(function (item, index) {
45
- return (0, _react.jsx)(_listItem.default, {
46
- id: "".concat(_.testIds.searchResultItem, "-").concat(index),
114
+ return (0, _react2.jsx)(_listItem.default, {
115
+ id: "".concat(testIds.searchResultItem, "-").concat(index),
47
116
  role: role && 'option',
48
117
  item: item,
49
118
  selected: selectedIndex === index,
@@ -53,22 +122,22 @@ var LinkSearchList = function LinkSearchList(_ref) {
53
122
  onSelect: onSelect,
54
123
  key: item.objectId
55
124
  });
56
- }));
125
+ })));
57
126
  }
58
127
 
59
128
  if (isLoading) {
60
- loadingContent = (0, _react.jsx)("div", {
129
+ loadingContent = (0, _react2.jsx)("div", {
61
130
  css: _styled.spinnerContainerStyles
62
- }, (0, _react.jsx)(_spinner.default, {
63
- testId: _.testIds.searchResultLoadingIndicator,
131
+ }, (0, _react2.jsx)(_spinner.default, {
132
+ testId: testIds.searchResultLoadingIndicator,
64
133
  size: "medium"
65
134
  }));
66
135
  }
67
136
 
68
- return (0, _react.jsx)("div", {
137
+ return (0, _react2.jsx)("div", (0, _extends2.default)({
138
+ ref: ref,
69
139
  css: _styled.listContainerStyles
70
- }, itemsContent, loadingContent);
71
- };
72
-
140
+ }, restProps), itemsContent, loadingContent);
141
+ });
73
142
  var _default = LinkSearchList;
74
143
  exports.default = _default;
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.testIds = exports.messages = exports.default = void 0;
9
+
10
+ var _react = require("@emotion/react");
11
+
12
+ var _emptyState = _interopRequireDefault(require("@atlaskit/empty-state"));
13
+
14
+ var _reactIntlNext = require("react-intl-next");
15
+
16
+ var _noResultsSvg = _interopRequireDefault(require("./no-results-svg"));
17
+
18
+ var _styled = require("./styled");
19
+
20
+ /** @jsx jsx */
21
+ var messages = (0, _reactIntlNext.defineMessages)({
22
+ noResults: {
23
+ id: 'fabric.linkPicker.search.noResults.heading',
24
+ defaultMessage: 'We couldn’t find anything matching your search.',
25
+ description: 'Heading message shown when a search has no results'
26
+ },
27
+ noResultsDescription: {
28
+ id: 'fabric.linkPicker.search.noResults.description',
29
+ defaultMessage: 'Try again with a different term.',
30
+ description: 'Describes possible action when a search returns no results'
31
+ }
32
+ });
33
+ exports.messages = messages;
34
+ var testIds = {
35
+ emptyResultPage: 'link-search-no-results'
36
+ };
37
+ exports.testIds = testIds;
38
+
39
+ var NoResults = function NoResults() {
40
+ var intl = (0, _reactIntlNext.useIntl)();
41
+ return (0, _react.jsx)("div", {
42
+ css: _styled.emptyStateWrapperStyles
43
+ }, (0, _react.jsx)(_emptyState.default, {
44
+ testId: testIds.emptyResultPage,
45
+ header: intl.formatMessage(messages.noResults),
46
+ description: intl.formatMessage(messages.noResultsDescription),
47
+ renderImage: function renderImage() {
48
+ return (0, _react.jsx)(_noResultsSvg.default, null);
49
+ }
50
+ }));
51
+ };
52
+
53
+ var _default = NoResults;
54
+ exports.default = _default;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.emptyStateWrapperStyles = void 0;
9
+
10
+ var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
11
+
12
+ var _react = require("@emotion/react");
13
+
14
+ var _templateObject;
15
+
16
+ var emptyStateWrapperStyles = (0, _react.css)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n & p {\n margin: 0;\n }\n"])));
17
+ exports.emptyStateWrapperStyles = emptyStateWrapperStyles;
@@ -5,17 +5,24 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.spinnerContainerStyles = exports.listStyles = exports.listContainerStyles = void 0;
8
+ exports.spinnerContainerStyles = exports.listTitleStyles = exports.listStyles = exports.listContainerStyles = void 0;
9
9
 
10
10
  var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
11
11
 
12
12
  var _react = require("@emotion/react");
13
13
 
14
- var _templateObject, _templateObject2, _templateObject3;
14
+ var _theme = require("@atlaskit/theme");
15
15
 
16
- var listContainerStyles = (0, _react.css)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n padding-top: 0;\n"])));
16
+ var _constants = require("@atlaskit/theme/constants");
17
+
18
+ var _templateObject, _templateObject2, _templateObject3, _templateObject4;
19
+
20
+ var gridSize = (0, _constants.gridSize)();
21
+ var listContainerStyles = (0, _react.css)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n padding-top: 0;\n min-height: 80px;\n margin-top: ", "px;\n margin-bottom: ", "px;\n flex-grow: 1;\n display: flex;\n flex-direction: column;\n"])), gridSize * 2, gridSize * 2);
17
22
  exports.listContainerStyles = listContainerStyles;
18
- var spinnerContainerStyles = (0, _react.css)(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2.default)(["\n text-align: center;\n min-height: 80px;\n margin-top: 30px;\n"])));
23
+ var spinnerContainerStyles = (0, _react.css)(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2.default)(["\n text-align: center;\n min-height: 80px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-grow: 1;\n"])));
19
24
  exports.spinnerContainerStyles = spinnerContainerStyles;
20
- var listStyles = (0, _react.css)(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2.default)(["\n padding: 0;\n list-style: none;\n"])));
21
- exports.listStyles = listStyles;
25
+ var listStyles = (0, _react.css)(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2.default)(["\n padding: 0;\n margin: 0;\n list-style: none;\n"])));
26
+ exports.listStyles = listStyles;
27
+ var listTitleStyles = (0, _react.css)(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2.default)(["\n ", "\n text-transform: uppercase;\n margin-top: 0;\n margin-bottom: ", "px;\n"])), _theme.typography.h100(), gridSize / 2);
28
+ exports.listTitleStyles = listTitleStyles;