@elice/material-runbox 1.261108.0-customhtmlmaterial.9 → 1.261112.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.
Files changed (27) hide show
  1. package/cjs/assets/credit-exhausted.svg.js +7 -0
  2. package/cjs/components/material-runbox/MaterialRunboxContent.d.ts +0 -2
  3. package/cjs/components/material-runbox/MaterialRunboxContent.js +21 -44
  4. package/cjs/components/material-runbox/MaterialRunboxCreditAlert.d.ts +10 -0
  5. package/cjs/components/material-runbox/MaterialRunboxCreditAlert.js +57 -0
  6. package/cjs/components/material-runbox/locales/en.json.js +1 -1
  7. package/cjs/components/material-runbox/locales/ja.json.js +1 -1
  8. package/cjs/components/material-runbox/locales/ko.json.js +1 -1
  9. package/cjs/components/material-runbox/locales/th.json.js +1 -1
  10. package/cjs/components/material-runbox/runtime/Runtime.d.ts +3 -1
  11. package/cjs/components/material-runbox/runtime/Runtime.js +2 -1
  12. package/cjs/components/material-runbox/runtime/RuntimeOverlayTerminated.d.ts +3 -0
  13. package/cjs/components/material-runbox/runtime/RuntimeOverlayTerminated.js +70 -32
  14. package/es/assets/credit-exhausted.svg.js +3 -0
  15. package/es/components/material-runbox/MaterialRunboxContent.d.ts +0 -2
  16. package/es/components/material-runbox/MaterialRunboxContent.js +21 -44
  17. package/es/components/material-runbox/MaterialRunboxCreditAlert.d.ts +10 -0
  18. package/es/components/material-runbox/MaterialRunboxCreditAlert.js +53 -0
  19. package/es/components/material-runbox/locales/en.json.js +1 -1
  20. package/es/components/material-runbox/locales/ja.json.js +1 -1
  21. package/es/components/material-runbox/locales/ko.json.js +1 -1
  22. package/es/components/material-runbox/locales/th.json.js +1 -1
  23. package/es/components/material-runbox/runtime/Runtime.d.ts +3 -1
  24. package/es/components/material-runbox/runtime/Runtime.js +2 -1
  25. package/es/components/material-runbox/runtime/RuntimeOverlayTerminated.d.ts +3 -0
  26. package/es/components/material-runbox/runtime/RuntimeOverlayTerminated.js +73 -35
  27. package/package.json +13 -13
