X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=client%2Fsrc%2Fapp%2Fshared%2Fshared-moderation%2Fuser-moderation-dropdown.component.ts;h=e2cd2cdc10255f98fd6841640453d7ae5fd38342;hb=e6492b2de61e5eef5ea9bc1bf19463c065f3f41d;hp=78c2658df60f91f9d9846a8dc77c07d0356c0f50;hpb=ec903c010ecc54ec2acad0bf2cf10e7fbf6a0fa2;p=github%2FChocobozzz%2FPeerTube.git diff --git a/client/src/app/shared/shared-moderation/user-moderation-dropdown.component.ts b/client/src/app/shared/shared-moderation/user-moderation-dropdown.component.ts index 78c2658df..e2cd2cdc1 100644 --- a/client/src/app/shared/shared-moderation/user-moderation-dropdown.component.ts +++ b/client/src/app/shared/shared-moderation/user-moderation-dropdown.component.ts @@ -1,8 +1,7 @@ import { Component, EventEmitter, Input, OnChanges, OnInit, Output, ViewChild } from '@angular/core' import { AuthService, ConfirmService, Notifier, ServerService, UserService } from '@app/core' import { Account, DropdownAction } from '@app/shared/shared-main' -import { I18n } from '@ngx-translate/i18n-polyfill' -import { BulkRemoveCommentsOfBody, ServerConfig, User, UserRight } from '@shared/models' +import { BulkRemoveCommentsOfBody, User, UserRight } from '@shared/models' import { BlocklistService } from './blocklist.service' import { BulkService } from './bulk.service' import { UserBanModalComponent } from './user-ban-modal.component' @@ -19,7 +18,8 @@ export class UserModerationDropdownComponent implements OnInit, OnChanges { @Input() prependActions: DropdownAction<{ user: User, account: Account }>[] @Input() buttonSize: 'normal' | 'small' = 'normal' - @Input() placement = 'left-top left-bottom auto' + @Input() buttonStyled = true + @Input() placement = 'right-top right-bottom auto' @Input() label: string @Input() container: 'body' | undefined = undefined @@ -28,7 +28,7 @@ export class UserModerationDropdownComponent implements OnInit, OnChanges { userActions: DropdownAction<{ user: User, account: Account }>[][] = [] - private serverConfig: ServerConfig + requiresEmailVerification = false constructor ( private authService: AuthService, @@ -37,18 +37,12 @@ export class UserModerationDropdownComponent implements OnInit, OnChanges { private serverService: ServerService, private userService: UserService, private blocklistService: BlocklistService, - private bulkService: BulkService, - private i18n: I18n + private bulkService: BulkService ) { } - get requiresEmailVerification () { - return this.serverConfig.signup.requiresEmailVerification - } - - ngOnInit (): void { - this.serverConfig = this.serverService.getTmpConfig() + ngOnInit () { this.serverService.getConfig() - .subscribe(config => this.serverConfig = config) + .subscribe(config => this.requiresEmailVerification = config.signup.requiresEmailVerification) } ngOnChanges () { @@ -57,7 +51,7 @@ export class UserModerationDropdownComponent implements OnInit, OnChanges { openBanUserModal (user: User) { if (user.username === 'root') { - this.notifier.error(this.i18n('You cannot ban root.')) + this.notifier.error($localize`You cannot ban root.`) return } @@ -69,318 +63,341 @@ export class UserModerationDropdownComponent implements OnInit, OnChanges { } async unbanUser (user: User) { - const message = this.i18n('Do you really want to unban {{username}}?', { username: user.username }) - const res = await this.confirmService.confirm(message, this.i18n('Unban')) + const res = await this.confirmService.confirm($localize`Do you really want to unban ${user.username}?`, $localize`Unban`) if (res === false) return this.userService.unbanUsers(user) - .subscribe( - () => { - this.notifier.success(this.i18n('User {{username}} unbanned.', { username: user.username })) - + .subscribe({ + next: () => { + this.notifier.success($localize`User ${user.username} unbanned.`) this.userChanged.emit() }, - err => this.notifier.error(err.message) - ) + error: err => this.notifier.error(err.message) + }) } async removeUser (user: User) { if (user.username === 'root') { - this.notifier.error(this.i18n('You cannot delete root.')) + this.notifier.error($localize`You cannot delete root.`) return } - const message = this.i18n('If you remove this user, you will not be able to create another with the same username!') - const res = await this.confirmService.confirm(message, this.i18n('Delete')) + const message = $localize`If you remove user ${user.username}, you won't be able to create another with the same username!` + const res = await this.confirmService.confirm(message, $localize`Delete ${user.username}`) if (res === false) return - this.userService.removeUser(user).subscribe( - () => { - this.notifier.success(this.i18n('User {{username}} deleted.', { username: user.username })) - this.userDeleted.emit() - }, + this.userService.removeUser(user) + .subscribe({ + next: () => { + this.notifier.success($localize`User ${user.username} deleted.`) + this.userDeleted.emit() + }, - err => this.notifier.error(err.message) - ) + error: err => this.notifier.error(err.message) + }) } setEmailAsVerified (user: User) { - this.userService.updateUser(user.id, { emailVerified: true }).subscribe( - () => { - this.notifier.success(this.i18n('User {{username}} email set as verified', { username: user.username })) - - this.userChanged.emit() - }, - - err => this.notifier.error(err.message) - ) + this.userService.updateUser(user.id, { emailVerified: true }) + .subscribe({ + next: () => { + this.notifier.success($localize`User ${user.username} email set as verified`) + this.userChanged.emit() + }, + + error: err => this.notifier.error(err.message) + }) } blockAccountByUser (account: Account) { this.blocklistService.blockAccountByUser(account) - .subscribe( - () => { - this.notifier.success(this.i18n('Account {{nameWithHost}} muted.', { nameWithHost: account.nameWithHost })) + .subscribe({ + next: () => { + this.notifier.success($localize`Account ${account.nameWithHost} muted.`) this.account.mutedByUser = true this.userChanged.emit() }, - err => this.notifier.error(err.message) - ) + error: err => this.notifier.error(err.message) + }) } unblockAccountByUser (account: Account) { this.blocklistService.unblockAccountByUser(account) - .subscribe( - () => { - this.notifier.success(this.i18n('Account {{nameWithHost}} unmuted.', { nameWithHost: account.nameWithHost })) + .subscribe({ + next: () => { + this.notifier.success($localize`Account ${account.nameWithHost} unmuted.`) this.account.mutedByUser = false this.userChanged.emit() }, - err => this.notifier.error(err.message) - ) + error: err => this.notifier.error(err.message) + }) } blockServerByUser (host: string) { this.blocklistService.blockServerByUser(host) - .subscribe( - () => { - this.notifier.success(this.i18n('Instance {{host}} muted.', { host })) + .subscribe({ + next: () => { + this.notifier.success($localize`Instance ${host} muted.`) this.account.mutedServerByUser = true this.userChanged.emit() }, - err => this.notifier.error(err.message) - ) + error: err => this.notifier.error(err.message) + }) } unblockServerByUser (host: string) { this.blocklistService.unblockServerByUser(host) - .subscribe( - () => { - this.notifier.success(this.i18n('Instance {{host}} unmuted.', { host })) + .subscribe({ + next: () => { + this.notifier.success($localize`Instance ${host} unmuted.`) this.account.mutedServerByUser = false this.userChanged.emit() }, - err => this.notifier.error(err.message) - ) + error: err => this.notifier.error(err.message) + }) } blockAccountByInstance (account: Account) { this.blocklistService.blockAccountByInstance(account) - .subscribe( - () => { - this.notifier.success(this.i18n('Account {{nameWithHost}} muted by the instance.', { nameWithHost: account.nameWithHost })) + .subscribe({ + next: () => { + this.notifier.success($localize`Account ${account.nameWithHost} muted by the instance.`) this.account.mutedByInstance = true this.userChanged.emit() }, - err => this.notifier.error(err.message) - ) + error: err => this.notifier.error(err.message) + }) } unblockAccountByInstance (account: Account) { this.blocklistService.unblockAccountByInstance(account) - .subscribe( - () => { - this.notifier.success(this.i18n('Account {{nameWithHost}} unmuted by the instance.', { nameWithHost: account.nameWithHost })) + .subscribe({ + next: () => { + this.notifier.success($localize`Account ${account.nameWithHost} unmuted by the instance.`) this.account.mutedByInstance = false this.userChanged.emit() }, - err => this.notifier.error(err.message) - ) + error: err => this.notifier.error(err.message) + }) } blockServerByInstance (host: string) { this.blocklistService.blockServerByInstance(host) - .subscribe( - () => { - this.notifier.success(this.i18n('Instance {{host}} muted by the instance.', { host })) + .subscribe({ + next: () => { + this.notifier.success($localize`Instance ${host} muted by the instance.`) this.account.mutedServerByInstance = true this.userChanged.emit() }, - err => this.notifier.error(err.message) - ) + error: err => this.notifier.error(err.message) + }) } unblockServerByInstance (host: string) { this.blocklistService.unblockServerByInstance(host) - .subscribe( - () => { - this.notifier.success(this.i18n('Instance {{host}} unmuted by the instance.', { host })) + .subscribe({ + next: () => { + this.notifier.success($localize`Instance ${host} unmuted by the instance.`) this.account.mutedServerByInstance = false this.userChanged.emit() }, - err => this.notifier.error(err.message) - ) + error: err => this.notifier.error(err.message) + }) } async bulkRemoveCommentsOf (body: BulkRemoveCommentsOfBody) { - const message = this.i18n('Are you sure you want to remove all the comments of this account?') - const res = await this.confirmService.confirm(message, this.i18n('Delete account comments')) + const message = $localize`Are you sure you want to remove all the comments of this account?` + const res = await this.confirmService.confirm(message, $localize`Delete account comments`) if (res === false) return this.bulkService.removeCommentsOf(body) - .subscribe( - () => { - this.notifier.success(this.i18n('Will remove comments of this account (may take several minutes).')) + .subscribe({ + next: () => { + this.notifier.success($localize`Will remove comments of this account (may take several minutes).`) }, - err => this.notifier.error(err.message) - ) + error: err => this.notifier.error(err.message) + }) } getRouterUserEditLink (user: User) { return [ '/admin', 'users', 'update', user.id ] } + private isMyUser (user: User) { + return user && this.authService.getUser().id === user.id + } + + private isMyAccount (account: Account) { + return account && this.authService.getUser().account.id === account.id + } + private buildActions () { this.userActions = [] - if (this.prependActions) { + if (this.prependActions && this.prependActions.length !== 0) { this.userActions = [ this.prependActions ] } - if (this.authService.isLoggedIn()) { - const authUser = this.authService.getUser() + const myAccountModerationActions = this.buildMyAccountModerationActions() + const instanceModerationActions = this.buildInstanceModerationActions() - if (this.user && authUser.id === this.user.id) return + if (myAccountModerationActions.length !== 0) this.userActions.push(myAccountModerationActions) + if (instanceModerationActions.length !== 0) this.userActions.push(instanceModerationActions) + } - if (this.user && authUser.hasRight(UserRight.MANAGE_USERS) && authUser.canManage(this.user)) { - this.userActions.push([ - { - label: this.i18n('Edit user'), - description: this.i18n('Change quota, role, and more.'), - linkBuilder: ({ user }) => this.getRouterUserEditLink(user) - }, - { - label: this.i18n('Delete user'), - description: this.i18n('Videos will be deleted, comments will be tombstoned.'), - handler: ({ user }) => this.removeUser(user) - }, - { - label: this.i18n('Ban'), - description: this.i18n('User won\'t be able to login anymore, but videos and comments will be kept as is.'), - handler: ({ user }) => this.openBanUserModal(user), - isDisplayed: ({ user }) => !user.blocked - }, - { - label: this.i18n('Unban user'), - description: this.i18n('Allow the user to login and create videos/comments again'), - handler: ({ user }) => this.unbanUser(user), - isDisplayed: ({ user }) => user.blocked - }, - { - label: this.i18n('Set Email as Verified'), - handler: ({ user }) => this.setEmailAsVerified(user), - isDisplayed: ({ user }) => this.requiresEmailVerification && !user.blocked && user.emailVerified === false - } - ]) + private buildMyAccountModerationActions () { + if (!this.account || !this.authService.isLoggedIn()) return [] + + const myAccountActions: DropdownAction<{ user: User, account: Account }>[] = [ + { + label: $localize`My account moderation`, + class: [ 'red' ], + isHeader: true + }, + { + label: $localize`Mute this account`, + description: $localize`Hide any content from that user from you.`, + isDisplayed: ({ account }) => !this.isMyAccount(account) && account.mutedByUser === false, + handler: ({ account }) => this.blockAccountByUser(account) + }, + { + label: $localize`Unmute this account`, + description: $localize`Show back content from that user for you.`, + isDisplayed: ({ account }) => !this.isMyAccount(account) && account.mutedByUser === true, + handler: ({ account }) => this.unblockAccountByUser(account) + }, + { + label: $localize`Mute the instance`, + description: $localize`Hide any content from that instance for you.`, + isDisplayed: ({ account }) => !account.userId && account.mutedServerByUser === false, + handler: ({ account }) => this.blockServerByUser(account.host) + }, + { + label: $localize`Unmute the instance`, + description: $localize`Show back content from that instance for you.`, + isDisplayed: ({ account }) => !account.userId && account.mutedServerByUser === true, + handler: ({ account }) => this.unblockServerByUser(account.host) + }, + { + label: $localize`Remove comments from your videos`, + description: $localize`Remove comments made by this account on your videos.`, + isDisplayed: ({ account }) => !this.isMyAccount(account), + handler: ({ account }) => this.bulkRemoveCommentsOf({ accountName: account.nameWithHost, scope: 'my-videos' }) } + ] - // Actions on accounts/servers - if (this.account) { - // User actions - this.userActions.push([ - { - label: this.i18n('Mute this account'), - description: this.i18n('Hide any content from that user for you.'), - isDisplayed: ({ account }) => account.mutedByUser === false, - handler: ({ account }) => this.blockAccountByUser(account) - }, - { - label: this.i18n('Unmute this account'), - description: this.i18n('Show back content from that user for you.'), - isDisplayed: ({ account }) => account.mutedByUser === true, - handler: ({ account }) => this.unblockAccountByUser(account) - }, - { - label: this.i18n('Mute the instance'), - description: this.i18n('Hide any content from that instance for you.'), - isDisplayed: ({ account }) => !account.userId && account.mutedServerByInstance === false, - handler: ({ account }) => this.blockServerByUser(account.host) - }, - { - label: this.i18n('Unmute the instance'), - description: this.i18n('Show back content from that instance for you.'), - isDisplayed: ({ account }) => !account.userId && account.mutedServerByInstance === true, - handler: ({ account }) => this.unblockServerByUser(account.host) - }, - { - label: this.i18n('Remove comments from your videos'), - description: this.i18n('Remove comments of this account from your videos.'), - handler: ({ account }) => this.bulkRemoveCommentsOf({ accountName: account.nameWithHost, scope: 'my-videos' }) - } - ]) - - let instanceActions: DropdownAction<{ user: User, account: Account }>[] = [] - - // Instance actions on account blocklists - if (authUser.hasRight(UserRight.MANAGE_ACCOUNTS_BLOCKLIST)) { - instanceActions = instanceActions.concat([ - { - label: this.i18n('Mute this account by your instance'), - description: this.i18n('Hide any content from that user for you, your instance and its users.'), - isDisplayed: ({ account }) => account.mutedByInstance === false, - handler: ({ account }) => this.blockAccountByInstance(account) - }, - { - label: this.i18n('Unmute this account by your instance'), - description: this.i18n('Show back content from that user for you, your instance and its users.'), - isDisplayed: ({ account }) => account.mutedByInstance === true, - handler: ({ account }) => this.unblockAccountByInstance(account) - } - ]) + return myAccountActions + } + + private buildInstanceModerationActions () { + if (!this.authService.isLoggedIn()) return [] + + const authUser = this.authService.getUser() + + let instanceActions: DropdownAction<{ user: User, account: Account }>[] = [] + + if (this.user && authUser.hasRight(UserRight.MANAGE_USERS) && authUser.canManage(this.user)) { + instanceActions = instanceActions.concat([ + { + label: $localize`Edit user`, + description: $localize`Change quota, role, and more.`, + linkBuilder: ({ user }) => this.getRouterUserEditLink(user) + }, + { + label: $localize`Delete user`, + description: $localize`Videos will be deleted, comments will be tombstoned.`, + isDisplayed: ({ user }) => !this.isMyUser(user), + handler: ({ user }) => this.removeUser(user) + }, + { + label: $localize`Ban`, + description: $localize`User won't be able to login anymore, but videos and comments will be kept as is.`, + handler: ({ user }) => this.openBanUserModal(user), + isDisplayed: ({ user }) => !this.isMyUser(user) && !user.blocked + }, + { + label: $localize`Unban user`, + description: $localize`Allow the user to login and create videos/comments again`, + handler: ({ user }) => this.unbanUser(user), + isDisplayed: ({ user }) => !this.isMyUser(user) && user.blocked + }, + { + label: $localize`Set Email as Verified`, + handler: ({ user }) => this.setEmailAsVerified(user), + isDisplayed: ({ user }) => this.requiresEmailVerification && !user.blocked && user.emailVerified === false } + ]) + } - // Instance actions on server blocklists - if (authUser.hasRight(UserRight.MANAGE_SERVERS_BLOCKLIST)) { - instanceActions = instanceActions.concat([ - { - label: this.i18n('Mute the instance by your instance'), - description: this.i18n('Hide any content from that instance for you, your instance and its users.'), - isDisplayed: ({ account }) => !account.userId && account.mutedServerByInstance === false, - handler: ({ account }) => this.blockServerByInstance(account.host) - }, - { - label: this.i18n('Unmute the instance by your instance'), - description: this.i18n('Show back content from that instance for you, your instance and its users.'), - isDisplayed: ({ account }) => !account.userId && account.mutedServerByInstance === true, - handler: ({ account }) => this.unblockServerByInstance(account.host) - } - ]) + // Instance actions on account blocklists + if (this.account && authUser.hasRight(UserRight.MANAGE_ACCOUNTS_BLOCKLIST)) { + instanceActions = instanceActions.concat([ + { + label: $localize`Mute this account`, + description: $localize`Hide any content from that user from you, your instance and its users.`, + isDisplayed: ({ account }) => !this.isMyAccount(account) && account.mutedByInstance === false, + handler: ({ account }) => this.blockAccountByInstance(account) + }, + { + label: $localize`Unmute this account`, + description: $localize`Show this user's content to the users of this instance again.`, + isDisplayed: ({ account }) => !this.isMyAccount(account) && account.mutedByInstance === true, + handler: ({ account }) => this.unblockAccountByInstance(account) } + ]) + } - if (authUser.hasRight(UserRight.REMOVE_ANY_VIDEO_COMMENT)) { - instanceActions = instanceActions.concat([ - { - label: this.i18n('Remove comments from your instance'), - description: this.i18n('Remove comments of this account from your instance.'), - handler: ({ account }) => this.bulkRemoveCommentsOf({ accountName: account.nameWithHost, scope: 'instance' }) - } - ]) + // Instance actions on server blocklists + if (this.account && authUser.hasRight(UserRight.MANAGE_SERVERS_BLOCKLIST)) { + instanceActions = instanceActions.concat([ + { + label: $localize`Mute the instance`, + description: $localize`Hide any content from that instance from you, your instance and its users.`, + isDisplayed: ({ account }) => !account.userId && account.mutedServerByInstance === false, + handler: ({ account }) => this.blockServerByInstance(account.host) + }, + { + label: $localize`Unmute the instance by your instance`, + description: $localize`Show back content from that instance for you, your instance and its users.`, + isDisplayed: ({ account }) => !account.userId && account.mutedServerByInstance === true, + handler: ({ account }) => this.unblockServerByInstance(account.host) } + ]) + } - if (instanceActions.length !== 0) { - this.userActions.push(instanceActions) + if (this.account && authUser.hasRight(UserRight.REMOVE_ANY_VIDEO_COMMENT)) { + instanceActions = instanceActions.concat([ + { + label: $localize`Remove comments from your instance`, + description: $localize`Remove comments made by this account from your instance.`, + isDisplayed: ({ account }) => !this.isMyAccount(account), + handler: ({ account }) => this.bulkRemoveCommentsOf({ accountName: account.nameWithHost, scope: 'instance' }) } - } + ]) } + + if (instanceActions.length === 0) return [] + + return [ { label: $localize`Instance moderation`, isHeader: true }, ...instanceActions ] } }