svg
This commit is contained in:
@ -70,7 +70,7 @@ class IssueController extends AbstractController
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[Route('/user/issue/order/{id}', name: 'app_issue_order', methods: ['POST'])]
|
#[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;
|
$data = $request->request;
|
||||||
|
|
||||||
@ -112,23 +112,13 @@ class IssueController extends AbstractController
|
|||||||
return new JsonResponse(['message' => $e->getMessage()], 400);
|
return new JsonResponse(['message' => $e->getMessage()], 400);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
foreach ($targetIssues as $key => $rissue) {
|
||||||
$payload =
|
$issue = $issueRepository->find($rissue);
|
||||||
[
|
if ($issue) {
|
||||||
'id' => $id,
|
$issue->setRowissue($key);
|
||||||
'issue' => [
|
$em->flush();
|
||||||
'status_id' => $targetStatus,
|
}
|
||||||
'fixed_version_id' => $targetVersion,
|
|
||||||
],
|
|
||||||
'positions' => [],
|
|
||||||
];
|
|
||||||
|
|
||||||
foreach ($targetIssues as $key => $issue) {
|
|
||||||
$payload['positions'][$issue] = ['position' => $key];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->redmineService->updatePosition($payload, $this->getParameter('redmineApikey'));
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return new JsonResponse([
|
return new JsonResponse([
|
||||||
|
@ -182,6 +182,7 @@ class RedmineService
|
|||||||
if (!$issue) {
|
if (!$issue) {
|
||||||
$issue = new Issue();
|
$issue = new Issue();
|
||||||
$issue->setId($rissue['id']);
|
$issue->setId($rissue['id']);
|
||||||
|
$issue->setRowissue(1000000);
|
||||||
}
|
}
|
||||||
$issue->setRedmine($rissue);
|
$issue->setRedmine($rissue);
|
||||||
$issue->setProject($project);
|
$issue->setProject($project);
|
||||||
@ -217,12 +218,14 @@ class RedmineService
|
|||||||
}
|
}
|
||||||
$issue->setRowsprint($sprintPosition);
|
$issue->setRowsprint($sprintPosition);
|
||||||
|
|
||||||
// Calcul position issue
|
// Calcul position issue = plus géré via redmine
|
||||||
|
/*
|
||||||
if (isset($rissue['sprint'])) {
|
if (isset($rissue['sprint'])) {
|
||||||
$issue->setRowissue($rissue['sprint']['position'] ?? 1000000);
|
$issue->setRowissue($rissue['sprint']['position'] ?? 1000000);
|
||||||
} else {
|
} else {
|
||||||
$issue->setRowissue(1000000);
|
$issue->setRowissue(1000000);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
$this->em->persist($issue);
|
$this->em->persist($issue);
|
||||||
$project->setUpdateAt(new \DateTime());
|
$project->setUpdateAt(new \DateTime());
|
||||||
|
@ -72,6 +72,11 @@
|
|||||||
</nav>
|
</nav>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
<simplemain>
|
||||||
|
{% block simplebody %}
|
||||||
|
{% endblock %}
|
||||||
|
</simplemain>
|
||||||
|
|
||||||
<main>
|
<main>
|
||||||
{% if usesidebar is defined and usesidebar %}
|
{% if usesidebar is defined and usesidebar %}
|
||||||
{% if is_granted('ROLE_ADMIN') %}
|
{% if is_granted('ROLE_ADMIN') %}
|
||||||
@ -91,12 +96,12 @@
|
|||||||
</div>
|
</div>
|
||||||
</sidebar>
|
</sidebar>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<content style="margin: 0px auto; {{ (maxwidth is defined ? "max-width:"~maxwidth~"px;":"") }}">
|
<content style="margin: 0px auto; {{ (maxwidth is defined ? "max-width:"~maxwidth~"px;":"") }}">
|
||||||
{% block body %}
|
{% block body %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
</content>
|
</content>
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<div class="toast-container position-fixed top-0 end-0 p-3" style="z-index: 9999;">
|
<div class="toast-container position-fixed top-0 end-0 p-3" style="z-index: 9999;">
|
||||||
|
@ -27,28 +27,11 @@
|
|||||||
<div class="col-md-6 mx-auto">
|
<div class="col-md-6 mx-auto">
|
||||||
<div class="card mt-3">
|
<div class="card mt-3">
|
||||||
<div class="card-header">Information</div>
|
<div class="card-header">Information</div>
|
||||||
|
<div class="card-body">
|
||||||
{{ form_row(form.color) }}
|
{{ form_row(form.color) }}
|
||||||
<div class="card-body">
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</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>
|
</div>
|
||||||
{{ form_end(form) }}
|
{{ form_end(form) }}
|
||||||
|
|
||||||
|
@ -16,15 +16,11 @@
|
|||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
<div class="d-flex">
|
||||||
<div><a href="{{path("app_issue_update",{id:issue.id})}}">Modifier</a></div>
|
<a href="{{path("app_issue_update",{id:issue.id})}}">Modifier</a>
|
||||||
|
</div>
|
||||||
</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="issueDescription card-body" style="height:500px;overflow-y:auto">
|
||||||
<div class="d-flex">
|
<div class="d-flex">
|
||||||
<div class="mb-3" style="flex-grow:0.5">
|
<div class="mb-3" style="flex-grow:0.5">
|
||||||
@ -40,9 +36,9 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% if sprintName %}
|
{% if sprintName %}
|
||||||
<strong>Sprint =</strong> {{sprintName}} (Position {{ issue.redmine.sprint.position }})<br>
|
<strong>Sprint =</strong> {{sprintName}}<br>
|
||||||
{% else %}
|
{% else %}
|
||||||
<strong>Sprint =</strong> Aucun (Position {{ issue.redmine.sprint.position }})<br>
|
<strong>Sprint =</strong> Aucun<br>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<strong>Version Cible =</strong> {{(issue.redmine.fixed_version is defined?issue.redmine.fixed_version.name:'Aucune')}}<br>
|
<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>
|
<strong>Story Point =</strong> {{issue.redmine.sprint.story_points}}<br>
|
||||||
@ -72,6 +68,26 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</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 %}
|
{% if issue.redmine.description %}
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<hr>
|
<hr>
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
main {
|
simplemain {
|
||||||
padding-top:80px;
|
padding-top:80px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -122,7 +122,10 @@
|
|||||||
.issueParent{
|
.issueParent{
|
||||||
font-size:12px;
|
font-size:12px;
|
||||||
line-height:12px;
|
line-height:12px;
|
||||||
color:var(--bs-green);
|
border-bottom: 1px solid;
|
||||||
|
padding-bottom:5px;
|
||||||
|
margin-bottom:5px;
|
||||||
|
font-style:italic;
|
||||||
}
|
}
|
||||||
|
|
||||||
.issueBody {
|
.issueBody {
|
||||||
@ -187,7 +190,7 @@
|
|||||||
</style>
|
</style>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block body %}
|
{% block simplebody %}
|
||||||
|
|
||||||
<div class='issueContainer'>
|
<div class='issueContainer'>
|
||||||
</div>
|
</div>
|
||||||
@ -257,63 +260,61 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class='scrumContainer'>
|
<div class='scrumContainer'>
|
||||||
<div class='containerStatus'>
|
{% for status in project.redmine.issue_statuses %}
|
||||||
{% for status in project.redmine.issue_statuses %}
|
{% if status.id not in project.hiddenstatuses %}
|
||||||
{% if status.id not in project.hiddenstatuses %}
|
<div class='statusCard statusCard{{status.id}}'>
|
||||||
<div class='statusCard statusCard{{status.id}}'>
|
<h2>{{ status.name }}</h2>
|
||||||
<h2>{{ status.name }}</h2>
|
|
||||||
|
|
||||||
{% for sprint in project.redmine.sprints|reverse %}
|
{% for sprint in project.redmine.sprints|reverse %}
|
||||||
{% if sprint.id not in project.hiddensprints %}
|
{% if sprint.id not in project.hiddensprints %}
|
||||||
<div class='sprintCard sprintCard{{sprint.id}} card' style='margin-bottom:20px'>
|
<div class='sprintCard sprintCard{{sprint.id}} card' style='margin-bottom:20px'>
|
||||||
<div class='sprintCardHeader card-header'>
|
<div class='sprintCardHeader card-header'>
|
||||||
<div style='flex-grow:1'>Sprint = {{ sprint.name }}</div>
|
<div style='flex-grow:1'>Sprint = {{ sprint.name }}</div>
|
||||||
{% if sprint.story_points[status.id] is defined %}
|
{% if sprint.story_points[status.id] is defined %}
|
||||||
<div>{{ sprint.story_points[status.id] }}</div>
|
<div>{{ sprint.story_points[status.id] }}</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% for version in project.redmine.versions|reverse %}
|
{% for version in project.redmine.versions|reverse %}
|
||||||
{% if version.id not in project.hiddenversions %}
|
{% if version.id not in project.hiddenversions %}
|
||||||
<div class='versionCard versionCard{{version.id}} card-body'>
|
<div class='versionCard versionCard{{version.id}} card-body'>
|
||||||
<h5>Version = {{ version.name }}</h5>
|
<h5>Version = {{ version.name }}</h5>
|
||||||
<div class='versionBody' data-id='{{status.id}}|{{sprint.id}}|{{version.id}}'></div>
|
<div class='versionBody' data-id='{{status.id}}|{{sprint.id}}|{{version.id}}'></div>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
||||||
<div class='versionCard versionCardNone card-body'>
|
<div class='versionCard versionCardNone card-body'>
|
||||||
<h5>Version = Aucune</h5>
|
<h5>Version = Aucune</h5>
|
||||||
<div class='versionBody' data-id='{{status.id}}|{{sprint.id}}|'></div>
|
<div class='versionBody' data-id='{{status.id}}|{{sprint.id}}|'></div>
|
||||||
</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>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
||||||
<div class='sprintCard sprintCardNone card'>
|
<div class='versionCard versionCardNone card-body'>
|
||||||
<div class='card-header'>
|
<h5>Version = Aucune</h5>
|
||||||
Sprint Aucun
|
<div class='versionBody' data-id='{{status.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}}||{{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>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
|
||||||
{% endfor %}
|
</div>
|
||||||
</div>
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
{% for issue in project.issues %}
|
{% 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}}'>
|
<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',
|
placeholder: 'issue-placeholder',
|
||||||
forcePlaceholderSize: true,
|
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) {
|
start: function (event, ui) {
|
||||||
$sourceContainer = ui.item.parent();
|
$sourceContainer = ui.item.parent();
|
||||||
$movedItem = ui.item;
|
$movedItem = ui.item;
|
||||||
originalIndex = ui.item.index();
|
originalIndex = ui.item.index();
|
||||||
enableAutoScroll($(window)); // ou remplace par ton conteneur scrollable
|
|
||||||
},
|
},
|
||||||
|
|
||||||
stop: function () {
|
|
||||||
disableAutoScroll();
|
|
||||||
},
|
|
||||||
|
|
||||||
update: function (event, ui) {
|
update: function (event, ui) {
|
||||||
console.log("UPDATE");
|
console.log("UPDATE");
|
||||||
if (!event.originalEvent) return;
|
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>
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
Reference in New Issue
Block a user