touchstudy-core 0.1.88 → 0.1.89

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.
@@ -0,0 +1,3 @@
1
+ import React from "react";
2
+ declare const ReleaseAlert: () => React.JSX.Element | null;
3
+ export default ReleaseAlert;
@@ -0,0 +1,2 @@
1
+ import ReleaseAlert from "./ReleaseAlert";
2
+ export { ReleaseAlert };
@@ -9,3 +9,4 @@ export declare type Language = {
9
9
  };
10
10
  export declare const LANGUAGES: Language[];
11
11
  export declare const DEFAULT_LANGUAGE: Language;
12
+ export declare const LOGIN_URL = "/login";
@@ -9,7 +9,7 @@ interface Props {
9
9
  t: any;
10
10
  selectedStudent: StudentClassResponse | undefined;
11
11
  textSearchRef: RefObject<HTMLInputElement> | null;
12
- disabled?: boolean;
12
+ isOneRoleExists?: boolean;
13
13
  handleOpenDeleteClassDialog: (value: StudentClassResponse) => void;
14
14
  handleCloseConfirmDialog: () => void;
15
15
  handleSort: (key: UserClassSortBy) => void;
@@ -4,9 +4,14 @@ import _ from "lodash";
4
4
  import { ChangeEvent } from "react";
5
5
  import { ClassResponse, StudentClassResponse, TeacherClassResponse, ClassRequest, LessonRequest } from "../configs/types";
6
6
  import { PagingResponse } from "../../../utils/types/pagingResponse";
7
+ import { Role } from "../../..";
7
8
  import { UserSortColumn } from "../../../utils/enums";
8
9
  declare type DialogOpenType = "Student" | "Teacher" | "Lesson";
9
- declare const useClassDetail: (history: any, id?: string | undefined) => {
10
+ declare const useClassDetail: ({ history, id, role }: {
11
+ history: any;
12
+ id?: string | undefined;
13
+ role: Role;
14
+ }) => {
10
15
  id: string | undefined;
11
16
  schema: import("yup").ObjectSchema<{
12
17
  name: string;
@@ -25,6 +30,7 @@ declare const useClassDetail: (history: any, id?: string | undefined) => {
25
30
  mainTeacherId: undefined;
26
31
  courseWeeklyDays: "";
27
32
  }, "">;
33
+ isAdmin: boolean;
28
34
  paging: PagingResponse;
29
35
  filter: import("../../../utils/types/searchQuery").BaseSearchQuery<UserSortColumn>;
30
36
  listUserSelected: number[];
@@ -43,6 +49,7 @@ declare const useClassDetail: (history: any, id?: string | undefined) => {
43
49
  course: ClassResponse | undefined;
44
50
  userList: StudentClassResponse[] | TeacherClassResponse[];
45
51
  teacherOptions: import("../configs/types").TeacherSimpleResponse[];
52
+ isOneRoleExists: boolean;
46
53
  studentListProps: {
47
54
  paging: PagingResponse;
48
55
  classList: StudentClassResponse[];
package/dist/index.d.ts CHANGED
@@ -83,4 +83,5 @@ import ClassDetail from "./containers/Classes/views/ClassDetail";
83
83
  import UserList from "./containers/Users/views/UserList";
84
84
  import NotificationDetail from "./containers/Notifications/views/NotificationDetail";
85
85
  import NotificationList from "./containers/Notifications/views/NotificationList";
86
+ export * from "./components/Alerts";
86
87
  export { diffFromNow, formatTime, utcToLocalTime, setLoading, setReadyRegisterPusher, BASE_URL, SUPER_ADMIN_BASE_URL, ACCESS_TOKEN, Login, store, setAlert, setUser, Loading, NotFound, LayoutContext, api, apiUpload, ConfirmDialog, CommonDialog, LoginWithEmail, NotificationList, CustomPagination, useGoogleSignOut, RecentUserAction, PUSHER_CONFIG, ExamEvent, EXAM_CHANNEL, EXAM_STUDENT_CHANNEL, setLanguage, i18n, TheLanguageDropdown, PrintExamView2, TheAcademyDropdown, useTranslation, I18nextProvider, DATE_MIN_VALUE, DATE_TIME_MIN_VALUE, ACADEMY_DOMAIN, minutesToTimeSpan, toISOString, canAccessRoute, CustomSelect, NotificationDetail, CustomAsyncSelect, CustomSelectOption, LoginWithPassword, getRecentUserActionListApi, getAccessToken, ChatContainer, getOrdinalSuffix, IChatContainerProps, IChatItemProps, IChatHeaderProps, IInputChatProps, ChatItemType, useChatContainer, ConversationResponse, usePusherConversation, ExamResultV2, ToastContainer, toast, Role, useLanguage, useSwitchAcademy, LANGUAGES, CustomCreatable, moment, ExamDetailView, ExamDetailViewProps, Exam, Question, ArticleGroup, getAcademyDomain, useSubjectSelect, useLogin, useAutoAcademyDomain, createRecentUserActionListApi, LoginAccessTokenRequest, LoginRequest, setReFetchUserAcademies, ChatTypes, AcademyHeaders, Types, Enums, CoreHooks, Language, ArticleGroupView, AnswerCountSelector, QuestionCountSelector, ScoreSelector, ArticleCategorySelector, SubjectSelector, useCategorySelect, InputText, Textbook, TextbookDetail, TextbookList, timeUtils, Header, DEFAULT_PAGING_RESPONSE, PagingResponse, AcademyList, getErrorMessage, DefaultErrorMessage, useCountDownTimer, useLoadMore, useVirtualizeList, PassCodeCheck, PassCodeCheckProps, LoadingComponent, PrintExamResultView, checkSuperUrl, ClassList, ClassDetail, formatRole, getRole, UserList };
package/dist/index.js CHANGED
@@ -87,6 +87,7 @@ var PUSHER_CONFIG = {
87
87
  cluster: process.env.REACT_APP_PUSHER_CONFIG_CLUSTER || "",
88
88
  key: process.env.REACT_APP_PUSHER_CONFIG_KEY || ""
89
89
  };
90
+ var RELEASE_DATE = process.env.REACT_APP_RELEASE_VERSION || "";
90
91
  var ACCESS_TOKEN = "ACCESS_TOKEN";
91
92
  var ACADEMY_DOMAIN = "ACADEMY_DOMAIN";
92
93
  var REDIRECT_URL = "REDIRECT_URL";
@@ -1185,6 +1186,7 @@ var LANGUAGES = [{
1185
1186
  momentLangCode: "en-au"
1186
1187
  }];
1187
1188
  var DEFAULT_LANGUAGE = LANGUAGES[0];
1189
+ var LOGIN_URL = "/login";
1188
1190
 
1189
1191
  var getLanguage = (function () {
1190
1192
  try {
@@ -1226,6 +1228,7 @@ var useLanguage = function useLanguage(history) {
1226
1228
  moment.locale(languageItem.momentLangCode);
1227
1229
  localStorage.setItem(LANGUAGE, languageItem.code);
1228
1230
  dispatch(setLanguage(languageItem.code));
1231
+ if (window.location.pathname === LOGIN_URL) return;
1229
1232
  searchParams.set("lang", languageItem.code);
1230
1233
  pushTo(history, _extends({}, window.location, {
1231
1234
  search: searchParams.toString()
@@ -2947,6 +2950,9 @@ var total_exam = "총 시험 수";
2947
2950
  var total_exam_time = "총 시험 시간";
2948
2951
  var total_question = "총 질문 수";
2949
2952
  var the_exam_code_you_are_looking_for_was_not_found = "찾고 있는 시험 코드를 찾을 수 없습니다";
2953
+ var view_user = "사용자 보기";
2954
+ var exam_code = "시험 코드";
2955
+ var version = "버전";
2950
2956
  var lang_ko = {
2951
2957
  problem_solving: problem_solving,
2952
2958
  my_story: my_story,
@@ -3746,7 +3752,10 @@ var lang_ko = {
3746
3752
  total_exam: total_exam,
3747
3753
  total_exam_time: total_exam_time,
3748
3754
  total_question: total_question,
3749
- the_exam_code_you_are_looking_for_was_not_found: the_exam_code_you_are_looking_for_was_not_found
3755
+ the_exam_code_you_are_looking_for_was_not_found: the_exam_code_you_are_looking_for_was_not_found,
3756
+ view_user: view_user,
3757
+ exam_code: exam_code,
3758
+ version: version
3750
3759
  };
3751
3760
 
3752
3761
  var problem_solving$1 = "Problem Solving";
@@ -4556,6 +4565,9 @@ var total_exam$1 = "Total Exam";
4556
4565
  var total_exam_time$1 = "Total Exam Time";
4557
4566
  var total_question$1 = "Total Question";
4558
4567
  var the_exam_code_you_are_looking_for_was_not_found$1 = "The exam code you are looking for was not found";
4568
+ var view_user$1 = "View User";
4569
+ var exam_code$1 = "exam code";
4570
+ var version$1 = "Version";
4559
4571
  var lang_en = {
4560
4572
  problem_solving: problem_solving$1,
4561
4573
  my_story: my_story$1,
@@ -5356,7 +5368,10 @@ var lang_en = {
5356
5368
  total_exam: total_exam$1,
5357
5369
  total_exam_time: total_exam_time$1,
5358
5370
  total_question: total_question$1,
5359
- the_exam_code_you_are_looking_for_was_not_found: the_exam_code_you_are_looking_for_was_not_found$1
5371
+ the_exam_code_you_are_looking_for_was_not_found: the_exam_code_you_are_looking_for_was_not_found$1,
5372
+ view_user: view_user$1,
5373
+ exam_code: exam_code$1,
5374
+ version: version$1
5360
5375
  };
5361
5376
 
5362
5377
  i18n__default.use(reactI18next.initReactI18next).init({
@@ -10694,6 +10709,7 @@ var useAutoAcademyDomain = function useAutoAcademyDomain(logout, history, superU
10694
10709
  academyDomain = _ref.academyDomain;
10695
10710
  var pathname = window.location.pathname;
10696
10711
  var changeAcademySearchParams = function changeAcademySearchParams() {
10712
+ var isLoginPage = LOGIN_URL === pathname;
10697
10713
  var search = window.location.search;
10698
10714
  var searchParams = new URLSearchParams(search);
10699
10715
  var paramAcademyDomain = searchParams.get("domain");
@@ -10702,6 +10718,7 @@ var useAutoAcademyDomain = function useAutoAcademyDomain(logout, history, superU
10702
10718
  var isSuperUrl = checkSuperUrl(superUrls, pathname);
10703
10719
  if (!academyDomain) {
10704
10720
  if (!isSuperUrl) {
10721
+ if (isLoginPage) return;
10705
10722
  !paramAcademyDomain && domain && searchParams.set("domain", domain);
10706
10723
  pushTo(history, {
10707
10724
  pathname: homeUrl,
@@ -10730,6 +10747,7 @@ var useAutoAcademyDomain = function useAutoAcademyDomain(logout, history, superU
10730
10747
  return;
10731
10748
  }
10732
10749
  if (!paramAcademyDomain) {
10750
+ if (isLoginPage) return;
10733
10751
  searchParams.set("domain", academyDomain);
10734
10752
  pushTo(history, _extends({}, window.location, {
10735
10753
  search: searchParams.toString()
@@ -18620,7 +18638,7 @@ var StudentList = function StudentList(_ref) {
18620
18638
  selectedStudent = _ref.selectedStudent,
18621
18639
  t = _ref.t,
18622
18640
  textSearchRef = _ref.textSearchRef,
18623
- disabled = _ref.disabled,
18641
+ isOneRoleExists = _ref.isOneRoleExists,
18624
18642
  handleOpenDeleteClassDialog = _ref.handleOpenDeleteClassDialog,
18625
18643
  handleCloseConfirmDialog = _ref.handleCloseConfirmDialog,
18626
18644
  handleSort = _ref.handleSort,
@@ -18680,7 +18698,7 @@ var StudentList = function StudentList(_ref) {
18680
18698
  },
18681
18699
  placeholder: t("search_for"),
18682
18700
  onChange: handleChangeSearchText
18683
- }))), React__default.createElement(material.Grid, {
18701
+ }))), isOneRoleExists && React__default.createElement(material.Grid, {
18684
18702
  item: true,
18685
18703
  xs: 6,
18686
18704
  className: "d-flex align-items-center"
@@ -18716,11 +18734,11 @@ var StudentList = function StudentList(_ref) {
18716
18734
  className: "d-flex"
18717
18735
  }, React__default.createElement(material.IconButton, {
18718
18736
  color: "default",
18719
- className: (disabled ? "bg-secondary" : "bg-danger") + " text-white",
18737
+ className: (!isOneRoleExists ? "bg-secondary" : "bg-danger") + " text-white",
18720
18738
  onClick: function onClick() {
18721
18739
  return handleOpenDeleteClassDialog(i);
18722
18740
  },
18723
- disabled: disabled
18741
+ disabled: !isOneRoleExists
18724
18742
  }, React__default.createElement(fa6.FaTrashCan, {
18725
18743
  size: 12
18726
18744
  })))));
@@ -18767,6 +18785,7 @@ var SelectDialog = function SelectDialog(_ref) {
18767
18785
  onSubmit = _ref.onSubmit;
18768
18786
  var _useTranslation = reactI18next.useTranslation(),
18769
18787
  t = _useTranslation.t;
18788
+ var theme = material.useTheme();
18770
18789
  var handleSubmit = function handleSubmit() {
18771
18790
  onSubmit(selected);
18772
18791
  handleClear();
@@ -18866,7 +18885,12 @@ var SelectDialog = function SelectDialog(_ref) {
18866
18885
  disabled: !numSelected,
18867
18886
  onClick: handleSubmit
18868
18887
  }, submitText), React__default.createElement(material.Button, {
18869
- color: "secondary",
18888
+ sx: {
18889
+ background: theme.palette.grey[600],
18890
+ "&:hover": {
18891
+ background: theme.palette.grey[800]
18892
+ }
18893
+ },
18870
18894
  variant: "contained",
18871
18895
  onClick: onClose
18872
18896
  }, t('cancel'))));
@@ -18938,7 +18962,7 @@ var TeacherList = function TeacherList(_ref) {
18938
18962
  "aria-label": "search google maps"
18939
18963
  },
18940
18964
  onChange: handleChangeSearchText
18941
- }))), React__default.createElement(material.Grid, {
18965
+ }))), !disabled && React__default.createElement(material.Grid, {
18942
18966
  item: true,
18943
18967
  xs: 6,
18944
18968
  className: "d-flex align-items-center"
@@ -18951,8 +18975,7 @@ var TeacherList = function TeacherList(_ref) {
18951
18975
  }),
18952
18976
  onClick: function onClick() {
18953
18977
  return onAdd === null || onAdd === void 0 ? void 0 : onAdd("Teacher");
18954
- },
18955
- disabled: disabled
18978
+ }
18956
18979
  }, t("add_teachers"))), React__default.createElement(material.Grid, {
18957
18980
  item: true,
18958
18981
  xs: 12
@@ -19425,11 +19448,21 @@ var _excluded$9 = ["getStudents"],
19425
19448
  _excluded2 = ["getTeachers"],
19426
19449
  _excluded3 = ["getLessons"];
19427
19450
  var PAGE_TITLE$5 = "classes";
19428
- var useClassDetail = function useClassDetail(history, id) {
19451
+ var useClassDetail = function useClassDetail(_ref) {
19452
+ var history = _ref.history,
19453
+ id = _ref.id,
19454
+ role = _ref.role;
19429
19455
  var _useTranslation = reactI18next.useTranslation(),
19430
19456
  t = _useTranslation.t;
19431
19457
  var dispatch = reactRedux.useDispatch();
19432
19458
  var schema = ClassSchema(t);
19459
+ var user = reactRedux.useSelector(function (state) {
19460
+ var _state$common;
19461
+ return state === null || state === void 0 ? void 0 : (_state$common = state.common) === null || _state$common === void 0 ? void 0 : _state$common.user;
19462
+ });
19463
+ var roles = (user === null || user === void 0 ? void 0 : user.roles) || [];
19464
+ var isOneRoleExists = roles.length === 1;
19465
+ var isAdmin = roles.includes(exports.Role.Admin) && role === exports.Role.Admin;
19433
19466
  var _useState = React.useState(),
19434
19467
  course = _useState[0],
19435
19468
  setCourse = _useState[1];
@@ -19849,6 +19882,7 @@ var useClassDetail = function useClassDetail(history, id) {
19849
19882
  return {
19850
19883
  id: id,
19851
19884
  schema: schema,
19885
+ isAdmin: isAdmin,
19852
19886
  paging: paging,
19853
19887
  filter: filter,
19854
19888
  listUserSelected: selected,
@@ -19867,6 +19901,7 @@ var useClassDetail = function useClassDetail(history, id) {
19867
19901
  course: course,
19868
19902
  userList: openSelectDialog === "Student" ? students : teachers,
19869
19903
  teacherOptions: teacherOptions,
19904
+ isOneRoleExists: isOneRoleExists,
19870
19905
  studentListProps: studentListProps,
19871
19906
  teacherListProps: teacherListProps,
19872
19907
  lessonListProps: lessonListProps,
@@ -20123,7 +20158,7 @@ var LessonList = function LessonList(_ref) {
20123
20158
  className: "d-flex mb-2"
20124
20159
  }, React__default.createElement(material.Typography, {
20125
20160
  variant: "h4"
20126
- }, t("lessons"))), React__default.createElement(material.Grid, {
20161
+ }, t("lessons"))), !disabled && React__default.createElement(material.Grid, {
20127
20162
  item: true,
20128
20163
  xs: 6,
20129
20164
  className: "d-flex align-items-center"
@@ -20224,10 +20259,14 @@ var ClassDetail = function ClassDetail(_ref) {
20224
20259
  history = _ref.history,
20225
20260
  classListUrl = _ref.classListUrl,
20226
20261
  role = _ref.role;
20227
- var isAdmin = role === exports.Role.Admin;
20228
- var _useClassDetail = useClassDetail(history, id),
20262
+ var _useClassDetail = useClassDetail({
20263
+ history: history,
20264
+ id: id,
20265
+ role: role
20266
+ }),
20229
20267
  schema = _useClassDetail.schema,
20230
20268
  paging = _useClassDetail.paging,
20269
+ isAdmin = _useClassDetail.isAdmin,
20231
20270
  filter = _useClassDetail.filter,
20232
20271
  listUserSelected = _useClassDetail.listUserSelected,
20233
20272
  userList = _useClassDetail.userList,
@@ -20244,6 +20283,7 @@ var ClassDetail = function ClassDetail(_ref) {
20244
20283
  course = _useClassDetail.course,
20245
20284
  classRequest = _useClassDetail.classRequest,
20246
20285
  teacherOptions = _useClassDetail.teacherOptions,
20286
+ isOneRoleExists = _useClassDetail.isOneRoleExists,
20247
20287
  studentListProps = _useClassDetail.studentListProps,
20248
20288
  teacherListProps = _useClassDetail.teacherListProps,
20249
20289
  lessonListProps = _useClassDetail.lessonListProps,
@@ -20331,7 +20371,7 @@ var ClassDetail = function ClassDetail(_ref) {
20331
20371
  value: selected,
20332
20372
  index: TabList$2[1].value
20333
20373
  }, !!id && !Number.isNaN(+id) && selected === TabList$2[1].value && React__default.createElement(StudentList, Object.assign({
20334
- disabled: !isAdmin,
20374
+ isOneRoleExists: isOneRoleExists,
20335
20375
  onAdd: handleOpenSelectDialog
20336
20376
  }, studentListProps))), React__default.createElement(CustomTabPanel, {
20337
20377
  value: selected,
@@ -20586,7 +20626,7 @@ var UserDialog = function UserDialog(_ref) {
20586
20626
  open: open,
20587
20627
  onClose: onClose,
20588
20628
  size: "md",
20589
- title: t(data !== null && data !== void 0 && data.id ? "update_user" : "create_new_user")
20629
+ title: !disabled ? t(data !== null && data !== void 0 && data.id ? "update_user" : "create_new_user") : t('view_user')
20590
20630
  }, React__default.createElement("form", {
20591
20631
  onSubmit: handleSubmit(onSubmit),
20592
20632
  style: {
@@ -20767,11 +20807,10 @@ var UserDialog = function UserDialog(_ref) {
20767
20807
  color: "secondary",
20768
20808
  className: "bg-secondary",
20769
20809
  onClick: onClose
20770
- }, t("cancel")), React__default.createElement(material.Button, {
20810
+ }, t("cancel")), !disabled && React__default.createElement(material.Button, {
20771
20811
  variant: "contained",
20772
20812
  color: "primary",
20773
- type: "submit",
20774
- disabled: disabled
20813
+ type: "submit"
20775
20814
  }, data !== null && data !== void 0 && data.id ? t("update") : t("create")))));
20776
20815
  };
20777
20816
 
@@ -21548,7 +21587,7 @@ var UserList = function UserList(_ref) {
21548
21587
  key: i.id
21549
21588
  }, React__default.createElement(TableCell, null, (paging.page - 1) * paging.limit + index + 1), React__default.createElement(TableCell, null, i.email), React__default.createElement(TableCell, null, i.fullName), React__default.createElement(TableCell, null, i.phoneNumber), React__default.createElement(TableCell, null, i.schoolName), React__default.createElement(TableCell, null, i.major), React__default.createElement(TableCell, null, i.grade), React__default.createElement(TableCell, null, utcToLocalTime(i.createdAt, t("date_time_format"))), React__default.createElement(TableCell, null, (_i$classes = i.classes) === null || _i$classes === void 0 ? void 0 : _i$classes.join(", ")), React__default.createElement(TableCell, null, !!i.roles && formatRole(i.roles, t)), React__default.createElement(TableCell, null, React__default.createElement("div", {
21550
21589
  className: "d-flex"
21551
- }, React__default.createElement(material.IconButton, {
21590
+ }, isAdmin ? React__default.createElement(material.IconButton, {
21552
21591
  color: "default",
21553
21592
  className: styles$6["action-btn"] + " bg-warning text-white me-2",
21554
21593
  onClick: function onClick() {
@@ -21557,6 +21596,14 @@ var UserList = function UserList(_ref) {
21557
21596
  }, React__default.createElement(hi.HiOutlinePencilAlt, {
21558
21597
  className: styles$6["action-btn--pencil"],
21559
21598
  size: 16
21599
+ })) : React__default.createElement(material.IconButton, {
21600
+ color: "default",
21601
+ className: "bg-primary text-white me-1",
21602
+ onClick: function onClick() {
21603
+ return handleOpenUserDialog(i);
21604
+ }
21605
+ }, React__default.createElement(fa.FaEye, {
21606
+ size: 12
21560
21607
  })), isAdmin && React__default.createElement(material.IconButton, {
21561
21608
  onClick: function onClick() {
21562
21609
  return openDeleteDialog(i);
@@ -22553,6 +22600,34 @@ var NotificationList = function NotificationList(_ref) {
22553
22600
  })));
22554
22601
  };
22555
22602
 
22603
+ var ReleaseAlert = function ReleaseAlert() {
22604
+ var _useTranslation = reactI18next.useTranslation(),
22605
+ t = _useTranslation.t;
22606
+ var releaseDate = RELEASE_DATE;
22607
+ var isInValidDate = !releaseDate || releaseDate === DATE_MIN_VALUE || releaseDate === DATE_TIME_MIN_VALUE;
22608
+ var isLoginPage = window.location.pathname === LOGIN_URL;
22609
+ if (isInValidDate || !moment.utc(releaseDate).isValid()) return null;else {
22610
+ var version = moment(releaseDate).format("HH.mm.YYYY.MM.DD");
22611
+ return React__default.createElement(material.Box, {
22612
+ sx: {
22613
+ position: "fixed",
22614
+ right: 10,
22615
+ bottom: isLoginPage ? undefined : 5,
22616
+ top: isLoginPage ? 10 : undefined,
22617
+ userSelect: "none",
22618
+ zIndex: 1
22619
+ }
22620
+ }, React__default.createElement(material.Typography, {
22621
+ color: "success",
22622
+ sx: {
22623
+ fontSize: 10,
22624
+ color: "#3DC674",
22625
+ opacity: 0.8
22626
+ }
22627
+ }, t("version"), ": ", React__default.createElement("span", null, version)));
22628
+ }
22629
+ };
22630
+
22556
22631
  exports.moment = moment;
22557
22632
  Object.defineProperty(exports, 'I18nextProvider', {
22558
22633
  enumerable: true,
@@ -22625,6 +22700,7 @@ exports.PrintExamResultView = PrintExamResultView;
22625
22700
  exports.PrintExamView2 = PrintExamView2;
22626
22701
  exports.QuestionCountSelector = QuestionCountSelector;
22627
22702
  exports.RecentUserAction = RecentUserAction;
22703
+ exports.ReleaseAlert = ReleaseAlert;
22628
22704
  exports.SUPER_ADMIN_BASE_URL = SUPER_ADMIN_BASE_URL;
22629
22705
  exports.ScoreSelector = ScoreSelector;
22630
22706
  exports.SubjectSelector = SubjectSelector;