Private comments (SZ-53)
Andrzej Wójcik (Tigase) opened 3 months ago

Previous project management systems that we used have function to submit private comments (visible only to selected group of users, roles). That allowed us to discuss topics related to the customer related issue internally within the issue but that discussion was not visible to the customer. This feature was very useful as it allowed for internal discussions while at the same time allowed us to have full information exchange in a single issue.

I suppose we could have this in Sztab by setting roles or groups to "internal"/"external" within a project (or even at the user/group level). Then within the issue each comment would have a visibility assigned (internal/external). I would suggest to have "internal" visibility as default (to make sure we would not publish "private" information exchange). Also "reply" button could just copy visibility level of a comment, if we reply on private/internal comment then reply should also be private/internal.

  • Andrzej Wójcik (Tigase) commented 3 months ago

    @kobit I think this feature could be useful. I'm assigning it to you for review and to make decision if that is something we would want.

    Also I wonder if we shouldn't have a separate states for "customer" project issues. Some tasks may be ready for internal testing but not for the customer, so those would be "in qa" internally, but still "in progress" for the customer.

    I'm making those suggestions based on the recent exchanges with customers.

  • Artur Hefczyc commented 3 months ago

    +1 from my side.

    Although, I am a bit worried that at some point, someone may forget to click 'private comment' and expose content to customer. So, we would have to think of the best way to implement it. Maybe, when the first comment is marked as private, all subsequent comments could have private by default....

  • Andrzej Wójcik (Tigase) commented 3 months ago

    Yes, that was my worry as well. I suppose if we reply on comment, reply should have the same visibility as the original comment. Also, I would suggest that "team" should have "private" checked by default and we would need to "uncheck" (it is safer to forget making comment public than making comment private).

  • Wojciech Kapcia (Tigase) commented 3 months ago

    I'm very much in favour of this because it would make the work easier (one could carry out discussion internally about particular issue without exposing it to wider audience)

    Although, I am a bit worried that at some point, someone may forget to click 'private comment' and expose content to customer. So, we would have to think of the best way to implement it. Maybe, when the first comment is marked as private, all subsequent comments could have private by default....

    That is my qualm as well and I was kinda worried each time I wanted to use it with YouTrack, however Andrzej's suggestion to be able to have "internal"/"external" visibily is sound, but with added twist: I would make it an option (on a project level?) to have default visibility and it would entail following:

    • all issues created are with that default visibility - you have to explicitly opt-in to make it publicly visible.
      • if the issue is created by "external" user/role the that issue (and first comment) visibility would have external visibility
    • all comments by default have default (internal) visibility
      • if the comment is made by role/user with external visibility then visibility of tha comment would be public
      • if the comment is made by the role with internal visibility then by default it would have internal visibility and each time it would require manual opt-in to make it public
      • quoting internal/private comment should force the comment to have internal visibility as well without a way to override
      • it should be possible to switch comment visibility from internal to external but this would require confirmation; it should also generate new notificaiton for the new visibility

    Of course internal comments should be marked very visibly (explicitly different background and possibly an icon), possibly something like this watermark: imagen.png

  • Artur Hefczyc commented 2 months ago

    Seems reasonable. +1 from me.

  • rk@tigase.net commented 3 weeks ago

    Is the purpose of this to segregate organizational (internal) users from customers? I ask because in a large organization, user X could be "internal" for project A but a "customer" for project B.

    If this use case is valid, then we need a notion of adding users to a project: a notion that doesn't exist yet in Sztab (or I think even in OneDev) - because its while admitting a user into a project that admin decides if the user is external to the project.

    If we assume a simpler worldview, where we have "internal" users (a@tigase.net, b@tigase.net ...) and "external" users (c1@cisco.com, c2@wal-mart.com, ...), regardless of any project, the design becomes simple: in this case, we use a simple user-level flag: is_external (boolean, default false). An external user is marked external system-wide. Then internal comments are hidden from all external-flagged users across all projects.

    Please consider use cases beyond Tigase; Sztab will be applicable beyond Tigase.

  • rk@tigase.net commented 3 weeks ago
    rksuma@Ramakrishnans-MacBook-Pro sztab % git checkout -b  feature/SZ-53-pprivate-comments
    Switched to a new branch 'feature/SZ-53-pprivate-comments'
    rksuma@Ramakrishnans-MacBook-Pro sztab % 
    
  • rk@tigase.net changed state to 'In Progress' 3 weeks ago
    Previous Value Current Value
    Open
    In Progress
  • rk@tigase.net commented 2 weeks ago

    Is the purpose of this to segregate organizational (internal) users from customers? I ask because in a large organization, user X could be "internal" for project A but a "customer" for project B.

    If this use case is valid, then we need a notion of adding users to a project: a notion that doesn't exist yet in Sztab (or I think even in OneDev) - because its while admitting a user into a project that admin decides if the user is external to the project.

    If we assume a simpler worldview, where we have "internal" users (a@tigase.net, b@tigase.net ...) and "external" users (c1@cisco.com, c2@wal-mart.com, ...), regardless of any project, the design becomes simple: in this case, we use a simple user-level flag: is_external (boolean, default false). An external user is marked external system-wide. Then internal comments are hidden from all external-flagged users across all projects.

    Please consider use cases beyond Tigase; Sztab will be applicable beyond Tigase.

    I have provisioned the view of internal vs. external users as follows. External users are displayed with a reddish tint providing a distinct visual clue:

    image.png

    Adding a comment to an issue allows user to mark the comment internal (masked from external users):

    image_2.png

    or external (can bee seen by external users): Screenshot 2026-02-23 at 10.36.48 PM.pngScreenshot 2026-02-23 at 10.36.48 PM

    Commenting on an issue provides user optin to mark the comment internal or external:

    Screenshot 2026-02-23 at 10.31.25 PM.pngScreenshot 2026-02-23 at 10.31.25 PM

    Internal comments are masked from external users using a watermark as follows:

    image_3.png

  • rk@tigase.net commented 2 weeks ago

    Since a comment may be marked internal when it should be external (or more dangerously external, when it ought to be internal), the author of the comment or the admin can toggle the comment type to internal or external after the common has been saved.

  • rk@tigase.net commented 2 weeks ago
    rksuma@Ramakrishnans-MacBook-Pro sztab % git status
    On branch feature/SZ-53-private-comments
    Your branch is up to date with 'origin/feature/SZ-53-private-comments'.
    
    nothing to commit, working tree clean
    rksuma@Ramakrishnans-MacBook-Pro sztab % git checkout wolnosc
    git pull origin wolnosc
    git merge --no-ff feature/SZ-53-private-comments
    Switched to branch 'wolnosc'
    Your branch is up to date with 'origin/wolnosc'.
    From https://tigase.dev/sztab
     * branch            wolnosc    -> FETCH_HEAD
    Already up to date.
    Merge made by the 'ort' strategy.
     backend/src/main/java/com/sztab/Application.java                               |   2 +
     backend/src/main/java/com/sztab/controller/IssueController.java                | 134 ++++++++++++++----------
     backend/src/main/java/com/sztab/controller/PullRequestController.java          | 106 ++++++++++++-------
     backend/src/main/java/com/sztab/dto/UserDto.java                               |   3 +
     backend/src/main/java/com/sztab/dto/common/AddCommentDto.java                  |   7 +-
     backend/src/main/java/com/sztab/dto/common/AttachedCommentDto.java             |  30 +++++-
     backend/src/main/java/com/sztab/dto/common/CommentVisibilityUpdateDto.java     |   9 ++
     backend/src/main/java/com/sztab/dto/issue/IssueDto.java                        |   5 +-
     backend/src/main/java/com/sztab/dto/pr/PullRequestDetailDto.java               |   8 +-
     backend/src/main/java/com/sztab/dto/pr/PullRequestDto.java                     |  10 +-
     backend/src/main/java/com/sztab/dto/user/UserSummaryDto.java                   |   9 +-
     backend/src/main/java/com/sztab/exception/ResourceNotFoundException.java       |   9 ++
     backend/src/main/java/com/sztab/exception/handlers/GlobalExceptionHandler.java |   8 ++
     backend/src/main/java/com/sztab/model/Comment.java                             |  28 ++++-
     backend/src/main/java/com/sztab/model/User.java                                |   8 ++
     backend/src/main/java/com/sztab/model/enums/CommentVisibility.java             |   5 +
     backend/src/main/java/com/sztab/model/enums/UserType.java                      |   5 +
     backend/src/main/java/com/sztab/service/IssueService.java                      |   7 +-
     backend/src/main/java/com/sztab/service/PullRequestService.java                |   3 +-
     backend/src/main/java/com/sztab/service/UserService.java                       |   2 +
     backend/src/main/java/com/sztab/service/impl/IssueServiceImpl.java             | 167 ++++++++++++++++++++++--------
     backend/src/main/java/com/sztab/service/impl/PullRequestServiceImpl.java       |   5 +-
     backend/src/main/java/com/sztab/service/impl/UserServiceImpl.java              |  12 ++-
     backend/src/main/resources/db/migration/V07__create_global_issue_sequence.sql  |   7 ++
     backend/src/test/java/com/sztab/controller/IssueControllerTest.java            | 165 ++++++++++++++++++++----------
     backend/src/test/java/com/sztab/controller/UserControllerTest.java             |   5 +-
     backend/src/test/java/com/sztab/dto/PullRequestDtoTest.java                    |   3 +-
     backend/src/test/java/com/sztab/repository/BranchRepositoryTest.java           |   3 +-
     backend/src/test/java/com/sztab/repository/ProjectRepositoryTest.java          |   3 +-
     backend/src/test/java/com/sztab/service/IssueServiceImplTest.java              |   6 +-
     deploy/docker/docker-compose.yml                                               |  37 +++----
     frontend/src/api/issues.ts                                                     |   9 +-
     frontend/src/api/pr.ts                                                         |   2 +-
     frontend/src/components/common/Modal.tsx                                       |   6 +-
     frontend/src/components/issues/IssueEditModal.tsx                              | 416 ++++++++++++++++++++++++++++++++++-----------------------------------------
     frontend/src/components/project/CreateProjectModal.tsx                         |   7 +-
     frontend/src/components/users/CreateUserModal.tsx                              | 119 ++++++++++------------
     frontend/src/components/users/EditUserModal.tsx                                |   6 +-
     frontend/src/context/AuthContext.tsx                                           |   2 +
     frontend/src/pages/pr/PrDetailPage.tsx                                         |   2 +-
     frontend/src/pages/users/UserListPage.tsx                                      | 168 ++++++++++++++++--------------
     frontend/src/types/comments.ts                                                 |   9 +-
     frontend/src/types/users.ts                                                    |   8 ++
     43 files changed, 944 insertions(+), 621 deletions(-)
     create mode 100644 backend/src/main/java/com/sztab/dto/common/CommentVisibilityUpdateDto.java
     create mode 100644 backend/src/main/java/com/sztab/exception/ResourceNotFoundException.java
     create mode 100644 backend/src/main/java/com/sztab/model/enums/CommentVisibility.java
     create mode 100644 backend/src/main/java/com/sztab/model/enums/UserType.java
     create mode 100644 backend/src/main/resources/db/migration/V07__create_global_issue_sequence.sql
    rksuma@Ramakrishnans-MacBook-Pro sztab % git push origin wolnosc
    Enumerating objects: 1, done.
    Counting objects: 100% (1/1), done.
    Writing objects: 100% (1/1), 250 bytes | 250.00 KiB/s, done.
    Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)
    To https://tigase.dev/sztab.git
       362587e..75d8a0d  wolnosc -> wolnosc
    rksuma@Ramakrishnans-MacBook-Pro sztab % 
    rksuma@Ramakrishnans-MacBook-Pro sztab % git checkout wolnosc
    Already on 'wolnosc'
    Your branch is up to date with 'origin/wolnosc'.
    rksuma@Ramakrishnans-MacBook-Pro sztab % git branch -d feature/SZ-53-private-comments
    Deleted branch feature/SZ-53-private-comments (was db4c113).
    rksuma@Ramakrishnans-MacBook-Pro sztab % git push origin --delete feature/SZ-53-private-comments
    remote:  
    remote: Create a pull request for 'feature/SZ-53-private-comments' by visiting:
    remote:     https://tigase.dev/sztab/~pulls/new?target=1325:wolnosc&source=1325:feature/SZ-53-private-comments
    remote:  
    To https://tigase.dev/sztab.git
     - [deleted]         feature/SZ-53-private-comments
    rksuma@Ramakrishnans-MacBook-Pro sztab % 
    
    
  • rk@tigase.net changed state to 'Closed' 2 weeks ago
    Previous Value Current Value
    In Progress
    Closed
issue 1 of 1
Type
New Feature
Priority
Normal
Assignee
Version
none
Sprints
n/a
Customer
n/a
Issue Votes (0)
Watchers (4)
Reference
SZ-53
Please wait...
Page is in error, reload to recover