@atlaskit/link-datasource 2.11.0 → 2.11.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/cjs/common/utils/response-item.js +18 -0
  3. package/dist/cjs/hooks/useDatasourceTableFlag.js +49 -0
  4. package/dist/cjs/state/actions/index.js +1 -1
  5. package/dist/cjs/ui/issue-like-table/index.js +11 -2
  6. package/dist/cjs/ui/issue-like-table/messages.js +15 -0
  7. package/dist/cjs/ui/issue-like-table/table-cell-content/index.js +61 -48
  8. package/dist/cjs/ui/issue-like-table/table-cell-content/inline-edit.js +13 -14
  9. package/dist/es2019/common/utils/response-item.js +6 -0
  10. package/dist/es2019/hooks/useDatasourceTableFlag.js +38 -0
  11. package/dist/es2019/state/actions/index.js +1 -1
  12. package/dist/es2019/ui/issue-like-table/index.js +12 -3
  13. package/dist/es2019/ui/issue-like-table/messages.js +15 -0
  14. package/dist/es2019/ui/issue-like-table/table-cell-content/index.js +61 -47
  15. package/dist/es2019/ui/issue-like-table/table-cell-content/inline-edit.js +14 -15
  16. package/dist/esm/common/utils/response-item.js +11 -0
  17. package/dist/esm/hooks/useDatasourceTableFlag.js +39 -0
  18. package/dist/esm/state/actions/index.js +1 -1
  19. package/dist/esm/ui/issue-like-table/index.js +12 -3
  20. package/dist/esm/ui/issue-like-table/messages.js +15 -0
  21. package/dist/esm/ui/issue-like-table/table-cell-content/index.js +60 -47
  22. package/dist/esm/ui/issue-like-table/table-cell-content/inline-edit.js +13 -14
  23. package/dist/types/common/utils/response-item.d.ts +2 -0
  24. package/dist/types/hooks/useDatasourceTableFlag.d.ts +8 -0
  25. package/dist/types/ui/common/modal/cancel-button/index.d.ts +1 -1
  26. package/dist/types/ui/common/modal/insert-button/index.d.ts +1 -1
  27. package/dist/types/ui/issue-like-table/messages.d.ts +15 -0
  28. package/dist/types/ui/issue-like-table/table-cell-content/index.d.ts +2 -1
  29. package/dist/types/ui/issue-like-table/table-cell-content/inline-edit.d.ts +4 -2
  30. package/dist/types-ts4.5/common/utils/response-item.d.ts +2 -0
  31. package/dist/types-ts4.5/hooks/useDatasourceTableFlag.d.ts +8 -0
  32. package/dist/types-ts4.5/ui/common/modal/cancel-button/index.d.ts +1 -1
  33. package/dist/types-ts4.5/ui/common/modal/insert-button/index.d.ts +1 -1
  34. package/dist/types-ts4.5/ui/issue-like-table/messages.d.ts +15 -0
  35. package/dist/types-ts4.5/ui/issue-like-table/table-cell-content/index.d.ts +2 -1
  36. package/dist/types-ts4.5/ui/issue-like-table/table-cell-content/inline-edit.d.ts +4 -2
  37. package/package.json +4 -3
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # @atlaskit/link-datasource
2
2
 
