svg
This commit is contained in:
@ -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
|
||||
|
Reference in New Issue
Block a user