@atlaskit/link-picker 1.27.1 → 1.28.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 (72) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/compass.yml +1 -1
  3. package/dist/cjs/common/constants.js +1 -9
  4. package/dist/cjs/common/ui/min-height-container/styled.js +1 -1
  5. package/dist/cjs/ui/link-picker/form-footer/feature-discovery/index.js +52 -0
  6. package/dist/cjs/ui/link-picker/form-footer/feature-discovery/styled.js +16 -0
  7. package/dist/cjs/ui/link-picker/form-footer/index.js +21 -11
  8. package/dist/cjs/ui/link-picker/index.js +13 -4
  9. package/dist/cjs/ui/link-picker/search-results/index.js +6 -5
  10. package/dist/cjs/ui/link-picker/search-results/link-search-list/index.js +3 -1
  11. package/dist/cjs/ui/link-picker/search-results/link-search-list/styled.js +2 -2
  12. package/dist/cjs/ui/link-picker/search-results/search-results-container/index.js +28 -0
  13. package/dist/cjs/ui/link-picker/search-results/search-results-container/styled.js +12 -0
  14. package/dist/cjs/ui/link-picker/search-results/styled.js +1 -1
  15. package/dist/cjs/ui/link-picker/styled.js +3 -7
  16. package/dist/cjs/ui/loader-fallback/index.js +15 -5
  17. package/dist/cjs/ui/loader-fallback/styled.js +12 -0
  18. package/dist/cjs/version.json +1 -1
  19. package/dist/es2019/common/constants.js +0 -4
  20. package/dist/es2019/common/ui/min-height-container/styled.js +1 -1
  21. package/dist/es2019/ui/link-picker/form-footer/feature-discovery/index.js +41 -0
  22. package/dist/es2019/ui/link-picker/form-footer/feature-discovery/styled.js +15 -0
  23. package/dist/es2019/ui/link-picker/form-footer/index.js +15 -8
  24. package/dist/es2019/ui/link-picker/index.js +12 -3
  25. package/dist/es2019/ui/link-picker/search-results/index.js +7 -6
  26. package/dist/es2019/ui/link-picker/search-results/link-search-list/index.js +3 -1
  27. package/dist/es2019/ui/link-picker/search-results/link-search-list/styled.js +3 -5
  28. package/dist/es2019/ui/link-picker/search-results/search-results-container/index.js +19 -0
  29. package/dist/es2019/ui/link-picker/search-results/search-results-container/styled.js +7 -0
  30. package/dist/es2019/ui/link-picker/search-results/styled.js +1 -0
  31. package/dist/es2019/ui/link-picker/styled.js +0 -9
  32. package/dist/es2019/ui/loader-fallback/index.js +13 -3
  33. package/dist/es2019/ui/loader-fallback/styled.js +4 -0
  34. package/dist/es2019/version.json +1 -1
  35. package/dist/esm/common/constants.js +0 -4
  36. package/dist/esm/common/ui/min-height-container/styled.js +1 -1
  37. package/dist/esm/ui/link-picker/form-footer/feature-discovery/index.js +44 -0
  38. package/dist/esm/ui/link-picker/form-footer/feature-discovery/styled.js +8 -0
  39. package/dist/esm/ui/link-picker/form-footer/index.js +21 -11
  40. package/dist/esm/ui/link-picker/index.js +13 -4
  41. package/dist/esm/ui/link-picker/search-results/index.js +7 -6
  42. package/dist/esm/ui/link-picker/search-results/link-search-list/index.js +3 -1
  43. package/dist/esm/ui/link-picker/search-results/link-search-list/styled.js +2 -2
  44. package/dist/esm/ui/link-picker/search-results/search-results-container/index.js +20 -0
  45. package/dist/esm/ui/link-picker/search-results/search-results-container/styled.js +4 -0
  46. package/dist/esm/ui/link-picker/search-results/styled.js +1 -1
  47. package/dist/esm/ui/link-picker/styled.js +2 -4
  48. package/dist/esm/ui/loader-fallback/index.js +13 -3
  49. package/dist/esm/ui/loader-fallback/styled.js +4 -0
  50. package/dist/esm/version.json +1 -1
  51. package/dist/types/common/constants.d.ts +0 -4
  52. package/dist/types/common/types.d.ts +1 -0
  53. package/dist/types/ui/link-picker/form-footer/feature-discovery/index.d.ts +15 -0
  54. package/dist/types/ui/link-picker/form-footer/feature-discovery/styled.d.ts +1 -0
  55. package/dist/types/ui/link-picker/form-footer/index.d.ts +4 -1
  56. package/dist/types/ui/link-picker/index.d.ts +1 -0
  57. package/dist/types/ui/link-picker/search-results/search-results-container/index.d.ts +5 -0
  58. package/dist/types/ui/link-picker/search-results/search-results-container/styled.d.ts +1 -0
  59. package/dist/types/ui/link-picker/styled.d.ts +0 -2
  60. package/dist/types/ui/loader-fallback/styled.d.ts +1 -0
  61. package/dist/types-ts4.5/common/constants.d.ts +0 -4
  62. package/dist/types-ts4.5/common/types.d.ts +1 -0
  63. package/dist/types-ts4.5/ui/link-picker/form-footer/feature-discovery/index.d.ts +15 -0
  64. package/dist/types-ts4.5/ui/link-picker/form-footer/feature-discovery/styled.d.ts +1 -0
  65. package/dist/types-ts4.5/ui/link-picker/form-footer/index.d.ts +4 -1
  66. package/dist/types-ts4.5/ui/link-picker/index.d.ts +1 -0
  67. package/dist/types-ts4.5/ui/link-picker/search-results/search-results-container/index.d.ts +5 -0
  68. package/dist/types-ts4.5/ui/link-picker/search-results/search-results-container/styled.d.ts +1 -0
  69. package/dist/types-ts4.5/ui/link-picker/styled.d.ts +0 -2
  70. package/dist/types-ts4.5/ui/loader-fallback/styled.d.ts +1 -0
  71. package/package.json +9 -6
  72. package/tmp/api-report-tmp.d.ts +123 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # @atlaskit/link-picker
