@atlaskit/link-picker 1.8.3 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/cjs/controllers/use-fix-height/index.js +27 -0
  3. package/dist/cjs/services/use-plugins/index.js +48 -90
  4. package/dist/cjs/services/use-plugins/reducer.js +64 -0
  5. package/dist/cjs/services/use-plugins/utils.js +134 -0
  6. package/dist/cjs/ui/index.js +2 -1
  7. package/dist/cjs/ui/link-picker/form-footer/index.js +76 -0
  8. package/dist/cjs/ui/link-picker/form-footer/styled.js +17 -0
  9. package/dist/cjs/ui/link-picker/index.js +35 -76
  10. package/dist/cjs/ui/link-picker/link-search-error/index.js +47 -6
  11. package/dist/cjs/ui/link-picker/link-search-list/index.js +89 -20
  12. package/dist/cjs/ui/link-picker/link-search-list/link-search-no-results/index.js +54 -0
  13. package/dist/cjs/ui/link-picker/{link-search-no-results → link-search-list/link-search-no-results}/no-results-svg/index.js +0 -0
  14. package/dist/cjs/ui/link-picker/{link-search-no-results → link-search-list/link-search-no-results}/no-results-svg/styled.js +0 -0
  15. package/dist/cjs/ui/link-picker/link-search-list/link-search-no-results/styled.js +17 -0
  16. package/dist/cjs/ui/link-picker/link-search-list/styled.js +13 -6
  17. package/dist/cjs/ui/link-picker/messages.js +0 -50
  18. package/dist/cjs/ui/link-picker/styled.js +16 -11
  19. package/dist/cjs/ui/link-picker/text-input/styled.js +1 -1
  20. package/dist/cjs/version.json +1 -1
  21. package/dist/es2019/controllers/use-fix-height/index.js +19 -0
  22. package/dist/es2019/services/use-plugins/index.js +35 -57
  23. package/dist/es2019/services/use-plugins/reducer.js +37 -0
  24. package/dist/es2019/services/use-plugins/utils.js +59 -0
  25. package/dist/es2019/ui/index.js +1 -1
  26. package/dist/es2019/ui/link-picker/form-footer/index.js +51 -0
  27. package/dist/es2019/ui/link-picker/form-footer/styled.js +5 -0
  28. package/dist/es2019/ui/link-picker/index.js +30 -68
  29. package/dist/es2019/ui/link-picker/link-search-error/index.js +40 -4
  30. package/dist/es2019/ui/link-picker/link-search-list/index.js +60 -14
  31. package/dist/es2019/ui/link-picker/link-search-list/link-search-no-results/index.js +35 -0
  32. package/dist/es2019/ui/link-picker/{link-search-no-results → link-search-list/link-search-no-results}/no-results-svg/index.js +0 -0
  33. package/dist/es2019/ui/link-picker/{link-search-no-results → link-search-list/link-search-no-results}/no-results-svg/styled.js +0 -0
  34. package/dist/es2019/ui/link-picker/link-search-list/link-search-no-results/styled.js +6 -0
  35. package/dist/es2019/ui/link-picker/link-search-list/styled.js +23 -2
  36. package/dist/es2019/ui/link-picker/messages.js +0 -50
  37. package/dist/es2019/ui/link-picker/styled.js +20 -15
  38. package/dist/es2019/ui/link-picker/text-input/styled.js +3 -1
  39. package/dist/es2019/version.json +1 -1
  40. package/dist/esm/controllers/use-fix-height/index.js +19 -0
  41. package/dist/esm/services/use-plugins/index.js +49 -94
  42. package/dist/esm/services/use-plugins/reducer.js +43 -0
  43. package/dist/esm/services/use-plugins/utils.js +111 -0
  44. package/dist/esm/ui/index.js +1 -1
  45. package/dist/esm/ui/link-picker/form-footer/index.js +53 -0
  46. package/dist/esm/ui/link-picker/form-footer/styled.js +6 -0
  47. package/dist/esm/ui/link-picker/index.js +31 -73
  48. package/dist/esm/ui/link-picker/link-search-error/index.js +41 -5
  49. package/dist/esm/ui/link-picker/link-search-list/index.js +67 -13
  50. package/dist/esm/ui/link-picker/link-search-list/link-search-no-results/index.js +37 -0
  51. package/dist/esm/ui/link-picker/{link-search-no-results → link-search-list/link-search-no-results}/no-results-svg/index.js +0 -0
  52. package/dist/esm/ui/link-picker/{link-search-no-results → link-search-list/link-search-no-results}/no-results-svg/styled.js +0 -0
  53. package/dist/esm/ui/link-picker/link-search-list/link-search-no-results/styled.js +6 -0
  54. package/dist/esm/ui/link-picker/link-search-list/styled.js +11 -5
  55. package/dist/esm/ui/link-picker/messages.js +0 -50
  56. package/dist/esm/ui/link-picker/styled.js +14 -11
  57. package/dist/esm/ui/link-picker/text-input/styled.js +1 -1
  58. package/dist/esm/version.json +1 -1
  59. package/dist/types/controllers/use-fix-height/index.d.ts +8 -0
  60. package/dist/types/services/use-plugins/reducer.d.ts +30 -0
  61. package/dist/types/services/use-plugins/utils.d.ts +18 -0
  62. package/dist/types/ui/index.d.ts +5 -0
  63. package/dist/types/ui/link-picker/form-footer/index.d.ts +13 -0
  64. package/dist/types/ui/link-picker/form-footer/styled.d.ts +1 -0
  65. package/dist/types/ui/link-picker/index.d.ts +21 -18
  66. package/dist/types/ui/link-picker/link-search-error/index.d.ts +19 -3
  67. package/dist/types/ui/link-picker/link-search-list/index.d.ts +30 -5
  68. package/dist/types/ui/link-picker/link-search-list/link-search-no-results/index.d.ts +19 -0
  69. 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
  70. 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
  71. package/dist/types/ui/link-picker/link-search-list/link-search-no-results/styled.d.ts +1 -0
  72. package/dist/types/ui/link-picker/link-search-list/styled.d.ts +1 -0
  73. package/dist/types/ui/link-picker/messages.d.ts +0 -50
  74. package/dist/types/ui/link-picker/styled.d.ts +5 -1
  75. package/package.json +15 -14
  76. package/report.api.md +8 -2
  77. package/dist/cjs/ui/link-picker/link-search-no-results/index.js +0 -27
  78. package/dist/es2019/ui/link-picker/link-search-no-results/index.js +0 -10
  79. package/dist/esm/ui/link-picker/link-search-no-results/index.js +0 -14
  80. package/dist/types/ui/link-picker/link-search-no-results/index.d.ts +0 -4
