diff --git a/resources/js_vue3/router/index.js b/resources/js_vue3/router/index.js index ce62e635..bd2d6096 100644 --- a/resources/js_vue3/router/index.js +++ b/resources/js_vue3/router/index.js @@ -10,9 +10,8 @@ import CreateAccount from '../views/twofaccounts/Create.vue' import EditAccount from '../views/twofaccounts/Edit.vue' import ImportAccount from '../views/twofaccounts/Import.vue' import QRcodeAccount from '../views/twofaccounts/QRcode.vue' -import Groups from '../views/Groups.vue' -// import CreateGroup from './views/groups/Create.vue' -// import EditGroup from './views/groups/Edit.vue' +import Groups from '../views/groups/Groups.vue' +import CreateUpdateGroup from '../views/groups/CreateUpdate.vue' import Login from '../views/auth/Login.vue' import Register from '../views/auth/Register.vue' // import Autolock from './views/auth/Autolock.vue' @@ -45,8 +44,8 @@ const router = createRouter({ { path: '/account/:twofaccountId/qrcode', name: 'showQRcode', component: QRcodeAccount, meta: { middlewares: [authGuard] } }, { path: '/groups', name: 'groups', component: Groups, meta: { middlewares: [authGuard] }, props: true }, - // { path: '/group/create', name: 'createGroup', component: CreateGroup, meta: { middlewares: [authGuard] } }, - // { path: '/group/:groupId/edit', name: 'editGroup', component: EditGroup, meta: { middlewares: [authGuard] }, props: true }, + { path: '/group/create', name: 'createGroup', component: CreateUpdateGroup, meta: { middlewares: [authGuard] } }, + { path: '/group/:groupId/edit', name: 'editGroup', component: CreateUpdateGroup, meta: { middlewares: [authGuard] }, props: true }, { path: '/settings/options', name: 'settings.options', component: SettingsOptions, meta: { middlewares: [authGuard], showAbout: true } }, { path: '/settings/account', name: 'settings.account', component: SettingsAccount, meta: { middlewares: [authGuard], showAbout: true } }, diff --git a/resources/js_vue3/services/groupService.js b/resources/js_vue3/services/groupService.js index 2578fae8..5c427554 100644 --- a/resources/js_vue3/services/groupService.js +++ b/resources/js_vue3/services/groupService.js @@ -11,8 +11,16 @@ export default { return apiClient.get('groups') }, + get(id, config = {}) { + return apiClient.get('/groups/' + id, { ...config }) + }, + assign(accountsIds, groupId, config = {}) { return apiClient.post('/groups/' + groupId + '/assign', {ids: accountsIds}) - } + }, + + delete(id, config = {}) { + return apiClient.delete('/groups/' + id, { ...config }) + }, } \ No newline at end of file diff --git a/resources/js_vue3/stores/bus.js b/resources/js_vue3/stores/bus.js index fb6d37ec..352e99db 100644 --- a/resources/js_vue3/stores/bus.js +++ b/resources/js_vue3/stores/bus.js @@ -10,6 +10,7 @@ export const useBusStore = defineStore({ goBackTo: null, returnTo: null, inManagementMode: false, + editedGroupName: null, } }, diff --git a/resources/js_vue3/stores/groups.js b/resources/js_vue3/stores/groups.js index 7507247b..b7054574 100644 --- a/resources/js_vue3/stores/groups.js +++ b/resources/js_vue3/stores/groups.js @@ -1,5 +1,6 @@ import { defineStore } from 'pinia' import { useUserStore } from '@/stores/user' +import { useNotifyStore } from '@/stores/notify' import groupService from '@/services/groupService' export const useGroups = defineStore({ @@ -16,10 +17,42 @@ export const useGroups = defineStore({ const group = state.items.find(item => item.id === parseInt(useUserStore().preferences.activeGroup)) return group ? group.name : trans('commons.all') - } + }, + + withoutTheAllGroup(state) { + return state.items.filter(item => item.id > 0) + }, + + theAllGroup(state) { + return state.items.find(item => item.id == 0) + }, + + isEmpty() { + return this.withoutTheAllGroup.length == 0 + }, + + count() { + return this.withoutTheAllGroup.length + }, }, actions: { + /** + * Adds or edits a group + * @param {object} group + */ + addOrEdit(group) { + const index = this.items.findIndex(g => g.id === parseInt(group.id)) + + if (index > -1) { + this.items[index] = group + useNotifyStore().success({ text: trans('groups.group_name_saved') }) + } + else { + this.items.push(group) + useNotifyStore().success({ text: trans('groups.group_successfully_created') }) + } + }, /** * Fetches the groups collection from the backend @@ -30,5 +63,25 @@ export const useGroups = defineStore({ }) }, + /** + * Deletes a group + */ + async delete(id) { + const user = useUserStore() + + if (confirm(trans('groups.confirm.delete'))) { + await groupService.delete(id).then(response => { + this.items = this.items.filter(a => a.id !== id) + useNotifyStore().success({ text: trans('groups.group_successfully_deleted') }) + + // Reset group filter to 'All' (groupId=0) since the backend has already made + // the change automatically. This prevents a new request. + if( parseInt(user.preferences.activeGroup) === id ) { + user.preferences.activeGroup = 0 + } + }) + } + }, + }, }) diff --git a/resources/js_vue3/views/groups/CreateUpdate.vue b/resources/js_vue3/views/groups/CreateUpdate.vue new file mode 100644 index 00000000..7e71e251 --- /dev/null +++ b/resources/js_vue3/views/groups/CreateUpdate.vue @@ -0,0 +1,80 @@ + + + + + + + + + + \ No newline at end of file diff --git a/resources/js_vue3/views/groups/Groups.vue b/resources/js_vue3/views/groups/Groups.vue new file mode 100644 index 00000000..73cb9229 --- /dev/null +++ b/resources/js_vue3/views/groups/Groups.vue @@ -0,0 +1,79 @@ + + + + + + {{ $t('groups.groups') }} + + + {{ $t('groups.manage_groups_legend')}} + + + + {{ $t('groups.create_group') }} + + + + + {{ group.name }} + + + + {{ $t('commons.delete') }} + + + + + + + {{ group.twofaccounts_count }} {{ $t('twofaccounts.accounts') }} + + + {{ $t('groups.deleting_group_does_not_delete_accounts')}} + + + + + + + + + + + + + {{ $t('commons.close') }} + + + + + \ No newline at end of file
+ + {{ $t('commons.close') }} + +