@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.
Files changed (101) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/analytics.spec.yaml +9 -0
  3. package/dist/cjs/common/utils/analytics/analytics.codegen.js +1 -1
  4. package/dist/cjs/controllers/callback-context/main.js +22 -3
  5. package/dist/cjs/controllers/create-field/index.js +12 -0
  6. package/dist/cjs/controllers/create-field/main.js +62 -0
  7. package/dist/cjs/index.js +12 -0
  8. package/dist/cjs/ui/create-form/async-select/main.js +117 -35
  9. package/dist/cjs/ui/create-form/form-footer/main.js +9 -2
  10. package/dist/cjs/ui/create-form/form-spy/index.js +27 -0
  11. package/dist/cjs/ui/create-form/index.js +15 -1
  12. package/dist/cjs/ui/create-form/main.js +20 -10
  13. package/dist/cjs/ui/create-form/select/index.js +12 -0
  14. package/dist/cjs/ui/create-form/select/main.js +50 -0
  15. package/dist/cjs/ui/create-form/select/types.js +5 -0
  16. package/dist/cjs/ui/create-form/textfield/main.js +26 -48
  17. package/dist/cjs/ui/index.js +15 -1
  18. package/dist/cjs/ui/link-create/main.js +3 -3
  19. package/dist/cjs/version.json +1 -1
  20. package/dist/es2019/common/utils/analytics/analytics.codegen.js +1 -1
  21. package/dist/es2019/controllers/callback-context/main.js +6 -1
  22. package/dist/es2019/controllers/create-field/index.js +1 -0
  23. package/dist/es2019/controllers/create-field/main.js +57 -0
  24. package/dist/es2019/index.js +1 -1
  25. package/dist/es2019/ui/create-form/async-select/main.js +75 -34
  26. package/dist/es2019/ui/create-form/form-footer/main.js +9 -2
  27. package/dist/es2019/ui/create-form/form-spy/index.js +18 -0
  28. package/dist/es2019/ui/create-form/index.js +3 -1
  29. package/dist/es2019/ui/create-form/main.js +25 -16
  30. package/dist/es2019/ui/create-form/select/index.js +1 -0
  31. package/dist/es2019/ui/create-form/select/main.js +40 -0
  32. package/dist/es2019/ui/create-form/textfield/main.js +24 -48
  33. package/dist/es2019/ui/index.js +3 -1
  34. package/dist/es2019/ui/link-create/main.js +3 -3
  35. package/dist/es2019/version.json +1 -1
  36. package/dist/esm/common/utils/analytics/analytics.codegen.js +1 -1
  37. package/dist/esm/controllers/callback-context/main.js +22 -3
  38. package/dist/esm/controllers/create-field/index.js +1 -0
  39. package/dist/esm/controllers/create-field/main.js +56 -0
  40. package/dist/esm/controllers/create-field/types.js +1 -0
  41. package/dist/esm/index.js +1 -1
  42. package/dist/esm/ui/create-form/async-select/main.js +118 -36
  43. package/dist/esm/ui/create-form/form-footer/main.js +9 -2
  44. package/dist/esm/ui/create-form/form-spy/index.js +19 -0
  45. package/dist/esm/ui/create-form/index.js +3 -1
  46. package/dist/esm/ui/create-form/main.js +19 -8
  47. package/dist/esm/ui/create-form/select/index.js +1 -0
  48. package/dist/esm/ui/create-form/select/main.js +42 -0
  49. package/dist/esm/ui/create-form/select/types.js +1 -0
  50. package/dist/esm/ui/create-form/textfield/main.js +25 -47
  51. package/dist/esm/ui/index.js +3 -1
  52. package/dist/esm/ui/link-create/main.js +3 -3
  53. package/dist/esm/version.json +1 -1
  54. package/dist/types/common/utils/analytics/analytics.codegen.d.ts +5 -1
  55. package/dist/types/common/utils/form/index.d.ts +2 -2
  56. package/dist/types/controllers/callback-context/main.d.ts +1 -1
  57. package/dist/types/controllers/create-field/index.d.ts +1 -0
  58. package/dist/types/controllers/create-field/main.d.ts +3 -0
  59. package/dist/types/controllers/create-field/types.d.ts +24 -0
  60. package/dist/types/index.d.ts +1 -1
  61. package/dist/types/ui/create-form/async-select/main.d.ts +5 -5
  62. package/dist/types/ui/create-form/async-select/types.d.ts +9 -4
  63. package/dist/types/ui/create-form/form-spy/index.d.ts +12 -0
  64. package/dist/types/ui/create-form/index.d.ts +2 -0
  65. package/dist/types/ui/create-form/main.d.ts +2 -1
  66. package/dist/types/ui/create-form/select/index.d.ts +1 -0
  67. package/dist/types/ui/create-form/select/main.d.ts +12 -0
  68. package/dist/types/ui/create-form/select/types.d.ts +18 -0
  69. package/dist/types/ui/create-form/textfield/main.d.ts +2 -1
  70. package/dist/types/ui/index.d.ts +2 -0
  71. package/dist/types-ts4.5/common/utils/analytics/analytics.codegen.d.ts +5 -1
  72. package/dist/types-ts4.5/common/utils/form/index.d.ts +2 -2
  73. package/dist/types-ts4.5/controllers/callback-context/main.d.ts +1 -1
  74. package/dist/types-ts4.5/controllers/create-field/index.d.ts +1 -0
  75. package/dist/types-ts4.5/controllers/create-field/main.d.ts +3 -0
  76. package/dist/types-ts4.5/controllers/create-field/types.d.ts +24 -0
  77. package/dist/types-ts4.5/index.d.ts +1 -1
  78. package/dist/types-ts4.5/ui/create-form/async-select/main.d.ts +5 -5
  79. package/dist/types-ts4.5/ui/create-form/async-select/types.d.ts +9 -4
  80. package/dist/types-ts4.5/ui/create-form/form-spy/index.d.ts +12 -0
  81. package/dist/types-ts4.5/ui/create-form/index.d.ts +2 -0
  82. package/dist/types-ts4.5/ui/create-form/main.d.ts +2 -1
  83. package/dist/types-ts4.5/ui/create-form/select/index.d.ts +1 -0
  84. package/dist/types-ts4.5/ui/create-form/select/main.d.ts +12 -0
  85. package/dist/types-ts4.5/ui/create-form/select/types.d.ts +18 -0
  86. package/dist/types-ts4.5/ui/create-form/textfield/main.d.ts +2 -1
  87. package/dist/types-ts4.5/ui/index.d.ts +2 -0
  88. package/example-helpers/mock-plugin-form.tsx +3 -4
  89. package/package.json +6 -3
  90. package/report.api.md +55 -12
  91. package/tmp/api-report-tmp.d.ts +164 -0
  92. package/dist/cjs/ui/group-selection/index.js +0 -22
  93. package/dist/es2019/ui/group-selection/index.js +0 -16
  94. package/dist/esm/ui/group-selection/index.js +0 -15
  95. package/dist/types/ui/group-selection/index.d.ts +0 -4
  96. package/dist/types/ui/group-selection/types.d.ts +0 -12
  97. package/dist/types-ts4.5/ui/group-selection/index.d.ts +0 -4
  98. package/dist/types-ts4.5/ui/group-selection/types.d.ts +0 -12
  99. /package/dist/cjs/{ui/group-selection → controllers/create-field}/types.js +0 -0
  100. /package/dist/es2019/{ui/group-selection → controllers/create-field}/types.js +0 -0
  101. /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 _form2 = require("../../../common/utils/form");
