@campxdev/shared 1.10.76 → 1.10.78
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/components/Input/MultiSelect.tsx +0 -1
- package/src/components/MyProfile/Education/EducationForm.tsx +14 -12
- package/src/components/MyProfile/Experience/ExperienceForm.tsx +21 -14
- package/src/components/MyProfile/MyProfile.tsx +2 -3
- package/src/components/MyProfile/PaperPublication/Authors.tsx +47 -51
- package/src/components/MyProfile/PaperPublication/PublicationsForm.tsx +8 -5
- package/src/components/MyProfile/PaperPublication/Styles.tsx +8 -1
- package/src/components/MyProfile/ResearchProjects/ResearchProjects.tsx +25 -38
- package/src/components/MyProfile/Workshop/WorkshopForm.tsx +14 -12
- package/src/components/Selectors/ClassRoomSelector.tsx +97 -0
- package/src/components/Selectors/CourseSelector.tsx +4 -2
- package/src/components/Selectors/DepartmentSelector.tsx +67 -0
- package/src/components/Selectors/FacultySelector.tsx +92 -0
- package/src/components/Selectors/FormSelectors/FormClassRoomSelector.tsx +50 -0
- package/src/components/Selectors/FormSelectors/FormCourseSelector.tsx +3 -0
- package/src/components/Selectors/FormSelectors/FormDepartmentSelector.tsx +49 -0
- package/src/components/Selectors/FormSelectors/FormFacultySelector.tsx +55 -0
- package/src/components/Selectors/FormSelectors/FormProgramSelector.tsx +4 -1
- package/src/components/Selectors/FormSelectors/MultiSelect/MultiFacultySelector.tsx +106 -0
- package/src/components/Selectors/ProgramSelector.tsx +4 -2
- package/src/components/Selectors/index.tsx +14 -0
- package/src/components/Tables/2DTable/Table.tsx +42 -34
- package/src/permissions/PermissionsStore.ts +356 -0
- package/src/shared-state/PermissionsStore.ts +9 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { SelectProps } from '@mui/material'
|
|
2
|
+
import { useEffect, useState } from 'react'
|
|
3
|
+
import axios from '../../config/axios'
|
|
4
|
+
import { SingleSelect } from '../Input'
|
|
5
|
+
|
|
6
|
+
type FacultySelectorProps = {
|
|
7
|
+
name?: string
|
|
8
|
+
label: string
|
|
9
|
+
filters?: {
|
|
10
|
+
departmentId: number | string
|
|
11
|
+
isSearch: boolean
|
|
12
|
+
isActive: boolean
|
|
13
|
+
type: string
|
|
14
|
+
}
|
|
15
|
+
required?: boolean
|
|
16
|
+
onChange?: (value: any) => void
|
|
17
|
+
allowAll?: boolean
|
|
18
|
+
error?: boolean
|
|
19
|
+
helperText?: string
|
|
20
|
+
api?: string
|
|
21
|
+
} & SelectProps
|
|
22
|
+
const FacultySelector = (props: FacultySelectorProps) => {
|
|
23
|
+
const {
|
|
24
|
+
name,
|
|
25
|
+
required = false,
|
|
26
|
+
label,
|
|
27
|
+
multiple = false,
|
|
28
|
+
filters,
|
|
29
|
+
allowAll = true,
|
|
30
|
+
api = '/hrms/employees',
|
|
31
|
+
} = props
|
|
32
|
+
const [options, setOptions] = useState([])
|
|
33
|
+
const [prevDepartmentId, setPrevDepartmentId] = useState(null)
|
|
34
|
+
const handleOpen = () => {
|
|
35
|
+
if (filters) {
|
|
36
|
+
if (filters.departmentId && filters.departmentId !== prevDepartmentId) {
|
|
37
|
+
setOptions([])
|
|
38
|
+
axios
|
|
39
|
+
.get(api, {
|
|
40
|
+
params: filters,
|
|
41
|
+
})
|
|
42
|
+
.then((response) => {
|
|
43
|
+
setOptions(response.data.data)
|
|
44
|
+
setPrevDepartmentId(filters.departmentId)
|
|
45
|
+
})
|
|
46
|
+
.catch((error) => {
|
|
47
|
+
console.error('Error fetching data from the API:', error)
|
|
48
|
+
})
|
|
49
|
+
}
|
|
50
|
+
} else if (options.length === 0) {
|
|
51
|
+
axios
|
|
52
|
+
.get(api)
|
|
53
|
+
.then((response) => {
|
|
54
|
+
setOptions(response.data.data)
|
|
55
|
+
})
|
|
56
|
+
.catch((error) => {
|
|
57
|
+
console.error('Error fetching data from the API:', error)
|
|
58
|
+
})
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
useEffect(() => {
|
|
62
|
+
if (props?.value && props.value != 'all') {
|
|
63
|
+
handleOpen()
|
|
64
|
+
}
|
|
65
|
+
}, [props.value])
|
|
66
|
+
|
|
67
|
+
const handleOptions =
|
|
68
|
+
options.length > 0
|
|
69
|
+
? [
|
|
70
|
+
...(allowAll ? [{ value: 'all', label: 'All' }] : []),
|
|
71
|
+
...options.map((item) => ({
|
|
72
|
+
label: `${item.fullName}`,
|
|
73
|
+
value: `${item.userId}`,
|
|
74
|
+
})),
|
|
75
|
+
]
|
|
76
|
+
: allowAll
|
|
77
|
+
? [{ value: 'all', label: 'All' }]
|
|
78
|
+
: []
|
|
79
|
+
|
|
80
|
+
return (
|
|
81
|
+
<SingleSelect
|
|
82
|
+
name={name}
|
|
83
|
+
label={label}
|
|
84
|
+
required={required}
|
|
85
|
+
options={handleOptions}
|
|
86
|
+
onOpen={handleOpen}
|
|
87
|
+
defaultValue="all"
|
|
88
|
+
{...props}
|
|
89
|
+
/>
|
|
90
|
+
)
|
|
91
|
+
}
|
|
92
|
+
export default FacultySelector
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { SelectProps } from '@mui/material'
|
|
2
|
+
import { Controller } from 'react-hook-form'
|
|
3
|
+
import ClassRoomSelector from '../ClassRoomSelector'
|
|
4
|
+
|
|
5
|
+
type ClassRoomSelectorProps = {
|
|
6
|
+
control: any
|
|
7
|
+
name: string
|
|
8
|
+
label: string
|
|
9
|
+
required?: boolean
|
|
10
|
+
multiple?: boolean
|
|
11
|
+
allowAll?: boolean
|
|
12
|
+
filters?: { programId: number; courseId: number; batch: string }
|
|
13
|
+
onChange?: (value: any) => void
|
|
14
|
+
api?: string
|
|
15
|
+
} & SelectProps
|
|
16
|
+
export default function FormClassRoomSelector(props: ClassRoomSelectorProps) {
|
|
17
|
+
const {
|
|
18
|
+
name,
|
|
19
|
+
required = false,
|
|
20
|
+
control,
|
|
21
|
+
label,
|
|
22
|
+
multiple = false,
|
|
23
|
+
allowAll = true,
|
|
24
|
+
onChange,
|
|
25
|
+
value,
|
|
26
|
+
filters,
|
|
27
|
+
api,
|
|
28
|
+
} = props
|
|
29
|
+
|
|
30
|
+
return (
|
|
31
|
+
<Controller
|
|
32
|
+
name={name}
|
|
33
|
+
control={control}
|
|
34
|
+
render={({ field, fieldState: { error } }) => (
|
|
35
|
+
<ClassRoomSelector
|
|
36
|
+
label={label}
|
|
37
|
+
name={name}
|
|
38
|
+
onChange={onChange ?? field.onChange}
|
|
39
|
+
value={value ?? field?.value}
|
|
40
|
+
allowAll={allowAll}
|
|
41
|
+
filters={filters}
|
|
42
|
+
required={required}
|
|
43
|
+
error={!!error}
|
|
44
|
+
helperText={error?.message}
|
|
45
|
+
{...props}
|
|
46
|
+
/>
|
|
47
|
+
)}
|
|
48
|
+
/>
|
|
49
|
+
)
|
|
50
|
+
}
|
|
@@ -11,6 +11,7 @@ type FormCourseSelectorProps = {
|
|
|
11
11
|
allowAll?: boolean
|
|
12
12
|
onChange?: (value: any) => void
|
|
13
13
|
api?: string
|
|
14
|
+
valueByUniqueId?: boolean
|
|
14
15
|
} & SelectProps
|
|
15
16
|
export default function FormCourseSelector(props: FormCourseSelectorProps) {
|
|
16
17
|
const {
|
|
@@ -23,6 +24,7 @@ export default function FormCourseSelector(props: FormCourseSelectorProps) {
|
|
|
23
24
|
onChange,
|
|
24
25
|
value,
|
|
25
26
|
api,
|
|
27
|
+
valueByUniqueId = false,
|
|
26
28
|
} = props
|
|
27
29
|
|
|
28
30
|
return (
|
|
@@ -39,6 +41,7 @@ export default function FormCourseSelector(props: FormCourseSelectorProps) {
|
|
|
39
41
|
required={required}
|
|
40
42
|
error={!!error}
|
|
41
43
|
helperText={error?.message}
|
|
44
|
+
valueByUniqueId={valueByUniqueId}
|
|
42
45
|
{...props}
|
|
43
46
|
/>
|
|
44
47
|
)}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { SelectProps } from '@mui/material'
|
|
2
|
+
import { Controller } from 'react-hook-form'
|
|
3
|
+
import DepartmentSelector from '../DepartmentSelector'
|
|
4
|
+
|
|
5
|
+
type FormDepartmentSelectorProps = {
|
|
6
|
+
control: any
|
|
7
|
+
name: string
|
|
8
|
+
label: string
|
|
9
|
+
required?: boolean
|
|
10
|
+
multiple?: boolean
|
|
11
|
+
allowAll?: boolean
|
|
12
|
+
onChange?: (value: any) => void
|
|
13
|
+
api?: string
|
|
14
|
+
} & SelectProps
|
|
15
|
+
export default function FormDepartmentSelector(
|
|
16
|
+
props: FormDepartmentSelectorProps,
|
|
17
|
+
) {
|
|
18
|
+
const {
|
|
19
|
+
name,
|
|
20
|
+
required = false,
|
|
21
|
+
control,
|
|
22
|
+
label,
|
|
23
|
+
allowAll = true,
|
|
24
|
+
multiple = false,
|
|
25
|
+
onChange,
|
|
26
|
+
value,
|
|
27
|
+
api,
|
|
28
|
+
} = props
|
|
29
|
+
|
|
30
|
+
return (
|
|
31
|
+
<Controller
|
|
32
|
+
name={name}
|
|
33
|
+
control={control}
|
|
34
|
+
render={({ field, fieldState: { error } }) => (
|
|
35
|
+
<DepartmentSelector
|
|
36
|
+
label={label}
|
|
37
|
+
name={name}
|
|
38
|
+
onChange={onChange ?? field.onChange}
|
|
39
|
+
value={value ?? field?.value}
|
|
40
|
+
allowAll={allowAll}
|
|
41
|
+
required={required}
|
|
42
|
+
error={!!error}
|
|
43
|
+
helperText={error?.message}
|
|
44
|
+
{...props}
|
|
45
|
+
/>
|
|
46
|
+
)}
|
|
47
|
+
/>
|
|
48
|
+
)
|
|
49
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { SelectProps } from '@mui/material'
|
|
2
|
+
import { Controller } from 'react-hook-form'
|
|
3
|
+
import FacultySelector from '../FacultySelector'
|
|
4
|
+
|
|
5
|
+
type FacultySelectorProps = {
|
|
6
|
+
control: any
|
|
7
|
+
name: string
|
|
8
|
+
label: string
|
|
9
|
+
required?: boolean
|
|
10
|
+
multiple?: boolean
|
|
11
|
+
allowAll?: boolean
|
|
12
|
+
filters?: {
|
|
13
|
+
departmentId: number | string
|
|
14
|
+
isSearch: boolean
|
|
15
|
+
isActive: boolean
|
|
16
|
+
type: string
|
|
17
|
+
}
|
|
18
|
+
onChange?: (value: any) => void
|
|
19
|
+
api?: string
|
|
20
|
+
} & SelectProps
|
|
21
|
+
export default function FormFacultySelector(props: FacultySelectorProps) {
|
|
22
|
+
const {
|
|
23
|
+
name,
|
|
24
|
+
required = false,
|
|
25
|
+
control,
|
|
26
|
+
label,
|
|
27
|
+
multiple = false,
|
|
28
|
+
allowAll = true,
|
|
29
|
+
onChange,
|
|
30
|
+
value,
|
|
31
|
+
filters,
|
|
32
|
+
api,
|
|
33
|
+
} = props
|
|
34
|
+
|
|
35
|
+
return (
|
|
36
|
+
<Controller
|
|
37
|
+
name={name}
|
|
38
|
+
control={control}
|
|
39
|
+
render={({ field, fieldState: { error } }) => (
|
|
40
|
+
<FacultySelector
|
|
41
|
+
label={label}
|
|
42
|
+
name={name}
|
|
43
|
+
onChange={onChange ?? field.onChange}
|
|
44
|
+
value={value ?? field?.value}
|
|
45
|
+
allowAll={allowAll}
|
|
46
|
+
filters={filters}
|
|
47
|
+
required={required}
|
|
48
|
+
error={!!error}
|
|
49
|
+
helperText={error?.message}
|
|
50
|
+
{...props}
|
|
51
|
+
/>
|
|
52
|
+
)}
|
|
53
|
+
/>
|
|
54
|
+
)
|
|
55
|
+
}
|
|
@@ -12,6 +12,7 @@ type ProgramSelectorProps = {
|
|
|
12
12
|
filters?: { courseId: number }
|
|
13
13
|
onChange?: (value: any) => void
|
|
14
14
|
api?: string
|
|
15
|
+
valueByBranchCode?: boolean
|
|
15
16
|
} & SelectProps
|
|
16
17
|
export default function FormProgramSelector(props: ProgramSelectorProps) {
|
|
17
18
|
const {
|
|
@@ -24,7 +25,8 @@ export default function FormProgramSelector(props: ProgramSelectorProps) {
|
|
|
24
25
|
onChange,
|
|
25
26
|
value,
|
|
26
27
|
filters,
|
|
27
|
-
api
|
|
28
|
+
api,
|
|
29
|
+
valueByBranchCode = false,
|
|
28
30
|
} = props
|
|
29
31
|
|
|
30
32
|
return (
|
|
@@ -42,6 +44,7 @@ export default function FormProgramSelector(props: ProgramSelectorProps) {
|
|
|
42
44
|
required={required}
|
|
43
45
|
error={!!error}
|
|
44
46
|
helperText={error?.message}
|
|
47
|
+
valueByBranchCode={valueByBranchCode}
|
|
45
48
|
{...props}
|
|
46
49
|
/>
|
|
47
50
|
)}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { SelectProps } from '@mui/material'
|
|
2
|
+
import { useEffect, useState } from 'react'
|
|
3
|
+
import { Controller } from 'react-hook-form'
|
|
4
|
+
import axios from '../../../../config/axios'
|
|
5
|
+
import { MultiSelect } from '../../../Input'
|
|
6
|
+
|
|
7
|
+
type MultiFacultySelectorProps = {
|
|
8
|
+
control: any
|
|
9
|
+
name?: string
|
|
10
|
+
label: string
|
|
11
|
+
filters?: {
|
|
12
|
+
departmentId: string
|
|
13
|
+
isSearch: boolean
|
|
14
|
+
isActive: boolean
|
|
15
|
+
type: string
|
|
16
|
+
}
|
|
17
|
+
required?: boolean
|
|
18
|
+
onChange?: (value: any) => void
|
|
19
|
+
allowAll?: boolean
|
|
20
|
+
error?: boolean
|
|
21
|
+
helperText?: string
|
|
22
|
+
api?: string
|
|
23
|
+
} & SelectProps
|
|
24
|
+
const MultiFacultySelector = (props: MultiFacultySelectorProps) => {
|
|
25
|
+
const {
|
|
26
|
+
control,
|
|
27
|
+
onChange,
|
|
28
|
+
name,
|
|
29
|
+
required = false,
|
|
30
|
+
label,
|
|
31
|
+
multiple = true,
|
|
32
|
+
filters,
|
|
33
|
+
value,
|
|
34
|
+
allowAll = true,
|
|
35
|
+
api = '/hrms/employees',
|
|
36
|
+
} = props
|
|
37
|
+
const [options, setOptions] = useState([])
|
|
38
|
+
const [prevDepartmentId, setPrevDepartmentId] = useState(null)
|
|
39
|
+
const handleOpen = () => {
|
|
40
|
+
if (filters) {
|
|
41
|
+
if (filters.departmentId && filters.departmentId !== prevDepartmentId) {
|
|
42
|
+
setOptions([])
|
|
43
|
+
axios
|
|
44
|
+
.get(api, {
|
|
45
|
+
params: filters,
|
|
46
|
+
})
|
|
47
|
+
.then((response) => {
|
|
48
|
+
setOptions(response.data.data)
|
|
49
|
+
setPrevDepartmentId(filters.departmentId)
|
|
50
|
+
})
|
|
51
|
+
.catch((error) => {
|
|
52
|
+
console.error('Error fetching data from the API:', error)
|
|
53
|
+
})
|
|
54
|
+
}
|
|
55
|
+
} else if (options.length === 0) {
|
|
56
|
+
axios
|
|
57
|
+
.get(api)
|
|
58
|
+
.then((response) => {
|
|
59
|
+
setOptions(response.data.data)
|
|
60
|
+
})
|
|
61
|
+
.catch((error) => {
|
|
62
|
+
console.error('Error fetching data from the API:', error)
|
|
63
|
+
})
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
useEffect(() => {
|
|
67
|
+
if (props?.value && props.value != 'all') {
|
|
68
|
+
handleOpen()
|
|
69
|
+
}
|
|
70
|
+
}, [props.value])
|
|
71
|
+
|
|
72
|
+
const handleOptions =
|
|
73
|
+
options.length > 0
|
|
74
|
+
? [
|
|
75
|
+
...(allowAll ? [{ value: 'all', label: 'All' }] : []),
|
|
76
|
+
...options.map((item) => ({
|
|
77
|
+
label: `${item.fullName}`,
|
|
78
|
+
value: `${item._id}`,
|
|
79
|
+
})),
|
|
80
|
+
]
|
|
81
|
+
: allowAll
|
|
82
|
+
? [{ value: 'all', label: 'All' }]
|
|
83
|
+
: []
|
|
84
|
+
|
|
85
|
+
return (
|
|
86
|
+
<Controller
|
|
87
|
+
name={name}
|
|
88
|
+
control={control}
|
|
89
|
+
render={({ field, fieldState: { error } }) => (
|
|
90
|
+
<MultiSelect
|
|
91
|
+
name={name}
|
|
92
|
+
label={label}
|
|
93
|
+
required={required}
|
|
94
|
+
options={handleOptions}
|
|
95
|
+
onOpen={handleOpen}
|
|
96
|
+
onChange={onChange ?? field.onChange}
|
|
97
|
+
value={value ?? field?.value}
|
|
98
|
+
error={!!error}
|
|
99
|
+
helperText={error?.message}
|
|
100
|
+
multiple={multiple}
|
|
101
|
+
/>
|
|
102
|
+
)}
|
|
103
|
+
/>
|
|
104
|
+
)
|
|
105
|
+
}
|
|
106
|
+
export default MultiFacultySelector
|
|
@@ -13,6 +13,7 @@ type ProgramSelectorProps = {
|
|
|
13
13
|
error?: boolean
|
|
14
14
|
helperText?: string
|
|
15
15
|
api?: string
|
|
16
|
+
valueByBranchCode?: boolean
|
|
16
17
|
} & SelectProps
|
|
17
18
|
const ProgramSelector = (props: ProgramSelectorProps) => {
|
|
18
19
|
const {
|
|
@@ -22,7 +23,8 @@ const ProgramSelector = (props: ProgramSelectorProps) => {
|
|
|
22
23
|
multiple = false,
|
|
23
24
|
filters,
|
|
24
25
|
allowAll = true,
|
|
25
|
-
|
|
26
|
+
valueByBranchCode = false,
|
|
27
|
+
api = '/paymentx/domain/programs',
|
|
26
28
|
} = props
|
|
27
29
|
const [options, setOptions] = useState([])
|
|
28
30
|
const [prevCourseId, setPrevCourseId] = useState(null)
|
|
@@ -65,7 +67,7 @@ const ProgramSelector = (props: ProgramSelectorProps) => {
|
|
|
65
67
|
...(allowAll ? [{ value: 'all', label: 'All' }] : []),
|
|
66
68
|
...options.map((item) => ({
|
|
67
69
|
label: `${item.branchName}`,
|
|
68
|
-
value: `${item.id}`,
|
|
70
|
+
value: !valueByBranchCode ? `${item.id}` : `${item.branchCode}`,
|
|
69
71
|
})),
|
|
70
72
|
]
|
|
71
73
|
: allowAll
|
|
@@ -1,10 +1,17 @@
|
|
|
1
|
+
import ClassRoomSelector from './ClassRoomSelector'
|
|
1
2
|
import CourseSelector from './CourseSelector'
|
|
3
|
+
import DepartmentSelector from './DepartmentSelector'
|
|
4
|
+
import FacultySelector from './FacultySelector'
|
|
2
5
|
import FeeTypeSelector from './FeeTypeSelector'
|
|
6
|
+
import FormClassRoomSelector from './FormSelectors/FormClassRoomSelector'
|
|
3
7
|
import FormCourseSelector from './FormSelectors/FormCourseSelector'
|
|
8
|
+
import FormDepartmentSelector from './FormSelectors/FormDepartmentSelector'
|
|
9
|
+
import FormFacultySelector from './FormSelectors/FormFacultySelector'
|
|
4
10
|
import FormFeeTypeSelector from './FormSelectors/FormFeeTypeSelector'
|
|
5
11
|
import FormProgramSelector from './FormSelectors/FormProgramSelector'
|
|
6
12
|
import FormQuotaSelector from './FormSelectors/FormQuotaSelector'
|
|
7
13
|
import FormSemseterSelector from './FormSelectors/FormSemesterSelector'
|
|
14
|
+
import MultiFacultySelector from './FormSelectors/MultiSelect/MultiFacultySelector'
|
|
8
15
|
import MultiFeeTypeSelector from './FormSelectors/MultiSelect/MultiFeeTypeSelector'
|
|
9
16
|
import MultiProgramSelector from './FormSelectors/MultiSelect/MultiProgramSelector'
|
|
10
17
|
import MultiQuotaSelector from './FormSelectors/MultiSelect/MultiQuotaSelector'
|
|
@@ -13,13 +20,20 @@ import QuotaSelector from './QuotaSelector'
|
|
|
13
20
|
import SemesterSelector from './SemesterSelector'
|
|
14
21
|
|
|
15
22
|
export {
|
|
23
|
+
ClassRoomSelector,
|
|
16
24
|
CourseSelector,
|
|
25
|
+
DepartmentSelector,
|
|
26
|
+
FacultySelector,
|
|
17
27
|
FeeTypeSelector,
|
|
28
|
+
FormClassRoomSelector,
|
|
18
29
|
FormCourseSelector,
|
|
30
|
+
FormDepartmentSelector,
|
|
31
|
+
FormFacultySelector,
|
|
19
32
|
FormFeeTypeSelector,
|
|
20
33
|
FormProgramSelector,
|
|
21
34
|
FormQuotaSelector,
|
|
22
35
|
FormSemseterSelector,
|
|
36
|
+
MultiFacultySelector,
|
|
23
37
|
MultiFeeTypeSelector,
|
|
24
38
|
MultiProgramSelector,
|
|
25
39
|
MultiQuotaSelector,
|
|
@@ -27,6 +27,7 @@ export interface TableColumn {
|
|
|
27
27
|
dataIndex: string
|
|
28
28
|
key: string
|
|
29
29
|
title?: any
|
|
30
|
+
showTitle: boolean
|
|
30
31
|
render?: (cellData: any, row: any, index: number) => any
|
|
31
32
|
textColor?: string
|
|
32
33
|
sort?: boolean
|
|
@@ -36,7 +37,8 @@ export interface TableColumn {
|
|
|
36
37
|
|
|
37
38
|
export interface ColumnHeader {
|
|
38
39
|
title: any
|
|
39
|
-
colSpan
|
|
40
|
+
colSpan?: number
|
|
41
|
+
rowSpan?: number
|
|
40
42
|
}
|
|
41
43
|
|
|
42
44
|
interface TableProps {
|
|
@@ -83,18 +85,18 @@ export default function Table({
|
|
|
83
85
|
totalCols = totalColumns ? [...totalColumns] : []
|
|
84
86
|
}
|
|
85
87
|
|
|
86
|
-
const handleSortClick = (
|
|
88
|
+
const handleSortClick = (sortByKey) => {
|
|
87
89
|
setSort((prev) => {
|
|
88
|
-
if (prev[
|
|
89
|
-
if (prev[
|
|
90
|
-
if (prev[
|
|
91
|
-
delete prev[
|
|
90
|
+
if (prev[sortByKey]) {
|
|
91
|
+
if (prev[sortByKey] === 'desc') return { ...prev, [sortByKey]: 'asc' }
|
|
92
|
+
if (prev[sortByKey] === 'asc') {
|
|
93
|
+
delete prev[sortByKey]
|
|
92
94
|
return { ...prev }
|
|
93
95
|
}
|
|
94
96
|
} else {
|
|
95
97
|
return {
|
|
96
98
|
...prev,
|
|
97
|
-
[
|
|
99
|
+
[sortByKey]: 'desc',
|
|
98
100
|
}
|
|
99
101
|
}
|
|
100
102
|
})
|
|
@@ -155,6 +157,7 @@ export default function Table({
|
|
|
155
157
|
isHeaderCell
|
|
156
158
|
align="center"
|
|
157
159
|
colSpan={col.colSpan}
|
|
160
|
+
rowSpan={col.rowSpan}
|
|
158
161
|
>
|
|
159
162
|
{col.title}
|
|
160
163
|
</StyledTableCell>
|
|
@@ -162,34 +165,39 @@ export default function Table({
|
|
|
162
165
|
</TableRow>
|
|
163
166
|
)}
|
|
164
167
|
<TableRow>
|
|
165
|
-
{columns.map(
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
168
|
+
{columns.map(
|
|
169
|
+
(col, columnIndex) =>
|
|
170
|
+
col.showTitle && (
|
|
171
|
+
<StyledTableCell
|
|
172
|
+
key={columnIndex}
|
|
173
|
+
columnsLength={columns.length}
|
|
174
|
+
columnIndex={columnIndex + 1}
|
|
175
|
+
rowIndex={0}
|
|
176
|
+
col={col}
|
|
177
|
+
sx={sx}
|
|
178
|
+
align="center"
|
|
179
|
+
isHeaderCell
|
|
180
|
+
>
|
|
181
|
+
{col.title}
|
|
177
182
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
<
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
183
|
+
{col.sort && (
|
|
184
|
+
<IconButton
|
|
185
|
+
onClick={() => handleSortClick(col.dataIndex)}
|
|
186
|
+
>
|
|
187
|
+
<ListItemIcon>
|
|
188
|
+
{sort[col.dataIndex] === 'asc' ? (
|
|
189
|
+
<SortAscIcon />
|
|
190
|
+
) : sort[col.dataIndex] === 'desc' ? (
|
|
191
|
+
<SortDescIcon />
|
|
192
|
+
) : (
|
|
193
|
+
<SortIcon />
|
|
194
|
+
)}
|
|
195
|
+
</ListItemIcon>
|
|
196
|
+
</IconButton>
|
|
197
|
+
)}
|
|
198
|
+
</StyledTableCell>
|
|
199
|
+
),
|
|
200
|
+
)}
|
|
193
201
|
</TableRow>
|
|
194
202
|
</TableHead>
|
|
195
203
|
{!loading ? (
|