From a022ba942f4bef972dd58ff67e4188c603cbfed3 Mon Sep 17 00:00:00 2001 From: luce Date: Sun, 20 Jul 2025 18:59:05 +0200 Subject: [PATCH] adding more things for managing users --- src/components/page_list/page_list.vue | 3 + .../settings_modal/admin_tabs/admin_card.js | 124 ++++++++-- .../settings_modal/admin_tabs/admin_card.vue | 152 +++++++++--- .../settings_modal/admin_tabs/users_tab.js | 75 +++++- .../settings_modal/admin_tabs/users_tab.scss | 3 + .../settings_modal/admin_tabs/users_tab.vue | 225 ++++++++++-------- src/i18n/en.json | 3 +- src/modules/adminSettings.js | 30 ++- src/services/api/api.service.js | 50 ++-- 9 files changed, 476 insertions(+), 189 deletions(-) create mode 100644 src/components/settings_modal/admin_tabs/users_tab.scss diff --git a/src/components/page_list/page_list.vue b/src/components/page_list/page_list.vue index 3de52579c..a0219c7e5 100644 --- a/src/components/page_list/page_list.vue +++ b/src/components/page_list/page_list.vue @@ -5,6 +5,9 @@ :get-key="i => i" :items="items" > + diff --git a/src/components/settings_modal/admin_tabs/admin_card.js b/src/components/settings_modal/admin_tabs/admin_card.js index c9bf8147e..ea145c0c6 100644 --- a/src/components/settings_modal/admin_tabs/admin_card.js +++ b/src/components/settings_modal/admin_tabs/admin_card.js @@ -1,28 +1,108 @@ import BasicUserCard from '../../basic_user_card/basic_user_card.vue' +import Checkbox from 'src/components/checkbox/checkbox.vue' const AdminCard = { - props: ['userId'], - data () { - return { - progress: false - } - }, - computed: { - isLoaded () { - return typeof(this.user) !== 'undefined' - }, - user () { - return this.$store.getters.findUser(this.userId) - }, - relationship () { - return this.$store.getters.relationship(this.userId) - }, - }, - components: { - BasicUserCard - }, - methods: { - } + props: ['userDetails'], + data () { + return { + progress: false, + top_level_expanded: false, + json_expanded: false, + just_approved: false, + just_confirmed: false, + just_deleted: false, + } + }, + mounted () { + }, + computed: { + isLoaded () { + return typeof(this.user) !== 'undefined' + }, + user () { + return this.$store.getters.findUser(this.userDetails.id) + }, + relationship () { + return this.$store.getters.relationship(this.userDetails.id) + }, + is_local () { + const u = this.$store.getters.findUser(this.userDetails.id) + if (typeof(u) !== 'undefined') { + return u.is_local === true + } + return false + }, + is_admin () { + const u = this.$store.getters.findUser(this.userDetails.id) + if (typeof(u) !== 'undefined') { + return u.rights.admin === true + } + return false + }, + is_moderator () { + const u = this.$store.getters.findUser(this.userDetails.id) + if (typeof(u) !== 'undefined') { + return u.rights.moderator === true + } + return false + }, + is_activated () { + const u = this.$store.getters.findUser(this.userDetails.id) + if (typeof(u) !== 'undefined') { + return u.deactivated === false + } + return false + }, + is_confirmed () { + return (this.userDetails.is_confirmed === false) || (this.just_confirmed === true) + }, + is_approved () { + return (this.userDetails.is_approved === false) || (this.just_approved === true) + } + }, + components: { + BasicUserCard, + Checkbox + }, + methods: { + toggle_admin (v) { + const u = this.$store.getters.findUser(this.userDetails.id) + console.log('user', u) + if (v === true) { + this.$store.dispatch('adminAddUserToAdminGroup', u).then(res => console.log("res: ", res)) + } else { + this.$store.dispatch('adminRemoveUserFromAdminGroup', u) + } + }, + toggle_moderator (v) { + const u = this.$store.getters.findUser(this.userDetails.id) + if (v === true) { + this.$store.dispatch('adminAddUserToModeratorGroup', u) + } else { + this.$store.dispatch('adminRemoveUserFromModeratorGroup', u) + } + }, + toggle_activation (v) { + const u = this.$store.getters.findUser(this.userDetails.id) + if (v === true) { + this.$store.dispatch('adminActivateUser', u) + } else { + this.$store.dispatch('adminDeactivateUser', u) + } + }, + toggle_confirmation () {}, + toggle_approval () {}, + force_update_user () { + this.$store.dispatch('fetchUser', this.userDetails.id) + }, + delete_user () { + if (!this.just_deleted) { + const u = this.$store.getters.findUser(this.userDetails.id) + this.$store.dispatch('adminDeleteUser', u) + this.just_deleted = true + } + } + } } export default AdminCard diff --git a/src/components/settings_modal/admin_tabs/admin_card.vue b/src/components/settings_modal/admin_tabs/admin_card.vue index c54cdcf1f..d2d434b3d 100644 --- a/src/components/settings_modal/admin_tabs/admin_card.vue +++ b/src/components/settings_modal/admin_tabs/admin_card.vue @@ -1,42 +1,126 @@ + diff --git a/src/components/settings_modal/admin_tabs/users_tab.js b/src/components/settings_modal/admin_tabs/users_tab.js index 03274533d..5a59f308d 100644 --- a/src/components/settings_modal/admin_tabs/users_tab.js +++ b/src/components/settings_modal/admin_tabs/users_tab.js @@ -5,8 +5,7 @@ import BasicUserCard from 'src/components/basic_user_card/basic_user_card.vue' import ProgressButton from 'src/components/progress_button/progress_button.vue' import AdminCard from 'src/components/settings_modal/admin_tabs/admin_card.vue' import PageList from 'src/components/page_list/page_list.vue' - - +import TabSwitcher from 'src/components/tab_switcher/tab_switcher.jsx' const UsersTab = { provide () { @@ -17,8 +16,14 @@ const UsersTab = { }, data() { return { + /* filters must match the filter options below initially, or the ui is gonna have a computer moment + * no, i won't fix this + * */ + filters_origin: "local", + filters_activity: "all", + filters_permission: "all", filters: { - local: false, + local: true, external: false, active: false, need_approval: false, @@ -38,35 +43,89 @@ const UsersTab = { PageList, ProgressButton, AdminCard, + TabSwitcher, }, computed: { }, methods: { + update_origin (v) { + switch (v) { + case 'local': + this.filters.local = true + this.filters.external = false + break; + case 'external': + this.filters.local = false + this.filters.external = true + break; + default: + case 'all': + this.filters.local = false + this.filters.external = false + break; + } + this.reset() + }, + update_activity (v) { + switch (v) { + case 'active': + this.filters.active = true + this.filters.deactivated = false + break; + case 'deactivated': + this.filters.active = false + this.filters.deactivated = true + break; + default: + case 'all': + this.filters.active = false + this.filters.deactivated = false + break; + } + this.reset() + }, + update_permission (v) { + switch (v) { + case 'admin': + this.filters.is_admin = true + this.filters.is_moderator = false + break; + case 'moderator': + this.filters.is_admin = false + this.filters.is_moderator = true + break; + case 'modsnadmins': + this.filters.is_admin = true + this.filters.is_moderator = true + break; + default: + case 'all': + this.filters.is_admin = false + this.filters.is_moderator = false + break; + } + this.reset() + }, delete_selection () { - console.log('delete selection') }, delete_user () {}, fetch_page (store, opts) { opts.query = "" - console.log('current filters:', this.filters) opts.filters = this.filters opts.name = "" opts.email = "" const users = store.dispatch('fetchAdminUsers', opts) - console.log('users', users) return users }, reset () { this.$refs.userList.reset() }, toggleLocal () { - console.log('toggle local') this.filters.local = !this.filters.local this.reset() } }, mounted() { - console.log("mounted") } } diff --git a/src/components/settings_modal/admin_tabs/users_tab.scss b/src/components/settings_modal/admin_tabs/users_tab.scss new file mode 100644 index 000000000..a42308167 --- /dev/null +++ b/src/components/settings_modal/admin_tabs/users_tab.scss @@ -0,0 +1,3 @@ +.user-tab { + height: 100%; +} diff --git a/src/components/settings_modal/admin_tabs/users_tab.vue b/src/components/settings_modal/admin_tabs/users_tab.vue index d60cd99a3..a5f42af9a 100644 --- a/src/components/settings_modal/admin_tabs/users_tab.vue +++ b/src/components/settings_modal/admin_tabs/users_tab.vue @@ -1,101 +1,130 @@ + + diff --git a/src/i18n/en.json b/src/i18n/en.json index e8bdd53c3..0af0d37aa 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -1132,7 +1132,8 @@ } }, "users": { - "users": "User Management", + "management": "Management", + "invitations": "Invitations", "search_users": "Search for users...", "filters": { "show_all": "show all", diff --git a/src/modules/adminSettings.js b/src/modules/adminSettings.js index a55a48951..05aa030aa 100644 --- a/src/modules/adminSettings.js +++ b/src/modules/adminSettings.js @@ -57,7 +57,7 @@ const adminSettingsStorage = { }, resetAdminDraft (state) { state.draft = cloneDeep(state.config) - } + }, }, actions: { async fetchAdminUsers (store, opts) { @@ -67,6 +67,34 @@ const adminSettingsStorage = { //) return users }, + adminAddUserToAdminGroup (store, user) { + store.rootState.api.backendInteractor.adminAddUserToAdminGroup({ user }) + .then(res => store.commit('updateRight', { user, right: 'admin', value: res.is_admin })) + }, + adminRemoveUserFromAdminGroup (store, user) { + return store.rootState.api.backendInteractor.adminRemoveUserFromAdminGroup({ user }) + .then(res => store.commit('updateRight', { user, right: 'admin', value: res.is_admin })) + }, + adminAddUserToModeratorGroup (store, user) { + return store.rootState.api.backendInteractor.adminAddUserToModeratorGroup({ user }) + .then(res => store.commit('updateRight', { user, right: 'moderator', value: res.is_moderator })) + }, + adminRemoveUserFromModeratorGroup (store, user) { + return store.rootState.api.backendInteractor.adminRemoveUserFromModeratorGroup({ user }) + .then(res => store.commit('updateRight', { user, right: 'moderator', value: res.is_moderator })) + }, + adminActivateUser (store, user) { + return store.rootState.api.backendInteractor.activateUser({ user }) + .then(res => console.log(res)) + }, + adminDeactivateUser (store, user) { + return store.rootState.api.backendInteractor.deactivateUser({ user }) + .then(res => console.log(res)) + }, + adminDeleteUser (store, user) { + return store.rootState.api.backendInteractor.deleteUser({ user }) + .then(res => console.log(res)) + }, loadFrontendsStuff ({ rootState, commit }) { rootState.api.backendInteractor.fetchAvailableFrontends() .then(frontends => commit('setAvailableFrontends', { frontends })) diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js index acb014a53..94cb9966a 100644 --- a/src/services/api/api.service.js +++ b/src/services/api/api.service.js @@ -136,6 +136,7 @@ const PLEROMA_ADMIN_USERS_URL = ({page, pageSize, filters = {}, query = '', name + (is_moderator ? 'is_moderator,' : '') return `/api/v1/pleroma/admin/users?page=${page}&page_size=${pageSize}&filters=${filters_str}&query=${query}&name=${name}&email=${email}` } +const PLEROMA_ADMIN_MODIFY_GROUP_URL = (nickname, group) => `/api/v1/pleroma/admin/users/${nickname}/permission_group/${group}` const PLEROMA_ADMIN_DELETE_USERS_URL = '/api/v1/pleroma/admin/users' const PLEROMA_ADMIN_ACTIVATE_USER_URL = '/api/v1/pleroma/admin/users/activate' const PLEROMA_ADMIN_DEACTIVATE_USER_URL = '/api/v1/pleroma/admin/users/deactivate' @@ -1475,37 +1476,35 @@ const adminListUsers = ({ opts, credentials }) => { }).then((data) => data.users.map(parseUser)) } -const adminDeleteUser = ({ nicknames, credentials }) => { - return promisedRequest({ - url: PLEROMA_ADMIN_DELETE_USERS_URL, +const adminAddUserToAdminGroup = ({ user, credentials }) => { + const url = PLEROMA_ADMIN_MODIFY_GROUP_URL(user.name_html, 'admin') + return promisedRequest({ url: url, credentials, - method: 'DELETE', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify({'nicknames': nicknames}) + method: 'POST' }) } -const adminActivateUser = ({ nicknames, credentials }) => { - return promisedRequest({ url: PLEROMA_ADMIN_ACTIVATE_USER_URL, +const adminRemoveUserFromAdminGroup = ({ user, credentials }) => { + const url = PLEROMA_ADMIN_MODIFY_GROUP_URL(user.name_html, 'admin') + return promisedRequest({ url: url, credentials, - method: 'PATCH', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify({'nicknames': nicknames}) + method: 'DELETE' }) } -const adminDeactivateUser = ({ nicknames, credentials }) => { - return promisedRequest({ url: PLEROMA_ADMIN_DEACTIVATE_USER_URL, +const adminAddUserToModeratorGroup = ({ user, credentials }) => { + const url = PLEROMA_ADMIN_MODIFY_GROUP_URL(user.name_html, 'moderator') + return promisedRequest({ url: url, credentials, - method: 'PATCH', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify({'nicknames': nicknames}) + method: 'POST' + }) +} + +const adminRemoveUserFromModeratorGroup = ({ user, credentials }) => { + const url = PLEROMA_ADMIN_MODIFY_GROUP_URL(user.name_html, 'moderator') + return promisedRequest({ url: url, + credentials, + method: 'DELETE' }) } @@ -2182,9 +2181,10 @@ const apiService = { updateBookmarkFolder, deleteBookmarkFolder, adminListUsers, - adminDeleteUser, - adminActivateUser, - adminDeactivateUser, + adminAddUserToAdminGroup, + adminRemoveUserFromAdminGroup, + adminAddUserToModeratorGroup, + adminRemoveUserFromModeratorGroup, } export default apiService