* bump version
* fix translation ids
* added css classes to modify form with custom css
* improve export pdf file names
* respect financial year in new report
* added new InvoiceCalculator: price
* upgrade packages and node-sass to v7
* title pattern for customer, project and activity via API
* support negative money without currency
* fix sub-locale in print export template
* fix overbooking validation for monthly budget
* fix copying entities with different set of custom-fields compared to the current configuration
This commit is contained in:
Kevin Papst
2022-02-25 20:41:56 +01:00
committed by GitHub
parent 34649d809e
commit c0168ecc5b
53 changed files with 1222 additions and 611 deletions

View File

@@ -1,6 +1,7 @@
{% extends 'export/layout.html.twig' %}
{% import "macros/widgets.html.twig" as widgets %}
{% import "macros/datatables.html.twig" as tables %}
{% extends 'export/layout.html.twig' %}
{% import "macros/webloader.html.twig" as webloader %}
{% block document_title %}{{ 'export.title'|trans }}{% endblock %}
@@ -51,27 +52,25 @@
}) %}
{% block javascripts %}
{{ webloader.init_frontend_loader() }}
<script type="text/javascript">
let initialized = false;
window.addEventListener('load', function() {
var loader = new KimaiWebLoader({
formatDuration: '{{ get_format_duration() }}',
locale: '{{ app.request.locale }}',
}, {});
var DATES = loader.getKimai().getPlugin('date');
document.addEventListener('kimai.initialized', function(event) {
const KIMAI = event.detail.kimai;
const DATES = KIMAI.getPlugin('date');
document.getElementById('duration-decimal').addEventListener('click', function(event) {
var spans = document.getElementsByClassName('duration-format');
for (var span of spans) {
var duration = span.dataset['duration'];
let spans = document.getElementsByClassName('duration-format');
for (let span of spans) {
let duration = span.dataset['duration'];
if (duration === undefined) {
continue;
}
if (!event.target.checked) {
span.innerHTML = DATES.formatSeconds(duration);
} else {
span.innerHTML = (new Intl.NumberFormat('{{ app.request.locale }}', {maximumFractionDigits: 2}).format(duration / 3600));
span.innerHTML = (new Intl.NumberFormat('{{ app.request.locale|replace({'_': '-'}) }}', {maximumFractionDigits: 2}).format(duration / 3600));
}
}
saveVisibility();
@@ -96,36 +95,36 @@
saveVisibility();
});
document.getElementById('summary-timeBudget').addEventListener('click', function(event) {
var cells = document.getElementsByClassName('export-timeBudget');
for (var columnCell of cells) {
let cells = document.getElementsByClassName('export-timeBudget');
for (let columnCell of cells) {
columnCell.style.display = event.target.checked ? 'table-cell' : 'none';
}
saveVisibility();
});
document.getElementById('summary-budget').addEventListener('click', function(event) {
var cells = document.getElementsByClassName('export-budget');
for (var columnCell of cells) {
let cells = document.getElementsByClassName('export-budget');
for (let columnCell of cells) {
columnCell.style.display = event.target.checked ? 'table-cell' : 'none';
}
saveVisibility();
});
document.getElementById('summary-duration').addEventListener('click', function(event) {
var cells = document.getElementsByClassName('summary-duration');
for (var columnCell of cells) {
let cells = document.getElementsByClassName('summary-duration');
for (let columnCell of cells) {
columnCell.style.display = event.target.checked ? 'table-cell' : 'none';
}
saveVisibility();
});
document.getElementById('summary-rate').addEventListener('click', function(event) {
var cells = document.getElementsByClassName('summary-rate');
for (var columnCell of cells) {
let cells = document.getElementsByClassName('summary-rate');
for (let columnCell of cells) {
columnCell.style.display = event.target.checked ? 'table-cell' : 'none';
}
saveVisibility();
});
document.getElementById('summary-rate-internal').addEventListener('click', function(event) {
var cells = document.getElementsByClassName('summary-rate-internal');
for (var columnCell of cells) {
let cells = document.getElementsByClassName('summary-rate-internal');
for (let columnCell of cells) {
columnCell.style.display = event.target.checked ? 'table-cell' : 'none';
}
saveVisibility();
@@ -139,17 +138,17 @@
saveVisibility();
});
var columnCheckboxes = document.getElementsByClassName('column-visibility-changer');
let columnCheckboxes = document.getElementsByClassName('column-visibility-changer');
for (var checkbox of columnCheckboxes) {
for (let checkbox of columnCheckboxes) {
checkbox.addEventListener('click', function(event) {
changeVisibility(event.target.name, event.target.checked);
});
}
var editableTitles = document.querySelectorAll('[contenteditable=true]');
let editableTitles = document.querySelectorAll('[contenteditable=true]');
for (var editable of editableTitles) {
for (let editable of editableTitles) {
editable.addEventListener('input', function(event) {
if (event.target.innerText === '') {
return;
@@ -200,8 +199,8 @@
function changeVisibility(column, visible)
{
var cells = document.getElementsByClassName('column-' + column);
for (var columnCell of cells) {
let cells = document.getElementsByClassName('column-' + column);
for (let columnCell of cells) {
columnCell.style.display = visible ? 'table-cell' : 'none';
}
saveVisibility();
@@ -209,9 +208,9 @@
function changedDateFormat(formatType, className)
{
var elements = document.getElementsByClassName(className);
for (var elem of elements) {
var formattedDate = elem.dataset[formatType];
let elements = document.getElementsByClassName(className);
for (let elem of elements) {
let formattedDate = elem.dataset[formatType];
if (formattedDate === undefined) {
continue;
}
@@ -242,9 +241,9 @@
function resetExport()
{
var editableTitles = document.querySelectorAll('[contenteditable=true]');
let editableTitles = document.querySelectorAll('[contenteditable=true]');
for (var editable of editableTitles) {
for (let editable of editableTitles) {
editable.innerText = editable.dataset['original'];
}
@@ -252,7 +251,6 @@
const form = document.getElementsByTagName('form')[0];
form.reset();
}
</script>
{% endblock %}