@reltio/components 1.4.817 → 1.4.821

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.
@@ -11,5 +11,5 @@ declare type Props = {
11
11
  messagesRef?: React.RefCallback<HTMLDivElement>;
12
12
  comment?: CommentType;
13
13
  };
14
- export declare const CollaborationItem: ({ uri, relatedObjectUris, objectType, classes, popperRef, messagesRef, comment }: Props) => JSX.Element;
14
+ export declare const CollaborationItem: React.MemoExoticComponent<({ uri, relatedObjectUris, objectType, classes, popperRef, messagesRef, comment }: Props) => JSX.Element>;
15
15
  export {};
@@ -29,7 +29,7 @@ var Comment_1 = require("./Comment/Comment");
29
29
  var RepliedComment_1 = require("./RepliedComment/RepliedComment");
30
30
  var SendMessageArea_1 = require("./SendMessageArea/SendMessageArea");
31
31
  var styles_1 = require("./styles");
32
- var CollaborationItem = function (_a) {
32
+ exports.CollaborationItem = react_1.memo(function (_a) {
33
33
  var uri = _a.uri, relatedObjectUris = _a.relatedObjectUris, objectType = _a.objectType, classes = _a.classes, popperRef = _a.popperRef, messagesRef = _a.messagesRef, comment = _a.comment;
34
34
  var inputRef = react_1.useRef();
35
35
  var styles = styles_1.useStyles({ classes: classes });
@@ -51,5 +51,4 @@ var CollaborationItem = function (_a) {
51
51
  react_1.default.createElement(Box_1.default, { className: styles.replies }, comment.replies.map(function (reply) { return (react_1.default.createElement(RepliedComment_1.RepliedComment, { key: reply.replyId, className: styles.repliedComment, reply: reply })); }))),
52
52
  sendMessageArea)),
53
53
  !comment && sendMessageArea));
54
- };
55
- exports.CollaborationItem = CollaborationItem;
54
+ });
@@ -61,8 +61,8 @@ var ComplexAttribute = function (_a) {
61
61
  crosswalks.map(function (crosswalk) { return (react_1.default.createElement(CrosswalkIcon_1.default, { key: mdm_sdk_1.getCrosswalkId(crosswalk), crosswalk: crosswalk, className: styles.crosswalkIcon })); })),
62
62
  react_1.default.createElement(index_1.Spacer, null),