2
2
 
3
+ ## 1.28.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`db2a42eb771`](https://bitbucket.org/atlassian/atlassian-frontend/commits/db2a42eb771) - [ux] EDM-7273 Jira create feature discovery
8
+
9
+ ## 1.27.2
10
+
11
+ ### Patch Changes
12
+
13
+ - [`fa3c0d93eae`](https://bitbucket.org/atlassian/atlassian-frontend/commits/fa3c0d93eae) - Improves fixed height display of link picker when 'platform.linking-platform.link-picker.fixed-height-search-results' is enabled.
14
+ - Updated dependencies
15
+
3
16
  ## 1.27.1
4
17
 
5
18
  ### Patch Changes
package/compass.yml CHANGED
@@ -21,7 +21,7 @@ links:
21
21
  url: 'https://product-fabric.atlassian.net/jira/software/c/projects/EDM/boards/893'
22
22
  - name: ''
23
23
  type: ON_CALL
24
- url: 'https://atlassian.app.opsgenie.com/settings/schedule/detail/98927e5e-f400-41a3-bdd1-b580c9b1d78b'
24
+ url: 'https://atlassian.app.opsgenie.com/settings/schedule/detail/b9c8b313-dd6d-4a41-8eeb-d7a9df55be9d'
25
25
  - name: ''
26
26
  type: DASHBOARD
27
27
  url: 'https://atlassian.signalfx.com/#/dashboard/EXwrMgYAwAA?groupId=EXwtbIrA4AA&configId=EXwrNLcA4AA'
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.RECENT_SEARCH_LIST_SIZE = exports.LINK_PICKER_WIDTH_IN_PX = exports.LINK_PICKER_MIN_HEIGHT_IN_PX_WITH_TABS_WITH_DISPLAYTEXT = exports.LINK_PICKER_MIN_HEIGHT_IN_PX_WITH_TABS_WITHOUT_DISPLAYTEXT = exports.LINK_PICKER_MIN_HEIGHT_IN_PX_WITHOUT_TABS_WITH_DISPLAYTEXT = exports.LINK_PICKER_MIN_HEIGHT_IN_PX_WITHOUT_TABS_WITHOUT_DISPLAYTEXT = exports.LINK_PICKER_MIN_HEIGHT_IN_PX_FALLBACK = exports.COMPONENT_NAME = exports.ANALYTICS_CHANNEL = void 0;
6
+ exports.RECENT_SEARCH_LIST_SIZE = exports.LINK_PICKER_WIDTH_IN_PX = exports.LINK_PICKER_MIN_HEIGHT_IN_PX_FALLBACK = exports.COMPONENT_NAME = exports.ANALYTICS_CHANNEL = void 0;
7
7
  var ANALYTICS_CHANNEL = 'media';
8
8
  exports.ANALYTICS_CHANNEL = ANALYTICS_CHANNEL;
9
9
  var COMPONENT_NAME = 'linkPicker';
@@ -12,13 +12,5 @@ var RECENT_SEARCH_LIST_SIZE = 5;
12
12
  exports.RECENT_SEARCH_LIST_SIZE = RECENT_SEARCH_LIST_SIZE;
13
13
  var LINK_PICKER_WIDTH_IN_PX = 342;
14
14
  exports.LINK_PICKER_WIDTH_IN_PX = LINK_PICKER_WIDTH_IN_PX;
15
- var LINK_PICKER_MIN_HEIGHT_IN_PX_WITH_TABS_WITHOUT_DISPLAYTEXT = '472px';
16
- exports.LINK_PICKER_MIN_HEIGHT_IN_PX_WITH_TABS_WITHOUT_DISPLAYTEXT = LINK_PICKER_MIN_HEIGHT_IN_PX_WITH_TABS_WITHOUT_DISPLAYTEXT;
17
- var LINK_PICKER_MIN_HEIGHT_IN_PX_WITH_TABS_WITH_DISPLAYTEXT = '550px';
18
- exports.LINK_PICKER_MIN_HEIGHT_IN_PX_WITH_TABS_WITH_DISPLAYTEXT = LINK_PICKER_MIN_HEIGHT_IN_PX_WITH_TABS_WITH_DISPLAYTEXT;
19
- var LINK_PICKER_MIN_HEIGHT_IN_PX_WITHOUT_TABS_WITH_DISPLAYTEXT = '218px';
20
- exports.LINK_PICKER_MIN_HEIGHT_IN_PX_WITHOUT_TABS_WITH_DISPLAYTEXT = LINK_PICKER_MIN_HEIGHT_IN_PX_WITHOUT_TABS_WITH_DISPLAYTEXT;
21
- var LINK_PICKER_MIN_HEIGHT_IN_PX_WITHOUT_TABS_WITHOUT_DISPLAYTEXT = '141px';
22
- exports.LINK_PICKER_MIN_HEIGHT_IN_PX_WITHOUT_TABS_WITHOUT_DISPLAYTEXT = LINK_PICKER_MIN_HEIGHT_IN_PX_WITHOUT_TABS_WITHOUT_DISPLAYTEXT;
23
15
  var LINK_PICKER_MIN_HEIGHT_IN_PX_FALLBACK = '290px';
24
16
  exports.LINK_PICKER_MIN_HEIGHT_IN_PX_FALLBACK = LINK_PICKER_MIN_HEIGHT_IN_PX_FALLBACK;
@@ -8,5 +8,5 @@ exports.minHeightComponentStyles = void 0;
8
8
  var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
9
9
  var _react = require("@emotion/react");
10
10
  var _templateObject;
11
- var minHeightComponentStyles = (0, _react.css)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: var(--link-picker-min-height);\n"])));
11
+ var minHeightComponentStyles = (0, _react.css)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n display: flex;\n align-items: stretch;\n justify-content: center;\n min-height: var(--link-picker-min-height);\n"])));
12
12
  exports.minHeightComponentStyles = minHeightComponentStyles;
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _react = require("react");
8
+ var _react2 = require("@emotion/react");
9
+ var _storageClient = require("@atlaskit/frontend-utilities/storage-client");
10
+ var _styled = require("./styled");
11
+ /** @jsx jsx */
12
+
13
+ var LOCAL_STORAGE_CLIENT_KEY = '@atlaskit/link-picker';
14
+ var LOCAL_STORAGE_DISCOVERY_KEY = 'action-discovery-jira-create';
15
+ var LOCAL_STORAGE_DISCOVERY_VALUE = 'discovered';
16
+ var LOCAL_STORAGE_DISCOVERY_EXPIRY_IN_MS = 15552000000; // 180 days
17
+
18
+ /**
19
+ * This is a hacky solution to help with the feature discovery.
20
+ * This implementation must be removed once the experiment is completed.
21
+ *
22
+ * Cleanup ticket:
23
+ * https://product-fabric.atlassian.net/browse/EDM-7480
24
+ */
25
+ var FeatureDiscovery = function FeatureDiscovery(_ref) {
26
+ var children = _ref.children,
27
+ testId = _ref.testId;
28
+ var storageClient = (0, _react.useMemo)(function () {
29
+ return new _storageClient.StorageClient(LOCAL_STORAGE_CLIENT_KEY);
30
+ }, []);
31
+ // Set this to `false` if you want to always show the feature discovery pulse.
32
+ // (or open Application tab in your devtools and delete the relevent row)
33
+ var discovered = (0, _react.useMemo)(function () {
34
+ return storageClient.getItem(LOCAL_STORAGE_DISCOVERY_KEY) === LOCAL_STORAGE_DISCOVERY_VALUE;
35
+ }, [storageClient]);
36
+ (0, _react.useEffect)(function () {
37
+ return function () {
38
+ if (!discovered) {
39
+ storageClient.setItemWithExpiry(LOCAL_STORAGE_DISCOVERY_KEY, LOCAL_STORAGE_DISCOVERY_VALUE, LOCAL_STORAGE_DISCOVERY_EXPIRY_IN_MS);
40
+ }
41
+ };
42
+ }, [storageClient, discovered]);
43
+ if (discovered) {
44
+ return children;
45
+ }
46
+ return (0, _react2.jsx)("span", {
47
+ css: _styled.pulseStyles,
48
+ "data-testid": "".concat(testId, "-discovery")
49
+ }, children);
50
+ };
51
+ var _default = FeatureDiscovery;
52
+ exports.default = _default;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.pulseStyles = void 0;
8
+ var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
9
+ var _react = require("@emotion/react");
10
+ var _templateObject, _templateObject2;
11
+ var pulseKeyframes = (0, _react.keyframes)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n to {\n box-shadow: 0 0 0 7px rgba(0, 0, 0, 0);\n }\n"])));
12
+
13
+ // Styling from atlassian-frontend/packages/design-system/onboarding/src/styled/target.tsx
14
+ var pulseColor = 'rgb(101, 84, 192)';
15
+ var pulseStyles = (0, _react.css)(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2.default)(["\n display: inline-flex;\n border-radius: 3px;\n box-shadow: 0 0 0 0 ", ";\n animation: ", " 1.45s cubic-bezier(0.5, 0, 0, 1) infinite;\n"])), pulseColor, pulseKeyframes);
16
+ exports.pulseStyles = pulseStyles;
@@ -14,9 +14,10 @@ var _reactIntlNext = require("react-intl-next");
14
14
  var _button = _interopRequireWildcard(require("@atlaskit/button"));
