1- import { Head } from '@inertiajs/react' ;
1+ import { Head , router } from '@inertiajs/react' ;
2+ import { type ChangeEvent , useEffect , useState } from 'react' ;
3+
4+ type Machine = {
5+ id : number ;
6+ title : string ;
7+ vendor : {
8+ title : string ;
9+ } ;
10+ } ;
11+
12+ type FilamentType = {
13+ id : number ;
14+ title : string ;
15+ } ;
16+
17+ type Color = {
18+ id : number ;
19+ title : string ;
20+ } ;
21+
22+ type UserFilament = {
23+ machine_id : number ;
24+ filament_id : number ;
25+ color_id : number ;
26+ machine : Machine ;
27+ filament : {
28+ vendor : {
29+ title : string ;
30+ } ;
31+ type : FilamentType ;
32+ } ;
33+ color : Color ;
34+ pressure_advance : number ;
35+ filament_flow_ratio : number ;
36+ filament_max_volumetric_speed : number ;
37+ nozzle_temperature : number ;
38+ users_count : number ;
39+ } ;
40+
41+ type Filters = {
42+ machine_id : number ;
43+ filament_type_id : number ;
44+ color_id : number ;
45+ } ;
46+
47+ type WelcomeProps = {
48+ userFilaments : UserFilament [ ] ;
49+ machines : Machine [ ] ;
50+ filamentTypes : FilamentType [ ] ;
51+ colors : Color [ ] ;
52+ filters : Filters ;
53+ } ;
54+
55+ export default function Welcome ( { userFilaments, machines, filamentTypes, colors, filters } : WelcomeProps ) {
56+ const [ selectedFilters , setSelectedFilters ] = useState < Filters > ( filters ) ;
57+
58+ useEffect ( ( ) => {
59+ setSelectedFilters ( filters ) ;
60+ } , [ filters ] ) ;
61+
62+ const handleSelectChange = ( key : keyof Filters ) => ( event : ChangeEvent < HTMLSelectElement > ) => {
63+ const value = Number ( event . target . value ) ;
64+ const nextFilters : Filters = { ...selectedFilters , [ key ] : value } ;
65+
66+ setSelectedFilters ( nextFilters ) ;
67+
68+ router . visit ( '/' , {
69+ method : 'get' ,
70+ data : nextFilters ,
71+ preserveState : true ,
72+ preserveScroll : true ,
73+ replace : true
74+ } ) ;
75+ } ;
276
3- export default function Welcome ( { userFilaments, machines, filamentTypes, colors } ) {
477 return (
578 < >
679 < Head title = "Welcome" />
@@ -19,31 +92,49 @@ export default function Welcome({ userFilaments, machines, filamentTypes, colors
1992 < tbody >
2093 < tr >
2194 < td className = "border border-gray-300 p-3 text-left text-gray-900 dark:border-gray-600 dark:text-gray-200" >
22- < select name = "machines" className = "w-full" >
95+ < select
96+ name = "machines"
97+ className = "w-full"
98+ onChange = { handleSelectChange ( 'machine_id' ) }
99+ value = { selectedFilters . machine_id } >
23100 < option value = "0" > - All -</ option >
24101
25102 { machines . map ( ( item ) => (
26- < option value = { item . id } > { item . vendor . title } { item . title } </ option >
103+ < option
104+ key = { item . id }
105+ value = { item . id } > { item . vendor . title } { item . title } </ option >
27106 ) ) }
28107 </ select >
29108 </ td >
30109
31110 < td className = "border border-gray-300 p-3 text-left text-gray-900 dark:border-gray-600 dark:text-gray-200" >
32- < select name = "filamentTypes" className = "w-full" >
111+ < select
112+ name = "filamentTypes"
113+ className = "w-full"
114+ onChange = { handleSelectChange ( 'filament_type_id' ) }
115+ value = { selectedFilters . filament_type_id } >
33116 < option value = "0" > - All -</ option >
34117
35118 { filamentTypes . map ( ( item ) => (
36- < option value = { item . id } > { item . title } </ option >
119+ < option
120+ key = { item . id }
121+ value = { item . id } > { item . title } </ option >
37122 ) ) }
38123 </ select >
39124 </ td >
40125
41126 < td className = "border border-gray-300 p-3 text-left text-gray-900 dark:border-gray-600 dark:text-gray-200" >
42- < select name = "colors" className = "w-full" >
127+ < select
128+ name = "colors"
129+ className = "w-full"
130+ onChange = { handleSelectChange ( 'color_id' ) }
131+ value = { selectedFilters . color_id } >
43132 < option value = "0" > - All -</ option >
44133
45134 { colors . map ( ( item ) => (
46- < option value = { item . id } > { item . title } </ option >
135+ < option
136+ key = { item . id }
137+ value = { item . id } > { item . title } </ option >
47138 ) ) }
48139 </ select >
49140 </ td >
@@ -82,7 +173,7 @@ export default function Welcome({ userFilaments, machines, filamentTypes, colors
82173 </ thead >
83174 < tbody >
84175 { userFilaments . map ( ( item ) => (
85- < tr >
176+ < tr key = { ` ${ item . machine_id } - ${ item . filament_id } - ${ item . color_id } ` } >
86177 < td className = "border border-gray-300 p-3 text-left text-gray-900 dark:border-gray-600 dark:text-gray-200" >
87178 { item . machine . vendor . title }
88179 { item . machine . title }
0 commit comments