touchstudy-core 0.1.34 → 0.1.35

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -139,7 +139,7 @@ function _objectWithoutPropertiesLoose(source, excluded) {
139
139
  return target;
140
140
  }
141
141
 
142
- var styles = {"btn-login-google":"_2HqmH","block-login":"_wWIyO","box-login":"_38Lo1","dropdown-menu":"_1krbH","header-avatar":"_RQaHE","dropdown-menu-flag":"_XK8oS","dropdown-content":"_3ys4W","dropdown-change":"_ToOW_","item-address":"_3sQlR","item-logout":"_3bqSM","title-address":"_1jgSI","img-avatar":"_35Ttz","item-contact":"_1wc7o","content-text":"_3S4f2","dropdown-content-language":"_3ajui","dropdown-item-language":"_3Y_y4","dropdown-item-language-active":"_CzNMi","dropdown-academy":"_3CMVp","image-academy":"_2ibYC","image-academy--item":"_3RDWF","academy-btn":"_1JMRU","switch-icon":"_N4FNf","dropdown-content-academy":"_31Dr0","dropdown-academy-item":"_3bjcz","noGutters":"_31ZQk","custom-col-2":"_3yXyK","custom-col-3":"_1RsJQ","custom-col-5":"_L42CP","custom-col-10":"_2u6eL","custom-row":"_8x7OP","custom-col":"_1JmTh","custom-col-4":"_3HO1e","custom-col-8":"_Oy31M","custom-col-12":"_3aUKo","custom-container":"_39LRs","form-label":"__Ut-u","form-control":"_2k4dX","btn-outline-primary":"_2PWdX","sort-icons":"_mQvLF","active":"_3oAH-","form-select":"_3W3aw","truncate":"_3NJzN","headers":"_3xnI5","logo-container":"_3YG70","tabBox":"_1CQPn","routerBox":"_3hx2T","tabText":"_3UyhW","router-link-active":"_1TGKA","router-link":"_1AqMh","userImg":"_2RI6G","disabled-link":"_3aVHg"};
142
+ var styles = {"btn-login-google":"_2HqmH","block-login":"_wWIyO","box-login":"_38Lo1","btn-primary":"_rd4Uy","dropdown-menu":"_1krbH","header-avatar":"_RQaHE","dropdown-menu-flag":"_XK8oS","dropdown-content":"_3ys4W","dropdown-change":"_ToOW_","item-address":"_3sQlR","item-logout":"_3bqSM","title-address":"_1jgSI","img-avatar":"_35Ttz","item-contact":"_1wc7o","content-text":"_3S4f2","dropdown-content-language":"_3ajui","dropdown-item-language":"_3Y_y4","dropdown-item-language-active":"_CzNMi","dropdown-academy":"_3CMVp","image-academy":"_2ibYC","image-academy--item":"_3RDWF","academy-btn":"_1JMRU","switch-icon":"_N4FNf","dropdown-content-academy":"_31Dr0","dropdown-academy-item":"_3bjcz","noGutters":"_31ZQk","custom-col-2":"_3yXyK","custom-col-3":"_1RsJQ","custom-col-5":"_L42CP","custom-col-10":"_2u6eL","custom-row":"_8x7OP","custom-col":"_1JmTh","custom-col-4":"_3HO1e","custom-col-8":"_Oy31M","custom-col-12":"_3aUKo","custom-container":"_39LRs","form-label":"__Ut-u","form-control":"_2k4dX","btn-outline-primary":"_2PWdX","sort-icons":"_mQvLF","active":"_3oAH-","form-select":"_3W3aw","truncate":"_3NJzN","headers":"_3xnI5","logo-container":"_3YG70","tabBox":"_1CQPn","routerBox":"_3hx2T","tabText":"_3UyhW","router-link-active":"_1TGKA","router-link":"_1AqMh","userImg":"_2RI6G","disabled-link":"_3aVHg"};
143
143
 
144
144
  var AuthenticationMessage;
