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()