diff --git a/server/application.py b/server/application.py index 06db68a8..d1eae870 100644 --- a/server/application.py +++ b/server/application.py @@ -34,6 +34,9 @@ "SERVER_TYPE", "COLLECT_STATISTICS", "USER_SELF_REGISTRATION", + "GLOBAL_ADMIN", + "GLOBAL_READ", + "GLOBAL_WRITE", ] ) register_stats(application) diff --git a/web-app/packages/app/src/modules/project/views/ProjectCollaboratorsView.vue b/web-app/packages/app/src/modules/project/views/ProjectCollaboratorsView.vue index dd84f145..b3dc9354 100644 --- a/web-app/packages/app/src/modules/project/views/ProjectCollaboratorsView.vue +++ b/web-app/packages/app/src/modules/project/views/ProjectCollaboratorsView.vue @@ -8,6 +8,7 @@ SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-MerginMaps-Commercial @@ -18,13 +19,15 @@ import { ProjectCollaboratorsViewTemplate, useDialogStore, useProjectStore, - useUserStore + useUserStore, + useInstanceStore } from '@mergin/lib' import { computed } from 'vue' const projectStore = useProjectStore() const dialogStore = useDialogStore() const userStore = useUserStore() +const instanceStore = useInstanceStore() const isProjectOwner = computed(() => projectStore.isProjectOwner) diff --git a/web-app/packages/app/src/modules/project/views/ProjectsListView.vue b/web-app/packages/app/src/modules/project/views/ProjectsListView.vue index fb08e18b..48b07d72 100644 --- a/web-app/packages/app/src/modules/project/views/ProjectsListView.vue +++ b/web-app/packages/app/src/modules/project/views/ProjectsListView.vue @@ -16,6 +16,7 @@ SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-MerginMaps-Commercial :show-namespace="false" :namespace="namespace" :only-public="onlyPublic" + :can-create-project="canCreateProject" @new-project-error="onNewProjectError" /> diff --git a/web-app/packages/lib/src/common/index.ts b/web-app/packages/lib/src/common/index.ts index cecfe55c..4e3f31f8 100644 --- a/web-app/packages/lib/src/common/index.ts +++ b/web-app/packages/lib/src/common/index.ts @@ -2,6 +2,8 @@ // // SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-MerginMaps-Commercial +import { getAvatar } from './mergin_utils' + import { formatDate, formatDateTime, @@ -10,7 +12,6 @@ import { } from '@/common/date_utils' import { formatFileSize, formatToCurrency } from '@/common/number_utils' import { formatToTitle } from '@/common/text_utils' -import { getAvatar } from './mergin_utils' export * from './components' export * from './errors' diff --git a/web-app/packages/lib/src/modules/instance/store.ts b/web-app/packages/lib/src/modules/instance/store.ts index bda7b1c0..a4996baa 100644 --- a/web-app/packages/lib/src/modules/instance/store.ts +++ b/web-app/packages/lib/src/modules/instance/store.ts @@ -28,6 +28,19 @@ export const useInstanceStore = defineStore('instanceModule', { configData: undefined }), + getters: { + /** + * Checks if global roles are enabled based on the config data. + * Returns true if any of the global role flags are truthy, false otherwise. + */ + globalRolesEnabled(state): boolean { + // eslint-disable-next-line camelcase + const { global_read, global_write, global_admin } = state.configData + // eslint-disable-next-line camelcase + return [global_read, global_write, global_admin].some((r) => !!r) + } + }, + actions: { setConfigData(payload: ConfigResponse) { this.configData = payload diff --git a/web-app/packages/lib/src/modules/instance/types.ts b/web-app/packages/lib/src/modules/instance/types.ts index 898b967a..b46c46cd 100644 --- a/web-app/packages/lib/src/modules/instance/types.ts +++ b/web-app/packages/lib/src/modules/instance/types.ts @@ -22,6 +22,9 @@ export interface BaseConfigResponse { major?: number minor?: number fix?: number + global_read?: boolean + global_write?: boolean + global_admin?: boolean } export type ConfigResponse = BaseConfigResponse & diff --git a/web-app/packages/lib/src/modules/layout/components/SideBarTemplate.vue b/web-app/packages/lib/src/modules/layout/components/SideBarTemplate.vue index 02792d14..4a5987de 100644 --- a/web-app/packages/lib/src/modules/layout/components/SideBarTemplate.vue +++ b/web-app/packages/lib/src/modules/layout/components/SideBarTemplate.vue @@ -23,8 +23,8 @@ SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-MerginMaps-Commercial >
-
-
+
+
{ max-width: 16.66%; } -@media screen and (max-width: $lg) { +@media screen and (max-width: $xl) { .sidebar { max-width: 400px; } diff --git a/web-app/packages/lib/src/modules/layout/store.ts b/web-app/packages/lib/src/modules/layout/store.ts index 37b192db..2f3aef49 100644 --- a/web-app/packages/lib/src/modules/layout/store.ts +++ b/web-app/packages/lib/src/modules/layout/store.ts @@ -17,7 +17,7 @@ const CLOSED_ELEMENTS_KEY = 'mm-closed-elements' export const useLayoutStore = defineStore('layoutModule', { state: (): LayoutState => ({ - overlayBreakpoint: 992, + overlayBreakpoint: 1200, drawer: false, isUnderOverlayBreakpoint: false, closedElements: [] diff --git a/web-app/packages/lib/src/modules/project/components/ProjectForm.vue b/web-app/packages/lib/src/modules/project/components/ProjectForm.vue index 43d4c50b..2b8b9abd 100644 --- a/web-app/packages/lib/src/modules/project/components/ProjectForm.vue +++ b/web-app/packages/lib/src/modules/project/components/ProjectForm.vue @@ -60,10 +60,10 @@ import { mapActions, mapState } from 'pinia' import { defineComponent } from 'vue' import { TipMessage } from '@/common/components' +import { useUserStore } from '@/main' import { useDialogStore } from '@/modules/dialog/store' import { useFormStore } from '@/modules/form/store' import { useProjectStore } from '@/modules/project/store' -import { useUserStore } from '@/main' export default defineComponent({ name: 'new-project-form', diff --git a/web-app/packages/lib/src/modules/project/views/ProjectCollaboratorsViewTemplate.vue b/web-app/packages/lib/src/modules/project/views/ProjectCollaboratorsViewTemplate.vue index 15bb6ec4..ac0ef7e3 100644 --- a/web-app/packages/lib/src/modules/project/views/ProjectCollaboratorsViewTemplate.vue +++ b/web-app/packages/lib/src/modules/project/views/ProjectCollaboratorsViewTemplate.vue @@ -32,6 +32,7 @@ SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-MerginMaps-Commercial /> () -withDefaults(defineProps<{ showAccessRequests?: boolean }>(), { - showAccessRequests: false -}) +withDefaults( + defineProps<{ showAccessRequests?: boolean; allowShare?: boolean }>(), + { + showAccessRequests: false, + allowShare: true + } +) const projectStore = useProjectStore() const userStore = useUserStore()