3
+ ## 2.11.2
4
+
5
+ ### Patch Changes
6
+
7
+ - [#131099](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/131099)
8
+ [`9762a9622c0a9`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/9762a9622c0a9) -
9
+ [ux] Add error flag on update inline edit fails
10
+
11
+ ## 2.11.1
12
+
13
+ ### Patch Changes
14
+
15
+ - [#125506](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/125506)
16
+ [`2c38223755a99`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/2c38223755a99) -
17
+ Fix isEditable field validation behind FF
18
+
3
19
  ## 2.11.0
4
20
 
5
21
  ### Minor Changes
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.getResourceUrl = void 0;
8
+ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
9
+ var isLink = function isLink(data) {
10
+ return (0, _typeof2.default)(data) === 'object' && 'url' in data;
11
+ };
12
+ var getLinkTypeUrl = function getLinkTypeUrl(data) {
13
+ return isLink(data) ? data.url : undefined;
14
+ };
15
+ var getResourceUrl = exports.getResourceUrl = function getResourceUrl(data) {
16
+ var _data$key, _data$title;
17
+ return getLinkTypeUrl(data === null || data === void 0 || (_data$key = data['key']) === null || _data$key === void 0 ? void 0 : _data$key.data) || getLinkTypeUrl(data === null || data === void 0 || (_data$title = data['title']) === null || _data$title === void 0 ? void 0 : _data$title.data);
18
+ };
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.useDatasourceTableFlag = void 0;
9
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
+ var _react = _interopRequireWildcard(require("react"));
11
+ var _reactIntlNext = require("react-intl-next");
12
+ var _uuid = _interopRequireDefault(require("uuid"));
13
+ var _flag = require("@atlaskit/flag");
14
+ var _crossCircle = _interopRequireDefault(require("@atlaskit/icon/glyph/cross-circle"));
15
+ var _messages = require("../ui/issue-like-table/messages");
16
+ 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); }
17
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(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 && Object.prototype.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; }
18
+ 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; }
19
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
20
+ var useDatasourceTableFlag = exports.useDatasourceTableFlag = function useDatasourceTableFlag(options) {
21
+ var _useFlags = (0, _flag.useFlags)(),
22
+ showFlag = _useFlags.showFlag;
23
+ var actions = (0, _react.useMemo)(function () {
24
+ var resourceLink = (options === null || options === void 0 ? void 0 : options.url) && {
25
+ content: /*#__PURE__*/_react.default.createElement(_reactIntlNext.FormattedMessage, _messages.issueLikeTableMessages.goToResourceLink),
26
+ href: options === null || options === void 0 ? void 0 : options.url,
27
+ target: '_blank'
28
+ };
29
+ return resourceLink ? [resourceLink] : undefined;
30
+ }, [options === null || options === void 0 ? void 0 : options.url]);
31
+ var showErrorFlag = (0, _react.useCallback)(function (args) {
32
+ showFlag(_objectSpread({
33
+ actions: actions,
34
+ description: /*#__PURE__*/_react.default.createElement(_reactIntlNext.FormattedMessage, _messages.issueLikeTableMessages.updateErrorGenericDescription),
35
+ // We need IconTile (currently in beta) in order to scale the new icon to 24px
36
+ // eslint-disable-next-line @atlaskit/design-system/no-legacy-icons
37
+ icon: /*#__PURE__*/_react.default.createElement(_crossCircle.default, {
38
+ label: "Error",
39
+ primaryColor: "var(--ds-icon-danger, #C9372C)"
40
+ }),
41
+ id: (0, _uuid.default)(),
42
+ isAutoDismiss: true,
43
+ title: /*#__PURE__*/_react.default.createElement(_reactIntlNext.FormattedMessage, _messages.issueLikeTableMessages.updateErrorGenericTitle)
44
+ }, args));
45
+ }, [actions, showFlag]);
46
+ return {
47
+ showErrorFlag: showErrorFlag
48
+ };
49
+ };
@@ -122,7 +122,7 @@ var getFieldUpdateActionByAri = function getFieldUpdateActionByAri(state, _ref3)
122
122
  fieldKey = _ref3.fieldKey,
123
123
  integrationKey = _ref3.integrationKey;
124
124
  var isEditable = (_state$permissions$ar = state.permissions[ari]) === null || _state$permissions$ar === void 0 || (_state$permissions$ar = _state$permissions$ar[fieldKey]) === null || _state$permissions$ar === void 0 ? void 0 : _state$permissions$ar.isEditable;