@@ -2,6 +2,6 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var th = {"common.cancel":"ยกเลิก","material.tutoring.runbox_confirm_dialog.action.confirm":"ดำเนินการ","material.tutoring.runbox_confirm_dialog.content":"ขณะนี้นักเรียน {_termCourseRoleStudent} กำลังทำงานในสภาพแวดล้อม Runbox หากคุณเชื่อมต่อ เวลาที่เหลือสำหรับการใช้งานรันไทม์ทั้งหมดจะลดลง คุณต้องการดำเนินการต่อหรือไม่?","material.tutoring.runbox_confirm_dialog.title":"รันบ็อกซ์กำลังทำงาน","runbox.action.autoShutdown.title":"เปิดตลอดเวลา","runbox.action.autoShutdown.tooltip":"คุณสมบัตินี้ไม่สามารถใช้งานได้ในเซสชันนี้ เนื่องจากมีการตั้งค่าให้ปิดการทำงานอัตโนมัติเมื่อออก","runbox.action.grade.dialog.description.error":"มีปัญหาในโค้ดหรือไฟล์ที่ส่ง\nกรุณาตรวจสอบข้อความข้อผิดพลาดด้านล่างและตรวจสอบว่ารูปแบบการส่งตรงกับความต้องการ จากนั้นส่งอีกครั้ง","runbox.action.grade.dialog.description.success":"การจัดเกรดเสร็จสมบูรณ์เรียบร้อยแล้ว","runbox.action.grade.dialog.title":"ผลการประเมินผลการเรียน","runbox.action.grade.noti.error":"เกิดข้อผิดพลาดขึ้นในขณะที่ทำการตรวจคะแนนของโค้ด","runbox.action.grade.title":"ส่ง","runbox.action.grade.tooltip.onProgress":"กำลังให้คะแนนโค้ด โปรดรอสักครู่ การให้คะแนนอาจใช้เวลาสูงสุด 3 นาที ขึ้นอยู่กับประเภทของการฝึกอบรม","runbox.action.reset.dialog.actions.confirm":"รีเซ็ต","runbox.action.reset.dialog.isolated.description":"ต้องการรีเซ็ตโค้ด Runbox หรือไม่? การรีเซ็ตจะแทนที่โค้ดของคุณด้วยโค้ดเริ่มต้นของหน้าเรียน {_termLibraryLecturePage} \nเซสชัน Runbox จะรีเฟรชหลังจากรีเซ็ต","runbox.action.reset.dialog.shared.description":"คุณต้องการรีเซ็ตโค้ดของ Runbox หรือไม่? หากทำการรีเซ็ต โค้ดที่ทีมเขียนไว้จะถูกเขียนทับด้วยโค้ดเริ่มต้น และเซสชันของ Runbox จะถูกรีเฟรชหลังจากนั้น","runbox.action.reset.noti.error":"เกิดข้อผิดพลาดระหว่างการรีเซ็ตโค้ด Runbox","runbox.action.reset.title":"รีเซ็ตโค้ด","runbox.action.restart.dialog.actions.confirm":"เริ่มต้นใหม่","runbox.action.restart.dialog.isolated.description":"ต้องการเริ่มต้น Runbox ใหม่หรือไม่?","runbox.action.restart.dialog.shared.description":"Runbox จะเริ่มต้นใหม่บนหน้าจอของเพื่อนร่วมทีมด้วย คุณต้องการเริ่มต้น Runbox ใหม่หรือไม่?","runbox.action.restart.title":"เริ่มต้น Runbox ใหม่","runbox.action.share.snackbar.copied.fail":"ล้มเหลวในการคัดลอก URL Runbox กรุณาลองอีกครั้ง","runbox.action.share.snackbar.copied.success":"คัดลอก URL Runbox สำเร็จ","runbox.action.share.title":"คัดลอก URL Runbox","runbox.action.submitCountInfo.dialog.description":"คุณใช้จำนวนครั้งในการส่งเกินขีดจำกัดแล้ว","runbox.action.submitCountInfo.dialog.title":"ข้อจำกัดจำนวนครั้งในการส่ง","runbox.action.submitCountInfo.tooltip.disabled":"คุณใช้จำนวนครั้งในการส่งทั้งหมดแล้ว","runbox.action.submitLog.dialog.download.tooltip":"ดาวน์โหลดไฟล์ที่ส่ง","runbox.action.submitLog.dialog.title":"ประวัติการส่ง","runbox.action.submitLog.empty":"ไม่มีประวัติการส่ง","runbox.action.submitLog.title":"ประวัติการส่ง Runbox","runbox.action.disconnect.dialog.title":"ยกเลิกการเชื่อมต่อ Runbox","runbox.action.disconnect.dialog.description":"คุณกำลังอยู่ในระหว่างการฝึกปฏิบัติ ต้องการยกเลิกการเชื่อมต่อ Runbox หรือไม่?\nหากมีงานที่ยังไม่ได้บันทึก กรุณาบันทึกก่อน","runbox.action.disconnect.dialog.disconnect":"ยกเลิกการเชื่อมต่อ","runbox.action.disconnect.title":"ยกเลิกการเชื่อมต่อ","runbox.action.menu.title":"เพิ่มเติม","runbox.alert.title":"คุณได้เชื่อมต่อกับสภาพแวดล้อมที่นักเรียนกำลังทำงานอยู่ และเวลาใช้งานรันไทม์ทั้งหมดกำลังถูกหัก โปรดทราบว่าหากนักเรียนออกจากรันบ็อกซ์ แต่การให้คำปรึกษายังดำเนินต่อไป เวลาจะยังคงถูกหัก","runbox.common.close":"ปิด","runbox.common.retry":"ลองใหม่","runbox.common.score":"{score} คะแนน","runbox.common.support":"สนับสนุน","runbox.common.connect":"เชื่อมต่อ","runbox.context.command.ping.error":"เกิดข้อผิดพลาดขณะดำเนินการ Runbox","runbox.header.submitInfo":"{isIndividual, select, true {การส่งแบบส่วนตัว} other {การส่งแบบทีม}} | {remainCount}/{totalCount} ครั้งที่เหลือ | {isDailyLimitEnabled, select, true {วันนี้} other {}} ","runbox.timer.title":"เวลาที่เหลือ","runbox.timer.unlimited":"ไม่จำกัด","runbox.timer.tooltip.title":"ดูข้อมูลเวลา","runbox.timer.popover.title":"คู่มือเวลาใช้งาน Runbox","runbox.timer.popover.description":"นี่คือเวลาใช้งาน Runbox ทั้งหมดของ {user}\nเวลาจะถูกหักออกอย่างต่อเนื่องขณะเชื่อมต่อ ยกเลิกการเชื่อมต่อหรือออกจากบทเรียนเพื่อหยุดการหักเวลา","runbox.timer.popover.quota.title":"เวลาที่สามารถใช้งานได้ทั้งหมด","runbox.timer.popover.quota_per_session.title":"เวลาที่ใช้ได้ในการเชื่อมต่อครั้งนี้","runbox.timer.popover.quota_per_session.description":"การเชื่อมต่อหนึ่งครั้งใช้ได้สูงสุด {time} หากยังมีเวลาใช้งานทั้งหมดเหลืออยู่ คุณสามารถเชื่อมต่อใหม่เพื่อฝึกปฏิบัติต่อได้","runbox.timer.popover.quota.disconnect":"ตัดการเชื่อมต่อ","runbox.timer.popover.do_not_open":"ไม่แสดงป๊อปอัปนี้เมื่อเริ่มเซสชัน","runbox.timer.almost_end.dialog.quota.title":"เหลือเวลาใช้งานทั้งหมด {time}","runbox.timer.almost_end.dialog.quota.description":"เมื่อเวลาใช้งานทั้งหมดหมดลง การฝึกปฏิบัติจะสิ้นสุดและไม่สามารถเชื่อมต่อได้อีก\nกรุณาบันทึกงานของคุณก่อนสิ้นสุด งานที่ไม่ได้บันทึกอาจสูญหาย","runbox.timer.almost_end.dialog.quota_per_session.title":"เหลือเวลาในการเชื่อมต่อครั้งนี้ {time}","runbox.timer.almost_end.dialog.quota_per_session.description":"เมื่อเวลาเชื่อมต่อสิ้นสุด ระบบจะตัดการเชื่อมต่อ หากยังมีเวลาใช้งานทั้งหมดเหลืออยู่ คุณสามารถเชื่อมต่อใหม่เพื่อฝึกปฏิบัติต่อได้\nกรุณาบันทึกงานของคุณก่อนสิ้นสุด ไฟล์ที่บันทึกไว้จะยังคงอยู่เมื่อเชื่อมต่อใหม่ แต่งานที่ไม่ได้บันทึกอาจสูญหาย","runbox.timer.almost_end.dialog.confirm":"ดำเนินการต่อ","runbox.runtime.message.lxp_plan_required":"ขณะนี้สถาบันของคุณไม่รองรับการใช้งานสื่อการเรียนการสอน Runbox\nโปรดติดต่อผู้ดูแลระบบของสถาบันของคุณสำหรับข้อมูลเพิ่มเติม","runbox.runtime.message.runbox_unavailable":"ไม่สามารถใช้ Runbox ได้","runbox.runtime.message.startError":"เกิดข้อผิดพลาดขณะเริ่ม Runbox","runbox.runtime.overlay.terminated.description.default":"หากต้องการดำเนินการฝึก Runbox ต่อ กรุณาคลิกปุ่มเชื่อมต่อ","runbox.runtime.overlay.terminated.description.os_disk_is_full":"พื้นที่จัดเก็บข้อมูลถูกใช้งานจนหมด\nกรุณารีเซ็ตสภาพแวดล้อมการฝึกปฏิบัติแล้วเริ่มต้นใหม่","runbox.runtime.overlay.terminated.description.quota_exceeded":"รันไทม์ถูกยกเลิกเนื่องจากเวลาการใช้งานหมดอายุแล้ว","runbox.runtime.overlay.terminated.description.quota_per_session_exceeded":"รันไทม์ถูกยกเลิกเนื่องจากเวลาการใช้งานต่อเซสชันหมดอายุแล้ว\nหากต้องการเชื่อมต่อกับ Runbox อีกครั้ง กรุณากดปุ่มด้านล่าง","runbox.runtime.overlay.terminated.title":"การเชื่อมต่อถูกยกเลิก","runbox.runtime.overlay.terminated.connect":"เชื่อมต่อ","runbox.runtime.overlay.terminated.unlimited":"ไม่จำกัด","runbox.runtime.overlay.terminated.contact":"ติดต่อฝ่ายบริการลูกค้า","runbox.runtime.overlay.terminated.quota.total":"เวลาที่สามารถใช้งานได้ทั้งหมด","runbox.runtime.overlay.terminated.quota.used":"เวลาที่ใช้ไปทั้งหมด","runbox.runtime.overlay.terminated.disk.total":"พื้นที่ดิสก์ทั้งหมด","runbox.runtime.overlay.terminated.disk.used":"พื้นที่ดิสก์ที่ใช้ไปทั้งหมด","runbox.runtime.overlay.conflicted.description":"การเชื่อมต่อกับการฝึก Runbox นี้จะยุติการทำงานของ Runbox ในสื่อการสอนอื่น\nกรุณาบันทึกงานที่ยังไม่ได้บันทึกก่อน","runbox.runtime.overlay.conflicted.title":"ขณะนี้ Runbox เชื่อมต่อกับสื่อการสอนอื่นอยู่","runbox.runtime.dialog.change_material.title":"ประกาศการเปลี่ยนการเชื่อมต่อ Runbox","runbox.runtime.dialog.change_material.description":"การเชื่อมต่อกับการฝึก Runbox นี้จะยุติการทำงานของ Runbox ในสื่อการสอนอื่น คุณต้องการดำเนินการต่อหรือไม่?","runbox.status.button.title":"สถานะการเชื่อมต่อและทรัพยากร","runbox.status.network":"สถานะเครือข่าย","runbox.status.resource.preparing":"กำลังเตรียม","runbox.status.runtime.connected":"รันไทม์เชื่อมต่อแล้ว","runbox.status.runtime.connecting":"กำลังเชื่อมต่อรันไทม์","runbox.status.runtime.disconnected":"รันไทม์ถูกตัดการเชื่อมต่อ","runbox.disk.usage.dialog.title":"แจ้งเตือนพื้นที่จัดเก็บข้อมูล","runbox.disk.usage.dialog.description.warning":"คุณใช้พื้นที่จัดเก็บข้อมูลไปแล้วมากกว่า 80% ({used} / {total})\nหากพื้นที่ไม่เพียงพอ การฝึกปฏิบัติอาจหยุดลง กรุณาจัดการไฟล์ที่ไม่ใช้งาน","runbox.disk.usage.dialog.description.error":"คุณใช้พื้นที่จัดเก็บข้อมูลไปแล้วมากกว่า 90% ({used} / {total})\nกรุณาลบไฟล์ที่ไม่ใช้งาน หรือรีเซ็ตสภาพแวดล้อมการฝึกปฏิบัติเพื่อเพิ่มพื้นที่","runbox.disk.usage.dialog.actions.close":"ปิด","runbox.disk.usage.alert.warning":"คุณใช้พื้นที่จัดเก็บข้อมูลไปแล้วมากกว่า 80% ({used} / {total}) หากพื้นที่ไม่เพียงพอ การฝึกปฏิบัติอาจหยุดลง กรุณาจัดการไฟล์ที่ไม่ใช้งานล่วงหน้า","runbox.disk.usage.alert.error":"คุณใช้พื้นที่จัดเก็บข้อมูลไปแล้วมากกว่า 90% ({used} / {total}) หากพื้นที่ไม่เพียงพอ การฝึกปฏิบัติอาจหยุดลง กรุณาจัดการไฟล์ที่ไม่ใช้งาน หรือรีเซ็ตสภาพแวดล้อมการฝึกปฏิบัติ","runbox.disk.env_reset.title":"รีเซ็ตสภาพแวดล้อมการฝึกปฏิบัติ","runbox.disk.env_reset.dialog.title":"รีเซ็ตสภาพแวดล้อมการฝึกปฏิบัติ","runbox.disk.env_reset.dialog.description":"เพื่อเพิ่มพื้นที่จัดเก็บข้อมูล ระบบจะรีเซ็ตรันบ็อกซ์กลับไปเป็นสถานะเมื่อเริ่มใช้งานครั้งแรก ไฟล์ที่คุณสร้างหรือบันทึกไว้ระหว่างการฝึกปฏิบัติจะถูกลบทั้งหมดและไม่สามารถกู้คืนได้","runbox.disk.env_reset.dialog.acknowledge":"ฉันเข้าใจว่าไฟล์ที่บันทึกไว้จะไม่สามารถกู้คืนได้หลังการรีเซ็ต","runbox.disk.env_reset.dialog.actions.cancel":"ยกเลิก","runbox.disk.env_reset.dialog.actions.confirm":"ลบ","runbox.disk.env_reset.noti.success":"รีเซ็ตสภาพแวดล้อมการฝึกปฏิบัติแล้ว กำลังเริ่มต้นใหม่","runbox.disk.env_reset.noti.error":"เกิดข้อผิดพลาดขณะรีเซ็ตสภาพแวดล้อมการฝึกปฏิบัติ","runbox.disk.env_reset.noti.no_runtime":"ไม่มีสภาพแวดล้อมการฝึกปฏิบัติที่จะรีเซ็ต กรุณาเริ่มรันบ็อกซ์แล้วลองอีกครั้ง","runbox.runtime.overlay.terminated.title.os_disk_is_full":"พื้นที่จัดเก็บข้อมูลเต็ม\nจึงไม่สามารถดำเนินการฝึกปฏิบัติได้","runbox.runtime.loading.title":"Preparing your practice computer","runbox.runtime.loading.description":"Your practice runs in a cloud environment, not on your own computer. We are setting up the environment for you. Please wait a moment.","runbox.runtime.loading.illustration_alt":"Loading animation of a runbox being assembled","runbox.runtime.loading.step.prepare":"Preparing practice computer","runbox.runtime.loading.step.prepare_progress":"Preparing your practice computer ({current} / {total})","runbox.runtime.loading.step.connect":"Connecting to practice computer","runbox.runtime.loading.step.connect_progress":"Connecting to your practice computer ({current} / {total})","runbox.runtime.loading.step.material":"Preparing practice materials","runbox.runtime.loading.step.material_progress":"Preparing practice materials ({current} / {total})","runbox.runtime.loading.step.status.completed":"Done","runbox.runtime.loading.step.status.active":"In progress","runbox.runtime.loading.step.status.pending":"Waiting","runbox.runtime.loading.note.environment.title":"This runbox is separate from your computer","runbox.runtime.loading.note.environment.description":"You are connecting to a practice environment provided by Elice. Code and programs run inside the runbox.","runbox.runtime.loading.note.save.title":"Your files are saved in the runbox","runbox.runtime.loading.note.save.description":"Saved files persist across sessions. They are stored separately from your computer, so be sure to save your work.","runbox.runtime.loading.tip.common.conflict.title":"Opening another material stops this runbox","runbox.runtime.loading.tip.common.conflict.description":"Save anything you are working on before you leave.","runbox.runtime.loading.tip.common.disk.title":"Storage has a limit too","runbox.runtime.loading.tip.common.disk.description":"Practice can stop once large files pile up.","runbox.runtime.loading.tip.common.quota.title":"Practice time is limited","runbox.runtime.loading.tip.common.quota.description":"The runbox disconnects once the time is up.","runbox.runtime.loading.tip.jupyter.cell_order.title":"Run cells from top to bottom","runbox.runtime.loading.tip.jupyter.cell_order.description":"Skipping one leaves its variables undefined, so the next cell fails.","runbox.runtime.loading.tip.jupyter.run_cell.title":"Run a cell with Shift + Enter","runbox.runtime.loading.tip.jupyter.run_cell.description":"Use Ctrl + Enter to run it and stay where you are.","runbox.runtime.loading.tip.jupyter.restart_kernel.title":"Restart the kernel when results stop making sense","runbox.runtime.loading.tip.jupyter.restart_kernel.description":"Values from earlier runs are usually what is confusing you.","runbox.runtime.loading.tip.jupyter.cell_number.title":"The number beside a cell is its run order","runbox.runtime.loading.tip.jupyter.cell_number.description":"It tells you the order the cells actually ran in.","runbox.runtime.loading.tip.vscode.save_before_run.title":"Save the file before you run it","runbox.runtime.loading.tip.vscode.save_before_run.description":"Unsaved edits do not reach what you run.","runbox.runtime.loading.tip.vscode.terminal.title":"You can open the terminal from the top menu","runbox.runtime.loading.tip.vscode.terminal.description":"It usually appears at the bottom of the screen.","runbox.runtime.loading.tip.vscode.browser_shortcut.title":"This is VS Code running in your browser","runbox.runtime.loading.tip.vscode.browser_shortcut.description":"Some shortcuts may clash with your browser's own.","runbox.runtime.loading.tip.vscode.explorer.title":"Your practice files are in the left explorer","runbox.runtime.loading.tip.vscode.explorer.description":"Expand a folder to open a file.","runbox.runtime.loading.tip.gui.desktop.title":"There is another computer inside the screen","runbox.runtime.loading.tip.gui.desktop.description":"Windows open and close just like they do on your own machine.","runbox.runtime.loading.tip.gui.clipboard.title":"Copy and paste may work differently","runbox.runtime.loading.tip.gui.clipboard.description":"What you copied on your own machine may not paste straight in.","runbox.runtime.loading.tip.gui.move_window.title":"Drag the title bar if a window goes off screen","runbox.runtime.loading.tip.gui.move_window.description":"Reloading the page can lose work in progress.","runbox.runtime.loading.tip.gui.slow_start.title":"Programs can take a while to open","runbox.runtime.loading.tip.gui.slow_start.description":"Give it a moment even if the screen looks empty.","runbox.runtime.loading.tip.orange.widget.title":"You analyse with widgets, not code","runbox.runtime.loading.tip.orange.widget.description":"Drag a widget from the left list onto the canvas.","runbox.runtime.loading.tip.orange.connect.title":"Connect widgets with a line to pass data along","runbox.runtime.loading.tip.orange.connect.description":"One widget's output becomes the next one's input.","runbox.runtime.loading.tip.orange.load_data.title":"Start with the widget that loads data","runbox.runtime.loading.tip.orange.load_data.description":"Nothing downstream runs until the data is open.","runbox.runtime.loading.tip.orange.open_settings.title":"Double-click a widget to open its settings","runbox.runtime.loading.tip.orange.open_settings.description":"Results open the same way.","runbox.runtime.loading.tip.app.web_service.title":"This is a web service running inside the runbox","runbox.runtime.loading.tip.app.web_service.description":"You configure and run it right in the screen.","runbox.runtime.loading.tip.app.slow_start.title":"The first screen can take a while to open","runbox.runtime.loading.tip.app.slow_start.description":"Give the service a moment to get ready.","runbox.runtime.loading.tip.app.persisted.title":"What you build is saved in the runbox","runbox.runtime.loading.tip.app.persisted.description":"Reconnect later and pick up where you left off."};
5
+ var th = {"common.cancel":"ยกเลิก","material.tutoring.runbox_confirm_dialog.action.confirm":"ดำเนินการ","material.tutoring.runbox_confirm_dialog.content":"ขณะนี้นักเรียน {_termCourseRoleStudent} กำลังทำงานในสภาพแวดล้อม Runbox หากคุณเชื่อมต่อ เวลาที่เหลือสำหรับการใช้งานรันไทม์ทั้งหมดจะลดลง คุณต้องการดำเนินการต่อหรือไม่?","material.tutoring.runbox_confirm_dialog.title":"รันบ็อกซ์กำลังทำงาน","runbox.action.autoShutdown.title":"เปิดตลอดเวลา","runbox.action.autoShutdown.tooltip":"คุณสมบัตินี้ไม่สามารถใช้งานได้ในเซสชันนี้ เนื่องจากมีการตั้งค่าให้ปิดการทำงานอัตโนมัติเมื่อออก","runbox.action.grade.dialog.description.error":"มีปัญหาในโค้ดหรือไฟล์ที่ส่ง\nกรุณาตรวจสอบข้อความข้อผิดพลาดด้านล่างและตรวจสอบว่ารูปแบบการส่งตรงกับความต้องการ จากนั้นส่งอีกครั้ง","runbox.action.grade.dialog.description.success":"การจัดเกรดเสร็จสมบูรณ์เรียบร้อยแล้ว","runbox.action.grade.dialog.title":"ผลการประเมินผลการเรียน","runbox.action.grade.noti.error":"เกิดข้อผิดพลาดขึ้นในขณะที่ทำการตรวจคะแนนของโค้ด","runbox.action.grade.title":"ส่ง","runbox.action.grade.tooltip.onProgress":"กำลังให้คะแนนโค้ด โปรดรอสักครู่ การให้คะแนนอาจใช้เวลาสูงสุด 3 นาที ขึ้นอยู่กับประเภทของการฝึกอบรม","runbox.action.reset.dialog.actions.confirm":"รีเซ็ต","runbox.action.reset.dialog.isolated.description":"ต้องการรีเซ็ตโค้ด Runbox หรือไม่? การรีเซ็ตจะแทนที่โค้ดของคุณด้วยโค้ดเริ่มต้นของหน้าเรียน {_termLibraryLecturePage} \nเซสชัน Runbox จะรีเฟรชหลังจากรีเซ็ต","runbox.action.reset.dialog.shared.description":"คุณต้องการรีเซ็ตโค้ดของ Runbox หรือไม่? หากทำการรีเซ็ต โค้ดที่ทีมเขียนไว้จะถูกเขียนทับด้วยโค้ดเริ่มต้น และเซสชันของ Runbox จะถูกรีเฟรชหลังจากนั้น","runbox.action.reset.noti.error":"เกิดข้อผิดพลาดระหว่างการรีเซ็ตโค้ด Runbox","runbox.action.reset.title":"รีเซ็ตโค้ด","runbox.action.restart.dialog.actions.confirm":"เริ่มต้นใหม่","runbox.action.restart.dialog.isolated.description":"ต้องการเริ่มต้น Runbox ใหม่หรือไม่?","runbox.action.restart.dialog.shared.description":"Runbox จะเริ่มต้นใหม่บนหน้าจอของเพื่อนร่วมทีมด้วย คุณต้องการเริ่มต้น Runbox ใหม่หรือไม่?","runbox.action.restart.title":"เริ่มต้น Runbox ใหม่","runbox.action.share.snackbar.copied.fail":"ล้มเหลวในการคัดลอก URL Runbox กรุณาลองอีกครั้ง","runbox.action.share.snackbar.copied.success":"คัดลอก URL Runbox สำเร็จ","runbox.action.share.title":"คัดลอก URL Runbox","runbox.action.submitCountInfo.dialog.description":"คุณใช้จำนวนครั้งในการส่งเกินขีดจำกัดแล้ว","runbox.action.submitCountInfo.dialog.title":"ข้อจำกัดจำนวนครั้งในการส่ง","runbox.action.submitCountInfo.tooltip.disabled":"คุณใช้จำนวนครั้งในการส่งทั้งหมดแล้ว","runbox.action.submitLog.dialog.download.tooltip":"ดาวน์โหลดไฟล์ที่ส่ง","runbox.action.submitLog.dialog.title":"ประวัติการส่ง","runbox.action.submitLog.empty":"ไม่มีประวัติการส่ง","runbox.action.submitLog.title":"ประวัติการส่ง Runbox","runbox.action.disconnect.dialog.title":"ยกเลิกการเชื่อมต่อ Runbox","runbox.action.disconnect.dialog.description":"คุณกำลังอยู่ในระหว่างการฝึกปฏิบัติ ต้องการยกเลิกการเชื่อมต่อ Runbox หรือไม่?\nหากมีงานที่ยังไม่ได้บันทึก กรุณาบันทึกก่อน","runbox.action.disconnect.dialog.disconnect":"ยกเลิกการเชื่อมต่อ","runbox.action.disconnect.title":"ยกเลิกการเชื่อมต่อ","runbox.action.menu.title":"เพิ่มเติม","runbox.alert.title":"คุณได้เชื่อมต่อกับสภาพแวดล้อมที่นักเรียนกำลังทำงานอยู่ และเวลาใช้งานรันไทม์ทั้งหมดกำลังถูกหัก โปรดทราบว่าหากนักเรียนออกจากรันบ็อกซ์ แต่การให้คำปรึกษายังดำเนินต่อไป เวลาจะยังคงถูกหัก","runbox.common.close":"ปิด","runbox.common.retry":"ลองใหม่","runbox.common.score":"{score} คะแนน","runbox.common.support":"สนับสนุน","runbox.common.connect":"เชื่อมต่อ","runbox.context.command.ping.error":"เกิดข้อผิดพลาดขณะดำเนินการ Runbox","runbox.header.submitInfo":"{isIndividual, select, true {การส่งแบบส่วนตัว} other {การส่งแบบทีม}} | {remainCount}/{totalCount} ครั้งที่เหลือ | {isDailyLimitEnabled, select, true {วันนี้} other {}} ","runbox.timer.title":"เวลาที่เหลือ","runbox.timer.unlimited":"ไม่จำกัด","runbox.timer.tooltip.title":"ดูข้อมูลเวลา","runbox.timer.popover.title":"คู่มือเวลาใช้งาน Runbox","runbox.timer.popover.description":"นี่คือเวลาใช้งาน Runbox ทั้งหมดของ {user}\nเวลาจะถูกหักออกอย่างต่อเนื่องขณะเชื่อมต่อ ยกเลิกการเชื่อมต่อหรือออกจากบทเรียนเพื่อหยุดการหักเวลา","runbox.timer.popover.quota.title":"เวลาที่สามารถใช้งานได้ทั้งหมด","runbox.timer.popover.quota_per_session.title":"เวลาที่ใช้ได้ในการเชื่อมต่อครั้งนี้","runbox.timer.popover.quota_per_session.description":"การเชื่อมต่อหนึ่งครั้งใช้ได้สูงสุด {time} หากยังมีเวลาใช้งานทั้งหมดเหลืออยู่ คุณสามารถเชื่อมต่อใหม่เพื่อฝึกปฏิบัติต่อได้","runbox.timer.popover.quota.disconnect":"ตัดการเชื่อมต่อ","runbox.timer.popover.do_not_open":"ไม่แสดงป๊อปอัปนี้เมื่อเริ่มเซสชัน","runbox.timer.almost_end.dialog.quota.title":"เหลือเวลาใช้งานทั้งหมด {time}","runbox.timer.almost_end.dialog.quota.description":"เมื่อเวลาใช้งานทั้งหมดหมดลง การฝึกปฏิบัติจะสิ้นสุดและไม่สามารถเชื่อมต่อได้อีก\nกรุณาบันทึกงานของคุณก่อนสิ้นสุด งานที่ไม่ได้บันทึกอาจสูญหาย","runbox.timer.almost_end.dialog.quota_per_session.title":"เหลือเวลาในการเชื่อมต่อครั้งนี้ {time}","runbox.timer.almost_end.dialog.quota_per_session.description":"เมื่อเวลาเชื่อมต่อสิ้นสุด ระบบจะตัดการเชื่อมต่อ หากยังมีเวลาใช้งานทั้งหมดเหลืออยู่ คุณสามารถเชื่อมต่อใหม่เพื่อฝึกปฏิบัติต่อได้\nกรุณาบันทึกงานของคุณก่อนสิ้นสุด ไฟล์ที่บันทึกไว้จะยังคงอยู่เมื่อเชื่อมต่อใหม่ แต่งานที่ไม่ได้บันทึกอาจสูญหาย","runbox.timer.almost_end.dialog.confirm":"ดำเนินการต่อ","runbox.runtime.message.startError":"เกิดข้อผิดพลาดขณะเริ่ม Runbox","runbox.runtime.overlay.terminated.description.default":"หากต้องการดำเนินการฝึก Runbox ต่อ กรุณาคลิกปุ่มเชื่อมต่อ","runbox.runtime.overlay.terminated.description.os_disk_is_full":"พื้นที่จัดเก็บข้อมูลถูกใช้งานจนหมด\nกรุณารีเซ็ตสภาพแวดล้อมการฝึกปฏิบัติแล้วเริ่มต้นใหม่","runbox.runtime.overlay.terminated.description.quota_exceeded":"รันไทม์ถูกยกเลิกเนื่องจากเวลาการใช้งานหมดอายุแล้ว","runbox.runtime.overlay.terminated.description.quota_per_session_exceeded":"รันไทม์ถูกยกเลิกเนื่องจากเวลาการใช้งานต่อเซสชันหมดอายุแล้ว\nหากต้องการเชื่อมต่อกับ Runbox อีกครั้ง กรุณากดปุ่มด้านล่าง","runbox.runtime.overlay.terminated.title":"การเชื่อมต่อถูกยกเลิก","runbox.runtime.overlay.terminated.connect":"เชื่อมต่อ","runbox.runtime.overlay.terminated.unlimited":"ไม่จำกัด","runbox.runtime.overlay.terminated.contact":"ติดต่อฝ่ายบริการลูกค้า","runbox.runtime.overlay.terminated.quota.total":"เวลาที่สามารถใช้งานได้ทั้งหมด","runbox.runtime.overlay.terminated.quota.used":"เวลาที่ใช้ไปทั้งหมด","runbox.runtime.overlay.terminated.disk.total":"พื้นที่ดิสก์ทั้งหมด","runbox.runtime.overlay.terminated.disk.used":"พื้นที่ดิสก์ที่ใช้ไปทั้งหมด","runbox.runtime.overlay.conflicted.description":"การเชื่อมต่อกับการฝึก Runbox นี้จะยุติการทำงานของ Runbox ในสื่อการสอนอื่น\nกรุณาบันทึกงานที่ยังไม่ได้บันทึกก่อน","runbox.runtime.overlay.conflicted.title":"ขณะนี้ Runbox เชื่อมต่อกับสื่อการสอนอื่นอยู่","runbox.runtime.dialog.change_material.title":"ประกาศการเปลี่ยนการเชื่อมต่อ Runbox","runbox.runtime.dialog.change_material.description":"การเชื่อมต่อกับการฝึก Runbox นี้จะยุติการทำงานของ Runbox ในสื่อการสอนอื่น คุณต้องการดำเนินการต่อหรือไม่?","runbox.status.button.title":"สถานะการเชื่อมต่อและทรัพยากร","runbox.status.network":"สถานะเครือข่าย","runbox.status.resource.preparing":"กำลังเตรียม","runbox.status.runtime.connected":"รันไทม์เชื่อมต่อแล้ว","runbox.status.runtime.connecting":"กำลังเชื่อมต่อรันไทม์","runbox.status.runtime.disconnected":"รันไทม์ถูกตัดการเชื่อมต่อ","runbox.disk.usage.dialog.title":"แจ้งเตือนพื้นที่จัดเก็บข้อมูล","runbox.disk.usage.dialog.description.warning":"คุณใช้พื้นที่จัดเก็บข้อมูลไปแล้วมากกว่า 80% ({used} / {total})\nหากพื้นที่ไม่เพียงพอ การฝึกปฏิบัติอาจหยุดลง กรุณาจัดการไฟล์ที่ไม่ใช้งาน","runbox.disk.usage.dialog.description.error":"คุณใช้พื้นที่จัดเก็บข้อมูลไปแล้วมากกว่า 90% ({used} / {total})\nกรุณาลบไฟล์ที่ไม่ใช้งาน หรือรีเซ็ตสภาพแวดล้อมการฝึกปฏิบัติเพื่อเพิ่มพื้นที่","runbox.disk.usage.dialog.actions.close":"ปิด","runbox.disk.usage.alert.warning":"คุณใช้พื้นที่จัดเก็บข้อมูลไปแล้วมากกว่า 80% ({used} / {total}) หากพื้นที่ไม่เพียงพอ การฝึกปฏิบัติอาจหยุดลง กรุณาจัดการไฟล์ที่ไม่ใช้งานล่วงหน้า","runbox.disk.usage.alert.error":"คุณใช้พื้นที่จัดเก็บข้อมูลไปแล้วมากกว่า 90% ({used} / {total}) หากพื้นที่ไม่เพียงพอ การฝึกปฏิบัติอาจหยุดลง กรุณาจัดการไฟล์ที่ไม่ใช้งาน หรือรีเซ็ตสภาพแวดล้อมการฝึกปฏิบัติ","runbox.disk.env_reset.title":"รีเซ็ตสภาพแวดล้อมการฝึกปฏิบัติ","runbox.disk.env_reset.dialog.title":"รีเซ็ตสภาพแวดล้อมการฝึกปฏิบัติ","runbox.disk.env_reset.dialog.description":"เพื่อเพิ่มพื้นที่จัดเก็บข้อมูล ระบบจะรีเซ็ตรันบ็อกซ์กลับไปเป็นสถานะเมื่อเริ่มใช้งานครั้งแรก ไฟล์ที่คุณสร้างหรือบันทึกไว้ระหว่างการฝึกปฏิบัติจะถูกลบทั้งหมดและไม่สามารถกู้คืนได้","runbox.disk.env_reset.dialog.acknowledge":"ฉันเข้าใจว่าไฟล์ที่บันทึกไว้จะไม่สามารถกู้คืนได้หลังการรีเซ็ต","runbox.disk.env_reset.dialog.actions.cancel":"ยกเลิก","runbox.disk.env_reset.dialog.actions.confirm":"ลบ","runbox.disk.env_reset.noti.success":"รีเซ็ตสภาพแวดล้อมการฝึกปฏิบัติแล้ว กำลังเริ่มต้นใหม่","runbox.disk.env_reset.noti.error":"เกิดข้อผิดพลาดขณะรีเซ็ตสภาพแวดล้อมการฝึกปฏิบัติ","runbox.disk.env_reset.noti.no_runtime":"ไม่มีสภาพแวดล้อมการฝึกปฏิบัติที่จะรีเซ็ต กรุณาเริ่มรันบ็อกซ์แล้วลองอีกครั้ง","runbox.runtime.overlay.terminated.title.os_disk_is_full":"พื้นที่จัดเก็บข้อมูลเต็ม\nจึงไม่สามารถดำเนินการฝึกปฏิบัติได้","runbox.runtime.loading.title":"Preparing your practice computer","runbox.runtime.loading.description":"Your practice runs in a cloud environment, not on your own computer. We are setting up the environment for you. Please wait a moment.","runbox.runtime.loading.illustration_alt":"Loading animation of a runbox being assembled","runbox.runtime.loading.step.prepare":"Preparing practice computer","runbox.runtime.loading.step.prepare_progress":"Preparing your practice computer ({current} / {total})","runbox.runtime.loading.step.connect":"Connecting to practice computer","runbox.runtime.loading.step.connect_progress":"Connecting to your practice computer ({current} / {total})","runbox.runtime.loading.step.material":"Preparing practice materials","runbox.runtime.loading.step.material_progress":"Preparing practice materials ({current} / {total})","runbox.runtime.loading.step.status.completed":"Done","runbox.runtime.loading.step.status.active":"In progress","runbox.runtime.loading.step.status.pending":"Waiting","runbox.runtime.loading.note.environment.title":"This runbox is separate from your computer","runbox.runtime.loading.note.environment.description":"You are connecting to a practice environment provided by Elice. Code and programs run inside the runbox.","runbox.runtime.loading.note.save.title":"Your files are saved in the runbox","runbox.runtime.loading.note.save.description":"Saved files persist across sessions. They are stored separately from your computer, so be sure to save your work.","runbox.runtime.loading.tip.common.conflict.title":"Opening another material stops this runbox","runbox.runtime.loading.tip.common.conflict.description":"Save anything you are working on before you leave.","runbox.runtime.loading.tip.common.disk.title":"Storage has a limit too","runbox.runtime.loading.tip.common.disk.description":"Practice can stop once large files pile up.","runbox.runtime.loading.tip.common.quota.title":"Practice time is limited","runbox.runtime.loading.tip.common.quota.description":"The runbox disconnects once the time is up.","runbox.runtime.loading.tip.jupyter.cell_order.title":"Run cells from top to bottom","runbox.runtime.loading.tip.jupyter.cell_order.description":"Skipping one leaves its variables undefined, so the next cell fails.","runbox.runtime.loading.tip.jupyter.run_cell.title":"Run a cell with Shift + Enter","runbox.runtime.loading.tip.jupyter.run_cell.description":"Use Ctrl + Enter to run it and stay where you are.","runbox.runtime.loading.tip.jupyter.restart_kernel.title":"Restart the kernel when results stop making sense","runbox.runtime.loading.tip.jupyter.restart_kernel.description":"Values from earlier runs are usually what is confusing you.","runbox.runtime.loading.tip.jupyter.cell_number.title":"The number beside a cell is its run order","runbox.runtime.loading.tip.jupyter.cell_number.description":"It tells you the order the cells actually ran in.","runbox.runtime.loading.tip.vscode.save_before_run.title":"Save the file before you run it","runbox.runtime.loading.tip.vscode.save_before_run.description":"Unsaved edits do not reach what you run.","runbox.runtime.loading.tip.vscode.terminal.title":"You can open the terminal from the top menu","runbox.runtime.loading.tip.vscode.terminal.description":"It usually appears at the bottom of the screen.","runbox.runtime.loading.tip.vscode.browser_shortcut.title":"This is VS Code running in your browser","runbox.runtime.loading.tip.vscode.browser_shortcut.description":"Some shortcuts may clash with your browser's own.","runbox.runtime.loading.tip.vscode.explorer.title":"Your practice files are in the left explorer","runbox.runtime.loading.tip.vscode.explorer.description":"Expand a folder to open a file.","runbox.runtime.loading.tip.gui.desktop.title":"There is another computer inside the screen","runbox.runtime.loading.tip.gui.desktop.description":"Windows open and close just like they do on your own machine.","runbox.runtime.loading.tip.gui.clipboard.title":"Copy and paste may work differently","runbox.runtime.loading.tip.gui.clipboard.description":"What you copied on your own machine may not paste straight in.","runbox.runtime.loading.tip.gui.move_window.title":"Drag the title bar if a window goes off screen","runbox.runtime.loading.tip.gui.move_window.description":"Reloading the page can lose work in progress.","runbox.runtime.loading.tip.gui.slow_start.title":"Programs can take a while to open","runbox.runtime.loading.tip.gui.slow_start.description":"Give it a moment even if the screen looks empty.","runbox.runtime.loading.tip.orange.widget.title":"You analyse with widgets, not code","runbox.runtime.loading.tip.orange.widget.description":"Drag a widget from the left list onto the canvas.","runbox.runtime.loading.tip.orange.connect.title":"Connect widgets with a line to pass data along","runbox.runtime.loading.tip.orange.connect.description":"One widget's output becomes the next one's input.","runbox.runtime.loading.tip.orange.load_data.title":"Start with the widget that loads data","runbox.runtime.loading.tip.orange.load_data.description":"Nothing downstream runs until the data is open.","runbox.runtime.loading.tip.orange.open_settings.title":"Double-click a widget to open its settings","runbox.runtime.loading.tip.orange.open_settings.description":"Results open the same way.","runbox.runtime.loading.tip.app.web_service.title":"This is a web service running inside the runbox","runbox.runtime.loading.tip.app.web_service.description":"You configure and run it right in the screen.","runbox.runtime.loading.tip.app.slow_start.title":"The first screen can take a while to open","runbox.runtime.loading.tip.app.slow_start.description":"Give the service a moment to get ready.","runbox.runtime.loading.tip.app.persisted.title":"What you build is saved in the runbox","runbox.runtime.loading.tip.app.persisted.description":"Reconnect later and pick up where you left off.","runbox.alert.credit.exhausted":"เครดิตสำหรับการฝึกปฏิบัติ AI ถูกใช้หมดแล้ว ไม่สามารถฝึกปฏิบัติ AI ต่อได้อีก กรุณาบันทึกโค้ดที่กำลังเขียนภายใน {minutes} นาที เนื้อหาที่ไม่ได้บันทึกอาจสูญหาย","runbox.alert.credit.low":"เครดิตสำหรับการฝึกปฏิบัติ AI เหลือน้อย การฝึกปฏิบัติ AI จะหยุดเมื่อใช้เครดิตหมด โค้ดไม่ได้บันทึกอัตโนมัติ กรุณาบันทึกงานของคุณล่วงหน้า","runbox.runtime.overlay.terminated.title.insufficient_credit":"ไม่สามารถเริ่มการฝึกปฏิบัติ AI ได้","runbox.runtime.overlay.terminated.description.insufficient_credit":"เครดิตสำหรับการฝึกปฏิบัติ AI ถูกใช้หมดแล้ว กรุณาติดต่อผู้ดูแลระบบขององค์กร"};
6
6
 
