@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.
Files changed (25) hide show
  1. package/package.json +1 -1
  2. package/src/components/Input/MultiSelect.tsx +0 -1
  3. package/src/components/MyProfile/Education/EducationForm.tsx +14 -12
  4. package/src/components/MyProfile/Experience/ExperienceForm.tsx +21 -14
  5. package/src/components/MyProfile/MyProfile.tsx +2 -3
  6. package/src/components/MyProfile/PaperPublication/Authors.tsx +47 -51
  7. package/src/components/MyProfile/PaperPublication/PublicationsForm.tsx +8 -5
  8. package/src/components/MyProfile/PaperPublication/Styles.tsx +8 -1
  9. package/src/components/MyProfile/ResearchProjects/ResearchProjects.tsx +25 -38
  10. package/src/components/MyProfile/Workshop/WorkshopForm.tsx +14 -12
  11. package/src/components/Selectors/ClassRoomSelector.tsx +97 -0
  12. package/src/components/Selectors/CourseSelector.tsx +4 -2
  13. package/src/components/Selectors/DepartmentSelector.tsx +67 -0
  14. package/src/components/Selectors/FacultySelector.tsx +92 -0
  15. package/src/components/Selectors/FormSelectors/FormClassRoomSelector.tsx +50 -0
  16. package/src/components/Selectors/FormSelectors/FormCourseSelector.tsx +3 -0
  17. package/src/components/Selectors/FormSelectors/FormDepartmentSelector.tsx +49 -0
  18. package/src/components/Selectors/FormSelectors/FormFacultySelector.tsx +55 -0
  19. package/src/components/Selectors/FormSelectors/FormProgramSelector.tsx +4 -1
  20. package/src/components/Selectors/FormSelectors/MultiSelect/MultiFacultySelector.tsx +106 -0
  21. package/src/components/Selectors/ProgramSelector.tsx +4 -2
  22. package/src/components/Selectors/index.tsx +14 -0
  23. package/src/components/Tables/2DTable/Table.tsx +42 -34
  24. package/src/permissions/PermissionsStore.ts +356 -0
  25. 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
- api = '/square/branches',
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: number
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 = (sortBykey) => {
88
+ const handleSortClick = (sortByKey) => {
87
89
  setSort((prev) => {
88
- if (prev[sortBykey]) {
89
- if (prev[sortBykey] === 'desc') return { ...prev, [sortBykey]: 'asc' }
90
- if (prev[sortBykey] === 'asc') {
91
- delete prev[sortBykey]
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
- [sortBykey]: 'desc',
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((col, columnIndex) => (
166
- <StyledTableCell
167
- key={columnIndex}
168
- columnsLength={columns.length}
169
- columnIndex={columnIndex + 1}
170
- rowIndex={0}
171
- col={col}
172
- sx={sx}
173
- align="center"
174
- isHeaderCell
175
- >
176
- {col.title}
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
- {col.sort && (
179
- <IconButton onClick={() => handleSortClick(col.dataIndex)}>
180
- <ListItemIcon>
181
- {sort[col.dataIndex] === 'asc' ? (
182
- <SortAscIcon />
183
- ) : sort[col.dataIndex] === 'desc' ? (
184
- <SortDescIcon />
185
- ) : (
186
- <SortIcon />
187
- )}
188
- </ListItemIcon>
189
- </IconButton>
190
- )}
191
- </StyledTableCell>
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 ? (