125
- if (isEditable === false) {
125
+ if (!isEditable) {
126
126
  return;
127
127
  }
128
128
  return (_state$actionsByInteg = state.actionsByIntegration[integrationKey]) === null || _state$actionsByInteg === void 0 ? void 0 : _state$actionsByInteg[fieldKey];
@@ -16,6 +16,7 @@ var _styled = _interopRequireDefault(require("@emotion/styled"));
16
16
  var _debounce = _interopRequireDefault(require("lodash/debounce"));
17
17
  var _reactIntlNext = require("react-intl-next");
18
18
  var _tinyInvariant = _interopRequireDefault(require("tiny-invariant"));
19
+ var _flag = require("@atlaskit/flag");
19
20
  var _linkingCommon = require("@atlaskit/linking-common");
20
21
  var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
21
22
  var _closestEdge = require("@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge");
@@ -471,7 +472,14 @@ var IssueLikeDataTableView = exports.IssueLikeDataTableView = function IssueLike
471
472
  return {
472
473
  key: key,
473
474
  columnKey: key,
474
- content: (0, _react2.jsx)(_tableCellContent.TableCellContent, {
475
+ // eslint-disable-next-line @atlaskit/platform/ensure-feature-flag-prefix
476
+ content: (0, _platformFeatureFlags.fg)('platform-datasources-enable-two-way-sync') ? (0, _react2.jsx)(_tableCellContent.TableCellContent, {
477
+ id: id,
478
+ columnKey: key,
479
+ columnType: type,
480
+ wrappedColumnKeys: wrappedColumnKeys,
481
+ renderItem: renderItem
482
+ }) : (0, _react2.jsx)(_tableCellContent.ReadOnlyCell, {
475
483
  id: id,
476
484
  columnKey: key,
477
485
  columnType: type,
@@ -585,7 +593,7 @@ var IssueLikeDataTableView = exports.IssueLikeDataTableView = function IssueLike
585
593
  }, _callee, null, [[3, 9]]);
586
594
  })), [experienceId, extensionKey, hasFullSchema, onLoadDatasourceDetails]);
587
595
  var isEditable = onVisibleColumnKeysChange && hasData;