15
15
  var _add = _interopRequireDefault(require("@atlaskit/icon/glyph/editor/add"));
16
16
  var _errors = require("../../../common/utils/errors");
17
+ var _featureDiscovery = _interopRequireDefault(require("./feature-discovery"));
17
18
  var _styled = require("./styled");
18
19
  var _utils = require("./utils");
19
- var _excluded = ["isLoading", "error", "url", "queryState", "items", "isEditing", "onCancel", "action"];
20
+ var _excluded = ["isLoading", "error", "url", "queryState", "items", "isEditing", "onCancel", "action", "createFeatureDiscovery"];
20
21
  /** @jsx jsx */
21
22
  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); }
22
23
  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; }
@@ -40,7 +41,9 @@ var messages = (0, _reactIntlNext.defineMessages)({
40
41
  var testIds = {
41
42
  insertButton: 'link-picker-insert-button',
42
43
  cancelButton: 'link-picker-cancel-button',
43
- actionButton: 'link-picker-action-button'
44
+ actionButton: 'link-picker-action-button',
45
+ /** Feature discovery for action button (css pulse) */
46
+ actionButtonDiscovery: 'link-picker-action-button-discovery'
44
47
  };
45
48
  exports.testIds = testIds;
46
49
  var FormFooter = /*#__PURE__*/(0, _react.memo)(function (_ref) {
@@ -52,6 +55,8 @@ var FormFooter = /*#__PURE__*/(0, _react.memo)(function (_ref) {
52
55
  isEditing = _ref.isEditing,
53
56
  onCancel = _ref.onCancel,
54
57
  action = _ref.action,
58
+ _ref$createFeatureDis = _ref.createFeatureDiscovery,
59
+ createFeatureDiscovery = _ref$createFeatureDis === void 0 ? false : _ref$createFeatureDis,
55
60
  restProps = (0, _objectWithoutProperties2.default)(_ref, _excluded);
56
61
  var intl = (0, _reactIntlNext.useIntl)();
57
62
  if (error && error instanceof _errors.UnauthenticatedError) {
@@ -59,19 +64,24 @@ var FormFooter = /*#__PURE__*/(0, _react.memo)(function (_ref) {
59
64
  }
60
65
  var isSubmitDisabled = (0, _utils.checkSubmitDisabled)(isLoading, error, url, queryState, items);
61
66
  var insertButtonMsg = isEditing ? messages.saveButton : messages.insertButton;
67
+ var createButton = function createButton(pluginAction) {
68
+ return (0, _react2.jsx)(_button.default, {
69
+ testId: testIds.actionButton,
70
+ onClick: pluginAction.callback,
71
+ appearance: "default",
72
+ iconBefore: (0, _react2.jsx)(_add.default, {
73
+ label: "",
74
+ size: "medium"
75
+ })
76
+ }, typeof pluginAction.label === 'string' ? pluginAction.label : intl.formatMessage(pluginAction.label));
77
+ };
62
78
  return (0, _react2.jsx)("footer", (0, _extends2.default)({
63
79
  css: _styled.formFooterStyles
64
80
  }, restProps), action && (0, _react2.jsx)("div", {
65
81
  css: _styled.formFooterActionStyles
66
- }, (0, _react2.jsx)(_button.default, {
67
- testId: testIds.actionButton,
68
- onClick: action.callback,
69
- appearance: "default",
70
- iconBefore: (0, _react2.jsx)(_add.default, {
71
- label: "",
72
- size: "medium"
73
- })
74
- }, typeof action.label === 'string' ? action.label : intl.formatMessage(action.label))), (0, _react2.jsx)(_button.ButtonGroup, null, (0, _react2.jsx)(_button.default, {
82
+ }, createFeatureDiscovery ? (0, _react2.jsx)(_featureDiscovery.default, {
83
+ testId: testIds.actionButtonDiscovery
84
+ }, createButton(action)) : createButton(action)), (0, _react2.jsx)(_button.ButtonGroup, null, (0, _react2.jsx)(_button.default, {
75
85
  appearance: "subtle",
76
86
  onClick: onCancel,
77
87
  testId: testIds.cancelButton
@@ -13,6 +13,7 @@ var _reactIntlNext = require("react-intl-next");
13
13
  var _analyticsNext = require("@atlaskit/analytics-next");
14
14
  var _url2 = require("@atlaskit/linking-common/url");
15
15
  var _userAgent = require("@atlaskit/linking-common/user-agent");
16
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
16
17
  var _visuallyHidden = _interopRequireDefault(require("@atlaskit/visually-hidden"));
17
18
  var _analytics = require("../../common/analytics");
18
19
  var _constants = require("../../common/constants");
@@ -44,13 +45,17 @@ var initState = {
44
45
  selectedIndex: -1,
45
46
  invalidUrl: false,
46
47
  activeTab: 0,
47
- preventHidingRecents: false
48
+ preventHidingRecents: false,
49
+ /** This only allows the feature discovery pulse - to be shown the ff must be on and active tab be Jira */
50
+ allowCreateFeatureDiscovery: true
48
51
  };
49
52
  function reducer(state, payload) {
50
53
  if (payload.url && state.url !== payload.url) {
51
54
  return _objectSpread(_objectSpread({}, state), {}, {
52
55
  invalidUrl: false,
53
- selectedIndex: (0, _url2.isSafeUrl)(payload.url) && payload.url.length ? -1 : state.selectedIndex
56
+ selectedIndex: (0, _url2.isSafeUrl)(payload.url) && payload.url.length ? -1 : state.selectedIndex,
57
+ /** When the user starts entering a url, stop pulsing the create button */
58
+ allowCreateFeatureDiscovery: false
54
59
  }, payload);
55
60
  }
56
61
  return _objectSpread(_objectSpread({}, state), payload);
@@ -96,7 +101,8 @@ var LinkPicker = (0, _analytics.withLinkPickerAnalyticsContext)( /*#__PURE__*/(0
96
101
  url = state.url,
97
102
  displayText = state.displayText,
98
103
  invalidUrl = state.invalidUrl,
99
- activeTab = state.activeTab;
104
+ activeTab = state.activeTab,
105
+ allowCreateFeatureDiscovery = state.allowCreateFeatureDiscovery;
100
106
  var intl = (0, _reactIntlNext.useIntl)();
101
107
  var queryState = (0, _useSearchQuery.useSearchQuery)(state);
102
108
  var _usePlugins = (0, _usePlugins2.usePlugins)(queryState, activeTab, plugins),
@@ -316,7 +322,7 @@ var LinkPicker = (0, _analytics.withLinkPickerAnalyticsContext)( /*#__PURE__*/(0
316
322
  "aria-label": intl.formatMessage(_messages.linkTextMessages.linkTextAriaLabel),
317
323
  onClear: handleClear,
318
324
  onChange: handleChangeText
319
- }), !!queryState && (0, _react2.jsx)(_searchResults.SearchResults, {
325
+ }), !!queryState && (isLoadingPlugins || isActivePlugin) && (0, _react2.jsx)(_searchResults.SearchResults, {
320
326
  activeTab: activeTab,
321
327
  tabs: tabs,
322
328
  activePlugin: activePlugin,
@@ -345,6 +351,9 @@ var LinkPicker = (0, _analytics.withLinkPickerAnalyticsContext)( /*#__PURE__*/(0
345
351
  onCancel: onCancel,
346
352
  action: pluginAction,
347
353
  css: !queryState || !(plugins !== null && plugins !== void 0 && plugins.length) ? _styled.formFooterMargin : undefined
354
+ /* Show the feature discovery pulse when we're on the Jira tab, we haven't started typing a url and
355
+ the feature flag is enabled */,
356
+ createFeatureDiscovery: (activePlugin === null || activePlugin === void 0 ? void 0 : activePlugin.tabKey) === 'jira' && allowCreateFeatureDiscovery && (0, _platformFeatureFlags.getBooleanFF)('platform.linking-platform.link-picker.enable-jira-create')
348
357
  }));
349
358
  }));
350
359
  exports.LinkPicker = LinkPicker;
@@ -16,6 +16,7 @@ var _useFixHeight = require("../../../controllers/use-fix-height");
16
16
  var _linkSearchError = require("./link-search-error");
17
17
  var _linkSearchList = require("./link-search-list");
18
18
  var _scrollingTabs = require("./scrolling-tabs");
19
+ var _searchResultsContainer = require("./search-results-container");
19
20
  var _styled = require("./styled");
20
21
  var _trackTabViewed = require("./track-tab-viewed");
21
22
  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); }
@@ -57,7 +58,9 @@ var SearchResults = function SearchResults(_ref) {
57
58
  testId: testIds.tabItem
58
59
  }, tab.tabTitle);
59
60
  }));
60
- return (0, _react2.jsx)(_react.Fragment, null, isLoadingPlugins && !!queryState && (0, _react2.jsx)("div", {
61
+ return (0, _react2.jsx)(_searchResultsContainer.SearchResultsContainer, (0, _extends2.default)({
62
+ hasTabs: !!tabs.length || isLoadingPlugins
63
+ }, fixListHeightProps), isLoadingPlugins && !!queryState && (0, _react2.jsx)("div", {
61
64
  css: _styled.spinnerContainerStyles
62
65
  }, (0, _react2.jsx)(_spinner.default, {
63
66
  testId: testIds.tabsLoadingIndicator,
@@ -71,9 +74,7 @@ var SearchResults = function SearchResults(_ref) {
71
74
  onChange: handleTabChange
72
75
  }, featureFlags !== null && featureFlags !== void 0 && featureFlags.scrollingTabs ? (0, _react2.jsx)(_scrollingTabs.ScrollingTabList, null, tabList) : tabList), (0, _react2.jsx)(_trackTabViewed.TrackTabViewed, {
73
76
  activePlugin: activePlugin
74
- })), (0, _react2.jsx)("div", (0, _extends2.default)({
75
- css: _styled.flexColumnStyles
76
- }, fixListHeightProps), !error && (0, _react2.jsx)(_linkSearchList.LinkSearchList, {
77
+ })), !error && (0, _react2.jsx)(_linkSearchList.LinkSearchList, {
77
78
  id: linkSearchListId,
78
79
  role: "listbox",
79
80
  items: items,
@@ -85,6 +86,6 @@ var SearchResults = function SearchResults(_ref) {
85
86
  onKeyDown: handleKeyDown,
86
87
  hasSearchTerm: !!(queryState !== null && queryState !== void 0 && queryState.query.length),
87
88
  activePlugin: activePlugin
88
- }), error && ((_activePlugin$errorFa = activePlugin === null || activePlugin === void 0 ? void 0 : (_activePlugin$errorFa2 = activePlugin.errorFallback) === null || _activePlugin$errorFa2 === void 0 ? void 0 : _activePlugin$errorFa2.call(activePlugin, error, retry)) !== null && _activePlugin$errorFa !== void 0 ? _activePlugin$errorFa : (0, _react2.jsx)(_linkSearchError.LinkSearchError, null)))));
89
+ }), error && ((_activePlugin$errorFa = activePlugin === null || activePlugin === void 0 ? void 0 : (_activePlugin$errorFa2 = activePlugin.errorFallback) === null || _activePlugin$errorFa2 === void 0 ? void 0 : _activePlugin$errorFa2.call(activePlugin, error, retry)) !== null && _activePlugin$errorFa !== void 0 ? _activePlugin$errorFa : (0, _react2.jsx)(_linkSearchError.LinkSearchError, null))));
89
90
  };
90
91
  exports.SearchResults = SearchResults;
@@ -14,6 +14,7 @@ var _reactIntlNext = require("react-intl-next");
14
14
  var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
15
15
  var _spinner = _interopRequireDefault(require("@atlaskit/spinner"));
16
16
  var _visuallyHidden = _interopRequireDefault(require("@atlaskit/visually-hidden"));
17
+ var _minHeightContainer = require("../../../../common/ui/min-height-container");
17
18
  var _handleNavKeyDown = require("../../../../common/utils/handleNavKeyDown");
18
19
  var _linkSearchNoResults = require("./link-search-no-results");
19
20
  var _styled = require("./link-search-no-results/styled");
@@ -155,7 +156,8 @@ var LinkSearchList = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
155
156
  })));
156
157
  }
157
158
  if (isLoading) {
158
- loadingContent = (0, _react2.jsx)("div", {
159
+ loadingContent = (0, _react2.jsx)(_minHeightContainer.MinHeightContainer, {
160
+ minHeight: (0, _platformFeatureFlags.getBooleanFF)('platform.linking-platform.link-picker.fixed-height-search-results') ? '50px' : '80px',
159
161
  css: _styled2.spinnerContainerStyles
160
162
  }, (0, _react2.jsx)(_spinner.default, {
161
163
  testId: testIds.searchResultLoadingIndicator,
@@ -10,9 +10,9 @@ var _react = require("@emotion/react");
10
10
  var _theme = require("@atlaskit/theme");
11
11
  var _templateObject, _templateObject2, _templateObject3, _templateObject4; // AFP-2532 TODO: Fix automatic suppressions below
12
12
  // eslint-disable-next-line @atlassian/tangerine/import/entry-points
13
- var listContainerStyles = (0, _react.css)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n padding-top: 0;\n min-height: 80px;\n margin-top: ", ";\n margin-bottom: ", ";\n flex-grow: 1;\n display: flex;\n flex-direction: column;\n"])), "var(--ds-space-200, 16px)", "var(--ds-space-200, 16px)");
13
+ var listContainerStyles = (0, _react.css)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n width: 100%;\n padding-top: 0;\n min-height: 80px;\n margin-top: ", ";\n margin-bottom: ", ";\n flex-grow: 1;\n display: flex;\n flex-direction: column;\n"])), "var(--ds-space-200, 16px)", "var(--ds-space-200, 16px)");
14
14
  exports.listContainerStyles = listContainerStyles;
15
- 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"])));
15
+ var spinnerContainerStyles = (0, _react.css)(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2.default)(["\n flex-grow: 1;\n flex-direction: column;\n align-items: center;\n"])));
16
16
  exports.spinnerContainerStyles = spinnerContainerStyles;
17
17
  var listStyles = (0, _react.css)(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2.default)(["\n padding: 0;\n margin: 0 calc(-1 * ", ");\n list-style: none;\n"])), "var(--ds-space-200, 16px)");
18
18
  exports.listStyles = listStyles;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.SearchResultsContainer = void 0;
8
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
10
+ var _react = require("react");
11
+ var _react2 = require("@emotion/react");
12
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
13
+ var _minHeightContainer = require("../../../../common/ui/min-height-container");
14
+ var _styled = require("./styled");
15
+ var _excluded = ["hasTabs"];
16
+ /** @jsx jsx */
17
+ var SearchResultsContainer = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
18
+ var hasTabs = _ref.hasTabs,
19
+ props = (0, _objectWithoutProperties2.default)(_ref, _excluded);
20
+ var minHeight = hasTabs ? '347px' : '302px';
21
+ var ffMinHeight = (0, _platformFeatureFlags.getBooleanFF)('platform.linking-platform.link-picker.fixed-height-search-results') ? minHeight : 'auto';
22
+ return (0, _react2.jsx)(_minHeightContainer.MinHeightContainer, (0, _extends2.default)({
23
+ ref: ref,
24
+ minHeight: ffMinHeight,
25
+ css: _styled.flexColumn
26
+ }, props));
27
+ });
28
+ exports.SearchResultsContainer = SearchResultsContainer;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.flexColumn = void 0;
8
+ var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
9
+ var _react = require("@emotion/react");
10
+ var _templateObject;
11
+ var flexColumn = (0, _react.css)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n display: flex;\n flex-direction: column;\n justify-content: flex-start;\n width: 100%;\n"])));
12
+ exports.flexColumn = flexColumn;
@@ -10,7 +10,7 @@ var _react = require("@emotion/react");
10
10
  var _templateObject, _templateObject2, _templateObject3;
11
11
  var tabsWrapperStyles = (0, _react.css)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n margin-top: ", ";\n margin-left: calc(-1 * ", ");\n margin-right: calc(-1 * ", ");\n"])), "var(--ds-space-150, 12px)", "var(--ds-space-100, 8px)", "var(--ds-space-100, 8px)");
12
12
  exports.tabsWrapperStyles = tabsWrapperStyles;
13
- var spinnerContainerStyles = (0, _react.css)(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2.default)(["\n min-height: 80px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-grow: 1;\n"])));
13
+ var spinnerContainerStyles = (0, _react.css)(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2.default)(["\n min-height: 80px;\n display: flex;\n align-items: center;\n justify-content: center;\n align-self: center;\n flex-grow: 1;\n"])));
14
14
  exports.spinnerContainerStyles = spinnerContainerStyles;