@@ -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;
@@ -238,7 +232,11 @@ function LinkPicker(_ref) {
238
232
  }
239
233
  }, [activeIndex, items]);
240
234
  var handleInsert = (0, _react.useCallback)(function (url, title, inputType) {
241
- var event = createAnalyticsEvent((0, _analytics.default)('ui.form.submitted.linkPicker', {}));
235
+ var event = createAnalyticsEvent((0, _analytics.default)('ui.form.submitted.linkPicker', {})); // Clone the event so that it can be emitted for consumer usage
236
+ // This must happen BEFORE the original event is fired!
237
+
238
+ var consumerEvent = event.clone(); // Dispatch the original event to our channel
239
+
242
240
  event.fire(_constants.ANALYTICS_CHANNEL);
243
241
  onSubmit(_objectSpread({
244
242
  url: url,
@@ -249,7 +247,7 @@ function LinkPicker(_ref) {
249
247
  }
250
248
  }, inputType === 'manual' ? {
251
249
  rawUrl: state.url
252
- } : {}));
250
+ } : {}), consumerEvent);
253
251
  }, [displayText, onSubmit, state.url, createAnalyticsEvent]);
254
252
  var handleSelected = (0, _react.useCallback)(function (objectId) {
255
253
  var selectedItem = items === null || items === void 0 ? void 0 : items.find(function (item) {
@@ -281,9 +279,6 @@ function LinkPicker(_ref) {
281
279
  });
282
280
  }, [handleInsert, isSelectedItem, selectedItem, url]);
283
281
  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
282
  var screenReaderDescriptionId = 'search-recent-links-field-description';
288
283
  var linkSearchListId = 'link-picker-search-list';
289
284
  var ariaActiveDescendant = selectedIndex > -1 ? "link-search-list-item-".concat(selectedIndex) : ''; // Added workaround with a screen reader Announcer specifically for VoiceOver + Safari
@@ -341,7 +336,7 @@ function LinkPicker(_ref) {
341
336
  onClear: handleClear,
342
337
  onKeyDown: handleKeyDown,
343
338
  onChange: handleChangeText
344
- }), queryState && (0, _react2.jsx)(_react.Fragment, null, tabs.length > 0 && (0, _react2.jsx)("div", {
339
+ }), isActivePlugin && !!queryState && (0, _react2.jsx)(_react.Fragment, null, tabs.length > 0 && (0, _react2.jsx)("div", {
345
340
  css: _styled.tabsWrapperStyles
346
341
  }, (0, _react2.jsx)(_tabs.default, {
347
342
  id: testIds.tabList,
@@ -359,61 +354,25 @@ function LinkPicker(_ref) {
359
354
  key: tab.tabTitle,
360
355
  testId: testIds.tabItem
361
356
  }, 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",
357
+ })))), (0, _react2.jsx)("div", (0, _extends2.default)({
358
+ css: _styled.flexColumnStyles
359
+ }, fixListHeightProps), !error && (0, _react2.jsx)(_linkSearchList.default, {
377
360
  id: linkSearchListId,
378
361
  role: "listbox",
379
- items: items !== null && items !== void 0 ? items : [],
362
+ items: items,
380
363
  isLoading: isLoading,
381
364
  selectedIndex: selectedIndex,
382
365
  activeIndex: activeIndex,
383
366
  onSelect: handleSelected,
384
367
  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)))));
