@campxdev/shared 1.10.0 → 1.10.2

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@campxdev/shared",
3
- "version": "1.10.0",
3
+ "version": "1.10.2",
4
4
  "main": "./exports.ts",
5
5
  "scripts": {
6
6
  "start": "react-scripts start",
@@ -35,6 +35,7 @@
35
35
  "@mui/material": "^5.7.0",
36
36
  "axios": "^0.27.2",
37
37
  "date-fns": "^2.28.0",
38
+ "fuse.js": "^6.6.2",
38
39
  "js-cookie": "^3.0.1",
39
40
  "moment": "^2.29.4",
40
41
  "pullstate": "^1.24.0",
@@ -3,6 +3,7 @@ import UserBox from './UserBox'
3
3
  import CogWheelMenu from './CogWheelMenu'
4
4
  import FreshDeskHelpButton from './FreshDeskHelpButton'
5
5
  import InstitutionsDropDown from '../../../Institutions/InstitutionsDropdown'
6
+ import SearchButton from '../Search/SearchButton'
6
7
 
7
8
  export default function HeaderActions({
8
9
  cogWheelMenu,
@@ -12,6 +13,7 @@ export default function HeaderActions({
12
13
  return (
13
14
  <>
14
15
  <InstitutionsDropDown />
16
+ <SearchButton />
15
17
  <FreshDeskHelpButton />
16
18
  {cogWheelMenu?.length ? <CogWheelMenu menu={cogWheelMenu} /> : null}
17
19
  <UserBox fullName={fullName} actions={userBoxActions} />
@@ -0,0 +1,69 @@
1
+ import { Box, Button, Typography, alpha, styled } from '@mui/material'
2
+ import { useEffect, useState } from 'react'
3
+ import { CustomDialog } from '../../../ModalButtons/DialogButton'
4
+ import SearchDialog from './SearchDialog'
5
+ import { Search } from '@mui/icons-material'
6
+
7
+ const StyledSearchBox = styled(Box)(({ theme }) => ({
8
+ display: 'flex',
9
+ gap: '10px',
10
+ border: theme.borders.grayLight,
11
+ borderRadius: '6px',
12
+ height: '40px',
13
+ padding: '0 14px',
14
+ alignItems: 'center',
15
+ cursor: 'pointer',
16
+ '&:hover': { backgroundColor: theme.palette.secondary.light },
17
+ '& .MuiTypography-paragraph': {
18
+ fontWeight: '500',
19
+ },
20
+ '& .MuiSvgIcon-root': {
21
+ fill: alpha(theme.palette.secondary.main, 0.4),
22
+ },
23
+ }))
24
+
25
+ export default function SearchButton() {
26
+ const [open, setOpen] = useState(false)
27
+
28
+ useEffect(() => {
29
+ document.addEventListener('keydown', (e) => {
30
+ if (e.ctrlKey && e.key === 'k') {
31
+ e.preventDefault()
32
+ setOpen(true)
33
+ }
34
+ })
35
+ return () => {
36
+ document.removeEventListener('keydown', () => {})
37
+ }
38
+ }, [])
39
+
40
+ return (
41
+ <div>
42
+ <StyledSearchBox
43
+ onClick={() => {
44
+ setOpen(true)
45
+ }}
46
+ >
47
+ <Search />
48
+ <Typography paragraph>Search</Typography>
49
+ <Typography variant="subtitle2">(Ctrl+k)</Typography>
50
+ </StyledSearchBox>
51
+ <CustomDialog
52
+ content={() => <SearchDialog />}
53
+ onClose={() => {
54
+ setOpen(false)
55
+ }}
56
+ open={open}
57
+ dialogProps={{
58
+ sx: {
59
+ '& .MuiDialog-container': {
60
+ alignItems: 'baseline',
61
+ paddingTop: '80px',
62
+ },
63
+ },
64
+ maxWidth: 'md',
65
+ }}
66
+ />
67
+ </div>
68
+ )
69
+ }
@@ -0,0 +1,178 @@
1
+ import { Box, Link as HrefLink, List, ListItem, styled } from '@mui/material'
2
+ import _ from 'lodash'
3
+ import { Store } from 'pullstate'
4
+ import { useEffect, useRef, useState } from 'react'
5
+ import { Link } from 'react-router-dom'
6
+ import { instituitionKey, urlTenantKey } from '../../../../contexts/Providers'
7
+ import { Sitemap } from '../../../../sitemap/sitemap'
8
+ import Image from '../../../Image/Image'
9
+ import { TextField } from '../../../Input'
10
+ import { collegex, enrollx, examx, payx } from '../assets'
11
+ const isProd = process.env.NODE_ENV === 'production'
12
+
13
+ const SearchStore = new Store({
14
+ activeLinkIndex: '',
15
+ })
16
+
17
+ const StyledListItem = styled(ListItem, {
18
+ shouldForwardProp: (prop) => prop !== 'isActive',
19
+ })<{ isActive: boolean }>(({ theme, isActive }) => ({
20
+ textDecoration: 'none',
21
+ transition: 'background 0.3s ease-in-out',
22
+ borderRadius: '6px',
23
+ '&:hover': {
24
+ background: theme.palette.secondary.light,
25
+ },
26
+ background: isActive ? theme.palette.secondary.light : 'transparent',
27
+ }))
28
+
29
+ const StyledLinkWrapper = styled(Box)(({ theme }) => ({
30
+ '& .MuiLink-root': {
31
+ textDecoration: 'none',
32
+ color: theme.palette.secondary.main,
33
+ },
34
+ }))
35
+
36
+ const RenderLink = ({ link, isActive }) => {
37
+ const reactLinkRef = useRef(null)
38
+ const hrefLinkRef = useRef(null)
39
+
40
+ const getUrl = () => {
41
+ const l = window.location
42
+ if (process.env.NODE_ENV === 'production') {
43
+ return `${l.protocol}://${l.hostname
44
+ .split('.')
45
+ .splice(1, 1, link?.item?.appKey)
46
+ .join('.')}/${urlTenantKey}/${instituitionKey}${link?.item?.path}`
47
+ } else {
48
+ return `https://www.${link?.item?.appKey}.campx.dev/${urlTenantKey}/${instituitionKey}${link?.item?.path}`
49
+ }
50
+ }
51
+
52
+ return (
53
+ <StyledLinkWrapper>
54
+ {isProd &&
55
+ window.location.hostname.split('.')[0] === link?.item?.appKey ? (
56
+ <Link to={link?.item?.path} ref={reactLinkRef}>
57
+ <StyledListItem isActive={isActive}>{link?.title}</StyledListItem>
58
+ </Link>
59
+ ) : (
60
+ <HrefLink href={getUrl()} ref={hrefLinkRef}>
61
+ <StyledListItem isActive={isActive}>
62
+ {link?.item?.title}
63
+ </StyledListItem>
64
+ </HrefLink>
65
+ )}
66
+ </StyledLinkWrapper>
67
+ )
68
+ }
69
+ export default function SearchDialog() {
70
+ const [results, setResults] = useState(null)
71
+ const [value, setValue] = useState('')
72
+
73
+ const handleSearch = (e) => {
74
+ const res = Sitemap.search(e.target.value)
75
+ setResults(
76
+ res?.map((item) => ({
77
+ ...item,
78
+ url: `${window.location.origin}/${urlTenantKey}/${instituitionKey}${item?.item?.path}`,
79
+ })),
80
+ )
81
+ }
82
+
83
+ const handleClick = (linkRef) => {
84
+ linkRef?.current?.click()
85
+ }
86
+
87
+ useEffect(() => {
88
+ document.addEventListener('keydown', (e) => {
89
+ if (e.key === 'Enter') {
90
+ }
91
+ })
92
+ }, [])
93
+
94
+ const resultsList = Object.entries(_.groupBy(results, 'item.appKey'))?.map(
95
+ (item) => ({
96
+ appKey: item[0],
97
+ results: item[1],
98
+ }),
99
+ )
100
+
101
+ return (
102
+ <Box sx={{ width: '100%', padding: '20px' }}>
103
+ <Box sx={{ display: 'flex', gap: '20px', marginBottom: '20px' }}>
104
+ <TextField
105
+ value={value}
106
+ placeholder="Search (beta)"
107
+ autoFocus
108
+ onKeyDown={(e) => {
109
+ if (e.key === 'ArrowDown') {
110
+ SearchStore.update((s) => {
111
+ s.activeLinkIndex = '0-0'
112
+ })
113
+ }
114
+ }}
115
+ onChange={(e) => {
116
+ setValue(e.target.value)
117
+ handleSearch(e)
118
+ }}
119
+ />
120
+ </Box>
121
+ <Results results={resultsList} />
122
+ </Box>
123
+ )
124
+ }
125
+
126
+ const Results = ({ results }) => {
127
+ const { activeLinkIndex } = SearchStore.useState((s) => s)
128
+ return (
129
+ <Box>
130
+ {results?.map((item, index) => (
131
+ <Box key={index}>
132
+ <List subheader={<AppTitle appKey={item?.appKey} />}>
133
+ {item?.results?.map((linkObj, childIndex) => (
134
+ <RenderLink
135
+ link={linkObj}
136
+ key={childIndex}
137
+ isActive={`${index}-${childIndex}` === activeLinkIndex}
138
+ />
139
+ ))}
140
+ </List>
141
+ </Box>
142
+ ))}
143
+ </Box>
144
+ )
145
+ }
146
+
147
+ const AppTitle = ({ appKey }) => {
148
+ return (
149
+ <Box
150
+ sx={{
151
+ display: 'flex',
152
+ alignItems: 'center',
153
+ gap: '20px',
154
+ margin: '14px 0',
155
+ }}
156
+ >
157
+ <Image
158
+ alt={appKey}
159
+ height={20}
160
+ width={'auto'}
161
+ src={appListMap[appKey] ?? appListMap.ums}
162
+ />
163
+ <Box
164
+ sx={{
165
+ flexGrow: 1,
166
+ borderBottom: (theme) => theme.borders.grayLight,
167
+ }}
168
+ ></Box>
169
+ </Box>
170
+ )
171
+ }
172
+
173
+ const appListMap = {
174
+ ums: collegex,
175
+ enroll: enrollx,
176
+ exams: examx,
177
+ payments: payx,
178
+ }
@@ -92,7 +92,7 @@ export const applications = [
92
92
  ? [
93
93
  {
94
94
  title: 'PeopleX',
95
- key: 'people',
95
+ key: 'hrms',
96
96
  path: isDevelopment ? origins.people.dev : origins.people.prod,
97
97
  icon: peopleSmall,
98
98
  description: 'Manage People in the Campus',
@@ -563,10 +563,10 @@ export enum Permission {
563
563
  CAN_FINE_CONFIGURATION_DELETE = 'can_fine_configurations_delete',
564
564
 
565
565
  // Student Permission
566
- CAN_STUDENT_PERMISSIONS_VIEW = 'can_student_permission_view',
567
- CAN_STUDENT_PERMISSIONS_ADD = 'can_student_permission_add',
568
- CAN_STUDENT_PERMISSIONS_EDIT = 'can_student_permission_edit',
569
- CAN_STUDENT_PERMISSIONS_DELETE = 'can_student_permission_delete',
566
+ CAN_STUDENT_PERMISSIONS_VIEW = 'can_student_permissions_view',
567
+ CAN_STUDENT_PERMISSIONS_ADD = 'can_student_permissions_add',
568
+ CAN_STUDENT_PERMISSIONS_EDIT = 'can_student_permissions_edit',
569
+ CAN_STUDENT_PERMISSIONS_DELETE = 'can_student_permissions_delete',
570
570
 
571
571
  // Concession
572
572
  CAN_CONCESSION_VIEW = 'can_concession_view',
@@ -0,0 +1,52 @@
1
+ export const enroll_sitemap = [
2
+ {
3
+ title: 'Leads',
4
+ path: '/leads',
5
+ keywords: [],
6
+ },
7
+ {
8
+ title: 'Manage Counsellors',
9
+ path: '/counsellors',
10
+ keywords: [],
11
+ },
12
+ {
13
+ title: 'Manage Counsellors',
14
+ path: '/counsellors',
15
+ keywords: ['add counsellors', 'counsellors crud'],
16
+ },
17
+ {
18
+ title: 'Admission Report',
19
+ path: '/reports',
20
+ keywords: [],
21
+ },
22
+ {
23
+ title: 'Counsellor Report',
24
+ path: '/counsellor-reports',
25
+ keywords: [],
26
+ },
27
+ {
28
+ title: 'Admission Notifications',
29
+ path: '/all-admissions',
30
+ keywords: [],
31
+ },
32
+ {
33
+ title: 'Manage Lead Statuses',
34
+ path: '/settings/admissions/lead-statuses',
35
+ keywords: ['lead status'],
36
+ },
37
+ {
38
+ title: 'Manage Lead Sources',
39
+ path: '/settings/admissions/lead-sources',
40
+ keywords: ['lead sources'],
41
+ },
42
+ {
43
+ title: 'Manage Quotas',
44
+ path: '/settings/admissions/quotas',
45
+ keywords: ['quotas', 'quotas crud'],
46
+ },
47
+ {
48
+ title: 'People',
49
+ path: '/settings/application-profiles',
50
+ keywords: ['profiles', 'manage people'],
51
+ },
52
+ ]
@@ -0,0 +1,172 @@
1
+ export const exams_sitemap = [
2
+ {
3
+ title: 'External Exams',
4
+ path: '/external-exams',
5
+ keywords: ['externals'],
6
+ },
7
+ {
8
+ title: 'Internal Exams',
9
+ path: '/internal-exams',
10
+ keywords: ['internals'],
11
+ },
12
+ {
13
+ title: 'Batches',
14
+ path: '/batches',
15
+ keywords: [],
16
+ },
17
+ {
18
+ title: 'Seating Plan',
19
+ path: '/seating-plan',
20
+ keywords: [],
21
+ },
22
+ {
23
+ title: 'Invigilations',
24
+ path: '/invigilations',
25
+ keywords: [],
26
+ },
27
+ {
28
+ title: 'Exam Time Slots',
29
+ path: '/settings/time-slots',
30
+ keywords: [],
31
+ },
32
+ {
33
+ title: 'Exam Rooms',
34
+ path: '/settings/rooms',
35
+ keywords: [],
36
+ },
37
+ {
38
+ title: 'Evaluators',
39
+ path: '/settings/evaluators',
40
+ keywords: [],
41
+ },
42
+ {
43
+ title: 'Grade Templates',
44
+ path: '/settings/grade-templates',
45
+ keywords: [],
46
+ },
47
+ {
48
+ title: 'People',
49
+ path: '/settings/application-profiles',
50
+ keywords: ['profiles', 'manage people'],
51
+ },
52
+ {
53
+ title: 'Exams Configuration',
54
+ path: '/settings/exams-configuration',
55
+ keywords: ['configuration'],
56
+ },
57
+ {
58
+ title: 'Result Processing',
59
+ path: '/reports/report-view/result-processing',
60
+ keywords: ['exam reports'],
61
+ },
62
+ {
63
+ title: 'Before Moderation',
64
+ path: '/reports/report-view/before-moderation',
65
+ keywords: ['exam reports'],
66
+ },
67
+ {
68
+ title: 'Moderation Analysis',
69
+ path: '/reports/report-view/moderation-analysis',
70
+ keywords: ['exam reports'],
71
+ },
72
+ {
73
+ title: 'Grafting Analysis',
74
+ path: '/reports/report-view/grafting-analysis',
75
+ keywords: ['exam reports'],
76
+ },
77
+ {
78
+ title: 'Adjusted Marks Report',
79
+ path: '/reports/report-view/adjusted-marks-report',
80
+ keywords: ['exam reports'],
81
+ },
82
+ {
83
+ title: 'TR With Marks Before Processing',
84
+ path: '/reports/report-view/tr-with-marks-before-processing',
85
+ keywords: ['exam reports'],
86
+ },
87
+ {
88
+ title: 'TR With Marks After Processing',
89
+ path: '/reports/report-view/tr-with-marks-after-processing',
90
+ keywords: ['exam reports'],
91
+ },
92
+ {
93
+ title: 'T-sheet',
94
+ path: '/reports/report-view/t-sheet',
95
+ keywords: ['exam reports'],
96
+ },
97
+ {
98
+ title: 'Section wise analysis report',
99
+ path: '/reports/report-view/sectionwise-analysis-report',
100
+ keywords: ['exam reports'],
101
+ },
102
+ {
103
+ title: 'Memos',
104
+ path: '/reports/report-view/memos',
105
+ keywords: ['exam reports'],
106
+ },
107
+ {
108
+ title: 'GPA Report',
109
+ path: '/reports/report-view/gpa-report',
110
+ keywords: ['exam reports'],
111
+ },
112
+ {
113
+ title: 'Backlog Report',
114
+ path: '/reports/report-view/backlog-report',
115
+ keywords: ['exam reports'],
116
+ },
117
+ {
118
+ title: 'Semester Backlog Report',
119
+ path: '/reports/report-view/semester-backlog-report',
120
+ keywords: ['exam reports'],
121
+ },
122
+ {
123
+ title: 'Moderation Marks Report',
124
+ path: '/reports/report-view/moderation-marks-report',
125
+ keywords: ['exam reports'],
126
+ },
127
+ {
128
+ title: 'Grafting Marks Report',
129
+ path: '/reports/report-view/grafting-marks-report',
130
+ keywords: ['exam reports'],
131
+ },
132
+ {
133
+ title: 'Student Pass List Report',
134
+ path: '/reports/report-view/student-pass-list-report',
135
+ keywords: ['exam reports'],
136
+ },
137
+ {
138
+ title: 'University Vertical Report',
139
+ path: '/reports/report-view/university-vertical-report',
140
+ keywords: ['exam reports'],
141
+ },
142
+ {
143
+ title: 'Decoding Report',
144
+ path: '/reports/report-view/decoding-report',
145
+ keywords: ['exam reports'],
146
+ },
147
+ {
148
+ title: 'Malpractice Report',
149
+ path: '/reports/report-view/malpractice-report',
150
+ keywords: ['exam reports'],
151
+ },
152
+ {
153
+ title: 'TR With Marks After Processing',
154
+ path: '/reports/report-view/honors-minors-tr-with-marks-after-processing',
155
+ keywords: ['honors and minors exam report'],
156
+ },
157
+ {
158
+ title: 'T-sheet',
159
+ path: '/reports/report-view/honors-minors-t-sheet',
160
+ keywords: ['honors and minors exam report'],
161
+ },
162
+ {
163
+ title: 'Consolidated Grade Sheet',
164
+ path: '/reports/report-view/consolidated-grade-sheet',
165
+ keywords: ['transcripts', 'report'],
166
+ },
167
+ {
168
+ title: 'Provisional Certificate',
169
+ path: '/reports/report-view/provisional-certificate',
170
+ keywords: ['transcripts', 'report'],
171
+ },
172
+ ]
@@ -0,0 +1,128 @@
1
+ export const payments_sitemap = [
2
+ {
3
+ title: 'Payments Dashboard',
4
+ path: '/dashboard',
5
+ keywords: ['dashboard'],
6
+ },
7
+ {
8
+ title: 'Academic Fee Payment',
9
+ path: '/academic-fees',
10
+ keywords: ['academic', 'fees'],
11
+ },
12
+ {
13
+ title: 'Examination Fee Payment',
14
+ path: '/exam-fees',
15
+ keywords: ['examination', 'exam fees'],
16
+ },
17
+ {
18
+ title: 'Concessions',
19
+ path: '/concessions',
20
+ keywords: ['concessions', 'concession requests'],
21
+ },
22
+ {
23
+ title: 'Student Fee Card',
24
+ path: '/student-card',
25
+ keywords: [],
26
+ },
27
+ {
28
+ title: 'Student Transactions Card',
29
+ path: '/student-transactions-card',
30
+ keywords: [],
31
+ },
32
+
33
+ {
34
+ title: 'Fee Structure',
35
+ path: '/settings/fee-structure',
36
+ keywords: [],
37
+ },
38
+ {
39
+ title: 'Restore Fee Transactions',
40
+ path: '/settings/restore-fee-transactions',
41
+ keywords: [],
42
+ },
43
+ {
44
+ title: 'Transfer Admissions',
45
+ path: '/settings/transfer-admissions',
46
+ keywords: [],
47
+ },
48
+ {
49
+ title: 'Import Fees',
50
+ path: '/settings/import-fees',
51
+ keywords: [],
52
+ },
53
+ {
54
+ title: 'Fee Types',
55
+ path: '/settings/fee-types',
56
+ keywords: [],
57
+ },
58
+ {
59
+ title: 'Student Permissions',
60
+ path: '/settings/student-permissions',
61
+ keywords: [],
62
+ },
63
+ {
64
+ title: 'Fee Groups',
65
+ path: '/settings/fee-groups',
66
+ keywords: [],
67
+ },
68
+ {
69
+ title: 'Fines Configuration',
70
+ path: '/settings/fines-configuration',
71
+ keywords: [],
72
+ },
73
+ {
74
+ title: 'Quotas',
75
+ path: '/settings/quotas',
76
+ keywords: [],
77
+ },
78
+ {
79
+ title: 'People',
80
+ path: '/settings/application-profiles',
81
+ keywords: ['manage profiles', 'manage people'],
82
+ },
83
+ {
84
+ title: 'Fee Report',
85
+ path: '/report/fee-report',
86
+ keywords: [],
87
+ },
88
+ {
89
+ title: 'Fee Due List',
90
+ path: '/report/fee-due-list',
91
+ keywords: [],
92
+ },
93
+ {
94
+ title: 'Advance Due Report',
95
+ path: '/report/advance-due-report',
96
+ keywords: [],
97
+ },
98
+ {
99
+ title: 'Fee By Class',
100
+ path: '/report/fee-class-report',
101
+ keywords: [],
102
+ },
103
+ {
104
+ title: 'branch wise Fee Report',
105
+ path: '/report/branch-wise-fee-report',
106
+ keywords: [],
107
+ },
108
+ {
109
+ title: 'Detained Students Report',
110
+ path: '/report/detained-students-report',
111
+ keywords: [],
112
+ },
113
+ {
114
+ title: 'Reports',
115
+ path: '/report/exam-fees/reports',
116
+ keywords: [],
117
+ },
118
+ {
119
+ title: 'Not paid reports',
120
+ path: '/report/not-paid-reports',
121
+ keywords: [],
122
+ },
123
+ {
124
+ title: 'Blocked Students',
125
+ path: '/report/blocked-students',
126
+ keywords: [],
127
+ },
128
+ ]
@@ -0,0 +1,26 @@
1
+ import Fuse from 'fuse.js'
2
+ import { enroll_sitemap } from './enrollx'
3
+ import { square_sitemap } from './square'
4
+ import { exams_sitemap } from './exams_sitemap'
5
+ import { payments_sitemap } from './payments'
6
+
7
+ const withAppKey = (arr, key) => {
8
+ return arr?.map((i) => ({
9
+ ...i,
10
+ appKey: key,
11
+ }))
12
+ }
13
+
14
+ export const sitemap_directory = [
15
+ ...withAppKey(square_sitemap, 'ums'),
16
+ ...withAppKey(exams_sitemap, 'exams'),
17
+ ...withAppKey(enroll_sitemap, 'enroll'),
18
+ ...withAppKey(payments_sitemap, 'payments'),
19
+ ]
20
+
21
+ export const Sitemap = new Fuse(sitemap_directory, {
22
+ keys: ['title', 'keywords'],
23
+ minMatchCharLength: 3,
24
+ threshold: 0.35,
25
+ includeScore: true,
26
+ })
@@ -0,0 +1,222 @@
1
+ export const square_sitemap = [
2
+ {
3
+ title: 'College Feed',
4
+ path: '/college-feed',
5
+ keywords: ['Feed', 'posts'],
6
+ },
7
+ {
8
+ title: 'Analytics Dashboard',
9
+ path: '/analytics-dashboard',
10
+ keywords: ['birds eye view'],
11
+ },
12
+ {
13
+ title: 'Analytics Dashboard',
14
+ path: '/analytics-dashboard',
15
+ keywords: ['birds eye view'],
16
+ },
17
+ {
18
+ title: 'Tasks',
19
+ path: '/tasks/taskboard',
20
+ keywords: [],
21
+ },
22
+ {
23
+ title: 'Pending Tasks',
24
+ path: '/tasks/taskboard/pending-task',
25
+ keywords: [],
26
+ },
27
+ {
28
+ title: 'Completed Tasks',
29
+ path: '/tasks/taskboard/completed-task',
30
+ keywords: [],
31
+ },
32
+ {
33
+ title: 'Students',
34
+ path: '/students',
35
+ keywords: [],
36
+ },
37
+ {
38
+ title: 'Classrooms',
39
+ path: '/classrooms/classrooms',
40
+ keywords: [],
41
+ },
42
+ {
43
+ title: 'My Classrooms',
44
+ path: '/classrooms/myclassroom',
45
+ keywords: [],
46
+ },
47
+ {
48
+ title: 'Faculty Timetable',
49
+ path: '/classrooms/faculty-timetable',
50
+ keywords: [],
51
+ },
52
+ {
53
+ title: 'Classroom Progress Report',
54
+ path: '/classrooms/reports/classroom-reports/classroom-progress-reports',
55
+ keywords: [],
56
+ },
57
+ {
58
+ title: 'Subject Wise Attendance Report',
59
+ path: '/classrooms/reports/classroom-reports/subject-wise-attendance-reports',
60
+ keywords: [],
61
+ },
62
+ {
63
+ title: 'Section Wise Average Attendance Report',
64
+ path: '/classrooms/reports/classroom-reports/section-wise-average-attendance-reports',
65
+ keywords: [],
66
+ },
67
+ {
68
+ title: 'Student Attendance Report',
69
+ path: '/classrooms/reports/classroom-reports/student-attendance-reports',
70
+ keywords: [],
71
+ },
72
+ {
73
+ title: 'Syllabus Coverage Report',
74
+ path: '/classrooms/reports/classroom-reports/syllabus-coverage-reports',
75
+ keywords: [],
76
+ },
77
+ {
78
+ title: 'Cumulative Classroom Progress Report',
79
+ path: '/classrooms/reports/classroom-reports/cumulative-classroom-progress',
80
+ keywords: [],
81
+ },
82
+ {
83
+ title: 'Classroom Timetable Status Report',
84
+ path: '/classrooms/reports/classroom-reports/classroom-timetable-status',
85
+ keywords: [],
86
+ },
87
+ {
88
+ title: 'Inactive Faculty Report',
89
+ path: '/classrooms/reports/classroom-reports/inactive-faculty-report',
90
+ keywords: [],
91
+ },
92
+ {
93
+ title: 'Clubs',
94
+ path: '/activities/clubs',
95
+ keywords: [],
96
+ },
97
+ {
98
+ title: 'Events',
99
+ path: '/activities/events',
100
+ keywords: [],
101
+ },
102
+ {
103
+ title: 'Course Registrations',
104
+ path: '/course-registrations',
105
+ keywords: [],
106
+ },
107
+ {
108
+ title: 'Forms',
109
+ path: '/forms/forms',
110
+ keywords: ['form builder'],
111
+ },
112
+ {
113
+ title: 'Form Validations',
114
+ path: '/forms/form-validations',
115
+ keywords: ['form builder', 'form validations'],
116
+ },
117
+ {
118
+ title: 'Organisation Settings',
119
+ path: '/settings/org',
120
+ keywords: [],
121
+ },
122
+ {
123
+ title: 'Manage Schools',
124
+ path: '/settings/academics/schools',
125
+ keywords: [],
126
+ },
127
+ {
128
+ title: 'Manage Institutions',
129
+ path: '/settings/academics/institutions',
130
+ keywords: [],
131
+ },
132
+ {
133
+ title: 'Subject Types',
134
+ path: '/settings/academics/subject-types',
135
+ keywords: [],
136
+ },
137
+ {
138
+ title: 'Assessment Types',
139
+ path: '/settings/academics/assesment-types',
140
+ keywords: [],
141
+ },
142
+ {
143
+ title: 'Assessment Templates',
144
+ path: '/settings/academics/assesment-templates',
145
+ keywords: [],
146
+ },
147
+ {
148
+ title: 'Manage Degrees',
149
+ path: '/settings/academics/courses',
150
+ keywords: ['courses'],
151
+ },
152
+ {
153
+ title: 'Manage Semesters',
154
+ path: '/settings/academics/semesters',
155
+ keywords: ['semesters'],
156
+ },
157
+ {
158
+ title: 'Departments',
159
+ path: '/settings/academics/department',
160
+ keywords: [],
161
+ },
162
+ {
163
+ title: 'Programs',
164
+ path: '/settings/academics/programs',
165
+ keywords: ['branches'],
166
+ },
167
+ {
168
+ title: 'Curriculums',
169
+ path: '/settings/academics/curriculums',
170
+ keywords: [],
171
+ },
172
+ {
173
+ title: 'Master Subjects',
174
+ path: '/settings/academics/all-courses',
175
+ keywords: ['all subjects', 'subjects'],
176
+ },
177
+ {
178
+ title: 'Regulation Batches',
179
+ path: '/settings/academics/regulation-batches',
180
+ keywords: [],
181
+ },
182
+ {
183
+ title: 'Time Table Templates',
184
+ path: '/settings/academics/timeslot-templates',
185
+ keywords: [],
186
+ },
187
+ {
188
+ title: 'Academic Calendar',
189
+ path: '/settings/academics/academic-calendar',
190
+ keywords: ['calendar events'],
191
+ },
192
+ {
193
+ title: 'Academic Calendar Timeline',
194
+ path: '/settings/academics/academic-calendar-timeline',
195
+ keywords: ['calendar timeline'],
196
+ },
197
+ {
198
+ title: 'WhatsApp Configuration',
199
+ path: '/settings/config/whatsApp',
200
+ keywords: [],
201
+ },
202
+ {
203
+ title: 'Roles',
204
+ path: '/settings/manage-users/roles',
205
+ keywords: [],
206
+ },
207
+ {
208
+ title: 'Manage Users',
209
+ path: '/settings/manage-users/users',
210
+ keywords: ['all users', 'users'],
211
+ },
212
+ {
213
+ title: 'Manage Profiles',
214
+ path: '/settings/manage-users/profiles',
215
+ keywords: [],
216
+ },
217
+ {
218
+ title: 'People',
219
+ path: '/settings/manage-users/profiles',
220
+ keywords: ['profiles', 'manage people', 'assign profiles'],
221
+ },
222
+ ]