touchstudy-core 0.1.168 → 0.1.170

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 +1733 -226
  32. package/dist/index.js.map +1 -1
  33. package/dist/index.modern.js +1742 -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,24 @@ 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 = "교사에서 교사들에게";
1535
+ var student_required = "학생은 필수입니다";
1536
+ var teachers_required = "교사가 필요합니다";
1512
1537
  var lang_ko = {
1513
1538
  problem_solving: problem_solving,
1514
1539
  my_story: my_story,
@@ -2490,6 +2515,12 @@ var lang_ko = {
2490
2515
  reload_page: reload_page,
2491
2516
  last_attendance_date: last_attendance_date,
2492
2517
  less_than_a_day: less_than_a_day,
2518
+ less_than_a_min: less_than_a_min,
2519
+ just_now: just_now,
2520
+ n_mins_ago: n_mins_ago,
2521
+ n_hours_ago: n_hours_ago,
2522
+ one_min_ago: one_min_ago,
2523
+ one_hour_ago: one_hour_ago,
2493
2524
  n_days_ago: n_days_ago,
2494
2525
  n_months_ago: n_months_ago,
2495
2526
  n_years_ago: n_years_ago,
@@ -2654,7 +2685,25 @@ var lang_ko = {
2654
2685
  next_status: next_status,
2655
2686
  arrival_time: arrival_time,
2656
2687
  current_arrival_time: current_arrival_time,
2657
- uppdate_attendance: uppdate_attendance
2688
+ uppdate_attendance: uppdate_attendance,
2689
+ you_have_n_unread_messages: you_have_n_unread_messages,
2690
+ receivers: receivers,
2691
+ total_receivers: total_receivers,
2692
+ sender: sender,
2693
+ manage_notes: manage_notes,
2694
+ notes: notes,
2695
+ new_note: new_note,
2696
+ mark_as_read: mark_as_read,
2697
+ view_notes: view_notes,
2698
+ admin_n: admin_n,
2699
+ teacher_n: teacher_n,
2700
+ sent_a_memo: sent_a_memo,
2701
+ admin_to_admin: admin_to_admin,
2702
+ teacher_to_admin: teacher_to_admin,
2703
+ admin_to_teachers: admin_to_teachers,
2704
+ teacher_to_teachers: teacher_to_teachers,
2705
+ student_required: student_required,
2706
+ teachers_required: teachers_required
2658
2707
  };
2659
2708
 
2660
2709
  var problem_solving$1 = "Problem Solving";
@@ -3653,6 +3702,12 @@ var please_reload_this_page_to_continue_using_this_tab_or_close_it$1 = "Please r
3653
3702
  var reload_page$1 = "Reload page";
3654
3703
  var last_attendance_date$1 = "Last attendance date";
3655
3704
  var less_than_a_day$1 = "Less than a day";
3705
+ var less_than_a_min$1 = "Less than a minute";
3706
+ var just_now$1 = "Just now";
3707
+ var n_mins_ago$1 = "{{min}} minutes ago";
3708
+ var n_hours_ago$1 = "{{hour}} hours ago";
3709
+ var one_min_ago$1 = "one minute ago";
3710
+ var one_hour_ago$1 = "one hour ago";
3656
3711
  var n_days_ago$1 = "{{day}} days ago";
3657
3712
  var n_months_ago$1 = "{{month}} months ago";
3658
3713
  var n_years_ago$1 = "{{year}} years ago";
@@ -3823,6 +3878,24 @@ var next_status$1 = "Next status";
3823
3878
  var arrival_time$1 = "Arrival time";
3824
3879
  var current_arrival_time$1 = "Current arrival time";
3825
3880
  var uppdate_attendance$1 = "Update attendance";
3881
+ var you_have_n_unread_messages$1 = "You have {{ n }} unread message(s)";
3882
+ var receivers$1 = "Receivers";
3883
+ var total_receivers$1 = "Total receivers";
3884
+ var sender$1 = "Sender";
3885
+ var manage_notes$1 = "Manage notes";
3886
+ var notes$1 = "Notes";
3887
+ var new_note$1 = "New note";
3888
+ var mark_as_read$1 = "Mark as read";
3889
+ var view_notes$1 = "View notes";
3890
+ var admin_n$1 = "Admin {{admin}}";
3891
+ var teacher_n$1 = "Teacher {{teacher}}";
3892
+ var sent_a_memo$1 = "sent a memo";
3893
+ var admin_to_admin$1 = "Admin to admin";
3894
+ var teacher_to_admin$1 = "Teacher to admin";
3895
+ var admin_to_teachers$1 = "Admin to teachers";
3896
+ var teacher_to_teachers$1 = "Teacher to teachers";
3897
+ var student_required$1 = "Student is required";
3898
+ var teachers_required$1 = "Teachers are required";
3826
3899
  var lang_en = {
3827
3900
  problem_solving: problem_solving$1,
3828
3901
  my_story: my_story$1,
@@ -4805,6 +4878,12 @@ var lang_en = {
4805
4878
  reload_page: reload_page$1,
4806
4879
  last_attendance_date: last_attendance_date$1,
4807
4880
  less_than_a_day: less_than_a_day$1,
4881
+ less_than_a_min: less_than_a_min$1,
4882
+ just_now: just_now$1,
4883
+ n_mins_ago: n_mins_ago$1,
4884
+ n_hours_ago: n_hours_ago$1,
4885
+ one_min_ago: one_min_ago$1,
4886
+ one_hour_ago: one_hour_ago$1,
4808
4887
  n_days_ago: n_days_ago$1,
4809
4888
  n_months_ago: n_months_ago$1,
4810
4889
  n_years_ago: n_years_ago$1,
@@ -4970,7 +5049,25 @@ var lang_en = {
4970
5049
  next_status: next_status$1,
4971
5050
  arrival_time: arrival_time$1,
4972
5051
  current_arrival_time: current_arrival_time$1,
4973
- uppdate_attendance: uppdate_attendance$1
5052
+ uppdate_attendance: uppdate_attendance$1,
5053
+ you_have_n_unread_messages: you_have_n_unread_messages$1,
5054
+ receivers: receivers$1,
5055
+ total_receivers: total_receivers$1,
5056
+ sender: sender$1,
5057
+ manage_notes: manage_notes$1,
5058
+ notes: notes$1,
5059
+ new_note: new_note$1,
5060
+ mark_as_read: mark_as_read$1,
5061
+ view_notes: view_notes$1,
5062
+ admin_n: admin_n$1,
5063
+ teacher_n: teacher_n$1,
5064
+ sent_a_memo: sent_a_memo$1,
5065
+ admin_to_admin: admin_to_admin$1,
5066
+ teacher_to_admin: teacher_to_admin$1,
5067
+ admin_to_teachers: admin_to_teachers$1,
5068
+ teacher_to_teachers: teacher_to_teachers$1,
5069
+ student_required: student_required$1,
5070
+ teachers_required: teachers_required$1
4974
5071
  };
4975
5072
 
4976
5073
  i18n__default.use(reactI18next.initReactI18next).init({
@@ -6134,8 +6231,12 @@ var NoteSortColumn;
6134
6231
  NoteSortColumn["Question"] = "Question";
6135
6232
  })(NoteSortColumn || (NoteSortColumn = {}));
6136
6233
  (function (NoteType) {
6137
- NoteType[NoteType["Default"] = 0] = "Default";
6138
- NoteType[NoteType["StudentReadable"] = 1] = "StudentReadable";
6234
+ NoteType[NoteType["ToAcademy"] = 0] = "ToAcademy";
6235
+ NoteType[NoteType["ToStudent"] = 1] = "ToStudent";
6236
+ NoteType[NoteType["AdminToAllAdmin"] = 2] = "AdminToAllAdmin";
6237
+ NoteType[NoteType["AdminToAllTeacher"] = 3] = "AdminToAllTeacher";
6238
+ NoteType[NoteType["TeacherToAllAdmin"] = 4] = "TeacherToAllAdmin";
6239
+ NoteType[NoteType["TeacherToTeachers"] = 5] = "TeacherToTeachers";
6139
6240
  })(exports.NoteType || (exports.NoteType = {}));
6140
6241
 
6141
6242
  var SchoolType;
@@ -6305,16 +6406,35 @@ var pushTo = function pushTo(history, data, isReplace) {
6305
6406
  });
6306
6407
  };
6307
6408
 
6308
- var timAgo = function timAgo(date, t) {
6309
- if (date === DATE_MIN_VALUE || date === DATE_TIME_MIN_VALUE) return '';
6409
+ var timAgo = function timAgo(date, t, day) {
6410
+ if (!date || date === DATE_MIN_VALUE || date === DATE_TIME_MIN_VALUE) return '';
6310
6411
  var time = moment.utc(date).local();
6412
+ var years = moment().diff(time, 'years');
6413
+ if (years >= 1) return years >= 2 ? t('n_years_ago', {
6414
+ year: years
6415
+ }) : t("one_year_ago");
6416
+ var months = moment().diff(time, 'months');
6417
+ if (months >= 1) return months >= 2 ? t('n_months_ago', {
6418
+ month: months
6419
+ }) : t("one_month_ago");
6311
6420
  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");
6421
+ if (days < 1 && !day) return t('less_than_a_day');
6422
+ if (days < 1 && day) {
6423
+ var hours = moment().diff(time, 'hours');
6424
+ if (hours >= 1) return hours >= 2 ? t('n_hours_ago', {
6425
+ hour: hours
6426
+ }) : t("one_hour_ago");
6427
+ var mins = moment().diff(time, 'minutes');
6428
+ if (mins >= 1) return mins >= 2 ? t('n_mins_ago', {
6429
+ min: mins
6430
+ }) : t("one_min_ago");
6431
+ var secs = moment().diff(time, 'seconds');
6432
+ if (secs > 10) return t('less_than_a_min');
6433
+ return t("just_now");
6434
+ }
6435
+ return days >= 2 ? t('n_days_ago', {
6436
+ day: days
6437
+ }) : t("one_day_ago");
6318
6438
  };
6319
6439
 
6320
6440
  var toISOString = (function (time) {
@@ -6904,7 +7024,10 @@ var useLanguage = function useLanguage(history, init) {
6904
7024
  };
6905
7025
  };
6906
7026
 
6907
- var useList = function useList(fetchData, defaultQuery) {
7027
+ var useList = function useList(fetchData, defaultQuery, showLoading) {
7028
+ if (showLoading === void 0) {
7029
+ showLoading = true;
7030
+ }
6908
7031
  var dispatch = reactRedux.useDispatch();
6909
7032
  var _useState = React.useState(defaultQuery),
6910
7033
  filter = _useState[0],
@@ -6918,6 +7041,9 @@ var useList = function useList(fetchData, defaultQuery) {
6918
7041
  var _useState4 = React.useState(),
6919
7042
  selectedItem = _useState4[0],
6920
7043
  setSelectedItem = _useState4[1];
7044
+ var _useState5 = React.useState(false),
7045
+ isLoading = _useState5[0],
7046
+ setIsLoading = _useState5[1];
6921
7047
  var textSearchRef = React.useRef(null);
6922
7048
  var isFirstLoadRef = React.useRef(true);
6923
7049
  var _useTranslation = reactI18next.useTranslation(),
@@ -6931,11 +7057,13 @@ var useList = function useList(fetchData, defaultQuery) {
6931
7057
  }
6932
7058
  try {
6933
7059
  var _temp2 = function _temp2() {
6934
- isLoading && dispatch(setLoading(false));
7060
+ isLoading && showLoading && dispatch(setLoading(false));
7061
+ setIsLoading(false);
6935
7062
  };
6936
7063
  if (!fetchData) return Promise.resolve();
6937
7064
  if (isFirstLoadRef.current) isFirstLoadRef.current = false;
6938
- isLoading && dispatch(setLoading(true));
7065
+ isLoading && showLoading && dispatch(setLoading(true));
7066
+ setIsLoading(true);
6939
7067
  var _temp = _catch(function () {
6940
7068
  return Promise.resolve(fetchData(filter)).then(function (res) {
6941
7069
  var _res$data$items = res.data.items,
@@ -6960,10 +7088,6 @@ var useList = function useList(fetchData, defaultQuery) {
6960
7088
  };
6961
7089
  var handleSort = function handleSort(sortColumnName) {
6962
7090
  var sortColumnDirection = exports.OrderType.ASC;
6963
- console.log({
6964
- sortColumnName: typeof sortColumnName,
6965
- filter: typeof filter.sortColumnName
6966
- });
6967
7091
  if (filter.sortColumnName == sortColumnName && filter.sortColumnDirection === exports.OrderType.ASC) sortColumnDirection = exports.OrderType.DESC;
6968
7092
  setFilter(_extends({}, filter, {
6969
7093
  sortColumnName: sortColumnName,
@@ -6996,6 +7120,7 @@ var useList = function useList(fetchData, defaultQuery) {
6996
7120
  getData(isFirstLoadRef.current);
6997
7121
  }, [JSON.stringify(filter)]);
6998
7122
  return {
7123
+ isLoading: isLoading,
6999
7124
  filter: filter,
7000
7125
  textSearchRef: textSearchRef,
7001
7126
  paging: paging,
@@ -7098,36 +7223,26 @@ var useLogin = function useLogin(history, homeAcademyUrl, homeUrl, registerUrl,
7098
7223
  }
7099
7224
  var isAcademy = !!academyDomain || isLearningSpace;
7100
7225
  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
- });
7226
+ try {
7227
+ return Promise.resolve(isAcademy ? apiLoginGoogle(data, isLearningSpace) : apiLoginGoogleSuperAdmin(data)).then(function (loginResponse) {
7228
+ var result = loginResponse.data;
7229
+ var _temp = function () {
7230
+ if (loginResponse.status === 204 && academyDomain) {
7231
+ localStorage.removeItem(ACADEMY_DOMAIN);
7232
+ localStorage.removeItem(LEARNING_SPACE);
7233
+ return Promise.resolve(apiLoginGoogleSuperAdmin(data)).then(function (_apiLoginGoogleSuperA) {
7234
+ loginResponse = _apiLoginGoogleSuperA;
7235
+ result = loginResponse.data;
7236
+ });
7237
+ }
7238
+ }();
7239
+ return _temp && _temp.then ? _temp.then(function () {
7240
+ return result;
7241
+ }) : result;
7242
+ });
7243
+ } catch (e) {
7244
+ return Promise.reject(e);
7245
+ }
7131
7246
  }, isStudent, isLogout)).then(function () {});
7132
7247
  } catch (e) {
7133
7248
  return Promise.reject(e);
@@ -7140,21 +7255,14 @@ var useLogin = function useLogin(history, homeAcademyUrl, homeUrl, registerUrl,
7140
7255
  try {
7141
7256
  var isStudent = data.role === exports.Role.Student;
7142
7257
  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
- });
7258
+ try {
7259
+ return Promise.resolve(!isLearningSpace && !domain ? apiLoginSuperAdminWithAccessToken(data) : apiLoginWithAccessToken(data, isLearningSpace, domain)).then(function (loginResponse) {
7260
+ var result = loginResponse.data;
7261
+ return result;
7262
+ });
7263
+ } catch (e) {
7264
+ return Promise.reject(e);
7265
+ }
7158
7266
  }, isStudent, isLogout, superAdminRedirectPath)).then(function () {});
7159
7267
  } catch (e) {
7160
7268
  return Promise.reject(e);
@@ -7165,13 +7273,13 @@ var useLogin = function useLogin(history, homeAcademyUrl, homeUrl, registerUrl,
7165
7273
  isLogout = true;
7166
7274
  }
7167
7275
  try {
7168
- var _temp6 = function _temp6(_result) {
7276
+ var _temp3 = function _temp3(_result) {
7169
7277
  if (_exit) return _result;
7170
7278
  dispatch(setLoading(false));
7171
7279
  };
7172
7280
  var _exit = false;
7173
7281
  dispatch(setLoading(true));
7174
- var _temp5 = _catch(function () {
7282
+ var _temp2 = _catch(function () {
7175
7283
  return Promise.resolve(apiLogin()).then(function (loginResponse) {
7176
7284
  var isFirstLogin = loginResponse.isFirstLogin,
7177
7285
  token = loginResponse.token,
@@ -7195,7 +7303,7 @@ var useLogin = function useLogin(history, homeAcademyUrl, homeUrl, registerUrl,
7195
7303
  alert(getErrorMessage(t, error));
7196
7304
  isLogout && handleSignOut();
7197
7305
  });
7198
- return Promise.resolve(_temp5 && _temp5.then ? _temp5.then(_temp6) : _temp6(_temp5));
7306
+ return Promise.resolve(_temp2 && _temp2.then ? _temp2.then(_temp3) : _temp3(_temp2));
7199
7307
  } catch (e) {
7200
7308
  return Promise.reject(e);
7201
7309
  }
@@ -8002,7 +8110,8 @@ var getStudentsApi = function getStudentsApi(textSearch) {
8002
8110
  return api.get("" + STUDENT_URL, {
8003
8111
  params: {
8004
8112
  textSearch: textSearch,
8005
- roles: [exports.Role.Admin]
8113
+ roles: [exports.Role.Admin],
8114
+ pageSize: 100
8006
8115
  }
8007
8116
  });
8008
8117
  };
@@ -8013,7 +8122,10 @@ var StudentSelector = function StudentSelector(_ref) {
8013
8122
  externalStudentIds = _ref.externalStudentIds,
8014
8123
  _ref$disabled = _ref.disabled,
8015
8124
  disabled = _ref$disabled === void 0 ? false : _ref$disabled,
8016
- title = _ref.title;
8125
+ title = _ref.title,
8126
+ _ref$isMulti = _ref.isMulti,
8127
+ isMulti = _ref$isMulti === void 0 ? true : _ref$isMulti,
8128
+ minSearchLength = _ref.minSearchLength;
8017
8129
  var _useState = React.useState([]),
8018
8130
  students = _useState[0],
8019
8131
  setStudents = _useState[1];
@@ -8048,7 +8160,7 @@ var StudentSelector = function StudentSelector(_ref) {
8048
8160
  }, [searchString]);
8049
8161
  React.useEffect(function () {
8050
8162
  timeout && timeout.current && clearTimeout(timeout.current);
8051
- if (!searchString || searchString.trim().length < 2) {
8163
+ if (minSearchLength && (!searchString || searchString.trim().length < minSearchLength)) {
8052
8164
  setStudents([]);
8053
8165
  } else {
8054
8166
  timeout.current = setTimeout(loadData, 300);
@@ -8074,8 +8186,8 @@ var StudentSelector = function StudentSelector(_ref) {
8074
8186
  },
8075
8187
  isDisabled: disabled,
8076
8188
  isLoading: isLoading,
8077
- placeholder: t('placeholder_student_selector'),
8078
- isMulti: true,
8189
+ placeholder: t(minSearchLength ? 'placeholder_student_selector' : 'select_placeholder'),
8190
+ isMulti: isMulti,
8079
8191
  value: value,
8080
8192
  onChange: onChange
8081
8193
  }));
@@ -14162,7 +14274,7 @@ var DrawerHeader = function DrawerHeader(_ref) {
14162
14274
  fontSize: "13px",
14163
14275
  fontWeight: 500
14164
14276
  }
14165
- }, student.schoolName), React__default.createElement(material.Typography, {
14277
+ }, student.schoolName), !!student.grade && React__default.createElement(material.Typography, {
14166
14278
  sx: {
14167
14279
  color: grey[500],
14168
14280
  fontSize: "13px",
@@ -15470,6 +15582,9 @@ var getNotesApi = function getNotesApi(query) {
15470
15582
  params: query
15471
15583
  });
15472
15584
  };
15585
+ var getNoteByIdApi = function getNoteByIdApi(id) {
15586
+ return api.get(NOTES_URL + "/" + id);
15587
+ };
15473
15588
  var createNoteApi = function createNoteApi(note) {
15474
15589
  return api.post("" + NOTES_URL, note);
15475
15590
  };
@@ -15478,6 +15593,9 @@ var updateNoteApi = function updateNoteApi(id, content) {
15478
15593
  content: content
15479
15594
  });
15480
15595
  };
15596
+ var updateNoteDataApi = function updateNoteDataApi(id, data) {
15597
+ return api.put(NOTES_URL + "/" + id, data);
15598
+ };
15481
15599
  var deleteNoteApi = function deleteNoteApi(id) {
15482
15600
  return api["delete"](NOTES_URL + "/" + id);
15483
15601
  };
@@ -15752,6 +15870,121 @@ var NotesContainer = function NotesContainer(_ref) {
15752
15870
  });
15753
15871
  };
15754
15872
 
15873
+ var getNoteType = function getNoteType(t, type) {
15874
+ switch (type) {
15875
+ case exports.NoteType.ToAcademy:
15876
+ return t("academy");
15877
+ case exports.NoteType.ToStudent:
15878
+ return t("student_parents");
15879
+ case exports.NoteType.AdminToAllAdmin:
15880
+ return t("admin_to_admin");
15881
+ case exports.NoteType.AdminToAllTeacher:
15882
+ return t("admin_to_teachers");
15883
+ case exports.NoteType.TeacherToAllAdmin:
15884
+ return t("teacher_to_admin");
15885
+ case exports.NoteType.TeacherToTeachers:
15886
+ return t("teacher_to_teachers");
15887
+ default:
15888
+ return "";
15889
+ }
15890
+ };
15891
+
15892
+ var NoteItemList = function NoteItemList(_ref) {
15893
+ var _data$reciever, _data$reciever2, _data$recievers;
15894
+ var data = _ref.data,
15895
+ index = _ref.index,
15896
+ role = _ref.role,
15897
+ calcOrderNumber = _ref.calcOrderNumber,
15898
+ onDelete = _ref.onDelete,
15899
+ onUpdate = _ref.onUpdate,
15900
+ onView = _ref.onView;
15901
+ var isAdminUser = reactRedux.useSelector(function (state) {
15902
+ var _state$common, _state$common$user, _state$common$user$ro;
15903
+ 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);
15904
+ });
15905
+ var userId = reactRedux.useSelector(function (state) {
15906
+ var _state$common2, _state$common2$user;
15907
+ 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;
15908
+ });
15909
+ var _useTranslation = reactI18next.useTranslation(),
15910
+ t = _useTranslation.t;
15911
+ var isAdmin = role === exports.Role.Admin;
15912
+ var order = calcOrderNumber(index);
15913
+ var createdAt = utcToLocalTime(data.createdAt, t("date_time_format"));
15914
+ var handleDelete = function handleDelete() {
15915
+ onDelete(data);
15916
+ };
15917
+ var handleUpdate = function handleUpdate() {
15918
+ onUpdate(data);
15919
+ };
15920
+ var handleView = function handleView() {
15921
+ onView(data);
15922
+ };
15923
+ var disabled = !data.isOwned && (!isAdminUser || data.type == undefined || data.type == exports.NoteType.TeacherToAllAdmin || data.type == exports.NoteType.TeacherToTeachers);
15924
+ React.useEffect(function () {
15925
+ if (window.MathJax) {
15926
+ var _window$MathJax;
15927
+ (_window$MathJax = window.MathJax) === null || _window$MathJax === void 0 ? void 0 : _window$MathJax.typeset();
15928
+ }
15929
+ }, [data.content]);
15930
+ var noteType = data.type === undefined ? "" : getNoteType(t, data.type);
15931
+ 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, {
15932
+ color: green[700],
15933
+ fontWeight: 600
15934
+ }, t("admin")) : React__default.createElement(React.Fragment, null, React__default.createElement(material.Typography, {
15935
+ color: green[700],
15936
+ fontWeight: 600
15937
+ }, data.sender.fullName, data.sender.id === userId && React__default.createElement(material.Typography, {
15938
+ display: "inline-block",
15939
+ color: colors.grey[600],
15940
+ fontWeight: 600
15941
+ }, "(", " " + 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, {
15942
+ color: colors.blue[700],
15943
+ fontWeight: 600
15944
+ }, (_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, {
15945
+ direction: "column"
15946
+ }, (_data$recievers = data.recievers) === null || _data$recievers === void 0 ? void 0 : _data$recievers.slice(0, 2).map(function (i) {
15947
+ return React__default.createElement(material.Typography, null, i.fullName, " - ", i.email);
15948
+ }), 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, {
15949
+ sx: {
15950
+ display: "-webkit-box",
15951
+ lineClamp: 3,
15952
+ WebkitLineClamp: 3,
15953
+ WebkitBoxOrient: "vertical",
15954
+ boxOrient: "vertical",
15955
+ overflow: "hidden"
15956
+ },
15957
+ dangerouslySetInnerHTML: {
15958
+ __html: data.content
15959
+ }
15960
+ })), React__default.createElement(TableCell, {
15961
+ className: "text-nowrap"
15962
+ }, noteType), React__default.createElement(TableCell, null, createdAt), React__default.createElement(TableCell, null, React__default.createElement("div", {
15963
+ className: "d-flex"
15964
+ }, React__default.createElement(material.Box, null, React__default.createElement(material.IconButton, {
15965
+ color: "default",
15966
+ className: "bg-primary text-white me-1",
15967
+ onClick: handleView
15968
+ }, React__default.createElement(fa.FaEye, {
15969
+ size: 12
15970
+ }))), React__default.createElement(material.Box, null, React__default.createElement(material.IconButton, {
15971
+ color: "default",
15972
+ className: styles$5["action-btn"] + " " + (disabled ? "bg-secondary" : "bg-warning") + " text-white me-2",
15973
+ onClick: handleUpdate,
15974
+ disabled: disabled
15975
+ }, React__default.createElement(hi.HiOutlinePencilAlt, {
15976
+ className: styles$5["action-btn--pencil"],
15977
+ size: 12
15978
+ }))), React__default.createElement(material.Box, null, React__default.createElement(material.IconButton, {
15979
+ onClick: handleDelete,
15980
+ color: "default",
15981
+ className: styles$5["action-btn"] + " " + (disabled ? "bg-secondary" : "bg-danger") + " text-white",
15982
+ disabled: disabled
15983
+ }, React__default.createElement(fa6.FaTrashCan, {
15984
+ size: 12
15985
+ }))))));
15986
+ };
15987
+
15755
15988
  var NoteContent = function NoteContent(_ref) {
15756
15989
  var content = _ref.content;
15757
15990
  React.useEffect(function () {
@@ -15773,7 +16006,7 @@ var NoteContent = function NoteContent(_ref) {
15773
16006
  };
15774
16007
 
15775
16008
  var NoteDrawer = function NoteDrawer(props) {
15776
- var _BRIEF_GRADE_OPTIONS$, _data$content;
16009
+ var _BRIEF_GRADE_OPTIONS$, _note$content;
15777
16010
  var anchor = props.anchor,
15778
16011
  open = props.open,
15779
16012
  student = props.student,
@@ -15781,7 +16014,8 @@ var NoteDrawer = function NoteDrawer(props) {
15781
16014
  data = props.data,
15782
16015
  width = props.width,
15783
16016
  _props$showStudentInf = props.showStudentInfo,
15784
- showStudentInfo = _props$showStudentInf === void 0 ? true : _props$showStudentInf;
16017
+ showStudentInfo = _props$showStudentInf === void 0 ? true : _props$showStudentInf,
16018
+ id = props.id;
15785
16019
  var _useTranslation = reactI18next.useTranslation(),
15786
16020
  t = _useTranslation.t;
15787
16021
  var academy = reactRedux.useSelector(function (state) {
@@ -15792,6 +16026,46 @@ var NoteDrawer = function NoteDrawer(props) {
15792
16026
  var _state$common2;
15793
16027
  return state === null || state === void 0 ? void 0 : (_state$common2 = state.common) === null || _state$common2 === void 0 ? void 0 : _state$common2.language;
15794
16028
  });
16029
+ var _useState = React.useState(false),
16030
+ loading = _useState[0],
16031
+ setLoading = _useState[1];
16032
+ var _useState2 = React.useState(),
16033
+ noteData = _useState2[0],
16034
+ setNoteData = _useState2[1];
16035
+ React.useEffect(function () {
16036
+ var getNoteById = function getNoteById() {
16037
+ try {
16038
+ var _temp2 = function _temp2() {
16039
+ setLoading(false);
16040
+ };
16041
+ if (!id) return Promise.resolve();
16042
+ setLoading(true);
16043
+ var _temp = _catch(function () {
16044
+ return Promise.resolve(getNoteByIdApi(+id)).then(function (res) {
16045
+ setNoteData(res.data);
16046
+ });
16047
+ }, function (error) {
16048
+ reactToastify.toast.error(getErrorMessage(t, error));
16049
+ });
16050
+ return Promise.resolve(_temp && _temp.then ? _temp.then(_temp2) : _temp2(_temp));
16051
+ } catch (e) {
16052
+ return Promise.reject(e);
16053
+ }
16054
+ };
16055
+ getNoteById();
16056
+ }, [id]);
16057
+ var note = data != null ? data : noteData;
16058
+ var user = React.useMemo(function () {
16059
+ if (student) return student;
16060
+ if (!note) return null;
16061
+ switch (note.type) {
16062
+ case exports.NoteType.ToAcademy:
16063
+ case exports.NoteType.ToStudent:
16064
+ return note.reciever;
16065
+ default:
16066
+ return note.sender;
16067
+ }
16068
+ }, [JSON.stringify(note), JSON.stringify(student)]);
15795
16069
  return React__default.createElement(material.Drawer, {
15796
16070
  anchor: anchor,
15797
16071
  open: open,
@@ -15818,11 +16092,11 @@ var NoteDrawer = function NoteDrawer(props) {
15818
16092
  onClick: onClose
15819
16093
  }, React__default.createElement(io5.IoClose, {
15820
16094
  size: 32
15821
- }))), showStudentInfo && React__default.createElement(material.Box, {
16095
+ }))), 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
16096
  sx: {
15823
16097
  padding: "16px 40px"
15824
16098
  }
15825
- }, !student ? React__default.createElement(material.Stack, {
16099
+ }, !user || loading ? React__default.createElement(material.Stack, {
15826
16100
  direction: "row",
15827
16101
  gap: 3
15828
16102
  }, React__default.createElement(material.Skeleton, {
@@ -15857,7 +16131,7 @@ var NoteDrawer = function NoteDrawer(props) {
15857
16131
  color: green[500],
15858
16132
  lineHeight: "22px"
15859
16133
  }
15860
- }, student.fullName), React__default.createElement(material.Stack, {
16134
+ }, user.fullName), React__default.createElement(material.Stack, {
15861
16135
  direction: "row",
15862
16136
  alignItems: "center",
15863
16137
  gap: 1
@@ -15867,17 +16141,29 @@ var NoteDrawer = function NoteDrawer(props) {
15867
16141
  fontSize: "13px",
15868
16142
  fontWeight: 500
15869
16143
  }
15870
- }, student.schoolName), React__default.createElement(material.Typography, {
16144
+ }, user.schoolName), !!user.grade && React__default.createElement(material.Typography, {
15871
16145
  sx: {
15872
16146
  color: grey[500],
15873
16147
  fontSize: "13px",
15874
16148
  fontWeight: 500
15875
16149
  }
15876
16150
  }, t(function (label) {
15877
- return label ? t(label) : formatGrade(student.grade, t, language);
16151
+ return label ? t(label) : formatGrade(user.grade, t, language);
15878
16152
  }((_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, {
16153
+ return o.value === Number(user.grade);
16154
+ })) === null || _BRIEF_GRADE_OPTIONS$ === void 0 ? void 0 : _BRIEF_GRADE_OPTIONS$.label))))))), !note && !loading && React__default.createElement(material.Stack, {
16155
+ padding: "40px 24px 0",
16156
+ gap: "16px"
16157
+ }, React__default.createElement(material.Typography, {
16158
+ className: "text-muted"
16159
+ }, t("no_data"))), loading && React__default.createElement(material.Stack, {
16160
+ padding: "40px 24px 0",
16161
+ gap: "16px",
16162
+ justifyContent: "center"
16163
+ }, React__default.createElement(material.CircularProgress, {
16164
+ size: 40,
16165
+ color: "primary"
16166
+ })), note && !loading && React__default.createElement(material.Stack, {
15881
16167
  padding: "40px 24px 0",
15882
16168
  gap: "16px"
15883
16169
  }, React__default.createElement(material.Stack, {
@@ -15890,7 +16176,7 @@ var NoteDrawer = function NoteDrawer(props) {
15890
16176
  fontWeight: "700",
15891
16177
  color: "#414E62"
15892
16178
  }
15893
- }, data === null || data === void 0 ? void 0 : data.fullName)), React__default.createElement(material.Stack, {
16179
+ }, note === null || note === void 0 ? void 0 : note.fullName)), React__default.createElement(material.Stack, {
15894
16180
  display: "flex",
15895
16181
  justifyContent: "end"
15896
16182
  }, React__default.createElement(material.Typography, {
@@ -15900,7 +16186,7 @@ var NoteDrawer = function NoteDrawer(props) {
15900
16186
  color: "#97A1AF",
15901
16187
  textAlign: "end"
15902
16188
  }
15903
- }, utcToLocalTime(data === null || data === void 0 ? void 0 : data.createdAt, t("date_format"))), React__default.createElement(material.Typography, {
16189
+ }, utcToLocalTime(note === null || note === void 0 ? void 0 : note.createdAt, t("date_format"))), React__default.createElement(material.Typography, {
15904
16190
  sx: {
15905
16191
  fontSize: "12px",
15906
16192
  fontWeight: "500",
@@ -15908,11 +16194,819 @@ var NoteDrawer = function NoteDrawer(props) {
15908
16194
  textAlign: "end"
15909
16195
  }
15910
16196
  }, 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 : ""
16197
+ content: (_note$content = note === null || note === void 0 ? void 0 : note.content) != null ? _note$content : ""
16198
+ })));
16199
+ };
16200
+
16201
+ var TEACHER_URL = BASE_URL + "/api/teacher";
16202
+ var getTeacherListApi = function getTeacherListApi(query) {
16203
+ return api.get("" + TEACHER_URL, {
16204
+ params: query
16205
+ });
16206
+ };
16207
+
16208
+ var TeacherSelector$1 = function TeacherSelector(_ref) {
16209
+ var value = _ref.value,
16210
+ onChange = _ref.onChange,
16211
+ placeholder = _ref.placeholder,
16212
+ externalTeacherIds = _ref.externalTeacherIds,
16213
+ title = _ref.title,
16214
+ isMultiple = _ref.isMultiple,
16215
+ _ref$isClearable = _ref.isClearable,
16216
+ isClearable = _ref$isClearable === void 0 ? true : _ref$isClearable,
16217
+ useUserId = _ref.useUserId,
16218
+ exceptMe = _ref.exceptMe,
16219
+ isDisabled = _ref.isDisabled;
16220
+ var _useState = React.useState([]),
16221
+ teachers = _useState[0],
16222
+ setTeachers = _useState[1];
16223
+ var _useState2 = React.useState(""),
16224
+ searchString = _useState2[0],
16225
+ setSearchString = _useState2[1];
16226
+ var _useState3 = React.useState(false),
16227
+ isLoading = _useState3[0],
16228
+ setLoading = _useState3[1];
16229
+ var _useTranslation = reactI18next.useTranslation(),
16230
+ t = _useTranslation.t;
16231
+ var debounceSearch = React.useCallback(_$8.debounce(function (value) {
16232
+ loadData(value);
16233
+ }, 500), []);
16234
+ var handleChangeSearchText = function handleChangeSearchText(value) {
16235
+ setSearchString(value.trim());
16236
+ debounceSearch(value.trim());
16237
+ };
16238
+ var loadData = function loadData(textSearch) {
16239
+ try {
16240
+ var _temp2 = function _temp2() {
16241
+ setLoading(false);
16242
+ };
16243
+ setLoading(true);
16244
+ var _temp = _catch(function () {
16245
+ return Promise.resolve(getTeacherListApi({
16246
+ textSearch: textSearch,
16247
+ pageSize: 100,
16248
+ currentPage: 1,
16249
+ exceptMe: exceptMe,
16250
+ sortColumnDirection: exports.OrderType.DESC,
16251
+ sortColumnName: "User.UserProfile.FullName"
16252
+ })).then(function (res) {
16253
+ var _res$data$items = res.data.items,
16254
+ items = _res$data$items === void 0 ? [] : _res$data$items;
16255
+ setTeachers(items);
16256
+ });
16257
+ }, function (err) {
16258
+ reactToastify.toast.error(getErrorMessage(t, err));
16259
+ });
16260
+ return Promise.resolve(_temp && _temp.then ? _temp.then(_temp2) : _temp2(_temp));
16261
+ } catch (e) {
16262
+ return Promise.reject(e);
16263
+ }
16264
+ };
16265
+ React.useEffect(function () {
16266
+ loadData();
16267
+ }, []);
16268
+ var options = teachers.filter(function (teacher) {
16269
+ return !externalTeacherIds || externalTeacherIds && !externalTeacherIds.includes(teacher.id);
16270
+ }).map(function (teacher) {
16271
+ return {
16272
+ label: teacher.teacherName + " - " + teacher.teacherEmail,
16273
+ value: useUserId ? teacher.teacherUserId : teacher.id
16274
+ };
16275
+ });
16276
+ return React__default.createElement(material.FormGroup, {
16277
+ className: "" + styles["filter-item"]
16278
+ }, !!title && React__default.createElement("label", {
16279
+ className: "" + styles["title-form"]
16280
+ }, title), React__default.createElement(CustomSelectOption, {
16281
+ options: options,
16282
+ onInputChange: function onInputChange(inputValue) {
16283
+ return handleChangeSearchText(inputValue);
16284
+ },
16285
+ isLoading: isLoading,
16286
+ placeholder: placeholder || t('select_placeholder'),
16287
+ isMulti: isMultiple,
16288
+ value: value,
16289
+ inputValue: searchString,
16290
+ onChange: onChange,
16291
+ isClearable: isClearable,
16292
+ isDisabled: isDisabled
16293
+ }));
16294
+ };
16295
+
16296
+ var schema$3 = yup.object().shape({
16297
+ content: yup.string().trim().required(),
16298
+ studentId: yup.number().when("type", {
16299
+ is: function is(type) {
16300
+ return type == exports.NoteType.ToAcademy || type == exports.NoteType.ToStudent;
16301
+ },
16302
+ then: function then(schema) {
16303
+ return schema.required("student_required");
16304
+ },
16305
+ otherwise: function otherwise(schema) {
16306
+ return schema.notRequired();
16307
+ }
16308
+ }),
16309
+ userIds: yup.array().of(yup.number()).when("type", {
16310
+ is: function is(type) {
16311
+ return type == exports.NoteType.TeacherToTeachers;
16312
+ },
16313
+ then: function then(schema) {
16314
+ return schema.required("teachers_required");
16315
+ },
16316
+ otherwise: function otherwise(schema) {
16317
+ return schema.notRequired();
16318
+ }
16319
+ }),
16320
+ type: yup.number()
16321
+ });
16322
+ var GeneralNoteDialog = function GeneralNoteDialog(_ref) {
16323
+ var _selectedNote$recieve, _selectedNote$recieve2, _selectedNote$recieve3;
16324
+ var open = _ref.open,
16325
+ type = _ref.type,
16326
+ selectedNote = _ref.selectedNote,
16327
+ value = _ref.value,
16328
+ onClose = _ref.onClose,
16329
+ onSaveNote = _ref.onSaveNote;
16330
+ var _useTranslation = reactI18next.useTranslation(),
16331
+ t = _useTranslation.t;
16332
+ var handleSaveNote = function handleSaveNote(val) {
16333
+ onSaveNote(val);
16334
+ };
16335
+ var tip = React.useMemo(function () {
16336
+ if (type === undefined) return "";
16337
+ switch (type) {
16338
+ case exports.NoteType.ToAcademy:
16339
+ return "academy";
16340
+ case exports.NoteType.ToStudent:
16341
+ return "student_parents";
16342
+ case exports.NoteType.AdminToAllAdmin:
16343
+ case exports.NoteType.AdminToAllTeacher:
16344
+ case exports.NoteType.TeacherToAllAdmin:
16345
+ return "admin";
16346
+ case exports.NoteType.TeacherToTeachers:
16347
+ return "teacher";
16348
+ default:
16349
+ return "";
16350
+ }
16351
+ }, [type]);
16352
+ return React__default.createElement(material.Dialog, {
16353
+ onClose: onClose,
16354
+ open: open,
16355
+ maxWidth: "md",
16356
+ scroll: "body",
16357
+ fullWidth: true,
16358
+ disableEnforceFocus: true,
16359
+ disableAutoFocus: true
16360
+ }, React__default.createElement(DialogTitle, {
16361
+ id: "customized-dialog-title"
16362
+ }, React__default.createElement(Typography, {
16363
+ fontWeight: 700,
16364
+ fontSize: "16px",
16365
+ lineHeight: "19.09px",
16366
+ color: "#202B37"
16367
+ }, t(type === exports.NoteType.ToAcademy || type === exports.NoteType.ToStudent ? selectedNote ? "edit_student_note" : "student_note_taking" : "note"), tip ? " " + t(tip) : "")), React__default.createElement(IconButton, {
16368
+ "aria-label": "close",
16369
+ sx: {
16370
+ position: "absolute",
16371
+ right: 8,
16372
+ top: 8,
16373
+ color: function color(theme) {
16374
+ return theme.palette.grey[500];
16375
+ }
16376
+ },
16377
+ onClick: onClose
16378
+ }, React__default.createElement(iconCloseDialog, null)), React__default.createElement(formik.Formik, {
16379
+ initialValues: {
16380
+ content: value ? value.content : (selectedNote === null || selectedNote === void 0 ? void 0 : selectedNote.content) || "",
16381
+ type: type,
16382
+ 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,
16383
+ student: value ? value.student : selectedNote !== null && selectedNote !== void 0 && selectedNote.reciever ? {
16384
+ label: selectedNote.reciever.fullName,
16385
+ value: selectedNote.reciever.id
16386
+ } : undefined,
16387
+ 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) {
16388
+ return i.id;
16389
+ }),
16390
+ 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) {
16391
+ return {
16392
+ label: i.fullName,
16393
+ value: i.id
16394
+ };
16395
+ })
16396
+ },
16397
+ validationSchema: schema$3,
16398
+ enableReinitialize: true,
16399
+ onSubmit: handleSaveNote
16400
+ }, function (_ref2) {
16401
+ var _selectedNote$recieve4;
16402
+ var values = _ref2.values,
16403
+ errors = _ref2.errors,
16404
+ setFieldValue = _ref2.setFieldValue;
16405
+ return React__default.createElement(formik.Form, null, React__default.createElement(DialogContent, {
16406
+ sx: {
16407
+ padding: 0,
16408
+ overflowY: "auto"
16409
+ }
16410
+ }, React__default.createElement(material.Box, {
16411
+ display: "flex",
16412
+ flexDirection: "column",
16413
+ gap: "8px",
16414
+ padding: "24px 24px 40px 24px"
16415
+ }, (type === exports.NoteType.ToAcademy || type === exports.NoteType.ToStudent) && React__default.createElement(material.Stack, null, React__default.createElement("label", {
16416
+ htmlFor: "student",
16417
+ className: styles["form-label"] + " " + styles$5["form-label-dialog"]
16418
+ }, t("student_name")), selectedNote ? React__default.createElement(Typography, {
16419
+ sx: {
16420
+ fontWeight: 700,
16421
+ fontSize: "14px",
16422
+ color: "rgba(61, 198, 116, 1)"
16423
+ }
16424
+ }, (_selectedNote$recieve4 = selectedNote.reciever) === null || _selectedNote$recieve4 === void 0 ? void 0 : _selectedNote$recieve4.fullName) : React__default.createElement(formik.Field, {
16425
+ id: "student",
16426
+ style: {
16427
+ width: "100%"
16428
+ },
16429
+ name: "student",
16430
+ className: styles["form-control"],
16431
+ render: function render(_ref3) {
16432
+ var field = _ref3.field;
16433
+ return React__default.createElement(StudentSelector, {
16434
+ value: field.value,
16435
+ onChange: function (val) {
16436
+ try {
16437
+ return Promise.resolve(setFieldValue("studentId", val === null || val === void 0 ? void 0 : val.value)).then(function () {
16438
+ return Promise.resolve(setFieldValue("student", val)).then(function () {});
16439
+ });
16440
+ } catch (e) {
16441
+ return Promise.reject(e);
16442
+ }
16443
+ },
16444
+ isMulti: false
16445
+ });
16446
+ }
16447
+ }), !!errors.studentId && React__default.createElement(Typography, {
16448
+ fontWeight: 500,
16449
+ fontSize: "10px",
16450
+ lineHeight: "11.93px",
16451
+ mt: 1,
16452
+ color: "#F34B4B"
16453
+ }, t(errors.studentId))), (type === exports.NoteType.AdminToAllAdmin || type === exports.NoteType.AdminToAllTeacher) && React__default.createElement(material.FormControl, {
16454
+ className: "w-100"
16455
+ }, React__default.createElement(material.FormLabel, {
16456
+ className: "fw-medium",
16457
+ id: "type"
16458
+ }, t("receivers")), React__default.createElement(material.RadioGroup, {
16459
+ className: "flex-row flex-wrap"
16460
+ }, React__default.createElement(material.FormControlLabel, {
16461
+ control: React__default.createElement(material.Radio, {
16462
+ checked: values.type === exports.NoteType.AdminToAllAdmin || values.type === exports.NoteType.TeacherToAllAdmin,
16463
+ onChange: function onChange(_) {
16464
+ return setFieldValue("type", exports.NoteType.AdminToAllAdmin);
16465
+ }
16466
+ }),
16467
+ label: t("admin")
16468
+ }), React__default.createElement(material.FormControlLabel, {
16469
+ control: React__default.createElement(material.Radio, {
16470
+ checked: values.type === exports.NoteType.AdminToAllTeacher,
16471
+ onChange: function onChange(_) {
16472
+ return setFieldValue("type", exports.NoteType.AdminToAllTeacher);
16473
+ }
16474
+ }),
16475
+ label: t("teacher")
16476
+ }))), type === exports.NoteType.TeacherToTeachers && React__default.createElement(material.Stack, null, React__default.createElement("label", {
16477
+ htmlFor: "teachers",
16478
+ className: styles["form-label"] + " " + styles$5["form-label-dialog"]
16479
+ }, t("teachers")), React__default.createElement(formik.Field, {
16480
+ id: "users",
16481
+ style: {
16482
+ width: "100%"
16483
+ },
16484
+ name: "users",
16485
+ className: styles["form-control"],
16486
+ render: function render(_ref4) {
16487
+ var field = _ref4.field;
16488
+ return React__default.createElement(TeacherSelector$1, {
16489
+ value: field.value,
16490
+ onChange: function (val) {
16491
+ try {
16492
+ var _val$map, _val$map2;
16493
+ return Promise.resolve(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) {
16494
+ return i.value;
16495
+ })) != null ? _val$map : [])).then(function () {
16496
+ return Promise.resolve(setFieldValue("users", val != null ? val : [])).then(function () {});
16497
+ });
16498
+ } catch (e) {
16499
+ return Promise.reject(e);
16500
+ }
16501
+ },
16502
+ isDisabled: !!selectedNote,
16503
+ exceptMe: true,
16504
+ isMultiple: true,
16505
+ useUserId: true
16506
+ });
16507
+ }
16508
+ }), !!errors.userIds && React__default.createElement(Typography, {
16509
+ fontWeight: 500,
16510
+ fontSize: "10px",
16511
+ lineHeight: "11.93px",
16512
+ mt: 1,
16513
+ color: "#F34B4B"
16514
+ }, t(errors.userIds))), React__default.createElement(material.Stack, null, React__default.createElement("label", {
16515
+ htmlFor: "content-question",
16516
+ className: styles["form-label"] + " " + styles$5["form-label-dialog"]
16517
+ }, t("incorrect_answer_note_contents")), React__default.createElement(material.Box, {
16518
+ position: "relative",
16519
+ display: "flex",
16520
+ flexDirection: "row",
16521
+ alignItems: "center"
16522
+ }, React__default.createElement(formik.Field, {
16523
+ id: "content-question",
16524
+ style: {
16525
+ width: "100%"
16526
+ },
16527
+ name: "content",
16528
+ placeholder: t("the_problem_is_difficult"),
16529
+ className: styles["form-control"],
16530
+ render: function render(_ref5) {
16531
+ var field = _ref5.field;
16532
+ return React__default.createElement(NoteTinyEditor, {
16533
+ initValue: field.value,
16534
+ onChange: function onChange(text) {
16535
+ return setFieldValue("content", text);
16536
+ }
16537
+ });
16538
+ }
16539
+ })), !!errors.content && React__default.createElement(Typography, {
16540
+ fontWeight: 500,
16541
+ fontSize: "10px",
16542
+ lineHeight: "11.93px",
16543
+ mt: 1,
16544
+ color: "#F34B4B"
16545
+ }, t(errors.content)), React__default.createElement(material.Box, {
16546
+ marginBottom: "4px"
16547
+ })))), React__default.createElement(DialogActions, {
16548
+ sx: {
16549
+ display: "flex",
16550
+ justifyContent: "space-between",
16551
+ alignItems: "center",
16552
+ padding: "12px",
16553
+ borderTop: "1px solid #CED2DA"
16554
+ }
16555
+ }, React__default.createElement(MButton, {
16556
+ className: styles$5["btn-cancel"],
16557
+ onClick: onClose
16558
+ }, React__default.createElement(Typography, {
16559
+ sx: {
16560
+ color: styles.dark + " !important"
16561
+ },
16562
+ fontWeight: 700,
16563
+ fontSize: "14px",
16564
+ lineHeight: "16.71px"
16565
+ }, t("cancel"))), React__default.createElement(MButton, {
16566
+ variant: "contained",
16567
+ sx: {
16568
+ bgcolor: styles.dark
16569
+ },
16570
+ className: styles$5["btn-register"],
16571
+ type: "submit"
16572
+ }, React__default.createElement(Typography, {
16573
+ fontWeight: 700,
16574
+ fontSize: "14px",
16575
+ lineHeight: "16.71px",
16576
+ color: "#FFFFFF"
16577
+ }, t("registration")))));
16578
+ }));
16579
+ };
16580
+
16581
+ var NoteList = function NoteList(_ref) {
16582
+ var defaultFilter = _ref.defaultFilter,
16583
+ role = _ref.role,
16584
+ headers = _ref.headers,
16585
+ isAdmin = _ref.isAdmin;
16586
+ var _useTranslation = reactI18next.useTranslation(),
16587
+ t = _useTranslation.t;
16588
+ var _useList = useList(function (filter) {
16589
+ return getNotesApi(filter);
16590
+ }, defaultFilter, false),
16591
+ isLoading = _useList.isLoading,
16592
+ filter = _useList.filter,
16593
+ textSearchRef = _useList.textSearchRef,
16594
+ paging = _useList.paging,
16595
+ data = _useList.data,
16596
+ selectedItem = _useList.selectedItem,
16597
+ handleSort = _useList.handleSort,
16598
+ handleChangeSearchText = _useList.handleChangeSearchText,
16599
+ handleChangePage = _useList.handleChangePage,
16600
+ calcOrderNumber = _useList.calcOrderNumber,
16601
+ handleChangeSelectedItem = _useList.handleChangeSelectedItem,
16602
+ getData = _useList.getData;
16603
+ var dispatch = reactRedux.useDispatch();
16604
+ var _useState = React.useState(false),
16605
+ openNoteViewDrawer = _useState[0],
16606
+ setOpenNoteViewDrawer = _useState[1];
16607
+ var _useState2 = React.useState(),
16608
+ openNoteDialog = _useState2[0],
16609
+ setOpenNoteDialog = _useState2[1];
16610
+ var _useState3 = React.useState(),
16611
+ noteRequest = _useState3[0],
16612
+ setNoteRequest = _useState3[1];
16613
+ var _useState4 = React.useState(false),
16614
+ openConfirmNote = _useState4[0],
16615
+ setOpenConfirmNote = _useState4[1];
16616
+ var _useState5 = React.useState(false),
16617
+ openDeleteNoteDialog = _useState5[0],
16618
+ setOpenDeleteNoteDialog = _useState5[1];
16619
+ var handleOpenCreateNoteDialog = function handleOpenCreateNoteDialog() {
16620
+ var _defaultFilter$types;
16621
+ 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) {
16622
+ setOpenNoteDialog(isAdmin ? exports.NoteType.AdminToAllAdmin : exports.NoteType.TeacherToAllAdmin);
16623
+ }
16624
+ };
16625
+ var handleCloseDeleteDialog = function handleCloseDeleteDialog() {
16626
+ setOpenDeleteNoteDialog(false);
16627
+ };
16628
+ var handleOpenDeleteNoteDialog = function handleOpenDeleteNoteDialog(note) {
16629
+ handleChangeSelectedItem(note);
16630
+ setOpenDeleteNoteDialog(true);
16631
+ };
16632
+ var handleOpenNoteDrawer = function handleOpenNoteDrawer(note) {
16633
+ setOpenNoteViewDrawer(true);
16634
+ handleChangeSelectedItem(note);
16635
+ };
16636
+ var handleCloseNoteDrawer = function handleCloseNoteDrawer() {
16637
+ setOpenNoteViewDrawer(false);
16638
+ handleChangeSelectedItem(undefined);
16639
+ };
16640
+ var handleCloseConfirmStudentNoteDialog = function handleCloseConfirmStudentNoteDialog() {
16641
+ setOpenConfirmNote(false);
16642
+ };
16643
+ var handleOpenNoteDialog = function handleOpenNoteDialog(note) {
16644
+ handleChangeSelectedItem(note);
16645
+ setOpenNoteDialog(note.type);
16646
+ };
16647
+ var handleCloseNoteDialog = function handleCloseNoteDialog() {
16648
+ handleChangeSelectedItem(undefined);
16649
+ setOpenNoteDialog(undefined);
16650
+ setNoteRequest(undefined);
16651
+ };
16652
+ var handleOpenConfirmStudentNoteDialog = function handleOpenConfirmStudentNoteDialog(note) {
16653
+ setNoteRequest(note);
16654
+ setOpenConfirmNote(true);
16655
+ };
16656
+ var handleSaveNote = function handleSaveNote(noteRequest) {
16657
+ try {
16658
+ var _temp4 = function _temp4() {
16659
+ dispatch(setLoading(false));
16660
+ };
16661
+ if (openNoteDialog === undefined) return Promise.resolve();
16662
+ if (noteRequest.content.trim().length === 0) return Promise.resolve();
16663
+ dispatch(setLoading(true));
16664
+ var _temp3 = _catch(function () {
16665
+ function _temp2() {
16666
+ getData();
16667
+ reset();
16668
+ }
16669
+ var _temp = function () {
16670
+ if (selectedItem) {
16671
+ return Promise.resolve(updateNoteDataApi(selectedItem.id, noteRequest)).then(function () {
16672
+ reactToastify.toast.success(t("update_note_successfully"));
16673
+ });
16674
+ } else {
16675
+ return Promise.resolve(createNoteApi(noteRequest)).then(function () {
16676
+ reactToastify.toast.success(t("create_note_successfully"));
16677
+ });
16678
+ }
16679
+ }();
16680
+ return _temp && _temp.then ? _temp.then(_temp2) : _temp2(_temp);
16681
+ }, function (error) {
16682
+ reactToastify.toast.error(getErrorMessage(t, error));
16683
+ });
16684
+ return Promise.resolve(_temp3 && _temp3.then ? _temp3.then(_temp4) : _temp4(_temp3));
16685
+ } catch (e) {
16686
+ return Promise.reject(e);
16687
+ }
16688
+ };
16689
+ var handleDeleteNote = function handleDeleteNote() {
16690
+ try {
16691
+ var _temp6 = function _temp6() {
16692
+ dispatch(setLoading(false));
16693
+ };
16694
+ if (!(selectedItem !== null && selectedItem !== void 0 && selectedItem.id)) return Promise.resolve();
16695
+ dispatch(setLoading(true));
16696
+ var _temp5 = _catch(function () {
16697
+ return Promise.resolve(deleteNoteApi(selectedItem.id)).then(function () {
16698
+ reactToastify.toast.success(t("delete_note_successfully"));
16699
+ getData();
16700
+ reset();
16701
+ });
16702
+ }, function (error) {
16703
+ reactToastify.toast.error(getErrorMessage(t, error));
16704
+ });
16705
+ return Promise.resolve(_temp5 && _temp5.then ? _temp5.then(_temp6) : _temp6(_temp5));
16706
+ } catch (e) {
16707
+ return Promise.reject(e);
16708
+ }
16709
+ };
16710
+ var reset = function reset() {
16711
+ handleCloseNoteDialog();
16712
+ setOpenDeleteNoteDialog(false);
16713
+ setOpenConfirmNote(false);
16714
+ setNoteRequest(undefined);
16715
+ };
16716
+ var handleSaveNoteDialog = openNoteDialog === exports.NoteType.ToStudent && !(selectedItem !== null && selectedItem !== void 0 && selectedItem.id) ? handleOpenConfirmStudentNoteDialog : handleSaveNote;
16717
+ var handleSaveStudentNote = function handleSaveStudentNote() {
16718
+ if (!noteRequest) return;
16719
+ handleSaveNote(noteRequest);
16720
+ };
16721
+ return React__default.createElement(material.Box, {
16722
+ width: "100%"
16723
+ }, React__default.createElement(material.Grid, {
16724
+ container: true
16725
+ }, React__default.createElement(material.Grid, {
16726
+ item: true,
16727
+ xs: 6,
16728
+ className: "d-flex mb-3"
16729
+ }, React__default.createElement(SearchInput, {
16730
+ placeholder: t("search_for"),
16731
+ textSearchRef: textSearchRef,
16732
+ onChange: handleChangeSearchText
16733
+ })), React__default.createElement(material.Grid, {
16734
+ item: true,
16735
+ xs: 6,
16736
+ className: "d-flex justify-content-end align-items-center"
16737
+ }, React__default.createElement(material.Button, {
16738
+ variant: "contained",
16739
+ sx: {
16740
+ bgcolor: green[700]
16741
+ },
16742
+ startIcon: React__default.createElement(fa.FaPlus, {
16743
+ size: 12
16744
+ }),
16745
+ onClick: handleOpenCreateNoteDialog
16746
+ }, t("new_note"))), React__default.createElement(material.Grid, {
16747
+ item: true,
16748
+ xs: 12
16749
+ }, 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) {
16750
+ return React__default.createElement(material.TableCell, {
16751
+ key: index,
16752
+ onClick: !!i.sortKey ? function () {
16753
+ return handleSort(i.sortKey);
16754
+ } : undefined,
16755
+ className: "" + (!!i.sortKey && "pointer")
16756
+ }, React__default.createElement("div", {
16757
+ className: "d-flex justify-content-between align-items-center text-nowrap"
16758
+ }, t(i.title), !!i.sortKey && React__default.createElement(SortIcon, {
16759
+ isAscending: filter.sortColumnName !== i.sortKey ? undefined : filter.sortColumnDirection === exports.OrderType.ASC
16760
+ })));
16761
+ }))), React__default.createElement(material.TableBody, null, React__default.createElement(ListView, {
16762
+ data: data,
16763
+ render: function render(item, index) {
16764
+ return React__default.createElement(NoteItemList, {
16765
+ key: index,
16766
+ data: item,
16767
+ calcOrderNumber: calcOrderNumber,
16768
+ index: index,
16769
+ role: role,
16770
+ onDelete: handleOpenDeleteNoteDialog,
16771
+ onUpdate: handleOpenNoteDialog,
16772
+ onView: handleOpenNoteDrawer
16773
+ });
16774
+ }
16775
+ }), !data.length && !isLoading && React__default.createElement(material.TableRow, null, React__default.createElement(material.TableCell, {
16776
+ colSpan: 12,
16777
+ className: "text-center text-muted"
16778
+ }, t("no_data"))), isLoading && React__default.createElement(material.TableRow, null, React__default.createElement(material.TableCell, {
16779
+ colSpan: 12
16780
+ }, React__default.createElement(material.Stack, {
16781
+ justifyContent: "center",
16782
+ alignItems: "center",
16783
+ width: "100%"
16784
+ }, React__default.createElement(material.CircularProgress, {
16785
+ size: 24
16786
+ }))))))), React__default.createElement("div", {
16787
+ className: "d-flex justify-content-end mt-3"
16788
+ }, !!paging.totalPages && React__default.createElement(material.Pagination, {
16789
+ count: paging.totalPages,
16790
+ page: paging.page,
16791
+ onChange: handleChangePage
16792
+ })))), React__default.createElement(NoteDrawer, {
16793
+ open: !!openNoteViewDrawer,
16794
+ data: selectedItem,
16795
+ student: selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.reciever,
16796
+ width: "80dvw",
16797
+ onClose: handleCloseNoteDrawer,
16798
+ anchor: "right"
16799
+ }), React__default.createElement(GeneralNoteDialog, {
16800
+ open: openNoteDialog !== undefined,
16801
+ type: openNoteDialog,
16802
+ onClose: handleCloseNoteDialog,
16803
+ onSaveNote: handleSaveNoteDialog,
16804
+ selectedNote: selectedItem,
16805
+ value: noteRequest
16806
+ }), React__default.createElement(ConfirmDialog, {
16807
+ open: openConfirmNote,
16808
+ toggle: handleCloseConfirmStudentNoteDialog,
16809
+ onConfirm: handleSaveStudentNote,
16810
+ text: t("are_you_sure_to_create_student_parent_note"),
16811
+ zIndex: 1300
16812
+ }), React__default.createElement(ConfirmDeleteDialog, {
16813
+ open: openDeleteNoteDialog,
16814
+ toggle: handleCloseDeleteDialog,
16815
+ onConfirm: handleDeleteNote,
16816
+ text: t("are_you_sure_you_want_to_delete_the_note"),
16817
+ title: t("delete_note"),
16818
+ okText: t("delete_note"),
16819
+ cancelText: t("cancel")
16820
+ }));
16821
+ };
16822
+
16823
+ var NotetabPanel = function NotetabPanel(_ref) {
16824
+ var children = _ref.children,
16825
+ value = _ref.value,
16826
+ index = _ref.index;
16827
+ return React__default.createElement("div", {
16828
+ role: "tabpanel",
16829
+ hidden: value !== index,
16830
+ id: "tabpanel-" + index,
16831
+ "aria-labelledby": "tab-" + index
16832
+ }, value === index && React__default.createElement(material.Box, {
16833
+ sx: {
16834
+ p: 2
16835
+ }
16836
+ }, React__default.createElement(material.Typography, null, children)));
16837
+ };
16838
+
16839
+ var NOTE_STUDENT_HEADERS = [{
16840
+ title: "#"
16841
+ }, {
16842
+ title: "sender",
16843
+ sortKey: "User.UserProfile.FullName"
16844
+ }, {
16845
+ title: "student",
16846
+ sortKey: "Student.UserProfile.FullName"
16847
+ }, {
16848
+ title: "content"
16849
+ }, {
16850
+ title: "type"
16851
+ }, {
16852
+ title: "created_at",
16853
+ sortKey: "CreatedAt"
16854
+ }, {
16855
+ title: "actions"
16856
+ }];
16857
+ var NOTE_TEACHER_HEADERS = [{
16858
+ title: "#"
16859
+ }, {
16860
+ title: "sender",
16861
+ sortKey: "User.UserProfile.FullName"
16862
+ }, {
16863
+ title: "receivers"
16864
+ }, {
16865
+ title: "content"
16866
+ }, {
16867
+ title: "type"
16868
+ }, {
16869
+ title: "created_at",
16870
+ sortKey: "CreatedAt"
16871
+ }, {
16872
+ title: "actions"
16873
+ }];
16874
+ var NOTE_ADMIN_HEADERS = [{
16875
+ title: "#"
16876
+ }, {
16877
+ title: "sender",
16878
+ sortKey: "User.UserProfile.FullName"
16879
+ }, {
16880
+ title: "receivers"
16881
+ }, {
16882
+ title: "content"
16883
+ }, {
16884
+ title: "type"
16885
+ }, {
16886
+ title: "created_at",
16887
+ sortKey: "CreatedAt"
16888
+ }, {
16889
+ title: "actions"
16890
+ }];
16891
+ var ACADEMY_NOTE_FILTER = {
16892
+ currentPage: 1,
16893
+ pageSize: 12,
16894
+ sortColumnDirection: exports.OrderType.DESC,
16895
+ sortColumnName: NoteSortColumn.CreatedAt,
16896
+ types: [exports.NoteType.ToAcademy]
16897
+ };
16898
+ var STUDENT_PARENTS_NOTE_FILTER = {
16899
+ currentPage: 1,
16900
+ pageSize: 12,
16901
+ sortColumnDirection: exports.OrderType.DESC,
16902
+ sortColumnName: NoteSortColumn.CreatedAt,
16903
+ types: [exports.NoteType.ToStudent]
16904
+ };
16905
+ var ADMIN_TEACHER_NOTE_FILTER = {
16906
+ currentPage: 1,
16907
+ pageSize: 12,
16908
+ sortColumnDirection: exports.OrderType.DESC,
16909
+ sortColumnName: NoteSortColumn.CreatedAt,
16910
+ types: [exports.NoteType.TeacherToAllAdmin, exports.NoteType.AdminToAllTeacher]
16911
+ };
16912
+ var ADMIN_NOTE_FILTER = {
16913
+ currentPage: 1,
16914
+ pageSize: 12,
16915
+ sortColumnDirection: exports.OrderType.DESC,
16916
+ sortColumnName: NoteSortColumn.CreatedAt,
16917
+ types: [exports.NoteType.TeacherToAllAdmin, exports.NoteType.AdminToAllTeacher, exports.NoteType.AdminToAllAdmin]
16918
+ };
16919
+ var TEACHER_NOTE_FILTER = {
16920
+ currentPage: 1,
16921
+ pageSize: 12,
16922
+ sortColumnDirection: exports.OrderType.DESC,
16923
+ sortColumnName: NoteSortColumn.CreatedAt,
16924
+ types: [exports.NoteType.TeacherToTeachers]
16925
+ };
16926
+
16927
+ var NoteTabs = function NoteTabs(_ref) {
16928
+ var role = _ref.role;
16929
+ var roles = reactRedux.useSelector(function (state) {
16930
+ var _state$common$user$ro, _state$common, _state$common$user;
16931
+ 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 : [];
16932
+ });
16933
+ var isAdminUser = roles.includes(exports.Role.Admin);
16934
+ var isAdmin = roles.includes(exports.Role.Admin);
16935
+ var _useState = React.useState(0),
16936
+ value = _useState[0],
16937
+ setValue = _useState[1];
16938
+ var handleChange = function handleChange(_event, newValue) {
16939
+ setValue(newValue);
16940
+ };
16941
+ return React__default.createElement(material.Box, {
16942
+ sx: {
16943
+ width: "100%"
16944
+ }
16945
+ }, React__default.createElement(material.Tabs, {
16946
+ value: value,
16947
+ onChange: handleChange,
16948
+ sx: {
16949
+ "& .MuiTab-root": {
16950
+ color: grey[500],
16951
+ fontSize: "1rem"
16952
+ },
16953
+ "& .Mui-selected": {
16954
+ color: green[700] + "!important"
16955
+ },
16956
+ "& .MuiTabs-indicator": {
16957
+ backgroundColor: green[700]
16958
+ }
16959
+ }
16960
+ }, React__default.createElement(material.Tab, Object.assign({
16961
+ label: i18n.t("academy")
16962
+ }, a11yProps$1(0))), React__default.createElement(material.Tab, Object.assign({
16963
+ label: i18n.t("student_parents")
16964
+ }, a11yProps$1(1))), React__default.createElement(material.Tab, Object.assign({
16965
+ label: i18n.t("admin")
16966
+ }, a11yProps$1(2))), !isAdmin && !isAdminUser && React__default.createElement(material.Tab, Object.assign({
16967
+ label: i18n.t("teacher")
16968
+ }, a11yProps$1(3)))), React__default.createElement(NotetabPanel, {
16969
+ value: value,
16970
+ index: 0
16971
+ }, React__default.createElement(NoteList, {
16972
+ role: role,
16973
+ isAdmin: isAdmin,
16974
+ defaultFilter: ACADEMY_NOTE_FILTER,
16975
+ headers: NOTE_STUDENT_HEADERS
16976
+ })), React__default.createElement(NotetabPanel, {
16977
+ value: value,
16978
+ index: 1
16979
+ }, React__default.createElement(NoteList, {
16980
+ role: role,
16981
+ isAdmin: isAdmin,
16982
+ defaultFilter: STUDENT_PARENTS_NOTE_FILTER,
16983
+ headers: NOTE_STUDENT_HEADERS
16984
+ })), React__default.createElement(NotetabPanel, {
16985
+ value: value,
16986
+ index: 2
16987
+ }, React__default.createElement(NoteList, {
16988
+ role: role,
16989
+ isAdmin: isAdmin,
16990
+ defaultFilter: isAdmin ? ADMIN_NOTE_FILTER : ADMIN_TEACHER_NOTE_FILTER,
16991
+ headers: NOTE_ADMIN_HEADERS
16992
+ })), !isAdmin && !isAdminUser && React__default.createElement(NotetabPanel, {
16993
+ value: value,
16994
+ index: 3
16995
+ }, React__default.createElement(NoteList, {
16996
+ role: role,
16997
+ isAdmin: isAdmin,
16998
+ defaultFilter: TEACHER_NOTE_FILTER,
16999
+ headers: NOTE_TEACHER_HEADERS
15912
17000
  })));
15913
17001
  };