588
- return (0, _react2.jsx)("div", {
596
+ var view = (0, _react2.jsx)("div", {
589
597
  /* There is required contentEditable={true} in editor-card-plugin
590
598
  * But this brakes how DND works. We set contentEditable={false} to allow DND to work
591
599
  * when dragging is initiated on top of a column label.
@@ -731,5 +739,6 @@ var IssueLikeDataTableView = exports.IssueLikeDataTableView = function IssueLike
731
739
  }
732
740
  }));
733
741
  }))));
742
+ return (0, _platformFeatureFlags.fg)('platform-datasources-enable-two-way-sync') ? (0, _react2.jsx)(_flag.FlagsProvider, null, view) : view;
734
743
  };
735
744
  var EmptyState = exports.EmptyState = _emptyState.default;
@@ -6,6 +6,21 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.issueLikeTableMessages = void 0;
7
7
  var _reactIntlNext = require("react-intl-next");
8
8
  var issueLikeTableMessages = exports.issueLikeTableMessages = (0, _reactIntlNext.defineMessages)({
9
+ goToResourceLink: {
10
+ id: 'linkDataSource.issue-line-table.go-to-resource.nonfinal',
11
+ description: 'Link to navigate to the resource page',
12
+ defaultMessage: 'Go to item'
13
+ },
14
+ updateErrorGenericDescription: {
15
+ id: 'linkDataSource.issue-line-table.error-generic-description.nonfinal',
16
+ description: 'Generic error message description shown when updating issue field fails',
17
+ defaultMessage: 'We had an issue trying to complete the update. Refresh the page and try again.'
18
+ },
19
+ updateErrorGenericTitle: {
20
+ id: 'linkDataSource.issue-line-table.error-generic-title.nonfinal',
21
+ description: 'Generic error message title shown when updating issue field fails',
22
+ defaultMessage: 'Something went wrong'
23
+ },
9
24
  wrapText: {
10
25
  id: 'linkDataSource.issue-line-table.wrap-text',
11
26
  description: 'Table header Dropdown item for making whole column to wrap text',
@@ -4,13 +4,13 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.TableCellContent = void 0;
7
+ exports.TableCellContent = exports.ReadOnlyCell = void 0;
8
8
  var _react = _interopRequireDefault(require("react"));
9
9
  var _reactIntlNext = require("react-intl-next");
10
- var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
11
10
  var _primitives = require("@atlaskit/primitives");
12
11
  var _tooltip = _interopRequireDefault(require("@atlaskit/tooltip"));
13
12
  var _state = require("../../../state");
13
+ var _actions = require("../../../state/actions");
14
14
  var _editType = require("../edit-type");
15
15
  var _renderType = require("../render-type");
16
16
  var _truncateTextTag = require("../truncate-text-tag");
@@ -47,7 +47,7 @@ var TooltipWrapper = function TooltipWrapper(_ref) {
47
47
  }
48
48
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, children);
49
49
  };
50
- var ReadOnlyCell = function ReadOnlyCell(_ref2) {
50
+ var ReadOnlyCell = exports.ReadOnlyCell = function ReadOnlyCell(_ref2) {
51
51
  var _useDatasourceItem, _rowData$columnKey;
52
52
  var id = _ref2.id,
53
53
  columnType = _ref2.columnType,
@@ -59,7 +59,7 @@ var ReadOnlyCell = function ReadOnlyCell(_ref2) {
59
59
  id: id
60
60
  })) === null || _useDatasourceItem === void 0 ? void 0 : _useDatasourceItem.data;
61
61
  if (!rowData || !columnKey || !rowData[columnKey]) {
62
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null);
62
+ return null;
63
63
  }
64
64
 
65
65
  // Need to make sure we keep falsy values like 0 and '', as well as the boolean false.
@@ -76,71 +76,84 @@ var ReadOnlyCell = function ReadOnlyCell(_ref2) {
76
76
  }, renderItem(datasourceTypeWithValues));
77
77
  };
78
78
  var InlineEditableCell = function InlineEditableCell(_ref3) {
79
- var _rowData$columnKey2;
80
- var id = _ref3.id,
79
+ var ari = _ref3.ari,
80
+ values = _ref3.values,
81
81
  columnKey = _ref3.columnKey,
82
- columnType = _ref3.columnType,
83
82
  renderItem = _ref3.renderItem,
83
+ integrationKey = _ref3.integrationKey,
84
84
  wrappedColumnKeys = _ref3.wrappedColumnKeys;
85
- var item = (0, _state.useDatasourceItem)({
86
- id: id
87
- });
88
- if (!item) {
89
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null);
90
- }
91
- var rowData = item.data,
92
- integrationKey = item.integrationKey,
93
- ari = item.ari;
94
- if (!rowData || !columnKey || !rowData[columnKey]) {
95
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null);
96
- }
97
-
98
- // Check if field is editable
99
- var isEditable = !!ari && !!integrationKey && (0, _editType.isEditTypeSupported)(columnType);
100
-
101
- // Need to make sure we keep falsy values like 0 and '', as well as the boolean false.
102
- var value = (_rowData$columnKey2 = rowData[columnKey]) === null || _rowData$columnKey2 === void 0 ? void 0 : _rowData$columnKey2.data;
103
- var values = Array.isArray(value) ? value : [value];
104
- var datasourceTypeWithValues = {
105
- type: columnType,
106
- values: values
107
- };
85
+ // Execute fn is only returned when the field is editable and the action schema exists
86
+ var _useExecuteAtomicActi = (0, _actions.useExecuteAtomicAction)({
87
+ ari: ari,
88
+ fieldKey: columnKey,
89
+ integrationKey: integrationKey
90
+ }),
91
+ execute = _useExecuteAtomicActi.execute;
92
+ var isEditable = !!execute;
108
93
  var readView = /*#__PURE__*/_react.default.createElement(TooltipWrapper, {
109
94
  columnKey: columnKey,
110
- datasourceTypeWithValues: datasourceTypeWithValues,
95
+ datasourceTypeWithValues: values,
111
96
  wrappedColumnKeys: wrappedColumnKeys
112
97
  }, /*#__PURE__*/_react.default.createElement(_primitives.Box, {
113
98
  testId: "inline-edit-read-view",
114
99
  paddingInline: isEditable ? 'space.075' : 'space.100',
115
100
  paddingBlock: "space.050",
116
101
  xcss: truncateTextStyles
117
- }, renderItem(datasourceTypeWithValues)));
118
- return isEditable ? /*#__PURE__*/_react.default.createElement(_inlineEdit.InlineEdit, {
102
+ }, renderItem(values)));
103
+ if (!isEditable) {
104
+ return readView;
105
+ }
106
+ return /*#__PURE__*/_react.default.createElement(_inlineEdit.InlineEdit, {
119
107
  ari: ari,
108
+ execute: execute,
109
+ readView: readView,
120
110
  columnKey: columnKey,
121
- datasourceTypeWithValues: datasourceTypeWithValues,
122
- readView: readView
123
- }) : readView;
111
+ datasourceTypeWithValues: values
112
+ });
124
113
  };