7
7
  exports.default = th;
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import type { RunboxGetAndListResponse, RuntimeGetAndListResponse, RuntimeTemplateGetAndListResponse } from '@elice/openapi-client-material-runbox';
2
+ import type { LxpCreditStatusEnum, RunboxGetAndListResponse, RuntimeGetAndListResponse, RuntimeTemplateGetAndListResponse } from '@elice/openapi-client-material-runbox';
3
3
  import type { QueryObserverResult } from '@tanstack/react-query';
4
4
  import type { GetAchievementColor } from '../MaterialRunboxContent';
5
5
  export interface RuntimeProps {
@@ -27,6 +27,8 @@ export interface RuntimeProps {
27
27
  ], unknown>>;
28
28
  /** */
29
29
  getAchievementColor?: GetAchievementColor;
30
+ /** LXP credit status from the heartbeat. `null` when the session is not charged to credit. */
31
+ creditStatus?: LxpCreditStatusEnum | null;
30
32
  }
31
33
  declare const Runtime: React.FC<RuntimeProps>;
32
34
  export default Runtime;
@@ -120,7 +120,8 @@ var Runtime = function Runtime(props) {
120
120
  return jsxRuntime.jsx(RuntimeOverlayTerminated.default, Object.assign({}, overlayProps, {
121
121
  runtimeTemplateId: props.runtimeTemplate.id,
122
122
  courseId: props.courseId,
123
- studentUserId: props.studentUserId
123
+ studentUserId: props.studentUserId,
124
+ creditStatus: props.creditStatus
124
125
  }));
125
126
  }