15
15
  var flexColumnStyles = (0, _react.css)(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2.default)(["\n display: flex;\n flex-direction: column;\n"])));
16
16
  exports.flexColumnStyles = flexColumnStyles;
@@ -4,20 +4,16 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.tabsWrapperStyles = exports.rootContainerStyles = exports.formFooterMargin = exports.flexColumnStyles = void 0;
7
+ exports.rootContainerStyles = exports.formFooterMargin = void 0;
8
8
  var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
9
9
  var _react = require("@emotion/react");
10
10
  var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
11
11
  var _constants = require("../../common/constants");
12
- var _templateObject, _templateObject2, _templateObject3, _templateObject4;
12
+ var _templateObject, _templateObject2;
13
13
  /**
14
14
  * Half padding on the top as the form field has a `gridSize()` margin top that cannot be overridden
15
15
  */
16
16
  var rootContainerStyles = (0, _react.css)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n width: ", ";\n padding: ", " ", "\n ", ";\n box-sizing: border-box;\n line-height: initial;\n"])), (0, _platformFeatureFlags.getBooleanFF)('platform.linking-platform.link-picker.fixed-height-search-results') ? undefined : "".concat(_constants.LINK_PICKER_WIDTH_IN_PX, "px"), "var(--ds-space-100, 8px)", "var(--ds-space-200, 16px)", "var(--ds-space-200, 16px)");
