Skip to content

Commit 3babe8a

Browse files
authored
Merge pull request #70 from takahiroanno2024/feature/report
階層型クラスタリング:クラスタフィルターに応じた解説文更新
2 parents 261f09a + 8107f05 commit 3babe8a

File tree

2 files changed

+44
-26
lines changed

2 files changed

+44
-26
lines changed

scatter/report/components/ClientContainer.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {About} from '@/components/About'
88
import {Cluster, Meta, Result} from '@/type'
99
import {LoadingBar} from '@/components/LoadingBar'
1010
import {FilterSettingDialog} from '@/components/FilterSettingDialog'
11+
import {ClusterOverview} from '@/components/ClusterOverview'
1112

1213
type Props = {
1314
resultSize: number
@@ -91,7 +92,12 @@ export function ClientContainer({resultSize, meta, children}: PropsWithChildren<
9192
rootLevel={rootLevel}
9293
onClickSettingAction={() => {setOpenFilterSetting(true)}}
9394
/>
94-
{ children }
95+
{ rootLevel === 0 && children }
96+
{ rootLevel !== 0 && (
97+
filteredResult.clusters.filter(c => c.level === rootLevel + 1).map(c => (
98+
<ClusterOverview key={c.id} cluster={c} />
99+
))
100+
)}
95101
<Analysis result={result} />
96102
{result && meta && (<About meta={meta} />)}
97103
</>

scatter/report/components/FilterSettingDialog.tsx

Lines changed: 37 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {Box, Button} from '@chakra-ui/react'
1+
import {Box, Button, VStack} from '@chakra-ui/react'
22
import React, {useEffect, useState} from 'react'
33
import {NativeSelectField, NativeSelectRoot} from '@/components/ui/native-select'
44
import {Result} from '@/type'
@@ -11,6 +11,7 @@ import {
1111
DialogRoot,
1212
DialogTitle
1313
} from '@/components/ui/dialog'
14+
import {ChevronDownIcon} from 'lucide-react'
1415

1516
type Props = {
1617
result: Result
@@ -25,20 +26,28 @@ export function FilterSettingDialog({result, isOpen, onClose, onChangeFilter}: P
2526
const [level3, setLevel3] = useState<string>('0')
2627
const [level4, setLevel4] = useState<string>('0')
2728

28-
useEffect(() => {
29-
if (level1 === '0') {
30-
setLevel2('0')
31-
setLevel3('0')
32-
setLevel4('0')
29+
function onChangeLevel(level: number, id: string) {
30+
switch (level) {
31+
case 1:
32+
setLevel1(id)
33+
setLevel2('0')
34+
setLevel3('0')
35+
setLevel4('0')
36+
break
37+
case 2:
38+
setLevel2(id)
39+
setLevel3('0')
40+
setLevel4('0')
41+
break
42+
case 3:
43+
setLevel3(id)
44+
setLevel4('0')
45+
break
46+
case 4:
47+
setLevel4(id)
48+
break
3349
}
34-
if (level2 === '0') {
35-
setLevel3('0')
36-
setLevel4('0')
37-
}
38-
if (level3 === '0') {
39-
setLevel4('0')
40-
}
41-
}, [level1, level2, level3, level4])
50+
}
4251

4352
function onApply() {
4453
onChangeFilter(level1, level2, level3, level4)
@@ -52,11 +61,11 @@ export function FilterSettingDialog({result, isOpen, onClose, onChangeFilter}: P
5261
<DialogTitle>表示クラスター設定</DialogTitle>
5362
</DialogHeader>
5463
<DialogBody>
55-
<Box mb={2}>
64+
<Box>
5665
<NativeSelectRoot>
5766
<NativeSelectField
5867
value={level1}
59-
onChange={(e) => setLevel1(e.target.value)}
68+
onChange={(e) => onChangeLevel(1, e.target.value)}
6069
>
6170
<option value={'0'}>全て</option>
6271
{result.clusters.filter(c => c.level === 1).map(c => (
@@ -66,49 +75,52 @@ export function FilterSettingDialog({result, isOpen, onClose, onChangeFilter}: P
6675
</NativeSelectRoot>
6776
</Box>
6877
{level1 !== '0' && (
69-
<Box mb={2}>
78+
<VStack mt={2}>
79+
<ChevronDownIcon />
7080
<NativeSelectRoot>
7181
<NativeSelectField
7282
value={level2}
73-
onChange={(e) => setLevel2(e.target.value)}
83+
onChange={(e) => onChangeLevel(2, e.target.value)}
7484
>
7585
<option value={'0'}>全て</option>
7686
{result.clusters.filter(c => c.parent === level1).map(c => (
7787
<option key={c.id} value={c.id}>{c.label}</option>
7888
))}
7989
</NativeSelectField>
8090
</NativeSelectRoot>
81-
</Box>
91+
</VStack>
8292
)}
8393
{level2 !== '0' && (
84-
<Box mb={2}>
94+
<VStack mt={2}>
95+
<ChevronDownIcon />
8596
<NativeSelectRoot>
8697
<NativeSelectField
8798
value={level3}
88-
onChange={(e) => setLevel3(e.target.value)}
99+
onChange={(e) => onChangeLevel(3, e.target.value)}
89100
>
90101
<option value={'0'}>全て</option>
91102
{result.clusters.filter(c => c.parent === level2).map(c => (
92103
<option key={c.id} value={c.id}>{c.label}</option>
93104
))}
94105
</NativeSelectField>
95106
</NativeSelectRoot>
96-
</Box>
107+
</VStack>
97108
)}
98109
{level3 !== '0' && (
99-
<Box mb={2}>
110+
<VStack mt={2}>
111+
<ChevronDownIcon />
100112
<NativeSelectRoot>
101113
<NativeSelectField
102114
value={level4}
103-
onChange={(e) => setLevel4(e.target.value)}
115+
onChange={(e) => onChangeLevel(4, e.target.value)}
104116
>
105117
<option value={'0'}>全て</option>
106118
{result.clusters.filter(c => c.parent === level3).map(c => (
107119
<option key={c.id} value={c.id}>{c.label}</option>
108120
))}
109121
</NativeSelectField>
110122
</NativeSelectRoot>
111-
</Box>
123+
</VStack>
112124
)}
113125
</DialogBody>
114126
<DialogFooter>

0 commit comments

Comments
 (0)