touchstudy-core 0.1.168 → 0.1.169

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 (45) hide show
  1. package/dist/components/Selectors/StudentSelector.d.ts +3 -1
  2. package/dist/components/Selectors/TeacherSelector.d.ts +15 -0
  3. package/dist/containers/Announcements/apiClients/announcementService.d.ts +5 -0
  4. package/dist/containers/Announcements/components/AnnouncementItem.d.ts +11 -0
  5. package/dist/containers/Announcements/configs/constants.d.ts +3 -0
  6. package/dist/containers/Announcements/configs/enums.d.ts +8 -0
  7. package/dist/containers/Announcements/configs/fns.d.ts +10 -0
  8. package/dist/containers/Announcements/configs/types.d.ts +24 -0
  9. package/dist/containers/Announcements/configs/utils.d.ts +3 -0
  10. package/dist/containers/Announcements/index.d.ts +5 -0
  11. package/dist/containers/Announcements/views/AnnouncementContainer.d.ts +10 -0
  12. package/dist/containers/Announcements/views/AnnouncementList.d.ts +12 -0
  13. package/dist/containers/Notes/components/GeneralNoteDialog.d.ts +4 -0
  14. package/dist/containers/Notes/components/NoteItemList.d.ts +14 -0
  15. package/dist/containers/Notes/components/NotetabPanel.d.ts +8 -0
  16. package/dist/containers/Notes/components/TeacherAdminNoteDialog.d.ts +4 -0
  17. package/dist/containers/Notes/configs/constants.d.ts +27 -0
  18. package/dist/containers/Notes/configs/enums.d.ts +6 -2
  19. package/dist/containers/Notes/configs/fns.d.ts +2 -0
  20. package/dist/containers/Notes/configs/interfaces.d.ts +10 -1
  21. package/dist/containers/Notes/configs/types.d.ts +1 -1
  22. package/dist/containers/Notes/index.d.ts +4 -2
  23. package/dist/containers/Notes/views/NoteList.d.ts +11 -0
  24. package/dist/containers/Notes/views/NoteTabs.d.ts +7 -0
  25. package/dist/containers/StudentInfoDrawer/components/Exam/ExamResultList.d.ts +4 -0
  26. package/dist/containers/StudentInfoDrawer/components/Note/NoteDrawer.d.ts +3 -2
  27. package/dist/containers/StudentInfoDrawer/configs/types.d.ts +2 -2
  28. package/dist/containers/StudentInfoDrawer/index.d.ts +2 -1
  29. package/dist/containers/Textbooks/configs/types.d.ts +3 -3
  30. package/dist/containers/index.d.ts +1 -0
  31. package/dist/index.js +1713 -226
  32. package/dist/index.js.map +1 -1
  33. package/dist/index.modern.js +1722 -237
  34. package/dist/index.modern.js.map +1 -1
  35. package/dist/layouts/Header.d.ts +3 -0
  36. package/dist/layouts/LayoutContext.d.ts +0 -1
  37. package/dist/redux/commons/action.d.ts +1 -1
  38. package/dist/services/noteService.d.ts +2 -0
  39. package/dist/services/teacherService.d.ts +5 -0
  40. package/dist/utils/functions/timeAgo.d.ts +1 -1
  41. package/dist/utils/hooks/useLayoutContext.d.ts +1 -1
  42. package/dist/utils/hooks/useList.d.ts +2 -1
  43. package/dist/utils/hooks/useVirtualList.d.ts +4 -2
  44. package/dist/utils/types/note.d.ts +17 -0
  45. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -57,19 +57,20 @@ var LocalizationProvider = require('@mui/x-date-pickers/LocalizationProvider');
57
57
  var DatePicker = require('@mui/x-date-pickers/DatePicker');
58
58
  var fa6 = require('react-icons/fa6');
59
59
  var cg = require('react-icons/cg');
60
+ var hi = require('react-icons/hi');
61
+ var TableCell = _interopDefault(require('@mui/material/TableCell'));
62
+ var TableRow = _interopDefault(require('@mui/material/TableRow'));
60
63
  var html2pdf = _interopDefault(require('html2pdf.js'));
61
64
  var Slider = _interopDefault(require('react-slick'));
62
65
  var gr = require('react-icons/gr');
63
- var hi = require('react-icons/hi');
64
66
  var Table = _interopDefault(require('@mui/material/Table'));
65
67
  var TableBody = _interopDefault(require('@mui/material/TableBody'));
66
- var TableCell = _interopDefault(require('@mui/material/TableCell'));
67
68
  var TableHead = _interopDefault(require('@mui/material/TableHead'));
68
- var TableRow = _interopDefault(require('@mui/material/TableRow'));
69
69
  var reactHookForm = require('react-hook-form');
70
70
  var yup$1 = require('@hookform/resolvers/yup');
71
71
  var pi = require('react-icons/pi');
72
72
  var Container = _interopDefault(require('@mui/material/Container'));
73
+ var bs = require('react-icons/bs');
73
74
  var Popover = _interopDefault(require('@mui/material/Popover'));
74
75
  var MenuItem = _interopDefault(require('@mui/material/MenuItem'));
75
76
  var go = require('react-icons/go');
@@ -278,7 +279,7 @@ var setLanguage = toolkit.createAction("common/setLanguage");
278
279
  var reset = toolkit.createAction("common/reset");
279
280
  var setReFetchUserAcademies = toolkit.createAction("common/setReFetchUserAcademies");
280
281
  var setConcurrentConnectionPusher = toolkit.createAction("common/setConcurrentConnectionPusher");
281
- var setReadyRegisterPusher = toolkit.createAction("common/setReadyRegisterPusher");
282
+ var setTotalUnreadMessages = toolkit.createAction("common/setTotalUnreadMessages");
282
283
 
283
284
  var initialState = {
284
285
  isLoading: false,
@@ -288,8 +289,8 @@ var initialState = {
288
289
  },
289
290
  user: null,
290
291
  academy: null,
292
+ totalUnreadMessages: 0,
291
293
  isReFetchUserAcademies: false,
292
- isReadyRegisterPusher: false,
293
294
  concurrentConnectionPusher: {
294
295
  pusher: null,
295
296
  academyDomain: "",
@@ -315,8 +316,8 @@ var commonReducer = toolkit.createReducer(initialState, function (builder) {
315
316
  state.concurrentConnectionPusher.pusher = action.payload.pusher;
316
317
  state.concurrentConnectionPusher.academyDomain = action.payload.academyDomain;
317
318
  state.concurrentConnectionPusher.isRegistered = action.payload.isRegistered;
318
- }).addCase(setReadyRegisterPusher, function (state, action) {
319
- state.isReadyRegisterPusher = action.payload;
319
+ }).addCase(setTotalUnreadMessages, function (state, action) {
320
+ state.totalUnreadMessages = action.payload;
320
321
  });
321
322
  });
322
323
 
@@ -1340,6 +1341,12 @@ var please_reload_this_page_to_continue_using_this_tab_or_close_it = "이 탭을
1340
1341
  var reload_page = "페이지 새로고침";
1341
1342
  var last_attendance_date = "마지막 출석일자";
1342
1343
  var less_than_a_day = "하루 미만";
1344
+ var less_than_a_min = "1분 미만";
1345
+ var just_now = "방금 전";
1346
+ var n_mins_ago = "{{min}}분 전";
1347
+ var n_hours_ago = "{{hour}}시간 전";
1348
+ var one_min_ago = "1분 전";
1349
+ var one_hour_ago = "1시간 전";
1343
1350
  var n_days_ago = "{{day}}일 전";
1344
1351
  var n_months_ago = "{{month}}개월 전";
1345
1352
  var n_years_ago = "{{year}}년 전";
@@ -1509,6 +1516,22 @@ var next_status = "다음 상태";
1509
1516
  var arrival_time = "도착 시간";
1510
1517
  var current_arrival_time = "현재 도착 시간";
1511
1518
  var uppdate_attendance = "출석 현황 수정";