17
17
  exports.rootContainerStyles = rootContainerStyles;
18
- var tabsWrapperStyles = (0, _react.css)(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2.default)(["\n margin-top: ", ";\n margin-left: calc(-1 * ", ");\n margin-right: calc(-1 * ", ");\n"])), "var(--ds-space-150, 12px)", "var(--ds-space-100, 8px)", "var(--ds-space-100, 8px)");
19
- exports.tabsWrapperStyles = tabsWrapperStyles;
20
- var flexColumnStyles = (0, _react.css)(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2.default)(["\n display: flex;\n flex-direction: column;\n"])));
21
- exports.flexColumnStyles = flexColumnStyles;
22
- var formFooterMargin = (0, _react.css)(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2.default)(["\n margin-top: ", ";\n"])), "var(--ds-space-200, 16px)");
18
+ var formFooterMargin = (0, _react.css)(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2.default)(["\n margin-top: ", ";\n"])), "var(--ds-space-200, 16px)");
23
19
  exports.formFooterMargin = formFooterMargin;
@@ -8,10 +8,16 @@ exports.LoaderFallback = void 0;
8
8
  var _react = require("@emotion/react");
9
9
  var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
10
10
  var _spinner = _interopRequireDefault(require("@atlaskit/spinner"));
11
- var _constants = require("../../common/constants");
12
11
  var _minHeightContainer = require("../../common/ui/min-height-container");
