@atlaskit/link-picker 3.13.0 → 3.15.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # @atlaskit/link-picker
2
2
 
3
+ ## 3.15.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`df69392511ed8`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/df69392511ed8) -
8
+ [ux] Renamed Google Drive tab to GDrive for link picker experiment and also removed scrolling tab
9
+ list as that is no longer needed for the experiment
10
+
11
+ ## 3.14.0
12
+
13
+ ### Minor Changes
14
+
15
+ - [`d21c47b4f935f`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/d21c47b4f935f) -
16
+ [ux] New prop submitOnInputChange for link picker that removes the submit button and adds a submit
17
+ on input change
18
+
3
19
  ## 3.13.0
4
20
 
5
21
  ### Minor Changes
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
9
+ var _react = require("react");
10
+ var _useDebounce3 = require("use-debounce");
11
+ var _url = require("@atlaskit/linking-common/url");
12
+ var AutoSubmitOnChange = function AutoSubmitOnChange(_ref) {
13
+ var url = _ref.url,
14
+ isSubmitting = _ref.isSubmitting,
15
+ isSelectedItem = _ref.isSelectedItem,
16
+ onSubmit = _ref.onSubmit,
17
+ onClearInvalidUrl = _ref.onClearInvalidUrl;
18
+ // Debounce the URL to avoid rapid successive submissions during typing
19
+ var _useDebounce = (0, _useDebounce3.useDebounce)(url, 300),
20
+ _useDebounce2 = (0, _slicedToArray2.default)(_useDebounce, 1),
21
+ debouncedUrl = _useDebounce2[0];
22
+ var isBlank = url === '';
23
+ // Auto-submit when URL changes
24
+ (0, _react.useEffect)(function () {
25
+ //prevents misalignment between url and debounced url when clear button is clicked
26
+ if (isBlank) {
27
+ onClearInvalidUrl();
28
+ return;
29
+ }
30
+ // Only auto-submit if debouncedUrl is not empty and not already submitting
31
+ if (debouncedUrl.trim() && !isSubmitting && !isSelectedItem) {
32
+ var normalized = (0, _url.normalizeUrl)(debouncedUrl);
33
+ if (normalized) {
34
+ onSubmit();
35
+ }
36
+ }
37
+ //onSubmit() left out to prevent infinite loop
38
+ // eslint-disable-next-line react-hooks/exhaustive-deps
39
+ }, [debouncedUrl, isSubmitting, isSelectedItem, onClearInvalidUrl, isBlank]);
40
+
41
+ // This component renders nothing
42
+ return null;
43
+ };
44
+ var _default = exports.default = AutoSubmitOnChange;
@@ -36,6 +36,7 @@ var _handleNavKeyDown = require("../../common/utils/handleNavKeyDown");
36
36
  var _usePlugins2 = require("../../services/use-plugins");
37
37
  var _useSearchQuery = require("../../services/use-search-query");
38
38
  var _announcer = require("./announcer");
39
+ var _autoSubmitOnChange = _interopRequireDefault(require("./autoSubmitOnChange"));
39
40
  var _formFooter = require("./form-footer");
40
41
  var _linkPickerSubmitButton = require("./form-footer/link-picker-submit-button");
41
42
  var _messages = require("./messages");
@@ -118,6 +119,8 @@ var LinkPicker = exports.LinkPicker = (0, _analytics.withLinkPickerAnalyticsCont
118
119
  _ref$previewableLinks = _ref.previewableLinksOnly,
119
120
  previewableLinksOnly = _ref$previewableLinks === void 0 ? false : _ref$previewableLinks,
120
121
  additionalError = _ref.additionalError,
122
+ _ref$submitOnInputCha = _ref.submitOnInputChange,
123
+ submitOnInputChange = _ref$submitOnInputCha === void 0 ? false : _ref$submitOnInputCha,
121
124
  recentSearchListSize = _ref.recentSearchListSize,
122
125
  shouldRenderNoResultsImage = _ref.shouldRenderNoResultsImage;
123
126
  var _useAnalyticsEvents = (0, _analyticsNext.useAnalyticsEvents)(),
@@ -159,6 +162,7 @@ var LinkPicker = exports.LinkPicker = (0, _analytics.withLinkPickerAnalyticsCont
159
162
  var selectedItem = items === null || items === void 0 ? void 0 : items[selectedIndex];
160
163
  var isSelectedItem = (selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.url) === url;
161
164
  var previewableOnly = (0, _platformFeatureFlags.fg)('platform-linking-link-picker-previewable-only') && previewableLinksOnly;
165
+ var flaggedSubmitOnInputChange = (0, _platformFeatureFlags.fg)('platform-linking-link-picker-previewable-only') && submitOnInputChange;
162
166
  var _useLinkPickerAnalyti = (0, _analytics.useLinkPickerAnalytics)(),
163
167
  trackAttribute = _useLinkPickerAnalyti.trackAttribute,
164
168
  getAttributes = _useLinkPickerAnalyti.getAttributes;
@@ -249,6 +253,13 @@ var LinkPicker = exports.LinkPicker = (0, _analytics.withLinkPickerAnalyticsCont
249
253
  handleInsert(_url, name, 'typeAhead', _objectSpread({}, selectedItem));
250
254
  }
251
255
  }, [handleInsert, trackAttribute, items, activePlugin, isSubmitting]);