125
114
  var TableCellContent = exports.TableCellContent = function TableCellContent(_ref4) {
126
- var columnKey = _ref4.columnKey,
115
+ var id = _ref4.id,
116
+ columnKey = _ref4.columnKey,
127
117
  columnType = _ref4.columnType,
128
- id = _ref4.id,
129
118
  renderItem = _ref4.renderItem,
130
119
  wrappedColumnKeys = _ref4.wrappedColumnKeys;
131
- // eslint-disable-next-line @atlaskit/platform/ensure-feature-flag-prefix
132
- var renderedContent = (0, _platformFeatureFlags.fg)('platform-datasources-enable-two-way-sync') ? /*#__PURE__*/_react.default.createElement(InlineEditableCell, {
133
- id: id,
134
- columnKey: columnKey,
135
- columnType: columnType,
136
- renderItem: renderItem,
137
- wrappedColumnKeys: wrappedColumnKeys
138
- }) : /*#__PURE__*/_react.default.createElement(ReadOnlyCell, {
120
+ var item = (0, _state.useDatasourceItem)({
121
+ id: id
122
+ });
123
+ if (item) {
124
+ var integrationKey = item.integrationKey,
125
+ ari = item.ari,
126
+ rowData = item.data;
127
+ var isEditType = !!ari && !!integrationKey && rowData[columnKey] && (0, _editType.isEditTypeSupported)(columnType);
128
+ if (isEditType) {
129
+ var _rowData$columnKey2;
130
+ // Need to make sure we keep falsy values like 0 and '', as well as the boolean false.
131
+ var value = (_rowData$columnKey2 = rowData[columnKey]) === null || _rowData$columnKey2 === void 0 ? void 0 : _rowData$columnKey2.data;
132
+ var values = Array.isArray(value) ? value : [value];
133
+ var datasourceTypeWithValues = {
134
+ type: columnType,
135
+ values: values
136
+ };
137
+ return /*#__PURE__*/_react.default.createElement(InlineEditableCell, {
138
+ ari: ari,
139
+ columnKey: columnKey,
140
+ renderItem: renderItem,
141
+ integrationKey: integrationKey,
142
+ values: datasourceTypeWithValues,
143
+ wrappedColumnKeys: wrappedColumnKeys
144
+ });
145
+ }
146
+ }
147
+ return /*#__PURE__*/_react.default.createElement(_primitives.Box, {
148
+ testId: "inline-edit-read-view",
149
+ paddingInline: "space.100",
150
+ paddingBlock: "space.050",
151
+ xcss: truncateTextStyles
152
+ }, /*#__PURE__*/_react.default.createElement(ReadOnlyCell, {
139
153
  id: id,
140
154
  columnKey: columnKey,
141
155
  columnType: columnType,
142
156
  wrappedColumnKeys: wrappedColumnKeys,
143
157
  renderItem: renderItem
144
- });
145
- return renderedContent;
158
+ }));
146
159
  };
