Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
ed983b9
Changed Github Repository menu text to Mr. Dole's Very Cool Github Re…
todddole Feb 10, 2026
dd4f3c7
Text Change
todddole Feb 10, 2026
7fe7f33
Commented out Github repo, HTTP documentation, Embed guide menu items
NicoleTravers Feb 16, 2026
e911a20
Disables AI Assistant
NicoleTravers Feb 16, 2026
4d72639
Disables AI Assistant across configurations
NicoleTravers Feb 16, 2026
5a47558
Merge pull request #2 from HSU-Senior-Project-2026/tdole-ticket576-ch…
todddole Feb 17, 2026
9bfaf2c
Merge branch 'practice-sprint' into ticket/remove-menu-items
todddole Feb 17, 2026
e91b47c
test file
diDi78-9 Feb 17, 2026
a4cf65d
Deleted test.txt file
diDi78-9 Feb 17, 2026
6eea157
Merge pull request #16 from HSU-Senior-Project-2026/ticket/remove-ai-…
NicoleTravers Feb 23, 2026
704c726
created different compile and runtime tabs and implemented compile+ru…
NicoleTravers Feb 24, 2026
58c491a
clear button added to clear input, compile, output tabs
NicoleTravers Feb 24, 2026
9ee54df
Default Monaco editor to Java; prevent loadSelectedLanguage crash bef…
NicoleTravers Feb 24, 2026
d301164
Merge pull request #17 from HSU-Senior-Project-2026/ticket/console-ou…
JDurance1701 Feb 24, 2026
aa8b2de
removed AI Inline completion(removed auto-complete)
NicoleTravers Feb 24, 2026
52d16d1
removed auto-indenting, autocomplete for brackets
NicoleTravers Feb 24, 2026
5a6f9c5
disabled autocomplete + intelliSense
NicoleTravers Feb 24, 2026
e8e2259
Merge pull request #18 from HSU-Senior-Project-2026/ticket/java-edito…
NicoleTravers Feb 26, 2026
cd2b944
saves on ctrl+s and shows dot to signify changes have been made(dot d…
NicoleTravers Mar 1, 2026
2395fc6
added 'auto-saving' functionality after 5 seconds of the user not typing
NicoleTravers Mar 1, 2026
bb50337
compile button
HHoward-mcm Mar 2, 2026
bc79ffb
add compile button
HHoward-mcm Mar 2, 2026
29bf566
Fixed bugs with compile button, now depends on whether run button is …
JDurance1701 Mar 3, 2026
8d3544c
Fixed url reference
JDurance1701 Mar 3, 2026
1ddc492
Made button spacing better, removed compiler options
JDurance1701 Mar 4, 2026
31e473d
Merge pull request #22 from HSU-Senior-Project-2026/ticket/automatic-…
NicoleTravers Mar 5, 2026
305b747
Merge pull request #23 from HSU-Senior-Project-2026/feature/compile-b…
NicoleTravers Mar 5, 2026
e982c42
responseive UI
HHoward-mcm Mar 5, 2026
17e2116
added buttons for CSCI sign in
diDi78-9 Mar 6, 2026
8270c93
added sign in modal
diDi78-9 Mar 7, 2026
f7a7057
script for signing into csci server controls
diDi78-9 Mar 7, 2026
f08df60
Don't remember what this changes, but probably something important
JDurance1701 Mar 7, 2026
81b87fc
bridge for ssh tunneling connectivity. Need to create automatiuon seq…
diDi78-9 Mar 7, 2026
05f4615
Fixed form error, commented out section that wasn't needed
JDurance1701 Mar 7, 2026
0fd58bf
created sign in/out functions for IDE buttons
diDi78-9 Mar 7, 2026
753ceba
created api points for sign in and sign out. will add automation for …
diDi78-9 Mar 7, 2026
f372b76
provided changes to ide.js. Removed original ssh-server.js file. Repl…
diDi78-9 Mar 7, 2026
2b28cd5
reordered run + compile buttons, enabled functionality
NicoleTravers Mar 8, 2026
8904943
switches to compile tab upon compilation
NicoleTravers Mar 8, 2026
6a23905
Merge pull request #24 from HSU-Senior-Project-2026/feature/responsive
NicoleTravers Mar 8, 2026
841a7eb
generated api key. must add to judge0.conf for Authn_token and author…
diDi78-9 Mar 17, 2026
2eb8407
fixed modal issue where password and user for sign in listed in URL
diDi78-9 Mar 17, 2026
5413429
Merge pull request #33 from HSU-Senior-Project-2026/feature/compile-b…
NicoleTravers Mar 17, 2026
f80bfb6
Merge pull request #34 from HSU-Senior-Project-2026/MVP-Sprint
JDurance1701 Mar 17, 2026
90aad52
fixed host name and port number
diDi78-9 Mar 17, 2026
d6dc581
Fix three bugs: unclosed CSCI modal div, undefined reportTitle variab…
JDurance1701 Mar 20, 2026
bea0dc8
Phase 1: point API URLs at backend VM, fix default source, fix saveAc…
JDurance1701 Mar 20, 2026
5290800
Switch ssh-bridge from HTTPS to HTTP, move to port 3000
JDurance1701 Mar 20, 2026
10776d4
Improve CSCI sign-in UX: username field, no email popups, toast notif…
JDurance1701 Mar 20, 2026
ff1ec0c
Fix CSCI sign-in form submitting to /login instead of calling JavaScript
JDurance1701 Mar 20, 2026
b36ead6
Update API URLs to local VM IP for local testing
JDurance1701 Mar 20, 2026
818a6f7
Merge pull request #42 from HSU-Senior-Project-2026/ticket/remove-men…
NicoleTravers Mar 22, 2026
c79d16c
Set Judge0 API URLs to AWS server IP for deployment
JDurance1701 Mar 24, 2026
9a61fc9
Switch ssh-bridge from port 3000 to port 80
JDurance1701 Mar 24, 2026
8e29f1a
Proxy Judge0 API through ssh-bridge, move auth to server
JDurance1701 Mar 25, 2026
870c7ed
Merge branch 'PVP-Sprint' into ticket/authentication_ui
NicoleTravers Mar 26, 2026
fe4b846
Merge pull request #49 from HSU-Senior-Project-2026/ticket/authentica…
NicoleTravers Mar 26, 2026
2188e10
file ui ticket work in progress
Apr 2, 2026
b2adb6c
restore context menu and individual file tracking
Apr 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
node_modules/
**/node_modules/

39 changes: 39 additions & 0 deletions css/ide.css
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
html, body {
margin: 0;
padding: 0;
height: 100%;
}

.judge0-file-menu {
min-width: 15rem !important;
}
Expand All @@ -16,10 +22,22 @@
#judge0-chat-messages {
flex-grow: 1;
overflow-y: auto;
padding: 0.5rem;
}