12
+ var _styled = require("./styled");
13
13
  /** @jsx jsx */
14
14
 
15
+ var LINK_PICKER_MIN_HEIGHT_IN_PX_WITH_TABS_WITHOUT_DISPLAYTEXT = '472px';
16
+ var LINK_PICKER_MIN_HEIGHT_IN_PX_WITH_TABS_WITH_DISPLAYTEXT = '550px';
17
+ var LINK_PICKER_MIN_HEIGHT_IN_PX_WITHOUT_TABS_WITH_PLUGIN_WITH_DISPLAYTEXT = '505px';
18
+ var LINK_PICKER_MIN_HEIGHT_IN_PX_WITHOUT_TABS_WITH_PLUGIN_WITHOUT_DISPLAYTEXT = '429px';
19
+ var LINK_PICKER_MIN_HEIGHT_IN_PX_WITHOUT_TABS_WITH_DISPLAYTEXT = '218px';
20
+ var LINK_PICKER_MIN_HEIGHT_IN_PX_WITHOUT_TABS_WITHOUT_DISPLAYTEXT = '141px';
15
21
  // EDM-7122: can delete these two consts once min height container for link picker is firm for the loader
16
22
  var LINK_PICKER_MIN_HEIGHT_IN_PX_WITHOUT_DISPLAYTEXT = '142px';
