|
|
|
<html>
|
|
|
|
|
|
|
|
<head>
|
|
|
|
<meta charset="utf-8">
|
|
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
|
|
|
|
|
|
<style>
|
|
|
|
#scape_container {
|
|
|
|
zoom: 1;
|
|
|
|
-moz-transform: scale(0.5,0.5);
|
|
|
|
}
|
|
|
|
body .ui-selecting { border:2px solid yellow; }
|
|
|
|
body .ui-selected {border:2px solid black;}
|
|
|
|
|
|
|
|
body {overflow: scroll;}
|
|
|
|
#scape_container{overflow: scroll;width: 100%; height:100vh;}
|
|
|
|
|
|
|
|
#zoombuttons{
|
|
|
|
position: fixed;
|
|
|
|
right:20px;
|
|
|
|
bottom: 20px;
|
|
|
|
z-index: +999999999999999999999999999999999999999999999;
|
|
|
|
user-select: none;
|
|
|
|
-moz-user-select: none;
|
|
|
|
-khtml-user-select: none;
|
|
|
|
-webkit-user-select: none;
|
|
|
|
-o-user-select: none;
|
|
|
|
}
|
|
|
|
#zoom-in{
|
|
|
|
width: 30px;
|
|
|
|
height: 30px;
|
|
|
|
background-color: rgb(240,240,240);
|
|
|
|
cursor: pointer;
|
|
|
|
border: 1px solid black;
|
|
|
|
text-align: center;
|
|
|
|
padding-top: 10px;
|
|
|
|
}
|
|
|
|
#zoom-out{
|
|
|
|
width: 30px;
|
|
|
|
height: 30px;
|
|
|
|
background-color: rgb(240,240,240);
|
|
|
|
cursor: pointer;
|
|
|
|
border: 1px solid black;
|
|
|
|
text-align: center;
|
|
|
|
padding-top: 10px;
|
|
|
|
|
|
|
|
}
|
|
|
|
#zoom-in:hover{
|
|
|
|
background-color: rgb(230,230,230);
|
|
|
|
}
|
|
|
|
#zoom-out:hover{
|
|
|
|
background-color: rgb(230,230,230);
|
|
|
|
}
|
|
|
|
.booktitle a{
|
|
|
|
text-decoration: none;
|
|
|
|
color: black;
|
|
|
|
}
|
|
|
|
</style>
|
|
|
|
</head>
|
|
|
|
<body>
|
|
|
|
|
|
|
|
<div id="zoombuttons">
|
|
|
|
<select name="selector" id="selector">
|
|
|
|
{% for instance in instances %}
|
|
|
|
<option value="{{instance.name}}">{{instance.name}}</option>
|
|
|
|
{% endfor %}
|
|
|
|
</select>
|
|
|
|
<div id="zoom-in">+</div>
|
|
|
|
<div id="zoom-out">-</div>
|
|
|
|
</div>
|
|
|
|
<div id ="scape_container">
|
|
|
|
|
|
|
|
|
|
|
|
{% for book in books|sort(attribute='title', reverse = False) %}
|
|
|
|
<div class = "drag" id = "{{ book.id }}" style="position: absolute;width:70px;height:auto; top:{{ book.scapeY }}px; left:{{ book.scapeX }}px;">
|
|
|
|
|
|
|
|
|
|
|
|
<img class="no_cover" id="{{ book.title }}" src="../cover/{{ book.cover }}" style="width:100%;height:auto;" onerror="if (this.src != '../static/img/default_cover.gif') this.src = '../static/img/default_cover.gif';">
|
|
|
|
<p class="booktitle" style="font-size:7px;"><a href="books/{{ book.id }}">{{ book.title }}</a></p>
|
|
|
|
|
|
|
|
{% set got = {} %}
|
|
|
|
{% set all = 1 %}
|
|
|
|
{% for instance in book.instances %}
|
|
|
|
|
|
|
|
{% if instance.name in got %}
|
|
|
|
{% set x=got.__setitem__(instance.name, got[instance.name]+1) %}
|
|
|
|
{% else %}
|
|
|
|
{% set x=got.__setitem__(instance.name, 1) %}
|
|
|
|
{% endif %}
|
|
|
|
{% set all = loop.index %}
|
|
|
|
{% endfor %}
|
|
|
|
|
|
|
|
{% for instance, value in got.items() %}
|
|
|
|
{% set result = value/(book.instances|length) %}
|
|
|
|
<p hidden="True" >{{ instance }}</p>
|
|
|
|
<p hidden="True" class = "{{ instance }}" >{{result}}</p>
|
|
|
|
{% endfor %}
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
{% endfor %}
|
|
|
|
|
|
|
|
<div id="random" style="padding:2px; margin: 0;position: absolute;width:120px;height:20px;background-color:yellow;z-index:999999999999999999900000000000000;cursor:pointer;">
|
|
|
|
<p style="padding:0; margin: 0;position: absolute; ">random position</p>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<script src="{{ url_for("static", filename="js/jquery-3.3.1.min.js") }}"></script>
|
|
|
|
<script src="{{ url_for("static", filename="js/app.js") }}"></script>
|
|
|
|
<script>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$( ".no_cover" ).each(function() {
|
|
|
|
var string = $(this).attr('id');
|
|
|
|
var randomColor = colorHash(string).rgb
|
|
|
|
|
|
|
|
$(this).css({
|
|
|
|
'background-color' : randomColor,
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
function colorHash(inputString){
|
|
|
|
var sum = 0;
|
|
|
|
|
|
|
|
for(var i in inputString){
|
|
|
|
sum += inputString.charCodeAt(i);
|
|
|
|
}
|
|
|
|
|
|
|
|
r = ~~(('0.'+Math.sin(sum+1).toString().substr(6))*256);
|
|
|
|
g = ~~(('0.'+Math.sin(sum+2).toString().substr(6))*256);
|
|
|
|
b = ~~(('0.'+Math.sin(sum+3).toString().substr(6))*256);
|
|
|
|
|
|
|
|
var rgb = "rgb("+r+", "+g+", "+b+")";
|
|
|
|
|
|
|
|
var hex = "#";
|
|
|
|
|
|
|
|
hex += ("00" + r.toString(16)).substr(-2,2).toUpperCase();
|
|
|
|
hex += ("00" + g.toString(18)).substr(-2,2).toUpperCase();
|
|
|
|
hex += ("00" + b.toString(20)).substr(-2,2).toUpperCase();
|
|
|
|
|
|
|
|
return {
|
|
|
|
r: r
|
|
|
|
,g: g
|
|
|
|
,b: b
|
|
|
|
,rgb: rgb
|
|
|
|
,hex: hex
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
<script src="{{ url_for("static", filename="js/jquery-ui-1.12.1.custom/jquery-ui.js") }}"></script>
|
|
|
|
<script>
|
|
|
|
$( function() {
|
|
|
|
var currentZoom = $('#scape_container').css('zoom');
|
|
|
|
var zoom = parseFloat(currentZoom);
|
|
|
|
var pointerX;
|
|
|
|
var pointerY;
|
|
|
|
$( ".drag" ).draggable({ stack: ".drag",
|
|
|
|
start : function(evt, ui) {
|
|
|
|
pointerY = (evt.pageY - $('#scape_container').offset().top) / zoom - parseInt($(evt.target).css('top'));
|
|
|
|
pointerX = (evt.pageX - $('#scape_container').offset().left) / zoom - parseInt($(evt.target).css('left'));
|
|
|
|
},
|
|
|
|
drag : function(evt, ui) {
|
|
|
|
var canvasTop = $('#scape_container').offset().top;
|
|
|
|
var canvasLeft = $('#scape_container').offset().left;
|
|
|
|
var canvasHeight = $('#scape_container').height();
|
|
|
|
var canvasWidth = $('#scape_container').width();
|
|
|
|
|
|
|
|
// Fix for zoom
|
|
|
|
ui.position.top = Math.round((evt.pageY - canvasTop) / zoom - pointerY);
|
|
|
|
ui.position.left = Math.round((evt.pageX - canvasLeft) / zoom - pointerX);
|
|
|
|
|
|
|
|
// Finally, make sure offset aligns with position
|
|
|
|
ui.offset.top = Math.round(ui.position.top + canvasTop);
|
|
|
|
ui.offset.left = Math.round(ui.position.left + canvasLeft);
|
|
|
|
},
|
|
|
|
stop: function(){
|
|
|
|
var offset = $(this).offset();
|
|
|
|
var id = $(this).attr('id');
|
|
|
|
var xPos = offset.left;
|
|
|
|
var yPos = offset.top;
|
|
|
|
console.log(xPos);
|
|
|
|
console.log(yPos);
|
|
|
|
|
|
|
|
var postForm = { //Fetch form data
|
|
|
|
'id' : id,
|
|
|
|
'x' : xPos, //Store name fields value,
|
|
|
|
'y' : yPos
|
|
|
|
};
|
|
|
|
|
|
|
|
$.ajax({ //Process the form using $.ajax()
|
|
|
|
type : 'POST', //Method type
|
|
|
|
url : '/scape', //Your form processing file URL
|
|
|
|
data : postForm, //Forms name
|
|
|
|
dataType : 'json'
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
} });
|
|
|
|
|
|
|
|
} );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$( "#random" ).click(function() {
|
|
|
|
console.log("hallo");
|
|
|
|
$( ".drag" ).each(function() {
|
|
|
|
var id = $(this).attr('id');
|
|
|
|
var postForm = { //Fetch form data
|
|
|
|
'id' : id,
|
|
|
|
'x' : Math.floor(Math.random() * 2000) , //Store name fields value,
|
|
|
|
'y' : Math.floor(Math.random() * 2000)
|
|
|
|
};
|
|
|
|
$( this ).css("top", postForm['y']);
|
|
|
|
$( this ).css("left", postForm['x']);
|
|
|
|
|
|
|
|
$.ajax({ //Process the form using $.ajax()
|
|
|
|
type : 'POST', //Method type
|
|
|
|
url : '/scape', //Your form processing file URL
|
|
|
|
data : postForm, //Forms name
|
|
|
|
dataType : 'json'
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
$("#zoom-in").click(function(){
|
|
|
|
var currentZoom = $('#scape_container').css('zoom');
|
|
|
|
|
|
|
|
var newnumber = parseFloat(currentZoom) + 0.1;
|
|
|
|
console.log(newnumber)
|
|
|
|
//$('#scape_container').css('zoom','90%'); /* Webkit browsers */
|
|
|
|
$('#scape_container').css('zoom',newnumber.toString()); /* Other non-webkit browsers */
|
|
|
|
$('#scape_container').css('-moz-transform',scale(newnumber, newnumber)); /* Moz-browsers */
|
|
|
|
});
|
|
|
|
$("#zoom-out").click(function(){
|
|
|
|
var currentZoom = $('#scape_container').css('zoom');
|
|
|
|
var newnumber = parseFloat(currentZoom) - 0.1;
|
|
|
|
console.log(currentZoom+", "+newnumber.toString())
|
|
|
|
|
|
|
|
//$('#scape_container').css('zoom','90%'); /* Webkit browsers */
|
|
|
|
$('#scape_container').css('zoom',newnumber.toString()); /* Other non-webkit browsers */
|
|
|
|
// $('#scape_container').css('-moz-transform',scale(0.9, 0.9)); /* Moz-browsers */
|
|
|
|
});
|
|
|
|
|
|
|
|
$("select[name=selector]").on('change', function() {
|
|
|
|
var selectedInstance = $('select[name=selector]').val()
|
|
|
|
|
|
|
|
$( ".drag" ).each(function() {
|
|
|
|
if($(this).find('.'+selectedInstance).length==0)
|
|
|
|
{
|
|
|
|
$(this).css("opacity", "0.02")
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
var found = $(this).find('.'+selectedInstance).html()
|
|
|
|
$(this).css("opacity", found)
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
</script>
|
|
|
|
</body>
|
|
|
|
|
|
|
|
</html>
|