@campxdev/shared 1.11.6 → 1.11.7-0.alpha-22
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/.vscode/settings.json +3 -0
- package/exports.ts +4 -0
- package/package.json +17 -9
- package/src/assets/images/X.png +0 -0
- package/src/assets/images/active_devices.svg +3 -0
- package/src/assets/images/animation.gif +0 -0
- package/src/assets/images/change_password.svg +6 -0
- package/src/assets/images/clog_wheel.svg +6 -0
- package/src/assets/images/index.ts +28 -3
- package/src/assets/images/location.svg +6 -0
- package/src/assets/images/logout_icon.svg +6 -0
- package/src/assets/images/lottery.svg +22 -0
- package/src/assets/images/mobile.svg +7 -0
- package/src/assets/images/no_devices.svg +734 -0
- package/src/assets/images/notifications.svg +3 -0
- package/src/assets/images/profile.svg +6 -0
- package/src/assets/images/web.svg +13 -0
- package/src/components/ActiveDevices/ActiveDevices.tsx +60 -0
- package/src/components/ActiveDevices/DeviceInformationCard.tsx +97 -0
- package/src/components/ActiveDevices/index.ts +1 -0
- package/src/components/ActivityLog/ActivityLog.tsx +268 -0
- package/src/components/ActivityLog/Styles.tsx +35 -0
- package/src/components/ActivityLog/index.ts +1 -0
- package/src/components/ApplicationProfile/ApplicationProfile.tsx +1 -0
- package/src/components/ApplicationProfile/UserProfileRelation.tsx +4 -1
- package/src/components/DatabaseConfiguration/DatabaseConfiguration.tsx +28 -0
- package/src/components/DatabaseConfiguration/DatabaseConfigurationForm.tsx +87 -0
- package/src/components/DatabaseConfiguration/components/AddConnectionDrawerButton.tsx +30 -0
- package/src/components/DatabaseConfiguration/components/ConnectionCard.tsx +79 -0
- package/src/components/DatabaseConfiguration/index.ts +5 -0
- package/src/components/DatabaseConfiguration/service.ts +6 -0
- package/src/components/DatabaseConfiguration/styles.ts +30 -0
- package/src/components/DrawerWrapper/DialogTemplate.tsx +58 -0
- package/src/components/DrawerWrapper/DrawerWrapper.tsx +23 -7
- package/src/components/DrawerWrapper/ErrorTemplate.tsx +77 -0
- package/src/components/ErrorModal.tsx +88 -0
- package/src/components/ErrorModalWrapper/ErrorModalTemplate.tsx +118 -0
- package/src/components/ErrorModalWrapper/ErrorModalWrapper.tsx +76 -0
- package/src/components/FilterComponents/SearchBar.tsx +5 -2
- package/src/components/Form/Form.tsx +4 -1
- package/src/components/HookForm/AutoCompleteSearch.tsx +3 -0
- package/src/components/HookForm/MultiSelect.tsx +1 -0
- package/src/components/HookForm/SingleSelect.tsx +2 -2
- package/src/components/ImageUpload.tsx +4 -1
- package/src/components/Input/MultiSelect.tsx +1 -0
- package/src/components/Input/SearchSingleSelect.tsx +1 -1
- package/src/components/Input/SingleSelect.tsx +7 -7
- package/src/components/Institutions/InsititutionsDialog.tsx +2 -2
- package/src/components/Layout/Header/AppHeader.tsx +23 -6
- package/src/components/Layout/Header/HeaderActions/CogWheelMenu.tsx +2 -2
- package/src/components/Layout/Header/HeaderActions/HeaderActions.tsx +41 -16
- package/src/components/Layout/Header/HeaderActions/UserBox.tsx +48 -6
- package/src/components/Layout/Header/applications.ts +43 -30
- package/src/components/Layout/LayoutWrapper.tsx +82 -4
- package/src/components/Layout/SideNav.tsx +42 -9
- package/src/components/LoginForm.tsx +53 -1
- package/src/components/MongoCharts/MongoDashboard.tsx +146 -0
- package/src/components/MongoCharts/index.tsx +1 -0
- package/src/components/MyProfile/MyProfile.tsx +1 -1
- package/src/components/ReportHeader.tsx +2 -2
- package/src/components/Selectors/ClassRoomSelector.tsx +2 -2
- package/src/components/Selectors/CourseSelector.tsx +2 -2
- package/src/components/Selectors/DepartmentSelector.tsx +2 -2
- package/src/components/Selectors/ExamGroupSelector.tsx +19 -10
- package/src/components/Selectors/FacultySelector.tsx +2 -2
- package/src/components/Selectors/FeeTypeSelector.tsx +2 -2
- package/src/components/Selectors/FormSelectors/FormClassRoomSelector.tsx +2 -2
- package/src/components/Selectors/FormSelectors/FormCourseSelector.tsx +2 -2
- package/src/components/Selectors/FormSelectors/FormDepartmentSelector.tsx +2 -2
- package/src/components/Selectors/FormSelectors/FormExamGroupSelector.tsx +2 -2
- package/src/components/Selectors/FormSelectors/FormFacultySelector.tsx +2 -2
- package/src/components/Selectors/FormSelectors/FormFeeTypeSelector.tsx +2 -2
- package/src/components/Selectors/FormSelectors/FormProgramSelector.tsx +2 -2
- package/src/components/Selectors/FormSelectors/FormQuotaSelector.tsx +3 -3
- package/src/components/Selectors/FormSelectors/FormSemesterSelector.tsx +2 -2
- package/src/components/Selectors/FormSelectors/MultiSelect/MultiFacultySelector.tsx +2 -2
- package/src/components/Selectors/FormSelectors/MultiSelect/MultiFeeTypeSelector.tsx +2 -2
- package/src/components/Selectors/FormSelectors/MultiSelect/MultiProgramSelector.tsx +2 -2
- package/src/components/Selectors/FormSelectors/MultiSelect/MultiQuotaSelector.tsx +2 -2
- package/src/components/Selectors/ProgramSelector.tsx +3 -3
- package/src/components/Selectors/QuotaSelector.tsx +3 -3
- package/src/components/Selectors/SemesterSelector.tsx +2 -2
- package/src/components/SignatureFooter.tsx +35 -0
- package/src/components/SwitchButton.tsx +6 -1
- package/src/components/Tables/2DTable/Table.tsx +20 -23
- package/src/components/Tables/BasicTable/Table.tsx +22 -13
- package/src/components/Tables/BasicTable/TableFooter.tsx +35 -9
- package/src/components/Tables/BasicTable/styles.ts +1 -1
- package/src/components/Tables/ReactTable/ReactTable.tsx +42 -8
- package/src/components/Tables/common/types.ts +1 -0
- package/src/components/Tabs/TabsContainer.tsx +5 -5
- package/src/components/Tabs/styles.tsx +1 -0
- package/src/components/ToastContainer/ToastContainer.tsx +2 -3
- package/src/components/UploadButton/UploadButton.tsx +3 -1
- package/src/components/UploadButton/types.ts +2 -2
- package/src/components/UploadDocument.tsx +3 -0
- package/src/components/UploadFileDialog/UploadFileDialog.tsx +20 -9
- package/src/components/index.ts +5 -0
- package/src/config/axios.ts +5 -19
- package/src/constants/UIConstants.ts +65 -2
- package/src/constants/isDevelopment.ts +0 -1
- package/src/contexts/Providers.tsx +5 -43
- package/src/hooks/useAuth.ts +7 -0
- package/src/layouts/Components/styles.tsx +25 -7
- package/src/permissions/PermissionsStore.ts +658 -55
- package/src/permissions/ValidateAccess.tsx +37 -8
- package/src/shared-state/PermissionsStore.ts +779 -85
- package/src/theme/theme.d.ts +69 -35
- package/src/utils/debounce.ts +11 -0
- package/src/utils/getUrlParams.ts +13 -0
- package/src/utils/index.ts +6 -3
- package/src/utils/logout.ts +4 -8
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
import { Store } from 'pullstate'
|
|
10
10
|
import { ReactNode, memo } from 'react'
|
|
11
11
|
import { Link, useMatch, useResolvedPath } from 'react-router-dom'
|
|
12
|
-
import { PermissionsStore } from '../../shared-state'
|
|
12
|
+
import { PermissionsStore, UserStore } from '../../shared-state'
|
|
13
13
|
import {
|
|
14
14
|
ListItemButton,
|
|
15
15
|
StyledChevronIcon,
|
|
@@ -23,14 +23,24 @@ const checkHasAccess = (
|
|
|
23
23
|
permissionKey,
|
|
24
24
|
institutionType,
|
|
25
25
|
permissions,
|
|
26
|
+
checkIsMasterInstitution,
|
|
27
|
+
masterInstitutionUniqueId,
|
|
28
|
+
isMasterInstitution,
|
|
29
|
+
user,
|
|
26
30
|
) => {
|
|
27
31
|
if (checkForMasterSlave) {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
32
|
+
if (institutionType == 'MASTER_CHILD') {
|
|
33
|
+
if (checkIsMasterInstitution) {
|
|
34
|
+
return (
|
|
35
|
+
permissions[permissionKey] &&
|
|
36
|
+
user.institutionIds.includes(masterInstitutionUniqueId) &&
|
|
37
|
+
isMasterInstitution
|
|
38
|
+
)
|
|
39
|
+
}
|
|
40
|
+
return permissionKey ? permissions[permissionKey] : true
|
|
41
|
+
}
|
|
33
42
|
}
|
|
43
|
+
return permissionKey ? permissions[permissionKey] : true
|
|
34
44
|
}
|
|
35
45
|
|
|
36
46
|
const sideNavStore = new Store({
|
|
@@ -73,17 +83,30 @@ const RenderMenuItem = ({ menuItem }) => {
|
|
|
73
83
|
title,
|
|
74
84
|
icon,
|
|
75
85
|
permissionKey,
|
|
76
|
-
checkForMasterSlave
|
|
86
|
+
checkForMasterSlave,
|
|
87
|
+
checkIsMasterInstitution,
|
|
77
88
|
} = menuItem
|
|
89
|
+
|
|
78
90
|
let resolved = useResolvedPath(path)
|
|
79
91
|
let match = useMatch({ path: resolved.pathname, end: false })
|
|
80
92
|
|
|
81
|
-
const {
|
|
93
|
+
const {
|
|
94
|
+
permissions,
|
|
95
|
+
institutionType,
|
|
96
|
+
masterInstitutionUniqueId,
|
|
97
|
+
isMasterInstitution,
|
|
98
|
+
} = PermissionsStore.useState((s) => s)
|
|
99
|
+
const { user } = UserStore.useState((s) => s)
|
|
100
|
+
|
|
82
101
|
const hasAccess = checkHasAccess(
|
|
83
102
|
checkForMasterSlave,
|
|
84
103
|
permissionKey,
|
|
85
104
|
institutionType,
|
|
86
105
|
permissions,
|
|
106
|
+
checkIsMasterInstitution,
|
|
107
|
+
masterInstitutionUniqueId,
|
|
108
|
+
isMasterInstitution,
|
|
109
|
+
user,
|
|
87
110
|
)
|
|
88
111
|
|
|
89
112
|
if (children?.length)
|
|
@@ -126,7 +149,13 @@ const RenderMenuItem = ({ menuItem }) => {
|
|
|
126
149
|
|
|
127
150
|
const DropDownMenu = ({ path, title, icon, menuItems }) => {
|
|
128
151
|
const { activeKey } = sideNavStore.useState((s) => s)
|
|
129
|
-
const {
|
|
152
|
+
const {
|
|
153
|
+
permissions,
|
|
154
|
+
institutionType,
|
|
155
|
+
masterInstitutionUniqueId,
|
|
156
|
+
isMasterInstitution,
|
|
157
|
+
} = PermissionsStore.useState((s) => s)
|
|
158
|
+
const { user } = UserStore.useState((s) => s)
|
|
130
159
|
|
|
131
160
|
const validateDropdownAccess = () => {
|
|
132
161
|
if (process.env.NODE_ENV === 'development' && !permissions) return true
|
|
@@ -138,6 +167,10 @@ const DropDownMenu = ({ path, title, icon, menuItems }) => {
|
|
|
138
167
|
item?.permissionKey,
|
|
139
168
|
institutionType,
|
|
140
169
|
permissions,
|
|
170
|
+
item?.checkIsMasterInstitution,
|
|
171
|
+
masterInstitutionUniqueId,
|
|
172
|
+
isMasterInstitution,
|
|
173
|
+
user,
|
|
141
174
|
)
|
|
142
175
|
: accessIfNoKey,
|
|
143
176
|
)
|
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
styled,
|
|
12
12
|
} from '@mui/material'
|
|
13
13
|
import axiosBase from 'axios'
|
|
14
|
+
import DeviceDetector from 'device-detector-js'
|
|
14
15
|
import Cookies from 'js-cookie'
|
|
15
16
|
import { useEffect, useState } from 'react'
|
|
16
17
|
import { useForm } from 'react-hook-form'
|
|
@@ -36,6 +37,18 @@ export function LoginForm({
|
|
|
36
37
|
const [resetPassword, setResetPassword] = useState(false)
|
|
37
38
|
const { handleSubmit, control } = useForm()
|
|
38
39
|
const [error, setError] = useState('')
|
|
40
|
+
const [deviceState, setDeviceState] = useState({
|
|
41
|
+
deviceInformation: {
|
|
42
|
+
deviceType: 'browser',
|
|
43
|
+
clientName: 'unknown',
|
|
44
|
+
os: 'unknown',
|
|
45
|
+
osVersion: 'unknown',
|
|
46
|
+
latitude: null,
|
|
47
|
+
longitude: null,
|
|
48
|
+
tokenType: 'WEB',
|
|
49
|
+
},
|
|
50
|
+
isLocationAllowed: true,
|
|
51
|
+
})
|
|
39
52
|
|
|
40
53
|
const onSubmit = async (values) => {
|
|
41
54
|
try {
|
|
@@ -45,11 +58,12 @@ export function LoginForm({
|
|
|
45
58
|
url: loginUrl ? loginUrl : `/auth-server/auth/login`,
|
|
46
59
|
data: {
|
|
47
60
|
...values,
|
|
48
|
-
|
|
61
|
+
...deviceState.deviceInformation,
|
|
49
62
|
},
|
|
50
63
|
})
|
|
51
64
|
Cookies.set('campx_tenant', res?.data?.subDomain)
|
|
52
65
|
Cookies.set('campx_session_key', res.data?.token)
|
|
66
|
+
Cookies.set('campx_institution', res.data?.institutionCode)
|
|
53
67
|
window.location.href = window.location.origin + `/${res?.data?.subDomain}`
|
|
54
68
|
} catch (err) {
|
|
55
69
|
// eslint-disable-next-line no-console
|
|
@@ -83,6 +97,39 @@ export function LoginForm({
|
|
|
83
97
|
}
|
|
84
98
|
|
|
85
99
|
useEffect(() => {
|
|
100
|
+
navigator.geolocation.getCurrentPosition((position) => {
|
|
101
|
+
setDeviceState((s) => ({
|
|
102
|
+
...s,
|
|
103
|
+
deviceInformation: {
|
|
104
|
+
...s.deviceInformation,
|
|
105
|
+
latitude: position.coords.latitude,
|
|
106
|
+
longitude: position.coords.longitude,
|
|
107
|
+
},
|
|
108
|
+
}))
|
|
109
|
+
})
|
|
110
|
+
navigator.permissions
|
|
111
|
+
.query({ name: 'geolocation' })
|
|
112
|
+
.then((permissionStatus) => {
|
|
113
|
+
if (permissionStatus.state === 'denied') {
|
|
114
|
+
setDeviceState((s) => ({
|
|
115
|
+
...s,
|
|
116
|
+
isLocationAllowed: false,
|
|
117
|
+
}))
|
|
118
|
+
}
|
|
119
|
+
})
|
|
120
|
+
|
|
121
|
+
const detector = new DeviceDetector()
|
|
122
|
+
const deviceInfo = detector.parse(navigator.userAgent)
|
|
123
|
+
setDeviceState((s) => ({
|
|
124
|
+
...s,
|
|
125
|
+
deviceInformation: {
|
|
126
|
+
...s.deviceInformation,
|
|
127
|
+
clientName: deviceInfo.client?.name || s.deviceInformation.clientName,
|
|
128
|
+
os: deviceInfo.os?.name || s.deviceInformation.os,
|
|
129
|
+
osVersion: deviceInfo.os?.version || s.deviceInformation.osVersion,
|
|
130
|
+
},
|
|
131
|
+
}))
|
|
132
|
+
|
|
86
133
|
const restLink = window.location.pathname.split('/')[1]
|
|
87
134
|
if (restLink == 'reset-password') {
|
|
88
135
|
setResetPassword(true)
|
|
@@ -138,6 +185,11 @@ export function LoginForm({
|
|
|
138
185
|
),
|
|
139
186
|
}}
|
|
140
187
|
/>
|
|
188
|
+
{!deviceState.isLocationAllowed && (
|
|
189
|
+
<Alert severity="warning" sx={{ marginTop: '20px' }}>
|
|
190
|
+
Please Enable Location Services
|
|
191
|
+
</Alert>
|
|
192
|
+
)}
|
|
141
193
|
<ActionButton type="submit">Login</ActionButton>
|
|
142
194
|
<Typography
|
|
143
195
|
variant="h6"
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import ChartsEmbedSDK from '@mongodb-js/charts-embed-dom'
|
|
2
|
+
import { useEffect, useRef, useState } from 'react'
|
|
3
|
+
|
|
4
|
+
interface DashboardProps {
|
|
5
|
+
token: any
|
|
6
|
+
dashboardId: string
|
|
7
|
+
charts: any
|
|
8
|
+
chartFilters: any
|
|
9
|
+
sx?: any
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const MongoDashboard: React.FC<DashboardProps> = ({
|
|
13
|
+
token,
|
|
14
|
+
dashboardId,
|
|
15
|
+
charts,
|
|
16
|
+
chartFilters,
|
|
17
|
+
sx = {},
|
|
18
|
+
}) => {
|
|
19
|
+
const [rendered, setRendered] = useState<Boolean>(false)
|
|
20
|
+
const [dashboard, setDashboard] = useState<any>(null)
|
|
21
|
+
const chartDiv = useRef(null)
|
|
22
|
+
|
|
23
|
+
const sdk = new ChartsEmbedSDK({
|
|
24
|
+
baseUrl: 'https://charts.mongodb.com/charts-project-0-cnovv',
|
|
25
|
+
getUserToken: () => token,
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
useEffect(() => {
|
|
29
|
+
const initDashboard = async () => {
|
|
30
|
+
const dashboard = sdk.createDashboard({
|
|
31
|
+
dashboardId: dashboardId,
|
|
32
|
+
showAttribution: false,
|
|
33
|
+
background: 'transparent',
|
|
34
|
+
widthMode: 'scale',
|
|
35
|
+
heightMode: 'scale',
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
setDashboard(dashboard)
|
|
39
|
+
try {
|
|
40
|
+
await dashboard.render(chartDiv.current)
|
|
41
|
+
|
|
42
|
+
setRendered(true)
|
|
43
|
+
} catch (err) {
|
|
44
|
+
console.log('Error during Charts rendering:', err)
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
initDashboard()
|
|
49
|
+
}, [])
|
|
50
|
+
|
|
51
|
+
useEffect(() => {
|
|
52
|
+
if (dashboard && rendered) {
|
|
53
|
+
const applyFiltersToChart = async () => {
|
|
54
|
+
charts.map((chartGroup, index) => {
|
|
55
|
+
chartGroup.map(async (chartId) => {
|
|
56
|
+
const chart = await dashboard.getChart(chartId)
|
|
57
|
+
console.log(chartFilters[index], chart)
|
|
58
|
+
try {
|
|
59
|
+
await chart.setFilter(chartFilters[index])
|
|
60
|
+
} catch (err) {
|
|
61
|
+
console.log(
|
|
62
|
+
'Error while applying filters to specific chart.',
|
|
63
|
+
err,
|
|
64
|
+
)
|
|
65
|
+
}
|
|
66
|
+
})
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
// charts.default.map(async (chartId) => {
|
|
70
|
+
// const chart = await dashboard.getChart(chartId)
|
|
71
|
+
|
|
72
|
+
// try {
|
|
73
|
+
// await chart.setFilter(filters)
|
|
74
|
+
// } catch (err) {
|
|
75
|
+
// console.log('Error while applying filters to specific chart.', err)
|
|
76
|
+
// }
|
|
77
|
+
// })
|
|
78
|
+
|
|
79
|
+
// charts.lessThanAcademicYear.map(async (chartId) => {
|
|
80
|
+
// const chart = await dashboard.getChart(chartId)
|
|
81
|
+
|
|
82
|
+
// try {
|
|
83
|
+
// await chart.setFilter({
|
|
84
|
+
// ...filters,
|
|
85
|
+
// academicYear: { $lt: filters.academicYear },
|
|
86
|
+
// })
|
|
87
|
+
// } catch (err) {
|
|
88
|
+
// console.log('Error while applying filters to specific chart.', err)
|
|
89
|
+
// }
|
|
90
|
+
// })
|
|
91
|
+
|
|
92
|
+
// charts.lessThanOrEqualAcademicYear.map(async (chartId) => {
|
|
93
|
+
// const chart = await dashboard.getChart(chartId)
|
|
94
|
+
|
|
95
|
+
// try {
|
|
96
|
+
// await chart.setFilter({
|
|
97
|
+
// ...filters,
|
|
98
|
+
// academicYear: { $lte: filters.academicYear },
|
|
99
|
+
// })
|
|
100
|
+
// } catch (err) {
|
|
101
|
+
// console.log('Error while applying filters to specific chart.', err)
|
|
102
|
+
// }
|
|
103
|
+
// })
|
|
104
|
+
|
|
105
|
+
// charts.dateRangeByAcademicYear.map(async (chartId) => {
|
|
106
|
+
// const chart = await dashboard.getChart(chartId)
|
|
107
|
+
|
|
108
|
+
// try {
|
|
109
|
+
// await chart.setFilter({
|
|
110
|
+
// 'admissionSubValue.tenantId':
|
|
111
|
+
// filters['admissionSubValue.tenantId'],
|
|
112
|
+
// 'admissionSubValue.institutionId':
|
|
113
|
+
// filters['admissionSubValue.institutionId'],
|
|
114
|
+
// 'feeTypeObject.feeType': filters['feeTypeObject.feeType'],
|
|
115
|
+
// createdAt: {
|
|
116
|
+
// $gte: startDate,
|
|
117
|
+
// $lte: endDate,
|
|
118
|
+
// },
|
|
119
|
+
// })
|
|
120
|
+
// } catch (err) {
|
|
121
|
+
// console.log('Error while applying filters to specific chart.', err)
|
|
122
|
+
// }
|
|
123
|
+
// })
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
applyFiltersToChart()
|
|
127
|
+
}
|
|
128
|
+
}, [dashboard, chartFilters, rendered])
|
|
129
|
+
|
|
130
|
+
return (
|
|
131
|
+
<div
|
|
132
|
+
className="chart"
|
|
133
|
+
ref={chartDiv}
|
|
134
|
+
style={{
|
|
135
|
+
height: '200vh',
|
|
136
|
+
margin: '25px 10px',
|
|
137
|
+
backgroundColor: '#EEEE',
|
|
138
|
+
padding: '15px 0px',
|
|
139
|
+
borderRadius: '10px',
|
|
140
|
+
...sx,
|
|
141
|
+
}}
|
|
142
|
+
/>
|
|
143
|
+
)
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
export default MongoDashboard
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from './MongoDashboard'
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { BaseSelectProps } from '@mui/material'
|
|
2
2
|
import { useEffect, useState } from 'react'
|
|
3
3
|
import axios from '../../config/axios'
|
|
4
4
|
import { SingleSelect } from '../Input'
|
|
@@ -13,7 +13,7 @@ type ClassRoomSelectorProps = {
|
|
|
13
13
|
error?: boolean
|
|
14
14
|
helperText?: string
|
|
15
15
|
api?: string
|
|
16
|
-
} &
|
|
16
|
+
} & BaseSelectProps
|
|
17
17
|
const ClassRoomSelector = (props: ClassRoomSelectorProps) => {
|
|
18
18
|
const {
|
|
19
19
|
name,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { BaseSelectProps } from '@mui/material'
|
|
2
2
|
import { useEffect, useState } from 'react'
|
|
3
3
|
import axios from '../../config/axios'
|
|
4
4
|
import { SingleSelect } from '../Input'
|
|
@@ -13,7 +13,7 @@ type CourseSelectorProps = {
|
|
|
13
13
|
helperText?: string
|
|
14
14
|
api?: string
|
|
15
15
|
valueByUniqueId?: boolean
|
|
16
|
-
} &
|
|
16
|
+
} & BaseSelectProps
|
|
17
17
|
export default function CourseSelector(props: CourseSelectorProps) {
|
|
18
18
|
const {
|
|
19
19
|
name,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { BaseSelectProps } from '@mui/material'
|
|
2
2
|
import { useEffect, useState } from 'react'
|
|
3
3
|
import axios from '../../config/axios'
|
|
4
4
|
import { SingleSelect } from '../Input'
|
|
@@ -12,7 +12,7 @@ type DepartmentSelectorProps = {
|
|
|
12
12
|
error?: boolean
|
|
13
13
|
helperText?: string
|
|
14
14
|
api?: string
|
|
15
|
-
} &
|
|
15
|
+
} & BaseSelectProps
|
|
16
16
|
export default function DepartmentSelector(props: DepartmentSelectorProps) {
|
|
17
17
|
const {
|
|
18
18
|
name,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { BaseSelectProps } from '@mui/material'
|
|
2
2
|
import { useEffect, useState } from 'react'
|
|
3
3
|
import axios from '../../config/axios'
|
|
4
4
|
import { SingleSelect } from '../Input'
|
|
@@ -12,7 +12,7 @@ type ExamGroupSelectorProps = {
|
|
|
12
12
|
allowAll?: boolean
|
|
13
13
|
error?: boolean
|
|
14
14
|
helperText?: string
|
|
15
|
-
} &
|
|
15
|
+
} & BaseSelectProps
|
|
16
16
|
const ExamGroupSelector = (props: ExamGroupSelectorProps) => {
|
|
17
17
|
const {
|
|
18
18
|
name,
|
|
@@ -26,13 +26,13 @@ const ExamGroupSelector = (props: ExamGroupSelectorProps) => {
|
|
|
26
26
|
const [prevExamType, setPrevExamType] = useState(null)
|
|
27
27
|
const [prevCourseId, setPrevCourseId] = useState(null)
|
|
28
28
|
let api =
|
|
29
|
-
filters
|
|
29
|
+
filters?.examType !== 'internal'
|
|
30
30
|
? '/exams/exams/exam-groups'
|
|
31
31
|
: '/exams/internal-exams'
|
|
32
32
|
const handleOpen = () => {
|
|
33
33
|
if (filters) {
|
|
34
34
|
if (
|
|
35
|
-
(filters
|
|
35
|
+
(filters?.examType && filters?.examType !== prevExamType) ||
|
|
36
36
|
(filters?.courseId && filters?.courseId !== prevCourseId)
|
|
37
37
|
) {
|
|
38
38
|
setOptions([])
|
|
@@ -46,12 +46,12 @@ const ExamGroupSelector = (props: ExamGroupSelectorProps) => {
|
|
|
46
46
|
})
|
|
47
47
|
.then((response) => {
|
|
48
48
|
setOptions(
|
|
49
|
-
filters
|
|
49
|
+
filters?.examType !== 'internal'
|
|
50
50
|
? response.data?.examGroups
|
|
51
51
|
: response.data?.exams,
|
|
52
52
|
)
|
|
53
|
-
setPrevExamType(filters
|
|
54
|
-
setPrevCourseId(filters
|
|
53
|
+
setPrevExamType(filters?.examType)
|
|
54
|
+
setPrevCourseId(filters?.courseId)
|
|
55
55
|
})
|
|
56
56
|
.catch((error) => {
|
|
57
57
|
console.error('Error fetching data from the API:', error)
|
|
@@ -59,9 +59,18 @@ const ExamGroupSelector = (props: ExamGroupSelectorProps) => {
|
|
|
59
59
|
}
|
|
60
60
|
} else if (options.length === 0) {
|
|
61
61
|
axios
|
|
62
|
-
.get(api
|
|
62
|
+
.get(api, {
|
|
63
|
+
params: {
|
|
64
|
+
isArchived: 'false',
|
|
65
|
+
isExamPublished: 'true',
|
|
66
|
+
},
|
|
67
|
+
})
|
|
63
68
|
.then((response) => {
|
|
64
|
-
setOptions(
|
|
69
|
+
setOptions(
|
|
70
|
+
filters?.examType !== 'internal'
|
|
71
|
+
? response.data?.examGroups
|
|
72
|
+
: response.data?.exams,
|
|
73
|
+
)
|
|
65
74
|
})
|
|
66
75
|
.catch((error) => {
|
|
67
76
|
console.error('Error fetching data from the API:', error)
|
|
@@ -80,7 +89,7 @@ const ExamGroupSelector = (props: ExamGroupSelectorProps) => {
|
|
|
80
89
|
...(allowAll ? [{ value: 'all', label: 'All' }] : []),
|
|
81
90
|
...options.map((item) => ({
|
|
82
91
|
label:
|
|
83
|
-
filters
|
|
92
|
+
filters?.examType != 'internal'
|
|
84
93
|
? item?.groupName
|
|
85
94
|
: item?.displayName,
|
|
86
95
|
value: item?.id,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { BaseSelectProps } from '@mui/material'
|
|
2
2
|
import { useEffect, useState } from 'react'
|
|
3
3
|
import axios from '../../config/axios'
|
|
4
4
|
import { SingleSelect } from '../Input'
|
|
@@ -18,7 +18,7 @@ type FacultySelectorProps = {
|
|
|
18
18
|
error?: boolean
|
|
19
19
|
helperText?: string
|
|
20
20
|
api?: string
|
|
21
|
-
} &
|
|
21
|
+
} & BaseSelectProps
|
|
22
22
|
const FacultySelector = (props: FacultySelectorProps) => {
|
|
23
23
|
const {
|
|
24
24
|
name,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { BaseSelectProps } from '@mui/material'
|
|
2
2
|
import { useEffect, useState } from 'react'
|
|
3
3
|
import axios from '../../config/axios'
|
|
4
4
|
import { SingleSelect } from '../Input'
|
|
@@ -11,7 +11,7 @@ type FeeTypeSelectorProps = {
|
|
|
11
11
|
onChange?: (value: any) => void
|
|
12
12
|
error?: boolean
|
|
13
13
|
helperText?: string
|
|
14
|
-
} &
|
|
14
|
+
} & BaseSelectProps
|
|
15
15
|
export default function FeeTypeSelector(props: FeeTypeSelectorProps) {
|
|
16
16
|
const { name, required = false, label, onChange, allowAll = true } = props
|
|
17
17
|
const [options, setOptions] = useState([])
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { BaseSelectProps } from '@mui/material'
|
|
2
2
|
import { Controller } from 'react-hook-form'
|
|
3
3
|
import ClassRoomSelector from '../ClassRoomSelector'
|
|
4
4
|
|
|
@@ -12,7 +12,7 @@ type ClassRoomSelectorProps = {
|
|
|
12
12
|
filters?: { programId: number; courseId: number; batch: string }
|
|
13
13
|
onChange?: (value: any) => void
|
|
14
14
|
api?: string
|
|
15
|
-
} &
|
|
15
|
+
} & BaseSelectProps
|
|
16
16
|
export default function FormClassRoomSelector(props: ClassRoomSelectorProps) {
|
|
17
17
|
const {
|
|
18
18
|
name,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { BaseSelectProps } from '@mui/material'
|
|
2
2
|
import { Controller } from 'react-hook-form'
|
|
3
3
|
import CourseSelector from '../CourseSelector'
|
|
4
4
|
|
|
@@ -12,7 +12,7 @@ type FormCourseSelectorProps = {
|
|
|
12
12
|
onChange?: (value: any) => void
|
|
13
13
|
api?: string
|
|
14
14
|
valueByUniqueId?: boolean
|
|
15
|
-
} &
|
|
15
|
+
} & BaseSelectProps
|
|
16
16
|
export default function FormCourseSelector(props: FormCourseSelectorProps) {
|
|
17
17
|
const {
|
|
18
18
|
name,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { BaseSelectProps } from '@mui/material'
|
|
2
2
|
import { Controller } from 'react-hook-form'
|
|
3
3
|
import DepartmentSelector from '../DepartmentSelector'
|
|
4
4
|
|
|
@@ -11,7 +11,7 @@ type FormDepartmentSelectorProps = {
|
|
|
11
11
|
allowAll?: boolean
|
|
12
12
|
onChange?: (value: any) => void
|
|
13
13
|
api?: string
|
|
14
|
-
} &
|
|
14
|
+
} & BaseSelectProps
|
|
15
15
|
export default function FormDepartmentSelector(
|
|
16
16
|
props: FormDepartmentSelectorProps,
|
|
17
17
|
) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { BaseSelectProps } from '@mui/material'
|
|
2
2
|
import { Controller } from 'react-hook-form'
|
|
3
3
|
import ExamGroupSelector from '../ExamGroupSelector'
|
|
4
4
|
|
|
@@ -11,7 +11,7 @@ type ExamGroupSelectorProps = {
|
|
|
11
11
|
allowAll?: boolean
|
|
12
12
|
filters?: { courseId: number; examType: string }
|
|
13
13
|
onChange?: (value: any) => void
|
|
14
|
-
} &
|
|
14
|
+
} & BaseSelectProps
|
|
15
15
|
export default function FormExamGroupSelector(props: ExamGroupSelectorProps) {
|
|
16
16
|
const {
|
|
17
17
|
name,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { BaseSelectProps } from '@mui/material'
|
|
2
2
|
import { Controller } from 'react-hook-form'
|
|
3
3
|
import FacultySelector from '../FacultySelector'
|
|
4
4
|
|
|
@@ -17,7 +17,7 @@ type FacultySelectorProps = {
|
|
|
17
17
|
}
|
|
18
18
|
onChange?: (value: any) => void
|
|
19
19
|
api?: string
|
|
20
|
-
} &
|
|
20
|
+
} & BaseSelectProps
|
|
21
21
|
export default function FormFacultySelector(props: FacultySelectorProps) {
|
|
22
22
|
const {
|
|
23
23
|
name,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { BaseSelectProps } from '@mui/material'
|
|
2
2
|
import { Controller } from 'react-hook-form'
|
|
3
3
|
import FeeTypeSelector from '../FeeTypeSelector'
|
|
4
4
|
|
|
@@ -11,7 +11,7 @@ type FormFeeTypeSelectorProps = {
|
|
|
11
11
|
allowAll?: boolean
|
|
12
12
|
onChange?: (value: any) => void
|
|
13
13
|
api?: string
|
|
14
|
-
} &
|
|
14
|
+
} & BaseSelectProps
|
|
15
15
|
export default function FormFeeTypeSelector(props: FormFeeTypeSelectorProps) {
|
|
16
16
|
const {
|
|
17
17
|
name,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { BaseSelectProps } from '@mui/material'
|
|
2
2
|
import { Controller } from 'react-hook-form'
|
|
3
3
|
import ProgramSelector from '../ProgramSelector'
|
|
4
4
|
|
|
@@ -13,7 +13,7 @@ type ProgramSelectorProps = {
|
|
|
13
13
|
onChange?: (value: any) => void
|
|
14
14
|
api?: string
|
|
15
15
|
valueByBranchCode?: boolean
|
|
16
|
-
} &
|
|
16
|
+
} & BaseSelectProps
|
|
17
17
|
export default function FormProgramSelector(props: ProgramSelectorProps) {
|
|
18
18
|
const {
|
|
19
19
|
name,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { BaseSelectProps } from '@mui/material'
|
|
2
2
|
import { Controller } from 'react-hook-form'
|
|
3
3
|
import QuotaSelector from '../QuotaSelector'
|
|
4
4
|
|
|
@@ -10,9 +10,9 @@ type FormQuotaSelectorProps = {
|
|
|
10
10
|
multiple?: boolean
|
|
11
11
|
allowAll?: boolean
|
|
12
12
|
onChange?: (value: any) => void
|
|
13
|
-
filters?: { courseId: number }
|
|
13
|
+
filters?: { courseId: number | string }
|
|
14
14
|
api?: string
|
|
15
|
-
} &
|
|
15
|
+
} & BaseSelectProps
|
|
16
16
|
export default function FormQuotaSelector(props: FormQuotaSelectorProps) {
|
|
17
17
|
const {
|
|
18
18
|
name,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { BaseSelectProps } from '@mui/material'
|
|
2
2
|
import { Controller } from 'react-hook-form'
|
|
3
3
|
import SemesterSelector from '../SemesterSelector'
|
|
4
4
|
|
|
@@ -12,7 +12,7 @@ type SemesterSelectorProps = {
|
|
|
12
12
|
filters?: { courseId: number }
|
|
13
13
|
onChange?: (value: any) => void
|
|
14
14
|
api?: string
|
|
15
|
-
} &
|
|
15
|
+
} & BaseSelectProps
|
|
16
16
|
export default function FormSemseterSelector(props: SemesterSelectorProps) {
|
|
17
17
|
const {
|
|
18
18
|
name,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { BaseSelectProps } from '@mui/material'
|
|
2
2
|
import { useEffect, useState } from 'react'
|
|
3
3
|
import { Controller } from 'react-hook-form'
|
|
4
4
|
import axios from '../../../../config/axios'
|
|
@@ -20,7 +20,7 @@ type MultiFacultySelectorProps = {
|
|
|
20
20
|
error?: boolean
|
|
21
21
|
helperText?: string
|
|
22
22
|
api?: string
|
|
23
|
-
} &
|
|
23
|
+
} & BaseSelectProps
|
|
24
24
|
const MultiFacultySelector = (props: MultiFacultySelectorProps) => {
|
|
25
25
|
const {
|
|
26
26
|
control,
|