368
+ onMouseLeave: handleMouseLeaveResultItem,
369
+ error: error,
370
+ hasSearchTerm: !!(queryState !== null && queryState !== void 0 && queryState.query.length)
371
+ }), 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, {
372
+ css: !queryState || !(plugins !== null && plugins !== void 0 && plugins.length) ? _styled.formFooterMargin : undefined,
373
+ isEditing: isEditing,
374
+ onCancel: onCancel
375
+ }));
417
376
  }
418
377
 
419
378
  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;
@@ -53,11 +53,6 @@ var messages = (0, _reactIntlNext.defineMessages)({
53
53
  defaultMessage: 'Suggestions will appear below as you type into the field',
54
54
  description: 'Describes what the search field does for screen reader users.'
55
55
  },
56
- searchLinkResults: {
57
- id: 'fabric.linkPicker.hyperlink.searchLinkResults',
58
- defaultMessage: '{count, plural, =0 {no results} one {# result} other {# results}} found',
59
- description: 'Announce search results for screen-reader users.'
60
- },
61
56
  linkAriaLabel: {
62
57
  id: 'fabric.linkPicker.hyperlink.linkAriaLabel',
63
58
  defaultMessage: 'Link label',
@@ -77,51 +72,6 @@ var messages = (0, _reactIntlNext.defineMessages)({
77
72
  id: 'fabric.linkPicker.time.ago',
78
73
  defaultMessage: 'ago',
79
74
  description: 'Some time ago'
80
- },
81
- titleRecentlyViewed: {
82
- id: 'fabric.linkPicker.listTitle.recentlyViewed',
83
- defaultMessage: 'Recently Viewed',
84
- description: 'Describes type of items shown in the list for screen-reader users'
85
- },
86
- titleResults: {
87
- id: 'fabric.linkPicker.listTitle.results',
88
- defaultMessage: 'Results',
89
- description: 'Describes type of items shown in the list for screen-reader users'
90
- },
91
- cancelButton: {
92
- id: 'fabric.linkPicker.button.cancel',
93
- defaultMessage: 'Cancel',
94
- description: 'Button to cancel and dismiss the link picker'
95
- },
96
- insertButton: {
97
- id: 'fabric.linkPicker.button.insert',
98
- defaultMessage: 'Insert',
99
- description: 'Button to insert searched or selected link'
100
- },
101
- noResults: {
102
- id: 'fabric.linkPicker.search.noResults.heading',
103
- defaultMessage: 'We couldn’t find anything matching your search.',
104
- description: 'Heading message shown when a search has no results'
105
- },
106
- noResultsDescription: {
107
- id: 'fabric.linkPicker.search.noResults.description',
108
- defaultMessage: 'Try again with a different term.',
109
- description: 'Describes possible action when a search returns no results'
110
- },
111
- saveButton: {
112
- id: 'fabric.linkPicker.button.save',
113
- defaultMessage: 'Save',
114
- description: 'Button to save edited link'
115
- },
116
- searchErrorHeader: {
117
- id: 'fabric.linkPicker.search.error.heading',
118
- defaultMessage: 'We’re having trouble loading data.',
119
- description: 'Heading message shown when a search throws an error'
120
- },
121
- searchErrorDescription: {
122
- id: 'fabric.linkPicker.search.error.description',
123
- defaultMessage: 'Refresh the page, or contact <a>Atlassian Support</a> if this keeps happening.',
124
- description: 'Describes possible actions when search throws an error'
125
75
  }
126
76
  });
127
77
  exports.messages = messages;
@@ -5,7 +5,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.tabsWrapperStyles = exports.searchIconStyles = exports.rootContainerStylesForLoader = exports.rootContainerStyles = exports.listTitleStyles = void 0;
8
+ exports.tabsWrapperStyles = exports.searchIconStyles = exports.rootContainerStylesForLoader = exports.rootContainerStyles = exports.formFooterMargin = exports.flexColumnStyles = void 0;
9
9
 
10
10
  var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
11
11
 
@@ -15,21 +15,26 @@ var _react = require("@emotion/react");
15
15
 
16
16
  var _colors = require("@atlaskit/theme/colors");
17
17
 
18
- var _theme = require("@atlaskit/theme");
19
-
20
18
  var _constants = require("@atlaskit/theme/constants");
21
19
 
22
- var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5;
20
+ var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6;
23
21
 
24
22
  var LINK_PICKER_WIDTH_IN_PX = 342;
25
- var LINK_PICKER_MIN_HEIGHT_IN_PX = 234;
26
- var rootContainerStyles = (0, _react.css)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n width: ", "px;\n padding: ", "px;\n box-sizing: border-box;\n line-height: initial;\n min-height: ", "px;\n"])), LINK_PICKER_WIDTH_IN_PX, (0, _constants.gridSize)() * 2, LINK_PICKER_MIN_HEIGHT_IN_PX);
23
+ var LINK_PICKER_MIN_HEIGHT_IN_PX = 220;
24
+ var gridSize = (0, _constants.gridSize)();
25
+ /**
26
+ * Half padding on the top as the form field has a `gridSize()` margin top that cannot be overridden
27
+ */
28
+
29
+ var rootContainerStyles = (0, _react.css)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n width: ", "px;\n padding: ", "px ", "px ", "px;\n box-sizing: border-box;\n line-height: initial;\n min-height: ", "px;\n"])), LINK_PICKER_WIDTH_IN_PX, gridSize, gridSize * 2, gridSize * 2, LINK_PICKER_MIN_HEIGHT_IN_PX);
27
30
  exports.rootContainerStyles = rootContainerStyles;
28
31
  var rootContainerStylesForLoader = (0, _react.css)(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2.default)(["\n ", "\n display: flex;\n align-items: center;\n justify-content: center;\n"])), rootContainerStyles);
