@@ -11,12 +11,16 @@ interface TimelineManagementDisplayProps {
1111
1212export default function TextManagementDisplay ( props : TimelineManagementDisplayProps ) {
1313
14- const [ selectedYear , setSelectedYear ] = useState ( props . committees . sort ( ( a , b ) => b . year - a . year ) [ 0 ] . year )
14+ const [ selectedYear , setSelectedYear ] = useState ( props . committees . sort ( ( a , b ) => b . year - a . year ) [ 0 ] ? .year ?? new Date ( ) . getFullYear ( ) )
1515
1616 const [ shownEvents , setShownEvents ] = useState ( props . timelineEvents . filter ( event => event . year === selectedYear . toString ( ) ) . sort ( ( a , b ) => a . date > b . date ? 1 : - 1 ) )
1717
18- const getCategoryColor = ( categoryId : string ) => {
19- return props . categories . find ( category => category . title === categoryId ) ?. color ?? props . categories [ 0 ] . color
18+ const [ shownCategories , setShownCategories ] = useState < Category [ ] > ( props . categories )
19+
20+ const [ newCategory , setNewCategory ] = useState < Category > ( { title : "" , color : "" , } )
21+
22+ const getCategoryColor = ( categoryId : string ) : string | undefined => {
23+ return shownCategories . find ( category => category . title === categoryId ) ?. color ?? shownCategories [ 0 ] ?. color
2024 }
2125
2226 return < >
@@ -32,7 +36,10 @@ export default function TextManagementDisplay(props: TimelineManagementDisplayPr
3236 }
3337 </ select >
3438
35- < div className = "flex flex-col gap-8 pb-8" >
39+ < section className = "mb-8" >
40+ < h2 className = "text-2xl mb-4" > Tidslinje</ h2 >
41+
42+ < div className = "flex flex-col gap-8 pb-8" >
3643 {
3744 shownEvents . map ( ( event , index ) => {
3845 return (
@@ -85,49 +92,140 @@ export default function TextManagementDisplay(props: TimelineManagementDisplayPr
8592 )
8693 } )
8794 }
95+ </ div >
8896
89- < div className = "flex gap-4" >
90- < select id = "category-select" className = "p-1 rounded-md" style = { { backgroundColor : props . categories [ 0 ] . color } } onChange = {
91- e => {
92- e . target . style . backgroundColor = getCategoryColor ( e . target . value )
93- }
94- } >
95- {
96- props . categories . map ( category => {
97- return < option style = { { backgroundColor : category . color } } key = { category . title } value = { category . title } >
98- { category . title }
99- </ option >
100- } )
101- }
102- </ select >
103-
104- < Button action = { ( ) => {
105- setShownEvents ( [ ...shownEvents , {
106- id : "tempid" ,
107- categoryId : ( document . getElementById ( "category-select" ) as HTMLSelectElement ) . value ,
108- date : "" ,
109- text : "" ,
110- link : "" ,
111- year : selectedYear . toString ( )
112- } ] )
97+ {
98+ shownCategories . length === 0
99+ ? < p > Inga kategorier tillagda. Lägg till en kategori nedan.</ p >
100+ : < >
101+ < div className = "flex gap-4" >
102+ < select id = "category-select" className = "p-1 rounded-md" style = { { backgroundColor : shownCategories [ 0 ] ?. color ?? "" } } onChange = {
103+ e => {
104+ e . target . style . backgroundColor = getCategoryColor ( e . target . value ) ?? ""
105+ }
106+ } >
107+ {
108+ shownCategories . map ( category => {
109+ return < option style = { { backgroundColor : category . color } } key = { category . title } value = { category . title } >
110+ { category . title }
111+ </ option >
112+ } )
113+ }
114+ </ select >
115+
116+ < Button action = { ( ) => {
117+ setShownEvents ( [ ...shownEvents , {
118+ id : "tempid" ,
119+ categoryId : ( document . getElementById ( "category-select" ) as HTMLSelectElement ) . value ,
120+ date : "" ,
121+ text : "" ,
122+ link : "" ,
123+ year : selectedYear . toString ( )
124+ } ] )
125+ }
126+ } >
127+ Lägg till
128+ </ Button >
129+ </ div >
130+
131+ < div className = "mt-8" >
132+ < Button color = "bg-green-500" action = { ( ) => {
133+ fetch ( '/api/admin/timeline/update' , {
134+ method : 'POST' ,
135+ headers : {
136+ 'Content-Type' : 'application/json'
137+ } ,
138+ body : JSON . stringify (
139+ {
140+ events : shownEvents ,
141+ year : selectedYear
142+ }
143+ )
144+ } ) . then ( res => {
145+ if ( res . status === 200 ) {
146+ alert ( "Sparat!" )
147+ } else {
148+ alert ( "Något gick fel" )
149+ }
150+ } )
151+ } } >
152+ Spara
153+ </ Button >
154+ </ div >
155+ </ >
156+ }
157+ </ section >
158+
159+ < section className = "mb-8" >
160+ < h2 className = "text-2xl mb-6" > Kategorier</ h2 >
161+ < div className = "flex flex-col gap-4 pb-4" >
162+ {
163+ shownCategories . map ( ( category , index ) => {
164+ return (
165+ < div key = { category . title } className = "bg-black/50 p-5" >
166+
167+ < div className = "flex items-start justify-between" >
168+ < div className = "p-1 px-2" style = { { backgroundColor : getCategoryColor ( category . title ) } } > { category . title } </ div >
169+ < Button color = "bg-red-500" action = { ( ) => {
170+ const usedEvent = props . timelineEvents . find ( event => event . categoryId === category . title )
171+ ?? shownEvents . find ( event => event . categoryId === category . title )
172+ if ( usedEvent ) {
173+ alert ( `Kan inte ta bort kategori, används år ${ usedEvent . year } med text "${ usedEvent . text } "` )
174+ return
175+ }
176+
177+ const newShownCategories = [ ...shownCategories ]
178+ newShownCategories . splice ( index , 1 )
179+ setShownCategories ( newShownCategories )
180+ } } >
181+ Ta bort
182+ </ Button >
183+ </ div >
184+
185+ < TextInput placeholder = "Färg" setValue = {
186+ inputValue => {
187+ const newShownCategories = [ ...shownCategories ]
188+ newShownCategories [ index ] . color = inputValue
189+ setShownCategories ( newShownCategories )
190+ }
191+ } >
192+ { category . color }
193+ </ TextInput >
194+ </ div >
195+ )
196+ } )
113197 }
114- } >
115- Lägg till
116- </ Button >
117198 </ div >
118199
119- < div >
120-
200+ < span className = "flex flex-row items-center gap-4" >
201+ < TextInput
202+ placeholder = "Titel på kategori"
203+ setValue = { inputValue => {
204+ const changedCategory = { ...newCategory , title : inputValue }
205+ setNewCategory ( changedCategory )
206+ } }
207+ >
208+ { newCategory . title }
209+ </ TextInput >
210+
211+ < Button action = { async ( ) => {
212+ setShownCategories ( [ ...shownCategories , newCategory ] )
213+ setNewCategory ( { ...newCategory , title : "" } )
214+ } } >
215+ Lägg till
216+ </ Button >
217+ </ span >
218+
219+ < div className = "mt-8" >
121220 < Button color = "bg-green-500" action = { ( ) => {
122- fetch ( '/api/admin/timeline /update' , {
221+ fetch ( '/api/admin/category /update' , {
123222 method : 'POST' ,
124223 headers : {
125224 'Content-Type' : 'application/json'
126225 } ,
127226 body : JSON . stringify (
128227 {
129- events : shownEvents ,
130- year : selectedYear
228+ categories : shownCategories
131229 }
132230 )
133231 } ) . then ( res => {
@@ -140,10 +238,7 @@ export default function TextManagementDisplay(props: TimelineManagementDisplayPr
140238 } } >
141239 Spara
142240 </ Button >
143-
144241 </ div >
145-
146- </ div >
147-
242+ </ section >
148243 </ >
149244}
0 commit comments