This commit is contained in:
2025-07-09 22:12:43 +02:00
parent 0a178899d7
commit 1cc4db4943
5 changed files with 207 additions and 28 deletions

View File

@ -109,9 +109,42 @@
cursor: pointer;
}
.issueSubject{
.issueTitle{
zoom: 70%;
flex-grow: 1;
cursor: pointer;
line-height:18px;
}
.issueParent{
font-size:12px;
line-height:12px;
color:var(--bs-green);
}
.issueBody {
font-size:10px;
display:flex;
flex-direction: column;
border-top: 1px solid var(--bs-gray-100);
margin-top:5px;
padding-top:5px;
}
.issueChilds {
font-size:10px;
display:flex;
flex-direction: column;
border-top: 1px solid var(--bs-gray-100);
margin-top:5px;
padding-top:5px;
line-height:11px;
}
.issueChild {
display:flex;
cursor: pointer;
margin-top:5px;
}
.issueContainer table {
@ -140,11 +173,14 @@
}
.pulse-highlight {
animation: pulse 1.5s ease-in-out 1;
z-index: 1000;
position: relative;
animation: pulse 1.5s ease-in-out 1;
z-index: 1000;
position: relative;
}
.through {
text-decoration: line-through;
}
</style>
{% endblock %}
@ -205,6 +241,15 @@
<option value="0">Non</option>
<option value="1">Oui</option>
</select>
<table style="margin-top:30px;">
{% for sprint in project.redmine.sprints|reverse %}
{% if sprint.story_points is defined and sprint.id not in project.hiddensprints %}
<tr><td style="padding:2px">{{sprint.name}}</td><td style="padding:2px; text-align: center;">{{sprint.story_points.total}}</td></tr>
{% endif %}
{% endfor %}
</table>
</div>
<div class='scrumContainer'>
@ -270,17 +315,38 @@
<div class="issueCard card tracker{{issue.redmine.tracker.id}} category{{(issue.redmine.category is defined?issue.redmine.category.id:'0') }}" data-status='{{issue.redmine.status.id}}' data-sprint='{{issue.rowsprint}}' data-version='{{(issue.redmine.fixed_version is defined?issue.redmine.fixed_version.id:'')}}' data-id='{{issue.id}}'>
<div class='issueHeader'>
<div class='issueId'>#{{issue.id}}</div>
<div class='issueSubject'>{{issue.redmine.subject}}</div>
<div class='issueTitle'>
{% if issue.parent %}
<div class='issueParent' data-id='{{issue.parent.id}}'>#{{issue.parent.id}} = {{issue.parent.redmine.subject}}</div>
{% endif %}
<div class='issueSubject'>
{{issue.redmine.subject}}
</div>
</div>
<div class='issueAction'>
<i class='fas fa-eye' onClick='viewIssue({{issue.id}})'></i>
<verysmall>{{issue.redmine.sprint.story_points}}</verysmall>
</div>
</div>
<div class='issueBody'>
sprint = {{issue.rowsprint}}<br>
version = {{issue.rowversion}}<br>
status = {{issue.redmine.status.name}}
<div><strong>Tracker =</strong> {{issue.redmine.tracker.name}}</div>
<div><strong>Catégorie =</strong> {{issue.redmine.category is defined?issue.redmine.category.name:''}}</div>
<div><strong>Affecté à =</strong> {{(issue.redmine.assigned_to is defined?issue.redmine.assigned_to.name:'')}}</div>
<div><strong>Créé le =</strong> {{ issue.redmine.created_on|date('d/m/Y H:i') }}</div>
<div><strong>Mis à jour le =</strong> {{ issue.redmine.updated_on|date('d/m/Y H:i') }}</div>
</div>
{% if issue.childs is not empty %}
<div class='issueChilds'>
{% for child in issue.childs %}
<div class='issueChild {{issue.redmine.status.is_closed?'through':''}}' data-id='{{child.id}}'>
<div>#{{child.id}}</div>
<div style='padding-left:5px;'>{{child.redmine.subject}}</div>
</div>
{% endfor %}
</div>
{% endif %}
</div>
{% endfor %}
</div>
@ -291,6 +357,8 @@
<script>
const projectId = '{{ project.id }}';
const viewedIssueKey = `project_${projectId}_viewedIssue`;
const bodyIssueKey = `project_${projectId}_bodyIssue`;
const filterIds = [
'statusFilter',
'sprintFilter',
@ -325,7 +393,7 @@
setTimeout(() => {
$element.removeClass('pulse-highlight');
}, 3000); // Ajuster selon la durée de l'animation CSS
}, 1500); // Ajuster selon la durée de l'animation CSS
});
}
@ -385,6 +453,52 @@
});
});
// Affichage Body Issue
function getVisibleIssueIds() {
const stored = localStorage.getItem(bodyIssueKey);
return stored ? JSON.parse(stored) : [];
}
function saveVisibleIssueIds(ids) {
localStorage.setItem(bodyIssueKey, JSON.stringify(ids));
}
// Parent / Child
$(document).on('click', '.issueParent', function () {
const value = $(this).data('id');
const $target = $(`.issueCard[data-id="${value}"]`);
if ($target.length > 0) {
highlightAndScroll($target);
}
});
$(document).on('click', '.issueChild', function () {
const value = $(this).data('id');
const $target = $(`.issueCard[data-id="${value}"]`);
if ($target.length > 0) {
highlightAndScroll($target);
}
});
// Toggle issueBody
$(document).on('click', '.issueSubject', function () {
const $card = $(this).closest('.issueCard');
const $body = $card.find('.issueBody');
const issueId = $card.data('id').toString();
let visibleIds = getVisibleIssueIds();
if ($body.is(':visible')) {
$body.slideUp(200);
visibleIds = visibleIds.filter(id => id !== issueId);
} else {
$body.slideDown(200);
if (!visibleIds.includes(issueId)) {
visibleIds.push(issueId);
}
}
saveVisibleIssueIds(visibleIds);
});
// Affichage Issue
function viewIssue(issueId) {
localStorage.setItem(viewedIssueKey, issueId);
@ -510,6 +624,16 @@
if (savedIssueId) {
viewIssue(savedIssueId);
}
// Affiche bodyIssue
const visibleIds = getVisibleIssueIds();
visibleIds.forEach(id => {
const $card = $(`.issueCard[data-id="${id}"]`);
const $body = $card.find('.issueBody');
if ($body.length && !$body.is(':visible')) {
$body.show(); // ou .slideDown(200) si tu veux de l'anim
}
});
}
// Écouteurs sur tous les filtres