feat: pull request generation

This commit is contained in:
2025-03-06 22:47:02 +01:00
parent 4d6459fae5
commit 367f9f9e70
28 changed files with 1918 additions and 181 deletions

View File

@ -40,7 +40,7 @@ func NewIssueSummaryForm() *form.Form {
form.NewField(
"project",
form.Attrs{},
form.NonEmpty("Ce champs ne doit pas être vide."),
form.NonEmpty("Ce champ ne doit pas être vide."),
),
form.NewField(
"summary",
@ -85,31 +85,21 @@ func NewIssueForm() *form.Form {
}
templ IssuePage(vmodel IssuePageVModel) {
@common.Page(common.WithTitle("Nouvelle demande")) {
<div class="container is-fluid">
<section class="section">
<div class="level is-mobile">
<div class="level-left">
<h1 class="title is-size-1"><span class="has-text-info-light">Clear</span><span>Case</span></h1>
</div>
<div class="level-right">
<div class="buttons is-right level-item">
<a class="button is-medium" href={ common.BaseURL(ctx, common.WithPath("/auth/logout")) }><span class="icon"><i class="fa fa-sign-out-alt"></i></span></a>
</div>
</div>
@common.AppPage(common.WithPageOptions(
common.WithTitle("Nouvelle demande"),
)) {
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>
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">
<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}`)
}
@ -117,83 +107,81 @@ templ IssuePage(vmodel IssuePageVModel) {
window.open(issueUrl, "_blank");
}
</script>
@templ.JSFuncCall("clearSummary", vmodel.SelectedProjectID)
@templ.JSFuncCall("openIssue", vmodel.IssueURL)
}
<div class="columns">
<div class="column is-4">
<form id="summary-form" action={ common.CurrentURL(ctx) } method="put" hx-disabled-elt="textarea, input, select, button" hx-on:htmx:before-send="savePreferredProject()" hx-indicator="#generation-progress">
<h2 class="title is-size-3">Résumé de la demande</h2>
@common.FormSelect(
vmodel.SummaryForm, "issue-project", "project", "Projet",
common.WithOptions(projectsToOptions(vmodel.Projects)...),
common.WithAttrs(
"hx-get", string(common.CurrentURL(ctx, common.WithoutValues("project", "*"))),
"hx-target", "body",
"hx-push-url", "true",
),
)
@common.FormTextarea(
vmodel.SummaryForm, "issue-summary", "summary", "Résumé",
common.WithTextareaAttrs(
"hx-on:change", "onSummaryChange(event)",
),
)
<details class="my-3">
<summary class="is-clickable">Paramètres avancés</summary>
@common.FormTextarea(
vmodel.SummaryForm, "issue-template", "template", "Surcharger le modèle de demande",
common.WithTextareaAttrs(
"hx-on:change", "onIssueTemplateChange(event)",
),
)
</details>
<div class="buttons is-right">
<button type="submit" class="button is-info is-large">
<span class="icon">
<i class="fa fa-robot"></i>
</span>
<span>Générer</span>
</button>
</div>
</form>
@templ.JSFuncCall("clearSummary", vmodel.SelectedProjectID)
@templ.JSFuncCall("openIssue", vmodel.IssueURL)
}
<div class="columns">
<div class="column is-4">
<form id="summary-form" action={ common.CurrentURL(ctx) } method="put" hx-disabled-elt="textarea, input, select, button" hx-on:htmx:before-send="savePreferredProject()" hx-indicator="#generation-progress">
<h2 class="title is-size-3">Résumé de la demande</h2>
@common.FormSelect(
vmodel.SummaryForm, "issue-project", "project", "Projet",
common.WithOptions(projectsToOptions(vmodel.Projects)...),
common.WithAttrs(
"hx-get", string(common.CurrentURL(ctx, common.WithoutValues("project", "*"))),
"hx-target", "body",
"hx-push-url", "true",
),
)
@common.FormTextarea(
vmodel.SummaryForm, "issue-summary", "summary", "Résumé",
common.WithTextareaAttrs(
"hx-on:change", "onSummaryChange(event)",
),
)
<details class="my-3">
<summary class="is-clickable">Paramètres avancés</summary>
@common.FormTextarea(
vmodel.SummaryForm, "issue-template", "template", "Surcharger le modèle de demande",
common.WithTextareaAttrs(
"hx-on:change", "onIssueTemplateChange(event)",
),
)
</details>
<div class="buttons is-right">
<button type="submit" class="button is-info is-large">
<span class="icon">
<i class="fa fa-robot"></i>
</span>
<span>Générer</span>
</button>
</div>
<div class="column">
<h2 class="title is-size-3">Votre demande</h2>
<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-info is-large">
<span class="icon">
<i class="fa fa-rocket"></i>
</span>
<span>Créer</span>
</button>
</div>
</form>
</form>
</div>
<div class="column">
<h2 class="title is-size-3">Votre demande</h2>
<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-info is-large">
<span class="icon">
<i class="fa fa-rocket"></i>
</span>
<span>Créer</span>
</button>
</div>
</div>
<progress id="generation-progress" class="htmx-indicator progress"></progress>
if vmodel.IssueTips != "" {
{{ html := markdownToHTML(ctx, vmodel.IssueTips) }}
if html != "" {
<article class="message is-info mt-5">
<div class="message-header">
<p><span class="icon"><i class="fa fa-lightbulb"></i></span>Questionnements</p>
<button class="delete" aria-label="delete" hx-on:click="onCloseMessage(this)"></button>
</div>
<div class="message-body">
<div class="content">
<p>Utilisez ces quelques questions pour réfléchir aux éléments d'informations nécessaire à la bonne rédaction de votre demande:</p>
@templ.Raw(html)
</div>
</div>
</article>
}
}
</section>
</form>
</div>
</div>
<progress id="generation-progress" class="htmx-indicator progress"></progress>
if vmodel.IssueTips != "" {
{{ html := markdownToHTML(ctx, vmodel.IssueTips) }}
if html != "" {
<article class="message is-info mt-5">
<div class="message-header">
<p><span class="icon"><i class="fa fa-lightbulb"></i></span>Questionnements</p>
<button class="delete" aria-label="delete" hx-on:click="onCloseMessage(this)"></button>
</div>
<div class="message-body">
<div class="content">
<p>Utilisez ces quelques questions pour réfléchir aux éléments d'informations nécessaire à la bonne rédaction de votre demande:</p>
@templ.Raw(html)
</div>
</div>
</article>
}
}
<script type="text/javascript">
function onCloseMessage(closeElement) {
closeElement.closest('.message').style.display = 'none';