import Cookies from "js-cookie"; import { OutputCheckpoint, outputComparator } from "../analysis/checkpoints"; import { DEFAULT_EXERCISE, EXERCISE_SPECIFICATIONS, getExerciseSpecification, makeExerciseSpecification } from "../exercises"; import { Exercise, FileData, Project } from "../core/Project"; import { SimpleExerciseLobsterOutlet } from "../view/SimpleExerciseLobsterOutlet"; import { listenTo, Message, messageResponse, MessageResponses, stopListeningTo } from "../util/observe"; import { assert, Mutable } from "../util/util"; import { ICON_PERSON } from "./octicons"; import { getMyProjects, ProjectList, ProjectData, createUserProject, deleteProject, getCourseProjects, getFullProject, createCourseProject, editProject, saveProjectContents, FullProjectData, CreateProjectData, stringifyProjectContents, parseProjectContents, getPublicCourseProjects } from "./projects"; import { createSimpleExerciseOutlet as createSimpleExerciseOutletHTML } from "./simple_exercise_outlet"; import { USERS, Users, UserInfo as UserData } from "./user"; import axios from 'axios'; import { CourseData, getCourses as getPublicCourses } from "./courses"; import { ExerciseData, getFullExercise, saveExercise } from "./exercises"; import { getExtras } from "../analysis/extras"; import { SourceFile } from "../core/compilation/Program"; /** * Expects elements with these ids to be present: * - lobster-log-in-button * - lobster-my-projects */ export class LobsterApplication { public _act!: MessageResponses; public readonly myProjectsList: ProjectList; public readonly courseProjectsList: ProjectList; public readonly lobsterOutlet: SimpleExerciseLobsterOutlet; public readonly projectSaveOutlet: ProjectSaveOutlet; public readonly myProjects?: ProjectData[]; public readonly courseProjects?: ProjectData[]; public readonly activeProject: Project; public readonly activeProjectData?: FullProjectData; public readonly currentCourse?: CourseData; private currentCreateProjectList: ProjectList; private readonly logInButtonElem: JQuery; public constructor() { this.myProjectsList = new ProjectList($("#lobster-my-projects")); this.courseProjectsList = new ProjectList($("#lobster-course-projects")); this.currentCreateProjectList = this.myProjectsList; $(".lobster-lobster").append(createSimpleExerciseOutletHTML("1")); this.setUpElements(); $('[data-toggle="tooltip"]').tooltip() let defaultProject = createDefaultProject(); this.lobsterOutlet = new SimpleExerciseLobsterOutlet( $(".lobster-lobster"), defaultProject); this.projectSaveOutlet = new ProjectSaveOutlet( $(".lobster-project-save-outlet"), defaultProject, (project: Project) => saveProjectContents(project)); this.activeProject = this.setProject(defaultProject, false); this.logInButtonElem = $(".lobster-log-in-button"); assert(this.logInButtonElem.length > 0); listenTo(this, this.myProjectsList); listenTo(this, this.courseProjectsList); listenTo(this, USERS); USERS.checkLogin(); this.loadCourses(); } private setUpElements() { // Create Project Modal $("#lobster-create-project-form").on("submit", (e) => { e.preventDefault(); let name = $("#lobster-create-project-name").val() as string; this.createProject( this.currentCreateProjectList, { name: name, contents: JSON.stringify({ name: name, files: [{ name: "main.cpp", code: `#include \n\nusing namespace std;\n\nint main() {\n cout << "Hello ${name}!" << endl;\n}`, isTranslationUnit: true }] }) } ); $("#lobster-create-project-modal").modal("hide"); }); // Edit (and delete) Project Modal $("#lobster-edit-project-modal").on('show.bs.modal', () => { $("#lobster-edit-project-name").val(this.activeProject.name); $('#lobster-edit-project-is-public').prop("checked", this.activeProjectData?.is_public); }); $("#lobster-edit-project-form").on("submit", (e) => { e.preventDefault(); this.editActiveProject( $("#lobster-edit-project-name").val() as string, $('#lobster-edit-project-is-public').is(":checked")); $("#lobster-edit-project-modal").modal("hide"); }); $("#lobster-edit-project-delete").on("click", (e) => { e.preventDefault(); this.deleteActiveProject(); $("#lobster-edit-project-modal").modal("hide"); }); // Edit Exercise Modal Object.keys(EXERCISE_SPECIFICATIONS).forEach( (key) => $("#lobster-exercise-key-choices").append(`