17
23
  var LINK_PICKER_MIN_HEIGHT_IN_PX_WITH_DISPLAYTEXT = '220px';
@@ -20,10 +26,13 @@ var getEstimatedMinHeight = function getEstimatedMinHeight(_ref) {
20
26
  isLoadingPlugins = _ref.isLoadingPlugins,
21
27
  plugins = _ref.plugins;
22
28
  if ((0, _platformFeatureFlags.getBooleanFF)('platform.linking-platform.link-picker.fixed-height-search-results')) {
23
- if (plugins !== null && plugins !== void 0 && plugins.length || isLoadingPlugins) {
24
- return hideDisplayText ? _constants.LINK_PICKER_MIN_HEIGHT_IN_PX_WITH_TABS_WITHOUT_DISPLAYTEXT : _constants.LINK_PICKER_MIN_HEIGHT_IN_PX_WITH_TABS_WITH_DISPLAYTEXT;
29
+ if (plugins && plugins.length > 1 || isLoadingPlugins) {
30
+ return hideDisplayText ? LINK_PICKER_MIN_HEIGHT_IN_PX_WITH_TABS_WITHOUT_DISPLAYTEXT : LINK_PICKER_MIN_HEIGHT_IN_PX_WITH_TABS_WITH_DISPLAYTEXT;
25
31
  }
26
- return hideDisplayText ? _constants.LINK_PICKER_MIN_HEIGHT_IN_PX_WITHOUT_TABS_WITHOUT_DISPLAYTEXT : _constants.LINK_PICKER_MIN_HEIGHT_IN_PX_WITHOUT_TABS_WITH_DISPLAYTEXT;
32
+ if ((plugins === null || plugins === void 0 ? void 0 : plugins.length) === 1) {
33
+ return hideDisplayText ? LINK_PICKER_MIN_HEIGHT_IN_PX_WITHOUT_TABS_WITH_PLUGIN_WITHOUT_DISPLAYTEXT : LINK_PICKER_MIN_HEIGHT_IN_PX_WITHOUT_TABS_WITH_PLUGIN_WITH_DISPLAYTEXT;
34
+ }
35
+ return hideDisplayText ? LINK_PICKER_MIN_HEIGHT_IN_PX_WITHOUT_TABS_WITHOUT_DISPLAYTEXT : LINK_PICKER_MIN_HEIGHT_IN_PX_WITHOUT_TABS_WITH_DISPLAYTEXT;
27
36
  }
28
37
  return hideDisplayText ? LINK_PICKER_MIN_HEIGHT_IN_PX_WITHOUT_DISPLAYTEXT : LINK_PICKER_MIN_HEIGHT_IN_PX_WITH_DISPLAYTEXT;
29
38
  };
@@ -36,7 +45,8 @@ var LoaderFallback = function LoaderFallback(props) {
36
45
  var minHeight = getEstimatedMinHeight(props);
37
46
  return (0, _react.jsx)(_minHeightContainer.MinHeightContainer, {
38
47
  minHeight: minHeight,
39
- "data-testid": "link-picker-root-loader-boundary-ui"
48
+ "data-testid": "link-picker-root-loader-boundary-ui",
49
+ css: _styled.styles
40
50
  }, (0, _react.jsx)(_spinner.default, {
41
51
  testId: "link-picker.component-loading-indicator",
42
52
  size: "medium"
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.styles = void 0;
8
+ var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
9
+ var _react = require("@emotion/react");
10
+ var _templateObject;
11
+ var styles = (0, _react.css)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n align-items: center;\n"])));
12
+ exports.styles = styles;
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/link-picker",
3
- "version": "1.27.1",
3
+ "version": "1.28.0",
4
4
  "sideEffects": false
5
5
  }
@@ -2,8 +2,4 @@ export const ANALYTICS_CHANNEL = 'media';
2
2
  export const COMPONENT_NAME = 'linkPicker';
3
3
  export const RECENT_SEARCH_LIST_SIZE = 5;
4
4
  export const LINK_PICKER_WIDTH_IN_PX = 342;
5
- export const LINK_PICKER_MIN_HEIGHT_IN_PX_WITH_TABS_WITHOUT_DISPLAYTEXT = '472px';
6
- export const LINK_PICKER_MIN_HEIGHT_IN_PX_WITH_TABS_WITH_DISPLAYTEXT = '550px';
7
- export const LINK_PICKER_MIN_HEIGHT_IN_PX_WITHOUT_TABS_WITH_DISPLAYTEXT = '218px';
8
- export const LINK_PICKER_MIN_HEIGHT_IN_PX_WITHOUT_TABS_WITHOUT_DISPLAYTEXT = '141px';
9
5
  export const LINK_PICKER_MIN_HEIGHT_IN_PX_FALLBACK = '290px';
@@ -1,7 +1,7 @@
1
1
  import { css } from '@emotion/react';
2
2
  export const minHeightComponentStyles = css`
3
3
  display: flex;
4
- align-items: center;
4
+ align-items: stretch;
5
5
  justify-content: center;
6
6
  min-height: var(--link-picker-min-height);
7
7
  `;
@@ -0,0 +1,41 @@
1
+ /** @jsx jsx */
2
+ import { useEffect, useMemo } from 'react';
3
+ import { jsx } from '@emotion/react';
4
+ import { StorageClient } from '@atlaskit/frontend-utilities/storage-client';
5
+ import { pulseStyles } from './styled';
6
+ const LOCAL_STORAGE_CLIENT_KEY = '@atlaskit/link-picker';
7
+ const LOCAL_STORAGE_DISCOVERY_KEY = 'action-discovery-jira-create';
8
+ const LOCAL_STORAGE_DISCOVERY_VALUE = 'discovered';
9
+ const LOCAL_STORAGE_DISCOVERY_EXPIRY_IN_MS = 15552000000; // 180 days
10
+
11
+ /**
12
+ * This is a hacky solution to help with the feature discovery.
13
+ * This implementation must be removed once the experiment is completed.
14
+ *
15
+ * Cleanup ticket:
16
+ * https://product-fabric.atlassian.net/browse/EDM-7480
17
+ */
18
+ const FeatureDiscovery = ({
19
+ children,
20
+ testId
21
+ }) => {
22
+ const storageClient = useMemo(() => new StorageClient(LOCAL_STORAGE_CLIENT_KEY), []);
23
+ // Set this to `false` if you want to always show the feature discovery pulse.
24
+ // (or open Application tab in your devtools and delete the relevent row)
25
+ const discovered = useMemo(() => storageClient.getItem(LOCAL_STORAGE_DISCOVERY_KEY) === LOCAL_STORAGE_DISCOVERY_VALUE, [storageClient]);
26
+ useEffect(() => {
27
+ return () => {
28
+ if (!discovered) {
29
+ storageClient.setItemWithExpiry(LOCAL_STORAGE_DISCOVERY_KEY, LOCAL_STORAGE_DISCOVERY_VALUE, LOCAL_STORAGE_DISCOVERY_EXPIRY_IN_MS);
30
+ }
31
+ };
32
+ }, [storageClient, discovered]);
33
+ if (discovered) {
34
+ return children;
35
+ }
36
+ return jsx("span", {
37
+ css: pulseStyles,
38
+ "data-testid": `${testId}-discovery`
39
+ }, children);
40
+ };
41
+ export default FeatureDiscovery;
@@ -0,0 +1,15 @@
1
+ import { css, keyframes } from '@emotion/react';
2
+ const pulseKeyframes = keyframes`
3
+ to {
4
+ box-shadow: 0 0 0 7px rgba(0, 0, 0, 0);
5
+ }
6
+ `;
7
+
8
+ // Styling from atlassian-frontend/packages/design-system/onboarding/src/styled/target.tsx
9
+ const pulseColor = 'rgb(101, 84, 192)';
10
+ export const pulseStyles = css`
11
+ display: inline-flex;
12
+ border-radius: 3px;
13
+ box-shadow: 0 0 0 0 ${pulseColor};
14
+ animation: ${pulseKeyframes} 1.45s cubic-bezier(0.5, 0, 0, 1) infinite;
15
+ `;
@@ -6,6 +6,7 @@ import { defineMessages, useIntl } from 'react-intl-next';
6
6
  import Button, { ButtonGroup } from '@atlaskit/button';
7
7
  import EditorAddIcon from '@atlaskit/icon/glyph/editor/add';
8
8
  import { UnauthenticatedError } from '../../../common/utils/errors';
9
+ import FeatureDiscovery from './feature-discovery';
9
10
  import { formFooterActionStyles, formFooterStyles } from './styled';
10
11
  import { checkSubmitDisabled } from './utils';
11
12
  const messages = defineMessages({
@@ -28,7 +29,9 @@ const messages = defineMessages({
28
29
  export const testIds = {
29
30
  insertButton: 'link-picker-insert-button',
30
31
  cancelButton: 'link-picker-cancel-button',
31
- actionButton: 'link-picker-action-button'
32
+ actionButton: 'link-picker-action-button',
33
+ /** Feature discovery for action button (css pulse) */
34
+ actionButtonDiscovery: 'link-picker-action-button-discovery'
32
35
  };
33
36
  export const FormFooter = /*#__PURE__*/memo(({
34
37
  isLoading,
@@ -39,6 +42,7 @@ export const FormFooter = /*#__PURE__*/memo(({
39
42
  isEditing,
40
43
  onCancel,
41
44
  action,
45
+ createFeatureDiscovery = false,
42
46
  ...restProps
43
47
  }) => {
44
48
  const intl = useIntl();
@@ -47,19 +51,22 @@ export const FormFooter = /*#__PURE__*/memo(({
47
51
  }
48
52
  const isSubmitDisabled = checkSubmitDisabled(isLoading, error, url, queryState, items);
49
53
  const insertButtonMsg = isEditing ? messages.saveButton : messages.insertButton;
50
- return jsx("footer", _extends({
51
- css: formFooterStyles
52
- }, restProps), action && jsx("div", {
53
- css: formFooterActionStyles
54
- }, jsx(Button, {
54
+ const createButton = pluginAction => jsx(Button, {
55
55
  testId: testIds.actionButton,
56
- onClick: action.callback,
56
+ onClick: pluginAction.callback,
57
57
  appearance: "default",
58
58
  iconBefore: jsx(EditorAddIcon, {
59
59
  label: "",
60
60
  size: "medium"
61
61
  })
62
- }, typeof action.label === 'string' ? action.label : intl.formatMessage(action.label))), jsx(ButtonGroup, null, jsx(Button, {
62
+ }, typeof pluginAction.label === 'string' ? pluginAction.label : intl.formatMessage(pluginAction.label));
63
+ return jsx("footer", _extends({
64
+ css: formFooterStyles
65
+ }, restProps), action && jsx("div", {
66
+ css: formFooterActionStyles
67
+ }, createFeatureDiscovery ? jsx(FeatureDiscovery, {
68
+ testId: testIds.actionButtonDiscovery
69
+ }, createButton(action)) : createButton(action)), jsx(ButtonGroup, null, jsx(Button, {
63
70
  appearance: "subtle",
64
71
  onClick: onCancel,
65
72
  testId: testIds.cancelButton