diff options
author | Dessalines <tyhou13@gmx.com> | 2019-10-13 17:36:35 -0700 |
---|---|---|
committer | Dessalines <tyhou13@gmx.com> | 2019-10-13 17:36:35 -0700 |
commit | 663a601e1102794416ebc00af3c5479a0153518b (patch) | |
tree | 575ed7b4f023682a00add021ff3dedab6d3330f9 /ui | |
parent | 2520f3a0066f85afd287c55c8949c87047eaad47 (diff) |
Adding admin abilities on user pages.
- Fixes #280
Diffstat (limited to 'ui')
-rw-r--r-- | ui/src/components/comment-node.tsx | 2 | ||||
-rw-r--r-- | ui/src/components/post-listing.tsx | 60 | ||||
-rw-r--r-- | ui/src/components/user.tsx | 38 | ||||
-rw-r--r-- | ui/src/interfaces.ts | 1 |
4 files changed, 69 insertions, 32 deletions
diff --git a/ui/src/components/comment-node.tsx b/ui/src/components/comment-node.tsx index b45f13fc..2cb55602 100644 --- a/ui/src/components/comment-node.tsx +++ b/ui/src/components/comment-node.tsx @@ -137,7 +137,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> { </> } {/* Admins and mods can remove comments */} - {this.canMod && + {(this.canMod || this.canAdmin) && <li className="list-inline-item"> {!node.comment.removed ? <span class="pointer" onClick={linkEvent(this, this.handleModRemoveShow)}><T i18nKey="remove">#</T></span> : diff --git a/ui/src/components/post-listing.tsx b/ui/src/components/post-listing.tsx index 2b7afc6b..d0322d98 100644 --- a/ui/src/components/post-listing.tsx +++ b/ui/src/components/post-listing.tsx @@ -24,7 +24,6 @@ interface PostListingState { interface PostListingProps { post: Post; - editable?: boolean; showCommunity?: boolean; showBody?: boolean; viewOnly?: boolean; @@ -174,14 +173,18 @@ export class PostListing extends Component<PostListingProps, PostListingState> { </li> </ul> <ul class="list-inline mb-1 text-muted small font-weight-bold"> - {UserService.Instance.user && this.props.editable && + {UserService.Instance.user && <> - <li className="list-inline-item mr-2"> - <span class="pointer" onClick={linkEvent(this, this.handleSavePostClick)}>{post.saved ? i18n.t('unsave') : i18n.t('save')}</span> - </li> - <li className="list-inline-item mr-2"> - <Link className="text-muted" to={`/create_post${this.crossPostParams}`}><T i18nKey="cross_post">#</T></Link> - </li> + {this.props.showBody && + <> + <li className="list-inline-item mr-2"> + <span class="pointer" onClick={linkEvent(this, this.handleSavePostClick)}>{post.saved ? i18n.t('unsave') : i18n.t('save')}</span> + </li> + <li className="list-inline-item mr-2"> + <Link className="text-muted" to={`/create_post${this.crossPostParams}`}><T i18nKey="cross_post">#</T></Link> + </li> + </> + } {this.myPost && <> <li className="list-inline-item"> @@ -205,14 +208,16 @@ export class PostListing extends Component<PostListingProps, PostListingState> { </> } {/* Mods can ban from community, and appoint as mods to community */} - {this.canMod && + {(this.canMod || this.canAdmin) && + <li className="list-inline-item"> + {!post.removed ? + <span class="pointer" onClick={linkEvent(this, this.handleModRemoveShow)}><T i18nKey="remove">#</T></span> : + <span class="pointer" onClick={linkEvent(this, this.handleModRemoveSubmit)}><T i18nKey="restore">#</T></span> + } + </li> + } + {this.canMod && <> - <li className="list-inline-item"> - {!post.removed ? - <span class="pointer" onClick={linkEvent(this, this.handleModRemoveShow)}><T i18nKey="remove">#</T></span> : - <span class="pointer" onClick={linkEvent(this, this.handleModRemoveSubmit)}><T i18nKey="restore">#</T></span> - } - </li> {!this.isMod && <li className="list-inline-item"> {!post.banned_from_community ? @@ -326,23 +331,26 @@ export class PostListing extends Component<PostListingProps, PostListingState> { return this.props.admins && isMod(this.props.admins.map(a => a.id), this.props.post.creator_id); } - get adminsThenMods(): Array<number> { - return this.props.admins.map(a => a.id) - .concat(this.props.moderators.map(m => m.user_id)); - } - get canMod(): boolean { + if (this.props.admins && this.props.moderators) { + let adminsThenMods = this.props.admins.map(a => a.id) + .concat(this.props.moderators.map(m => m.user_id)); - if (this.props.editable) { - return canMod(UserService.Instance.user, this.adminsThenMods, this.props.post.creator_id); - } else return false; + return canMod(UserService.Instance.user, adminsThenMods, this.props.post.creator_id); + } else { + return false; + } } get canModOnSelf(): boolean { + if (this.props.admins && this.props.moderators) { + let adminsThenMods = this.props.admins.map(a => a.id) + .concat(this.props.moderators.map(m => m.user_id)); - if (this.props.editable) { - return canMod(UserService.Instance.user, this.adminsThenMods, this.props.post.creator_id, true); - } else return false; + return canMod(UserService.Instance.user, adminsThenMods, this.props.post.creator_id, true); + } else { + return false; + } } get canAdmin(): boolean { diff --git a/ui/src/components/user.tsx b/ui/src/components/user.tsx index c5ba974f..016721ad 100644 --- a/ui/src/components/user.tsx +++ b/ui/src/components/user.tsx @@ -2,7 +2,7 @@ import { Component, linkEvent } from 'inferno'; import { Link } from 'inferno-router'; import { Subscription } from "rxjs"; import { retryWhen, delay, take } from 'rxjs/operators'; -import { UserOperation, Post, Comment, CommunityUser, GetUserDetailsForm, SortType, UserDetailsResponse, UserView, CommentResponse, UserSettingsForm, LoginResponse } from '../interfaces'; +import { UserOperation, Post, Comment, CommunityUser, GetUserDetailsForm, SortType, UserDetailsResponse, UserView, CommentResponse, UserSettingsForm, LoginResponse, BanUserResponse, AddAdminResponse } from '../interfaces'; import { WebSocketService, UserService } from '../services'; import { msgOp, fetchLimit, routeSortTypeToEnum, capitalizeFirstLetter } from '../utils'; import { PostListing } from './post-listing'; @@ -24,6 +24,7 @@ interface UserState { comments: Array<Comment>; posts: Array<Post>; saved?: Array<Post>; + admins: Array<UserView>; view: View; sort: SortType; page: number; @@ -53,6 +54,7 @@ export class User extends Component<any, UserState> { moderates: [], comments: [], posts: [], + admins: [], loading: true, view: this.getViewFromProps(this.props), sort: this.getSortTypeFromProps(this.props), @@ -199,8 +201,16 @@ export class User extends Component<any, UserState> { {combined.map(i => <div> {i.type_ == "posts" - ? <PostListing post={i.data as Post} showCommunity viewOnly /> - : <CommentNodes nodes={[{comment: i.data as Comment}]} noIndent /> + ? <PostListing + post={i.data as Post} + admins={this.state.admins} + showCommunity + viewOnly /> + : + <CommentNodes + nodes={[{comment: i.data as Comment}]} + admins={this.state.admins} + noIndent /> } </div> ) @@ -213,7 +223,9 @@ export class User extends Component<any, UserState> { return ( <div> {this.state.comments.map(comment => - <CommentNodes nodes={[{comment: comment}]} noIndent viewOnly /> + <CommentNodes nodes={[{comment: comment}]} + admins={this.state.admins} + noIndent /> )} </div> ); @@ -223,7 +235,11 @@ export class User extends Component<any, UserState> { return ( <div> {this.state.posts.map(post => - <PostListing post={post} showCommunity viewOnly /> + <PostListing + post={post} + admins={this.state.admins} + showCommunity + viewOnly /> )} </div> ); @@ -415,6 +431,7 @@ export class User extends Component<any, UserState> { this.state.follows = res.follows; this.state.moderates = res.moderates; this.state.posts = res.posts; + this.state.admins = res.admins; this.state.loading = false; if (this.isCurrentUser) { this.state.userSettingsForm.show_nsfw = UserService.Instance.user.show_nsfw; @@ -454,6 +471,17 @@ export class User extends Component<any, UserState> { if (res.comment.my_vote !== null) found.my_vote = res.comment.my_vote; this.setState(this.state); + } else if (op == UserOperation.BanUser) { + let res: BanUserResponse = msg; + this.state.comments.filter(c => c.creator_id == res.user.id) + .forEach(c => c.banned = res.banned); + this.state.posts.filter(c => c.creator_id == res.user.id) + .forEach(c => c.banned = res.banned); + this.setState(this.state); + } else if (op == UserOperation.AddAdmin) { + let res: AddAdminResponse = msg; + this.state.admins = res.admins; + this.setState(this.state); } else if (op == UserOperation.SaveUserSettings) { this.state = this.emptyState; this.state.userSettingsLoading = false; diff --git a/ui/src/interfaces.ts b/ui/src/interfaces.ts index 3221415b..b9ccf303 100644 --- a/ui/src/interfaces.ts +++ b/ui/src/interfaces.ts @@ -172,6 +172,7 @@ export interface UserDetailsResponse { moderates: Array<CommunityUser>; comments: Array<Comment>; posts: Array<Post>; + admins: Array<UserView>; } export interface GetRepliesForm { |