Merge pull request #4149 from specklesystems/dim/one-more-time-for-mirna

feat: removes docs link, adds usecases quickstart card
This commit is contained in:
Dimitrie Stefanescu
2025-03-10 16:13:59 +00:00
committed by GitHub
4 changed files with 205 additions and 53 deletions
@@ -27,11 +27,23 @@ export type ActiveUserMutations = {
emailMutations: UserEmailMutations;
/** Mark onboarding as complete */
finishOnboarding: Scalars['Boolean']['output'];
setActiveWorkspace: Scalars['Boolean']['output'];
/** Edit a user's profile */
update: User;
};
export type ActiveUserMutationsFinishOnboardingArgs = {
input?: InputMaybe<OnboardingCompletionInput>;
};
export type ActiveUserMutationsSetActiveWorkspaceArgs = {
isProjectsActive?: InputMaybe<Scalars['Boolean']['input']>;
slug?: InputMaybe<Scalars['String']['input']>;
};
export type ActiveUserMutationsUpdateArgs = {
user: UserUpdateInput;
};
@@ -243,6 +255,11 @@ export type AutomateAuthCodePayloadTest = {
workspaceId?: InputMaybe<Scalars['String']['input']>;
};
/** Additional resources to validate user access to. */
export type AutomateAuthCodeResources = {
workspaceId?: InputMaybe<Scalars['String']['input']>;
};
export type AutomateFunction = {
__typename?: 'AutomateFunction';
/** Only returned if user is a part of this speckle server */
@@ -938,6 +955,18 @@ export type DiscoverableStreamsSortingInput = {
type: DiscoverableStreamsSortType;
};
export type DiscoverableWorkspaceCollaborator = {
__typename?: 'DiscoverableWorkspaceCollaborator';
avatar?: Maybe<Scalars['String']['output']>;
};
export type DiscoverableWorkspaceCollaboratorCollection = {
__typename?: 'DiscoverableWorkspaceCollaboratorCollection';
cursor?: Maybe<Scalars['String']['output']>;
items: Array<DiscoverableWorkspaceCollaborator>;
totalCount: Scalars['Int']['output'];
};
export type EditCommentInput = {
commentId: Scalars['String']['input'];
content: CommentContentInput;
@@ -1151,6 +1180,31 @@ export type LimitedWorkspace = {
name: Scalars['String']['output'];
/** Unique workspace short id. Used for navigation. */
slug: Scalars['String']['output'];
/** Workspace members visible to people with verified email domain */
team?: Maybe<DiscoverableWorkspaceCollaboratorCollection>;
};
/** Workspace metadata visible to non-workspace members. */
export type LimitedWorkspaceTeamArgs = {
cursor?: InputMaybe<Scalars['String']['input']>;
limit?: Scalars['Int']['input'];
};
export type LimitedWorkspaceJoinRequest = {
__typename?: 'LimitedWorkspaceJoinRequest';
createdAt: Scalars['DateTime']['output'];
id: Scalars['String']['output'];
status: WorkspaceJoinRequestStatus;
user: LimitedUser;
workspace: LimitedWorkspace;
};
export type LimitedWorkspaceJoinRequestCollection = {
__typename?: 'LimitedWorkspaceJoinRequestCollection';
cursor?: Maybe<Scalars['String']['output']>;
items: Array<LimitedWorkspaceJoinRequest>;
totalCount: Scalars['Int']['output'];
};
export type MarkCommentViewedInput = {
@@ -1811,10 +1865,18 @@ export type ObjectCreateInput = {
streamId: Scalars['String']['input'];
};
export type OnboardingCompletionInput = {
plans?: InputMaybe<Array<Scalars['String']['input']>>;
role?: InputMaybe<Scalars['String']['input']>;
source?: InputMaybe<Scalars['String']['input']>;
};
export enum PaidWorkspacePlans {
Business = 'business',
Plus = 'plus',
Starter = 'starter'
Pro = 'pro',
Starter = 'starter',
Team = 'team'
}
export type PasswordStrengthCheckFeedback = {
@@ -1889,6 +1951,13 @@ export type PendingWorkspaceCollaboratorsFilter = {
search?: InputMaybe<Scalars['String']['input']>;
};
export type Price = {
__typename?: 'Price';
amount: Scalars['Float']['output'];
currency: Scalars['String']['output'];
currencySymbol: Scalars['String']['output'];
};
export type Project = {
__typename?: 'Project';
allowPublicComments: Scalars['Boolean']['output'];
@@ -2621,7 +2690,6 @@ export type Query = {
* Either token or workspaceId must be specified, or both
*/
workspaceInvite?: Maybe<PendingWorkspaceCollaborator>;
workspacePricingPlans: Scalars['JSONObject']['output'];
/** Find workspaces a given user email can use SSO to sign with */
workspaceSsoByEmail: Array<LimitedWorkspace>;
};
@@ -2662,6 +2730,7 @@ export type QueryAutomateFunctionsArgs = {
export type QueryAutomateValidateAuthCodeArgs = {
payload: AutomateAuthCodePayloadTest;
resources?: InputMaybe<AutomateAuthCodeResources>;
};
@@ -2866,6 +2935,8 @@ export type ServerAutomateInfo = {
export type ServerConfiguration = {
__typename?: 'ServerConfiguration';
blobSizeLimitBytes: Scalars['Int']['output'];
/** Whether the email feature is enabled on this server */
isEmailEnabled: Scalars['Boolean']['output'];
objectMultipartUploadSizeLimitBytes: Scalars['Int']['output'];
objectSizeLimitBytes: Scalars['Int']['output'];
};
@@ -3016,6 +3087,8 @@ export type ServerStats = {
export type ServerWorkspacesInfo = {
__typename?: 'ServerWorkspacesInfo';
/** Up-to-date prices for paid & non-invoiced Workspace plans */
planPrices: Array<WorkspacePlanPrice>;
/**
* This is a backend control variable for the workspaces feature set.
* Since workspaces need a backend logic to be enabled, this is not enough as a feature flag.
@@ -3624,6 +3697,8 @@ export type UpgradePlanInput = {
*/
export type User = {
__typename?: 'User';
/** The last-visited workspace for the given user */
activeWorkspace?: Maybe<Workspace>;
/**
* All the recent activity from this user in chronological order
* @deprecated Part of the old API surface and will be removed in the future.
@@ -3671,6 +3746,8 @@ export type User = {
id: Scalars['ID']['output'];
/** Whether post-sign up onboarding has been finished or skipped entirely */
isOnboardingFinished?: Maybe<Scalars['Boolean']['output']>;
/** Returns `true` if last visited project was "legacy" "personal project" outside of a workspace */
isProjectsActive?: Maybe<Scalars['Boolean']['output']>;
name: Scalars['String']['output'];
notificationPreferences: Scalars['JSONObject']['output'];
profiles?: Maybe<Scalars['JSONObject']['output']>;
@@ -3707,6 +3784,7 @@ export type User = {
versions: CountOnlyCollection;
/** Get all invitations to workspaces that the active user has */
workspaceInvites: Array<PendingWorkspaceCollaborator>;
workspaceJoinRequests?: Maybe<LimitedWorkspaceJoinRequestCollection>;
/** Get the workspaces for the user */
workspaces: WorkspaceCollection;
};
@@ -3808,6 +3886,17 @@ export type UserVersionsArgs = {
};
/**
* Full user type, should only be used in the context of admin operations or
* when a user is reading/writing info about himself
*/
export type UserWorkspaceJoinRequestsArgs = {
cursor?: InputMaybe<Scalars['String']['input']>;
filter?: InputMaybe<WorkspaceJoinRequestFilter>;
limit?: Scalars['Int']['input'];
};
/**
* Full user type, should only be used in the context of admin operations or
* when a user is reading/writing info about himself
@@ -4420,6 +4509,10 @@ export type WorkspaceJoinRequestCollection = {
totalCount: Scalars['Int']['output'];
};
export type WorkspaceJoinRequestFilter = {
status?: InputMaybe<WorkspaceJoinRequestStatus>;
};
export type WorkspaceJoinRequestMutations = {
__typename?: 'WorkspaceJoinRequestMutations';
approve: Scalars['Boolean']['output'];
@@ -4544,6 +4637,13 @@ export type WorkspacePlan = {
status: WorkspacePlanStatuses;
};
export type WorkspacePlanPrice = {
__typename?: 'WorkspacePlanPrice';
id: Scalars['String']['output'];
monthly?: Maybe<Price>;
yearly?: Maybe<Price>;
};
export enum WorkspacePlanStatuses {
CancelationScheduled = 'cancelationScheduled',
Canceled = 'canceled',
@@ -4560,8 +4660,10 @@ export enum WorkspacePlans {
Free = 'free',
Plus = 'plus',
PlusInvoiced = 'plusInvoiced',
Pro = 'pro',
Starter = 'starter',
StarterInvoiced = 'starterInvoiced',
Team = 'team',
Unlimited = 'unlimited'
}
@@ -4589,10 +4691,12 @@ export type WorkspaceProjectMutations = {
__typename?: 'WorkspaceProjectMutations';
create: Project;
/**
* Update project region and move all regional data to new db.
* TODO: Currently performs all operations synchronously in request, should probably be scheduled.
* Schedule a job that will:
* - Move all regional data to target region
* - Update project region key
* - TODO: Eventually delete data in previous region
*/
moveToRegion: Project;
moveToRegion: Scalars['String']['output'];
moveToWorkspace: Project;
updateRole: Project;
};
@@ -19,7 +19,7 @@
<div
v-if="buttons"
class="flex flex-col flex-wrap md:flex-row gap-y-2 md:gap-x-2 gap-y-0 mt-3"
class="flex flex-col flex-wrap md:flex-row gap-y-2 md:gap-x-2 md:gap-y-0 mt-3"
>
<div
v-for="(button, index) in buttons"
@@ -15,21 +15,17 @@
<div class="flex flex-col-reverse lg:flex-col gap-y-12">
<section>
<h2 class="text-heading-sm text-foreground-2">Quickstart</h2>
<div class="grid grid-cols-1 md:grid-cols-3 gap-3 pt-5">
<div class="grid grid-cols-1 md:grid-cols-2 gap-3 pt-5">
<CommonCard
v-for="quickStartItem in quickStartItems"
:key="quickStartItem.title"
:title="quickStartItem.title"
:description="quickStartItem.description"
:buttons="quickStartItem.buttons"
:is-external-route="quickStartItem.isExternalRoute"
v-for="useCase in useCaseItems"
:key="useCase.title"
:title="useCase.title"
:description="useCase.description"
:buttons="useCase.buttons"
is-external-route
/>
</div>
</section>
<!-- <section>
<h2 class="text-heading-sm text-foreground-2">Connectors</h2>
</section> -->
<section>
<div class="flex items-center justify-between">
<h2 class="text-heading-sm text-foreground-2">Recently updated projects</h2>
@@ -57,6 +53,19 @@
/>
</div>
</section>
<section>
<h2 class="text-heading-sm text-foreground-2">Highlighted workflows</h2>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-3 pt-5">
<CommonCard
v-for="workflowItem in workflowItems"
:key="workflowItem.title"
:title="workflowItem.title"
:description="workflowItem.description"
:buttons="workflowItem.buttons"
is-external-route
/>
</div>
</section>
</div>
<section>
<div class="flex items-center justify-between">
@@ -86,24 +95,20 @@ import {
} from '~~/lib/dashboard/graphql/queries'
import type { QuickStartItem } from '~~/lib/dashboard/helpers/types'
import { useQuery } from '@vue/apollo-composable'
// import { useMixpanel } from '~~/lib/core/composables/mp'
import { useMixpanel } from '~~/lib/core/composables/mp'
import {
docsPageUrl,
forumPageUrl,
homeRoute,
connectorsRoute,
projectsRoute,
tutorialsRoute
tutorialsRoute,
connectorsRoute,
forumPageUrl
} from '~~/lib/common/helpers/route'
// import type { ManagerExtension } from '~~/lib/common/utils/downloadManager'
// import { downloadManager } from '~~/lib/common/utils/downloadManager'
// import { ToastNotificationType, useGlobalToast } from '~~/lib/common/composables/toast'
import type { LayoutDialogButton } from '@speckle/ui-components'
import type { PromoBanner } from '~/lib/promo-banners/types'
import { tutorialItems } from '~/lib/dashboard/helpers/tutorials'
import { useUserProjectsUpdatedTracking } from '~~/lib/user/composables/projectUpdates'
// const mixpanel = useMixpanel()
const mixpanel = useMixpanel()
const isWorkspacesEnabled = useIsWorkspacesEnabled()
const { result: projectsResult } = useQuery(dashboardProjectsPageQuery)
const { result: workspacesResult } = useQuery(
@@ -113,14 +118,82 @@ const { result: workspacesResult } = useQuery(
enabled: isWorkspacesEnabled.value
})
)
// const { triggerNotification } = useGlobalToast()
const { isGuest } = useActiveUser()
const router = useRouter()
useUserProjectsUpdatedTracking()
const promoBanners = ref<PromoBanner[]>()
const openNewProject = ref(false)
const quickStartItems = shallowRef<QuickStartItem[]>([
const workflowItems = shallowRef<QuickStartItem[]>([
{
title: 'Design Coordination',
description:
"The smoothest design coordination for AEC! Ditch files. Share only what's needed and catch changes instantly.",
buttons: [
{
text: 'View workflows',
props: { to: 'https://www.speckle.systems/use-cases/design-coordination' },
onClick: () => {
mixpanel.track('Workflow Card Clicked', {
title: 'Design Coordination'
})
}
}
]
},
{
title: 'Business Intelligence',
description:
'Get from boring BIM data to insightful dashboards! Swap guesswork for informed decisions.',
buttons: [
{
text: 'View workflows',
props: { to: 'https://www.speckle.systems/use-cases/business-intelligence' },
onClick: () => {
mixpanel.track('Workflow Card Clicked', {
title: 'Business Intelligence'
})
}
}
]
},
{
title: 'Online Collaboration',
description:
'View, share, and brainstorm on 3D models online! Share with anyone—no desktop apps, no licenses, no hassle.',
buttons: [
{
text: 'View workflows',
props: { to: 'https://www.speckle.systems/use-cases/online-collaboration' },
onClick: () => {
mixpanel.track('Workflow Card Clicked', {
title: 'Online Collaboration'
})
}
}
]
},
{
title: 'Automation',
description:
'Goodbye, repetitive tasks! Kick into high gear with pre-built automations for your workflows.',
buttons: [
{
text: 'View workflows',
props: { to: 'https://www.speckle.systems/use-cases/automate' },
onClick: () => {
mixpanel.track('Workflow Card Clicked', {
title: 'Automation'
})
}
}
]
}
])
const useCaseItems = shallowRef<QuickStartItem[]>([
{
title: 'Install Connectors',
description:
@@ -133,16 +206,6 @@ const quickStartItems = shallowRef<QuickStartItem[]>([
],
isExternalRoute: false
},
{
title: "Don't know where to start?",
description: "We'll walk you through some of most common usage scenarios.",
buttons: [
{
text: 'Open documentation',
props: { to: docsPageUrl }
}
]
},
{
title: 'Have a question you need answered?',
description: 'Submit your question on the forum and get help from the community.',
@@ -1,15 +0,0 @@
export type ManagerExtension = 'exe' | 'dmg'
/* Util to download the Manager file */
export const downloadManager = (extension: ManagerExtension) => {
const fileName = `manager.${extension}`
const downloadLink = `https://releases.speckle.dev/manager2/installer/${fileName}`
const a = document.createElement('a')
a.style.display = 'none'
a.href = downloadLink
a.download = fileName
document.body.appendChild(a)
a.click()
document.body.removeChild(a)
}