@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 +16 -0
- package/dist/cjs/ui/link-picker/autoSubmitOnChange.js +44 -0
- package/dist/cjs/ui/link-picker/index.js +19 -2
- package/dist/cjs/ui/link-picker/search-results/index.js +1 -9
- package/dist/cjs/ui/main.js +1 -1
- package/dist/es2019/ui/link-picker/autoSubmitOnChange.js +35 -0
- package/dist/es2019/ui/link-picker/index.js +18 -2
- package/dist/es2019/ui/link-picker/search-results/index.js +1 -9
- package/dist/es2019/ui/main.js +1 -1
- package/dist/esm/ui/link-picker/autoSubmitOnChange.js +37 -0
- package/dist/esm/ui/link-picker/index.js +19 -2
- package/dist/esm/ui/link-picker/search-results/index.js +1 -9
- package/dist/esm/ui/main.js +1 -1
- package/dist/types/common/types.d.ts +2 -0
- package/dist/types/ui/link-picker/autoSubmitOnChange.d.ts +9 -0
- package/dist/types-ts4.5/common/types.d.ts +2 -0
- package/dist/types-ts4.5/ui/link-picker/autoSubmitOnChange.d.ts +9 -0
- package/package.json +3 -3
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),
|
|
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
|
-
},
|
|
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,
|
package/dist/cjs/ui/main.js
CHANGED
|
@@ -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: "
|
|
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),
|
|
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
|
-
},
|
|
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,
|
package/dist/es2019/ui/main.js
CHANGED
|
@@ -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),
|
|
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
|
-
},
|
|
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,
|
package/dist/esm/ui/main.js
CHANGED
|
@@ -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.
|
|
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.
|
|
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.
|
|
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",
|