feat: issue creation

This commit is contained in:
2025-02-22 18:01:45 +01:00
parent 5b148cb4bb
commit 2d83ca9d20
10 changed files with 258 additions and 40 deletions

View File

@ -7,6 +7,7 @@ import (
)
type IssuePageVModel struct {
IssueURL string
SummaryForm *form.Form
IssueForm *form.Form
Projects []*model.Project
@ -42,7 +43,7 @@ func NewIssueForm() *form.Form {
form.NonEmpty("Ce champs ne doit pas être vide."),
),
form.NewField(
"content",
"body",
form.Attrs{
"type": "textarea",
"rows": "20",
@ -59,11 +60,33 @@ templ IssuePage(vmodel IssuePageVModel) {
<div class="buttons is-right">
<a class="button is-medium" href={ common.BaseURL(ctx, common.WithPath("/auth/logout")) }>Se déconnecter</a>
</div>
if vmodel.IssueURL != "" {
<article class="message is-primary">
<div class="message-header">
<p>Demande créée !</p>
<button class="delete" aria-label="delete" hx-on:click="onCloseMessage(this)"></button>
</div>
<div class="message-body">
Votre demande a été créée et est disponible à l'adresse suivante:
<a href={ templ.SafeURL(vmodel.IssueURL) } target="_blank"><code>{ vmodel.IssueURL }</code></a>.
</div>
</article>
<script type="text/javascript">
function clearSummary(projectId) {
sessionStorage.removeItem(`summary-${projectId}`)
}
function openIssue(issueUrl) {
window.open(issueUrl, "_blank");
}
</script>
@templ.JSFuncCall("clearSummary", vmodel.SelectedProjectID)
@templ.JSFuncCall("openIssue", vmodel.IssueURL)
}
<progress id="generation-progress" class="htmx-indicator progress"></progress>
<div class="columns">
<div class="column is-4">
<form id="summary-form" action={ common.CurrentURL(ctx) } method="post" hx-disabled-elt="#summary-form textarea, #summary-form select, #summary-form button" hx-indicator="#generation-progress">
<form id="summary-form" action={ common.CurrentURL(ctx) } method="put" hx-disabled-elt="#summary-form textarea, #summary-form select, #summary-form button" hx-indicator="#generation-progress">
<h2 class="title is-size-2">Résumé de la demande</h2>
<progress id="generation-progress" class="htmx-indicator progress"></progress>
@common.FormSelect(
vmodel.SummaryForm, "issue-project", "project", "Projet",
common.WithOptions(projectsToOptions(vmodel.Projects)...),
@ -71,6 +94,7 @@ templ IssuePage(vmodel IssuePageVModel) {
"hx-get", string(common.CurrentURL(ctx, common.WithoutValues("project", "*"))),
"hx-target", "body",
"hx-push-url", "true",
"hx-on:htmx:beforeSend", "onProjectChange(event)",
),
)
@common.FormTextarea(
@ -84,35 +108,58 @@ templ IssuePage(vmodel IssuePageVModel) {
<span class="icon">
<i class="fa fa-robot"></i>
</span>
<span>Génerer le ticket</span>
<span>Générer le ticket</span>
</button>
</div>
</form>
</div>
<div class="column">
<h2 class="title is-size-2">Votre demande</h2>
@common.FormField(vmodel.IssueForm, "issue-content", "title", "Titre")
@common.FormTextarea(vmodel.IssueForm, "issue-content", "content", "Contenu")
<div class="buttons is-right">
<button disabled type="submit" class="button is-primary is-large">
<span class="icon">
<i class="fa fa-rocket"></i>
</span>
<span>Créer le ticket</span>
</button>
</div>
<form action={ common.CurrentURL(ctx) } method="post" hx-disabled-elt="textarea, input, select, button" hx-indicator="#generation-progress">
@common.FormField(vmodel.IssueForm, "issue-title", "title", "Titre")
@common.FormTextarea(vmodel.IssueForm, "issue-body", "body", "Corps")
<div class="buttons is-right">
<button type="submit" class="button is-primary is-large">
<span class="icon">
<i class="fa fa-rocket"></i>
</span>
<span>Créer le ticket</span>
</button>
</div>
</form>
</div>
</div>
</section>
</div>
<script type="text/javascript">
function onCloseMessage(closeElement) {
closeElement.closest('.message').style.display = 'none';
}
function onSummaryChange(evt) {
const summary = evt.currentTarget.value;
const projectId = document.getElementById("issue-project").value;
sessionStorage.setItem(`summary-${projectId}`, summary);
}
htmx.onLoad(function(){
function onProjectChange(evt) {
const projectId = evt.currentTarget.value;
localStorage.setItem(`preferred-project`, projectId);
}
function restorePreferredProject() {
const preferredProject = localStorage.getItem(`preferred-project`);
if (!preferredProject) return;
const projectElement = document.getElementById("issue-project");
if (!projectElement) return;
if (preferredProject === projectElement.value) return;
projectElement.value = preferredProject;
projectElement.dispatchEvent(new Event('change'));
}
function restoreLastSummary() {
const summaryTextarea = document.getElementById("issue-summary");
if (!summaryTextarea) return;
const summary = summaryTextarea.value;
if (summary !== "") return;
const projectId = document.getElementById("issue-project").value;
@ -120,6 +167,11 @@ templ IssuePage(vmodel IssuePageVModel) {
const savedSummary = sessionStorage.getItem(`summary-${projectId}`);
if (!savedSummary) return;
summaryTextarea.value = savedSummary;
}
htmx.onLoad(function(){
restoreLastSummary();
restorePreferredProject();
})
</script>
}