1519
+ var you_have_n_unread_messages = "읽지 않은 메시지가 {{ n }}개 있습니다";
1520
+ var receivers = "수신자";
1521
+ var total_receivers = "총 수신자";
1522
+ var sender = "보내는 사람";
1523
+ var manage_notes = "메모 관리";
1524
+ var notes = "노트";
1525
+ var new_note = "새 노트";
1526
+ var mark_as_read = "읽은 것으로 표시";
1527
+ var view_notes = "노트 보기";
1528
+ var admin_n = "{{admin}} 관리자";
1529
+ var teacher_n = "{{teacher}} 교사";
1530
+ var sent_a_memo = "메모를 보냈습니다";
1531
+ var admin_to_admin = "관리자에서 관리자에게";
1532
+ var teacher_to_admin = "교사에서 관리자에게";
1533
+ var admin_to_teachers = "관리자에서 교사들에게";
1534
+ var teacher_to_teachers = "교사에서 교사들에게";
1512
1535
  var lang_ko = {
1513
1536
  problem_solving: problem_solving,
1514
1537
  my_story: my_story,
@@ -2490,6 +2513,12 @@ var lang_ko = {
2490
2513
  reload_page: reload_page,
2491
2514
  last_attendance_date: last_attendance_date,
2492
2515
  less_than_a_day: less_than_a_day,
2516
+ less_than_a_min: less_than_a_min,
2517
+ just_now: just_now,
2518
+ n_mins_ago: n_mins_ago,
2519
+ n_hours_ago: n_hours_ago,
2520
+ one_min_ago: one_min_ago,
2521
+ one_hour_ago: one_hour_ago,
2493
2522
  n_days_ago: n_days_ago,
2494
2523
  n_months_ago: n_months_ago,
2495
2524
  n_years_ago: n_years_ago,
@@ -2654,7 +2683,23 @@ var lang_ko = {
2654
2683
  next_status: next_status,
2655
2684
  arrival_time: arrival_time,
2656
2685
  current_arrival_time: current_arrival_time,
2657
- uppdate_attendance: uppdate_attendance
2686
+ uppdate_attendance: uppdate_attendance,
2687
+ you_have_n_unread_messages: you_have_n_unread_messages,
2688
+ receivers: receivers,
2689
+ total_receivers: total_receivers,
2690
+ sender: sender,
2691
+ manage_notes: manage_notes,
2692
+ notes: notes,
2693
+ new_note: new_note,
2694
+ mark_as_read: mark_as_read,
2695
+ view_notes: view_notes,
2696
+ admin_n: admin_n,
2697
+ teacher_n: teacher_n,
2698
+ sent_a_memo: sent_a_memo,
2699
+ admin_to_admin: admin_to_admin,
2700
+ teacher_to_admin: teacher_to_admin,
2701
+ admin_to_teachers: admin_to_teachers,
2702
+ teacher_to_teachers: teacher_to_teachers
2658
2703
  };
2659
2704
 
2660
2705
  var problem_solving$1 = "Problem Solving";
@@ -3653,6 +3698,12 @@ var please_reload_this_page_to_continue_using_this_tab_or_close_it$1 = "Please r
3653
3698
  var reload_page$1 = "Reload page";
3654
3699
  var last_attendance_date$1 = "Last attendance date";
3655
3700
  var less_than_a_day$1 = "Less than a day";
3701
+ var less_than_a_min$1 = "Less than a minute";
3702
+ var just_now$1 = "Just now";
3703
+ var n_mins_ago$1 = "{{min}} minutes ago";
3704
+ var n_hours_ago$1 = "{{hour}} hours ago";
3705
+ var one_min_ago$1 = "one minute ago";
3706
+ var one_hour_ago$1 = "one hour ago";
3656
3707
  var n_days_ago$1 = "{{day}} days ago";
3657
3708
  var n_months_ago$1 = "{{month}} months ago";
3658
3709
  var n_years_ago$1 = "{{year}} years ago";
@@ -3823,6 +3874,22 @@ var next_status$1 = "Next status";
3823
3874
  var arrival_time$1 = "Arrival time";
3824
3875
  var current_arrival_time$1 = "Current arrival time";
3825
3876
  var uppdate_attendance$1 = "Update attendance";
3877
+ var you_have_n_unread_messages$1 = "You have {{ n }} unread message(s)";
3878
+ var receivers$1 = "Receivers";
3879
+ var total_receivers$1 = "Total receivers";
3880
+ var sender$1 = "Sender";
3881
+ var manage_notes$1 = "Manage notes";
3882
+ var notes$1 = "Notes";
3883
+ var new_note$1 = "New note";
3884
+ var mark_as_read$1 = "Mark as read";
3885
+ var view_notes$1 = "View notes";
3886
+ var admin_n$1 = "Admin {{admin}}";
3887
+ var teacher_n$1 = "Teacher {{teacher}}";
3888
+ var sent_a_memo$1 = "sent a memo";
3889
+ var admin_to_admin$1 = "Admin to admin";
3890
+ var teacher_to_admin$1 = "Teacher to admin";
3891
+ var admin_to_teachers$1 = "Admin to teachers";
3892
+ var teacher_to_teachers$1 = "Teacher to teachers";
3826
3893
  var lang_en = {
3827
3894
  problem_solving: problem_solving$1,
3828
3895
  my_story: my_story$1,
@@ -4805,6 +4872,12 @@ var lang_en = {
4805
4872
  reload_page: reload_page$1,
4806
4873
  last_attendance_date: last_attendance_date$1,
4807
4874
  less_than_a_day: less_than_a_day$1,
4875
+ less_than_a_min: less_than_a_min$1,
4876
+ just_now: just_now$1,
4877
+ n_mins_ago: n_mins_ago$1,
4878
+ n_hours_ago: n_hours_ago$1,
4879
+ one_min_ago: one_min_ago$1,
4880
+ one_hour_ago: one_hour_ago$1,
4808
4881
  n_days_ago: n_days_ago$1,
4809
4882
  n_months_ago: n_months_ago$1,
4810
4883
  n_years_ago: n_years_ago$1,
@@ -4970,7 +5043,23 @@ var lang_en = {
4970
5043
  next_status: next_status$1,
4971
5044
  arrival_time: arrival_time$1,
4972
5045
  current_arrival_time: current_arrival_time$1,
4973
- uppdate_attendance: uppdate_attendance$1
5046
+ uppdate_attendance: uppdate_attendance$1,
5047
+ you_have_n_unread_messages: you_have_n_unread_messages$1,
5048
+ receivers: receivers$1,
5049
+ total_receivers: total_receivers$1,
5050
+ sender: sender$1,
5051
+ manage_notes: manage_notes$1,
5052
+ notes: notes$1,
5053
+ new_note: new_note$1,
5054
+ mark_as_read: mark_as_read$1,
5055
+ view_notes: view_notes$1,
5056
+ admin_n: admin_n$1,
5057
+ teacher_n: teacher_n$1,
5058
+ sent_a_memo: sent_a_memo$1,
5059
+ admin_to_admin: admin_to_admin$1,
5060
+ teacher_to_admin: teacher_to_admin$1,
5061
+ admin_to_teachers: admin_to_teachers$1,
5062
+ teacher_to_teachers: teacher_to_teachers$1
4974
5063
  };
4975
5064
 
4976
5065
  i18n__default.use(reactI18next.initReactI18next).init({
@@ -6134,8 +6223,12 @@ var NoteSortColumn;
6134
6223
  NoteSortColumn["Question"] = "Question";
6135
6224
  })(NoteSortColumn || (NoteSortColumn = {}));
6136
6225
  (function (NoteType) {
6137
- NoteType[NoteType["Default"] = 0] = "Default";
6138
- NoteType[NoteType["StudentReadable"] = 1] = "StudentReadable";
6226
+ NoteType[NoteType["ToAcademy"] = 0] = "ToAcademy";
6227
+ NoteType[NoteType["ToStudent"] = 1] = "ToStudent";
6228
+ NoteType[NoteType["AdminToAllAdmin"] = 2] = "AdminToAllAdmin";
6229
+ NoteType[NoteType["AdminToAllTeacher"] = 3] = "AdminToAllTeacher";
6230
+ NoteType[NoteType["TeacherToAllAdmin"] = 4] = "TeacherToAllAdmin";
6231
+ NoteType[NoteType["TeacherToTeachers"] = 5] = "TeacherToTeachers";
6139
6232
  })(exports.NoteType || (exports.NoteType = {}));
6140
6233
 
6141
6234
  var SchoolType;
@@ -6305,16 +6398,35 @@ var pushTo = function pushTo(history, data, isReplace) {
6305
6398
  });
6306
6399
  };
6307
6400
 
6308
- var timAgo = function timAgo(date, t) {
6309
- if (date === DATE_MIN_VALUE || date === DATE_TIME_MIN_VALUE) return '';
6401
+ var timAgo = function timAgo(date, t, day) {
6402
+ if (!date || date === DATE_MIN_VALUE || date === DATE_TIME_MIN_VALUE) return '';
6310
6403
  var time = moment.utc(date).local();
6404
+ var years = moment().diff(time, 'years');
6405
+ if (years >= 1) return years >= 2 ? t('n_years_ago', {
6406
+ year: years
6407
+ }) : t("one_year_ago");
6408
+ var months = moment().diff(time, 'months');
6409
+ if (months >= 1) return months >= 2 ? t('n_months_ago', {
6410
+ month: months
6411
+ }) : t("one_month_ago");
6311
6412
  var days = moment().diff(time, 'days');
6312
- if (days === 0) return t('less_than_a_day');
6313
- var months = days / 30;
6314
- var years = months / 12;
6315
- if (years > 0) return years > 1 ? t('n_years_ago') : t("one_year_ago");
6316
- if (months > 0) return months > 1 ? t('n_months_ago') : t("one_month_ago");
6317
- return days > 1 ? t('n_days_ago') : t("one_day_ago");
6413
+ if (days < 1 && !day) return t('less_than_a_day');
6414
+ if (days < 1 && day) {
6415
+ var hours = moment().diff(time, 'hours');
6416
+ if (hours >= 1) return hours >= 2 ? t('n_hours_ago', {
6417
+ hour: hours
6418
+ }) : t("one_hour_ago");
6419
+ var mins = moment().diff(time, 'minutes');
6420
+ if (mins >= 1) return mins >= 2 ? t('n_mins_ago', {
6421
+ min: mins
6422
+ }) : t("one_min_ago");
6423
+ var secs = moment().diff(time, 'seconds');
6424
+ if (secs > 10) return t('less_than_a_min');
6425
+ return t("just_now");
6426
+ }
6427
+ return days >= 2 ? t('n_days_ago', {
6428
+ day: days
6429
+ }) : t("one_day_ago");
6318
6430
  };
6319
6431
 
6320
6432
  var toISOString = (function (time) {
@@ -6904,7 +7016,10 @@ var useLanguage = function useLanguage(history, init) {
6904
7016
  };
6905
7017
  };
6906
7018
 
6907
- var useList = function useList(fetchData, defaultQuery) {
7019
+ var useList = function useList(fetchData, defaultQuery, showLoading) {
7020
+ if (showLoading === void 0) {
7021
+ showLoading = true;
7022
+ }
6908
7023
  var dispatch = reactRedux.useDispatch();
6909
7024
  var _useState = React.useState(defaultQuery),
6910
7025
  filter = _useState[0],
@@ -6918,6 +7033,9 @@ var useList = function useList(fetchData, defaultQuery) {
6918
7033
  var _useState4 = React.useState(),
6919
7034
  selectedItem = _useState4[0],
6920
7035
  setSelectedItem = _useState4[1];
7036
+ var _useState5 = React.useState(false),
7037
+ isLoading = _useState5[0],
7038
+ setIsLoading = _useState5[1];
6921
7039
  var textSearchRef = React.useRef(null);
6922
7040
  var isFirstLoadRef = React.useRef(true);
6923
7041
  var _useTranslation = reactI18next.useTranslation(),
@@ -6931,11 +7049,13 @@ var useList = function useList(fetchData, defaultQuery) {
6931
7049
  }
6932
7050
  try {
6933
7051
  var _temp2 = function _temp2() {
6934
- isLoading && dispatch(setLoading(false));
7052
+ isLoading && showLoading && dispatch(setLoading(false));
7053
+ setIsLoading(false);
6935
7054
  };
6936
7055
  if (!fetchData) return Promise.resolve();
6937
7056
  if (isFirstLoadRef.current) isFirstLoadRef.current = false;
6938
- isLoading && dispatch(setLoading(true));
7057
+ isLoading && showLoading && dispatch(setLoading(true));
7058
+ setIsLoading(true);
6939
7059
  var _temp = _catch(function () {
6940
7060
  return Promise.resolve(fetchData(filter)).then(function (res) {
6941
7061
  var _res$data$items = res.data.items,
@@ -6960,10 +7080,6 @@ var useList = function useList(fetchData, defaultQuery) {
6960
7080
  };
6961
7081
  var handleSort = function handleSort(sortColumnName) {
6962
7082
  var sortColumnDirection = exports.OrderType.ASC;
6963
- console.log({
6964
- sortColumnName: typeof sortColumnName,
6965
- filter: typeof filter.sortColumnName
6966
- });
6967
7083
  if (filter.sortColumnName == sortColumnName && filter.sortColumnDirection === exports.OrderType.ASC) sortColumnDirection = exports.OrderType.DESC;
6968
7084
  setFilter(_extends({}, filter, {
6969
7085
  sortColumnName: sortColumnName,
@@ -6996,6 +7112,7 @@ var useList = function useList(fetchData, defaultQuery) {
6996
7112
  getData(isFirstLoadRef.current);
6997
7113
  }, [JSON.stringify(filter)]);
6998
7114
  return {
7115
+ isLoading: isLoading,
6999
7116
  filter: filter,
7000
7117
  textSearchRef: textSearchRef,
7001
7118
  paging: paging,
@@ -7098,36 +7215,26 @@ var useLogin = function useLogin(history, homeAcademyUrl, homeUrl, registerUrl,
7098
7215
  }
7099
7216
  var isAcademy = !!academyDomain || isLearningSpace;
7100
7217
  return Promise.resolve(handleLogin(function () {
7101
- return new Promise(function (resolve, reject) {
7102
- try {
7103
- var _temp3 = _catch(function () {
7104
- return Promise.resolve(isAcademy ? apiLoginGoogle(data, isLearningSpace) : apiLoginGoogleSuperAdmin(data)).then(function (loginResponse) {
7105
- function _temp2() {
7106
- resolve(result);
7107
- }
7108
- var result = loginResponse.data;
7109
- var _temp = function () {
7110
- if (loginResponse.status === 204 && academyDomain) {
7111
- localStorage.removeItem(ACADEMY_DOMAIN);
7112
- localStorage.removeItem(LEARNING_SPACE);
7113
- return Promise.resolve(apiLoginGoogleSuperAdmin(data)).then(function (_apiLoginGoogleSuperA) {
7114
- loginResponse = _apiLoginGoogleSuperA;
7115
- result = loginResponse.data;
7116
- });
7117
- }
7118
- }();
7119
- return _temp && _temp.then ? _temp.then(_temp2) : _temp2(_temp);
7120
- });
7121
- }, function (error) {
7122
- !!academyDomain && localStorage.removeItem(ACADEMY_DOMAIN);
7123
- localStorage.removeItem(LEARNING_SPACE);
7124
- reject(error);
7125
- });
7126
- return Promise.resolve(_temp3 && _temp3.then ? _temp3.then(function () {}) : void 0);
7127
- } catch (e) {
7128
- return Promise.reject(e);
7129
- }
7130
- });
7218
+ try {
7219
+ return Promise.resolve(isAcademy ? apiLoginGoogle(data, isLearningSpace) : apiLoginGoogleSuperAdmin(data)).then(function (loginResponse) {
7220
+ var result = loginResponse.data;
7221
+ var _temp = function () {
7222
+ if (loginResponse.status === 204 && academyDomain) {
7223
+ localStorage.removeItem(ACADEMY_DOMAIN);
7224
+ localStorage.removeItem(LEARNING_SPACE);
7225
+ return Promise.resolve(apiLoginGoogleSuperAdmin(data)).then(function (_apiLoginGoogleSuperA) {
7226
+ loginResponse = _apiLoginGoogleSuperA;
7227
+ result = loginResponse.data;
7228
+ });
7229
+ }
7230
+ }();
7231
+ return _temp && _temp.then ? _temp.then(function () {
7232
+ return result;
7233
+ }) : result;
7234
+ });
7235
+ } catch (e) {
7236
+ return Promise.reject(e);
7237
+ }
7131
7238
  }, isStudent, isLogout)).then(function () {});
7132
7239
  } catch (e) {
7133
7240
  return Promise.reject(e);
@@ -7140,21 +7247,14 @@ var useLogin = function useLogin(history, homeAcademyUrl, homeUrl, registerUrl,
7140
7247
  try {
7141
7248
  var isStudent = data.role === exports.Role.Student;
7142
7249
  return Promise.resolve(handleLogin(function () {
7143
- return new Promise(function (resolve, reject) {
7144
- try {
7145
- var _temp4 = _catch(function () {
7146
- return Promise.resolve(!isLearningSpace && !domain ? apiLoginSuperAdminWithAccessToken(data) : apiLoginWithAccessToken(data, isLearningSpace, domain)).then(function (loginResponse) {
7147
- var result = loginResponse.data;
7148
- resolve(result);
7149
- });
7150
- }, function (error) {
7151
- reject(error);
7152
- });
7153
- return Promise.resolve(_temp4 && _temp4.then ? _temp4.then(function () {}) : void 0);
7154
- } catch (e) {
7155
- return Promise.reject(e);
7156
- }
7157
- });
7250
+ try {
7251
+ return Promise.resolve(!isLearningSpace && !domain ? apiLoginSuperAdminWithAccessToken(data) : apiLoginWithAccessToken(data, isLearningSpace, domain)).then(function (loginResponse) {
7252
+ var result = loginResponse.data;
7253
+ return result;
7254
+ });
7255
+ } catch (e) {
7256
+ return Promise.reject(e);
7257
+ }
7158
7258
  }, isStudent, isLogout, superAdminRedirectPath)).then(function () {});
7159
7259
  } catch (e) {
7160
7260
  return Promise.reject(e);
@@ -7165,13 +7265,13 @@ var useLogin = function useLogin(history, homeAcademyUrl, homeUrl, registerUrl,
7165
7265
  isLogout = true;
7166
7266
  }
7167
7267
  try {
7168
- var _temp6 = function _temp6(_result) {
7268
+ var _temp3 = function _temp3(_result) {
7169
7269
  if (_exit) return _result;
7170
7270
  dispatch(setLoading(false));
7171
7271
  };
7172
7272
  var _exit = false;
7173
7273
  dispatch(setLoading(true));
7174
- var _temp5 = _catch(function () {
7274
+ var _temp2 = _catch(function () {
7175
7275
  return Promise.resolve(apiLogin()).then(function (loginResponse) {
7176
7276
  var isFirstLogin = loginResponse.isFirstLogin,
7177
7277
  token = loginResponse.token,
@@ -7195,7 +7295,7 @@ var useLogin = function useLogin(history, homeAcademyUrl, homeUrl, registerUrl,
7195
7295
  alert(getErrorMessage(t, error));
7196
7296
  isLogout && handleSignOut();
7197
7297
  });
7198
- return Promise.resolve(_temp5 && _temp5.then ? _temp5.then(_temp6) : _temp6(_temp5));
7298
+ return Promise.resolve(_temp2 && _temp2.then ? _temp2.then(_temp3) : _temp3(_temp2));
7199
7299
  } catch (e) {
7200
7300
  return Promise.reject(e);
7201
7301
  }
@@ -8002,7 +8102,8 @@ var getStudentsApi = function getStudentsApi(textSearch) {
8002
8102
  return api.get("" + STUDENT_URL, {
8003
8103
  params: {
8004
8104
  textSearch: textSearch,
8005
- roles: [exports.Role.Admin]
8105
+ roles: [exports.Role.Admin],
8106
+ pageSize: 100
8006
8107
  }
8007
8108
  });
8008
8109
  };
@@ -8013,7 +8114,10 @@ var StudentSelector = function StudentSelector(_ref) {
8013
8114
  externalStudentIds = _ref.externalStudentIds,
8014
8115
  _ref$disabled = _ref.disabled,
8015
8116
  disabled = _ref$disabled === void 0 ? false : _ref$disabled,
8016
- title = _ref.title;
8117
+ title = _ref.title,
8118
+ _ref$isMulti = _ref.isMulti,
8119
+ isMulti = _ref$isMulti === void 0 ? true : _ref$isMulti,
8120
+ minSearchLength = _ref.minSearchLength;
8017
8121
  var _useState = React.useState([]),
8018
8122
  students = _useState[0],
8019
8123
  setStudents = _useState[1];
@@ -8048,7 +8152,7 @@ var StudentSelector = function StudentSelector(_ref) {
8048
8152
  }, [searchString]);
8049
8153
  React.useEffect(function () {
8050
8154
  timeout && timeout.current && clearTimeout(timeout.current);
8051
- if (!searchString || searchString.trim().length < 2) {
8155
+ if (minSearchLength && (!searchString || searchString.trim().length < minSearchLength)) {
8052
8156
  setStudents([]);
8053
8157
  } else {
8054
8158
  timeout.current = setTimeout(loadData, 300);
@@ -8074,8 +8178,8 @@ var StudentSelector = function StudentSelector(_ref) {
8074
8178
  },
8075
8179
  isDisabled: disabled,
8076
8180
  isLoading: isLoading,
8077
- placeholder: t('placeholder_student_selector'),
8078
- isMulti: true,
8181
+ placeholder: t(minSearchLength ? 'placeholder_student_selector' : 'select_placeholder'),
8182
+ isMulti: isMulti,
8079
8183
  value: value,
8080
8184
  onChange: onChange
8081
8185
  }));
@@ -14162,7 +14266,7 @@ var DrawerHeader = function DrawerHeader(_ref) {
14162
14266
  fontSize: "13px",
14163
14267
  fontWeight: 500
14164
14268
  }
14165
- }, student.schoolName), React__default.createElement(material.Typography, {
14269
+ }, student.schoolName), !!student.grade && React__default.createElement(material.Typography, {
14166
14270
  sx: {
14167
14271
  color: grey[500],
14168
14272
  fontSize: "13px",
@@ -15470,6 +15574,9 @@ var getNotesApi = function getNotesApi(query) {
15470
15574
  params: query
15471
15575
  });
15472
15576
  };
15577
+ var getNoteByIdApi = function getNoteByIdApi(id) {
15578
+ return api.get(NOTES_URL + "/" + id);
15579
+ };
15473
15580
  var createNoteApi = function createNoteApi(note) {
15474
15581
  return api.post("" + NOTES_URL, note);
15475
15582
  };
@@ -15478,6 +15585,9 @@ var updateNoteApi = function updateNoteApi(id, content) {
15478
15585
  content: content
15479
15586
  });
15480
15587
  };
15588
+ var updateNoteDataApi = function updateNoteDataApi(id, data) {
15589
+ return api.put(NOTES_URL + "/" + id, data);
15590
+ };
15481
15591
  var deleteNoteApi = function deleteNoteApi(id) {
15482
15592
  return api["delete"](NOTES_URL + "/" + id);
15483
15593
  };
@@ -15752,6 +15862,121 @@ var NotesContainer = function NotesContainer(_ref) {
15752
15862
  });
15753
15863
  };
15754
15864
 
15865
+ var getNoteType = function getNoteType(t, type) {
15866
+ switch (type) {
15867
+ case exports.NoteType.ToAcademy:
15868
+ return t("academy");
15869
+ case exports.NoteType.ToStudent:
15870
+ return t("student_parents");
15871
+ case exports.NoteType.AdminToAllAdmin:
15872
+ return t("admin_to_admin");
15873
+ case exports.NoteType.AdminToAllTeacher:
15874
+ return t("admin_to_teachers");
15875
+ case exports.NoteType.TeacherToAllAdmin:
15876
+ return t("teacher_to_admin");
15877
+ case exports.NoteType.TeacherToTeachers:
15878
+ return t("teacher_to_teachers");
15879
+ default:
15880
+ return "";
15881
+ }
15882
+ };
15883
+
15884
+ var NoteItemList = function NoteItemList(_ref) {
15885
+ var _data$reciever, _data$reciever2, _data$recievers;
15886
+ var data = _ref.data,
15887
+ index = _ref.index,
15888
+ role = _ref.role,
15889
+ calcOrderNumber = _ref.calcOrderNumber,
15890
+ onDelete = _ref.onDelete,
15891
+ onUpdate = _ref.onUpdate,
15892
+ onView = _ref.onView;
15893
+ var isAdminUser = reactRedux.useSelector(function (state) {
15894
+ var _state$common, _state$common$user, _state$common$user$ro;
15895
+ return state === null || state === void 0 ? void 0 : (_state$common = state.common) === null || _state$common === void 0 ? void 0 : (_state$common$user = _state$common.user) === null || _state$common$user === void 0 ? void 0 : (_state$common$user$ro = _state$common$user.roles) === null || _state$common$user$ro === void 0 ? void 0 : _state$common$user$ro.includes(exports.Role.Admin);
15896
+ });
15897
+ var userId = reactRedux.useSelector(function (state) {
15898
+ var _state$common2, _state$common2$user;
15899
+ return state === null || state === void 0 ? void 0 : (_state$common2 = state.common) === null || _state$common2 === void 0 ? void 0 : (_state$common2$user = _state$common2.user) === null || _state$common2$user === void 0 ? void 0 : _state$common2$user.id;
15900
+ });
15901
+ var _useTranslation = reactI18next.useTranslation(),
15902
+ t = _useTranslation.t;
15903
+ var isAdmin = role === exports.Role.Admin;
15904
+ var order = calcOrderNumber(index);
15905
+ var createdAt = utcToLocalTime(data.createdAt, t("date_time_format"));
15906
+ var handleDelete = function handleDelete() {
15907
+ onDelete(data);
15908
+ };
15909
+ var handleUpdate = function handleUpdate() {
15910
+ onUpdate(data);
15911
+ };
15912
+ var handleView = function handleView() {
15913
+ onView(data);
15914
+ };
15915
+ var disabled = !data.isOwned && (!isAdminUser || data.type == undefined || data.type == exports.NoteType.TeacherToAllAdmin || data.type == exports.NoteType.TeacherToTeachers);
15916
+ React.useEffect(function () {
15917
+ if (window.MathJax) {
15918
+ var _window$MathJax;
15919
+ (_window$MathJax = window.MathJax) === null || _window$MathJax === void 0 ? void 0 : _window$MathJax.typeset();
15920
+ }
15921
+ }, [data.content]);
15922
+ var noteType = data.type === undefined ? "" : getNoteType(t, data.type);
15923
+ return React__default.createElement(TableRow, null, React__default.createElement(TableCell, null, order), React__default.createElement(TableCell, null, data.type === exports.NoteType.AdminToAllTeacher && !isAdmin && !isAdminUser ? React__default.createElement(material.Typography, {
15924
+ color: green[700],
15925
+ fontWeight: 600
15926
+ }, t("admin")) : React__default.createElement(React.Fragment, null, React__default.createElement(material.Typography, {
15927
+ color: green[700],
15928
+ fontWeight: 600
15929
+ }, data.sender.fullName, data.sender.id === userId && React__default.createElement(material.Typography, {
15930
+ display: "inline-block",
15931
+ color: colors.grey[600],
15932
+ fontWeight: 600
15933
+ }, "(", " " + t("me"), ")")), React__default.createElement(material.Typography, null, data.sender.email))), data.type === exports.NoteType.ToAcademy || data.type === exports.NoteType.ToStudent ? React__default.createElement(TableCell, null, React__default.createElement(material.Typography, {
15934
+ color: colors.blue[700],
15935
+ fontWeight: 600
15936
+ }, (_data$reciever = data.reciever) === null || _data$reciever === void 0 ? void 0 : _data$reciever.fullName), React__default.createElement(material.Typography, null, (_data$reciever2 = data.reciever) === null || _data$reciever2 === void 0 ? void 0 : _data$reciever2.email)) : data.type === exports.NoteType.TeacherToTeachers ? React__default.createElement(TableCell, null, React__default.createElement(material.Stack, {
15937
+ direction: "column"
15938
+ }, (_data$recievers = data.recievers) === null || _data$recievers === void 0 ? void 0 : _data$recievers.slice(0, 2).map(function (i) {
15939
+ return React__default.createElement(material.Typography, null, i.fullName, " - ", i.email);
15940
+ }), data.recievers && data.recievers.length > 2 && React__default.createElement(material.Typography, null, "(+", data.recievers.length - 2, ")"))) : React__default.createElement(TableCell, null, React__default.createElement(material.Typography, null, t(data.type === exports.NoteType.AdminToAllTeacher ? "teachers" : "admin"))), React__default.createElement(TableCell, null, React__default.createElement(material.Box, {
15941
+ sx: {
15942
+ display: "-webkit-box",
15943
+ lineClamp: 3,
15944
+ WebkitLineClamp: 3,
15945
+ WebkitBoxOrient: "vertical",
15946
+ boxOrient: "vertical",
15947
+ overflow: "hidden"
15948
+ },
15949
+ dangerouslySetInnerHTML: {
15950
+ __html: data.content
15951
+ }
15952
+ })), React__default.createElement(TableCell, {
15953
+ className: "text-nowrap"
15954
+ }, noteType), React__default.createElement(TableCell, null, createdAt), React__default.createElement(TableCell, null, React__default.createElement("div", {
15955
+ className: "d-flex"
15956
+ }, React__default.createElement(material.Box, null, React__default.createElement(material.IconButton, {
15957
+ color: "default",
15958
+ className: "bg-primary text-white me-1",
15959
+ onClick: handleView
15960
+ }, React__default.createElement(fa.FaEye, {
15961
+ size: 12
15962
+ }))), React__default.createElement(material.Box, null, React__default.createElement(material.IconButton, {
15963
+ color: "default",
15964
+ className: styles$5["action-btn"] + " " + (disabled ? "bg-secondary" : "bg-warning") + " text-white me-2",
15965
+ onClick: handleUpdate,
15966
+ disabled: disabled
15967
+ }, React__default.createElement(hi.HiOutlinePencilAlt, {
15968
+ className: styles$5["action-btn--pencil"],
15969
+ size: 12
15970
+ }))), React__default.createElement(material.Box, null, React__default.createElement(material.IconButton, {
15971
+ onClick: handleDelete,
15972
+ color: "default",
15973
+ className: styles$5["action-btn"] + " " + (disabled ? "bg-secondary" : "bg-danger") + " text-white",
15974
+ disabled: disabled
15975
+ }, React__default.createElement(fa6.FaTrashCan, {
15976
+ size: 12
15977
+ }))))));
15978
+ };
15979
+
15755
15980
  var NoteContent = function NoteContent(_ref) {
15756
15981
  var content = _ref.content;
15757
15982
  React.useEffect(function () {
@@ -15773,7 +15998,7 @@ var NoteContent = function NoteContent(_ref) {
15773
15998
  };
15774
15999
 
15775
16000
  var NoteDrawer = function NoteDrawer(props) {
15776
- var _BRIEF_GRADE_OPTIONS$, _data$content;
16001
+ var _BRIEF_GRADE_OPTIONS$, _note$content;
15777
16002
  var anchor = props.anchor,
15778
16003
  open = props.open,
15779
16004
  student = props.student,
@@ -15781,7 +16006,8 @@ var NoteDrawer = function NoteDrawer(props) {
15781
16006
  data = props.data,
15782
16007
  width = props.width,
15783
16008
  _props$showStudentInf = props.showStudentInfo,
15784
- showStudentInfo = _props$showStudentInf === void 0 ? true : _props$showStudentInf;
16009
+ showStudentInfo = _props$showStudentInf === void 0 ? true : _props$showStudentInf,
16010
+ id = props.id;
15785
16011
  var _useTranslation = reactI18next.useTranslation(),
15786
16012
  t = _useTranslation.t;
15787
16013
  var academy = reactRedux.useSelector(function (state) {
@@ -15792,6 +16018,46 @@ var NoteDrawer = function NoteDrawer(props) {
15792
16018
  var _state$common2;
15793
16019
  return state === null || state === void 0 ? void 0 : (_state$common2 = state.common) === null || _state$common2 === void 0 ? void 0 : _state$common2.language;
15794
16020
  });
16021
+ var _useState = React.useState(false),
16022
+ loading = _useState[0],
16023
+ setLoading = _useState[1];
16024
+ var _useState2 = React.useState(),
16025
+ noteData = _useState2[0],
16026
+ setNoteData = _useState2[1];
16027
+ React.useEffect(function () {
16028
+ var getNoteById = function getNoteById() {
16029
+ try {
16030
+ var _temp2 = function _temp2() {
16031
+ setLoading(false);
16032
+ };
16033
+ if (!id) return Promise.resolve();
16034
+ setLoading(true);
16035
+ var _temp = _catch(function () {
16036
+ return Promise.resolve(getNoteByIdApi(+id)).then(function (res) {
16037
+ setNoteData(res.data);
16038
+ });
16039
+ }, function (error) {
16040
+ reactToastify.toast.error(getErrorMessage(t, error));
16041
+ });
16042
+ return Promise.resolve(_temp && _temp.then ? _temp.then(_temp2) : _temp2(_temp));
16043
+ } catch (e) {
16044
+ return Promise.reject(e);
16045
+ }
16046
+ };
16047
+ getNoteById();
16048
+ }, [id]);
16049
+ var note = data != null ? data : noteData;
16050
+ var user = React.useMemo(function () {
16051
+ if (student) return student;
16052
+ if (!note) return null;
16053
+ switch (note.type) {
16054
+ case exports.NoteType.ToAcademy:
16055
+ case exports.NoteType.ToStudent:
16056
+ return note.reciever;
16057
+ default:
16058
+ return note.sender;
16059
+ }
16060
+ }, [JSON.stringify(note), JSON.stringify(student)]);
15795
16061
  return React__default.createElement(material.Drawer, {
15796
16062
  anchor: anchor,
15797
16063
  open: open,
@@ -15818,11 +16084,11 @@ var NoteDrawer = function NoteDrawer(props) {
15818
16084
  onClick: onClose
15819
16085
  }, React__default.createElement(io5.IoClose, {
15820
16086
  size: 32
15821
- }))), showStudentInfo && React__default.createElement(material.Box, {
16087
+ }))), showStudentInfo && ((note === null || note === void 0 ? void 0 : note.type) === exports.NoteType.ToAcademy || (note === null || note === void 0 ? void 0 : note.type) === exports.NoteType.ToStudent) && React__default.createElement(material.Box, {
15822
16088
  sx: {
15823
16089
  padding: "16px 40px"
15824
16090
  }
15825
- }, !student ? React__default.createElement(material.Stack, {
16091
+ }, !user || loading ? React__default.createElement(material.Stack, {
15826
16092
  direction: "row",
15827
16093
  gap: 3
15828
16094
  }, React__default.createElement(material.Skeleton, {
@@ -15857,7 +16123,7 @@ var NoteDrawer = function NoteDrawer(props) {
15857
16123
  color: green[500],
15858
16124
  lineHeight: "22px"
15859
16125
  }
15860
- }, student.fullName), React__default.createElement(material.Stack, {
16126
+ }, user.fullName), React__default.createElement(material.Stack, {
15861
16127
  direction: "row",
15862
16128
  alignItems: "center",
15863
16129
  gap: 1
@@ -15867,17 +16133,29 @@ var NoteDrawer = function NoteDrawer(props) {
15867
16133
  fontSize: "13px",
15868
16134
  fontWeight: 500
15869
16135
  }
15870
- }, student.schoolName), React__default.createElement(material.Typography, {
16136
+ }, user.schoolName), !!user.grade && React__default.createElement(material.Typography, {
15871
16137
  sx: {
15872
16138
  color: grey[500],
15873
16139
  fontSize: "13px",
15874
16140
  fontWeight: 500
15875
16141
  }
15876
16142
  }, t(function (label) {
15877
- return label ? t(label) : formatGrade(student.grade, t, language);
16143
+ return label ? t(label) : formatGrade(user.grade, t, language);
15878
16144
  }((_BRIEF_GRADE_OPTIONS$ = BRIEF_GRADE_OPTIONS.find(function (o) {
15879
- return o.value === Number(student.grade);
15880
- })) === null || _BRIEF_GRADE_OPTIONS$ === void 0 ? void 0 : _BRIEF_GRADE_OPTIONS$.label))))))), React__default.createElement(material.Stack, {
16145
+ return o.value === Number(user.grade);
16146
+ })) === null || _BRIEF_GRADE_OPTIONS$ === void 0 ? void 0 : _BRIEF_GRADE_OPTIONS$.label))))))), !note && !loading && React__default.createElement(material.Stack, {
16147
+ padding: "40px 24px 0",
16148
+ gap: "16px"
16149
+ }, React__default.createElement(material.Typography, {
16150
+ className: "text-muted"
16151
+ }, t("no_data"))), loading && React__default.createElement(material.Stack, {
16152
+ padding: "40px 24px 0",
16153
+ gap: "16px",
16154
+ justifyContent: "center"
16155
+ }, React__default.createElement(material.CircularProgress, {
16156
+ size: 40,
16157
+ color: "primary"
16158
+ })), note && !loading && React__default.createElement(material.Stack, {
15881
16159
  padding: "40px 24px 0",
15882
16160
  gap: "16px"
15883
16161
  }, React__default.createElement(material.Stack, {
@@ -15890,7 +16168,7 @@ var NoteDrawer = function NoteDrawer(props) {
15890
16168
  fontWeight: "700",
15891
16169
  color: "#414E62"
15892
16170
  }
15893
- }, data === null || data === void 0 ? void 0 : data.fullName)), React__default.createElement(material.Stack, {
16171
+ }, note === null || note === void 0 ? void 0 : note.fullName)), React__default.createElement(material.Stack, {
15894
16172
  display: "flex",
15895
16173
  justifyContent: "end"
15896
16174
  }, React__default.createElement(material.Typography, {
@@ -15900,7 +16178,7 @@ var NoteDrawer = function NoteDrawer(props) {
15900
16178
  color: "#97A1AF",
15901
16179
  textAlign: "end"
15902
16180
  }
15903
- }, utcToLocalTime(data === null || data === void 0 ? void 0 : data.createdAt, t("date_format"))), React__default.createElement(material.Typography, {
16181
+ }, utcToLocalTime(note === null || note === void 0 ? void 0 : note.createdAt, t("date_format"))), React__default.createElement(material.Typography, {
15904
16182
  sx: {
15905
16183
  fontSize: "12px",
15906
16184
  fontWeight: "500",
@@ -15908,11 +16186,808 @@ var NoteDrawer = function NoteDrawer(props) {
15908
16186
  textAlign: "end"
15909
16187
  }
15910
16188
  }, academy === null || academy === void 0 ? void 0 : academy.name))), React__default.createElement(NoteContent, {
15911
- content: (_data$content = data === null || data === void 0 ? void 0 : data.content) != null ? _data$content : ""
16189
+ content: (_note$content = note === null || note === void 0 ? void 0 : note.content) != null ? _note$content : ""
16190
+ })));
16191
+ };
16192
+
16193
+ var TEACHER_URL = BASE_URL + "/api/teacher";
16194
+ var getTeacherListApi = function getTeacherListApi(query) {
16195
+ return api.get("" + TEACHER_URL, {
16196
+ params: query
16197
+ });
16198
+ };
16199
+
16200
+ var TeacherSelector$1 = function TeacherSelector(_ref) {
16201
+ var value = _ref.value,
16202
+ onChange = _ref.onChange,
16203
+ placeholder = _ref.placeholder,
16204
+ externalTeacherIds = _ref.externalTeacherIds,
16205
+ title = _ref.title,
16206
+ isMultiple = _ref.isMultiple,
16207
+ _ref$isClearable = _ref.isClearable,
16208
+ isClearable = _ref$isClearable === void 0 ? true : _ref$isClearable,
16209
+ useUserId = _ref.useUserId,
16210
+ exceptMe = _ref.exceptMe,
16211
+ isDisabled = _ref.isDisabled;
16212
+ var _useState = React.useState([]),
16213
+ teachers = _useState[0],
16214
+ setTeachers = _useState[1];
16215
+ var _useState2 = React.useState(""),
16216
+ searchString = _useState2[0],
16217
+ setSearchString = _useState2[1];
16218
+ var _useState3 = React.useState(false),
16219
+ isLoading = _useState3[0],
16220
+ setLoading = _useState3[1];
16221
+ var _useTranslation = reactI18next.useTranslation(),
16222
+ t = _useTranslation.t;
16223
+ var debounceSearch = React.useCallback(_$8.debounce(function (value) {
16224
+ loadData(value);
16225
+ }, 500), []);
16226
+ var handleChangeSearchText = function handleChangeSearchText(value) {
16227
+ setSearchString(value.trim());
16228
+ debounceSearch(value.trim());
16229
+ };
16230
+ var loadData = function loadData(textSearch) {
16231
+ try {
16232
+ var _temp2 = function _temp2() {
16233
+ setLoading(false);
16234
+ };
16235
+ setLoading(true);
16236
+ var _temp = _catch(function () {
16237
+ return Promise.resolve(getTeacherListApi({
16238
+ textSearch: textSearch,
16239
+ pageSize: 100,
16240
+ currentPage: 1,
16241
+ exceptMe: exceptMe,
16242
+ sortColumnDirection: exports.OrderType.DESC,
16243
+ sortColumnName: "User.UserProfile.FullName"
16244
+ })).then(function (res) {
16245
+ var _res$data$items = res.data.items,
16246
+ items = _res$data$items === void 0 ? [] : _res$data$items;
16247
+ setTeachers(items);
16248
+ });
16249
+ }, function (err) {
16250
+ reactToastify.toast.error(getErrorMessage(t, err));
16251
+ });
16252
+ return Promise.resolve(_temp && _temp.then ? _temp.then(_temp2) : _temp2(_temp));
16253
+ } catch (e) {
16254
+ return Promise.reject(e);
16255
+ }
16256
+ };
16257
+ React.useEffect(function () {
16258
+ loadData();
16259
+ }, []);
16260
+ var options = teachers.filter(function (teacher) {
16261
+ return !externalTeacherIds || externalTeacherIds && !externalTeacherIds.includes(teacher.id);
16262
+ }).map(function (teacher) {
16263
+ return {
16264
+ label: teacher.teacherName + " - " + teacher.teacherEmail,
16265
+ value: useUserId ? teacher.teacherUserId : teacher.id
16266
+ };
16267
+ });
16268
+ return React__default.createElement(material.FormGroup, {
16269
+ className: "" + styles["filter-item"]
16270
+ }, !!title && React__default.createElement("label", {
16271
+ className: "" + styles["title-form"]
16272
+ }, title), React__default.createElement(CustomSelectOption, {
16273
+ options: options,
16274
+ onInputChange: function onInputChange(inputValue) {
16275
+ return handleChangeSearchText(inputValue);
16276
+ },
16277
+ isLoading: isLoading,
16278
+ placeholder: placeholder || t('select_placeholder'),
16279
+ isMulti: isMultiple,
16280
+ value: value,
16281
+ inputValue: searchString,
16282
+ onChange: onChange,
16283
+ isClearable: isClearable,
16284
+ isDisabled: isDisabled
16285
+ }));
16286
+ };
16287
+
16288
+ var schema$3 = yup.object().shape({
16289
+ content: yup.string().trim().required(),
16290
+ studentId: yup.number().when("type", {
16291
+ is: function is(type) {
16292
+ return type == exports.NoteType.ToAcademy || type == exports.NoteType.ToStudent;
16293
+ },
16294
+ then: function then(schema) {
16295
+ return schema.required("student_required");
16296
+ },
16297
+ otherwise: function otherwise(schema) {
16298
+ return schema.notRequired();
16299
+ }
16300
+ }),
16301
+ userIds: yup.array().of(yup.number()).when("type", {
16302
+ is: function is(type) {
16303
+ return type == exports.NoteType.TeacherToTeachers;
16304
+ },
16305
+ then: function then(schema) {
16306
+ return schema.required("teachers_required");
16307
+ },
16308
+ otherwise: function otherwise(schema) {
16309
+ return schema.notRequired();
16310
+ }
16311
+ }),
16312
+ type: yup.number()
16313
+ });
16314
+ var GeneralNoteDialog = function GeneralNoteDialog(_ref) {
16315
+ var _selectedNote$recieve, _selectedNote$recieve2, _selectedNote$recieve3;
16316
+ var open = _ref.open,
16317
+ type = _ref.type,
16318
+ selectedNote = _ref.selectedNote,
16319
+ value = _ref.value,
16320
+ onClose = _ref.onClose,
16321
+ onSaveNote = _ref.onSaveNote;
16322
+ var _useTranslation = reactI18next.useTranslation(),
16323
+ t = _useTranslation.t;
16324
+ var handleSaveNote = function handleSaveNote(val) {
16325
+ onSaveNote(val);
16326
+ };
16327
+ var tip = React.useMemo(function () {
16328
+ if (type === undefined) return "";
16329
+ switch (type) {
16330
+ case exports.NoteType.ToAcademy:
16331
+ return "academy";
16332
+ case exports.NoteType.ToStudent:
16333
+ return "student_parents";
16334
+ case exports.NoteType.AdminToAllAdmin:
16335
+ case exports.NoteType.AdminToAllTeacher:
16336
+ case exports.NoteType.TeacherToAllAdmin:
16337
+ return "admin";
16338
+ case exports.NoteType.TeacherToTeachers:
16339
+ return "teacher";
16340
+ default:
16341
+ return "";
16342
+ }
16343
+ }, [type]);
16344
+ return React__default.createElement(material.Dialog, {
16345
+ onClose: onClose,
16346
+ open: open,
16347
+ maxWidth: "md",
16348
+ scroll: "body",
16349
+ fullWidth: true,
16350
+ disableEnforceFocus: true,
16351
+ disableAutoFocus: true
16352
+ }, React__default.createElement(DialogTitle, {
16353
+ id: "customized-dialog-title"
16354
+ }, React__default.createElement(Typography, {
16355
+ fontWeight: 700,
16356
+ fontSize: "16px",
16357
+ lineHeight: "19.09px",
16358
+ color: "#202B37"
16359
+ }, t(type === exports.NoteType.ToAcademy || type === exports.NoteType.ToStudent ? selectedNote ? "edit_student_note" : "student_note_taking" : "note"), tip ? " " + t(tip) : "")), React__default.createElement(IconButton, {
16360
+ "aria-label": "close",
16361
+ sx: {
16362
+ position: "absolute",
16363
+ right: 8,
16364
+ top: 8,
16365
+ color: function color(theme) {
16366
+ return theme.palette.grey[500];
16367
+ }
16368
+ },
16369
+ onClick: onClose
16370
+ }, React__default.createElement(iconCloseDialog, null)), React__default.createElement(formik.Formik, {
16371
+ initialValues: {
16372
+ content: value ? value.content : (selectedNote === null || selectedNote === void 0 ? void 0 : selectedNote.content) || "",
16373
+ type: type,
16374
+ studentId: value ? value.studentId : selectedNote === null || selectedNote === void 0 ? void 0 : (_selectedNote$recieve = selectedNote.reciever) === null || _selectedNote$recieve === void 0 ? void 0 : _selectedNote$recieve.id,
16375
+ student: value ? value.student : selectedNote !== null && selectedNote !== void 0 && selectedNote.reciever ? {
16376
+ label: selectedNote.reciever.fullName,
16377
+ value: selectedNote.reciever.id
16378
+ } : undefined,
16379
+ userIds: value ? value.userIds : selectedNote === null || selectedNote === void 0 ? void 0 : (_selectedNote$recieve2 = selectedNote.recievers) === null || _selectedNote$recieve2 === void 0 ? void 0 : _selectedNote$recieve2.map(function (i) {
16380
+ return i.id;
16381
+ }),
16382
+ users: value ? value.users : selectedNote === null || selectedNote === void 0 ? void 0 : (_selectedNote$recieve3 = selectedNote.recievers) === null || _selectedNote$recieve3 === void 0 ? void 0 : _selectedNote$recieve3.map(function (i) {
16383
+ return {
16384
+ label: i.fullName,
16385
+ value: i.id
16386
+ };
16387
+ })
16388
+ },
16389
+ validationSchema: schema$3,
16390
+ enableReinitialize: true,
16391
+ onSubmit: handleSaveNote
16392
+ }, function (_ref2) {
16393
+ var _selectedNote$recieve4;
16394
+ var values = _ref2.values,
16395
+ errors = _ref2.errors,
16396
+ setFieldValue = _ref2.setFieldValue;
16397
+ return React__default.createElement(formik.Form, null, React__default.createElement(DialogContent, {
16398
+ sx: {
16399
+ padding: 0,
16400
+ overflowY: "auto"
16401
+ }
16402
+ }, React__default.createElement(material.Box, {
16403
+ display: "flex",
16404
+ flexDirection: "column",
16405
+ gap: "8px",
16406
+ padding: "24px 24px 40px 24px"
16407
+ }, (type === exports.NoteType.ToAcademy || type === exports.NoteType.ToStudent) && React__default.createElement(material.Stack, null, React__default.createElement("label", {
16408
+ htmlFor: "student",
16409
+ className: styles["form-label"] + " " + styles$5["form-label-dialog"]
16410
+ }, t("student_name")), selectedNote ? React__default.createElement(Typography, {
16411
+ sx: {
16412
+ fontWeight: 700,
16413
+ fontSize: "14px",
16414
+ color: "rgba(61, 198, 116, 1)"
16415
+ }
16416
+ }, (_selectedNote$recieve4 = selectedNote.reciever) === null || _selectedNote$recieve4 === void 0 ? void 0 : _selectedNote$recieve4.fullName) : React__default.createElement(formik.Field, {
16417
+ id: "student",
16418
+ style: {
16419
+ width: "100%"
16420
+ },
16421
+ name: "student",
16422
+ className: styles["form-control"],
16423
+ render: function render(_ref3) {
16424
+ var field = _ref3.field;
16425
+ return React__default.createElement(StudentSelector, {
16426
+ value: field.value,
16427
+ onChange: function onChange(val) {
16428
+ setFieldValue("studentId", val === null || val === void 0 ? void 0 : val.value);
16429
+ setFieldValue("student", val);
16430
+ },
16431
+ isMulti: false
16432
+ });
16433
+ }
16434
+ }), !!errors.studentId && React__default.createElement(Typography, {
16435
+ fontWeight: 500,
16436
+ fontSize: "10px",
16437
+ lineHeight: "11.93px",
16438
+ mt: 1,
16439
+ color: "#F34B4B"
16440
+ }, errors.studentId)), (type === exports.NoteType.AdminToAllAdmin || type === exports.NoteType.AdminToAllTeacher) && React__default.createElement(material.FormControl, {
16441
+ className: "w-100"
16442
+ }, React__default.createElement(material.FormLabel, {
16443
+ className: "fw-medium",
16444
+ id: "type"
16445
+ }, t("receivers")), React__default.createElement(material.RadioGroup, {
16446
+ className: "flex-row flex-wrap"
16447
+ }, React__default.createElement(material.FormControlLabel, {
16448
+ control: React__default.createElement(material.Radio, {
16449
+ checked: values.type === exports.NoteType.AdminToAllAdmin || values.type === exports.NoteType.TeacherToAllAdmin,
16450
+ onChange: function onChange(_) {
16451
+ return setFieldValue("type", exports.NoteType.AdminToAllAdmin);
16452
+ }
16453
+ }),
16454
+ label: t("admin")
16455
+ }), React__default.createElement(material.FormControlLabel, {
16456
+ control: React__default.createElement(material.Radio, {
16457
+ checked: values.type === exports.NoteType.AdminToAllTeacher,
16458
+ onChange: function onChange(_) {
16459
+ return setFieldValue("type", exports.NoteType.AdminToAllTeacher);
16460
+ }
16461
+ }),
16462
+ label: t("teacher")
16463
+ }))), type === exports.NoteType.TeacherToTeachers && React__default.createElement(material.Stack, null, React__default.createElement("label", {
16464
+ htmlFor: "teachers",
16465
+ className: styles["form-label"] + " " + styles$5["form-label-dialog"]
16466
+ }, t("teachers")), React__default.createElement(formik.Field, {
16467
+ id: "users",
16468
+ style: {
16469
+ width: "100%"
16470
+ },
16471
+ name: "users",
16472
+ className: styles["form-control"],
16473
+ render: function render(_ref4) {
16474
+ var field = _ref4.field;
16475
+ return React__default.createElement(TeacherSelector$1, {
16476
+ value: field.value,
16477
+ onChange: function onChange(val) {
16478
+ var _val$map, _val$map2;
16479
+ setFieldValue("userIds", (_val$map = val === null || val === void 0 ? void 0 : (_val$map2 = val.map) === null || _val$map2 === void 0 ? void 0 : _val$map2.call(val, function (i) {
16480
+ return i.value;
16481
+ })) != null ? _val$map : []);
16482
+ setFieldValue("users", val != null ? val : []);
16483
+ },
16484
+ isDisabled: !!selectedNote,
16485
+ exceptMe: true,
16486
+ isMultiple: true,
16487
+ useUserId: true
16488
+ });
16489
+ }
16490
+ }), !!errors.userIds && React__default.createElement(Typography, {
16491
+ fontWeight: 500,
16492
+ fontSize: "10px",
16493
+ lineHeight: "11.93px",
16494
+ mt: 1,
16495
+ color: "#F34B4B"
16496
+ }, errors.userIds)), React__default.createElement(material.Stack, null, React__default.createElement("label", {
16497
+ htmlFor: "content-question",
16498
+ className: styles["form-label"] + " " + styles$5["form-label-dialog"]
16499
+ }, t("incorrect_answer_note_contents")), React__default.createElement(material.Box, {
16500
+ position: "relative",
16501
+ display: "flex",
16502
+ flexDirection: "row",
16503
+ alignItems: "center"
16504
+ }, React__default.createElement(formik.Field, {
16505
+ id: "content-question",
16506
+ style: {
16507
+ width: "100%"
16508
+ },
16509
+ name: "content",
16510
+ placeholder: t("the_problem_is_difficult"),
16511
+ className: styles["form-control"],
16512
+ render: function render(_ref5) {
16513
+ var field = _ref5.field;
16514
+ return React__default.createElement(NoteTinyEditor, {
16515
+ initValue: field.value,
16516
+ onChange: function onChange(text) {
16517
+ return setFieldValue("content", text);
16518
+ }
16519
+ });
16520
+ }
16521
+ })), !!errors.content && React__default.createElement(Typography, {
16522
+ fontWeight: 500,
16523
+ fontSize: "10px",
16524
+ lineHeight: "11.93px",
16525
+ mt: 1,
16526
+ color: "#F34B4B"
16527
+ }, errors.content), React__default.createElement(material.Box, {
16528
+ marginBottom: "4px"
16529
+ })))), React__default.createElement(DialogActions, {
16530
+ sx: {
16531
+ display: "flex",
16532
+ justifyContent: "space-between",
16533
+ alignItems: "center",
16534
+ padding: "12px",
16535
+ borderTop: "1px solid #CED2DA"
16536
+ }
16537
+ }, React__default.createElement(MButton, {
16538
+ className: styles$5["btn-cancel"],
16539
+ onClick: onClose
16540
+ }, React__default.createElement(Typography, {
16541
+ sx: {
16542
+ color: styles.dark + " !important"
16543
+ },
16544
+ fontWeight: 700,
16545
+ fontSize: "14px",
16546
+ lineHeight: "16.71px"
16547
+ }, t("cancel"))), React__default.createElement(MButton, {
16548
+ variant: "contained",
16549
+ sx: {
16550
+ bgcolor: styles.dark
16551
+ },
16552
+ className: styles$5["btn-register"],
16553
+ type: "submit"
16554
+ }, React__default.createElement(Typography, {
16555
+ fontWeight: 700,
16556
+ fontSize: "14px",
16557
+ lineHeight: "16.71px",
16558
+ color: "#FFFFFF"
16559
+ }, t("registration")))));
16560
+ }));
16561
+ };
16562
+
16563
+ var NoteList = function NoteList(_ref) {
16564
+ var defaultFilter = _ref.defaultFilter,
16565
+ role = _ref.role,
16566
+ headers = _ref.headers,
16567
+ isAdmin = _ref.isAdmin;
16568
+ var _useTranslation = reactI18next.useTranslation(),
16569
+ t = _useTranslation.t;
16570
+ var _useList = useList(function (filter) {
16571
+ return getNotesApi(filter);
16572
+ }, defaultFilter, false),
16573
+ isLoading = _useList.isLoading,
16574
+ filter = _useList.filter,
16575
+ textSearchRef = _useList.textSearchRef,
16576
+ paging = _useList.paging,
16577
+ data = _useList.data,
16578
+ selectedItem = _useList.selectedItem,
16579
+ handleSort = _useList.handleSort,
16580
+ handleChangeSearchText = _useList.handleChangeSearchText,
16581
+ handleChangePage = _useList.handleChangePage,
16582
+ calcOrderNumber = _useList.calcOrderNumber,
16583
+ handleChangeSelectedItem = _useList.handleChangeSelectedItem,
16584
+ getData = _useList.getData;
16585
+ var dispatch = reactRedux.useDispatch();
16586
+ var _useState = React.useState(false),
16587
+ openNoteViewDrawer = _useState[0],
16588
+ setOpenNoteViewDrawer = _useState[1];
16589
+ var _useState2 = React.useState(),
16590
+ openNoteDialog = _useState2[0],
16591
+ setOpenNoteDialog = _useState2[1];
16592
+ var _useState3 = React.useState(),
16593
+ noteRequest = _useState3[0],
16594
+ setNoteRequest = _useState3[1];
16595
+ var _useState4 = React.useState(false),
16596
+ openConfirmNote = _useState4[0],
16597
+ setOpenConfirmNote = _useState4[1];
16598
+ var _useState5 = React.useState(false),
16599
+ openDeleteNoteDialog = _useState5[0],
16600
+ setOpenDeleteNoteDialog = _useState5[1];
16601
+ var handleOpenCreateNoteDialog = function handleOpenCreateNoteDialog() {
16602
+ var _defaultFilter$types;
16603
+ if (((_defaultFilter$types = defaultFilter.types) === null || _defaultFilter$types === void 0 ? void 0 : _defaultFilter$types.length) === 1) setOpenNoteDialog(defaultFilter.types[0]);else if (defaultFilter.types && defaultFilter.types.length > 1) {
16604
+ setOpenNoteDialog(isAdmin ? exports.NoteType.AdminToAllAdmin : exports.NoteType.TeacherToAllAdmin);
16605
+ }
16606
+ };
16607
+ var handleCloseDeleteDialog = function handleCloseDeleteDialog() {
16608
+ setOpenDeleteNoteDialog(false);
16609
+ };
16610
+ var handleOpenDeleteNoteDialog = function handleOpenDeleteNoteDialog(note) {
16611
+ handleChangeSelectedItem(note);
16612
+ setOpenDeleteNoteDialog(true);
16613
+ };
16614
+ var handleOpenNoteDrawer = function handleOpenNoteDrawer(note) {
16615
+ setOpenNoteViewDrawer(true);
16616
+ handleChangeSelectedItem(note);
16617
+ };
16618
+ var handleCloseNoteDrawer = function handleCloseNoteDrawer() {
16619
+ setOpenNoteViewDrawer(false);
16620
+ handleChangeSelectedItem(undefined);
16621
+ };
16622
+ var handleCloseConfirmStudentNoteDialog = function handleCloseConfirmStudentNoteDialog() {
16623
+ setOpenConfirmNote(false);
16624
+ };
16625
+ var handleOpenNoteDialog = function handleOpenNoteDialog(note) {
16626
+ handleChangeSelectedItem(note);
16627
+ setOpenNoteDialog(note.type);
16628
+ };
16629
+ var handleCloseNoteDialog = function handleCloseNoteDialog() {
16630
+ handleChangeSelectedItem(undefined);
16631
+ setOpenNoteDialog(undefined);
16632
+ setNoteRequest(undefined);
16633
+ };
16634
+ var handleOpenConfirmStudentNoteDialog = function handleOpenConfirmStudentNoteDialog(note) {
16635
+ setNoteRequest(note);
16636
+ setOpenConfirmNote(true);
16637
+ };
16638
+ var handleSaveNote = function handleSaveNote(noteRequest) {
16639
+ try {
16640
+ var _temp4 = function _temp4() {
16641
+ dispatch(setLoading(false));
16642
+ };
16643
+ if (openNoteDialog === undefined) return Promise.resolve();
16644
+ if (noteRequest.content.trim().length === 0) return Promise.resolve();
16645
+ dispatch(setLoading(true));
16646
+ var _temp3 = _catch(function () {
16647
+ function _temp2() {
16648
+ getData();
16649
+ reset();
16650
+ }
16651
+ var _temp = function () {
16652
+ if (selectedItem) {
16653
+ return Promise.resolve(updateNoteDataApi(selectedItem.id, noteRequest)).then(function () {
16654
+ reactToastify.toast.success(t("update_note_successfully"));
16655
+ });
16656
+ } else {
16657
+ return Promise.resolve(createNoteApi(noteRequest)).then(function () {
16658
+ reactToastify.toast.success(t("create_note_successfully"));
16659
+ });
16660
+ }
16661
+ }();
16662
+ return _temp && _temp.then ? _temp.then(_temp2) : _temp2(_temp);
16663
+ }, function (error) {
16664
+ reactToastify.toast.error(getErrorMessage(t, error));
16665
+ });
16666
+ return Promise.resolve(_temp3 && _temp3.then ? _temp3.then(_temp4) : _temp4(_temp3));
16667
+ } catch (e) {
16668
+ return Promise.reject(e);
16669
+ }
16670
+ };
16671
+ var handleDeleteNote = function handleDeleteNote() {
16672
+ try {
16673
+ var _temp6 = function _temp6() {
16674
+ dispatch(setLoading(false));
16675
+ };
16676
+ if (!(selectedItem !== null && selectedItem !== void 0 && selectedItem.id)) return Promise.resolve();
16677
+ dispatch(setLoading(true));
16678
+ var _temp5 = _catch(function () {
16679
+ return Promise.resolve(deleteNoteApi(selectedItem.id)).then(function () {
16680
+ reactToastify.toast.success(t("delete_note_successfully"));
16681
+ getData();
16682
+ reset();
16683
+ });
16684
+ }, function (error) {
16685
+ reactToastify.toast.error(getErrorMessage(t, error));
16686
+ });
16687
+ return Promise.resolve(_temp5 && _temp5.then ? _temp5.then(_temp6) : _temp6(_temp5));
16688
+ } catch (e) {
16689
+ return Promise.reject(e);
16690
+ }
16691
+ };
16692
+ var reset = function reset() {
16693
+ handleCloseNoteDialog();
16694
+ setOpenDeleteNoteDialog(false);
16695
+ setOpenConfirmNote(false);
16696
+ setNoteRequest(undefined);
16697
+ };
16698
+ var handleSaveNoteDialog = openNoteDialog === exports.NoteType.ToStudent && !(selectedItem !== null && selectedItem !== void 0 && selectedItem.id) ? handleOpenConfirmStudentNoteDialog : handleSaveNote;
16699
+ var handleSaveStudentNote = function handleSaveStudentNote() {
16700
+ if (!noteRequest) return;
16701
+ handleSaveNote(noteRequest);
16702
+ };
16703
+ return React__default.createElement(material.Box, {
16704
+ width: "100%"
16705
+ }, React__default.createElement(material.Grid, {
16706
+ container: true
16707
+ }, React__default.createElement(material.Grid, {
16708
+ item: true,
16709
+ xs: 6,
16710
+ className: "d-flex mb-3"
16711
+ }, React__default.createElement(SearchInput, {
16712
+ placeholder: t("search_for"),
16713
+ textSearchRef: textSearchRef,
16714
+ onChange: handleChangeSearchText
16715
+ })), React__default.createElement(material.Grid, {
16716
+ item: true,
16717
+ xs: 6,
16718
+ className: "d-flex justify-content-end align-items-center"
16719
+ }, React__default.createElement(material.Button, {
16720
+ variant: "contained",
16721
+ sx: {
16722
+ bgcolor: green[700]
16723
+ },
16724
+ startIcon: React__default.createElement(fa.FaPlus, {
16725
+ size: 12
16726
+ }),
16727
+ onClick: handleOpenCreateNoteDialog
16728
+ }, t("new_note"))), React__default.createElement(material.Grid, {
16729
+ item: true,
16730
+ xs: 12
16731
+ }, React__default.createElement(material.TableContainer, null, React__default.createElement(material.Table, null, React__default.createElement(material.TableHead, null, React__default.createElement(material.TableRow, null, headers.map(function (i, index) {
16732
+ return React__default.createElement(material.TableCell, {
16733
+ key: index,
16734
+ onClick: !!i.sortKey ? function () {
16735
+ return handleSort(i.sortKey);
16736
+ } : undefined,
16737
+ className: "" + (!!i.sortKey && "pointer")
16738
+ }, React__default.createElement("div", {
16739
+ className: "d-flex justify-content-between align-items-center text-nowrap"
16740
+ }, t(i.title), !!i.sortKey && React__default.createElement(SortIcon, {
16741
+ isAscending: filter.sortColumnName !== i.sortKey ? undefined : filter.sortColumnDirection === exports.OrderType.ASC
16742
+ })));
16743
+ }))), React__default.createElement(material.TableBody, null, React__default.createElement(ListView, {
16744
+ data: data,
16745
+ render: function render(item, index) {
16746
+ return React__default.createElement(NoteItemList, {
16747
+ key: index,
16748
+ data: item,
16749
+ calcOrderNumber: calcOrderNumber,
16750
+ index: index,
16751
+ role: role,
16752
+ onDelete: handleOpenDeleteNoteDialog,
16753
+ onUpdate: handleOpenNoteDialog,
16754
+ onView: handleOpenNoteDrawer
16755
+ });
16756
+ }
16757
+ }), !data.length && !isLoading && React__default.createElement(material.TableRow, null, React__default.createElement(material.TableCell, {
16758
+ colSpan: 12,
16759
+ className: "text-center text-muted"
16760
+ }, t("no_data"))), isLoading && React__default.createElement(material.TableRow, null, React__default.createElement(material.TableCell, {
16761
+ colSpan: 12
16762
+ }, React__default.createElement(material.Stack, {
16763
+ justifyContent: "center",
16764
+ alignItems: "center",
16765
+ width: "100%"
16766
+ }, React__default.createElement(material.CircularProgress, {
16767
+ size: 24
16768
+ }))))))), React__default.createElement("div", {
16769
+ className: "d-flex justify-content-end mt-3"
16770
+ }, !!paging.totalPages && React__default.createElement(material.Pagination, {
16771
+ count: paging.totalPages,
16772
+ page: paging.page,
16773
+ onChange: handleChangePage
16774
+ })))), React__default.createElement(NoteDrawer, {
16775
+ open: !!openNoteViewDrawer,
16776
+ data: selectedItem,
16777
+ student: selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.reciever,
16778
+ width: "80dvw",
16779
+ onClose: handleCloseNoteDrawer,
16780
+ anchor: "right"
16781
+ }), React__default.createElement(GeneralNoteDialog, {
16782
+ open: openNoteDialog !== undefined,
16783
+ type: openNoteDialog,
16784
+ onClose: handleCloseNoteDialog,
16785
+ onSaveNote: handleSaveNoteDialog,
16786
+ selectedNote: selectedItem,
16787
+ value: noteRequest
16788
+ }), React__default.createElement(ConfirmDialog, {
16789
+ open: openConfirmNote,
16790
+ toggle: handleCloseConfirmStudentNoteDialog,
16791
+ onConfirm: handleSaveStudentNote,
16792
+ text: t("are_you_sure_to_create_student_parent_note")
16793
+ }), React__default.createElement(ConfirmDeleteDialog, {
16794
+ open: openDeleteNoteDialog,
16795
+ toggle: handleCloseDeleteDialog,
16796
+ onConfirm: handleDeleteNote,
16797
+ text: t("are_you_sure_you_want_to_delete_the_note"),
16798
+ title: t("delete_note"),
16799
+ okText: t("delete_note"),
16800
+ cancelText: t("cancel")
16801
+ }));
16802
+ };
16803
+
16804
+ var NotetabPanel = function NotetabPanel(_ref) {
16805
+ var children = _ref.children,
16806
+ value = _ref.value,
16807
+ index = _ref.index;
16808
+ return React__default.createElement("div", {
16809
+ role: "tabpanel",
16810
+ hidden: value !== index,
16811
+ id: "tabpanel-" + index,
16812
+ "aria-labelledby": "tab-" + index
16813
+ }, value === index && React__default.createElement(material.Box, {
16814
+ sx: {
16815
+ p: 2
16816
+ }
16817
+ }, React__default.createElement(material.Typography, null, children)));
16818
+ };
16819
+
16820
+ var NOTE_STUDENT_HEADERS = [{
16821
+ title: "#"
16822
+ }, {
16823
+ title: "sender",
16824
+ sortKey: "User.UserProfile.FullName"
16825
+ }, {
16826
+ title: "student",
16827
+ sortKey: "Student.UserProfile.FullName"
16828
+ }, {
16829
+ title: "content"
16830
+ }, {
16831
+ title: "type"
16832
+ }, {
16833
+ title: "created_at",
16834
+ sortKey: "CreatedAt"
16835
+ }, {
16836
+ title: "actions"
16837
+ }];
16838
+ var NOTE_TEACHER_HEADERS = [{
16839
+ title: "#"
16840
+ }, {
16841
+ title: "sender",
16842
+ sortKey: "User.UserProfile.FullName"
16843
+ }, {
16844
+ title: "receivers"
16845
+ }, {
16846
+ title: "content"
16847
+ }, {
16848
+ title: "type"
16849
+ }, {
16850
+ title: "created_at",
16851
+ sortKey: "CreatedAt"
16852
+ }, {
16853
+ title: "actions"
16854
+ }];
16855
+ var NOTE_ADMIN_HEADERS = [{
16856
+ title: "#"
16857
+ }, {
16858
+ title: "sender",
16859
+ sortKey: "User.UserProfile.FullName"
16860
+ }, {
16861
+ title: "receivers"
16862
+ }, {
16863
+ title: "content"
16864
+ }, {
16865
+ title: "type"
16866
+ }, {
16867
+ title: "created_at",
16868
+ sortKey: "CreatedAt"
16869
+ }, {
16870
+ title: "actions"
16871
+ }];
16872
+ var ACADEMY_NOTE_FILTER = {
16873
+ currentPage: 1,
16874
+ pageSize: 12,
16875
+ sortColumnDirection: exports.OrderType.DESC,
16876
+ sortColumnName: NoteSortColumn.CreatedAt,
16877
+ types: [exports.NoteType.ToAcademy]
16878
+ };
16879
+ var STUDENT_PARENTS_NOTE_FILTER = {
16880
+ currentPage: 1,
16881
+ pageSize: 12,
16882
+ sortColumnDirection: exports.OrderType.DESC,
16883
+ sortColumnName: NoteSortColumn.CreatedAt,
16884
+ types: [exports.NoteType.ToStudent]
16885
+ };
16886
+ var ADMIN_TEACHER_NOTE_FILTER = {
16887
+ currentPage: 1,
16888
+ pageSize: 12,
16889
+ sortColumnDirection: exports.OrderType.DESC,
16890
+ sortColumnName: NoteSortColumn.CreatedAt,
16891
+ types: [exports.NoteType.TeacherToAllAdmin, exports.NoteType.AdminToAllTeacher]
16892
+ };
16893
+ var ADMIN_NOTE_FILTER = {
16894
+ currentPage: 1,
16895
+ pageSize: 12,
16896
+ sortColumnDirection: exports.OrderType.DESC,
16897
+ sortColumnName: NoteSortColumn.CreatedAt,
16898
+ types: [exports.NoteType.TeacherToAllAdmin, exports.NoteType.AdminToAllTeacher, exports.NoteType.AdminToAllAdmin]
16899
+ };
16900
+ var TEACHER_NOTE_FILTER = {
16901
+ currentPage: 1,
16902
+ pageSize: 12,
16903
+ sortColumnDirection: exports.OrderType.DESC,
16904
+ sortColumnName: NoteSortColumn.CreatedAt,
16905
+ types: [exports.NoteType.TeacherToTeachers]
16906
+ };
16907
+
16908
+ var NoteTabs = function NoteTabs(_ref) {
16909
+ var role = _ref.role;
16910
+ var roles = reactRedux.useSelector(function (state) {
16911
+ var _state$common$user$ro, _state$common, _state$common$user;
16912
+ return (_state$common$user$ro = state === null || state === void 0 ? void 0 : (_state$common = state.common) === null || _state$common === void 0 ? void 0 : (_state$common$user = _state$common.user) === null || _state$common$user === void 0 ? void 0 : _state$common$user.roles) != null ? _state$common$user$ro : [];
16913
+ });
16914
+ var isAdminUser = roles.includes(exports.Role.Admin);
16915
+ var isAdmin = roles.includes(exports.Role.Admin);
16916
+ var _useState = React.useState(0),
16917
+ value = _useState[0],
16918
+ setValue = _useState[1];
16919
+ var handleChange = function handleChange(_event, newValue) {
16920
+ setValue(newValue);
16921
+ };
16922
+ return React__default.createElement(material.Box, {
16923
+ sx: {
16924
+ width: "100%"
16925
+ }
16926
+ }, React__default.createElement(material.Tabs, {
16927
+ value: value,
16928
+ onChange: handleChange,
16929
+ sx: {
16930
+ "& .MuiTab-root": {
16931
+ color: grey[500],
16932
+ fontSize: "1rem"
16933
+ },
16934
+ "& .Mui-selected": {
16935
+ color: green[700] + "!important"
16936
+ },
16937
+ "& .MuiTabs-indicator": {
16938
+ backgroundColor: green[700]
16939
+ }
16940
+ }
16941
+ }, React__default.createElement(material.Tab, Object.assign({
16942
+ label: i18n.t("academy")
16943
+ }, a11yProps$1(0))), React__default.createElement(material.Tab, Object.assign({
16944
+ label: i18n.t("student_parents")
16945
+ }, a11yProps$1(1))), React__default.createElement(material.Tab, Object.assign({
16946
+ label: i18n.t("admin")
16947
+ }, a11yProps$1(2))), !isAdmin && !isAdminUser && React__default.createElement(material.Tab, Object.assign({
16948
+ label: i18n.t("teacher")
16949
+ }, a11yProps$1(3)))), React__default.createElement(NotetabPanel, {
16950
+ value: value,
16951
+ index: 0
16952
+ }, React__default.createElement(NoteList, {
16953
+ role: role,
16954
+ isAdmin: isAdmin,
16955
+ defaultFilter: ACADEMY_NOTE_FILTER,
16956
+ headers: NOTE_STUDENT_HEADERS
16957
+ })), React__default.createElement(NotetabPanel, {
16958
+ value: value,
16959
+ index: 1
16960
+ }, React__default.createElement(NoteList, {
16961
+ role: role,
16962
+ isAdmin: isAdmin,
16963
+ defaultFilter: STUDENT_PARENTS_NOTE_FILTER,
16964
+ headers: NOTE_STUDENT_HEADERS
16965
+ })), React__default.createElement(NotetabPanel, {
16966
+ value: value,
16967
+ index: 2
16968
+ }, React__default.createElement(NoteList, {
16969
+ role: role,
16970
+ isAdmin: isAdmin,
16971
+ defaultFilter: isAdmin ? ADMIN_NOTE_FILTER : ADMIN_TEACHER_NOTE_FILTER,
16972
+ headers: NOTE_ADMIN_HEADERS
16973
+ })), !isAdmin && !isAdminUser && React__default.createElement(NotetabPanel, {
16974
+ value: value,
16975
+ index: 3
16976
+ }, React__default.createElement(NoteList, {
16977
+ role: role,
16978
+ isAdmin: isAdmin,
16979
+ defaultFilter: TEACHER_NOTE_FILTER,
16980
+ headers: NOTE_TEACHER_HEADERS
15912
16981
  })));
15913
16982
  };
16983
+ function a11yProps$1(index) {
16984
+ return {
16985
+ id: "tab-" + index,
16986
+ "aria-controls": "tabpanel-" + index
16987
+ };
16988
+ }
15914
16989
 
15915
- var useVirtualList = function useVirtualList(studentId, defaultFilter, getItemsApi) {
16990
+ var useVirtualList = function useVirtualList(defaultFilter, getItemsApi) {
15916
16991
  var _useTranslation = reactI18next.useTranslation(),
15917
16992
  t = _useTranslation.t;
15918
16993
  var _useState = React.useState([]),
@@ -15926,7 +17001,7 @@ var useVirtualList = function useVirtualList(studentId, defaultFilter, getItemsA
15926
17001
  setSelectedItem = _useState3[1];
15927
17002
  var _useState4 = React.useState(false),
15928
17003
  isLoading = _useState4[0],
15929
- setLoadingExamSessions = _useState4[1];
17004
+ setLoading = _useState4[1];
15930
17005
  var _useState5 = React.useState(),
15931
17006
  filter = _useState5[0],
15932
17007
  setFilter = _useState5[1];
@@ -15936,18 +17011,16 @@ var useVirtualList = function useVirtualList(studentId, defaultFilter, getItemsA
15936
17011
  var getItems = function getItems() {
15937
17012
  try {
15938
17013
  var _temp2 = function _temp2() {
15939
- setLoadingExamSessions(false);
17014
+ setLoading(false);
15940
17015
  };
15941
17016
  if (isLoading) return Promise.resolve();
15942
17017
  if (!filter || !filter.currentPage) {
15943
17018
  setItems([]);
15944
17019
  return Promise.resolve();
15945
17020
  }
15946
- setLoadingExamSessions(true);
17021
+ setLoading(true);
15947
17022
  var _temp = _catch(function () {
15948
- return Promise.resolve(getItemsApi(_extends({}, filter, {
15949
- studentId: studentId
15950
- }))).then(function (res) {
17023
+ return Promise.resolve(getItemsApi(filter)).then(function (res) {
15951
17024
  var responseData = res.data;
15952
17025
  setTotalPages((responseData === null || responseData === void 0 ? void 0 : responseData.totalPages) || 0);
15953
17026
  var responseItems = (responseData === null || responseData === void 0 ? void 0 : responseData.items) || [];
@@ -15986,23 +17059,25 @@ var useVirtualList = function useVirtualList(studentId, defaultFilter, getItemsA
15986
17059
  });
15987
17060
  setItems(results);
15988
17061
  };
15989
- var handleItemRemoved = function handleItemRemoved(item) {
15990
- var results = items.filter(function (i) {
15991
- return i.id !== item.id;
15992
- });
15993
- setItems(results);
17062
+ var handleItemRemoved = function handleItemRemoved(_item) {
17063
+ getItems();
17064
+ };
17065
+ var handleChangeFilter = function handleChangeFilter(newFilter) {
17066
+ setFilter(newFilter);
15994
17067
  };
15995
17068
  React.useEffect(function () {
15996
17069
  setFilter(defaultFilter);
15997
17070
  }, [JSON.stringify(defaultFilter)]);
15998
17071
  React.useEffect(function () {
15999
17072
  getItems();
16000
- }, [JSON.stringify(filter)]);
17073
+ }, [JSON.stringify(filter), getItemsApi]);
16001
17074
  return {
16002
17075
  t: t,
17076
+ filter: filter,
16003
17077
  selectedItem: selectedItem,
16004
17078
  items: items,
16005
17079
  isLoading: isLoading,
17080
+ handleChangeFilter: handleChangeFilter,
16006
17081
  setItems: setItems,
16007
17082
  handleChangeSelectedItem: handleChangeSelectedItem,
16008
17083
  handleLoadMore: handleLoadMore,
@@ -16054,8 +17129,9 @@ var useDrawerNoteTab = function useDrawerNoteTab(props) {
16054
17129
  var _useState6 = React.useState(),
16055
17130
  noteIdContextMenu = _useState6[0],
16056
17131
  setNoteIdContextMenu = _useState6[1];
16057
- var _useVirtualList = useVirtualList(studentId, _extends({}, DEFAULT_NOTE_FILTER, {
16058
- type: exports.NoteType.Default
17132
+ var _useVirtualList = useVirtualList(_extends({}, DEFAULT_NOTE_FILTER, {
17133
+ types: [exports.NoteType.ToAcademy],
17134
+ studentId: studentId
16059
17135
  }), getNotesApi$1),
16060
17136
  academyNotes = _useVirtualList.items,
16061
17137
  isLoadingAcademyNotes = _useVirtualList.isLoading,
@@ -16065,8 +17141,9 @@ var useDrawerNoteTab = function useDrawerNoteTab(props) {
16065
17141
  handleItemAddedAcademyNote = _useVirtualList.handleItemAdded,
16066
17142
  handleItemUpdatedAcademyNote = _useVirtualList.handleItemUpdated,
16067
17143
  handleChangeSelectedItem = _useVirtualList.handleChangeSelectedItem;
16068
- var _useVirtualList2 = useVirtualList(studentId, _extends({}, DEFAULT_NOTE_FILTER, {
16069
- type: exports.NoteType.StudentReadable
17144
+ var _useVirtualList2 = useVirtualList(_extends({}, DEFAULT_NOTE_FILTER, {
17145
+ types: [exports.NoteType.ToStudent],
17146
+ studentId: studentId
16070
17147
  }), getNotesApi$1),
16071
17148
  studentNotes = _useVirtualList2.items,
16072
17149
  isLoadingStudentNotes = _useVirtualList2.isLoading,
@@ -16083,11 +17160,11 @@ var useDrawerNoteTab = function useDrawerNoteTab(props) {
16083
17160
  };
16084
17161
  var handleOpenCreateAcademyNoteDialog = function handleOpenCreateAcademyNoteDialog() {
16085
17162
  handleCloseTooltip();
16086
- setOpenNoteDialog(exports.NoteType.Default);
17163
+ setOpenNoteDialog(exports.NoteType.ToAcademy);
16087
17164
  };
16088
17165
  var handleOpenCreateStudentNoteDialog = function handleOpenCreateStudentNoteDialog() {
16089
17166
  handleCloseTooltip();
16090
- setOpenNoteDialog(exports.NoteType.StudentReadable);
17167
+ setOpenNoteDialog(exports.NoteType.ToStudent);
16091
17168
  };
16092
17169
  var handleCloseTooltip = function handleCloseTooltip() {
16093
17170
  setNoteIdContextMenu(0);
@@ -16138,7 +17215,7 @@ var useDrawerNoteTab = function useDrawerNoteTab(props) {
16138
17215
  var _temp = function () {
16139
17216
  if (selectedItem) {
16140
17217
  return Promise.resolve(updateNoteApi$1(selectedItem.id, data.content)).then(function (res) {
16141
- if (selectedItem.type === exports.NoteType.StudentReadable) handleItemUpdatedStudentNote(res.data);else handleItemUpdatedAcademyNote(res.data);
17218
+ if (selectedItem.type === exports.NoteType.ToStudent) handleItemUpdatedStudentNote(res.data);else handleItemUpdatedAcademyNote(res.data);
16142
17219
  reactToastify.toast.success(t("update_note_successfully"));
16143
17220
  });
16144
17221
  } else {
@@ -16146,7 +17223,7 @@ var useDrawerNoteTab = function useDrawerNoteTab(props) {
16146
17223
  return Promise.resolve(createNoteApi$1(_extends({}, data, {
16147
17224
  type: openNoteDialog
16148
17225
  }))).then(function (res) {
16149
- if (res.data.type === exports.NoteType.StudentReadable) handleItemAddedStudentNote(res.data);else handleItemAddedAcademyNote(res.data);
17226
+ if (res.data.type === exports.NoteType.ToStudent) handleItemAddedStudentNote(res.data);else handleItemAddedAcademyNote(res.data);
16150
17227
  reactToastify.toast.success(t("create_note_successfully"));
16151
17228
  });
16152
17229
  }
@@ -16179,7 +17256,7 @@ var useDrawerNoteTab = function useDrawerNoteTab(props) {
16179
17256
  var _temp5 = _catch(function () {
16180
17257
  return Promise.resolve(deleteNoteApi$1(selectedItem.id)).then(function () {
16181
17258
  reactToastify.toast.success(t("delete_note_successfully"));
16182
- if (selectedItem.type === exports.NoteType.StudentReadable) handleItemRemovedStudentNote(selectedItem);else handleItemRemovedAcademyNote(selectedItem);
17259
+ if (selectedItem.type === exports.NoteType.ToStudent) handleItemRemovedStudentNote(selectedItem);else handleItemRemovedAcademyNote(selectedItem);
16183
17260
  reset();
16184
17261
  });
16185
17262
  }, function (error) {
@@ -16201,14 +17278,12 @@ var useDrawerNoteTab = function useDrawerNoteTab(props) {
16201
17278
  handleSaveNote(studentNoteContent);
16202
17279
  };
16203
17280
  var noteDialogProps = {
16204
- open: openNoteDialog === exports.NoteType.StudentReadable && !openConfirmNote || openNoteDialog === exports.NoteType.Default,
17281
+ open: openNoteDialog === exports.NoteType.ToStudent && !openConfirmNote || openNoteDialog === exports.NoteType.ToAcademy,
16205
17282
  selectedNote: selectedItem,
16206
- tip: " (" + t(openNoteDialog === exports.NoteType.StudentReadable ? "student_parents" : "academy") + ")",
17283
+ tip: " (" + t(openNoteDialog === exports.NoteType.ToStudent ? "student_parents" : "academy") + ")",
16207
17284
  value: studentNoteContent,
16208
17285
  onClose: handleCloseNoteDialog,
16209
- onSaveNote: openNoteDialog === exports.NoteType.StudentReadable && !(selectedItem !== null && selectedItem !== void 0 && selectedItem.id) ? handleOpenConfirmStudentNoteDialog : function (content) {
16210
- return handleSaveNote(content);
16211
- }
17286
+ onSaveNote: openNoteDialog === exports.NoteType.ToStudent && !(selectedItem !== null && selectedItem !== void 0 && selectedItem.id) ? handleOpenConfirmStudentNoteDialog : handleSaveNote
16212
17287
  };
16213
17288
  return {
16214
17289
  openConfirmNote: openConfirmNote,
@@ -16475,11 +17550,11 @@ var DrawerInfoTab = function DrawerInfoTab(_ref) {
16475
17550
  }
16476
17551
  }, data ? React__default.createElement(material.Typography, {
16477
17552
  sx: contentStyle
16478
- }, t(function (label) {
17553
+ }, !!data.grade ? t(function (label) {
16479
17554
  return label ? t(label) : formatGrade(data.grade, t, language);
16480
17555
  }((_BRIEF_GRADE_OPTIONS$ = BRIEF_GRADE_OPTIONS.find(function (o) {
16481
17556
  return o.value === Number(data.grade);
16482
- })) === null || _BRIEF_GRADE_OPTIONS$ === void 0 ? void 0 : _BRIEF_GRADE_OPTIONS$.label))) : React__default.createElement(material.Skeleton, {
17557
+ })) === null || _BRIEF_GRADE_OPTIONS$ === void 0 ? void 0 : _BRIEF_GRADE_OPTIONS$.label)) : "") : React__default.createElement(material.Skeleton, {
16483
17558
  variant: "text",
16484
17559
  width: 20,
16485
17560
  sx: contentStyle
@@ -16672,7 +17747,7 @@ var ExamResultItem = function ExamResultItem(_ref) {
16672
17747
  }, (_data$teacher = data.teacher) === null || _data$teacher === void 0 ? void 0 : _data$teacher.fullName))))));
16673
17748
  };
16674
17749
 
16675
- var ExanResultList = function ExanResultList(_ref) {
17750
+ var ExamResultList = function ExamResultList(_ref) {
16676
17751
  var studentId = _ref.studentId,
16677
17752
  data = _ref.data,
16678
17753
  isLoading = _ref.isLoading,
@@ -22026,7 +23101,7 @@ var ExamResultDrawer = function ExamResultDrawer(_ref) {
22026
23101
  fontSize: "13px",
22027
23102
  fontWeight: 500
22028
23103
  }
22029
- }, student.schoolName), React__default.createElement(material.Typography, {
23104
+ }, student.schoolName), !!student.grade && React__default.createElement(material.Typography, {
22030
23105
  sx: {
22031
23106
  color: grey[500],
22032
23107
  fontSize: "13px",
@@ -22064,7 +23139,9 @@ var DrawerExamResultTab = function DrawerExamResultTab(_ref) {
22064
23139
  value = _ref.value,
22065
23140
  studentId = _ref.studentId,
22066
23141
  onViewQA = _ref.onViewQA;
22067
- var _useVirtualList = useVirtualList(studentId, EXAM_SESSION_DEFAULT_FILTER, getExamSessionListApi),
23142
+ var _useVirtualList = useVirtualList(_extends({}, EXAM_SESSION_DEFAULT_FILTER, {
23143
+ studentId: studentId
23144
+ }), getExamSessionListApi),
22068
23145
  items = _useVirtualList.items,
22069
23146
  selectedItem = _useVirtualList.selectedItem,
22070
23147
  isLoading = _useVirtualList.isLoading,
@@ -22081,7 +23158,7 @@ var DrawerExamResultTab = function DrawerExamResultTab(_ref) {
22081
23158
  p: 3,
22082
23159
  height: "100%"
22083
23160
  }
22084
- }, React__default.createElement(ExanResultList, {
23161
+ }, React__default.createElement(ExamResultList, {
22085
23162
  data: items,
22086
23163
  isLoading: isLoading,
22087
23164
  onLoadMore: handleLoadMore,
@@ -24830,7 +25907,9 @@ var DrawerTextbookResultTab = function DrawerTextbookResultTab(_ref) {
24830
25907
  selectedTab = _ref.selectedTab,
24831
25908
  value = _ref.value,
24832
25909
  onViewQA = _ref.onViewQA;
24833
- var _useVirtualList = useVirtualList(studentId, TEXTBOOK_DEFAULT_FILTER, getTextbookListApi),
25910
+ var _useVirtualList = useVirtualList(_extends({}, TEXTBOOK_DEFAULT_FILTER, {
25911
+ studentId: studentId
25912
+ }), getTextbookListApi),
24834
25913
  items = _useVirtualList.items,
24835
25914
  selectedItem = _useVirtualList.selectedItem,
24836
25915
  isLoading = _useVirtualList.isLoading,
@@ -25228,9 +26307,10 @@ var useDrawerAttendanceTab = function useDrawerAttendanceTab(studentId, onUpdate
25228
26307
  var pusher = concurrentConnectionPusher === null || concurrentConnectionPusher === void 0 ? void 0 : concurrentConnectionPusher.pusher;
25229
26308
  var channelName = React.useRef();
25230
26309
  var channel = React.useRef();
25231
- var _useVirtualList = useVirtualList(studentId, ATTENDANCE_COURSE_DEFAULT_FILTER, function (query) {
25232
- return getAttendanceByStudentIdApi(studentId, query);
25233
- }),
26310
+ var handleGetAttendanceByStudentId = React.useCallback(function (query) {
26311
+ return getAttendanceByStudentIdApi(studentId, query);
26312
+ }, [studentId]);
26313
+ var _useVirtualList = useVirtualList(ATTENDANCE_COURSE_DEFAULT_FILTER, handleGetAttendanceByStudentId),
25234
26314
  items = _useVirtualList.items,
25235
26315
  isLoading = _useVirtualList.isLoading,
25236
26316
  handleLoadMore = _useVirtualList.handleLoadMore,
@@ -26316,9 +27396,9 @@ var useLessonClassList = function useLessonClassList(courseId) {
26316
27396
  };
26317
27397
  };
26318
27398
 
26319
- var TEACHER_URL = BASE_URL + "/api/teacher";
26320
- var getTeacherListApi = function getTeacherListApi(query) {
26321
- return api.get("" + TEACHER_URL, {
27399
+ var TEACHER_URL$1 = BASE_URL + "/api/teacher";
27400
+ var getTeacherListApi$1 = function getTeacherListApi(query) {
27401
+ return api.get("" + TEACHER_URL$1, {
26322
27402
  params: query
26323
27403
  });
26324
27404
  };
@@ -26339,7 +27419,7 @@ var useTeacherList = function useTeacherList() {
26339
27419
  var getListTeacher = function getListTeacher() {
26340
27420
  try {
26341
27421
  var _temp = _catch(function () {
26342
- return Promise.resolve(getTeacherListApi(teacherFilter)).then(function (res) {
27422
+ return Promise.resolve(getTeacherListApi$1(teacherFilter)).then(function (res) {
26343
27423
  var _res$data;
26344
27424
  setTeachers(((_res$data = res.data) === null || _res$data === void 0 ? void 0 : _res$data.items) || []);
26345
27425
  });
@@ -26409,11 +27489,6 @@ var useClassDetail = function useClassDetail(_ref) {
26409
27489
  var isSelected = function isSelected(id) {
26410
27490
  return selected.indexOf(id) !== -1;
26411
27491
  };
26412
- var registerPusherRef = React.useRef(true);
26413
- var isReadyRegisterPusher = reactRedux.useSelector(function (state) {
26414
- var _state$common2;
26415
- return state === null || state === void 0 ? void 0 : (_state$common2 = state.common) === null || _state$common2 === void 0 ? void 0 : _state$common2.isReadyRegisterPusher;
26416
- });
26417
27492
  var _useStudentClassList = useStudentClassList(classId),
26418
27493
  getStudents = _useStudentClassList.getStudents,
26419
27494
  studentListProps = _objectWithoutPropertiesLoose(_useStudentClassList, _excluded$b);
@@ -26803,12 +27878,6 @@ var useClassDetail = function useClassDetail(_ref) {
26803
27878
  React.useEffect(function () {
26804
27879
  document.title = t("study_peak") + " | " + t(PAGE_TITLE$4);
26805
27880
  }, [t]);
26806
- React.useEffect(function () {
26807
- if (!isReadyRegisterPusher && registerPusherRef.current) {
26808
- dispatch(setReadyRegisterPusher(true));
26809
- registerPusherRef.current = false;
26810
- }
26811
- }, [isReadyRegisterPusher]);
26812
27881
  return {
26813
27882
  classId: classId,
26814
27883
  schema: schema,
@@ -28473,11 +29542,6 @@ var useUserList = function useUserList(role) {
28473
29542
  setOpenDeleteUserCsv = _useState10[1];
28474
29543
  var inputFileRef = React.useRef(null);
28475
29544
  var firstLoadRef = React.useRef(true);
28476
- var registerPusherRef = React.useRef(true);
28477
- var isReadyRegisterPusher = reactRedux.useSelector(function (state) {
28478
- var _state$common;
28479
- return state === null || state === void 0 ? void 0 : (_state$common = state.common) === null || _state$common === void 0 ? void 0 : _state$common.isReadyRegisterPusher;
28480
- });
28481
29545
  var handleChangeSelectedStudent = function handleChangeSelectedStudent(student) {
28482
29546
  var _student$roles, _student$roles2;
28483
29547
  var isStudent = ((_student$roles = student.roles) === null || _student$roles === void 0 ? void 0 : _student$roles.includes(exports.Role.Student)) && ((_student$roles2 = student.roles) === null || _student$roles2 === void 0 ? void 0 : _student$roles2.length) === 1;
@@ -28789,12 +29853,6 @@ var useUserList = function useUserList(role) {
28789
29853
  var userHeaders = USER_HEADERS.filter(function (i) {
28790
29854
  return i.roles.includes(role);
28791
29855
  });
28792
- React.useEffect(function () {
28793
- if (!isReadyRegisterPusher && registerPusherRef.current) {
28794
- dispatch(setReadyRegisterPusher(true));
28795
- registerPusherRef.current = false;
28796
- }
28797
- }, [isReadyRegisterPusher]);
28798
29856
  return {
28799
29857
  userDetail: userDetail,
28800
29858
  userHeaders: userHeaders,
@@ -30726,9 +31784,9 @@ var TextbookSortBy$1;
30726
31784
  var TeacherSortBy$1;
30727
31785
  (function (TeacherSortBy) {
30728
31786
  TeacherSortBy["CreatedAt"] = "CreatedAt";
30729
- TeacherSortBy["Name"] = "UserProfile.FullName";
30730
- TeacherSortBy["Email"] = "Email";
30731
- TeacherSortBy["PhoneNumber"] = "UserProfile.PhoneNumber";
31787
+ TeacherSortBy["Name"] = "User.UserProfile.FullName";
31788
+ TeacherSortBy["Email"] = "User.Email";
31789
+ TeacherSortBy["PhoneNumber"] = "User.UserProfile.PhoneNumber";
30732
31790
  })(TeacherSortBy$1 || (TeacherSortBy$1 = {}));
30733
31791
  var ExamType$1;
30734
31792
  (function (ExamType) {
@@ -32495,9 +33553,9 @@ var ShareToTeacherDialog = function ShareToTeacherDialog(_ref) {
32495
33553
  }, t("cancel")))));
32496
33554
  };
32497
33555
 
32498
- var TEACHER_URL$1 = BASE_URL + "/api/teacher";
32499
- var getTeacherListApi$1 = function getTeacherListApi(query) {
32500
- return api.get("" + TEACHER_URL$1, {
33556
+ var TEACHER_URL$2 = BASE_URL + "/api/teacher";
33557
+ var getTeacherListApi$2 = function getTeacherListApi(query) {
33558
+ return api.get("" + TEACHER_URL$2, {
32501
33559
  params: query
32502
33560
  });
32503
33561
  };
@@ -32508,7 +33566,7 @@ var useTextbookShare = function useTextbookShare(props) {
32508
33566
  role = props.role,
32509
33567
  isSuperAdmin = props.isSuperAdmin;
32510
33568
  var _useList = useList(!isSuperAdmin ? function (search) {
32511
- return getTeacherListApi$1(search);
33569
+ return getTeacherListApi$2(search);
32512
33570
  } : null, DefaultTeacherQuery),
32513
33571
  filterShare = _useList.filter,
32514
33572
  textSearchShareRef = _useList.textSearchRef,
@@ -37539,17 +38597,17 @@ var PreparedTextbookForm = function PreparedTextbookForm(_ref) {
37539
38597
  sx: {
37540
38598
  color: inforErrors && submitCount ? error.main + "!important" : "gray"
37541
38599
  }
37542
- }, a11yProps$1(0))), React__default.createElement(material.Tab, Object.assign({
38600
+ }, a11yProps$2(0))), React__default.createElement(material.Tab, Object.assign({
37543
38601
  label: i18n.t("textbook.contents"),
37544
38602
  sx: {
37545
38603
  color: contentsErrors && submitCount ? error.main + "!important" : "gray"
37546
38604
  }
37547
- }, a11yProps$1(1))), !(values !== null && values !== void 0 && values.isPublic) && (!isSuperAdmin || textbookId) && (!textbookId && !isAdmin || (values === null || values === void 0 ? void 0 : values.isShared)) && React__default.createElement(material.Tab, Object.assign({
38605
+ }, a11yProps$2(1))), !(values !== null && values !== void 0 && values.isPublic) && (!isSuperAdmin || textbookId) && (!textbookId && !isAdmin || (values === null || values === void 0 ? void 0 : values.isShared)) && React__default.createElement(material.Tab, Object.assign({
37548
38606
  label: i18n.t("textbook.owners"),
37549
38607
  sx: {
37550
38608
  color: textbookOwnersErrors && submitCount ? error.main + "!important" : "gray"
37551
38609
  }
37552
- }, a11yProps$1(2))))), React__default.createElement(CustomTextbookTab, {
38610
+ }, a11yProps$2(2))))), React__default.createElement(CustomTextbookTab, {
37553
38611
  value: selected,
37554
38612
  index: 0
37555
38613
  }, React__default.createElement(TextbookInfoTab, Object.assign({}, formikProps, {
@@ -37571,7 +38629,7 @@ var PreparedTextbookForm = function PreparedTextbookForm(_ref) {
37571
38629
  disabled: ownersDisabled
37572
38630
  }))))));
37573
38631
  };
37574
- var a11yProps$1 = function a11yProps(index) {
38632
+ var a11yProps$2 = function a11yProps(index) {
37575
38633
  return {
37576
38634
  id: "textbook-tab-" + index,
37577
38635
  "aria-controls": "textbook-tabpanel-" + index
@@ -37968,6 +39026,448 @@ var PreparedTextbookList = function PreparedTextbookList(_ref) {
37968
39026
  }));
37969
39027
  };
37970
39028
 
39029
+ var AnnouncementEvent;
39030
+ (function (AnnouncementEvent) {
39031
+ AnnouncementEvent["ReceivedNewNote"] = "ReceivedNewNote";
39032
+ AnnouncementEvent["UpdatedNote"] = "UpdatedNote";
39033
+ AnnouncementEvent["DeletedNote"] = "DeletedNote";
39034
+ })(AnnouncementEvent || (AnnouncementEvent = {}));
39035
+ (function (AnnouncementType) {
39036
+ AnnouncementType["ReceivedNewNote"] = "ReceivedNewNote";
39037
+ })(exports.AnnouncementType || (exports.AnnouncementType = {}));
39038
+
39039
+ var stringToColor = function stringToColor(string) {
39040
+ var hash = 0;
39041
+ var i;
39042
+ for (i = 0; i < string.length; i += 1) {
39043
+ hash = string.charCodeAt(i) + ((hash << 5) - hash);
39044
+ }
39045
+ var color = "#";
39046
+ for (i = 0; i < 3; i += 1) {
39047
+ var value = hash >> i * 8 & 0xff;
39048
+ color += ("00" + value.toString(16)).slice(-2);
39049
+ }
39050
+ return color;
39051
+ };
39052
+ var stringAvatar = function stringAvatar(name) {
39053
+ var _name$split$0$, _name$split$, _name$split$1$, _name$split$2;
39054
+ return {
39055
+ sx: {
39056
+ bgcolor: stringToColor(name)
39057
+ },
39058
+ children: "" + ((_name$split$0$ = (_name$split$ = name.split(" ")[0]) === null || _name$split$ === void 0 ? void 0 : _name$split$[0]) != null ? _name$split$0$ : "") + ((_name$split$1$ = (_name$split$2 = name.split(" ")[1]) === null || _name$split$2 === void 0 ? void 0 : _name$split$2[0]) != null ? _name$split$1$ : "")
39059
+ };
39060
+ };
39061
+ var convertAnnouncementData = function convertAnnouncementData(t, role, announcement) {
39062
+ var isTeacherSite = role === exports.Role.Teacher;
39063
+ var data = announcement.data;
39064
+ switch (announcement.type) {
39065
+ case exports.AnnouncementType.ReceivedNewNote:
39066
+ var extraData = data.data;
39067
+ var contents = extraData.split("|");
39068
+ var noteType = contents[0];
39069
+ var content = contents.slice(1).join("|");
39070
+ var isAdmin = noteType === exports.NoteType[exports.NoteType.AdminToAllTeacher] || noteType === exports.NoteType[exports.NoteType.AdminToAllAdmin];
39071
+ return {
39072
+ content: content,
39073
+ name: isAdmin ? isTeacherSite ? t("admin") : t("admin_n", {
39074
+ admin: data.senderFullName
39075
+ }) : t("teacher_n", {
39076
+ teacher: data.senderFullName
39077
+ }),
39078
+ image: isAdmin && isTeacherSite ? undefined : data.senderAvatar,
39079
+ action: t("sent_a_memo")
39080
+ };
39081
+ default:
39082
+ return {
39083
+ name: data.senderFullName,
39084
+ image: data.senderAvatar,
39085
+ content: data.data,
39086
+ action: ""
39087
+ };
39088
+ }
39089
+ };
39090
+
39091
+ var AnnouncementItem = function AnnouncementItem(_ref) {
39092
+ var data = _ref.data,
39093
+ role = _ref.role,
39094
+ renderLink = _ref.renderLink,
39095
+ onLoad = _ref.onLoad;
39096
+ var _useTranslation = reactI18next.useTranslation(),
39097
+ t = _useTranslation.t;
39098
+ React.useEffect(function () {
39099
+ onLoad();
39100
+ }, []);
39101
+ var announcementData = convertAnnouncementData(t, role, data);
39102
+ return React__default.createElement(React.Fragment, null, renderLink(React__default.createElement(material.ListItemButton, {
39103
+ sx: _extends({
39104
+ py: 1.5,
39105
+ px: 2.5,
39106
+ mt: "1px"
39107
+ }, !data.isRead && {
39108
+ bgcolor: "action.selected"
39109
+ })
39110
+ }, React__default.createElement(material.Stack, {
39111
+ direction: "row",
39112
+ gap: 1,
39113
+ justifyContent: "space-between",
39114
+ width: "100%"
39115
+ }, React__default.createElement(material.Stack, {
39116
+ direction: "row",
39117
+ gap: 1
39118
+ }, React__default.createElement(material.ListItemAvatar, null, React__default.createElement(material.Avatar, Object.assign({}, stringAvatar(announcementData.name), {
39119
+ src: announcementData.image
39120
+ }))), React__default.createElement(material.ListItemText, {
39121
+ sx: {
39122
+ marginBlock: 0
39123
+ },
39124
+ primary: React__default.createElement(material.Typography, null, React__default.createElement(material.Typography, {
39125
+ fontWeight: 600,
39126
+ display: "inline-block"
39127
+ }, announcementData.name), announcementData.action && React__default.createElement(material.Typography, {
39128
+ display: "inline-block",
39129
+ px: "4px"
39130
+ }, announcementData.action + ":"), React__default.createElement(material.Typography, {
39131
+ display: "inline-block",
39132
+ sx: {
39133
+ display: "-webkit-box",
39134
+ lineClamp: 2,
39135
+ WebkitLineClamp: 2,
39136
+ WebkitBoxOrient: "vertical",
39137
+ boxOrient: "vertical",
39138
+ overflow: "hidden"
39139
+ },
39140
+ dangerouslySetInnerHTML: {
39141
+ __html: announcementData.content || ""
39142
+ }
39143
+ })),
39144
+ secondary: React__default.createElement(material.Typography, {
39145
+ variant: "caption",
39146
+ sx: {
39147
+ mt: 0.5,
39148
+ display: "flex",
39149
+ alignItems: "center",
39150
+ color: "text.disabled"
39151
+ }
39152
+ }, React__default.createElement(material.Box, {
39153
+ sx: {
39154
+ marginRight: "8px"
39155
+ }
39156
+ }, React__default.createElement(fa6.FaClockRotateLeft, {
39157
+ size: 12
39158
+ })), timAgo(data.createdAt, t, true))
39159
+ })))), data));
39160
+ };
39161
+
39162
+ var AnnouncementList = function AnnouncementList(_ref) {
39163
+ var role = _ref.role,
39164
+ items = _ref.items,
39165
+ isLoading = _ref.isLoading,
39166
+ onLoadMore = _ref.onLoadMore,
39167
+ renderLink = _ref.renderLink;
39168
+ return React__default.createElement(VirtualListView, {
39169
+ data: items,
39170
+ loading: isLoading,
39171
+ listHeight: 0,
39172
+ containerProps: {
39173
+ sx: {
39174
+ height: "100%"
39175
+ }
39176
+ },
39177
+ renderItem: function renderItem(item, index, measure) {
39178
+ return React__default.createElement(AnnouncementItem, {
39179
+ role: role,
39180
+ key: index,
39181
+ data: item,
39182
+ renderLink: renderLink,
39183
+ onLoad: measure
39184
+ });
39185
+ },
39186
+ onLoadMore: onLoadMore
39187
+ });
39188
+ };
39189
+
39190
+ var DEFAULT_ANNOUNCEMENT_FILTER = {
39191
+ currentPage: 1,
39192
+ pageSize: 10,
39193
+ sortColumnDirection: exports.OrderType.DESC,
39194
+ sortColumnName: "CreatedAt"
39195
+ };
39196
+ var ANNOUNCEMENT_CHANNEL = "ANNOUNCEMENT_A{academy}_U{userId}_CHANNEL";
39197
+
39198
+ var ANNOUNCEMENT_URL = BASE_URL + "/api/announcements";
39199
+ var getAnnouncementListApi = function getAnnouncementListApi(query) {
39200
+ return api.get("" + ANNOUNCEMENT_URL, {
39201
+ params: query
39202
+ });
39203
+ };
39204
+ var getTotalNumberUnreadAnnouncementsApi = function getTotalNumberUnreadAnnouncementsApi() {
39205
+ return api.get(ANNOUNCEMENT_URL + "/unread");
39206
+ };
39207
+ var markAsReadAnnouncementsApi = function markAsReadAnnouncementsApi() {
39208
+ return api.post(ANNOUNCEMENT_URL + "/mark-as-read");
39209
+ };
39210
+ var markAsReadAnnouncementByIdApi = function markAsReadAnnouncementByIdApi(id) {
39211
+ return api.post(ANNOUNCEMENT_URL + "/" + id + "/mark-as-read");
39212
+ };
39213
+
39214
+ var AnnouncementContainer = function AnnouncementContainer(_ref) {
39215
+ var role = _ref.role,
39216
+ renderLink = _ref.renderLink,
39217
+ renderViewNoteLink = _ref.renderViewNoteLink;
39218
+ var _useTranslation = reactI18next.useTranslation(),
39219
+ t = _useTranslation.t;
39220
+ var dispatch = reactRedux.useDispatch();
39221
+ var user = reactRedux.useSelector(function (state) {
39222
+ var _state$common;
39223
+ return state === null || state === void 0 ? void 0 : (_state$common = state.common) === null || _state$common === void 0 ? void 0 : _state$common.user;
39224
+ });
39225
+ var academyDomain = user === null || user === void 0 ? void 0 : user.academyDomain;
39226
+ var concurrentConnectionPusher = reactRedux.useSelector(function (state) {
39227
+ var _state$common2;
39228
+ return state === null || state === void 0 ? void 0 : (_state$common2 = state.common) === null || _state$common2 === void 0 ? void 0 : _state$common2.concurrentConnectionPusher;
39229
+ });
39230
+ var totalUnreadMessages = reactRedux.useSelector(function (state) {
39231
+ var _state$common3;
39232
+ return state === null || state === void 0 ? void 0 : (_state$common3 = state.common) === null || _state$common3 === void 0 ? void 0 : _state$common3.totalUnreadMessages;
39233
+ });
39234
+ var pusher = concurrentConnectionPusher === null || concurrentConnectionPusher === void 0 ? void 0 : concurrentConnectionPusher.pusher;
39235
+ var channel = React.useRef();
39236
+ var channelName = React.useRef();
39237
+ var _useState = React.useState(false),
39238
+ openPopover = _useState[0],
39239
+ setOpenPopover = _useState[1];
39240
+ var anchorEl = React.useRef(null);
39241
+ var handleOpenPopover = function handleOpenPopover() {
39242
+ setOpenPopover(true);
39243
+ };
39244
+ var handleClosePopover = function handleClosePopover() {
39245
+ setOpenPopover(false);
39246
+ };
39247
+ var _useVirtualList = useVirtualList({}, getAnnouncementListApi),
39248
+ filter = _useVirtualList.filter,
39249
+ items = _useVirtualList.items,
39250
+ isLoading = _useVirtualList.isLoading,
39251
+ handleLoadMore = _useVirtualList.handleLoadMore,
39252
+ handleItemAdded = _useVirtualList.handleItemAdded,
39253
+ setItems = _useVirtualList.setItems,
39254
+ handleChangeFilter = _useVirtualList.handleChangeFilter,
39255
+ getItems = _useVirtualList.getItems;
39256
+ var handleNewAnnouncement = function handleNewAnnouncement(data) {
39257
+ try {
39258
+ var announcement = JSON.parse(data);
39259
+ openPopover && handleItemAdded(announcement);
39260
+ } catch (error) {
39261
+ console.log(error);
39262
+ }
39263
+ dispatch(setTotalUnreadMessages(totalUnreadMessages + 1));
39264
+ };
39265
+ var handleDeletedAnnouncement = function handleDeletedAnnouncement(_data) {
39266
+ openPopover && getItems();
39267
+ handleGetTotalUnread();
39268
+ };
39269
+ var handleUpdatedAnnouncement = function handleUpdatedAnnouncement(data) {
39270
+ try {
39271
+ var announcement = JSON.parse(data);
39272
+ openPopover && setItems(function (state) {
39273
+ return state.map(function (i) {
39274
+ if (i.id !== announcement.id) return i;
39275
+ return _extends({}, i, {
39276
+ data: _extends({}, i.data, {
39277
+ data: announcement.data.data
39278
+ })
39279
+ });
39280
+ });
39281
+ });
39282
+ } catch (error) {
39283
+ console.log(error);
39284
+ }
39285
+ };
39286
+ var handleMarkAsRead = function handleMarkAsRead() {
39287
+ try {
39288
+ var _temp2 = function _temp2() {
39289
+ dispatch(setLoading(false));
39290
+ };
39291
+ dispatch(setLoading(true));
39292
+ var _temp = _catch(function () {
39293
+ return Promise.resolve(markAsReadAnnouncementsApi()).then(function () {
39294
+ setItems(function (state) {
39295
+ return state.map(function (i) {
39296
+ return _extends({}, i, {
39297
+ isRead: true
39298
+ });
39299
+ });
39300
+ });
39301
+ dispatch(setTotalUnreadMessages(0));
39302
+ });
39303
+ }, function (error) {
39304
+ reactToastify.toast.error(getErrorMessage(t, error));
39305
+ });
39306
+ return Promise.resolve(_temp && _temp.then ? _temp.then(_temp2) : _temp2(_temp));
39307
+ } catch (e) {
39308
+ return Promise.reject(e);
39309
+ }
39310
+ };
39311
+ var handleMarkAsReadById = function handleMarkAsReadById(id, loading) {
39312
+ try {
39313
+ var _temp4 = function _temp4() {
39314
+ loading && dispatch(setLoading(false));
39315
+ };
39316
+ loading && dispatch(setLoading(true));
39317
+ var _temp3 = _catch(function () {
39318
+ return Promise.resolve(markAsReadAnnouncementByIdApi(id)).then(function () {
39319
+ setItems(function (state) {
39320
+ return state.map(function (i) {
39321
+ return _extends({}, i, {
39322
+ isRead: i.id === id ? true : i.isRead
39323
+ });
39324
+ });
39325
+ });
39326
+ dispatch(setTotalUnreadMessages(Math.max(0, totalUnreadMessages - 1)));
39327
+ });
39328
+ }, function (error) {
39329
+ reactToastify.toast.error(getErrorMessage(t, error));
39330
+ });
39331
+ return Promise.resolve(_temp3 && _temp3.then ? _temp3.then(_temp4) : _temp4(_temp3));
39332
+ } catch (e) {
39333
+ return Promise.reject(e);
39334
+ }
39335
+ };
39336
+ var handleCloseAndMarkRead = function handleCloseAndMarkRead(data) {
39337
+ handleClosePopover();
39338
+ if (!data.isRead) handleMarkAsReadById(data.id);
39339
+ };
39340
+ var renderNotiLink = function renderNotiLink(children, data) {
39341
+ return renderLink(children, data, function () {
39342
+ return handleCloseAndMarkRead(data);
39343
+ });
39344
+ };
39345
+ var cleanupPusher = function cleanupPusher() {
39346
+ channel.current && channel.current.unbind(AnnouncementEvent.ReceivedNewNote, handleNewAnnouncement);
39347
+ channel.current && channel.current.unbind(AnnouncementEvent.UpdatedNote, handleUpdatedAnnouncement);
39348
+ channel.current && channel.current.unbind(AnnouncementEvent.DeletedNote, handleDeletedAnnouncement);
39349
+ channelName.current && pusher && pusher.unsubscribe(channelName.current);
39350
+ };
39351
+ React.useEffect(function () {
39352
+ if (concurrentConnectionPusher !== null && concurrentConnectionPusher !== void 0 && concurrentConnectionPusher.academyDomain && academyDomain && user !== null && user !== void 0 && user.id) {
39353
+ var normalizedAcademyDomain = academyDomain.trim().toUpperCase();
39354
+ channelName.current = ANNOUNCEMENT_CHANNEL.replace("{academy}", normalizedAcademyDomain).replace("{userId}", user.id);
39355
+ channel.current = pusher.subscribe(channelName.current);
39356
+ channel.current.bind(AnnouncementEvent.ReceivedNewNote, handleNewAnnouncement);
39357
+ channel.current.bind(AnnouncementEvent.UpdatedNote, handleUpdatedAnnouncement);
39358
+ channel.current.bind(AnnouncementEvent.DeletedNote, handleDeletedAnnouncement);
39359
+ }
39360
+ return cleanupPusher;
39361
+ }, [academyDomain, user === null || user === void 0 ? void 0 : user.id, concurrentConnectionPusher === null || concurrentConnectionPusher === void 0 ? void 0 : concurrentConnectionPusher.academyDomain, totalUnreadMessages, openPopover, JSON.stringify(filter)]);
39362
+ var handleGetTotalUnread = function handleGetTotalUnread() {
39363
+ try {
39364
+ var _temp5 = _catch(function () {
39365
+ return Promise.resolve(getTotalNumberUnreadAnnouncementsApi()).then(function (res) {
39366
+ dispatch(setTotalUnreadMessages(res.data));
39367
+ });
39368
+ }, function (error) {
39369
+ console.log({
39370
+ error: error
39371
+ });
39372
+ });
39373
+ return Promise.resolve(_temp5 && _temp5.then ? _temp5.then(function () {}) : void 0);
39374
+ } catch (e) {
39375
+ return Promise.reject(e);
39376
+ }
39377
+ };
39378
+ React.useEffect(function () {
39379
+ if (academyDomain && user !== null && user !== void 0 && user.id) handleGetTotalUnread();
39380
+ }, [academyDomain, user === null || user === void 0 ? void 0 : user.id]);
39381
+ React.useEffect(function () {
39382
+ handleChangeFilter(openPopover ? DEFAULT_ANNOUNCEMENT_FILTER : {});
39383
+ }, [openPopover]);
39384
+ return React__default.createElement(material.Box, null, React__default.createElement(material.IconButton, {
39385
+ ref: anchorEl,
39386
+ className: "ms-2",
39387
+ onClick: handleOpenPopover
39388
+ }, React__default.createElement(material.Badge, {
39389
+ badgeContent: totalUnreadMessages,
39390
+ max: 9,
39391
+ color: "error"
39392
+ }, React__default.createElement(fa.FaBell, {
39393
+ size: 20,
39394
+ color: colors.blue[500]
39395
+ }))), React__default.createElement(material.Popover, {
39396
+ open: openPopover,
39397
+ anchorEl: anchorEl.current,
39398
+ onClose: handleClosePopover,
39399
+ anchorOrigin: {
39400
+ vertical: "bottom",
39401
+ horizontal: "right"
39402
+ },
39403
+ slotProps: {
39404
+ paper: {
39405
+ sx: {
39406
+ width: 360
39407
+ }
39408
+ }
39409
+ }
39410
+ }, React__default.createElement(material.Stack, {
39411
+ height: "100%",
39412
+ direction: "column"
39413
+ }, React__default.createElement(material.Stack, {
39414
+ direction: "row",
39415
+ justifyContent: "space-between",
39416
+ gap: 2,
39417
+ sx: {
39418
+ py: 2,
39419
+ px: 2.5
39420
+ }
39421
+ }, React__default.createElement(material.Box, {
39422
+ sx: {
39423
+ flexGrow: 1
39424
+ }
39425
+ }, React__default.createElement(material.Typography, {
39426
+ variant: "subtitle1"
39427
+ }, t("notifications")), totalUnreadMessages > 0 && React__default.createElement(material.Typography, {
39428
+ variant: "body2",
39429
+ sx: {
39430
+ color: "text.secondary"
39431
+ }
39432
+ }, t("you_have_n_unread_messages", {
39433
+ n: totalUnreadMessages
39434
+ })), renderViewNoteLink && React__default.createElement(material.Box, null, renderViewNoteLink(React__default.createElement(material.Typography, {
39435
+ sx: {
39436
+ fontWeight: 600,
39437
+ color: grey[600],
39438
+ fontSize: "14px",
39439
+ "&:hover": {
39440
+ textDecoration: "underline",
39441
+ color: green[700]
39442
+ }
39443
+ }
39444
+ }, t("view_notes")), handleClosePopover))), totalUnreadMessages > 0 && React__default.createElement(material.Stack, {
39445
+ direction: "column"
39446
+ }, React__default.createElement(material.Tooltip, {
39447
+ title: t("mark_as_read")
39448
+ }, React__default.createElement(material.IconButton, {
39449
+ color: "primary",
39450
+ onClick: handleMarkAsRead
39451
+ }, React__default.createElement(bs.BsCheckAll, null))))), React__default.createElement(material.Divider, {
39452
+ component: "div"
39453
+ }), React__default.createElement(material.Stack, {
39454
+ direction: "column",
39455
+ sx: {
39456
+ height: {
39457
+ xs: 280,
39458
+ sm: 400
39459
+ },
39460
+ py: 2
39461
+ }
39462
+ }, React__default.createElement(AnnouncementList, {
39463
+ role: role,
39464
+ items: items,
39465
+ isLoading: isLoading,
39466
+ onLoadMore: handleLoadMore,
39467
+ renderLink: renderNotiLink
39468
+ })))));
39469
+ };
39470
+
37971
39471
  var MenuItemCustom = material.styled(MenuItem)(function () {
37972
39472
  return {
37973
39473
  '&.Mui-selected': {
@@ -38694,17 +40194,19 @@ var Header = function Header(_ref) {
38694
40194
  role = _ref.role,
38695
40195
  history = _ref.history,
38696
40196
  link = _ref.link,
38697
- onSignOut = _ref.onSignOut;
40197
+ onSignOut = _ref.onSignOut,
40198
+ renderNotificationLink = _ref.renderNotificationLink,
40199
+ renderViewNoteLink = _ref.renderViewNoteLink;
38698
40200
  var Link = link;
38699
40201
  var _useTranslation = reactI18next.useTranslation(),
38700
40202
  t = _useTranslation.t;
38701
40203
  var theme = material.useTheme();
38702
- var param = window.location.pathname;
38703
40204
  var language = reactRedux.useSelector(function (state) {
38704
40205
  var _state$common;
38705
40206
  return state === null || state === void 0 ? void 0 : (_state$common = state.common) === null || _state$common === void 0 ? void 0 : _state$common.language;
38706
40207
  });
38707
- var isTeacherSide = param.includes('teacher');
40208
+ var isTeacherSide = role === exports.Role.Teacher;
40209
+ var isStudentSide = role === exports.Role.Student;
38708
40210
  var isLargerThanXL = material.useMediaQuery(theme.breakpoints.up("xl"));
38709
40211
  var academyDomain = reactRedux.useSelector(function (state) {
38710
40212
  var _state$common2, _state$common2$user;
@@ -38715,6 +40217,7 @@ var Header = function Header(_ref) {
38715
40217
  return state === null || state === void 0 ? void 0 : (_state$common3 = state.common) === null || _state$common3 === void 0 ? void 0 : (_state$common3$user = _state$common3.user) === null || _state$common3$user === void 0 ? void 0 : _state$common3$user.isLearningSpace;
38716
40218
  });
38717
40219
  var isAcademy = isLearningSpace || academyDomain;
40220
+ var showAnnouncement = !isStudentSide && isAcademy;
38718
40221
  var logo = React.useMemo(function () {
38719
40222
  if (isTeacherSide) {
38720
40223
  return language === exports.Language.en ? React__default.createElement(teacherFullLogoEn, null) : React__default.createElement(teacherFullLogoKo, null);
@@ -38808,7 +40311,11 @@ var Header = function Header(_ref) {
38808
40311
  }, React__default.createElement(singleLogo, null))), React__default.createElement(material.Stack, {
38809
40312
  className: "me-2",
38810
40313
  display: "none"
38811
- }, React__default.createElement(TheLanguageDropdown, null))));
40314
+ }, React__default.createElement(TheLanguageDropdown, null)), showAnnouncement && renderNotificationLink && React__default.createElement(AnnouncementContainer, {
40315
+ role: role,
40316
+ renderLink: renderNotificationLink,
40317
+ renderViewNoteLink: renderViewNoteLink
40318
+ })));
38812
40319
  };
38813
40320
  var HeaderLink = function HeaderLink(_ref3) {
38814
40321
  var data = _ref3.data,
@@ -38822,7 +40329,7 @@ var HeaderLink = function HeaderLink(_ref3) {
38822
40329
  return React__default.createElement(React.Fragment, null, render(data, isActive));
38823
40330
  };
38824
40331
 
38825
- var useLayoutContext = function useLayoutContext(role, pusherRegisterUrls, showLoadingAcademy, domain) {
40332
+ var useLayoutContext = function useLayoutContext(role, showLoadingAcademy, domain) {
38826
40333
  var _currentPusher$connec2;
38827
40334
  if (showLoadingAcademy === void 0) {
38828
40335
  showLoadingAcademy = true;
@@ -38836,13 +40343,9 @@ var useLayoutContext = function useLayoutContext(role, pusherRegisterUrls, showL
38836
40343
  var _state$common;
38837
40344
  return state === null || state === void 0 ? void 0 : (_state$common = state.common) === null || _state$common === void 0 ? void 0 : _state$common.user;
38838
40345
  });
38839
- var isReadyRegisterPusher = reactRedux.useSelector(function (state) {
38840
- var _state$common2;
38841
- return state === null || state === void 0 ? void 0 : (_state$common2 = state.common) === null || _state$common2 === void 0 ? void 0 : _state$common2.isReadyRegisterPusher;
38842
- });
38843
40346
  var concurrentConnectionPusher = reactRedux.useSelector(function (state) {
38844
- var _state$common3;
38845
- return state === null || state === void 0 ? void 0 : (_state$common3 = state.common) === null || _state$common3 === void 0 ? void 0 : _state$common3.concurrentConnectionPusher;
40347
+ var _state$common2;
40348
+ return state === null || state === void 0 ? void 0 : (_state$common2 = state.common) === null || _state$common2 === void 0 ? void 0 : _state$common2.concurrentConnectionPusher;
38846
40349
  });
38847
40350
  var currentPusher = concurrentConnectionPusher === null || concurrentConnectionPusher === void 0 ? void 0 : concurrentConnectionPusher.pusher;
38848
40351
  var roles = (user === null || user === void 0 ? void 0 : user.roles) || [];
@@ -38923,53 +40426,36 @@ var useLayoutContext = function useLayoutContext(role, pusherRegisterUrls, showL
38923
40426
  }
38924
40427
  };
38925
40428
  var registerPusher = React.useCallback(function () {
38926
- if (!academyDomain && role !== exports.Role.Student) return;
38927
- if (includePathname(pusherRegisterUrls, pathname) || role === exports.Role.Student) {
38928
- var _currentPusher$connec;
38929
- if ((academyDomain !== (concurrentConnectionPusher === null || concurrentConnectionPusher === void 0 ? void 0 : concurrentConnectionPusher.academyDomain) || !academyDomain && !(concurrentConnectionPusher !== null && concurrentConnectionPusher !== void 0 && concurrentConnectionPusher.academyDomain) && !concurrentConnectionPusher.isRegistered) && isReadyRegisterPusher) {
38930
- var _headers;
38931
- if (currentPusher) {
38932
- currentPusher.disconnect();
38933
- }
38934
- var token = getAccessToken();
38935
- var pusher = new Pusher$1(PUSHER_CONFIG.key, {
38936
- cluster: PUSHER_CONFIG.cluster,
38937
- authEndpoint: (academyDomain ? BASE_URL : SUPER_ADMIN_BASE_URL) + "/api/auth/pusher",
38938
- auth: {
38939
- params: {},
38940
- headers: (_headers = {
38941
- Authorization: "Bearer " + token
38942
- }, _headers[AcademyHeaders] = academyDomain, _headers)
38943
- }
38944
- });
38945
- dispatch(setConcurrentConnectionPusher({
38946
- pusher: pusher,
38947
- academyDomain: academyDomain,
38948
- isRegistered: true
38949
- }));
38950
- } else if ((currentPusher === null || currentPusher === void 0 ? void 0 : (_currentPusher$connec = currentPusher.connection) === null || _currentPusher$connec === void 0 ? void 0 : _currentPusher$connec.state) === "disconnected") {
38951
- currentPusher.connect();
38952
- }
38953
- if (!isReadyRegisterPusher && !!currentPusher) {
38954
- currentPusher.connection.state !== "disconnected" && currentPusher.disconnect();
38955
- dispatch(setConcurrentConnectionPusher({
38956
- pusher: null,
38957
- academyDomain: "",
38958
- isRegistered: false
38959
- }));
38960
- }
38961
- } else {
38962
- if (!!currentPusher) {
38963
- currentPusher.connection.state !== "disconnected" && currentPusher.disconnect();
38964
- dispatch(setConcurrentConnectionPusher({
38965
- pusher: null,
38966
- academyDomain: "",
38967
- isRegistered: false
38968
- }));
40429
+ var _currentPusher$connec;
40430
+ if ((!academyDomain || !(user !== null && user !== void 0 && user.id)) && role !== exports.Role.Student) return;
40431
+ if (academyDomain !== (concurrentConnectionPusher === null || concurrentConnectionPusher === void 0 ? void 0 : concurrentConnectionPusher.academyDomain) || !academyDomain && !(concurrentConnectionPusher !== null && concurrentConnectionPusher !== void 0 && concurrentConnectionPusher.academyDomain) && !concurrentConnectionPusher.isRegistered) {
40432
+ var _headers;
40433
+ if (currentPusher) {
40434
+ currentPusher.disconnect();
38969
40435
  }
38970
- isReadyRegisterPusher && dispatch(setReadyRegisterPusher(false));
40436
+ var token = getAccessToken();
40437
+ var pusher = new Pusher$1(PUSHER_CONFIG.key, {
40438
+ cluster: PUSHER_CONFIG.cluster,
40439
+ authEndpoint: (academyDomain ? BASE_URL : SUPER_ADMIN_BASE_URL) + "/api/auth/pusher",
40440
+ auth: {
40441
+ params: {},
40442
+ headers: (_headers = {
40443
+ Authorization: "Bearer " + token
40444
+ }, _headers[AcademyHeaders] = academyDomain, _headers)
40445
+ }
40446
+ });
40447
+ dispatch(setConcurrentConnectionPusher({
40448
+ pusher: pusher,
40449
+ academyDomain: academyDomain,
40450
+ isRegistered: true
40451
+ }));
40452
+ } else if ((currentPusher === null || currentPusher === void 0 ? void 0 : (_currentPusher$connec = currentPusher.connection) === null || _currentPusher$connec === void 0 ? void 0 : _currentPusher$connec.state) === "disconnected") {
40453
+ currentPusher.connect();
38971
40454
  }
38972
- }, [pusherRegisterUrls.join(","), academyDomain, pathname, isReadyRegisterPusher, currentPusher === null || currentPusher === void 0 ? void 0 : (_currentPusher$connec2 = currentPusher.connection) === null || _currentPusher$connec2 === void 0 ? void 0 : _currentPusher$connec2.state, role]);
40455
+ return function () {
40456
+ currentPusher === null || currentPusher === void 0 ? void 0 : currentPusher.disconnect();
40457
+ };
40458
+ }, [user === null || user === void 0 ? void 0 : user.id, academyDomain, currentPusher === null || currentPusher === void 0 ? void 0 : (_currentPusher$connec2 = currentPusher.connection) === null || _currentPusher$connec2 === void 0 ? void 0 : _currentPusher$connec2.state, role]);
38973
40459
  React.useEffect(function () {
38974
40460
  !(user !== null && user !== void 0 && user.id) && loadInfo();
38975
40461
  }, [user === null || user === void 0 ? void 0 : user.id]);
@@ -38995,14 +40481,12 @@ var useLayoutContext = function useLayoutContext(role, pusherRegisterUrls, showL
38995
40481
  var LayoutContext = function LayoutContext(_ref) {
38996
40482
  var children = _ref.children,
38997
40483
  role = _ref.role,
38998
- _ref$pusherRegisterUr = _ref.pusherRegisterUrls,
38999
- pusherRegisterUrls = _ref$pusherRegisterUr === void 0 ? [] : _ref$pusherRegisterUr,
39000
40484
  showLoadingAcademy = _ref.showLoadingAcademy;
39001
40485
  var user = reactRedux.useSelector(function (state) {
39002
40486
  var _state$common;
39003
40487
  return state === null || state === void 0 ? void 0 : (_state$common = state.common) === null || _state$common === void 0 ? void 0 : _state$common.user;
39004
40488
  });
39005
- useLayoutContext(role, pusherRegisterUrls, showLoadingAcademy);
40489
+ useLayoutContext(role, showLoadingAcademy);
39006
40490
  if (!(user !== null && user !== void 0 && user.email)) return React__default.createElement(LoadingComponent, {
39007
40491
  isLoading: true
39008
40492
  });else return React__default.createElement(React.Fragment, null, children);
@@ -39111,6 +40595,7 @@ exports.AcademyHeaders = AcademyHeaders;
39111
40595
  exports.AcademyList = AcademyList;
39112
40596
  exports.AcceptNoAcademy = AcceptNoAcademy;
39113
40597
  exports.ActionButtons = ActionButtons;
40598
+ exports.AnnouncementContainer = AnnouncementContainer;
39114
40599
  exports.AnswerCountSelector = AnswerCountSelector;
39115
40600
  exports.ArticleCategorySelector = ArticleCategorySelector;
39116
40601
  exports.ArticleDialog = ArticleDialog;
@@ -39168,6 +40653,8 @@ exports.MathTinyEditor = MathTinyEditor;
39168
40653
  exports.NewNoteButton = NewNoteButton;
39169
40654
  exports.NoAcademyHeaders = NoAcademyHeaders;
39170
40655
  exports.NotFound = NotFound;
40656
+ exports.NoteDrawer = NoteDrawer;
40657
+ exports.NoteTabs = NoteTabs;
39171
40658
  exports.NotesContainer = NotesContainer;
39172
40659
  exports.NotificationDetail = NotificationDetail;
39173
40660
  exports.NotificationList = NotificationList;
@@ -39248,7 +40735,7 @@ exports.setConcurrentConnectionPusher = setConcurrentConnectionPusher;
39248
40735
  exports.setLanguage = setLanguage;
39249
40736
  exports.setLoading = setLoading;
39250
40737
  exports.setReFetchUserAcademies = setReFetchUserAcademies;
39251
- exports.setReadyRegisterPusher = setReadyRegisterPusher;
40738
+ exports.setTotalUnreadMessages = setTotalUnreadMessages;
39252
40739
  exports.setUser = setUser;
39253
40740
  exports.store = store;
39254
40741
  exports.timAgo = timAgo;