Added problem previewing for admins
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Thu, 14 Nov 2019 20:49:04 +0000 (14:49 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Thu, 14 Nov 2019 20:49:04 +0000 (14:49 -0600)
codebox/app/app.moon
codebox/controllers/admin/problem/preview.moon [new file with mode: 0644]
codebox/views/admin/problem/edit.moon
codebox/views/admin/problem/preview.moon [new file with mode: 0644]
codebox/views/partials/admin_layout.moon
codebox/views/submission/list.moon
docs/todo

index 89e1ec3eb77631b74447afa1d29061fddc84b7bd..a2c6833f17898d036bd7d1b5e324c720522681a8 100644 (file)
@@ -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 (file)
index 0000000..e6b846a
--- /dev/null
@@ -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
index d76ed695d4714846f29962397cb001119772b5e0..540a7365c98f59829e0516e880854c3f5583b9c4 100644 (file)
@@ -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 (file)
index 0000000..5cb9e27
--- /dev/null
@@ -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)
index 18ab899688b669e7a083b043355845bbf80cfd86..b0b079f38cadb3c9c99c247e084bbd4af6b8c5e5 100644 (file)
@@ -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
index cdadfa66ec1ae48f3c1087eaa328a4da3196cdf5..b3949e7188f0ecde7481e78991e33b97a2768ea5 100644 (file)
@@ -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
index 637a0f808abecb2362b2c36c72351088ee7d4e87..349d37ef391df4f236f515d5709f964ccbdb4cdf 100644 (file)
--- a/docs/todo
+++ b/docs/todo
                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