#judge0-chat-messages pre {
overflow-x: auto;
max-width: 100%;
}

.item.judge0-showRunButton{
display:flex;
gap:10px;
}

.item.judge0-showRunButton{
display:flex;
gap:10px;
}

.judge0-user-message {
Expand Down Expand Up @@ -48,3 +66,24 @@
display: none !important;
}
}

@media (max-width: 600px) {
.judge0-file-menu {
min-width: 12rem !important;
}

.item.judge0-showRunButton {
flex-direction: column;
gap: 5px;
}

.judge0-user-message {
max-width: 95%;
margin-right: 0.5em !important;
}

#judge0-chat-messages {
padding: 0.25rem;
}
}

95 changes: 77 additions & 18 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -38,15 +38,17 @@
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.5.0/semantic.min.css" integrity="sha512-KXol4x3sVoO+8ZsWPFI/r5KBVB/ssCGB5tsv2nVOKwLg33wTFP3fmnXa47FdSVIshVTgsYk/1734xSk9aFIa4A==" crossorigin="anonymous" referrerpolicy="no-referrer">
<script src="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.5.0/semantic.min.js" integrity="sha512-Xo0Jh8MsOn72LGV8kU5LsclG7SUzJsWGhXbWcYs2MAmChkQzwiW/yTQwdJ8w6UA9C6EVG18GHb/TrYpYCjyAQw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>

