This commit is contained in:
2025-07-14 14:45:07 +02:00
parent b07cbc5bf4
commit 3625421efe
6 changed files with 105 additions and 143 deletions

View File

@ -70,7 +70,7 @@ class IssueController extends AbstractController
}
#[Route('/user/issue/order/{id}', name: 'app_issue_order', methods: ['POST'])]
public function orderIssue(int $id, Request $request, IssueRepository $issueRepository): JsonResponse
public function orderIssue(int $id, Request $request, IssueRepository $issueRepository, EntityManagerInterface $em): JsonResponse
{
$data = $request->request;
@ -112,23 +112,13 @@ class IssueController extends AbstractController
return new JsonResponse(['message' => $e->getMessage()], 400);
}
/*
$payload =
[
'id' => $id,
'issue' => [
'status_id' => $targetStatus,
'fixed_version_id' => $targetVersion,
],
'positions' => [],
];
foreach ($targetIssues as $key => $issue) {
$payload['positions'][$issue] = ['position' => $key];
foreach ($targetIssues as $key => $rissue) {
$issue = $issueRepository->find($rissue);
if ($issue) {
$issue->setRowissue($key);
$em->flush();
}
}
$this->redmineService->updatePosition($payload, $this->getParameter('redmineApikey'));
*/
}
return new JsonResponse([

View File

@ -182,6 +182,7 @@ class RedmineService
if (!$issue) {
$issue = new Issue();
$issue->setId($rissue['id']);
$issue->setRowissue(1000000);
}
$issue->setRedmine($rissue);
$issue->setProject($project);
@ -217,12 +218,14 @@ class RedmineService
}
$issue->setRowsprint($sprintPosition);
// Calcul position issue
// Calcul position issue = plus géré via redmine
/*
if (isset($rissue['sprint'])) {
$issue->setRowissue($rissue['sprint']['position'] ?? 1000000);
} else {
$issue->setRowissue(1000000);
}
*/
$this->em->persist($issue);
$project->setUpdateAt(new \DateTime());

View File

@ -72,6 +72,11 @@
</nav>
{% endif %}
<simplemain>
{% block simplebody %}
{% endblock %}
</simplemain>
<main>
{% if usesidebar is defined and usesidebar %}
{% if is_granted('ROLE_ADMIN') %}
@ -91,12 +96,12 @@
</div>
</sidebar>
{% endif %}
{% endif %}
{% endif %}
<content style="margin: 0px auto; {{ (maxwidth is defined ? "max-width:"~maxwidth~"px;":"") }}">
{% block body %}
{% endblock %}
</content>
<content style="margin: 0px auto; {{ (maxwidth is defined ? "max-width:"~maxwidth~"px;":"") }}">
{% block body %}
{% endblock %}
</content>
</main>
<div class="toast-container position-fixed top-0 end-0 p-3" style="z-index: 9999;">

View File

@ -27,28 +27,11 @@
<div class="col-md-6 mx-auto">
<div class="card mt-3">
<div class="card-header">Information</div>
<div class="card-body">
{{ form_row(form.color) }}
<div class="card-body">
</div>
</div>
</div>
<div class="col-md-6 mx-auto">
<div class="card mt-3">
<div class="card-header">Permissions</div>
<div class="card-body">
</div>
</div>
{% if mode=="update" %}
<div class="card mt-3">
<div class="card-header">Détail Redmine</div>
<div class="card-body">
</div>
</div>
{% endif %}
</div>
</div>
{{ form_end(form) }}

View File

@ -16,15 +16,11 @@
{% endfor %}
{% endif %}
</div>
<div><a href="{{path("app_issue_update",{id:issue.id})}}">Modifier</a></div>
<div class="d-flex">
<a href="{{path("app_issue_update",{id:issue.id})}}">Modifier</a>
</div>
</div>
<div>
{% for child in issue.childs %}
{{ child.id }}
{% endfor %}
</div>
<div class="issueDescription card-body" style="height:500px;overflow-y:auto">
<div class="d-flex">
<div class="mb-3" style="flex-grow:0.5">
@ -40,9 +36,9 @@
{% endif %}
{% endfor %}
{% if sprintName %}
<strong>Sprint =</strong> {{sprintName}} (Position {{ issue.redmine.sprint.position }})<br>
<strong>Sprint =</strong> {{sprintName}}<br>
{% else %}
<strong>Sprint =</strong> Aucun (Position {{ issue.redmine.sprint.position }})<br>
<strong>Sprint =</strong> Aucun<br>
{% endif %}
<strong>Version Cible =</strong> {{(issue.redmine.fixed_version is defined?issue.redmine.fixed_version.name:'Aucune')}}<br>
<strong>Story Point =</strong> {{issue.redmine.sprint.story_points}}<br>
@ -72,6 +68,26 @@
{% endif %}
</div>
<div>
{% if issue.parent %}
<hr>
<strong>Issues Parentes</strong>
<div onClick='viewIssue({{ issue.parent.id }})' style="cursor:pointer">
<small>#{{ issue.parent.id }} = {{ issue.parent.redmine.subject }}</small>
</div>
{% endif %}
{% for child in issue.childs %}
{% if loop.first %}
<hr>
<strong>Issues Liées</strong>
{%endif%}
<div onClick='viewIssue({{ child.id }})' style="cursor:pointer">
<small>#{{ child.id }} = {{ child.redmine.subject }}</small>
</div>
{% endfor %}
</div>
{% if issue.redmine.description %}
<div class="mb-3">
<hr>

View File

@ -17,7 +17,7 @@
}
main {
simplemain {
padding-top:80px;
}
@ -122,7 +122,10 @@
.issueParent{
font-size:12px;
line-height:12px;
color:var(--bs-green);
border-bottom: 1px solid;
padding-bottom:5px;
margin-bottom:5px;
font-style:italic;
}
.issueBody {
@ -187,7 +190,7 @@
</style>
{% endblock %}
{% block body %}
{% block simplebody %}
<div class='issueContainer'>
</div>
@ -257,63 +260,61 @@
</div>
<div class='scrumContainer'>
<div class='containerStatus'>
{% for status in project.redmine.issue_statuses %}
{% if status.id not in project.hiddenstatuses %}
<div class='statusCard statusCard{{status.id}}'>
<h2>{{ status.name }}</h2>
{% for status in project.redmine.issue_statuses %}
{% if status.id not in project.hiddenstatuses %}
<div class='statusCard statusCard{{status.id}}'>
<h2>{{ status.name }}</h2>
{% for sprint in project.redmine.sprints|reverse %}
{% if sprint.id not in project.hiddensprints %}
<div class='sprintCard sprintCard{{sprint.id}} card' style='margin-bottom:20px'>
<div class='sprintCardHeader card-header'>
<div style='flex-grow:1'>Sprint = {{ sprint.name }}</div>
{% if sprint.story_points[status.id] is defined %}
<div>{{ sprint.story_points[status.id] }}</div>
{% endif %}
</div>
{% for sprint in project.redmine.sprints|reverse %}
{% if sprint.id not in project.hiddensprints %}
<div class='sprintCard sprintCard{{sprint.id}} card' style='margin-bottom:20px'>
<div class='sprintCardHeader card-header'>
<div style='flex-grow:1'>Sprint = {{ sprint.name }}</div>
{% if sprint.story_points[status.id] is defined %}
<div>{{ sprint.story_points[status.id] }}</div>
{% endif %}
</div>
{% for version in project.redmine.versions|reverse %}
{% if version.id not in project.hiddenversions %}
<div class='versionCard versionCard{{version.id}} card-body'>
<h5>Version = {{ version.name }}</h5>
<div class='versionBody' data-id='{{status.id}}|{{sprint.id}}|{{version.id}}'></div>
</div>
{% endif %}
{% endfor %}
<div class='versionCard versionCardNone card-body'>
<h5>Version = Aucune</h5>
<div class='versionBody' data-id='{{status.id}}|{{sprint.id}}|'></div>
</div>
{% for version in project.redmine.versions|reverse %}
{% if version.id not in project.hiddenversions %}
<div class='versionCard versionCard{{version.id}} card-body'>
<h5>Version = {{ version.name }}</h5>
<div class='versionBody' data-id='{{status.id}}|{{sprint.id}}|{{version.id}}'></div>
</div>
{% endif %}
{% endfor %}
<div class='versionCard versionCardNone card-body'>
<h5>Version = Aucune</h5>
<div class='versionBody' data-id='{{status.id}}|{{sprint.id}}|'></div>
</div>
</div>
{% endif %}
{% endfor %}
<div class='sprintCard sprintCardNone card'>
<div class='card-header'>
Sprint Aucun
</div>
{% for version in project.redmine.versions|reverse %}
{% if version.id not in project.hiddenversions %}
<div class='versionCard versionCard{{version.id}} card-body'>
<h5>Version = {{ version.name }}</h5>
<div class='versionBody' data-id='{{status.id}}||{{version.id}}'></div>
</div>
{% endif %}
{% endfor %}
<div class='sprintCard sprintCardNone card'>
<div class='card-header'>
Sprint Aucun
</div>
{% for version in project.redmine.versions|reverse %}
{% if version.id not in project.hiddenversions %}
<div class='versionCard versionCard{{version.id}} card-body'>
<h5>Version = {{ version.name }}</h5>
<div class='versionBody' data-id='{{status.id}}||{{version.id}}'></div>
</div>
{% endif %}
{% endfor %}
<div class='versionCard versionCardNone card-body'>
<h5>Version = Aucune</h5>
<div class='versionBody' data-id='{{status.id}}||'></div>
</div>
<div class='versionCard versionCardNone card-body'>
<h5>Version = Aucune</h5>
<div class='versionBody' data-id='{{status.id}}||'></div>
</div>
</div>
{% endif %}
{% endfor %}
</div>
</div>
{% endif %}
{% endfor %}
{% for issue in project.issues %}
<div class="issueCard {{issue.color}} 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}}'>
@ -664,17 +665,16 @@
placeholder: 'issue-placeholder',
forcePlaceholderSize: true,
scroll: true, // 👈 Active le scroll auto
scrollSensitivity: 50, // 👈 distance (px) à partir du bord pour déclencher le scroll
scrollSpeed: 100, // 👈 vitesse de défilement
start: function (event, ui) {
$sourceContainer = ui.item.parent();
$movedItem = ui.item;
originalIndex = ui.item.index();
enableAutoScroll($(window)); // ou remplace par ton conteneur scrollable
},
stop: function () {
disableAutoScroll();
},
update: function (event, ui) {
console.log("UPDATE");
if (!event.originalEvent) return;
@ -732,40 +732,5 @@
});
}
});
let autoScrollInterval = null;
function enableAutoScroll($container) {
$(document).on('mousemove.autoScroll', function (e) {
const scrollMargin = 50; // px depuis le bord de la fenêtre
const scrollSpeed = 20; // px à chaque tick
const mouseY = e.clientY;
const windowHeight = window.innerHeight;
// Scroll vers le haut
if (mouseY < scrollMargin) {
clearInterval(autoScrollInterval);
autoScrollInterval = setInterval(() => {
$container.scrollTop($container.scrollTop() - scrollSpeed);
}, 50);
}
// Scroll vers le bas
else if (mouseY > windowHeight - scrollMargin) {
clearInterval(autoScrollInterval);
autoScrollInterval = setInterval(() => {
$container.scrollTop($container.scrollTop() + scrollSpeed);
}, 50);
} else {
clearInterval(autoScrollInterval);
}
});
}
function disableAutoScroll() {
$(document).off('mousemove.autoScroll');
clearInterval(autoScrollInterval);
}
</script>
{% endblock %}