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