{% endblock %}
{% block localscript %}
diff --git a/templates/project/report.html.twig b/templates/project/report.html.twig
index 35ebc7b..358c313 100644
--- a/templates/project/report.html.twig
+++ b/templates/project/report.html.twig
@@ -1,57 +1,45 @@
{% extends 'base.html.twig' %}
{% block body %}
- {% for status in project.redmine.issue_statuses %}
-
-
{{ status.name }}
+
+
+
+
+
+
- {% for sprint in project.redmine.sprints|reverse %}
-
-
+
+
+
+
+
+
+
+ ✅ Copié dans le presse-papiers !
+
+
- {% for version in project.redmine.versions|reverse %}
- {% if version.id not in project.hiddenversions %}
-
-
-
-
- {% endif %}
- {% endfor %}
-
-
-
-
+
+ {% for status in project.redmine.issue_statuses %}
+
+
{{ status.name }}
+
+
{% endfor %}
-
-
-
- {% for version in project.redmine.versions|reverse %}
-
-
-
+ {% for issue in issues %}
+ {% if issue.redmine.updated_on|date('Ymd') >= date|date('Ymd') or (issue.redmine.closed_on is not null and issue.redmine.closed_on|date('Ymd') >= date|date('Ymd')) %}
+
+ #{{issue.id}} = {{issue.redmine.subject}}
- {% endfor %}
-
-
-
-
-
-
-
-
+ {% endif %}
+ {% endfor %}
- {% endfor %}
-
- {% for issue in issues %}
- {% if issue.redmine.updated_on|date('Ymd') >= date|date('Ymd') or (issue.redmine.closed_on is not null and issue.redmine.closed_on|date('Ymd') >= date|date('Ymd')) %}
-
- #{{issue.id}} = {{issue.redmine.subject}}
-
- {% endif %}
- {% endfor %}
+
{% endblock %}
{% block javascripts %}
@@ -59,7 +47,7 @@
// Ranger les issues dans status / sprint / version
$(function () {
$('.issueCard').each(function () {
- const id = $(this).data('status')+'|'+$(this).data('sprint')+'|'+$(this).data('version');
+ const id = $(this).data('status');
const $column = $(`[data-id='${id}']`);
if ($column.length) {
$column.append($(this));
@@ -71,39 +59,19 @@
});
$('.scrumContainer').css('display', 'flex');
- // Étape 1 : Masquer les versionCard sans enfant visible dans versionBody
- document.querySelectorAll('.versionCard').forEach(card => {
- const versionBody = card.querySelector('.versionBody');
- const children = Array.from(versionBody?.children || []);
+ // Étape 1 : Masquer les statusCard sans enfant visible dans statusBody
+ document.querySelectorAll('.statusCard').forEach(card => {
+ const statusBody = card.querySelector('.statusBody');
+ const children = Array.from(statusBody?.children || []);
const hasVisibleChild = children.some(child => child.offsetParent !== null);
if (!hasVisibleChild) {
- card.style.display = 'none';
+ card.remove();
}
});
- // Étape 2 : Masquer les sprintCard sans versionCard visible
- document.querySelectorAll('.sprintCard').forEach(sprint => {
- const visibleVersion = Array.from(sprint.querySelectorAll('.versionCard'))
- .some(card => card.offsetParent !== null);
-
- if (!visibleVersion) {
- sprint.style.display = 'none';
- }
- });
-
- // Étape 3 : Masquer les statusCard sans sprintCard visible
- document.querySelectorAll('.statusCard').forEach(status => {
- const visibleSprint = Array.from(status.querySelectorAll('.sprintCard'))
- .some(sprint => sprint.offsetParent !== null);
-
- if (!visibleSprint) {
- status.style.display = 'none';
- }
- });
-
- // Étape 4 : Trier les issues restantes par data-id dans chaque statusCard
+ // Étape 2 : Trier les issues restantes par data-id dans chaque statusCard
document.querySelectorAll('.statusCard').forEach(statusCard => {
const issues = Array.from(statusCard.querySelectorAll('.issueCard'));
@@ -114,7 +82,7 @@
visibleIssues.sort((a, b) => {
const idA = a.getAttribute('data-id');
const idB = b.getAttribute('data-id');
- return idA.localeCompare(idB, undefined, { numeric: true, sensitivity: 'base' });
+ return idB.localeCompare(idA, undefined, { numeric: true, sensitivity: 'base' });
});
// Replacer les issues triées dans leur parent immédiat
@@ -123,6 +91,90 @@
parent.appendChild(issue);
});
});
+
+ // Étape 3 : Générer la liste des statusCards visibles dans le sélecteur multiple
+ const selector = document.getElementById('statusCardSelector');
+ const statusCards = Array.from(document.querySelectorAll('.statusCard'));
+
+ statusCards.forEach(card => {
+ const statusName = card.querySelector('h2')?.textContent || 'Statut inconnu';
+ const statusId = card.className.match(/statusCard(\d+)/)?.[1];
+
+ if (statusId) {
+ const option = document.createElement('option');
+ option.value = statusId;
+ option.textContent = statusName;
+ option.selected = card.style.display !== 'none'; // Sélectionner si visible
+ selector.appendChild(option);
+ }
+ });
+
+ // Étape 4 : Afficher/Masquer les statusCard selon les options sélectionnées
+ selector.addEventListener('change', function () {
+ const selectedValues = Array.from(this.selectedOptions).map(opt => opt.value);
+
+ statusCards.forEach(card => {
+ const statusId = card.className.match(/statusCard(\d+)/)?.[1];
+ if (!statusId) return;
+
+ if (selectedValues.includes(statusId)) {
+ card.style.display = '';
+ } else {
+ card.style.display = 'none';
+ }
+ });
+ });
+
+ // Étape 5 : Copier le contenu de .report au clic sur le bouton
+ document.getElementById('copyReportBtn').addEventListener('click', function () {
+ const reportEl = document.querySelector('.report');
+
+ if (!reportEl) return;
+
+ // Créer une sélection virtuelle du contenu HTML visible
+ const range = document.createRange();
+ range.selectNodeContents(reportEl);
+
+ const selection = window.getSelection();
+ selection.removeAllRanges();
+ selection.addRange(range);
+
+ try {
+ // Exécuter la commande de copie
+ const successful = document.execCommand('copy');
+ if (successful) {
+ const msg = document.getElementById('copyStatusMsg');
+ msg.style.display = 'inline';
+ setTimeout(() => {
+ msg.style.display = 'none';
+ }, 2000);
+ } else {
+ alert('Échec de la copie.');
+ }
+ } catch (err) {
+ alert('Erreur lors de la copie : ' + err);
+ }
+
+ // Nettoyer la sélection
+ selection.removeAllRanges();
+ });
+
+ // Étape 6 : Redirection sur changement de mois
+ document.getElementById('monthSelector').addEventListener('change', function () {
+ const selected = this.value; // format YYYY-MM
+ if (!selected) return;
+
+ const parts = selected.split('-');
+ if (parts.length !== 2) return;
+
+ const year = parts[0];
+ const month = parts[1];
+ const targetMonth = year + month;
+
+ // Redirection vers la route avec le nouveau mois
+ window.location.href = '{{ path("app_project_report", {"month": "REPLACE_ME"}) }}'.replace('REPLACE_ME', targetMonth);
+ });
+
});
{% endblock %}