Skip to content

Commit d82f4ae

Browse files
committed
feat: create project
1 parent b98d673 commit d82f4ae

File tree

4 files changed

+48
-42
lines changed

4 files changed

+48
-42
lines changed

frontend/app/api/generated.ts

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -88,13 +88,13 @@ export type AssignRoleInput = {
8888
export type Branding = {
8989
__typename?: 'Branding';
9090
colors: Colors;
91-
logo: Scalars['String']['output'];
91+
logo?: Maybe<Scalars['String']['output']>;
9292
rounding: Scalars['Int']['output'];
9393
};
9494

9595
export type BrandingInput = {
9696
colors: ColorsInput;
97-
logo: Scalars['String']['input'];
97+
logo?: InputMaybe<Scalars['String']['input']>;
9898
rounding: Scalars['Int']['input'];
9999
};
100100

@@ -434,7 +434,6 @@ export type Mutation = {
434434
bulkCompleteChallenges: Array<Challenge>;
435435
bulkCreateChallenges: Array<Challenge>;
436436
bulkPublishChallenges: Array<Challenge>;
437-
cloneProject: Project;
438437
completeChallenge: Challenge;
439438
createChallenge: Challenge;
440439
createEvent: Event;
@@ -606,12 +605,6 @@ export type MutationBulkPublishChallengesArgs = {
606605
};
607606

608607

609-
export type MutationCloneProjectArgs = {
610-
id: Scalars['ID']['input'];
611-
newName: Scalars['String']['input'];
612-
};
613-
614-
615608
export type MutationCompleteChallengeArgs = {
616609
challengeId: Scalars['ID']['input'];
617610
completedAt?: InputMaybe<Scalars['DateTime']['input']>;
@@ -1420,19 +1413,19 @@ export type AdminSidebarQuery = { __typename?: 'Query', projects: { __typename?:
14201413
export type CurrentProjectQueryVariables = Exact<{ [key: string]: never; }>;
14211414

14221415

1423-
export type CurrentProjectQuery = { __typename?: 'Query', myCurrentProject: { __typename?: 'Project', branding: { __typename?: 'Branding', logo: string, rounding: number, colors: { __typename?: 'Colors', primary: string } } } };
1416+
export type CurrentProjectQuery = { __typename?: 'Query', myCurrentProject: { __typename?: 'Project', branding: { __typename?: 'Branding', logo?: string | null, rounding: number, colors: { __typename?: 'Colors', primary: string } } } };
14241417

14251418
export type AdminHomePageQueryVariables = Exact<{ [key: string]: never; }>;
14261419

14271420

1428-
export type AdminHomePageQuery = { __typename?: 'Query', me: { __typename?: 'User', id: string, name: string }, projects: { __typename?: 'ProjectConnection', edges: Array<{ __typename?: 'ProjectEdge', node: { __typename?: 'Project', id: string, name: string, description: string, endDate: any, startDate: any, branding: { __typename?: 'Branding', logo: string, rounding: number, colors: { __typename?: 'Colors', primary: string, secondary: string, tertiary: string } } } }> } };
1421+
export type AdminHomePageQuery = { __typename?: 'Query', me: { __typename?: 'User', id: string, name: string }, projects: { __typename?: 'ProjectConnection', edges: Array<{ __typename?: 'ProjectEdge', node: { __typename?: 'Project', id: string, name: string, description: string, endDate: any, startDate: any, branding: { __typename?: 'Branding', logo?: string | null, rounding: number, colors: { __typename?: 'Colors', primary: string, secondary: string, tertiary: string } } } }> } };
14291422

14301423
export type AdminProjectPageQueryVariables = Exact<{
14311424
projectId: Scalars['ID']['input'];
14321425
}>;
14331426

14341427

1435-
export type AdminProjectPageQuery = { __typename?: 'Query', project: { __typename?: 'Project', id: string, name: string, description: string, startDate: any, endDate: any, branding: { __typename?: 'Branding', logo: string, rounding: number, colors: { __typename?: 'Colors', primary: string } } }, achievements: { __typename?: 'AchievementConnection', edges: Array<{ __typename?: 'AchievementEdge', node:
1428+
export type AdminProjectPageQuery = { __typename?: 'Query', project: { __typename?: 'Project', id: string, name: string, description: string, startDate: any, endDate: any, branding: { __typename?: 'Branding', logo?: string | null, rounding: number, colors: { __typename?: 'Colors', primary: string } } }, achievements: { __typename?: 'AchievementConnection', edges: Array<{ __typename?: 'AchievementEdge', node:
14361429
| { __typename?: 'ListeningAchievement', id: string, name: string }
14371430
| { __typename?: 'ReadingAchievement', id: string, name: string }
14381431
| { __typename?: 'SimpleAchievement', id: string, name: string }
@@ -1442,7 +1435,7 @@ export type AdminProjectPageQuery = { __typename?: 'Query', project: { __typenam
14421435
export type AdminProjectsPageQueryVariables = Exact<{ [key: string]: never; }>;
14431436

14441437

1445-
export type AdminProjectsPageQuery = { __typename?: 'Query', projects: { __typename?: 'ProjectConnection', edges: Array<{ __typename?: 'ProjectEdge', node: { __typename?: 'Project', id: string, name: string, description: string, endDate: any, startDate: any, branding: { __typename?: 'Branding', logo: string, colors: { __typename?: 'Colors', primary: string } } } }> } };
1438+
export type AdminProjectsPageQuery = { __typename?: 'Query', projects: { __typename?: 'ProjectConnection', edges: Array<{ __typename?: 'ProjectEdge', node: { __typename?: 'Project', id: string, name: string, description: string, endDate: any, startDate: any, branding: { __typename?: 'Branding', logo?: string | null, colors: { __typename?: 'Colors', primary: string } } } }> } };
14461439

14471440
export type CreateProjectMutationVariables = Exact<{
14481441
input: CreateProjectInput;
@@ -1661,7 +1654,7 @@ export function useAdminProjectPageQuery(options?: Omit<Urql.UseQueryArgs<never,
16611654
};
16621655
export const AdminProjectsPageDocument = gql`
16631656
query AdminProjectsPage {
1664-
projects {
1657+
projects(first: 100) {
16651658
edges {
16661659
node {
16671660
id

frontend/app/pages/admin/projects/[projectId].vue

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,9 @@ const { data, error, fetching } = useAdminProjectPageQuery({
6565
pause: computed(() => !isAuthReady.value),
6666
})
6767
68-
const state = reactive({
68+
type State = Omit<AdminProjectPageQuery['project'], 'id'>
69+
70+
const state = reactive<State>({
6971
name: '',
7072
description: '',
7173
startDate: '',
@@ -140,9 +142,9 @@ watch(data, () => {
140142
<template #branding>
141143
<div class="mt-4 flex flex-col gap-4">
142144
<UFormField label="Logo">
143-
<NuxtImg :src="state.branding.logo" width="64" />
145+
<NuxtImg :src="state.branding.logo || ''" width="64" />
144146
</UFormField>
145-
<UFormField label="Accent Color">
147+
<UFormField label="Accent color">
146148
<ColorPickerInput v-model="state.branding.colors.primary" />
147149
</UFormField>
148150
</div>

frontend/app/pages/admin/projects/index.vue

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ definePageMeta({
66
77
gql(`
88
query AdminProjectsPage {
9-
projects {
9+
projects(first: 100) {
1010
edges {
1111
node {
1212
id
@@ -37,8 +37,8 @@ const { currentProjects, futureProjects, pastProjects } = useGroupedProjects(
3737
</script>
3838

3939
<template>
40-
<UContainer>
41-
<div class="my-12 flex flex-col items-start gap-8">
40+
<UContainer class="py-12">
41+
<div class="mb-12 flex flex-col items-start gap-8">
4242
<h1 class="text-3xl">Projects</h1>
4343
<UButton icon="lucide:plus" :to="{ name: 'admin-projects-new' }">
4444
New Project

frontend/app/pages/admin/projects/new.vue

Lines changed: 33 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -16,47 +16,55 @@ gql(`
1616
`)
1717
1818
const schema = z.object({
19-
name: z.string().nonempty(),
19+
name: z.string().nonempty({ error: 'Name is required' }),
2020
description: z.string().optional(),
21-
startDate: z.string().nonempty(),
22-
endDate: z.string().nonempty(),
23-
branding: z
24-
.object({
25-
logo: z.string(),
26-
colors: z.object({
27-
primary: z.string(),
28-
secondary: z.string(),
29-
tertiary: z.string(),
30-
}),
31-
rounding: z.number(),
32-
})
33-
.optional(),
21+
startDate: z.string().nonempty({ error: 'Start date is required' }),
22+
endDate: z.string().nonempty({ error: 'End date is required' }),
23+
branding: z.object({
24+
logo: z.string().optional(),
25+
colors: z.object({
26+
primary: z.string(),
27+
secondary: z.string(),
28+
tertiary: z.string(),
29+
}),
30+
rounding: z.number(),
31+
}),
3432
})
3533
type Schema = z.infer<typeof schema>
3634
const state = reactive<Schema>({
3735
name: '',
38-
description: '',
36+
description: undefined,
3937
startDate: '',
4038
endDate: '',
4139
branding: {
42-
logo: '',
40+
logo: undefined,
41+
rounding: 0,
4342
colors: {
44-
primary: '',
45-
secondary: '',
46-
tertiary: '',
43+
primary: '#000000',
44+
secondary: '#000000',
45+
tertiary: '#000000',
4746
},
48-
rounding: 0,
4947
},
5048
})
5149
5250
const { executeMutation } = useCreateProjectMutation()
51+
const toast = useToast()
5352
5453
async function createProject(event: FormSubmitEvent<Schema>) {
5554
if (!event.data) {
5655
return
5756
}
5857
5958
executeMutation({ input: event.data }).then((response) => {
59+
console.log(response)
60+
if (response.error) {
61+
toast.add({
62+
title: response.error.name,
63+
description: response.error.message,
64+
color: 'error',
65+
})
66+
return
67+
}
6068
if (!response.data) {
6169
return
6270
}
@@ -104,12 +112,15 @@ async function createProject(event: FormSubmitEvent<Schema>) {
104112
</UFormField>
105113
<div class="flex gap-4">
106114
<UFormField name="startDate" label="Starts at" required>
107-
<UInput v-model="state.startDate" type="datetime-local" required />
115+
<UInput v-model="state.startDate" type="date" required />
108116
</UFormField>
109117
<UFormField name="endDate" label="Ends at" required>
110-
<UInput v-model="state.endDate" type="datetime-local" required />
118+
<UInput v-model="state.endDate" type="date" required />
111119
</UFormField>
112120
</div>
121+
<UFormField label="Accent color">
122+
<ColorPickerInput v-model="state.branding.colors.primary" />
123+
</UFormField>
113124
<UButton type="submit">Create project</UButton>
114125
</UForm>
115126
</UContainer>

0 commit comments

Comments
 (0)