From 83ed4c6a5e9e90a4e87542358fbd7f64aef2775d Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Thu, 14 Nov 2019 14:49:04 -0600 Subject: [PATCH] Added problem previewing for admins --- codebox/app/app.moon | 1 + .../controllers/admin/problem/preview.moon | 28 +++++++++++++++++++ codebox/views/admin/problem/edit.moon | 6 +++- codebox/views/admin/problem/preview.moon | 10 +++++++ codebox/views/partials/admin_layout.moon | 3 ++ codebox/views/submission/list.moon | 4 ++- docs/todo | 4 +++ 7 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 codebox/controllers/admin/problem/preview.moon create mode 100644 codebox/views/admin/problem/preview.moon diff --git a/codebox/app/app.moon b/codebox/app/app.moon index 89e1ec3..a2c6833 100644 --- a/codebox/app/app.moon +++ b/codebox/app/app.moon @@ -66,6 +66,7 @@ class extends lapis.Application ['admin.problem.new': "/admin/problems/new"]: controller "admin.problem.new" ['admin.problem.edit': "/admin/problems/edit/:problem_name"]: controller "admin.problem.edit" ['admin.problem.delete': "/admin/problems/delete"]: controller "admin.problem.delete" + ['admin.problem.preview': "/admin/problems/preview/:problem_name"]: controller "admin.problem.preview" ['admin.testcase.new': "/admin/testcases/new"]: controller "admin.testcase.new" ['admin.testcase.edit': "/admin/testcases/edit"]: controller "admin.testcase.edit" diff --git a/codebox/controllers/admin/problem/preview.moon b/codebox/controllers/admin/problem/preview.moon new file mode 100644 index 0000000..e6b846a --- /dev/null +++ b/codebox/controllers/admin/problem/preview.moon @@ -0,0 +1,28 @@ +import make_controller from require "controllers.controller" +import assert_valid from require "lapis.validate" +import capture_errors, capture_errors_json, yield_error from require 'lapis.application' +import Problems from require 'models' + +make_controller + layout: require 'views.partials.admin_layout' + + middleware: { 'logged_in', 'admin_required' } + + scripts: { 'admin_problem', 'vendor/ace/ace' } + raw_scripts: { + "https://polyfill.io/v3/polyfill.min.js?features=es6" + "https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js" + } + + get: capture_errors_json => + @navbar.selected = 1 + + assert_valid @params, { + { "problem_name", exists: true } + } + + @problem = Problems\find short_name: @params.problem_name + unless @problem + yield_error "Problem not found" + + render: true diff --git a/codebox/views/admin/problem/edit.moon b/codebox/views/admin/problem/edit.moon index d76ed69..540a736 100644 --- a/codebox/views/admin/problem/edit.moon +++ b/codebox/views/admin/problem/edit.moon @@ -38,7 +38,11 @@ class AdminProblemEdit extends html.Widget label for: 'blacklisted_langs', 'Language blacklist (comma separated)' input type: 'text', name: 'blacklisted_langs', value: @problem.blacklisted_langs, "" - div class: 'header-line', -> div 'Problem description' + div class: 'option-line', -> + div 'Problem description' + span class: 'button-list', -> + a href: (@url_for "admin.problem.preview", { problem_name: @problem.short_name }), "Preview" + pre { style: 'height: 32rem;', id: 'code-editor', 'data-lang': 'markdown' }, @problem.description input class: 'mar-t-24', type: 'submit', value: 'Update problem info' diff --git a/codebox/views/admin/problem/preview.moon b/codebox/views/admin/problem/preview.moon new file mode 100644 index 0000000..5cb9e27 --- /dev/null +++ b/codebox/views/admin/problem/preview.moon @@ -0,0 +1,10 @@ +html = require "lapis.html" +markdown = require "markdown" + +class AdminProblemPreview extends html.Widget + content: => + div style: 'overflow:hidden', class: 'content', -> + h1 @problem.name + + div class: 'problem-description', -> + raw (markdown @problem.description) diff --git a/codebox/views/partials/admin_layout.moon b/codebox/views/partials/admin_layout.moon index 18ab899..b0b079f 100644 --- a/codebox/views/partials/admin_layout.moon +++ b/codebox/views/partials/admin_layout.moon @@ -14,6 +14,9 @@ class DefaultLayout extends html.Widget for s in *@scripts script type: "text/javascript", src: "/static/js/#{s}.js" + for s in *@raw_scripts + script type: "text/javascript", src: s + body -> widget AdminNavbar widget ErrorList diff --git a/codebox/views/submission/list.moon b/codebox/views/submission/list.moon index cdadfa6..b3949e7 100644 --- a/codebox/views/submission/list.moon +++ b/codebox/views/submission/list.moon @@ -1,5 +1,5 @@ html = require 'lapis.html' -import Jobs, Users from require 'models' +import Jobs, Users, Problems from require 'models' class SubmissionList extends html.Widget content: => @@ -7,6 +7,8 @@ class SubmissionList extends html.Widget div class: 'content', -> for prob in *@problems + if prob.kind == Problems.kinds.word then continue + div class: 'header-line', -> div prob.name div class: 'box', -> jobs = Users\get_jobs_by_problem @user.id, prob.id, @competition.id diff --git a/docs/todo b/docs/todo index 637a0f8..349d37e 100644 --- a/docs/todo +++ b/docs/todo @@ -13,6 +13,10 @@ X Show result on problem page * This could be better and not require a reload +[X] Problem preview + X Add button on problem edit page + X Add page that simply renders the problem in the same way as the existing problem description + [ ] Multiple active competitions at a time * When users visit root of site, display list of active competitions * Users join each competition independently -- 2.25.1