@atlaskit/link-datasource 3.13.14 → 3.13.16

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,20 @@
1
1
  # @atlaskit/link-datasource
2
2
 
3
+ ## 3.13.16
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies
8
+
9
+ ## 3.13.15
10
+
11
+ ### Patch Changes
12
+
13
+ - [#172253](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/172253)
14
+ [`2578ad0189e51`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/2578ad0189e51) -
15
+ [ux] Internal refactor behind ff - Allow inline edit on `user` column when previously unassigned.
16
+ Adds fallback Avatar unassigned user.
17
+
3
18
  ## 3.13.14
4
19
 
5
20
  ### Patch Changes
@@ -28,7 +28,6 @@ var modeSwitcherStyles = (0, _react2.css)({
28
28
  boxSizing: 'border-box',
29
29
  display: 'inline-flex',
30
30
  gap: "var(--ds-space-050, 4px)",
31
- lineHeight: "var(--ds-space-200, 16px)",
32
31
  padding: "var(--ds-space-050, 4px)",
33
32
  '&:disabled': {
34
33
  opacity: '0.5'
@@ -44,8 +43,8 @@ var modeInputStyles = (0, _react2.css)({
44
43
  });
45
44
  var modeSwitcherLabelStyles = (0, _react2.css)({
46
45
  color: "var(--ds-text-subtlest, ".concat(_colors.N700, ")"),
47
- fontSize: "var(--ds-space-150, 12px)",
48
- fontWeight: '600',
46
+ font: "var(--ds-font-body-UNSAFE_small, normal 400 12px/16px ui-sans-serif, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Ubuntu, system-ui, \"Helvetica Neue\", sans-serif)",
47
+ fontWeight: "var(--ds-font-weight-semibold, 600)",
49
48
  textTransform: 'uppercase',
50
49
  padding: "var(--ds-space-050, 4px)",
51
50
  borderRadius: "var(--ds-space-050, 4px)",
@@ -13,6 +13,7 @@ var _styled = _interopRequireDefault(require("@emotion/styled"));
13
13
  var _reactIntlNext = require("react-intl-next");
14
14
  var _avatar = _interopRequireDefault(require("@atlaskit/avatar"));
15
15
  var _avatarGroup = _interopRequireDefault(require("@atlaskit/avatar-group"));
16
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
16
17
  var _primitives = require("@atlaskit/primitives");
17
18
  var _widthDetector = require("@atlaskit/width-detector");
18
19
  var _styled2 = require("../../styled");
@@ -70,7 +71,13 @@ var UserType = function UserType(_ref) {
70
71
  _useState2 = (0, _slicedToArray2.default)(_useState, 2),
71
72
  width = _useState2[0],
72
73
  setWidth = _useState2[1];
73
- if (users.length <= 1) {
74
+ var multipleUsers = false;
75
+ if ((0, _platformFeatureFlags.fg)('platform-datasources-enable-two-way-sync-assignee')) {
76
+ multipleUsers = users.length === 1;
77
+ } else {
78
+ multipleUsers = users.length <= 1;
79
+ }
80
+ if (multipleUsers) {
74
81
  var _ref2 = users[0] || {},
75
82
  avatarSource = _ref2.avatarSource,
76
83
  _ref2$avatarSize = _ref2.avatarSize,
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.EmptyAvatar = void 0;
8
+ var _react = _interopRequireDefault(require("react"));
9
+ var _reactIntlNext = require("react-intl-next");
10
+ var _avatar = _interopRequireDefault(require("@atlaskit/avatar"));
11
+ var _primitives = require("@atlaskit/primitives");
12
+ var _tooltip = _interopRequireDefault(require("@atlaskit/tooltip"));
13
+ var _user = require("../../render-type/user");
14
+ var _messages = require("../../render-type/user/messages");
15
+ var userWrapperStyles = (0, _primitives.xcss)({
16
+ display: 'flex',
17
+ alignItems: 'center',
18
+ fontSize: 'font.body'
19
+ });
20
+ var avatarWrapperStyles = (0, _primitives.xcss)({
21
+ marginRight: 'space.100'
22
+ });
23
+ var emptyAvatarWrapperStyles = (0, _primitives.xcss)({
24
+ paddingBlock: 'space.050',
25
+ paddingInline: 'space.100',
26
+ opacity: 0,
27
+ ':hover': {
28
+ opacity: 1
29
+ }
30
+ });
31
+ var EmptyAvatar = exports.EmptyAvatar = function EmptyAvatar() {
32
+ var intl = (0, _reactIntlNext.useIntl)();
33
+ return /*#__PURE__*/_react.default.createElement(_tooltip.default, {
34
+ content: intl.formatMessage(_messages.userTypeMessages.userDefaultdisplayNameValue)
35
+ }, /*#__PURE__*/_react.default.createElement(_primitives.Box, {
36
+ xcss: [userWrapperStyles, emptyAvatarWrapperStyles],
37
+ testId: _user.USER_TYPE_TEST_ID
38
+ }, /*#__PURE__*/_react.default.createElement(_primitives.Box, {
39
+ xcss: avatarWrapperStyles
40
+ }, /*#__PURE__*/_react.default.createElement(_avatar.default, {
41
+ appearance: "circle",
42
+ size: 'small',
43
+ testId: "".concat(_user.USER_TYPE_TEST_ID, "--avatar")
44
+ })), /*#__PURE__*/_react.default.createElement(_reactIntlNext.FormattedMessage, _messages.userTypeMessages.userDefaultdisplayNameValue)));
45
+ };
@@ -124,12 +124,25 @@ var InlineEditableCell = function InlineEditableCell(_ref3) {
124
124
  datasourceTypeWithValues: values
125
125
  });
126
126
  };
127
- var TableCellContent = exports.TableCellContent = function TableCellContent(_ref4) {
128
- var id = _ref4.id,
127
+ var toDatasourceTypeWithValues = function toDatasourceTypeWithValues(_ref4) {
128
+ var _rowData$columnKey2;
129
+ var rowData = _ref4.rowData,
129
130
  columnKey = _ref4.columnKey,
130
- columnType = _ref4.columnType,
131
- renderItem = _ref4.renderItem,
132
- wrappedColumnKeys = _ref4.wrappedColumnKeys;
131
+ columnType = _ref4.columnType;
132
+ // Need to make sure we keep falsy values like 0 and '', as well as the boolean false.
133
+ var value = (_rowData$columnKey2 = rowData[columnKey]) === null || _rowData$columnKey2 === void 0 ? void 0 : _rowData$columnKey2.data;
134
+ var values = !value ? [] : Array.isArray(value) ? value : [value];
135
+ return {
136
+ type: columnType,
137
+ values: values
138
+ };
139
+ };
140
+ var TableCellContent = exports.TableCellContent = function TableCellContent(_ref5) {
141
+ var id = _ref5.id,
142
+ columnKey = _ref5.columnKey,
143
+ columnType = _ref5.columnType,
144
+ renderItem = _ref5.renderItem,
145
+ wrappedColumnKeys = _ref5.wrappedColumnKeys;
133
146
  var item = (0, _state.useDatasourceItem)({
134
147
  id: id
135
148
  });
@@ -137,22 +150,18 @@ var TableCellContent = exports.TableCellContent = function TableCellContent(_ref
137
150
  var integrationKey = item.integrationKey,
138
151
  ari = item.ari,
139
152
  rowData = item.data;
140
- var isEditType = !!ari && !!integrationKey && rowData[columnKey] && (0, _editType.isEditTypeSupported)(columnType);
153
+ var isEditType = !!ari && !!integrationKey && (0, _editType.isEditTypeSupported)(columnType);
141
154
  if (isEditType) {
142
- var _rowData$columnKey2;
143
- // Need to make sure we keep falsy values like 0 and '', as well as the boolean false.
144
- var value = (_rowData$columnKey2 = rowData[columnKey]) === null || _rowData$columnKey2 === void 0 ? void 0 : _rowData$columnKey2.data;
145
- var values = Array.isArray(value) ? value : [value];
146
- var datasourceTypeWithValues = {
147
- type: columnType,
148
- values: values
149
- };
150
155
  return /*#__PURE__*/_react.default.createElement(InlineEditableCell, {
151
156
  ari: ari,
152
157
  columnKey: columnKey,
153
158
  renderItem: renderItem,
154
159
  integrationKey: integrationKey,
155
- values: datasourceTypeWithValues,
160
+ values: toDatasourceTypeWithValues({
161
+ rowData: rowData,
162
+ columnKey: columnKey,
163
+ columnType: columnType
164
+ }),
156
165
  wrappedColumnKeys: wrappedColumnKeys
157
166
  });
158
167
  }
@@ -20,6 +20,7 @@ var _datasourceExperienceId = require("../../../contexts/datasource-experience-i
20
20
  var _useDatasourceTableFlag = require("../../../hooks/useDatasourceTableFlag");
21
21
  var _state = require("../../../state");
22
22
  var _editType = require("../edit-type");
23
+ var _avatar = require("../shared-components/avatar");
23
24
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
24
25
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof3(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
25
26
  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; }
@@ -59,7 +60,8 @@ var mapUpdatedItem = function mapUpdatedItem(existingItem, columnKey, newValue)
59
60
  return null;
60
61
  };
61
62
  var isNewValue = function isNewValue(columnKey, newItem, existingData) {
62
- return newItem[columnKey].data && newItem[columnKey].data !== existingData[columnKey].data;
63
+ var _newItem$columnKey, _existingData$columnK;
64
+ return ((_newItem$columnKey = newItem[columnKey]) === null || _newItem$columnKey === void 0 ? void 0 : _newItem$columnKey.data) && (!((_existingData$columnK = existingData[columnKey]) !== null && _existingData$columnK !== void 0 && _existingData$columnK.data) || newItem[columnKey].data !== existingData[columnKey].data);
63
65
  };
64
66
  var useRefreshDatasourceItem = function useRefreshDatasourceItem(item) {
65
67
  var _item$data;
@@ -79,7 +81,7 @@ var InlineEdit = exports.InlineEdit = function InlineEdit(_ref) {
79
81
  var ari = _ref.ari,
80
82
  execute = _ref.execute,
81
83
  executeFetch = _ref.executeFetch,
82
- _readView = _ref.readView,
84
+ readView = _ref.readView,
83
85
  columnKey = _ref.columnKey,
84
86
  datasourceTypeWithValues = _ref.datasourceTypeWithValues;
85
87
  var _useState = (0, _react.useState)(false),
@@ -160,9 +162,10 @@ var InlineEdit = exports.InlineEdit = function InlineEdit(_ref) {
160
162
  executeFetch: executeFetch
161
163
  }), {
162
164
  hideActionButtons: true,
163
- readView: function readView() {
164
- return _readView;
165
- },
165
+ readView: editableRenderType({
166
+ defaultValue: datasourceTypeWithValues,
167
+ readView: readView
168
+ }),
166
169
  readViewFitContainerWidth: true,
167
170
  isEditing: isEditing,
168
171
  onEdit: onEdit,
@@ -171,4 +174,25 @@ var InlineEdit = exports.InlineEdit = function InlineEdit(_ref) {
171
174
  return onCommitUpdate(editValues);
172
175
  }
173
176
  })));
177
+ };
178
+
179
+ /**
180
+ *
181
+ * This function allows us to manipulate the readView on editable cells.
182
+ * This way, for example, we can show a fallback Avatar on empty user cells.
183
+ *
184
+ */
185
+ var editableRenderType = function editableRenderType(_ref3) {
186
+ var defaultValue = _ref3.defaultValue,
187
+ readView = _ref3.readView;
188
+ return function () {
189
+ var _defaultValue$values;
190
+ switch (defaultValue.type) {
191
+ case 'user':
192
+ if (!((_defaultValue$values = defaultValue.values) !== null && _defaultValue$values !== void 0 && _defaultValue$values[0])) {
193
+ return /*#__PURE__*/_react.default.createElement(_avatar.EmptyAvatar, null);
194
+ }
195
+ }
196
+ return readView;
197
+ };
174
198
  };
@@ -20,7 +20,6 @@ const modeSwitcherStyles = css({
20
20
  boxSizing: 'border-box',
21
21
  display: 'inline-flex',
22
22
  gap: "var(--ds-space-050, 4px)",
23
- lineHeight: "var(--ds-space-200, 16px)",
24
23
  padding: "var(--ds-space-050, 4px)",
25
24
  '&:disabled': {
26
25
  opacity: '0.5'
@@ -36,8 +35,8 @@ const modeInputStyles = css({
36
35
  });
37
36
  const modeSwitcherLabelStyles = css({
38
37
  color: `var(--ds-text-subtlest, ${N700})`,
39
- fontSize: "var(--ds-space-150, 12px)",
40
- fontWeight: '600',
38
+ font: "var(--ds-font-body-UNSAFE_small, normal 400 12px/16px ui-sans-serif, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Ubuntu, system-ui, \"Helvetica Neue\", sans-serif)",
39
+ fontWeight: "var(--ds-font-weight-semibold, 600)",
41
40
  textTransform: 'uppercase',
42
41
  padding: `${"var(--ds-space-050, 4px)"}`,
43
42
  borderRadius: "var(--ds-space-050, 4px)",
@@ -11,6 +11,7 @@ import styled from '@emotion/styled';
11
11
  import { FormattedMessage } from 'react-intl-next';
12
12
  import Avatar from '@atlaskit/avatar';
13
13
  import AvatarGroup from '@atlaskit/avatar-group';
14
+ import { fg } from '@atlaskit/platform-feature-flags';
14
15
  import { Box, xcss } from '@atlaskit/primitives';
15
16
  import { WidthObserver } from '@atlaskit/width-detector';
16
17
  import { fieldTextFontSize } from '../../styled';
@@ -55,7 +56,13 @@ const UserType = ({
55
56
  users
56
57
  }) => {
57
58
  const [width, setWidth] = useState(null);
58
- if (users.length <= 1) {
59
+ let multipleUsers = false;
60
+ if (fg('platform-datasources-enable-two-way-sync-assignee')) {
61
+ multipleUsers = users.length === 1;
62
+ } else {
63
+ multipleUsers = users.length <= 1;
64
+ }
65
+ if (multipleUsers) {
59
66
  const {
60
67
  avatarSource,
61
68
  avatarSize = 'small',
@@ -0,0 +1,38 @@
1
+ import React from 'react';
2
+ import { FormattedMessage, useIntl } from 'react-intl-next';
3
+ import Avatar from '@atlaskit/avatar';
4
+ import { Box, xcss } from '@atlaskit/primitives';
5
+ import Tooltip from '@atlaskit/tooltip';
6
+ import { USER_TYPE_TEST_ID } from '../../render-type/user';
7
+ import { userTypeMessages } from '../../render-type/user/messages';
8
+ const userWrapperStyles = xcss({
9
+ display: 'flex',
10
+ alignItems: 'center',
11
+ fontSize: 'font.body'
12
+ });
13
+ const avatarWrapperStyles = xcss({
14
+ marginRight: 'space.100'
15
+ });
16
+ const emptyAvatarWrapperStyles = xcss({
17
+ paddingBlock: 'space.050',
18
+ paddingInline: 'space.100',
19
+ opacity: 0,
20
+ ':hover': {
21
+ opacity: 1
22
+ }
23
+ });
24
+ export const EmptyAvatar = () => {
25
+ const intl = useIntl();
26
+ return /*#__PURE__*/React.createElement(Tooltip, {
27
+ content: intl.formatMessage(userTypeMessages.userDefaultdisplayNameValue)
28
+ }, /*#__PURE__*/React.createElement(Box, {
29
+ xcss: [userWrapperStyles, emptyAvatarWrapperStyles],
30
+ testId: USER_TYPE_TEST_ID
31
+ }, /*#__PURE__*/React.createElement(Box, {
32
+ xcss: avatarWrapperStyles
33
+ }, /*#__PURE__*/React.createElement(Avatar, {
34
+ appearance: "circle",
35
+ size: 'small',
36
+ testId: `${USER_TYPE_TEST_ID}--avatar`
37
+ })), /*#__PURE__*/React.createElement(FormattedMessage, userTypeMessages.userDefaultdisplayNameValue)));
38
+ };
@@ -117,6 +117,20 @@ const InlineEditableCell = ({
117
117
  datasourceTypeWithValues: values
118
118
  });
119
119
  };
120
+ const toDatasourceTypeWithValues = ({
121
+ rowData,
122
+ columnKey,
123
+ columnType
124
+ }) => {
125
+ var _rowData$columnKey2;
126
+ // Need to make sure we keep falsy values like 0 and '', as well as the boolean false.
127
+ const value = (_rowData$columnKey2 = rowData[columnKey]) === null || _rowData$columnKey2 === void 0 ? void 0 : _rowData$columnKey2.data;
128
+ const values = !value ? [] : Array.isArray(value) ? value : [value];
129
+ return {
130
+ type: columnType,
131
+ values
132
+ };
133
+ };
120
134
  export const TableCellContent = ({
121
135
  id,
122
136
  columnKey,
@@ -133,22 +147,18 @@ export const TableCellContent = ({
133
147
  ari,
134
148
  data: rowData
135
149
  } = item;
136
- const isEditType = !!ari && !!integrationKey && rowData[columnKey] && isEditTypeSupported(columnType);
150
+ const isEditType = !!ari && !!integrationKey && isEditTypeSupported(columnType);
137
151
  if (isEditType) {
138
- var _rowData$columnKey2;
139
- // Need to make sure we keep falsy values like 0 and '', as well as the boolean false.
140
- const value = (_rowData$columnKey2 = rowData[columnKey]) === null || _rowData$columnKey2 === void 0 ? void 0 : _rowData$columnKey2.data;
141
- const values = Array.isArray(value) ? value : [value];
142
- const datasourceTypeWithValues = {
143
- type: columnType,
144
- values
145
- };
146
152
  return /*#__PURE__*/React.createElement(InlineEditableCell, {
147
153
  ari: ari,
148
154
  columnKey: columnKey,
149
155
  renderItem: renderItem,
150
156
  integrationKey: integrationKey,
151
- values: datasourceTypeWithValues,
157
+ values: toDatasourceTypeWithValues({
158
+ rowData,
159
+ columnKey,
160
+ columnType
161
+ }),
152
162
  wrappedColumnKeys: wrappedColumnKeys
153
163
  });
154
164
  }
@@ -9,6 +9,7 @@ import { useDatasourceExperienceId } from '../../../contexts/datasource-experien
9
9
  import { useDatasourceTableFlag } from '../../../hooks/useDatasourceTableFlag';
10
10
  import { useDatasourceActions, useDatasourceItem } from '../../../state';
11
11
  import { editType } from '../edit-type';
12
+ import { EmptyAvatar } from '../shared-components/avatar';
12
13
  export const InlineEditUFOExperience = 'inline-edit-rendered';
13
14
  const editContainerStyles = xcss({
14
15
  marginBlockStart: 'space.negative.100'
@@ -50,7 +51,8 @@ const mapUpdatedItem = (existingItem, columnKey, newValue) => {
50
51
  return null;
51
52
  };
52
53
  const isNewValue = (columnKey, newItem, existingData) => {
53
- return newItem[columnKey].data && newItem[columnKey].data !== existingData[columnKey].data;
54
+ var _newItem$columnKey, _existingData$columnK;
55
+ return ((_newItem$columnKey = newItem[columnKey]) === null || _newItem$columnKey === void 0 ? void 0 : _newItem$columnKey.data) && (!((_existingData$columnK = existingData[columnKey]) !== null && _existingData$columnK !== void 0 && _existingData$columnK.data) || newItem[columnKey].data !== existingData[columnKey].data);
54
56
  };
55
57
  const useRefreshDatasourceItem = item => {
56
58
  var _item$data, _item$data$key, _item$data$key$data;
@@ -150,11 +152,36 @@ export const InlineEdit = ({
150
152
  executeFetch
151
153
  }), {
152
154
  hideActionButtons: true,
153
- readView: () => readView,
155
+ readView: editableRenderType({
156
+ defaultValue: datasourceTypeWithValues,
157
+ readView
158
+ }),
154
159
  readViewFitContainerWidth: true,
155
160
  isEditing: isEditing,
156
161
  onEdit: onEdit,
157
162
  onCancel: onCancelEdit,
158
163
  onConfirm: () => onCommitUpdate(editValues)
159
164
  })));
165
+ };
166
+
167
+ /**
168
+ *
169
+ * This function allows us to manipulate the readView on editable cells.
170
+ * This way, for example, we can show a fallback Avatar on empty user cells.
171
+ *
172
+ */
173
+ const editableRenderType = ({
174
+ defaultValue,
175
+ readView
176
+ }) => {
177
+ return () => {
178
+ var _defaultValue$values;
179
+ switch (defaultValue.type) {
180
+ case 'user':
181
+ if (!((_defaultValue$values = defaultValue.values) !== null && _defaultValue$values !== void 0 && _defaultValue$values[0])) {
182
+ return /*#__PURE__*/React.createElement(EmptyAvatar, null);
183
+ }
184
+ }
185
+ return readView;
186
+ };
160
187
  };
@@ -20,7 +20,6 @@ var modeSwitcherStyles = css({
20
20
  boxSizing: 'border-box',
21
21
  display: 'inline-flex',
22
22
  gap: "var(--ds-space-050, 4px)",
23
- lineHeight: "var(--ds-space-200, 16px)",
24
23
  padding: "var(--ds-space-050, 4px)",
25
24
  '&:disabled': {
26
25
  opacity: '0.5'
@@ -36,8 +35,8 @@ var modeInputStyles = css({
36
35
  });
37
36
  var modeSwitcherLabelStyles = css({
38
37
  color: "var(--ds-text-subtlest, ".concat(N700, ")"),
39
- fontSize: "var(--ds-space-150, 12px)",
40
- fontWeight: '600',
38
+ font: "var(--ds-font-body-UNSAFE_small, normal 400 12px/16px ui-sans-serif, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Ubuntu, system-ui, \"Helvetica Neue\", sans-serif)",
39
+ fontWeight: "var(--ds-font-weight-semibold, 600)",
41
40
  textTransform: 'uppercase',
42
41
  padding: "var(--ds-space-050, 4px)",
43
42
  borderRadius: "var(--ds-space-050, 4px)",
@@ -12,6 +12,7 @@ import styled from '@emotion/styled';
12
12
  import { FormattedMessage } from 'react-intl-next';
13
13
  import Avatar from '@atlaskit/avatar';
14
14
  import AvatarGroup from '@atlaskit/avatar-group';
15
+ import { fg } from '@atlaskit/platform-feature-flags';
15
16
  import { Box, xcss } from '@atlaskit/primitives';
16
17
  import { WidthObserver } from '@atlaskit/width-detector';
17
18
  import { fieldTextFontSize } from '../../styled';
@@ -58,7 +59,13 @@ var UserType = function UserType(_ref) {
58
59
  _useState2 = _slicedToArray(_useState, 2),
59
60
  width = _useState2[0],
60
61
  setWidth = _useState2[1];
61
- if (users.length <= 1) {
62
+ var multipleUsers = false;
63
+ if (fg('platform-datasources-enable-two-way-sync-assignee')) {
64
+ multipleUsers = users.length === 1;
65
+ } else {
66
+ multipleUsers = users.length <= 1;
67
+ }
68
+ if (multipleUsers) {
62
69
  var _ref2 = users[0] || {},
63
70
  avatarSource = _ref2.avatarSource,
64
71
  _ref2$avatarSize = _ref2.avatarSize,
@@ -0,0 +1,38 @@
1
+ import React from 'react';
2
+ import { FormattedMessage, useIntl } from 'react-intl-next';
3
+ import Avatar from '@atlaskit/avatar';
4
+ import { Box, xcss } from '@atlaskit/primitives';
5
+ import Tooltip from '@atlaskit/tooltip';
6
+ import { USER_TYPE_TEST_ID } from '../../render-type/user';
7
+ import { userTypeMessages } from '../../render-type/user/messages';
8
+ var userWrapperStyles = xcss({
9
+ display: 'flex',
10
+ alignItems: 'center',
11
+ fontSize: 'font.body'
12
+ });
13
+ var avatarWrapperStyles = xcss({
14
+ marginRight: 'space.100'
15
+ });
16
+ var emptyAvatarWrapperStyles = xcss({
17
+ paddingBlock: 'space.050',
18
+ paddingInline: 'space.100',
19
+ opacity: 0,
20
+ ':hover': {
21
+ opacity: 1
22
+ }
23
+ });
24
+ export var EmptyAvatar = function EmptyAvatar() {
25
+ var intl = useIntl();
26
+ return /*#__PURE__*/React.createElement(Tooltip, {
27
+ content: intl.formatMessage(userTypeMessages.userDefaultdisplayNameValue)
28
+ }, /*#__PURE__*/React.createElement(Box, {
29
+ xcss: [userWrapperStyles, emptyAvatarWrapperStyles],
30
+ testId: USER_TYPE_TEST_ID
31
+ }, /*#__PURE__*/React.createElement(Box, {
32
+ xcss: avatarWrapperStyles
33
+ }, /*#__PURE__*/React.createElement(Avatar, {
34
+ appearance: "circle",
35
+ size: 'small',
36
+ testId: "".concat(USER_TYPE_TEST_ID, "--avatar")
37
+ })), /*#__PURE__*/React.createElement(FormattedMessage, userTypeMessages.userDefaultdisplayNameValue)));
38
+ };
@@ -117,12 +117,25 @@ var InlineEditableCell = function InlineEditableCell(_ref3) {
117
117
  datasourceTypeWithValues: values
118
118
  });
119
119
  };
120
- export var TableCellContent = function TableCellContent(_ref4) {
121
- var id = _ref4.id,
120
+ var toDatasourceTypeWithValues = function toDatasourceTypeWithValues(_ref4) {
121
+ var _rowData$columnKey2;
122
+ var rowData = _ref4.rowData,
122
123
  columnKey = _ref4.columnKey,
123
- columnType = _ref4.columnType,
124
- renderItem = _ref4.renderItem,
125
- wrappedColumnKeys = _ref4.wrappedColumnKeys;
124
+ columnType = _ref4.columnType;
125
+ // Need to make sure we keep falsy values like 0 and '', as well as the boolean false.
126
+ var value = (_rowData$columnKey2 = rowData[columnKey]) === null || _rowData$columnKey2 === void 0 ? void 0 : _rowData$columnKey2.data;
127
+ var values = !value ? [] : Array.isArray(value) ? value : [value];
128
+ return {
129
+ type: columnType,
130
+ values: values
131
+ };
132
+ };
133
+ export var TableCellContent = function TableCellContent(_ref5) {
134
+ var id = _ref5.id,
135
+ columnKey = _ref5.columnKey,
136
+ columnType = _ref5.columnType,
137
+ renderItem = _ref5.renderItem,
138
+ wrappedColumnKeys = _ref5.wrappedColumnKeys;
126
139
  var item = useDatasourceItem({
127
140
  id: id
128
141
  });
@@ -130,22 +143,18 @@ export var TableCellContent = function TableCellContent(_ref4) {
130
143
  var integrationKey = item.integrationKey,
131
144
  ari = item.ari,
132
145
  rowData = item.data;
133
- var isEditType = !!ari && !!integrationKey && rowData[columnKey] && isEditTypeSupported(columnType);
146
+ var isEditType = !!ari && !!integrationKey && isEditTypeSupported(columnType);
134
147
  if (isEditType) {
135
- var _rowData$columnKey2;
136
- // Need to make sure we keep falsy values like 0 and '', as well as the boolean false.
137
- var value = (_rowData$columnKey2 = rowData[columnKey]) === null || _rowData$columnKey2 === void 0 ? void 0 : _rowData$columnKey2.data;
138
- var values = Array.isArray(value) ? value : [value];
139
- var datasourceTypeWithValues = {
140
- type: columnType,
141
- values: values
142
- };
143
148
  return /*#__PURE__*/React.createElement(InlineEditableCell, {
144
149
  ari: ari,
145
150
  columnKey: columnKey,
146
151
  renderItem: renderItem,
147
152
  integrationKey: integrationKey,
148
- values: datasourceTypeWithValues,
153
+ values: toDatasourceTypeWithValues({
154
+ rowData: rowData,
155
+ columnKey: columnKey,
156
+ columnType: columnType
157
+ }),
149
158
  wrappedColumnKeys: wrappedColumnKeys
150
159
  });
151
160
  }
@@ -14,6 +14,7 @@ import { useDatasourceExperienceId } from '../../../contexts/datasource-experien
14
14
  import { useDatasourceTableFlag } from '../../../hooks/useDatasourceTableFlag';
15
15
  import { useDatasourceActions, useDatasourceItem } from '../../../state';
16
16
  import { editType } from '../edit-type';
17
+ import { EmptyAvatar } from '../shared-components/avatar';
17
18
  export var InlineEditUFOExperience = 'inline-edit-rendered';
18
19
  var editContainerStyles = xcss({
19
20
  marginBlockStart: 'space.negative.100'
@@ -49,7 +50,8 @@ var mapUpdatedItem = function mapUpdatedItem(existingItem, columnKey, newValue)
49
50
  return null;
50
51
  };
51
52
  var isNewValue = function isNewValue(columnKey, newItem, existingData) {
52
- return newItem[columnKey].data && newItem[columnKey].data !== existingData[columnKey].data;
53
+ var _newItem$columnKey, _existingData$columnK;
54
+ return ((_newItem$columnKey = newItem[columnKey]) === null || _newItem$columnKey === void 0 ? void 0 : _newItem$columnKey.data) && (!((_existingData$columnK = existingData[columnKey]) !== null && _existingData$columnK !== void 0 && _existingData$columnK.data) || newItem[columnKey].data !== existingData[columnKey].data);
53
55
  };
54
56
  var useRefreshDatasourceItem = function useRefreshDatasourceItem(item) {
55
57
  var _item$data;
@@ -69,7 +71,7 @@ export var InlineEdit = function InlineEdit(_ref) {
69
71
  var ari = _ref.ari,
70
72
  execute = _ref.execute,
71
73
  executeFetch = _ref.executeFetch,
72
- _readView = _ref.readView,
74
+ readView = _ref.readView,
73
75
  columnKey = _ref.columnKey,
74
76
  datasourceTypeWithValues = _ref.datasourceTypeWithValues;
75
77
  var _useState = useState(false),
@@ -150,9 +152,10 @@ export var InlineEdit = function InlineEdit(_ref) {
150
152
  executeFetch: executeFetch
151
153
  }), {
152
154
  hideActionButtons: true,
153
- readView: function readView() {
154
- return _readView;
155
- },
155
+ readView: editableRenderType({
156
+ defaultValue: datasourceTypeWithValues,
157
+ readView: readView
158
+ }),
156
159
  readViewFitContainerWidth: true,
157
160
  isEditing: isEditing,
158
161
  onEdit: onEdit,
@@ -161,4 +164,25 @@ export var InlineEdit = function InlineEdit(_ref) {
161
164
  return onCommitUpdate(editValues);
162
165
  }
163
166
  })));
167
+ };
168
+
169
+ /**
170
+ *
171
+ * This function allows us to manipulate the readView on editable cells.
172
+ * This way, for example, we can show a fallback Avatar on empty user cells.
173
+ *
174
+ */
175
+ var editableRenderType = function editableRenderType(_ref3) {
176
+ var defaultValue = _ref3.defaultValue,
177
+ readView = _ref3.readView;
178
+ return function () {
179
+ var _defaultValue$values;
180
+ switch (defaultValue.type) {
181
+ case 'user':
182
+ if (!((_defaultValue$values = defaultValue.values) !== null && _defaultValue$values !== void 0 && _defaultValue$values[0])) {
183
+ return /*#__PURE__*/React.createElement(EmptyAvatar, null);
184
+ }
185
+ }
186
+ return readView;
187
+ };
164
188
  };
@@ -0,0 +1,2 @@
1
+ /// <reference types="react" />
2
+ export declare const EmptyAvatar: () => JSX.Element;
@@ -0,0 +1,2 @@
1
+ /// <reference types="react" />
2
+ export declare const EmptyAvatar: () => JSX.Element;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/link-datasource",
3
- "version": "3.13.14",
3
+ "version": "3.13.16",
4
4
  "description": "UI Components to support linking platform dataset feature",
5
5
  "author": "Atlassian Pty Ltd",
6
6
  "license": "Apache-2.0",
@@ -71,13 +71,13 @@
71
71
  "@atlaskit/pragmatic-drag-and-drop-react-beautiful-dnd-autoscroll": "^1.2.0",
72
72
  "@atlaskit/pragmatic-drag-and-drop-react-drop-indicator": "^1.1.0",
73
73
  "@atlaskit/primitives": "^13.3.0",
74
- "@atlaskit/react-select": "^1.4.0",
75
- "@atlaskit/select": "^18.7.0",
74
+ "@atlaskit/react-select": "^1.5.0",
75
+ "@atlaskit/select": "^18.8.0",
76
76
  "@atlaskit/smart-card": "^32.5.0",
77
77
  "@atlaskit/smart-user-picker": "6.11.2",
78
78
  "@atlaskit/spinner": "^16.3.0",
79
79
  "@atlaskit/tag": "^12.6.0",
80
- "@atlaskit/textfield": "6.6.0",
80
+ "@atlaskit/textfield": "6.7.0",
81
81
  "@atlaskit/theme": "^14.0.0",
82
82
  "@atlaskit/tokens": "^2.4.0",
83
83
  "@atlaskit/tooltip": "^18.9.0",