<script type="module" src="js/ai.js"></script>
<script type="module" src="js/configuration.js"></script>
<script type="module" src="js/electron.js"></script>
<script type="module" src="js/ide.js"></script>
<script type="module" src="js/local_storage.js"></script>
<script type="module" src="js/puter.js"></script>
<script type="module" src="js/query.js"></script>
<script type="module" src="js/style.js"></script>
<script type="module" src="js/theme.js"></script>
<script type="module" src="js/ai.js?v=105"></script>
<script type="module" src="js/configuration.js?v=105"></script>
<script type="module" src="js/electron.js?v=105"></script>
<script type="module" src="js/ide.js?v=105"></script>
<script type="module" src="js/local_storage.js?v=105"></script>
<script type="module" src="js/puter.js?v=105"></script>
<script type="module" src="js/query.js?v=105"></script>
<script type="module" src="js/style.js?v=105"></script>
<script type="module" src="js/theme.js?v=105"></script>
<!--CSCI SERVER-->
<script type="module" src="js/csci.js?v=105"></script>

<link type="text/css" rel="stylesheet" href="css/ide.css">
<link type="text/css" rel="stylesheet" href="css/semantic.css">
Expand Down Expand Up @@ -95,6 +97,9 @@
<a id="judge0-header" href="https://judge0.com" target="_blank" class="header item judge0-showLogo">
<img id="judge0-logo" src="./images/icon_var2_rounded_512.png">
</a>
<div id="judge0-explorer-toggle-btn" class="icon link item" title="Toggle Explorer" onclick="toggleFileExplorer()" style="font-size:1.1em;">
<i class="bars icon"></i>
</div>
<div class="ui simple dropdown item judge0-showFileMenu">
<span class="text">File</span>
<i class="dropdown icon"></i>
Expand All @@ -104,63 +109,115 @@
<span class="text"><i class="file icon"></i>Open File...</span>
<input type="file" id="open-file-input" style="display: none;">
</div>
<div id="judge0-open-dir-btn" class="item">
<span class="description"></span>
<span class="text"><i class="folder open icon"></i>Open Directory...</span>
</div>
<div id="judge0-save-btn" class="item">
<span class="description">+S</span>
<span class="text"><i class="save icon"></i>Save</span>
</div>
<div id="judge0-save-local-btn" class="item">
<span class="description"></span>
<span class="text"><i class="download icon"></i>Save to Local PC</span>
</div>
</div>
</div>
<div class="ui simple dropdown item judge0-showHelpMenu">
<span class="text">Help</span>
<i class="dropdown icon"></i>
<div class="menu judge0-file-menu">
<a href="https://github.com/judge0/ide" class="link text item" target="_blank"><i class="external square alternate icon"></i>GitHub Repository</a>
<!-- <a href="https://github.com/judge0/ide" class="link text item" target="_blank"><i class="external square alternate icon"></i>GitHub Repository</a>
<a href="/embed" class="link text item" target="_blank"><i class="external square alternate icon"></i>Embed Guide</a>
<a href="https://platform.sulu.sh/apis/judge0" class="link text item" target="_blank"><i class="external square alternate icon"></i>HTTP API Documentation</a>
<a href="https://platform.sulu.sh/apis/judge0" class="link text item" target="_blank"><i class="external square alternate icon"></i>HTTP API Documentation</a> -->
<a href="PRIVACY.md" class="link text item" target="_blank"><i class="external square alternate icon"></i>Privacy Policy</a>
<a href="TERMS.md" class="link text item" target="_blank"><i class="external square alternate icon"></i>Terms of Service</a>
</div>
</div>
<div class="item judge0-showSelectLanguage">
<select id="select-language" class="ui search selection dropdown"></select>
</div>
<div class="item judge0-showCompilerOptions">
<!--<div class="item judge0-showCompilerOptions">
<div class="ui left icon transparent input">
<i class="flag icon"></i>
<input id="compiler-options" type="text" placeholder="Compiler options"></input>
</div>
</div>
</div> -->
<div class="item judge0-showCommandLineArguments">
<div class="ui left icon transparent input">
<i class="terminal icon"></i>
<input id="command-line-arguments" type="text" placeholder="Command line arguments"></input>
</div>
</div>
<div class="item judge0-showRunButton">
<button id="compile-btn" class="ui button">
Compile Code
</button>
<button id="run-btn" class="ui primary labeled icon button" data-content="+↵">
<i class="play icon"></i>
Run Code
</button>
<button id="clear-btn" class="ui primary labeled icon button" data-content="+↵" >
<i class="trash icon"></i>
Clear
</button>