145
145
  (function (AuthenticationMessage) {
@@ -881,6 +881,7 @@ var switchAcademy = function switchAcademy(academyId) {
881
881
  };
882
882
 
883
883
  var LayoutContext = function LayoutContext(_ref) {
884
+ var _currentPusher$connec, _currentPusher$connec3;
884
885
  var children = _ref.children,
885
886
  role = _ref.role,
886
887
  _ref$pusherRegisterUr = _ref.pusherRegisterUrls,
@@ -905,6 +906,7 @@ var LayoutContext = function LayoutContext(_ref) {
905
906
  var _state$common3;
906
907
  return state === null || state === void 0 ? void 0 : (_state$common3 = state.common) === null || _state$common3 === void 0 ? void 0 : _state$common3.concurrentConnectionPusher;
907
908
  });
909
+ var currentPusher = concurrentConnectionPusher === null || concurrentConnectionPusher === void 0 ? void 0 : concurrentConnectionPusher.pusher;
908
910
  var roles = (user === null || user === void 0 ? void 0 : user.roles) || [];
909
911
  var academyDomain = user === null || user === void 0 ? void 0 : user.academyDomain;
910
912
  var pathname = window.location.pathname;
@@ -971,31 +973,41 @@ var LayoutContext = function LayoutContext(_ref) {
971
973
  return Promise.reject(e);
972
974
  }
973
975
  };
976
+ console.log({
977
+ connection: currentPusher === null || currentPusher === void 0 ? void 0 : (_currentPusher$connec = currentPusher.connection) === null || _currentPusher$connec === void 0 ? void 0 : _currentPusher$connec.state,
978
+ pusherRegisterUrls: pusherRegisterUrls,
979
+ pathname: pathname
980
+ });
974
981
  var registerPusher = React.useCallback(function () {
975
- if (pusherRegisterUrls.includes(pathname.toLocaleLowerCase()) && academyDomain && academyDomain !== (concurrentConnectionPusher === null || concurrentConnectionPusher === void 0 ? void 0 : concurrentConnectionPusher.academyDomain) && isReadyRegisterPusher) {
976
- var _headers;
977
- if (concurrentConnectionPusher.pusher) {
978
- concurrentConnectionPusher.pusher.disconnect();
979
- }
980
- var token = getAccessToken();
981
- var pusher = new Pusher(PUSHER_CONFIG.key, {
982
- cluster: PUSHER_CONFIG.cluster,
983
- authEndpoint: BASE_URL + "/api/auth/pusher",
984
- auth: {
985
- params: {},
986
- headers: (_headers = {
987
- Authorization: "Bearer " + token
988
- }, _headers[AcademyHeaders] = academyDomain, _headers)
982
+ if (pusherRegisterUrls.includes(pathname.toLocaleLowerCase())) {
983
+ var _currentPusher$connec2;
984
+ if (academyDomain && academyDomain !== (concurrentConnectionPusher === null || concurrentConnectionPusher === void 0 ? void 0 : concurrentConnectionPusher.academyDomain) && isReadyRegisterPusher) {
985
+ var _headers;
986
+ if (currentPusher) {
987
+ currentPusher.disconnect();
989
988
  }
990
- });
991
- dispatch(setConcurrentConnectionPusher({
992
- pusher: pusher,
993
- academyDomain: academyDomain
994
- }));
989
+ var token = getAccessToken();
990
+ var pusher = new Pusher(PUSHER_CONFIG.key, {
991
+ cluster: PUSHER_CONFIG.cluster,
992
+ authEndpoint: BASE_URL + "/api/auth/pusher",
993
+ auth: {
994
+ params: {},
995
+ headers: (_headers = {
996
+ Authorization: "Bearer " + token
997
+ }, _headers[AcademyHeaders] = academyDomain, _headers)
998
+ }
999
+ });
1000
+ dispatch(setConcurrentConnectionPusher({
1001
+ pusher: pusher,
1002
+ academyDomain: academyDomain
1003
+ }));
1004
+ } else if ((currentPusher === null || currentPusher === void 0 ? void 0 : (_currentPusher$connec2 = currentPusher.connection) === null || _currentPusher$connec2 === void 0 ? void 0 : _currentPusher$connec2.state) === "disconnected") {
1005
+ currentPusher.connect();
1006
+ }
995
1007
  }
996
- if ((!pusherRegisterUrls.includes(pathname.toLocaleLowerCase()) || !isReadyRegisterPusher) && !!(concurrentConnectionPusher !== null && concurrentConnectionPusher !== void 0 && concurrentConnectionPusher.pusher)) {
997
- if (concurrentConnectionPusher.pusher) {
998
- concurrentConnectionPusher.pusher.disconnect();
1008
+ if (!pusherRegisterUrls.includes(pathname.toLocaleLowerCase()) && !!currentPusher) {
1009
+ if (currentPusher) {
1010
+ currentPusher.disconnect();
999
1011
  }
1000
1012
  dispatch(setConcurrentConnectionPusher({
1001
1013
  pusher: null,
@@ -1005,7 +1017,7 @@ var LayoutContext = function LayoutContext(_ref) {
1005
1017
  if (!pusherRegisterUrls.includes(pathname.toLocaleLowerCase()) && isReadyRegisterPusher) {
1006
1018
  dispatch(setReadyRegisterPusher(false));
1007
1019
  }
1008
- }, [pusherRegisterUrls.join(","), academyDomain, pathname, isReadyRegisterPusher]);
1020
+ }, [pusherRegisterUrls.join(","), academyDomain, pathname, isReadyRegisterPusher, currentPusher === null || currentPusher === void 0 ? void 0 : (_currentPusher$connec3 = currentPusher.connection) === null || _currentPusher$connec3 === void 0 ? void 0 : _currentPusher$connec3.state]);
1009
1021
  React.useEffect(function () {
1010
1022
  !user && loadInfo();
1011
1023
  !!user && checkRoleUser();
@@ -1016,8 +1028,8 @@ var LayoutContext = function LayoutContext(_ref) {
1016
1028
  React.useEffect(function () {
1017
1029
  registerPusher();
1018
1030
  return function () {
1019
- if (concurrentConnectionPusher.pusher) {
1020
- concurrentConnectionPusher.pusher.disconnect();
1031
+ if (currentPusher) {
1032
+ currentPusher.disconnect();
1021
1033
  }
1022
1034
  };
1023
1035
  }, [registerPusher]);
@@ -1305,6 +1317,7 @@ var recent_exam_results = "최근 시험 결과";
1305
1317
  var instructor_name = "강사이름";
1306
1318
  var academy_name = "학원 이름";
1307
1319
  var total_students = "총 학생수";
1320
+ var total_class = "반 수";
1308
1321
  var total_number_students = "총 학생수";
1309
1322
  var student = "학생";
1310
1323
  var students = "재학생";
@@ -1321,8 +1334,9 @@ var mins_mins_seconds_seconds = "{{mins}}분 {{seconds}}초";
1321
1334
  var mins_mins = "{{mins}}분";
1322
1335
  var class_name = "반 이름";
1323
1336
  var create_new_exam = "새 시험 생성";
1337
+ var live_exam = "시험 생성";
1324
1338
  var there_are_no_recent_exams = "최근 시험이 없습니다";
1325
- var you_have_created_a_exam_with_code_code_do_you_want_to_continue = "코드가 {{code}} 시험을 생성했습니다. 계속하시겠습니까?";
1339
+ var you_have_started_an_exam_with_code_code_do_you_want_to_continue = "{{code}} 코드로 시험을 시작했습니다. 계속하시겠습니까?";
1326
1340
  var here = "여기";
1327
1341
  var do_you_want_to_complete_the_exam = "시험을 완료처리 하시겠습니까?";
1328
1342
  var are_you_sure_you_want_to_delete_the_exam = "시험을 삭제하시겠습니까?";
@@ -1561,6 +1575,7 @@ var course = "진로";
1561
1575
  var etc = "그 외";
1562
1576
  var consultation_category = "상담 카테고리";
1563
1577
  var points = "{{number}} 점";
1578
+ var noun_number_of_people = "인원 수";
1564
1579
  var number_of_people = "{{ number }} 명";
1565
1580
  var total_classes = "반수";
1566
1581
  var number_of_classes = "{{ number }} 개";
@@ -1580,6 +1595,29 @@ var my_answers = "내 해답";
1580
1595
  var request_for_consultation = "상담요청";
1581
1596
  var ask_a_question_with_a_problem = "문제로 질문하기";
1582
1597
  var live = "살다";
1598
+ var user_email = "사용자 이메일";
1599
+ var user_academy = {
1600
+ add: "사용자 추가",
1601
+ update_user_roles: "사용자 역할 업데이트",
1602
+ add_failed: "아카데미에 사용자 추가 실패",
1603
+ add_successfully: "사용자를 아카데미에 추가했습니다",
1604
+ remove_failed: "아카데미에서 사용자를 제거하지 못했습니다",
1605
+ remove_successfully: "아카데미에서 사용자를 성공적으로 제거했습니다",
1606
+ update_user_roles_failed: "아카데미 사용자 역할 업데이트에 실패했습니다",
1607
+ update_user_roles__successfully: "아카데미 사용자 역할을 성공적으로 제거했습니다",
1608
+ get_failed: "아카데미 사용자 가져오기 실패"
1609
+ };
1610
+ var get_users_failed = "사용자 가져오기 실패";
1611
+ var status_of_each_class = "각 반별 현황";
1612
+ var attendance_rate = "출석률";
1613
+ var select_article_create_exam = "시험을 만들 기사를 선택하세요.";
1614
+ var comprehensive_analysis = "내 해답";
1615
+ var solution_order = "풀이 순서";
1616
+ var compare_solution = "풀이 비교";
1617
+ var problem_analysis = "문제 분석";
1618
+ var class_information = "수업정보";
1619
+ var teachers = "교사";
1620
+ var lessons = "수업";
1583
1621
  var lang_ko = {
1584
1622
  problem_solving: problem_solving,
1585
1623
  my_story: my_story,
@@ -1597,6 +1635,7 @@ var lang_ko = {
1597
1635
  instructor_name: instructor_name,
1598
1636
  academy_name: academy_name,
1599
1637
  total_students: total_students,
1638
+ total_class: total_class,
1600
1639
  total_number_students: total_number_students,
1601
1640
  student: student,
1602
1641
  students: students,
@@ -1615,8 +1654,9 @@ var lang_ko = {
1615
1654
  mins_mins: mins_mins,
1616
1655
  class_name: class_name,
1617
1656
  create_new_exam: create_new_exam,
1657
+ live_exam: live_exam,
1618
1658
  there_are_no_recent_exams: there_are_no_recent_exams,
1619
- you_have_created_a_exam_with_code_code_do_you_want_to_continue: you_have_created_a_exam_with_code_code_do_you_want_to_continue,
1659
+ you_have_started_an_exam_with_code_code_do_you_want_to_continue: you_have_started_an_exam_with_code_code_do_you_want_to_continue,
1620
1660
  here: here,
1621
1661
  do_you_want_to_complete_the_exam: do_you_want_to_complete_the_exam,
1622
1662
  are_you_sure_you_want_to_delete_the_exam: are_you_sure_you_want_to_delete_the_exam,
@@ -1852,6 +1892,7 @@ var lang_ko = {
1852
1892
  etc: etc,
1853
1893
  consultation_category: consultation_category,
1854
1894
  points: points,
1895
+ noun_number_of_people: noun_number_of_people,
1855
1896
  number_of_people: number_of_people,
1856
1897
  total_classes: total_classes,
1857
1898
  number_of_classes: number_of_classes,
@@ -1870,7 +1911,20 @@ var lang_ko = {
1870
1911
  my_answers: my_answers,
1871
1912
  request_for_consultation: request_for_consultation,
1872
1913
  ask_a_question_with_a_problem: ask_a_question_with_a_problem,
1873
- live: live
1914
+ live: live,
1915
+ user_email: user_email,
1916
+ user_academy: user_academy,
1917
+ get_users_failed: get_users_failed,
1918
+ status_of_each_class: status_of_each_class,
1919
+ attendance_rate: attendance_rate,
1920
+ select_article_create_exam: select_article_create_exam,
1921
+ comprehensive_analysis: comprehensive_analysis,
1922
+ solution_order: solution_order,
1923
+ compare_solution: compare_solution,
1924
+ problem_analysis: problem_analysis,
1925
+ class_information: class_information,
1926
+ teachers: teachers,
1927
+ lessons: lessons
1874
1928
  };
1875
1929
 
1876
1930
  var problem_solving$1 = "Problem Solving";
@@ -1889,6 +1943,7 @@ var recent_exam_results$1 = "Recent exam";
1889
1943
  var instructor_name$1 = "Instructor name";
1890
1944
  var academy_name$1 = "Academy name";
1891
1945
  var total_students$1 = "Total students";
1946
+ var total_class$1 = "Total Class";
1892
1947
  var total_number_students$1 = "Total number of students";
1893
1948
  var students$1 = "Students";
1894
1949
  var student$1 = "Student";
@@ -1905,8 +1960,9 @@ var mins_mins_seconds_seconds$1 = "{{mins}}m {{seconds}}s";
1905
1960
  var mins_mins$1 = "{{mins}}m";
1906
1961
  var class_name$1 = "Class name";
1907
1962
  var create_new_exam$1 = "Create exam";
1963
+ var live_exam$1 = "Live exam";
1908
1964
  var there_are_no_recent_exams$1 = "There are no recent exams";
1909
- var you_have_created_a_exam_with_code_code_do_you_want_to_continue$1 = "You have created a exam with code {{code}}, do you want to continue?";
1965
+ var you_have_started_an_exam_with_code_code_do_you_want_to_continue$1 = "You have started an exam with code {{code}}, do you want to continue?";
1910
1966
  var here$1 = "here";
1911
1967
  var do_you_want_to_complete_the_exam$1 = "Do you want to complete the exam?";
1912
1968
  var are_you_sure_you_want_to_delete_the_exam$1 = "Are you sure you want to delete the exam?";
@@ -2180,6 +2236,7 @@ var course$1 = "Course";
2180
2236
  var etc$1 = "Etc";
2181
2237
  var consultation_category$1 = "Consultation Category";
2182
2238
  var points$1 = "{{number}} points";
2239
+ var noun_number_of_people$1 = "Number of people";
2183
2240
  var number_of_people$1 = "{{ number }} students";
2184
2241
  var total_classes$1 = "Total classes";
2185
2242
  var number_of_classes$1 = "{{ number }} classes";
@@ -2199,6 +2256,29 @@ var my_answers$1 = "My answers";
2199
2256
  var request_for_consultation$1 = "Request for consultation";
2200
2257
  var ask_a_question_with_a_problem$1 = "Ask a question with a problem";
2201
2258
  var live$1 = "live";
2259
+ var user_email$1 = "User email";
2260
+ var user_academy$1 = {
2261
+ add: "Add user",
2262
+ update_user_roles: "Update user roles",
2263
+ add_failed: "Add user to academy failed",
2264
+ add_successfully: "Add user to academy successfully",
2265
+ remove_failed: "Remove user from academy failed",
2266
+ remove_successfully: "Remove user from academy successfully",
2267
+ update_user_roles_failed: "Update academy user roles failed",
2268
+ update_user_roles_successfully: "Update academy user roles successfully",
2269
+ get_failed: "Get academy users failed"
2270
+ };
2271
+ var get_users_failed$1 = "Get users failed";
2272
+ var status_of_each_class$1 = "Status of each class";
2273
+ var attendance_rate$1 = "Attendance Rate";
2274
+ var select_article_create_exam$1 = "Select article to create exam";
2275
+ var comprehensive_analysis$1 = "Comprehensive analysis";
2276
+ var solution_order$1 = "Solution order";
2277
+ var compare_solution$1 = "Compare solution";
2278
+ var problem_analysis$1 = "Problem analysis";
2279
+ var class_information$1 = "Class Information";
2280
+ var teachers$1 = "Teachers";
2281
+ var lessons$1 = "Lessons";
2202
2282
  var lang_en = {
2203
2283
  problem_solving: problem_solving$1,
2204
2284
  my_story: my_story$1,
@@ -2216,6 +2296,7 @@ var lang_en = {
2216
2296
  instructor_name: instructor_name$1,
2217
2297
  academy_name: academy_name$1,
2218
2298
  total_students: total_students$1,
2299
+ total_class: total_class$1,
2219
2300
  total_number_students: total_number_students$1,
2220
2301
  students: students$1,
2221
2302
  student: student$1,
@@ -2234,8 +2315,9 @@ var lang_en = {
2234
2315
  mins_mins: mins_mins$1,
2235
2316
  class_name: class_name$1,
2236
2317
  create_new_exam: create_new_exam$1,
2318
+ live_exam: live_exam$1,
2237
2319
  there_are_no_recent_exams: there_are_no_recent_exams$1,
2238
- you_have_created_a_exam_with_code_code_do_you_want_to_continue: you_have_created_a_exam_with_code_code_do_you_want_to_continue$1,
2320
+ you_have_started_an_exam_with_code_code_do_you_want_to_continue: you_have_started_an_exam_with_code_code_do_you_want_to_continue$1,
2239
2321
  here: here$1,
2240
2322
  do_you_want_to_complete_the_exam: do_you_want_to_complete_the_exam$1,
2241
2323
  are_you_sure_you_want_to_delete_the_exam: are_you_sure_you_want_to_delete_the_exam$1,
@@ -2506,6 +2588,7 @@ var lang_en = {
2506
2588
  etc: etc$1,
2507
2589
  consultation_category: consultation_category$1,
2508
2590
  points: points$1,
2591
+ noun_number_of_people: noun_number_of_people$1,
2509
2592
  number_of_people: number_of_people$1,
2510
2593
  total_classes: total_classes$1,
2511
2594
  number_of_classes: number_of_classes$1,
@@ -2524,7 +2607,20 @@ var lang_en = {
2524
2607
  my_answers: my_answers$1,
2525
2608
  request_for_consultation: request_for_consultation$1,
2526
2609
  ask_a_question_with_a_problem: ask_a_question_with_a_problem$1,
2527
- live: live$1
2610
+ live: live$1,
2611
+ user_email: user_email$1,
2612
+ user_academy: user_academy$1,
2613
+ get_users_failed: get_users_failed$1,
2614
+ status_of_each_class: status_of_each_class$1,
2615
+ attendance_rate: attendance_rate$1,
2616
+ select_article_create_exam: select_article_create_exam$1,
2617
+ comprehensive_analysis: comprehensive_analysis$1,
2618
+ solution_order: solution_order$1,
2619
+ compare_solution: compare_solution$1,
2620
+ problem_analysis: problem_analysis$1,
2621
+ class_information: class_information$1,
2622
+ teachers: teachers$1,
2623
+ lessons: lessons$1
2528
2624
  };
2529
2625
 
2530
2626
  i18n.use(reactI18next.initReactI18next).init({
@@ -3996,7 +4092,8 @@ var ChatHeader = function ChatHeader(_ref) {
3996
4092
  handleConfirm = _useDialog.handleConfirm;
3997
4093
  var _useTranslation = reactI18next.useTranslation(),
3998
4094
  t = _useTranslation.t;
3999
- var isTabletUp = material.useMediaQuery('(min-width:900px)');
4095
+ var theme = material.useTheme();
4096
+ var isTabletUp = material.useMediaQuery(theme.breakpoints.up('lg'));
4000
4097
  var isStudent = roles === null || roles === void 0 ? void 0 : roles.includes(Roles$1.Student);
4001
4098
  var filterDurationExam = React.useMemo(function () {
4002
4099
  if (!durationExam) return;
@@ -5220,6 +5317,7 @@ var ChapterBox = function ChapterBox(_ref) {
5220
5317
  onChangePageTo = _ref.onChangePageTo,
5221
5318
  onAddArticle = _ref.onAddArticle,
5222
5319
  onRemoveArticle = _ref.onRemoveArticle,
5320
+ handleCheckArticle = _ref.handleCheckArticle,
5223
5321
  onUpdateArticleQuestionCount = _ref.onUpdateArticleQuestionCount,
5224
5322
  onUpdateArticleCategory = _ref.onUpdateArticleCategory,
5225
5323
  onUpdateArticleQuestionAnswerCount = _ref.onUpdateArticleQuestionAnswerCount,
@@ -5441,6 +5539,7 @@ var ChapterBox = function ChapterBox(_ref) {
5441
5539
  onChangeName: onChangeName,
5442
5540
  onChangePageFrom: onChangePageFrom,
5443
5541
  onChangePageTo: onChangePageTo,
5542
+ handleCheckArticle: handleCheckArticle,
5444
5543
  onAddArticle: onAddArticle,
5445
5544
  onRemoveArticle: onRemoveArticle,
5446
5545
  onUpdateArticleQuestionCount: onUpdateArticleQuestionCount,
@@ -5451,7 +5550,24 @@ var ChapterBox = function ChapterBox(_ref) {
5451
5550
  });
5452
5551
  }), data.subChapters.length === 0 && data.articles.map(function (article) {
5453
5552
  var _article$category;
5454
- return React__default.createElement(ArticleGroupView, {
5553
+ return React__default.createElement(material.Stack, null, React__default.createElement(material.Stack, {
5554
+ display: "flex",
5555
+ flexDirection: "row",
5556
+ gap: "8px",
5557
+ alignItems: "center"
5558
+ }, React__default.createElement(material.Checkbox, {
5559
+ id: "textbook",
5560
+ sx: {
5561
+ display: "flex",
5562
+ justifyContent: "start",
5563
+ width: "fit-content"
5564
+ },
5565
+ onChange: function onChange(e) {
5566
+ return handleCheckArticle(e, article);
5567
+ }
5568
+ }), React__default.createElement("label", {
5569
+ htmlFor: "textbook"
5570
+ }, t("select_article_create_exam"))), React__default.createElement(ArticleGroupView, {
5455
5571
  key: article.id,
5456
5572
  categoryOptions: categoryOptions,
5457
5573
  article: article.articleNumber,
@@ -5468,7 +5584,7 @@ var ChapterBox = function ChapterBox(_ref) {
5468
5584
  onChangeScoreAnswer: handleUpdateArticleQuestionScore,
5469
5585
  onDelete: handleRemoveArticle,
5470
5586
  isDeletable: true
5471
- });
5587
+ }));
5472
5588
  }))));
5473
5589
  };
5474
5590
 
@@ -5528,6 +5644,25 @@ var TextbookSortBy;
5528
5644
  TextbookSortBy["Title"] = "Name";
5529
5645
  TextbookSortBy["SubjectName"] = "Subject.Name";
5530
5646
  })(TextbookSortBy || (TextbookSortBy = {}));
5647
+ var ExamType;
5648
+ (function (ExamType) {
5649
+ ExamType["Normal"] = "Normal";
5650
+ ExamType["Standard"] = "Standard";
5651
+ })(ExamType || (ExamType = {}));
5652
+ var ExamStatus$1;
5653
+ (function (ExamStatus) {
5654
+ ExamStatus["Default"] = "Default";
5655
+ ExamStatus["Pending"] = "Pending";
5656
+ ExamStatus["InProgress"] = "InProgress";
5657
+ ExamStatus["Completed"] = "Completed";
5658
+ })(ExamStatus$1 || (ExamStatus$1 = {}));
5659
+ var ExamStatusNumber;
5660
+ (function (ExamStatusNumber) {
5661
+ ExamStatusNumber[ExamStatusNumber["Default"] = 0] = "Default";
5662
+ ExamStatusNumber[ExamStatusNumber["Pending"] = 1] = "Pending";
5663
+ ExamStatusNumber[ExamStatusNumber["InProgress"] = 2] = "InProgress";
5664
+ ExamStatusNumber[ExamStatusNumber["Completed"] = 3] = "Completed";
5665
+ })(ExamStatusNumber || (ExamStatusNumber = {}));
5531
5666
 
5532
5667
  var TEXTBOOK_HEADERS = [{
5533
5668
  title: "#"
@@ -5545,6 +5680,19 @@ var TEXTBOOK_HEADERS = [{
5545
5680
  }, {
5546
5681
  title: "actions"
5547
5682
  }];
5683
+ var DEFAULT_ANSWER_COUNT = 5;
5684
+ var DEFAULT_EXAM_REQUEST = {
5685
+ questions: [{
5686
+ article: 1,
5687
+ correctAnswers: [1],
5688
+ numberOfAnswers: DEFAULT_ANSWER_COUNT,
5689
+ score: 2,
5690
+ questionOrder: 0
5691
+ }],
5692
+ title: "",
5693
+ duration: 10,
5694
+ subjectId: 0
5695
+ };
5548
5696
  var TEXTBOOK_PAGE_TITLE = "textbooks";
5549
5697
  var TEXT_BOOK_SEARCH_PLACEHOLDER = "enter_student_name_to_search";
5550
5698
  var TextbookDefaultQuery = {
@@ -5611,6 +5759,133 @@ var deleteArticleApi = function deleteArticleApi(articleId, role) {
5611
5759
  });
5612
5760
  };
5613
5761
 
5762
+ var EXAM_URL = BASE_URL + "/api/exam";
5763
+ var createExam = function createExam(data) {
5764
+ return api.post("" + EXAM_URL, data, {
5765
+ params: {
5766
+ roles: [exports.Role.Teacher]
5767
+ }
5768
+ });
5769
+ };
5770
+ var apiCreateExamSession = function apiCreateExamSession(examId) {
5771
+ return api.post(EXAM_URL + "/" + examId);
5772
+ };
5773
+
5774
+ var useExam = function useExam(props) {
5775
+ var callback = props.callback,
5776
+ navigate = props.navigate;
5777
+ var dispatch = reactRedux.useDispatch();
5778
+ var _useState = React.useState(false),
5779
+ isOpenDialog = _useState[0],
5780
+ setOpenDialog = _useState[1];
5781
+ var _useState2 = React.useState(DEFAULT_EXAM_REQUEST),
5782
+ examRequest = _useState2[0],
5783
+ setExamRequest = _useState2[1];
5784
+ var isTeacher = reactRedux.useSelector(function (state) {
5785
+ var _state$common, _state$common$user;
5786
+ 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.roles.includes(Roles.Teacher);
5787
+ });
5788
+ var _useTranslation = reactI18next.useTranslation(),
5789
+ t = _useTranslation.t;
5790
+ var handleChangeExamRequest = function handleChangeExamRequest(value) {
5791
+ setExamRequest(value);
5792
+ };
5793
+ var handleOpenCreateExamDialog = function handleOpenCreateExamDialog() {
5794
+ setOpenDialog(true);
5795
+ };
5796
+ var handleCloseDialog = function handleCloseDialog() {
5797
+ setExamRequest(DEFAULT_EXAM_REQUEST);
5798
+ setOpenDialog(false);
5799
+ callback === null || callback === void 0 ? void 0 : callback();
5800
+ };
5801
+ var validateExam = function validateExam(exam) {
5802
+ if (!exam.subjectId) return t("Please select an exam subject");
5803
+ if (!exam.title.trim().length) return t("Please enter exam title");
5804
+ if (!exam.questions.length) return t("Exam required at least one question");
5805
+ for (var i = 0; i < exam.questions.length; i++) {
5806
+ var question = exam.questions[i];
5807
+ if (!question.categoryId) return t("Please select category for article " + question.article);
5808
+ }
5809
+ return false;
5810
+ };
5811
+ var handleCreateExam = function handleCreateExam() {
5812
+ try {
5813
+ var _temp3 = function _temp3() {
5814
+ dispatch(setLoading(false));
5815
+ };
5816
+ if (!examRequest) return Promise.resolve();
5817
+ var errorMessage = validateExam(examRequest);
5818
+ if (errorMessage) {
5819
+ reactToastify.toast.error(errorMessage);
5820
+ return Promise.resolve();
5821
+ }
5822
+ dispatch(setLoading(true));
5823
+ var _temp2 = _catch(function () {
5824
+ return Promise.resolve(createExam(_extends({}, examRequest, {
5825
+ duration: minutesToTimeSpan(examRequest.duration || 0)
5826
+ }))).then(function (res) {
5827
+ var _temp = function (_res$data, _res$data$data) {
5828
+ if (!((_res$data = res.data) !== null && _res$data !== void 0 && (_res$data$data = _res$data.data) !== null && _res$data$data !== void 0 && _res$data$data.id)) {
5829
+ reactToastify.toast.error("Create exam failed");
5830
+ } else {
5831
+ var _res$data2, _res$data2$data;
5832
+ return Promise.resolve(apiCreateExamSession((_res$data2 = res.data) === null || _res$data2 === void 0 ? void 0 : (_res$data2$data = _res$data2.data) === null || _res$data2$data === void 0 ? void 0 : _res$data2$data.id)).then(function () {
5833
+ setExamRequest(DEFAULT_EXAM_REQUEST);
5834
+ reactToastify.toast.success("Create exam successfully");
5835
+ });
5836
+ }
5837
+ }();
5838
+ if (_temp && _temp.then) return _temp.then(function () {});
5839
+ });
5840
+ }, function (error) {
5841
+ var _error$response;
5842
+ reactToastify.toast.error((error === null || error === void 0 ? void 0 : (_error$response = error.response) === null || _error$response === void 0 ? void 0 : _error$response.data) || "Create exam failed");
5843
+ });
5844
+ return Promise.resolve(_temp2 && _temp2.then ? _temp2.then(_temp3) : _temp3(_temp2));
5845
+ } catch (e) {
5846
+ return Promise.reject(e);
5847
+ }
5848
+ };
5849
+ var handleSaveExam = function handleSaveExam() {
5850
+ try {
5851
+ var _temp5 = function _temp5() {
5852
+ dispatch(setLoading(false));
5853
+ };
5854
+ if (!examRequest) return Promise.resolve();
5855
+ var errorMessage = validateExam(examRequest);
5856
+ if (errorMessage) {
5857
+ reactToastify.toast.error(errorMessage);
5858
+ return Promise.resolve();
5859
+ }
5860
+ dispatch(setLoading(true));
5861
+ var _temp4 = _catch(function () {
5862
+ return Promise.resolve(createExam(_extends({}, examRequest, {
5863
+ duration: minutesToTimeSpan(examRequest.duration || 0)
5864
+ }))).then(function () {
5865
+ handleCloseDialog();
5866
+ reactToastify.toast.success("Save exam successfully");
5867
+ isTeacher ? navigate('/teacher/exam-list') : navigate('/exams');
5868
+ });
5869
+ }, function (error) {
5870
+ var _error$response2;
5871
+ reactToastify.toast.error((error === null || error === void 0 ? void 0 : (_error$response2 = error.response) === null || _error$response2 === void 0 ? void 0 : _error$response2.data) || "Save exam failed");
5872
+ });
5873
+ return Promise.resolve(_temp4 && _temp4.then ? _temp4.then(_temp5) : _temp5(_temp4));
5874
+ } catch (e) {
5875
+ return Promise.reject(e);
5876
+ }
5877
+ };
5878
+ return {
5879
+ isOpenDialog: isOpenDialog,
5880
+ examRequest: examRequest,
5881
+ handleChangeExamRequest: handleChangeExamRequest,
5882
+ handleOpenCreateExamDialog: handleOpenCreateExamDialog,
5883
+ handleSaveExam: handleSaveExam,
5884
+ handleCloseDialog: handleCloseDialog,
5885
+ handleCreateExam: handleCreateExam
5886
+ };
5887
+ };
5888
+
5614
5889
  var useTextbookDetail = function useTextbookDetail(props) {
5615
5890
  var role = props.role,
5616
5891
  isReadonlyParam = props.isReadonlyParam,
@@ -5634,18 +5909,31 @@ var useTextbookDetail = function useTextbookDetail(props) {
5634
5909
  var _useState5 = React.useState(),
5635
5910
  parentChapter = _useState5[0],
5636
5911
  setParentChapter = _useState5[1];
5637
- var _useState6 = React.useState(),
5638
- selectedChapter = _useState6[0],
5639
- setSelectedChapter = _useState6[1];
5912
+ var _useState6 = React.useState([]),
5913
+ articlesSelected = _useState6[0],
5914
+ setArticlesSelected = _useState6[1];
5640
5915
  var _useState7 = React.useState(),
5641
- selectedDeleteItem = _useState7[0],
5642
- setSelectedDeleteItem = _useState7[1];
5916
+ selectedChapter = _useState7[0],
5917
+ setSelectedChapter = _useState7[1];
5918
+ var _useState8 = React.useState(),
5919
+ selectedDeleteItem = _useState8[0],
5920
+ setSelectedDeleteItem = _useState8[1];
5643
5921
  var updateChapterRef = React.useRef();
5644
5922
  var updateArticleRef = React.useRef();
5645
- var _useState8 = React.useState(false),
5646
- isEditedTitle = _useState8[0],
5647
- setEditedTitle = _useState8[1];
5923
+ var _useState9 = React.useState(false),
5924
+ isEditedTitle = _useState9[0],
5925
+ setEditedTitle = _useState9[1];
5648
5926
  var textbookUrl = role === exports.Role.Teacher ? TEXTBOOK_URL$1 : ADMIN_TEXTBOOK_URL;
5927
+ var _useExam = useExam({
5928
+ navigate: navigate
5929
+ }),
5930
+ isOpenDialog = _useExam.isOpenDialog,
5931
+ examRequest = _useExam.examRequest,
5932
+ handleChangeExamRequest = _useExam.handleChangeExamRequest,
5933
+ handleOpenCreateExamDialog = _useExam.handleOpenCreateExamDialog,
5934
+ handleSaveExam = _useExam.handleSaveExam,
5935
+ handleCloseDialog = _useExam.handleCloseDialog,
5936
+ handleCreateExam = _useExam.handleCreateExam;
5649
5937
  var handleOpenAddArticleDialog = function handleOpenAddArticleDialog(chapter) {
5650
5938
  setSelectedChapter(chapter);
5651
5939
  };
@@ -5896,7 +6184,6 @@ var useTextbookDetail = function useTextbookDetail(props) {
5896
6184
  }
5897
6185
  };
5898
6186
  return Promise.resolve(handleCreateArticle(newArticle, function (article) {
5899
- console.log("created article: ", article);
5900
6187
  handleUpdateChapterValue([].concat(articles, [article]), "articles", selectedChapter.id, selectedChapter.parentChapterId);
5901
6188
  setSelectedChapter(undefined);
5902
6189
  })).then(function () {});
@@ -5986,12 +6273,14 @@ var useTextbookDetail = function useTextbookDetail(props) {
5986
6273
  };
5987
6274
  });
5988
6275
  newArticle = _extends({}, thisArticles, {
6276
+ chapterId: chapterId,
5989
6277
  questions: [].concat(thisQuestions, additionalQuestionArticles)
5990
6278
  });
5991
6279
  newArticles = [].concat(articles.slice(0, articleNumber - 1), [newArticle], articles.slice(articleNumber));
5992
6280
  }
5993
6281
  if (questionCount < thisQuestions.length) {
5994
6282
  newArticle = _extends({}, thisArticles, {
6283
+ chapterId: chapterId,
5995
6284
  questions: [].concat(thisQuestions.slice(0, questionCount))
5996
6285
  });
5997
6286
  newArticles = [].concat(articles.slice(0, articleNumber - 1), [newArticle], articles.slice(articleNumber));
@@ -6003,6 +6292,7 @@ var useTextbookDetail = function useTextbookDetail(props) {
6003
6292
  };
6004
6293
  var handleUpdateArticleCategory = function handleUpdateArticleCategory(articleNumber, categoryId, articles, chapterId, parentChapterId) {
6005
6294
  var newArticle = _extends({}, articles[articleNumber - 1], {
6295
+ chapterId: chapterId,
6006
6296
  category: {
6007
6297
  id: categoryId
6008
6298
  }
@@ -6019,6 +6309,7 @@ var useTextbookDetail = function useTextbookDetail(props) {
6019
6309
  if (newAnswerCount > answerCount) {
6020
6310
  newArticle = _extends({}, articles[articleNumber - 1], {
6021
6311
  answerCount: newAnswerCount,
6312
+ chapterId: chapterId,
6022
6313
  questions: articles[articleNumber - 1].questions.map(function (i) {
6023
6314
  return _extends({}, i, {
6024
6315
  numberOfAnswers: newAnswerCount
@@ -6028,6 +6319,7 @@ var useTextbookDetail = function useTextbookDetail(props) {
6028
6319
  } else if (newAnswerCount < answerCount) {
6029
6320
  newArticle = _extends({}, articles[articleNumber - 1], {
6030
6321
  answerCount: newAnswerCount,
6322
+ chapterId: chapterId,
6031
6323
  questions: articles[articleNumber - 1].questions.map(function (i) {
6032
6324
  return _extends({}, i, {
6033
6325
  numberOfAnswers: newAnswerCount,
@@ -6047,6 +6339,7 @@ var useTextbookDetail = function useTextbookDetail(props) {
6047
6339
  var _extends4;
6048
6340
  var thisQuestions = articles[articleNumber - 1].questions;
6049
6341
  var newArticle = _extends({}, articles[articleNumber - 1], {
6342
+ chapterId: chapterId,
6050
6343
  questions: [].concat(thisQuestions.slice(0, index), [_extends({}, thisQuestions[index], (_extends4 = {}, _extends4[key] = value, _extends4))], thisQuestions.slice(index + 1))
6051
6344
  });
6052
6345
  var newArticles = [].concat(articles.slice(0, articleNumber - 1), [newArticle], articles.slice(articleNumber));
@@ -6207,6 +6500,19 @@ var useTextbookDetail = function useTextbookDetail(props) {
6207
6500
  replace: true
6208
6501
  });
6209
6502
  };
6503
+ var handleCheckArticle = function handleCheckArticle(e, article) {
6504
+ var checked = e.target.checked;
6505
+ if (!(article !== null && article !== void 0 && article.id)) return;
6506
+ if (!checked) {
6507
+ var _newArticles = articlesSelected.filter(function (item) {
6508
+ return item !== article.id;
6509
+ });
6510
+ setArticlesSelected(_newArticles);
6511
+ return;
6512
+ }
6513
+ var newArticles = [].concat(articlesSelected, [article.id]);
6514
+ setArticlesSelected(newArticles);
6515
+ };
6210
6516
  React.useEffect(function () {
6211
6517
  var getTextbookDetail = function getTextbookDetail() {
6212
6518
  try {
@@ -6231,6 +6537,53 @@ var useTextbookDetail = function useTextbookDetail(props) {
6231
6537
  };
6232
6538
  if (id) getTextbookDetail();
6233
6539
  }, [dispatch, id]);
6540
+ var handleChangeExamRequestBeforeOpenDialog = function handleChangeExamRequestBeforeOpenDialog() {
6541
+ var _textbookSubject$valu;
6542
+ handleOpenCreateExamDialog();
6543
+ var articles = textbook.chapters.map(function (chapter) {
6544
+ var isSubChapters = !!chapter.subChapters.length;
6545
+ if (isSubChapters) {
6546
+ var _articles = chapter.subChapters.map(function (chapter) {
6547
+ return chapter.articles;
6548
+ });
6549
+ return _articles.filter(Boolean).flat();
6550
+ }
6551
+ return chapter.articles;
6552
+ });
6553
+ var articlesAfterFlat = articles.flat();
6554
+ var questionCount = 0;
6555
+ var articleCount = 1;
6556
+ var questions = articlesAfterFlat.map(function (article) {
6557
+ if (articlesSelected.findIndex(function (item) {
6558
+ return item === article.id;
6559
+ }) !== -1) {
6560
+ var _questions = article.questions.map(function (question) {
6561
+ var _article$category3;
6562
+ var newQuestion = {
6563
+ article: articleCount,
6564
+ id: question === null || question === void 0 ? void 0 : question.id,
6565
+ correctAnswers: question.correctAnswers,
6566
+ numberOfAnswers: question.numberOfAnswers,
6567
+ score: question.score,
6568
+ questionOrder: questionCount,
6569
+ categoryId: (_article$category3 = article.category) === null || _article$category3 === void 0 ? void 0 : _article$category3.id
6570
+ };
6571
+ questionCount++;
6572
+ return newQuestion;
6573
+ });
6574
+ articleCount++;
6575
+ return _questions;
6576
+ }
6577
+ return [];
6578
+ });
6579
+ var exam = {
6580
+ title: "",
6581
+ duration: 10,
6582
+ subjectId: (_textbookSubject$valu = textbookSubject === null || textbookSubject === void 0 ? void 0 : textbookSubject.value) != null ? _textbookSubject$valu : 0,
6583
+ questions: questions.flat().filter(Boolean)
6584
+ };
6585
+ handleChangeExamRequest(exam);
6586
+ };
6234
6587
  React.useEffect(function () {
6235
6588
  document.title = t("textbooks") + " | " + t(id ? "textbook_detail" : "create_textbook");
6236
6589
  }, [id, t]);
@@ -6250,6 +6603,15 @@ var useTextbookDetail = function useTextbookDetail(props) {
6250
6603
  selectedDeleteItem: selectedDeleteItem,
6251
6604
  isEditedTitle: isEditedTitle,
6252
6605
  isReadonlyParam: isReadonlyParam,
6606
+ articlesSelected: articlesSelected,
6607
+ isOpenDialog: isOpenDialog,
6608
+ examRequest: examRequest,
6609
+ handleChangeExamRequest: handleChangeExamRequest,
6610
+ handleCheckArticle: handleCheckArticle,
6611
+ handleOpenCreateExamDialog: handleChangeExamRequestBeforeOpenDialog,
6612
+ handleSaveExam: handleSaveExam,
6613
+ handleCloseDialog: handleCloseDialog,
6614
+ handleCreateExam: handleCreateExam,
6253
6615
  handleChangeTextbookTitle: handleChangeTextbookTitle,
6254
6616
  handleCreateOrUpdateTextbook: handleCreateOrUpdateTextbook,
6255
6617
  handleChangeTextbookSubject: handleChangeTextbookSubject,
@@ -6707,1036 +7069,1115 @@ var SubjectSelector = function SubjectSelector(_ref) {
6707
7069
  }));
6708
7070
  };
6709
7071
 
6710
- var TextbookViewDetail = function TextbookViewDetail(props) {
6711
- var _textbook$chapters;
6712
- var _useTextbookDetail = useTextbookDetail(props),
6713
- id = _useTextbookDetail.id,
6714
- t = _useTextbookDetail.t,
6715
- textbook = _useTextbookDetail.textbook,
6716
- textbookSubject = _useTextbookDetail.textbookSubject,
6717
- isReadonly = _useTextbookDetail.isReadonly,
6718
- isNotFound = _useTextbookDetail.isNotFound,
6719
- parentChapter = _useTextbookDetail.parentChapter,
6720
- textbookId = _useTextbookDetail.textbookId,
6721
- selectedChapter = _useTextbookDetail.selectedChapter,
6722
- selectedDeleteItem = _useTextbookDetail.selectedDeleteItem,
6723
- isEditedTitle = _useTextbookDetail.isEditedTitle,
6724
- handleChangeTextbookTitle = _useTextbookDetail.handleChangeTextbookTitle,
6725
- handleChangeTextbookSubject = _useTextbookDetail.handleChangeTextbookSubject,
6726
- handleGoToTextbookList = _useTextbookDetail.handleGoToTextbookList,
6727
- handleCreateOrUpdateTextbook = _useTextbookDetail.handleCreateOrUpdateTextbook,
6728
- handleCloseChapterNameDialog = _useTextbookDetail.handleCloseChapterNameDialog,
6729
- handleCreateChapter = _useTextbookDetail.handleCreateChapter,
6730
- handleAddChapterToTextbook = _useTextbookDetail.handleAddChapterToTextbook,
6731
- handleAddChapterToParentSubchapter = _useTextbookDetail.handleAddChapterToParentSubchapter,
6732
- handleChangeChapterName = _useTextbookDetail.handleChangeChapterName,
6733
- handleChangeChapterPageFrom = _useTextbookDetail.handleChangeChapterPageFrom,
6734
- handleChangeChapterPageTo = _useTextbookDetail.handleChangeChapterPageTo,
6735
- handleAddArticleToChapter = _useTextbookDetail.handleAddArticleToChapter,
6736
- handleUpdateArticleQuestionCountFromChapter = _useTextbookDetail.handleUpdateArticleQuestionCountFromChapter,
6737
- handleUpdateArticleCategory = _useTextbookDetail.handleUpdateArticleCategory,
6738
- handleUpdateArticleAnswerCount = _useTextbookDetail.handleUpdateArticleAnswerCount,
6739
- handleUpdateArticleQuestion = _useTextbookDetail.handleUpdateArticleQuestion,
6740
- handleCloseArticleDialog = _useTextbookDetail.handleCloseArticleDialog,
6741
- handleOpenAddArticleDialog = _useTextbookDetail.handleOpenAddArticleDialog,
6742
- handleOpenRemoveArticleConfirmDialog = _useTextbookDetail.handleOpenRemoveArticleConfirmDialog,
6743
- handleCloseConfirmDeleteDialog = _useTextbookDetail.handleCloseConfirmDeleteDialog,
6744
- handleRemoveSelectedItem = _useTextbookDetail.handleRemoveSelectedItem,
6745
- handleOpenRemoveChapterConfirmDialog = _useTextbookDetail.handleOpenRemoveChapterConfirmDialog;
6746
- var _useCategorySelect = useCategorySelect({
6747
- subjectId: id ? textbookSubject === null || textbookSubject === void 0 ? void 0 : textbookSubject.value : undefined
6748
- }),
6749
- categoryOptions = _useCategorySelect.categoryOptions;
6750
- if (isNotFound) return React__default.createElement(NotFound, null);
6751
- return React__default.createElement(material.Container, {
6752
- maxWidth: "xl",
6753
- className: "bg-white py-5 p-4 rounded-4 h-100 d-flex flex-column"
6754
- }, React__default.createElement(material.Stack, {
6755
- direction: "row",
6756
- alignItems: "center",
6757
- justifyContent: "space-between",
6758
- mb: 2
6759
- }, React__default.createElement(material.Typography, {
6760
- variant: "h3"
6761
- }, t(id ? isReadonly ? "view_textbook" : "update_textbook" : "create_textbook"))), React__default.createElement(material.Grid, {
6762
- container: true,
6763
- spacing: 3
6764
- }, React__default.createElement(material.Grid, {
6765
- item: true,
6766
- xs: 4,
6767
- className: "d-flex align-items-center"
6768
- }, React__default.createElement(material.Table, null, React__default.createElement(material.TableBody, null, React__default.createElement(material.TableRow, {
6769
- sx: {
6770
- "& td": {
6771
- border: 0
6772
- }
6773
- }
6774
- }, React__default.createElement(material.TableCell, {
6775
- className: "p-2 pe-0",
6776
- sx: {
6777
- width: "15%"
6778
- }
6779
- }, React__default.createElement(material.InputLabel, null, React__default.createElement("span", {
6780
- className: "fw-bold"
6781
- }, t("name")), React__default.createElement("span", {
6782
- className: "text-danger"
6783
- }, "*"))), React__default.createElement(material.TableCell, {
6784
- sx: {
6785
- width: 0,
6786
- px: 1
6787
- }
6788
- }, ":"), React__default.createElement(material.TableCell, {
6789
- className: "p-2"
6790
- }, React__default.createElement(InputText, {
6791
- className: "w-100",
6792
- value: textbook === null || textbook === void 0 ? void 0 : textbook.name,
6793
- placeholder: t("enter_textbook_title"),
6794
- onChange: handleChangeTextbookTitle,
6795
- disabled: isReadonly
6796
- }))), React__default.createElement(material.TableRow, {
6797
- sx: {
6798
- "& td": {
6799
- border: 0
6800
- }
6801
- }
6802
- }, React__default.createElement(material.TableCell, {
6803
- className: "p-2 pe-0"
6804
- }, React__default.createElement(material.InputLabel, null, React__default.createElement("span", {
6805
- className: "fw-bold"
6806
- }, t("subject")), React__default.createElement("span", {
6807
- className: "text-danger"
6808
- }, "*"))), React__default.createElement(material.TableCell, {
6809
- sx: {
6810
- width: 0,
6811
- px: 1
6812
- }
6813
- }, ":"), React__default.createElement(material.TableCell, {
6814
- className: "p-2"
6815
- }, React__default.createElement(SubjectSelector, {
6816
- value: textbookSubject,
6817
- onChange: handleChangeTextbookSubject,
6818
- isDisabled: isReadonly || !!id
6819
- })))))), React__default.createElement(material.Grid, {
6820
- item: true,
6821
- xs: 8,
6822
- className: "d-flex justify-content-end"
6823
- }, React__default.createElement("div", null, React__default.createElement(TextbookActionButtons, {
6824
- isReadonly: isReadonly,
6825
- textbook: textbook,
6826
- onBack: handleGoToTextbookList,
6827
- onSave: handleCreateOrUpdateTextbook,
6828
- hideSave: !isEditedTitle && !!id && !isReadonly || textbook.isCreatedByAdmin
6829
- }))), React__default.createElement(material.Grid, {
6830
- item: true,
6831
- xs: 12,
6832
- className: "d-flex justify-content-end"
6833
- }, !!id && React__default.createElement(material.Button, {
6834
- className: "mx-1",
6835
- variant: "contained",
6836
- color: "primary",
6837
- startIcon: React__default.createElement(fa.FaPlus, {
6838
- size: 12
6839
- }),
6840
- onClick: handleAddChapterToTextbook,
6841
- disabled: isReadonly
6842
- }, t("add_chapter"))), React__default.createElement(material.Grid, {
6843
- item: true,
6844
- xs: 12
6845
- }, React__default.createElement(material.Stack, {
6846
- spacing: 3
6847
- }, !!(textbook !== null && textbook !== void 0 && textbook.subject) && (textbook === null || textbook === void 0 ? void 0 : (_textbook$chapters = textbook.chapters) === null || _textbook$chapters === void 0 ? void 0 : _textbook$chapters.map(function (chapter) {
6848
- return React__default.createElement(ChapterBox, {
6849
- key: chapter.id,
6850
- subject: textbook.subject,
6851
- data: chapter,
6852
- categoryOptions: categoryOptions || [],
6853
- onClickAddSubchapter: handleAddChapterToParentSubchapter,
6854
- onChangeName: handleChangeChapterName,
6855
- onChangePageFrom: handleChangeChapterPageFrom,
6856
- onChangePageTo: handleChangeChapterPageTo,
6857
- onAddArticle: handleOpenAddArticleDialog,
6858
- onRemoveArticle: handleOpenRemoveArticleConfirmDialog,
6859
- onUpdateArticleQuestionCount: handleUpdateArticleQuestionCountFromChapter,
6860
- onUpdateArticleCategory: handleUpdateArticleCategory,
6861
- onUpdateArticleQuestionAnswerCount: handleUpdateArticleAnswerCount,
6862
- onUpdateArticleQuestion: handleUpdateArticleQuestion,
6863
- onRemoveChapter: handleOpenRemoveChapterConfirmDialog,
6864
- isReadonly: isReadonly
6865
- });
6866
- }))))), React__default.createElement(ChapterNameDialog, {
6867
- open: !!(parentChapter !== null && parentChapter !== void 0 && parentChapter.id) || !!textbookId,
6868
- chapter: parentChapter,
6869
- onClose: handleCloseChapterNameDialog,
6870
- onSubmitForm: handleCreateChapter
6871
- }), React__default.createElement(ArticleDialog, {
6872
- open: !!selectedChapter,
6873
- chapter: selectedChapter,
6874
- categoryOptions: categoryOptions || [],
6875
- onClose: handleCloseArticleDialog,
6876
- onSubmitForm: handleAddArticleToChapter
6877
- }), selectedDeleteItem && React__default.createElement(ConfirmDialog, {
6878
- open: true,
6879
- toggle: handleCloseConfirmDeleteDialog,
6880
- text: selectedDeleteItem.confirmText,
6881
- confirmText: selectedDeleteItem.name,
6882
- onConfirm: handleRemoveSelectedItem,
6883
- isDelete: true
6884
- }));
6885
- };
6886
-
6887
- var useAutoAcademyDomain = function useAutoAcademyDomain(logout, history, superUrls, homeUrl, homeAcademyUrl) {
6888
- var searchParams = new URLSearchParams(window.location.search);
6889
- var user = reactRedux.useSelector(function (state) {
6890
- var _state$common;
6891
- return state === null || state === void 0 ? void 0 : (_state$common = state.common) === null || _state$common === void 0 ? void 0 : _state$common.user;
6892
- });
6893
- var initialAcademySearchParam = function initialAcademySearchParam() {
6894
- var paramAcademyDomain = searchParams.get("domain");
6895
- var domain = getAcademyDomain();
6896
- var pathname = window.location.pathname.toLowerCase();
6897
- if (!user) return;
6898
- var academyDomain = user.academyDomain;
6899
- if (!academyDomain) {
6900
- if (!superUrls.some(function (i) {
6901
- return pathname.startsWith(i);
6902
- })) {
6903
- pushTo({
6904
- pathname: homeUrl,
6905
- search: ""
6906
- });
6907
- }
6908
- if (domain) {
6909
- searchParams.append("domain", domain);
6910
- pushTo({
6911
- pathname: homeUrl,
6912
- search: ""
6913
- });
6914
- }
6915
- } else {
6916
- if (superUrls.some(function (i) {
6917
- return pathname.startsWith(i);
6918
- })) {
6919
- pushTo({
6920
- pathname: homeAcademyUrl,
6921
- search: ""
6922
- });
6923
- }
6924
- if (paramAcademyDomain && academyDomain.trim().toLocaleLowerCase() != (paramAcademyDomain === null || paramAcademyDomain === void 0 ? void 0 : paramAcademyDomain.trim().toLocaleLowerCase())) {
6925
- logout();
6926
- }
6927
- if (!paramAcademyDomain && academyDomain) {
6928
- searchParams.append("domain", academyDomain);
6929
- pushTo(_extends({}, window.location, {
6930
- search: searchParams.toString()
6931
- }));
6932
- }
7072
+ var styles$3 = {"drawer":"_11aYm","open":"_3Ydwm","drawer-overlay":"_3SQDf","drawer-header":"_2BwOx","drawer-form":"_2Zo7R","dropdown-content-academy":"_1lzjD","dropdown-change":"_1y7K9","dropdown-academy-item":"_1Y-55","dropdown-content-language":"_1fBXY","dropdown-item-language":"_3Szun","dropdown-item-language-active":"_2HhLb","item-address":"_3WYHC","item-logout":"_2-9ix","title-address":"_1r4pn","image-academy":"_2ZozT"};
7073
+
7074
+ var DURATION_OPTIONS = Array.from({
7075
+ length: 120
7076
+ }, function (_, i) {
7077
+ return i + 1;
7078
+ });
7079
+ var DEFAULT_ANSWER_COUNT$1 = 5;
7080
+
7081
+ var useExamDetailView = function useExamDetailView(props) {
7082
+ var exam = props.exam,
7083
+ selectedSubject = props.selectedSubject,
7084
+ onChangeExam = props.onChangeExam;
7085
+ var _useTranslation = reactI18next.useTranslation(),
7086
+ t = _useTranslation.t;
7087
+ var handleChangeQuestionCount = function handleChangeQuestionCount(article, questionCount, answerCount) {
7088
+ if (!exam) return;
7089
+ var examQuestions = exam.questions;
7090
+ var questions = examQuestions.filter(function (i) {
7091
+ return i.article === +article;
7092
+ });
7093
+ var prevQuestions = examQuestions.filter(function (i) {
7094
+ return i.article < +article;
7095
+ });
7096
+ var nextQuestions = examQuestions.filter(function (i) {
7097
+ return i.article > +article;
7098
+ });
7099
+ var lastOrder = questions[questions.length - 1].questionOrder;
7100
+ if (questions.length === questionCount) return;
7101
+ if (questions.length < questionCount) {
7102
+ var additionalQuestions = Array.from({
7103
+ length: questionCount - questions.length
7104
+ }).map(function (_, index) {
7105
+ var _questions$;
7106
+ return {
7107
+ article: +article,
7108
+ correctAnswers: [1],
7109
+ numberOfAnswers: answerCount,
7110
+ categoryId: (_questions$ = questions[0]) === null || _questions$ === void 0 ? void 0 : _questions$.categoryId,
7111
+ score: DEFAULT_SCORE,
7112
+ questionOrder: lastOrder + index + 1
7113
+ };
7114
+ });
7115
+ var newQuestions = [].concat(prevQuestions, questions, additionalQuestions, nextQuestions.map(function (i) {
7116
+ return _extends({}, i, {
7117
+ questionOrder: i.questionOrder + questionCount - questions.length
7118
+ });
7119
+ }));
7120
+ onChangeExam(_extends({}, exam, {
7121
+ questions: [].concat(newQuestions)
7122
+ }));
7123
+ } else {
7124
+ var remainQuestions = questions.slice(0, questionCount);
7125
+ var _newQuestions = [].concat(prevQuestions, remainQuestions, nextQuestions.map(function (i) {
7126
+ return _extends({}, i, {
7127
+ questionOrder: i.questionOrder - questions.length + questionCount
7128
+ });
7129
+ }));
7130
+ onChangeExam(_extends({}, exam, {
7131
+ questions: [].concat(_newQuestions)
7132
+ }));
6933
7133
  }
6934
7134
  };
6935
- var pushTo = function pushTo(data) {
6936
- if (history.push) history.push(data);else history(data);
6937
- };
6938
- React.useEffect(function () {
6939
- initialAcademySearchParam();
6940
- }, [window.location.pathname, user === null || user === void 0 ? void 0 : user.academyDomain]);
6941
- };
6942
-
6943
- var useList = function useList(fetchData, defaultQuery) {
6944
- var dispatch = reactRedux.useDispatch();
6945
- var _useState = React.useState(defaultQuery),
6946
- filter = _useState[0],
6947
- setFilter = _useState[1];
6948
- var _useState2 = React.useState(0),
6949
- totalPages = _useState2[0],
6950
- setTotalPages = _useState2[1];
6951
- var _useState3 = React.useState([]),
6952
- data = _useState3[0],
6953
- setData = _useState3[1];
6954
- var _useState4 = React.useState(),
6955
- selectedItem = _useState4[0],
6956
- setSelectedItem = _useState4[1];
6957
- var textSearchRef = React.useRef(null);
6958
- var isFirstLoadRef = React.useRef(true);
6959
- var handleChangeSelectedItem = function handleChangeSelectedItem(item) {
6960
- setSelectedItem(item);
6961
- };
6962
- var getData = function getData(isLoading) {
6963
- if (isLoading === void 0) {
6964
- isLoading = false;
6965
- }
6966
- try {
6967
- var _temp2 = function _temp2() {
6968
- isLoading && dispatch(setLoading(false));
6969
- };
6970
- if (isFirstLoadRef.current) isFirstLoadRef.current = false;
6971
- isLoading && dispatch(setLoading(true));
6972
- var _temp = _catch(function () {
6973
- return Promise.resolve(fetchData(filter)).then(function (res) {
6974
- var _res$data = res.data,
6975
- _res$data$items = _res$data.items,
6976
- items = _res$data$items === void 0 ? [] : _res$data$items,
6977
- _res$data$totalPages = _res$data.totalPages,
6978
- totalPages = _res$data$totalPages === void 0 ? 0 : _res$data$totalPages;
6979
- setTotalPages(totalPages);
6980
- setData(items);
6981
- });
6982
- }, function (error) {
6983
- var _error$response, _error$response$data;
6984
- setTotalPages(0);
6985
- setData([]);
6986
- reactToastify.toast.error((error === null || error === void 0 ? void 0 : (_error$response = error.response) === null || _error$response === void 0 ? void 0 : (_error$response$data = _error$response.data) === null || _error$response$data === void 0 ? void 0 : _error$response$data.title) || "Get data failed");
6987
- });
6988
- return Promise.resolve(_temp && _temp.then ? _temp.then(_temp2) : _temp2(_temp));
6989
- } catch (e) {
6990
- return Promise.reject(e);
6991
- }
6992
- };
6993
- var handleSort = function handleSort(sortColumnName) {
6994
- var sortColumnDirection = OrderType.ASC;
6995
- console.log({
6996
- sortColumnName: typeof sortColumnName,
6997
- filter: typeof filter.sortColumnName
7135
+ var handleChangeCategory = function handleChangeCategory(article, categoryId) {
7136
+ if (!exam) return;
7137
+ var examQuestions = exam.questions;
7138
+ var questions = examQuestions.filter(function (i) {
7139
+ return i.article === +article;
6998
7140
  });
6999
- if (filter.sortColumnName == sortColumnName && filter.sortColumnDirection === OrderType.ASC) sortColumnDirection = OrderType.DESC;
7000
- setFilter(_extends({}, filter, {
7001
- sortColumnName: sortColumnName,
7002
- sortColumnDirection: sortColumnDirection,
7003
- currentPage: 1
7004
- }));
7005
- };
7006
- var handleChangeSearchText = function handleChangeSearchText(e) {
7007
- if (!textSearchRef.current) return;
7008
- textSearchRef.current.value = e.target.value.trim();
7009
- debounceSearch();
7010
- };
7011
- var handleChangePage = function handleChangePage(_, page) {
7012
- setFilter(_extends({}, filter, {
7013
- currentPage: page
7014
- }));
7015
- };
7016
- var calcOrderNumber = function calcOrderNumber(index) {
7017
- var _filter$currentPage, _filter$pageSize;
7018
- return (((_filter$currentPage = filter.currentPage) != null ? _filter$currentPage : 0) - 1) * ((_filter$pageSize = filter.pageSize) != null ? _filter$pageSize : 0) + index + 1;
7019
- };
7020
- var debounceSearch = _.debounce(function () {
7021
- var _textSearchRef$curren;
7022
- setFilter(_extends({}, filter, {
7023
- currentPage: 1,
7024
- textSearch: (_textSearchRef$curren = textSearchRef.current) === null || _textSearchRef$curren === void 0 ? void 0 : _textSearchRef$curren.value
7141
+ var otherQuestions = examQuestions.filter(function (i) {
7142
+ return i.article !== +article;
7143
+ });
7144
+ onChangeExam(_extends({}, exam, {
7145
+ questions: [].concat(otherQuestions, questions.map(function (q) {
7146
+ return _extends({}, q, {
7147
+ categoryId: categoryId
7148
+ });
7149
+ }))
7025
7150
  }));
7026
- }, 500);
7027
- React.useEffect(function () {
7028
- getData(isFirstLoadRef.current);
7029
- }, [JSON.stringify(filter)]);
7030
- return {
7031
- filter: filter,
7032
- textSearchRef: textSearchRef,
7033
- totalPages: totalPages,
7034
- data: data,
7035
- selectedItem: selectedItem,
7036
- handleSort: handleSort,
7037
- handleChangeSearchText: handleChangeSearchText,
7038
- handleChangePage: handleChangePage,
7039
- calcOrderNumber: calcOrderNumber,
7040
- handleChangeSelectedItem: handleChangeSelectedItem,
7041
- getData: getData
7042
7151
  };
7043
- };
7044
-
7045
-
7046
-
7047
- var index$1 = {
7048
- __proto__: null,
7049
- useLogin: useLogin,
7050
- useAutoAcademyDomain: useAutoAcademyDomain,
7051
- useList: useList
7052
- };
7053
-
7054
- var useTextbookList = function useTextbookList(props) {
7055
- var role = props.role,
7056
- navigate = props.navigate;
7057
- var _useList = useList(function (search) {
7058
- return getTextbookListApi(search, role);
7059
- }, TextbookDefaultQuery),
7060
- filter = _useList.filter,
7061
- textSearchRef = _useList.textSearchRef,
7062
- totalPages = _useList.totalPages,
7063
- textbooks = _useList.data,
7064
- selectedTextbook = _useList.selectedItem,
7065
- handleSort = _useList.handleSort,
7066
- handleChangeSearchText = _useList.handleChangeSearchText,
7067
- handleChangePage = _useList.handleChangePage,
7068
- calcOrderNumber = _useList.calcOrderNumber,
7069
- handleChangeSelectedItem = _useList.handleChangeSelectedItem,
7070
- getData = _useList.getData;
7071
- var textbookUrl = role === exports.Role.Teacher ? TEXTBOOK_URL$1 : ADMIN_TEXTBOOK_URL;
7072
- var dispatch = reactRedux.useDispatch();
7073
- var handleViewTextbook = function handleViewTextbook(id) {
7074
- navigate(textbookUrl + "/" + id + "?readonly=true", {
7075
- replace: true
7152
+ var handleDeleteArticle = function handleDeleteArticle(article) {
7153
+ if (!exam) return;
7154
+ var removedQuestions = exam.questions.filter(function (i) {
7155
+ return i.article === +article;
7156
+ }).map(function (i) {
7157
+ return i.questionOrder;
7158
+ });
7159
+ var max = Math.max.apply(Math, removedQuestions);
7160
+ var examQuestions = exam.questions.filter(function (i) {
7161
+ return i.article !== +article;
7162
+ }).map(function (i) {
7163
+ return _extends({}, i, {
7164
+ article: i.article > article ? i.article - 1 : i.article,
7165
+ questionOrder: i.questionOrder > max ? i.questionOrder - removedQuestions.length : i.questionOrder
7166
+ });
7076
7167
  });
7168
+ onChangeExam(_extends({}, exam, {
7169
+ questions: [].concat(examQuestions)
7170
+ }));
7077
7171
  };
7078
- var handleUpdateTextbook = function handleUpdateTextbook(id) {
7079
- navigate(textbookUrl + "/" + id, {
7080
- replace: true
7172
+ var handleChangeAnswerCount = function handleChangeAnswerCount(article, newAnswerCount, answerCount) {
7173
+ if (!exam) return;
7174
+ if (newAnswerCount === answerCount) return;
7175
+ var examQuestions = exam.questions;
7176
+ var questions = examQuestions.filter(function (i) {
7177
+ return i.article === +article;
7081
7178
  });
7179
+ var otherQuestions = examQuestions.filter(function (i) {
7180
+ return i.article !== +article;
7181
+ });
7182
+ if (answerCount < newAnswerCount) {
7183
+ onChangeExam(_extends({}, exam, {
7184
+ questions: [].concat(otherQuestions, questions.map(function (q) {
7185
+ return _extends({}, q, {
7186
+ numberOfAnswers: newAnswerCount
7187
+ });
7188
+ }))
7189
+ }));
7190
+ } else {
7191
+ onChangeExam(_extends({}, exam, {
7192
+ questions: [].concat(otherQuestions, questions.map(function (q) {
7193
+ var _q$correctAnswers;
7194
+ return _extends({}, q, {
7195
+ numberOfAnswers: newAnswerCount,
7196
+ correctAnswers: (_q$correctAnswers = q.correctAnswers) === null || _q$correctAnswers === void 0 ? void 0 : _q$correctAnswers.filter(function (i) {
7197
+ return i <= newAnswerCount;
7198
+ })
7199
+ });
7200
+ }))
7201
+ }));
7202
+ }
7082
7203
  };
7083
- var handleCreateTextbook = function handleCreateTextbook() {
7084
- navigate(textbookUrl + "/create", {
7085
- replace: true
7204
+ var handleChangeCorrectAnswers = function handleChangeCorrectAnswers(article, index, answer) {
7205
+ if (!exam) return;
7206
+ var examQuestions = exam.questions;
7207
+ var questions = examQuestions.filter(function (i) {
7208
+ return i.article === +article;
7086
7209
  });
7210
+ var otherQuestions = examQuestions.filter(function (i) {
7211
+ return i.article !== +article;
7212
+ });
7213
+ var selectedQuestion = questions[index];
7214
+ onChangeExam(_extends({}, exam, {
7215
+ questions: [].concat(otherQuestions, questions.slice(0, index), [_extends({}, selectedQuestion, {
7216
+ correctAnswers: [answer]
7217
+ })], questions.slice(index + 1))
7218
+ }));
7087
7219
  };
7088
- var toggleConfirmDialog = function toggleConfirmDialog() {
7089
- handleChangeSelectedItem(undefined);
7220
+ var handleChangeScoreAnswer = function handleChangeScoreAnswer(article, index, score) {
7221
+ if (!exam) return;
7222
+ var examQuestions = exam.questions;
7223
+ var questions = examQuestions.filter(function (i) {
7224
+ return i.article === +article;
7225
+ });
7226
+ var otherQuestions = examQuestions.filter(function (i) {
7227
+ return i.article !== +article;
7228
+ });
7229
+ var selectedQuestion = questions[index];
7230
+ if (score === selectedQuestion.score) return;
7231
+ onChangeExam(_extends({}, exam, {
7232
+ questions: [].concat(otherQuestions, questions.slice(0, index), [_extends({}, selectedQuestion, {
7233
+ score: score
7234
+ })], questions.slice(index + 1))
7235
+ }));
7090
7236
  };
7091
- var handleSelectDeleteTextbook = function handleSelectDeleteTextbook(textbook) {
7092
- return [handleChangeSelectedItem(textbook)];
7237
+ var handleChangeDuration = function handleChangeDuration(value) {
7238
+ if (!exam) return;
7239
+ onChangeExam(_extends({}, exam, {
7240
+ duration: value === null || value === void 0 ? void 0 : value.value
7241
+ }));
7093
7242
  };
7094
- var handleDeleteTextbook = function handleDeleteTextbook() {
7095
- try {
7096
- var _temp2 = function _temp2() {
7097
- dispatch(setLoading(false));
7098
- };
7099
- if (!(selectedTextbook !== null && selectedTextbook !== void 0 && selectedTextbook.id)) return Promise.resolve();
7100
- dispatch(setLoading(true));
7101
- var _temp = _catch(function () {
7102
- return Promise.resolve(deleteTextbookApi(selectedTextbook.id, role)).then(function () {
7103
- return Promise.resolve(getData(false)).then(function () {
7104
- toggleConfirmDialog();
7105
- });
7243
+ var handleChangeTitle = function handleChangeTitle(e) {
7244
+ if (!exam) return;
7245
+ onChangeExam(_extends({}, exam, {
7246
+ title: e.target.value
7247
+ }));
7248
+ };
7249
+ var handleAddArticle = function handleAddArticle() {
7250
+ var _$maxBy, _$maxBy2;
7251
+ if (!exam) return;
7252
+ var maxArticle = ((_$maxBy = _.maxBy(exam.questions, "article")) === null || _$maxBy === void 0 ? void 0 : _$maxBy.article) || 0;
7253
+ var maxOrder = ((_$maxBy2 = _.maxBy(exam.questions, "questionOrder")) === null || _$maxBy2 === void 0 ? void 0 : _$maxBy2.questionOrder) || 0;
7254
+ onChangeExam(_extends({}, exam, {
7255
+ questions: [].concat(exam.questions, [{
7256
+ article: maxArticle + 1,
7257
+ correctAnswers: [1],
7258
+ numberOfAnswers: DEFAULT_ANSWER_COUNT$1,
7259
+ score: DEFAULT_SCORE,
7260
+ questionOrder: maxOrder + 1
7261
+ }])
7262
+ }));
7263
+ };
7264
+ var examGroupByArticle = React.useMemo(function () {
7265
+ if (!exam) return [];
7266
+ var articles = [];
7267
+ var groupedArticle = _.groupBy(exam.questions, "article");
7268
+ for (var key in groupedArticle) {
7269
+ if (Object.prototype.hasOwnProperty.call(groupedArticle, key)) {
7270
+ var _questions$find, _$maxBy3;
7271
+ var questions = groupedArticle[key];
7272
+ articles.push({
7273
+ article: +key,
7274
+ categoryId: (_questions$find = questions.find(function (i) {
7275
+ return !!i.categoryId;
7276
+ })) === null || _questions$find === void 0 ? void 0 : _questions$find.categoryId,
7277
+ answerCount: ((_$maxBy3 = _.maxBy(questions, "numberOfAnswers")) === null || _$maxBy3 === void 0 ? void 0 : _$maxBy3.numberOfAnswers) || DEFAULT_ANSWER_COUNT$1,
7278
+ questionCount: questions.length,
7279
+ questions: questions
7106
7280
  });
7107
- }, function (error) {
7108
- var _error$response, _error$response$data;
7109
- reactToastify.toast.error((error === null || error === void 0 ? void 0 : (_error$response = error.response) === null || _error$response === void 0 ? void 0 : (_error$response$data = _error$response.data) === null || _error$response$data === void 0 ? void 0 : _error$response$data.title) || "Textbook deleted failed");
7110
- });
7111
- return Promise.resolve(_temp && _temp.then ? _temp.then(_temp2) : _temp2(_temp));
7112
- } catch (e) {
7113
- return Promise.reject(e);
7281
+ }
7114
7282
  }
7115
- };
7283
+ return _.sortBy(articles, "article");
7284
+ }, [JSON.stringify(exam)]);
7285
+ var durationOptions = React.useMemo(function () {
7286
+ var options = DURATION_OPTIONS.map(function (i) {
7287
+ return {
7288
+ label: i + "\uBD84",
7289
+ value: i
7290
+ };
7291
+ });
7292
+ if (!!exam.duration && exam.duration > DURATION_OPTIONS[DURATION_OPTIONS.length - 1]) return [].concat(options, [{
7293
+ label: exam.duration + "\uBD84",
7294
+ value: exam.duration
7295
+ }]);
7296
+ return options;
7297
+ }, [exam.duration]);
7298
+ React.useEffect(function () {
7299
+ if ((selectedSubject === null || selectedSubject === void 0 ? void 0 : selectedSubject.id) !== exam.subjectId) onChangeExam(_extends({}, exam, {
7300
+ subjectId: (selectedSubject === null || selectedSubject === void 0 ? void 0 : selectedSubject.id) || 0
7301
+ }));
7302
+ }, [selectedSubject === null || selectedSubject === void 0 ? void 0 : selectedSubject.id, exam.subjectId]);
7116
7303
  return {
7117
- filter: filter,
7118
- textSearchRef: textSearchRef,
7119
- totalPages: totalPages,
7120
- textbooks: textbooks,
7121
- selectedTextbook: selectedTextbook,
7122
- handleSort: handleSort,
7123
- handleChangeSearchText: handleChangeSearchText,
7124
- handleChangePage: handleChangePage,
7125
- calcOrderNumber: calcOrderNumber,
7126
- handleViewTextbook: handleViewTextbook,
7127
- handleUpdateTextbook: handleUpdateTextbook,
7128
- handleCreateTextbook: handleCreateTextbook,
7129
- toggleConfirmDialog: toggleConfirmDialog,
7130
- handleDeleteTextbook: handleDeleteTextbook,
7131
- handleSelectDeleteTextbook: handleSelectDeleteTextbook
7304
+ t: t,
7305
+ durationOptions: durationOptions,
7306
+ examGroupByArticle: examGroupByArticle,
7307
+ handleAddArticle: handleAddArticle,
7308
+ handleChangeScoreAnswer: handleChangeScoreAnswer,
7309
+ handleChangeTitle: handleChangeTitle,
7310
+ handleChangeDuration: handleChangeDuration,
7311
+ handleChangeCorrectAnswers: handleChangeCorrectAnswers,
7312
+ handleChangeAnswerCount: handleChangeAnswerCount,
7313
+ handleChangeQuestionCount: handleChangeQuestionCount,
7314
+ handleChangeCategory: handleChangeCategory,
7315
+ handleDeleteArticle: handleDeleteArticle
7132
7316
  };
7133
7317
  };
7134
7318
 
7135
- var EmptyRow = function EmptyRow() {
7319
+ var ExamDetailView = function ExamDetailView(_ref) {
7320
+ var _ref$className = _ref.className,
7321
+ className = _ref$className === void 0 ? "" : _ref$className,
7322
+ exam = _ref.exam,
7323
+ isDisabled = _ref.isDisabled,
7324
+ isEdit = _ref.isEdit,
7325
+ onChangeExam = _ref.onChangeExam;
7326
+ var _useSubjectSelect = useSubjectSelect(),
7327
+ subjectOptions = _useSubjectSelect.subjectOptions,
7328
+ selectedSubject = _useSubjectSelect.selectedSubject,
7329
+ handleChangeSubject = _useSubjectSelect.handleChangeSubject;
7330
+ var _useExamDetailView = useExamDetailView({
7331
+ exam: exam,
7332
+ onChangeExam: onChangeExam,
7333
+ selectedSubject: selectedSubject
7334
+ }),
7335
+ t = _useExamDetailView.t,
7336
+ durationOptions = _useExamDetailView.durationOptions,
7337
+ examGroupByArticle = _useExamDetailView.examGroupByArticle,
7338
+ handleAddArticle = _useExamDetailView.handleAddArticle,
7339
+ handleChangeScoreAnswer = _useExamDetailView.handleChangeScoreAnswer,
7340
+ handleChangeTitle = _useExamDetailView.handleChangeTitle,
7341
+ handleChangeDuration = _useExamDetailView.handleChangeDuration,
7342
+ handleChangeCorrectAnswers = _useExamDetailView.handleChangeCorrectAnswers,
7343
+ handleChangeAnswerCount = _useExamDetailView.handleChangeAnswerCount,
7344
+ handleChangeQuestionCount = _useExamDetailView.handleChangeQuestionCount,
7345
+ handleChangeCategory = _useExamDetailView.handleChangeCategory,
7346
+ handleDeleteArticle = _useExamDetailView.handleDeleteArticle;
7347
+ return React__default.createElement(material.Grid, {
7348
+ container: true,
7349
+ spacing: 3,
7350
+ className: className + " " + styles["custom-row"]
7351
+ }, React__default.createElement(material.Grid, {
7352
+ item: true,
7353
+ xs: 5,
7354
+ className: 'mb-2'
7355
+ }, React__default.createElement("label", {
7356
+ className: styles["form-label"] + " " + styles$2["question-label"],
7357
+ htmlFor: "title"
7358
+ }, t("title")), React__default.createElement("input", {
7359
+ disabled: isDisabled,
7360
+ className: "" + styles["form-control"],
7361
+ value: exam.title,
7362
+ id: "title",
7363
+ placeholder: t("enter_title"),
7364
+ onChange: handleChangeTitle
7365
+ })), React__default.createElement(material.Grid, {
7366
+ item: true,
7367
+ xs: 3,
7368
+ className: 'mb-2'
7369
+ }, React__default.createElement("label", {
7370
+ className: styles["form-label"] + " " + styles$2["question-label"],
7371
+ htmlFor: "duration"
7372
+ }, t("duration")), React__default.createElement(CustomSelect, {
7373
+ inputId: "duration",
7374
+ value: exam.duration,
7375
+ options: durationOptions,
7376
+ onChange: handleChangeDuration,
7377
+ isDisabled: isDisabled
7378
+ })), React__default.createElement(material.Grid, {
7379
+ item: true,
7380
+ xs: 3,
7381
+ className: 'mb-2'
7382
+ }, React__default.createElement("label", {
7383
+ className: styles["form-label"] + " " + styles$2["question-label"],
7384
+ htmlFor: "duration"
7385
+ }, t("subject"), " ", selectedSubject === null || selectedSubject === void 0 ? void 0 : selectedSubject.name), React__default.createElement(CustomSelect, {
7386
+ inputId: "subject",
7387
+ value: selectedSubject === null || selectedSubject === void 0 ? void 0 : selectedSubject.id,
7388
+ options: subjectOptions,
7389
+ onChange: handleChangeSubject,
7390
+ isDisabled: isDisabled || isEdit
7391
+ })), examGroupByArticle.map(function (i, index) {
7392
+ return React__default.createElement(material.Grid, {
7393
+ item: true,
7394
+ key: i.article,
7395
+ xs: 12,
7396
+ className: index === examGroupByArticle.length - 1 ? "mb-2" : ''
7397
+ }, React__default.createElement(ArticleGroupView, Object.assign({}, i, {
7398
+ isActive: index === examGroupByArticle.length - 1,
7399
+ onChangeQuestionCount: handleChangeQuestionCount,
7400
+ onChangeCategory: handleChangeCategory,
7401
+ onChangeAnswerCount: handleChangeAnswerCount,
7402
+ onChangeCorrectAnswers: handleChangeCorrectAnswers,
7403
+ onChangeScoreAnswer: handleChangeScoreAnswer,
7404
+ onDelete: handleDeleteArticle,
7405
+ isDisabled: isDisabled,
7406
+ selectedSubject: selectedSubject,
7407
+ isDeletable: examGroupByArticle.length > 1
7408
+ })));
7409
+ }), React__default.createElement(material.Grid, {
7410
+ item: true,
7411
+ xs: 12
7412
+ }, React__default.createElement("button", {
7413
+ disabled: isDisabled,
7414
+ className: styles["btn-outline-primary"] + " w-100 d-flex justify-content-center align-items-center " + styles$2["question-btn"] + " mt-3",
7415
+ onClick: handleAddArticle
7416
+ }, React__default.createElement(fa.FaPlusCircle, {
7417
+ className: "me-2"
7418
+ }), "\uBB38\uD56D \uCD94\uAC00\uD558\uAE30")));
7419
+ };
7420
+
7421
+ var _excluded$4 = ["isOpen", "onClose", "handleSaveExam"];
7422
+ var CreateExamDrawer = function CreateExamDrawer(props) {
7423
+ var isOpen = props.isOpen,
7424
+ onClose = props.onClose,
7425
+ handleSaveExam = props.handleSaveExam,
7426
+ examDetailViewProps = _objectWithoutPropertiesLoose(props, _excluded$4);
7136
7427
  var _useTranslation = reactI18next.useTranslation(),
7137
7428
  t = _useTranslation.t;
7138
- return React__default.createElement(material.TableRow, null, React__default.createElement(material.TableCell, {
7139
- colSpan: 12,
7140
- className: "text-center text-muted"
7141
- }, t("no_data")));
7429
+ var theme = material.useTheme();
7430
+ var isTabletUp = material.useMediaQuery(theme.breakpoints.up('lg'));
7431
+ return React__default.createElement("div", null, React__default.createElement("div", {
7432
+ className: styles$3["drawer-overlay"] + " " + (isOpen && styles$3["open"]),
7433
+ onClick: function onClick() {
7434
+ return onClose();
7435
+ }
7436
+ }), React__default.createElement("div", {
7437
+ className: styles$3["drawer"] + " bg-white " + (isOpen && styles$3["open"]),
7438
+ style: {
7439
+ width: "" + (isTabletUp ? "70vw" : "100vw")
7440
+ }
7441
+ }, React__default.createElement("div", {
7442
+ className: styles$3["drawer-header"] + " d-flex justify-content-between align-items-center"
7443
+ }, React__default.createElement("div", {
7444
+ style: {
7445
+ color: "#5458D5",
7446
+ cursor: "pointer",
7447
+ padding: "0.5rem 1rem",
7448
+ border: "1px solid #5458D5",
7449
+ backgroundColor: "white",
7450
+ justifyContent: "center",
7451
+ alignItems: "center",
7452
+ borderRadius: "6px"
7453
+ },
7454
+ onClick: handleSaveExam
7455
+ }, t("live_exam")), React__default.createElement("span", {
7456
+ className: "p-1 pointer",
7457
+ onClick: function onClick() {
7458
+ return onClose();
7459
+ }
7460
+ }, React__default.createElement(fa.FaTimes, {
7461
+ size: 18
7462
+ }))), React__default.createElement("div", {
7463
+ className: "" + styles$3["drawer-form"]
7464
+ }, React__default.createElement(ExamDetailView, Object.assign({}, examDetailViewProps)))));
7142
7465
  };
7143
7466
 
7144
- var LayoutList = function LayoutList(_ref) {
7145
- var children = _ref.children,
7146
- title = _ref.title;
7147
- return React__default.createElement(material.Box, {
7148
- className: 'bg-white p-3'
7467
+ var TextbookViewDetail = function TextbookViewDetail(props) {
7468
+ var _textbook$chapters;
7469
+ var _useTextbookDetail = useTextbookDetail(props),
7470
+ id = _useTextbookDetail.id,
7471
+ t = _useTextbookDetail.t,
7472
+ textbook = _useTextbookDetail.textbook,
7473
+ textbookSubject = _useTextbookDetail.textbookSubject,
7474
+ isReadonly = _useTextbookDetail.isReadonly,
7475
+ isNotFound = _useTextbookDetail.isNotFound,
7476
+ parentChapter = _useTextbookDetail.parentChapter,
7477
+ textbookId = _useTextbookDetail.textbookId,
7478
+ selectedChapter = _useTextbookDetail.selectedChapter,
7479
+ articlesSelected = _useTextbookDetail.articlesSelected,
7480
+ selectedDeleteItem = _useTextbookDetail.selectedDeleteItem,
7481
+ isEditedTitle = _useTextbookDetail.isEditedTitle,
7482
+ isOpenDialog = _useTextbookDetail.isOpenDialog,
7483
+ examRequest = _useTextbookDetail.examRequest,
7484
+ handleChangeExamRequest = _useTextbookDetail.handleChangeExamRequest,
7485
+ handleSaveExam = _useTextbookDetail.handleSaveExam,
7486
+ handleCloseDialog = _useTextbookDetail.handleCloseDialog,
7487
+ handleCreateExam = _useTextbookDetail.handleCreateExam,
7488
+ handleCheckArticle = _useTextbookDetail.handleCheckArticle,
7489
+ handleChangeTextbookTitle = _useTextbookDetail.handleChangeTextbookTitle,
7490
+ handleOpenCreateExamDialog = _useTextbookDetail.handleOpenCreateExamDialog,
7491
+ handleChangeTextbookSubject = _useTextbookDetail.handleChangeTextbookSubject,
7492
+ handleGoToTextbookList = _useTextbookDetail.handleGoToTextbookList,
7493
+ handleCreateOrUpdateTextbook = _useTextbookDetail.handleCreateOrUpdateTextbook,
7494
+ handleCloseChapterNameDialog = _useTextbookDetail.handleCloseChapterNameDialog,
7495
+ handleCreateChapter = _useTextbookDetail.handleCreateChapter,
7496
+ handleAddChapterToTextbook = _useTextbookDetail.handleAddChapterToTextbook,
7497
+ handleAddChapterToParentSubchapter = _useTextbookDetail.handleAddChapterToParentSubchapter,
7498
+ handleChangeChapterName = _useTextbookDetail.handleChangeChapterName,
7499
+ handleChangeChapterPageFrom = _useTextbookDetail.handleChangeChapterPageFrom,
7500
+ handleChangeChapterPageTo = _useTextbookDetail.handleChangeChapterPageTo,
7501
+ handleAddArticleToChapter = _useTextbookDetail.handleAddArticleToChapter,
7502
+ handleUpdateArticleQuestionCountFromChapter = _useTextbookDetail.handleUpdateArticleQuestionCountFromChapter,
7503
+ handleUpdateArticleCategory = _useTextbookDetail.handleUpdateArticleCategory,
7504
+ handleUpdateArticleAnswerCount = _useTextbookDetail.handleUpdateArticleAnswerCount,
7505
+ handleUpdateArticleQuestion = _useTextbookDetail.handleUpdateArticleQuestion,
7506
+ handleCloseArticleDialog = _useTextbookDetail.handleCloseArticleDialog,
7507
+ handleOpenAddArticleDialog = _useTextbookDetail.handleOpenAddArticleDialog,
7508
+ handleOpenRemoveArticleConfirmDialog = _useTextbookDetail.handleOpenRemoveArticleConfirmDialog,
7509
+ handleCloseConfirmDeleteDialog = _useTextbookDetail.handleCloseConfirmDeleteDialog,
7510
+ handleRemoveSelectedItem = _useTextbookDetail.handleRemoveSelectedItem,
7511
+ handleOpenRemoveChapterConfirmDialog = _useTextbookDetail.handleOpenRemoveChapterConfirmDialog;
7512
+ var _useCategorySelect = useCategorySelect({
7513
+ subjectId: id ? textbookSubject === null || textbookSubject === void 0 ? void 0 : textbookSubject.value : undefined
7514
+ }),
7515
+ categoryOptions = _useCategorySelect.categoryOptions;
7516
+ if (isNotFound) return React__default.createElement(NotFound, null);
7517
+ return React__default.createElement(material.Container, {
7518
+ maxWidth: "xl",
7519
+ className: "bg-white py-5 p-4 rounded-4 h-100 d-flex flex-column"
7149
7520
  }, React__default.createElement(material.Stack, {
7150
7521
  direction: "row",
7151
7522
  alignItems: "center",
7152
7523
  justifyContent: "space-between",
7153
7524
  mb: 2
7154
7525
  }, React__default.createElement(material.Typography, {
7155
- variant: 'h4'
7156
- }, title)), React__default.createElement(material.Box, null, children));
7157
- };
7158
-
7159
- var SortIcon = function SortIcon(_ref) {
7160
- var isAscending = _ref.isAscending,
7161
- onClick = _ref.onClick;
7162
- return React__default.createElement("div", {
7163
- className: "d-flex flex-column " + styles["sort-icons"],
7164
- onClick: onClick
7165
- }, React__default.createElement(fa.FaSortUp, {
7166
- className: isAscending === true ? styles["active"] : ""
7167
- }), React__default.createElement(fa.FaSortDown, {
7168
- className: isAscending === false ? styles["active"] : ""
7169
- }));
7170
- };
7171
-
7172
- var TableHeader = function TableHeader(_ref) {
7173
- var headerTemplates = _ref.headerTemplates,
7174
- filter = _ref.filter,
7175
- onSort = _ref.onSort;
7176
- var _useTranslation = reactI18next.useTranslation(),
7177
- t = _useTranslation.t;
7178
- return React__default.createElement(material.TableHead, null, React__default.createElement(material.TableRow, null, headerTemplates.map(function (i, index$1) {
7179
- return React__default.createElement(material.TableCell, {
7180
- key: index$1,
7181
- className: "" + (!!i.sortKey && "pointer"),
7182
- onClick: !!i.sortKey ? function () {
7183
- return onSort === null || onSort === void 0 ? void 0 : onSort(i.sortKey);
7184
- } : undefined
7185
- }, React__default.createElement("div", {
7186
- className: "d-flex justify-content-between align-items-center text-nowrap"
7187
- }, t(i.title), !!i.sortKey && React__default.createElement(SortIcon, {
7188
- isAscending: filter.sortColumnName !== i.sortKey ? undefined : filter.sortColumnDirection === OrderType.ASC
7189
- })));
7190
- })));
7191
- };
7192
-
7193
- var SearchInput = function SearchInput(_ref) {
7194
- var textSearchRef = _ref.textSearchRef,
7195
- _ref$placeholder = _ref.placeholder,
7196
- placeholder = _ref$placeholder === void 0 ? "Search for..." : _ref$placeholder,
7197
- onChange = _ref.onChange,
7198
- _ref$fit = _ref.fit,
7199
- fit = _ref$fit === void 0 ? true : _ref$fit;
7200
- return React__default.createElement(material.Paper, {
7201
- component: "div",
7202
- className: "bg-light w-100 " + (fit && "h-100"),
7526
+ variant: "h3"
7527
+ }, t(id ? isReadonly ? "view_textbook" : "update_textbook" : "create_textbook"))), React__default.createElement(material.Grid, {
7528
+ container: true,
7529
+ spacing: 3
7530
+ }, React__default.createElement(material.Grid, {
7531
+ item: true,
7532
+ xs: 4,
7533
+ className: "d-flex align-items-center"
7534
+ }, React__default.createElement(material.Table, null, React__default.createElement(material.TableBody, null, React__default.createElement(material.TableRow, {
7203
7535
  sx: {
7204
- p: "2px 4px",
7205
- display: "flex",
7206
- alignItems: "center",
7207
- width: 400,
7208
- transition: "border 0.2s ease",
7209
- outline: "1px solid transparent",
7210
- ":focus-within": {
7211
- outlineColor: function outlineColor(theme) {
7212
- return theme.palette.primary.main;
7213
- }
7536
+ "& td": {
7537
+ border: 0
7214
7538
  }
7215
7539
  }
7216
- }, React__default.createElement(material.Box, {
7540
+ }, React__default.createElement(material.TableCell, {
7541
+ className: "p-2 pe-0",
7217
7542
  sx: {
7218
- p: "10px"
7219
- },
7220
- "aria-label": "search"
7221
- }, React__default.createElement(io5.IoSearch, {
7222
- size: 24,
7223
- className: "pb-1"
7224
- })), React__default.createElement(material.InputBase, {
7225
- id: "searchText",
7226
- className: "" + (fit && "h-100"),
7543
+ width: "15%"
7544
+ }
7545
+ }, React__default.createElement(material.InputLabel, null, React__default.createElement("span", {
7546
+ className: "fw-bold"
7547
+ }, t("name")), React__default.createElement("span", {
7548
+ className: "text-danger"
7549
+ }, "*"))), React__default.createElement(material.TableCell, {
7227
7550
  sx: {
7228
- ml: 1,
7229
- flex: 1,
7230
- lineHeight: 1
7231
- },
7232
- placeholder: placeholder,
7233
- ref: textSearchRef,
7234
- onChange: onChange
7235
- }));
7236
- };
7237
-
7238
- var TextbookList = function TextbookList(props) {
7239
- var _useTranslation = reactI18next.useTranslation(),
7240
- t = _useTranslation.t;
7241
- var _useTextbookList = useTextbookList(props),
7242
- filter = _useTextbookList.filter,
7243
- textbooks = _useTextbookList.textbooks,
7244
- totalPages = _useTextbookList.totalPages,
7245
- textSearchRef = _useTextbookList.textSearchRef,
7246
- selectedTextbook = _useTextbookList.selectedTextbook,
7247
- handleChangeSearchText = _useTextbookList.handleChangeSearchText,
7248
- handleSort = _useTextbookList.handleSort,
7249
- handleChangePage = _useTextbookList.handleChangePage,
7250
- calcOrderNumber = _useTextbookList.calcOrderNumber,
7251
- handleViewTextbook = _useTextbookList.handleViewTextbook,
7252
- handleUpdateTextbook = _useTextbookList.handleUpdateTextbook,
7253
- handleCreateTextbook = _useTextbookList.handleCreateTextbook,
7254
- toggleConfirmDialog = _useTextbookList.toggleConfirmDialog,
7255
- handleDeleteTextbook = _useTextbookList.handleDeleteTextbook,
7256
- handleSelectDeleteTextbook = _useTextbookList.handleSelectDeleteTextbook;
7257
- return React__default.createElement(LayoutList, {
7258
- title: t(TEXTBOOK_PAGE_TITLE)
7259
- }, React__default.createElement(material.Grid, {
7260
- container: true
7261
- }, React__default.createElement(material.Grid, {
7551
+ width: 0,
7552
+ px: 1
7553
+ }
7554
+ }, ":"), React__default.createElement(material.TableCell, {
7555
+ className: "p-2"
7556
+ }, React__default.createElement(InputText, {
7557
+ className: "w-100",
7558
+ value: textbook === null || textbook === void 0 ? void 0 : textbook.name,
7559
+ placeholder: t("enter_textbook_title"),
7560
+ onChange: handleChangeTextbookTitle,
7561
+ disabled: isReadonly
7562
+ }))), React__default.createElement(material.TableRow, {
7563
+ sx: {
7564
+ "& td": {
7565
+ border: 0
7566
+ }
7567
+ }
7568
+ }, React__default.createElement(material.TableCell, {
7569
+ className: "p-2 pe-0"
7570
+ }, React__default.createElement(material.InputLabel, null, React__default.createElement("span", {
7571
+ className: "fw-bold"
7572
+ }, t("subject")), React__default.createElement("span", {
7573
+ className: "text-danger"
7574
+ }, "*"))), React__default.createElement(material.TableCell, {
7575
+ sx: {
7576
+ width: 0,
7577
+ px: 1
7578
+ }
7579
+ }, ":"), React__default.createElement(material.TableCell, {
7580
+ className: "p-2"
7581
+ }, React__default.createElement(SubjectSelector, {
7582
+ value: textbookSubject,
7583
+ onChange: handleChangeTextbookSubject,
7584
+ isDisabled: isReadonly || !!id
7585
+ })))))), React__default.createElement(material.Grid, {
7262
7586
  item: true,
7263
- xs: 6
7264
- }, React__default.createElement(SearchInput, {
7265
- textSearchRef: textSearchRef,
7266
- onChange: handleChangeSearchText,
7267
- placeholder: t(TEXT_BOOK_SEARCH_PLACEHOLDER)
7268
- })), React__default.createElement(material.Grid, {
7587
+ xs: 8,
7588
+ className: "d-flex justify-content-end"
7589
+ }, React__default.createElement("div", null, React__default.createElement(TextbookActionButtons, {
7590
+ isReadonly: isReadonly,
7591
+ textbook: textbook,
7592
+ onBack: handleGoToTextbookList,
7593
+ onSave: handleCreateOrUpdateTextbook,
7594
+ hideSave: !isEditedTitle && !!id && !isReadonly || textbook.isCreatedByAdmin
7595
+ }))), React__default.createElement(material.Grid, {
7269
7596
  item: true,
7270
- xs: 6
7271
- }, React__default.createElement(material.Stack, {
7272
- alignItems: "end"
7597
+ xs: 12,
7598
+ gap: "8px",
7599
+ className: "d-flex justify-content-end"
7273
7600
  }, React__default.createElement(material.Button, {
7601
+ variant: "outlined",
7602
+ sx: {
7603
+ borderColor: "#5458D5",
7604
+ color: "#5458D5"
7605
+ },
7606
+ onClick: function onClick() {
7607
+ return handleOpenCreateExamDialog();
7608
+ },
7609
+ disabled: isReadonly || !articlesSelected.length,
7274
7610
  startIcon: React__default.createElement(fa.FaPlus, {
7275
7611
  size: 12
7276
- }),
7612
+ })
7613
+ }, React__default.createElement(material.Typography, null, t("create_new_exam"))), !!id && React__default.createElement(material.Button, {
7614
+ className: "mx-1",
7277
7615
  variant: "contained",
7278
7616
  color: "primary",
7279
- onClick: handleCreateTextbook
7280
- }, t("create_textbook")))), React__default.createElement(material.Grid, {
7281
- item: true,
7282
- xs: 12,
7283
- className: "mt-3"
7284
- }, React__default.createElement(material.Table, null, React__default.createElement(TableHeader, {
7285
- headerTemplates: TEXTBOOK_HEADERS,
7286
- filter: filter,
7287
- onSort: handleSort
7288
- }), React__default.createElement(material.TableBody, null, textbooks.map(function (i, index) {
7289
- return React__default.createElement(material.TableRow, {
7290
- key: i.id
7291
- }, React__default.createElement(material.TableCell, null, calcOrderNumber(index)), React__default.createElement(material.TableCell, null, i.name), React__default.createElement(material.TableCell, null, i.subject.name), React__default.createElement(material.TableCell, null, utcToLocalTime(i.createdAt, t("date_format"))), React__default.createElement(material.TableCell, null, i.totalChapters), React__default.createElement(material.TableCell, null, React__default.createElement(material.Stack, {
7292
- direction: "row",
7293
- spacing: 1,
7294
- alignItems: "center"
7295
- }, !i.isCreatedByAdmin && React__default.createElement(material.IconButton, {
7296
- color: "default",
7297
- className: "bg-warning text-white",
7298
- onClick: function onClick() {
7299
- return handleUpdateTextbook(i.id);
7300
- }
7301
- }, React__default.createElement(fa6.FaPencil, {
7302
- size: 12
7303
- })), React__default.createElement(material.IconButton, {
7304
- color: "default",
7305
- className: "bg-primary text-white",
7306
- onClick: function onClick() {
7307
- return handleViewTextbook(i.id);
7308
- }
7309
- }, React__default.createElement(fa.FaEye, {
7310
- size: 12
7311
- })), !i.isCreatedByAdmin && React__default.createElement(material.IconButton, {
7312
- color: "default",
7313
- className: "bg-danger text-white",
7314
- onClick: function onClick() {
7315
- return handleSelectDeleteTextbook(i);
7316
- }
7317
- }, React__default.createElement(fa.FaTrash, {
7617
+ startIcon: React__default.createElement(fa.FaPlus, {
7318
7618
  size: 12
7319
- })))));
7320
- }), !textbooks.length && React__default.createElement(EmptyRow, null))), React__default.createElement("div", {
7321
- className: "d-flex justify-content-end mt-3"
7322
- }, !!totalPages && React__default.createElement(material.Pagination, {
7323
- count: totalPages,
7324
- page: filter.currentPage,
7325
- onChange: handleChangePage
7326
- })))), React__default.createElement(ConfirmDialog, {
7327
- open: !!(selectedTextbook !== null && selectedTextbook !== void 0 && selectedTextbook.id),
7328
- toggle: toggleConfirmDialog,
7329
- text: "" + t("are_you_sure_you_want_to_delete_the_textbook"),
7330
- onConfirm: handleDeleteTextbook,
7331
- confirmText: selectedTextbook === null || selectedTextbook === void 0 ? void 0 : selectedTextbook.name,
7619
+ }),
7620
+ onClick: handleAddChapterToTextbook,
7621
+ disabled: isReadonly
7622
+ }, t("add_chapter"))), React__default.createElement(material.Grid, {
7623
+ item: true,
7624
+ xs: 12
7625
+ }, React__default.createElement(material.Stack, {
7626
+ spacing: 3
7627
+ }, !!(textbook !== null && textbook !== void 0 && textbook.subject) && (textbook === null || textbook === void 0 ? void 0 : (_textbook$chapters = textbook.chapters) === null || _textbook$chapters === void 0 ? void 0 : _textbook$chapters.map(function (chapter) {
7628
+ return React__default.createElement(ChapterBox, {
7629
+ key: chapter.id,
7630
+ subject: textbook.subject,
7631
+ data: chapter,
7632
+ categoryOptions: categoryOptions || [],
7633
+ onClickAddSubchapter: handleAddChapterToParentSubchapter,
7634
+ onChangeName: handleChangeChapterName,
7635
+ onChangePageFrom: handleChangeChapterPageFrom,
7636
+ onChangePageTo: handleChangeChapterPageTo,
7637
+ handleCheckArticle: handleCheckArticle,
7638
+ onAddArticle: handleOpenAddArticleDialog,
7639
+ onRemoveArticle: handleOpenRemoveArticleConfirmDialog,
7640
+ onUpdateArticleQuestionCount: handleUpdateArticleQuestionCountFromChapter,
7641
+ onUpdateArticleCategory: handleUpdateArticleCategory,
7642
+ onUpdateArticleQuestionAnswerCount: handleUpdateArticleAnswerCount,
7643
+ onUpdateArticleQuestion: handleUpdateArticleQuestion,
7644
+ onRemoveChapter: handleOpenRemoveChapterConfirmDialog,
7645
+ isReadonly: isReadonly
7646
+ });
7647
+ }))))), React__default.createElement(ChapterNameDialog, {
7648
+ open: !!(parentChapter !== null && parentChapter !== void 0 && parentChapter.id) || !!textbookId,
7649
+ chapter: parentChapter,
7650
+ onClose: handleCloseChapterNameDialog,
7651
+ onSubmitForm: handleCreateChapter
7652
+ }), React__default.createElement(CreateExamDrawer, {
7653
+ isOpen: isOpenDialog,
7654
+ onClose: handleCloseDialog,
7655
+ onSubmit: handleCreateExam,
7656
+ handleSaveExam: handleSaveExam,
7657
+ exam: examRequest,
7658
+ onChangeExam: handleChangeExamRequest
7659
+ }), React__default.createElement(ArticleDialog, {
7660
+ open: !!selectedChapter,
7661
+ chapter: selectedChapter,
7662
+ categoryOptions: categoryOptions || [],
7663
+ onClose: handleCloseArticleDialog,
7664
+ onSubmitForm: handleAddArticleToChapter
7665
+ }), selectedDeleteItem && React__default.createElement(ConfirmDialog, {
7666
+ open: true,
7667
+ toggle: handleCloseConfirmDeleteDialog,
7668
+ text: selectedDeleteItem.confirmText,
7669
+ confirmText: selectedDeleteItem.name,
7670
+ onConfirm: handleRemoveSelectedItem,
7332
7671
  isDelete: true
7333
7672
  }));
7334
7673
  };
7335
7674
 
7336
-
7337
-
7338
- var index$2 = {
7339
- __proto__: null,
7340
- TextbookList: TextbookList,
7341
- TextbookDetail: TextbookViewDetail
7342
- };
7343
-
7344
- var _excluded$4 = ["defaultValue", "options", "isDisabled", "scrollBottom", "value", "isMulti"];
7345
- var CustomCreatable = function CustomCreatable(_ref) {
7346
- var options = _ref.options,
7347
- isDisabled = _ref.isDisabled,
7348
- scrollBottom = _ref.scrollBottom,
7349
- value = _ref.value,
7350
- isMulti = _ref.isMulti,
7351
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$4);
7352
- var initialValues = Array.isArray(value) ? options.filter(function (i) {
7353
- return value.includes(i.value);
7354
- }) : isMulti ? options.filter(function (i) {
7355
- return i.value == value;
7356
- }) : options.find(function (i) {
7357
- return i.value == value;
7358
- });
7359
- return React__default.createElement(CreatableSelect, Object.assign({
7360
- isClearable: true,
7361
- isDisabled: isDisabled,
7362
- options: options,
7363
- value: initialValues,
7364
- menuPlacement: scrollBottom ? "top" : "auto",
7365
- isMulti: isMulti
7366
- }, rest));
7367
- };
7368
-
7369
- var _excluded$5 = ["isDefault", "defaultValue", "options", "isDisabled", "scrollBottom", "value", "isMulti"];
7370
- var CustomAsyncSelect = function CustomAsyncSelect(_ref) {
7371
- var isDefault = _ref.isDefault,
7372
- options = _ref.options,
7373
- isDisabled = _ref.isDisabled,
7374
- scrollBottom = _ref.scrollBottom,
7375
- value = _ref.value,
7376
- isMulti = _ref.isMulti,
7377
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$5);
7378
- var initialValues = Array.isArray(value) ? options.filter(function (i) {
7379
- return value.includes(i.value);
7380
- }) : isMulti ? options.filter(function (i) {
7381
- return i.value == value;
7382
- }) : options.find(function (i) {
7383
- return i.value == value;
7675
+ var useAutoAcademyDomain = function useAutoAcademyDomain(logout, history, superUrls, homeUrl, homeAcademyUrl) {
7676
+ var searchParams = new URLSearchParams(window.location.search);
7677
+ var user = reactRedux.useSelector(function (state) {
7678
+ var _state$common;
7679
+ return state === null || state === void 0 ? void 0 : (_state$common = state.common) === null || _state$common === void 0 ? void 0 : _state$common.user;
7384
7680
  });
7385
- return React__default.createElement(Select__default, Object.assign({
7386
- isDisabled: isDisabled,
7387
- options: options,
7388
- value: !isDefault ? initialValues : undefined,
7389
- defaultValue: isDefault ? initialValues : undefined,
7390
- menuPlacement: scrollBottom ? "top" : "auto",
7391
- isMulti: isMulti
7392
- }, rest));
7393
- };
7394
-
7395
- var DURATION_OPTIONS = Array.from({
7396
- length: 120
7397
- }, function (_, i) {
7398
- return i + 1;
7399
- });
7400
- var DEFAULT_ANSWER_COUNT = 5;
7401
-
7402
- var useExamDetailView = function useExamDetailView(props) {
7403
- var exam = props.exam,
7404
- selectedSubject = props.selectedSubject,
7405
- onChangeExam = props.onChangeExam;
7406
- var _useTranslation = reactI18next.useTranslation(),
7407
- t = _useTranslation.t;
7408
- var handleChangeQuestionCount = function handleChangeQuestionCount(article, questionCount, answerCount) {
7409
- if (!exam) return;
7410
- var examQuestions = exam.questions;
7411
- var questions = examQuestions.filter(function (i) {
7412
- return i.article === +article;
7413
- });
7414
- var prevQuestions = examQuestions.filter(function (i) {
7415
- return i.article < +article;
7416
- });
7417
- var nextQuestions = examQuestions.filter(function (i) {
7418
- return i.article > +article;
7419
- });
7420
- var lastOrder = questions[questions.length - 1].questionOrder;
7421
- if (questions.length === questionCount) return;
7422
- if (questions.length < questionCount) {
7423
- var additionalQuestions = Array.from({
7424
- length: questionCount - questions.length
7425
- }).map(function (_, index) {
7426
- var _questions$;
7427
- return {
7428
- article: +article,
7429
- correctAnswers: [1],
7430
- numberOfAnswers: answerCount,
7431
- categoryId: (_questions$ = questions[0]) === null || _questions$ === void 0 ? void 0 : _questions$.categoryId,
7432
- score: DEFAULT_SCORE,
7433
- questionOrder: lastOrder + index + 1
7434
- };
7435
- });
7436
- var newQuestions = [].concat(prevQuestions, questions, additionalQuestions, nextQuestions.map(function (i) {
7437
- return _extends({}, i, {
7438
- questionOrder: i.questionOrder + questionCount - questions.length
7681
+ var initialAcademySearchParam = function initialAcademySearchParam() {
7682
+ var paramAcademyDomain = searchParams.get("domain");
7683
+ var domain = getAcademyDomain();
7684
+ var pathname = window.location.pathname.toLowerCase();
7685
+ if (!user) return;
7686
+ var academyDomain = user.academyDomain;
7687
+ if (!academyDomain) {
7688
+ if (!superUrls.some(function (i) {
7689
+ return pathname.startsWith(i);
7690
+ })) {
7691
+ pushTo({
7692
+ pathname: homeUrl,
7693
+ search: ""
7694
+ });
7695
+ }
7696
+ if (domain) {
7697
+ searchParams.append("domain", domain);
7698
+ pushTo({
7699
+ pathname: homeUrl,
7700
+ search: ""
7439
7701
  });
7440
- }));
7441
- onChangeExam(_extends({}, exam, {
7442
- questions: [].concat(newQuestions)
7443
- }));
7702
+ }
7444
7703
  } else {
7445
- var remainQuestions = questions.slice(0, questionCount);
7446
- var _newQuestions = [].concat(prevQuestions, remainQuestions, nextQuestions.map(function (i) {
7447
- return _extends({}, i, {
7448
- questionOrder: i.questionOrder - questions.length + questionCount
7704
+ if (superUrls.some(function (i) {
7705
+ return pathname.startsWith(i);
7706
+ })) {
7707
+ pushTo({
7708
+ pathname: homeAcademyUrl,
7709
+ search: ""
7449
7710
  });
7450
- }));
7451
- onChangeExam(_extends({}, exam, {
7452
- questions: [].concat(_newQuestions)
7453
- }));
7711
+ }
7712
+ if (paramAcademyDomain && academyDomain.trim().toLocaleLowerCase() != (paramAcademyDomain === null || paramAcademyDomain === void 0 ? void 0 : paramAcademyDomain.trim().toLocaleLowerCase())) {
7713
+ logout();
7714
+ }
7715
+ if (!paramAcademyDomain && academyDomain) {
7716
+ searchParams.append("domain", academyDomain);
7717
+ pushTo(_extends({}, window.location, {
7718
+ search: searchParams.toString()
7719
+ }));
7720
+ }
7454
7721
  }
7455
7722
  };
7456
- var handleChangeCategory = function handleChangeCategory(article, categoryId) {
7457
- if (!exam) return;
7458
- var examQuestions = exam.questions;
7459
- var questions = examQuestions.filter(function (i) {
7460
- return i.article === +article;
7461
- });
7462
- var otherQuestions = examQuestions.filter(function (i) {
7463
- return i.article !== +article;
7464
- });
7465
- onChangeExam(_extends({}, exam, {
7466
- questions: [].concat(otherQuestions, questions.map(function (q) {
7467
- return _extends({}, q, {
7468
- categoryId: categoryId
7469
- });
7470
- }))
7471
- }));
7723
+ var pushTo = function pushTo(data) {
7724
+ if (history.push) history.push(data);else history(data);
7472
7725
  };
7473
- var handleDeleteArticle = function handleDeleteArticle(article) {
7474
- if (!exam) return;
7475
- var removedQuestions = exam.questions.filter(function (i) {
7476
- return i.article === +article;
7477
- }).map(function (i) {
7478
- return i.questionOrder;
7479
- });
7480
- var max = Math.max.apply(Math, removedQuestions);
7481
- var examQuestions = exam.questions.filter(function (i) {
7482
- return i.article !== +article;
7483
- }).map(function (i) {
7484
- return _extends({}, i, {
7485
- article: i.article > article ? i.article - 1 : i.article,
7486
- questionOrder: i.questionOrder > max ? i.questionOrder - removedQuestions.length : i.questionOrder
7726
+ React.useEffect(function () {
7727
+ initialAcademySearchParam();
7728
+ }, [window.location.pathname, user === null || user === void 0 ? void 0 : user.academyDomain]);
7729
+ };
7730
+
7731
+ var useList = function useList(fetchData, defaultQuery) {
7732
+ var dispatch = reactRedux.useDispatch();
7733
+ var _useState = React.useState(defaultQuery),
7734
+ filter = _useState[0],
7735
+ setFilter = _useState[1];
7736
+ var _useState2 = React.useState(0),
7737
+ totalPages = _useState2[0],
7738
+ setTotalPages = _useState2[1];
7739
+ var _useState3 = React.useState([]),
7740
+ data = _useState3[0],
7741
+ setData = _useState3[1];
7742
+ var _useState4 = React.useState(),
7743
+ selectedItem = _useState4[0],
7744
+ setSelectedItem = _useState4[1];
7745
+ var textSearchRef = React.useRef(null);
7746
+ var isFirstLoadRef = React.useRef(true);
7747
+ var handleChangeSelectedItem = function handleChangeSelectedItem(item) {
7748
+ setSelectedItem(item);
7749
+ };
7750
+ var getData = function getData(isLoading) {
7751
+ if (isLoading === void 0) {
7752
+ isLoading = false;
7753
+ }
7754
+ try {
7755
+ var _temp2 = function _temp2() {
7756
+ isLoading && dispatch(setLoading(false));
7757
+ };
7758
+ if (isFirstLoadRef.current) isFirstLoadRef.current = false;
7759
+ isLoading && dispatch(setLoading(true));
7760
+ var _temp = _catch(function () {
7761
+ return Promise.resolve(fetchData(filter)).then(function (res) {
7762
+ var _res$data = res.data,
7763
+ _res$data$items = _res$data.items,
7764
+ items = _res$data$items === void 0 ? [] : _res$data$items,
7765
+ _res$data$totalPages = _res$data.totalPages,
7766
+ totalPages = _res$data$totalPages === void 0 ? 0 : _res$data$totalPages;
7767
+ setTotalPages(totalPages);
7768
+ setData(items);
7769
+ });
7770
+ }, function (error) {
7771
+ var _error$response, _error$response$data;
7772
+ setTotalPages(0);
7773
+ setData([]);
7774
+ reactToastify.toast.error((error === null || error === void 0 ? void 0 : (_error$response = error.response) === null || _error$response === void 0 ? void 0 : (_error$response$data = _error$response.data) === null || _error$response$data === void 0 ? void 0 : _error$response$data.title) || "Get data failed");
7487
7775
  });
7776
+ return Promise.resolve(_temp && _temp.then ? _temp.then(_temp2) : _temp2(_temp));
7777
+ } catch (e) {
7778
+ return Promise.reject(e);
7779
+ }
7780
+ };
7781
+ var handleSort = function handleSort(sortColumnName) {
7782
+ var sortColumnDirection = OrderType.ASC;
7783
+ console.log({
7784
+ sortColumnName: typeof sortColumnName,
7785
+ filter: typeof filter.sortColumnName
7488
7786
  });
7489
- onChangeExam(_extends({}, exam, {
7490
- questions: [].concat(examQuestions)
7787
+ if (filter.sortColumnName == sortColumnName && filter.sortColumnDirection === OrderType.ASC) sortColumnDirection = OrderType.DESC;
7788
+ setFilter(_extends({}, filter, {
7789
+ sortColumnName: sortColumnName,
7790
+ sortColumnDirection: sortColumnDirection,
7791
+ currentPage: 1
7491
7792
  }));
7492
7793
  };
7493
- var handleChangeAnswerCount = function handleChangeAnswerCount(article, newAnswerCount, answerCount) {
7494
- if (!exam) return;
7495
- if (newAnswerCount === answerCount) return;
7496
- var examQuestions = exam.questions;
7497
- var questions = examQuestions.filter(function (i) {
7498
- return i.article === +article;
7499
- });
7500
- var otherQuestions = examQuestions.filter(function (i) {
7501
- return i.article !== +article;
7502
- });
7503
- if (answerCount < newAnswerCount) {
7504
- onChangeExam(_extends({}, exam, {
7505
- questions: [].concat(otherQuestions, questions.map(function (q) {
7506
- return _extends({}, q, {
7507
- numberOfAnswers: newAnswerCount
7508
- });
7509
- }))
7510
- }));
7511
- } else {
7512
- onChangeExam(_extends({}, exam, {
7513
- questions: [].concat(otherQuestions, questions.map(function (q) {
7514
- var _q$correctAnswers;
7515
- return _extends({}, q, {
7516
- numberOfAnswers: newAnswerCount,
7517
- correctAnswers: (_q$correctAnswers = q.correctAnswers) === null || _q$correctAnswers === void 0 ? void 0 : _q$correctAnswers.filter(function (i) {
7518
- return i <= newAnswerCount;
7519
- })
7520
- });
7521
- }))
7522
- }));
7523
- }
7794
+ var handleChangeSearchText = function handleChangeSearchText(e) {
7795
+ if (!textSearchRef.current) return;
7796
+ textSearchRef.current.value = e.target.value.trim();
7797
+ debounceSearch();
7524
7798
  };
7525
- var handleChangeCorrectAnswers = function handleChangeCorrectAnswers(article, index, answer) {
7526
- if (!exam) return;
7527
- var examQuestions = exam.questions;
7528
- var questions = examQuestions.filter(function (i) {
7529
- return i.article === +article;
7530
- });
7531
- var otherQuestions = examQuestions.filter(function (i) {
7532
- return i.article !== +article;
7533
- });
7534
- var selectedQuestion = questions[index];
7535
- onChangeExam(_extends({}, exam, {
7536
- questions: [].concat(otherQuestions, questions.slice(0, index), [_extends({}, selectedQuestion, {
7537
- correctAnswers: [answer]
7538
- })], questions.slice(index + 1))
7799
+ var handleChangePage = function handleChangePage(_, page) {
7800
+ setFilter(_extends({}, filter, {
7801
+ currentPage: page
7539
7802
  }));
7540
7803
  };
7541
- var handleChangeScoreAnswer = function handleChangeScoreAnswer(article, index, score) {
7542
- if (!exam) return;
7543
- var examQuestions = exam.questions;
7544
- var questions = examQuestions.filter(function (i) {
7545
- return i.article === +article;
7546
- });
7547
- var otherQuestions = examQuestions.filter(function (i) {
7548
- return i.article !== +article;
7549
- });
7550
- var selectedQuestion = questions[index];
7551
- if (score === selectedQuestion.score) return;
7552
- onChangeExam(_extends({}, exam, {
7553
- questions: [].concat(otherQuestions, questions.slice(0, index), [_extends({}, selectedQuestion, {
7554
- score: score
7555
- })], questions.slice(index + 1))
7804
+ var calcOrderNumber = function calcOrderNumber(index) {
7805
+ var _filter$currentPage, _filter$pageSize;
7806
+ return (((_filter$currentPage = filter.currentPage) != null ? _filter$currentPage : 0) - 1) * ((_filter$pageSize = filter.pageSize) != null ? _filter$pageSize : 0) + index + 1;
7807
+ };
7808
+ var debounceSearch = _.debounce(function () {
7809
+ var _textSearchRef$curren;
7810
+ setFilter(_extends({}, filter, {
7811
+ currentPage: 1,
7812
+ textSearch: (_textSearchRef$curren = textSearchRef.current) === null || _textSearchRef$curren === void 0 ? void 0 : _textSearchRef$curren.value
7556
7813
  }));
7814
+ }, 500);
7815
+ React.useEffect(function () {
7816
+ getData(isFirstLoadRef.current);
7817
+ }, [JSON.stringify(filter)]);
7818
+ return {
7819
+ filter: filter,
7820
+ textSearchRef: textSearchRef,
7821
+ totalPages: totalPages,
7822
+ data: data,
7823
+ selectedItem: selectedItem,
7824
+ handleSort: handleSort,
7825
+ handleChangeSearchText: handleChangeSearchText,
7826
+ handleChangePage: handleChangePage,
7827
+ calcOrderNumber: calcOrderNumber,
7828
+ handleChangeSelectedItem: handleChangeSelectedItem,
7829
+ getData: getData
7830
+ };
7831
+ };
7832
+
7833
+
7834
+
7835
+ var index$1 = {
7836
+ __proto__: null,
7837
+ useLogin: useLogin,
7838
+ useAutoAcademyDomain: useAutoAcademyDomain,
7839
+ useList: useList
7840
+ };
7841
+
7842
+ var useTextbookList = function useTextbookList(props) {
7843
+ var role = props.role,
7844
+ navigate = props.navigate;
7845
+ var _useList = useList(function (search) {
7846
+ return getTextbookListApi(search, role);
7847
+ }, TextbookDefaultQuery),
7848
+ filter = _useList.filter,
7849
+ textSearchRef = _useList.textSearchRef,
7850
+ totalPages = _useList.totalPages,
7851
+ textbooks = _useList.data,
7852
+ selectedTextbook = _useList.selectedItem,
7853
+ handleSort = _useList.handleSort,
7854
+ handleChangeSearchText = _useList.handleChangeSearchText,
7855
+ handleChangePage = _useList.handleChangePage,
7856
+ calcOrderNumber = _useList.calcOrderNumber,
7857
+ handleChangeSelectedItem = _useList.handleChangeSelectedItem,
7858
+ getData = _useList.getData;
7859
+ var textbookUrl = role === exports.Role.Teacher ? TEXTBOOK_URL$1 : ADMIN_TEXTBOOK_URL;
7860
+ var dispatch = reactRedux.useDispatch();
7861
+ var handleViewTextbook = function handleViewTextbook(id) {
7862
+ navigate(textbookUrl + "/" + id + "?readonly=true", {
7863
+ replace: true
7864
+ });
7865
+ };
7866
+ var handleUpdateTextbook = function handleUpdateTextbook(id) {
7867
+ navigate(textbookUrl + "/" + id, {
7868
+ replace: true
7869
+ });
7557
7870
  };
7558
- var handleChangeDuration = function handleChangeDuration(value) {
7559
- if (!exam) return;
7560
- onChangeExam(_extends({}, exam, {
7561
- duration: value === null || value === void 0 ? void 0 : value.value
7562
- }));
7871
+ var handleCreateTextbook = function handleCreateTextbook() {
7872
+ navigate(textbookUrl + "/create", {
7873
+ replace: true
7874
+ });
7563
7875
  };
7564
- var handleChangeTitle = function handleChangeTitle(e) {
7565
- if (!exam) return;
7566
- onChangeExam(_extends({}, exam, {
7567
- title: e.target.value
7568
- }));
7876
+ var toggleConfirmDialog = function toggleConfirmDialog() {
7877
+ handleChangeSelectedItem(undefined);
7569
7878
  };
7570
- var handleAddArticle = function handleAddArticle() {
7571
- var _$maxBy, _$maxBy2;
7572
- if (!exam) return;
7573
- var maxArticle = ((_$maxBy = _.maxBy(exam.questions, "article")) === null || _$maxBy === void 0 ? void 0 : _$maxBy.article) || 0;
7574
- var maxOrder = ((_$maxBy2 = _.maxBy(exam.questions, "questionOrder")) === null || _$maxBy2 === void 0 ? void 0 : _$maxBy2.questionOrder) || 0;
7575
- onChangeExam(_extends({}, exam, {
7576
- questions: [].concat(exam.questions, [{
7577
- article: maxArticle + 1,
7578
- correctAnswers: [1],
7579
- numberOfAnswers: DEFAULT_ANSWER_COUNT,
7580
- score: DEFAULT_SCORE,
7581
- questionOrder: maxOrder + 1
7582
- }])
7583
- }));
7879
+ var handleSelectDeleteTextbook = function handleSelectDeleteTextbook(textbook) {
7880
+ return [handleChangeSelectedItem(textbook)];
7584
7881
  };
7585
- var examGroupByArticle = React.useMemo(function () {
7586
- if (!exam) return [];
7587
- var articles = [];
7588
- var groupedArticle = _.groupBy(exam.questions, "article");
7589
- for (var key in groupedArticle) {
7590
- if (Object.prototype.hasOwnProperty.call(groupedArticle, key)) {
7591
- var _questions$find, _$maxBy3;
7592
- var questions = groupedArticle[key];
7593
- articles.push({
7594
- article: +key,
7595
- categoryId: (_questions$find = questions.find(function (i) {
7596
- return !!i.categoryId;
7597
- })) === null || _questions$find === void 0 ? void 0 : _questions$find.categoryId,
7598
- answerCount: ((_$maxBy3 = _.maxBy(questions, "numberOfAnswers")) === null || _$maxBy3 === void 0 ? void 0 : _$maxBy3.numberOfAnswers) || DEFAULT_ANSWER_COUNT,
7599
- questionCount: questions.length,
7600
- questions: questions
7882
+ var handleDeleteTextbook = function handleDeleteTextbook() {
7883
+ try {
7884
+ var _temp2 = function _temp2() {
7885
+ dispatch(setLoading(false));
7886
+ };
7887
+ if (!(selectedTextbook !== null && selectedTextbook !== void 0 && selectedTextbook.id)) return Promise.resolve();
7888
+ dispatch(setLoading(true));
7889
+ var _temp = _catch(function () {
7890
+ return Promise.resolve(deleteTextbookApi(selectedTextbook.id, role)).then(function () {
7891
+ return Promise.resolve(getData(false)).then(function () {
7892
+ toggleConfirmDialog();
7893
+ });
7601
7894
  });
7602
- }
7895
+ }, function (error) {
7896
+ var _error$response, _error$response$data;
7897
+ reactToastify.toast.error((error === null || error === void 0 ? void 0 : (_error$response = error.response) === null || _error$response === void 0 ? void 0 : (_error$response$data = _error$response.data) === null || _error$response$data === void 0 ? void 0 : _error$response$data.title) || "Textbook deleted failed");
7898
+ });
7899
+ return Promise.resolve(_temp && _temp.then ? _temp.then(_temp2) : _temp2(_temp));
7900
+ } catch (e) {
7901
+ return Promise.reject(e);
7603
7902
  }
7604
- return _.sortBy(articles, "article");
7605
- }, [JSON.stringify(exam)]);
7606
- var durationOptions = React.useMemo(function () {
7607
- var options = DURATION_OPTIONS.map(function (i) {
7608
- return {
7609
- label: i + "\uBD84",
7610
- value: i
7611
- };
7612
- });
7613
- if (!!exam.duration && exam.duration > DURATION_OPTIONS[DURATION_OPTIONS.length - 1]) return [].concat(options, [{
7614
- label: exam.duration + "\uBD84",
7615
- value: exam.duration
7616
- }]);
7617
- return options;
7618
- }, [exam.duration]);
7619
- React.useEffect(function () {
7620
- if ((selectedSubject === null || selectedSubject === void 0 ? void 0 : selectedSubject.id) !== exam.subjectId) onChangeExam(_extends({}, exam, {
7621
- subjectId: (selectedSubject === null || selectedSubject === void 0 ? void 0 : selectedSubject.id) || 0
7622
- }));
7623
- }, [selectedSubject === null || selectedSubject === void 0 ? void 0 : selectedSubject.id, exam.subjectId]);
7903
+ };
7624
7904
  return {
7625
- t: t,
7626
- durationOptions: durationOptions,
7627
- examGroupByArticle: examGroupByArticle,
7628
- handleAddArticle: handleAddArticle,
7629
- handleChangeScoreAnswer: handleChangeScoreAnswer,
7630
- handleChangeTitle: handleChangeTitle,
7631
- handleChangeDuration: handleChangeDuration,
7632
- handleChangeCorrectAnswers: handleChangeCorrectAnswers,
7633
- handleChangeAnswerCount: handleChangeAnswerCount,
7634
- handleChangeQuestionCount: handleChangeQuestionCount,
7635
- handleChangeCategory: handleChangeCategory,
7636
- handleDeleteArticle: handleDeleteArticle
7905
+ filter: filter,
7906
+ textSearchRef: textSearchRef,
7907
+ totalPages: totalPages,
7908
+ textbooks: textbooks,
7909
+ selectedTextbook: selectedTextbook,
7910
+ handleSort: handleSort,
7911
+ handleChangeSearchText: handleChangeSearchText,
7912
+ handleChangePage: handleChangePage,
7913
+ calcOrderNumber: calcOrderNumber,
7914
+ handleViewTextbook: handleViewTextbook,
7915
+ handleUpdateTextbook: handleUpdateTextbook,
7916
+ handleCreateTextbook: handleCreateTextbook,
7917
+ toggleConfirmDialog: toggleConfirmDialog,
7918
+ handleDeleteTextbook: handleDeleteTextbook,
7919
+ handleSelectDeleteTextbook: handleSelectDeleteTextbook
7637
7920
  };
7638
7921
  };
7639
7922
 
7640
- var ExamDetailView = function ExamDetailView(_ref) {
7641
- var _ref$className = _ref.className,
7642
- className = _ref$className === void 0 ? "" : _ref$className,
7643
- exam = _ref.exam,
7644
- isDisabled = _ref.isDisabled,
7645
- isEdit = _ref.isEdit,
7646
- onChangeExam = _ref.onChangeExam;
7647
- var _useSubjectSelect = useSubjectSelect(),
7648
- subjectOptions = _useSubjectSelect.subjectOptions,
7649
- selectedSubject = _useSubjectSelect.selectedSubject,
7650
- handleChangeSubject = _useSubjectSelect.handleChangeSubject;
7651
- var _useExamDetailView = useExamDetailView({
7652
- exam: exam,
7653
- onChangeExam: onChangeExam,
7654
- selectedSubject: selectedSubject
7655
- }),
7656
- t = _useExamDetailView.t,
7657
- durationOptions = _useExamDetailView.durationOptions,
7658
- examGroupByArticle = _useExamDetailView.examGroupByArticle,
7659
- handleAddArticle = _useExamDetailView.handleAddArticle,
7660
- handleChangeScoreAnswer = _useExamDetailView.handleChangeScoreAnswer,
7661
- handleChangeTitle = _useExamDetailView.handleChangeTitle,
7662
- handleChangeDuration = _useExamDetailView.handleChangeDuration,
7663
- handleChangeCorrectAnswers = _useExamDetailView.handleChangeCorrectAnswers,
7664
- handleChangeAnswerCount = _useExamDetailView.handleChangeAnswerCount,
7665
- handleChangeQuestionCount = _useExamDetailView.handleChangeQuestionCount,
7666
- handleChangeCategory = _useExamDetailView.handleChangeCategory,
7667
- handleDeleteArticle = _useExamDetailView.handleDeleteArticle;
7668
- return React__default.createElement(material.Grid, {
7669
- container: true,
7670
- spacing: 3,
7671
- className: className + " " + styles["custom-row"]
7923
+ var EmptyRow = function EmptyRow() {
7924
+ var _useTranslation = reactI18next.useTranslation(),
7925
+ t = _useTranslation.t;
7926
+ return React__default.createElement(material.TableRow, null, React__default.createElement(material.TableCell, {
7927
+ colSpan: 12,
7928
+ className: "text-center text-muted"
7929
+ }, t("no_data")));
7930
+ };
7931
+
7932
+ var LayoutList = function LayoutList(_ref) {
7933
+ var children = _ref.children,
7934
+ title = _ref.title;
7935
+ return React__default.createElement(material.Box, {
7936
+ className: 'bg-white p-3'
7937
+ }, React__default.createElement(material.Stack, {
7938
+ direction: "row",
7939
+ alignItems: "center",
7940
+ justifyContent: "space-between",
7941
+ mb: 2
7942
+ }, React__default.createElement(material.Typography, {
7943
+ variant: 'h4'
7944
+ }, title)), React__default.createElement(material.Box, null, children));
7945
+ };
7946
+
7947
+ var SortIcon = function SortIcon(_ref) {
7948
+ var isAscending = _ref.isAscending,
7949
+ onClick = _ref.onClick;
7950
+ return React__default.createElement("div", {
7951
+ className: "d-flex flex-column " + styles["sort-icons"],
7952
+ onClick: onClick
7953
+ }, React__default.createElement(fa.FaSortUp, {
7954
+ className: isAscending === true ? styles["active"] : ""
7955
+ }), React__default.createElement(fa.FaSortDown, {
7956
+ className: isAscending === false ? styles["active"] : ""
7957
+ }));
7958
+ };
7959
+
7960
+ var TableHeader = function TableHeader(_ref) {
7961
+ var headerTemplates = _ref.headerTemplates,
7962
+ filter = _ref.filter,
7963
+ onSort = _ref.onSort;
7964
+ var _useTranslation = reactI18next.useTranslation(),
7965
+ t = _useTranslation.t;
7966
+ return React__default.createElement(material.TableHead, null, React__default.createElement(material.TableRow, null, headerTemplates.map(function (i, index$1) {
7967
+ return React__default.createElement(material.TableCell, {
7968
+ key: index$1,
7969
+ className: "" + (!!i.sortKey && "pointer"),
7970
+ onClick: !!i.sortKey ? function () {
7971
+ return onSort === null || onSort === void 0 ? void 0 : onSort(i.sortKey);
7972
+ } : undefined
7973
+ }, React__default.createElement("div", {
7974
+ className: "d-flex justify-content-between align-items-center text-nowrap"
7975
+ }, t(i.title), !!i.sortKey && React__default.createElement(SortIcon, {
7976
+ isAscending: filter.sortColumnName !== i.sortKey ? undefined : filter.sortColumnDirection === OrderType.ASC
7977
+ })));
7978
+ })));
7979
+ };
7980
+
7981
+ var SearchInput = function SearchInput(_ref) {
7982
+ var textSearchRef = _ref.textSearchRef,
7983
+ _ref$placeholder = _ref.placeholder,
7984
+ placeholder = _ref$placeholder === void 0 ? "Search for..." : _ref$placeholder,
7985
+ onChange = _ref.onChange,
7986
+ _ref$fit = _ref.fit,
7987
+ fit = _ref$fit === void 0 ? true : _ref$fit;
7988
+ return React__default.createElement(material.Paper, {
7989
+ component: "div",
7990
+ className: "bg-light w-100 " + (fit && "h-100"),
7991
+ sx: {
7992
+ p: "2px 4px",
7993
+ display: "flex",
7994
+ alignItems: "center",
7995
+ width: 400,
7996
+ transition: "border 0.2s ease",
7997
+ outline: "1px solid transparent",
7998
+ ":focus-within": {
7999
+ outlineColor: function outlineColor(theme) {
8000
+ return theme.palette.primary.main;
8001
+ }
8002
+ }
8003
+ }
8004
+ }, React__default.createElement(material.Box, {
8005
+ sx: {
8006
+ p: "10px"
8007
+ },
8008
+ "aria-label": "search"
8009
+ }, React__default.createElement(io5.IoSearch, {
8010
+ size: 24,
8011
+ className: "pb-1"
8012
+ })), React__default.createElement(material.InputBase, {
8013
+ id: "searchText",
8014
+ className: "" + (fit && "h-100"),
8015
+ sx: {
8016
+ ml: 1,
8017
+ flex: 1,
8018
+ lineHeight: 1
8019
+ },
8020
+ placeholder: placeholder,
8021
+ ref: textSearchRef,
8022
+ onChange: onChange
8023
+ }));
8024
+ };
8025
+
8026
+ var TextbookList = function TextbookList(props) {
8027
+ var _useTranslation = reactI18next.useTranslation(),
8028
+ t = _useTranslation.t;
8029
+ var _useTextbookList = useTextbookList(props),
8030
+ filter = _useTextbookList.filter,
8031
+ textbooks = _useTextbookList.textbooks,
8032
+ totalPages = _useTextbookList.totalPages,
8033
+ textSearchRef = _useTextbookList.textSearchRef,
8034
+ selectedTextbook = _useTextbookList.selectedTextbook,
8035
+ handleChangeSearchText = _useTextbookList.handleChangeSearchText,
8036
+ handleSort = _useTextbookList.handleSort,
8037
+ handleChangePage = _useTextbookList.handleChangePage,
8038
+ calcOrderNumber = _useTextbookList.calcOrderNumber,
8039
+ handleViewTextbook = _useTextbookList.handleViewTextbook,
8040
+ handleUpdateTextbook = _useTextbookList.handleUpdateTextbook,
8041
+ handleCreateTextbook = _useTextbookList.handleCreateTextbook,
8042
+ toggleConfirmDialog = _useTextbookList.toggleConfirmDialog,
8043
+ handleDeleteTextbook = _useTextbookList.handleDeleteTextbook,
8044
+ handleSelectDeleteTextbook = _useTextbookList.handleSelectDeleteTextbook;
8045
+ return React__default.createElement(LayoutList, {
8046
+ title: t(TEXTBOOK_PAGE_TITLE)
8047
+ }, React__default.createElement(material.Grid, {
8048
+ container: true
7672
8049
  }, React__default.createElement(material.Grid, {
7673
8050
  item: true,
7674
- xs: 5,
7675
- className: 'mb-2'
7676
- }, React__default.createElement("label", {
7677
- className: styles["form-label"] + " " + styles$2["question-label"],
7678
- htmlFor: "title"
7679
- }, t("title")), React__default.createElement("input", {
7680
- disabled: isDisabled,
7681
- className: "" + styles["form-control"],
7682
- value: exam.title,
7683
- id: "title",
7684
- placeholder: t("enter_title"),
7685
- onChange: handleChangeTitle
7686
- })), React__default.createElement(material.Grid, {
7687
- item: true,
7688
- xs: 3,
7689
- className: 'mb-2'
7690
- }, React__default.createElement("label", {
7691
- className: styles["form-label"] + " " + styles$2["question-label"],
7692
- htmlFor: "duration"
7693
- }, t("duration")), React__default.createElement(CustomSelect, {
7694
- inputId: "duration",
7695
- value: exam.duration,
7696
- options: durationOptions,
7697
- onChange: handleChangeDuration,
7698
- isDisabled: isDisabled
8051
+ xs: 6
8052
+ }, React__default.createElement(SearchInput, {
8053
+ textSearchRef: textSearchRef,
8054
+ onChange: handleChangeSearchText,
8055
+ placeholder: t(TEXT_BOOK_SEARCH_PLACEHOLDER)
7699
8056
  })), React__default.createElement(material.Grid, {
7700
8057
  item: true,
7701
- xs: 3,
7702
- className: 'mb-2'
7703
- }, React__default.createElement("label", {
7704
- className: styles["form-label"] + " " + styles$2["question-label"],
7705
- htmlFor: "duration"
7706
- }, t("subject"), " ", selectedSubject === null || selectedSubject === void 0 ? void 0 : selectedSubject.name), React__default.createElement(CustomSelect, {
7707
- inputId: "subject",
7708
- value: selectedSubject === null || selectedSubject === void 0 ? void 0 : selectedSubject.id,
7709
- options: subjectOptions,
7710
- onChange: handleChangeSubject,
7711
- isDisabled: isDisabled || isEdit
7712
- })), examGroupByArticle.map(function (i, index) {
7713
- return React__default.createElement(material.Grid, {
7714
- item: true,
7715
- key: i.article,
7716
- xs: 12,
7717
- className: index === examGroupByArticle.length - 1 ? "mb-2" : ''
7718
- }, React__default.createElement(ArticleGroupView, Object.assign({}, i, {
7719
- isActive: index === examGroupByArticle.length - 1,
7720
- onChangeQuestionCount: handleChangeQuestionCount,
7721
- onChangeCategory: handleChangeCategory,
7722
- onChangeAnswerCount: handleChangeAnswerCount,
7723
- onChangeCorrectAnswers: handleChangeCorrectAnswers,
7724
- onChangeScoreAnswer: handleChangeScoreAnswer,
7725
- onDelete: handleDeleteArticle,
7726
- isDisabled: isDisabled,
7727
- selectedSubject: selectedSubject,
7728
- isDeletable: examGroupByArticle.length > 1
7729
- })));
7730
- }), React__default.createElement(material.Grid, {
8058
+ xs: 6
8059
+ }, React__default.createElement(material.Stack, {
8060
+ alignItems: "end"
8061
+ }, React__default.createElement(material.Button, {
8062
+ startIcon: React__default.createElement(fa.FaPlus, {
8063
+ size: 12
8064
+ }),
8065
+ variant: "contained",
8066
+ color: "primary",
8067
+ onClick: handleCreateTextbook
8068
+ }, t("create_textbook")))), React__default.createElement(material.Grid, {
7731
8069
  item: true,
7732
- xs: 12
7733
- }, React__default.createElement("button", {
7734
- disabled: isDisabled,
7735
- className: styles["btn-outline-primary"] + " w-100 d-flex justify-content-center align-items-center " + styles$2["question-btn"] + " mt-3",
7736
- onClick: handleAddArticle
7737
- }, React__default.createElement(fa.FaPlusCircle, {
7738
- className: "me-2"
7739
- }), "\uBB38\uD56D \uCD94\uAC00\uD558\uAE30")));
8070
+ xs: 12,
8071
+ className: "mt-3"
8072
+ }, React__default.createElement(material.Table, null, React__default.createElement(TableHeader, {
8073
+ headerTemplates: TEXTBOOK_HEADERS,
8074
+ filter: filter,
8075
+ onSort: handleSort
8076
+ }), React__default.createElement(material.TableBody, null, textbooks.map(function (i, index) {
8077
+ return React__default.createElement(material.TableRow, {
8078
+ key: i.id
8079
+ }, React__default.createElement(material.TableCell, null, calcOrderNumber(index)), React__default.createElement(material.TableCell, null, i.name), React__default.createElement(material.TableCell, null, i.subject.name), React__default.createElement(material.TableCell, null, utcToLocalTime(i.createdAt, t("date_format"))), React__default.createElement(material.TableCell, null, i.totalChapters), React__default.createElement(material.TableCell, null, React__default.createElement(material.Stack, {
8080
+ direction: "row",
8081
+ spacing: 1,
8082
+ alignItems: "center"
8083
+ }, !i.isCreatedByAdmin && React__default.createElement(material.IconButton, {
8084
+ color: "default",
8085
+ className: "bg-warning text-white",
8086
+ onClick: function onClick() {
8087
+ return handleUpdateTextbook(i.id);
8088
+ }
8089
+ }, React__default.createElement(fa6.FaPencil, {
8090
+ size: 12
8091
+ })), React__default.createElement(material.IconButton, {
8092
+ color: "default",
8093
+ className: "bg-primary text-white",
8094
+ onClick: function onClick() {
8095
+ return handleViewTextbook(i.id);
8096
+ }
8097
+ }, React__default.createElement(fa.FaEye, {
8098
+ size: 12
8099
+ })), !i.isCreatedByAdmin && React__default.createElement(material.IconButton, {
8100
+ color: "default",
8101
+ className: "bg-danger text-white",
8102
+ onClick: function onClick() {
8103
+ return handleSelectDeleteTextbook(i);
8104
+ }
8105
+ }, React__default.createElement(fa.FaTrash, {
8106
+ size: 12
8107
+ })))));
8108
+ }), !textbooks.length && React__default.createElement(EmptyRow, null))), React__default.createElement("div", {
8109
+ className: "d-flex justify-content-end mt-3"
8110
+ }, !!totalPages && React__default.createElement(material.Pagination, {
8111
+ count: totalPages,
8112
+ page: filter.currentPage,
8113
+ onChange: handleChangePage
8114
+ })))), React__default.createElement(ConfirmDialog, {
8115
+ open: !!(selectedTextbook !== null && selectedTextbook !== void 0 && selectedTextbook.id),
8116
+ toggle: toggleConfirmDialog,
8117
+ text: "" + t("are_you_sure_you_want_to_delete_the_textbook"),
8118
+ onConfirm: handleDeleteTextbook,
8119
+ confirmText: selectedTextbook === null || selectedTextbook === void 0 ? void 0 : selectedTextbook.name,
8120
+ isDelete: true
8121
+ }));
8122
+ };
8123
+
8124
+
8125
+
8126
+ var index$2 = {
8127
+ __proto__: null,
8128
+ TextbookList: TextbookList,
8129
+ TextbookDetail: TextbookViewDetail
8130
+ };
8131
+
8132
+ var _excluded$5 = ["defaultValue", "options", "isDisabled", "scrollBottom", "value", "isMulti"];
8133
+ var CustomCreatable = function CustomCreatable(_ref) {
8134
+ var options = _ref.options,
8135
+ isDisabled = _ref.isDisabled,
8136
+ scrollBottom = _ref.scrollBottom,
8137
+ value = _ref.value,
8138
+ isMulti = _ref.isMulti,
8139
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$5);
8140
+ var initialValues = Array.isArray(value) ? options.filter(function (i) {
8141
+ return value.includes(i.value);
8142
+ }) : isMulti ? options.filter(function (i) {
8143
+ return i.value == value;
8144
+ }) : options.find(function (i) {
8145
+ return i.value == value;
8146
+ });
8147
+ return React__default.createElement(CreatableSelect, Object.assign({
8148
+ isClearable: true,
8149
+ isDisabled: isDisabled,
8150
+ options: options,
8151
+ value: initialValues,
8152
+ menuPlacement: scrollBottom ? "top" : "auto",
8153
+ isMulti: isMulti
8154
+ }, rest));
8155
+ };
8156
+
8157
+ var _excluded$6 = ["isDefault", "defaultValue", "options", "isDisabled", "scrollBottom", "value", "isMulti"];
8158
+ var CustomAsyncSelect = function CustomAsyncSelect(_ref) {
8159
+ var isDefault = _ref.isDefault,
8160
+ options = _ref.options,
8161
+ isDisabled = _ref.isDisabled,
8162
+ scrollBottom = _ref.scrollBottom,
8163
+ value = _ref.value,
8164
+ isMulti = _ref.isMulti,
8165
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$6);
8166
+ var initialValues = Array.isArray(value) ? options.filter(function (i) {
8167
+ return value.includes(i.value);
8168
+ }) : isMulti ? options.filter(function (i) {
8169
+ return i.value == value;
8170
+ }) : options.find(function (i) {
8171
+ return i.value == value;
8172
+ });
8173
+ return React__default.createElement(Select__default, Object.assign({
8174
+ isDisabled: isDisabled,
8175
+ options: options,
8176
+ value: !isDefault ? initialValues : undefined,
8177
+ defaultValue: isDefault ? initialValues : undefined,
8178
+ menuPlacement: scrollBottom ? "top" : "auto",
8179
+ isMulti: isMulti
8180
+ }, rest));
7740
8181
  };
7741
8182
 
7742
8183
  var EXAM_SESSION_URL = BASE_URL + "/api/examSession";
@@ -7794,16 +8235,16 @@ var ORDER_NUMBERS = {
7794
8235
  10: "the_tenth"
7795
8236
  };
7796
8237
  var TabList = [{
7797
- label: "종합 분석",
8238
+ label: "comprehensive_analysis",
7798
8239
  value: 0
7799
8240
  }, {
7800
- label: "풀이 순서",
8241
+ label: "solution_order",
7801
8242
  value: 1
7802
8243
  }, {
7803
- label: "풀이 비교",
8244
+ label: "compare_solution",
7804
8245
  value: 2
7805
8246
  }, {
7806
- label: "문제 분석",
8247
+ label: "problem_analysis",
7807
8248
  value: 3
7808
8249
  }];
7809
8250
  var Roles$2;
@@ -8665,7 +9106,7 @@ var useExamResult = function useExamResult(searchParam, navigate, examSessionId,
8665
9106
  var questions = ((_timelyOrderQuestion$ = timelyOrderQuestion[dataChartIndex]) === null || _timelyOrderQuestion$ === void 0 ? void 0 : _timelyOrderQuestion$.questions) || null;
8666
9107
  var questionLength = (_questions$length = questions === null || questions === void 0 ? void 0 : questions.length) != null ? _questions$length : 0;
8667
9108
  return val != null ? t("problem_number_question", {
8668
- number: questions !== null ? ((_questions = questions[questionLength - val]) === null || _questions === void 0 ? void 0 : _questions.questionOrder) + 1 : val
9109
+ number: questions !== null ? (((_questions = questions[questionLength - val]) === null || _questions === void 0 ? void 0 : _questions.questionOrder) || 0) + 1 : val
8669
9110
  }) : t("no_data");
8670
9111
  }
8671
9112
  return null;
@@ -8732,7 +9173,7 @@ var useExamResult = function useExamResult(searchParam, navigate, examSessionId,
8732
9173
  var questions = ((_timelyOrderQuestion$2 = timelyOrderQuestion[dataChartIndex]) === null || _timelyOrderQuestion$2 === void 0 ? void 0 : _timelyOrderQuestion$2.questions) || null;
8733
9174
  var questionLength = (_questions$length2 = questions === null || questions === void 0 ? void 0 : questions.length) != null ? _questions$length2 : 0;
8734
9175
  return val != null ? t("problem_number_question", {
8735
- number: questions !== null ? ((_questions2 = questions[questionLength - val]) === null || _questions2 === void 0 ? void 0 : _questions2.questionOrder) + 1 : val
9176
+ number: questions !== null ? (((_questions2 = questions[questionLength - val]) === null || _questions2 === void 0 ? void 0 : _questions2.questionOrder) || 0) + 1 : val
8736
9177
  }) : t("no_data");
8737
9178
  },
8738
9179
  style: {
@@ -8760,15 +9201,23 @@ var useExamResult = function useExamResult(searchParam, navigate, examSessionId,
8760
9201
  topAnswerOrder: i.topAnswerOrder == null ? 0 : i.topAnswerOrder
8761
9202
  });
8762
9203
  });
8763
- var mySeriesData = [null].concat(questionsData.sort(function (a, b) {
8764
- return b.answerOrder === 0 ? -1 : a.answerOrder > b.answerOrder ? 1 : b.answerOrder > a.answerOrder ? -1 : 0;
8765
- }).map(function (item) {
8766
- return item.answerOrder === 0 ? null : data.questions.length - item.questionOrder;
9204
+ var mySeriesData = [null].concat(_.sortBy(questionsData.filter(function (i) {
9205
+ return i.answerOrder !== 0;
9206
+ }), ["answerOrder", "questionOrder"]).map(function (item) {
9207
+ return data.questions.length - item.questionOrder;
9208
+ }), questionsData.filter(function (i) {
9209
+ return i.answerOrder === 0;
9210
+ }).map(function () {
9211
+ return null;
8767
9212
  }), [null]);
8768
- var topSeriesData = [null].concat(questionsData.sort(function (a, b) {
8769
- return b.topAnswerOrder === 0 ? -1 : a.topAnswerOrder > b.topAnswerOrder ? 1 : b.topAnswerOrder > a.topAnswerOrder ? -1 : 0;
8770
- }).map(function (item) {
8771
- return item.topAnswerOrder === 0 ? null : data.questions.length - item.questionOrder;
9213
+ var topSeriesData = [null].concat(_.sortBy(questionsData.filter(function (i) {
9214
+ return i.topAnswerOrder !== 0;
9215
+ }), ["topAnswerOrder", "questionOrder"]).map(function (item) {
9216
+ return data.questions.length - item.questionOrder;
9217
+ }), questionsData.filter(function (i) {
9218
+ return i.topAnswerOrder === 0;
9219
+ }).map(function () {
9220
+ return null;
8772
9221
  }), [null]);
8773
9222
  return [{
8774
9223
  name: t("my_problem_solving_order"),
@@ -9934,7 +10383,7 @@ Object.defineProperty(exports,"__esModule",{value:!0});var _typeof="function"==t
9934
10383
 
9935
10384
  var ReactApexChart = unwrapExports(reactApexcharts_min);
9936
10385
 
9937
- var styles$3 = {"titleBox":"_1dveO","title":"_mxRxf","point":"_2fD-F","buttonGroup":"_2DGl3","btnFeedback":"_xGW1x","btnTerminate":"_3mLu2","myanswer":"_eDBpS","titleMyAnswer1":"_2fMq3","titleMyAnswer2":"_3gEYh","contentMyAnswer":"_2K_sx","myAnswerItem":"_2qiLh","time":"_6TCOK","timeCol":"_hmseC","answer-response":"_3GfJt","answer-response-0":"_3ut64","answer-response-1":"_2VtpD","answer-response-2":"_58lQU","answer-response-3":"_1ucMY","answer-response-4":"_1qkxy","answerCorrect":"_2jIeT","answerIncorrect":"_to2v0","answerNograss":"_1JSte","answerEasy":"_2_uTU","answerDiscrimination":"_1DBoA","answerTrap":"_1q3tD","answerNoTime":"_3iItu","questionOrder":"_1fNkS","myTimeLabel":"_1Z_F3","myPoolTime":"_4KwG0","topTimeLabel":"_245H-","topTime":"_3tZqw","meanTimeLabel":"_PlPLY","meanTime":"_12a7R","compareChart":"_3MW16","prevChart":"_1fNkb","chart":"_3K4oY","nextChart":"_3YKBp","titleChart":"_13BVP","compareGrass":"_1_fJu","titleCompareGrass":"_o1txm","tableCompareGrass":"_bT5nf","thcolumn1":"_3Umg0","tdcolumn1":"_3dRMF","tdcolumn3":"_2tcBP","classification":"_1AFeb","wrapperProblem":"_oTqG7","titleProblem":"_35eIx","titleProblemClose":"_3t4HO","titleTrickyProblem":"_1-oxK","wrongQuestions":"_2dpMR","question":"_1lSOX","assignedQuestions":"_1ONUt","wrapperContent":"_nPoR0","content":"_2zmZn","contentColumn1":"_334SY","span1":"_3Lf-U","span2":"_ZpMot","contentColumn2":"_16P3l","duration":"_1kT28","topDuration":"_1fVRi","overallCorrectRate":"_3jLGe","answer":"_VsZ0K","contentVulnerable":"_QxKMy","wrappContentProblem":"_nnqpW","contentProblem":"_3Z1nV","labelProblem":"_36Xpx","name":"_3ZJQW","percent":"_2J3MK","slider":"_1MPdO","track":"_3CV_y","noData":"__g-ff","loading":"_3j485","table-responsive":"_2O6RX","form-label":"_1RYOQ","form-control":"_3VRVT","form-label-dialog":"_3oCSh","btn-cancel":"_3USKq","btn-register":"_3y_iD","pdfBtnBox":"_3xZHo","pdfBtn":"_1DtWq","form-select":"_1a_vw"};
10386
+ var styles$4 = {"titleBox":"_1dveO","title":"_mxRxf","point":"_2fD-F","buttonGroup":"_2DGl3","btnFeedback":"_xGW1x","btnTerminate":"_3mLu2","myanswer":"_eDBpS","titleMyAnswer1":"_2fMq3","titleMyAnswer2":"_3gEYh","contentMyAnswer":"_2K_sx","myAnswerItem":"_2qiLh","time":"_6TCOK","timeCol":"_hmseC","answer-response":"_3GfJt","answer-response-0":"_3ut64","answer-response-1":"_2VtpD","answer-response-2":"_58lQU","answer-response-3":"_1ucMY","answer-response-4":"_1qkxy","answerCorrect":"_2jIeT","answerIncorrect":"_to2v0","answerNograss":"_1JSte","answerEasy":"_2_uTU","answerDiscrimination":"_1DBoA","answerTrap":"_1q3tD","answerNoTime":"_3iItu","questionOrder":"_1fNkS","myTimeLabel":"_1Z_F3","myPoolTime":"_4KwG0","topTimeLabel":"_245H-","topTime":"_3tZqw","meanTimeLabel":"_PlPLY","meanTime":"_12a7R","compareChart":"_3MW16","prevChart":"_1fNkb","chart":"_3K4oY","nextChart":"_3YKBp","titleChart":"_13BVP","compareGrass":"_1_fJu","titleCompareGrass":"_o1txm","tableCompareGrass":"_bT5nf","thcolumn1":"_3Umg0","tdcolumn1":"_3dRMF","tdcolumn3":"_2tcBP","classification":"_1AFeb","wrapperProblem":"_oTqG7","titleProblem":"_35eIx","titleProblemClose":"_3t4HO","titleTrickyProblem":"_1-oxK","wrongQuestions":"_2dpMR","question":"_1lSOX","assignedQuestions":"_1ONUt","wrapperContent":"_nPoR0","content":"_2zmZn","contentColumn1":"_334SY","span1":"_3Lf-U","span2":"_ZpMot","contentColumn2":"_16P3l","duration":"_1kT28","topDuration":"_1fVRi","overallCorrectRate":"_3jLGe","answer":"_VsZ0K","contentVulnerable":"_QxKMy","wrappContentProblem":"_nnqpW","contentProblem":"_3Z1nV","labelProblem":"_36Xpx","name":"_3ZJQW","percent":"_2J3MK","slider":"_1MPdO","track":"_3CV_y","noData":"__g-ff","loading":"_3j485","table-responsive":"_2O6RX","form-label":"_1RYOQ","form-control":"_3VRVT","form-label-dialog":"_3oCSh","btn-cancel":"_3USKq","btn-register":"_3y_iD","pdfBtnBox":"_3xZHo","pdfBtn":"_1DtWq","form-select":"_1a_vw"};
9938
10387
 
9939
10388
  var iconStarQuestion = function iconStarQuestion(_ref) {
9940
10389
  var _ref$width = _ref.width,
@@ -10225,7 +10674,7 @@ function CreateNewQuestionDialog(_ref) {
10225
10674
  padding: "24px 24px 40px 24px"
10226
10675
  }, React__default.createElement(material.Stack, null, React__default.createElement("label", {
10227
10676
  htmlFor: "questions",
10228
- className: styles['form-label'] + " " + styles$3['form-label-dialog']
10677
+ className: styles['form-label'] + " " + styles$4['form-label-dialog']
10229
10678
  }, "\uC9C8\uBB38\uD560 \uBB38\uC81C"), React__default.createElement(formik.Field, {
10230
10679
  as: "select",
10231
10680
  id: "questions",
@@ -10242,7 +10691,7 @@ function CreateNewQuestionDialog(_ref) {
10242
10691
  }));
10243
10692
  }))), React__default.createElement(material.Stack, null, React__default.createElement("label", {
10244
10693
  htmlFor: "content-question",
10245
- className: styles['form-label'] + " " + styles$3['form-label-dialog']
10694
+ className: styles['form-label'] + " " + styles$4['form-label-dialog']
10246
10695
  }, "\uC9C8\uBB38 \uB0B4\uC6A9"), React__default.createElement(material.Box, {
10247
10696
  position: 'relative',
10248
10697
  display: 'flex',
@@ -10278,14 +10727,14 @@ function CreateNewQuestionDialog(_ref) {
10278
10727
  borderTop: "1px solid #CED2DA"
10279
10728
  }
10280
10729
  }, React__default.createElement(Button, {
10281
- className: styles$3['btn-cancel'],
10730
+ className: styles$4['btn-cancel'],
10282
10731
  onClick: toggleCreateQuestion
10283
10732
  }, React__default.createElement(Typography, {
10284
10733
  fontWeight: 700,
10285
10734
  fontSize: '14px',
10286
10735
  lineHeight: '16.71px'
10287
10736
  }, "\uCDE8\uC18C")), React__default.createElement(Button, {
10288
- className: styles$3['btn-register'],
10737
+ className: styles$4['btn-register'],
10289
10738
  type: "submit"
10290
10739
  }, React__default.createElement(Typography, {
10291
10740
  fontWeight: 700,
@@ -10317,7 +10766,7 @@ function MyAnswer(_ref) {
10317
10766
  toggleCreateQuestion();
10318
10767
  };
10319
10768
  return React__default.createElement("div", {
10320
- className: styles$3["myanswer"]
10769
+ className: styles$4["myanswer"]
10321
10770
  }, formattedData && formattedData.length > 0 && formattedData.map(function (item) {
10322
10771
  return React__default.createElement("div", {
10323
10772
  key: item.category.id
@@ -10325,7 +10774,7 @@ function MyAnswer(_ref) {
10325
10774
  bgcolor: "#F9FAFB",
10326
10775
  flexDirection: "row",
10327
10776
  padding: "12px",
10328
- className: styles$3["myAnswerItem"] + " " + styles["noGutters"]
10777
+ className: styles$4["myAnswerItem"] + " " + styles["noGutters"]
10329
10778
  }, React__default.createElement("div", {
10330
10779
  className: styles["custom-col-2"],
10331
10780
  style: {
@@ -10389,7 +10838,7 @@ function MyAnswer(_ref) {
10389
10838
  color: "#97A1AF"
10390
10839
  }
10391
10840
  }, "\uC804\uCCB4 \uC815\uB2F5\uB960"))), React__default.createElement("div", {
10392
- className: styles$3["titleMyAnswer2"]
10841
+ className: styles$4["titleMyAnswer2"]
10393
10842
  }, React__default.createElement(material.Typography, {
10394
10843
  sx: {
10395
10844
  color: "#97A1AF",
@@ -10402,7 +10851,7 @@ function MyAnswer(_ref) {
10402
10851
  fontWeight: 700
10403
10852
  }
10404
10853
  }, item.category.name)), React__default.createElement("div", {
10405
- className: styles$3["contentMyAnswer"]
10854
+ className: styles$4["contentMyAnswer"]
10406
10855
  }, item.questions.map(function (question, index) {
10407
10856
  return React__default.createElement("div", {
10408
10857
  style: isOpenTime[question.id] ? {
@@ -10411,7 +10860,7 @@ function MyAnswer(_ref) {
10411
10860
  } : {},
10412
10861
  key: question.id
10413
10862
  }, React__default.createElement("div", {
10414
- className: styles$3["myAnswerItem"] + " " + styles["noGutters"]
10863
+ className: styles$4["myAnswerItem"] + " " + styles["noGutters"]
10415
10864
  }, React__default.createElement("div", {
10416
10865
  className: styles["custom-col-2"],
10417
10866
  style: {
@@ -10421,7 +10870,7 @@ function MyAnswer(_ref) {
10421
10870
  padding: "4px 8px"
10422
10871
  }
10423
10872
  }, question.isStar ? React__default.createElement(iconStarQuestion, null) : React__default.createElement(iconNoStarQuestion, null), React__default.createElement("span", {
10424
- className: styles$3["questionOrder"]
10873
+ className: styles$4["questionOrder"]
10425
10874
  }, question.questionOrder + 1, "\uBC88")), React__default.createElement("div", {
10426
10875
  className: styles["custom-col-2"],
10427
10876
  style: {
@@ -10430,11 +10879,11 @@ function MyAnswer(_ref) {
10430
10879
  gap: "4px"
10431
10880
  }
10432
10881
  }, question.isCorrect && question.selectedAnswers !== "" && React__default.createElement(React.Fragment, null, React__default.createElement(iconCorrectAnswer, null), React__default.createElement("span", {
10433
- className: styles$3["answerCorrect"]
10882
+ className: styles$4["answerCorrect"]
10434
10883
  }, "\uC815\uB2F5")), !question.isCorrect && question.selectedAnswers !== "" && React__default.createElement(React.Fragment, null, React__default.createElement(iconCorrectAnswer$1, null), React__default.createElement("span", {
10435
- className: styles$3["answerIncorrect"]
10884
+ className: styles$4["answerIncorrect"]
10436
10885
  }, "\uC624\uB2F5")), question.selectedAnswers === "" && React__default.createElement(React.Fragment, null, React__default.createElement(iconNoGrass, null), React__default.createElement("span", {
10437
- className: styles$3["answerNograss"]
10886
+ className: styles$4["answerNograss"]
10438
10887
  }, "\uD480\uC774 \uC5C6\uC74C"))), React__default.createElement("div", {
10439
10888
  className: styles["custom-col-2"],
10440
10889
  style: {
@@ -10445,12 +10894,12 @@ function MyAnswer(_ref) {
10445
10894
  style: {
10446
10895
  margin: 0
10447
10896
  },
10448
- className: styles$3["answer-response"] + " " + styles$3["answer-response-" + question.answerResponseSignal]
10897
+ className: styles$4["answer-response"] + " " + styles$4["answer-response-" + question.answerResponseSignal]
10449
10898
  }, formatTimeSecond(Math.round(question.duration), t)) : React__default.createElement("p", {
10450
10899
  style: {
10451
10900
  margin: 0
10452
10901
  },
10453
- className: styles$3["answerNoTime"]
10902
+ className: styles$4["answerNoTime"]
10454
10903
  }, "\uC2DC\uAC04 \uC5C6\uC74C")), React__default.createElement("div", {
10455
10904
  className: styles["custom-col-2"],
10456
10905
  style: {
@@ -10461,13 +10910,13 @@ function MyAnswer(_ref) {
10461
10910
  style: {
10462
10911
  margin: 0
10463
10912
  },
10464
- className: styles$3["answer-response"] + " " + styles$3["answer-response-" + question.answerResponseSignal]
10913
+ className: styles$4["answer-response"] + " " + styles$4["answer-response-" + question.answerResponseSignal]
10465
10914
  }, formatTimeSecond(Math.round(question.topDuration - question.duration), t)) : React__default.createElement("p", {
10466
10915
  style: {
10467
10916
  margin: 0,
10468
10917
  textAlign: "center"
10469
10918
  },
10470
- className: styles$3["answerNoTime"]
10919
+ className: styles$4["answerNoTime"]
10471
10920
  }, "-")), React__default.createElement("div", {
10472
10921
  className: styles["custom-col-2"],
10473
10922
  style: {
@@ -10478,12 +10927,12 @@ function MyAnswer(_ref) {
10478
10927
  style: {
10479
10928
  margin: 0
10480
10929
  },
10481
- className: styles$3["answer-response"] + " " + styles$3["answer-response-" + question.answerResponseSignal]
10482
- }, question.overallCorrectRate + "%") : React__default.createElement("p", {
10930
+ className: styles$4["answer-response"] + " " + styles$4["answer-response-" + question.answerResponseSignal]
10931
+ }, question.overallCorrectRate.toFixed(2) + "%") : React__default.createElement("p", {
10483
10932
  style: {
10484
10933
  margin: 0
10485
10934
  },
10486
- className: styles$3["answerNoTime"]
10935
+ className: styles$4["answerNoTime"]
10487
10936
  }, "\uC2DC\uAC04 \uC5C6\uC74C")), isStudent && React__default.createElement("div", {
10488
10937
  className: styles["custom-col-2"],
10489
10938
  style: {
@@ -10554,11 +11003,11 @@ var iconBtnNextChart = function iconBtnNextChart(_ref) {
10554
11003
  function CompareGrass(_ref) {
10555
11004
  var effectSize = _ref.effectSize;
10556
11005
  return React__default.createElement("div", {
10557
- className: styles$3["compareGrass"]
11006
+ className: styles$4["compareGrass"]
10558
11007
  }, React__default.createElement("div", {
10559
- className: styles$3["tableCompareGrass"]
11008
+ className: styles$4["tableCompareGrass"]
10560
11009
  }, React__default.createElement("div", {
10561
- className: styles$3["table-responsive"]
11010
+ className: styles$4["table-responsive"]
10562
11011
  }, React__default.createElement(material.Table, {
10563
11012
  style: {
10564
11013
  width: "100%"
@@ -10568,7 +11017,7 @@ function CompareGrass(_ref) {
10568
11017
  borderBottom: "1px solid #E4E7EC"
10569
11018
  }
10570
11019
  }, React__default.createElement("tr", null, React__default.createElement("th", {
10571
- className: styles$3["thcolumn1"]
11020
+ className: styles$4["thcolumn1"]
10572
11021
  }, "\uBB38\uC81C \uBC88\uD638"), React__default.createElement("th", {
10573
11022
  style: {
10574
11023
  textAlign: "center"
@@ -10592,14 +11041,14 @@ function CompareGrass(_ref) {
10592
11041
  borderBottom: "1px solid #e4e7ec"
10593
11042
  } : {}
10594
11043
  }, React__default.createElement("td", {
10595
- className: styles$3["tdcolumn1"]
11044
+ className: styles$4["tdcolumn1"]
10596
11045
  }, "\uBB38\uC81C ", item.questionOrder + 1), React__default.createElement("td", {
10597
11046
  style: {
10598
11047
  textAlign: "center",
10599
11048
  color: "#202B37"
10600
11049
  }
10601
11050
  }, item.correctAnswers, "\uBC88"), React__default.createElement("td", {
10602
- className: styles$3["tdcolumn3"],
11051
+ className: styles$4["tdcolumn3"],
10603
11052
  style: {
10604
11053
  color: item.isCorrect ? "#1EE288" : "#F34B4B"
10605
11054
  }
@@ -10609,7 +11058,7 @@ function CompareGrass(_ref) {
10609
11058
  color: "#414E62"
10610
11059
  }
10611
11060
  }, item.mostSelectedAnswers ? item.mostSelectedAnswers + "\uBC88" : ""), React__default.createElement("td", null, React__default.createElement("div", {
10612
- className: styles$3["classification"]
11061
+ className: styles$4["classification"]
10613
11062
  }, item.problemCategories.map(function (problem, index) {
10614
11063
  return React__default.createElement("div", {
10615
11064
  key: index
@@ -10736,9 +11185,9 @@ function TrickyProblem(_ref) {
10736
11185
  return i.isStar && i.isCorrect;
10737
11186
  });
10738
11187
  return React__default.createElement("div", {
10739
- className: styles$3["wrapperProblem"]
11188
+ className: styles$4["wrapperProblem"]
10740
11189
  }, React__default.createElement("div", {
10741
- className: !openProblem.problem1 ? styles$3["titleProblemClose"] : styles$3["titleProblem"],
11190
+ className: !openProblem.problem1 ? styles$4["titleProblemClose"] : styles$4["titleProblem"],
10742
11191
  onClick: function onClick() {
10743
11192
  return changeOpen(_extends({}, openProblem, {
10744
11193
  problem1: !openProblem.problem1
@@ -10751,27 +11200,27 @@ function TrickyProblem(_ref) {
10751
11200
  fontWeight: 700
10752
11201
  }
10753
11202
  }, "\uAE4C\uB2E4\uB85C\uC6E0\uB358 \uBB38\uC81C"), openProblem.problem1 ? React__default.createElement(iconUpArrow, null) : React__default.createElement(iconDownArrow, null)), openProblem.problem1 && React__default.createElement(React.Fragment, null, React__default.createElement("div", {
10754
- className: styles$3["titleTrickyProblem"]
11203
+ className: styles$4["titleTrickyProblem"]
10755
11204
  }, React__default.createElement(iconX, null), React__default.createElement("span", null, "\uBCC4\uD45C \uCE5C \uBB38\uC81C \uC911 \uD2C0\uB9B0 \uBB38\uC81C")), React__default.createElement("div", {
10756
- className: styles$3["wrongQuestions"]
11205
+ className: styles$4["wrongQuestions"]
10757
11206
  }, !!inCorrectQuestions.length && inCorrectQuestions.map(function (question) {
10758
11207
  return React__default.createElement("span", {
10759
11208
  key: question.id,
10760
- className: styles$3["question"]
11209
+ className: styles$4["question"]
10761
11210
  }, question.questionOrder + 1, "\uBC88");
10762
11211
  }), !data.questions.length && React__default.createElement("div", {
10763
- className: styles$3["noData"]
11212
+ className: styles$4["noData"]
10764
11213
  }, "\uB370\uC774\uD130 \uC5C6\uC74C")), React__default.createElement("div", {
10765
- className: styles$3["titleTrickyProblem"]
11214
+ className: styles$4["titleTrickyProblem"]
10766
11215
  }, React__default.createElement(iconAssignedQuestions, null), React__default.createElement("span", null, "\uBCC4\uD45C \uCE5C \uBB38\uC81C \uC911 \uB9DE\uCD98 \uBB38\uC81C")), React__default.createElement("div", {
10767
- className: styles$3["assignedQuestions"]
11216
+ className: styles$4["assignedQuestions"]
10768
11217
  }, !!correctQuestions.length && correctQuestions.map(function (question) {
10769
11218
  return React__default.createElement("div", {
10770
11219
  key: question.id,
10771
- className: styles$3["question"]
11220
+ className: styles$4["question"]
10772
11221
  }, question.questionOrder + 1, "\uBC88");
10773
11222
  }), !data.questions.length && React__default.createElement("div", {
10774
- className: styles$3["noData"]
11223
+ className: styles$4["noData"]
10775
11224
  }, "\uB370\uC774\uD130 \uC5C6\uC74C"))));
10776
11225
  }
10777
11226
 
@@ -10782,9 +11231,9 @@ function ProtractedProblem(_ref) {
10782
11231
  var _useTranslation = reactI18next.useTranslation(),
10783
11232
  t = _useTranslation.t;
10784
11233
  return React__default.createElement("div", {
10785
- className: styles$3["wrapperProblem"]
11234
+ className: styles$4["wrapperProblem"]
10786
11235
  }, React__default.createElement("div", {
10787
- className: !openProblem.problem2 ? styles$3["titleProblemClose"] : styles$3["titleProblem"],
11236
+ className: !openProblem.problem2 ? styles$4["titleProblemClose"] : styles$4["titleProblem"],
10788
11237
  onClick: function onClick() {
10789
11238
  return changeOpen(_extends({}, openProblem, {
10790
11239
  problem2: !openProblem.problem2
@@ -10797,30 +11246,30 @@ function ProtractedProblem(_ref) {
10797
11246
  fontWeight: 700
10798
11247
  }
10799
11248
  }, "\uC2DC\uAC04\uC774 \uC624\uB798 \uAC78\uB9B0 \uBB38\uC81C"), openProblem.problem2 ? React__default.createElement(iconUpArrow, null) : React__default.createElement(iconDownArrow, null)), openProblem.problem2 && React__default.createElement(React.Fragment, null, React__default.createElement("div", {
10800
- className: styles$3["wrapperContent"]
11249
+ className: styles$4["wrapperContent"]
10801
11250
  }, data.length ? data.map(function (item) {
10802
11251
  return React__default.createElement("div", {
10803
- className: styles$3["content"],
11252
+ className: styles$4["content"],
10804
11253
  key: item.id
10805
11254
  }, React__default.createElement("div", {
10806
- className: styles$3["contentColumn1"]
11255
+ className: styles$4["contentColumn1"]
10807
11256
  }, React__default.createElement("div", null, React__default.createElement("span", {
10808
- className: styles$3["span1"]
11257
+ className: styles$4["span1"]
10809
11258
  }, "\uBB38\uC81C"), React__default.createElement("span", {
10810
- className: styles$3["span2"]
11259
+ className: styles$4["span2"]
10811
11260
  }, item.questionOrder + 1, "\uBC88"))), React__default.createElement("div", {
10812
- className: styles$3["contentColumn2"]
11261
+ className: styles$4["contentColumn2"]
10813
11262
  }, React__default.createElement("div", null, React__default.createElement("span", {
10814
- className: styles$3["span1"]
11263
+ className: styles$4["span1"]
10815
11264
  }, "\uB098\uC758 \uC2DC\uAC04"), React__default.createElement("span", {
10816
- className: styles$3["span2"]
11265
+ className: styles$4["span2"]
10817
11266
  }, "\uC0C1\uC704\uAD8C \uC2DC\uAC04")), React__default.createElement("div", null, React__default.createElement("span", {
10818
- className: styles$3["duration"]
11267
+ className: styles$4["duration"]
10819
11268
  }, formatTimeSecond(item.duration, t)), React__default.createElement("span", {
10820
- className: styles$3["topDuration"]
11269
+ className: styles$4["topDuration"]
10821
11270
  }, formatTimeSecond(item.topDuration, t)))));
10822
11271
  }) : React__default.createElement("div", {
10823
- className: styles$3["noData"]
11272
+ className: styles$4["noData"]
10824
11273
  }, "\uB370\uC774\uD130 \uC5C6\uC74C"))));
10825
11274
  }
10826
11275
 
@@ -10834,9 +11283,9 @@ function Vulnerable(_ref) {
10834
11283
  return q2.overallCorrectRate === q1.overallCorrectRate ? q1.questionOrder - q2.questionOrder : q2.overallCorrectRate - q1.overallCorrectRate;
10835
11284
  });
10836
11285
  return React__default.createElement("div", {
10837
- className: styles$3["wrapperProblem"]
11286
+ className: styles$4["wrapperProblem"]
10838
11287
  }, React__default.createElement("div", {
10839
- className: !openProblem.problem3 ? styles$3["titleProblemClose"] : styles$3["titleProblem"],
11288
+ className: !openProblem.problem3 ? styles$4["titleProblemClose"] : styles$4["titleProblem"],
10840
11289
  onClick: function onClick() {
10841
11290
  return changeOpen(_extends({}, openProblem, {
10842
11291
  problem3: !openProblem.problem3
@@ -10849,30 +11298,30 @@ function Vulnerable(_ref) {
10849
11298
  fontWeight: 700
10850
11299
  }
10851
11300
  }, "\uB0B4\uAC00 \uCDE8\uC57D\uD55C \uBB38\uC81C"), openProblem.problem3 ? React__default.createElement(iconUpArrow, null) : React__default.createElement(iconDownArrow, null)), openProblem.problem3 && React__default.createElement(React.Fragment, null, React__default.createElement("div", {
10852
- className: styles$3["wrapperContent"]
11301
+ className: styles$4["wrapperContent"]
10853
11302
  }, incorrectQuestions.length ? React__default.createElement(React.Fragment, null, incorrectQuestions.map(function (question) {
10854
11303
  return React__default.createElement("div", {
10855
- className: styles$3["content"],
11304
+ className: styles$4["content"],
10856
11305
  key: question.id
10857
11306
  }, React__default.createElement("div", {
10858
- className: styles$3["contentColumn1"]
11307
+ className: styles$4["contentColumn1"]
10859
11308
  }, React__default.createElement("div", null, React__default.createElement("span", {
10860
- className: styles$3["span1"]
11309
+ className: styles$4["span1"]
10861
11310
  }, "\uBB38\uC81C"), React__default.createElement("span", {
10862
- className: styles$3["span2"]
11311
+ className: styles$4["span2"]
10863
11312
  }, question.questionOrder + 1, "\uBC88"))), React__default.createElement("div", {
10864
- className: styles$3["contentColumn2"]
11313
+ className: styles$4["contentColumn2"]
10865
11314
  }, React__default.createElement("div", null, React__default.createElement("span", {
10866
- className: styles$3["span1"]
11315
+ className: styles$4["span1"]
10867
11316
  }, "\uC804\uCCB4 \uC815\uB2F5\uB960"), React__default.createElement("span", {
10868
- className: styles$3["span2"]
11317
+ className: styles$4["span2"]
10869
11318
  }, "\uB098\uC758 \uC624\uB2F5")), React__default.createElement("div", null, React__default.createElement("span", {
10870
- className: styles$3["overallCorrectRate"]
11319
+ className: styles$4["overallCorrectRate"]
10871
11320
  }, question.overallCorrectRate.toFixed(2), "%"), React__default.createElement("span", {
10872
- className: styles$3["answer"]
11321
+ className: styles$4["answer"]
10873
11322
  }, question.selectedAnswers, "\uBC88 (\uC815\uB2F5", " ", question.correctAnswers, "\uBC88)"))));
10874
11323
  })) : React__default.createElement("div", {
10875
- className: styles$3["noData"]
11324
+ className: styles$4["noData"]
10876
11325
  }, "\uB370\uC774\uD130 \uC5C6\uC74C"))));
10877
11326
  }
10878
11327
 
@@ -10881,9 +11330,9 @@ function GradesByTerritory(_ref) {
10881
11330
  openProblem = _ref.openProblem,
10882
11331
  changeOpen = _ref.changeOpen;
10883
11332
  return React__default.createElement("div", {
10884
- className: styles$3["wrapperProblem"]
11333
+ className: styles$4["wrapperProblem"]
10885
11334
  }, React__default.createElement("div", {
10886
- className: !openProblem.problem4 ? styles$3["titleProblemClose"] : styles$3["titleProblem"],
11335
+ className: !openProblem.problem4 ? styles$4["titleProblemClose"] : styles$4["titleProblem"],
10887
11336
  onClick: function onClick() {
10888
11337
  return changeOpen(_extends({}, openProblem, {
10889
11338
  problem4: !openProblem.problem4
@@ -10896,27 +11345,27 @@ function GradesByTerritory(_ref) {
10896
11345
  fontWeight: 700
10897
11346
  }
10898
11347
  }, "\uC601\uC5ED\uBCC4 \uC131\uC801"), openProblem.problem4 ? React__default.createElement(iconUpArrow, null) : React__default.createElement(iconDownArrow, null)), openProblem.problem4 && React__default.createElement("div", {
10899
- className: styles$3["wrappContentProblem"]
11348
+ className: styles$4["wrappContentProblem"]
10900
11349
  }, data.length && data.map(function (item) {
10901
11350
  return React__default.createElement("div", {
10902
- className: styles$3["contentProblem"],
11351
+ className: styles$4["contentProblem"],
10903
11352
  key: item.id
10904
11353
  }, React__default.createElement("div", {
10905
- className: styles$3["labelProblem"]
11354
+ className: styles$4["labelProblem"]
10906
11355
  }, React__default.createElement("span", {
10907
- className: styles$3["name"]
11356
+ className: styles$4["name"]
10908
11357
  }, item.name), React__default.createElement("div", {
10909
- className: styles$3["percent"]
11358
+ className: styles$4["percent"]
10910
11359
  }, React__default.createElement("span", null, item.percentageAmongStudents.toFixed(2), "%"), React__default.createElement("span", null, item.totalCorrectQuestions, "/", item.totalQuestions, "\uBB38\uC81C"))), React__default.createElement("div", {
10911
- className: styles$3["slider"]
11360
+ className: styles$4["slider"]
10912
11361
  }, React__default.createElement("span", {
10913
- className: styles$3["track"],
11362
+ className: styles$4["track"],
10914
11363
  style: {
10915
11364
  left: item.percentageAmongStudents + "%"
10916
11365
  }
10917
11366
  })));
10918
11367
  }), openProblem.problem4 && !data.length && React__default.createElement("div", {
10919
- className: styles$3["noData"]
11368
+ className: styles$4["noData"]
10920
11369
  }, "\uB370\uC774\uD130 \uC5C6\uC74C")));
10921
11370
  }
10922
11371
 
@@ -11009,7 +11458,7 @@ function CreateNewQuestionDialog$1(_ref) {
11009
11458
  var errors = _ref2.errors;
11010
11459
  return React__default.createElement(formik.Form, null, React__default.createElement("label", {
11011
11460
  htmlFor: "content-question",
11012
- className: styles['form-label'] + " " + styles$3['form-label-dialog']
11461
+ className: styles['form-label'] + " " + styles$4['form-label-dialog']
11013
11462
  }, "\uC9C8\uBB38 \uB0B4\uC6A9"), React__default.createElement(material.Box, {
11014
11463
  position: 'relative',
11015
11464
  display: 'flex',
@@ -11044,14 +11493,14 @@ function CreateNewQuestionDialog$1(_ref) {
11044
11493
  padding: '12px'
11045
11494
  }
11046
11495
  }, React__default.createElement(Button, {
11047
- className: styles$3['btn-cancel'],
11496
+ className: styles$4['btn-cancel'],
11048
11497
  onClick: toggleCreateQuestion
11049
11498
  }, React__default.createElement(Typography, {
11050
11499
  fontWeight: 700,
11051
11500
  fontSize: '14px',
11052
11501
  lineHeight: '16.71px'
11053
11502
  }, "\uCDE8\uC18C")), React__default.createElement(Button, {
11054
- className: styles$3['btn-register'],
11503
+ className: styles$4['btn-register'],
11055
11504
  type: "submit"
11056
11505
  }, React__default.createElement(Typography, {
11057
11506
  fontWeight: 700,
@@ -11062,12 +11511,12 @@ function CreateNewQuestionDialog$1(_ref) {
11062
11511
  })));
11063
11512
  }
11064
11513
 
11065
- var _excluded$6 = ["children", "value", "index"];
11514
+ var _excluded$7 = ["children", "value", "index"];
11066
11515
  var CustomTabPanel = function CustomTabPanel(props) {
11067
11516
  var children = props.children,
11068
11517
  value = props.value,
11069
11518
  index = props.index,
11070
- other = _objectWithoutPropertiesLoose(props, _excluded$6);
11519
+ other = _objectWithoutPropertiesLoose(props, _excluded$7);
11071
11520
  return React__default.createElement("div", Object.assign({
11072
11521
  role: "tabpanel",
11073
11522
  hidden: value !== index,
@@ -11255,9 +11704,9 @@ var ExamResultV2 = function ExamResultV2(_ref) {
11255
11704
  alignItems: "end",
11256
11705
  bgcolor: "#F9FAFB"
11257
11706
  }, React__default.createElement("div", {
11258
- className: styles$3["pdfBtnBox"]
11707
+ className: styles$4["pdfBtnBox"]
11259
11708
  }, React__default.createElement("button", {
11260
- className: styles$3["pdfBtn"] + " " + styles["truncate"],
11709
+ className: styles$4["pdfBtn"] + " " + styles["truncate"],
11261
11710
  onClick: handleExportPdf
11262
11711
  }, React__default.createElement(iconPrintFill, null), React__default.createElement("p", null, t("print"))))))), React__default.createElement(material.Grid, {
11263
11712
  item: true,
@@ -11297,9 +11746,9 @@ var ExamResultV2 = function ExamResultV2(_ref) {
11297
11746
  alignItems: "end",
11298
11747
  bgcolor: "#F9FAFB"
11299
11748
  }, React__default.createElement("div", {
11300
- className: styles$3["pdfBtnBox"]
11749
+ className: styles$4["pdfBtnBox"]
11301
11750
  }, React__default.createElement("button", {
11302
- className: styles$3["pdfBtn"] + " " + styles["truncate"],
11751
+ className: styles$4["pdfBtn"] + " " + styles["truncate"],
11303
11752
  onClick: handleExportPdf
11304
11753
  }, React__default.createElement(iconPrintFill, null), React__default.createElement("p", null, t("print"))))))), React__default.createElement(material.Grid, {
11305
11754
  item: true,
@@ -11315,18 +11764,18 @@ var ExamResultV2 = function ExamResultV2(_ref) {
11315
11764
  value: selected,
11316
11765
  index: 1
11317
11766
  }, React__default.createElement("div", {
11318
- className: styles$3["compareChart"]
11767
+ className: styles$4["compareChart"]
11319
11768
  }, React__default.createElement("div", {
11320
- className: styles$3["prevChart"] + " " + (dataChartIndex > 0 && "pointer"),
11769
+ className: styles$4["prevChart"] + " " + (dataChartIndex > 0 && "pointer"),
11321
11770
  onClick: handlePrevChart
11322
11771
  }, React__default.createElement(iconBtnPrevChart, null)), React__default.createElement("div", {
11323
- className: styles$3["chart"] + " sr-line-chart"
11772
+ className: styles$4["chart"] + " sr-line-chart"
11324
11773
  }, React__default.createElement("div", null, React__default.createElement(ReactApexChart, {
11325
11774
  height: 389,
11326
11775
  options: chartOptions,
11327
11776
  series: series
11328
11777
  }))), React__default.createElement("div", {
11329
- className: styles$3["nextChart"] + " " + (dataChartIndex < timelyOrderQuestion.length - 1 && "pointer"),
11778
+ className: styles$4["nextChart"] + " " + (dataChartIndex < timelyOrderQuestion.length - 1 && "pointer"),
11330
11779
  onClick: handleNextChart
11331
11780
  }, React__default.createElement(iconBtnNextChart, null)))), React__default.createElement(CustomTabPanel, {
11332
11781
  value: selected,
@@ -11361,39 +11810,70 @@ var ExamResultV2 = function ExamResultV2(_ref) {
11361
11810
  width: "100%"
11362
11811
  },
11363
11812
  id: "canvas"
11364
- }, React__default.createElement(CustomTabPanel, {
11365
- value: selected,
11366
- index: 0
11367
- }, React__default.createElement(MyAnswer, {
11813
+ }, React__default.createElement(material.Stack, {
11814
+ display: "flex",
11815
+ flexDirection: "column",
11816
+ gap: "12px"
11817
+ }, React__default.createElement(material.Typography, {
11818
+ sx: {
11819
+ fontSize: "16px",
11820
+ fontWeight: 700,
11821
+ color: "#414E62"
11822
+ }
11823
+ }, t(TabList[0].label)), React__default.createElement(MyAnswer, {
11368
11824
  data: resultDatas,
11369
11825
  categories: categoryResponses,
11370
11826
  isStudent: isStudent
11371
- })), React__default.createElement(CustomTabPanel, {
11372
- value: selected,
11373
- index: 1
11374
- }, React__default.createElement("div", {
11375
- className: styles$3["compareChart"]
11827
+ })), React__default.createElement(material.Stack, {
11828
+ display: "flex",
11829
+ flexDirection: "column",
11830
+ gap: "12px",
11831
+ marginTop: "24px"
11832
+ }, React__default.createElement(material.Typography, {
11833
+ sx: {
11834
+ fontSize: "16px",
11835
+ fontWeight: 700,
11836
+ color: "#414E62"
11837
+ }
11838
+ }, t(TabList[1].label)), React__default.createElement("div", {
11839
+ className: styles$4["compareChart"]
11376
11840
  }, React__default.createElement("div", {
11377
- className: styles$3["prevChart"] + " " + (dataChartIndex > 0 && "pointer"),
11841
+ className: styles$4["prevChart"] + " " + (dataChartIndex > 0 && "pointer"),
11378
11842
  onClick: handlePrevChart
11379
11843
  }, React__default.createElement(iconBtnPrevChart, null)), React__default.createElement("div", {
11380
- className: styles$3["chart"] + " sr-line-chart"
11844
+ className: styles$4["chart"] + " sr-line-chart"
11381
11845
  }, React__default.createElement("div", null, React__default.createElement(ReactApexChart, {
11382
11846
  height: 389,
11383
11847
  options: chartOptions,
11384
11848
  series: series
11385
11849
  }))), React__default.createElement("div", {
11386
- className: styles$3["nextChart"] + " " + (dataChartIndex < timelyOrderQuestion.length - 1 && "pointer"),
11850
+ className: styles$4["nextChart"] + " " + (dataChartIndex < timelyOrderQuestion.length - 1 && "pointer"),
11387
11851
  onClick: handleNextChart
11388
- }, React__default.createElement(iconBtnNextChart, null)))), React__default.createElement(CustomTabPanel, {
11389
- value: selected,
11390
- index: 2
11391
- }, React__default.createElement(CompareGrass, {
11852
+ }, React__default.createElement(iconBtnNextChart, null)))), React__default.createElement(material.Stack, {
11853
+ display: "flex",
11854
+ flexDirection: "column",
11855
+ gap: "12px",
11856
+ marginTop: "24px"
11857
+ }, React__default.createElement(material.Typography, {
11858
+ sx: {
11859
+ fontSize: "16px",
11860
+ fontWeight: 700,
11861
+ color: "#414E62"
11862
+ }
11863
+ }, t(TabList[2].label)), React__default.createElement(CompareGrass, {
11392
11864
  effectSize: effectSize
11393
- })), React__default.createElement(CustomTabPanel, {
11394
- value: selected,
11395
- index: 3
11396
- }, React__default.createElement(TrickyProblem, {
11865
+ })), React__default.createElement(material.Stack, {
11866
+ display: "flex",
11867
+ flexDirection: "column",
11868
+ gap: "12px",
11869
+ marginTop: "24px"
11870
+ }, React__default.createElement(material.Typography, {
11871
+ sx: {
11872
+ fontSize: "16px",
11873
+ fontWeight: 700,
11874
+ color: "#414E62"
11875
+ }
11876
+ }, t(TabList[3].label)), React__default.createElement(TrickyProblem, {
11397
11877
  data: resultDatas,
11398
11878
  openProblem: _extends({}, openProblem, {
11399
11879
  problem1: true