@@ -3,7 +3,6 @@ import { Checkbox } from '@entur/form'
33import { TransportIcon } from 'app/(admin)/tavler/[id]/rediger/components/Settings/components/TransportIcon'
44import { EventProps } from 'app/posthog/events'
55import { usePosthogTracking } from 'app/posthog/usePosthogTracking'
6- import { useState } from 'react'
76import { BoardTileDB } from 'src/types/db-types/boards'
87import { TTransportMode } from 'src/types/graphql-schema'
98import { TLineFragment } from './types'
@@ -14,104 +13,100 @@ function PlatformAndLines({
1413 title,
1514 lines,
1615 trackingLocation,
17- transportMode,
16+ transportModes,
17+ selectedLineIds,
18+ onToggleLine,
19+ onToggleGroup,
1820} : {
1921 tile : BoardTileDB
2022 groupKey : string
2123 title : string
2224 lines : TLineFragment [ ]
2325 trackingLocation : EventProps < 'stop_place_edit_interaction' > [ 'location' ]
24- transportMode : TTransportMode | null
26+ transportModes : TTransportMode [ ]
27+ selectedLineIds : Set < string >
28+ onToggleLine : ( lineId : string ) => void
29+ onToggleGroup : ( lineIds : string [ ] , checked : boolean ) => void
2530} ) {
2631 const posthog = usePosthogTracking ( )
2732
28- const lineElements = document . getElementsByName ( `${ tile . uuid } -${ groupKey } ` )
29-
30- const anyLineInWhitelist = lines . some ( ( l ) =>
31- tile . whitelistedLines ?. includes ( l . id ) ,
32- )
33- const missingLinesInWhitelist = lines . some (
34- ( l ) => ! tile . whitelistedLines ?. includes ( l . id ) ,
35- )
36-
37- const defaultChecked = ( ) => {
38- if ( missingLinesInWhitelist && anyLineInWhitelist )
39- return 'indeterminate'
40- return (
41- ! tile . whitelistedLines ||
42- tile . whitelistedLines . length === 0 ||
43- ! missingLinesInWhitelist
44- )
45- }
46- const [ checked , setChecked ] = useState < boolean | 'indeterminate' > (
47- defaultChecked ( ) ,
48- )
49-
50- const determineAllChecked = ( ) => {
51- let count = 0
52- for ( const l of lineElements . values ( ) ) {
53- if ( l instanceof HTMLInputElement ) {
54- if ( l . checked === true ) count ++
55- }
56- }
57- if ( count === 0 ) setChecked ( false )
58- else if ( count < lineElements . length ) setChecked ( 'indeterminate' )
59- else setChecked ( true )
60- }
33+ const selectedLinesInGroup = lines . filter ( ( l ) => selectedLineIds . has ( l . id ) )
34+ const isAllSelected =
35+ lines . length > 0 && selectedLinesInGroup . length === lines . length
36+ const isNoneSelected = selectedLinesInGroup . length === 0
37+ const isIndeterminate = ! isAllSelected && ! isNoneSelected
38+ const showLines = ! isNoneSelected
6139
6240 return (
6341 < div className = "rounded-lg border-2 p-4" >
6442 < div className = "flex flex-row justify-between" >
6543 < div className = "flex flex-row items-center justify-start gap-4 font-semibold" >
66- < TransportIcon
67- transportMode = { transportMode }
68- className = { `h-7 w-7 text-white bg-${ transportMode } rounded-md p-1` }
69- />
44+ < div className = "flex flex-row gap-1" >
45+ { transportModes . map ( ( mode ) => (
46+ < TransportIcon
47+ key = { mode }
48+ transportMode = { mode }
49+ className = { `h-7 w-7 rounded-md bg-${ mode } p-1 text-white` }
50+ />
51+ ) ) }
52+ </ div >
7053 { title }
7154 </ div >
7255 < Checkbox
73- checked = { checked }
56+ id = { `select-all-${ tile . uuid } -${ groupKey } ` }
57+ checked = { isIndeterminate ? 'indeterminate' : isAllSelected }
7458 onChange = { ( e ) => {
59+ const checked = e . target . checked
7560 posthog . capture ( 'stop_place_edit_interaction' , {
7661 location : trackingLocation ,
7762 field : 'lines' ,
7863 column_value : 'none' ,
79- action : e . target . checked ? 'select_all' : 'cleared' ,
80- } )
81- setChecked ( e . currentTarget . checked )
82- lineElements . forEach ( ( input ) => {
83- if ( input instanceof HTMLInputElement )
84- input . checked = e . currentTarget . checked
64+ action : checked ? 'select_all' : 'cleared' ,
8565 } )
66+ onToggleGroup (
67+ lines . map ( ( l ) => l . id ) ,
68+ checked ,
69+ )
8670 } }
8771 />
8872 </ div >
89- { checked &&
90- lines . map ( ( line ) => (
73+ { [ ...lines ]
74+ . sort ( ( a , b ) => {
75+ const modeA = a . transportMode || ''
76+ const modeB = b . transportMode || ''
77+ if ( modeA !== modeB ) {
78+ return modeA . localeCompare ( modeB )
79+ }
80+ const codeA = a . publicCode || ''
81+ const codeB = b . publicCode || ''
82+ return codeA . localeCompare ( codeB , undefined , {
83+ numeric : true ,
84+ } )
85+ } )
86+ . map ( ( line ) => (
9187 < Checkbox
92- name = { `${ tile . uuid } -${ groupKey } ` }
93- defaultChecked = {
94- ! tile . whitelistedLines ||
95- tile . whitelistedLines . length === 0 ||
96- tile . whitelistedLines . includes ( line . id )
97- }
9888 key = { line . id }
9989 value = { line . id }
100- className = "pl-6"
90+ checked = { selectedLineIds . has ( line . id ) }
91+ className = { `pl-6 ${ showLines ? 'inline' : 'hidden' } ` }
92+ name = { `${ tile . uuid } -${ line . id } ` }
93+ data-transport-mode = { line . transportMode }
10194 onChange = { ( ) => {
95+ /* TODO: add when logic is confirmed correct
96+
10297 posthog.capture('stop_place_edit_interaction', {
10398 location: trackingLocation,
10499 field: 'lines',
105100 column_value: 'none',
106101 action: 'changed',
107- } )
108- determineAllChecked ( )
102+ })*/
103+ onToggleLine ( line . id )
109104 } }
110105 >
111- < div className = "flex flex-row items-center gap-1 " >
106+ < div className = "flex flex-row items-center gap-2 " >
112107 { line . publicCode && (
113108 < div
114- className = { `publicCode bg-${ transportMode } text-white` }
109+ className = { `publicCode bg-${ line . transportMode } text-white` }
115110 >
116111 { line . publicCode }
117112 </ div >
0 commit comments