</div>
<div class="right menu">
<div id="judge0-theme-toggle-btn" class="icon link item judge0-showThemeButton" data-content="">
<i id="judge0-theme-toggle-btn-icon" class="sun icon"></i>
</div>
<div class="item judge0-showPuterSignInOutButton">
<button id="judge0-sign-in-btn" class="ui basic button">
<!--SIGN IN AND OUT BUTTONS FOR CSCI (csci.js)-->
<div class ="item judge0-showCSCISignInOutButton">
<button id="judge0-csci-sign-in-btn" class="ui basic button">
<i class="sign-in icon"></i>
Sign in with CSCI
</button>
<button id="judge0-csci-sign-out-btn" class="ui basic button" data-content="Sign out">
<i class="sign-out icon"></i>
<span id="judge0-csci-username">Sign out</span>
</button>


</div>
<!--SIGN IN AND OUT BUTTONS FOR PUTER (puter.js)-->
<!-- <div class="item judge0-showPuterSignInOutButton">
<button id="judge0-sign-in-btn" class="ui basic button">
<i class="sign-in icon"></i>
Sign in with Puter
</button>
<button id="judge0-sign-out-btn" class="ui basic button" data-content="Sign out">
<i class="sign-out icon"></i>
<span id="judge0-puter-username">Sign out</span>
</button>
</div>
</button>
</div>-->
</div>
</div>

<div id="judge0-site-content"></div>

<!--Sign in Modal for CSCI-->
<div id="judge0-csci-sign-in-modal" class="ui modal" autocomplete="off">
<div class="header">
Sign in with CSCI
</div>
<div class="content">
<form id="judge0-csci-sign-in-form" class="ui form">
<div class="field">
<label>Username</label>
<input type="text" id="modal_username" name="modal_username" placeholder="Username" required autocomplete="off" autocapitalize="off" autocorrect="off" spellcheck="false">
</div>
<div class="field">
<label>Password</label>
<input type="password" id="modal_password" name="modal_password" placeholder="Password" required autocapitalize="off" autocorrect="off" spellcheck="false">
</div>
<button id="judge0-csci-modal-sign-in-btn" type="button" class="ui primary button">Sign In</button>
<button id="judge0-csci-modal-sign-in-cancel-btn" type="button" class="ui secondary button">Cancel</button>
</form>
</div>
</div>
<!--END Sign in Modal for CSCI-->

<div id="judge0-site-modal" class="ui modal">
<div class="header">
<span id="title"></span>
Expand Down Expand Up @@ -217,7 +274,7 @@
</button>
</form>
</div>
</div>
</div>

<div id="judge0-status-line" class="ui bottom right attached mini label judge0-showStatusLine"></div>

Expand All @@ -227,6 +284,8 @@
if ("serviceWorker" in navigator) {
navigator.serviceWorker.register("sw.js").then(() => console.log("Service Worker Registered"));
}


</script>
</body>
</html>
5 changes: 3 additions & 2 deletions js/ai.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
"use strict";
import theme from "./theme.js";
import configuration from "./configuration.js";
import { sourceEditor } from "./ide.js";
// sourceEditor is accessed via window.sourceEditor (set by ide.js) to avoid double-loading ide.js