126
127
  }, viewRefreshTrigger);
@@ -1,3 +1,4 @@
1
+ import { LxpCreditStatusEnum } from '@elice/openapi-client-material-runbox';
1
2
  import type { WithIntlComponentBuilderProps } from '@elice/intl';
2
3
  import type { EliceRunboxViewerOverlayTerminatedComponentProps as TerminatedComponentProps } from '@elice/runbox-client';
3
4
  import type React from 'react';
@@ -6,6 +7,8 @@ interface RuntimeOverlayTerminatedProps extends TerminatedComponentProps {
6
7
  courseId: number;
7
8
  /** User ID for tutoring. */
8
9
  studentUserId?: number;
10
+ /** LXP credit status from the heartbeat. `null` when the session is not charged to credit. */
11
+ creditStatus?: LxpCreditStatusEnum | null;
9
12
  }
10
13
  declare const _default: React.ForwardRefExoticComponent<import("@elice/intl").IntlComponentExtraProps & Omit<WithIntlComponentBuilderProps<RuntimeOverlayTerminatedProps>, keyof import("@elice/intl").IntlComponentExtraProps | "__intl"> & React.RefAttributes<any>>;
11
14
  export default _default;
@@ -6,9 +6,11 @@ var jsxRuntime = require('react/jsx-runtime');
6
6
  var edsKit = require('@elice/eds-kit');
7
7
  var edsMaterial = require('@elice/eds-material');
8
8
  var intl = require('@elice/intl');
