This commit is contained in:
luce 2025-09-15 13:37:08 +02:00
commit ba577aec52
7 changed files with 285 additions and 192 deletions

View file

@ -0,0 +1,41 @@
import ConfirmModal from './confirm_modal.vue'
//import Select from 'src/components/select/select.vue'
export default {
props: {
title: {
type: String
},
message: {
type: String
},
cancelText: {
type: String
},
confirmText: {
type: String
}
},
emits: ['hide', 'show', 'action'],
data: () => ({
showing: false,
text: ""
}),
components: {
ConfirmModal
},
methods: {
show () {
this.showing = true
this.$emit('show')
},
hide () {
this.showing = false
this.$emit('hide')
},
doWithText () {
this.$emit('action', this.text)
this.hide()
}
}
}

View file

@ -0,0 +1,27 @@
<template>
<ConfirmModal
v-if="showing"
:title="title"
:cancel-text="cancelText"
:confirm-text="confirmText"
@accepted="doWithText"
@cancelled="hide"
>
<template #default>
<span v-text="message" />
<input
v-model="text"
class="input string-input filter-input"
>
</template>
</ConfirmModal>
</template>
<script src="./text_confirm.js" />
<style lang="scss">
.expiry-amount {
width: 4em;
text-align: right;
}
</style>

View file

