@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 +15 -0
- package/dist/cjs/ui/common/modal/mode-switcher/index.js +2 -3
- package/dist/cjs/ui/issue-like-table/render-type/user/index.js +8 -1
- package/dist/cjs/ui/issue-like-table/shared-components/avatar/index.js +45 -0
- package/dist/cjs/ui/issue-like-table/table-cell-content/index.js +24 -15
- package/dist/cjs/ui/issue-like-table/table-cell-content/inline-edit.js +29 -5
- package/dist/es2019/ui/common/modal/mode-switcher/index.js +2 -3
- package/dist/es2019/ui/issue-like-table/render-type/user/index.js +8 -1
- package/dist/es2019/ui/issue-like-table/shared-components/avatar/index.js +38 -0
- package/dist/es2019/ui/issue-like-table/table-cell-content/index.js +20 -10
- package/dist/es2019/ui/issue-like-table/table-cell-content/inline-edit.js +29 -2
- package/dist/esm/ui/common/modal/mode-switcher/index.js +2 -3
- package/dist/esm/ui/issue-like-table/render-type/user/index.js +8 -1
- package/dist/esm/ui/issue-like-table/shared-components/avatar/index.js +38 -0
- package/dist/esm/ui/issue-like-table/table-cell-content/index.js +24 -15
- package/dist/esm/ui/issue-like-table/table-cell-content/inline-edit.js +29 -5
- package/dist/types/ui/issue-like-table/shared-components/avatar/index.d.ts +2 -0
- package/dist/types-ts4.5/ui/issue-like-table/shared-components/avatar/index.d.ts +2 -0
- package/package.json +4 -4
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
|
-
|
|
48
|
-
fontWeight:
|
|
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
|
-
|
|
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
|
|
128
|
-
var
|
|
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
|
-
|
|
132
|
-
|
|
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 &&
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
164
|
-
|
|
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
|
-
|
|
40
|
-
fontWeight:
|
|
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
|
-
|
|
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 &&
|
|
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:
|
|
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
|
-
|
|
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: (
|
|
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
|
-
|
|
40
|
-
fontWeight:
|
|
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
|
-
|
|
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
|
-
|
|
121
|
-
var
|
|
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
|
-
|
|
125
|
-
|
|
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 &&
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
154
|
-
|
|
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
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atlaskit/link-datasource",
|
|
3
|
-
"version": "3.13.
|
|
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.
|
|
75
|
-
"@atlaskit/select": "^18.
|
|
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.
|
|
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",
|