icleafreportui 0.1.0 → 0.1.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.
Files changed (92) hide show
  1. package/dist/App.js +52 -0
  2. package/dist/Login.js +177 -0
  3. package/dist/Reports/CourseReport.js +243 -0
  4. package/dist/Reports/ExamPackReport.js +559 -0
  5. package/dist/Reports/ExamReport.js +290 -0
  6. package/dist/Reports/Report.js +299 -0
  7. package/dist/api/client.js +44 -0
  8. package/dist/components/Header.js +147 -0
  9. package/dist/components/Loader.js +30 -0
  10. package/dist/components/imagePathUrl.js +17 -0
  11. package/dist/components/sidebar.js +78 -0
  12. package/dist/context/TenantProvider.js +34 -0
  13. package/dist/index.js +19 -0
  14. package/dist/package.js +101 -0
  15. package/dist/reportWebVitals.js +27 -0
  16. package/dist/setupTests.js +3 -0
  17. package/package.json +11 -3
  18. package/.env +0 -7
  19. package/public/favicon.ico +0 -0
  20. package/public/images/EResourcesImg.png +0 -0
  21. package/public/images/courseCardImg.png +0 -0
  22. package/public/images/courseInfo.png +0 -0
  23. package/public/images/exam-options.png +0 -0
  24. package/public/images/icleaf-11.png +0 -0
  25. package/public/images/icleaf_logo.png +0 -0
  26. package/public/images/template.png +0 -0
  27. package/public/images/unnamed.png +0 -0
  28. package/public/images/user.jpg +0 -0
  29. package/public/images/young-man-studying-library-using-laptop-1.png +0 -0
  30. package/public/index.html +0 -45
  31. package/public/logo192.png +0 -0
  32. package/public/logo512.png +0 -0
  33. package/public/manifest.json +0 -25
  34. package/public/robots.txt +0 -3
  35. package/src/App.js +0 -37
  36. package/src/Login.js +0 -159
  37. package/src/Reports/CourseReport.js +0 -209
  38. package/src/Reports/ExamPackReport.js +0 -554
  39. package/src/Reports/ExamReport.js +0 -269
  40. package/src/Reports/Report.js +0 -271
  41. package/src/api/client.jsx +0 -42
  42. package/src/components/Header.jsx +0 -192
  43. package/src/components/Loader.jsx +0 -23
  44. package/src/components/imagePathUrl.jsx +0 -11
  45. package/src/components/sidebar.jsx +0 -81
  46. package/src/context/TenantProvider.jsx +0 -22
  47. package/src/index.js +0 -21
  48. package/src/package.js +0 -10
  49. package/src/reportWebVitals.js +0 -13
  50. package/src/setupTests.js +0 -5
  51. /package/{src → dist}/App.css +0 -0
  52. /package/{src → dist}/components/Header.css +0 -0
  53. /package/{src → dist}/components/sidebar.css +0 -0
  54. /package/{src → dist}/fonts/210000.jpg +0 -0
  55. /package/{src → dist}/fonts/210001.jpg +0 -0
  56. /package/{src → dist}/fonts/210003.jpg +0 -0
  57. /package/{src → dist}/fonts/210004.jpg +0 -0
  58. /package/{src → dist}/fonts/210006.jpg +0 -0
  59. /package/{src → dist}/fonts/210018.jpg +0 -0
  60. /package/{src → dist}/fonts/210019.jpg +0 -0
  61. /package/{src → dist}/fonts/210020.jpg +0 -0
  62. /package/{src → dist}/fonts/210279.jpg +0 -0
  63. /package/{src → dist}/fonts/210280.jpg +0 -0
  64. /package/{src → dist}/fonts/Gilroy-Black.ttf +0 -0
  65. /package/{src → dist}/fonts/Gilroy-BlackItalic.ttf +0 -0
  66. /package/{src → dist}/fonts/Gilroy-Bold.ttf +0 -0
  67. /package/{src → dist}/fonts/Gilroy-BoldItalic.ttf +0 -0
  68. /package/{src → dist}/fonts/Gilroy-ExtraBold.ttf +0 -0
  69. /package/{src → dist}/fonts/Gilroy-ExtraBoldItalic.ttf +0 -0
  70. /package/{src → dist}/fonts/Gilroy-Heavy.ttf +0 -0
  71. /package/{src → dist}/fonts/Gilroy-HeavyItalic.ttf +0 -0
  72. /package/{src → dist}/fonts/Gilroy-Light.ttf +0 -0
  73. /package/{src → dist}/fonts/Gilroy-LightItalic.ttf +0 -0
  74. /package/{src → dist}/fonts/Gilroy-Medium.ttf +0 -0
  75. /package/{src → dist}/fonts/Gilroy-MediumItalic.ttf +0 -0
  76. /package/{src → dist}/fonts/Gilroy-Regular.ttf +0 -0
  77. /package/{src → dist}/fonts/Gilroy-RegularItalic.ttf +0 -0
  78. /package/{src → dist}/fonts/Gilroy-SemiBold.ttf +0 -0
  79. /package/{src → dist}/fonts/Gilroy-SemiBoldItalic.ttf +0 -0
  80. /package/{src → dist}/fonts/Gilroy-Thin.ttf +0 -0
  81. /package/{src → dist}/fonts/Gilroy-ThinItalic.ttf +0 -0
  82. /package/{src → dist}/fonts/Gilroy-UltraLight.ttf +0 -0
  83. /package/{src → dist}/fonts/Gilroy-UltraLightItalic.ttf +0 -0
  84. /package/{src → dist}/fonts/Help - Guide Document.pdf +0 -0
  85. /package/{src → dist}/fonts/License.txt +0 -0
  86. /package/{src → dist}/fonts/More Free Fonts on fontshmonts.com.url +0 -0
  87. /package/{src → dist}/fonts/cover.jpg +0 -0
  88. /package/{src → dist}/index.css +0 -0
  89. /package/{src → dist}/login.css +0 -0
  90. /package/{src → dist}/logo.svg +0 -0
  91. /package/{src → dist}/styles.css +0 -0
  92. /package/{src → dist}/theme.css +0 -0
