@campxdev/shared 1.10.70 → 1.10.71

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.70",
3
+ "version": "1.10.71",
4
4
  "main": "./exports.ts",
5
5
  "scripts": {
6
6
  "start": "react-scripts start",
@@ -1,80 +1,101 @@
1
1
  import { yupResolver } from '@hookform/resolvers/yup'
2
- import { Alert, Box, ButtonProps, Typography } from '@mui/material'
3
- import { AxiosResponse } from 'axios'
2
+ import {
3
+ Alert,
4
+ Box,
5
+ Button,
6
+ ButtonProps,
7
+ CircularProgress,
8
+ Typography,
9
+ } from '@mui/material'
10
+
4
11
  import { ReactNode, useState } from 'react'
5
12
  import { useForm } from 'react-hook-form'
6
13
  import { useMutation, useQueryClient } from 'react-query'
7
- import { axiosErrorToast } from '../../config/axios'
8
- import ActionButton from '../ActionButton'
9
- import RenderForm, { generateYupSchema, RenderFormProps } from './RenderForm'
14
+ import { toast } from 'react-toastify'
15
+ import axios, { axiosErrorToast } from '../../config/axios'
16
+ import RenderForm, { RenderFormProps, generateYupSchema } from './RenderForm'
17
+
18
+ const makePostRequest = async ({
19
+ endpoint,
20
+ postBody,
21
+ }: {
22
+ endpoint: string
23
+ postBody: any
24
+ }) => {
25
+ const method = postBody?.id ? 'PUT' : 'POST'
26
+ const url = postBody?.id ? `${endpoint}/${postBody?.id}` : endpoint
27
+ return await axios({
28
+ url,
29
+ method,
30
+ data: postBody,
31
+ })
32
+ }
10
33
 
11
34
  interface FormProps extends Omit<RenderFormProps, 'control'> {
12
35
  buttonProps?: ButtonProps
13
36
  submitBtn?: { label?: ReactNode }
14
- cancelBtn?: { label?: ReactNode; hide: boolean }
37
+ cancelBtn?: { label?: ReactNode }
38
+ onSubmit?: (formData) => any
39
+ onCancel?: () => void
40
+ endPoint?: string
15
41
  defaultValues?: any
16
42
  refetchKey?: string
17
- previousData?: any
18
- onCancel?: () => void
19
- postFunction: (body: any) => Promise<AxiosResponse>
20
- onPostSuccess?: (response: any) => void
21
- onPostError?: (error: any) => void
22
- onFormError?: (error: any) => void
43
+ onSuccess?: () => void
44
+ successToastMessage?: string
23
45
  }
24
46
 
25
47
  export default function Form({
26
48
  submitBtn = { label: 'Submit' },
27
- cancelBtn = { label: 'Cancel', hide: false },
49
+ cancelBtn = { label: 'Cancel' },
28
50
  buttonProps,
51
+ onSubmit = () => {},
52
+ endPoint,
29
53
  defaultValues,
30
54
  cols,
31
55
  fields,
32
56
  dropdowns,
33
57
  refetchKey,
58
+ onSuccess = () => {},
34
59
  onCancel,
35
- previousData,
36
- postFunction,
37
- onPostSuccess,
38
- onPostError,
39
- gap,
40
- onFormError,
60
+ successToastMessage,
41
61
  }: FormProps) {
42
62
  const queryClient = useQueryClient()
43
63
  const [error, setError] = useState<any>(null)
44
64
  const { control, watch, handleSubmit } = useForm({
45
- defaultValues: previousData ? previousData : null,
46
- resolver: yupResolver(
47
- generateYupSchema({
48
- fieldGroups: fields as any,
49
- }),
50
- ),
65
+ defaultValues,
66
+ resolver: yupResolver(generateYupSchema({ fieldGroups: [fields] })),
51
67
  })
52
68
 
53
- const { mutate, isLoading: posting } = useMutation(postFunction, {
69
+ const { data, mutate, isLoading } = useMutation(makePostRequest, {
54
70
  onSuccess(data) {
55
71
  queryClient.invalidateQueries(refetchKey)
56
- onPostSuccess && onPostSuccess(data)
72
+ toast.success(successToastMessage ?? 'Created Successfully')
73
+ onSuccess && onSuccess()
57
74
  },
58
75
  onError(error: any) {
59
- onPostError ? onPostError(error) : axiosErrorToast(error)
76
+ setError(error?.response?.data?.message)
77
+ axiosErrorToast(error)
60
78
  },
61
79
  })
62
80
 
63
81
  const onError = (error) => {
64
82
  const errorArray = Object.values(error)?.map((item: any) => item?.message)
65
83
  setError(errorArray)
66
- onFormError && onFormError(error)
67
84
  }
68
85
 
69
86
  return (
70
87
  <form
71
88
  onSubmit={handleSubmit((originalFormData) => {
72
- mutate(originalFormData)
89
+ const modifiedFormData = onSubmit(originalFormData) ?? originalFormData
90
+
91
+ mutate({
92
+ endpoint: endPoint,
93
+ postBody: modifiedFormData,
94
+ })
73
95
  }, onError)}
74
96
  >
75
97
  <RenderForm
76
98
  cols={cols}
77
- gap={gap}
78
99
  fields={fields}
79
100
  control={control}
80
101
  dropdowns={dropdowns}
@@ -85,36 +106,41 @@ export default function Form({
85
106
  sx={{
86
107
  display: 'flex',
87
108
  gap: '20px',
88
- marginTop: `20px`,
89
- justifyContent: 'center',
109
+ marginTop: '3rem',
90
110
  }}
91
111
  >
92
- <ActionButton
93
- loading={posting}
94
- disabled={posting}
112
+ <Button
113
+ fullWidth
95
114
  type="submit"
115
+ disabled={isLoading}
116
+ endIcon={
117
+ isLoading && <CircularProgress sx={{ color: 'white' }} size={20} />
118
+ }
96
119
  {...buttonProps}
97
120
  >
98
121
  {submitBtn?.label}
99
- </ActionButton>
100
- {!cancelBtn?.hide && (
101
- <ActionButton
102
- fullWidth
103
- variant="outlined"
104
- onClick={() => {
105
- onCancel ? onCancel() : null
106
- }}
107
- {...buttonProps}
108
- >
109
- {cancelBtn?.label}
110
- </ActionButton>
111
- )}
122
+ </Button>
123
+ <Button
124
+ fullWidth
125
+ variant="outlined"
126
+ onClick={() => {
127
+ onCancel ? onCancel() : null
128
+ }}
129
+ disabled={isLoading}
130
+ {...buttonProps}
131
+ >
132
+ {cancelBtn?.label}
133
+ </Button>
112
134
  </Box>
113
135
  </form>
114
136
  )
115
137
  }
116
138
 
117
- const FormErrorDisplay = ({ message }: { message: string | string[] }) => {
139
+ export const FormErrorDisplay = ({
140
+ message,
141
+ }: {
142
+ message: string | string[]
143
+ }) => {
118
144
  if (!message) return null
119
145
 
120
146
  if (typeof message === 'string')
@@ -1,10 +1,12 @@
1
- import { Box, Typography } from '@mui/material'
1
+ import { Box, CircularProgress, Typography, alpha, styled } from '@mui/material'
2
2
  import { ReactNode } from 'react'
3
+ import { Control, useController } from 'react-hook-form'
3
4
  import * as yup from 'yup'
4
- import { Control } from 'react-hook-form'
5
5
  import {
6
6
  FormDatePicker,
7
+ FormMultiSelect,
7
8
  FormRadioGroup,
9
+ FormSingleCheckbox,
8
10
  FormSingleSelect,
9
11
  FormTextField,
10
12
  } from '../HookForm'
@@ -38,6 +40,9 @@ type FormTypes =
38
40
  | 'FormSingleSelect'
39
41
  | 'FormRadioGroup'
40
42
  | 'FormDatePicker'
43
+ | 'FormMultiSelect'
44
+ | 'Loader'
45
+ | 'FormSingleCheckbox'
41
46
 
42
47
  export interface Field {
43
48
  render: FormTypes
@@ -46,12 +51,17 @@ export interface Field {
46
51
  required?: boolean
47
52
  elementProps?: any
48
53
  disabled?: boolean
49
- valiation?: any
54
+ validation?: any
55
+ }
56
+
57
+ export interface Option {
58
+ label: string | ReactNode
59
+ value: any
50
60
  }
51
61
 
52
62
  export interface RenderFormProps {
53
63
  fields: Field[]
54
- dropdowns?: { [x: string]: { label: string | ReactNode; value: any }[] }
64
+ dropdowns?: { [x: string]: Option[] }
55
65
  control: Control<any, any>
56
66
  cols: number
57
67
  data?: any
@@ -66,7 +76,7 @@ const RenderForm = ({
66
76
  cols,
67
77
  data = null,
68
78
  fieldArrayOptions,
69
- gap = '1rem',
79
+ gap = '20px 1rem',
70
80
  }: RenderFormProps) => {
71
81
  return (
72
82
  <>
@@ -106,6 +116,7 @@ const renderFormField = ({
106
116
  ? `${fieldArrayOptions?.name}.${fieldArrayOptions?.index}.${field?.name}`
107
117
  : field?.name
108
118
 
119
+ const { field: fieldData } = useController({ name: field.name, control })
109
120
  switch (field.render) {
110
121
  case 'FormTextField':
111
122
  return (
@@ -134,7 +145,6 @@ const renderFormField = ({
134
145
  case 'FormDatePicker':
135
146
  return (
136
147
  <FormDatePicker
137
- size="medium"
138
148
  control={control}
139
149
  name={name}
140
150
  label={field?.label}
@@ -156,34 +166,66 @@ const renderFormField = ({
156
166
  {...elementProps}
157
167
  />
158
168
  )
169
+ case 'FormMultiSelect':
170
+ return (
171
+ <FormMultiSelect
172
+ control={control}
173
+ label={field?.label}
174
+ required={field?.required}
175
+ disabled={field?.disabled}
176
+ name={name}
177
+ options={dropdown}
178
+ {...elementProps}
179
+ />
180
+ )
181
+
159
182
  case 'Display':
160
- return <FormDisplay label={field?.label} value={value} />
183
+ return (
184
+ <Display
185
+ label={field?.label}
186
+ value={fieldData.value}
187
+ disabled={field?.disabled}
188
+ />
189
+ )
161
190
 
162
- case 'NestedForm':
163
- return <NestedForm label={field?.label} nestedFields={[]} />
191
+ case 'Loader':
192
+ return <CircularProgress />
193
+
194
+ case 'FormSingleCheckbox':
195
+ return (
196
+ <FormSingleCheckbox
197
+ control={control}
198
+ label={field?.label}
199
+ required={field?.required}
200
+ disabled={field?.disabled}
201
+ name={name}
202
+ checked={fieldData.value ?? false}
203
+ {...elementProps}
204
+ />
205
+ )
164
206
 
165
207
  default:
166
208
  return <>{field?.label}</>
167
209
  }
168
210
  }
169
211
 
170
- const FormDisplay = ({ label, value }) => {
212
+ const Display = ({ label, value, disabled }) => {
171
213
  return (
172
214
  <Box>
173
215
  <Typography variant="subtitle2">{label}</Typography>
174
- <Typography variant="body1" marginTop={'5px'}>
216
+ <StyledTypography variant="body1" marginTop={'5px'} disabled={disabled}>
175
217
  {value ?? '-'}
176
- </Typography>
218
+ </StyledTypography>
177
219
  </Box>
178
220
  )
179
221
  }
180
222
 
181
- const NestedForm = ({
182
- nestedFields,
183
- label,
184
- }: {
185
- label: ReactNode
186
- nestedFields: Field[]
187
- }) => {
188
- return <></>
189
- }
223
+ const StyledTypography = styled(Typography, {
224
+ shouldForwardProp(propName) {
225
+ return propName !== 'disabled'
226
+ },
227
+ })<{ disabled: boolean }>(({ theme, disabled }) => ({
228
+ color: disabled
229
+ ? alpha(theme.palette.secondary.main, 0.4)
230
+ : theme.palette.secondary.main,
231
+ }))
@@ -0,0 +1,74 @@
1
+ import { Box, styled, TextField, Typography } from '@mui/material'
2
+ import { Controller } from 'react-hook-form'
3
+
4
+ const StyledInlineTextField = styled(TextField)(({ theme }) => ({
5
+ maxHeight: '35px',
6
+ '& legend': {
7
+ display: 'none',
8
+ },
9
+
10
+ '& fieldset': {
11
+ top: 0,
12
+ },
13
+ }))
14
+
15
+ const StyledInlineFlex = styled(Box)(({ theme }) => ({
16
+ width: '100%',
17
+ flexWrap: 'wrap',
18
+ display: 'flex',
19
+ gap: '10px',
20
+ alignItems: 'baseline',
21
+ '& .MuiTypography-root': {
22
+ flexShrink: 0,
23
+ },
24
+ '& .MuiTextField-root': {
25
+ maxWidth: '100px',
26
+ },
27
+ }))
28
+
29
+ export const FormInlineTextField = ({ control, label }) => {
30
+ const regex = /\{([^}]+)\}/
31
+ const splitArr = label.split(regex)
32
+
33
+ function getParsedArr(arr) {
34
+ for (let i = 1; i < arr.length; i += 2) {
35
+ const split = arr[i].split(':')
36
+ arr[i] = (
37
+ <Controller
38
+ name={split[0]}
39
+ control={control}
40
+ render={({ field: { onChange, value }, fieldState: { error } }) => (
41
+ <StyledInlineTextField
42
+ size="small"
43
+ key={i}
44
+ placeholder={split[1] ?? ''}
45
+ value={value}
46
+ onChange={onChange}
47
+ error={error ? true : false}
48
+ helperText={error ? error.message : null}
49
+ />
50
+ )}
51
+ />
52
+ )
53
+ }
54
+ return arr
55
+ }
56
+
57
+ return (
58
+ <StyledInlineFlex>
59
+ {getParsedArr(splitArr)?.map((item, index) => {
60
+ if (typeof item === 'string' && item.length) {
61
+ return (
62
+ <Typography variant="body1" key={index}>
63
+ {item}
64
+ </Typography>
65
+ )
66
+ }
67
+
68
+ return item
69
+ })}
70
+ </StyledInlineFlex>
71
+ )
72
+ }
73
+
74
+ export default FormInlineTextField
@@ -1,23 +1,25 @@
1
- import SingleSelect from './SingleSelect'
1
+ import AutoCompleteSearch from './AutoCompleteSearch'
2
2
  import FormDatePicker from './DatePicker'
3
+ import FormDateTimePicker from './DateTimePicker'
4
+ import FormInlineTextField from './InLineTextField'
3
5
  import MultiCheckbox from './MultiCheckbox'
4
6
  import MultiSelect from './MultiSelect'
5
7
  import RadioGroup from './RadioGroup'
6
8
  import SingleCheckbox from './SingleCheckbox'
7
- import AutoCompleteSearch from './AutoCompleteSearch'
9
+ import SingleSelect from './SingleSelect'
8
10
  import FormTextField from './TextField'
9
11
  import TimePicker from './TimePicker'
10
- import FormDateTimePicker from './DateTimePicker'
11
12
 
12
13
  export {
13
- SingleSelect as FormSingleSelect,
14
+ AutoCompleteSearch as FormAutoCompleteSearch,
14
15
  FormDatePicker,
15
- FormTextField,
16
+ FormDateTimePicker,
17
+ FormInlineTextField,
16
18
  MultiCheckbox as FormMultiCheckbox,
17
19
  MultiSelect as FormMultiSelect,
18
20
  RadioGroup as FormRadioGroup,
19
21
  SingleCheckbox as FormSingleCheckbox,
20
- AutoCompleteSearch as FormAutoCompleteSearch,
22
+ SingleSelect as FormSingleSelect,
23
+ FormTextField,
21
24
  TimePicker as FormTimePicker,
22
- FormDateTimePicker,
23
25
  }
@@ -1,5 +1,6 @@
1
1
  import { ChevronRight } from '@mui/icons-material'
2
2
  import {
3
+ Box,
3
4
  ListItemButtonProps,
4
5
  ListItemIcon,
5
6
  ListItemText,
@@ -24,7 +25,11 @@ export const ListItemButton = ({
24
25
  }: Props) => {
25
26
  return (
26
27
  <StyledListItemButton isActive={isActive} onClick={onClick}>
27
- {Icon ? <ListItemIcon>{<Icon />}</ListItemIcon> : null}
28
+ {Icon ? (
29
+ <ListItemIcon>{<Icon />}</ListItemIcon>
30
+ ) : (
31
+ <Box minWidth={16}></Box>
32
+ )}
28
33
  <ListItemText primary={label} />
29
34
  </StyledListItemButton>
30
35
  )
@@ -11,17 +11,25 @@ type CourseSelectorProps = {
11
11
  allowAll?: boolean
12
12
  error?: boolean
13
13
  helperText?: string
14
+ api?: string
14
15
  } & SelectProps
15
16
  export default function CourseSelector(props: CourseSelectorProps) {
16
- const { name, required = false, label, onChange, allowAll = true } = props
17
+ const {
18
+ name,
19
+ required = false,
20
+ label,
21
+ onChange,
22
+ allowAll = true,
23
+ api = '/square/courses',
24
+ } = props
17
25
  const [options, setOptions] = useState([])
18
26
 
19
27
  const handleOpen = () => {
20
28
  if (options.length === 0) {
21
29
  axios
22
- .get('/square/courses')
30
+ .get(api)
23
31
  .then((response) => {
24
- setOptions(response.data.courses)
32
+ setOptions(response.data)
25
33
  })
26
34
  .catch((error) => {
27
35
  console.error('Error fetching data from the API:', error)
@@ -19,7 +19,7 @@ export default function FeeTypeSelector(props: FeeTypeSelectorProps) {
19
19
  const handleOpen = () => {
20
20
  if (options.length === 0) {
21
21
  axios
22
- .get('/payments/fee-types')
22
+ .get('/paymentx/fee-types')
23
23
  .then((response) => {
24
24
  setOptions(response.data)
25
25
  })
@@ -40,7 +40,7 @@ export default function FeeTypeSelector(props: FeeTypeSelectorProps) {
40
40
  ...(allowAll ? [{ value: 'all', label: 'All' }] : []),
41
41
  ...options.map((item) => ({
42
42
  label: `${item.name} `,
43
- value: `${item.slug}`,
43
+ value: `${item.id}`,
44
44
  })),
45
45
  ]
46
46
  : allowAll
@@ -10,6 +10,7 @@ type FormCourseSelectorProps = {
10
10
  multiple?: boolean
11
11
  allowAll?: boolean
12
12
  onChange?: (value: any) => void
13
+ api?: string
13
14
  } & SelectProps
14
15
  export default function FormCourseSelector(props: FormCourseSelectorProps) {
15
16
  const {
@@ -21,6 +22,7 @@ export default function FormCourseSelector(props: FormCourseSelectorProps) {
21
22
  multiple = false,
22
23
  onChange,
23
24
  value,
25
+ api,
24
26
  } = props
25
27
 
26
28
  return (
@@ -10,6 +10,7 @@ type FormFeeTypeSelectorProps = {
10
10
  multiple?: boolean
11
11
  allowAll?: boolean
12
12
  onChange?: (value: any) => void
13
+ api?: string
13
14
  } & SelectProps
14
15
  export default function FormFeeTypeSelector(props: FormFeeTypeSelectorProps) {
15
16
  const {
@@ -21,6 +22,7 @@ export default function FormFeeTypeSelector(props: FormFeeTypeSelectorProps) {
21
22
  multiple = false,
22
23
  onChange,
23
24
  value,
25
+ api,
24
26
  } = props
25
27
 
26
28
  return (
@@ -11,6 +11,7 @@ type ProgramSelectorProps = {
11
11
  allowAll?: boolean
12
12
  filters?: { courseId: number }
13
13
  onChange?: (value: any) => void
14
+ api?: string
14
15
  } & SelectProps
15
16
  export default function FormProgramSelector(props: ProgramSelectorProps) {
16
17
  const {
@@ -23,6 +24,7 @@ export default function FormProgramSelector(props: ProgramSelectorProps) {
23
24
  onChange,
24
25
  value,
25
26
  filters,
27
+ api
26
28
  } = props
27
29
 
28
30
  return (
@@ -11,6 +11,7 @@ type FormQuotaSelectorProps = {
11
11
  allowAll?: boolean
12
12
  onChange?: (value: any) => void
13
13
  filters?: { courseId: number }
14
+ api?: string
14
15
  } & SelectProps
15
16
  export default function FormQuotaSelector(props: FormQuotaSelectorProps) {
16
17
  const {
@@ -23,6 +24,7 @@ export default function FormQuotaSelector(props: FormQuotaSelectorProps) {
23
24
  onChange,
24
25
  value,
25
26
  filters,
27
+ api,
26
28
  } = props
27
29
 
28
30
  return (
@@ -11,6 +11,7 @@ type SemesterSelectorProps = {
11
11
  allowAll?: boolean
12
12
  filters?: { courseId: number }
13
13
  onChange?: (value: any) => void
14
+ api?: string
14
15
  } & SelectProps
15
16
  export default function FormSemseterSelector(props: SemesterSelectorProps) {
16
17
  const {
@@ -23,6 +24,7 @@ export default function FormSemseterSelector(props: SemesterSelectorProps) {
23
24
  onChange,
24
25
  value,
25
26
  filters,
27
+ api,
26
28
  } = props
27
29
 
28
30
  return (
@@ -14,6 +14,7 @@ type MultiProgramSelectorProps = {
14
14
  allowAll?: boolean
15
15
  error?: boolean
16
16
  helperText?: string
17
+ api?: string
17
18
  } & SelectProps
18
19
  const MultiProgramSelector = (props: MultiProgramSelectorProps) => {
19
20
  const {
@@ -26,6 +27,7 @@ const MultiProgramSelector = (props: MultiProgramSelectorProps) => {
26
27
  filters,
27
28
  value,
28
29
  allowAll = true,
30
+ api = '/square/branches',
29
31
  } = props
30
32
  const [options, setOptions] = useState([])
31
33
  const [prevCourseId, setPrevCourseId] = useState(null)
@@ -34,7 +36,7 @@ const MultiProgramSelector = (props: MultiProgramSelectorProps) => {
34
36
  if (filters.courseId && filters.courseId !== prevCourseId) {
35
37
  setOptions([])
36
38
  axios
37
- .get('/square/branches', {
39
+ .get(api, {
38
40
  params: filters,
39
41
  })
40
42
  .then((response) => {
@@ -47,7 +49,7 @@ const MultiProgramSelector = (props: MultiProgramSelectorProps) => {
47
49
  }
48
50
  } else if (options.length === 0) {
49
51
  axios
50
- .get('/square/branches')
52
+ .get(api)
51
53
  .then((response) => {
52
54
  setOptions(response.data)
53
55
  })
@@ -68,7 +70,7 @@ const MultiProgramSelector = (props: MultiProgramSelectorProps) => {
68
70
  ...(allowAll ? [{ value: 'all', label: 'All' }] : []),
69
71
  ...options.map((item) => ({
70
72
  label: `${item.branchName}`,
71
- value: `${item.branchCode}`,
73
+ value: `${item.id}`,
72
74
  })),
73
75
  ]
74
76
  : allowAll
@@ -14,6 +14,7 @@ type MultiQuotaSelectorProps = {
14
14
  allowAll?: boolean
15
15
  error?: boolean
16
16
  helperText?: string
17
+ api?: string
17
18
  } & SelectProps
18
19
  export default function MultiQuotaSelector(props: MultiQuotaSelectorProps) {
19
20
  const {
@@ -26,6 +27,7 @@ export default function MultiQuotaSelector(props: MultiQuotaSelectorProps) {
26
27
  filters,
27
28
  value,
28
29
  allowAll = true,
30
+ api = '/square/quotas',
29
31
  } = props
30
32
  const [options, setOptions] = useState([])
31
33
  const [prevCourseId, setPrevCourseId] = useState(null)
@@ -34,11 +36,13 @@ export default function MultiQuotaSelector(props: MultiQuotaSelectorProps) {
34
36
  if (filters.courseId && filters.courseId !== prevCourseId) {
35
37
  setOptions([])
36
38
  axios
37
- .get('/square/quotas', {
39
+ .get(api, {
38
40
  params: filters,
39
41
  })
40
42
  .then((response) => {
41
- setOptions(response.data)
43
+ setOptions(
44
+ api == '/square/quotas' ? response.data : response.data.quotas,
45
+ )
42
46
  setPrevCourseId(filters.courseId)
43
47
  })
44
48
  .catch((error) => {
@@ -47,9 +51,11 @@ export default function MultiQuotaSelector(props: MultiQuotaSelectorProps) {
47
51
  }
48
52
  } else if (options.length === 0) {
49
53
  axios
50
- .get('/square/quotas')
54
+ .get(api)
51
55
  .then((response) => {
52
- setOptions(response.data)
56
+ setOptions(
57
+ api == '/square/quotas' ? response.data : response.data.quota,
58
+ )
53
59
  })
54
60
  .catch((error) => {
55
61
  console.error('Error fetching data from the API:', error)
@@ -12,6 +12,7 @@ type ProgramSelectorProps = {
12
12
  allowAll?: boolean
13
13
  error?: boolean
14
14
  helperText?: string
15
+ api?: string
15
16
  } & SelectProps
16
17
  const ProgramSelector = (props: ProgramSelectorProps) => {
17
18
  const {
@@ -21,6 +22,7 @@ const ProgramSelector = (props: ProgramSelectorProps) => {
21
22
  multiple = false,
22
23
  filters,
23
24
  allowAll = true,
25
+ api = '/square/branches',
24
26
  } = props
25
27
  const [options, setOptions] = useState([])
26
28
  const [prevCourseId, setPrevCourseId] = useState(null)
@@ -29,7 +31,7 @@ const ProgramSelector = (props: ProgramSelectorProps) => {
29
31
  if (filters.courseId && filters.courseId !== prevCourseId) {
30
32
  setOptions([])
31
33
  axios
32
- .get('/square/branches', {
34
+ .get(api, {
33
35
  params: filters,
34
36
  })
35
37
  .then((response) => {
@@ -42,7 +44,7 @@ const ProgramSelector = (props: ProgramSelectorProps) => {
42
44
  }
43
45
  } else if (options.length === 0) {
44
46
  axios
45
- .get('/square/branches')
47
+ .get(api)
46
48
  .then((response) => {
47
49
  setOptions(response.data)
48
50
  })
@@ -63,7 +65,7 @@ const ProgramSelector = (props: ProgramSelectorProps) => {
63
65
  ...(allowAll ? [{ value: 'all', label: 'All' }] : []),
64
66
  ...options.map((item) => ({
65
67
  label: `${item.branchName}`,
66
- value: `${item.branchCode}`,
68
+ value: `${item.id}`,
67
69
  })),
68
70
  ]
69
71
  : allowAll
@@ -12,6 +12,7 @@ type QuotaSelectorProps = {
12
12
  allowAll?: boolean
13
13
  error?: boolean
14
14
  helperText?: string
15
+ api?: string
15
16
  } & SelectProps
16
17
  export default function QuotaSelector(props: QuotaSelectorProps) {
17
18
  const {
@@ -21,6 +22,7 @@ export default function QuotaSelector(props: QuotaSelectorProps) {
21
22
  multiple = false,
22
23
  filters,
23
24
  allowAll = true,
25
+ api = '/square/quotas',
24
26
  } = props
25
27
  const [options, setOptions] = useState([])
26
28
  const [prevCourseId, setPrevCourseId] = useState(null)
@@ -29,11 +31,13 @@ export default function QuotaSelector(props: QuotaSelectorProps) {
29
31
  if (filters.courseId && filters.courseId !== prevCourseId) {
30
32
  setOptions([])
31
33
  axios
32
- .get('/square/quotas', {
34
+ .get(api, {
33
35
  params: filters,
34
36
  })
35
37
  .then((response) => {
36
- setOptions(response.data)
38
+ setOptions(
39
+ api == '/square/quotas' ? response.data : response.data.quotas,
40
+ )
37
41
  setPrevCourseId(filters.courseId)
38
42
  })
39
43
  .catch((error) => {
@@ -42,9 +46,11 @@ export default function QuotaSelector(props: QuotaSelectorProps) {
42
46
  }
43
47
  } else if (options.length === 0) {
44
48
  axios
45
- .get('/square/quotas')
49
+ .get(api)
46
50
  .then((response) => {
47
- setOptions(response.data)
51
+ setOptions(
52
+ api == '/square/quotas' ? response.data : response.data.quota,
53
+ )
48
54
  })
49
55
  .catch((error) => {
50
56
  console.error('Error fetching data from the API:', error)
@@ -12,6 +12,7 @@ type SemesterSelectorProps = {
12
12
  allowAll?: boolean
13
13
  error?: boolean
14
14
  helperText?: string
15
+ api?: string
15
16
  } & SelectProps
16
17
  const SemesterSelector = (props: SemesterSelectorProps) => {
17
18
  const {
@@ -21,6 +22,7 @@ const SemesterSelector = (props: SemesterSelectorProps) => {
21
22
  multiple = false,
22
23
  filters,
23
24
  allowAll = true,
25
+ api = '/square/semesters',
24
26
  } = props
25
27
  const [options, setOptions] = useState([])
26
28
  const [prevCourseId, setPrevCourseId] = useState(null)
@@ -29,7 +31,7 @@ const SemesterSelector = (props: SemesterSelectorProps) => {
29
31
  if (filters.courseId && filters.courseId !== prevCourseId) {
30
32
  setOptions([])
31
33
  axios
32
- .get('/square/semesters', {
34
+ .get(api, {
33
35
  params: filters,
34
36
  })
35
37
  .then((response) => {
@@ -42,7 +44,7 @@ const SemesterSelector = (props: SemesterSelectorProps) => {
42
44
  }
43
45
  } else if (options.length === 0) {
44
46
  axios
45
- .get('/square/semesters')
47
+ .get(api)
46
48
  .then((response) => {
47
49
  setOptions(response.data)
48
50
  })
@@ -385,6 +385,12 @@ export enum EnrollPermissions {
385
385
  CAN_LEAD_SOURCES_ADD = 'can_lead_sources_add',
386
386
  CAN_LEAD_SOURCES_EDIT = 'can_lead_sources_edit',
387
387
  CAN_LEAD_SOURCES_DELETE = 'can_lead_sources_delete',
388
+
389
+ // Student Certificate
390
+ CAN_STUDENT_CERTIFICATES_VIEW = 'can_student_certificates_view',
391
+ CAN_STUDENT_CERTIFICATES_EDIT = 'can_student_certificates_edit',
392
+ CAN_STUDENT_CERTIFICATES_DELETE = 'can_student_certificates_delete',
393
+ CAN_STUDENT_CERTIFICATES_ADD = 'can_student_certificates_add',
388
394
  }
389
395
 
390
396
  export enum ExamsPermissions {
@@ -526,6 +532,7 @@ export enum ExamsPermissions {
526
532
  CAN_EXAM_TIME_SLOTS_EDIT = 'can_exam_time_slots_edit',
527
533
  CAN_EXAM_TIME_SLOTS_DELETE = 'can_exam_time_slots_delete',
528
534
  }
535
+
529
536
  export enum Permission {
530
537
  // General
531
538
  CAN_INDIVIDUAL_PAGES_VIEW = 'can_individual_pages_view',
@@ -1175,82 +1182,82 @@ export enum Permission {
1175
1182
  CAN_ADMIN_VIEW = 'can_admin_view',
1176
1183
 
1177
1184
  //HRMS
1178
-
1179
1185
  //Profiles
1180
1186
  CAN_MANAGE_HRMS_PROFILE_PERMISSIONS_VIEW = 'can_manage_hrms_profile_permissions_view',
1181
1187
  CAN_MANAGE_HRMS_PROFILE_PERMISSIONS_ADD = 'can_manage_hrms_profile_permissions_add',
1182
1188
  CAN_MANAGE_HRMS_PROFILE_PERMISSIONS_EDIT = 'can_manage_hrms_profile_permissions_edit',
1183
1189
  CAN_MANAGE_HRMS_PROFILE_PERMISSIONS_DELETE = 'can_manage_hrms_profile_permissions_delete',
1184
1190
 
1185
- //Roles
1186
- CAN_MANAGE_HRMS_ROLES_VIEW = 'can_manage_hrms_roles_view',
1187
- CAN_MANAGE_HRMS_ROLES_ADD = 'can_manage_hrms_roles_add',
1188
- CAN_MANAGE_HRMS_ROLES_EDIT = 'can_manage_hrms_roles_edit',
1189
- CAN_MANAGE_HRMS_ROLES_DELETE = 'can_manage_hrms_roles_delete',
1191
+ //Infomation
1192
+ CAN_VIEW_INFORMATION = 'can_view_information',
1193
+ CAN_EDIT_INFORMATION = 'can_edit_information',
1194
+ CAN_EDIT_SPECIAL_INFORMATION = 'can_edit_special_information',
1195
+
1196
+ //Leave Tracker
1197
+ CAN_VIEW_LEAVE_TRACKER = 'can_view_leave_tracker',
1198
+ CAN_APPLY_LEAVE = 'can_apply_leave',
1190
1199
 
1191
1200
  //Employees
1192
- CAN_MANAGE_EMPLOYEES_VIEW = 'can_manage_employees_view',
1193
- CAN_MANAGE_EMPLOYEES_IMPORT = 'can_manage_employees_import',
1194
- CAN_MANAGE_EMPLOYEES_ADD = 'can_manage_employees_add',
1195
- CAN_MANAGE_EMPLOYEES_EDIT = 'can_manage_employees_edit',
1201
+ CAN_VIEW_EMPLOYEES = 'can_view_employees',
1202
+ CAN_EDIT_EMPLOYEES = 'can_edit_employees',
1203
+ CAN_CREATE_EMPLOYEES = 'can_create_employees',
1204
+ CAN_IMPORT_EMPLOYEES = 'can_import_employees',
1196
1205
 
1197
- //Groups
1198
- CAN_MANAGE_GROUPS_VIEW = 'can_manage_groups_view',
1199
- CAN_MANAGE_GROUPS_ADD = 'can_manage_groups_add',
1200
- CAN_MANAGE_GROUPS_EDIT = 'can_manage_groups_edit',
1206
+ //PunchLogs
1207
+ CAN_VIEW_PUNCH_LOGS = 'can_view_punch_logs',
1208
+
1209
+ //Time Sheet
1210
+ CAN_VIEW_TIME_SHEET = 'can_view_time_sheet',
1211
+ CAN_EDIT_TIME_SHEET = 'can_edit_time_sheet',
1212
+ CAN_IMPORT_TIME_SHEET = 'can_import_time_sheet',
1213
+ CAN_EXPORT_TIME_SHEET = 'can_export_time_sheet',
1214
+ CAN_GENERATE_TIME_SHEET = 'can_generate_time_sheet',
1215
+
1216
+ //Loss Of Pay
1217
+ CAN_VIEW_LOSS_OF_PAY = 'can_view_loss_of_pay',
1218
+
1219
+ //Leave Usages
1220
+ CAN_VIEW_LEAVES_USAGES = 'can_view_leaves_usages',
1221
+ CAN_EDIT_LEAVES_USAGES = 'can_edit_leaves_usages',
1222
+ CAN_IMPORT_LEAVES_USAGES = 'can_import_leaves_usages',
1223
+ CAN_EXPORT_LEAVES_USAGES = 'can_export_leaves_usages',
1224
+
1225
+ //Leave Requests
1226
+ CAN_VIEW_LEAVES_REQUESTS = 'can_view_leaves_requests',
1227
+ CAN_VIEW_PAST_LEAVES_REQUESTS = 'can_view_past_leaves_requests',
1228
+ CAN_CREATE_LEAVES_REQUESTS = 'can_create_leaves_requests',
1229
+ CAN_APPROVE_LEAVE_REQUESTS = 'can_approve_leave_requests',
1230
+ CAN_REJECT_LEAVE_REQUESTS = 'can_reject_leave_requests',
1231
+ CAN_CANCEL_LEAVE_REQUESTS = 'can_cancel_leave_requests',
1201
1232
 
1202
1233
  //Departments
1203
- CAN_MANAGE_DEPARTMENTS_VIEW = 'can_manage_departments_view',
1204
- CAN_MANAGE_DEPARTMENTS_ADD = 'can_manage_departments_add',
1205
- CAN_MANAGE_DEPARTMENTS_EDIT = 'can_manage_departments_edit',
1234
+ CAN_VIEW_DEPARTMENTS = 'can_view_departments',
1235
+ CAN_ADD_DEPARTMENTS = 'can_add_departments',
1236
+ CAN_IMPORT_DEPARTMENTS = 'can_import_departments',
1237
+ CAN_EXPORT_DEPARTMENTS = 'can_export_departments',
1238
+ CAN_EDIT_DEPARTMENTS = 'can_edit_departments',
1206
1239
 
1207
1240
  //Designations
1208
- CAN_MANAGE_DESIGNATIONS_VIEW = 'can_manage_designations_view',
1209
- CAN_MANAGE_DESIGNATIONS_ADD = 'can_manage_designations_add',
1210
- CAN_MANAGE_DESIGNATIONS_EDIT = 'can_manage_designations_edit',
1211
-
1212
- //Locations
1213
- CAN_MANAGE_LOCATIONS_VIEW = 'can_manage_locations_view',
1214
- CAN_MANAGE_LOCATIONS_ADD = 'can_manage_locations_add',
1215
- CAN_MANAGE_LOCATIONS_EDIT = 'can_manage_locations_edit',
1241
+ CAN_VIEW_DESIGNATIONS = 'can_view_designations',
1242
+ CAN_ADD_DESIGNATIONS = 'can_add_designations',
1243
+ CAN_IMPORT_DESIGNATIONS = 'can_import_designations',
1244
+ CAN_EXPORT_DESIGNATIONS = 'can_export_designations',
1245
+ CAN_EDIT_DESIGNATIONS = 'can_edit_designations',
1216
1246
 
1217
1247
  //Leave Types
1218
- CAN_MANAGE_LEAVE_TYPES_VIEW = 'can_manage_leave_types_view',
1219
- CAN_MANAGE_LEAVE_TYPES_ADD = 'can_manage_leave_types_add',
1220
- CAN_MANAGE_LEAVE_TYPES_EDIT = 'can_manage_leave_types_edit',
1221
-
1222
- //Leave Balances
1223
- CAN_MANAGE_LEAVE_BALANCES_VIEW = 'can_manage_leave_balances_view',
1224
- CAN_MANAGE_LEAVE_BALANCES_IMPORT = 'can_manage_leave_balances_import',
1225
- CAN_MANAGE_LEAVE_BALANCES_EDIT = 'can_manage_leave_balances_edit',
1248
+ CAN_VIEW_LEAVE_TYPES = 'can_view_leave_types',
1249
+ CAN_ADD_LEAVE_TYPES = 'can_add_leave_types',
1250
+ CAN_EDIT_LEAVE_TYPES = 'can_edit_leave_types',
1226
1251
 
1227
- //Time Sheet
1228
- CAN_MANAGE_TIME_SHEET_VIEW = 'can_manage_time_sheet_view',
1229
- CAN_MANAGE_TIME_SHEET_IMPORT = 'can_manage_time_sheet_import',
1230
- CAN_MANAGE_TIME_SHEET_EDIT = 'can_manage_time_sheet_edit',
1231
-
1232
- //Expense Types
1233
- CAN_MANAGE_EXPENSE_TYPES_VIEW = 'can_manage_expense_types_view',
1234
- CAN_MANAGE_EXPENSE_TYPES_ADD = 'can_manage_expense_types_add',
1235
- CAN_MANAGE_EXPENSE_TYPES_EDIT = 'can_manage_expense_types_edit',
1236
-
1237
- //Overtime
1238
- CAN_MANAGE_OVERTIME_VIEW = 'can_manage_overtime_view',
1239
- CAN_MANAGE_OVERTIME_ADD = 'can_manage_overtime_add',
1240
- CAN_MANAGE_OVERTIME_EDIT = 'can_manage_overtime_edit',
1241
-
1242
- //MyKiosk
1243
- CAN_MANAGE_MY_KIOSK_VIEW = 'can_manage_my_kiosk_view',
1244
- CAN_MANAGE_MY_KIOSK_EDIT = 'can_manage_my_kiosk_edit',
1245
-
1246
- //LeaveTracker
1247
- CAN_MANAGE_LEAVE_TRACKER_VIEW = 'can_manage_leave_tracker_view',
1248
- CAN_MANAGE_LEAVE_TRACKER_EDIT = 'can_manage_leave_tracker_edit',
1249
-
1250
- //LeaveRequests
1251
- CAN_MANAGE_LEAVE_REQUESTS_VIEW = 'can_manage_leave_requests_view',
1252
- CAN_MANAGE_LEAVE_REQUESTS_CREATE = 'can_manage_leave_requests_create',
1253
- CAN_MANAGE_LEAVE_REQUESTS_EDIT = 'can_manage_leave_requests_edit',
1252
+ //Groups
1253
+ CAN_VIEW_GROUPS = 'can_view_groups',
1254
+ CAN_ADD_GROUPS = 'can_add_groups',
1255
+ CAN_EDIT_GROUPS_TIME_CONFIG = 'can_edit_groups_time_config',
1256
+ CAN_EDIT_GROUPS_LEAVE_CONFIG = 'can_edit_groups_leave_config',
1257
+
1258
+ //Database Configurations
1259
+ CAN_VIEW_DATABASE_CONFIG = 'can_view_database_config',
1260
+ CAN_EDIT_DATABASE_CONFIG = 'can_edit_database_config',
1254
1261
  }
1255
1262
 
1256
1263
  export interface IPermissions {