Initialise comments (#3328)
* Initial scaffolding for comments CRUD APIs
* add actions
* add assets
* state management for existing comments and creating new
* add ui components
* add overlay comments wrapper to baseWidget
* add toggle comment mode button at editor header
* trigger tests
* Disallow commenting as someone else
* Add applicationId for comments
* lint
* Add overlay blacklist to prevent component interaction while adding comments
* Comment thread style updates
* Placeholder comment context menu
* Controlled comment thread visibility for making new comments visible by default
* Update comment type description
* Reset input on save
* Resolve comment thread button ui
* fix close on esc key, dont create new comment on outside click
* Submit on enter
* add emoji picker
* Attempt at adding a websocket server in Java
* CRUD APIs for comment threads
* Add API for getting all threads in application
* Move types to a separate file
* Initial commit for real time server (RTS)
* Add script to start RTS
* Fix position property
* Use create comment thread API
* Use add comment to thread API
* Add custom cursor
* Dispatch logout init on 401 errors
* Allow CORS for real time connection
* Add more logs to RTS
* Fix construction of MongoClient
* WIP: Real time comments
* Enable comments
* Minor updates
* Read backend API base URL from environment
* Escape to reset comments mode
* Set popover position as auto and boundary as scroll parent
* Disable warning
* Added permissions for comment threads
* Add resolved API for comment threads
* Migration to set commenting permission on existing apps
* Fix updates bringing the RTS down
* Show view latest button, scroll to bottom on creating a new comment
* Cleanup comment reducer
* Move to typescript for RTS
* Add missing server.ts and tsconfig files
* Resolve / unresolve comment
* Scaffold app comments
* Minor fixes: comment on top of all widgets, add toggle button at viewer header
* Reconnect socket on creating a new app, set connected status in store
* Retry socket connection flow
* Integration tests for comments with api mocks using msw
* Fix circular depependency
* rm file
* Minor cleanup and comments
* Minor refactors: move isScrolledToBottom to common hooks, decouple prevent interactions overlay from comments wrapper
* Use policies when pushing updates in RTS
* ENV var to set if comments are enabled
* Fix: check if editor/viewer is initialised before waiting for init action
* Add tests for comments reducer
* Revert "ENV var to set if comments are enabled"
This reverts commit 988efeaa69d378d943a387e1e73510334958adc5.
* Enable comments for users with appsmith email
* lint
* fix
* Try running a socket.io server inside backend
* Update comment reducer tests
* Init mentions within comments
* Fix comment thread updates with email rooms
* Minor fixes
* Refactors / review suggestions
* lint
* increase cache limit for builds
* Comment out tests for feature that's under development
* Add Dockerfile for RTS
* Fix policies missing for first comment in threads
* Use draftJS for comments input with mentions support
* fix fixtures
* Use thread's policies when querying for threads
* Update socket.io to v4
* Add support for richer body with mentions
* Update comment body type to RawDraftContentState
* fix stale method
* Fix mentions search
* Minor cleanups
* Comment context menu and thread UI updates
* revert: Scaffold app comments
* Yarn dependencies
* Delete comment using id api added
* Init app comments
* Add test for creating thread
* Api for delete comment with id
* Test comment creation response and policies
* Copy comment links
* Fix reset editor state
* Delete valid comment testcase added
* Delete comment TC : code refactor
* Don't allow creating comments with an empty body
* Pin comments WIP[]
* Ignore dependency-reduced-pom.xml files from VCS
* Cleanup of some dev-only files, for review
* Delete comment
* Update socket.io to v4 in RTS
* Pin and resolve comment thread object added in commentThread
* Pin and resolve comment thread object added in commentThread
* Update comment thread API
* Added creationTime and updationTime in comment thread response
* Added creationTime and updationTime in comment thread response
* Added human readable id to comment threads, fallback to username for null name in user document
* Refactor
* lint
* fix test, rm duplicate selector
* comment out saga used for dev
* CommentThread viewed status, username fallback for getName=null, username field added in pin & resolve status
* lint
* trigger tests
Co-authored-by: Shrikant Sharat Kandula <shrikant@appsmith.com>
Co-authored-by: Abhijeet <abhi.nagarnaik@gmail.com>
2021-04-29 10:33:51 +00:00
|
|
|
import React, { useCallback, useEffect } from "react";
|
|
|
|
|
import Editor from "@draft-js-plugins/editor";
|
|
|
|
|
import {
|
|
|
|
|
CompositeDecorator,
|
|
|
|
|
convertFromRaw,
|
|
|
|
|
DraftDecorator,
|
|
|
|
|
EditorState,
|
|
|
|
|
RawDraftContentState,
|
|
|
|
|
} from "draft-js";
|
|
|
|
|
import styled from "styled-components";
|
|
|
|
|
import ProfileImage from "pages/common/ProfileImage";
|
|
|
|
|
import { Comment } from "entities/Comments/CommentsInterfaces";
|
|
|
|
|
import { getTypographyByKey } from "constants/DefaultTheme";
|
|
|
|
|
import CommentContextMenu from "./CommentContextMenu";
|
|
|
|
|
import ResolveCommentButton from "comments/CommentCard/ResolveCommentButton";
|
|
|
|
|
|
|
|
|
|
import createMentionPlugin from "@draft-js-plugins/mention";
|
|
|
|
|
import { flattenDeep, noop } from "lodash";
|
|
|
|
|
import copy from "copy-to-clipboard";
|
|
|
|
|
|
|
|
|
|
import {
|
|
|
|
|
deleteCommentRequest,
|
|
|
|
|
pinCommentThreadRequest,
|
|
|
|
|
} from "actions/commentActions";
|
|
|
|
|
import { useDispatch } from "react-redux";
|
|
|
|
|
|
|
|
|
|
const StyledContainer = styled.div`
|
|
|
|
|
width: 100%;
|
|
|
|
|
padding: ${(props) =>
|
|
|
|
|
`${props.theme.spaces[5]}px ${props.theme.spaces[7]}px`};
|
|
|
|
|
border-radius: 0;
|
|
|
|
|
`;
|
|
|
|
|
|
|
|
|
|
const Separator = styled.div`
|
|
|
|
|
background-color: ${(props) =>
|
|
|
|
|
props.theme.colors.comments.childCommentsIndent};
|
|
|
|
|
height: 1px;
|
|
|
|
|
width: calc(100% - ${(props) => props.theme.spaces[7] * 2}px);
|
|
|
|
|
margin-left: ${(props) => props.theme.spaces[7]}px;
|
|
|
|
|
`;
|
|
|
|
|
|
|
|
|
|
// ${(props) => getTypographyByKey(props, "p1")};
|
|
|
|
|
// line-height: 24px;
|
|
|
|
|
// color: ${(props) => props.theme.colors.comments.commentBody};
|
|
|
|
|
// margin-top: ${(props) => props.theme.spaces[3]}px;
|
|
|
|
|
|
|
|
|
|
const CommentBodyContainer = styled.div`
|
|
|
|
|
background-color: ${(props) => props.theme.colors.comments.commentBackground};
|
|
|
|
|
border-radius: ${(props) => props.theme.spaces[3]}px;
|
|
|
|
|
padding: ${(props) =>
|
|
|
|
|
`${props.theme.spaces[4]}px ${props.theme.spaces[5]}px`};
|
|
|
|
|
`;
|
|
|
|
|
|
|
|
|
|
const CommentHeader = styled.div`
|
|
|
|
|
display: flex;
|
|
|
|
|
justify-content: space-between;
|
|
|
|
|
align-items: center;
|
|
|
|
|
padding-bottom: ${(props) => props.theme.spaces[5]}px;
|
|
|
|
|
`;
|
|
|
|
|
|
|
|
|
|
const UserName = styled.span`
|
|
|
|
|
${(props) => getTypographyByKey(props, "h5")}
|
|
|
|
|
color: ${(props) => props.theme.colors.comments.profileUserName};
|
|
|
|
|
margin-left: ${(props) => props.theme.spaces[4]}px;
|
|
|
|
|
display: flex;
|
|
|
|
|
align-items: center;
|
|
|
|
|
`;
|
|
|
|
|
|
|
|
|
|
const HeaderSection = styled.div`
|
|
|
|
|
display: flex;
|
|
|
|
|
align-items: center;
|
|
|
|
|
`;
|
|
|
|
|
|
|
|
|
|
const mentionPlugin = createMentionPlugin();
|
|
|
|
|
const plugins = [mentionPlugin];
|
|
|
|
|
const decorators = flattenDeep(plugins.map((plugin) => plugin.decorators));
|
|
|
|
|
const decorator = new CompositeDecorator(
|
|
|
|
|
decorators.filter((_decorator, index) => index !== 1) as DraftDecorator[],
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
const useSelectCommentUsingQuery = (commentId: string) => {
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
const searchParams = new URL(window.location.href).searchParams;
|
|
|
|
|
const commentIdInUrl = searchParams.get("commentId");
|
|
|
|
|
if (commentIdInUrl && commentIdInUrl === commentId) {
|
|
|
|
|
const commentCard = document.getElementById(`comment-card-${commentId}`);
|
|
|
|
|
commentCard?.scrollIntoView();
|
|
|
|
|
}
|
|
|
|
|
}, []);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
function CommentCard({
|
|
|
|
|
comment,
|
2021-05-13 08:35:39 +00:00
|
|
|
commentThreadId,
|
Initialise comments (#3328)
* Initial scaffolding for comments CRUD APIs
* add actions
* add assets
* state management for existing comments and creating new
* add ui components
* add overlay comments wrapper to baseWidget
* add toggle comment mode button at editor header
* trigger tests
* Disallow commenting as someone else
* Add applicationId for comments
* lint
* Add overlay blacklist to prevent component interaction while adding comments
* Comment thread style updates
* Placeholder comment context menu
* Controlled comment thread visibility for making new comments visible by default
* Update comment type description
* Reset input on save
* Resolve comment thread button ui
* fix close on esc key, dont create new comment on outside click
* Submit on enter
* add emoji picker
* Attempt at adding a websocket server in Java
* CRUD APIs for comment threads
* Add API for getting all threads in application
* Move types to a separate file
* Initial commit for real time server (RTS)
* Add script to start RTS
* Fix position property
* Use create comment thread API
* Use add comment to thread API
* Add custom cursor
* Dispatch logout init on 401 errors
* Allow CORS for real time connection
* Add more logs to RTS
* Fix construction of MongoClient
* WIP: Real time comments
* Enable comments
* Minor updates
* Read backend API base URL from environment
* Escape to reset comments mode
* Set popover position as auto and boundary as scroll parent
* Disable warning
* Added permissions for comment threads
* Add resolved API for comment threads
* Migration to set commenting permission on existing apps
* Fix updates bringing the RTS down
* Show view latest button, scroll to bottom on creating a new comment
* Cleanup comment reducer
* Move to typescript for RTS
* Add missing server.ts and tsconfig files
* Resolve / unresolve comment
* Scaffold app comments
* Minor fixes: comment on top of all widgets, add toggle button at viewer header
* Reconnect socket on creating a new app, set connected status in store
* Retry socket connection flow
* Integration tests for comments with api mocks using msw
* Fix circular depependency
* rm file
* Minor cleanup and comments
* Minor refactors: move isScrolledToBottom to common hooks, decouple prevent interactions overlay from comments wrapper
* Use policies when pushing updates in RTS
* ENV var to set if comments are enabled
* Fix: check if editor/viewer is initialised before waiting for init action
* Add tests for comments reducer
* Revert "ENV var to set if comments are enabled"
This reverts commit 988efeaa69d378d943a387e1e73510334958adc5.
* Enable comments for users with appsmith email
* lint
* fix
* Try running a socket.io server inside backend
* Update comment reducer tests
* Init mentions within comments
* Fix comment thread updates with email rooms
* Minor fixes
* Refactors / review suggestions
* lint
* increase cache limit for builds
* Comment out tests for feature that's under development
* Add Dockerfile for RTS
* Fix policies missing for first comment in threads
* Use draftJS for comments input with mentions support
* fix fixtures
* Use thread's policies when querying for threads
* Update socket.io to v4
* Add support for richer body with mentions
* Update comment body type to RawDraftContentState
* fix stale method
* Fix mentions search
* Minor cleanups
* Comment context menu and thread UI updates
* revert: Scaffold app comments
* Yarn dependencies
* Delete comment using id api added
* Init app comments
* Add test for creating thread
* Api for delete comment with id
* Test comment creation response and policies
* Copy comment links
* Fix reset editor state
* Delete valid comment testcase added
* Delete comment TC : code refactor
* Don't allow creating comments with an empty body
* Pin comments WIP[]
* Ignore dependency-reduced-pom.xml files from VCS
* Cleanup of some dev-only files, for review
* Delete comment
* Update socket.io to v4 in RTS
* Pin and resolve comment thread object added in commentThread
* Pin and resolve comment thread object added in commentThread
* Update comment thread API
* Added creationTime and updationTime in comment thread response
* Added creationTime and updationTime in comment thread response
* Added human readable id to comment threads, fallback to username for null name in user document
* Refactor
* lint
* fix test, rm duplicate selector
* comment out saga used for dev
* CommentThread viewed status, username fallback for getName=null, username field added in pin & resolve status
* lint
* trigger tests
Co-authored-by: Shrikant Sharat Kandula <shrikant@appsmith.com>
Co-authored-by: Abhijeet <abhi.nagarnaik@gmail.com>
2021-04-29 10:33:51 +00:00
|
|
|
isParentComment,
|
|
|
|
|
resolved,
|
2021-05-13 08:35:39 +00:00
|
|
|
toggleResolved,
|
Initialise comments (#3328)
* Initial scaffolding for comments CRUD APIs
* add actions
* add assets
* state management for existing comments and creating new
* add ui components
* add overlay comments wrapper to baseWidget
* add toggle comment mode button at editor header
* trigger tests
* Disallow commenting as someone else
* Add applicationId for comments
* lint
* Add overlay blacklist to prevent component interaction while adding comments
* Comment thread style updates
* Placeholder comment context menu
* Controlled comment thread visibility for making new comments visible by default
* Update comment type description
* Reset input on save
* Resolve comment thread button ui
* fix close on esc key, dont create new comment on outside click
* Submit on enter
* add emoji picker
* Attempt at adding a websocket server in Java
* CRUD APIs for comment threads
* Add API for getting all threads in application
* Move types to a separate file
* Initial commit for real time server (RTS)
* Add script to start RTS
* Fix position property
* Use create comment thread API
* Use add comment to thread API
* Add custom cursor
* Dispatch logout init on 401 errors
* Allow CORS for real time connection
* Add more logs to RTS
* Fix construction of MongoClient
* WIP: Real time comments
* Enable comments
* Minor updates
* Read backend API base URL from environment
* Escape to reset comments mode
* Set popover position as auto and boundary as scroll parent
* Disable warning
* Added permissions for comment threads
* Add resolved API for comment threads
* Migration to set commenting permission on existing apps
* Fix updates bringing the RTS down
* Show view latest button, scroll to bottom on creating a new comment
* Cleanup comment reducer
* Move to typescript for RTS
* Add missing server.ts and tsconfig files
* Resolve / unresolve comment
* Scaffold app comments
* Minor fixes: comment on top of all widgets, add toggle button at viewer header
* Reconnect socket on creating a new app, set connected status in store
* Retry socket connection flow
* Integration tests for comments with api mocks using msw
* Fix circular depependency
* rm file
* Minor cleanup and comments
* Minor refactors: move isScrolledToBottom to common hooks, decouple prevent interactions overlay from comments wrapper
* Use policies when pushing updates in RTS
* ENV var to set if comments are enabled
* Fix: check if editor/viewer is initialised before waiting for init action
* Add tests for comments reducer
* Revert "ENV var to set if comments are enabled"
This reverts commit 988efeaa69d378d943a387e1e73510334958adc5.
* Enable comments for users with appsmith email
* lint
* fix
* Try running a socket.io server inside backend
* Update comment reducer tests
* Init mentions within comments
* Fix comment thread updates with email rooms
* Minor fixes
* Refactors / review suggestions
* lint
* increase cache limit for builds
* Comment out tests for feature that's under development
* Add Dockerfile for RTS
* Fix policies missing for first comment in threads
* Use draftJS for comments input with mentions support
* fix fixtures
* Use thread's policies when querying for threads
* Update socket.io to v4
* Add support for richer body with mentions
* Update comment body type to RawDraftContentState
* fix stale method
* Fix mentions search
* Minor cleanups
* Comment context menu and thread UI updates
* revert: Scaffold app comments
* Yarn dependencies
* Delete comment using id api added
* Init app comments
* Add test for creating thread
* Api for delete comment with id
* Test comment creation response and policies
* Copy comment links
* Fix reset editor state
* Delete valid comment testcase added
* Delete comment TC : code refactor
* Don't allow creating comments with an empty body
* Pin comments WIP[]
* Ignore dependency-reduced-pom.xml files from VCS
* Cleanup of some dev-only files, for review
* Delete comment
* Update socket.io to v4 in RTS
* Pin and resolve comment thread object added in commentThread
* Pin and resolve comment thread object added in commentThread
* Update comment thread API
* Added creationTime and updationTime in comment thread response
* Added creationTime and updationTime in comment thread response
* Added human readable id to comment threads, fallback to username for null name in user document
* Refactor
* lint
* fix test, rm duplicate selector
* comment out saga used for dev
* CommentThread viewed status, username fallback for getName=null, username field added in pin & resolve status
* lint
* trigger tests
Co-authored-by: Shrikant Sharat Kandula <shrikant@appsmith.com>
Co-authored-by: Abhijeet <abhi.nagarnaik@gmail.com>
2021-04-29 10:33:51 +00:00
|
|
|
}: {
|
|
|
|
|
comment: Comment;
|
|
|
|
|
isParentComment?: boolean;
|
|
|
|
|
resolved?: boolean;
|
|
|
|
|
toggleResolved?: () => void;
|
|
|
|
|
commentThreadId: string;
|
|
|
|
|
}) {
|
|
|
|
|
const dispatch = useDispatch();
|
|
|
|
|
const { authorName, body, id: commentId } = comment;
|
|
|
|
|
const contentState = convertFromRaw(body as RawDraftContentState);
|
|
|
|
|
const editorState = EditorState.createWithContent(contentState, decorator);
|
|
|
|
|
|
|
|
|
|
const copyCommentLink = useCallback(() => {
|
|
|
|
|
const url = new URL(window.location.href);
|
|
|
|
|
url.searchParams.set("commentId", commentId);
|
|
|
|
|
url.searchParams.set("commentThreadId", commentThreadId);
|
|
|
|
|
url.searchParams.set("isCommentMode", "true");
|
|
|
|
|
copy(url.toString());
|
|
|
|
|
}, []);
|
|
|
|
|
|
|
|
|
|
const pin = useCallback(() => {
|
|
|
|
|
dispatch(pinCommentThreadRequest({ threadId: commentThreadId }));
|
|
|
|
|
}, []);
|
|
|
|
|
|
|
|
|
|
const deleteComment = useCallback(() => {
|
|
|
|
|
dispatch(deleteCommentRequest({ threadId: commentThreadId, commentId }));
|
|
|
|
|
}, []);
|
|
|
|
|
|
|
|
|
|
const contextMenuProps = {
|
|
|
|
|
pin,
|
|
|
|
|
copyCommentLink,
|
|
|
|
|
deleteComment,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
useSelectCommentUsingQuery(comment.id);
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<>
|
|
|
|
|
<StyledContainer
|
|
|
|
|
data-cy={`t--comment-card-${comment.id}`}
|
|
|
|
|
id={`comment-card-${comment.id}`}
|
|
|
|
|
>
|
|
|
|
|
<CommentHeader>
|
|
|
|
|
<HeaderSection>
|
|
|
|
|
<ProfileImage side={30} userName={authorName || ""} />
|
|
|
|
|
<UserName>{authorName}</UserName>
|
|
|
|
|
</HeaderSection>
|
|
|
|
|
<HeaderSection>
|
|
|
|
|
{isParentComment && toggleResolved && (
|
|
|
|
|
<ResolveCommentButton
|
|
|
|
|
handleClick={toggleResolved}
|
|
|
|
|
resolved={!!resolved}
|
|
|
|
|
/>
|
|
|
|
|
)}
|
|
|
|
|
<CommentContextMenu {...contextMenuProps} />
|
|
|
|
|
</HeaderSection>
|
|
|
|
|
</CommentHeader>
|
|
|
|
|
<CommentBodyContainer>
|
|
|
|
|
<Editor
|
|
|
|
|
editorState={editorState}
|
|
|
|
|
onChange={noop}
|
|
|
|
|
plugins={plugins}
|
|
|
|
|
readOnly
|
|
|
|
|
/>
|
|
|
|
|
</CommentBodyContainer>
|
|
|
|
|
</StyledContainer>
|
|
|
|
|
{!isParentComment && <Separator />}
|
|
|
|
|
</>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export default CommentCard;
|