<script src="https://cdn.jsdelivr.net/npm/html2canvas@1.4.1/dist/html2canvas.min.js"></script>
<div class="modal fade" id="feedbackModal" tabindex="-1" aria-labelledby="feedbackModalLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered modal-lg modal-dialog-scrollable">
<div class="modal-content">
<div class="modal-header" style="background-color: #f5f7ff; border-bottom: 1px solid #e1e3ea;">
<h5 class="modal-title" id="feedbackModalLabel">
<i class="fa-regular fa-message me-2"></i>
Signaler un bug ou proposer une amélioration
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Fermer"></button>
</div>
<div class="modal-body pb-5">
<form id="feedbackForm" novalidate>
<div class="mb-4">
<label class="form-label fw-semibold">Type de feedback <span class="text-danger">*</span></label>
<div class="d-grid gap-2" style="grid-template-columns: 1fr 1fr;">
<button type="button" class="btn btn-feedback-type active" data-type="BUG" id="feedback-type-bug">
<i class="fa-solid fa-bug me-2"></i>
Bug
</button>
<button type="button" class="btn btn-feedback-type" data-type="IMPROVEMENT" id="feedback-type-improvement">
<i class="fa-solid fa-lightbulb me-2"></i>
Amélioration
</button>
</div>
<input type="hidden" name="type" id="feedback-type" value="BUG">
</div>
<div class="mb-3">
<label for="feedback-title" class="form-label fw-semibold">Titre <span class="text-danger">*</span></label>
<input type="text"
class="form-control"
id="feedback-title"
name="title"
placeholder="Ex: Affichage cassé page entreprise"
required
minlength="5"
maxlength="255">
<div class="invalid-feedback">Le titre doit contenir au moins 5 caractères.</div>
</div>
<div class="mb-3">
<label for="feedback-description" class="form-label fw-semibold">Problème constaté <span class="text-danger">*</span></label>
<textarea class="form-control"
id="feedback-description"
name="issueDescription"
rows="3"
placeholder="Décrivez le problème en quelques mots..."
required
minlength="40"></textarea>
<div class="d-flex justify-content-between mt-1">
<div class="invalid-feedback d-block" id="feedback-description-error" style="display: none !important;"></div>
<small class="text-muted ms-auto" id="feedback-description-counter">0/10 caractères minimum</small>
</div>
</div>
<div class="mb-4">
<label class="form-label fw-semibold">Niveau de priorité <span class="text-danger">*</span></label>
<div class="d-grid gap-2" style="grid-template-columns: repeat(3, 1fr);">
<button type="button" class="btn btn-priority btn-sm" data-priority="1">Détails</button>
<button type="button" class="btn btn-priority btn-sm" data-priority="3">Mineur</button>
<button type="button" class="btn btn-priority btn-sm" data-priority="8">Modéré</button>
<button type="button" class="btn btn-priority btn-sm active" data-priority="21">Important</button>
<button type="button" class="btn btn-priority btn-sm" data-priority="43">Urgent</button>
<button type="button" class="btn btn-priority btn-sm" data-priority="66">Critique</button>
</div>
<input type="hidden" name="priorityScore" id="feedback-priority" value="21">
</div>
<div class="mb-4">
<label for="feedback-expected" class="form-label fw-semibold">Comportement souhaité <span class="text-muted fw-normal">(optionnel)</span></label>
<textarea class="form-control"
id="feedback-expected"
name="expectedBehavior"
rows="2"
placeholder="Expliquez le comportement attendu..."></textarea>
<div class="invalid-feedback">Si renseigné, ce champ doit contenir au moins 10 caractères.</div>
</div>
<div class="mb-3">
<label class="form-label fw-semibold">
Pièces jointes <span class="text-muted fw-normal">(max. 4)</span>
</label>
<div class="d-flex gap-3 mb-2">
<a href="#" class="text-decoration-none" id="feedback-add-capture">
<i class="fa-solid fa-camera me-1"></i>
<span id="feedback-add-capture-text">Capturer une autre page</span>
</a>
<label class="text-decoration-none" style="cursor: pointer;">
<i class="fa-solid fa-upload me-1"></i>
Depuis l'ordinateur
<input type="file"
id="feedback-upload-file"
class="d-none"
accept="image/png,image/jpeg,image/gif,image/webp"
multiple>
</label>
</div>
<div id="feedback-screenshots-preview" class="d-grid gap-2" style="grid-template-columns: repeat(4, 1fr);"></div>
<div id="feedback-screenshots-error" class="text-danger small mt-1" style="display: none;"></div>
</div>
<input type="hidden" name="pageUrl" id="feedback-page-url">
<input type="hidden" name="metadata" id="feedback-metadata">
</form>
</div>
<div class="modal-footer" style="background-color: #f8f9fa;">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Annuler</button>
<button type="button" class="btn btn-primary" id="feedback-submit">
<span id="feedback-submit-text">Envoyer</span>
<span id="feedback-submit-spinner" class="spinner-border spinner-border-sm ms-2" style="display: none;"></span>
</button>
</div>
</div>
</div>
</div>
<div class="modal fade" id="feedbackScreenshotPreviewModal" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered modal-xl">
<div class="modal-content">
<div class="modal-header">
<h6 class="modal-title" id="feedbackScreenshotPreviewTitle">Aperçu</h6>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Fermer"></button>
</div>
<div class="modal-body text-center p-0">
<img id="feedbackScreenshotPreviewImage" class="img-fluid" alt="Aperçu du screenshot" style="max-height: 80vh;">
</div>
</div>
</div>
</div>
<style>
.btn-feedback-type {
background-color: #fff;
border: 1px solid #e1e3ea;
color: #3f4254;
padding: 0.75rem 1rem;
font-weight: 500;
transition: all 0.2s ease;
}
.btn-feedback-type:hover {
background-color: #f8f9fa;
border-color: #c5d5fb;
}
.btn-feedback-type.active {
background-color: #eef6ff;
border-color: #3e97ff;
color: #1d3b73;
}
.btn-priority {
background-color: #fff;
border: 1px solid #e1e3ea;
color: #3f4254;
font-size: 0.75rem;
padding: 0.5rem;
transition: all 0.2s ease;
}
.btn-priority:hover {
background-color: #f8f9fa;
border-color: #c5d5fb;
}
.btn-priority.active {
background-color: #eef6ff;
border-color: #3e97ff;
color: #1d3b73;
}
.feedback-screenshot-item {
position: relative;
border: 1px solid #e1e3ea;
border-radius: 0.5rem;
overflow: hidden;
background-color: #f8f9fa;
cursor: pointer;
}
.feedback-screenshot-item img,
.feedback-screenshot-item video {
width: 100%;
height: 60px;
object-fit: cover;
}
.feedback-screenshot-item .feedback-screenshot-delete {
position: absolute;
top: 4px;
right: 4px;
background: rgba(220, 53, 69, 0.9);
color: white;
border: none;
border-radius: 50%;
width: 20px;
height: 20px;
font-size: 10px;
display: flex;
align-items: center;
justify-content: center;
opacity: 0;
transition: opacity 0.2s ease;
cursor: pointer;
}
.feedback-screenshot-item:hover .feedback-screenshot-delete {
opacity: 1;
}
.feedback-screenshot-item .feedback-screenshot-name {
font-size: 10px;
color: #6c757d;
padding: 4px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.feedback-screenshot-item .feedback-screenshot-icon {
position: absolute;
bottom: 24px;
left: 4px;
font-size: 10px;
color: #6c757d;
}
</style>