summaryrefslogtreecommitdiffstats
path: root/ui
diff options
context:
space:
mode:
authorDessalines <tyhou13@gmx.com>2019-10-13 17:36:35 -0700
committerDessalines <tyhou13@gmx.com>2019-10-13 17:36:35 -0700
commit663a601e1102794416ebc00af3c5479a0153518b (patch)
tree575ed7b4f023682a00add021ff3dedab6d3330f9 /ui
parent2520f3a0066f85afd287c55c8949c87047eaad47 (diff)
Adding admin abilities on user pages.
- Fixes #280
Diffstat (limited to 'ui')
-rw-r--r--ui/src/components/comment-node.tsx2
-rw-r--r--ui/src/components/post-listing.tsx60
-rw-r--r--ui/src/components/user.tsx38
-rw-r--r--ui/src/interfaces.ts1
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 {