const THREAD = [
{
Expand Down Expand Up @@ -69,7 +70,7 @@ document.addEventListener("DOMContentLoaded", function () {
role: "user",
content: `
User's code:
${sourceEditor.getValue()}
${window.sourceEditor ? window.sourceEditor.getValue() : "(editor not ready)"}

User's message:
${userInputValue}
Expand Down
8 changes: 4 additions & 4 deletions js/configuration.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ const DEFAULT_CONFIGURATIONS = {
showNavigation: true
},
appOptions: {
showAIAssistant: true,
showAIAssistant: false,
ioLayout: "stack",
assistantLayout: "column",
mainLayout: "row",
Expand Down Expand Up @@ -73,7 +73,7 @@ const DEFAULT_CONFIGURATIONS = {
showNavigation: true
},
appOptions: {
showAIAssistant: true,
showAIAssistant: false,
ioLayout: "stack",
assistantLayout: "column",
mainLayout: "row",
Expand All @@ -99,7 +99,7 @@ const DEFAULT_CONFIGURATIONS = {
showNavigation: true
},
appOptions: {
showAIAssistant: true,
showAIAssistant: false,
ioLayout: "stack",
assistantLayout: "column",
mainLayout: "row",
Expand All @@ -125,7 +125,7 @@ const DEFAULT_CONFIGURATIONS = {
showNavigation: true
},
appOptions: {
showAIAssistant: true,
showAIAssistant: false,
ioLayout: "stack",
assistantLayout: "column",
mainLayout: "row",
Expand Down
100 changes: 100 additions & 0 deletions js/csci.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@

//--------------------------------------------------

// Show a brief slide-in notification in the top-right corner
function showNotification(message, type) {
// type is "success", "error", or "warning" — maps to Semantic UI message colors
const colorClass = type === "success" ? "green" : type === "error" ? "red" : "yellow";

const note = document.createElement("div");
note.className = `ui ${colorClass} message`;
note.style.cssText = `
position: fixed;
top: 60px;
right: 20px;
z-index: 9999;
min-width: 250px;
max-width: 360px;
box-shadow: 0 2px 8px rgba(0,0,0,0.25);
transition: opacity 0.4s ease;
`;
note.innerText = message;
document.body.appendChild(note);

// Fade out and remove after 3 seconds
setTimeout(() => {
note.style.opacity = "0";
setTimeout(() => note.remove(), 400);
}, 3000);
}

async function showSignInModal() {
$('#judge0-csci-sign-in-modal')
.modal({ closable: false }).modal('show');
}

async function hideSignInModal() {
$('#judge0-csci-sign-in-modal').modal('hide');
}

async function signIn() {
const username = document.getElementById("modal_username").value;
const password = document.getElementById("modal_password").value;

try {
const response = await fetch("/ssh-sign-in", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ username, password })
});

const result = await response.json();
console.log("Server response:", result);

if (result.success) {
$('#judge0-csci-sign-in-modal').modal('hide');
showNotification(`Connected to CSCI server as ${username}`, "success");
} else {
showNotification("Login failed: " + result.error, "error");
}
} catch (err) {
console.error("Fetch error:", err);
showNotification("Error connecting to server. See console for details.", "error");
}
}

async function signOut() {
const usernameInput = document.getElementById("modal_username");
const passwordInput = document.getElementById("modal_password");

try {
const response = await fetch("/ssh-sign-out", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ action: "exit" })
});

if (!response.ok) {
throw new Error(`Server returned ${response.status}`);
}

const result = await response.json();
console.log("Server response:", result);

showNotification("Disconnected from CSCI server.", "warning");

} catch (err) {
console.error("Error signing out:", err);
showNotification("Error signing out. See console for details.", "error");
} finally {
if (usernameInput) usernameInput.value = "";
if (passwordInput) passwordInput.value = "";
}
}

document.addEventListener("DOMContentLoaded", function () {
document.getElementById("judge0-csci-sign-in-btn").addEventListener("click", showSignInModal);
document.getElementById("judge0-csci-modal-sign-in-btn").addEventListener("click", signIn);
document.getElementById("judge0-csci-modal-sign-in-cancel-btn").addEventListener("click", hideSignInModal);
document.getElementById("judge0-csci-sign-out-btn").addEventListener("click", signOut);
});
Loading