diff --git a/server.py b/server.py index 01eba30dcad747ac3b73efedef976f19df0d400c..6816dff190476efd1948dca6ff12573ec891989c 100755 --- a/server.py +++ b/server.py @@ -228,7 +228,7 @@ def logout(): else: return redirect(url_for('index')) -@app.route('/edit') +@app.route('/edit', methods=['GET', 'POST']) @mod_required def edit(): tabs = { @@ -238,13 +238,13 @@ def edit(): 'lectures': ('lectures_data', 'id', ['visible', 'title', 'comment', 'internal', 'speaker', 'place', 'time', 'duration', 'jumplist', 'titlefile']), - 'site_texts': ('site_texts', 'key' ['value']), + 'site_texts': ('site_texts', 'key', ['value']), 'videos': ('videos_data', 'id', ['visible', 'downloadable', 'title', 'comment', 'internal']) } query('BEGIN TRANSACTION') for key, val in request.get_json(): - table, column, id = key.split('.', 2) + table, id, column = key.split('.', 2) assert table in tabs assert column in tabs[table][2] query('UPDATE %s SET %s = ? WHERE %s = ?'%(tabs[table][0], column, diff --git a/static/moderator.js b/static/moderator.js new file mode 100644 index 0000000000000000000000000000000000000000..a502dcc8eb0715ccc8eb2ec10354f903fb7596a2 --- /dev/null +++ b/static/moderator.js @@ -0,0 +1,60 @@ +var moderatorinterface = { + init: function () { + $(function () { + var editable = $('.modeditable'); + for (var i=0; i<editable.length; i++) { + var e = $(editable[i]); + + $('.modeditablesign',e).popover( + { + title: e.data('path'), + html: true, + trigger: 'click', + container: 'body', + content: function() { + return ` + <div class="row form-group"> + <span class="col-xs-12"> + <textarea class="form-control" rows="3">`+this.parentElement.getElementsByClassName('modeditablevalue')[0].innerHTML+`</textarea> + </span> + <span class="col-xs-12"> + <input class="btn btn-default pull-right" type="submit" data-path="`+$(this.parentElement).data('path')+`" value="save" onClick="moderatorinterface.edit()"> + </span> + </div> + `; + } + } + ); + } + }) + }, + edit: function () { + var event = window.event; + var value = $(event.srcElement)[0].parentElement.previousElementSibling.children[0].value; + var path = $($(event.srcElement)[0]).data('path'); + + var editable = $('.modeditable'); + for (var i=0; i<editable.length; i++) { + var e = $(editable[i]); + + if (e.data('path') == path) { + $('.modeditablesign',e).click(); + $(".modeditablevalue",e).html(value); + } + } + var req = {}; + req[path] = value; + $.ajax({ + method: "POST", + url: "/edit", + contentType: "application/json", + data: req + }) + .done(function( msg ) { + alert( "Data Saved: " + msg ); + }); + + } +}; + +$( document ).ready( moderatorinterface.init() ); diff --git a/templates/base.html b/templates/base.html index db02b7e06cdd0cb9296f29e669df7f3f9585883a..a6ad2219de0963a4c28ab40a25b691b3287cf99f 100644 --- a/templates/base.html +++ b/templates/base.html @@ -21,6 +21,7 @@ <meta name="viewport" content="width=device-width, initial-scale=1"> <link href="static/bootstrap/bootstrap.css" rel="stylesheet"> <script src="static/bootstrap/bootstrap.js"></script> + {%if ismod() %}<script src="static/moderator.js"></script>{% endif %} </head> <body> <nav class="navbar navbar-default navbar-static-top"> @@ -58,7 +59,7 @@ </li> {% endfor %} <li class="navbar-right"> - {% if not session.user is defined %} + {% if not ismod() %} <a id="loginpopover" data-container="body" data-toggle="popover" data-placement="bottom"> <span class="glyphicon glyphicon-log-in"></span> </a> diff --git a/templates/course.html b/templates/course.html index 6676985e5d7a96a19ae97661813b4068cb349cb9..4f2cafc7555543b84f7885d8bf82dad2cac96db1 100644 --- a/templates/course.html +++ b/templates/course.html @@ -1,18 +1,19 @@ {% from 'macros.html' import lecture_list_item %} +{% from 'macros.html' import valueeditor %} {% from 'macros.html' import preview %} {% extends "base.html" %} {% block content %} <div class="panel panel-default"> <div class="panel-heading"> - <h1 class="panel-title">{{course.title}}</h1> + <h1 class="panel-title">{{ valueeditor(['courses',course.id,'title'], course.title)}}</h1> </div> <div class="row panel-body"> <div class="col-xs-12"> <table class="table-condensed"> <tbody> - <tr><td>Semester:</td><td>{{course.semester}}</td></tr> - <tr><td>Veranstalter:</td><td>{{course.organizer}}</td></tr> - <tr><td>Bemerkungen:</td><td>{{course.description|safe}}</td></tr> + <tr><td>Semester:</td><td>{{ valueeditor(['courses',course.id,'semester'], course.semester) }}</td></tr> + <tr><td>Veranstalter:</td><td>{{ valueeditor(['courses',course.id,'organizer'], course.organizer) }}</td></tr> + <tr><td>Bemerkungen:</td><td>{{ valueeditor(['courses',course.id,'description'], course.description) }}</td></tr> </tbody> </table> </div> diff --git a/templates/macros.html b/templates/macros.html index 97deff647d48d90f59067690add79d6e0c3f14aa..9ff35641c6ac6be280cdc7098a083194011dd7e3 100644 --- a/templates/macros.html +++ b/templates/macros.html @@ -141,14 +141,20 @@ $('#embedcodebtn').popover( <span class="dropdown"> {{ video_download_btn(videos) }} </span> - <a href="/play?lectureid={{lecture.id}}"> - <button class="btn btn-default {% if videos|length is equalto 0 %}disabled{% endif %}" type="button"> - <span class="glyphicon glyphicon-play"></span> - <span>Play</span> - </button> + <a href="/play?lectureid={{lecture.id}}" class="btn btn-default {% if videos|length is equalto 0 %}disabled{% endif %}"> + <span class="glyphicon glyphicon-play"></span> + Play </a> </span> </span> </div> </li> {% endmacro %} + +{% macro valueeditor (path,value) %} + {% if ismod() %} + <span class="modeditable" data-path="{{path|join('.')}}" ><a class="modeditablesign btn btn-default" tabindex="0" style="padding: 3px; margin-right: 5px;"><span class="glyphicon glyphicon-pencil"></span></a><span class="modeditablevalue">{{ value|safe }}</span></span> + {% else %} + {{value|safe}} + {% endif %} +{% endmacro%}