17002
+ function a11yProps$1(index) {
17003
+ return {
17004
+ id: "tab-" + index,
17005
+ "aria-controls": "tabpanel-" + index
17006
+ };
17007
+ }
15914
17008
 
15915
- var useVirtualList = function useVirtualList(studentId, defaultFilter, getItemsApi) {
17009
+ var useVirtualList = function useVirtualList(defaultFilter, getItemsApi) {
15916
17010
  var _useTranslation = reactI18next.useTranslation(),
15917
17011
  t = _useTranslation.t;
15918
17012
  var _useState = React.useState([]),
@@ -15926,7 +17020,7 @@ var useVirtualList = function useVirtualList(studentId, defaultFilter, getItemsA
15926
17020
  setSelectedItem = _useState3[1];
15927
17021
  var _useState4 = React.useState(false),
15928
17022
  isLoading = _useState4[0],
15929
- setLoadingExamSessions = _useState4[1];
17023
+ setLoading = _useState4[1];
15930
17024
  var _useState5 = React.useState(),
15931
17025
  filter = _useState5[0],
15932
17026
  setFilter = _useState5[1];
@@ -15936,18 +17030,16 @@ var useVirtualList = function useVirtualList(studentId, defaultFilter, getItemsA
15936
17030
  var getItems = function getItems() {
15937
17031
  try {
15938
17032
  var _temp2 = function _temp2() {
15939
- setLoadingExamSessions(false);
17033
+ setLoading(false);
15940
17034
  };
15941
17035
  if (isLoading) return Promise.resolve();
15942
17036
  if (!filter || !filter.currentPage) {
15943
17037
  setItems([]);
15944
17038
  return Promise.resolve();
15945
17039
  }
15946
- setLoadingExamSessions(true);
17040
+ setLoading(true);
15947
17041
  var _temp = _catch(function () {
15948
- return Promise.resolve(getItemsApi(_extends({}, filter, {
15949
- studentId: studentId
15950
- }))).then(function (res) {
17042
+ return Promise.resolve(getItemsApi(filter)).then(function (res) {
15951
17043
  var responseData = res.data;
15952
17044
  setTotalPages((responseData === null || responseData === void 0 ? void 0 : responseData.totalPages) || 0);
15953
17045
  var responseItems = (responseData === null || responseData === void 0 ? void 0 : responseData.items) || [];
@@ -15986,23 +17078,25 @@ var useVirtualList = function useVirtualList(studentId, defaultFilter, getItemsA
15986
17078
  });
15987
17079
  setItems(results);
15988
17080
  };
15989
- var handleItemRemoved = function handleItemRemoved(item) {
15990
- var results = items.filter(function (i) {
15991
- return i.id !== item.id;
15992
- });
15993
- setItems(results);
17081
+ var handleItemRemoved = function handleItemRemoved(_item) {
17082
+ getItems();
17083
+ };
17084
+ var handleChangeFilter = function handleChangeFilter(newFilter) {
17085
+ setFilter(newFilter);
15994
17086
  };
15995
17087
  React.useEffect(function () {
15996
17088
  setFilter(defaultFilter);
15997
17089
  }, [JSON.stringify(defaultFilter)]);
15998
17090
  React.useEffect(function () {
15999
17091
  getItems();
16000
- }, [JSON.stringify(filter)]);
17092
+ }, [JSON.stringify(filter), getItemsApi]);
16001
17093
  return {
16002
17094
  t: t,
17095
+ filter: filter,
16003
17096
  selectedItem: selectedItem,
16004
17097
  items: items,
16005
17098
  isLoading: isLoading,
17099
+ handleChangeFilter: handleChangeFilter,
16006
17100
  setItems: setItems,
16007
17101
  handleChangeSelectedItem: handleChangeSelectedItem,
16008
17102
  handleLoadMore: handleLoadMore,
@@ -16054,8 +17148,9 @@ var useDrawerNoteTab = function useDrawerNoteTab(props) {
16054
17148
  var _useState6 = React.useState(),
16055
17149
  noteIdContextMenu = _useState6[0],
16056
17150
  setNoteIdContextMenu = _useState6[1];
16057
- var _useVirtualList = useVirtualList(studentId, _extends({}, DEFAULT_NOTE_FILTER, {
16058
- type: exports.NoteType.Default
17151
+ var _useVirtualList = useVirtualList(_extends({}, DEFAULT_NOTE_FILTER, {
17152
+ types: [exports.NoteType.ToAcademy],
17153
+ studentId: studentId
16059
17154
  }), getNotesApi$1),
16060
17155
  academyNotes = _useVirtualList.items,
16061
17156
  isLoadingAcademyNotes = _useVirtualList.isLoading,
@@ -16065,8 +17160,9 @@ var useDrawerNoteTab = function useDrawerNoteTab(props) {
16065
17160
  handleItemAddedAcademyNote = _useVirtualList.handleItemAdded,
16066
17161
  handleItemUpdatedAcademyNote = _useVirtualList.handleItemUpdated,
16067
17162
  handleChangeSelectedItem = _useVirtualList.handleChangeSelectedItem;
16068
- var _useVirtualList2 = useVirtualList(studentId, _extends({}, DEFAULT_NOTE_FILTER, {
16069
- type: exports.NoteType.StudentReadable
17163
+ var _useVirtualList2 = useVirtualList(_extends({}, DEFAULT_NOTE_FILTER, {
17164
+ types: [exports.NoteType.ToStudent],
17165
+ studentId: studentId
16070
17166
  }), getNotesApi$1),
16071
17167
  studentNotes = _useVirtualList2.items,
16072
17168
  isLoadingStudentNotes = _useVirtualList2.isLoading,
@@ -16083,11 +17179,11 @@ var useDrawerNoteTab = function useDrawerNoteTab(props) {
16083
17179
  };
16084
17180
  var handleOpenCreateAcademyNoteDialog = function handleOpenCreateAcademyNoteDialog() {
16085
17181
  handleCloseTooltip();
16086
- setOpenNoteDialog(exports.NoteType.Default);
17182
+ setOpenNoteDialog(exports.NoteType.ToAcademy);
16087
17183
  };
16088
17184
  var handleOpenCreateStudentNoteDialog = function handleOpenCreateStudentNoteDialog() {
16089
17185
  handleCloseTooltip();
16090
- setOpenNoteDialog(exports.NoteType.StudentReadable);
17186
+ setOpenNoteDialog(exports.NoteType.ToStudent);
16091
17187
  };
16092
17188
  var handleCloseTooltip = function handleCloseTooltip() {
16093
17189
  setNoteIdContextMenu(0);
@@ -16138,7 +17234,7 @@ var useDrawerNoteTab = function useDrawerNoteTab(props) {
16138
17234
  var _temp = function () {
16139
17235
  if (selectedItem) {
16140
17236
  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);
17237
+ if (selectedItem.type === exports.NoteType.ToStudent) handleItemUpdatedStudentNote(res.data);else handleItemUpdatedAcademyNote(res.data);
16142
17238
  reactToastify.toast.success(t("update_note_successfully"));
16143
17239
  });
16144
17240
  } else {
@@ -16146,7 +17242,7 @@ var useDrawerNoteTab = function useDrawerNoteTab(props) {
16146
17242
  return Promise.resolve(createNoteApi$1(_extends({}, data, {
16147
17243
  type: openNoteDialog
16148
17244
  }))).then(function (res) {
16149
- if (res.data.type === exports.NoteType.StudentReadable) handleItemAddedStudentNote(res.data);else handleItemAddedAcademyNote(res.data);
17245
+ if (res.data.type === exports.NoteType.ToStudent) handleItemAddedStudentNote(res.data);else handleItemAddedAcademyNote(res.data);
16150
17246
  reactToastify.toast.success(t("create_note_successfully"));
16151
17247
  });
16152
17248
  }
@@ -16179,7 +17275,7 @@ var useDrawerNoteTab = function useDrawerNoteTab(props) {
16179
17275
  var _temp5 = _catch(function () {
16180
17276
  return Promise.resolve(deleteNoteApi$1(selectedItem.id)).then(function () {
16181
17277
  reactToastify.toast.success(t("delete_note_successfully"));
16182
- if (selectedItem.type === exports.NoteType.StudentReadable) handleItemRemovedStudentNote(selectedItem);else handleItemRemovedAcademyNote(selectedItem);
17278
+ if (selectedItem.type === exports.NoteType.ToStudent) handleItemRemovedStudentNote(selectedItem);else handleItemRemovedAcademyNote(selectedItem);
16183
17279
  reset();
16184
17280
  });
16185
17281
  }, function (error) {
@@ -16201,14 +17297,12 @@ var useDrawerNoteTab = function useDrawerNoteTab(props) {
16201
17297
  handleSaveNote(studentNoteContent);
16202
17298
  };
16203
17299
  var noteDialogProps = {
16204
- open: openNoteDialog === exports.NoteType.StudentReadable && !openConfirmNote || openNoteDialog === exports.NoteType.Default,
17300
+ open: openNoteDialog === exports.NoteType.ToStudent && !openConfirmNote || openNoteDialog === exports.NoteType.ToAcademy,
16205
17301
  selectedNote: selectedItem,
16206
- tip: " (" + t(openNoteDialog === exports.NoteType.StudentReadable ? "student_parents" : "academy") + ")",
17302
+ tip: " (" + t(openNoteDialog === exports.NoteType.ToStudent ? "student_parents" : "academy") + ")",
16207
17303
  value: studentNoteContent,
16208
17304
  onClose: handleCloseNoteDialog,
16209
- onSaveNote: openNoteDialog === exports.NoteType.StudentReadable && !(selectedItem !== null && selectedItem !== void 0 && selectedItem.id) ? handleOpenConfirmStudentNoteDialog : function (content) {
16210
- return handleSaveNote(content);
16211
- }
17305
+ onSaveNote: openNoteDialog === exports.NoteType.ToStudent && !(selectedItem !== null && selectedItem !== void 0 && selectedItem.id) ? handleOpenConfirmStudentNoteDialog : handleSaveNote
16212
17306
  };
16213
17307
  return {
16214
17308
  openConfirmNote: openConfirmNote,
@@ -16475,11 +17569,11 @@ var DrawerInfoTab = function DrawerInfoTab(_ref) {
16475
17569
  }
16476
17570
  }, data ? React__default.createElement(material.Typography, {
16477
17571
  sx: contentStyle
16478
- }, t(function (label) {
17572
+ }, !!data.grade ? t(function (label) {
16479
17573
  return label ? t(label) : formatGrade(data.grade, t, language);
16480
17574
  }((_BRIEF_GRADE_OPTIONS$ = BRIEF_GRADE_OPTIONS.find(function (o) {
16481
17575
  return o.value === Number(data.grade);
16482
- })) === null || _BRIEF_GRADE_OPTIONS$ === void 0 ? void 0 : _BRIEF_GRADE_OPTIONS$.label))) : React__default.createElement(material.Skeleton, {
17576
+ })) === null || _BRIEF_GRADE_OPTIONS$ === void 0 ? void 0 : _BRIEF_GRADE_OPTIONS$.label)) : "") : React__default.createElement(material.Skeleton, {
16483
17577
  variant: "text",
16484
17578
  width: 20,
16485
17579
  sx: contentStyle
@@ -16672,7 +17766,7 @@ var ExamResultItem = function ExamResultItem(_ref) {
16672
17766
  }, (_data$teacher = data.teacher) === null || _data$teacher === void 0 ? void 0 : _data$teacher.fullName))))));
16673
17767
  };
16674
17768
 
16675
- var ExanResultList = function ExanResultList(_ref) {
17769
+ var ExamResultList = function ExamResultList(_ref) {
16676
17770
  var studentId = _ref.studentId,
16677
17771
  data = _ref.data,
16678
17772
  isLoading = _ref.isLoading,
@@ -22026,7 +23120,7 @@ var ExamResultDrawer = function ExamResultDrawer(_ref) {
22026
23120
  fontSize: "13px",
22027
23121
  fontWeight: 500
22028
23122
  }
22029
- }, student.schoolName), React__default.createElement(material.Typography, {
23123
+ }, student.schoolName), !!student.grade && React__default.createElement(material.Typography, {
22030
23124
  sx: {
22031
23125
  color: grey[500],
22032
23126
  fontSize: "13px",
@@ -22064,7 +23158,9 @@ var DrawerExamResultTab = function DrawerExamResultTab(_ref) {
22064
23158
  value = _ref.value,
22065
23159
  studentId = _ref.studentId,
22066
23160
  onViewQA = _ref.onViewQA;
22067
- var _useVirtualList = useVirtualList(studentId, EXAM_SESSION_DEFAULT_FILTER, getExamSessionListApi),
23161
+ var _useVirtualList = useVirtualList(_extends({}, EXAM_SESSION_DEFAULT_FILTER, {
23162
+ studentId: studentId
23163
+ }), getExamSessionListApi),
22068
23164
  items = _useVirtualList.items,
22069
23165
  selectedItem = _useVirtualList.selectedItem,
22070
23166
  isLoading = _useVirtualList.isLoading,
@@ -22081,7 +23177,7 @@ var DrawerExamResultTab = function DrawerExamResultTab(_ref) {
22081
23177
  p: 3,
22082
23178
  height: "100%"
22083
23179
  }
22084
- }, React__default.createElement(ExanResultList, {
23180
+ }, React__default.createElement(ExamResultList, {
22085
23181
  data: items,
22086
23182
  isLoading: isLoading,
22087
23183
  onLoadMore: handleLoadMore,
@@ -24830,7 +25926,9 @@ var DrawerTextbookResultTab = function DrawerTextbookResultTab(_ref) {
24830
25926
  selectedTab = _ref.selectedTab,
24831
25927
  value = _ref.value,
24832
25928
  onViewQA = _ref.onViewQA;
24833
- var _useVirtualList = useVirtualList(studentId, TEXTBOOK_DEFAULT_FILTER, getTextbookListApi),
25929
+ var _useVirtualList = useVirtualList(_extends({}, TEXTBOOK_DEFAULT_FILTER, {
25930
+ studentId: studentId
25931
+ }), getTextbookListApi),
24834
25932
  items = _useVirtualList.items,
24835
25933
  selectedItem = _useVirtualList.selectedItem,
24836
25934
  isLoading = _useVirtualList.isLoading,
@@ -25228,9 +26326,10 @@ var useDrawerAttendanceTab = function useDrawerAttendanceTab(studentId, onUpdate
25228
26326
  var pusher = concurrentConnectionPusher === null || concurrentConnectionPusher === void 0 ? void 0 : concurrentConnectionPusher.pusher;
25229
26327
  var channelName = React.useRef();
25230
26328
  var channel = React.useRef();
25231
- var _useVirtualList = useVirtualList(studentId, ATTENDANCE_COURSE_DEFAULT_FILTER, function (query) {
25232
- return getAttendanceByStudentIdApi(studentId, query);
25233
- }),
26329
+ var handleGetAttendanceByStudentId = React.useCallback(function (query) {
26330
+ return getAttendanceByStudentIdApi(studentId, query);
26331
+ }, [studentId]);
26332
+ var _useVirtualList = useVirtualList(ATTENDANCE_COURSE_DEFAULT_FILTER, handleGetAttendanceByStudentId),
25234
26333
  items = _useVirtualList.items,
25235
26334
  isLoading = _useVirtualList.isLoading,
25236
26335
  handleLoadMore = _useVirtualList.handleLoadMore,
@@ -26316,9 +27415,9 @@ var useLessonClassList = function useLessonClassList(courseId) {
26316
27415
  };
26317
27416
  };
26318
27417
 
26319
- var TEACHER_URL = BASE_URL + "/api/teacher";
26320
- var getTeacherListApi = function getTeacherListApi(query) {
26321
- return api.get("" + TEACHER_URL, {
27418
+ var TEACHER_URL$1 = BASE_URL + "/api/teacher";
27419
+ var getTeacherListApi$1 = function getTeacherListApi(query) {
27420
+ return api.get("" + TEACHER_URL$1, {
26322
27421
  params: query
26323
27422
  });
26324
27423
  };
@@ -26339,7 +27438,7 @@ var useTeacherList = function useTeacherList() {
26339
27438
  var getListTeacher = function getListTeacher() {
26340
27439
  try {
26341
27440
  var _temp = _catch(function () {
26342
- return Promise.resolve(getTeacherListApi(teacherFilter)).then(function (res) {
27441
+ return Promise.resolve(getTeacherListApi$1(teacherFilter)).then(function (res) {
26343
27442
  var _res$data;
26344
27443
  setTeachers(((_res$data = res.data) === null || _res$data === void 0 ? void 0 : _res$data.items) || []);
26345
27444
  });
@@ -26409,11 +27508,6 @@ var useClassDetail = function useClassDetail(_ref) {
26409
27508
  var isSelected = function isSelected(id) {
26410
27509
  return selected.indexOf(id) !== -1;
26411
27510
  };
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
27511
  var _useStudentClassList = useStudentClassList(classId),
26418
27512
  getStudents = _useStudentClassList.getStudents,
26419
27513
  studentListProps = _objectWithoutPropertiesLoose(_useStudentClassList, _excluded$b);
@@ -26803,12 +27897,6 @@ var useClassDetail = function useClassDetail(_ref) {
26803
27897
  React.useEffect(function () {
26804
27898
  document.title = t("study_peak") + " | " + t(PAGE_TITLE$4);
26805
27899
  }, [t]);
26806
- React.useEffect(function () {
26807
- if (!isReadyRegisterPusher && registerPusherRef.current) {
26808
- dispatch(setReadyRegisterPusher(true));
26809
- registerPusherRef.current = false;
26810
- }
26811
- }, [isReadyRegisterPusher]);
26812
27900
  return {
26813
27901
  classId: classId,
26814
27902
  schema: schema,
@@ -28473,11 +29561,6 @@ var useUserList = function useUserList(role) {
28473
29561
  setOpenDeleteUserCsv = _useState10[1];
28474
29562
  var inputFileRef = React.useRef(null);
28475
29563
  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
29564
  var handleChangeSelectedStudent = function handleChangeSelectedStudent(student) {
28482
29565
  var _student$roles, _student$roles2;
28483
29566
  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 +29872,6 @@ var useUserList = function useUserList(role) {
28789
29872
  var userHeaders = USER_HEADERS.filter(function (i) {
28790
29873
  return i.roles.includes(role);
28791
29874
  });
28792
- React.useEffect(function () {
28793
- if (!isReadyRegisterPusher && registerPusherRef.current) {
28794
- dispatch(setReadyRegisterPusher(true));
28795
- registerPusherRef.current = false;
28796
- }
28797
- }, [isReadyRegisterPusher]);
28798
29875
  return {
28799
29876
  userDetail: userDetail,
28800
29877
  userHeaders: userHeaders,
@@ -30726,9 +31803,9 @@ var TextbookSortBy$1;
30726
31803
  var TeacherSortBy$1;
30727
31804
  (function (TeacherSortBy) {
30728
31805
  TeacherSortBy["CreatedAt"] = "CreatedAt";
30729
- TeacherSortBy["Name"] = "UserProfile.FullName";
30730
- TeacherSortBy["Email"] = "Email";
30731
- TeacherSortBy["PhoneNumber"] = "UserProfile.PhoneNumber";
31806
+ TeacherSortBy["Name"] = "User.UserProfile.FullName";
31807
+ TeacherSortBy["Email"] = "User.Email";
31808
+ TeacherSortBy["PhoneNumber"] = "User.UserProfile.PhoneNumber";
30732
31809
  })(TeacherSortBy$1 || (TeacherSortBy$1 = {}));
30733
31810
  var ExamType$1;
30734
31811
  (function (ExamType) {
@@ -32495,9 +33572,9 @@ var ShareToTeacherDialog = function ShareToTeacherDialog(_ref) {
32495
33572
  }, t("cancel")))));
32496
33573
  };
32497
33574
 
32498
- var TEACHER_URL$1 = BASE_URL + "/api/teacher";
32499
- var getTeacherListApi$1 = function getTeacherListApi(query) {
32500
- return api.get("" + TEACHER_URL$1, {
33575
+ var TEACHER_URL$2 = BASE_URL + "/api/teacher";
33576
+ var getTeacherListApi$2 = function getTeacherListApi(query) {
33577
+ return api.get("" + TEACHER_URL$2, {
32501
33578
  params: query
32502
33579
  });
32503
33580
  };
@@ -32508,7 +33585,7 @@ var useTextbookShare = function useTextbookShare(props) {
32508
33585
  role = props.role,
32509
33586
  isSuperAdmin = props.isSuperAdmin;
32510
33587
  var _useList = useList(!isSuperAdmin ? function (search) {
32511
- return getTeacherListApi$1(search);
33588
+ return getTeacherListApi$2(search);
32512
33589
  } : null, DefaultTeacherQuery),
32513
33590
  filterShare = _useList.filter,
32514
33591
  textSearchShareRef = _useList.textSearchRef,
@@ -37539,17 +38616,17 @@ var PreparedTextbookForm = function PreparedTextbookForm(_ref) {
37539
38616
  sx: {
37540
38617
  color: inforErrors && submitCount ? error.main + "!important" : "gray"
37541
38618
  }
37542
- }, a11yProps$1(0))), React__default.createElement(material.Tab, Object.assign({
38619
+ }, a11yProps$2(0))), React__default.createElement(material.Tab, Object.assign({
37543
38620
  label: i18n.t("textbook.contents"),
37544
38621
  sx: {
37545
38622
  color: contentsErrors && submitCount ? error.main + "!important" : "gray"
37546
38623
  }
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({
38624
+ }, 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
38625
  label: i18n.t("textbook.owners"),
37549
38626
  sx: {
37550
38627
  color: textbookOwnersErrors && submitCount ? error.main + "!important" : "gray"
37551
38628
  }
37552
- }, a11yProps$1(2))))), React__default.createElement(CustomTextbookTab, {
38629
+ }, a11yProps$2(2))))), React__default.createElement(CustomTextbookTab, {
37553
38630
  value: selected,
37554
38631
  index: 0
37555
38632
  }, React__default.createElement(TextbookInfoTab, Object.assign({}, formikProps, {
@@ -37571,7 +38648,7 @@ var PreparedTextbookForm = function PreparedTextbookForm(_ref) {
37571
38648
  disabled: ownersDisabled
37572
38649
  }))))));
37573
38650
  };
37574
- var a11yProps$1 = function a11yProps(index) {
38651
+ var a11yProps$2 = function a11yProps(index) {
37575
38652
  return {
37576
38653
  id: "textbook-tab-" + index,
37577
38654
  "aria-controls": "textbook-tabpanel-" + index
@@ -37968,6 +39045,449 @@ var PreparedTextbookList = function PreparedTextbookList(_ref) {
37968
39045
  }));
37969
39046
  };
37970
39047
 
39048
+ var AnnouncementEvent;
39049
+ (function (AnnouncementEvent) {
39050
+ AnnouncementEvent["ReceivedNewNote"] = "ReceivedNewNote";
39051
+ AnnouncementEvent["UpdatedNote"] = "UpdatedNote";
39052
+ AnnouncementEvent["DeletedNote"] = "DeletedNote";
39053
+ })(AnnouncementEvent || (AnnouncementEvent = {}));
39054
+ (function (AnnouncementType) {
39055
+ AnnouncementType["ReceivedNewNote"] = "ReceivedNewNote";
39056
+ })(exports.AnnouncementType || (exports.AnnouncementType = {}));
39057
+
39058
+ var stringToColor = function stringToColor(string) {
39059
+ var hash = 0;
39060
+ var i;
39061
+ for (i = 0; i < string.length; i += 1) {
39062
+ hash = string.charCodeAt(i) + ((hash << 5) - hash);
39063
+ }
39064
+ var color = "#";
39065
+ for (i = 0; i < 3; i += 1) {
39066
+ var value = hash >> i * 8 & 0xff;
39067
+ color += ("00" + value.toString(16)).slice(-2);
39068
+ }
39069
+ return color;
39070
+ };
39071
+ var stringAvatar = function stringAvatar(name) {
39072
+ var _name$split$0$, _name$split$, _name$split$1$, _name$split$2;
39073
+ return {
39074
+ sx: {
39075
+ bgcolor: stringToColor(name)
39076
+ },
39077
+ 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$ : "")
39078
+ };
39079
+ };
39080
+ var convertAnnouncementData = function convertAnnouncementData(t, role, announcement) {
39081
+ var isTeacherSite = role === exports.Role.Teacher;
39082
+ var data = announcement.data;
39083
+ switch (announcement.type) {
39084
+ case exports.AnnouncementType.ReceivedNewNote:
39085
+ var extraData = data.data;
39086
+ var contents = extraData.split("|");
39087
+ var noteType = contents[0];
39088
+ var content = contents.slice(1).join("|");
39089
+ var isAdmin = noteType === exports.NoteType[exports.NoteType.AdminToAllTeacher] || noteType === exports.NoteType[exports.NoteType.AdminToAllAdmin];
39090
+ return {
39091
+ content: content,
39092
+ name: isAdmin ? isTeacherSite ? t("admin") : t("admin_n", {
39093
+ admin: data.senderFullName
39094
+ }) : t("teacher_n", {
39095
+ teacher: data.senderFullName
39096
+ }),
39097
+ image: isAdmin && isTeacherSite ? undefined : data.senderAvatar,
39098
+ action: t("sent_a_memo")
39099
+ };
39100
+ default:
39101
+ return {
39102
+ name: data.senderFullName,
39103
+ image: data.senderAvatar,
39104
+ content: data.data,
39105
+ action: ""
39106
+ };
39107
+ }
39108
+ };
39109
+
39110
+ var AnnouncementItem = function AnnouncementItem(_ref) {
39111
+ var data = _ref.data,
39112
+ role = _ref.role,
39113
+ renderLink = _ref.renderLink,
39114
+ onLoad = _ref.onLoad;
39115
+ var _useTranslation = reactI18next.useTranslation(),
39116
+ t = _useTranslation.t;
39117
+ React.useEffect(function () {
39118
+ onLoad();
39119
+ }, []);
39120
+ var announcementData = convertAnnouncementData(t, role, data);
39121
+ return React__default.createElement(React.Fragment, null, renderLink(React__default.createElement(material.ListItemButton, {
39122
+ sx: _extends({
39123
+ py: 1.5,
39124
+ px: 2.5,
39125
+ mt: "1px"
39126
+ }, !data.isRead && {
39127
+ bgcolor: "action.selected"
39128
+ })
39129
+ }, React__default.createElement(material.Stack, {
39130
+ direction: "row",
39131
+ gap: 1,
39132
+ justifyContent: "space-between",
39133
+ width: "100%"
39134
+ }, React__default.createElement(material.Stack, {
39135
+ direction: "row",
39136
+ gap: 1
39137
+ }, React__default.createElement(material.ListItemAvatar, null, React__default.createElement(material.Avatar, Object.assign({}, stringAvatar(announcementData.name), {
39138
+ src: announcementData.image
39139
+ }))), React__default.createElement(material.ListItemText, {
39140
+ sx: {
39141
+ marginBlock: 0
39142
+ },
39143
+ primary: React__default.createElement(material.Box, null, React__default.createElement(material.Typography, {
39144
+ fontWeight: 600,
39145
+ display: "inline-block"
39146
+ }, announcementData.name), announcementData.action && React__default.createElement(material.Typography, {
39147
+ display: "inline-block",
39148
+ px: "4px"
39149
+ }, announcementData.action + ":"), React__default.createElement(material.Box, {
39150
+ display: "inline-block"
39151
+ }, React__default.createElement(material.Box, {
39152
+ sx: {
39153
+ display: "-webkit-box",
39154
+ lineClamp: 2,
39155
+ WebkitLineClamp: 2,
39156
+ WebkitBoxOrient: "vertical",
39157
+ boxOrient: "vertical",
39158
+ overflow: "hidden"
39159
+ },
39160
+ dangerouslySetInnerHTML: {
39161
+ __html: announcementData.content || ""
39162
+ }
39163
+ }))),
39164
+ secondary: React__default.createElement(material.Typography, {
39165
+ variant: "caption",
39166
+ sx: {
39167
+ mt: 0.5,
39168
+ display: "flex",
39169
+ alignItems: "center",
39170
+ color: "text.disabled"
39171
+ }
39172
+ }, React__default.createElement(material.Box, {
39173
+ sx: {
39174
+ marginRight: "8px"
39175
+ }
39176
+ }, React__default.createElement(fa6.FaClockRotateLeft, {
39177
+ size: 12
39178
+ })), timAgo(data.createdAt, t, true))
39179
+ })))), data));
39180
+ };
39181
+
39182
+ var AnnouncementList = function AnnouncementList(_ref) {
39183
+ var role = _ref.role,
39184
+ items = _ref.items,
39185
+ isLoading = _ref.isLoading,
39186
+ onLoadMore = _ref.onLoadMore,
39187
+ renderLink = _ref.renderLink;
39188
+ return React__default.createElement(VirtualListView, {
39189
+ data: items,
39190
+ loading: isLoading,
39191
+ listHeight: 0,
39192
+ containerProps: {
39193
+ sx: {
39194
+ height: "100%"
39195
+ }
39196
+ },
39197
+ renderItem: function renderItem(item, index, measure) {
39198
+ return React__default.createElement(AnnouncementItem, {
39199
+ role: role,
39200
+ key: index,
39201
+ data: item,
39202
+ renderLink: renderLink,
39203
+ onLoad: measure
39204
+ });
39205
+ },
39206
+ onLoadMore: onLoadMore
39207
+ });
39208
+ };
39209
+
39210
+ var DEFAULT_ANNOUNCEMENT_FILTER = {
39211
+ currentPage: 1,
39212
+ pageSize: 10,
39213
+ sortColumnDirection: exports.OrderType.DESC,
39214
+ sortColumnName: "CreatedAt"
39215
+ };
39216
+ var ANNOUNCEMENT_CHANNEL = "ANNOUNCEMENT_A{academy}_U{userId}_CHANNEL";
39217
+
39218
+ var ANNOUNCEMENT_URL = BASE_URL + "/api/announcements";
39219
+ var getAnnouncementListApi = function getAnnouncementListApi(query) {
39220
+ return api.get("" + ANNOUNCEMENT_URL, {
39221
+ params: query
39222
+ });
39223
+ };
39224
+ var getTotalNumberUnreadAnnouncementsApi = function getTotalNumberUnreadAnnouncementsApi() {
39225
+ return api.get(ANNOUNCEMENT_URL + "/unread");
39226
+ };
39227
+ var markAsReadAnnouncementsApi = function markAsReadAnnouncementsApi() {
39228
+ return api.post(ANNOUNCEMENT_URL + "/mark-as-read");
39229
+ };
39230
+ var markAsReadAnnouncementByIdApi = function markAsReadAnnouncementByIdApi(id) {
39231
+ return api.post(ANNOUNCEMENT_URL + "/" + id + "/mark-as-read");
39232
+ };
39233
+
39234
+ var AnnouncementContainer = function AnnouncementContainer(_ref) {
39235
+ var role = _ref.role,
39236
+ renderLink = _ref.renderLink,
39237
+ renderViewNoteLink = _ref.renderViewNoteLink;
39238
+ var _useTranslation = reactI18next.useTranslation(),
39239
+ t = _useTranslation.t;
39240
+ var dispatch = reactRedux.useDispatch();
39241
+ var user = reactRedux.useSelector(function (state) {
39242
+ var _state$common;
39243
+ return state === null || state === void 0 ? void 0 : (_state$common = state.common) === null || _state$common === void 0 ? void 0 : _state$common.user;
39244
+ });
39245
+ var academyDomain = user === null || user === void 0 ? void 0 : user.academyDomain;
39246
+ var concurrentConnectionPusher = reactRedux.useSelector(function (state) {
39247
+ var _state$common2;
39248
+ return state === null || state === void 0 ? void 0 : (_state$common2 = state.common) === null || _state$common2 === void 0 ? void 0 : _state$common2.concurrentConnectionPusher;
39249
+ });
39250
+ var totalUnreadMessages = reactRedux.useSelector(function (state) {
39251
+ var _state$common3;
39252
+ return state === null || state === void 0 ? void 0 : (_state$common3 = state.common) === null || _state$common3 === void 0 ? void 0 : _state$common3.totalUnreadMessages;
39253
+ });
39254
+ var pusher = concurrentConnectionPusher === null || concurrentConnectionPusher === void 0 ? void 0 : concurrentConnectionPusher.pusher;
39255
+ var channel = React.useRef();
39256
+ var channelName = React.useRef();
39257
+ var _useState = React.useState(false),
39258
+ openPopover = _useState[0],
39259
+ setOpenPopover = _useState[1];
39260
+ var anchorEl = React.useRef(null);
39261
+ var handleOpenPopover = function handleOpenPopover() {
39262
+ setOpenPopover(true);
39263
+ };
39264
+ var handleClosePopover = function handleClosePopover() {
39265
+ setOpenPopover(false);
39266
+ };
39267
+ var _useVirtualList = useVirtualList({}, getAnnouncementListApi),
39268
+ filter = _useVirtualList.filter,
39269
+ items = _useVirtualList.items,
39270
+ isLoading = _useVirtualList.isLoading,
39271
+ handleLoadMore = _useVirtualList.handleLoadMore,
39272
+ handleItemAdded = _useVirtualList.handleItemAdded,
39273
+ setItems = _useVirtualList.setItems,
39274
+ handleChangeFilter = _useVirtualList.handleChangeFilter,
39275
+ getItems = _useVirtualList.getItems;
39276
+ var handleNewAnnouncement = function handleNewAnnouncement(data) {
39277
+ try {
39278
+ var announcement = JSON.parse(data);
39279
+ openPopover && handleItemAdded(announcement);
39280
+ } catch (error) {
39281
+ console.log(error);
39282
+ }
39283
+ dispatch(setTotalUnreadMessages(totalUnreadMessages + 1));
39284
+ };
39285
+ var handleDeletedAnnouncement = function handleDeletedAnnouncement(_data) {
39286
+ openPopover && getItems();
39287
+ handleGetTotalUnread();
39288
+ };
39289
+ var handleUpdatedAnnouncement = function handleUpdatedAnnouncement(data) {
39290
+ try {
39291
+ var announcement = JSON.parse(data);
39292
+ openPopover && setItems(function (state) {
39293
+ return state.map(function (i) {
39294
+ if (i.id !== announcement.id) return i;
39295
+ return _extends({}, i, {
39296
+ data: _extends({}, i.data, {
39297
+ data: announcement.data.data
39298
+ })
39299
+ });
39300
+ });
39301
+ });
39302
+ } catch (error) {
39303
+ console.log(error);
39304
+ }
39305
+ };
39306
+ var handleMarkAsRead = function handleMarkAsRead() {
39307
+ try {
39308
+ var _temp2 = function _temp2() {
39309
+ dispatch(setLoading(false));
39310
+ };
39311
+ dispatch(setLoading(true));
39312
+ var _temp = _catch(function () {
39313
+ return Promise.resolve(markAsReadAnnouncementsApi()).then(function () {
39314
+ setItems(function (state) {
39315
+ return state.map(function (i) {
39316
+ return _extends({}, i, {
39317
+ isRead: true
39318
+ });
39319
+ });
39320
+ });
39321
+ dispatch(setTotalUnreadMessages(0));
39322
+ });
39323
+ }, function (error) {
39324
+ reactToastify.toast.error(getErrorMessage(t, error));
39325
+ });
39326
+ return Promise.resolve(_temp && _temp.then ? _temp.then(_temp2) : _temp2(_temp));
39327
+ } catch (e) {
39328
+ return Promise.reject(e);
39329
+ }
39330
+ };
39331
+ var handleMarkAsReadById = function handleMarkAsReadById(id, loading) {
39332
+ try {
39333
+ var _temp4 = function _temp4() {
39334
+ loading && dispatch(setLoading(false));
39335
+ };
39336
+ loading && dispatch(setLoading(true));
39337
+ var _temp3 = _catch(function () {
39338
+ return Promise.resolve(markAsReadAnnouncementByIdApi(id)).then(function () {
39339
+ setItems(function (state) {
39340
+ return state.map(function (i) {
39341
+ return _extends({}, i, {
39342
+ isRead: i.id === id ? true : i.isRead
39343
+ });
39344
+ });
39345
+ });
39346
+ dispatch(setTotalUnreadMessages(Math.max(0, totalUnreadMessages - 1)));
39347
+ });
39348
+ }, function (error) {
39349
+ reactToastify.toast.error(getErrorMessage(t, error));
39350
+ });
39351
+ return Promise.resolve(_temp3 && _temp3.then ? _temp3.then(_temp4) : _temp4(_temp3));
39352
+ } catch (e) {
39353
+ return Promise.reject(e);
39354
+ }
39355
+ };
39356
+ var handleCloseAndMarkRead = function handleCloseAndMarkRead(data) {
39357
+ handleClosePopover();
39358
+ if (!data.isRead) handleMarkAsReadById(data.id);
39359
+ };
39360
+ var renderNotiLink = function renderNotiLink(children, data) {
39361
+ return renderLink(children, data, function () {
39362
+ return handleCloseAndMarkRead(data);
39363
+ });
39364
+ };
39365
+ var cleanupPusher = function cleanupPusher() {
39366
+ channel.current && channel.current.unbind(AnnouncementEvent.ReceivedNewNote, handleNewAnnouncement);
39367
+ channel.current && channel.current.unbind(AnnouncementEvent.UpdatedNote, handleUpdatedAnnouncement);
39368
+ channel.current && channel.current.unbind(AnnouncementEvent.DeletedNote, handleDeletedAnnouncement);
39369
+ channelName.current && pusher && pusher.unsubscribe(channelName.current);
39370
+ };
39371
+ React.useEffect(function () {
39372
+ if (concurrentConnectionPusher !== null && concurrentConnectionPusher !== void 0 && concurrentConnectionPusher.academyDomain && academyDomain && user !== null && user !== void 0 && user.id) {
39373
+ var normalizedAcademyDomain = academyDomain.trim().toUpperCase();
39374
+ channelName.current = ANNOUNCEMENT_CHANNEL.replace("{academy}", normalizedAcademyDomain).replace("{userId}", user.id);
39375
+ channel.current = pusher.subscribe(channelName.current);
39376
+ channel.current.bind(AnnouncementEvent.ReceivedNewNote, handleNewAnnouncement);
39377
+ channel.current.bind(AnnouncementEvent.UpdatedNote, handleUpdatedAnnouncement);
39378
+ channel.current.bind(AnnouncementEvent.DeletedNote, handleDeletedAnnouncement);
39379
+ }
39380
+ return cleanupPusher;
39381
+ }, [academyDomain, user === null || user === void 0 ? void 0 : user.id, concurrentConnectionPusher === null || concurrentConnectionPusher === void 0 ? void 0 : concurrentConnectionPusher.academyDomain, totalUnreadMessages, openPopover, JSON.stringify(filter)]);
39382
+ var handleGetTotalUnread = function handleGetTotalUnread() {
39383
+ try {
39384
+ var _temp5 = _catch(function () {
39385
+ return Promise.resolve(getTotalNumberUnreadAnnouncementsApi()).then(function (res) {
39386
+ dispatch(setTotalUnreadMessages(res.data));
39387
+ });
39388
+ }, function (error) {
39389
+ console.log({
39390
+ error: error
39391
+ });
39392
+ });
39393
+ return Promise.resolve(_temp5 && _temp5.then ? _temp5.then(function () {}) : void 0);
39394
+ } catch (e) {
39395
+ return Promise.reject(e);
39396
+ }
39397
+ };
39398
+ React.useEffect(function () {
39399
+ if (academyDomain && user !== null && user !== void 0 && user.id) handleGetTotalUnread();
39400
+ }, [academyDomain, user === null || user === void 0 ? void 0 : user.id]);
39401
+ React.useEffect(function () {
39402
+ handleChangeFilter(openPopover ? DEFAULT_ANNOUNCEMENT_FILTER : {});
39403
+ }, [openPopover]);
39404
+ return React__default.createElement(material.Box, null, React__default.createElement(material.IconButton, {
39405
+ ref: anchorEl,
39406
+ className: "ms-2",
39407
+ onClick: handleOpenPopover
39408
+ }, React__default.createElement(material.Badge, {
39409
+ badgeContent: totalUnreadMessages,
39410
+ max: 9,
39411
+ color: "error"
39412
+ }, React__default.createElement(fa.FaBell, {
39413
+ size: 20,
39414
+ color: colors.blue[500]
39415
+ }))), React__default.createElement(material.Popover, {
39416
+ open: openPopover,
39417
+ anchorEl: anchorEl.current,
39418
+ onClose: handleClosePopover,
39419
+ anchorOrigin: {
39420
+ vertical: "bottom",
39421
+ horizontal: "right"
39422
+ },
39423
+ slotProps: {
39424
+ paper: {
39425
+ sx: {
39426
+ width: 360
39427
+ }
39428
+ }
39429
+ }
39430
+ }, React__default.createElement(material.Stack, {
39431
+ height: "100%",
39432
+ direction: "column"
39433
+ }, React__default.createElement(material.Stack, {
39434
+ direction: "row",
39435
+ justifyContent: "space-between",
39436
+ gap: 2,
39437
+ sx: {
39438
+ py: 2,
39439
+ px: 2.5
39440
+ }
39441
+ }, React__default.createElement(material.Box, {
39442
+ sx: {
39443
+ flexGrow: 1
39444
+ }
39445
+ }, React__default.createElement(material.Typography, {
39446
+ variant: "subtitle1"
39447
+ }, t("notifications")), totalUnreadMessages > 0 && React__default.createElement(material.Typography, {
39448
+ variant: "body2",
39449
+ sx: {
39450
+ color: "text.secondary"
39451
+ }
39452
+ }, t("you_have_n_unread_messages", {
39453
+ n: totalUnreadMessages
39454
+ })), renderViewNoteLink && React__default.createElement(material.Box, null, renderViewNoteLink(React__default.createElement(material.Typography, {
39455
+ sx: {
39456
+ fontWeight: 600,
39457
+ color: grey[600],
39458
+ fontSize: "14px",
39459
+ "&:hover": {
39460
+ textDecoration: "underline",
39461
+ color: green[700]
39462
+ }
39463
+ }
39464
+ }, t("view_notes")), handleClosePopover))), totalUnreadMessages > 0 && React__default.createElement(material.Stack, {
39465
+ direction: "column"
39466
+ }, React__default.createElement(material.Tooltip, {
39467
+ title: t("mark_as_read")
39468
+ }, React__default.createElement(material.IconButton, {
39469
+ color: "primary",
39470
+ onClick: handleMarkAsRead
39471
+ }, React__default.createElement(bs.BsCheckAll, null))))), React__default.createElement(material.Divider, {
39472
+ component: "div"
39473
+ }), React__default.createElement(material.Stack, {
39474
+ direction: "column",
39475
+ sx: {
39476
+ height: {
39477
+ xs: 280,
39478
+ sm: 400
39479
+ },
39480
+ py: 2
39481
+ }
39482
+ }, React__default.createElement(AnnouncementList, {
39483
+ role: role,
39484
+ items: items,
39485
+ isLoading: isLoading,
39486
+ onLoadMore: handleLoadMore,
39487
+ renderLink: renderNotiLink
39488
+ })))));
39489
+ };
39490
+
37971
39491
  var MenuItemCustom = material.styled(MenuItem)(function () {
37972
39492
  return {
37973
39493
  '&.Mui-selected': {
@@ -38694,17 +40214,19 @@ var Header = function Header(_ref) {
38694
40214
  role = _ref.role,
38695
40215
  history = _ref.history,
38696
40216
  link = _ref.link,
38697
- onSignOut = _ref.onSignOut;
40217
+ onSignOut = _ref.onSignOut,
40218
+ renderNotificationLink = _ref.renderNotificationLink,
40219
+ renderViewNoteLink = _ref.renderViewNoteLink;
38698
40220
  var Link = link;
38699
40221
  var _useTranslation = reactI18next.useTranslation(),
38700
40222
  t = _useTranslation.t;
38701
40223
  var theme = material.useTheme();
38702
- var param = window.location.pathname;
38703
40224
  var language = reactRedux.useSelector(function (state) {
38704
40225
  var _state$common;
38705
40226
  return state === null || state === void 0 ? void 0 : (_state$common = state.common) === null || _state$common === void 0 ? void 0 : _state$common.language;
38706
40227
  });
38707
- var isTeacherSide = param.includes('teacher');
40228
+ var isTeacherSide = role === exports.Role.Teacher;
40229
+ var isStudentSide = role === exports.Role.Student;
38708
40230
  var isLargerThanXL = material.useMediaQuery(theme.breakpoints.up("xl"));
38709
40231
  var academyDomain = reactRedux.useSelector(function (state) {
38710
40232
  var _state$common2, _state$common2$user;
@@ -38715,6 +40237,7 @@ var Header = function Header(_ref) {
38715
40237
  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
40238
  });
38717
40239
  var isAcademy = isLearningSpace || academyDomain;
40240
+ var showAnnouncement = !isStudentSide && isAcademy;
38718
40241
  var logo = React.useMemo(function () {
38719
40242
  if (isTeacherSide) {
38720
40243
  return language === exports.Language.en ? React__default.createElement(teacherFullLogoEn, null) : React__default.createElement(teacherFullLogoKo, null);
@@ -38808,7 +40331,11 @@ var Header = function Header(_ref) {
38808
40331
  }, React__default.createElement(singleLogo, null))), React__default.createElement(material.Stack, {
38809
40332
  className: "me-2",
38810
40333
  display: "none"
38811
- }, React__default.createElement(TheLanguageDropdown, null))));
40334
+ }, React__default.createElement(TheLanguageDropdown, null)), showAnnouncement && renderNotificationLink && React__default.createElement(AnnouncementContainer, {
40335
+ role: role,
40336
+ renderLink: renderNotificationLink,
40337
+ renderViewNoteLink: renderViewNoteLink
40338
+ })));
38812
40339
  };
38813
40340
  var HeaderLink = function HeaderLink(_ref3) {
38814
40341
  var data = _ref3.data,
@@ -38822,7 +40349,7 @@ var HeaderLink = function HeaderLink(_ref3) {
38822
40349
  return React__default.createElement(React.Fragment, null, render(data, isActive));
38823
40350
  };
38824
40351
 
38825
- var useLayoutContext = function useLayoutContext(role, pusherRegisterUrls, showLoadingAcademy, domain) {
40352
+ var useLayoutContext = function useLayoutContext(role, showLoadingAcademy, domain) {
38826
40353
  var _currentPusher$connec2;
38827
40354
  if (showLoadingAcademy === void 0) {
38828
40355
  showLoadingAcademy = true;
@@ -38836,13 +40363,9 @@ var useLayoutContext = function useLayoutContext(role, pusherRegisterUrls, showL
38836
40363
  var _state$common;
38837
40364
  return state === null || state === void 0 ? void 0 : (_state$common = state.common) === null || _state$common === void 0 ? void 0 : _state$common.user;
38838
40365
  });
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
40366
  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;
40367
+ var _state$common2;
40368
+ return state === null || state === void 0 ? void 0 : (_state$common2 = state.common) === null || _state$common2 === void 0 ? void 0 : _state$common2.concurrentConnectionPusher;
38846
40369
  });
38847
40370
  var currentPusher = concurrentConnectionPusher === null || concurrentConnectionPusher === void 0 ? void 0 : concurrentConnectionPusher.pusher;
38848
40371
  var roles = (user === null || user === void 0 ? void 0 : user.roles) || [];
@@ -38923,53 +40446,36 @@ var useLayoutContext = function useLayoutContext(role, pusherRegisterUrls, showL
38923
40446
  }
38924
40447
  };
38925
40448
  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
- }));
40449
+ var _currentPusher$connec;
40450
+ if ((!academyDomain || !(user !== null && user !== void 0 && user.id)) && role !== exports.Role.Student) return;
40451
+ if (academyDomain !== (concurrentConnectionPusher === null || concurrentConnectionPusher === void 0 ? void 0 : concurrentConnectionPusher.academyDomain) || !academyDomain && !(concurrentConnectionPusher !== null && concurrentConnectionPusher !== void 0 && concurrentConnectionPusher.academyDomain) && !concurrentConnectionPusher.isRegistered) {
40452
+ var _headers;
40453
+ if (currentPusher) {
40454
+ currentPusher.disconnect();
38969
40455
  }
38970
- isReadyRegisterPusher && dispatch(setReadyRegisterPusher(false));
40456
+ var token = getAccessToken();
40457
+ var pusher = new Pusher$1(PUSHER_CONFIG.key, {
40458
+ cluster: PUSHER_CONFIG.cluster,
40459
+ authEndpoint: (academyDomain ? BASE_URL : SUPER_ADMIN_BASE_URL) + "/api/auth/pusher",
40460
+ auth: {
40461
+ params: {},
40462
+ headers: (_headers = {
40463
+ Authorization: "Bearer " + token
40464
+ }, _headers[AcademyHeaders] = academyDomain, _headers)
40465
+ }
40466
+ });
40467
+ dispatch(setConcurrentConnectionPusher({
40468
+ pusher: pusher,
40469
+ academyDomain: academyDomain,
40470
+ isRegistered: true
40471
+ }));
40472
+ } else if ((currentPusher === null || currentPusher === void 0 ? void 0 : (_currentPusher$connec = currentPusher.connection) === null || _currentPusher$connec === void 0 ? void 0 : _currentPusher$connec.state) === "disconnected") {
40473
+ currentPusher.connect();
38971
40474
  }
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]);
40475
+ return function () {
40476
+ currentPusher === null || currentPusher === void 0 ? void 0 : currentPusher.disconnect();
40477
+ };
40478
+ }, [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
40479
  React.useEffect(function () {
38974
40480
  !(user !== null && user !== void 0 && user.id) && loadInfo();
38975
40481
  }, [user === null || user === void 0 ? void 0 : user.id]);
@@ -38995,14 +40501,12 @@ var useLayoutContext = function useLayoutContext(role, pusherRegisterUrls, showL
38995
40501
  var LayoutContext = function LayoutContext(_ref) {
38996
40502
  var children = _ref.children,
38997
40503
  role = _ref.role,
38998
- _ref$pusherRegisterUr = _ref.pusherRegisterUrls,
38999
- pusherRegisterUrls = _ref$pusherRegisterUr === void 0 ? [] : _ref$pusherRegisterUr,
39000
40504
  showLoadingAcademy = _ref.showLoadingAcademy;
39001
40505
  var user = reactRedux.useSelector(function (state) {
39002
40506
  var _state$common;
39003
40507
  return state === null || state === void 0 ? void 0 : (_state$common = state.common) === null || _state$common === void 0 ? void 0 : _state$common.user;
39004
40508
  });
39005
- useLayoutContext(role, pusherRegisterUrls, showLoadingAcademy);
40509
+ useLayoutContext(role, showLoadingAcademy);
39006
40510
  if (!(user !== null && user !== void 0 && user.email)) return React__default.createElement(LoadingComponent, {
39007
40511
  isLoading: true
39008
40512
  });else return React__default.createElement(React.Fragment, null, children);
@@ -39111,6 +40615,7 @@ exports.AcademyHeaders = AcademyHeaders;
39111
40615
  exports.AcademyList = AcademyList;
39112
40616
  exports.AcceptNoAcademy = AcceptNoAcademy;
39113
40617
  exports.ActionButtons = ActionButtons;
40618
+ exports.AnnouncementContainer = AnnouncementContainer;
39114
40619
  exports.AnswerCountSelector = AnswerCountSelector;
39115
40620
  exports.ArticleCategorySelector = ArticleCategorySelector;
39116
40621
  exports.ArticleDialog = ArticleDialog;
@@ -39168,6 +40673,8 @@ exports.MathTinyEditor = MathTinyEditor;
39168
40673
  exports.NewNoteButton = NewNoteButton;
39169
40674
  exports.NoAcademyHeaders = NoAcademyHeaders;
39170
40675
  exports.NotFound = NotFound;
40676
+ exports.NoteDrawer = NoteDrawer;
40677
+ exports.NoteTabs = NoteTabs;
39171
40678
  exports.NotesContainer = NotesContainer;
39172
40679
  exports.NotificationDetail = NotificationDetail;
39173
40680
  exports.NotificationList = NotificationList;
@@ -39248,7 +40755,7 @@ exports.setConcurrentConnectionPusher = setConcurrentConnectionPusher;
39248
40755
  exports.setLanguage = setLanguage;
39249
40756
  exports.setLoading = setLoading;
39250
40757
  exports.setReFetchUserAcademies = setReFetchUserAcademies;
39251
- exports.setReadyRegisterPusher = setReadyRegisterPusher;
40758
+ exports.setTotalUnreadMessages = setTotalUnreadMessages;
39252
40759
  exports.setUser = setUser;
39253
40760
  exports.store = store;
39254
40761
  exports.timAgo = timAgo;