9
+ var openapiClientMaterialRunbox = require('@elice/openapi-client-material-runbox');
9
10
  var runboxClient = require('@elice/runbox-client');
10
11
  var proSolidSvgIcons = require('@fortawesome/pro-solid-svg-icons');
11
12
  var theme = require('../theme.js');
13
+ var creditExhausted = require('../../../assets/credit-exhausted.svg.js');
12
14
  var terminated = require('../../../assets/terminated.png.js');
13
15
  var en = require('../locales/en.json.js');
14
16
  var ko = require('../locales/ko.json.js');
@@ -16,6 +18,11 @@ var MaterialRunboxControlContext = require('../contexts/MaterialRunboxControlCon
16
18
  var MaterialRunboxContext = require('../contexts/MaterialRunboxContext.js');
17
19
  var MaterialRunboxEnvResetButton = require('../disk/MaterialRunboxEnvResetButton.js');
18
20
 
21
+ //
22
+ //
23
+ //
24
+ /** Start error code of a refused start, which runbox-client hands over as the terminated reason. */
25
+ var INSUFFICIENT_CREDIT_REASON = 'insufficient_credit';
19
26
  //
20
27
  //
21
28
  //
@@ -24,7 +31,8 @@ var RuntimeOverlayTerminated = function RuntimeOverlayTerminated(_ref) {
24
31
  reason = _ref.reason,
25
32
  runtimeTemplateId = _ref.runtimeTemplateId,
26
33
  courseId = _ref.courseId,
27
- studentUserId = _ref.studentUserId;
34
+ studentUserId = _ref.studentUserId,
35
+ creditStatus = _ref.creditStatus;
28
36
  var _useEliceRunboxQuota = runboxClient.useEliceRunboxQuota(),
29
37
  quotaInfo = _useEliceRunboxQuota.quotaInfo;
30
38
  var _useMaterialRunboxCon = MaterialRunboxControlContext.useMaterialRunboxControlContext(),
@@ -117,7 +125,7 @@ var RuntimeOverlayTerminated = function RuntimeOverlayTerminated(_ref) {
117
125
  /**
118
126
  *
119
127
  */
120
- var renderOverlay = function renderOverlay(args) {
128
+ var renderOverlayContainer = function renderOverlayContainer(children) {
121
129
  return (
122
130
  // EliceRunboxView shadows the consumer intl context with the runbox-client
123
131
  // bundle, so re-provide this package's messages for descendants that call
@@ -136,45 +144,75 @@ var RuntimeOverlayTerminated = function RuntimeOverlayTerminated(_ref) {
136
144
  backgroundColor: 'background.paper',
137
145
  color: 'text.primary'
138
146
  },
139
- children: jsxRuntime.jsxs(edsMaterial.Stack, {
140
- sx: {
141
- alignItems: 'center',
142
- gap: '1.5rem'
143
- },
144
- children: [jsxRuntime.jsx(edsMaterial.Box, {
145
- component: "img",
146
- src: terminated.default,
147
- alt: "terminated",
148
- sx: {
149
- maxWidth: '10rem',
150
- height: 'auto'
151
- }
152
- }), jsxRuntime.jsx(edsMaterial.Typography, {
153
- variant: "h6",
154
- sx: {
155
- whiteSpace: 'pre-line',
156
- textAlign: 'center'
157
- },
158
- children: args.title
159
- }), jsxRuntime.jsx(edsMaterial.Typography, {
160
- variant: "body1",
161
- sx: {
162
- whiteSpace: 'pre-line',
163
- textAlign: 'center'
164
- },
165
- children: args.description
166
- }), args.body]
167
- })
147
+ children: children
168
148
  })
169
149
  })
170
150
  })
171
151
  );
172
152
  };
153
+ /**
154
+ *
155
+ */
156
+ var renderOverlay = function renderOverlay(args) {
157
+ return renderOverlayContainer(jsxRuntime.jsxs(edsMaterial.Stack, {
158
+ sx: {
159
+ alignItems: 'center',
160
+ gap: '1.5rem'
161
+ },
162
+ children: [jsxRuntime.jsx(edsMaterial.Box, {
163
+ component: "img",
164
+ src: terminated.default,
165
+ alt: "terminated",
166
+ sx: {
167
+ maxWidth: '10rem',
168
+ height: 'auto'
169
+ }
170
+ }), jsxRuntime.jsx(edsMaterial.Typography, {
171
+ variant: "h6",
172
+ sx: {
173
+ whiteSpace: 'pre-line',
174
+ textAlign: 'center'
175
+ },
176
+ children: args.title
177
+ }), jsxRuntime.jsx(edsMaterial.Typography, {
178
+ variant: "body1",
179
+ sx: {
180
+ whiteSpace: 'pre-line',
181
+ textAlign: 'center'
182
+ },
183
+ children: args.description
184
+ }), args.body]
185
+ }));
186
+ };
187
+ /**
188
+ * Credit exhausted. No reconnect: the start is refused until the credit is topped up.
189
+ */
190
+ var renderCreditOverlay = function renderCreditOverlay() {
191
+ return renderOverlayContainer(jsxRuntime.jsx(edsKit.EmptyState, {
192
+ size: "large",
193
+ asset: jsxRuntime.jsx(edsKit.EmptyStateAsset, {
194
+ children: jsxRuntime.jsx("img", {
195
+ src: creditExhausted.default,
196
+ alt: ""
197
+ })
198
+ }),
199
+ title: intl$1.formatMessage({
200
+ id: 'runbox.runtime.overlay.terminated.title.insufficient_credit'
201
+ }),
202
+ description: intl$1.formatMessage({
203
+ id: 'runbox.runtime.overlay.terminated.description.insufficient_credit'
204
+ })
205
+ }));
206
+ };
173
207
  //
174
208
  //
175
209
  //
176
210
  // Handle specific cases.