29
32
  exports.rootContainerStylesForLoader = rootContainerStylesForLoader;
30
- var searchIconStyles = (0, _react.css)(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2.default)(["\n margin-left: ", "px;\n color: ", ";\n cursor: default;\n"])), (0, _constants.gridSize)() / 2, (0, _tokens.token)('color.icon', _colors.N500));
33
+ var searchIconStyles = (0, _react.css)(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2.default)(["\n margin-left: ", "px;\n color: ", ";\n cursor: default;\n"])), gridSize / 2, (0, _tokens.token)('color.icon', _colors.N500));
31
34
  exports.searchIconStyles = searchIconStyles;
32
- var listTitleStyles = (0, _react.css)(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2.default)(["\n ", "\n text-transform: uppercase;\n margin-bottom: ", "px;\n"])), _theme.typography.h100(), (0, _constants.gridSize)() / 2);
33
- exports.listTitleStyles = listTitleStyles;
34
- var tabsWrapperStyles = (0, _react.css)(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2.default)(["\n margin-left: -", "px;\n margin-right: -", "px;\n"])), (0, _constants.gridSize)(), (0, _constants.gridSize)());
35
- exports.tabsWrapperStyles = tabsWrapperStyles;
35
+ var tabsWrapperStyles = (0, _react.css)(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2.default)(["\n margin-top: ", "px;\n margin-left: -", "px;\n margin-right: -", "px;\n"])), gridSize * 1.5, gridSize, gridSize);
36
+ exports.tabsWrapperStyles = tabsWrapperStyles;
37
+ var flexColumnStyles = (0, _react.css)(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2.default)(["\n display: flex;\n flex-direction: column;\n"])));
38
+ exports.flexColumnStyles = flexColumnStyles;
39
+ var formFooterMargin = (0, _react.css)(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteral2.default)(["\n margin-top: ", "px;\n"])), gridSize * 2);
40
+ exports.formFooterMargin = formFooterMargin;