@ -6,6 +6,7 @@ import Modal from 'src/components/modal/modal.vue'
import Popover from 'src/components/popover/popover.vue' import Popover from 'src/components/popover/popover.vue'
import GenericConfirm from 'src/components/confirm_modal/generic_confirm.vue' import GenericConfirm from 'src/components/confirm_modal/generic_confirm.vue'
import Select from 'src/components/select/select.vue' import Select from 'src/components/select/select.vue'
import TextConfirm from 'src/components/confirm_modal/text_confirm.vue'
const AdminCard = { const AdminCard = {
props: { props: {
@ -133,7 +134,8 @@ const AdminCard = {
Modal, Modal,
Popover, Popover,
GenericConfirm, GenericConfirm,
Select Select,
TextConfirm
}, },
methods: { methods: {
/** /**
@ -217,6 +219,22 @@ const AdminCard = {
this.justDeleted = true this.justDeleted = true
} }
}, },
/**
* @param {string} text name of tag to be added to user
*/
addUserTag (text) {
const u = this.$store.getters.findUser(this.userDetails.id)
this.$store.dispatch('adminTagUser', { user: u, tag: text })
.then(() => this.$store.dispatch('fetchUser', this.userDetails.id))
},
/**
* @param {string} text name of tag to be removed from user
*/
removeUserTag (text) {
const u = this.$store.getters.findUser(this.userDetails.id)
this.$store.dispatch('adminUntagUser', { user: u, tag: text })
.then(() => this.$store.dispatch('fetchUser', this.userDetails.id))
},
/** /**
* @param {object} store * @param {object} store
* @param {object} opts * @param {object} opts

View file

@ -1,6 +1,10 @@
<template> <template>
<div v-if="!isLoaded"> <div v-if="!isLoaded">
{{ $t('admin_dash.users.loading_user') }} <FAIcon
icon="circle-notch"
spin
size="lg"
/>
</div> </div>
<div v-else> <div v-else>
<div class="inline-layout"> <div class="inline-layout">
@ -9,38 +13,38 @@
v-if="isAdmin" v-if="isAdmin"
class="alert neutral user-role" class="alert neutral user-role"
> >
{{ $t('admin_dash.users.indicator_admin') }} {{ $t('admin_dash.users.indicator.admin') }}
</label> </label>
<label <label
v-if="isModerator" v-if="isModerator"
class="alert neutral user-role" class="alert neutral user-role"
> >
{{ $t('admin_dash.users.indicator_moderator') }} {{ $t('admin_dash.users.indicator.moderator') }}
</label> </label>
<label <label
v-if="isActivated" v-if="isActivated"
class="alert info user-role" class="alert info user-role"
> >
{{ $t('admin_dash.users.indicator_active') }} {{ $t('admin_dash.users.indicator.active') }}
</label> </label>
<label <label
v-if="!isActivated" v-if="!isActivated"
class="alert error user-role" class="alert error user-role"
> >
{{ $t('admin_dash.users.indicator_deactivated') }} {{ $t('admin_dash.users.indicator.deactivated') }}
</label> </label>
<label <label
v-if="isConfirmed" v-if="isConfirmed"
class="alert neutral user-role" class="alert neutral user-role"
> >
{{ $t('admin_dash.users.indicator_confirmed') }} {{ $t('admin_dash.users.indicator.confirmed') }}
</label> </label>
<button <button
class="button button-default btn" class="button button-default btn"
type="button" type="button"
@click="detailsExpanded = true" @click="detailsExpanded = true"
> >
{{ $t('admin_dash.users.title_details') }} {{ $t('admin_dash.users.details.button') }}
</button> </button>
<Popover <Popover
ref="dropdownuser" ref="dropdownuser"
@ -51,7 +55,7 @@
<button <button
class="button button-default btn" class="button button-default btn"
> >
{{ $t('admin_dash.users.title_actions') }} {{ $t('admin_dash.users.actions.title') }}
</button> </button>
</template> </template>
<template #content> <template #content>
@ -230,6 +234,9 @@
class="panel-body" class="panel-body"
style="overflow-y: auto;" style="overflow-y: auto;"
> >
<h2 class="title">
{{ $t('admin_dash.users.details.overview') }}
</h2>
<ul <ul
class="setting-list" class="setting-list"
style="columns: 2;" style="columns: 2;"
@ -240,9 +247,6 @@
<li> <li>
{{ $t('admin_dash.users.details.actor_type') }} {{ $t('admin_dash.users.details.actor_type') }}
</li> </li>
<li>
{{ $t('admin_dash.users.details.tags') }}
</li>
<li> <li>
{{ $t('admin_dash.users.details.roles') }} {{ $t('admin_dash.users.details.roles') }}
</li> </li>
@ -258,9 +262,6 @@
<li> <li>
{{ $t('admin_dash.users.details.actor_types.' + user.actor_type.toLowerCase()) }} {{ $t('admin_dash.users.details.actor_types.' + user.actor_type.toLowerCase()) }}
</li> </li>
<li>
{{ user.tags }}
</li>
<li> <li>
<span v-if="user.rights.admin === true"> {{ $t('admin_dash.users.details.admin') }} </span> <span v-if="user.rights.admin === true"> {{ $t('admin_dash.users.details.admin') }} </span>
<span v-if="user.rights.admin === true && user.rights.moderator === true"> ,&nbsp; </span> <span v-if="user.rights.admin === true && user.rights.moderator === true"> ,&nbsp; </span>
@ -275,6 +276,36 @@
<span v-else> {{ $t('admin_dash.users.details.inactive') }} </span> <span v-else> {{ $t('admin_dash.users.details.inactive') }} </span>
</li> </li>
</ul> </ul>
<h2 class="title">
{{ $t('admin_dash.users.details.tags') }}
</h2>
<ul class="setting-list">
<li
v-for="tag in user.tags"
:key="tag"
>
{{ tag }}
<button
class="button button-default btn"
@click="removeUserTag(tag)"
>
<FAIcon
icon="minus"
size="lg"
/>
</button>
</li>
</ul>
<button
class="button button-default btn"
@click="$refs.addTextBox.show()"
>
{{ $t('admin_dash.users.tags.add_new') }}
<FAIcon
icon="plus"
size="lg"
/>
</button>
<PageList <PageList
ref="timelineList" ref="timelineList"
:refresh="true" :refresh="true"
@ -317,7 +348,7 @@
<button <button
class="button button-default btn" class="button button-default btn"
> >
{{ $t('admin_dash.users.actions.button.title') }} {{ $t('admin_dash.users.actions.title') }}
</button> </button>
</template> </template>
<p> wrap </p> <p> wrap </p>
@ -459,6 +490,14 @@
:confirm-text="$t('admin_dash.users.bulk_actions.yes')" :confirm-text="$t('admin_dash.users.bulk_actions.yes')"
@action="userActionConfirmed('adminDisableMFA')" @action="userActionConfirmed('adminDisableMFA')"
/> />
<TextConfirm
ref="addTextBox"
style="z-index: 10001;"
:title="$t('admin_dash.users.tags.new_title')"
:cancel-text="$t('admin_dash.users.tags.no')"
:confirm-text="$t('admin_dash.users.tags.yes')"
@action="addUserTag"
/>
</template> </template>
<script src="./admin_card.js"></script> <script src="./admin_card.js"></script>

View file

@ -3,22 +3,22 @@
<div <div
class="setting-item" class="setting-item"
> >
<h2> {{ $t('admin_dash.users.title_users') }} </h2> <h2> {{ $t('admin_dash.users.title') }} </h2>
<ul class="setting-list"> <ul class="setting-list">
<li> <li>
<label class="query-label"> {{ $t('admin_dash.users.label_query') }} </label> <label class="query-label"> {{ $t('admin_dash.users.labels.query') }} </label>
<input <input
v-model="filtersQuery" v-model="filtersQuery"
class="input string-input filter-input" class="input string-input filter-input"
@input="reset()" @input="reset()"
> >
<label class="query-label"> {{ $t('admin_dash.users.label_name') }} </label> <label class="query-label"> {{ $t('admin_dash.users.labels.name') }} </label>
<input <input
v-model="filtersName" v-model="filtersName"
class="input string-input filter-input" class="input string-input filter-input"
@input="reset()" @input="reset()"
> >
<label class="query-label"> {{ $t('admin_dash.users.label_email') }} </label> <label class="query-label"> {{ $t('admin_dash.users.labels.email') }} </label>
<input <input
v-model="filtersEmail" v-model="filtersEmail"
class="input string-input filter-input" class="input string-input filter-input"
@ -26,7 +26,7 @@
> >
</li> </li>
<li> <li>
<label class="query-label"> {{ $t('admin_dash.users.label_origin') }} </label> <label class="query-label"> {{ $t('admin_dash.users.labels.origin') }} </label>
<Select <Select
v-model="filtersOrigin" v-model="filtersOrigin"
@update:model-value="reset" @update:model-value="reset"
@ -34,20 +34,20 @@
<option <option
value="all" value="all"
> >
{{ $t('admin_dash.users.all') }} {{ $t('admin_dash.users.options.all') }}
</option> </option>
<option <option
value="local" value="local"
> >
{{ $t('admin_dash.users.only_local') }} {{ $t('admin_dash.users.options.only_local') }}
</option> </option>
<option <option
value="external" value="external"
> >
{{ $t('admin_dash.users.only_external') }} {{ $t('admin_dash.users.options.only_external') }}
</option> </option>
</Select> </Select>
<label class="query-label"> {{ $t('admin_dash.users.label_activity') }} </label> <label class="query-label"> {{ $t('admin_dash.users.labels.activity') }} </label>
<Select <Select
v-model="filtersActivity" v-model="filtersActivity"
@update:model-value="reset" @update:model-value="reset"
@ -55,20 +55,20 @@
<option <option
value="all" value="all"
> >
{{ $t('admin_dash.users.all') }} {{ $t('admin_dash.users.options.all') }}
</option> </option>
<option <option
value="active" value="active"
> >
{{ $t('admin_dash.users.only_active') }} {{ $t('admin_dash.users.options.only_active') }}
</option> </option>
<option <option
value="deactivated" value="deactivated"
> >
{{ $t('admin_dash.users.only_deactivated') }} {{ $t('admin_dash.users.options.only_deactivated') }}
</option> </option>
</Select> </Select>
<label class="query-label"> {{ $t('admin_dash.users.label_privileges') }} </label> <label class="query-label"> {{ $t('admin_dash.users.labels.privileges') }} </label>
<Select <Select
v-model="filtersPrivileges" v-model="filtersPrivileges"
@update:model-value="reset" @update:model-value="reset"
@ -76,22 +76,22 @@
<option <option
value="all" value="all"
> >
{{ $t('admin_dash.users.all') }} {{ $t('admin_dash.users.options.all') }}
</option> </option>
<option <option
value="admin" value="admin"
> >
{{ $t('admin_dash.users.only_administrators') }} {{ $t('admin_dash.users.options.only_admins') }}
</option> </option>
<option <option
value="modsnadmins" value="modsnadmins"
> >
{{ $t('admin_dash.users.all_privileged') }} {{ $t('admin_dash.users.options.only_privileged') }}
</option> </option>
<option <option
value="moderator" value="moderator"
> >
{{ $t('admin_dash.users.only_moderators') }} {{ $t('admin_dash.users.options.only_moderators') }}
</option> </option>
</Select> </Select>
</li> </li>
@ -100,13 +100,13 @@
class="query-label" class="query-label"
@update:model-value="v => {filtersNeedApproval = v; reset();}" @update:model-value="v => {filtersNeedApproval = v; reset();}"
> >
{{ $t('admin_dash.users.only_unapproved') }} {{ $t('admin_dash.users.options.only_unapproved') }}
</Checkbox> </Checkbox>
<Checkbox <Checkbox
class="query-label" class="query-label"
@update:model-value="v => {filtersUncomfirmed = v; reset();}" @update:model-value="v => {filtersUncomfirmed = v; reset();}"
> >
{{ $t('admin_dash.users.only_unconfirmed') }} {{ $t('admin_dash.users.options.only_unconfirmed') }}
</Checkbox> </Checkbox>
</li> </li>
</ul> </ul>
@ -128,7 +128,7 @@
<button <button
class="button button-default btn" class="button button-default btn"
> >
{{ $t('admin_dash.users.bulk_actions.title') }} {{ $t('admin_dash.users.actions.title') }}
</button> </button>
</template> </template>
<template #content> <template #content>
@ -138,7 +138,7 @@
class="main-button" class="main-button"
@click="confirmSelection('confirmActivate')" @click="confirmSelection('confirmActivate')"
> >
{{ $t('admin_dash.users.activate') }} {{ $t('admin_dash.users.actions.activate') }}
</button> </button>
</div> </div>
<div class="menu-item dropdown-item"> <div class="menu-item dropdown-item">
@ -146,7 +146,7 @@
class="main-button" class="main-button"
@click="confirmSelection('confirmDeactivate')" @click="confirmSelection('confirmDeactivate')"
> >
{{ $t('admin_dash.users.deactivate') }} {{ $t('admin_dash.users.actions.deactivate') }}
</button> </button>
</div> </div>
<div class="menu-item dropdown-item"> <div class="menu-item dropdown-item">
@ -154,7 +154,7 @@
class="main-button" class="main-button"
@click="confirmSelection('confirmDelete')" @click="confirmSelection('confirmDelete')"
> >
{{ $t('admin_dash.users.delete') }} {{ $t('admin_dash.users.actions.delete_user') }}
</button> </button>
</div> </div>
<div class="menu-item dropdown-item"> <div class="menu-item dropdown-item">
@ -162,7 +162,7 @@
class="main-button" class="main-button"
@click="confirmSelection('confirmGrantAdmin')" @click="confirmSelection('confirmGrantAdmin')"
> >
{{ $t('admin_dash.users.grant_admin') }} {{ $t('admin_dash.users.actions.grant_admin') }}
</button> </button>
</div> </div>
<div class="menu-item dropdown-item"> <div class="menu-item dropdown-item">
@ -170,7 +170,7 @@
class="main-button" class="main-button"
@click="confirmSelection('confirmRevokeAdmin')" @click="confirmSelection('confirmRevokeAdmin')"
> >
{{ $t('admin_dash.users.revoke_admin') }} {{ $t('admin_dash.users.actions.revoke_admin') }}
</button> </button>
</div> </div>
<div class="menu-item dropdown-item"> <div class="menu-item dropdown-item">
@ -178,7 +178,7 @@
class="main-button" class="main-button"
@click="confirmSelection('confirmGrantModerator')" @click="confirmSelection('confirmGrantModerator')"
> >
{{ $t('admin_dash.users.grant_moderator') }} {{ $t('admin_dash.users.actions.grant_moderator') }}
</button> </button>
</div> </div>
<div class="menu-item dropdown-item"> <div class="menu-item dropdown-item">
@ -186,7 +186,7 @@
class="main-button" class="main-button"
@click="confirmSelection('confirmRevokeModerator')" @click="confirmSelection('confirmRevokeModerator')"
> >
{{ $t('admin_dash.users.revoke_moderator') }} {{ $t('admin_dash.users.actions.revoke_moderator') }}
</button> </button>
</div> </div>
<div class="menu-item dropdown-item"> <div class="menu-item dropdown-item">
@ -194,7 +194,7 @@
class="main-button" class="main-button"
@click="confirmSelection('confirmApprove')" @click="confirmSelection('confirmApprove')"
> >
{{ $t('admin_dash.users.approve') }} {{ $t('admin_dash.users.actions.approve') }}
</button> </button>
</div> </div>
<div class="menu-item dropdown-item"> <div class="menu-item dropdown-item">
@ -202,7 +202,7 @@
class="main-button" class="main-button"
@click="confirmSelection('confirmConfirm')" @click="confirmSelection('confirmConfirm')"
> >
{{ $t('admin_dash.users.confirm_user') }} {{ $t('admin_dash.users.actions.confirm') }}
</button> </button>
</div> </div>
<div class="menu-item dropdown-item"> <div class="menu-item dropdown-item">
@ -210,7 +210,7 @@
class="main-button" class="main-button"
@click="confirmSelection('confirmResendEmail')" @click="confirmSelection('confirmResendEmail')"
> >
{{ $t('admin_dash.users.resend_confirmation_email') }} {{ $t('admin_dash.users.actions.resend_confirmation_email') }}
</button> </button>
</div> </div>
<div class="menu-item dropdown-item"> <div class="menu-item dropdown-item">
@ -218,15 +218,15 @@
class="main-button" class="main-button"
@click="confirmSelection('confirmRequirePasswordChange')" @click="confirmSelection('confirmRequirePasswordChange')"
> >
{{ $t('admin_dash.users.require_password_change') }} {{ $t('admin_dash.users.actions.require_password_change') }}
</button> </button>
</div> </div>
<div class="menu-item dropdown-item"> <div class="menu-item dropdown-item">
<button <button
class="main-button" class="main-button"
@click="confirmSelection('adminDisableMFA')" @click="confirmSelection('confirmDisableMFA')"
> >
{{ $t('admin_dash.users.disable_mfa') }} {{ $t('admin_dash.users.actions.disable_mfa') }}
</button> </button>
</div> </div>
</div> </div>
@ -246,87 +246,98 @@
</div> </div>
<GenericConfirm <GenericConfirm
ref="confirmActivate" ref="confirmActivate"
:title="$t('admin_dash.users.bulk_actions.activate')" :title="$t('admin_dash.users.actions.confirm_multi.title')"
:cancel-text="$t('admin_dash.users.bulk_actions.no')" :message="$t('admin_dash.users.actions.confirm_multi.activate')"
:confirm-text="$t('admin_dash.users.bulk_actions.yes')" :cancel-text="$t('admin_dash.users.actions.no')"
:confirm-text="$t('admin_dash.users.actions.yes')"
@action="selectionConfirmed('adminActivateUser')" @action="selectionConfirmed('adminActivateUser')"
/> />
<GenericConfirm <GenericConfirm
ref="confirmDeactivate" ref="confirmDeactivate"
:title="$t('admin_dash.users.bulk_actions.deactivate')" :title="$t('admin_dash.users.actions.confirm_multi.title')"
:cancel-text="$t('admin_dash.users.bulk_actions.no')" :message="$t('admin_dash.users.actions.confirm_multi.deactivate')"
:confirm-text="$t('admin_dash.users.bulk_actions.yes')" :cancel-text="$t('admin_dash.users.actions.no')"
:confirm-text="$t('admin_dash.users.actions.yes')"
@action="selectionConfirmed('adminDeactivateUser')" @action="selectionConfirmed('adminDeactivateUser')"
/> />
<GenericConfirm <GenericConfirm
ref="confirmDelete" ref="confirmDelete"
:title="$t('admin_dash.users.bulk_actions.delete')" :title="$t('admin_dash.users.actions.confirm_multi.title')"
:cancel-text="$t('admin_dash.users.bulk_actions.no')" :message="$t('admin_dash.users.actions.confirm_multi.delete_user')"
:confirm-text="$t('admin_dash.users.bulk_actions.yes')" :cancel-text="$t('admin_dash.users.actions.no')"
:confirm-text="$t('admin_dash.users.actions.yes')"
@action="selectionConfirmed('adminDeleteUser')" @action="selectionConfirmed('adminDeleteUser')"
/> />
<GenericConfirm <GenericConfirm
ref="confirmGrantAdmin" ref="confirmGrantAdmin"
:title="$t('admin_dash.users.bulk_actions.grant_admin')" :title="$t('admin_dash.users.actions.confirm_multi.title')"
:cancel-text="$t('admin_dash.users.bulk_actions.no')" :message="$t('admin_dash.users.actions.confirm_multi.grant_admin')"
:confirm-text="$t('admin_dash.users.bulk_actions.yes')" :cancel-text="$t('admin_dash.users.actions.no')"
:confirm-text="$t('admin_dash.users.actions.yes')"
@action="selectionConfirmed('adminAddUserToAdminGroup')" @action="selectionConfirmed('adminAddUserToAdminGroup')"
/> />
<GenericConfirm <GenericConfirm
ref="confirmRevokeAdmin" ref="confirmRevokeAdmin"
:title="$t('admin_dash.users.bulk_actions.revoke_admin')" :title="$t('admin_dash.users.actions.confirm_multi.title')"
:cancel-text="$t('admin_dash.users.bulk_actions.no')" :message="$t('admin_dash.users.actions.confirm_multi.revoke_admin')"
:confirm-text="$t('admin_dash.users.bulk_actions.yes')" :cancel-text="$t('admin_dash.users.actions.no')"
:confirm-text="$t('admin_dash.users.actions.yes')"
@action="selectionConfirmed('adminRemoveUserFromAdminGroup')" @action="selectionConfirmed('adminRemoveUserFromAdminGroup')"
/> />
<GenericConfirm <GenericConfirm
ref="confirmGrantModerator" ref="confirmGrantModerator"
:title="$t('admin_dash.users.bulk_actions.grant_moderator')" :title="$t('admin_dash.users.actions.confirm_multi.title')"
:cancel-text="$t('admin_dash.users.bulk_actions.no')" :message="$t('admin_dash.users.actions.confirm_multi.grant_moderator')"
:confirm-text="$t('admin_dash.users.bulk_actions.yes')" :cancel-text="$t('admin_dash.users.actions.no')"
:confirm-text="$t('admin_dash.users.actions.yes')"
@action="selectionConfirmed('adminAddUserToModeratorGroup')" @action="selectionConfirmed('adminAddUserToModeratorGroup')"
/> />
<GenericConfirm <GenericConfirm
ref="confirmRevokeModerator" ref="confirmRevokeModerator"
:title="$t('admin_dash.users.bulk_actions.revoke_moderator')" :title="$t('admin_dash.users.actions.confirm_multi.title')"
:cancel-text="$t('admin_dash.users.bulk_actions.no')" :message="$t('admin_dash.users.actions.confirm_multi.revoke_moderator')"
:confirm-text="$t('admin_dash.users.bulk_actions.yes')" :cancel-text="$t('admin_dash.users.actions.no')"
:confirm-text="$t('admin_dash.users.actions.yes')"
@action="selectionConfirmed('adminRemoveUserFromModeratorGroup')" @action="selectionConfirmed('adminRemoveUserFromModeratorGroup')"
/> />
<GenericConfirm <GenericConfirm
ref="confirmApprove" ref="confirmApprove"
:title="$t('admin_dash.users.bulk_actions.approve')" :title="$t('admin_dash.users.actions.confirm_multi.title')"
:cancel-text="$t('admin_dash.users.bulk_actions.no')" :message="$t('admin_dash.users.actions.confirm_multi.approve')"
:confirm-text="$t('admin_dash.users.bulk_actions.yes')" :cancel-text="$t('admin_dash.users.actions.no')"
:confirm-text="$t('admin_dash.users.actions.yes')"
@action="selectionConfirmed('adminApproveUser')" @action="selectionConfirmed('adminApproveUser')"
/> />
<GenericConfirm <GenericConfirm
ref="confirmConfirm" ref="confirmConfirm"
:title="$t('admin_dash.users.bulk_actions.confirm')" :title="$t('admin_dash.users.actions.confirm_multi.title')"
:cancel-text="$t('admin_dash.users.bulk_actions.no')" :message="$t('admin_dash.users.actions.confirm_multi.confirm')"
:confirm-text="$t('admin_dash.users.bulk_actions.yes')" :cancel-text="$t('admin_dash.users.actions.no')"
:confirm-text="$t('admin_dash.users.actions.yes')"
@action="selectionConfirmed('adminConfirmUser')" @action="selectionConfirmed('adminConfirmUser')"
/> />
<GenericConfirm <GenericConfirm
ref="confirmResendEmail" ref="confirmResendEmail"
:title="$t('admin_dash.users.bulk_actions.resend_confirmation_email')" :title="$t('admin_dash.users.actions.confirm_multi.title')"
:cancel-text="$t('admin_dash.users.bulk_actions.no')" :message="$t('admin_dash.users.actions.confirm_multi.resend_confirmation_email')"
:confirm-text="$t('admin_dash.users.bulk_actions.yes')" :cancel-text="$t('admin_dash.users.actions.no')"
:confirm-text="$t('admin_dash.users.actions.yes')"
@action="selectionConfirmed('adminResendConfirmationEmail')" @action="selectionConfirmed('adminResendConfirmationEmail')"
/> />
<GenericConfirm <GenericConfirm
ref="confirmRequirePasswordChange" ref="confirmRequirePasswordChange"
:title="$t('admin_dash.users.bulk_actions.require_password_change')" :title="$t('admin_dash.users.actions.confirm_multi.title')"
:cancel-text="$t('admin_dash.users.bulk_actions.no')" :message="$t('admin_dash.users.actions.confirm_multi.require_password_change')"
:confirm-text="$t('admin_dash.users.bulk_actions.yes')" :cancel-text="$t('admin_dash.users.actions.no')"
:confirm-text="$t('admin_dash.users.actions.yes')"
@action="selectionConfirmed('adminRequirePasswordChange')" @action="selectionConfirmed('adminRequirePasswordChange')"
/> />
<GenericConfirm <GenericConfirm
ref="confirmDisableMFA" ref="confirmDisableMFA"
:title="$t('admin_dash.users.title_confirm')" :title="$t('admin_dash.users.actions.confirm_multi.title')"
:message="$t('admin_dash.users.bulk_actions.disable_mfa')" :message="$t('admin_dash.users.actions.disable_mfa')"
:cancel-text="$t('admin_dash.users.bulk_actions.no')" :cancel-text="$t('admin_dash.users.actions.no')"
:confirm-text="$t('admin_dash.users.bulk_actions.yes')" :confirm-text="$t('admin_dash.users.actions.yes')"
@action="selectionConfirmed('adminDisableMFA')" @action="selectionConfirmed('adminDisableMFA')"
/> />
</div> </div>

View file

@ -1152,51 +1152,65 @@
} }
}, },
"users": { "users": {
"management": "Management", "title": "Users",
"search_users": "Search for users...", "labels": {
"label_query": "Query", "query": "Query",
"label_name": "Name", "name": "Name",
"label_email": "Email", "email": "Email",
"label_origin": "Origin", "origin": "Origin",
"label_activity": "Activity", "activity": "Activity",
"label_privileges": "Privileges", "privileges": "Privileges"
"all": "All", },
"only_local": "Local Only", "tags": {
"only_external": "External Only", "add_new": "Add New Tag",
"only_active": "Active Only", "new_title": "Enter New Tag And Confirm",
"only_deactivated": "Deactivated Only", "yes": "Add",
"only_administrators": "Admin Only", "no": "Abort"
"all_privileged": "All Privileged", },
"only_moderators": "Moderators Only", "options": {
"only_unapproved": "Unapproved Only", "all": "All",
"only_unconfirmed": "Unconfirmed Only", "only_local": "Only Local",
"refresh": "Refresh", "only_external": "Only External",
"only_active": "Only Active",
"only_deactivated": "Only Deactivated",
"only_admins": "Only Admins",
"only_privileged": "Only Privileged",
"only_moderators": "Only Moderators",
"only_unapproved": "Exclude Approved",
"only_unconfirmed": "Exclude Confirmed"
},
"filters": { "filters": {
"show_direct": "Show Direct Posts", "show_direct": "Show Direct Posts",
"show_reblogs": "Show Reblogs", "show_reblogs": "Show Reblogs",
"ascending": "Oldest First", "ascending": "Oldest First",
"descending": "Newest First" "descending": "Newest First"
}, },
"indicator": {
"admin": "Admin",
"moderator": "Moderator",
"active": "Active",
"deactivated": "Deactivated",
"confirmed": "Confirmed"
},
"actions": { "actions": {
"button": { "title": "Actions",
"title": "Actions", "yes": "Confirm",
"yes": "Confirm", "no": "Abort",
"no": "Abort", "activate": "Activate",
"activate": "Activate", "deactivate": "Deactivate",
"deactivate": "Deactivate", "delete_user": "Delete",
"delete_user": "Delete", "delete_status": "Delete",
"delete_status": "Delete", "grant_admin": "Grant Admin",
"grant_admin": "Grant Admin", "revoke_admin": "Revoke Admin",
"revoke_admin": "Revoke Admin", "grant_moderator": "Grant Moderator",
"grant_moderator": "Grant Moderator", "revoke_moderator": "Revoke Moderator",
"revoke_moderator": "Revoke Moderator", "approve": "Approve",
"approve": "Approve", "confirm": "Confirm",
"confirm": "Confirm", "require_password_change": "Require Password Change",
"require_password_change": "Require Password Change", "resend_confirmation_email": "Resend Confirmation Email",
"resend_confirmation_email": "Resend Confirmation Email", "disable_mfa": "Disable MFA",
"disable_mfa": "Disable MFA"
},
"confirm_single": { "confirm_single": {
"title": "Confirm",
"activate": "Activate User?", "activate": "Activate User?",
"deactivate": "Deactivate User?", "deactivate": "Deactivate User?",
"delete_user": "Delete User?", "delete_user": "Delete User?",
@ -1212,7 +1226,8 @@
"disable_mfa": "Disable MFA?" "disable_mfa": "Disable MFA?"
}, },
"confirm_multi": { "confirm_multi": {
"activate": "Actiate Selected Users?", "title": "Confirm For Selection",
"activate": "Activate Selected Users?",
"deactivate": "Deactivate Selected Users?", "deactivate": "Deactivate Selected Users?",
"delete_user": "Delete Selected Users?", "delete_user": "Delete Selected Users?",
"delete_status": "Delete Selected Statuses?", "delete_status": "Delete Selected Statuses?",
@ -1229,6 +1244,9 @@
} }
}, },
"details": { "details": {
"title": "User Details",
"overview": "Overview",
"button": "Details",
"id": "ID", "id": "ID",
"actor_type": "Actor Type", "actor_type": "Actor Type",
"actor_types": { "actor_types": {
@ -1246,74 +1264,7 @@
"status": "Status", "status": "Status",
"remote": "Remote", "remote": "Remote",
"account_type": "Account Type" "account_type": "Account Type"
}, }
"bulk_actions": {
"title": "Bulk Actions",
"yes": "Yes",
"no": "No",
"activate": "Activate Selected Users?",
"deactivate": "Deactivate Selected Users?",
"delete_user": "Delete Selected Users?",
"delete_status": "Delete Selected Statuses?",
"grant_admin": "Grant Admin Privileges To Selected Users?",
"revoke_admin": "Revoke Admin Privileges From Selected Users?",
"grant_moderator": "Grant Moderator Privileges To Selected Users?",
"revoke_moderator": "Revoke Moderator Privileges From Selected Users?",
"approve": "Approve Selected Users?",
"confirm": "Confirm Selected Users?",
"require_password_change": "Require Password Change For Selected Users?",
"resend_confirmation_email": "Resend Confirmation Email For Selected Users?",
"disable_mfa": "Disable MFA For Selected Users?"
},
"activate": "Activate?",
"deactivate": "Deactivate?",
"delete_user": "Delete User?",
"resend_confirmation_email": "Resend confirmation email",
"approve": "Approve",
"grant_admin": "Grant Admin",
"revoke_admin": "Revoke Admin",
"grant_moderator": "Grant Moderator",
"revoke_moderator": "Revoke Moderator",
"confirm_user": "Confirm",
"resend_confirmation_email": "Resend Confirmation Email",
"require_password_change": "Require Password Change",
"disable_mfa": "Disable MFA",
"delete": "Delete",
"loading_user": "Loading user...",
"delete_user": "Delete User",
"expand_user": "Expand user",
"collapse_user": "Collapse user",
"is_admin": "Is admin",
"is_moderator": "Is moderator",
"is_confirmed": "Is confirmed",
"is_active": "Is active",
"expand_timeline": "Expand timeline",
"collapse_timeline": "Collapse timeline",
"expand_raw_info": "Expand raw info",
"collapse_raw_info": "Collapse raw info",
"status_id": "Status ID",
"created_at": "Created at",
"edited_at": "Edited at",
"delete_status": "Delete status",
"content_nsfw": "Content marked sensitive",
"scope_public": "Public",
"scope_unlisted": "Unlisted",
"scope_private": "Private",
"scope_direct": "Direct",
"title_info": "Info",
"title_content": "Content",
"link_source": "Source",
"title_database": "Database",
"title_details": "Details",
"title_users": "Users",
"title_actions": "Actions",
"user_has_no_posts": "User has no posts",
"indicator_admin": "Admin",
"indicator_moderator": "Moderator",
"indicator_active": "Active",
"indicator_deactivated": "Deactivated",
"indicator_approved": "Approved",
"indicator_confirmed": "Confirmed"
}, },
"limits": { "limits": {
"arbitrary_limits": "Arbitrary limits", "arbitrary_limits": "Arbitrary limits",

View file

@ -117,6 +117,12 @@ const adminSettingsStorage = {
adminDisableMFA (store, { opts }) { adminDisableMFA (store, { opts }) {
return store.rootState.api.backendInteractor.adminDisableMFA({ opts }) return store.rootState.api.backendInteractor.adminDisableMFA({ opts })
}, },
adminTagUser (store, { user, tag }) {
return store.rootState.api.backendInteractor.tagUser({ user, tag })
},
adminUntagUser (store, { user, tag }) {
return store.rootState.api.backendInteractor.untagUser({ user, tag })
},
loadFrontendsStuff ({ rootState, commit }) { loadFrontendsStuff ({ rootState, commit }) {
rootState.api.backendInteractor.fetchAvailableFrontends() rootState.api.backendInteractor.fetchAvailableFrontends()
.then(frontends => commit('setAvailableFrontends', { frontends })) .then(frontends => commit('setAvailableFrontends', { frontends }))