Add staff badge near comment author (#280)

This commit is contained in:
Riccardo Graziosi
2024-02-14 19:40:39 +01:00
committed by GitHub
parent 1d5df21301
commit 5221df1b2b
10 changed files with 33 additions and 8 deletions

View File

@@ -276,4 +276,9 @@ body {
vertical-align: middle; vertical-align: middle;
} }
}
.staffIcon {
font-size: 24px;
margin: 0 4px;
} }

View File

@@ -12,6 +12,7 @@ class CommentsController < ApplicationController
:updated_at, :updated_at,
'users.full_name as user_full_name', 'users.full_name as user_full_name',
'users.email as user_email', 'users.email as user_email',
'users.role as user_role',
) )
.where(post_id: params[:post_id]) .where(post_id: params[:post_id])
.left_outer_joins(:user) .left_outer_joins(:user)
@@ -28,7 +29,7 @@ class CommentsController < ApplicationController
SendNotificationForCommentWorkflow.new(comment: @comment).run SendNotificationForCommentWorkflow.new(comment: @comment).run
render json: @comment.attributes.merge( render json: @comment.attributes.merge(
{ user_full_name: current_user.full_name, user_email: current_user.email } { user_full_name: current_user.full_name, user_email: current_user.email, user_role: current_user.role_before_type_cast }
), status: :created ), status: :created
else else
render json: { render json: {
@@ -43,7 +44,7 @@ class CommentsController < ApplicationController
if @comment.update(comment_update_params) if @comment.update(comment_update_params)
render json: @comment.attributes.merge( render json: @comment.attributes.merge(
{ user_full_name: @comment.user.full_name, user_email: @comment.user.email } { user_full_name: @comment.user.full_name, user_email: @comment.user.email, user_role: @comment.user.role_before_type_cast }
) )
else else
render json: { render json: {

View File

@@ -9,6 +9,7 @@ import { ReplyFormState } from '../../reducers/replyFormReducer';
import CommentEditForm from './CommentEditForm'; import CommentEditForm from './CommentEditForm';
import CommentFooter from './CommentFooter'; import CommentFooter from './CommentFooter';
import { StaffIcon } from '../common/Icons';
interface Props { interface Props {
id: number; id: number;
@@ -16,6 +17,7 @@ interface Props {
isPostUpdate: boolean; isPostUpdate: boolean;
userFullName: string; userFullName: string;
userEmail: string; userEmail: string;
userRole: number;
createdAt: string; createdAt: string;
updatedAt: string; updatedAt: string;
@@ -68,6 +70,7 @@ class Comment extends React.Component<Props, State> {
isPostUpdate, isPostUpdate,
userFullName, userFullName,
userEmail, userEmail,
userRole,
createdAt, createdAt,
updatedAt, updatedAt,
@@ -88,6 +91,9 @@ class Comment extends React.Component<Props, State> {
<div className="commentHeader"> <div className="commentHeader">
<Gravatar email={userEmail} size={28} className="gravatar" /> <Gravatar email={userEmail} size={28} className="gravatar" />
<span className="commentAuthor">{userFullName}</span> <span className="commentAuthor">{userFullName}</span>
{ userRole > 0 && <StaffIcon /> }
{ {
isPostUpdate ? isPostUpdate ?
<span className="postUpdateBadge"> <span className="postUpdateBadge">

View File

@@ -1,4 +1,5 @@
import * as React from 'react'; import * as React from 'react';
import I18n from 'i18n-js';
import { BsReply } from 'react-icons/bs'; import { BsReply } from 'react-icons/bs';
import { FiEdit, FiDelete } from 'react-icons/fi'; import { FiEdit, FiDelete } from 'react-icons/fi';
@@ -7,6 +8,7 @@ import { TbLock, TbLockOpen } from 'react-icons/tb';
import { MdContentCopy, MdDone, MdOutlineArrowBack } from 'react-icons/md'; import { MdContentCopy, MdDone, MdOutlineArrowBack } from 'react-icons/md';
import { GrTest } from 'react-icons/gr'; import { GrTest } from 'react-icons/gr';
import { MdOutlineLibraryBooks } from "react-icons/md"; import { MdOutlineLibraryBooks } from "react-icons/md";
import { MdVerified } from "react-icons/md";
export const EditIcon = () => <FiEdit />; export const EditIcon = () => <FiEdit />;
@@ -28,4 +30,10 @@ export const BackIcon = () => <MdOutlineArrowBack />;
export const ReplyIcon = () => <BsReply />; export const ReplyIcon = () => <BsReply />;
export const LearnMoreIcon = () => <MdOutlineLibraryBooks />; export const LearnMoreIcon = () => <MdOutlineLibraryBooks />;
export const StaffIcon = () => (
<span title={I18n.t('common.user_staff')} className="staffIcon">
<MdVerified />
</span>
);

View File

@@ -5,6 +5,7 @@ interface IComment {
isPostUpdate: boolean; isPostUpdate: boolean;
userFullName: string; userFullName: string;
userEmail: string; userEmail: string;
userRole: number;
createdAt: string; createdAt: string;
updatedAt: string; updatedAt: string;
} }

View File

@@ -5,6 +5,7 @@ interface ICommentJSON {
is_post_update: boolean; is_post_update: boolean;
user_full_name: string; user_full_name: string;
user_email: string; user_email: string;
user_role: number;
created_at: string; created_at: string;
updated_at: string; updated_at: string;
} }

View File

@@ -17,6 +17,7 @@ const initialState: IComment = {
isPostUpdate: false, isPostUpdate: false,
userFullName: '<Unknown user>', userFullName: '<Unknown user>',
userEmail: 'example@example.com', userEmail: 'example@example.com',
userRole: 0,
createdAt: undefined, createdAt: undefined,
updatedAt: undefined, updatedAt: undefined,
}; };
@@ -35,6 +36,7 @@ const commentReducer = (
isPostUpdate: action.comment.is_post_update, isPostUpdate: action.comment.is_post_update,
userFullName: action.comment.user_full_name, userFullName: action.comment.user_full_name,
userEmail: action.comment.user_email, userEmail: action.comment.user_email,
userRole: action.comment.user_role,
createdAt: action.comment.created_at, createdAt: action.comment.created_at,
updatedAt: action.comment.updated_at, updatedAt: action.comment.updated_at,
}; };

View File

@@ -44,6 +44,7 @@ en:
enabled: 'Enabled' enabled: 'Enabled'
disabled: 'Disabled' disabled: 'Disabled'
copied: 'Copied!' copied: 'Copied!'
user_staff: 'Staff'
buttons: buttons:
new: 'New' new: 'New'
edit: 'Edit' edit: 'Edit'

View File

@@ -31,7 +31,7 @@
"react-dom": "16.9.0", "react-dom": "16.9.0",
"react-gravatar": "2.6.3", "react-gravatar": "2.6.3",
"react-hook-form": "7.33.1", "react-hook-form": "7.33.1",
"react-icons": "4.4.0", "react-icons": "5.0.1",
"react-infinite-scroller": "1.2.4", "react-infinite-scroller": "1.2.4",
"react-markdown": "5.0.3", "react-markdown": "5.0.3",
"react-redux": "7.1.1", "react-redux": "7.1.1",

View File

@@ -2411,10 +2411,10 @@ react-hook-form@7.33.1:
resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.33.1.tgz#8c4410e3420788d3b804d62cc4c142915c2e46d0" resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.33.1.tgz#8c4410e3420788d3b804d62cc4c142915c2e46d0"
integrity sha512-ydTfTxEJdvgjCZBj5DDXRc58oTEfnFupEwwTAQ9FSKzykEJkX+3CiAkGtAMiZG7IPWHuzgT6AOBfogiKhUvKgg== integrity sha512-ydTfTxEJdvgjCZBj5DDXRc58oTEfnFupEwwTAQ9FSKzykEJkX+3CiAkGtAMiZG7IPWHuzgT6AOBfogiKhUvKgg==
react-icons@4.4.0: react-icons@5.0.1:
version "4.4.0" version "5.0.1"
resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-4.4.0.tgz#a13a8a20c254854e1ec9aecef28a95cdf24ef703" resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-5.0.1.tgz#1694e11bfa2a2888cab47dcc30154ce90485feee"
integrity sha512-fSbvHeVYo/B5/L4VhB7sBA1i2tS8MkT0Hb9t2H1AVPkwGfVHLJCqyr2Py9dKMxsyM63Eng1GkdZfbWj+Fmv8Rg== integrity sha512-WqLZJ4bLzlhmsvme6iFdgO8gfZP17rfjYEJ2m9RsZjZ+cc4k1hTzknEz63YS1MeT50kVzoa1Nz36f4BEx+Wigw==
react-infinite-scroller@1.2.4: react-infinite-scroller@1.2.4:
version "1.2.4" version "1.2.4"