diff --git a/packages/frontend-2/components/auth/sso/WorkspaceSelect.vue b/packages/frontend-2/components/auth/sso/WorkspaceSelect.vue
index 4e9a13b7f..fe81ba7c6 100644
--- a/packages/frontend-2/components/auth/sso/WorkspaceSelect.vue
+++ b/packages/frontend-2/components/auth/sso/WorkspaceSelect.vue
@@ -9,22 +9,14 @@
>
diff --git a/packages/frontend-2/components/dashboard/ProjectCard.vue b/packages/frontend-2/components/dashboard/ProjectCard.vue
index 7f3eb638c..36b4e2fdb 100644
--- a/packages/frontend-2/components/dashboard/ProjectCard.vue
+++ b/packages/frontend-2/components/dashboard/ProjectCard.vue
@@ -28,7 +28,7 @@
>
@@ -77,7 +77,7 @@ graphql(`
id
slug
name
- ...WorkspaceAvatar_Workspace
+ logo
}
}
`)
diff --git a/packages/frontend-2/components/dashboard/Sidebar.vue b/packages/frontend-2/components/dashboard/Sidebar.vue
index cab1f5b01..b4a52aca7 100644
--- a/packages/frontend-2/components/dashboard/Sidebar.vue
+++ b/packages/frontend-2/components/dashboard/Sidebar.vue
@@ -90,11 +90,7 @@
class="!pl-1"
>
-
+
@@ -235,10 +231,10 @@ const workspacesItems = computed(() =>
workspaceResult.value?.activeUser
? workspaceResult.value.activeUser.workspaces.items.map((workspace) => ({
label: workspace.name,
+ name: workspace.name,
id: workspace.id,
to: workspaceRoute(workspace.slug),
logo: workspace.logo,
- defaultLogoIndex: workspace.defaultLogoIndex,
plan: {
status: workspace.plan?.status
},
diff --git a/packages/frontend-2/components/invite/Banner.vue b/packages/frontend-2/components/invite/Banner.vue
index 74a3b1d65..6b6ddb169 100644
--- a/packages/frontend-2/components/invite/Banner.vue
+++ b/packages/frontend-2/components/invite/Banner.vue
@@ -5,7 +5,7 @@
@@ -69,7 +69,7 @@ type GenericInviteItem = {
workspace?: {
id: string
logo?: string
- defaultLogoIndex: number
+ name: string
}
user?: MaybeNullOrUndefined<{
id: string
diff --git a/packages/frontend-2/components/project/page/Header.vue b/packages/frontend-2/components/project/page/Header.vue
index 399f3f436..3ad44b4e1 100644
--- a/packages/frontend-2/components/project/page/Header.vue
+++ b/packages/frontend-2/components/project/page/Header.vue
@@ -28,7 +28,7 @@
>
@@ -59,7 +59,7 @@ graphql(`
id
slug
name
- ...WorkspaceAvatar_Workspace
+ logo
}
}
`)
diff --git a/packages/frontend-2/components/projects/HiddenProjectWarning.vue b/packages/frontend-2/components/projects/HiddenProjectWarning.vue
index e3b73a7b8..406a742f5 100644
--- a/packages/frontend-2/components/projects/HiddenProjectWarning.vue
+++ b/packages/frontend-2/components/projects/HiddenProjectWarning.vue
@@ -17,11 +17,7 @@
color="outline"
>
-
+
{{ session.name }}
@@ -42,7 +38,6 @@ graphql(`
slug
name
logo
- defaultLogoIndex
}
}
`)
diff --git a/packages/frontend-2/components/projects/MoveToWorkspaceDialog.vue b/packages/frontend-2/components/projects/MoveToWorkspaceDialog.vue
index 2deb8a628..f0cd5ccb2 100644
--- a/packages/frontend-2/components/projects/MoveToWorkspaceDialog.vue
+++ b/packages/frontend-2/components/projects/MoveToWorkspaceDialog.vue
@@ -78,7 +78,6 @@ graphql(`
id
role
name
- defaultLogoIndex
logo
...WorkspaceHasCustomDataResidency_Workspace
...ProjectsWorkspaceSelect_Workspace
diff --git a/packages/frontend-2/components/projects/ProjectDashboardCard.vue b/packages/frontend-2/components/projects/ProjectDashboardCard.vue
index ce7709c6f..c946acbde 100644
--- a/packages/frontend-2/components/projects/ProjectDashboardCard.vue
+++ b/packages/frontend-2/components/projects/ProjectDashboardCard.vue
@@ -33,7 +33,7 @@
>
diff --git a/packages/frontend-2/components/projects/WorkspaceSelect.vue b/packages/frontend-2/components/projects/WorkspaceSelect.vue
index f1e8d5037..185cb11e5 100644
--- a/packages/frontend-2/components/projects/WorkspaceSelect.vue
+++ b/packages/frontend-2/components/projects/WorkspaceSelect.vue
@@ -22,7 +22,7 @@
@@ -32,11 +32,7 @@
-
+
{{ item.name }}
@@ -54,7 +50,6 @@ graphql(`
id
role
name
- defaultLogoIndex
logo
}
`)
diff --git a/packages/frontend-2/components/settings/Dialog.vue b/packages/frontend-2/components/settings/Dialog.vue
index eb8eaf620..1e60e20df 100644
--- a/packages/frontend-2/components/settings/Dialog.vue
+++ b/packages/frontend-2/components/settings/Dialog.vue
@@ -59,7 +59,7 @@
@@ -148,12 +148,12 @@ import { WorkspacePlanStatuses } from '~/lib/common/generated/gql/graphql'
graphql(`
fragment SettingsDialog_Workspace on Workspace {
- ...WorkspaceAvatar_Workspace
...SettingsMenu_Workspace
id
slug
role
name
+ logo
plan {
status
}
diff --git a/packages/frontend-2/components/settings/workspaces/Billing.vue b/packages/frontend-2/components/settings/workspaces/Billing.vue
index b24edbb8f..73074c6b6 100644
--- a/packages/frontend-2/components/settings/workspaces/Billing.vue
+++ b/packages/frontend-2/components/settings/workspaces/Billing.vue
@@ -58,32 +58,29 @@
: 'Monthly bill'
}}
-
-
- {{ billValue }} per month
-
-
- {{ billDescription }}
-
-
-
-
-
-
+
+ {{ billValue }} per
+ {{
+ subscription?.billingInterval === BillingInterval.Yearly
+ ? 'year'
+ : 'month'
+ }}
+
+
+ {{ billDescription }}
+
+
{{
statusIsTrial && isPurchasablePlan
? 'Trial ends'
+ : statusIsCanceled
+ ? 'Cancels'
: 'Next payment due'
}}
@@ -134,6 +131,34 @@
/>
+
+ Need help?
+
+ Read the docs
+
+ or
+
+ contact support
+
+
+
currentPlan.value?.status === WorkspacePlanStatuses.Canceled
+)
const isActivePlan = computed(
() =>
currentPlan.value &&
currentPlan.value?.status !== WorkspacePlanStatuses.Trial &&
currentPlan.value?.status !== WorkspacePlanStatuses.Canceled
)
-const isPurchasablePlan = computed(
- () =>
- currentPlan.value?.name === WorkspacePlans.Starter ||
- currentPlan.value?.name === WorkspacePlans.Plus ||
- currentPlan.value?.name === WorkspacePlans.Business ||
- !currentPlan.value?.name // no plan equals pro trial plan
-)
+const isPurchasablePlan = computed(() => isPaidPlan(currentPlan.value?.name))
const seatPrice = computed(() =>
currentPlan.value && subscription.value
? seatPrices.value[currentPlan.value.name as keyof typeof seatPrices.value][
@@ -252,19 +279,23 @@ const nextPaymentDue = computed(() =>
)
const isAdmin = computed(() => workspace.value?.role === Roles.Workspace.Admin)
const guestSeatCount = computed(() =>
- workspace.value
- ? workspace.value.team.items.filter((user) => user.role === Roles.Workspace.Guest)
- .length
- : 0
+ isActivePlan.value
+ ? workspace.value?.subscription?.seats.guest ?? 0
+ : workspace.value?.team.items.filter((user) => user.role === Roles.Workspace.Guest)
+ .length ?? 0
)
const memberSeatCount = computed(() =>
- workspace.value ? workspace.value.team.items.length - guestSeatCount.value : 0
+ isActivePlan.value
+ ? workspace.value?.subscription?.seats.plan ?? 0
+ : workspace.value
+ ? workspace.value.team.items.length - guestSeatCount.value
+ : 0
)
const billValue = computed(() => {
const guestPrice = seatPrice.value[Roles.Workspace.Guest] * guestSeatCount.value
const memberPrice = seatPrice.value[Roles.Workspace.Member] * memberSeatCount.value
const totalPrice = guestPrice + memberPrice
- if (statusIsTrial.value) return `£${totalPrice}`
+ if (isPurchasablePlan.value) return `£${totalPrice}`
return `£0`
})
const billDescription = computed(() => {
diff --git a/packages/frontend-2/components/settings/workspaces/General/DeleteDialog.vue b/packages/frontend-2/components/settings/workspaces/General/DeleteDialog.vue
index 0e7ea5664..e6d8a9e35 100644
--- a/packages/frontend-2/components/settings/workspaces/General/DeleteDialog.vue
+++ b/packages/frontend-2/components/settings/workspaces/General/DeleteDialog.vue
@@ -126,14 +126,12 @@ const onDelete = async () => {
isDeleted: true
})
- if (!import.meta.dev) {
- await sendWebhook(defaultZapierWebhookUrl, {
- userId: activeUser.value?.id ?? '',
- feedback: feedback.value
- ? `Action: Workspace Deleted(${props.workspace.name}) Feedback: ${feedback.value}`
- : `Action: Workspace Deleted(${props.workspace.name}) - No feedback provided`
- })
- }
+ await sendWebhook(defaultZapierWebhookUrl, {
+ userId: activeUser.value?.id ?? '',
+ feedback: feedback.value
+ ? `Action: Workspace Deleted(${props.workspace.name}) Feedback: ${feedback.value}`
+ : `Action: Workspace Deleted(${props.workspace.name}) - No feedback provided`
+ })
triggerNotification({
type: ToastNotificationType.Success,
diff --git a/packages/frontend-2/components/settings/workspaces/General/EditAvatar.vue b/packages/frontend-2/components/settings/workspaces/General/EditAvatar.vue
index 2b91445c8..122e48673 100644
--- a/packages/frontend-2/components/settings/workspaces/General/EditAvatar.vue
+++ b/packages/frontend-2/components/settings/workspaces/General/EditAvatar.vue
@@ -3,7 +3,6 @@
v-model:edit-mode="editMode"
:model-value="workspace.logo"
:placeholder="workspace.name"
- :default-img="defaultAvatar"
name="edit-avatar"
:disabled="loading || disabled"
:size="size"
@@ -16,14 +15,12 @@ import type { SettingsWorkspacesGeneralEditAvatar_WorkspaceFragment } from '~~/l
import type { MaybeNullOrUndefined } from '@speckle/shared'
import type { UserAvatarSize } from '@speckle/ui-components/dist/composables/user/avatar'
import { useUpdateWorkspace } from '~~/lib/settings/composables/management'
-import { useWorkspacesAvatar } from '~~/lib/workspaces/composables/avatar'
graphql(`
fragment SettingsWorkspacesGeneralEditAvatar_Workspace on Workspace {
id
logo
name
- defaultLogoIndex
}
`)
@@ -34,12 +31,9 @@ const props = defineProps<{
}>()
const { mutate, loading } = useUpdateWorkspace()
-const { getDefaultAvatar } = useWorkspacesAvatar()
const editMode = ref(false)
-const defaultAvatar = computed(() => getDefaultAvatar(props.workspace.defaultLogoIndex))
-
const onSave = async (newVal: MaybeNullOrUndefined) => {
if (props.workspace.logo === newVal) return
if (loading.value) return
diff --git a/packages/frontend-2/components/settings/workspaces/billing/PricingTable/Plan.vue b/packages/frontend-2/components/settings/workspaces/billing/PricingTable/Plan.vue
index 397516639..f87bb2ada 100644
--- a/packages/frontend-2/components/settings/workspaces/billing/PricingTable/Plan.vue
+++ b/packages/frontend-2/components/settings/workspaces/billing/PricingTable/Plan.vue
@@ -67,7 +67,7 @@
v-if="plan.features.includes(feature.name as PlanFeaturesList)"
class="w-4 h-4 text-foreground mx-2"
/>
-
+
+ class="h-full w-full bg-cover bg-center bg-no-repeat flex items-center justify-center"
+ :style="{ backgroundImage: `url('${logo}')` }"
+ >
+
+ {{ name[0] }}
+
+