Skip to content

Commit 500f17b

Browse files
committed
🚧 Andreversjon av filter med lagring
1 parent f1dfa66 commit 500f17b

File tree

2 files changed

+282
-93
lines changed

2 files changed

+282
-93
lines changed

tavla/app/(admin)/tavler/[id]/rediger/components/TileCard/PlatformAndLines.tsx

Lines changed: 55 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import { Checkbox } from '@entur/form'
33
import { TransportIcon } from 'app/(admin)/tavler/[id]/rediger/components/Settings/components/TransportIcon'
44
import { EventProps } from 'app/posthog/events'
55
import { usePosthogTracking } from 'app/posthog/usePosthogTracking'
6-
import { useState } from 'react'
76
import { BoardTileDB } from 'src/types/db-types/boards'
87
import { TTransportMode } from 'src/types/graphql-schema'
98
import { 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

Comments
 (0)