mirror of https://gitlab.crans.org/bde/nk20
246 lines
11 KiB
HTML
246 lines
11 KiB
HTML
{% extends "base.html" %}
|
|
|
|
{% load i18n static pretty_money django_tables2 %}
|
|
|
|
{# Remove page title #}
|
|
{% block contenttitle %}{% endblock %}
|
|
|
|
{% block content %}
|
|
<div class="row mt-4">
|
|
<div class="col-sm-5 col-md-4">
|
|
<div class="row">
|
|
{# User details column #}
|
|
<div class="col-xl-5">
|
|
<div class="card border-success shadow mb-4">
|
|
<img src="/media/pic/default.png"
|
|
id="profile_pic" alt="" class="img-fluid rounded mx-auto d-block">
|
|
<div class="card-body text-center">
|
|
<span id="user_note"></span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
{# User selection column #}
|
|
<div class="col-xl-7">
|
|
<div class="card border-success shadow mb-4">
|
|
<div class="card-header">
|
|
<p class="card-text font-weight-bold">
|
|
Sélection des émitteurs
|
|
</p>
|
|
</div>
|
|
<ul class="list-group list-group-flush" id="note_list">
|
|
</ul>
|
|
<div class="card-body">
|
|
<select name="source" data-placeholder="Note ..." data-minimum-input-length="1"
|
|
required id="note" data-autocomplete-light-language="fr"
|
|
data-autocomplete-light-url="/note/note-autocomplete/"
|
|
data-autocomplete-light-function="select2">
|
|
<option value="" selected>---------</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
{# Buttons column #}
|
|
<div class="col-sm-7 col-md-8">
|
|
{# Show last used buttons #}
|
|
<div class="card shadow mb-4">
|
|
<div class="card-body text-nowrap" style="overflow:auto hidden">
|
|
<p class="card-text text-muted font-weight-light font-italic">
|
|
Les boutons les plus utilisés s'afficheront ici.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
|
|
{# Regroup buttons under categories #}
|
|
{% regroup transaction_templates by category as categories %}
|
|
|
|
<div class="card border-primary text-center shadow mb-4">
|
|
{# Tabs for button categories #}
|
|
<div class="card-header">
|
|
<ul class="nav nav-tabs nav-fill card-header-tabs">
|
|
{% for category in categories %}
|
|
<li class="nav-item">
|
|
<a class="nav-link font-weight-bold" data-toggle="tab" href="#{{ category.grouper|slugify }}">
|
|
{{ category.grouper }}
|
|
</a>
|
|
</li>
|
|
{% endfor %}
|
|
</ul>
|
|
</div>
|
|
|
|
{# Tabs content #}
|
|
<div class="card-body">
|
|
<div class="tab-content">
|
|
{% for category in categories %}
|
|
<div class="tab-pane" id="{{ category.grouper|slugify }}">
|
|
<div class="d-inline-flex flex-wrap justify-content-center">
|
|
{% for button in category.list %}
|
|
{% if button.display %}
|
|
<button class="btn btn-outline-dark rounded-0 flex-fill"
|
|
id="button{{ button.id }}" name="button" value="{{ button.name }}">
|
|
{{ button.name }} ({{ button.amount | pretty_money }})
|
|
</button>
|
|
{% endif %}
|
|
{% endfor %}
|
|
</div>
|
|
</div>
|
|
{% endfor %}
|
|
</div>
|
|
</div>
|
|
|
|
{# Mode switch #}
|
|
<div class="card-footer border-primary">
|
|
<a class="btn btn-sm btn-secondary float-left" href="{% url 'note:template_list' %}">
|
|
<i class="fa fa-edit"></i> Éditer
|
|
</a>
|
|
<div class="btn-group btn-group-toggle float-right" data-toggle="buttons">
|
|
<label class="btn btn-sm btn-outline-primary active">
|
|
<input type="radio" name="options" id="option1" checked>
|
|
Consomations simples
|
|
</label>
|
|
<label class="btn btn-sm btn-outline-primary">
|
|
<input type="radio" name="options" id="option2">
|
|
Consomations doubles
|
|
</label>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="card shadow mb-4">
|
|
<div class="card-header">
|
|
<p class="card-text font-weight-bold">
|
|
Historique des transactions récentes
|
|
</p>
|
|
</div>
|
|
{% render_table table %}
|
|
</div>
|
|
{% endblock %}
|
|
|
|
{% block extracss %}
|
|
<style>
|
|
.select2-container{
|
|
max-width: 100%;
|
|
min-width: 100%;
|
|
}
|
|
</style>
|
|
|
|
<link href="/static/vendor/select2/dist/css/select2.css" type="text/css" media="screen" rel="stylesheet">
|
|
<link href="/static/admin/css/autocomplete.css" type="text/css" media="screen" rel="stylesheet">
|
|
<link href="/static/autocomplete_light/select2.css" type="text/css" media="screen" rel="stylesheet">
|
|
<script type="text/javascript" src="/static/autocomplete_light/jquery.init.js"></script>
|
|
<script type="text/javascript" src="/static/vendor/select2/dist/js/select2.full.js"></script>
|
|
<script type="text/javascript" src="/static/vendor/select2/dist/js/i18n/fr.js"></script>
|
|
<script type="text/javascript" src="/static/autocomplete_light/autocomplete.init.js"></script>
|
|
<script type="text/javascript" src="/static/autocomplete_light/forward.js"></script>
|
|
<script type="text/javascript" src="/static/autocomplete_light/select2.js"></script>
|
|
<script type="text/javascript" src="/static/autocomplete_light/jquery.post-setup.js"></script>
|
|
{% endblock %}
|
|
|
|
{% block extrajavascript %}
|
|
<script type="text/javascript">
|
|
function pretty_money(value) {
|
|
if (value % 100 === 0)
|
|
return (value < 0 ? "- " : "") + Math.round(Math.abs(value) / 100) + " €";
|
|
else
|
|
return (value < 0 ? "- " : "") + Math.round(Math.abs(value) / 100) + " € " + (Math.abs(value) % 100);
|
|
}
|
|
|
|
var consos = [];
|
|
|
|
$(document).ready(function() {
|
|
// If hash of a category in the URL, then select this category
|
|
// else select the first one
|
|
if (location.hash) {
|
|
$("a[href='" + location.hash + "']").tab("show");
|
|
} else {
|
|
$("a[data-toggle='tab']").first().tab("show");
|
|
}
|
|
|
|
// When selecting a category, change URL
|
|
$(document.body).on("click", "a[data-toggle='tab']", function(event) {
|
|
location.hash = this.getAttribute("href");
|
|
});
|
|
|
|
let note_obj = $("#note");
|
|
note_obj.change(function() {
|
|
let name = $("#note option:selected").text();
|
|
let note = note_obj.val();
|
|
note_obj.val(0);
|
|
note_obj.text("");
|
|
var conso = null;
|
|
consos.forEach(function(c) {
|
|
if (c[1] === note) {
|
|
c[2] += 1;
|
|
conso = c;
|
|
}
|
|
});
|
|
if (conso == null)
|
|
consos = consos.concat([[name, note, 1]]);
|
|
let note_list = $("#note_list");
|
|
var html = "";
|
|
consos.forEach(function(conso) {
|
|
html += "<li class=\"list-group-item py-1 d-flex justify-content-between align-items-center\">" + conso[0] + "<span class=\"badge badge-dark badge-pill\">" + conso[2] + "</span></li>\n";
|
|
});
|
|
note_list.html(html);
|
|
|
|
$.getJSON("/api/note/note/" + note + "/?format=json", function(note) {
|
|
console.log(note);
|
|
$("#user_note").text(name + " : " + pretty_money(note.balance));
|
|
if (note.display_image == null)
|
|
$("#profile_pic").attr('src', '/media/pic/default.png');
|
|
else
|
|
$("#profile_pic").attr('src', note.display_image);
|
|
});
|
|
});
|
|
|
|
{% for button in transaction_templates %}
|
|
{% if button.display %}
|
|
$("#button{{ button.id }}").click(function() {
|
|
consos.forEach(function(conso) {
|
|
$.post("/api/note/transaction/transaction/",
|
|
{
|
|
"csrfmiddlewaretoken": "{{ csrf_token }}",
|
|
"quantity": conso[2],
|
|
"amount": {{ button.amount }},
|
|
"reason": "{{ button.name }} ({{ button.category.name }})",
|
|
"valid": true,
|
|
"polymorphic_ctype": {{ polymorphic_ctype }},
|
|
"resourcetype": "TemplateTransaction",
|
|
"source": conso[1],
|
|
"destination": {{ button.destination.pk }},
|
|
"category": {{ button.category.id }},
|
|
"template": {{ button.id }}
|
|
}, reloadWithTurbolinks);
|
|
});
|
|
|
|
reloadWithTurbolinks();
|
|
});
|
|
{% endif %}
|
|
{% endfor %}
|
|
});
|
|
|
|
var reloadWithTurbolinks = (function () {
|
|
var scrollPosition;
|
|
|
|
function reload () {
|
|
scrollPosition = [window.scrollX, window.scrollY];
|
|
Turbolinks.visit(window.location.toString(), { action: 'replace' })
|
|
}
|
|
|
|
document.addEventListener('turbolinks:load', function () {
|
|
if (scrollPosition) {
|
|
window.scrollTo.apply(window, scrollPosition);
|
|
scrollPosition = null;
|
|
}
|
|
});
|
|
|
|
return reload;
|
|
})();
|
|
</script>
|
|
{% endblock %}
|