From a04bea4bfde0ceb62e6698488216409ff9f443e2 Mon Sep 17 00:00:00 2001 From: Alexander Ackermann Date: Mon, 23 Feb 2026 09:06:40 +0100 Subject: [PATCH 1/3] feat: add fab to admin settings and spaces overview # Conflicts: # packages/web-runtime/src/components/AppFloatingActionButton.vue --- packages/web-app-admin-settings/src/index.ts | 90 +++++++++++++++++-- .../src/views/Groups.vue | 26 +----- .../src/views/Spaces.vue | 13 +-- .../src/views/Users.vue | 28 +----- .../tests/unit/views/Users.spec.ts | 21 +---- .../views/__snapshots__/Users.spec.ts.snap | 6 -- packages/web-app-files/src/extensions.ts | 27 +++++- .../src/views/spaces/Projects.vue | 9 +- .../tests/unit/views/spaces/Projects.spec.ts | 7 -- .../src/components/AppBar/CreateSpace.vue | 79 ---------------- .../web-pkg/src/components/AppBar/index.ts | 1 - .../src/composables/actions/spaces/index.ts | 1 + .../actions/spaces/useSpaceActionsCreate.ts | 54 +++++++++++ .../piniaStores/extensionRegistry/types.ts | 3 + .../src/composables/spaces/useCreateSpace.ts | 25 +++++- .../components/AppBar/CreateSpace.spec.ts | 69 -------------- .../__snapshots__/CreateSpace.spec.ts.snap | 16 ---- .../spaces/useSpaceActionsCreate.spec.ts | 45 ++++++++++ .../components/AppFloatingActionButton.vue | 4 +- .../app-admin-settings/groups/actions.ts | 2 +- .../app-admin-settings/users/actions.ts | 2 +- .../objects/app-files/spaces/actions.ts | 2 +- 22 files changed, 246 insertions(+), 284 deletions(-) delete mode 100644 packages/web-pkg/src/components/AppBar/CreateSpace.vue create mode 100644 packages/web-pkg/src/composables/actions/spaces/useSpaceActionsCreate.ts delete mode 100644 packages/web-pkg/tests/unit/components/AppBar/CreateSpace.spec.ts delete mode 100644 packages/web-pkg/tests/unit/components/AppBar/__snapshots__/CreateSpace.spec.ts.snap create mode 100644 packages/web-pkg/tests/unit/composables/actions/spaces/useSpaceActionsCreate.spec.ts diff --git a/packages/web-app-admin-settings/src/index.ts b/packages/web-app-admin-settings/src/index.ts index 7adb8e62f1..682ae8db57 100644 --- a/packages/web-app-admin-settings/src/index.ts +++ b/packages/web-app-admin-settings/src/index.ts @@ -5,15 +5,25 @@ import Groups from './views/Groups.vue' import Spaces from './views/Spaces.vue' import { urlJoin } from '@opencloud-eu/web-client' import { + activeApp, ApplicationInformation, AppMenuItemExtension, ClassicApplicationScript, defineWebApplication, + Extension, + FloatingActionButtonExtension, useAbility, + useRoute, + useSpaceActionsCreate, useUserStore } from '@opencloud-eu/web-pkg' -import { computed } from 'vue' +import { computed, unref } from 'vue' import { useGettext } from 'vue3-gettext' +import { + useGroupActionsCreateGroup, + useSpaceSettingsStore, + useUserActionsCreateUser +} from './composables' const appId = 'admin-settings' @@ -151,6 +161,19 @@ export default defineWebApplication({ const { can } = useAbility() const userStore = useUserStore() const { $gettext } = useGettext() + const currentRoute = useRoute() + const { upsertSpace } = useSpaceSettingsStore() + + const { actions: createUserActions } = useUserActionsCreateUser() + const createUserAction = computed(() => unref(createUserActions)[0]) + const { actions: createGroupActions } = useGroupActionsCreateGroup() + const createGroupAction = computed(() => unref(createGroupActions)[0]) + const { actions: createSpaceActions } = useSpaceActionsCreate({ + onSpaceCreated: (space) => { + upsertSpace(space) + } + }) + const createSpaceAction = computed(() => unref(createSpaceActions)[0]) const appInfo: ApplicationInformation = { name: $gettext('Admin Settings'), @@ -159,8 +182,8 @@ export default defineWebApplication({ color: '#2b2b2b' } - const menuItems = computed(() => { - const items: AppMenuItemExtension[] = [] + const extensions = computed(() => { + const items: Extension[] = [] const menuItemAvailable = userStore.user && @@ -170,7 +193,7 @@ export default defineWebApplication({ can('read-all', 'Drive')) if (menuItemAvailable) { - items.push({ + const menuItem: AppMenuItemExtension = { id: `app.${appInfo.id}.menuItem`, type: 'appMenuItem', label: () => appInfo.name, @@ -178,9 +201,64 @@ export default defineWebApplication({ icon: appInfo.icon, priority: 40, path: urlJoin(appInfo.id) - }) + } + + items.push(menuItem) + } + + const floatingActionButton: FloatingActionButtonExtension = { + id: `com.github.opencloud-eu.web.${appInfo.id}.floating-action-button`, + extensionPointIds: ['global.floating-action-button'], + type: 'floatingActionButton', + icon: 'add', + label: () => $gettext('New'), + mode: () => 'handler', + handler: () => { + if (unref(currentRoute).name === 'admin-settings-spaces') { + return unref(createSpaceAction).handler() + } + + if (unref(currentRoute).name === 'admin-settings-users') { + return unref(createUserAction).handler() + } + + if (unref(currentRoute).name === 'admin-settings-groups') { + return unref(createGroupAction).handler() + } + + return null + }, + isActive: () => { + return activeApp(unref(currentRoute)) === appInfo.id + }, + isDisabled: () => { + if ( + unref(currentRoute).name === 'admin-settings-spaces' && + unref(createSpaceAction).isVisible() + ) { + return false + } + + if ( + unref(currentRoute).name === 'admin-settings-users' && + unref(createUserAction).isVisible() + ) { + return false + } + + if ( + unref(currentRoute).name === 'admin-settings-groups' && + unref(createGroupAction).isVisible() + ) { + return false + } + + return true + } } + items.push(floatingActionButton) + return items }) @@ -189,7 +267,7 @@ export default defineWebApplication({ routes, navItems, translations, - extensions: menuItems + extensions } } }) diff --git a/packages/web-app-admin-settings/src/views/Groups.vue b/packages/web-app-admin-settings/src/views/Groups.vue index 7a7c1436df..2e26418c2c 100644 --- a/packages/web-app-admin-settings/src/views/Groups.vue +++ b/packages/web-app-admin-settings/src/views/Groups.vue @@ -11,21 +11,6 @@ :batch-action-items="selectedGroups" :show-view-options="true" > -