177
- if (reason === 'os_disk_is_full') {
211
+ // A session the credit settler stops arrives with the runbox-api reason instead of
212
+ // `insufficient_credit`, so the heartbeat's `exhausted` covers it.
213
+ if (reason === INSUFFICIENT_CREDIT_REASON || creditStatus === openapiClientMaterialRunbox.LxpCreditStatusEnum.Exhausted) {
214
+ return renderCreditOverlay();
215
+ } else if (reason === 'os_disk_is_full') {
178
216
  return renderOverlay({
179
217
  title: intl$1.formatMessage({
180
218
  id: 'runbox.runtime.overlay.terminated.title.os_disk_is_full'
@@ -0,0 +1,3 @@
1
+ var img = "data:image/svg+xml,%3csvg width='160' height='160' viewBox='0 0 160 160' fill='none' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M80 160C124.183 160 160 124.183 160 80C160 35.8172 124.183 0 80 0C35.8172 0 0 35.8172 0 80C0 124.183 35.8172 160 80 160Z' fill='%23EEEAFE'/%3e%3cmask id='mask0_15106_87259' style='mask-type:alpha' maskUnits='userSpaceOnUse' x='0' y='0' width='160' height='160'%3e%3cpath d='M80 160C124.183 160 160 124.183 160 80C160 35.8172 124.183 0 80 0C35.8172 0 0 35.8172 0 80C0 124.183 35.8172 160 80 160Z' fill='%23EEEAFE'/%3e%3c/mask%3e%3cg mask='url(%23mask0_15106_87259)'%3e%3cpath d='M128 160H32V56.5335C36.5248 56.5284 40.8628 54.7287 44.0623 51.5292C47.2619 48.3296 49.0616 43.9916 49.0667 39.4668H110.933C110.929 41.7083 111.368 43.9284 112.227 45.9988C113.086 48.0692 114.347 49.9488 115.937 51.5286C117.517 53.1192 119.397 54.3805 121.467 55.2396C123.538 56.0987 125.758 56.5384 128 56.5335V160Z' fill='white'/%3e%3cpath d='M80 122C72.8125 122 66.25 118.25 62.6562 112C59.0625 105.828 59.0625 98.25 62.6562 92C66.25 85.8281 72.8125 82 80 82C87.1094 82 93.6719 85.8281 97.2656 92C100.859 98.25 100.859 105.828 97.2656 112C93.6719 118.25 87.1094 122 80 122ZM75.5469 106.453C73.125 104.031 73.125 100.047 75.5469 97.625C77.9688 95.2031 81.9531 95.2031 84.375 97.625C85.0781 98.3281 86.3281 98.3281 87.0312 97.625C87.7344 96.9219 87.7344 95.6719 87.0312 94.9688C83.125 91.0625 76.7969 91.0625 72.8906 94.9688C68.9844 98.875 68.9844 105.203 72.8906 109.109C76.7969 113.016 83.125 113.016 87.0312 109.109C87.7344 108.406 87.7344 107.156 87.0312 106.453C86.3281 105.75 85.0781 105.75 84.375 106.453C81.9531 108.875 77.9688 108.875 75.5469 106.453Z' fill='%23FFB300'/%3e%3cpath d='M93.8669 115.2H66.1336C64.3663 115.2 62.9336 116.633 62.9336 118.4C62.9336 120.168 64.3663 121.6 66.1336 121.6H93.8669C95.6342 121.6 97.0669 120.168 97.0669 118.4C97.0669 116.633 95.6342 115.2 93.8669 115.2Z' fill='%23EEEAFE'/%3e%3cpath d='M103.465 128H56.532C54.7647 128 53.332 129.433 53.332 131.2C53.332 132.967 54.7647 134.4 56.532 134.4H103.465C105.233 134.4 106.665 132.967 106.665 131.2C106.665 129.433 105.233 128 103.465 128Z' fill='%23EEEAFE'/%3e%3c/g%3e%3c/svg%3e";
2
+
3
+ export { img as default };
@@ -16,8 +16,6 @@ export interface MaterialRunboxContentProps extends Pick<MaterialRunboxHeaderPro
16
16
  runboxId: string | null;
17
17
  /** Course ID. */
18
18
  courseId: number;
19
- /** */
20
- enabledLxpPlan?: boolean;
21
19
  /** User ID for tutoring. */
22
20
  studentUserId?: number;
23
21
  /** User ID for tutor. */
@@ -11,6 +11,7 @@ import { useQuery } from '@tanstack/react-query';
11
11
  import MaterialAdminRunboxConfirmDialog from './MaterialAdminRunboxConfirmDialog.js';
12
12
  import MaterialRunboxAlert from './MaterialRunboxAlert.js';
13
13
  import MaterialRunboxBody from './MaterialRunboxBody.js';
14
+ import MaterialRunboxCreditAlert from './MaterialRunboxCreditAlert.js';
14
15
  import MaterialRunboxHeader from './MaterialRunboxHeader.js';
15
16
  import { runboxLightTheme } from './theme.js';
16
17
  import { useMaterialRunboxContext } from './contexts/MaterialRunboxContext.js';
@@ -37,7 +38,6 @@ var StyledRunboxContainer = styled('div')(_templateObject || (_templateObject =
37
38
  var MaterialRunboxContent = function MaterialRunboxContent(_ref) {
38
39
  var runboxId = _ref.runboxId,
39
40
  courseId = _ref.courseId,
40
- enabledLxpPlan = _ref.enabledLxpPlan,
41
41
  studentUserId = _ref.studentUserId,
42
42
  userId = _ref.userId,
43
43
  _ref$isTutoring = _ref.isTutoring,
@@ -55,6 +55,10 @@ var MaterialRunboxContent = function MaterialRunboxContent(_ref) {
55
55
  _React$useState2 = _slicedToArray(_React$useState, 2),
56
56
  snackbarRoot = _React$useState2[0],
57
57
  setSnackbarRoot = _React$useState2[1];
58
+ var _React$useState3 = React.useState(null),
59
+ _React$useState4 = _slicedToArray(_React$useState3, 2),
60
+ creditStatus = _React$useState4[0],
61
+ setCreditStatus = _React$useState4[1];
58
62
  //
59
63
  //
60
64
  //
@@ -122,14 +126,14 @@ var MaterialRunboxContent = function MaterialRunboxContent(_ref) {
122
126
  starter = _useMaterialRunboxRun.data,
123
127
  isLoading = _useMaterialRunboxRun.isLoading;
124
128
  var isStudentRunboxRunning = (starter === null || starter === void 0 ? void 0 : starter.userId) && userId !== starter.userId && starter.status !== RunboxStarterGetResponseStatusEnum.Terminated;
125
- var _React$useState3 = React.useState(false),
126
- _React$useState4 = _slicedToArray(_React$useState3, 2),
127
- isConfirmDialogOpen = _React$useState4[0],
128
- setIsConfirmDialogOpen = _React$useState4[1];
129
129
  var _React$useState5 = React.useState(false),
130
130
  _React$useState6 = _slicedToArray(_React$useState5, 2),
131
- isConfirmed = _React$useState6[0],
132
- setIsConfirmed = _React$useState6[1];
131
+ isConfirmDialogOpen = _React$useState6[0],
132
+ setIsConfirmDialogOpen = _React$useState6[1];
133
+ var _React$useState7 = React.useState(false),
134
+ _React$useState8 = _slicedToArray(_React$useState7, 2),
135
+ isConfirmed = _React$useState8[0],
136
+ setIsConfirmed = _React$useState8[1];
133
137
  /**
134
138
  * if not confirmed, close the dialog and navigate to default tutoring
135
139
  */
@@ -207,41 +211,6 @@ var MaterialRunboxContent = function MaterialRunboxContent(_ref) {
207
211
  })
208
212
  });
209
213
  }
210
- if (!enabledLxpPlan) {
211
- return jsx(ThemeProvider, {
212
- theme: runboxLightTheme,
213
- children: jsx(StyledRunboxContainer, {
214
- sx: {
215
- backgroundColor: 'background.paper',
216
- color: 'text.primary'
217
- },
218
- children: jsxs(Stack, {
219
- sx: {
220
- textAlign: 'center',
221
- gap: '0.5rem'
222
- },
223
- children: [jsx(Typography, {
224
- variant: "h6",
225
- sx: {
226
- color: 'text.secondary'
227
- },
228
- children: intl.formatMessage({
229
- id: 'runbox.runtime.message.runbox_unavailable'
230
- })
231
- }), jsx(Typography, {
232
- variant: "body1",
233
- sx: {
234
- color: 'text.tertiary',
235
- whiteSpace: 'pre-line'
236
- },
237
- children: intl.formatMessage({
238
- id: 'runbox.runtime.message.lxp_plan_required'
239
- })
240
- })]
241
- })
242
- })
243
- });
244
- }
245
214
  if (!runbox || !runtimeTemplate) {
246
215
  return null;
247
216
  }
@@ -264,7 +233,8 @@ var MaterialRunboxContent = function MaterialRunboxContent(_ref) {
264
233
  userId: userId,
265
234
  isTutoring: isTutoring,
266
235
  refetch: refetch,
267
- getAchievementColor: getAchievementColor
236
+ getAchievementColor: getAchievementColor,
237
+ creditStatus: creditStatus
268
238
  };
269
239
  return jsx(MaterialRunboxCommandContextProvider, {
270
240
  runtime: runtime,
@@ -282,6 +252,10 @@ var MaterialRunboxContent = function MaterialRunboxContent(_ref) {
282
252
  }
283
253
  }, {
284
254
  signal: signal
255
+ }).then(function (res) {
256
+ var _a;
257
+ setCreditStatus((_a = res.creditStatus) !== null && _a !== void 0 ? _a : null);
258
+ return res;
285
259
  });
286
260
  },
287
261
  runboxApiQuota: function runboxApiQuota(_ref4) {
@@ -306,7 +280,10 @@ var MaterialRunboxContent = function MaterialRunboxContent(_ref) {
306
280
  children: jsxs(MaterialRunboxControlContextProvider, Object.assign({}, props, {
307
281
  children: [jsx(MaterialRunboxHeader, Object.assign({}, props, {
308
282
  hideTimerPopover: hideTimerPopover
309
- })), jsx(MaterialRunboxAlert, {
283
+ })), jsx(MaterialRunboxCreditAlert, {
284
+ creditStatus: creditStatus,
285
+ isTutoring: isTutoring
286
+ }), jsx(MaterialRunboxAlert, {
310
287
  runbox: runbox,
311
288
  courseId: courseId,
312
289
  studentUserId: studentUserId,
@@ -0,0 +1,10 @@
1
+ import { LxpCreditStatusEnum } from '@elice/openapi-client-material-runbox';
2
+ import type React from 'react';
3
+ export interface MaterialRunboxCreditAlertProps {
4
+ /** LXP credit status from the heartbeat. `null` when the session is not charged to credit. */
5
+ creditStatus: LxpCreditStatusEnum | null;
6
+ /** Whether tutoring is enabled. */
7
+ isTutoring: boolean;
8
+ }
9
+ declare const MaterialRunboxCreditAlert: React.FC<MaterialRunboxCreditAlertProps>;
10
+ export default MaterialRunboxCreditAlert;
@@ -0,0 +1,53 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { ThemeProvider, Alert } from '@elice/eds-material';
3
+ import { useRawEliceIntl } from '@elice/intl';
4
+ import { LxpCreditStatusEnum } from '@elice/openapi-client-material-runbox';
5
+ import { useEliceRunboxRunning } from '@elice/runbox-client';
6
+ import { runboxLightTheme } from './theme.js';
7
+
8
+ //
9
+ //
10
+ //
11
+ /** The credit settler stops an exhausted session on its next tick, which runs every minute. */
12
+ var EXHAUSTED_STOP_MINUTES = 1;
13
+ //
14
+ //
15
+ //
16
+ var MaterialRunboxCreditAlert = function MaterialRunboxCreditAlert(_ref) {
17
+ var creditStatus = _ref.creditStatus,
18
+ isTutoring = _ref.isTutoring;
19
+ var intl = useRawEliceIntl();
20
+ var _useEliceRunboxRunnin = useEliceRunboxRunning(),
21
+ status = _useEliceRunboxRunnin.status;
22
+ // `exhausted` keeps the warning until the server stops the session, then the terminated overlay
23
+ // explains it. The copy speaks to the learner, so a tutor watching the session does not get it.
24
+ var isShown = !isTutoring && status !== 'terminated' && (creditStatus === LxpCreditStatusEnum.Low || creditStatus === LxpCreditStatusEnum.Exhausted);
25
+ //
26
+ //
27
+ //
28
+ if (!isShown) {
29
+ return null;
30
+ }
31
+ return (
32
+ // The design keeps this alert light under the dark runbox header.
33
+ jsx(ThemeProvider, {
34
+ theme: runboxLightTheme,
35
+ children: jsx(Alert, {
36
+ variant: "banner",
37
+ severity: "warning",
38
+ sx: {
39
+ width: '100%'
40
+ },
41
+ children: creditStatus === LxpCreditStatusEnum.Exhausted ? intl.formatMessage({
42
+ id: 'runbox.alert.credit.exhausted'
43
+ }, {
44
+ minutes: EXHAUSTED_STOP_MINUTES
45
+ }) : intl.formatMessage({
46
+ id: 'runbox.alert.credit.low'
47
+ })
48
+ })
49
+ })
50
+ );
51
+ };
52
+
53
+ export { MaterialRunboxCreditAlert as default };
@@ -1,3 +1,3 @@
1
- var messageEn = {"common.cancel":"Cancel","material.tutoring.runbox_confirm_dialog.action.confirm":"Proceed","material.tutoring.runbox_confirm_dialog.content":"The Runbox environment is currently running for the {_termCourseRoleStudent}. If you connect, the remaining total runtime usage time will decrease. Do you want to proceed?","material.tutoring.runbox_confirm_dialog.title":"Running Runbox","runbox.action.autoShutdown.title":"Always on","runbox.action.autoShutdown.tooltip":"This feature is not available for this session, as it's set to automatically shut down upon departure.","runbox.action.grade.dialog.description.error":"There is a problem with the code or submission file.\nPlease check the error message below and verify that the submission format meets the requirements. Then, submit again.","runbox.action.grade.dialog.description.success":"Grading completed successfully.","runbox.action.grade.dialog.title":"Grading result","runbox.action.grade.noti.error":"An error occurred while grading the code.","runbox.action.grade.title":"Submit","runbox.action.grade.tooltip.onProgress":"Grading is in progress. Please wait for a moment. Depending on the {_termLibraryLecturePage}, grading may take up to 3 minutes.","runbox.action.reset.dialog.actions.confirm":"Reset","runbox.action.reset.dialog.isolated.description":"Are you sure you want to reset the runbox code? Your codes will be overwritten to default code of {_termLibraryLecturePage}.\nAfter reset, the runbox session will be refreshed.","runbox.action.reset.dialog.shared.description":"Do you want to reset the Runbox code? If you reset, the code written by team members will also be overwritten with the default code. The Runbox session will be refreshed after resetting.","runbox.action.reset.noti.error":"An error occurred while initializing the runbox code.","runbox.action.reset.title":"Reset code","runbox.action.restart.dialog.actions.confirm":"Restart","runbox.action.restart.dialog.isolated.description":"Are you sure you want to restart the runbox?","runbox.action.restart.dialog.shared.description":"The Runbox will also restart on your teammates' screens. Do you want to restart the Runbox?","runbox.action.restart.title":"Restart runbox","runbox.action.share.snackbar.copied.fail":"Copying the runbox URL failed, please try again","runbox.action.share.snackbar.copied.success":"The runbox URL was copied successfully.","runbox.action.share.title":"Share runbox URL","runbox.action.submitCountInfo.dialog.description":"You have exceeded the submission count limit","runbox.action.submitCountInfo.dialog.title":"Limit the number of submissions","runbox.action.submitCountInfo.tooltip.disabled":"The submission count has been used up","runbox.action.submitLog.dialog.download.tooltip":"Download submitted file","runbox.action.submitLog.dialog.title":"Submission History","runbox.action.submitLog.empty":"No submission history exists.","runbox.action.submitLog.title":"Runbox Submission History","runbox.action.disconnect.dialog.title":"Disconnect Runbox","runbox.action.disconnect.dialog.description":"You are currently in a practice session. Do you want to disconnect Runbox?\nIf you have any unsaved work, please save it first.","runbox.action.disconnect.dialog.disconnect":"Disconnect","runbox.action.disconnect.title":"Disconnect","runbox.action.menu.title":"More","runbox.alert.title":"You are connected to the student's currently running environment, and the total runtime usage time is being deducted. Please note that even if the student exits Runbox, time will continue to be deducted as long as tutoring continues.","runbox.common.close":"Close","runbox.common.retry":"Retry","runbox.common.score":"{score} points","runbox.common.support":"Support","runbox.common.connect":"Connect","runbox.context.command.ping.error":"An error occurred while processing task.","runbox.header.submitInfo":"{isIndividual, select, true {} other {Team}} submission count | {remainCount}/{totalCount} times left {isDailyLimitEnabled, select, true {today} other {}}","runbox.timer.title":"Remaining Time","runbox.timer.unlimited":"Unlimited","runbox.timer.tooltip.title":"View time information","runbox.timer.popover.title":"Runbox Usage Time Guide","runbox.timer.popover.description":"This is the total Runbox usage time for {user}.\nTime continues to decrease while connected. Disconnect or leave the course to stop the deduction.","runbox.timer.popover.quota.title":"Total Available Time","runbox.timer.popover.quota_per_session.title":"Time Available for This Connection","runbox.timer.popover.quota_per_session.description":"Each connection can last up to {time}. If total available time remains, you can reconnect and continue practicing.","runbox.timer.popover.quota.disconnect":"Disconnect","runbox.timer.popover.do_not_open":"Don't show this popup when starting a session","runbox.timer.almost_end.dialog.quota.title":"{time} of total available time remaining.","runbox.timer.almost_end.dialog.quota.description":"When the total available time runs out, the practice session ends and you cannot reconnect.\nPlease save your work before it ends. Unsaved work may be lost.","runbox.timer.almost_end.dialog.quota_per_session.title":"{time} remaining in this connection.","runbox.timer.almost_end.dialog.quota_per_session.description":"When the connection time runs out, you will be disconnected. If total available time remains, you can reconnect and continue practicing.\nPlease save your work before it ends. Saved files are kept when you reconnect, but unsaved work may be lost.","runbox.timer.almost_end.dialog.confirm":"Continue","runbox.runtime.message.lxp_plan_required":"Your institution currently does not support Runbox course materials.\nPlease contact your institution administrator for more details.","runbox.runtime.message.runbox_unavailable":"Runbox Unavailable","runbox.runtime.message.startError":"There was an error starting the runbox.","runbox.runtime.overlay.terminated.description.default":"To continue your Runbox practice session, please click the Connect button.","runbox.runtime.overlay.terminated.description.os_disk_is_full":"Storage has been completely used up.\nReset the practice environment and start again.","runbox.runtime.overlay.terminated.description.quota_exceeded":"The runtime has been terminated because the usage time has expired.","runbox.runtime.overlay.terminated.description.quota_per_session_exceeded":"The runtime has been terminated because the per-session usage time has expired.\nTo reconnect to Runbox, please click the button below.","runbox.runtime.overlay.terminated.title":"Runtime disconnected","runbox.runtime.overlay.terminated.connect":"Connect","runbox.runtime.overlay.terminated.unlimited":"Unlimited","runbox.runtime.overlay.terminated.contact":"Contact Customer Service","runbox.runtime.overlay.terminated.quota.total":"Total Available Time","runbox.runtime.overlay.terminated.quota.used":"Total Time Used","runbox.runtime.overlay.terminated.disk.total":"Total Disk","runbox.runtime.overlay.terminated.disk.used":"Total Disk Used","runbox.runtime.overlay.conflicted.description":"Connecting to this Runbox exercise will terminate the Runbox in another course material.\nPlease save any unsaved work first.","runbox.runtime.overlay.conflicted.title":"A Runbox is currently connected to another course material","runbox.runtime.dialog.change_material.title":"Notice of Runbox Connection Change","runbox.runtime.dialog.change_material.description":"Connecting to this Runbox exercise will terminate the Runbox in another course material. Do you want to continue?","runbox.status.button.title":"Connection & resources","runbox.status.network":"Network status","runbox.status.resource.preparing":"Preparing","runbox.status.runtime.connected":"Runtime connected","runbox.status.runtime.connecting":"Runtime connecting","runbox.status.runtime.disconnected":"Runtime disconnected","runbox.disk.usage.dialog.title":"Storage almost full","runbox.disk.usage.dialog.description.warning":"You have used more than 80% of your storage. ({used} / {total})\nIf storage runs out, your practice session may be interrupted. Please clean up files you no longer need.","runbox.disk.usage.dialog.description.error":"You have used more than 90% of your storage. ({used} / {total})\nDelete files you no longer need, or reset the practice environment to free up space.","runbox.disk.usage.dialog.actions.close":"Close","runbox.disk.usage.alert.warning":"You have used more than 80% of your storage. ({used} / {total}) If storage runs out, your practice session may be interrupted. Please clean up files you no longer need.","runbox.disk.usage.alert.error":"You have used more than 90% of your storage. ({used} / {total}) If storage runs out, your practice session may be interrupted. Clean up files you no longer need, or reset the practice environment.","runbox.disk.env_reset.title":"Reset practice environment","runbox.disk.env_reset.dialog.title":"Reset practice environment","runbox.disk.env_reset.dialog.description":"To free up storage, the runbox is reset to the state it was in when first started. Files you created or saved during practice are all deleted and cannot be recovered.","runbox.disk.env_reset.dialog.acknowledge":"I understand that saved files cannot be recovered after the reset.","runbox.disk.env_reset.dialog.actions.cancel":"Cancel","runbox.disk.env_reset.dialog.actions.confirm":"Delete","runbox.disk.env_reset.noti.success":"The practice environment has been reset. Restarting it now.","runbox.disk.env_reset.noti.error":"An error occurred while resetting the practice environment.","runbox.disk.env_reset.noti.no_runtime":"There is no practice environment to reset. Start the runbox and try again.","runbox.runtime.overlay.terminated.title.os_disk_is_full":"Storage is full and\nthe practice session cannot proceed.","runbox.runtime.loading.title":"Preparing your practice computer","runbox.runtime.loading.description":"Your practice runs in a cloud environment, not on your own computer. We are setting up the environment for you. Please wait a moment.","runbox.runtime.loading.illustration_alt":"Loading animation of a runbox being assembled","runbox.runtime.loading.step.prepare":"Preparing practice computer","runbox.runtime.loading.step.prepare_progress":"Preparing your practice computer ({current} / {total})","runbox.runtime.loading.step.connect":"Connecting to practice computer","runbox.runtime.loading.step.connect_progress":"Connecting to your practice computer ({current} / {total})","runbox.runtime.loading.step.material":"Preparing practice materials","runbox.runtime.loading.step.material_progress":"Preparing practice materials ({current} / {total})","runbox.runtime.loading.step.status.completed":"Done","runbox.runtime.loading.step.status.active":"In progress","runbox.runtime.loading.step.status.pending":"Waiting","runbox.runtime.loading.note.environment.title":"This runbox is separate from your computer","runbox.runtime.loading.note.environment.description":"You are connecting to a practice environment provided by Elice. Code and programs run inside the runbox.","runbox.runtime.loading.note.save.title":"Your files are saved in the runbox","runbox.runtime.loading.note.save.description":"Saved files persist across sessions. They are stored separately from your computer, so be sure to save your work.","runbox.runtime.loading.tip.common.conflict.title":"Opening another material stops this runbox","runbox.runtime.loading.tip.common.conflict.description":"Save anything you are working on before you leave.","runbox.runtime.loading.tip.common.disk.title":"Storage has a limit too","runbox.runtime.loading.tip.common.disk.description":"Practice can stop once large files pile up.","runbox.runtime.loading.tip.common.quota.title":"Practice time is limited","runbox.runtime.loading.tip.common.quota.description":"The runbox disconnects once the time is up.","runbox.runtime.loading.tip.jupyter.cell_order.title":"Run cells from top to bottom","runbox.runtime.loading.tip.jupyter.cell_order.description":"Skipping one leaves its variables undefined, so the next cell fails.","runbox.runtime.loading.tip.jupyter.run_cell.title":"Run a cell with Shift + Enter","runbox.runtime.loading.tip.jupyter.run_cell.description":"Use Ctrl + Enter to run it and stay where you are.","runbox.runtime.loading.tip.jupyter.restart_kernel.title":"Restart the kernel when results stop making sense","runbox.runtime.loading.tip.jupyter.restart_kernel.description":"Values from earlier runs are usually what is confusing you.","runbox.runtime.loading.tip.jupyter.cell_number.title":"The number beside a cell is its run order","runbox.runtime.loading.tip.jupyter.cell_number.description":"It tells you the order the cells actually ran in.","runbox.runtime.loading.tip.vscode.save_before_run.title":"Save the file before you run it","runbox.runtime.loading.tip.vscode.save_before_run.description":"Unsaved edits do not reach what you run.","runbox.runtime.loading.tip.vscode.terminal.title":"You can open the terminal from the top menu","runbox.runtime.loading.tip.vscode.terminal.description":"It usually appears at the bottom of the screen.","runbox.runtime.loading.tip.vscode.browser_shortcut.title":"This is VS Code running in your browser","runbox.runtime.loading.tip.vscode.browser_shortcut.description":"Some shortcuts may clash with your browser's own.","runbox.runtime.loading.tip.vscode.explorer.title":"Your practice files are in the left explorer","runbox.runtime.loading.tip.vscode.explorer.description":"Expand a folder to open a file.","runbox.runtime.loading.tip.gui.desktop.title":"There is another computer inside the screen","runbox.runtime.loading.tip.gui.desktop.description":"Windows open and close just like they do on your own machine.","runbox.runtime.loading.tip.gui.clipboard.title":"Copy and paste may work differently","runbox.runtime.loading.tip.gui.clipboard.description":"What you copied on your own machine may not paste straight in.","runbox.runtime.loading.tip.gui.move_window.title":"Drag the title bar if a window goes off screen","runbox.runtime.loading.tip.gui.move_window.description":"Reloading the page can lose work in progress.","runbox.runtime.loading.tip.gui.slow_start.title":"Programs can take a while to open","runbox.runtime.loading.tip.gui.slow_start.description":"Give it a moment even if the screen looks empty.","runbox.runtime.loading.tip.orange.widget.title":"You analyse with widgets, not code","runbox.runtime.loading.tip.orange.widget.description":"Drag a widget from the left list onto the canvas.","runbox.runtime.loading.tip.orange.connect.title":"Connect widgets with a line to pass data along","runbox.runtime.loading.tip.orange.connect.description":"One widget's output becomes the next one's input.","runbox.runtime.loading.tip.orange.load_data.title":"Start with the widget that loads data","runbox.runtime.loading.tip.orange.load_data.description":"Nothing downstream runs until the data is open.","runbox.runtime.loading.tip.orange.open_settings.title":"Double-click a widget to open its settings","runbox.runtime.loading.tip.orange.open_settings.description":"Results open the same way.","runbox.runtime.loading.tip.app.web_service.title":"This is a web service running inside the runbox","runbox.runtime.loading.tip.app.web_service.description":"You configure and run it right in the screen.","runbox.runtime.loading.tip.app.slow_start.title":"The first screen can take a while to open","runbox.runtime.loading.tip.app.slow_start.description":"Give the service a moment to get ready.","runbox.runtime.loading.tip.app.persisted.title":"What you build is saved in the runbox","runbox.runtime.loading.tip.app.persisted.description":"Reconnect later and pick up where you left off."};
1
+ var messageEn = {"common.cancel":"Cancel","material.tutoring.runbox_confirm_dialog.action.confirm":"Proceed","material.tutoring.runbox_confirm_dialog.content":"The Runbox environment is currently running for the {_termCourseRoleStudent}. If you connect, the remaining total runtime usage time will decrease. Do you want to proceed?","material.tutoring.runbox_confirm_dialog.title":"Running Runbox","runbox.action.autoShutdown.title":"Always on","runbox.action.autoShutdown.tooltip":"This feature is not available for this session, as it's set to automatically shut down upon departure.","runbox.action.grade.dialog.description.error":"There is a problem with the code or submission file.\nPlease check the error message below and verify that the submission format meets the requirements. Then, submit again.","runbox.action.grade.dialog.description.success":"Grading completed successfully.","runbox.action.grade.dialog.title":"Grading result","runbox.action.grade.noti.error":"An error occurred while grading the code.","runbox.action.grade.title":"Submit","runbox.action.grade.tooltip.onProgress":"Grading is in progress. Please wait for a moment. Depending on the {_termLibraryLecturePage}, grading may take up to 3 minutes.","runbox.action.reset.dialog.actions.confirm":"Reset","runbox.action.reset.dialog.isolated.description":"Are you sure you want to reset the runbox code? Your codes will be overwritten to default code of {_termLibraryLecturePage}.\nAfter reset, the runbox session will be refreshed.","runbox.action.reset.dialog.shared.description":"Do you want to reset the Runbox code? If you reset, the code written by team members will also be overwritten with the default code. The Runbox session will be refreshed after resetting.","runbox.action.reset.noti.error":"An error occurred while initializing the runbox code.","runbox.action.reset.title":"Reset code","runbox.action.restart.dialog.actions.confirm":"Restart","runbox.action.restart.dialog.isolated.description":"Are you sure you want to restart the runbox?","runbox.action.restart.dialog.shared.description":"The Runbox will also restart on your teammates' screens. Do you want to restart the Runbox?","runbox.action.restart.title":"Restart runbox","runbox.action.share.snackbar.copied.fail":"Copying the runbox URL failed, please try again","runbox.action.share.snackbar.copied.success":"The runbox URL was copied successfully.","runbox.action.share.title":"Share runbox URL","runbox.action.submitCountInfo.dialog.description":"You have exceeded the submission count limit","runbox.action.submitCountInfo.dialog.title":"Limit the number of submissions","runbox.action.submitCountInfo.tooltip.disabled":"The submission count has been used up","runbox.action.submitLog.dialog.download.tooltip":"Download submitted file","runbox.action.submitLog.dialog.title":"Submission History","runbox.action.submitLog.empty":"No submission history exists.","runbox.action.submitLog.title":"Runbox Submission History","runbox.action.disconnect.dialog.title":"Disconnect Runbox","runbox.action.disconnect.dialog.description":"You are currently in a practice session. Do you want to disconnect Runbox?\nIf you have any unsaved work, please save it first.","runbox.action.disconnect.dialog.disconnect":"Disconnect","runbox.action.disconnect.title":"Disconnect","runbox.action.menu.title":"More","runbox.alert.title":"You are connected to the student's currently running environment, and the total runtime usage time is being deducted. Please note that even if the student exits Runbox, time will continue to be deducted as long as tutoring continues.","runbox.common.close":"Close","runbox.common.retry":"Retry","runbox.common.score":"{score} points","runbox.common.support":"Support","runbox.common.connect":"Connect","runbox.context.command.ping.error":"An error occurred while processing task.","runbox.header.submitInfo":"{isIndividual, select, true {} other {Team}} submission count | {remainCount}/{totalCount} times left {isDailyLimitEnabled, select, true {today} other {}}","runbox.timer.title":"Remaining Time","runbox.timer.unlimited":"Unlimited","runbox.timer.tooltip.title":"View time information","runbox.timer.popover.title":"Runbox Usage Time Guide","runbox.timer.popover.description":"This is the total Runbox usage time for {user}.\nTime continues to decrease while connected. Disconnect or leave the course to stop the deduction.","runbox.timer.popover.quota.title":"Total Available Time","runbox.timer.popover.quota_per_session.title":"Time Available for This Connection","runbox.timer.popover.quota_per_session.description":"Each connection can last up to {time}. If total available time remains, you can reconnect and continue practicing.","runbox.timer.popover.quota.disconnect":"Disconnect","runbox.timer.popover.do_not_open":"Don't show this popup when starting a session","runbox.timer.almost_end.dialog.quota.title":"{time} of total available time remaining.","runbox.timer.almost_end.dialog.quota.description":"When the total available time runs out, the practice session ends and you cannot reconnect.\nPlease save your work before it ends. Unsaved work may be lost.","runbox.timer.almost_end.dialog.quota_per_session.title":"{time} remaining in this connection.","runbox.timer.almost_end.dialog.quota_per_session.description":"When the connection time runs out, you will be disconnected. If total available time remains, you can reconnect and continue practicing.\nPlease save your work before it ends. Saved files are kept when you reconnect, but unsaved work may be lost.","runbox.timer.almost_end.dialog.confirm":"Continue","runbox.runtime.message.startError":"There was an error starting the runbox.","runbox.runtime.overlay.terminated.description.default":"To continue your Runbox practice session, please click the Connect button.","runbox.runtime.overlay.terminated.description.os_disk_is_full":"Storage has been completely used up.\nReset the practice environment and start again.","runbox.runtime.overlay.terminated.description.quota_exceeded":"The runtime has been terminated because the usage time has expired.","runbox.runtime.overlay.terminated.description.quota_per_session_exceeded":"The runtime has been terminated because the per-session usage time has expired.\nTo reconnect to Runbox, please click the button below.","runbox.runtime.overlay.terminated.title":"Runtime disconnected","runbox.runtime.overlay.terminated.connect":"Connect","runbox.runtime.overlay.terminated.unlimited":"Unlimited","runbox.runtime.overlay.terminated.contact":"Contact Customer Service","runbox.runtime.overlay.terminated.quota.total":"Total Available Time","runbox.runtime.overlay.terminated.quota.used":"Total Time Used","runbox.runtime.overlay.terminated.disk.total":"Total Disk","runbox.runtime.overlay.terminated.disk.used":"Total Disk Used","runbox.runtime.overlay.conflicted.description":"Connecting to this Runbox exercise will terminate the Runbox in another course material.\nPlease save any unsaved work first.","runbox.runtime.overlay.conflicted.title":"A Runbox is currently connected to another course material","runbox.runtime.dialog.change_material.title":"Notice of Runbox Connection Change","runbox.runtime.dialog.change_material.description":"Connecting to this Runbox exercise will terminate the Runbox in another course material. Do you want to continue?","runbox.status.button.title":"Connection & resources","runbox.status.network":"Network status","runbox.status.resource.preparing":"Preparing","runbox.status.runtime.connected":"Runtime connected","runbox.status.runtime.connecting":"Runtime connecting","runbox.status.runtime.disconnected":"Runtime disconnected","runbox.disk.usage.dialog.title":"Storage almost full","runbox.disk.usage.dialog.description.warning":"You have used more than 80% of your storage. ({used} / {total})\nIf storage runs out, your practice session may be interrupted. Please clean up files you no longer need.","runbox.disk.usage.dialog.description.error":"You have used more than 90% of your storage. ({used} / {total})\nDelete files you no longer need, or reset the practice environment to free up space.","runbox.disk.usage.dialog.actions.close":"Close","runbox.disk.usage.alert.warning":"You have used more than 80% of your storage. ({used} / {total}) If storage runs out, your practice session may be interrupted. Please clean up files you no longer need.","runbox.disk.usage.alert.error":"You have used more than 90% of your storage. ({used} / {total}) If storage runs out, your practice session may be interrupted. Clean up files you no longer need, or reset the practice environment.","runbox.disk.env_reset.title":"Reset practice environment","runbox.disk.env_reset.dialog.title":"Reset practice environment","runbox.disk.env_reset.dialog.description":"To free up storage, the runbox is reset to the state it was in when first started. Files you created or saved during practice are all deleted and cannot be recovered.","runbox.disk.env_reset.dialog.acknowledge":"I understand that saved files cannot be recovered after the reset.","runbox.disk.env_reset.dialog.actions.cancel":"Cancel","runbox.disk.env_reset.dialog.actions.confirm":"Delete","runbox.disk.env_reset.noti.success":"The practice environment has been reset. Restarting it now.","runbox.disk.env_reset.noti.error":"An error occurred while resetting the practice environment.","runbox.disk.env_reset.noti.no_runtime":"There is no practice environment to reset. Start the runbox and try again.","runbox.runtime.overlay.terminated.title.os_disk_is_full":"Storage is full and\nthe practice session cannot proceed.","runbox.runtime.loading.title":"Preparing your practice computer","runbox.runtime.loading.description":"Your practice runs in a cloud environment, not on your own computer. We are setting up the environment for you. Please wait a moment.","runbox.runtime.loading.illustration_alt":"Loading animation of a runbox being assembled","runbox.runtime.loading.step.prepare":"Preparing practice computer","runbox.runtime.loading.step.prepare_progress":"Preparing your practice computer ({current} / {total})","runbox.runtime.loading.step.connect":"Connecting to practice computer","runbox.runtime.loading.step.connect_progress":"Connecting to your practice computer ({current} / {total})","runbox.runtime.loading.step.material":"Preparing practice materials","runbox.runtime.loading.step.material_progress":"Preparing practice materials ({current} / {total})","runbox.runtime.loading.step.status.completed":"Done","runbox.runtime.loading.step.status.active":"In progress","runbox.runtime.loading.step.status.pending":"Waiting","runbox.runtime.loading.note.environment.title":"This runbox is separate from your computer","runbox.runtime.loading.note.environment.description":"You are connecting to a practice environment provided by Elice. Code and programs run inside the runbox.","runbox.runtime.loading.note.save.title":"Your files are saved in the runbox","runbox.runtime.loading.note.save.description":"Saved files persist across sessions. They are stored separately from your computer, so be sure to save your work.","runbox.runtime.loading.tip.common.conflict.title":"Opening another material stops this runbox","runbox.runtime.loading.tip.common.conflict.description":"Save anything you are working on before you leave.","runbox.runtime.loading.tip.common.disk.title":"Storage has a limit too","runbox.runtime.loading.tip.common.disk.description":"Practice can stop once large files pile up.","runbox.runtime.loading.tip.common.quota.title":"Practice time is limited","runbox.runtime.loading.tip.common.quota.description":"The runbox disconnects once the time is up.","runbox.runtime.loading.tip.jupyter.cell_order.title":"Run cells from top to bottom","runbox.runtime.loading.tip.jupyter.cell_order.description":"Skipping one leaves its variables undefined, so the next cell fails.","runbox.runtime.loading.tip.jupyter.run_cell.title":"Run a cell with Shift + Enter","runbox.runtime.loading.tip.jupyter.run_cell.description":"Use Ctrl + Enter to run it and stay where you are.","runbox.runtime.loading.tip.jupyter.restart_kernel.title":"Restart the kernel when results stop making sense","runbox.runtime.loading.tip.jupyter.restart_kernel.description":"Values from earlier runs are usually what is confusing you.","runbox.runtime.loading.tip.jupyter.cell_number.title":"The number beside a cell is its run order","runbox.runtime.loading.tip.jupyter.cell_number.description":"It tells you the order the cells actually ran in.","runbox.runtime.loading.tip.vscode.save_before_run.title":"Save the file before you run it","runbox.runtime.loading.tip.vscode.save_before_run.description":"Unsaved edits do not reach what you run.","runbox.runtime.loading.tip.vscode.terminal.title":"You can open the terminal from the top menu","runbox.runtime.loading.tip.vscode.terminal.description":"It usually appears at the bottom of the screen.","runbox.runtime.loading.tip.vscode.browser_shortcut.title":"This is VS Code running in your browser","runbox.runtime.loading.tip.vscode.browser_shortcut.description":"Some shortcuts may clash with your browser's own.","runbox.runtime.loading.tip.vscode.explorer.title":"Your practice files are in the left explorer","runbox.runtime.loading.tip.vscode.explorer.description":"Expand a folder to open a file.","runbox.runtime.loading.tip.gui.desktop.title":"There is another computer inside the screen","runbox.runtime.loading.tip.gui.desktop.description":"Windows open and close just like they do on your own machine.","runbox.runtime.loading.tip.gui.clipboard.title":"Copy and paste may work differently","runbox.runtime.loading.tip.gui.clipboard.description":"What you copied on your own machine may not paste straight in.","runbox.runtime.loading.tip.gui.move_window.title":"Drag the title bar if a window goes off screen","runbox.runtime.loading.tip.gui.move_window.description":"Reloading the page can lose work in progress.","runbox.runtime.loading.tip.gui.slow_start.title":"Programs can take a while to open","runbox.runtime.loading.tip.gui.slow_start.description":"Give it a moment even if the screen looks empty.","runbox.runtime.loading.tip.orange.widget.title":"You analyse with widgets, not code","runbox.runtime.loading.tip.orange.widget.description":"Drag a widget from the left list onto the canvas.","runbox.runtime.loading.tip.orange.connect.title":"Connect widgets with a line to pass data along","runbox.runtime.loading.tip.orange.connect.description":"One widget's output becomes the next one's input.","runbox.runtime.loading.tip.orange.load_data.title":"Start with the widget that loads data","runbox.runtime.loading.tip.orange.load_data.description":"Nothing downstream runs until the data is open.","runbox.runtime.loading.tip.orange.open_settings.title":"Double-click a widget to open its settings","runbox.runtime.loading.tip.orange.open_settings.description":"Results open the same way.","runbox.runtime.loading.tip.app.web_service.title":"This is a web service running inside the runbox","runbox.runtime.loading.tip.app.web_service.description":"You configure and run it right in the screen.","runbox.runtime.loading.tip.app.slow_start.title":"The first screen can take a while to open","runbox.runtime.loading.tip.app.slow_start.description":"Give the service a moment to get ready.","runbox.runtime.loading.tip.app.persisted.title":"What you build is saved in the runbox","runbox.runtime.loading.tip.app.persisted.description":"Reconnect later and pick up where you left off.","runbox.alert.credit.exhausted":"All AI practice credits have been used. You can no longer continue AI practice. Save the code you are writing within {minutes, plural, one {# minute} other {# minutes}}. Unsaved work may be lost.","runbox.alert.credit.low":"AI practice credits are running low. AI practice will stop when all credits are used. Your code is not auto-saved, so please save your work in advance.","runbox.runtime.overlay.terminated.title.insufficient_credit":"Cannot start AI practice","runbox.runtime.overlay.terminated.description.insufficient_credit":"All AI practice credits have been used. Please contact your organization administrator."};
2
2
 
3
3
  export { messageEn as default };