63
63
  react_1.default.createElement("div", { className: styles.actions },
64
- showPin && react_1.default.createElement(PinButton_1.default, { isPinned: attributeValue.pin, onClick: function () { return onPin({ attributeValue: attributeValue }); } }),
65
- showIgnore && (react_1.default.createElement(IgnoreButton_1.default, { isIgnored: attributeValue.ignored, onClick: function () { return onIgnore({ attributeValue: attributeValue }); } })),
64
+ showPin && (react_1.default.createElement(PinButton_1.default, { disabled: !canEdit, isPinned: attributeValue.pin, onClick: function () { return onPin({ attributeValue: attributeValue }); } })),
65
+ showIgnore && (react_1.default.createElement(IgnoreButton_1.default, { disabled: !canEdit, isIgnored: attributeValue.ignored, onClick: function () { return onIgnore({ attributeValue: attributeValue }); } })),
66
66
  showDelete && (react_1.default.createElement(DeleteButton_1.default, { onClick: function () {
67
67
  return onDelete({
68
68
  attributeType: attributeType,
@@ -44,14 +44,21 @@ var SimpleAttribute = function (_a) {
44
44
  var _e = useAttributeState_1.useAttributeState(), isReadingMode = _e.isReadingMode, isEditingMode = _e.isEditingMode, isHovered = _e.isHovered, onMouseOver = _e.onMouseOver, onMouseOut = _e.onMouseOut, setReadingMode = _e.setReadingMode, setEditingMode = _e.setEditingMode;
45
45
  var containerRef = react_1.useRef();
46
46
  var id = mdm_sdk_1.getLastUriPart(attributeValue.uri);
47
- var canEdit = allowEdit && mdm_sdk_1.checkMetadataForUpdate(mdm_sdk_1.ModeTypes.EDITING, attributeType) && !attributeType.system;
48
- var canDelete = allowDelete && mdm_sdk_1.checkMetadataForDelete(mdm_sdk_1.ModeTypes.EDITING, attributeType) && !attributeType.system;
47
+ var crosswalkDisabled = mdm_sdk_1.isCrosswalkDisabled(crosswalk);
48
+ var canModifyAttribute = !attributeType.system && !crosswalkDisabled;
49
+ var canEdit = canModifyAttribute && allowEdit && mdm_sdk_1.checkMetadataForUpdate(mdm_sdk_1.ModeTypes.EDITING, attributeType);
50
+ var canDelete = canModifyAttribute && allowDelete && mdm_sdk_1.checkMetadataForDelete(mdm_sdk_1.ModeTypes.EDITING, attributeType);
49
51
  var isTemporary = mdm_sdk_1.isTempUri(attributeValue.uri);
50
52
  var showPin = !isTemporary && ((!isReadingMode && canEdit) || attributeValue.pin);
51
53
  var showIgnore = !isTemporary && ((!isReadingMode && canEdit) || attributeValue.ignored);
52
54
  var color = contexts_1.useCrosswalkColor(crosswalk);
53
55
  var _f = contexts_1.useCrosswalkHighlight(crosswalk), isHighlighted = _f.isHighlighted, isDimmed = _f.isDimmed, highlightCrosswalk = _f.highlightCrosswalk, removeHighlight = _f.removeHighlight;
54
- var styles = styles_1.useStyles({ isFilled: isHighlighted, isOpaque: !isDimmed, color: color });
56
+ var styles = styles_1.useStyles({
57
+ variant: crosswalkDisabled ? 'outlined' : 'filled',
58
+ opaque: !isDimmed,
59
+ fullyColored: isHighlighted,
60
+ color: color
61
+ });
55
62
  var actions = [
56
63
  {
57
64
  crosswalk: crosswalk,
@@ -88,8 +95,8 @@ var SimpleAttribute = function (_a) {
88
95
  react_1.default.createElement("div", { className: styles.attributeValue },
89
96
  react_1.default.createElement(DataTypeValue_1.default, { value: mdm_sdk_1.getAttributeValue(attributeValue), dataTypeDefinition: mdm_sdk_1.getAttrDataTypeDefinition(attributeType) })),
90
97
  react_1.default.createElement("div", { className: styles.actions },
91
- showPin && react_1.default.createElement(PinButton_1.default, { isPinned: attributeValue.pin, onClick: function () { return onPin({ attributeValue: attributeValue }); } }),
92
- showIgnore && (react_1.default.createElement(IgnoreButton_1.default, { isIgnored: attributeValue.ignored, onClick: function () { return onIgnore({ attributeValue: attributeValue }); } })),
98
+ showPin && (react_1.default.createElement(PinButton_1.default, { isPinned: attributeValue.pin, onClick: function () { return onPin({ attributeValue: attributeValue }); }, disabled: !canEdit })),
99
+ showIgnore && (react_1.default.createElement(IgnoreButton_1.default, { isIgnored: attributeValue.ignored, onClick: function () { return onIgnore({ attributeValue: attributeValue }); }, disabled: !canEdit })),
93
100
  isHovered && (react_1.default.createElement(DropDownMenuButton_1.default, { MenuItemRenderer: CrosswalkMenuItem_1.default, menuId: "simple-attribute-additional-actions-" + id, buttonComponent: SmallIconButton_1.SmallIconButtonWithTooltip, buttonProps: {
94
101
  icon: MoreVert_1.default,
95
102
  size: 'XS',
@@ -1,6 +1,7 @@
1
1
  declare type StylesProps = {
2
- isFilled: boolean;
3
- isOpaque: boolean;
2
+ variant: 'filled' | 'outlined';
3
+ fullyColored: boolean;
4
+ opaque: boolean;
4
5
  color: string;
5
6
  };
6
7
  export declare const useStyles: (props: StylesProps) => import("@material-ui/core/styles/withStyles").ClassNameMap<"attributeValue" | "root" | "actions">;
@@ -1,20 +1,45 @@
1
1
  "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
2
13
  Object.defineProperty(exports, "__esModule", { value: true });
3
14
  exports.useStyles = void 0;
4
15
  var styles_1 = require("@material-ui/core/styles");
5
16
  exports.useStyles = styles_1.makeStyles(function () { return ({
6
17
  root: function (_a) {
7
- var isFilled = _a.isFilled, isOpaque = _a.isOpaque, color = _a.color;
8
- return ({
9
- height: '28px',
18
+ var fullyColored = _a.fullyColored, opaque = _a.opaque, color = _a.color, variant = _a.variant;
19
+ return (__assign(__assign(__assign({ height: '28px' }, (variant === 'filled' && {
10
20
  borderRadius: '4px',
11
- background: isFilled ? color : "linear-gradient(to right, " + color + " 8px, rgba(0, 0, 0, 0.05) 8px)",
12
- display: 'flex',
13
- alignItems: 'center',
14
- maxWidth: '230px',
15
- opacity: isOpaque ? 1 : 0.38,
16
- transition: 'opacity 0.3s'
17
- });
21
+ background: fullyColored ? color : "linear-gradient(to right, " + color + " 8px, rgba(0,0,0,0.05) 8px)"
22
+ })), (variant === 'outlined' && {
23
+ '&::after': {
24
+ content: '""',
25
+ position: 'absolute',
26
+ background: color,
27
+ borderRadius: '4px 0px 0px 4px',
28
+ width: '8px',
29
+ height: '100%',
30
+ pointerEvents: 'none'
31
+ },
32
+ '&::before': {
33
+ content: '""',
34
+ position: 'absolute',
35
+ boxSizing: 'border-box',
36
+ borderRadius: '4px',
37
+ border: fullyColored ? color + " solid 2px" : 'rgba(0,0,0,0.12) solid 1px',
38
+ width: '100%',
39
+ height: '100%',
40
+ pointerEvents: 'none'
41
+ }
42
+ })), { display: 'flex', alignItems: 'center', maxWidth: '230px', opacity: opaque ? 1 : 0.38, transition: 'opacity 0.3s', position: 'relative' }));
18
43
  },
19
44
  attributeValue: {
20
45
  marginLeft: '16px',
@@ -2,6 +2,7 @@
2
2
  declare type Props = {
3
3
  isIgnored: boolean;
4
4
  onClick: () => void;
5
+ disabled?: boolean;
5
6
  };
6
- declare const IgnoreButton: ({ isIgnored, onClick }: Props) => JSX.Element;
7
+ declare const IgnoreButton: ({ isIgnored, onClick, disabled }: Props) => JSX.Element;
7
8
  export default IgnoreButton;
@@ -9,7 +9,7 @@ var Ignored_1 = __importDefault(require("../../../../icons/Ignored"));
9
9
  var IgnoredOutlined_1 = __importDefault(require("../../../../icons/IgnoredOutlined"));
10
10
  var ui_i18n_1 = __importDefault(require("ui-i18n"));
11
11
  var IgnoreButton = function (_a) {
12
- var isIgnored = _a.isIgnored, onClick = _a.onClick;
13
- return (react_1.default.createElement(SmallIconButton_1.SmallIconButtonWithTooltip, { icon: isIgnored ? Ignored_1.default : IgnoredOutlined_1.default, tooltipTitle: ui_i18n_1.default.text('Ignore'), onClick: onClick, size: "XS", disableRipple: true }));
12
+ var isIgnored = _a.isIgnored, onClick = _a.onClick, disabled = _a.disabled;
13
+ return (react_1.default.createElement(SmallIconButton_1.SmallIconButtonWithTooltip, { disabled: disabled, showForDisabled: true, icon: isIgnored ? Ignored_1.default : IgnoredOutlined_1.default, tooltipTitle: disabled ? ui_i18n_1.default.text("You don't have permissions to ignore") : ui_i18n_1.default.text('Ignore'), onClick: onClick, size: "XS", disableRipple: true }));
14
14
  };
15
15
  exports.default = IgnoreButton;
@@ -2,6 +2,7 @@
2
2
  declare type Props = {
3
3
  isPinned: boolean;
4
4
  onClick: () => void;
5
+ disabled?: boolean;
5
6
  };
6
- declare const PinButton: ({ isPinned, onClick }: Props) => JSX.Element;
7
+ declare const PinButton: ({ isPinned, onClick, disabled }: Props) => JSX.Element;
7
8
  export default PinButton;
@@ -9,7 +9,7 @@ var Pin_1 = __importDefault(require("../../../../icons/Pin"));
9
9
  var PinOutlined_1 = __importDefault(require("../../../../icons/PinOutlined"));
10
10
  var ui_i18n_1 = __importDefault(require("ui-i18n"));
11
11
  var PinButton = function (_a) {
12
- var isPinned = _a.isPinned, onClick = _a.onClick;
13
- return (react_1.default.createElement(SmallIconButton_1.SmallIconButtonWithTooltip, { onClick: onClick, icon: isPinned ? Pin_1.default : PinOutlined_1.default, tooltipTitle: ui_i18n_1.default.text('Pin'), size: "XS", disableRipple: true }));
12
+ var isPinned = _a.isPinned, onClick = _a.onClick, disabled = _a.disabled;
13
+ return (react_1.default.createElement(SmallIconButton_1.SmallIconButtonWithTooltip, { disabled: disabled, showForDisabled: true, onClick: onClick, icon: isPinned ? Pin_1.default : PinOutlined_1.default, tooltipTitle: disabled ? "You don't have permissions to pin" : ui_i18n_1.default.text('Pin'), size: "XS", disableRipple: true }));
14
14
  };
15
15
  exports.default = PinButton;
@@ -16,15 +16,19 @@ describe('Ignore button test', function () {
16
16
  onClickFn = jest.fn();
17
17
  component = enzyme_1.mount(react_1.default.createElement(IgnoreButton_1.default, { isIgnored: false, onClick: onClickFn }));
18
18
  });
19
- it('should render correctly', function () {
20
- expect(getButton(component).props()).toMatchObject({
21
- tooltipTitle: 'Ignore',
22
- onClick: onClickFn
23
- });
19
+ it('should pass button props correctly', function () {
20
+ expect(getButton(component).prop('onClick')).toBe(onClickFn);
21
+ component.setProps({ disabled: true });
22
+ expect(getButton(component).prop('disabled')).toBe(true);
24
23
  });
25
24
  it('should show correct icon', function () {
26
25
  expect(getButton(component).prop('icon')).toBe(IgnoredOutlined_1.default);
27
26
  component.setProps({ isIgnored: true });
28
27
  expect(getButton(component).prop('icon')).toBe(Ignored_1.default);
29
28
  });
29
+ it('should show correct tooltip', function () {
30
+ expect(getButton(component).prop('tooltipTitle')).toBe('Ignore');
31
+ component.setProps({ disabled: true });
32
+ expect(getButton(component).prop('tooltipTitle')).toBe("You don't have permissions to ignore");
33
+ });
30
34
  });
@@ -16,15 +16,19 @@ describe('Pin button test', function () {
16
16
  onClickFn = jest.fn();
17
17
  component = enzyme_1.mount(react_1.default.createElement(PinButton_1.default, { isPinned: false, onClick: onClickFn }));
18
18
  });
19
- it('should render correctly', function () {
20
- expect(getButton(component).props()).toMatchObject({
21
- tooltipTitle: 'Pin',
22
- onClick: onClickFn
23
- });
19
+ it('should pass button props correctly', function () {
20
+ expect(getButton(component).prop('onClick')).toBe(onClickFn);
21
+ component.setProps({ disabled: true });
22
+ expect(getButton(component).prop('disabled')).toBe(true);
24
23
  });
25
24
  it('should show correct icon', function () {
26
25
  expect(getButton(component).prop('icon')).toBe(PinOutlined_1.default);
27
26
  component.setProps({ isPinned: true });
28
27
  expect(getButton(component).prop('icon')).toBe(Pin_1.default);
29
28
  });
29
+ it('should show correct tooltip', function () {
30
+ expect(getButton(component).prop('tooltipTitle')).toBe('Pin');
31
+ component.setProps({ disabled: true });
32
+ expect(getButton(component).prop('tooltipTitle')).toBe("You don't have permissions to pin");
33
+ });
30
34
  });
@@ -2,5 +2,6 @@ import React from 'react';
2
2
  declare const ColoredBlock: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & {
3
3
  color: string;
4
4
  opacity?: number;
5
+ variant?: 'filled' | 'outlined';
5
6
  } & React.RefAttributes<HTMLDivElement>>;
6
7
  export default ColoredBlock;
@@ -48,8 +48,8 @@ var react_1 = __importStar(require("react"));
48
48
  var classnames_1 = __importDefault(require("classnames"));
49
49
  var styles_1 = require("./styles");
50
50
  var ColoredBlock = react_1.forwardRef(function (_a, ref) {
51
- var color = _a.color, opacity = _a.opacity, children = _a.children, className = _a.className, props = __rest(_a, ["color", "opacity", "children", "className"]);
52
- var styles = styles_1.useColoredItemStyles({ color: color, opacity: opacity });
51
+ var color = _a.color, opacity = _a.opacity, _b = _a.variant, variant = _b === void 0 ? 'filled' : _b, children = _a.children, className = _a.className, props = __rest(_a, ["color", "opacity", "variant", "children", "className"]);
52
+ var styles = styles_1.useColoredItemStyles({ color: color, opacity: opacity, variant: variant });
53
53
  return (react_1.default.createElement("div", __assign({ ref: ref, className: classnames_1.default(styles.item, className) }, props), children));
54
54
  });
55
55
  exports.default = ColoredBlock;
@@ -1,6 +1,7 @@
1
1
  declare type StylesProps = {
2
2
  color?: string;
3
3
  opacity?: number;
4
+ variant: 'filled' | 'outlined';
4
5
  };
5
6
  export declare const useColoredItemStyles: (props: StylesProps) => import("@material-ui/core/styles/withStyles").ClassNameMap<"item">;
6
7
  export {};
@@ -1,14 +1,21 @@
1
1
  "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
2
13
  Object.defineProperty(exports, "__esModule", { value: true });
3
14
  exports.useColoredItemStyles = void 0;
4
15
  var styles_1 = require("@material-ui/core/styles");
5
16
  exports.useColoredItemStyles = styles_1.makeStyles({
6
17
  item: function (_a) {
7
- var color = _a.color, opacity = _a.opacity;
8
- return ({
9
- backgroundColor: color,
10
- opacity: opacity,
11
- transition: 'opacity 0.3s'
12
- });
18
+ var color = _a.color, opacity = _a.opacity, variant = _a.variant;
19
+ return (__assign(__assign(__assign({}, (variant === 'filled' && { backgroundColor: color })), (variant === 'outlined' && { border: color + " solid 2px" })), { opacity: opacity, transition: 'opacity 0.3s', boxSizing: 'border-box' }));
13
20
  }
14
21
  });
@@ -57,14 +57,15 @@ var CrosswalkRow = function (_a) {
57
57
  var metadata = react_redux_1.useSelector(mdm_module_1.default.selectors.getMetadata);
58
58
  var sourceSystemLabel = mdm_sdk_1.getSourceSystemLabel(metadata, crosswalk.type);
59
59
  var crosswalkId = mdm_sdk_1.getLastUriPart(crosswalk.uri);
60
+ var crosswalkDisabled = mdm_sdk_1.isCrosswalkDisabled(crosswalk);
60
61
  var _j = react_dnd_1.useDrag({
61
62
  item: {
62
63
  type: 'Crosswalk',
63
64
  crosswalk: crosswalk
64
65
  },
65
- canDrag: !mdm_sdk_1.isCrosswalkDisabled(crosswalk)
66
+ canDrag: !crosswalkDisabled
66
67
  }), drag = _j[1], preview = _j[2];
67
- var canDelete = !mdm_sdk_1.isCrosswalkDisabled(crosswalk) && crosswalk.ownerType !== 'relation';
68
+ var canDelete = !crosswalkDisabled && crosswalk.ownerType !== 'relation';
68
69
  react_1.useEffect(function () {
69
70
  preview(react_dnd_html5_backend_1.getEmptyImage(), { captureDraggingState: true });
70
71
  }, []);
@@ -85,7 +86,7 @@ var CrosswalkRow = function (_a) {
85
86
  return (react_1.default.createElement("div", { className: styles.root, ref: ref },
86
87
  react_1.default.createElement(SmallIconButton_1.SmallIconButtonWithTooltip, { size: "XXS", className: styles.focusedIcon, icon: focusable && Visibility_1.default, onClick: function () { return toggleCrosswalkFocus(); }, disabled: !focusable, tooltipTitle: focusable && ui_i18n_1.default.text('Focus') }),
87
88
  react_1.default.createElement("div", { className: styles.crosswalkWrapper },
88
- react_1.default.createElement(ColoredBlock_1.default, { ref: drag, className: styles.header, color: color, onMouseEnter: function () { return highlightCrosswalk(); }, onMouseLeave: function () { return removeHighlight(); } },
89
+ react_1.default.createElement(ColoredBlock_1.default, { ref: drag, className: styles.header, color: color, variant: crosswalkDisabled ? 'outlined' : 'filled', onMouseEnter: function () { return highlightCrosswalk(); }, onMouseLeave: function () { return removeHighlight(); } },
89
90
  isDependent && react_1.default.createElement(NestedAttribute_1.default, { className: styles.dependentIcon }),
90
91
  react_1.default.createElement(ArrowExpandButton_1.default, { onClick: function () { return setExpanded(function (value) { return !value; }); }, expanded: expanded }),
91
92
  react_1.default.createElement(SourceIcon_1.default, { className: styles.sourceIcon, sourceType: crosswalk.type }),
@@ -3,7 +3,9 @@ import { CollaborationObjectTypes, Comment, CommentsMap, Reply } from '@reltio/m
3
3
  export declare const CollaborationContext: React.Context<{
4
4
  objectTypes?: CollaborationObjectTypes[];
5
5
  commentsMap: CommentsMap;
6
+ comments: Comment[];
6
7
  currentComment: Comment;
8
+ getComments: (uri: string, pageToken?: string) => void;
7
9
  getComment: (commentId: Comment['commentId']) => void;
8
10
  createComment: (params: Pick<Comment, 'content' | 'namedUsers' | 'objectType' | 'relatedObjectUris'> & {
9
11
  uri: string;
@@ -29,4 +31,5 @@ export declare const CollaborationContext: React.Context<{
29
31
  clearCurrentComment: () => void;
30
32
  sending: boolean;
31
33
  loading: boolean;
34
+ pageToken: string;
32
35
  }>;
@@ -7,9 +7,11 @@ exports.CollaborationContext = void 0;
7
7
  var react_1 = __importDefault(require("react"));
8
8
  var noop = function () { };
9
9
  exports.CollaborationContext = react_1.default.createContext({
10
+ comments: [],
10
11
  commentsMap: null,
11
12
  currentComment: null,
12
13
  getComment: noop,
14
+ getComments: function () { return new Promise(noop); },
13
15
  createComment: function () { return new Promise(noop); },
14
16
  editComment: function () { return new Promise(noop); },
15
17
  createReply: function () { return new Promise(noop); },
@@ -18,6 +20,7 @@ exports.CollaborationContext = react_1.default.createContext({
18
20
  clearCurrentComment: noop,
19
21
  deleteComment: noop,
20
22
  sending: false,
21
- loading: false
23
+ loading: false,
24
+ pageToken: null
22
25
  });
23
26
  exports.CollaborationContext.displayName = 'CollaborationContext';
@@ -2,6 +2,7 @@ import { CollaborationObjectTypes, Comment, CommentsMap } from '@reltio/mdm-sdk'
2
2
  export declare const useCollaboration: (objectIds?: string[], objectTypes?: CollaborationObjectTypes[]) => {
3
3
  commentsMap: CommentsMap;
4
4
  currentComment: Comment;
5
+ comments: Comment[];
5
6
  getComment: (commentId: string) => void;
6
7
  createReply: ({ content, namedUsers, commentId, action, uri }: any) => Promise<void>;
7
8
  editComment: ({ content, namedUsers, objectType, uri, relatedObjectUris, commentId, replies }: any) => Promise<void>;
@@ -13,4 +14,6 @@ export declare const useCollaboration: (objectIds?: string[], objectTypes?: Coll
13
14
  sending: boolean;
14
15
  loading: boolean;
15
16
  objectTypes: CollaborationObjectTypes[];
17
+ getComments: (relatedObjectUri: string, pageToken?: string) => void;
18
+ pageToken: string;
16
19
  };
@@ -33,10 +33,12 @@ var useCollaboration = function (objectIds, objectTypes) {
33
33
  var tenant = react_redux_1.useSelector(mdm_module_1.default.selectors.getTenant);
34
34
  var collaborationPath = react_redux_1.useSelector(mdm_module_1.default.selectors.getCollaborationPath);
35
35
  var isCollaborationEnabled = react_redux_1.useSelector(mdm_module_1.default.selectors.isCollaborationEnabled);
36
- var _a = react_1.useState(null), commentsMap = _a[0], setCommentsMap = _a[1];
37
- var _b = react_1.useState(null), currentComment = _b[0], setCurrentComment = _b[1];
38
- var _c = react_1.useState(false), sending = _c[0], setSending = _c[1];
39
- var _d = react_1.useState(false), loading = _d[0], setLoading = _d[1];
36
+ var _a = react_1.useState(null), pageToken = _a[0], setPageToken = _a[1];
37
+ var _b = react_1.useState([]), comments = _b[0], setComments = _b[1];
38
+ var _c = react_1.useState(null), commentsMap = _c[0], setCommentsMap = _c[1];
39
+ var _d = react_1.useState(null), currentComment = _d[0], setCurrentComment = _d[1];
40
+ var _e = react_1.useState(false), sending = _e[0], setSending = _e[1];
41
+ var _f = react_1.useState(false), loading = _f[0], setLoading = _f[1];
40
42
  react_1.useEffect(function () {
41
43
  if (isCollaborationEnabled && entity) {
42
44
  var onError = function (e) {
@@ -49,6 +51,20 @@ var useCollaboration = function (objectIds, objectTypes) {
49
51
  setCommentsMap(null);
50
52
  }
51
53
  }, [entity, isCollaborationEnabled, tenant, collaborationPath, objectIds]);
54
+ var getComments = react_1.useCallback(function (relatedObjectUri, pageToken) {
55
+ mdm_sdk_1.getComments({ collaborationPath: collaborationPath, tenant: tenant, relatedObjectUri: relatedObjectUri, pageToken: pageToken })
56
+ .then(function (_a) {
57
+ var items = _a.items, nextPageToken = _a.nextPageToken;
58
+ setComments(function (prevComments) {
59
+ if (!pageToken) {
60
+ return items;
61
+ }
62
+ return ramda_1.uniqBy(ramda_1.prop('commentId'), __spreadArray(__spreadArray([], prevComments), items));
63
+ });
64
+ setPageToken(nextPageToken);
65
+ })
66
+ .catch(catchErrorInRequest);
67
+ }, [collaborationPath, tenant]);
52
68
  var getComment = react_1.useCallback(function (commentId) {
53
69
  setLoading(true);
54
70
  mdm_sdk_1.getComment({ collaborationPath: collaborationPath, tenant: tenant, commentId: commentId })
@@ -62,17 +78,11 @@ var useCollaboration = function (objectIds, objectTypes) {
62
78
  var _a;
63
79
  return __assign(__assign({}, prevCommentsMap), (_a = {}, _a[uri] = __spreadArray(__spreadArray([], (prevCommentsMap[uri] || [])), [{ commentId: comment.commentId, replies: 0, status: 'open' }]), _a));
64
80
  });
81
+ setComments(function (prevComments) { return __spreadArray([comment], prevComments); });
65
82
  };
66
- var updateCommentInState = function (comment, uri) {
83
+ var updateCommentInState = function (comment) {
67
84
  setCurrentComment(comment);
68
- setCommentsMap(function (prevCommentsMap) {
69
- var _a;
70
- var comments = (prevCommentsMap[uri] || []).map(function (c) {
71
- return c.commentId === comment.commentId
72
- ? __assign(__assign({}, comment), { replies: (typeof comment.replies === 'number' ? comment.replies : comment.replies.length) || 0 }) : c;
73
- });
74
- return __assign(__assign({}, prevCommentsMap), (_a = {}, _a[uri] = comments, _a));
75
- });
85
+ setComments(ramda_1.map(ramda_1.when(ramda_1.propEq('commentId', comment.commentId), ramda_1.always(comment))));
76
86
  };
77
87
  var deleteCommentFromState = function (commentId, uri) {
78
88
  setCurrentComment(null);
@@ -81,6 +91,9 @@ var useCollaboration = function (objectIds, objectTypes) {
81
91
  var comments = prevCommentsMap[uri] || [];
82
92
  return __assign(__assign({}, prevCommentsMap), (_a = {}, _a[uri] = comments.filter(function (c) { return c.commentId !== commentId; }), _a));
83
93
  });
94
+ setComments(function (prevComments) {
95
+ return prevComments.filter(function (comment) { return comment.commentId !== commentId; });
96
+ });
84
97
  };
85
98
  var createComment = react_1.useCallback(function (_a) {
86
99
  var content = _a.content, namedUsers = _a.namedUsers, objectType = _a.objectType, uri = _a.uri, relatedObjectUris = _a.relatedObjectUris;
@@ -117,7 +130,7 @@ var useCollaboration = function (objectIds, objectTypes) {
117
130
  replies: replies
118
131
  };
119
132
  return mdm_sdk_1.updateComment({ collaborationPath: collaborationPath, tenant: tenant, data: data })
120
- .then(function (comment) { return updateCommentInState(__assign(__assign({}, comment), { replies: replies }), uri); })
133
+ .then(function (comment) { return updateCommentInState(__assign(__assign({}, comment), { replies: replies })); })
121
134
  .catch(catchErrorInRequest)
122
135
  .finally(function () { return setSending(false); });
123
136
  }, [collaborationPath, tenant]);
@@ -129,7 +142,7 @@ var useCollaboration = function (objectIds, objectTypes) {
129
142
  .catch(catchErrorInRequest)
130
143
  .finally(function () { return setSending(false); });
131
144
  }, [collaborationPath, tenant]);
132
- var updateReply = react_1.useCallback(function (reply, uri, commentId) {
145
+ var updateReplyInState = react_1.useCallback(function (reply, uri, commentId) {
133
146
  var newStatus = reply.action === 'resolve' ? 'resolved' : 'open';
134
147
  if (newStatus === 'resolved') {
135
148
  setCurrentComment(function (prevCurrentComment) {
@@ -154,6 +167,14 @@ var useCollaboration = function (objectIds, objectTypes) {
154
167
  return comment;
155
168
  }), _a)));
156
169
  });
170
+ setComments(function (prevComments) {
171
+ return prevComments.map(function (comment) {
172
+ if (comment.commentId === commentId) {
173
+ return __assign(__assign({}, comment), { status: newStatus, replies: __spreadArray(__spreadArray([], comment.replies), [reply]) });
174
+ }
175
+ return comment;
176
+ });
177
+ });
157
178
  }, []);
158
179
  var createReply = react_1.useCallback(function (_a) {
159
180
  var content = _a.content, namedUsers = _a.namedUsers, commentId = _a.commentId, action = _a.action, uri = _a.uri;
@@ -166,11 +187,11 @@ var useCollaboration = function (objectIds, objectTypes) {
166
187
  return mdm_sdk_1.createReply({ collaborationPath: collaborationPath, tenant: tenant, commentId: commentId, data: data })
167
188
  .then(function (_a) {
168
189
  var reply = _a[0];
169
- return updateReply(reply, uri, commentId);
190
+ return updateReplyInState(reply, uri, commentId);
170
191
  })
171
192
  .catch(catchErrorInRequest)
172
193
  .finally(function () { return setSending(false); });
173
- }, [collaborationPath, tenant, updateReply]);
194
+ }, [collaborationPath, tenant, updateReplyInState]);
174
195
  var resolveThread = react_1.useCallback(function (_a) {
175
196
  var commentId = _a.commentId, uri = _a.uri;
176
197
  createReply({ content: '', namedUsers: [], commentId: commentId, action: 'resolve', uri: uri });
@@ -185,6 +206,7 @@ var useCollaboration = function (objectIds, objectTypes) {
185
206
  return {
186
207
  commentsMap: commentsMap,
187
208
  currentComment: currentComment,
209
+ comments: comments,
188
210
  getComment: getComment,
189
211
  createReply: createReply,
190
212
  editComment: editComment,
@@ -195,7 +217,9 @@ var useCollaboration = function (objectIds, objectTypes) {
195
217
  reOpenThread: reOpenThread,
196
218
  sending: sending,
197
219
  loading: loading,
198
- objectTypes: objectTypes
220
+ objectTypes: objectTypes,
221
+ getComments: getComments,
222
+ pageToken: pageToken
199
223
  };
200
224
  };
201
225
  exports.useCollaboration = useCollaboration;
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@reltio/components",
3
- "version": "1.4.817",
3
+ "version": "1.4.821",
4
4
  "license": "SEE LICENSE IN LICENSE FILE",
5
5
  "main": "index.js",
6
6
  "dependencies": {
7
7
  "@date-io/moment": "^1.3.5",
8
8
  "@react-google-maps/api": "^2.7.0",
9
- "@reltio/mdm-module": "^1.4.817",
10
- "@reltio/mdm-sdk": "^1.4.817",
9
+ "@reltio/mdm-module": "^1.4.821",
10
+ "@reltio/mdm-sdk": "^1.4.821",
11
11
  "classnames": "^2.2.5",
12
12
  "frontend-collective-react-dnd-scrollzone": "^1.0.2",
13
13
  "nanoid": "^2.0.0",