Skip to content

Commit 7224c59

Browse files
authored
React Admin - events, competitions, series - eh? (#233)
* react admin: event management (unfinished) * unify pessimistic mutationMode with redirect to show * MyCreate to unify redirect to show on create going forward * some competition management, will be tested/adjusted later * some series management * new BE endpoint for competition slug, old used for ID access
1 parent 828caf1 commit 7224c59

20 files changed

+511
-14
lines changed

src/components/Admin/Admin.tsx

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,22 @@
11
import {FC} from 'react'
22
import {Admin as ReactAdmin, Resource} from 'react-admin'
33

4-
import {CompetitionList} from './Competition/CompetitionList'
54
import {dataProvider} from './dataProvider'
65
import {PostCreate} from './resources/cms/post/PostCreate'
76
import {PostEdit} from './resources/cms/post/PostEdit'
87
import {PostList} from './resources/cms/post/PostList'
98
import {PostShow} from './resources/cms/post/PostShow'
9+
import {CompetitionCreate} from './resources/competition/competition/CompetitionCreate'
10+
import {CompetitionEdit} from './resources/competition/competition/CompetitionEdit'
11+
import {CompetitionList} from './resources/competition/competition/CompetitionList'
12+
import {CompetitionShow} from './resources/competition/competition/CompetitionShow'
13+
import {EventCreate} from './resources/competition/event/EventCreate'
14+
import {EventEdit} from './resources/competition/event/EventEdit'
15+
import {EventList} from './resources/competition/event/EventList'
16+
import {EventShow} from './resources/competition/event/EventShow'
17+
import {SeriesEdit} from './resources/competition/series/SeriesEdit'
18+
import {SeriesList} from './resources/competition/series/SeriesList'
19+
import {SeriesShow} from './resources/competition/series/SeriesShow'
1020
import {useAuthProvider} from './useAuthProvider'
1121

1222
export const Admin: FC = () => {
@@ -15,8 +25,15 @@ export const Admin: FC = () => {
1525
return (
1626
<ReactAdmin authProvider={authProvider} dataProvider={dataProvider}>
1727
<Resource name="cms/post" list={PostList} edit={PostEdit} show={PostShow} create={PostCreate} />
18-
{/* TODO: create, edit, celkovo rozumne rozhranie pre sutaze/serie */}
19-
<Resource name="competition/series" list={CompetitionList} />
28+
<Resource name="competition/series" list={SeriesList} edit={SeriesEdit} show={SeriesShow} />
29+
<Resource name="competition/event" list={EventList} edit={EventEdit} show={EventShow} create={EventCreate} />
30+
<Resource
31+
name="competition/competition"
32+
list={CompetitionList}
33+
edit={CompetitionEdit}
34+
show={CompetitionShow}
35+
create={CompetitionCreate}
36+
/>
2037
</ReactAdmin>
2138
)
2239
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import {ComponentProps, FC} from 'react'
2+
import {SelectField, useGetList} from 'react-admin'
3+
4+
export const CompetitionField: FC<ComponentProps<typeof SelectField>> = (props) => {
5+
const {data, isLoading, error} = useGetList('competition/competition')
6+
7+
const typedData = data as {id: number; name: string}[]
8+
9+
if (isLoading) return <span>Loading...</span>
10+
if (error) return <span>Error occured loading competitions: {error.message}</span>
11+
12+
return <SelectField choices={typedData} {...props} />
13+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import {ComponentProps, FC} from 'react'
2+
import {SelectInput, useGetList} from 'react-admin'
3+
4+
export const CompetitionInput: FC<ComponentProps<typeof SelectInput>> = (props) => {
5+
const {data, isLoading, error} = useGetList('competition/competition')
6+
7+
const typedData = data as {id: number; name: string}[]
8+
9+
if (isLoading) return <span>Loading...</span>
10+
if (error) return <span>Error occured loading competitions: {error.message}</span>
11+
12+
return <SelectInput choices={typedData} {...props} />
13+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import {FC} from 'react'
2+
import {FieldProps, useRecordContext} from 'react-admin'
3+
4+
export const JsonField: FC<FieldProps> = ({source}) => {
5+
const record = useRecordContext()
6+
if (!record || !source) return null
7+
8+
const value = record[source]
9+
const text = JSON.stringify(value, null, 2)
10+
11+
return <pre>{text}</pre>
12+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import {FC, PropsWithChildren} from 'react'
2+
import {Create} from 'react-admin'
3+
4+
export const MyCreate: FC<PropsWithChildren> = ({children}) => <Create redirect="show">{children}</Create>
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import {FC, PropsWithChildren} from 'react'
2+
import {Edit} from 'react-admin'
3+
4+
import {MyEditActions} from './MyEditActions'
5+
6+
export const MyEdit: FC<PropsWithChildren> = ({children}) => (
7+
<Edit actions={<MyEditActions />} mutationMode="pessimistic" redirect="show">
8+
{children}
9+
</Edit>
10+
)

src/components/Admin/resources/cms/post/PostCreate.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import {FC} from 'react'
22
import {
33
ArrayInput,
4-
Create,
54
DateTimeInput,
65
FormTab,
76
NumberInput,
@@ -11,10 +10,11 @@ import {
1110
TextInput,
1211
} from 'react-admin'
1312

13+
import {MyCreate} from '@/components/Admin/custom/MyCreate'
1414
import {SitesCheckboxInput} from '@/components/Admin/custom/SitesCheckboxInput'
1515

1616
export const PostCreate: FC = () => (
17-
<Create redirect="show">
17+
<MyCreate>
1818
<TabbedForm>
1919
<FormTab label="general">
2020
<NumberInput source="id" fullWidth disabled />
@@ -36,5 +36,5 @@ export const PostCreate: FC = () => (
3636
</ArrayInput>
3737
</FormTab>
3838
</TabbedForm>
39-
</Create>
39+
</MyCreate>
4040
)

src/components/Admin/resources/cms/post/PostEdit.tsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import {FC} from 'react'
22
import {
33
ArrayInput,
44
DateTimeInput,
5-
Edit,
65
FormTab,
76
NumberInput,
87
required,
@@ -11,11 +10,11 @@ import {
1110
TextInput,
1211
} from 'react-admin'
1312

14-
import {MyEditActions} from '@/components/Admin/custom/MyEditActions'
13+
import {MyEdit} from '@/components/Admin/custom/MyEdit'
1514
import {SitesCheckboxInput} from '@/components/Admin/custom/SitesCheckboxInput'
1615

1716
export const PostEdit: FC = () => (
18-
<Edit actions={<MyEditActions />} redirect="show" mutationMode="undoable">
17+
<MyEdit>
1918
<TabbedForm>
2019
<FormTab label="general">
2120
<NumberInput source="id" fullWidth disabled />
@@ -37,5 +36,5 @@ export const PostEdit: FC = () => (
3736
</ArrayInput>
3837
</FormTab>
3938
</TabbedForm>
40-
</Edit>
39+
</MyEdit>
4140
)
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import {FC} from 'react'
2+
import {
3+
ArrayInput,
4+
DateTimeInput,
5+
FormTab,
6+
NumberInput,
7+
required,
8+
SimpleFormIterator,
9+
TabbedForm,
10+
TextInput,
11+
} from 'react-admin'
12+
13+
import {MyCreate} from '@/components/Admin/custom/MyCreate'
14+
import {SitesCheckboxInput} from '@/components/Admin/custom/SitesCheckboxInput'
15+
16+
export const CompetitionCreate: FC = () => (
17+
<MyCreate>
18+
<TabbedForm>
19+
<FormTab label="general">
20+
{/* <NumberInput source="id" fullWidth disabled /> */}
21+
<TextInput source="name" fullWidth validate={required()} />
22+
<NumberInput source="start_year" fullWidth validate={required()} />
23+
<TextInput source="description" fullWidth />
24+
<TextInput source="rules" fullWidth />
25+
{/* TODO: radio buttons / select */}
26+
<NumberInput source="competition_type" fullWidth validate={required()} />
27+
<NumberInput source="min_years_until_graduation" fullWidth />
28+
<SitesCheckboxInput source="sites" validate={required()} />
29+
</FormTab>
30+
{/* maju sa dat eventy vytvarat pri tvoreni competition? */}
31+
<FormTab label="events">
32+
<ArrayInput source="event_set" defaultValue={[]}>
33+
<SimpleFormIterator>
34+
{/* <NumberInput source="id" fullWidth disabled /> */}
35+
<NumberInput source="year" fullWidth />
36+
<TextInput source="school_year" fullWidth /* validate={required()} */ />
37+
<DateTimeInput source="start" fullWidth validate={required()} />
38+
<DateTimeInput source="end" fullWidth validate={required()} />
39+
<NumberInput source="competition" fullWidth />
40+
{/* unspecifiedpublication_set: UnspecifiedPublication[]
41+
registration_links: RegistrationLink[] */}
42+
</SimpleFormIterator>
43+
</ArrayInput>
44+
</FormTab>
45+
</TabbedForm>
46+
</MyCreate>
47+
)
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import {FC} from 'react'
2+
import {ArrayInput, FormTab, NumberInput, required, SimpleFormIterator, TabbedForm, TextInput} from 'react-admin'
3+
4+
import {MyEdit} from '@/components/Admin/custom/MyEdit'
5+
import {SitesCheckboxInput} from '@/components/Admin/custom/SitesCheckboxInput'
6+
7+
export const CompetitionEdit: FC = () => (
8+
<MyEdit>
9+
<TabbedForm>
10+
<FormTab label="general">
11+
<NumberInput source="id" fullWidth disabled />
12+
<TextInput source="name" fullWidth />
13+
<NumberInput source="start_year" fullWidth />
14+
<TextInput source="description" fullWidth />
15+
<TextInput source="rules" fullWidth />
16+
<NumberInput source="competition_type" fullWidth />
17+
<NumberInput source="min_years_until_graduation" fullWidth />
18+
<SitesCheckboxInput source="sites" validate={required()} />
19+
</FormTab>
20+
<FormTab label="events">
21+
<ArrayInput source="event_set" defaultValue={[]}>
22+
<SimpleFormIterator>
23+
<NumberInput source="id" fullWidth disabled />
24+
{/* unspecifiedpublication_set: UnspecifiedPublication[]
25+
registration_links: RegistrationLink[] */}
26+
<NumberInput source="year" fullWidth />
27+
<TextInput source="shool_year" fullWidth /* validate={required()} */ />
28+
<TextInput source="start" fullWidth validate={required()} />
29+
<TextInput source="end" fullWidth validate={required()} />
30+
<NumberInput source="competition" fullWidth />
31+
</SimpleFormIterator>
32+
</ArrayInput>
33+
</FormTab>
34+
</TabbedForm>
35+
</MyEdit>
36+
)

0 commit comments

Comments
 (0)