256
+ var handleClearInvalidUrl = (0, _platformFeatureFlags.fg)('platform-linking-link-picker-previewable-only') ?
257
+ // eslint-disable-next-line react-hooks/rules-of-hooks
258
+ (0, _react.useCallback)(function () {
259
+ dispatch({
260
+ invalidUrl: false
261
+ });
262
+ }, [dispatch]) : function () {};
252
263
  var handleSubmit = (0, _react.useCallback)( /*#__PURE__*/function () {
253
264
  var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(event) {
254
265
  var normalized, urlResponse, responseObject;
@@ -432,7 +443,13 @@ var LinkPicker = exports.LinkPicker = (0, _analytics.withLinkPickerAnalyticsCont
432
443
  // Use onSubmitCapture instead of onSubmit so that any possible parent form isn't submitted
433
444
  onSubmitCapture: handleSubmit,
434
445
  className: (0, _runtime.ax)(["_19bv164s _u5f31pah _ca0q1k79 _n3td1t3k _vchhusvi _1e0ctcjq"])
435
- }, /*#__PURE__*/React.createElement(_trackMount.TrackMount, null), isActivePlugin && /*#__PURE__*/React.createElement(_react.Fragment, null, screenReaderText && /*#__PURE__*/React.createElement(_announcer.Announcer, {
446
+ }, /*#__PURE__*/React.createElement(_trackMount.TrackMount, null), flaggedSubmitOnInputChange && /*#__PURE__*/React.createElement(_autoSubmitOnChange.default, {
447
+ url: url,
448
+ isSubmitting: isSubmitting,
449
+ isSelectedItem: isSelectedItem,
450
+ onSubmit: handleSubmit,
451
+ onClearInvalidUrl: handleClearInvalidUrl
452
+ }), isActivePlugin && /*#__PURE__*/React.createElement(_react.Fragment, null, screenReaderText && /*#__PURE__*/React.createElement(_announcer.Announcer, {
436
453
  ariaLive: "assertive",
437
454
  text: screenReaderText,
438
455
  ariaRelevant: "additions",
@@ -517,7 +534,7 @@ var LinkPicker = exports.LinkPicker = (0, _analytics.withLinkPickerAnalyticsCont
517
534
  action: pluginAction,
518
535
  customSubmitButtonLabel: customSubmitButtonLabel,
519
536
  submitMessageId: submitMessageId,
520
- hideSubmitButton: moveSubmitButton,
537
+ hideSubmitButton: moveSubmitButton || flaggedSubmitOnInputChange,
521
538
  className: (0, _runtime.ax)([(!queryState || !(plugins !== null && plugins !== void 0 && plugins.length)) && "_19pkpxbi"])
522
539
  }));
523
540
  }));
@@ -12,7 +12,6 @@ var _react = _interopRequireWildcard(require("react"));
12
12
  var React = _react;
13
13
  var _runtime = require("@compiled/react/runtime");
14
14
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
15
- var _featureGateJsClient = _interopRequireDefault(require("@atlaskit/feature-gate-js-client"));
16
15
  var _compiled = require("@atlaskit/primitives/compiled");
17
16
  var _spinner = _interopRequireDefault(require("@atlaskit/spinner/spinner"));
18
17
  var _tabs = _interopRequireWildcard(require("@atlaskit/tabs"));
@@ -56,13 +55,6 @@ var SearchResults = exports.SearchResults = function SearchResults(_ref) {
56
55
  retry = _ref.retry,
57
56
  shouldRenderNoResultsImage = _ref.shouldRenderNoResultsImage;
58
57
  var isActivePlugin = !!activePlugin;
59
- // Experiment with new 3P tabs in link picker. For more info, please see: go/link-picker-3p-drive-one-pager.
60
- var linkPicker3pDriveExperimentCohort = _featureGateJsClient.default.initializeCalled() ? _featureGateJsClient.default.getExperimentValue('link_picker_3p_drive_experiment', 'cohort', 'control') : 'control';
61
- var googleDriveTabExperimentEnabled = linkPicker3pDriveExperimentCohort === 'show_google_drive_tab';
62
- var linkPicker3pOneDriveExperimentCohort = _featureGateJsClient.default.initializeCalled() ? _featureGateJsClient.default.getExperimentValue('link_picker_3p_onedrive_experiment', 'cohort', 'control') : 'control';
63
- var oneDriveTabExperimentEnabled = linkPicker3pOneDriveExperimentCohort === 'show_onedrive_tab';
64
- var thirdPartyTabExperimentEnabled = googleDriveTabExperimentEnabled || oneDriveTabExperimentEnabled;
65
- var showScrollingTabList = (featureFlags === null || featureFlags === void 0 ? void 0 : featureFlags.scrollingTabs) || thirdPartyTabExperimentEnabled;
66
58
  var tabList = /*#__PURE__*/React.createElement(_tabs.TabList, null, tabs.map(function (tab) {
67
59
  return /*#__PURE__*/React.createElement(_tabs.Tab, {
68
60
  key: tab.tabTitle,
@@ -86,7 +78,7 @@ var SearchResults = exports.SearchResults = function SearchResults(_ref) {
86
78
  testId: testIds.tabList,
87
79
  selected: activeTab,
88
80
  onChange: handleTabChange
89
- }, showScrollingTabList ? /*#__PURE__*/React.createElement(_scrollingTabs.ScrollingTabList, null, tabList) : tabList), /*#__PURE__*/React.createElement(_trackTabViewed.TrackTabViewed, {
81
+ }, featureFlags !== null && featureFlags !== void 0 && featureFlags.scrollingTabs ? /*#__PURE__*/React.createElement(_scrollingTabs.ScrollingTabList, null, tabList) : tabList), /*#__PURE__*/React.createElement(_trackTabViewed.TrackTabViewed, {
90
82
  activePlugin: activePlugin
91
83
  })), !error && /*#__PURE__*/React.createElement(_linkSearchList.LinkSearchList, {
92
84
  id: linkSearchListId,
@@ -25,7 +25,7 @@ var testIds = exports.testIds = {
25
25
  };
26
26
  var PACKAGE_DATA = exports.PACKAGE_DATA = {
27
27
  packageName: "@atlaskit/link-picker" || '',
28
- packageVersion: "3.12.1" || '',
28
+ packageVersion: "0.0.0-development" || '',
29
29
  componentName: _constants.COMPONENT_NAME,
30
30
  source: _constants.COMPONENT_NAME
31
31
  };
@@ -0,0 +1,35 @@
1
+ import { useEffect } from 'react';
2
+ import { useDebounce } from 'use-debounce';
3
+ import { normalizeUrl } from '@atlaskit/linking-common/url';
4
+ const AutoSubmitOnChange = ({
5
+ url,
6
+ isSubmitting,
7
+ isSelectedItem,
8
+ onSubmit,
9
+ onClearInvalidUrl
10
+ }) => {
11
+ // Debounce the URL to avoid rapid successive submissions during typing
12
+ const [debouncedUrl] = useDebounce(url, 300);
13
+ const isBlank = url === '';
14
+ // Auto-submit when URL changes
15
+ useEffect(() => {
16
+ //prevents misalignment between url and debounced url when clear button is clicked
17
+ if (isBlank) {
18
+ onClearInvalidUrl();
19
+ return;
20
+ }
21
+ // Only auto-submit if debouncedUrl is not empty and not already submitting
22
+ if (debouncedUrl.trim() && !isSubmitting && !isSelectedItem) {
23
+ const normalized = normalizeUrl(debouncedUrl);
24
+ if (normalized) {
25
+ onSubmit();
26
+ }
27
+ }
28
+ //onSubmit() left out to prevent infinite loop
29
+ // eslint-disable-next-line react-hooks/exhaustive-deps
30
+ }, [debouncedUrl, isSubmitting, isSelectedItem, onClearInvalidUrl, isBlank]);
31
+
32
+ // This component renders nothing
33
+ return null;
34
+ };
35
+ export default AutoSubmitOnChange;
@@ -24,6 +24,7 @@ import { handleNavKeyDown } from '../../common/utils/handleNavKeyDown';
24
24
  import { usePlugins } from '../../services/use-plugins';
25
25
  import { useSearchQuery } from '../../services/use-search-query';
26
26
  import { Announcer } from './announcer';
27
+ import AutoSubmitOnChange from './autoSubmitOnChange';
27
28
  import { FormFooter, testIds as formFooterTestIds } from './form-footer';
28
29
  import { LinkPickerSubmitButton } from './form-footer/link-picker-submit-button';
29
30
  import { formMessages, linkMessages, linkTextMessages, searchMessages } from './messages';
@@ -106,6 +107,7 @@ export const LinkPicker = withLinkPickerAnalyticsContext( /*#__PURE__*/memo(({
106
107
  inputRef,
107
108
  previewableLinksOnly = false,
108
109
  additionalError,
110
+ submitOnInputChange = false,
109
111
  recentSearchListSize,
110
112
  shouldRenderNoResultsImage
111
113
  }) => {
@@ -150,6 +152,7 @@ export const LinkPicker = withLinkPickerAnalyticsContext( /*#__PURE__*/memo(({
150
152
  const selectedItem = items === null || items === void 0 ? void 0 : items[selectedIndex];
151
153
  const isSelectedItem = (selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.url) === url;
152
154
  const previewableOnly = fg('platform-linking-link-picker-previewable-only') && previewableLinksOnly;
155
+ const flaggedSubmitOnInputChange = fg('platform-linking-link-picker-previewable-only') && submitOnInputChange;
153
156
  const {
154
157
  trackAttribute,
155
158
  getAttributes
@@ -244,6 +247,13 @@ export const LinkPicker = withLinkPickerAnalyticsContext( /*#__PURE__*/memo(({
244
247
  });
245
248
  }
246
249
  }, [handleInsert, trackAttribute, items, activePlugin, isSubmitting]);
250
+ const handleClearInvalidUrl = fg('platform-linking-link-picker-previewable-only') ?
251
+ // eslint-disable-next-line react-hooks/rules-of-hooks
252
+ useCallback(() => {
253
+ dispatch({
254
+ invalidUrl: false
255
+ });
256
+ }, [dispatch]) : () => {};
247
257
  const handleSubmit = useCallback(async event => {
248
258
  event === null || event === void 0 ? void 0 : event.preventDefault();
249
259
  if (isSubmitting) {
@@ -387,7 +397,13 @@ export const LinkPicker = withLinkPickerAnalyticsContext( /*#__PURE__*/memo(({
387
397
  // Use onSubmitCapture instead of onSubmit so that any possible parent form isn't submitted
388
398
  onSubmitCapture: handleSubmit,
389
399
  className: ax(["_19bv164s _u5f31pah _ca0q1k79 _n3td1t3k _vchhusvi _1e0ctcjq"])
390
- }, /*#__PURE__*/React.createElement(TrackMount, null), isActivePlugin && /*#__PURE__*/React.createElement(Fragment, null, screenReaderText && /*#__PURE__*/React.createElement(Announcer, {
400
+ }, /*#__PURE__*/React.createElement(TrackMount, null), flaggedSubmitOnInputChange && /*#__PURE__*/React.createElement(AutoSubmitOnChange, {
401
+ url: url,
402
+ isSubmitting: isSubmitting,
403
+ isSelectedItem: isSelectedItem,
404
+ onSubmit: handleSubmit,
405
+ onClearInvalidUrl: handleClearInvalidUrl
406
+ }), isActivePlugin && /*#__PURE__*/React.createElement(Fragment, null, screenReaderText && /*#__PURE__*/React.createElement(Announcer, {
391
407
  ariaLive: "assertive",
392
408
  text: screenReaderText,
393
409
  ariaRelevant: "additions",
@@ -472,7 +488,7 @@ export const LinkPicker = withLinkPickerAnalyticsContext( /*#__PURE__*/memo(({
472
488
  action: pluginAction,
473
489
  customSubmitButtonLabel: customSubmitButtonLabel,
474
490
  submitMessageId: submitMessageId,
475
- hideSubmitButton: moveSubmitButton,
491
+ hideSubmitButton: moveSubmitButton || flaggedSubmitOnInputChange,
476
492
  className: ax([(!queryState || !(plugins !== null && plugins !== void 0 && plugins.length)) && "_19pkpxbi"])
477
493
  }));
478
494
  }));
@@ -3,7 +3,6 @@ import "./index.compiled.css";
3
3
  import * as React from 'react';
4
4
  import { ax, ix } from "@compiled/react/runtime";
5
5
  import { Fragment } from 'react';
6
- import FeatureGates from '@atlaskit/feature-gate-js-client';
7
6
  import { Box } from '@atlaskit/primitives/compiled';
8
7
  import Spinner from '@atlaskit/spinner/spinner';
9
8
  import Tabs, { Tab, TabList } from '@atlaskit/tabs';
@@ -47,13 +46,6 @@ export const SearchResults = ({
47
46
  }) => {
48
47
  var _activePlugin$errorFa, _activePlugin$errorFa2;
49
48
  const isActivePlugin = !!activePlugin;
50
- // Experiment with new 3P tabs in link picker. For more info, please see: go/link-picker-3p-drive-one-pager.
51
- const linkPicker3pDriveExperimentCohort = FeatureGates.initializeCalled() ? FeatureGates.getExperimentValue('link_picker_3p_drive_experiment', 'cohort', 'control') : 'control';
52
- const googleDriveTabExperimentEnabled = linkPicker3pDriveExperimentCohort === 'show_google_drive_tab';
53
- const linkPicker3pOneDriveExperimentCohort = FeatureGates.initializeCalled() ? FeatureGates.getExperimentValue('link_picker_3p_onedrive_experiment', 'cohort', 'control') : 'control';
54
- const oneDriveTabExperimentEnabled = linkPicker3pOneDriveExperimentCohort === 'show_onedrive_tab';
55
- const thirdPartyTabExperimentEnabled = googleDriveTabExperimentEnabled || oneDriveTabExperimentEnabled;
56
- const showScrollingTabList = (featureFlags === null || featureFlags === void 0 ? void 0 : featureFlags.scrollingTabs) || thirdPartyTabExperimentEnabled;
57
49
  const tabList = /*#__PURE__*/React.createElement(TabList, null, tabs.map(tab => /*#__PURE__*/React.createElement(Tab, {
58
50
  key: tab.tabTitle,
59
51
  testId: testIds.tabItem
@@ -75,7 +67,7 @@ export const SearchResults = ({
75
67
  testId: testIds.tabList,
76
68
  selected: activeTab,
77
69
  onChange: handleTabChange
78
- }, showScrollingTabList ? /*#__PURE__*/React.createElement(ScrollingTabList, null, tabList) : tabList), /*#__PURE__*/React.createElement(TrackTabViewed, {
70
+ }, featureFlags !== null && featureFlags !== void 0 && featureFlags.scrollingTabs ? /*#__PURE__*/React.createElement(ScrollingTabList, null, tabList) : tabList), /*#__PURE__*/React.createElement(TrackTabViewed, {
79
71
  activePlugin: activePlugin
80
72
  })), !error && /*#__PURE__*/React.createElement(LinkSearchList, {
81
73
  id: linkSearchListId,
@@ -15,7 +15,7 @@ export const testIds = {
15
15
  };
16
16
  export const PACKAGE_DATA = {
17
17
  packageName: "@atlaskit/link-picker" || '',
18
- packageVersion: "3.12.1" || '',
18
+ packageVersion: "0.0.0-development" || '',
19
19
  componentName: COMPONENT_NAME,
20
20
  source: COMPONENT_NAME
21
21
  };
@@ -0,0 +1,37 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
+ import { useEffect } from 'react';
3
+ import { useDebounce } from 'use-debounce';
4
+ import { normalizeUrl } from '@atlaskit/linking-common/url';
5
+ var AutoSubmitOnChange = function AutoSubmitOnChange(_ref) {
6
+ var url = _ref.url,
7
+ isSubmitting = _ref.isSubmitting,
8
+ isSelectedItem = _ref.isSelectedItem,
9
+ onSubmit = _ref.onSubmit,
10
+ onClearInvalidUrl = _ref.onClearInvalidUrl;
11
+ // Debounce the URL to avoid rapid successive submissions during typing
12
+ var _useDebounce = useDebounce(url, 300),
13
+ _useDebounce2 = _slicedToArray(_useDebounce, 1),
14
+ debouncedUrl = _useDebounce2[0];
15
+ var isBlank = url === '';
16
+ // Auto-submit when URL changes
17
+ useEffect(function () {
18
+ //prevents misalignment between url and debounced url when clear button is clicked
19
+ if (isBlank) {
20
+ onClearInvalidUrl();
21
+ return;
22
+ }
23
+ // Only auto-submit if debouncedUrl is not empty and not already submitting
24
+ if (debouncedUrl.trim() && !isSubmitting && !isSelectedItem) {
25
+ var normalized = normalizeUrl(debouncedUrl);
26
+ if (normalized) {
27
+ onSubmit();
28
+ }
29
+ }
30
+ //onSubmit() left out to prevent infinite loop
31
+ // eslint-disable-next-line react-hooks/exhaustive-deps
32
+ }, [debouncedUrl, isSubmitting, isSelectedItem, onClearInvalidUrl, isBlank]);
33
+
34
+ // This component renders nothing
35
+ return null;
36
+ };
37
+ export default AutoSubmitOnChange;
@@ -30,6 +30,7 @@ import { handleNavKeyDown } from '../../common/utils/handleNavKeyDown';
30
30
  import { usePlugins } from '../../services/use-plugins';
31
31
  import { useSearchQuery } from '../../services/use-search-query';
32
32
  import { Announcer } from './announcer';
33
+ import AutoSubmitOnChange from './autoSubmitOnChange';
33
34
  import { FormFooter, testIds as formFooterTestIds } from './form-footer';
34
35
  import { LinkPickerSubmitButton } from './form-footer/link-picker-submit-button';
35
36
  import { formMessages, linkMessages, linkTextMessages, searchMessages } from './messages';
@@ -109,6 +110,8 @@ export var LinkPicker = withLinkPickerAnalyticsContext( /*#__PURE__*/memo(functi
109
110
  _ref$previewableLinks = _ref.previewableLinksOnly,
110
111
  previewableLinksOnly = _ref$previewableLinks === void 0 ? false : _ref$previewableLinks,
111
112
  additionalError = _ref.additionalError,
113
+ _ref$submitOnInputCha = _ref.submitOnInputChange,
114
+ submitOnInputChange = _ref$submitOnInputCha === void 0 ? false : _ref$submitOnInputCha,
112
115
  recentSearchListSize = _ref.recentSearchListSize,
113
116
  shouldRenderNoResultsImage = _ref.shouldRenderNoResultsImage;
114
117
  var _useAnalyticsEvents = useAnalyticsEvents(),
@@ -150,6 +153,7 @@ export var LinkPicker = withLinkPickerAnalyticsContext( /*#__PURE__*/memo(functi
150
153
  var selectedItem = items === null || items === void 0 ? void 0 : items[selectedIndex];
151
154
  var isSelectedItem = (selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.url) === url;
152
155
  var previewableOnly = fg('platform-linking-link-picker-previewable-only') && previewableLinksOnly;
156
+ var flaggedSubmitOnInputChange = fg('platform-linking-link-picker-previewable-only') && submitOnInputChange;
153
157
  var _useLinkPickerAnalyti = useLinkPickerAnalytics(),
154
158
  trackAttribute = _useLinkPickerAnalyti.trackAttribute,
155
159
  getAttributes = _useLinkPickerAnalyti.getAttributes;
@@ -240,6 +244,13 @@ export var LinkPicker = withLinkPickerAnalyticsContext( /*#__PURE__*/memo(functi
240
244
  handleInsert(_url, name, 'typeAhead', _objectSpread({}, selectedItem));
241
245
  }
242
246
  }, [handleInsert, trackAttribute, items, activePlugin, isSubmitting]);
247
+ var handleClearInvalidUrl = fg('platform-linking-link-picker-previewable-only') ?
248
+ // eslint-disable-next-line react-hooks/rules-of-hooks
249
+ useCallback(function () {
250
+ dispatch({
251
+ invalidUrl: false
252
+ });
253
+ }, [dispatch]) : function () {};
243
254
  var handleSubmit = useCallback( /*#__PURE__*/function () {
244
255
  var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(event) {
245
256
  var normalized, urlResponse, responseObject;
@@ -423,7 +434,13 @@ export var LinkPicker = withLinkPickerAnalyticsContext( /*#__PURE__*/memo(functi
423
434
  // Use onSubmitCapture instead of onSubmit so that any possible parent form isn't submitted
424
435
  onSubmitCapture: handleSubmit,
425
436
  className: ax(["_19bv164s _u5f31pah _ca0q1k79 _n3td1t3k _vchhusvi _1e0ctcjq"])
426
- }, /*#__PURE__*/React.createElement(TrackMount, null), isActivePlugin && /*#__PURE__*/React.createElement(Fragment, null, screenReaderText && /*#__PURE__*/React.createElement(Announcer, {
437
+ }, /*#__PURE__*/React.createElement(TrackMount, null), flaggedSubmitOnInputChange && /*#__PURE__*/React.createElement(AutoSubmitOnChange, {
438
+ url: url,
439
+ isSubmitting: isSubmitting,
440
+ isSelectedItem: isSelectedItem,
441
+ onSubmit: handleSubmit,
442
+ onClearInvalidUrl: handleClearInvalidUrl
443
+ }), isActivePlugin && /*#__PURE__*/React.createElement(Fragment, null, screenReaderText && /*#__PURE__*/React.createElement(Announcer, {
427
444
  ariaLive: "assertive",
428
445
  text: screenReaderText,
429
446
  ariaRelevant: "additions",
@@ -508,7 +525,7 @@ export var LinkPicker = withLinkPickerAnalyticsContext( /*#__PURE__*/memo(functi
508
525
  action: pluginAction,
509
526
  customSubmitButtonLabel: customSubmitButtonLabel,
510
527
  submitMessageId: submitMessageId,
511
- hideSubmitButton: moveSubmitButton,
528
+ hideSubmitButton: moveSubmitButton || flaggedSubmitOnInputChange,
512
529
  className: ax([(!queryState || !(plugins !== null && plugins !== void 0 && plugins.length)) && "_19pkpxbi"])
513
530
  }));
514
531
  }));
@@ -6,7 +6,6 @@ import { ax, ix } from "@compiled/react/runtime";
6
6
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
7
7
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
8
8
  import { Fragment } from 'react';
9
- import FeatureGates from '@atlaskit/feature-gate-js-client';
10
9
  import { Box } from '@atlaskit/primitives/compiled';
11
10
  import Spinner from '@atlaskit/spinner/spinner';
12
11
  import Tabs, { Tab, TabList } from '@atlaskit/tabs';
@@ -47,13 +46,6 @@ export var SearchResults = function SearchResults(_ref) {
47
46
  retry = _ref.retry,
48
47
  shouldRenderNoResultsImage = _ref.shouldRenderNoResultsImage;
49
48
  var isActivePlugin = !!activePlugin;
50
- // Experiment with new 3P tabs in link picker. For more info, please see: go/link-picker-3p-drive-one-pager.
51
- var linkPicker3pDriveExperimentCohort = FeatureGates.initializeCalled() ? FeatureGates.getExperimentValue('link_picker_3p_drive_experiment', 'cohort', 'control') : 'control';
52
- var googleDriveTabExperimentEnabled = linkPicker3pDriveExperimentCohort === 'show_google_drive_tab';
53
- var linkPicker3pOneDriveExperimentCohort = FeatureGates.initializeCalled() ? FeatureGates.getExperimentValue('link_picker_3p_onedrive_experiment', 'cohort', 'control') : 'control';
54
- var oneDriveTabExperimentEnabled = linkPicker3pOneDriveExperimentCohort === 'show_onedrive_tab';
55
- var thirdPartyTabExperimentEnabled = googleDriveTabExperimentEnabled || oneDriveTabExperimentEnabled;
56
- var showScrollingTabList = (featureFlags === null || featureFlags === void 0 ? void 0 : featureFlags.scrollingTabs) || thirdPartyTabExperimentEnabled;
57
49
  var tabList = /*#__PURE__*/React.createElement(TabList, null, tabs.map(function (tab) {
58
50
  return /*#__PURE__*/React.createElement(Tab, {
59
51
  key: tab.tabTitle,
@@ -77,7 +69,7 @@ export var SearchResults = function SearchResults(_ref) {
77
69
  testId: testIds.tabList,
78
70
  selected: activeTab,
79
71
  onChange: handleTabChange
80
- }, showScrollingTabList ? /*#__PURE__*/React.createElement(ScrollingTabList, null, tabList) : tabList), /*#__PURE__*/React.createElement(TrackTabViewed, {
72
+ }, featureFlags !== null && featureFlags !== void 0 && featureFlags.scrollingTabs ? /*#__PURE__*/React.createElement(ScrollingTabList, null, tabList) : tabList), /*#__PURE__*/React.createElement(TrackTabViewed, {
81
73
  activePlugin: activePlugin
82
74
  })), !error && /*#__PURE__*/React.createElement(LinkSearchList, {
83
75
  id: linkSearchListId,
@@ -16,7 +16,7 @@ export var testIds = {
16
16
  };
17
17
  export var PACKAGE_DATA = {
18
18
  packageName: "@atlaskit/link-picker" || '',
19
- packageVersion: "3.12.1" || '',
19
+ packageVersion: "0.0.0-development" || '',
20
20
  componentName: COMPONENT_NAME,
21
21
  source: COMPONENT_NAME
22
22
  };
@@ -171,6 +171,8 @@ export interface LinkPickerProps {
171
171
  previewableLinksOnly?: boolean;
172
172
  /**This prop passes one additional error that is secondary to component errors */
173
173
  additionalError?: React.ReactNode;
174
+ /**This prop disables submit button and handles submit on input change */
175
+ submitOnInputChange?: boolean;
174
176
  /** Showing dynamic list size based on window height */
175
177
  recentSearchListSize?: number;
176
178
  /** Controls showing the image in the no results state */
@@ -0,0 +1,9 @@
1
+ interface AutoSubmitOnChangeProps {
2
+ url: string;
3
+ isSubmitting: boolean;
4
+ isSelectedItem: boolean;
5
+ onSubmit: () => void;
6
+ onClearInvalidUrl: () => void;
7
+ }
8
+ declare const AutoSubmitOnChange: ({ url, isSubmitting, isSelectedItem, onSubmit, onClearInvalidUrl, }: AutoSubmitOnChangeProps) => null;
9
+ export default AutoSubmitOnChange;
@@ -174,6 +174,8 @@ export interface LinkPickerProps {
174
174
  previewableLinksOnly?: boolean;
175
175
  /**This prop passes one additional error that is secondary to component errors */
176
176
  additionalError?: React.ReactNode;
177
+ /**This prop disables submit button and handles submit on input change */
178
+ submitOnInputChange?: boolean;
177
179
  /** Showing dynamic list size based on window height */
178
180
  recentSearchListSize?: number;
179
181
  /** Controls showing the image in the no results state */
@@ -0,0 +1,9 @@
1
+ interface AutoSubmitOnChangeProps {
2
+ url: string;
3
+ isSubmitting: boolean;
4
+ isSelectedItem: boolean;
5
+ onSubmit: () => void;
6
+ onClearInvalidUrl: () => void;
7
+ }
8
+ declare const AutoSubmitOnChange: ({ url, isSubmitting, isSelectedItem, onSubmit, onClearInvalidUrl, }: AutoSubmitOnChangeProps) => null;
9
+ export default AutoSubmitOnChange;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/link-picker",
3
- "version": "3.13.0",
3
+ "version": "3.15.0",
4
4
  "description": "Standalone link picker",
5
5
  "author": "Atlassian Pty Ltd",
6
6
  "publishConfig": {
@@ -61,7 +61,7 @@
61
61
  "@atlaskit/form": "^14.2.0",
62
62
  "@atlaskit/frontend-utilities": "^3.2.0",
63
63
  "@atlaskit/heading": "^5.2.0",
64
- "@atlaskit/icon": "^28.4.0",
64
+ "@atlaskit/icon": "^28.5.0",
65
65
  "@atlaskit/intl-messages-provider": "^2.0.0",
66
66
  "@atlaskit/link": "^3.2.0",
67
67
  "@atlaskit/link-provider": "^4.0.0",
@@ -69,7 +69,7 @@
69
69
  "@atlaskit/onboarding": "^14.4.0",
70
70
  "@atlaskit/platform-feature-flags": "^1.1.0",
71
71
  "@atlaskit/primitives": "^14.15.0",
72
- "@atlaskit/smart-card": "^43.0.0",
72
+ "@atlaskit/smart-card": "^43.1.0",
73
73
  "@atlaskit/spinner": "^19.0.0",
74
74
  "@atlaskit/tabs": "^18.2.0",
75
75
  "@atlaskit/textfield": "^8.0.0",