Scoremanager: pdf_views

This commit is contained in:
Martin Bauer
2014-02-15 18:07:00 +01:00
committed by Martin Bauer
parent 7ad5ec21fc
commit 5a3d739a9b
16 changed files with 1453 additions and 4 deletions

View File

@@ -0,0 +1,133 @@
{% extends "website/base.html" %} {% load sekizai_tags staticfiles %}
{% block content %}
{% addtoblock "css" %}
<style>
.pic-with-border {
border: 7px solid rgb(255, 255, 255);
border-radius: 5px;
box-shadow: 1px 1px 2px 0px rgb(207, 207, 207);
}
.box {
padding-bottom: 30px;
overflow: hidden;
margin-bottom: 30px;
border-bottom: 1px solid rgb(216, 216, 216);
}
.sidebar {
margin: 0px;
padding: 40px 19px 40px 28px;
background: none repeat scroll 0% 0% rgb(255, 255, 255);
border-radius: 4px;
box-shadow: 1px 1px 2px 0px rgb(207, 207, 207);
float: right;
margin-bottom: 40px;
}
.sidebar_menu {
margin: 0px;
padding-top: 30px;
padding-left: 10px;
list-style: none outside none;
}
.sidebar_menu ul{
margin: 0;
padding: 0;
list-style: none;
}
.sidebar .sidebar_menu li {
margin-bottom: 6px;
}
a.inverse_color {
color: #333;
font-size: 14px;
-webkit-transition: color .2s;
-moz-transition: color .2s;
-ms-transition: color .2s;
transition: color .2s;
}
a.inverse_color:hover {
color: #1187D8;
}
</style>
{% endaddtoblock %}
<div class="container">
<div class="row">
<div class="row">
<div class="span8" >
<h2>Repertoire</h2>
<table class="table table-striped">
<thead>
<tr>
<th> # </th>
<th> Stück </th>
<th></th>
</tr>
</thead>
{% for piece in repertoire %}
<tr>
<td>
{{ piece.repertoire_nr }}
</td>
<td>
<a class="inverse_color" href="{% url 'scoremanager.views.piece_view' piece.pk %}">
{{ piece.title }}
</a>
</td>
<td>
{{ piece.booklocation }}
</td>
</tr>
{% endfor %}
</table>
</div>
<div class="span3 offset1 sidebar">
<div class="box">
<h4>Notenverwaltung</h4>
<img class="pic-with-border" src="{{STATIC_URL}}/img/scoreSheet.jpg" />
<ul class="sidebar_menu">
<ul>
<li>
<a class="inverse_color" href="{% url 'scoremanager.pdf_views.repertoire_toc' %}"> Inhaltsverzeichnis herunterladen </a>
</li>
<li>
<a class="inverse_color" href="{% url 'scoremanager.pdf_views.repertoire_pdf' %}">Repertoire herunterladen</a>
</li>
{% if perms.scoremanager.manage_scores %}
<li>
<a class="inverse_color" href="{% url 'scoremanager.views.manage_repertoire' %}">
Repertoire verwalten
</a>
</li>
{% endif %}
</ul>
</ul>
</div>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,284 @@
{% extends "website/base.html" %} {% load sekizai_tags staticfiles %}
{% block content %}
{% addtoblock "js" strip %} <script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js"></script> {% endaddtoblock %}
{% addtoblock "js" strip %} <script src="{{STATIC_URL}}/js/List.js"></script> {% endaddtoblock %}
{% addtoblock "js" strip %} <script src="{{STATIC_URL}}/js/List.pagination.js"></script> {% endaddtoblock %}
{% addtoblock "css" strip %} <link rel="stylesheet" href="{{STATIC_URL}}/css/jquery-ui-1.8.21.custom.css" type="text/css" media="screen" /> {% endaddtoblock %}
{% addtoblock "css" %}
<style>
.piecelist {
position: relative;
padding: 45px 15px 15px;
margin: 0 -15px 15px;
background-color: #fafafa;
box-shadow: inset 0 3px 6px rgba(0,0,0,.05);
border-color: #e5e5e5 #eee #eee;
border-style: solid;
border-width: 1px 0;
min-height: 500px;
}
.piecelist:after {
content: "Stückliste";
position: absolute;
top: 15px;
left: 15px;
font-size: 12px;
font-weight: bold;
color: #bbb;
text-transform: uppercase;
letter-spacing: 1px;
}
.piecelist + .highlight {
margin: -15px -15px 15px;
border-radius: 0;
border-width: 0 0 1px;
}
@media (min-width: 768px) {
.piecelist {
margin-left: 0;
margin-right: 0;
background-color: #fff;
border-width: 1px;
border-color: #ddd;
border-radius: 4px 4px 0 0;
box-shadow: none;
}
.piecelist + .highlight {
margin-top: -16px;
margin-left: 0;
margin-right: 0;
border-width: 1px;
border-bottom-left-radius: 4px;
border-bottom-right-radius: 4px;
}
}
input[type='text'].pieceSearch {
float: right;
z-index: 2;
margin-top: 15px;
margin-right: 15px;
font-size: 0.8em;
height: 12px;
width: 165px;
position: relative;
}
ul.piecelist{
list-style-type: none;
}
ol.piecelist {
font-size: 16px;
font-weight: bold;
margin-bottom:0;
margin-left: 0px; /* Since 'ul,ol{}' setting in line 108 affects this selector, 'margin-left' is redefined. */
list-style-position: inside; /* This will place the number on top and inside of the current color of li */
}
.piecelist .item {
color: #333;
font-size: 14px;
font-weight: normal;
height: 30px;
display: inline-block;
vertical-align:text-top;
width: 90%;
}
.piecelist .item img {
height: 40px;
float:left;
}
.piecelist > li {
border-radius: 17px;
background-color: #dff0d8;
padding:10px;
box-shadow: inset 0 1px 0 #fff;
}
.piecelist .title {
font-weight: bold;
font-size: 1.1em;
}
.piecelist .composer {
font-style: italic;
font-size: 0.8em;
padding-left: 10px;
}
.piecelist .bookLocation {
font-style: italic;
font-size: 0.8em;
margin-left: 6px;
}
.piecelist li span {
width: 100%;
}
.pagination {
min-height: 30px;
}
.pagination li {
display:inline-block;
padding:5px;
}
#saveButton {
float: right;
margin-top: 20px;
}
</style>
{% endaddtoblock %}
{% addtoblock "js" %}
<script>
$(function() {
$( "#allPieces li" ).draggable({
connectToSortable: "#repertoire" ,
appendTo: "parent",
helper: function(){
return $(this).clone().width($(this).width());
}
});
$( "#allPieces li.in-repertoire" ).draggable("disable");
$( "#repertoire" ).sortable( {
receive: function(ev, ui) {
$(ui.item).draggable("disable");
$('#saveButton').removeAttr('disabled');
},
update: function( event, ui ) {
$('#saveButton').removeAttr('disabled');
}
}).disableSelection();
$("#allPieces").droppable({
accept: "#repertoire li",
hoverClass: "ui-state-hover",
drop: function(ev, ui) {
var id = $(ui.draggable).data("pieceid");
$("#allPieces li[data-pieceid=" + id + "]" ).draggable("enable")
ui.draggable.remove();
$('#saveButton').removeAttr('disabled');
}
});
$( "#saveButton").click( function() {
var result = {};
$("#repertoire li").each( function(index,value) {
var id = parseInt( $(this).data("pieceid") );
result[id] = index +1;
});
$.ajax({
url: "{% url 'scoremanager.views.manage_repertoire_ajax_save' %} " ,
type: 'POST',
contentType: 'application/json; charset=utf-8',
data: JSON.stringify(result),
dataType: 'text',
success: function(result) {
$('#saveButton').attr('disabled','disabled');
}
});
});
var options = {
valueNames : [ 'title', 'composer' ],
page : 5,
plugins : [ ListPagination({ paginationClass: 'paginationListMarker'}) ]
};
var pieceList = new List('allPiecesList', options);
});
</script>
{% endaddtoblock %}
<div class="container">
<div class="row">
<div class="row-fluid">
<div class="span12">
<h2>Repertoire Manager</h2>
</div>
</div>
<div class="row">
<div class="span6" id="allPiecesList">
<h4>Alle Stücke</h4>
<input class="search pieceSearch" type="text" placeholder="Suchen" />
<ul id="allPieces" class="piecelist list">
{% for piece in allPieces %}
<li data-pieceid="{{piece.pk}}" {% if not piece.repertoire_nr %} {% else %}class="in-repertoire"{% endif %}>
<p class="item">
<img src="{{STATIC_URL}}/img/score-icon.png" />
<span class="title"> {{ piece.title }} </span>
<br/>
<span class="composer">{{ piece.composer}} </span>
{% if piece.booklocation %} <span class="bookLocation"> ( {{piece.booklocation}} ) </span> {% endif %}
</p>
</li>
{% endfor %}
</ul>
<div class="pagination">
<ul class="paginationListMarker"></ul>
</div>
</div>
<div class="span6">
<h4>Repertoire</h4>
<ol id="repertoire" class="piecelist" >
{% for piece in repertoire %}
<li data-pieceid="{{piece.pk}}">
<p class="item">
<img src="{{STATIC_URL}}/img/score-icon.png" />
<span class="title"> {{ piece.title }} </span>
<br/>
<span class="composer">{{ piece.composer}} </span>
{% if piece.booklocation %} <span class="bookLocation"> ( {{piece.booklocation}} ) </span> {% endif %}
</p>
</li>
{% endfor %}
</ol>
<button id="saveButton" class="btn btn-primary" disabled="true">Speichern</button>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,310 @@
{% extends "website/base.html" %}
{% load sekizai_tags staticfiles %}
{% block content %}
{% addtoblock "css" %}
<style>
.piece-pic {
border: 7px solid rgb(255, 255, 255);
border-radius: 5px;
box-shadow: 1px 1px 2px 1px rgb(207, 207, 207);
margin-top:10px;
margin-bottom:20px;
}
.sidebar {
margin: 10px 0px 0px 0px;
padding: 40px 19px 20px 28px;
background: none repeat scroll 0% 0% rgb(255, 255, 255);
border-radius: 4px;
box-shadow: 0px 1px 3px 1px rgb(207, 207, 207);
float: right;
}
.error {
color: red;
margin:15px;
}
.upload_form {
margin-top:15px;
}
.upload-area {
margin: 15px;
}
.help-text {
font-size: 0.9em;
font-style: italic;
}
.embed-container {
position: relative;
padding-bottom: 56.25%; /* 16/9 ratio */
padding-top: 30px; /* IE6 workaround*/
height: 0;
overflow: hidden;
}
.embed-container iframe,
.embed-container object,
.embed-container embed {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.youtubeWrapper {
width: 30%;
float: left;
margin-top: 20px;
margin-bottom: 20px;
margin-left: 20px;
}
.youtubeCaption {
text-align: center;
}
#section1 {
padding-bottom:50px;
}
#section2 {
background: url("{{STATIC_URL}}/img/backgrounds/aqua.jpg") no-repeat scroll 0% 0% / cover transparent;
display: block;
padding-top:50px;
padding-bottom:20px;
}
#section2 h4 {
font-size: 38px;
margin-top: 0px;
margin-bottom: 25px;
line-height: 38px;
text-align: center;
color: rgb(255, 255, 255);
}
#section2 .upload {
text-align: center;
display:block;
}
</style>
{% endaddtoblock %}
{% addtoblock "js" %}
<script type="text/javascript">
$(function() {
$(".upload_form input:file").change(function (){
$(".upload_form").submit();
});
$("a.score-label").click( function() {
var id = $(this).data("id");
$.ajax( {
url: "{% url 'scoremanager.views.score_user_mapping_save' %}",
type: 'POST',
contentType: 'application/json; charset=utf-8',
data: ' { "myScore" : ' + id + ' } ',
dataType: 'text',
success: function(result) {
location.reload();
}
});
});
$(".delete-button").click(function() {
var id = $(this).data("id");
var scoreUrl = "{% url 'scoremanager.views.score' '4242' %}"
if (confirm('Diesen Notensatz wirklich löschen?')) {
$.ajax( {
url: scoreUrl.replace( '4242', id.toString() ),
type: 'DELETE',
contentType: 'application/json; charset=utf-8',
success: function(result) {
location.reload();
}
});
}
});
$("#youtubeLinkInput").keypress(function(e){
if (e.keyCode != 13) { return }
e.preventDefault();
var data = { "link": this.value,
"pieceId": "{{ piece.id }}" };
$.ajax( {
url: "{% url 'scoremanager.views.youtube_link' %}",
type: 'POST',
contentType: 'application/json; charset=utf-8',
data: JSON.stringify(data),
success: function(result) {
location.reload();
}
});
});
$(".youtubeDeleteButton").click( function() {
var id = $(this).data("id");
$.ajax( {
url: "{% url 'scoremanager.views.youtube_link' %}",
type: 'DELETE',
contentType: 'application/json; charset=utf-8',
data: ' { "linkid" : ' + id + ' } ',
dataType: 'text',
success: function(result) {
location.reload();
}
});
});
});
</script>
{% endaddtoblock %}
<div id="section1">
<div class="container">
<div class="row">
<h2>{{ piece.title }}</h2>
<div class="span7">
{% if pictureScore %}
<a href="{{MEDIA_URL}}/{{pictureScore.file}}">
<img class="piece-pic img-responsive" src="{% url 'scoremanager.views.score' pictureScore.id %}"> </img>
</a>
{% endif %}
<h3>Info</h3>
<table class="table table-striped">
{% if piece.composer %}
<tr>
<td>Komponist:</td>
<td>{{piece.composer}} </td>
</tr>
{% endif %}
{% if piece.booklocation %}
<tr>
<td>Buch: </td>
<td>{{piece.booklocation }} </td>
</tr>
{% endif %}
</table>
{% if piece.scores.all|length > 0 %}
<h3>Alle Noten</h3>
<table class="table table-striped">
{% for score in piece.scores.all %}
<tr>
<td>
<a href="{{MEDIA_URL}}/{{score.file}}">
{{ score.score_type }}
</a>
</td>
<td>
{% if score == activeScore %}
<span data-id="{{score.id}}" class="label label-success score-label">Meine Noten</span>
{% else %}
<a data-id="{{score.id}}" class="btn btn-mini score-label">Meine Noten</a>
{% endif %}
</td>
<td>
{% if score.uploaded_by == request.user or perms.scoremanager.manage_scores %}
<a class="btn btn-mini btn-danger delete-button" data-id="{{score.id}}">Löschen</a>
{% endif %}
</td>
</tr>
{% endfor %}
</table>
{% endif %}
{% if piece.recordings.all|length > 0 %}
<h3>Aufnahmen</h3>
<ul>
{% for recording in piece.recordings.all %}
<li>
<a href="{{MEDIA_URL}}/{{ recording.file }}">
{{ recording.artist }}
</a>
</li>
{% endfor %}
</ul>
{% endif %}
</div>
<div class="span4 sidebar offset1">
<h4>Upload</h4>
<div class="upload-area">
<div class="help-text">
Hier kann jeder Noten oder Aufnahmen hochladen. Der Dateiname wird als Interpret (für Aufnahmen) bzw. Stimme (für Noten)
verwendet. Zip Dateien, die MP3s und/oder PDFs enthalten funktionieren auch.
</div>
<form class="upload_form" method="post" enctype="multipart/form-data">
{% csrf_token %}
{% if form.file.errors|length > 0 %}
<div class="error">Problem beim Upload. Erlaubte Dateien: mp3,pdf und zip</div>
{% endif %}
{{ form.file }}
<input type="submit" class="hidden" value="Ok"></input>
</form>
</div>
</div>
</div>
</div>
</div>
<div id='section2'>
<div class="container">
<div class="row">
<div class="span12">
<h4>
Youtube<br>
</h4>
<div class="upload">
<input id="youtubeLinkInput" type="text" placeholder="Hier Youtube Link reinkopieren"></input>
</div>
{% if piece.youtubeLinks.all|length > 0 %}
<div>
{% for youtubeLink in piece.youtubeLinks.all %}
<div class="youtubeWrapper">
{{ youtubeLink.embed_html }}
{% if youtubeLink.uploaded_by == request.user or perms.scoremanager.manage_scores %}
<div class="youtubeCaption">
<button class="btn btn-mini btn-danger youtubeDeleteButton" data-id="{{youtubeLink.id}}">
Löschen
</button>
</div>
{% endif %}
</div>
{% endfor %}
</div>
{% endif %}
</div>
</div>
</div>
</div>
{% endblock %}