@@ -12,8 +12,9 @@ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/de
12
12
  var _react = _interopRequireWildcard(require("react"));
13
13
  var _inlineEdit = _interopRequireDefault(require("@atlaskit/inline-edit"));
14
14
  var _primitives = require("@atlaskit/primitives");
15
+ var _responseItem = require("../../../common/utils/response-item");
16
+ var _useDatasourceTableFlag = require("../../../hooks/useDatasourceTableFlag");
15
17
  var _state = require("../../../state");
16
- var _actions = require("../../../state/actions");
17
18
  var _editType = require("../edit-type");
18
19
  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); }
19
20
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(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 && Object.prototype.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; }
@@ -33,11 +34,11 @@ var mapUpdatedItem = function mapUpdatedItem(type, existingItem, columnKey, newV
33
34
  return null;
34
35
  };
35
36
  var InlineEdit = exports.InlineEdit = function InlineEdit(_ref) {
36
- var _item$integrationKey;
37
37
  var ari = _ref.ari,
38
+ execute = _ref.execute,
39
+ _readView = _ref.readView,
38
40
  columnKey = _ref.columnKey,
39
- datasourceTypeWithValues = _ref.datasourceTypeWithValues,
40
- _readView = _ref.readView;
41
+ datasourceTypeWithValues = _ref.datasourceTypeWithValues;
41
42
  var _useState = (0, _react.useState)(false),
42
43
  _useState2 = (0, _slicedToArray2.default)(_useState, 2),
43
44
  isEditing = _useState2[0],
@@ -45,16 +46,15 @@ var InlineEdit = exports.InlineEdit = function InlineEdit(_ref) {
45
46
  var item = (0, _state.useDatasourceItem)({
46
47
  id: ari
47
48
  });
49
+ var url = (0, _responseItem.getResourceUrl)(item === null || item === void 0 ? void 0 : item.data);
50
+ var _useDatasourceTableFl = (0, _useDatasourceTableFlag.useDatasourceTableFlag)({
51
+ url: url
52
+ }),
53
+ showErrorFlag = _useDatasourceTableFl.showErrorFlag;
48
54
  var _useDatasourceActions = (0, _state.useDatasourceActions)(),
49
55
  onUpdateItem = _useDatasourceActions.onUpdateItem;
50
- var _useExecuteAtomicActi = (0, _actions.useExecuteAtomicAction)({
51
- ari: ari,
52
- fieldKey: columnKey,
53
- integrationKey: (_item$integrationKey = item === null || item === void 0 ? void 0 : item.integrationKey) !== null && _item$integrationKey !== void 0 ? _item$integrationKey : ''
54
- }),
55
- execute = _useExecuteAtomicActi.execute;
56
56
  var onCommitUpdate = (0, _react.useCallback)(function (value) {
57
- if (!execute || !item) {
57
+ if (!item) {
58
58
  setIsEditing(false);
59
59
  return;
60
60
  }
@@ -66,12 +66,11 @@ var InlineEdit = exports.InlineEdit = function InlineEdit(_ref) {
66
66
  }
67
67
  onUpdateItem(ari, newItem);
68
68
  execute(value).catch(function (error) {
69
- // eslint-disable-next-line no-console
70
- console.error(error);
69
+ showErrorFlag();
71
70
  onUpdateItem(ari, existingData);
72
71
  });
73
72
  setIsEditing(false);
74
- }, [ari, execute, datasourceTypeWithValues, item, columnKey, onUpdateItem]);
73
+ }, [ari, execute, datasourceTypeWithValues, item, columnKey, onUpdateItem, showErrorFlag]);
75
74
  return /*#__PURE__*/_react.default.createElement(_primitives.Box, {
76
75
  xcss: containerStyles
77
76
  }, /*#__PURE__*/_react.default.createElement(_inlineEdit.default, (0, _extends2.default)({}, (0, _editType.editType)(datasourceTypeWithValues), {
@@ -0,0 +1,6 @@
1
+ const isLink = data => typeof data === 'object' && 'url' in data;
2
+ const getLinkTypeUrl = data => isLink(data) ? data.url : undefined;
3
+ export const getResourceUrl = data => {
4
+ var _data$key, _data$title;
5
+ return getLinkTypeUrl(data === null || data === void 0 ? void 0 : (_data$key = data['key']) === null || _data$key === void 0 ? void 0 : _data$key.data) || getLinkTypeUrl(data === null || data === void 0 ? void 0 : (_data$title = data['title']) === null || _data$title === void 0 ? void 0 : _data$title.data);
6
+ };
@@ -0,0 +1,38 @@
1
+ import React, { useCallback, useMemo } from 'react';
2
+ import { FormattedMessage } from 'react-intl-next';
3
+ import uuid from 'uuid';
4
+ import { useFlags } from '@atlaskit/flag';
5
+ import CrossCircleIcon from '@atlaskit/icon/glyph/cross-circle';
6
+ import { issueLikeTableMessages } from '../ui/issue-like-table/messages';
7
+ export const useDatasourceTableFlag = options => {
8
+ const {
9
+ showFlag
10
+ } = useFlags();
11
+ const actions = useMemo(() => {
12
+ const resourceLink = (options === null || options === void 0 ? void 0 : options.url) && {
13
+ content: /*#__PURE__*/React.createElement(FormattedMessage, issueLikeTableMessages.goToResourceLink),
14
+ href: options === null || options === void 0 ? void 0 : options.url,
15
+ target: '_blank'
16
+ };
17
+ return resourceLink ? [resourceLink] : undefined;
18
+ }, [options === null || options === void 0 ? void 0 : options.url]);
19
+ const showErrorFlag = useCallback(args => {
20
+ showFlag({
21
+ actions,
22
+ description: /*#__PURE__*/React.createElement(FormattedMessage, issueLikeTableMessages.updateErrorGenericDescription),
23
+ // We need IconTile (currently in beta) in order to scale the new icon to 24px
24
+ // eslint-disable-next-line @atlaskit/design-system/no-legacy-icons
25
+ icon: /*#__PURE__*/React.createElement(CrossCircleIcon, {
26
+ label: "Error",
27
+ primaryColor: "var(--ds-icon-danger, #C9372C)"
28
+ }),
29
+ id: uuid(),
30
+ isAutoDismiss: true,
31
+ title: /*#__PURE__*/React.createElement(FormattedMessage, issueLikeTableMessages.updateErrorGenericTitle),
32
+ ...args
33
+ });
34
+ }, [actions, showFlag]);
35
+ return {
36
+ showErrorFlag
37
+ };
38
+ };
@@ -103,7 +103,7 @@ const getFieldUpdateActionByAri = (state, {
103
103
  }) => {
104
104
  var _state$permissions$ar, _state$permissions$ar2, _state$actionsByInteg;
105
105
  const isEditable = (_state$permissions$ar = state.permissions[ari]) === null || _state$permissions$ar === void 0 ? void 0 : (_state$permissions$ar2 = _state$permissions$ar[fieldKey]) === null || _state$permissions$ar2 === void 0 ? void 0 : _state$permissions$ar2.isEditable;
106
- if (isEditable === false) {
106
+ if (!isEditable) {
107
107
  return;
108
108
  }
109
109
  return (_state$actionsByInteg = state.actionsByIntegration[integrationKey]) === null || _state$actionsByInteg === void 0 ? void 0 : _state$actionsByInteg[fieldKey];
@@ -11,6 +11,7 @@ import styled from '@emotion/styled';
11
11
  import debounce from 'lodash/debounce';
12
12
  import { useIntl } from 'react-intl-next';
13
13
  import invariant from 'tiny-invariant';
14
+ import { FlagsProvider } from '@atlaskit/flag';
14
15
  import { Skeleton } from '@atlaskit/linking-common';
15
16
  import { fg } from '@atlaskit/platform-feature-flags';
16
17
  import { extractClosestEdge } from '@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge';
@@ -31,7 +32,7 @@ import { DraggableTableHeading } from './draggable-table-heading';
31
32
  import TableEmptyState from './empty-state';
32
33
  import { renderType, stringifyType } from './render-type';
33
34
  import { InlineEditableTableCell, Table, TableCell, TableHeading, withTablePluginHeaderPrefix } from './styled';
34
- import { TableCellContent } from './table-cell-content';
35
+ import { ReadOnlyCell, TableCellContent } from './table-cell-content';
35
36
  import { TruncateTextTag } from './truncate-text-tag';
36
37
  import { useIsOnScreen } from './useIsOnScreen';
37
38
  import { COLUMN_BASE_WIDTH, getWidthCss } from './utils';
@@ -469,7 +470,14 @@ export const IssueLikeDataTableView = ({
469
470
  return {
470
471
  key,
471
472
  columnKey: key,
472
- content: jsx(TableCellContent, {
473
+ // eslint-disable-next-line @atlaskit/platform/ensure-feature-flag-prefix
474
+ content: fg('platform-datasources-enable-two-way-sync') ? jsx(TableCellContent, {
475
+ id: id,
476
+ columnKey: key,
477
+ columnType: type,
478
+ wrappedColumnKeys: wrappedColumnKeys,
479
+ renderItem: renderItem
480
+ }) : jsx(ReadOnlyCell, {
473
481
  id: id,
474
482
  columnKey: key,
475
483
  columnType: type,
@@ -556,7 +564,7 @@ export const IssueLikeDataTableView = ({
556
564
  }
557
565
  }, [experienceId, extensionKey, hasFullSchema, onLoadDatasourceDetails]);
558
566
  const isEditable = onVisibleColumnKeysChange && hasData;
559
- return jsx("div", {
567
+ const view = jsx("div", {
560
568
  /* There is required contentEditable={true} in editor-card-plugin
561
569
  * But this brakes how DND works. We set contentEditable={false} to allow DND to work
562
570
  * when dragging is initiated on top of a column label.
@@ -704,5 +712,6 @@ export const IssueLikeDataTableView = ({
704
712
  }, content);
705
713
  }
706
714
  }))))));
715
+ return fg('platform-datasources-enable-two-way-sync') ? jsx(FlagsProvider, null, view) : view;
707
716
  };
708
717
  export const EmptyState = TableEmptyState;
@@ -1,5 +1,20 @@
1
1
  import { defineMessages } from 'react-intl-next';
2
2
  export const issueLikeTableMessages = defineMessages({
3
+ goToResourceLink: {
4
+ id: 'linkDataSource.issue-line-table.go-to-resource.nonfinal',
5
+ description: 'Link to navigate to the resource page',
6
+ defaultMessage: 'Go to item'
7
+ },
8
+ updateErrorGenericDescription: {
9
+ id: 'linkDataSource.issue-line-table.error-generic-description.nonfinal',
10
+ description: 'Generic error message description shown when updating issue field fails',
11
+ defaultMessage: 'We had an issue trying to complete the update. Refresh the page and try again.'
12
+ },
13
+ updateErrorGenericTitle: {
14
+ id: 'linkDataSource.issue-line-table.error-generic-title.nonfinal',
15
+ description: 'Generic error message title shown when updating issue field fails',
16
+ defaultMessage: 'Something went wrong'
17
+ },
3
18
  wrapText: {
4
19
  id: 'linkDataSource.issue-line-table.wrap-text',
5
20
  description: 'Table header Dropdown item for making whole column to wrap text',