diff --git a/dashboard/src/components/ImpersonateDialog.vue b/dashboard/src/components/ImpersonateDialog.vue new file mode 100644 index 000000000..402c874c6 --- /dev/null +++ b/dashboard/src/components/ImpersonateDialog.vue @@ -0,0 +1,82 @@ + + + diff --git a/dashboard/src/models/UsersModel.js b/dashboard/src/models/UsersModel.js index 94aa769a4..adab6769e 100644 --- a/dashboard/src/models/UsersModel.js +++ b/dashboard/src/models/UsersModel.js @@ -39,6 +39,21 @@ function create() { return [e]; } + if (result.status !== 204) return [result]; + return [null]; + }, + async setGhost(id, password, expiresAt = 0) { + const data = { password }; + + if (expiresAt) data.expiresAt = expiresAt; + + let result; + try { + result = await fetcher.post(`${origin}/api/v1/users/${id}/ghost`, data, { access_token: accessToken }); + } catch (e) { + return [e]; + } + if (result.status !== 204) return [result]; return [null]; }, diff --git a/dashboard/src/views/UsersView.vue b/dashboard/src/views/UsersView.vue index 29e817f40..d410a6114 100644 --- a/dashboard/src/views/UsersView.vue +++ b/dashboard/src/views/UsersView.vue @@ -9,6 +9,7 @@ import { Button, ButtonGroup, TextInput, Dropdown, TableView, InputDialog } from import { ROLES } from '../constants.js'; import Section from '../components/Section.vue'; import GroupDialog from '../components/GroupDialog.vue'; +import ImpersonateDialog from '../components/ImpersonateDialog.vue'; import UsersModel from '../models/UsersModel.js'; import GroupsModel from '../models/GroupsModel.js'; import ProfileModel from '../models/ProfileModel.js'; @@ -48,6 +49,7 @@ const roles = ref([]); const inputDialog = useTemplateRef('inputDialog'); const groupDialog = useTemplateRef('groupDialog'); +const impersonateDialog = useTemplateRef('impersonateDialog'); const filteredUsers = computed(() => { return users.value.filter(u => { @@ -113,6 +115,10 @@ function groupMembers(group) { return group.userIds.filter(function (uid) { return !!usersById.value[uid]; }).map(function (uid) { return usersById.value[uid].username || usersById.value[uid].email; }).join(' '); } +function onImpersonate(user) { + impersonateDialog.value.open(user); +} + function onEditOrAddGroup(group = null) { groupDialog.value.open(group); } @@ -177,6 +183,7 @@ onMounted(async () => {