@atlaskit/link-create 0.9.1 → 1.0.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 +12 -0
- package/analytics.spec.yaml +9 -0
- package/dist/cjs/common/utils/analytics/analytics.codegen.js +1 -1
- package/dist/cjs/controllers/callback-context/main.js +22 -3
- package/dist/cjs/controllers/create-field/index.js +12 -0
- package/dist/cjs/controllers/create-field/main.js +62 -0
- package/dist/cjs/index.js +12 -0
- package/dist/cjs/ui/create-form/async-select/main.js +117 -35
- package/dist/cjs/ui/create-form/form-footer/main.js +9 -2
- package/dist/cjs/ui/create-form/form-spy/index.js +27 -0
- package/dist/cjs/ui/create-form/index.js +15 -1
- package/dist/cjs/ui/create-form/main.js +20 -10
- package/dist/cjs/ui/create-form/select/index.js +12 -0
- package/dist/cjs/ui/create-form/select/main.js +50 -0
- package/dist/cjs/ui/create-form/select/types.js +5 -0
- package/dist/cjs/ui/create-form/textfield/main.js +26 -48
- package/dist/cjs/ui/index.js +15 -1
- package/dist/cjs/ui/link-create/main.js +3 -3
- package/dist/cjs/version.json +1 -1
- package/dist/es2019/common/utils/analytics/analytics.codegen.js +1 -1
- package/dist/es2019/controllers/callback-context/main.js +6 -1
- package/dist/es2019/controllers/create-field/index.js +1 -0
- package/dist/es2019/controllers/create-field/main.js +57 -0
- package/dist/es2019/index.js +1 -1
- package/dist/es2019/ui/create-form/async-select/main.js +75 -34
- package/dist/es2019/ui/create-form/form-footer/main.js +9 -2
- package/dist/es2019/ui/create-form/form-spy/index.js +18 -0
- package/dist/es2019/ui/create-form/index.js +3 -1
- package/dist/es2019/ui/create-form/main.js +25 -16
- package/dist/es2019/ui/create-form/select/index.js +1 -0
- package/dist/es2019/ui/create-form/select/main.js +40 -0
- package/dist/es2019/ui/create-form/textfield/main.js +24 -48
- package/dist/es2019/ui/index.js +3 -1
- package/dist/es2019/ui/link-create/main.js +3 -3
- package/dist/es2019/version.json +1 -1
- package/dist/esm/common/utils/analytics/analytics.codegen.js +1 -1
- package/dist/esm/controllers/callback-context/main.js +22 -3
- package/dist/esm/controllers/create-field/index.js +1 -0
- package/dist/esm/controllers/create-field/main.js +56 -0
- package/dist/esm/controllers/create-field/types.js +1 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/ui/create-form/async-select/main.js +118 -36
- package/dist/esm/ui/create-form/form-footer/main.js +9 -2
- package/dist/esm/ui/create-form/form-spy/index.js +19 -0
- package/dist/esm/ui/create-form/index.js +3 -1
- package/dist/esm/ui/create-form/main.js +19 -8
- package/dist/esm/ui/create-form/select/index.js +1 -0
- package/dist/esm/ui/create-form/select/main.js +42 -0
- package/dist/esm/ui/create-form/select/types.js +1 -0
- package/dist/esm/ui/create-form/textfield/main.js +25 -47
- package/dist/esm/ui/index.js +3 -1
- package/dist/esm/ui/link-create/main.js +3 -3
- package/dist/esm/version.json +1 -1
- package/dist/types/common/utils/analytics/analytics.codegen.d.ts +5 -1
- package/dist/types/common/utils/form/index.d.ts +2 -2
- package/dist/types/controllers/callback-context/main.d.ts +1 -1
- package/dist/types/controllers/create-field/index.d.ts +1 -0
- package/dist/types/controllers/create-field/main.d.ts +3 -0
- package/dist/types/controllers/create-field/types.d.ts +24 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/ui/create-form/async-select/main.d.ts +5 -5
- package/dist/types/ui/create-form/async-select/types.d.ts +9 -4
- package/dist/types/ui/create-form/form-spy/index.d.ts +12 -0
- package/dist/types/ui/create-form/index.d.ts +2 -0
- package/dist/types/ui/create-form/main.d.ts +2 -1
- package/dist/types/ui/create-form/select/index.d.ts +1 -0
- package/dist/types/ui/create-form/select/main.d.ts +12 -0
- package/dist/types/ui/create-form/select/types.d.ts +18 -0
- package/dist/types/ui/create-form/textfield/main.d.ts +2 -1
- package/dist/types/ui/index.d.ts +2 -0
- package/dist/types-ts4.5/common/utils/analytics/analytics.codegen.d.ts +5 -1
- package/dist/types-ts4.5/common/utils/form/index.d.ts +2 -2
- package/dist/types-ts4.5/controllers/callback-context/main.d.ts +1 -1
- package/dist/types-ts4.5/controllers/create-field/index.d.ts +1 -0
- package/dist/types-ts4.5/controllers/create-field/main.d.ts +3 -0
- package/dist/types-ts4.5/controllers/create-field/types.d.ts +24 -0
- package/dist/types-ts4.5/index.d.ts +1 -1
- package/dist/types-ts4.5/ui/create-form/async-select/main.d.ts +5 -5
- package/dist/types-ts4.5/ui/create-form/async-select/types.d.ts +9 -4
- package/dist/types-ts4.5/ui/create-form/form-spy/index.d.ts +12 -0
- package/dist/types-ts4.5/ui/create-form/index.d.ts +2 -0
- package/dist/types-ts4.5/ui/create-form/main.d.ts +2 -1
- package/dist/types-ts4.5/ui/create-form/select/index.d.ts +1 -0
- package/dist/types-ts4.5/ui/create-form/select/main.d.ts +12 -0
- package/dist/types-ts4.5/ui/create-form/select/types.d.ts +18 -0
- package/dist/types-ts4.5/ui/create-form/textfield/main.d.ts +2 -1
- package/dist/types-ts4.5/ui/index.d.ts +2 -0
- package/example-helpers/mock-plugin-form.tsx +3 -4
- package/package.json +6 -3
- package/report.api.md +55 -12
- package/tmp/api-report-tmp.d.ts +164 -0
- package/dist/cjs/ui/group-selection/index.js +0 -22
- package/dist/es2019/ui/group-selection/index.js +0 -16
- package/dist/esm/ui/group-selection/index.js +0 -15
- package/dist/types/ui/group-selection/index.d.ts +0 -4
- package/dist/types/ui/group-selection/types.d.ts +0 -12
- package/dist/types-ts4.5/ui/group-selection/index.d.ts +0 -4
- package/dist/types-ts4.5/ui/group-selection/types.d.ts +0 -12
- /package/dist/cjs/{ui/group-selection → controllers/create-field}/types.js +0 -0
- /package/dist/es2019/{ui/group-selection → controllers/create-field}/types.js +0 -0
- /package/dist/{esm/ui/group-selection → es2019/ui/create-form/select}/types.js +0 -0
|
@@ -8,13 +8,11 @@ exports.TEST_ID = void 0;
|
|
|
8
8
|
exports.TextField = TextField;
|
|
9
9
|
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
10
10
|
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
|
|
11
|
-
var _react = require("react");
|
|
12
|
-
var _react2 = require("@emotion/react");
|
|
13
|
-
var _form = require("@atlaskit/form");
|
|
11
|
+
var _react = require("@emotion/react");
|
|
14
12
|
var _textfield = _interopRequireDefault(require("@atlaskit/textfield"));
|
|
15
|
-
var
|
|
16
|
-
var
|
|
17
|
-
|
|
13
|
+
var _createField = require("../../../controllers/create-field");
|
|
14
|
+
var _excluded = ["id", "name", "label", "isRequired", "validators", "validationHelpText", "testId"],
|
|
15
|
+
_excluded2 = ["fieldId"];
|
|
18
16
|
/** @jsx jsx */
|
|
19
17
|
var TEST_ID = 'link-create-text-field';
|
|
20
18
|
|
|
@@ -26,50 +24,30 @@ var TEST_ID = 'link-create-text-field';
|
|
|
26
24
|
*/
|
|
27
25
|
exports.TEST_ID = TEST_ID;
|
|
28
26
|
function TextField(_ref) {
|
|
29
|
-
var
|
|
27
|
+
var id = _ref.id,
|
|
30
28
|
name = _ref.name,
|
|
29
|
+
label = _ref.label,
|
|
30
|
+
isRequired = _ref.isRequired,
|
|
31
|
+
validators = _ref.validators,
|
|
32
|
+
validationHelpText = _ref.validationHelpText,
|
|
31
33
|
_ref$testId = _ref.testId,
|
|
32
34
|
testId = _ref$testId === void 0 ? TEST_ID : _ref$testId,
|
|
33
|
-
validationHelpText = _ref.validationHelpText,
|
|
34
|
-
validators = _ref.validators,
|
|
35
|
-
defaultValue = _ref.defaultValue,
|
|
36
|
-
isRequired = _ref.isRequired,
|
|
37
35
|
restProps = (0, _objectWithoutProperties2.default)(_ref, _excluded);
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
name: name,
|
|
56
|
-
label: label,
|
|
57
|
-
isRequired: isRequired,
|
|
58
|
-
defaultValue: defaultValue !== null && defaultValue !== void 0 ? defaultValue : ''
|
|
59
|
-
}, function (_ref2) {
|
|
60
|
-
var fieldProps = _ref2.fieldProps,
|
|
61
|
-
meta = _ref2.meta,
|
|
62
|
-
error = _ref2.error;
|
|
63
|
-
var isInvalid = (0, _form2.validateSubmitErrors)(meta);
|
|
64
|
-
return (0, _react2.jsx)(_react.Fragment, null, (0, _react2.jsx)(_textfield.default, (0, _extends2.default)({}, fieldProps, restProps, {
|
|
65
|
-
testId: testId,
|
|
66
|
-
isInvalid: isInvalid,
|
|
67
|
-
isRequired: false // Remove the default browser validation
|
|
68
|
-
})), !error && validationHelpText && (0, _react2.jsx)(_form.HelperMessage, {
|
|
69
|
-
testId: "".concat(testId, "-helper-message")
|
|
70
|
-
}, validationHelpText), error && isInvalid && (0, _react2.jsx)(_form.ErrorMessage, {
|
|
71
|
-
testId: "".concat(testId, "-error-message")
|
|
72
|
-
}, error));
|
|
73
|
-
})
|
|
74
|
-
);
|
|
36
|
+
return (0, _react.jsx)(_createField.CreateField, {
|
|
37
|
+
id: id,
|
|
38
|
+
name: name,
|
|
39
|
+
label: label,
|
|
40
|
+
isRequired: isRequired,
|
|
41
|
+
validators: validators,
|
|
42
|
+
validationHelpText: validationHelpText,
|
|
43
|
+
testId: testId
|
|
44
|
+
}, function (_ref2) {
|
|
45
|
+
var fieldId = _ref2.fieldId,
|
|
46
|
+
fieldProps = (0, _objectWithoutProperties2.default)(_ref2, _excluded2);
|
|
47
|
+
return (0, _react.jsx)(_textfield.default, (0, _extends2.default)({
|
|
48
|
+
id: fieldId
|
|
49
|
+
}, fieldProps, restProps, {
|
|
50
|
+
isRequired: false // Remove the default browser validation
|
|
51
|
+
}));
|
|
52
|
+
});
|
|
75
53
|
}
|
package/dist/cjs/ui/index.js
CHANGED
|
@@ -22,6 +22,18 @@ Object.defineProperty(exports, "CreateFormLoader", {
|
|
|
22
22
|
return _formLoader.CreateFormLoader;
|
|
23
23
|
}
|
|
24
24
|
});
|
|
25
|
+
Object.defineProperty(exports, "FormSpy", {
|
|
26
|
+
enumerable: true,
|
|
27
|
+
get: function get() {
|
|
28
|
+
return _formSpy.FormSpy;
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
Object.defineProperty(exports, "Select", {
|
|
32
|
+
enumerable: true,
|
|
33
|
+
get: function get() {
|
|
34
|
+
return _select.Select;
|
|
35
|
+
}
|
|
36
|
+
});
|
|
25
37
|
Object.defineProperty(exports, "TextField", {
|
|
26
38
|
enumerable: true,
|
|
27
39
|
get: function get() {
|
|
@@ -38,4 +50,6 @@ var _main = _interopRequireDefault(require("./main"));
|
|
|
38
50
|
var _textfield = require("./create-form/textfield");
|
|
39
51
|
var _main2 = require("./create-form/main");
|
|
40
52
|
var _formLoader = require("./create-form/form-loader");
|
|
41
|
-
var
|
|
53
|
+
var _select = require("./create-form/select");
|
|
54
|
+
var _asyncSelect = require("./create-form/async-select");
|
|
55
|
+
var _formSpy = require("./create-form/form-spy");
|
|
@@ -69,10 +69,10 @@ var LinkCreate = (0, _formContext.withLinkCreateFormContext)(function (_ref2) {
|
|
|
69
69
|
return _ref3.apply(this, arguments);
|
|
70
70
|
};
|
|
71
71
|
}(), [onCreate, setFormErrorMessage]);
|
|
72
|
-
var handleFailure = (0, _react.useCallback)(function (
|
|
72
|
+
var handleFailure = (0, _react.useCallback)(function (error) {
|
|
73
73
|
// Set the form error message
|
|
74
|
-
setFormErrorMessage(
|
|
75
|
-
onFailure && onFailure(
|
|
74
|
+
setFormErrorMessage(error.message);
|
|
75
|
+
onFailure && onFailure(error);
|
|
76
76
|
}, [onFailure, setFormErrorMessage]);
|
|
77
77
|
return (0, _react2.jsx)("div", {
|
|
78
78
|
"data-testid": testId
|
package/dist/cjs/version.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Generates Typescript types for analytics events from analytics.spec.yaml
|
|
5
5
|
*
|
|
6
|
-
* @codegen <<SignedSource::
|
|
6
|
+
* @codegen <<SignedSource::50073590468fe2604f65d3e0b23d517b>>
|
|
7
7
|
* @codegenCommand yarn workspace @atlaskit/link-create run codegen-analytics
|
|
8
8
|
*/
|
|
9
9
|
|
|
@@ -26,7 +26,12 @@ const LinkCreateCallbackProvider = ({
|
|
|
26
26
|
await onCreate(result);
|
|
27
27
|
}
|
|
28
28
|
},
|
|
29
|
-
onFailure
|
|
29
|
+
onFailure: async error => {
|
|
30
|
+
createAnalyticsEvent(createEventPayload('track.object.createFailed.linkCreate', {
|
|
31
|
+
failureType: error.name
|
|
32
|
+
})).fire(ANALYTICS_CHANNEL);
|
|
33
|
+
onFailure && onFailure(error);
|
|
34
|
+
},
|
|
30
35
|
onCancel
|
|
31
36
|
}), [onFailure, onCancel, createAnalyticsEvent, onCreate]);
|
|
32
37
|
return /*#__PURE__*/React.createElement(LinkCreateCallbackContext.Provider, {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { CreateField } from './main';
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/** @jsx jsx */
|
|
2
|
+
import { Fragment, useEffect, useMemo } from 'react';
|
|
3
|
+
import { css, jsx } from '@emotion/react';
|
|
4
|
+
import { Field } from 'react-final-form';
|
|
5
|
+
import { ErrorMessage, HelperMessage, Label, RequiredAsterisk } from '@atlaskit/form';
|
|
6
|
+
import { validateSubmitErrors } from '../../common/utils/form';
|
|
7
|
+
import { useFormContext } from '../form-context';
|
|
8
|
+
const fieldWrapperStyles = css({
|
|
9
|
+
marginTop: "var(--ds-space-100, 8px)"
|
|
10
|
+
});
|
|
11
|
+
export function CreateField({
|
|
12
|
+
id,
|
|
13
|
+
name,
|
|
14
|
+
label,
|
|
15
|
+
isRequired,
|
|
16
|
+
validators,
|
|
17
|
+
validationHelpText,
|
|
18
|
+
testId,
|
|
19
|
+
children
|
|
20
|
+
}) {
|
|
21
|
+
const {
|
|
22
|
+
assignValidator
|
|
23
|
+
} = useFormContext();
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
if (validators) {
|
|
26
|
+
assignValidator(name, validators);
|
|
27
|
+
}
|
|
28
|
+
}, [name, validators, assignValidator]);
|
|
29
|
+
const fieldId = useMemo(() => id ? id : `link-create-field-${name}`, [id, name]);
|
|
30
|
+
return jsx("div", {
|
|
31
|
+
css: fieldWrapperStyles,
|
|
32
|
+
"data-testid": testId
|
|
33
|
+
}, jsx(Field, {
|
|
34
|
+
name: name
|
|
35
|
+
}, ({
|
|
36
|
+
input,
|
|
37
|
+
meta
|
|
38
|
+
}) => {
|
|
39
|
+
const isInvalid = validateSubmitErrors(meta);
|
|
40
|
+
const {
|
|
41
|
+
submitError
|
|
42
|
+
} = meta;
|
|
43
|
+
return jsx(Fragment, null, label && jsx(Label, {
|
|
44
|
+
htmlFor: fieldId,
|
|
45
|
+
id: `${fieldId}-label`,
|
|
46
|
+
testId: `${testId}-label`
|
|
47
|
+
}, label, isRequired && jsx(RequiredAsterisk, null)), children({
|
|
48
|
+
...input,
|
|
49
|
+
fieldId,
|
|
50
|
+
isInvalid
|
|
51
|
+
}), !submitError && validationHelpText && jsx(HelperMessage, {
|
|
52
|
+
testId: `${testId}-helper-message`
|
|
53
|
+
}, validationHelpText), submitError && isInvalid && jsx(ErrorMessage, {
|
|
54
|
+
testId: `${testId}-error-message`
|
|
55
|
+
}, submitError));
|
|
56
|
+
}));
|
|
57
|
+
}
|
package/dist/es2019/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { default, TextField, CreateForm, AsyncSelect, CreateFormLoader } from './ui/index';
|
|
1
|
+
export { default, TextField, CreateForm, Select, AsyncSelect, CreateFormLoader, FormSpy } from './ui/index';
|
|
2
2
|
export { useLinkCreateCallback, LinkCreateCallbackProvider } from './controllers/callback-context';
|
|
@@ -1,55 +1,96 @@
|
|
|
1
1
|
import _extends from "@babel/runtime/helpers/extends";
|
|
2
2
|
/** @jsx jsx */
|
|
3
|
-
import {
|
|
3
|
+
import { useEffect, useMemo, useState } from 'react';
|
|
4
4
|
import { jsx } from '@emotion/react';
|
|
5
|
-
import
|
|
5
|
+
import debounce from 'debounce-promise';
|
|
6
|
+
import { useForm } from 'react-final-form';
|
|
6
7
|
import { AsyncSelect as AkAsyncSelect } from '@atlaskit/select';
|
|
7
|
-
import {
|
|
8
|
-
import { useFormContext } from '../../../controllers/form-context';
|
|
8
|
+
import { CreateField } from '../../../controllers/create-field';
|
|
9
9
|
export const TEST_ID = 'link-create-async-select';
|
|
10
|
+
|
|
10
11
|
/**
|
|
11
|
-
* An async select utilising the Atlaskit AsyncSelect and Field
|
|
12
|
-
* Validation is handled by the form
|
|
13
|
-
* the handleSubmit function passed to the form <Form> that
|
|
14
|
-
* of this
|
|
12
|
+
* An async select utilising the Atlaskit AsyncSelect and Field components from
|
|
13
|
+
* `@atlaskit/form`. Validation is handled by the form on form submission. Any
|
|
14
|
+
* errors returned by the handleSubmit function passed to the form <Form> that
|
|
15
|
+
* have a key matching the `name` of this field are shown below the field.
|
|
15
16
|
*/
|
|
16
17
|
export function AsyncSelect({
|
|
17
|
-
|
|
18
|
+
id,
|
|
18
19
|
name,
|
|
19
|
-
|
|
20
|
+
label,
|
|
20
21
|
isRequired,
|
|
21
|
-
testId = TEST_ID,
|
|
22
22
|
validators,
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
validationHelpText,
|
|
24
|
+
testId = TEST_ID,
|
|
25
|
+
defaultOption: propsDefaultValue,
|
|
26
|
+
loadOptions,
|
|
27
|
+
...restProps
|
|
25
28
|
}) {
|
|
26
29
|
const {
|
|
27
|
-
|
|
28
|
-
} =
|
|
30
|
+
mutators
|
|
31
|
+
} = useForm();
|
|
32
|
+
const [defaultValue, setDefaultValue] = useState(propsDefaultValue);
|
|
33
|
+
const [isLoadingDefaultOptions, setIsLoadingDefaultOptions] = useState(false);
|
|
34
|
+
const [defaultOptions, setDefaultOptions] = useState([]);
|
|
35
|
+
useEffect(() => {
|
|
36
|
+
let current = true;
|
|
37
|
+
const fetch = async (query = '') => {
|
|
38
|
+
if (!loadOptions) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
/**
|
|
43
|
+
* If we are fetching default options, clear the
|
|
44
|
+
* value the user has set
|
|
45
|
+
*/
|
|
46
|
+
mutators.setField(name, null);
|
|
47
|
+
setIsLoadingDefaultOptions(true);
|
|
48
|
+
setDefaultOptions([]);
|
|
49
|
+
const options = await loadOptions(query);
|
|
50
|
+
if (current) {
|
|
51
|
+
setDefaultOptions(options);
|
|
52
|
+
setIsLoadingDefaultOptions(false);
|
|
53
|
+
}
|
|
54
|
+
} catch (err) {
|
|
55
|
+
if (current) {
|
|
56
|
+
setIsLoadingDefaultOptions(false);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
fetch();
|
|
61
|
+
return () => {
|
|
62
|
+
current = false;
|
|
63
|
+
};
|
|
64
|
+
}, [loadOptions, setIsLoadingDefaultOptions, setDefaultOptions, mutators, name]);
|
|
29
65
|
useEffect(() => {
|
|
30
|
-
|
|
31
|
-
|
|
66
|
+
/**
|
|
67
|
+
* Mutate the form state to set a default value for this field
|
|
68
|
+
* if `defaultOption` is a prop and we have not set a value for it yet
|
|
69
|
+
*/
|
|
70
|
+
if (!defaultValue && propsDefaultValue) {
|
|
71
|
+
setDefaultValue(propsDefaultValue);
|
|
72
|
+
mutators.setField(name, propsDefaultValue);
|
|
32
73
|
}
|
|
33
|
-
}, [
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
74
|
+
}, [defaultValue, propsDefaultValue, name, mutators]);
|
|
75
|
+
const debouncedLoadOptions = useMemo(() => loadOptions ? debounce(loadOptions, 300) : undefined, [loadOptions]);
|
|
76
|
+
return jsx(CreateField, {
|
|
77
|
+
id: id,
|
|
37
78
|
name: name,
|
|
38
79
|
label: label,
|
|
39
80
|
isRequired: isRequired,
|
|
40
|
-
|
|
81
|
+
validators: validators,
|
|
82
|
+
validationHelpText: validationHelpText,
|
|
83
|
+
testId: testId
|
|
41
84
|
}, ({
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
error
|
|
85
|
+
fieldId,
|
|
86
|
+
...fieldProps
|
|
45
87
|
}) => {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
}));
|
|
88
|
+
return jsx(AkAsyncSelect, _extends({
|
|
89
|
+
inputId: fieldId
|
|
90
|
+
}, fieldProps, restProps, {
|
|
91
|
+
loadOptions: debouncedLoadOptions,
|
|
92
|
+
defaultOptions: defaultOptions,
|
|
93
|
+
isLoading: isLoadingDefaultOptions
|
|
94
|
+
}));
|
|
95
|
+
});
|
|
55
96
|
}
|
|
@@ -3,9 +3,13 @@ import { css, jsx } from '@emotion/react';
|
|
|
3
3
|
import { useIntl } from 'react-intl-next';
|
|
4
4
|
import Button, { ButtonGroup } from '@atlaskit/button';
|
|
5
5
|
import LoadingButton from '@atlaskit/button/loading-button';
|
|
6
|
-
import { FormFooter } from '@atlaskit/form';
|
|
7
6
|
import ErrorIcon from '@atlaskit/icon/glyph/error';
|
|
8
7
|
import { messages } from './messages';
|
|
8
|
+
const formFooterWrapperStyles = css({
|
|
9
|
+
display: 'flex',
|
|
10
|
+
marginTop: "var(--ds-space-300, 24px)",
|
|
11
|
+
justifyContent: 'flex-end'
|
|
12
|
+
});
|
|
9
13
|
const errorStyles = css({
|
|
10
14
|
display: 'flex',
|
|
11
15
|
alignItems: 'center',
|
|
@@ -18,7 +22,10 @@ export function CreateFormFooter({
|
|
|
18
22
|
testId
|
|
19
23
|
}) {
|
|
20
24
|
const intl = useIntl();
|
|
21
|
-
return jsx(
|
|
25
|
+
return jsx("footer", {
|
|
26
|
+
"data-testid": `${testId}-footer`,
|
|
27
|
+
css: formFooterWrapperStyles
|
|
28
|
+
}, formErrorMessage && jsx("div", {
|
|
22
29
|
css: errorStyles,
|
|
23
30
|
"data-testid": `${testId}-error`
|
|
24
31
|
}, jsx(ErrorIcon, {
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { FormSpy as FinalFormSpy } from 'react-final-form';
|
|
3
|
+
/**
|
|
4
|
+
* Lightweight wrapper around the react-final-form
|
|
5
|
+
* FormSpy component so that we can control selectively
|
|
6
|
+
* how much of the API we are commited to.
|
|
7
|
+
*/
|
|
8
|
+
export const FormSpy = ({
|
|
9
|
+
children
|
|
10
|
+
}) => {
|
|
11
|
+
return /*#__PURE__*/React.createElement(FinalFormSpy, {
|
|
12
|
+
subscription: {
|
|
13
|
+
values: true
|
|
14
|
+
}
|
|
15
|
+
}, props => children({
|
|
16
|
+
values: props.values
|
|
17
|
+
}));
|
|
18
|
+
};
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
export { CreateForm } from './main';
|
|
2
|
+
export { Select } from './select';
|
|
2
3
|
export { AsyncSelect } from './async-select';
|
|
3
4
|
export { CreateFormLoader } from './form-loader';
|
|
4
|
-
export { TextField } from './textfield';
|
|
5
|
+
export { TextField } from './textfield';
|
|
6
|
+
export { FormSpy } from './form-spy';
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import _extends from "@babel/runtime/helpers/extends";
|
|
2
1
|
/** @jsx jsx */
|
|
3
2
|
import { useCallback } from 'react';
|
|
4
3
|
import { css, jsx } from '@emotion/react';
|
|
4
|
+
import { Form } from 'react-final-form';
|
|
5
5
|
import { useAnalyticsEvents } from '@atlaskit/analytics-next';
|
|
6
|
-
import Form from '@atlaskit/form';
|
|
7
6
|
import { ANALYTICS_CHANNEL, CREATE_FORM_MAX_WIDTH_IN_PX } from '../../common/constants';
|
|
8
7
|
import createEventPayload from '../../common/utils/analytics/analytics.codegen';
|
|
9
8
|
import { useFormContext } from '../../controllers/form-context';
|
|
@@ -22,7 +21,8 @@ export const CreateForm = ({
|
|
|
22
21
|
onSubmit,
|
|
23
22
|
onCancel,
|
|
24
23
|
isLoading,
|
|
25
|
-
hideFooter
|
|
24
|
+
hideFooter,
|
|
25
|
+
initialValues
|
|
26
26
|
}) => {
|
|
27
27
|
const {
|
|
28
28
|
createAnalyticsEvent
|
|
@@ -51,18 +51,27 @@ export const CreateForm = ({
|
|
|
51
51
|
return jsx(CreateFormLoader, null);
|
|
52
52
|
}
|
|
53
53
|
return jsx(Form, {
|
|
54
|
-
onSubmit: handleSubmit
|
|
54
|
+
onSubmit: handleSubmit,
|
|
55
|
+
initialValues: initialValues,
|
|
56
|
+
mutators: {
|
|
57
|
+
setField: (args, state, tools) => {
|
|
58
|
+
tools.changeValue(state, args[0], () => args[1]);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
55
61
|
}, ({
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
}) =>
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
62
|
+
submitting,
|
|
63
|
+
...formProps
|
|
64
|
+
}) => {
|
|
65
|
+
return jsx("form", {
|
|
66
|
+
onSubmit: formProps.handleSubmit,
|
|
67
|
+
name: "link-create-form",
|
|
68
|
+
"data-testid": testId,
|
|
69
|
+
css: formStyles
|
|
70
|
+
}, jsx("div", null, children), !hideFooter && jsx(CreateFormFooter, {
|
|
71
|
+
formErrorMessage: formErrorMessage,
|
|
72
|
+
handleCancel: handleCancel,
|
|
73
|
+
submitting: submitting,
|
|
74
|
+
testId: testId
|
|
75
|
+
}));
|
|
76
|
+
});
|
|
68
77
|
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Select } from './main';
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import _extends from "@babel/runtime/helpers/extends";
|
|
2
|
+
/** @jsx jsx */
|
|
3
|
+
|
|
4
|
+
import { jsx } from '@emotion/react';
|
|
5
|
+
import AkSelect from '@atlaskit/select';
|
|
6
|
+
import { CreateField } from '../../../controllers/create-field';
|
|
7
|
+
export const TEST_ID = 'link-create-select';
|
|
8
|
+
/**
|
|
9
|
+
* A select utilising the Atlaskit Select and Field components from
|
|
10
|
+
* `@atlaskit/form`. Validation is handled by the form on form submission. Any
|
|
11
|
+
* errors returned by the handleSubmit function passed to the form <Form> that
|
|
12
|
+
* have a key matching the `name` of this field are shown below the field.
|
|
13
|
+
*/
|
|
14
|
+
export function Select({
|
|
15
|
+
id,
|
|
16
|
+
name,
|
|
17
|
+
label,
|
|
18
|
+
isRequired,
|
|
19
|
+
validators,
|
|
20
|
+
validationHelpText,
|
|
21
|
+
testId = TEST_ID,
|
|
22
|
+
...restProps
|
|
23
|
+
}) {
|
|
24
|
+
return jsx(CreateField, {
|
|
25
|
+
id: id,
|
|
26
|
+
name: name,
|
|
27
|
+
label: label,
|
|
28
|
+
isRequired: isRequired,
|
|
29
|
+
validators: validators,
|
|
30
|
+
validationHelpText: validationHelpText,
|
|
31
|
+
testId: testId
|
|
32
|
+
}, ({
|
|
33
|
+
fieldId,
|
|
34
|
+
...fieldProps
|
|
35
|
+
}) => {
|
|
36
|
+
return jsx(AkSelect, _extends({
|
|
37
|
+
inputId: fieldId
|
|
38
|
+
}, fieldProps, restProps));
|
|
39
|
+
});
|
|
40
|
+
}
|
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
import _extends from "@babel/runtime/helpers/extends";
|
|
2
2
|
/** @jsx jsx */
|
|
3
|
-
import { Fragment, useEffect } from 'react';
|
|
4
3
|
import { jsx } from '@emotion/react';
|
|
5
|
-
import { ErrorMessage, Field, HelperMessage } from '@atlaskit/form';
|
|
6
4
|
import AkTextfield from '@atlaskit/textfield';
|
|
7
|
-
import {
|
|
8
|
-
import { useFormContext } from '../../../controllers/form-context';
|
|
5
|
+
import { CreateField } from '../../../controllers/create-field';
|
|
9
6
|
export const TEST_ID = 'link-create-text-field';
|
|
10
7
|
|
|
11
8
|
/**
|
|
@@ -16,52 +13,31 @@ export const TEST_ID = 'link-create-text-field';
|
|
|
16
13
|
*/
|
|
17
14
|
|
|
18
15
|
export function TextField({
|
|
19
|
-
|
|
16
|
+
id,
|
|
20
17
|
name,
|
|
21
|
-
|
|
22
|
-
validationHelpText,
|
|
23
|
-
validators,
|
|
24
|
-
defaultValue,
|
|
18
|
+
label,
|
|
25
19
|
isRequired,
|
|
20
|
+
validators,
|
|
21
|
+
validationHelpText,
|
|
22
|
+
testId = TEST_ID,
|
|
26
23
|
...restProps
|
|
27
24
|
}) {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
name: name,
|
|
47
|
-
label: label,
|
|
48
|
-
isRequired: isRequired,
|
|
49
|
-
defaultValue: defaultValue !== null && defaultValue !== void 0 ? defaultValue : ''
|
|
50
|
-
}, ({
|
|
51
|
-
fieldProps,
|
|
52
|
-
meta,
|
|
53
|
-
error
|
|
54
|
-
}) => {
|
|
55
|
-
const isInvalid = validateSubmitErrors(meta);
|
|
56
|
-
return jsx(Fragment, null, jsx(AkTextfield, _extends({}, fieldProps, restProps, {
|
|
57
|
-
testId: testId,
|
|
58
|
-
isInvalid: isInvalid,
|
|
59
|
-
isRequired: false // Remove the default browser validation
|
|
60
|
-
})), !error && validationHelpText && jsx(HelperMessage, {
|
|
61
|
-
testId: `${testId}-helper-message`
|
|
62
|
-
}, validationHelpText), error && isInvalid && jsx(ErrorMessage, {
|
|
63
|
-
testId: `${testId}-error-message`
|
|
64
|
-
}, error));
|
|
65
|
-
})
|
|
66
|
-
);
|
|
25
|
+
return jsx(CreateField, {
|
|
26
|
+
id: id,
|
|
27
|
+
name: name,
|
|
28
|
+
label: label,
|
|
29
|
+
isRequired: isRequired,
|
|
30
|
+
validators: validators,
|
|
31
|
+
validationHelpText: validationHelpText,
|
|
32
|
+
testId: testId
|
|
33
|
+
}, ({
|
|
34
|
+
fieldId,
|
|
35
|
+
...fieldProps
|
|
36
|
+
}) => {
|
|
37
|
+
return jsx(AkTextfield, _extends({
|
|
38
|
+
id: fieldId
|
|
39
|
+
}, fieldProps, restProps, {
|
|
40
|
+
isRequired: false // Remove the default browser validation
|
|
41
|
+
}));
|
|
42
|
+
});
|
|
67
43
|
}
|
package/dist/es2019/ui/index.js
CHANGED
|
@@ -2,4 +2,6 @@ export { default } from './main';
|
|
|
2
2
|
export { TextField } from './create-form/textfield';
|
|
3
3
|
export { CreateForm } from './create-form/main';
|
|
4
4
|
export { CreateFormLoader } from './create-form/form-loader';
|
|
5
|
-
export {
|
|
5
|
+
export { Select } from './create-form/select';
|
|
6
|
+
export { AsyncSelect } from './create-form/async-select';
|
|
7
|
+
export { FormSpy } from './create-form/form-spy';
|
|
@@ -37,10 +37,10 @@ const LinkCreate = withLinkCreateFormContext(({
|
|
|
37
37
|
await onCreate(result);
|
|
38
38
|
}
|
|
39
39
|
}, [onCreate, setFormErrorMessage]);
|
|
40
|
-
const handleFailure = useCallback(
|
|
40
|
+
const handleFailure = useCallback(error => {
|
|
41
41
|
// Set the form error message
|
|
42
|
-
setFormErrorMessage(
|
|
43
|
-
onFailure && onFailure(
|
|
42
|
+
setFormErrorMessage(error.message);
|
|
43
|
+
onFailure && onFailure(error);
|
|
44
44
|
}, [onFailure, setFormErrorMessage]);
|
|
45
45
|
return jsx("div", {
|
|
46
46
|
"data-testid": testId
|
package/dist/es2019/version.json
CHANGED
|
@@ -4,7 +4,7 @@ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
|
4
4
|
*
|
|
5
5
|
* Generates Typescript types for analytics events from analytics.spec.yaml
|
|
6
6
|
*
|
|
7
|
-
* @codegen <<SignedSource::
|
|
7
|
+
* @codegen <<SignedSource::50073590468fe2604f65d3e0b23d517b>>
|
|
8
8
|
* @codegenCommand yarn workspace @atlaskit/link-create run codegen-analytics
|
|
9
9
|
*/
|
|
10
10
|
|