16
- var _formContext = require("../../../controllers/form-context");
17
- var _excluded = ["label", "name", "testId", "validationHelpText", "validators", "defaultValue", "isRequired"];
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 label = _ref.label,
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
- var _useFormContext = (0, _formContext.useFormContext)(),
39
- assignValidator = _useFormContext.assignValidator;
40
- (0, _react.useEffect)(function () {
41
- if (validators) {
42
- assignValidator(name, validators);
43
- }
44
- }, [name, validators, assignValidator]);
45
- return (
46
- /**
47
- * The defaultValue here should be '' when there is nothing passed in from the props.
48
- * This is because if we don't give it anything, the `fieldProps` wouldn't have a `value`
49
- * prop and make the TextField component uncontrolled. Later when user starts typing, the
50
- * `value` will be populated again in `fieldProps` which cause the TextField to be changed
51
- * to a controlled component and raise a warning from React.
52
- */
53
-
54
- (0, _react2.jsx)(_form.Field, {
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
  }
@@ -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 _asyncSelect = require("./create-form/async-select");
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 (errorMessage) {
72
+ var handleFailure = (0, _react.useCallback)(function (error) {
73
73
  // Set the form error message
74
- setFormErrorMessage(errorMessage);
75
- onFailure && onFailure(errorMessage);
74
+ setFormErrorMessage(error.message);
75
+ onFailure && onFailure(error);
76
76
  }, [onFailure, setFormErrorMessage]);
77
77
  return (0, _react2.jsx)("div", {
78
78
  "data-testid": testId
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/link-create",
3
- "version": "0.9.1",
3
+ "version": "1.0.0",
4
4
  "sideEffects": false
5
5
  }
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Generates Typescript types for analytics events from analytics.spec.yaml
5
5
  *
6
- * @codegen <<SignedSource::6c4bc6f47b1cf9cb3a9a70cac9a93775>>
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
+ }
@@ -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 { Fragment, useEffect } from 'react';
3
+ import { useEffect, useMemo, useState } from 'react';
4
4
  import { jsx } from '@emotion/react';
5
- import { ErrorMessage, Field, HelperMessage } from '@atlaskit/form';
5
+ import debounce from 'debounce-promise';
6
+ import { useForm } from 'react-final-form';
6
7
  import { AsyncSelect as AkAsyncSelect } from '@atlaskit/select';
7
- import { validateSubmitErrors } from '../../../common/utils/form';
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 objects from `@atlaskit/form`.
12
- * Validation is handled by the form as it is on form submission. Any errors returned by
13
- * the handleSubmit function passed to the form <Form> that have a key matching the `name`
14
- * of this text field are shown above the field.
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
- label,
18
+ id,
18
19
  name,
19
- validationHelpText,
20
+ label,
20
21
  isRequired,
21
- testId = TEST_ID,
22
22
  validators,
23
- defaultValue,
24
- ...rest
23
+ validationHelpText,
24
+ testId = TEST_ID,
25
+ defaultOption: propsDefaultValue,
26
+ loadOptions,
27
+ ...restProps
25
28
  }) {
26
29
  const {
27
- assignValidator
28
- } = useFormContext();
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
- if (validators) {
31
- assignValidator(name, validators);
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
- }, [name, validators, assignValidator]);
34
- return jsx("div", {
35
- "data-testid": testId
36
- }, jsx(Field, {
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
- defaultValue: defaultValue
81
+ validators: validators,
82
+ validationHelpText: validationHelpText,
83
+ testId: testId
41
84
  }, ({
42
- fieldProps,
43
- meta,
44
- error
85
+ fieldId,
86
+ ...fieldProps
45
87
  }) => {
46
- const isInvalid = validateSubmitErrors(meta);
47
- return jsx(Fragment, null, jsx(AkAsyncSelect, _extends({}, fieldProps, rest, {
48
- isInvalid: isInvalid
49
- })), !error && validationHelpText && jsx(HelperMessage, {
50
- testId: `${testId}-helper-message`
51
- }, validationHelpText), isInvalid && jsx(ErrorMessage, {
52
- testId: `${testId}-error-message`
53
- }, error));
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(FormFooter, null, formErrorMessage && jsx("div", {
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
- formProps,
57
- submitting
58
- }) => jsx("form", _extends({}, formProps, {
59
- name: "link-create-form",
60
- "data-testid": testId,
61
- css: formStyles
62
- }), jsx("div", null, children), !hideFooter && jsx(CreateFormFooter, {
63
- formErrorMessage: formErrorMessage,
64
- handleCancel: handleCancel,
65
- submitting: submitting,
66
- testId: testId
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 { validateSubmitErrors } from '../../../common/utils/form';
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
- label,
16
+ id,
20
17
  name,
21
- testId = TEST_ID,
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
- const {
29
- assignValidator
30
- } = useFormContext();
31
- useEffect(() => {
32
- if (validators) {
33
- assignValidator(name, validators);
34
- }
35
- }, [name, validators, assignValidator]);
36
- return (
37
- /**
38
- * The defaultValue here should be '' when there is nothing passed in from the props.
39
- * This is because if we don't give it anything, the `fieldProps` wouldn't have a `value`
40
- * prop and make the TextField component uncontrolled. Later when user starts typing, the
41
- * `value` will be populated again in `fieldProps` which cause the TextField to be changed
42
- * to a controlled component and raise a warning from React.
43
- */
44
-
45
- jsx(Field, {
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
  }
@@ -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 { AsyncSelect } from './create-form/async-select';
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(errorMessage => {
40
+ const handleFailure = useCallback(error => {
41
41
  // Set the form error message
42
- setFormErrorMessage(errorMessage);
43
- onFailure && onFailure(errorMessage);
42
+ setFormErrorMessage(error.message);
43
+ onFailure && onFailure(error);
44
44
  }, [onFailure, setFormErrorMessage]);
45
45
  return jsx("div", {
46
46
  "data-testid": testId
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/link-create",
3
- "version": "0.9.1",
3
+ "version": "1.0.0",
4
4
  "sideEffects": false
5
5
  }
@@ -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::6c4bc6f47b1cf9cb3a9a70cac9a93775>>
7
+ * @codegen <<SignedSource::50073590468fe2604f65d3e0b23d517b>>
8
8
  * @codegenCommand yarn workspace @atlaskit/link-create run codegen-analytics
9
9
  */
10
10