1
1
import React from "react" ;
2
2
import * as d3 from "d3" ;
3
3
import { color } from "@/styles" ;
4
-
5
- type YearType = "2021" | "2022" | "2023 ";
4
+ import { IMeister } from "@/interfaces" ;
5
+ import { useDidMountEffect } from "@/hooks/useDidMountEffect ";
6
6
7
7
interface MeisterChartData {
8
- group : string ;
9
- year : YearType ;
10
- points : number ;
8
+ group :
9
+ | "basicJobSkills"
10
+ | "professionalTech"
11
+ | "workEthic"
12
+ | "humanities"
13
+ | "foreignScore" ;
14
+ scoreType : "avg" | "meister" | "max" ;
11
15
}
12
16
13
17
const graphColor = {
14
- "2021" : color . primary_yellow ,
15
- "2022" : color . primary_blue ,
16
- "2023" : color . primary_red ,
18
+ avg : color . primary_yellow ,
19
+ meister : color . primary_blue ,
20
+ max : color . primary_red ,
17
21
} ;
18
22
19
23
const groups = [
20
- "외국어 능력" ,
21
- "인성 직업 의식" ,
24
+ "직업 기초 능력" ,
22
25
"전문 기술 역량" ,
26
+ "인성 직업 의식" ,
23
27
"인문학적 소양" ,
24
- "직업 기초 능력" ,
28
+ "외국어 능력" ,
25
29
] ;
26
30
27
31
const data : MeisterChartData [ ] = [
28
- { group : "외국어 능력 " , year : "2021" , points : 32 } ,
29
- { group : "외국어 능력 " , year : "2022" , points : 43 } ,
30
- { group : "외국어 능력 " , year : "2023" , points : 44 } ,
32
+ { group : "basicJobSkills " , scoreType : "avg" } ,
33
+ { group : "basicJobSkills " , scoreType : "meister" } ,
34
+ { group : "basicJobSkills " , scoreType : "max" } ,
31
35
32
- { group : "인성 직업 의식 " , year : "2021" , points : 40 } ,
33
- { group : "인성 직업 의식 " , year : "2022" , points : 36 } ,
34
- { group : "인성 직업 의식 " , year : "2023" , points : 31 } ,
36
+ { group : "professionalTech " , scoreType : "avg" } ,
37
+ { group : "professionalTech " , scoreType : "meister" } ,
38
+ { group : "professionalTech " , scoreType : "max" } ,
35
39
36
- { group : "전문 기술 역량 " , year : "2021" , points : 37 } ,
37
- { group : "전문 기술 역량 " , year : "2022" , points : 10 } ,
38
- { group : "전문 기술 역량 " , year : "2023" , points : 17 } ,
40
+ { group : "workEthic " , scoreType : "avg" } ,
41
+ { group : "workEthic " , scoreType : "meister" } ,
42
+ { group : "workEthic " , scoreType : "max" } ,
39
43
40
- { group : "인문학적 소양 " , year : "2021" , points : 10 } ,
41
- { group : "인문학적 소양 " , year : "2022" , points : 23 } ,
42
- { group : "인문학적 소양 " , year : "2023" , points : 4 } ,
44
+ { group : "humanities " , scoreType : "avg" } ,
45
+ { group : "humanities " , scoreType : "meister" } ,
46
+ { group : "humanities " , scoreType : "max" } ,
43
47
44
- { group : "직업 기초 능력 " , year : "2021" , points : 38 } ,
45
- { group : "직업 기초 능력 " , year : "2022" , points : 2 } ,
46
- { group : "직업 기초 능력 " , year : "2023" , points : 25 } ,
48
+ { group : "foreignScore " , scoreType : "avg" } ,
49
+ { group : "foreignScore " , scoreType : "meister" } ,
50
+ { group : "foreignScore " , scoreType : "max" } ,
47
51
] ;
48
52
49
53
const meisterSeparation = [ 0 , 30 , 60 ] ;
50
54
51
- const MeisterChart = ( ) => {
55
+ interface IMeisterChartProps {
56
+ meisterData : IMeister ;
57
+ }
58
+
59
+ const MeisterChart = ( { meisterData } : IMeisterChartProps ) => {
52
60
const canvasRef = React . useRef ( null ) ;
53
61
54
- React . useEffect ( ( ) => {
62
+ useDidMountEffect ( ( ) => {
63
+ if ( meisterData . avg . basicJobSkills === 0 ) return ;
55
64
const canvas = d3 . select ( canvasRef . current ) ;
56
65
const svg = canvas
57
66
. append ( "svg" )
@@ -74,11 +83,14 @@ const MeisterChart = () => {
74
83
. attr ( "height" , "0%" )
75
84
. attr ( "y" , "100%" )
76
85
. attr ( "width" , 15 )
77
- . attr ( "fill" , graphColor [ item . year ] )
86
+ . attr ( "fill" , graphColor [ item . scoreType ] )
78
87
. transition ( )
79
88
. duration ( 1000 )
80
- . attr ( "height" , `${ ( item . points / data . length ) * 100 } %` )
81
- . attr ( "y" , `${ 100 - item . points } %` ) ;
89
+ . attr (
90
+ "height" ,
91
+ `${ ( meisterData [ item . scoreType ] [ item . group ] / data . length ) * 120 } %` ,
92
+ )
93
+ . attr ( "y" , `${ 110 - meisterData [ item . scoreType ] [ item . group ] } %` ) ;
82
94
83
95
svg
84
96
. append ( "text" )
@@ -89,8 +101,8 @@ const MeisterChart = () => {
89
101
. style ( "font-size" , "10px" )
90
102
. transition ( )
91
103
. duration ( 1000 )
92
- . attr ( "y" , `${ 98 - item . points } %` )
93
- . text ( item . points )
104
+ . attr ( "y" , `${ 108 - meisterData [ item . scoreType ] [ item . group ] } %` )
105
+ . text ( Math . round ( meisterData [ item . scoreType ] [ item . group ] ) )
94
106
. style ( "fill" , color . gray ) ;
95
107
} ) ;
96
108
@@ -125,7 +137,7 @@ const MeisterChart = () => {
125
137
. style ( "font-weight" , "600" )
126
138
. style ( "font-size" , "12px" ) ;
127
139
} ) ;
128
- } , [ ] ) ;
140
+ } , [ meisterData ] ) ;
129
141
130
142
return < div ref = { canvasRef } /> ;
131
143
} ;
0 commit comments