package/dist/App.js ADDED
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _react = _interopRequireWildcard(require("react"));
8
+ var _Login = _interopRequireDefault(require("./Login"));
9
+ var _Report = _interopRequireDefault(require("./Reports/Report"));
10
+ var _reactRouterDom = require("react-router-dom");
11
+ var _CourseReport = _interopRequireDefault(require("./Reports/CourseReport"));
12
+ var _ExamReport = _interopRequireDefault(require("./Reports/ExamReport"));
13
+ var _ExamPackReport = _interopRequireDefault(require("./Reports/ExamPackReport"));
14
+ var _TenantProvider = require("./context/TenantProvider");
15
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
16
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
17
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
18
+ // ADD THIS
19
+
20
+ const App = () => {
21
+ const userToken = localStorage.getItem("token");
22
+
23
+ // Configuration for API calls
24
+ const config = {
25
+ baseURL: process.env.REACT_APP_BASE_URL || 'http://192.168.2.203:8080/icleafreport',
26
+ tenantToken: 'tn_852cf0d3242a11f19d84005056575b50' // Your test token
27
+ };
28
+ return /*#__PURE__*/_react.default.createElement(_TenantProvider.TenantProvider, {
29
+ config: config
30
+ }, /*#__PURE__*/_react.default.createElement("div", {
31
+ className: "App"
32
+ }, /*#__PURE__*/_react.default.createElement(_reactRouterDom.HashRouter, null, /*#__PURE__*/_react.default.createElement(_reactRouterDom.Routes, null, /*#__PURE__*/_react.default.createElement(_reactRouterDom.Route, {
33
+ path: "/",
34
+ element: userToken != null ? /*#__PURE__*/_react.default.createElement(_Report.default, null) : /*#__PURE__*/_react.default.createElement(_Login.default, null)
35
+ }), /*#__PURE__*/_react.default.createElement(_reactRouterDom.Route, {
36
+ path: "/login",
37
+ element: userToken != null ? /*#__PURE__*/_react.default.createElement(_Report.default, null) : /*#__PURE__*/_react.default.createElement(_Login.default, null)
38
+ }), /*#__PURE__*/_react.default.createElement(_reactRouterDom.Route, {
39
+ path: "/report",
40
+ element: /*#__PURE__*/_react.default.createElement(_Report.default, null)
41
+ }), /*#__PURE__*/_react.default.createElement(_reactRouterDom.Route, {
42
+ path: "/coursereport",
43
+ element: /*#__PURE__*/_react.default.createElement(_CourseReport.default, null)
44
+ }), /*#__PURE__*/_react.default.createElement(_reactRouterDom.Route, {
45
+ path: "/examReport",
46
+ element: /*#__PURE__*/_react.default.createElement(_ExamReport.default, null)
47
+ }), /*#__PURE__*/_react.default.createElement(_reactRouterDom.Route, {
48
+ path: "/examPackReport",
49
+ element: /*#__PURE__*/_react.default.createElement(_ExamPackReport.default, null)
50
+ })))));
51
+ };
52
+ var _default = exports.default = App;
package/dist/Login.js ADDED
@@ -0,0 +1,177 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _react = _interopRequireWildcard(require("react"));
8
+ var _axios = _interopRequireDefault(require("axios"));
9
+ var _reactRouterDom = require("react-router-dom");
10
+ var _imagePathUrl = require("./components/imagePathUrl");
11
+ var _ri = require("react-icons/ri");
12
+ var _ai = require("react-icons/ai");
13
+ require("bootstrap/dist/css/bootstrap.css");
14
+ require("./login.css");
15
+ var _material = require("@mui/material");
16
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
17
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
18
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
19
+ // Correct import statement for useHistory
20
+
21
+ const Login = () => {
22
+ const [username, setUsername] = (0, _react.useState)('');
23
+ const [password, setPassword] = (0, _react.useState)('');
24
+ const [showPassword, setShowPassword] = (0, _react.useState)(false);
25
+ const [error, setError] = (0, _react.useState)('');
26
+ const [openAlert, setOpenAlert] = (0, _react.useState)(false);
27
+ const navigate = (0, _reactRouterDom.useNavigate)(); // Initialize useHistory
28
+
29
+ // const getSubDomain = () => {
30
+ // const hostname = window.location.hostname;
31
+ // const parts = hostname.split('.');
32
+ // if (parts.length > 2) {
33
+ // return parts [0];
34
+ // }
35
+ // }
36
+
37
+ const getSubDomain = () => {
38
+ const hostname = window.location.hostname;
39
+ console.log("Hostname:", hostname); // debug
40
+
41
+ // For localhost without subdomain
42
+ if (hostname === "localhost" || hostname === "127.0.0.1") {
43
+ return "icleaf";
44
+ }
45
+ const parts = hostname.split('.');
46
+ if (parts.length > 2) {
47
+ return parts[0]; // Returns subdomain
48
+ }
49
+
50
+ // If no subdomain found
51
+ return "icleaf";
52
+ };
53
+ const baseURL = process.env.REACT_APP_BASE_URL;
54
+ const handleLogin = async e => {
55
+ e.preventDefault();
56
+ const subdomain = getSubDomain();
57
+ try {
58
+ // const response = await axios.get(`${baseURL}` + "api/login?userName=" + username + "&password=" + password);
59
+ const response = await _axios.default.get(`${baseURL}api/login?userName=${username}&password=${password}&subdomain=${subdomain}`);
60
+ console.log(response, "response");
61
+ if (response.data) {
62
+ var res = response.data;
63
+ if (res == "User Not Found") {
64
+ setError(res);
65
+ setOpenAlert(true);
66
+ } else if (res == "UserName or Password cannot be empty") {
67
+ setError(res);
68
+ setOpenAlert(true);
69
+ } else {
70
+ localStorage.setItem("token", response.data);
71
+ localStorage.setItem("subdomain", subdomain);
72
+ navigate('/Report');
73
+ }
74
+ }
75
+ } catch (error) {
76
+ setError('User Not Found');
77
+ setOpenAlert(true);
78
+ }
79
+ };
80
+ const togglePasswordVisibility = () => {
81
+ setShowPassword(!showPassword);
82
+ };
83
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
84
+ className: "row page_container"
85
+ }, /*#__PURE__*/_react.default.createElement("div", {
86
+ className: "col-6 login_container1"
87
+ }, /*#__PURE__*/_react.default.createElement("img", {
88
+ className: "login_img",
89
+ src: _imagePathUrl.youngMan
90
+ })), /*#__PURE__*/_react.default.createElement("div", {
91
+ className: "col-6 login_container2_bg"
92
+ }, /*#__PURE__*/_react.default.createElement("div", {
93
+ className: "login_form_container"
94
+ }, /*#__PURE__*/_react.default.createElement("div", {
95
+ className: "logo_container"
96
+ }, /*#__PURE__*/_react.default.createElement("img", {
97
+ className: "logo_img",
98
+ src: _imagePathUrl.logo,
99
+ alt: "Login logo Image"
100
+ })), /*#__PURE__*/_react.default.createElement("text", {
101
+ className: "welcome_text"
102
+ }, "Welcome"), /*#__PURE__*/_react.default.createElement("form", {
103
+ onSubmit: handleLogin
104
+ }, /*#__PURE__*/_react.default.createElement("label", {
105
+ className: "login_label"
106
+ }, "Username"), /*#__PURE__*/_react.default.createElement("div", {
107
+ className: "input_contanier"
108
+ }, /*#__PURE__*/_react.default.createElement("div", {
109
+ className: "input_icons"
110
+ }, /*#__PURE__*/_react.default.createElement(_ri.RiMailLine, null)), /*#__PURE__*/_react.default.createElement("input", {
111
+ type: "username",
112
+ id: "username",
113
+ name: "username",
114
+ className: "input_box",
115
+ placeholder: "Username"
116
+ // onBlur={(e) => validateForm(e.target.value, language.enterUsername, "userName")}
117
+ ,
118
+ value: username,
119
+ onChange: e => {
120
+ setUsername(e.target.value);
121
+ // validateForm(e.target.value, language.enterUsername, "userName")
122
+ }
123
+ })), /*#__PURE__*/_react.default.createElement("label", {
124
+ className: "login_label"
125
+ }, "Password"), /*#__PURE__*/_react.default.createElement("div", {
126
+ className: "input_contanier"
127
+ }, /*#__PURE__*/_react.default.createElement("div", {
128
+ className: "input_icons"
129
+ }, /*#__PURE__*/_react.default.createElement(_ri.RiLockLine, null)), /*#__PURE__*/_react.default.createElement("input", {
130
+ type: showPassword ? "text" : "password",
131
+ id: "password",
132
+ name: "password",
133
+ className: "input_box"
134
+ // onBlur={(e) => validateForm(e.target.value, language.enterPass, "password")}
135
+ ,
136
+ placeholder: "Password",
137
+ value: password,
138
+ onChange: e => {
139
+ setPassword(e.target.value);
140
+ // validateForm(e.target.value, language.enterPass, "password")
141
+ },
142
+ style: {
143
+ userSelect: "none"
144
+ }
145
+ }), showPassword ? /*#__PURE__*/_react.default.createElement(_ai.AiOutlineEye, {
146
+ onClick: () => togglePasswordVisibility(),
147
+ className: "eye-icon_login"
148
+ }) : /*#__PURE__*/_react.default.createElement(_ai.AiOutlineEyeInvisible, {
149
+ onClick: () => togglePasswordVisibility(),
150
+ className: "eye-icon_login"
151
+ })), /*#__PURE__*/_react.default.createElement("div", {
152
+ className: "login_btn_container"
153
+ }, /*#__PURE__*/_react.default.createElement(_material.Button, {
154
+ variant: "contained",
155
+ style: {
156
+ width: "100%",
157
+ marginTop: "15px",
158
+ padding: "10px"
159
+ },
160
+ type: "submit"
161
+ }, "Login"))))), /*#__PURE__*/_react.default.createElement(_material.Snackbar, {
162
+ open: openAlert,
163
+ autoHideDuration: 6000,
164
+ onClose: () => setOpenAlert(false),
165
+ anchorOrigin: {
166
+ vertical: 'top',
167
+ horizontal: 'center'
168
+ }
169
+ }, /*#__PURE__*/_react.default.createElement(_material.Alert, {
170
+ onClose: () => setOpenAlert(false),
171
+ severity: "info",
172
+ sx: {
173
+ width: '30%'
174
+ }
175
+ }, error))));
176
+ };
177
+ var _default = exports.default = Login;
@@ -0,0 +1,243 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _react = _interopRequireWildcard(require("react"));
8
+ var _axios = _interopRequireDefault(require("axios"));
9
+ var _material = require("@mui/material");
10
+ var _reactRouterDom = require("react-router-dom");
11
+ var _Header = _interopRequireDefault(require("../components/Header"));
12
+ var _sidebar = _interopRequireDefault(require("../components/sidebar"));
13
+ require("../App.css");
14
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
15
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
16
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
17
+ function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
18
+ function CourseReport() {
19
+ const [token, setToken] = (0, _react.useState)(localStorage.getItem("token"));
20
+ const navigate = (0, _reactRouterDom.useNavigate)();
21
+ const [subjects, setSubjects] = (0, _react.useState)([]);
22
+ const [courses, setCourses] = (0, _react.useState)([]);
23
+ const [selectedSubject, setSelectedSubject] = (0, _react.useState)(null);
24
+ const [selectedCourse, setSelectedCourse] = (0, _react.useState)(null);
25
+ const [reportTypes] = (0, _react.useState)(['Summary', 'Daywise']);
26
+ const [selectedReportType, setSelectedReportType] = (0, _react.useState)(null);
27
+ const [alertMessage, setAlertMessage] = (0, _react.useState)('');
28
+ const [loading, setLoading] = (0, _react.useState)(false);
29
+ const [alertOpen, setAlertOpen] = (0, _react.useState)(false);
30
+ const baseURL = process.env.REACT_APP_BASE_URL;
31
+ (0, _react.useEffect)(() => {
32
+ if (token == null) {
33
+ navigate("/login");
34
+ } else {
35
+ fetchAllSubjects();
36
+ }
37
+ }, []);
38
+ const fetchAllSubjects = async () => {
39
+ try {
40
+ const response = await (0, _axios.default)({
41
+ method: "get",
42
+ url: `${baseURL}api/showAllSubjects`,
43
+ headers: {
44
+ Authorization: `Bearer ${token}`
45
+ }
46
+ });
47
+ setSubjects(response.data);
48
+ } catch (error) {
49
+ console.error('Error fetching subjects:', error);
50
+ }
51
+ };
52
+ const fetchCourses = async subjectId => {
53
+ try {
54
+ const response = await (0, _axios.default)({
55
+ method: "get",
56
+ params: {
57
+ subjectId
58
+ },
59
+ url: `${baseURL}api/getCoursesBySubject`,
60
+ headers: {
61
+ Authorization: `Bearer ${token}`
62
+ }
63
+ });
64
+ setCourses(response.data);
65
+ } catch (error) {
66
+ console.error('Error fetching courses:', error);
67
+ }
68
+ };
69
+ const handleSubjectChange = (event, newValue) => {
70
+ setSelectedSubject(newValue);
71
+ setSelectedCourse(null);
72
+ setCourses([]);
73
+ if (newValue) {
74
+ fetchCourses(newValue.subjectId);
75
+ }
76
+ };
77
+ const handleCourseChange = (event, newValue) => {
78
+ setSelectedCourse(newValue);
79
+ };
80
+ const handleReportTypeChange = (event, newValue) => {
81
+ setSelectedReportType(newValue);
82
+ };
83
+ const handleDownload = async () => {
84
+ setLoading(true);
85
+ try {
86
+ let url;
87
+ if (selectedReportType === 'Summary') {
88
+ url = `${baseURL}api/downloadUserCorpCourseExcel?corpCourseId=${selectedCourse.id}`;
89
+ } else if (selectedReportType === 'Daywise') {
90
+ url = `${baseURL}api/downloadUserCorpCourseExcelDayWise?corpCourseId=${selectedCourse.id}`;
91
+ }
92
+ const response = await _axios.default.get(url, {
93
+ responseType: 'blob',
94
+ headers: {
95
+ Authorization: `Bearer ${token}`
96
+ }
97
+ });
98
+ const contentDisposition = response.headers['content-disposition'];
99
+ const text = await response.data.text();
100
+ if (text.includes('Course not configured')) {
101
+ setAlertMessage('Course not configured.');
102
+ setAlertOpen(true);
103
+ } else {
104
+ const filename = 'course_report.xlsx';
105
+ const blob = new Blob([response.data], {
106
+ type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
107
+ });
108
+ const blobUrl = URL.createObjectURL(blob);
109
+ const link = document.createElement('a');
110
+ link.href = blobUrl;
111
+ link.setAttribute('download', filename);
112
+ document.body.appendChild(link);
113
+ link.click();
114
+ link.parentNode.removeChild(link);
115
+ URL.revokeObjectURL(blobUrl);
116
+ }
117
+ } catch (error) {
118
+ console.error('Error downloading course report:', error);
119
+ } finally {
120
+ setLoading(false);
121
+ }
122
+ };
123
+ return /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_Header.default, null), /*#__PURE__*/_react.default.createElement(_sidebar.default, null), /*#__PURE__*/_react.default.createElement("div", {
124
+ style: {
125
+ padding: "100px 0px 0px 100px",
126
+ marginLeft: "140px"
127
+ }
128
+ }, /*#__PURE__*/_react.default.createElement(_material.Box, {
129
+ sx: {
130
+ maxWidth: 800,
131
+ mx: 'auto',
132
+ my: 4,
133
+ p: 3,
134
+ backgroundColor: '#f5f5f5',
135
+ borderRadius: 2
136
+ }
137
+ }, /*#__PURE__*/_react.default.createElement(_material.Paper, {
138
+ elevation: 6,
139
+ sx: {
140
+ p: 5,
141
+ textAlign: 'center',
142
+ backgroundColor: '#fff'
143
+ }
144
+ }, /*#__PURE__*/_react.default.createElement(_material.Typography, {
145
+ variant: "h4",
146
+ component: "h1",
147
+ gutterBottom: true,
148
+ sx: {
149
+ color: '#3f51b5',
150
+ marginBottom: "20px"
151
+ }
152
+ }, "Course Report"), /*#__PURE__*/_react.default.createElement(_material.Grid, {
153
+ container: true,
154
+ spacing: 2,
155
+ justifyContent: "center"
156
+ }, /*#__PURE__*/_react.default.createElement(_material.Grid, {
157
+ item: true,
158
+ xs: 12,
159
+ sm: 4
160
+ }, /*#__PURE__*/_react.default.createElement(_material.FormControl, {
161
+ fullWidth: true
162
+ }, /*#__PURE__*/_react.default.createElement(_material.Autocomplete, {
163
+ id: "ddlSubject",
164
+ options: subjects,
165
+ getOptionLabel: option => option.subjectName,
166
+ value: selectedSubject,
167
+ onChange: handleSubjectChange,
168
+ renderInput: params => /*#__PURE__*/_react.default.createElement(_material.TextField, _extends({}, params, {
169
+ label: "Subject"
170
+ }))
171
+ }))), /*#__PURE__*/_react.default.createElement(_material.Grid, {
172
+ item: true,
173
+ xs: 12,
174
+ sm: 4
175
+ }, /*#__PURE__*/_react.default.createElement(_material.FormControl, {
176
+ fullWidth: true
177
+ }, /*#__PURE__*/_react.default.createElement(_material.Autocomplete, {
178
+ id: "ddlCourse",
179
+ options: courses,
180
+ getOptionLabel: option => option.courseName,
181
+ value: selectedCourse,
182
+ onChange: handleCourseChange,
183
+ renderInput: params => /*#__PURE__*/_react.default.createElement(_material.TextField, _extends({}, params, {
184
+ label: "Course"
185
+ }))
186
+ }))), /*#__PURE__*/_react.default.createElement(_material.Grid, {
187
+ item: true,
188
+ xs: 12,
189
+ sm: 4
190
+ }, /*#__PURE__*/_react.default.createElement(_material.FormControl, {
191
+ fullWidth: true
192
+ }, /*#__PURE__*/_react.default.createElement(_material.Autocomplete, {
193
+ id: "ddlReportType",
194
+ options: reportTypes,
195
+ getOptionLabel: option => option,
196
+ value: selectedReportType,
197
+ onChange: handleReportTypeChange,
198
+ renderInput: params => /*#__PURE__*/_react.default.createElement(_material.TextField, _extends({}, params, {
199
+ label: "Report Type"
200
+ }))
201
+ })))), /*#__PURE__*/_react.default.createElement(_material.Box, {
202
+ sx: {
203
+ mt: 3,
204
+ position: 'relative'
205
+ }
206
+ }, /*#__PURE__*/_react.default.createElement(_material.Button, {
207
+ variant: "contained",
208
+ color: "primary",
209
+ onClick: handleDownload,
210
+ disabled: !selectedSubject || !selectedCourse || !selectedReportType || loading,
211
+ sx: {
212
+ width: 'auto',
213
+ backgroundColor: '#3f51b5',
214
+ '&:hover': {
215
+ backgroundColor: '#303f9f'
216
+ }
217
+ }
218
+ }, loading ? 'Downloading...' : 'Download Report'), loading && /*#__PURE__*/_react.default.createElement(_material.CircularProgress, {
219
+ size: 24,
220
+ sx: {
221
+ position: 'absolute',
222
+ top: '50%',
223
+ left: '50%',
224
+ marginTop: '-12px',
225
+ marginLeft: '-12px'
226
+ }
227
+ })))), /*#__PURE__*/_react.default.createElement(_material.Snackbar, {
228
+ open: alertOpen,
229
+ autoHideDuration: 6000,
230
+ onClose: () => setAlertOpen(false),
231
+ anchorOrigin: {
232
+ vertical: 'top',
233
+ horizontal: 'center'
234
+ }
235
+ }, /*#__PURE__*/_react.default.createElement(_material.Alert, {
236
+ onClose: () => setAlertOpen(false),
237
+ severity: "info",
238
+ sx: {
239
+ width: '100%'
240
+ }
241
+ }, alertMessage))));
242
+ }
243
+ var _default = exports.default = CourseReport;