@atlaskit/share 4.3.0 → 4.4.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,17 @@
1
1
  # @atlaskit/share
2
2
 
3
+ ## 4.4.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`b5a13856081`](https://bitbucket.org/atlassian/atlassian-frontend/commits/b5a13856081) - [ux] Better accessibility support and copy for the Share dialog
8
+
9
+ ## 4.3.1
10
+
11
+ ### Patch Changes
12
+
13
+ - [`6febf275a0a`](https://bitbucket.org/atlassian/atlassian-frontend/commits/6febf275a0a) - [ux] Rename Roadmap to Timeline in the shared success message for roadmap share content type
14
+
3
15
  ## 4.3.0
4
16
 
5
17
  ### Minor Changes
@@ -16,7 +16,8 @@ var CommentField = function CommentField(_ref) {
16
16
  var intl = (0, _reactIntlNext.useIntl)();
17
17
  return /*#__PURE__*/_react.default.createElement(_form.Field, {
18
18
  name: "comment",
19
- defaultValue: defaultValue
19
+ defaultValue: defaultValue,
20
+ label: intl.formatMessage(_i18n.messages.commentLabel)
20
21
  }, function (_ref2) {
21
22
  var fieldProps = _ref2.fieldProps;
22
23
  return /*#__PURE__*/_react.default.createElement(_textarea.default, (0, _extends2.default)({}, fieldProps, {
@@ -9,9 +9,12 @@ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")
9
9
  var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
10
10
  var _react = _interopRequireDefault(require("react"));
11
11
  var _customThemeButton = _interopRequireDefault(require("@atlaskit/button/custom-theme-button"));
12
- var _excluded = ["text"];
13
- var ShareButton = /*#__PURE__*/_react.default.forwardRef(function ShareButton(_ref, ref) {
12
+ var _excluded = ["text", "aria-haspopup"];
13
+ var ShareButton = /*#__PURE__*/_react.default.forwardRef(
14
+ // Discard aria-haspopup
15
+ function ShareButton(_ref, ref) {
14
16
  var text = _ref.text,
17
+ _ariaHasPopup = _ref['aria-haspopup'],
15
18
  props = (0, _objectWithoutProperties2.default)(_ref, _excluded);
16
19
  return /*#__PURE__*/_react.default.createElement(_customThemeButton.default, (0, _extends2.default)({
17
20
  ref: ref,
@@ -29,6 +29,9 @@ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Re
29
29
  var REQUIRED = 'REQUIRED';
30
30
  exports.REQUIRED = REQUIRED;
31
31
  var DEBOUNCE_MS = 150;
32
+ var USER_PICKER_FIELD_LABEL = 'share-user-picker-field-label';
33
+ var USER_PICKER_FIELD_PLACEHOLDER = 'share-user-picker-field-placeholder';
34
+ var USER_PICKER_ARIA_LABEL = "".concat(USER_PICKER_FIELD_LABEL, " ").concat(USER_PICKER_FIELD_PLACEHOLDER);
32
35
  var validate = function validate(value) {
33
36
  return value && value instanceof Array && value.length > 0 ? undefined : REQUIRED;
34
37
  };
@@ -54,34 +57,61 @@ var getPlaceHolderMessageDescriptor = function getPlaceHolderMessageDescriptor()
54
57
  var isBrowseUsersDisabled = arguments.length > 2 ? arguments[2] : undefined;
55
58
  if (!allowEmail) {
56
59
  var _placeholderMessage = {
57
- jira: _i18n.messages.userPickerExistingUserOnlyPlaceholder,
58
- confluence: _i18n.messages.userPickerGenericExistingUserOnlyPlaceholder
60
+ jira: _i18n.messages.userPickerPlaceholderEmailDisabledJira,
61
+ // We can use the same message as when emails are not disabled, since
62
+ // emails are not mentioned in this placeholder as it would be too long
63
+ confluence: _i18n.messages.userPickerPlaceholderConfluence
59
64
  };
60
65
  return _placeholderMessage[product];
61
66
  }
62
67
  if (isBrowseUsersDisabled) {
63
- return _i18n.messages.userPickerGenericEmailOnlyPlaceholder;
68
+ return _i18n.messages.userPickerPlaceholderBrowseUsersDisabled;
64
69
  }
65
70
  var placeholderMessage = {
66
- jira: _i18n.messages.userPickerGenericPlaceholderJira,
67
- confluence: _i18n.messages.userPickerGenericPlaceholder
71
+ jira: _i18n.messages.userPickerPlaceholderJira,
72
+ confluence: _i18n.messages.userPickerPlaceholderConfluence
68
73
  };
69
74
  return placeholderMessage[product];
70
75
  };
71
- var requiredMessagesWithEmail = {
72
- confluence: _i18n.messages.userPickerRequiredMessage,
73
- jira: _i18n.messages.userPickerRequiredMessageJira
74
- };
75
- var requiredMessagesWithoutEmail = {
76
- confluence: _i18n.messages.userPickerRequiredExistingUserOnlyMessage,
77
- jira: _i18n.messages.userPickerRequiredExistingUserOnlyMessageJira
76
+ var getLabelMessageDescriptor = function getLabelMessageDescriptor() {
77
+ var product = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'confluence';
78
+ var allowEmail = arguments.length > 1 ? arguments[1] : undefined;
79
+ var isBrowseUsersDisabled = arguments.length > 2 ? arguments[2] : undefined;
80
+ if (!allowEmail) {
81
+ var _labelMessage = {
82
+ jira: _i18n.messages.userPickerLabelEmailDisabledJira,
83
+ confluence: _i18n.messages.userPickerLabelEmailDisabledConfluence
84
+ };
85
+ return _labelMessage[product];
86
+ }
87
+ if (isBrowseUsersDisabled) {
88
+ return _i18n.messages.userPickerLabelBrowseUsersDisabled;
89
+ }
90
+ var labelMessage = {
91
+ jira: _i18n.messages.userPickerLabelJira,
92
+ confluence: _i18n.messages.userPickerLabelConfluence
93
+ };
94
+ return labelMessage[product];
78
95
  };
79
- var getRequiredMessage = function getRequiredMessage(product, allowEmail, isBrowseUsersDisabled) {
96
+ var getRequiredMessage = function getRequiredMessage() {
97
+ var product = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'confluence';
98
+ var allowEmail = arguments.length > 1 ? arguments[1] : undefined;
99
+ var isBrowseUsersDisabled = arguments.length > 2 ? arguments[2] : undefined;
100
+ if (!allowEmail) {
101
+ var _requiredMessage = {
102
+ jira: _i18n.messages.userPickerRequiredMessageEmailDisabledJira,
103
+ confluence: _i18n.messages.userPickerRequiredMessageEmailDisabledConfluence
104
+ };
105
+ return _requiredMessage[product];
106
+ }
80
107
  if (isBrowseUsersDisabled) {
81
- return _i18n.messages.userPickerRequiredMessageEmailOnly;
108
+ return _i18n.messages.userPickerRequiredMessageBrowseUsersDisabled;
82
109
  }
83
- var emailMessages = allowEmail ? requiredMessagesWithEmail : requiredMessagesWithoutEmail;
84
- return emailMessages[product];
110
+ var requiredMessage = {
111
+ jira: _i18n.messages.userPickerRequiredMessageJira,
112
+ confluence: _i18n.messages.userPickerRequiredMessageConfluence
113
+ };
114
+ return requiredMessage[product];
85
115
  };
86
116
 
87
117
  // eslint-disable-next-line @repo/internal/react/no-class-components
@@ -160,7 +190,6 @@ var UserPickerFieldComponent = /*#__PURE__*/function (_React$Component) {
160
190
  loadOptions: this.loadOptions,
161
191
  isMulti: true,
162
192
  width: '100%',
163
- placeholder: /*#__PURE__*/_react.default.createElement(_reactIntlNext.FormattedMessage, getPlaceHolderMessageDescriptor(product, allowEmail, isBrowseUsersDisabled)),
164
193
  allowEmail: allowEmail,
165
194
  noOptionsMessage: getNoOptionsMessage(isPublicLink, allowEmail),
166
195
  isLoading: isLoading,
@@ -171,10 +200,14 @@ var UserPickerFieldComponent = /*#__PURE__*/function (_React$Component) {
171
200
  var UserPickerComponent = enableSmartUserPicker && !isBrowseUsersDisabled ? _smartUserPicker.default : _userPicker.default;
172
201
  var menuPortalTarget = (0, _utils.getMenuPortalTargetCurrentHTML)(selectPortalRef);
173
202
  return /*#__PURE__*/_react.default.createElement(_form.Field, {
203
+ label: /*#__PURE__*/_react.default.createElement("span", {
204
+ id: USER_PICKER_FIELD_LABEL
205
+ }, /*#__PURE__*/_react.default.createElement(_reactIntlNext.FormattedMessage, getLabelMessageDescriptor(product, allowEmail, isBrowseUsersDisabled))),
174
206
  name: "users",
175
207
  validate: validate,
176
208
  defaultValue: defaultValue,
177
- transform: this.handleUserPickerTransform
209
+ transform: this.handleUserPickerTransform,
210
+ isRequired: true
178
211
  }, function (_ref2) {
179
212
  var fieldProps = _ref2.fieldProps,
180
213
  fieldValidationError = _ref2.error,
@@ -183,7 +216,12 @@ var UserPickerFieldComponent = /*#__PURE__*/function (_React$Component) {
183
216
  var addMoreMessage = shareError !== null && shareError !== void 0 && shareError.errorCode ? null : intl.formatMessage(_i18n.messages.userPickerAddMoreMessage);
184
217
  var wasValidationOrShareError = !!fieldValidationError || !!shareError;
185
218
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(UserPickerComponent, (0, _extends2.default)({}, fieldProps, commonPickerProps, smartUserPickerProps, {
219
+ "aria-labelledby": USER_PICKER_ARIA_LABEL,
220
+ "aria-required": true,
186
221
  addMoreMessage: addMoreMessage,
222
+ placeholder: /*#__PURE__*/_react.default.createElement("span", {
223
+ id: USER_PICKER_FIELD_PLACEHOLDER
224
+ }, /*#__PURE__*/_react.default.createElement(_reactIntlNext.FormattedMessage, getPlaceHolderMessageDescriptor(product, allowEmail, isBrowseUsersDisabled))),
187
225
  menuPortalTarget: menuPortalTarget
188
226
  })), helperMessage && !wasValidationOrShareError && /*#__PURE__*/_react.default.createElement(_form.HelperMessage, null, helperMessage), !fieldValid && fieldValidationError === REQUIRED && /*#__PURE__*/_react.default.createElement(_form.ErrorMessage, null, /*#__PURE__*/_react.default.createElement(_reactIntlNext.FormattedMessage, requiredMessage)), shareError && shareError.errorCode && /*#__PURE__*/_react.default.createElement(_form.ErrorMessage, null, shareError.message, "\xA0", shareError.helpUrl && /*#__PURE__*/_react.default.createElement("a", {
189
227
  target: "_blank",
@@ -13,7 +13,7 @@ var buildAttributes = function buildAttributes() {
13
13
  var attributes = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
14
14
  return _objectSpread({
15
15
  packageName: "@atlaskit/share",
16
- packageVersion: "4.3.0"
16
+ packageVersion: "4.4.0"
17
17
  }, attributes);
18
18
  };
19
19
  var createEvent = function createEvent(eventType, source, action, actionSubject, actionSubjectId) {
@@ -18,7 +18,7 @@ var _default = {
18
18
  'fabric.elements.share.copypubliclink.button.text': 'Copy public link',
19
19
  'fabric.elements.share.failure.icon.label': 'Error icon',
20
20
  'fabric.elements.share.failure.message': 'Unable to share',
21
- 'fabric.elements.share.form.comment.placeholder': 'Add a message',
21
+ 'fabric.elements.share.form.comment.placeholder': 'Anything they should know?',
22
22
  'fabric.elements.share.form.info.message.no.invite.confluence': 'Recipients will see the name of the page and your message',
23
23
  'fabric.elements.share.form.info.message.no.invite.jira': 'Recipients will see the name of the issue and your message',
24
24
  'fabric.elements.share.form.no-permissions': 'You do not have the ability to share.',
package/dist/cjs/i18n.js CHANGED
@@ -41,36 +41,92 @@ var messages = (0, _reactIntlNext.defineMessages)({
41
41
  defaultMessage: 'You do not have the ability to share.',
42
42
  description: 'Copy to show when a user can not share.'
43
43
  },
44
+ commentLabel: {
45
+ id: 'fabric.elements.share.form.comment.label',
46
+ defaultMessage: 'Message (optional)',
47
+ description: 'Label for the comment field in the Share form.'
48
+ },
44
49
  commentPlaceholder: {
45
50
  id: 'fabric.elements.share.form.comment.placeholder',
46
- defaultMessage: 'Add a message',
51
+ defaultMessage: 'Anything they should know?',
47
52
  description: 'Placeholder for the comment field in Share form.'
48
53
  },
49
- userPickerGenericPlaceholder: {
50
- id: 'fabric.elements.share.form.user-picker.placeholder.generic',
51
- defaultMessage: 'Enter name, group, team or email',
52
- description: 'Generic placeholder for the user picker field in Share form.'
53
- },
54
- userPickerGenericExistingUserOnlyPlaceholder: {
55
- id: 'fabric.elements.share.form.user-picker.placholder.generic.existingUserOnly',
56
- defaultMessage: 'Enter name, group or team',
57
- description: 'Existing user only placeholder for the user picker field in Share form (emails are not an option).'
58
- },
59
- userPickerGenericPlaceholderJira: {
54
+ // Email disabled (Jira)
55
+ userPickerLabelEmailDisabledJira: {
56
+ id: 'fabric.elements.share.form.user-picker.label.email-disabled-jira',
57
+ defaultMessage: 'Names or teams',
58
+ description: 'Label for the user picker field in the Share form in Jira with no email option.'
59
+ },
60
+ userPickerPlaceholderEmailDisabledJira: {
61
+ id: 'fabric.elements.share.form.user-picker.placeholder.email-disabled-jira',
62
+ defaultMessage: 'e.g. Maria, Team Orange',
63
+ description: 'Placeholder for the user picker field in the Share form in Jira with no email option. These examples should be localized.'
64
+ },
65
+ userPickerRequiredMessageEmailDisabledJira: {
66
+ id: 'fabric.elements.share.form.user-picker.validation.required-message.email-disabled-jira',
67
+ defaultMessage: 'Select at least one person or team',
68
+ description: 'Error message for the user picker field in the Share form in Jira with no email option, when no entries are selected.'
69
+ },
70
+ // Email disabled (Confluence)
71
+ userPickerLabelEmailDisabledConfluence: {
72
+ id: 'fabric.elements.share.form.user-picker.label.email-disabled-confluence',
73
+ defaultMessage: 'Names, teams, or groups',
74
+ description: 'Label for the user picker field in the Share form in Confluence with no email option.'
75
+ },
76
+ userPickerRequiredMessageEmailDisabledConfluence: {
77
+ id: 'fabric.elements.share.form.user-picker.validation.required-message.email-disabled-confluence',
78
+ defaultMessage: 'Select at least one person, team, or group',
79
+ description: 'Error message for the user picker field in the Share form in Confluence with no email option, when no entries are selected.'
80
+ },
81
+ // Browse users disabled
82
+ userPickerLabelBrowseUsersDisabled: {
83
+ id: 'fabric.elements.share.form.user-picker.label.email-only',
84
+ defaultMessage: 'Emails',
85
+ description: 'Label for the user picker field in the Share form when browse user permissions are disabled.'
86
+ },
87
+ userPickerPlaceholderBrowseUsersDisabled: {
88
+ id: 'fabric.elements.share.form.user-picker.placeholder.email-only',
89
+ defaultMessage: 'e.g. maria@company.com',
90
+ description: 'Placeholder for the user picker field in the Share form when browse user permissions are disabled. These examples should be localized.'
91
+ },
92
+ userPickerRequiredMessageBrowseUsersDisabled: {
93
+ id: 'fabric.elements.share.form.user-picker.validation.required-message.email-only',
94
+ defaultMessage: 'Select at least one email',
95
+ description: 'Error message for the user picker field in the Share form in when browse user permissions are disabled, when no entries are selected.'
96
+ },
97
+ // Generic (Jira)
98
+ userPickerLabelJira: {
99
+ id: 'fabric.elements.share.form.user-picker.label.jira',
100
+ defaultMessage: 'Names, teams, or emails',
101
+ description: 'Label for the user picker field in the Share form in Jira.'
102
+ },
103
+ userPickerPlaceholderJira: {
60
104
  id: 'fabric.elements.share.form.user-picker.placeholder.jira',
61
- defaultMessage: 'Enter name, team or email',
62
- description: 'Generic placeholder for the user picker field in Share form. ' + 'This message is used only for Jira product because Jira does not have Group concept.'
63
- },
64
- userPickerExistingUserOnlyPlaceholder: {
65
- id: 'fabric.elements.share.form.user-picker.placeholder.existingUserOnly',
66
- defaultMessage: 'Enter name or team',
67
- description: 'Existing user only placeholder for the user picker field in Share form.'
68
- },
69
- userPickerGenericEmailOnlyPlaceholder: {
70
- id: 'fabric.elements.share.form.user-picker.placeholder.emailOnly',
71
- defaultMessage: 'Enter email',
72
- description: 'Email only placeholder for the user picker field in Share form.'
105
+ defaultMessage: 'e.g. Maria, Team Orange, maria@company.com',
106
+ description: 'Placeholder for the user picker field in the Share form in Jira. These examples should be localized.'
73
107
  },
108
+ userPickerRequiredMessageJira: {
109
+ id: 'fabric.elements.share.form.user-picker.validation.required-message.jira',
110
+ defaultMessage: 'Select at least one person, team, or email',
111
+ description: 'Error message for the user picker field in the Share form in Jira, when no entries are selected.'
112
+ },
113
+ // Generic (Confluence)
114
+ userPickerLabelConfluence: {
115
+ id: 'fabric.elements.share.form.user-picker.label.confluence',
116
+ defaultMessage: 'Names, teams, groups, or emails',
117
+ description: 'Label for the user picker field in the Share form in Confluence.'
118
+ },
119
+ userPickerPlaceholderConfluence: {
120
+ id: 'fabric.elements.share.form.user-picker.placeholder.confluence',
121
+ defaultMessage: 'e.g. Maria, Team Orange, group-one',
122
+ description: 'Placeholder for the user picker field in the Share form in Confluence. These examples should be localized.'
123
+ },
124
+ userPickerRequiredMessageConfluence: {
125
+ id: 'fabric.elements.share.form.user-picker.validation.required-message.confluence',
126
+ defaultMessage: 'Select at least one person, team, group, or email',
127
+ description: 'Error message for the user picker field in the Share form in Confluence, when no entries are selected.'
128
+ },
129
+ // Common messages
74
130
  userPickerAddMoreMessage: {
75
131
  id: 'fabric.elements.share.form.user-picker.add-more',
76
132
  defaultMessage: 'Enter more',
@@ -81,26 +137,6 @@ var messages = (0, _reactIntlNext.defineMessages)({
81
137
  defaultMessage: 'Select at least one user, group, team or email.',
82
138
  description: 'Required error message for the user picker field in Share form.'
83
139
  },
84
- userPickerRequiredMessageJira: {
85
- id: 'fabric.elements.share.form.user-picker.validation.required.jira',
86
- defaultMessage: 'Select at least one user, team or email.',
87
- description: 'Required error message for the user picker field in Share form. ' + 'This message is used only for Jira product because Jira does not have Group concept.'
88
- },
89
- userPickerRequiredMessageEmailOnly: {
90
- id: 'fabric.elements.share.form.user-picker.validation.required.email-only',
91
- defaultMessage: 'Select at least one email.',
92
- description: 'Required error message for the user picker field when email only enabled in Share form. ' + 'This message is used for both jira and confluence.'
93
- },
94
- userPickerRequiredExistingUserOnlyMessage: {
95
- id: 'fabric.elements.share.form.user-picker.validation.required.existingUserOnly',
96
- defaultMessage: 'Select at least one user, group or team.',
97
- description: 'Required error message for the user picker field in Share form when email is not allowed.'
98
- },
99
- userPickerRequiredExistingUserOnlyMessageJira: {
100
- id: 'fabric.elements.share.form.user-picker.validation.required.jira.existingUserOnly',
101
- defaultMessage: 'Select at least one user or team.',
102
- description: 'Required error message for the user picker field in Share form when email is not allowed. ' + 'This message is used only for Jira product because Jira does not have Group concept.'
103
- },
104
140
  userPickerExistingUserOnlyNoOptionsMessage: {
105
141
  id: 'fabric.elements.share.form.user-picker.no-options.existingUserOnly',
106
142
  defaultMessage: "We couldn\u2019t find any results for \"{inputValue}\".",
@@ -170,7 +206,7 @@ var messages = (0, _reactIntlNext.defineMessages)({
170
206
  id: 'fabric.elements.share.success.message',
171
207
  defaultMessage: '{object, select,' + 'blogpost {Blog post shared}' + 'board {Board shared}' + 'calendar {Calendar shared}' + 'draft {Draft shared}' +
172
208
  // this is a placeholder for Invite to edit in Confluence
173
- 'filter {Filter shared}' + 'issue {Issue shared}' + 'summary {Summary shared}' + 'list {List shared}' + 'timeline {Timeline shared}' + 'form {Form shared}' + 'media {Media shared}' + 'page {Page shared}' + 'project {Project shared}' + 'pullrequest {Pull Request shared}' + 'question {Question shared}' + 'report {Report shared}' + 'repository {Repository shared}' + 'request {Request shared}' + 'roadmap {Roadmap shared}' + 'site {Site shared}' + 'space {Space shared}' + 'other {Link Shared}' + '}',
209
+ 'filter {Filter shared}' + 'issue {Issue shared}' + 'summary {Summary shared}' + 'list {List shared}' + 'timeline {Timeline shared}' + 'form {Form shared}' + 'media {Media shared}' + 'page {Page shared}' + 'project {Project shared}' + 'pullrequest {Pull Request shared}' + 'question {Question shared}' + 'report {Report shared}' + 'repository {Repository shared}' + 'request {Request shared}' + 'roadmap {Timeline shared}' + 'site {Site shared}' + 'space {Space shared}' + 'other {Link Shared}' + '}',
174
210
  description: 'Default text for share success message displayed in a flag'
175
211
  },
176
212
  shareToIntegrationButtonText: {
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "name": "@atlaskit/share",
3
- "version": "4.3.0"
3
+ "version": "4.4.0"
4
4
  }
@@ -10,7 +10,8 @@ export const CommentField = ({
10
10
  const intl = useIntl();
11
11
  return /*#__PURE__*/React.createElement(Field, {
12
12
  name: "comment",
13
- defaultValue: defaultValue
13
+ defaultValue: defaultValue,
14
+ label: intl.formatMessage(messages.commentLabel)
14
15
  }, ({
15
16
  fieldProps
16
17
  }) => /*#__PURE__*/React.createElement(TextArea, _extends({}, fieldProps, {
@@ -1,8 +1,11 @@
1
1
  import _extends from "@babel/runtime/helpers/extends";
2
2
  import React from 'react';
3
3
  import Button from '@atlaskit/button/custom-theme-button';
4
- export const ShareButton = /*#__PURE__*/React.forwardRef(function ShareButton({
4
+ export const ShareButton = /*#__PURE__*/React.forwardRef(
5
+ // Discard aria-haspopup
6
+ function ShareButton({
5
7
  text,
8
+ 'aria-haspopup': _ariaHasPopup,
6
9
  ...props
7
10
  }, ref) {
8
11
  return /*#__PURE__*/React.createElement(Button, _extends({
@@ -10,6 +10,9 @@ import { MAX_PICKER_HEIGHT } from './styles';
10
10
  import { allowEmails, getMenuPortalTargetCurrentHTML } from './utils';
11
11
  export const REQUIRED = 'REQUIRED';
12
12
  const DEBOUNCE_MS = 150;
13
+ const USER_PICKER_FIELD_LABEL = 'share-user-picker-field-label';
14
+ const USER_PICKER_FIELD_PLACEHOLDER = 'share-user-picker-field-placeholder';
15
+ const USER_PICKER_ARIA_LABEL = `${USER_PICKER_FIELD_LABEL} ${USER_PICKER_FIELD_PLACEHOLDER}`;
13
16
  const validate = value => {
14
17
  return value && value instanceof Array && value.length > 0 ? undefined : REQUIRED;
15
18
  };
@@ -29,34 +32,55 @@ const getNoOptionsMessage = (isPublicLink, allowEmail) => ({
29
32
  const getPlaceHolderMessageDescriptor = (product = 'confluence', allowEmail, isBrowseUsersDisabled) => {
30
33
  if (!allowEmail) {
31
34
  const placeholderMessage = {
32
- jira: messages.userPickerExistingUserOnlyPlaceholder,
33
- confluence: messages.userPickerGenericExistingUserOnlyPlaceholder
35
+ jira: messages.userPickerPlaceholderEmailDisabledJira,
36
+ // We can use the same message as when emails are not disabled, since
37
+ // emails are not mentioned in this placeholder as it would be too long
38
+ confluence: messages.userPickerPlaceholderConfluence
34
39
  };
35
40
  return placeholderMessage[product];
36
41
  }
37
42
  if (isBrowseUsersDisabled) {
38
- return messages.userPickerGenericEmailOnlyPlaceholder;
43
+ return messages.userPickerPlaceholderBrowseUsersDisabled;
39
44
  }
40
45
  const placeholderMessage = {
41
- jira: messages.userPickerGenericPlaceholderJira,
42
- confluence: messages.userPickerGenericPlaceholder
46
+ jira: messages.userPickerPlaceholderJira,
47
+ confluence: messages.userPickerPlaceholderConfluence
43
48
  };
44
49
  return placeholderMessage[product];
45
50
  };
46
- const requiredMessagesWithEmail = {
47
- confluence: messages.userPickerRequiredMessage,
48
- jira: messages.userPickerRequiredMessageJira
49
- };
50
- const requiredMessagesWithoutEmail = {
51
- confluence: messages.userPickerRequiredExistingUserOnlyMessage,
52
- jira: messages.userPickerRequiredExistingUserOnlyMessageJira
51
+ const getLabelMessageDescriptor = (product = 'confluence', allowEmail, isBrowseUsersDisabled) => {
52
+ if (!allowEmail) {
53
+ const labelMessage = {
54
+ jira: messages.userPickerLabelEmailDisabledJira,
55
+ confluence: messages.userPickerLabelEmailDisabledConfluence
56
+ };
57
+ return labelMessage[product];
58
+ }
59
+ if (isBrowseUsersDisabled) {
60
+ return messages.userPickerLabelBrowseUsersDisabled;
61
+ }
62
+ const labelMessage = {
63
+ jira: messages.userPickerLabelJira,
64
+ confluence: messages.userPickerLabelConfluence
65
+ };
66
+ return labelMessage[product];
53
67
  };
54
- const getRequiredMessage = (product, allowEmail, isBrowseUsersDisabled) => {
68
+ const getRequiredMessage = (product = 'confluence', allowEmail, isBrowseUsersDisabled) => {
69
+ if (!allowEmail) {
70
+ const requiredMessage = {
71
+ jira: messages.userPickerRequiredMessageEmailDisabledJira,
72
+ confluence: messages.userPickerRequiredMessageEmailDisabledConfluence
73
+ };
74
+ return requiredMessage[product];
75
+ }
55
76
  if (isBrowseUsersDisabled) {
56
- return messages.userPickerRequiredMessageEmailOnly;
77
+ return messages.userPickerRequiredMessageBrowseUsersDisabled;
57
78
  }
58
- const emailMessages = allowEmail ? requiredMessagesWithEmail : requiredMessagesWithoutEmail;
59
- return emailMessages[product];
79
+ const requiredMessage = {
80
+ jira: messages.userPickerRequiredMessageJira,
81
+ confluence: messages.userPickerRequiredMessageConfluence
82
+ };
83
+ return requiredMessage[product];
60
84
  };
61
85
 
62
86
  // eslint-disable-next-line @repo/internal/react/no-class-components
@@ -130,7 +154,6 @@ export class UserPickerFieldComponent extends React.Component {
130
154
  loadOptions: this.loadOptions,
131
155
  isMulti: true,
132
156
  width: '100%',
133
- placeholder: /*#__PURE__*/React.createElement(FormattedMessage, getPlaceHolderMessageDescriptor(product, allowEmail, isBrowseUsersDisabled)),
134
157
  allowEmail,
135
158
  noOptionsMessage: getNoOptionsMessage(isPublicLink, allowEmail),
136
159
  isLoading,
@@ -141,10 +164,14 @@ export class UserPickerFieldComponent extends React.Component {
141
164
  const UserPickerComponent = enableSmartUserPicker && !isBrowseUsersDisabled ? SmartUserPicker : UserPicker;
142
165
  const menuPortalTarget = getMenuPortalTargetCurrentHTML(selectPortalRef);
143
166
  return /*#__PURE__*/React.createElement(Field, {
167
+ label: /*#__PURE__*/React.createElement("span", {
168
+ id: USER_PICKER_FIELD_LABEL
169
+ }, /*#__PURE__*/React.createElement(FormattedMessage, getLabelMessageDescriptor(product, allowEmail, isBrowseUsersDisabled))),
144
170
  name: "users",
145
171
  validate: validate,
146
172
  defaultValue: defaultValue,
147
- transform: this.handleUserPickerTransform
173
+ transform: this.handleUserPickerTransform,
174
+ isRequired: true
148
175
  }, ({
149
176
  fieldProps,
150
177
  error: fieldValidationError,
@@ -156,7 +183,12 @@ export class UserPickerFieldComponent extends React.Component {
156
183
  const addMoreMessage = shareError !== null && shareError !== void 0 && shareError.errorCode ? null : intl.formatMessage(messages.userPickerAddMoreMessage);
157
184
  const wasValidationOrShareError = !!fieldValidationError || !!shareError;
158
185
  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(UserPickerComponent, _extends({}, fieldProps, commonPickerProps, smartUserPickerProps, {
186
+ "aria-labelledby": USER_PICKER_ARIA_LABEL,
187
+ "aria-required": true,
159
188
  addMoreMessage: addMoreMessage,
189
+ placeholder: /*#__PURE__*/React.createElement("span", {
190
+ id: USER_PICKER_FIELD_PLACEHOLDER
191
+ }, /*#__PURE__*/React.createElement(FormattedMessage, getPlaceHolderMessageDescriptor(product, allowEmail, isBrowseUsersDisabled))),
160
192
  menuPortalTarget: menuPortalTarget
161
193
  })), helperMessage && !wasValidationOrShareError && /*#__PURE__*/React.createElement(HelperMessage, null, helperMessage), !fieldValid && fieldValidationError === REQUIRED && /*#__PURE__*/React.createElement(ErrorMessage, null, /*#__PURE__*/React.createElement(FormattedMessage, requiredMessage)), shareError && shareError.errorCode && /*#__PURE__*/React.createElement(ErrorMessage, null, shareError.message, "\xA0", shareError.helpUrl && /*#__PURE__*/React.createElement("a", {
162
194
  target: "_blank",
@@ -1,7 +1,7 @@
1
1
  import { isEmail, isTeam, isUser } from '@atlaskit/smart-user-picker';
2
2
  const buildAttributes = (attributes = {}) => ({
3
3
  packageName: "@atlaskit/share",
4
- packageVersion: "4.3.0",
4
+ packageVersion: "4.4.0",
5
5
  ...attributes
6
6
  });
7
7
  const createEvent = (eventType, source, action, actionSubject, actionSubjectId, attributes = {}) => ({
@@ -12,7 +12,7 @@ export default {
12
12
  'fabric.elements.share.copypubliclink.button.text': 'Copy public link',
13
13
  'fabric.elements.share.failure.icon.label': 'Error icon',
14
14
  'fabric.elements.share.failure.message': 'Unable to share',
15
- 'fabric.elements.share.form.comment.placeholder': 'Add a message',
15
+ 'fabric.elements.share.form.comment.placeholder': 'Anything they should know?',
16
16
  'fabric.elements.share.form.info.message.no.invite.confluence': 'Recipients will see the name of the page and your message',
17
17
  'fabric.elements.share.form.info.message.no.invite.jira': 'Recipients will see the name of the issue and your message',
18
18
  'fabric.elements.share.form.no-permissions': 'You do not have the ability to share.',