@elice/material-exercise 1.230220.2 → 1.230306.0
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/cjs/components/material-exercise/context/ExerciseProvider.js +3 -3
- package/cjs/components/material-exercise/context/recoil.d.ts +4 -0
- package/cjs/components/material-exercise/context/recoil.js +20 -1
- package/cjs/components/material-exercise/context/recoilTypes.d.ts +6 -1
- package/cjs/components/material-exercise/exercise-file-editor/ExerciseFileEditor.js +1 -1
- package/cjs/components/material-exercise/exercise-menu/ExerciseMenu.js +3 -2
- package/cjs/components/material-exercise/exercise-menu/ExerciseMenuArduinoAgentModalButton.d.ts +3 -0
- package/cjs/components/material-exercise/exercise-menu/ExerciseMenuArduinoAgentModalButton.js +39 -0
- package/cjs/components/material-exercise/exercise-menu/ExerciseMenuDropdown.js +1 -1
- package/cjs/components/material-exercise/exercise-menu/locales/en.json.js +1 -1
- package/cjs/components/material-exercise/exercise-menu/locales/ko.json.js +1 -1
- package/cjs/components/material-exercise/exercise-room/ExerciseRoomDetail.js +6 -6
- package/cjs/components/material-exercise/exercise-runner/ExerciseRunnerController.js +2 -1
- package/cjs/components/material-exercise/exercise-runner/ExerciseRunnerControllerArduinoAgentModal.d.ts +3 -0
- package/cjs/components/material-exercise/exercise-runner/ExerciseRunnerControllerArduinoAgentModal.js +137 -0
- package/cjs/components/material-exercise/exercise-runner/ExerciseRunnerControllerButtonGroup.js +1 -1
- package/cjs/components/material-exercise/exercise-runner/ExerciseRunnerControllerRunningInfo.js +12 -8
- package/cjs/components/material-exercise/exercise-runner/locales/en.json.js +1 -1
- package/cjs/components/material-exercise/exercise-runner/locales/ko.json.js +1 -1
- package/cjs/components/shared/exercise-menu-button/ExerciseMenuButton.js +1 -1
- package/es/components/material-exercise/context/ExerciseProvider.js +3 -3
- package/es/components/material-exercise/context/recoil.d.ts +4 -0
- package/es/components/material-exercise/context/recoil.js +21 -3
- package/es/components/material-exercise/context/recoilTypes.d.ts +6 -1
- package/es/components/material-exercise/exercise-file-editor/ExerciseFileEditor.js +1 -1
- package/es/components/material-exercise/exercise-menu/ExerciseMenu.js +3 -2
- package/es/components/material-exercise/exercise-menu/ExerciseMenuArduinoAgentModalButton.d.ts +3 -0
- package/es/components/material-exercise/exercise-menu/ExerciseMenuArduinoAgentModalButton.js +33 -0
- package/es/components/material-exercise/exercise-menu/ExerciseMenuDropdown.js +1 -1
- package/es/components/material-exercise/exercise-menu/locales/en.json.js +1 -1
- package/es/components/material-exercise/exercise-menu/locales/ko.json.js +1 -1
- package/es/components/material-exercise/exercise-room/ExerciseRoomDetail.js +6 -6
- package/es/components/material-exercise/exercise-runner/ExerciseRunnerController.js +2 -1
- package/es/components/material-exercise/exercise-runner/ExerciseRunnerControllerArduinoAgentModal.d.ts +3 -0
- package/es/components/material-exercise/exercise-runner/ExerciseRunnerControllerArduinoAgentModal.js +130 -0
- package/es/components/material-exercise/exercise-runner/ExerciseRunnerControllerButtonGroup.js +1 -1
- package/es/components/material-exercise/exercise-runner/ExerciseRunnerControllerRunningInfo.js +12 -8
- package/es/components/material-exercise/exercise-runner/locales/en.json.js +1 -1
- package/es/components/material-exercise/exercise-runner/locales/ko.json.js +1 -1
- package/es/components/shared/exercise-menu-button/ExerciseMenuButton.js +1 -1
- package/package.json +8 -8
|
@@ -44,8 +44,8 @@ const ExerciseProvider = _a => {
|
|
|
44
44
|
const exercise = recoil.useRecoilValue(recoil$1.exerciseState(materialExerciseId));
|
|
45
45
|
const exerciseRoom = recoil.useRecoilValue(recoil$1.exerciseRoomState(exerciseRoomId)); // lecture
|
|
46
46
|
|
|
47
|
-
const lecture = recoil.useRecoilValue(recoil$1.exerciseLectureState(exercise === null || exercise === void 0 ? void 0 : exercise.
|
|
48
|
-
const resetLecture = recoil.useResetRecoilState(recoil$1.exerciseLectureState(exercise === null || exercise === void 0 ? void 0 : exercise.
|
|
47
|
+
const lecture = recoil.useRecoilValue(recoil$1.exerciseLectureState(exercise === null || exercise === void 0 ? void 0 : exercise._lectureId));
|
|
48
|
+
const resetLecture = recoil.useResetRecoilState(recoil$1.exerciseLectureState(exercise === null || exercise === void 0 ? void 0 : exercise._lectureId)); // multilang languages
|
|
49
49
|
|
|
50
50
|
const exerciseMultilangLanguages = recoil.useRecoilValue(recoil$1.exerciseMultilangLanguagesState(exercise === null || exercise === void 0 ? void 0 : exercise.id));
|
|
51
51
|
const resetExerciseMultilangLanguages = recoil.useResetRecoilState(recoil$1.exerciseMultilangLanguagesState(exercise === null || exercise === void 0 ? void 0 : exercise.id)); // etc
|
|
@@ -83,7 +83,7 @@ const ExerciseProvider = _a => {
|
|
|
83
83
|
//
|
|
84
84
|
|
|
85
85
|
React__default["default"].useEffect(() => {
|
|
86
|
-
if (!(exercise === null || exercise === void 0 ? void 0 : exercise.
|
|
86
|
+
if (!(exercise === null || exercise === void 0 ? void 0 : exercise._lectureId)) {
|
|
87
87
|
return;
|
|
88
88
|
}
|
|
89
89
|
|
|
@@ -122,6 +122,10 @@ export declare const exerciseArduinoAgentConnectionState: import("recoil").Recoi
|
|
|
122
122
|
* Arduino upload progress.
|
|
123
123
|
*/
|
|
124
124
|
export declare const exerciseArduinoUploadProgressState: import("recoil").RecoilState<ArduinoUploadProgressStatus>;
|
|
125
|
+
/**
|
|
126
|
+
* Arduino agent modal open status.
|
|
127
|
+
*/
|
|
128
|
+
export declare const exerciseArduinoAgentModalState: import("recoil").RecoilState<boolean>;
|
|
125
129
|
/**
|
|
126
130
|
*
|
|
127
131
|
*/
|
|
@@ -74,7 +74,17 @@ const exerciseState = recoil.atomFamily({
|
|
|
74
74
|
const get = async () => {
|
|
75
75
|
setSelf(await apiClient.getOrgMaterialExerciseGet({
|
|
76
76
|
materialExerciseId
|
|
77
|
-
}).then(res => res.materialExercise).
|
|
77
|
+
}).then(res => res.materialExercise).then(materialExercise => Promise.all([materialExercise, apiClient.getOrgLecturePageResolve({
|
|
78
|
+
materialId: materialExercise.id,
|
|
79
|
+
materialType: types.enums.LectureMaterialType.Exercise
|
|
80
|
+
}).then(res => ({
|
|
81
|
+
_courseId: res.courseId,
|
|
82
|
+
_lectureId: res.lectureId,
|
|
83
|
+
_lecturePageId: res.lecturePageId,
|
|
84
|
+
_orderNo: res.orderNo
|
|
85
|
+
})).catch(err => {
|
|
86
|
+
throw err;
|
|
87
|
+
})])).then(([materialExercise, lecturePageResolve]) => Object.assign(Object.assign({}, materialExercise), lecturePageResolve)).catch(() => null));
|
|
78
88
|
};
|
|
79
89
|
|
|
80
90
|
if (trigger === 'get') {
|
|
@@ -554,6 +564,14 @@ const exerciseArduinoAgentConnectionState = recoil.atom({
|
|
|
554
564
|
const exerciseArduinoUploadProgressState = recoil.atom({
|
|
555
565
|
key: `${KEY_PREFIX}/Arduino/UploadProgressState`,
|
|
556
566
|
default: 'ready'
|
|
567
|
+
});
|
|
568
|
+
/**
|
|
569
|
+
* Arduino agent modal open status.
|
|
570
|
+
*/
|
|
571
|
+
|
|
572
|
+
const exerciseArduinoAgentModalState = recoil.atom({
|
|
573
|
+
key: `${KEY_PREFIX}/Arduino/AgentModalState`,
|
|
574
|
+
default: false
|
|
557
575
|
}); //
|
|
558
576
|
// =============== others ===============
|
|
559
577
|
//
|
|
@@ -607,6 +625,7 @@ const exerciseFileEditorCursorSelectionValueState = recoil.atom({
|
|
|
607
625
|
|
|
608
626
|
exports.exerciseActiveFilenameState = exerciseActiveFilenameState;
|
|
609
627
|
exports.exerciseArduinoAgentConnectionState = exerciseArduinoAgentConnectionState;
|
|
628
|
+
exports.exerciseArduinoAgentModalState = exerciseArduinoAgentModalState;
|
|
610
629
|
exports.exerciseArduinoOnSelectPortState = exerciseArduinoOnSelectPortState;
|
|
611
630
|
exports.exerciseArduinoOpenedPortNameState = exerciseArduinoOpenedPortNameState;
|
|
612
631
|
exports.exerciseArduinoPortsState = exerciseArduinoPortsState;
|
|
@@ -10,7 +10,12 @@ export declare type AtomLectureState = GetOrgLectureGetResponses['lecture'] | nu
|
|
|
10
10
|
/**
|
|
11
11
|
* Material exercise.
|
|
12
12
|
*/
|
|
13
|
-
export declare type AtomExerciseState = GetOrgMaterialExerciseGetResponses['materialExercise']
|
|
13
|
+
export declare type AtomExerciseState = (GetOrgMaterialExerciseGetResponses['materialExercise'] & {
|
|
14
|
+
_courseId: number;
|
|
15
|
+
_lectureId: number;
|
|
16
|
+
_lecturePageId: number;
|
|
17
|
+
_orderNo: number;
|
|
18
|
+
}) | null;
|
|
14
19
|
/**
|
|
15
20
|
* Material exercise room.
|
|
16
21
|
*/
|
|
@@ -53,7 +53,7 @@ const ExerciseFileEditor = () => {
|
|
|
53
53
|
} = React__default["default"].useContext(context.ExerciseContext);
|
|
54
54
|
const exercise = recoil.useRecoilValue(recoil$1.exerciseState(materialExerciseId));
|
|
55
55
|
const exerciseRoom = recoil.useRecoilValue(recoil$1.exerciseRoomState(exerciseRoomId));
|
|
56
|
-
const lecture = recoil.useRecoilValue(recoil$1.exerciseLectureState(exercise === null || exercise === void 0 ? void 0 : exercise.
|
|
56
|
+
const lecture = recoil.useRecoilValue(recoil$1.exerciseLectureState(exercise === null || exercise === void 0 ? void 0 : exercise._lectureId));
|
|
57
57
|
const preference = recoil.useRecoilValue(recoil$1.exerciseEditorPreferenceState);
|
|
58
58
|
const activeFilename = recoil.useRecoilValue(recoil$1.exerciseActiveFilenameState);
|
|
59
59
|
const readOnly = readOnlyEditor || readOnlyActiveFile;
|
|
@@ -13,6 +13,7 @@ require('../context/ExerciseProvider.js');
|
|
|
13
13
|
var ExerciseIntlProvider = require('../context/ExerciseIntlProvider.js');
|
|
14
14
|
var en = require('./locales/en.json.js');
|
|
15
15
|
var ko = require('./locales/ko.json.js');
|
|
16
|
+
var ExerciseMenuArduinoAgentModalButton = require('./ExerciseMenuArduinoAgentModalButton.js');
|
|
16
17
|
var ExerciseMenuArduinoSettings = require('./ExerciseMenuArduinoSettings.js');
|
|
17
18
|
var ExerciseMenuDropdown = require('./ExerciseMenuDropdown.js');
|
|
18
19
|
var ExerciseMenuReset = require('./ExerciseMenuReset.js');
|
|
@@ -25,7 +26,7 @@ var styled__default = /*#__PURE__*/_interopDefaultLegacy(styled);
|
|
|
25
26
|
|
|
26
27
|
const StyledExerciseMenuWrapper = styled__default["default"].div.withConfig({
|
|
27
28
|
componentId: "sc-1gf6m87-0"
|
|
28
|
-
})(["display:flex;justify-content:center;align-items:center;padding:0 0.5rem 0 1rem;height:2.25rem;background-color:", ";"], designTokens.base.color.navy8);
|
|
29
|
+
})(["display:flex;justify-content:center;align-items:center;padding:0 0.5rem 0 1rem;height:2.25rem;gap:0.5rem;background-color:", ";"], designTokens.base.color.navy8);
|
|
29
30
|
|
|
30
31
|
const ExerciseMenu = () => {
|
|
31
32
|
const {
|
|
@@ -36,7 +37,7 @@ const ExerciseMenu = () => {
|
|
|
36
37
|
//
|
|
37
38
|
//
|
|
38
39
|
|
|
39
|
-
return React__default["default"].createElement(StyledExerciseMenuWrapper, null, isArduinoExercise ? React__default["default"].createElement(ExerciseMenuArduinoSettings, null) : React__default["default"].createElement(ExerciseMenuStdioFileBrowser, null), React__default["default"].createElement(ExerciseMenuReset, null), React__default["default"].createElement(ExerciseMenuDropdown, null));
|
|
40
|
+
return React__default["default"].createElement(StyledExerciseMenuWrapper, null, isArduinoExercise ? React__default["default"].createElement(React__default["default"].Fragment, null, React__default["default"].createElement(ExerciseMenuArduinoAgentModalButton, null), React__default["default"].createElement(ExerciseMenuArduinoSettings, null)) : React__default["default"].createElement(ExerciseMenuStdioFileBrowser, null), React__default["default"].createElement(ExerciseMenuReset, null), React__default["default"].createElement(ExerciseMenuDropdown, null));
|
|
40
41
|
};
|
|
41
42
|
|
|
42
43
|
var ExerciseMenu$1 = ExerciseIntlProvider.withExerciseIntlProvider(ExerciseMenu, {
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var React = require('react');
|
|
4
|
+
var reactIntl = require('react-intl');
|
|
5
|
+
var blocks = require('@elice/blocks');
|
|
6
|
+
var icons = require('@elice/icons');
|
|
7
|
+
var recoil = require('recoil');
|
|
8
|
+
var recoil$1 = require('../context/recoil.js');
|
|
9
|
+
require('../context/context.js');
|
|
10
|
+
require('../context/recoilTypes.js');
|
|
11
|
+
require('../context/subjects.js');
|
|
12
|
+
require('../context/ExerciseProvider.js');
|
|
13
|
+
|
|
14
|
+
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
15
|
+
|
|
16
|
+
var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
|
|
17
|
+
|
|
18
|
+
const ExerciseMenuArduinoAgentModalButton = () => {
|
|
19
|
+
const setOpen = recoil.useSetRecoilState(recoil$1.exerciseArduinoAgentModalState);
|
|
20
|
+
|
|
21
|
+
const handleClick = () => {
|
|
22
|
+
setOpen(true);
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
return React__default["default"].createElement(blocks.Button, {
|
|
26
|
+
size: "micro",
|
|
27
|
+
role: "warning",
|
|
28
|
+
icon: React__default["default"].createElement(blocks.Icon, {
|
|
29
|
+
icon: icons.eilStatusDanger
|
|
30
|
+
}),
|
|
31
|
+
iconAlign: "left",
|
|
32
|
+
border: false,
|
|
33
|
+
onClick: handleClick
|
|
34
|
+
}, React__default["default"].createElement(reactIntl.FormattedMessage, {
|
|
35
|
+
id: "exerciseMenu.arduino.agent.button"
|
|
36
|
+
}));
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
module.exports = ExerciseMenuArduinoAgentModalButton;
|
|
@@ -27,7 +27,7 @@ const ExerciseMenuDropdown = () => {
|
|
|
27
27
|
} = React__default["default"].useContext(context.ExerciseContext);
|
|
28
28
|
const user = recoil.useRecoilValue(recoil$1.exerciseUserState);
|
|
29
29
|
const exercise = recoil.useRecoilValue(recoil$1.exerciseState(materialExerciseId));
|
|
30
|
-
const lecture = recoil.useRecoilValue(recoil$1.exerciseLectureState(exercise === null || exercise === void 0 ? void 0 : exercise.
|
|
30
|
+
const lecture = recoil.useRecoilValue(recoil$1.exerciseLectureState(exercise === null || exercise === void 0 ? void 0 : exercise._lectureId));
|
|
31
31
|
const activeFilename = recoil.useRecoilValue(recoil$1.exerciseActiveFilenameState);
|
|
32
32
|
const setRightpaneActiveState = recoil.useSetRecoilState(recoil$1.exerciseRightpaneActiveState);
|
|
33
33
|
const [isSubmitHistoryModalOpen, setIsSubmitHistoryModalOpen] = React__default["default"].useState(false);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var phrasesEn = {"exerciseMenu.dropdown.button.tooltip":"More","exerciseMenu.dropdown.item.codeHistory":"Submit History","exerciseMenu.dropdown.item.environment":"Environment","exerciseMenu.dropdown.item.preference":"Editor Preferences","exerciseMenu.dropdown.item.room":"Code Sharing","exerciseMenu.dropdown.item.submitHistory":"Code History","exerciseMenu.reset.button.tooltip.disabled":"The file cannot be reset","exerciseMenu.reset.button.tooltip.enabled":"Reset the file","exerciseMenu.reset.confirmDialog.body":"Are you sure you want to clear all the code you wrote at current file and reset it?","exerciseMenu.reset.confirmDialog.cancel":"Cencel","exerciseMenu.reset.confirmDialog.confirm":"Confirm","exerciseMenu.reset.confirmDialog.title":"Reset the file","exerciseMenu.stdioFileBrowser.button.tooltip":"File","exerciseMenu.stdioFileBrowser.popover.body.placeholder":"Files sent from your code\nappear here.","exerciseMenu.stdioFileBrowser.popover.header":"File"};
|
|
3
|
+
var phrasesEn = {"exerciseMenu.dropdown.button.tooltip":"More","exerciseMenu.dropdown.item.codeHistory":"Submit History","exerciseMenu.dropdown.item.environment":"Environment","exerciseMenu.dropdown.item.preference":"Editor Preferences","exerciseMenu.dropdown.item.room":"Code Sharing","exerciseMenu.dropdown.item.submitHistory":"Code History","exerciseMenu.arduino.agent.button":"Having problem with connecting to arduino?","exerciseMenu.reset.button.tooltip.disabled":"The file cannot be reset","exerciseMenu.reset.button.tooltip.enabled":"Reset the file","exerciseMenu.reset.confirmDialog.body":"Are you sure you want to clear all the code you wrote at current file and reset it?","exerciseMenu.reset.confirmDialog.cancel":"Cencel","exerciseMenu.reset.confirmDialog.confirm":"Confirm","exerciseMenu.reset.confirmDialog.title":"Reset the file","exerciseMenu.stdioFileBrowser.button.tooltip":"File","exerciseMenu.stdioFileBrowser.popover.body.placeholder":"Files sent from your code\nappear here.","exerciseMenu.stdioFileBrowser.popover.header":"File"};
|
|
4
4
|
|
|
5
5
|
module.exports = phrasesEn;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var phrasesKo = {"exerciseMenu.dropdown.button.tooltip":"더 보기","exerciseMenu.dropdown.item.codeHistory":"코드 수정 이력","exerciseMenu.dropdown.item.environment":"실습 환경","exerciseMenu.dropdown.item.preference":"에디터 설정","exerciseMenu.dropdown.item.room":"코드 공유","exerciseMenu.dropdown.item.submitHistory":"실행/제출 이력","exerciseMenu.reset.button.tooltip.disabled":"해당 파일은 초기화를 할 수 없습니다","exerciseMenu.reset.button.tooltip.enabled":"코드 초기화","exerciseMenu.reset.confirmDialog.body":"작성한 코드를 모두 지우고 초기화하시겠습니까?","exerciseMenu.reset.confirmDialog.cancel":"취소","exerciseMenu.reset.confirmDialog.confirm":"확인","exerciseMenu.reset.confirmDialog.title":"코드 초기화","exerciseMenu.stdioFileBrowser.button.tooltip":"파일","exerciseMenu.stdioFileBrowser.popover.body.placeholder":"코드에서 전송한 파일이\n여기에 표시됩니다.","exerciseMenu.stdioFileBrowser.popover.header":"파일"};
|
|
3
|
+
var phrasesKo = {"exerciseMenu.dropdown.button.tooltip":"더 보기","exerciseMenu.dropdown.item.codeHistory":"코드 수정 이력","exerciseMenu.dropdown.item.environment":"실습 환경","exerciseMenu.dropdown.item.preference":"에디터 설정","exerciseMenu.dropdown.item.room":"코드 공유","exerciseMenu.dropdown.item.submitHistory":"실행/제출 이력","exerciseMenu.arduino.agent.button":"아두이노 연결 중 문제가 발생했나요?","exerciseMenu.reset.button.tooltip.disabled":"해당 파일은 초기화를 할 수 없습니다","exerciseMenu.reset.button.tooltip.enabled":"코드 초기화","exerciseMenu.reset.confirmDialog.body":"작성한 코드를 모두 지우고 초기화하시겠습니까?","exerciseMenu.reset.confirmDialog.cancel":"취소","exerciseMenu.reset.confirmDialog.confirm":"확인","exerciseMenu.reset.confirmDialog.title":"코드 초기화","exerciseMenu.stdioFileBrowser.button.tooltip":"파일","exerciseMenu.stdioFileBrowser.popover.body.placeholder":"코드에서 전송한 파일이\n여기에 표시됩니다.","exerciseMenu.stdioFileBrowser.popover.header":"파일"};
|
|
4
4
|
|
|
5
5
|
module.exports = phrasesKo;
|
|
@@ -34,7 +34,7 @@ const MaterialExerciseExerciseRoomDetail = ({
|
|
|
34
34
|
goToList,
|
|
35
35
|
onHide
|
|
36
36
|
}) => {
|
|
37
|
-
var _a, _b, _c, _d, _e
|
|
37
|
+
var _a, _b, _c, _d, _e;
|
|
38
38
|
|
|
39
39
|
const intl = reactIntl.useIntl();
|
|
40
40
|
const {
|
|
@@ -52,7 +52,7 @@ const MaterialExerciseExerciseRoomDetail = ({
|
|
|
52
52
|
const [isLeaveDialogOpen, setIsLeaveDialogOpen] = React__default["default"].useState(false);
|
|
53
53
|
const [isDeleting, setIsDeleting] = React__default["default"].useState(false);
|
|
54
54
|
const isThisChatRoomOwner = (_b = ((_a = exerciseRoom === null || exerciseRoom === void 0 ? void 0 : exerciseRoom.roomUsers.find(roomUser => roomUser.user.id === (user === null || user === void 0 ? void 0 : user.id))) === null || _a === void 0 ? void 0 : _a.permission) === types.enums.ExerciseRoomPermission.Owner) !== null && _b !== void 0 ? _b : false;
|
|
55
|
-
const shareLink = materialExercise ? `https://${window.location.host}/courses/${materialExercise.
|
|
55
|
+
const shareLink = materialExercise ? `https://${window.location.host}/courses/${materialExercise._courseId}/lectures/${materialExercise === null || materialExercise === void 0 ? void 0 : materialExercise._lectureId}/materials/${materialExercise === null || materialExercise === void 0 ? void 0 : materialExercise._orderNo}/projects/${selectedExerciseRoomId}` : '';
|
|
56
56
|
const [, copyToClipboard] = reactUse.useCopyToClipboard();
|
|
57
57
|
const doGetOrgMaterialExerciseExerciseRoomGet = React__default["default"].useCallback(() => {
|
|
58
58
|
return apiClient.getOrgMaterialExerciseExerciseRoomGet({
|
|
@@ -100,7 +100,7 @@ const MaterialExerciseExerciseRoomDetail = ({
|
|
|
100
100
|
const doGetOrgCourseUserList = React__default["default"].useCallback(() => {
|
|
101
101
|
if (materialExercise) {
|
|
102
102
|
return apiClient.getOrgCourseUserList({
|
|
103
|
-
courseId: materialExercise.
|
|
103
|
+
courseId: materialExercise._courseId,
|
|
104
104
|
isForTutoring: false,
|
|
105
105
|
count: 20,
|
|
106
106
|
offset: 0,
|
|
@@ -174,7 +174,7 @@ const MaterialExerciseExerciseRoomDetail = ({
|
|
|
174
174
|
return React__default["default"].createElement(StyledModal, {
|
|
175
175
|
theme: "dark",
|
|
176
176
|
onHide: onHide,
|
|
177
|
-
title: (
|
|
177
|
+
title: (_c = exerciseRoom === null || exerciseRoom === void 0 ? void 0 : exerciseRoom.title) !== null && _c !== void 0 ? _c : '',
|
|
178
178
|
headerIcon: icons.eilArrowLeftwardsSingle,
|
|
179
179
|
onHeaderIconClick: goToList,
|
|
180
180
|
footerChild: exerciseRoom ? exerciseRoom.isDefaultRoom ? React__default["default"].createElement(blocks.Flex, {
|
|
@@ -217,7 +217,7 @@ const MaterialExerciseExerciseRoomDetail = ({
|
|
|
217
217
|
label: intl.formatMessage({
|
|
218
218
|
id: 'materialExerciseExerciseRoom.leave'
|
|
219
219
|
}),
|
|
220
|
-
disabled: (
|
|
220
|
+
disabled: (_d = exerciseRoom === null || exerciseRoom === void 0 ? void 0 : exerciseRoom.isDefaultRoom) !== null && _d !== void 0 ? _d : false,
|
|
221
221
|
role: 'gray6',
|
|
222
222
|
onClick: () => {
|
|
223
223
|
setIsLeaveDialogOpen(true);
|
|
@@ -449,7 +449,7 @@ const MaterialExerciseExerciseRoomDetail = ({
|
|
|
449
449
|
}), isThisChatRoomOwner ? React__default["default"].createElement(React__default["default"].Fragment, null, React__default["default"].createElement(blocks.Select, {
|
|
450
450
|
size: "small",
|
|
451
451
|
width: "small",
|
|
452
|
-
value: (
|
|
452
|
+
value: (_e = exerciseRoom === null || exerciseRoom === void 0 ? void 0 : exerciseRoom.publicPermission) !== null && _e !== void 0 ? _e : types.enums.ExerciseRoomPermission.Nothing,
|
|
453
453
|
onChange: value => {
|
|
454
454
|
doPostOrgMaterialExerciseExerciseRoomEdit(value);
|
|
455
455
|
},
|
|
@@ -11,6 +11,7 @@ var context = require('../context/context.js');
|
|
|
11
11
|
require('../context/recoilTypes.js');
|
|
12
12
|
require('../context/subjects.js');
|
|
13
13
|
require('../context/ExerciseProvider.js');
|
|
14
|
+
var ExerciseRunnerControllerArduinoAgentModal = require('./ExerciseRunnerControllerArduinoAgentModal.js');
|
|
14
15
|
var ExerciseRunnerControllerArduinoStatusMessage = require('./ExerciseRunnerControllerArduinoStatusMessage.js');
|
|
15
16
|
var ExerciseRunnerControllerButtonGroup = require('./ExerciseRunnerControllerButtonGroup.js');
|
|
16
17
|
var ExerciseRunnerControllerRunningInfo = require('./ExerciseRunnerControllerRunningInfo.js');
|
|
@@ -40,7 +41,7 @@ const ExerciseRunnerController = () => {
|
|
|
40
41
|
}), React__default["default"].createElement(ExerciseRunnerControllerRunningInfo, null), React__default["default"].createElement(ExerciseRunnerControllerTimer, null)), React__default["default"].createElement(blocks.Flex, {
|
|
41
42
|
column: true,
|
|
42
43
|
align: "flex-end"
|
|
43
|
-
}, React__default["default"].createElement(ExerciseRunnerControllerStatusMessage, null), isArduinoExercise ? React__default["default"].createElement(ExerciseRunnerControllerArduinoStatusMessage, null) : null));
|
|
44
|
+
}, React__default["default"].createElement(ExerciseRunnerControllerStatusMessage, null), isArduinoExercise ? React__default["default"].createElement(ExerciseRunnerControllerArduinoStatusMessage, null) : null), isArduinoExercise ? React__default["default"].createElement(ExerciseRunnerControllerArduinoAgentModal, null) : null);
|
|
44
45
|
};
|
|
45
46
|
|
|
46
47
|
module.exports = ExerciseRunnerController;
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var React = require('react');
|
|
4
|
+
var reactIntl = require('react-intl');
|
|
5
|
+
var blocks = require('@elice/blocks');
|
|
6
|
+
var icons = require('@elice/icons');
|
|
7
|
+
var FileSaver = require('file-saver');
|
|
8
|
+
var recoil = require('recoil');
|
|
9
|
+
var recoil$1 = require('../context/recoil.js');
|
|
10
|
+
require('../context/context.js');
|
|
11
|
+
require('../context/recoilTypes.js');
|
|
12
|
+
require('../context/subjects.js');
|
|
13
|
+
require('../context/ExerciseProvider.js');
|
|
14
|
+
|
|
15
|
+
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
16
|
+
|
|
17
|
+
var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
|
|
18
|
+
var FileSaver__default = /*#__PURE__*/_interopDefaultLegacy(FileSaver);
|
|
19
|
+
|
|
20
|
+
const ELICE_MATERIAL_EXERCISE_ARDUINO_AGENT_MODAL_KEY = 'elice-material-exercise-arduino-agent-modal-closed';
|
|
21
|
+
const ELICE_MATERIAL_EXERCISE_ARDUINO_AGENT_MODAL_VALUE = 'true';
|
|
22
|
+
const ARDUINO_AGENT_MAC_DOWNLOAD_URL = 'https://eli.so/arduino-agent-mac';
|
|
23
|
+
const ARDUINO_AGENT_WIN_DOWNLOAD_URL = 'https://eli.so/arduino-agent-win';
|
|
24
|
+
const ARDUINO_AGENT_MANUAL_URL = 'https://eli.so/arduino-faq';
|
|
25
|
+
|
|
26
|
+
const ExerciseRunnerControllerArduinoAgentModal = () => {
|
|
27
|
+
const intl = reactIntl.useIntl();
|
|
28
|
+
const [open, setOpen] = recoil.useRecoilState(recoil$1.exerciseArduinoAgentModalState);
|
|
29
|
+
React__default["default"].useEffect(() => {
|
|
30
|
+
const isConfirmed = localStorage.getItem(ELICE_MATERIAL_EXERCISE_ARDUINO_AGENT_MODAL_KEY) === ELICE_MATERIAL_EXERCISE_ARDUINO_AGENT_MODAL_VALUE;
|
|
31
|
+
|
|
32
|
+
if (!isConfirmed) {
|
|
33
|
+
setOpen(true);
|
|
34
|
+
}
|
|
35
|
+
}, [setOpen]);
|
|
36
|
+
|
|
37
|
+
const handleClose = () => {
|
|
38
|
+
setOpen(false);
|
|
39
|
+
localStorage.setItem(ELICE_MATERIAL_EXERCISE_ARDUINO_AGENT_MODAL_KEY, ELICE_MATERIAL_EXERCISE_ARDUINO_AGENT_MODAL_VALUE);
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
const handleDownload = fileUrl => {
|
|
43
|
+
FileSaver__default["default"].saveAs(fileUrl);
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const renderAgentInstallInstruction = () => {
|
|
47
|
+
return React__default["default"].createElement(React__default["default"].Fragment, null, React__default["default"].createElement(blocks.Text, {
|
|
48
|
+
bold: true,
|
|
49
|
+
role: "gray0"
|
|
50
|
+
}, React__default["default"].createElement(reactIntl.FormattedMessage, {
|
|
51
|
+
id: "exerciseRunner.controller.arduino.agent.instruction.install"
|
|
52
|
+
})), React__default["default"].createElement(blocks.Vspace, {
|
|
53
|
+
height: 0.25
|
|
54
|
+
}), React__default["default"].createElement(blocks.Text, {
|
|
55
|
+
role: "navy",
|
|
56
|
+
size: "small"
|
|
57
|
+
}, React__default["default"].createElement(reactIntl.FormattedMessage, {
|
|
58
|
+
id: "exerciseRunner.controller.arduino.agent.instruction.install.detail"
|
|
59
|
+
})), React__default["default"].createElement(blocks.Vspace, {
|
|
60
|
+
height: 0.75
|
|
61
|
+
}), React__default["default"].createElement(blocks.Flex, null, React__default["default"].createElement(blocks.Button, {
|
|
62
|
+
size: "tiny",
|
|
63
|
+
role: "gray1",
|
|
64
|
+
icon: React__default["default"].createElement(blocks.Icon, {
|
|
65
|
+
icon: icons.eisWindows,
|
|
66
|
+
size: "huge"
|
|
67
|
+
}),
|
|
68
|
+
iconAlign: "left",
|
|
69
|
+
onClick: () => handleDownload(ARDUINO_AGENT_WIN_DOWNLOAD_URL)
|
|
70
|
+
}, React__default["default"].createElement(reactIntl.FormattedMessage, {
|
|
71
|
+
id: "exerciseRunner.controller.arduino.agent.instruction.install.window"
|
|
72
|
+
})), React__default["default"].createElement(blocks.Hspace, {
|
|
73
|
+
width: 0.75
|
|
74
|
+
}), React__default["default"].createElement(blocks.Button, {
|
|
75
|
+
size: "tiny",
|
|
76
|
+
role: "gray1",
|
|
77
|
+
icon: React__default["default"].createElement(blocks.Icon, {
|
|
78
|
+
icon: icons.eisMac
|
|
79
|
+
}),
|
|
80
|
+
iconAlign: "left",
|
|
81
|
+
onClick: () => handleDownload(ARDUINO_AGENT_MAC_DOWNLOAD_URL)
|
|
82
|
+
}, React__default["default"].createElement(reactIntl.FormattedMessage, {
|
|
83
|
+
id: "exerciseRunner.controller.arduino.agent.instruction.install.mac"
|
|
84
|
+
}))));
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
const renderAgentConnectionInstruction = () => {
|
|
88
|
+
return React__default["default"].createElement(React__default["default"].Fragment, null, React__default["default"].createElement(blocks.Text, {
|
|
89
|
+
role: "gray0",
|
|
90
|
+
bold: true
|
|
91
|
+
}, React__default["default"].createElement(reactIntl.FormattedMessage, {
|
|
92
|
+
id: "exerciseRunner.controller.arduino.agent.instruction.connect"
|
|
93
|
+
})), React__default["default"].createElement(blocks.Vspace, {
|
|
94
|
+
height: 0.25
|
|
95
|
+
}), React__default["default"].createElement(blocks.Text, {
|
|
96
|
+
role: "navy",
|
|
97
|
+
size: "small",
|
|
98
|
+
lineHeight: 1.6
|
|
99
|
+
}, React__default["default"].createElement(reactIntl.FormattedMessage, {
|
|
100
|
+
id: "exerciseRunner.controller.arduino.agent.instruction.connect.detail"
|
|
101
|
+
})), React__default["default"].createElement(blocks.Vspace, {
|
|
102
|
+
height: 0.75
|
|
103
|
+
}), React__default["default"].createElement(blocks.Button, {
|
|
104
|
+
icon: React__default["default"].createElement(blocks.Icon, {
|
|
105
|
+
icon: icons.eilArrowRightwardsBasic
|
|
106
|
+
}),
|
|
107
|
+
iconAlign: "right",
|
|
108
|
+
size: "tiny",
|
|
109
|
+
role: "secondary",
|
|
110
|
+
onClick: () => window.open(ARDUINO_AGENT_MANUAL_URL)
|
|
111
|
+
}, React__default["default"].createElement(reactIntl.FormattedMessage, {
|
|
112
|
+
id: "exerciseRunner.controller.arduino.agent.instruction.connect.button"
|
|
113
|
+
})));
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
if (!open) {
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return React__default["default"].createElement(blocks.Modal, {
|
|
121
|
+
theme: "dark",
|
|
122
|
+
title: intl.formatMessage({
|
|
123
|
+
id: 'exerciseRunner.controller.arduino.agent.title'
|
|
124
|
+
}),
|
|
125
|
+
footerButtons: [{
|
|
126
|
+
label: intl.formatMessage({
|
|
127
|
+
id: 'exerciseRunner.controller.arduino.agent.instruction.close'
|
|
128
|
+
}),
|
|
129
|
+
onClick: handleClose
|
|
130
|
+
}],
|
|
131
|
+
onHide: handleClose
|
|
132
|
+
}, React__default["default"].createElement(React__default["default"].Fragment, null, renderAgentInstallInstruction(), React__default["default"].createElement(blocks.Vspace, {
|
|
133
|
+
height: 1.5
|
|
134
|
+
}), renderAgentConnectionInstruction()));
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
module.exports = ExerciseRunnerControllerArduinoAgentModal;
|
package/cjs/components/material-exercise/exercise-runner/ExerciseRunnerControllerButtonGroup.js
CHANGED
|
@@ -59,7 +59,7 @@ const ExerciseRunnerControllerButtonGroup = () => {
|
|
|
59
59
|
const exercise = recoil.useRecoilValue(recoil$1.exerciseState(materialExerciseId));
|
|
60
60
|
const exerciseRunType = recoil.useRecoilValue(recoil$1.exerciseRunnerRunTypeState);
|
|
61
61
|
const exerciseWithNoGrade = Boolean(exercise === null || exercise === void 0 ? void 0 : exercise.isNoSubmitGrade);
|
|
62
|
-
const lecture = recoil.useRecoilValue(recoil$1.exerciseLectureState(exercise === null || exercise === void 0 ? void 0 : exercise.
|
|
62
|
+
const lecture = recoil.useRecoilValue(recoil$1.exerciseLectureState(exercise === null || exercise === void 0 ? void 0 : exercise._lectureId));
|
|
63
63
|
const isTestLecture = (lecture === null || lecture === void 0 ? void 0 : lecture.lectureType) === types.enums.LectureType.Test;
|
|
64
64
|
const isTestLectureCompleted = (lecture === null || lecture === void 0 ? void 0 : lecture.testAdmissionStatus) === types.enums.TestAdmissionStatus.Completed; // runner states
|
|
65
65
|
|
package/cjs/components/material-exercise/exercise-runner/ExerciseRunnerControllerRunningInfo.js
CHANGED
|
@@ -104,15 +104,19 @@ const ExerciseRunnerControllerRunningInfo = () => {
|
|
|
104
104
|
//
|
|
105
105
|
|
|
106
106
|
React__default["default"].useEffect(() => {
|
|
107
|
-
if (exercise
|
|
108
|
-
|
|
109
|
-
courseId: exercise.courseId
|
|
110
|
-
}).then(({
|
|
111
|
-
course
|
|
112
|
-
}) => {
|
|
113
|
-
setCourse(course);
|
|
114
|
-
}).catch(console.error);
|
|
107
|
+
if (!exercise) {
|
|
108
|
+
return;
|
|
115
109
|
}
|
|
110
|
+
|
|
111
|
+
const abortCtrl = new AbortController();
|
|
112
|
+
apiClient.getOrgCourseGet({
|
|
113
|
+
courseId: exercise._courseId
|
|
114
|
+
}, {
|
|
115
|
+
signal: abortCtrl.signal
|
|
116
|
+
}).then(res => res.course).then(setCourse).catch(console.error);
|
|
117
|
+
return () => {
|
|
118
|
+
abortCtrl.abort();
|
|
119
|
+
};
|
|
116
120
|
}, [exercise]);
|
|
117
121
|
/**
|
|
118
122
|
* Last running score.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var phrasesEn = {"exerciseRunner.controller.arduino.connectionStatus.connected":"Connected to Arduino","exerciseRunner.controller.arduino.connectionStatus.connectedDevice":"Connected to {device}","exerciseRunner.controller.arduino.connectionStatus.connecting":"Connecting to Elice Arduino Agent","exerciseRunner.controller.arduino.connectionStatus.disconnected":"Disconnected from Elice Arduino Agent","exerciseRunner.controller.arduino.connectionStatus.noDevice":"No connected device","exerciseRunner.controller.arduino.connectionStatus.reconnecting":"Connecting to Elice Arduino Agent","exerciseRunner.controller.arduino.connectionStatus.uploading":"Uploading...","exerciseRunner.controller.buttonGroup.button.compile":"Compile","exerciseRunner.controller.buttonGroup.button.helpRequest":"Help me","exerciseRunner.controller.buttonGroup.button.run":"Run","exerciseRunner.controller.buttonGroup.button.stop":"Stop","exerciseRunner.controller.buttonGroup.button.submit":"Submit","exerciseRunner.controller.buttonGroup.button.submit.tooltip.noSubmit":"Exercise without submission","exerciseRunner.controller.buttonGroup.button.syncRequest":"Sync code","exerciseRunner.controller.buttonGroup.button.tooltip.aiHelp":"A function to get help from AI has been added.","exerciseRunner.controller.runningInfo.error.fetch":"An error occurred while fetching running info","exerciseRunner.controller.runningInfo.lastRunningDatetime":"Last running datetime","exerciseRunner.controller.runningInfo.lastSubmitDatetime":"Last submit datetime","exerciseRunner.controller.runningInfo.lastSubmitScore":"Last submit score","exerciseRunner.controller.runningInfo.score":"{score}","exerciseRunner.controller.statusMessage.closed":"Editor disconnected","exerciseRunner.controller.statusMessage.connecting":"Connecting to editor...","exerciseRunner.controller.statusMessage.open":"Editor connected","exerciseRunner.controller.timer.runningRemainingTime":"Remaining: {remainingTime}","exerciseRunner.submitErrorDialog.action.confirm":"OK","exerciseRunner.submitErrorDialog.action.reload":"Reload page","exerciseRunner.submitErrorDialog.body.commonError":"An error occurred while running the code.\nPlease refresh and try again.","exerciseRunner.submitErrorDialog.body.exceedSubmitGradeLimit":"You have exceeded the allowed number of lab submissions.","exerciseRunner.submitErrorDialog.body.expiredExerciseImage":"The exercise image has been updated.\nPlease refresh and try again.","exerciseRunner.submitErrorDialog.body.networkError":"An error occurred while running the code.\nPlease refresh and try again.\nIf the problem persists, please check the network status.","exerciseRunner.submitErrorDialog.body.notForSubmitGrade":"This exercise is not allowed to be submitted.","exerciseRunner.submitErrorDialog.body.notPreparedRoom":"The exercise room is being prepared.\nPlease try again later.","exerciseRunner.submitErrorDialog.body.roomIsBusy":"The exercise room is running.\nPlease wait a moment.","exerciseRunner.submitErrorDialog.body.unknown":"An error occurred while running the code.\nPlease try again later.","exerciseRunner.submitErrorDialog.title":"Unable to run the code"};
|
|
3
|
+
var phrasesEn = {"exerciseRunner.controller.arduino.connectionStatus.connected":"Connected to Arduino","exerciseRunner.controller.arduino.connectionStatus.connectedDevice":"Connected to {device}","exerciseRunner.controller.arduino.connectionStatus.connecting":"Connecting to Elice Arduino Agent","exerciseRunner.controller.arduino.connectionStatus.disconnected":"Disconnected from Elice Arduino Agent","exerciseRunner.controller.arduino.connectionStatus.noDevice":"No connected device","exerciseRunner.controller.arduino.connectionStatus.reconnecting":"Connecting to Elice Arduino Agent","exerciseRunner.controller.arduino.connectionStatus.uploading":"Uploading...","exerciseRunner.controller.arduino.agent.title":"Connect to Agent","exerciseRunner.controller.arduino.agent.instruction.install":"1. Install Elice arduino agent","exerciseRunner.controller.arduino.agent.instruction.install.detail":"Install 'elice-arduino-agent' program to connect to arduino.","exerciseRunner.controller.arduino.agent.instruction.install.window":"Download for Windows","exerciseRunner.controller.arduino.agent.instruction.install.mac":"Download for MacOS","exerciseRunner.controller.arduino.agent.instruction.connect":"2. Connect to arduino","exerciseRunner.controller.arduino.agent.instruction.connect.detail":"After the download is completed, it should be connected to exercise environment. If connection is unavailable, please follow the manual.\nClick the button below to read the manual.","exerciseRunner.controller.arduino.agent.instruction.connect.button":"Go to Manual","exerciseRunner.controller.arduino.agent.instruction.close":"Close","exerciseRunner.controller.buttonGroup.button.compile":"Compile","exerciseRunner.controller.buttonGroup.button.helpRequest":"Help me","exerciseRunner.controller.buttonGroup.button.run":"Run","exerciseRunner.controller.buttonGroup.button.stop":"Stop","exerciseRunner.controller.buttonGroup.button.submit":"Submit","exerciseRunner.controller.buttonGroup.button.submit.tooltip.noSubmit":"Exercise without submission","exerciseRunner.controller.buttonGroup.button.syncRequest":"Sync code","exerciseRunner.controller.buttonGroup.button.tooltip.aiHelp":"A function to get help from AI has been added.","exerciseRunner.controller.runningInfo.error.fetch":"An error occurred while fetching running info","exerciseRunner.controller.runningInfo.lastRunningDatetime":"Last running datetime","exerciseRunner.controller.runningInfo.lastSubmitDatetime":"Last submit datetime","exerciseRunner.controller.runningInfo.lastSubmitScore":"Last submit score","exerciseRunner.controller.runningInfo.score":"{score}","exerciseRunner.controller.statusMessage.closed":"Editor disconnected","exerciseRunner.controller.statusMessage.connecting":"Connecting to editor...","exerciseRunner.controller.statusMessage.open":"Editor connected","exerciseRunner.controller.timer.runningRemainingTime":"Remaining: {remainingTime}","exerciseRunner.submitErrorDialog.action.confirm":"OK","exerciseRunner.submitErrorDialog.action.reload":"Reload page","exerciseRunner.submitErrorDialog.body.commonError":"An error occurred while running the code.\nPlease refresh and try again.","exerciseRunner.submitErrorDialog.body.exceedSubmitGradeLimit":"You have exceeded the allowed number of lab submissions.","exerciseRunner.submitErrorDialog.body.expiredExerciseImage":"The exercise image has been updated.\nPlease refresh and try again.","exerciseRunner.submitErrorDialog.body.networkError":"An error occurred while running the code.\nPlease refresh and try again.\nIf the problem persists, please check the network status.","exerciseRunner.submitErrorDialog.body.notForSubmitGrade":"This exercise is not allowed to be submitted.","exerciseRunner.submitErrorDialog.body.notPreparedRoom":"The exercise room is being prepared.\nPlease try again later.","exerciseRunner.submitErrorDialog.body.roomIsBusy":"The exercise room is running.\nPlease wait a moment.","exerciseRunner.submitErrorDialog.body.unknown":"An error occurred while running the code.\nPlease try again later.","exerciseRunner.submitErrorDialog.title":"Unable to run the code"};
|
|
4
4
|
|
|
5
5
|
module.exports = phrasesEn;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var phrasesKo = {"exerciseRunner.controller.arduino.connectionStatus.connected":"아두이노 기기 연결됨","exerciseRunner.controller.arduino.connectionStatus.connectedDevice":"{device} 연결됨","exerciseRunner.controller.arduino.connectionStatus.connecting":"엘리스 아두이노 에이전트 연결 중","exerciseRunner.controller.arduino.connectionStatus.disconnected":"엘리스 아두이노 에이전트 연결 끊김","exerciseRunner.controller.arduino.connectionStatus.noDevice":"연결된 기기 없음","exerciseRunner.controller.arduino.connectionStatus.reconnecting":"엘리스 아두이노 에이전트 연결 중","exerciseRunner.controller.arduino.connectionStatus.uploading":"업로드 중","exerciseRunner.controller.buttonGroup.button.compile":"컴파일","exerciseRunner.controller.buttonGroup.button.helpRequest":"도와주세요","exerciseRunner.controller.buttonGroup.button.run":"실행","exerciseRunner.controller.buttonGroup.button.stop":"정지","exerciseRunner.controller.buttonGroup.button.submit":"제출","exerciseRunner.controller.buttonGroup.button.submit.tooltip.noSubmit":"실행만 가능한 실습입니다.","exerciseRunner.controller.buttonGroup.button.syncRequest":"코드 동기화","exerciseRunner.controller.buttonGroup.button.tooltip.aiHelp":"AI에게 도움받기 기능이 추가되었어요.","exerciseRunner.controller.runningInfo.error.fetch":"최종 실행 내역을 가져오는데 문제가 발생하였습니다.","exerciseRunner.controller.runningInfo.lastRunningDatetime":"최종 실행 시간","exerciseRunner.controller.runningInfo.lastSubmitDatetime":"최종 제출 시간","exerciseRunner.controller.runningInfo.lastSubmitScore":"최종 제출 점수","exerciseRunner.controller.runningInfo.score":"{score} 점","exerciseRunner.controller.statusMessage.closed":"에디터 연결 끊김","exerciseRunner.controller.statusMessage.connecting":"에디터 연결 중...","exerciseRunner.controller.statusMessage.open":"에디터 연결됨","exerciseRunner.controller.timer.runningRemainingTime":"실행 제한시간: {remainingTime}","exerciseRunner.submitErrorDialog.action.confirm":"확인","exerciseRunner.submitErrorDialog.action.reload":"새로고침","exerciseRunner.submitErrorDialog.body.commonError":"코드 실행 중 오류가 발생했습니다.\n새로고침 후 다시 시도해주세요.","exerciseRunner.submitErrorDialog.body.exceedSubmitGradeLimit":"실습 제출 허용 횟수를 초과했습니다.","exerciseRunner.submitErrorDialog.body.expiredExerciseImage":"실습환경이 업데이트 되었습니다.\n새로고침 후 다시 시도해주세요.","exerciseRunner.submitErrorDialog.body.networkError":"코드 실행 중 오류가 발생했습니다.\n새로고침 후 다시 시도해주세요.\n문제가 계속되면 네트워크 상태를 확인해주세요.","exerciseRunner.submitErrorDialog.body.notForSubmitGrade":"제출이 허용되지 않은 실습입니다.","exerciseRunner.submitErrorDialog.body.notPreparedRoom":"실습환경이 준비 중입니다.\n잠시 후 다시 시도해주세요.","exerciseRunner.submitErrorDialog.body.roomIsBusy":"실습을 실행하고 있습니다.\n잠시만 기다려주세요.","exerciseRunner.submitErrorDialog.body.unknown":"코드 실행 중 오류가 발생했습니다.\n잠시 후 다시 시도해주세요.","exerciseRunner.submitErrorDialog.title":"실습을 실행할 수 없습니다"};
|
|
3
|
+
var phrasesKo = {"exerciseRunner.controller.arduino.connectionStatus.connected":"아두이노 기기 연결됨","exerciseRunner.controller.arduino.connectionStatus.connectedDevice":"{device} 연결됨","exerciseRunner.controller.arduino.connectionStatus.connecting":"엘리스 아두이노 에이전트 연결 중","exerciseRunner.controller.arduino.connectionStatus.disconnected":"엘리스 아두이노 에이전트 연결 끊김","exerciseRunner.controller.arduino.connectionStatus.noDevice":"연결된 기기 없음","exerciseRunner.controller.arduino.connectionStatus.reconnecting":"엘리스 아두이노 에이전트 연결 중","exerciseRunner.controller.arduino.connectionStatus.uploading":"업로드 중","exerciseRunner.controller.arduino.agent.title":"에이전트 연결","exerciseRunner.controller.arduino.agent.instruction.install":"1. 엘리스 아두이노 에이전트 설치하기","exerciseRunner.controller.arduino.agent.instruction.install.detail":"아두이노와 연결하기 위해 ‘엘리스 아두이노 에이전트'를 설치해주세요.","exerciseRunner.controller.arduino.agent.instruction.install.window":"Windows 용 설치","exerciseRunner.controller.arduino.agent.instruction.install.mac":"MacOS 용 설치","exerciseRunner.controller.arduino.agent.instruction.connect":"2. 연결하기","exerciseRunner.controller.arduino.agent.instruction.connect.detail":"다운로드를 완료하였다면 실습 환경과 연결이 필요합니다. 연결되지 않을 경우 매뉴얼을 확인하세요.\n아래 버튼을 클릭해 매뉴얼을 확인하실 수 있습니다.","exerciseRunner.controller.arduino.agent.instruction.connect.button":"매뉴얼 이동","exerciseRunner.controller.arduino.agent.instruction.close":"닫기","exerciseRunner.controller.buttonGroup.button.compile":"컴파일","exerciseRunner.controller.buttonGroup.button.helpRequest":"도와주세요","exerciseRunner.controller.buttonGroup.button.run":"실행","exerciseRunner.controller.buttonGroup.button.stop":"정지","exerciseRunner.controller.buttonGroup.button.submit":"제출","exerciseRunner.controller.buttonGroup.button.submit.tooltip.noSubmit":"실행만 가능한 실습입니다.","exerciseRunner.controller.buttonGroup.button.syncRequest":"코드 동기화","exerciseRunner.controller.buttonGroup.button.tooltip.aiHelp":"AI에게 도움받기 기능이 추가되었어요.","exerciseRunner.controller.runningInfo.error.fetch":"최종 실행 내역을 가져오는데 문제가 발생하였습니다.","exerciseRunner.controller.runningInfo.lastRunningDatetime":"최종 실행 시간","exerciseRunner.controller.runningInfo.lastSubmitDatetime":"최종 제출 시간","exerciseRunner.controller.runningInfo.lastSubmitScore":"최종 제출 점수","exerciseRunner.controller.runningInfo.score":"{score} 점","exerciseRunner.controller.statusMessage.closed":"에디터 연결 끊김","exerciseRunner.controller.statusMessage.connecting":"에디터 연결 중...","exerciseRunner.controller.statusMessage.open":"에디터 연결됨","exerciseRunner.controller.timer.runningRemainingTime":"실행 제한시간: {remainingTime}","exerciseRunner.submitErrorDialog.action.confirm":"확인","exerciseRunner.submitErrorDialog.action.reload":"새로고침","exerciseRunner.submitErrorDialog.body.commonError":"코드 실행 중 오류가 발생했습니다.\n새로고침 후 다시 시도해주세요.","exerciseRunner.submitErrorDialog.body.exceedSubmitGradeLimit":"실습 제출 허용 횟수를 초과했습니다.","exerciseRunner.submitErrorDialog.body.expiredExerciseImage":"실습환경이 업데이트 되었습니다.\n새로고침 후 다시 시도해주세요.","exerciseRunner.submitErrorDialog.body.networkError":"코드 실행 중 오류가 발생했습니다.\n새로고침 후 다시 시도해주세요.\n문제가 계속되면 네트워크 상태를 확인해주세요.","exerciseRunner.submitErrorDialog.body.notForSubmitGrade":"제출이 허용되지 않은 실습입니다.","exerciseRunner.submitErrorDialog.body.notPreparedRoom":"실습환경이 준비 중입니다.\n잠시 후 다시 시도해주세요.","exerciseRunner.submitErrorDialog.body.roomIsBusy":"실습을 실행하고 있습니다.\n잠시만 기다려주세요.","exerciseRunner.submitErrorDialog.body.unknown":"코드 실행 중 오류가 발생했습니다.\n잠시 후 다시 시도해주세요.","exerciseRunner.submitErrorDialog.title":"실습을 실행할 수 없습니다"};
|
|
4
4
|
|
|
5
5
|
module.exports = phrasesKo;
|
|
@@ -16,7 +16,7 @@ var styled__default = /*#__PURE__*/_interopDefaultLegacy(styled);
|
|
|
16
16
|
|
|
17
17
|
const StyledMenuButtonWrap = styled__default["default"].span.withConfig({
|
|
18
18
|
componentId: "sc-48m0vh-0"
|
|
19
|
-
})(["position:relative;
|
|
19
|
+
})(["position:relative;"]);
|
|
20
20
|
const StyledMenuButton = styled__default["default"](blocks.IconButton).withConfig({
|
|
21
21
|
componentId: "sc-48m0vh-1"
|
|
22
22
|
})(["", ""], ({
|
|
@@ -37,8 +37,8 @@ const ExerciseProvider = _a => {
|
|
|
37
37
|
const exercise = useRecoilValue(exerciseState(materialExerciseId));
|
|
38
38
|
const exerciseRoom = useRecoilValue(exerciseRoomState(exerciseRoomId)); // lecture
|
|
39
39
|
|
|
40
|
-
const lecture = useRecoilValue(exerciseLectureState(exercise === null || exercise === void 0 ? void 0 : exercise.
|
|
41
|
-
const resetLecture = useResetRecoilState(exerciseLectureState(exercise === null || exercise === void 0 ? void 0 : exercise.
|
|
40
|
+
const lecture = useRecoilValue(exerciseLectureState(exercise === null || exercise === void 0 ? void 0 : exercise._lectureId));
|
|
41
|
+
const resetLecture = useResetRecoilState(exerciseLectureState(exercise === null || exercise === void 0 ? void 0 : exercise._lectureId)); // multilang languages
|
|
42
42
|
|
|
43
43
|
const exerciseMultilangLanguages = useRecoilValue(exerciseMultilangLanguagesState(exercise === null || exercise === void 0 ? void 0 : exercise.id));
|
|
44
44
|
const resetExerciseMultilangLanguages = useResetRecoilState(exerciseMultilangLanguagesState(exercise === null || exercise === void 0 ? void 0 : exercise.id)); // etc
|
|
@@ -76,7 +76,7 @@ const ExerciseProvider = _a => {
|
|
|
76
76
|
//
|
|
77
77
|
|
|
78
78
|
React.useEffect(() => {
|
|
79
|
-
if (!(exercise === null || exercise === void 0 ? void 0 : exercise.
|
|
79
|
+
if (!(exercise === null || exercise === void 0 ? void 0 : exercise._lectureId)) {
|
|
80
80
|
return;
|
|
81
81
|
}
|
|
82
82
|
|
|
@@ -122,6 +122,10 @@ export declare const exerciseArduinoAgentConnectionState: import("recoil").Recoi
|
|
|
122
122
|
* Arduino upload progress.
|
|
123
123
|
*/
|
|
124
124
|
export declare const exerciseArduinoUploadProgressState: import("recoil").RecoilState<ArduinoUploadProgressStatus>;
|
|
125
|
+
/**
|
|
126
|
+
* Arduino agent modal open status.
|
|
127
|
+
*/
|
|
128
|
+
export declare const exerciseArduinoAgentModalState: import("recoil").RecoilState<boolean>;
|
|
125
129
|
/**
|
|
126
130
|
*
|
|
127
131
|
*/
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { postGlobalAccountPreferenceEdit, postOrgMaterialExerciseExerciseRoomUserFileAdd, getOrgLectureGet, getOrgMaterialExerciseGet, getOrgMaterialExerciseExerciseRoomGet, getOrgUserGet, getGlobalAccountPreferenceGet, getOrgMaterialExerciseExerciseImageExerciseFileGet, getOrgMaterialExerciseExerciseRoomUserFileGet } from '@elice/api-client';
|
|
1
|
+
import { postGlobalAccountPreferenceEdit, postOrgMaterialExerciseExerciseRoomUserFileAdd, getOrgLectureGet, getOrgMaterialExerciseGet, getOrgLecturePageResolve, getOrgMaterialExerciseExerciseRoomGet, getOrgUserGet, getGlobalAccountPreferenceGet, getOrgMaterialExerciseExerciseImageExerciseFileGet, getOrgMaterialExerciseExerciseRoomUserFileGet } from '@elice/api-client';
|
|
2
2
|
import { enums } from '@elice/types';
|
|
3
3
|
import { EliceWebSocket } from '@elice/websocket';
|
|
4
4
|
import { camelizeKeys } from 'humps';
|
|
@@ -66,7 +66,17 @@ const exerciseState = atomFamily({
|
|
|
66
66
|
const get = async () => {
|
|
67
67
|
setSelf(await getOrgMaterialExerciseGet({
|
|
68
68
|
materialExerciseId
|
|
69
|
-
}).then(res => res.materialExercise).
|
|
69
|
+
}).then(res => res.materialExercise).then(materialExercise => Promise.all([materialExercise, getOrgLecturePageResolve({
|
|
70
|
+
materialId: materialExercise.id,
|
|
71
|
+
materialType: enums.LectureMaterialType.Exercise
|
|
72
|
+
}).then(res => ({
|
|
73
|
+
_courseId: res.courseId,
|
|
74
|
+
_lectureId: res.lectureId,
|
|
75
|
+
_lecturePageId: res.lecturePageId,
|
|
76
|
+
_orderNo: res.orderNo
|
|
77
|
+
})).catch(err => {
|
|
78
|
+
throw err;
|
|
79
|
+
})])).then(([materialExercise, lecturePageResolve]) => Object.assign(Object.assign({}, materialExercise), lecturePageResolve)).catch(() => null));
|
|
70
80
|
};
|
|
71
81
|
|
|
72
82
|
if (trigger === 'get') {
|
|
@@ -546,6 +556,14 @@ const exerciseArduinoAgentConnectionState = atom({
|
|
|
546
556
|
const exerciseArduinoUploadProgressState = atom({
|
|
547
557
|
key: `${KEY_PREFIX}/Arduino/UploadProgressState`,
|
|
548
558
|
default: 'ready'
|
|
559
|
+
});
|
|
560
|
+
/**
|
|
561
|
+
* Arduino agent modal open status.
|
|
562
|
+
*/
|
|
563
|
+
|
|
564
|
+
const exerciseArduinoAgentModalState = atom({
|
|
565
|
+
key: `${KEY_PREFIX}/Arduino/AgentModalState`,
|
|
566
|
+
default: false
|
|
549
567
|
}); //
|
|
550
568
|
// =============== others ===============
|
|
551
569
|
//
|
|
@@ -597,4 +615,4 @@ const exerciseFileEditorCursorSelectionValueState = atom({
|
|
|
597
615
|
default: null
|
|
598
616
|
});
|
|
599
617
|
|
|
600
|
-
export { exerciseActiveFilenameState, exerciseArduinoAgentConnectionState, exerciseArduinoOnSelectPortState, exerciseArduinoOpenedPortNameState, exerciseArduinoPortsState, exerciseArduinoPreferenceState, exerciseArduinoUploadProgressState, exerciseContainerSizeState, exerciseEditorPreferenceState, exerciseFileEditorCursorSelectionValueState, exerciseFileEditorCursorState, exerciseFileTabsOpenedState, exerciseFileTreeOpenedState, exerciseLectureState, exerciseMultilangEnvironmentState, exerciseMultilangLanguagesState, exercisePreviewDisplayModeState, exercisePreviewTypeState, exerciseRightpaneActiveState, exerciseRoomState, exerciseRunnerRoomConnectionInfoState, exerciseRunnerRunTypeState, exerciseRunnerRunningState, exerciseRunnerStdioFilesState, exerciseRunnerSubmittingState, exerciseRunnerWebSocketStatusQuery, exerciseState, exerciseUserState, exerciseWebsocketQuery, exerciseWebsocketStates };
|
|
618
|
+
export { exerciseActiveFilenameState, exerciseArduinoAgentConnectionState, exerciseArduinoAgentModalState, exerciseArduinoOnSelectPortState, exerciseArduinoOpenedPortNameState, exerciseArduinoPortsState, exerciseArduinoPreferenceState, exerciseArduinoUploadProgressState, exerciseContainerSizeState, exerciseEditorPreferenceState, exerciseFileEditorCursorSelectionValueState, exerciseFileEditorCursorState, exerciseFileTabsOpenedState, exerciseFileTreeOpenedState, exerciseLectureState, exerciseMultilangEnvironmentState, exerciseMultilangLanguagesState, exercisePreviewDisplayModeState, exercisePreviewTypeState, exerciseRightpaneActiveState, exerciseRoomState, exerciseRunnerRoomConnectionInfoState, exerciseRunnerRunTypeState, exerciseRunnerRunningState, exerciseRunnerStdioFilesState, exerciseRunnerSubmittingState, exerciseRunnerWebSocketStatusQuery, exerciseState, exerciseUserState, exerciseWebsocketQuery, exerciseWebsocketStates };
|
|
@@ -10,7 +10,12 @@ export declare type AtomLectureState = GetOrgLectureGetResponses['lecture'] | nu
|
|
|
10
10
|
/**
|
|
11
11
|
* Material exercise.
|
|
12
12
|
*/
|
|
13
|
-
export declare type AtomExerciseState = GetOrgMaterialExerciseGetResponses['materialExercise']
|
|
13
|
+
export declare type AtomExerciseState = (GetOrgMaterialExerciseGetResponses['materialExercise'] & {
|
|
14
|
+
_courseId: number;
|
|
15
|
+
_lectureId: number;
|
|
16
|
+
_lecturePageId: number;
|
|
17
|
+
_orderNo: number;
|
|
18
|
+
}) | null;
|
|
14
19
|
/**
|
|
15
20
|
* Material exercise room.
|
|
16
21
|
*/
|
|
@@ -47,7 +47,7 @@ const ExerciseFileEditor = () => {
|
|
|
47
47
|
} = React.useContext(ExerciseContext);
|
|
48
48
|
const exercise = useRecoilValue(exerciseState(materialExerciseId));
|
|
49
49
|
const exerciseRoom = useRecoilValue(exerciseRoomState(exerciseRoomId));
|
|
50
|
-
const lecture = useRecoilValue(exerciseLectureState(exercise === null || exercise === void 0 ? void 0 : exercise.
|
|
50
|
+
const lecture = useRecoilValue(exerciseLectureState(exercise === null || exercise === void 0 ? void 0 : exercise._lectureId));
|
|
51
51
|
const preference = useRecoilValue(exerciseEditorPreferenceState);
|
|
52
52
|
const activeFilename = useRecoilValue(exerciseActiveFilenameState);
|
|
53
53
|
const readOnly = readOnlyEditor || readOnlyActiveFile;
|
|
@@ -11,6 +11,7 @@ import '../context/ExerciseProvider.js';
|
|
|
11
11
|
import { withExerciseIntlProvider } from '../context/ExerciseIntlProvider.js';
|
|
12
12
|
import phrasesEn from './locales/en.json.js';
|
|
13
13
|
import phrasesKo from './locales/ko.json.js';
|
|
14
|
+
import ExerciseMenuArduinoAgentModalButton from './ExerciseMenuArduinoAgentModalButton.js';
|
|
14
15
|
import ExerciseMenuArduinoSettings from './ExerciseMenuArduinoSettings.js';
|
|
15
16
|
import ExerciseMenuDropdown from './ExerciseMenuDropdown.js';
|
|
16
17
|
import ExerciseMenuReset from './ExerciseMenuReset.js';
|
|
@@ -18,7 +19,7 @@ import ExerciseMenuStdioFileBrowser from './ExerciseMenuStdioFileBrowser.js';
|
|
|
18
19
|
|
|
19
20
|
const StyledExerciseMenuWrapper = styled.div.withConfig({
|
|
20
21
|
componentId: "sc-1gf6m87-0"
|
|
21
|
-
})(["display:flex;justify-content:center;align-items:center;padding:0 0.5rem 0 1rem;height:2.25rem;background-color:", ";"], base.color.navy8);
|
|
22
|
+
})(["display:flex;justify-content:center;align-items:center;padding:0 0.5rem 0 1rem;height:2.25rem;gap:0.5rem;background-color:", ";"], base.color.navy8);
|
|
22
23
|
|
|
23
24
|
const ExerciseMenu = () => {
|
|
24
25
|
const {
|
|
@@ -29,7 +30,7 @@ const ExerciseMenu = () => {
|
|
|
29
30
|
//
|
|
30
31
|
//
|
|
31
32
|
|
|
32
|
-
return React.createElement(StyledExerciseMenuWrapper, null, isArduinoExercise ? React.createElement(ExerciseMenuArduinoSettings, null) : React.createElement(ExerciseMenuStdioFileBrowser, null), React.createElement(ExerciseMenuReset, null), React.createElement(ExerciseMenuDropdown, null));
|
|
33
|
+
return React.createElement(StyledExerciseMenuWrapper, null, isArduinoExercise ? React.createElement(React.Fragment, null, React.createElement(ExerciseMenuArduinoAgentModalButton, null), React.createElement(ExerciseMenuArduinoSettings, null)) : React.createElement(ExerciseMenuStdioFileBrowser, null), React.createElement(ExerciseMenuReset, null), React.createElement(ExerciseMenuDropdown, null));
|
|
33
34
|
};
|
|
34
35
|
|
|
35
36
|
var ExerciseMenu$1 = withExerciseIntlProvider(ExerciseMenu, {
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { FormattedMessage } from 'react-intl';
|
|
3
|
+
import { Button, Icon } from '@elice/blocks';
|
|
4
|
+
import { eilStatusDanger } from '@elice/icons';
|
|
5
|
+
import { useSetRecoilState } from 'recoil';
|
|
6
|
+
import { exerciseArduinoAgentModalState } from '../context/recoil.js';
|
|
7
|
+
import '../context/context.js';
|
|
8
|
+
import '../context/recoilTypes.js';
|
|
9
|
+
import '../context/subjects.js';
|
|
10
|
+
import '../context/ExerciseProvider.js';
|
|
11
|
+
|
|
12
|
+
const ExerciseMenuArduinoAgentModalButton = () => {
|
|
13
|
+
const setOpen = useSetRecoilState(exerciseArduinoAgentModalState);
|
|
14
|
+
|
|
15
|
+
const handleClick = () => {
|
|
16
|
+
setOpen(true);
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
return React.createElement(Button, {
|
|
20
|
+
size: "micro",
|
|
21
|
+
role: "warning",
|
|
22
|
+
icon: React.createElement(Icon, {
|
|
23
|
+
icon: eilStatusDanger
|
|
24
|
+
}),
|
|
25
|
+
iconAlign: "left",
|
|
26
|
+
border: false,
|
|
27
|
+
onClick: handleClick
|
|
28
|
+
}, React.createElement(FormattedMessage, {
|
|
29
|
+
id: "exerciseMenu.arduino.agent.button"
|
|
30
|
+
}));
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export { ExerciseMenuArduinoAgentModalButton as default };
|
|
@@ -21,7 +21,7 @@ const ExerciseMenuDropdown = () => {
|
|
|
21
21
|
} = React.useContext(ExerciseContext);
|
|
22
22
|
const user = useRecoilValue(exerciseUserState);
|
|
23
23
|
const exercise = useRecoilValue(exerciseState(materialExerciseId));
|
|
24
|
-
const lecture = useRecoilValue(exerciseLectureState(exercise === null || exercise === void 0 ? void 0 : exercise.
|
|
24
|
+
const lecture = useRecoilValue(exerciseLectureState(exercise === null || exercise === void 0 ? void 0 : exercise._lectureId));
|
|
25
25
|
const activeFilename = useRecoilValue(exerciseActiveFilenameState);
|
|
26
26
|
const setRightpaneActiveState = useSetRecoilState(exerciseRightpaneActiveState);
|
|
27
27
|
const [isSubmitHistoryModalOpen, setIsSubmitHistoryModalOpen] = React.useState(false);
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var phrasesEn = {"exerciseMenu.dropdown.button.tooltip":"More","exerciseMenu.dropdown.item.codeHistory":"Submit History","exerciseMenu.dropdown.item.environment":"Environment","exerciseMenu.dropdown.item.preference":"Editor Preferences","exerciseMenu.dropdown.item.room":"Code Sharing","exerciseMenu.dropdown.item.submitHistory":"Code History","exerciseMenu.reset.button.tooltip.disabled":"The file cannot be reset","exerciseMenu.reset.button.tooltip.enabled":"Reset the file","exerciseMenu.reset.confirmDialog.body":"Are you sure you want to clear all the code you wrote at current file and reset it?","exerciseMenu.reset.confirmDialog.cancel":"Cencel","exerciseMenu.reset.confirmDialog.confirm":"Confirm","exerciseMenu.reset.confirmDialog.title":"Reset the file","exerciseMenu.stdioFileBrowser.button.tooltip":"File","exerciseMenu.stdioFileBrowser.popover.body.placeholder":"Files sent from your code\nappear here.","exerciseMenu.stdioFileBrowser.popover.header":"File"};
|
|
1
|
+
var phrasesEn = {"exerciseMenu.dropdown.button.tooltip":"More","exerciseMenu.dropdown.item.codeHistory":"Submit History","exerciseMenu.dropdown.item.environment":"Environment","exerciseMenu.dropdown.item.preference":"Editor Preferences","exerciseMenu.dropdown.item.room":"Code Sharing","exerciseMenu.dropdown.item.submitHistory":"Code History","exerciseMenu.arduino.agent.button":"Having problem with connecting to arduino?","exerciseMenu.reset.button.tooltip.disabled":"The file cannot be reset","exerciseMenu.reset.button.tooltip.enabled":"Reset the file","exerciseMenu.reset.confirmDialog.body":"Are you sure you want to clear all the code you wrote at current file and reset it?","exerciseMenu.reset.confirmDialog.cancel":"Cencel","exerciseMenu.reset.confirmDialog.confirm":"Confirm","exerciseMenu.reset.confirmDialog.title":"Reset the file","exerciseMenu.stdioFileBrowser.button.tooltip":"File","exerciseMenu.stdioFileBrowser.popover.body.placeholder":"Files sent from your code\nappear here.","exerciseMenu.stdioFileBrowser.popover.header":"File"};
|
|
2
2
|
|
|
3
3
|
export { phrasesEn as default };
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var phrasesKo = {"exerciseMenu.dropdown.button.tooltip":"더 보기","exerciseMenu.dropdown.item.codeHistory":"코드 수정 이력","exerciseMenu.dropdown.item.environment":"실습 환경","exerciseMenu.dropdown.item.preference":"에디터 설정","exerciseMenu.dropdown.item.room":"코드 공유","exerciseMenu.dropdown.item.submitHistory":"실행/제출 이력","exerciseMenu.reset.button.tooltip.disabled":"해당 파일은 초기화를 할 수 없습니다","exerciseMenu.reset.button.tooltip.enabled":"코드 초기화","exerciseMenu.reset.confirmDialog.body":"작성한 코드를 모두 지우고 초기화하시겠습니까?","exerciseMenu.reset.confirmDialog.cancel":"취소","exerciseMenu.reset.confirmDialog.confirm":"확인","exerciseMenu.reset.confirmDialog.title":"코드 초기화","exerciseMenu.stdioFileBrowser.button.tooltip":"파일","exerciseMenu.stdioFileBrowser.popover.body.placeholder":"코드에서 전송한 파일이\n여기에 표시됩니다.","exerciseMenu.stdioFileBrowser.popover.header":"파일"};
|
|
1
|
+
var phrasesKo = {"exerciseMenu.dropdown.button.tooltip":"더 보기","exerciseMenu.dropdown.item.codeHistory":"코드 수정 이력","exerciseMenu.dropdown.item.environment":"실습 환경","exerciseMenu.dropdown.item.preference":"에디터 설정","exerciseMenu.dropdown.item.room":"코드 공유","exerciseMenu.dropdown.item.submitHistory":"실행/제출 이력","exerciseMenu.arduino.agent.button":"아두이노 연결 중 문제가 발생했나요?","exerciseMenu.reset.button.tooltip.disabled":"해당 파일은 초기화를 할 수 없습니다","exerciseMenu.reset.button.tooltip.enabled":"코드 초기화","exerciseMenu.reset.confirmDialog.body":"작성한 코드를 모두 지우고 초기화하시겠습니까?","exerciseMenu.reset.confirmDialog.cancel":"취소","exerciseMenu.reset.confirmDialog.confirm":"확인","exerciseMenu.reset.confirmDialog.title":"코드 초기화","exerciseMenu.stdioFileBrowser.button.tooltip":"파일","exerciseMenu.stdioFileBrowser.popover.body.placeholder":"코드에서 전송한 파일이\n여기에 표시됩니다.","exerciseMenu.stdioFileBrowser.popover.header":"파일"};
|
|
2
2
|
|
|
3
3
|
export { phrasesKo as default };
|
|
@@ -26,7 +26,7 @@ const MaterialExerciseExerciseRoomDetail = ({
|
|
|
26
26
|
goToList,
|
|
27
27
|
onHide
|
|
28
28
|
}) => {
|
|
29
|
-
var _a, _b, _c, _d, _e
|
|
29
|
+
var _a, _b, _c, _d, _e;
|
|
30
30
|
|
|
31
31
|
const intl = useIntl();
|
|
32
32
|
const {
|
|
@@ -44,7 +44,7 @@ const MaterialExerciseExerciseRoomDetail = ({
|
|
|
44
44
|
const [isLeaveDialogOpen, setIsLeaveDialogOpen] = React.useState(false);
|
|
45
45
|
const [isDeleting, setIsDeleting] = React.useState(false);
|
|
46
46
|
const isThisChatRoomOwner = (_b = ((_a = exerciseRoom === null || exerciseRoom === void 0 ? void 0 : exerciseRoom.roomUsers.find(roomUser => roomUser.user.id === (user === null || user === void 0 ? void 0 : user.id))) === null || _a === void 0 ? void 0 : _a.permission) === enums.ExerciseRoomPermission.Owner) !== null && _b !== void 0 ? _b : false;
|
|
47
|
-
const shareLink = materialExercise ? `https://${window.location.host}/courses/${materialExercise.
|
|
47
|
+
const shareLink = materialExercise ? `https://${window.location.host}/courses/${materialExercise._courseId}/lectures/${materialExercise === null || materialExercise === void 0 ? void 0 : materialExercise._lectureId}/materials/${materialExercise === null || materialExercise === void 0 ? void 0 : materialExercise._orderNo}/projects/${selectedExerciseRoomId}` : '';
|
|
48
48
|
const [, copyToClipboard] = useCopyToClipboard();
|
|
49
49
|
const doGetOrgMaterialExerciseExerciseRoomGet = React.useCallback(() => {
|
|
50
50
|
return getOrgMaterialExerciseExerciseRoomGet({
|
|
@@ -92,7 +92,7 @@ const MaterialExerciseExerciseRoomDetail = ({
|
|
|
92
92
|
const doGetOrgCourseUserList = React.useCallback(() => {
|
|
93
93
|
if (materialExercise) {
|
|
94
94
|
return getOrgCourseUserList({
|
|
95
|
-
courseId: materialExercise.
|
|
95
|
+
courseId: materialExercise._courseId,
|
|
96
96
|
isForTutoring: false,
|
|
97
97
|
count: 20,
|
|
98
98
|
offset: 0,
|
|
@@ -166,7 +166,7 @@ const MaterialExerciseExerciseRoomDetail = ({
|
|
|
166
166
|
return React.createElement(StyledModal, {
|
|
167
167
|
theme: "dark",
|
|
168
168
|
onHide: onHide,
|
|
169
|
-
title: (
|
|
169
|
+
title: (_c = exerciseRoom === null || exerciseRoom === void 0 ? void 0 : exerciseRoom.title) !== null && _c !== void 0 ? _c : '',
|
|
170
170
|
headerIcon: eilArrowLeftwardsSingle,
|
|
171
171
|
onHeaderIconClick: goToList,
|
|
172
172
|
footerChild: exerciseRoom ? exerciseRoom.isDefaultRoom ? React.createElement(Flex, {
|
|
@@ -209,7 +209,7 @@ const MaterialExerciseExerciseRoomDetail = ({
|
|
|
209
209
|
label: intl.formatMessage({
|
|
210
210
|
id: 'materialExerciseExerciseRoom.leave'
|
|
211
211
|
}),
|
|
212
|
-
disabled: (
|
|
212
|
+
disabled: (_d = exerciseRoom === null || exerciseRoom === void 0 ? void 0 : exerciseRoom.isDefaultRoom) !== null && _d !== void 0 ? _d : false,
|
|
213
213
|
role: 'gray6',
|
|
214
214
|
onClick: () => {
|
|
215
215
|
setIsLeaveDialogOpen(true);
|
|
@@ -441,7 +441,7 @@ const MaterialExerciseExerciseRoomDetail = ({
|
|
|
441
441
|
}), isThisChatRoomOwner ? React.createElement(React.Fragment, null, React.createElement(Select, {
|
|
442
442
|
size: "small",
|
|
443
443
|
width: "small",
|
|
444
|
-
value: (
|
|
444
|
+
value: (_e = exerciseRoom === null || exerciseRoom === void 0 ? void 0 : exerciseRoom.publicPermission) !== null && _e !== void 0 ? _e : enums.ExerciseRoomPermission.Nothing,
|
|
445
445
|
onChange: value => {
|
|
446
446
|
doPostOrgMaterialExerciseExerciseRoomEdit(value);
|
|
447
447
|
},
|
|
@@ -9,6 +9,7 @@ import { ExerciseContext } from '../context/context.js';
|
|
|
9
9
|
import '../context/recoilTypes.js';
|
|
10
10
|
import '../context/subjects.js';
|
|
11
11
|
import '../context/ExerciseProvider.js';
|
|
12
|
+
import ExerciseRunnerControllerArduinoAgentModal from './ExerciseRunnerControllerArduinoAgentModal.js';
|
|
12
13
|
import ExerciseRunnerControllerArduinoStatusMessage from './ExerciseRunnerControllerArduinoStatusMessage.js';
|
|
13
14
|
import ExerciseRunnerControllerButtonGroup from './ExerciseRunnerControllerButtonGroup.js';
|
|
14
15
|
import ExerciseRunnerControllerRunningInfo from './ExerciseRunnerControllerRunningInfo.js';
|
|
@@ -33,7 +34,7 @@ const ExerciseRunnerController = () => {
|
|
|
33
34
|
}), React.createElement(ExerciseRunnerControllerRunningInfo, null), React.createElement(ExerciseRunnerControllerTimer, null)), React.createElement(Flex, {
|
|
34
35
|
column: true,
|
|
35
36
|
align: "flex-end"
|
|
36
|
-
}, React.createElement(ExerciseRunnerControllerStatusMessage, null), isArduinoExercise ? React.createElement(ExerciseRunnerControllerArduinoStatusMessage, null) : null));
|
|
37
|
+
}, React.createElement(ExerciseRunnerControllerStatusMessage, null), isArduinoExercise ? React.createElement(ExerciseRunnerControllerArduinoStatusMessage, null) : null), isArduinoExercise ? React.createElement(ExerciseRunnerControllerArduinoAgentModal, null) : null);
|
|
37
38
|
};
|
|
38
39
|
|
|
39
40
|
export { ExerciseRunnerController as default };
|
package/es/components/material-exercise/exercise-runner/ExerciseRunnerControllerArduinoAgentModal.js
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { useIntl, FormattedMessage } from 'react-intl';
|
|
3
|
+
import { Modal, Text, Vspace, Flex, Button, Icon, Hspace } from '@elice/blocks';
|
|
4
|
+
import { eisWindows, eisMac, eilArrowRightwardsBasic } from '@elice/icons';
|
|
5
|
+
import FileSaver from 'file-saver';
|
|
6
|
+
import { useRecoilState } from 'recoil';
|
|
7
|
+
import { exerciseArduinoAgentModalState } from '../context/recoil.js';
|
|
8
|
+
import '../context/context.js';
|
|
9
|
+
import '../context/recoilTypes.js';
|
|
10
|
+
import '../context/subjects.js';
|
|
11
|
+
import '../context/ExerciseProvider.js';
|
|
12
|
+
|
|
13
|
+
const ELICE_MATERIAL_EXERCISE_ARDUINO_AGENT_MODAL_KEY = 'elice-material-exercise-arduino-agent-modal-closed';
|
|
14
|
+
const ELICE_MATERIAL_EXERCISE_ARDUINO_AGENT_MODAL_VALUE = 'true';
|
|
15
|
+
const ARDUINO_AGENT_MAC_DOWNLOAD_URL = 'https://eli.so/arduino-agent-mac';
|
|
16
|
+
const ARDUINO_AGENT_WIN_DOWNLOAD_URL = 'https://eli.so/arduino-agent-win';
|
|
17
|
+
const ARDUINO_AGENT_MANUAL_URL = 'https://eli.so/arduino-faq';
|
|
18
|
+
|
|
19
|
+
const ExerciseRunnerControllerArduinoAgentModal = () => {
|
|
20
|
+
const intl = useIntl();
|
|
21
|
+
const [open, setOpen] = useRecoilState(exerciseArduinoAgentModalState);
|
|
22
|
+
React.useEffect(() => {
|
|
23
|
+
const isConfirmed = localStorage.getItem(ELICE_MATERIAL_EXERCISE_ARDUINO_AGENT_MODAL_KEY) === ELICE_MATERIAL_EXERCISE_ARDUINO_AGENT_MODAL_VALUE;
|
|
24
|
+
|
|
25
|
+
if (!isConfirmed) {
|
|
26
|
+
setOpen(true);
|
|
27
|
+
}
|
|
28
|
+
}, [setOpen]);
|
|
29
|
+
|
|
30
|
+
const handleClose = () => {
|
|
31
|
+
setOpen(false);
|
|
32
|
+
localStorage.setItem(ELICE_MATERIAL_EXERCISE_ARDUINO_AGENT_MODAL_KEY, ELICE_MATERIAL_EXERCISE_ARDUINO_AGENT_MODAL_VALUE);
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const handleDownload = fileUrl => {
|
|
36
|
+
FileSaver.saveAs(fileUrl);
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
const renderAgentInstallInstruction = () => {
|
|
40
|
+
return React.createElement(React.Fragment, null, React.createElement(Text, {
|
|
41
|
+
bold: true,
|
|
42
|
+
role: "gray0"
|
|
43
|
+
}, React.createElement(FormattedMessage, {
|
|
44
|
+
id: "exerciseRunner.controller.arduino.agent.instruction.install"
|
|
45
|
+
})), React.createElement(Vspace, {
|
|
46
|
+
height: 0.25
|
|
47
|
+
}), React.createElement(Text, {
|
|
48
|
+
role: "navy",
|
|
49
|
+
size: "small"
|
|
50
|
+
}, React.createElement(FormattedMessage, {
|
|
51
|
+
id: "exerciseRunner.controller.arduino.agent.instruction.install.detail"
|
|
52
|
+
})), React.createElement(Vspace, {
|
|
53
|
+
height: 0.75
|
|
54
|
+
}), React.createElement(Flex, null, React.createElement(Button, {
|
|
55
|
+
size: "tiny",
|
|
56
|
+
role: "gray1",
|
|
57
|
+
icon: React.createElement(Icon, {
|
|
58
|
+
icon: eisWindows,
|
|
59
|
+
size: "huge"
|
|
60
|
+
}),
|
|
61
|
+
iconAlign: "left",
|
|
62
|
+
onClick: () => handleDownload(ARDUINO_AGENT_WIN_DOWNLOAD_URL)
|
|
63
|
+
}, React.createElement(FormattedMessage, {
|
|
64
|
+
id: "exerciseRunner.controller.arduino.agent.instruction.install.window"
|
|
65
|
+
})), React.createElement(Hspace, {
|
|
66
|
+
width: 0.75
|
|
67
|
+
}), React.createElement(Button, {
|
|
68
|
+
size: "tiny",
|
|
69
|
+
role: "gray1",
|
|
70
|
+
icon: React.createElement(Icon, {
|
|
71
|
+
icon: eisMac
|
|
72
|
+
}),
|
|
73
|
+
iconAlign: "left",
|
|
74
|
+
onClick: () => handleDownload(ARDUINO_AGENT_MAC_DOWNLOAD_URL)
|
|
75
|
+
}, React.createElement(FormattedMessage, {
|
|
76
|
+
id: "exerciseRunner.controller.arduino.agent.instruction.install.mac"
|
|
77
|
+
}))));
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
const renderAgentConnectionInstruction = () => {
|
|
81
|
+
return React.createElement(React.Fragment, null, React.createElement(Text, {
|
|
82
|
+
role: "gray0",
|
|
83
|
+
bold: true
|
|
84
|
+
}, React.createElement(FormattedMessage, {
|
|
85
|
+
id: "exerciseRunner.controller.arduino.agent.instruction.connect"
|
|
86
|
+
})), React.createElement(Vspace, {
|
|
87
|
+
height: 0.25
|
|
88
|
+
}), React.createElement(Text, {
|
|
89
|
+
role: "navy",
|
|
90
|
+
size: "small",
|
|
91
|
+
lineHeight: 1.6
|
|
92
|
+
}, React.createElement(FormattedMessage, {
|
|
93
|
+
id: "exerciseRunner.controller.arduino.agent.instruction.connect.detail"
|
|
94
|
+
})), React.createElement(Vspace, {
|
|
95
|
+
height: 0.75
|
|
96
|
+
}), React.createElement(Button, {
|
|
97
|
+
icon: React.createElement(Icon, {
|
|
98
|
+
icon: eilArrowRightwardsBasic
|
|
99
|
+
}),
|
|
100
|
+
iconAlign: "right",
|
|
101
|
+
size: "tiny",
|
|
102
|
+
role: "secondary",
|
|
103
|
+
onClick: () => window.open(ARDUINO_AGENT_MANUAL_URL)
|
|
104
|
+
}, React.createElement(FormattedMessage, {
|
|
105
|
+
id: "exerciseRunner.controller.arduino.agent.instruction.connect.button"
|
|
106
|
+
})));
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
if (!open) {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
return React.createElement(Modal, {
|
|
114
|
+
theme: "dark",
|
|
115
|
+
title: intl.formatMessage({
|
|
116
|
+
id: 'exerciseRunner.controller.arduino.agent.title'
|
|
117
|
+
}),
|
|
118
|
+
footerButtons: [{
|
|
119
|
+
label: intl.formatMessage({
|
|
120
|
+
id: 'exerciseRunner.controller.arduino.agent.instruction.close'
|
|
121
|
+
}),
|
|
122
|
+
onClick: handleClose
|
|
123
|
+
}],
|
|
124
|
+
onHide: handleClose
|
|
125
|
+
}, React.createElement(React.Fragment, null, renderAgentInstallInstruction(), React.createElement(Vspace, {
|
|
126
|
+
height: 1.5
|
|
127
|
+
}), renderAgentConnectionInstruction()));
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
export { ExerciseRunnerControllerArduinoAgentModal as default };
|
package/es/components/material-exercise/exercise-runner/ExerciseRunnerControllerButtonGroup.js
CHANGED
|
@@ -52,7 +52,7 @@ const ExerciseRunnerControllerButtonGroup = () => {
|
|
|
52
52
|
const exercise = useRecoilValue(exerciseState(materialExerciseId));
|
|
53
53
|
const exerciseRunType = useRecoilValue(exerciseRunnerRunTypeState);
|
|
54
54
|
const exerciseWithNoGrade = Boolean(exercise === null || exercise === void 0 ? void 0 : exercise.isNoSubmitGrade);
|
|
55
|
-
const lecture = useRecoilValue(exerciseLectureState(exercise === null || exercise === void 0 ? void 0 : exercise.
|
|
55
|
+
const lecture = useRecoilValue(exerciseLectureState(exercise === null || exercise === void 0 ? void 0 : exercise._lectureId));
|
|
56
56
|
const isTestLecture = (lecture === null || lecture === void 0 ? void 0 : lecture.lectureType) === enums.LectureType.Test;
|
|
57
57
|
const isTestLectureCompleted = (lecture === null || lecture === void 0 ? void 0 : lecture.testAdmissionStatus) === enums.TestAdmissionStatus.Completed; // runner states
|
|
58
58
|
|
package/es/components/material-exercise/exercise-runner/ExerciseRunnerControllerRunningInfo.js
CHANGED
|
@@ -97,15 +97,19 @@ const ExerciseRunnerControllerRunningInfo = () => {
|
|
|
97
97
|
//
|
|
98
98
|
|
|
99
99
|
React.useEffect(() => {
|
|
100
|
-
if (exercise
|
|
101
|
-
|
|
102
|
-
courseId: exercise.courseId
|
|
103
|
-
}).then(({
|
|
104
|
-
course
|
|
105
|
-
}) => {
|
|
106
|
-
setCourse(course);
|
|
107
|
-
}).catch(console.error);
|
|
100
|
+
if (!exercise) {
|
|
101
|
+
return;
|
|
108
102
|
}
|
|
103
|
+
|
|
104
|
+
const abortCtrl = new AbortController();
|
|
105
|
+
getOrgCourseGet({
|
|
106
|
+
courseId: exercise._courseId
|
|
107
|
+
}, {
|
|
108
|
+
signal: abortCtrl.signal
|
|
109
|
+
}).then(res => res.course).then(setCourse).catch(console.error);
|
|
110
|
+
return () => {
|
|
111
|
+
abortCtrl.abort();
|
|
112
|
+
};
|
|
109
113
|
}, [exercise]);
|
|
110
114
|
/**
|
|
111
115
|
* Last running score.
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var phrasesEn = {"exerciseRunner.controller.arduino.connectionStatus.connected":"Connected to Arduino","exerciseRunner.controller.arduino.connectionStatus.connectedDevice":"Connected to {device}","exerciseRunner.controller.arduino.connectionStatus.connecting":"Connecting to Elice Arduino Agent","exerciseRunner.controller.arduino.connectionStatus.disconnected":"Disconnected from Elice Arduino Agent","exerciseRunner.controller.arduino.connectionStatus.noDevice":"No connected device","exerciseRunner.controller.arduino.connectionStatus.reconnecting":"Connecting to Elice Arduino Agent","exerciseRunner.controller.arduino.connectionStatus.uploading":"Uploading...","exerciseRunner.controller.buttonGroup.button.compile":"Compile","exerciseRunner.controller.buttonGroup.button.helpRequest":"Help me","exerciseRunner.controller.buttonGroup.button.run":"Run","exerciseRunner.controller.buttonGroup.button.stop":"Stop","exerciseRunner.controller.buttonGroup.button.submit":"Submit","exerciseRunner.controller.buttonGroup.button.submit.tooltip.noSubmit":"Exercise without submission","exerciseRunner.controller.buttonGroup.button.syncRequest":"Sync code","exerciseRunner.controller.buttonGroup.button.tooltip.aiHelp":"A function to get help from AI has been added.","exerciseRunner.controller.runningInfo.error.fetch":"An error occurred while fetching running info","exerciseRunner.controller.runningInfo.lastRunningDatetime":"Last running datetime","exerciseRunner.controller.runningInfo.lastSubmitDatetime":"Last submit datetime","exerciseRunner.controller.runningInfo.lastSubmitScore":"Last submit score","exerciseRunner.controller.runningInfo.score":"{score}","exerciseRunner.controller.statusMessage.closed":"Editor disconnected","exerciseRunner.controller.statusMessage.connecting":"Connecting to editor...","exerciseRunner.controller.statusMessage.open":"Editor connected","exerciseRunner.controller.timer.runningRemainingTime":"Remaining: {remainingTime}","exerciseRunner.submitErrorDialog.action.confirm":"OK","exerciseRunner.submitErrorDialog.action.reload":"Reload page","exerciseRunner.submitErrorDialog.body.commonError":"An error occurred while running the code.\nPlease refresh and try again.","exerciseRunner.submitErrorDialog.body.exceedSubmitGradeLimit":"You have exceeded the allowed number of lab submissions.","exerciseRunner.submitErrorDialog.body.expiredExerciseImage":"The exercise image has been updated.\nPlease refresh and try again.","exerciseRunner.submitErrorDialog.body.networkError":"An error occurred while running the code.\nPlease refresh and try again.\nIf the problem persists, please check the network status.","exerciseRunner.submitErrorDialog.body.notForSubmitGrade":"This exercise is not allowed to be submitted.","exerciseRunner.submitErrorDialog.body.notPreparedRoom":"The exercise room is being prepared.\nPlease try again later.","exerciseRunner.submitErrorDialog.body.roomIsBusy":"The exercise room is running.\nPlease wait a moment.","exerciseRunner.submitErrorDialog.body.unknown":"An error occurred while running the code.\nPlease try again later.","exerciseRunner.submitErrorDialog.title":"Unable to run the code"};
|
|
1
|
+
var phrasesEn = {"exerciseRunner.controller.arduino.connectionStatus.connected":"Connected to Arduino","exerciseRunner.controller.arduino.connectionStatus.connectedDevice":"Connected to {device}","exerciseRunner.controller.arduino.connectionStatus.connecting":"Connecting to Elice Arduino Agent","exerciseRunner.controller.arduino.connectionStatus.disconnected":"Disconnected from Elice Arduino Agent","exerciseRunner.controller.arduino.connectionStatus.noDevice":"No connected device","exerciseRunner.controller.arduino.connectionStatus.reconnecting":"Connecting to Elice Arduino Agent","exerciseRunner.controller.arduino.connectionStatus.uploading":"Uploading...","exerciseRunner.controller.arduino.agent.title":"Connect to Agent","exerciseRunner.controller.arduino.agent.instruction.install":"1. Install Elice arduino agent","exerciseRunner.controller.arduino.agent.instruction.install.detail":"Install 'elice-arduino-agent' program to connect to arduino.","exerciseRunner.controller.arduino.agent.instruction.install.window":"Download for Windows","exerciseRunner.controller.arduino.agent.instruction.install.mac":"Download for MacOS","exerciseRunner.controller.arduino.agent.instruction.connect":"2. Connect to arduino","exerciseRunner.controller.arduino.agent.instruction.connect.detail":"After the download is completed, it should be connected to exercise environment. If connection is unavailable, please follow the manual.\nClick the button below to read the manual.","exerciseRunner.controller.arduino.agent.instruction.connect.button":"Go to Manual","exerciseRunner.controller.arduino.agent.instruction.close":"Close","exerciseRunner.controller.buttonGroup.button.compile":"Compile","exerciseRunner.controller.buttonGroup.button.helpRequest":"Help me","exerciseRunner.controller.buttonGroup.button.run":"Run","exerciseRunner.controller.buttonGroup.button.stop":"Stop","exerciseRunner.controller.buttonGroup.button.submit":"Submit","exerciseRunner.controller.buttonGroup.button.submit.tooltip.noSubmit":"Exercise without submission","exerciseRunner.controller.buttonGroup.button.syncRequest":"Sync code","exerciseRunner.controller.buttonGroup.button.tooltip.aiHelp":"A function to get help from AI has been added.","exerciseRunner.controller.runningInfo.error.fetch":"An error occurred while fetching running info","exerciseRunner.controller.runningInfo.lastRunningDatetime":"Last running datetime","exerciseRunner.controller.runningInfo.lastSubmitDatetime":"Last submit datetime","exerciseRunner.controller.runningInfo.lastSubmitScore":"Last submit score","exerciseRunner.controller.runningInfo.score":"{score}","exerciseRunner.controller.statusMessage.closed":"Editor disconnected","exerciseRunner.controller.statusMessage.connecting":"Connecting to editor...","exerciseRunner.controller.statusMessage.open":"Editor connected","exerciseRunner.controller.timer.runningRemainingTime":"Remaining: {remainingTime}","exerciseRunner.submitErrorDialog.action.confirm":"OK","exerciseRunner.submitErrorDialog.action.reload":"Reload page","exerciseRunner.submitErrorDialog.body.commonError":"An error occurred while running the code.\nPlease refresh and try again.","exerciseRunner.submitErrorDialog.body.exceedSubmitGradeLimit":"You have exceeded the allowed number of lab submissions.","exerciseRunner.submitErrorDialog.body.expiredExerciseImage":"The exercise image has been updated.\nPlease refresh and try again.","exerciseRunner.submitErrorDialog.body.networkError":"An error occurred while running the code.\nPlease refresh and try again.\nIf the problem persists, please check the network status.","exerciseRunner.submitErrorDialog.body.notForSubmitGrade":"This exercise is not allowed to be submitted.","exerciseRunner.submitErrorDialog.body.notPreparedRoom":"The exercise room is being prepared.\nPlease try again later.","exerciseRunner.submitErrorDialog.body.roomIsBusy":"The exercise room is running.\nPlease wait a moment.","exerciseRunner.submitErrorDialog.body.unknown":"An error occurred while running the code.\nPlease try again later.","exerciseRunner.submitErrorDialog.title":"Unable to run the code"};
|
|
2
2
|
|
|
3
3
|
export { phrasesEn as default };
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var phrasesKo = {"exerciseRunner.controller.arduino.connectionStatus.connected":"아두이노 기기 연결됨","exerciseRunner.controller.arduino.connectionStatus.connectedDevice":"{device} 연결됨","exerciseRunner.controller.arduino.connectionStatus.connecting":"엘리스 아두이노 에이전트 연결 중","exerciseRunner.controller.arduino.connectionStatus.disconnected":"엘리스 아두이노 에이전트 연결 끊김","exerciseRunner.controller.arduino.connectionStatus.noDevice":"연결된 기기 없음","exerciseRunner.controller.arduino.connectionStatus.reconnecting":"엘리스 아두이노 에이전트 연결 중","exerciseRunner.controller.arduino.connectionStatus.uploading":"업로드 중","exerciseRunner.controller.buttonGroup.button.compile":"컴파일","exerciseRunner.controller.buttonGroup.button.helpRequest":"도와주세요","exerciseRunner.controller.buttonGroup.button.run":"실행","exerciseRunner.controller.buttonGroup.button.stop":"정지","exerciseRunner.controller.buttonGroup.button.submit":"제출","exerciseRunner.controller.buttonGroup.button.submit.tooltip.noSubmit":"실행만 가능한 실습입니다.","exerciseRunner.controller.buttonGroup.button.syncRequest":"코드 동기화","exerciseRunner.controller.buttonGroup.button.tooltip.aiHelp":"AI에게 도움받기 기능이 추가되었어요.","exerciseRunner.controller.runningInfo.error.fetch":"최종 실행 내역을 가져오는데 문제가 발생하였습니다.","exerciseRunner.controller.runningInfo.lastRunningDatetime":"최종 실행 시간","exerciseRunner.controller.runningInfo.lastSubmitDatetime":"최종 제출 시간","exerciseRunner.controller.runningInfo.lastSubmitScore":"최종 제출 점수","exerciseRunner.controller.runningInfo.score":"{score} 점","exerciseRunner.controller.statusMessage.closed":"에디터 연결 끊김","exerciseRunner.controller.statusMessage.connecting":"에디터 연결 중...","exerciseRunner.controller.statusMessage.open":"에디터 연결됨","exerciseRunner.controller.timer.runningRemainingTime":"실행 제한시간: {remainingTime}","exerciseRunner.submitErrorDialog.action.confirm":"확인","exerciseRunner.submitErrorDialog.action.reload":"새로고침","exerciseRunner.submitErrorDialog.body.commonError":"코드 실행 중 오류가 발생했습니다.\n새로고침 후 다시 시도해주세요.","exerciseRunner.submitErrorDialog.body.exceedSubmitGradeLimit":"실습 제출 허용 횟수를 초과했습니다.","exerciseRunner.submitErrorDialog.body.expiredExerciseImage":"실습환경이 업데이트 되었습니다.\n새로고침 후 다시 시도해주세요.","exerciseRunner.submitErrorDialog.body.networkError":"코드 실행 중 오류가 발생했습니다.\n새로고침 후 다시 시도해주세요.\n문제가 계속되면 네트워크 상태를 확인해주세요.","exerciseRunner.submitErrorDialog.body.notForSubmitGrade":"제출이 허용되지 않은 실습입니다.","exerciseRunner.submitErrorDialog.body.notPreparedRoom":"실습환경이 준비 중입니다.\n잠시 후 다시 시도해주세요.","exerciseRunner.submitErrorDialog.body.roomIsBusy":"실습을 실행하고 있습니다.\n잠시만 기다려주세요.","exerciseRunner.submitErrorDialog.body.unknown":"코드 실행 중 오류가 발생했습니다.\n잠시 후 다시 시도해주세요.","exerciseRunner.submitErrorDialog.title":"실습을 실행할 수 없습니다"};
|
|
1
|
+
var phrasesKo = {"exerciseRunner.controller.arduino.connectionStatus.connected":"아두이노 기기 연결됨","exerciseRunner.controller.arduino.connectionStatus.connectedDevice":"{device} 연결됨","exerciseRunner.controller.arduino.connectionStatus.connecting":"엘리스 아두이노 에이전트 연결 중","exerciseRunner.controller.arduino.connectionStatus.disconnected":"엘리스 아두이노 에이전트 연결 끊김","exerciseRunner.controller.arduino.connectionStatus.noDevice":"연결된 기기 없음","exerciseRunner.controller.arduino.connectionStatus.reconnecting":"엘리스 아두이노 에이전트 연결 중","exerciseRunner.controller.arduino.connectionStatus.uploading":"업로드 중","exerciseRunner.controller.arduino.agent.title":"에이전트 연결","exerciseRunner.controller.arduino.agent.instruction.install":"1. 엘리스 아두이노 에이전트 설치하기","exerciseRunner.controller.arduino.agent.instruction.install.detail":"아두이노와 연결하기 위해 ‘엘리스 아두이노 에이전트'를 설치해주세요.","exerciseRunner.controller.arduino.agent.instruction.install.window":"Windows 용 설치","exerciseRunner.controller.arduino.agent.instruction.install.mac":"MacOS 용 설치","exerciseRunner.controller.arduino.agent.instruction.connect":"2. 연결하기","exerciseRunner.controller.arduino.agent.instruction.connect.detail":"다운로드를 완료하였다면 실습 환경과 연결이 필요합니다. 연결되지 않을 경우 매뉴얼을 확인하세요.\n아래 버튼을 클릭해 매뉴얼을 확인하실 수 있습니다.","exerciseRunner.controller.arduino.agent.instruction.connect.button":"매뉴얼 이동","exerciseRunner.controller.arduino.agent.instruction.close":"닫기","exerciseRunner.controller.buttonGroup.button.compile":"컴파일","exerciseRunner.controller.buttonGroup.button.helpRequest":"도와주세요","exerciseRunner.controller.buttonGroup.button.run":"실행","exerciseRunner.controller.buttonGroup.button.stop":"정지","exerciseRunner.controller.buttonGroup.button.submit":"제출","exerciseRunner.controller.buttonGroup.button.submit.tooltip.noSubmit":"실행만 가능한 실습입니다.","exerciseRunner.controller.buttonGroup.button.syncRequest":"코드 동기화","exerciseRunner.controller.buttonGroup.button.tooltip.aiHelp":"AI에게 도움받기 기능이 추가되었어요.","exerciseRunner.controller.runningInfo.error.fetch":"최종 실행 내역을 가져오는데 문제가 발생하였습니다.","exerciseRunner.controller.runningInfo.lastRunningDatetime":"최종 실행 시간","exerciseRunner.controller.runningInfo.lastSubmitDatetime":"최종 제출 시간","exerciseRunner.controller.runningInfo.lastSubmitScore":"최종 제출 점수","exerciseRunner.controller.runningInfo.score":"{score} 점","exerciseRunner.controller.statusMessage.closed":"에디터 연결 끊김","exerciseRunner.controller.statusMessage.connecting":"에디터 연결 중...","exerciseRunner.controller.statusMessage.open":"에디터 연결됨","exerciseRunner.controller.timer.runningRemainingTime":"실행 제한시간: {remainingTime}","exerciseRunner.submitErrorDialog.action.confirm":"확인","exerciseRunner.submitErrorDialog.action.reload":"새로고침","exerciseRunner.submitErrorDialog.body.commonError":"코드 실행 중 오류가 발생했습니다.\n새로고침 후 다시 시도해주세요.","exerciseRunner.submitErrorDialog.body.exceedSubmitGradeLimit":"실습 제출 허용 횟수를 초과했습니다.","exerciseRunner.submitErrorDialog.body.expiredExerciseImage":"실습환경이 업데이트 되었습니다.\n새로고침 후 다시 시도해주세요.","exerciseRunner.submitErrorDialog.body.networkError":"코드 실행 중 오류가 발생했습니다.\n새로고침 후 다시 시도해주세요.\n문제가 계속되면 네트워크 상태를 확인해주세요.","exerciseRunner.submitErrorDialog.body.notForSubmitGrade":"제출이 허용되지 않은 실습입니다.","exerciseRunner.submitErrorDialog.body.notPreparedRoom":"실습환경이 준비 중입니다.\n잠시 후 다시 시도해주세요.","exerciseRunner.submitErrorDialog.body.roomIsBusy":"실습을 실행하고 있습니다.\n잠시만 기다려주세요.","exerciseRunner.submitErrorDialog.body.unknown":"코드 실행 중 오류가 발생했습니다.\n잠시 후 다시 시도해주세요.","exerciseRunner.submitErrorDialog.title":"실습을 실행할 수 없습니다"};
|
|
2
2
|
|
|
3
3
|
export { phrasesKo as default };
|
|
@@ -9,7 +9,7 @@ import styled from 'styled-components';
|
|
|
9
9
|
|
|
10
10
|
const StyledMenuButtonWrap = styled.span.withConfig({
|
|
11
11
|
componentId: "sc-48m0vh-0"
|
|
12
|
-
})(["position:relative;
|
|
12
|
+
})(["position:relative;"]);
|
|
13
13
|
const StyledMenuButton = styled(IconButton).withConfig({
|
|
14
14
|
componentId: "sc-48m0vh-1"
|
|
15
15
|
})(["", ""], ({
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elice/material-exercise",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.230306.0",
|
|
4
4
|
"description": "User view and editing components of Elice material exercise",
|
|
5
5
|
"repository": "https://git.elicer.io/elice/frontend/library/elice-material",
|
|
6
6
|
"license": "UNLICENSED",
|
|
@@ -29,14 +29,14 @@
|
|
|
29
29
|
"clean": "del-cli \"es/*\" \"cjs/*\" \"dist/*\""
|
|
30
30
|
},
|
|
31
31
|
"peerDependencies": {
|
|
32
|
-
"@elice/api-client": "1.
|
|
32
|
+
"@elice/api-client": "^1.230306.0",
|
|
33
33
|
"@elice/blocks": "^1.220803.0",
|
|
34
34
|
"@elice/design-tokens": "^1.220803.0",
|
|
35
35
|
"@elice/icons": "^1.220803.0",
|
|
36
36
|
"@elice/markdown": "^1.220803.0",
|
|
37
37
|
"@elice/material-shared-types": "*",
|
|
38
38
|
"@elice/material-shared-utils": "*",
|
|
39
|
-
"@elice/types": "1.
|
|
39
|
+
"@elice/types": "^1.230306.0",
|
|
40
40
|
"@elice/websocket": "^1.220803.0",
|
|
41
41
|
"humps": "^2.0.1",
|
|
42
42
|
"lodash": "^4.17.21",
|
|
@@ -74,14 +74,14 @@
|
|
|
74
74
|
"xterm-addon-fit": "^0.5.0"
|
|
75
75
|
},
|
|
76
76
|
"devDependencies": {
|
|
77
|
-
"@elice/api-client": "1.
|
|
77
|
+
"@elice/api-client": "^1.230306.0",
|
|
78
78
|
"@elice/blocks": "^1.220803.0",
|
|
79
79
|
"@elice/design-tokens": "^1.220803.0",
|
|
80
80
|
"@elice/icons": "^1.220803.0",
|
|
81
81
|
"@elice/markdown": "^1.220803.0",
|
|
82
|
-
"@elice/material-shared-types": "1.
|
|
83
|
-
"@elice/material-shared-utils": "1.
|
|
84
|
-
"@elice/types": "1.
|
|
82
|
+
"@elice/material-shared-types": "1.230306.0",
|
|
83
|
+
"@elice/material-shared-utils": "1.230306.0",
|
|
84
|
+
"@elice/types": "^1.230306.0",
|
|
85
85
|
"@elice/websocket": "^1.220803.0",
|
|
86
86
|
"@types/classnames": "^2.3.1",
|
|
87
87
|
"@types/color": "^3.0.3",
|
|
@@ -102,5 +102,5 @@
|
|
|
102
102
|
"recoil": "^0.6.1",
|
|
103
103
|
"styled-components": "^5.2.0"
|
|
104
104
|
},
|
|
105
|
-
"gitHead": "
|
|
105
|
+
"gitHead": "2ba30b7324d9fd782970a0343a6573827159b737"
|
|
106
106
|
}
|