151 lines
6.8 KiB
Plaintext
151 lines
6.8 KiB
Plaintext
|
{{ define "title" -}}
|
||
|
{{- /*gotype: dev.tandem.ws/tandem/camper/pkg/invoice.invoiceForm*/ -}}
|
||
|
{{- if .Slug }}
|
||
|
{{ printf ( pgettext "Edit Invoice “%s”" "title" ) .Number }}
|
||
|
{{- else -}}
|
||
|
{{( pgettext "New Invoice" "title" )}}
|
||
|
{{- end -}}
|
||
|
{{- end }}
|
||
|
|
||
|
{{ define "head" -}}
|
||
|
<script src="/static/idiomorph-ext@0.3.0.min.js"></script>
|
||
|
{{- end }}
|
||
|
|
||
|
{{ define "breadcrumb" -}}
|
||
|
<li><a href="./">{{( pgettext "Invoices" "title" )}}</a></li>
|
||
|
{{- end }}
|
||
|
|
||
|
{{ define "content" }}
|
||
|
{{- /*gotype: dev.tandem.ws/tandem/camper/pkg/invoice.invoiceForm*/ -}}
|
||
|
<section id="invoice-dialog-content" data-hx-target="main">
|
||
|
<h2>{{ template "title" . }}</h2>
|
||
|
<form method="POST"
|
||
|
{{ if .Slug }} action="/admin/invoices/{{ .Slug }}/edit" {{ else }} action="/admin/invoices/new" {{ end }}
|
||
|
data-hx-boost="true"
|
||
|
data-hx-ext="morph"
|
||
|
data-hx-swap="morph:innerHTML show:false"
|
||
|
>
|
||
|
{{ CSRFInput }}
|
||
|
|
||
|
{{ with .RemovedProduct -}}
|
||
|
<div role="alert">
|
||
|
<p>{{printf (gettext "Product “%s” removed") .Name.Val }}</p>
|
||
|
<button type="submit"
|
||
|
formnovalidate
|
||
|
name="action" value="restore-product"
|
||
|
>{{( pgettext "Undo" "action" )}}</button>
|
||
|
{{ with .InvoiceProductId }}<input type="hidden" name="{{ .Name }}" value="{{ .Val }}">{{ end }}
|
||
|
{{ with .ProductId }}<input type="hidden" name="{{ .Name }}" value="{{ .Val }}">{{ end }}
|
||
|
{{ with .Name }}<input type="hidden" name="{{ .Name }}" value="{{ .Val }}">{{ end }}
|
||
|
{{ with .Price }}<input type="hidden" name="{{ .Name }}" value="{{ .Val }}">{{ end }}
|
||
|
{{ with .Quantity }}<input type="hidden" name="{{ .Name }}" value="{{ .Val }}">{{ end }}
|
||
|
{{ with .Discount }}<input type="hidden" name="{{ .Name }}" value="{{ .Val }}">{{ end }}
|
||
|
{{ with .Description }}<input type="hidden" name="{{ .Name }}" value="{{ .Val }}">{{ end }}
|
||
|
{{ with .Tax }}<input type="hidden" name="{{ .Name }}" value="{{ .String }}">{{ end }}
|
||
|
</div>
|
||
|
{{- end }}
|
||
|
|
||
|
<fieldset class="invoice-data">
|
||
|
{{ with .Customer -}}
|
||
|
<label>
|
||
|
{{( pgettext "Customer" "input" )}}<br>
|
||
|
<select name="{{ .Name }}"
|
||
|
required
|
||
|
{{ template "error-attrs" . }}
|
||
|
>
|
||
|
<option value="">{{( gettext "Select a customer" )}}</option>
|
||
|
{{ template "list-options" . }}
|
||
|
</select><br>
|
||
|
{{ template "error-message" . }}
|
||
|
</label>
|
||
|
{{- end }}
|
||
|
{{ with .Date -}}
|
||
|
<label>
|
||
|
{{( pgettext "Invoice date" "input" )}}<br>
|
||
|
<input type="date"
|
||
|
required
|
||
|
name="{{ .Name }}"
|
||
|
value="{{ .Val }}"
|
||
|
{{ template "error-attrs" . }}
|
||
|
><br>
|
||
|
{{ template "error-message" . }}
|
||
|
</label>
|
||
|
{{- end }}
|
||
|
{{ with .InvoiceStatus }}
|
||
|
{{ if $.Slug -}}
|
||
|
<label>
|
||
|
{{( pgettext "Invoice status" "input" )}}<br>
|
||
|
<select name="{{ .Name }}"
|
||
|
required
|
||
|
{{ template "error-attrs" . }}
|
||
|
>
|
||
|
{{ template "list-options" . }}
|
||
|
</select><br>
|
||
|
{{ template "error-message" . }}
|
||
|
</label>
|
||
|
{{- else -}}
|
||
|
<input type="hidden" name="{{ .Name }}" value="{{ .String }}">
|
||
|
{{- end }}
|
||
|
{{- end }}
|
||
|
{{ with .Notes -}}
|
||
|
<label>
|
||
|
{{( pgettext "Notes (optional)" "input" )}}<br>
|
||
|
<textarea name="{{ .Name }}"
|
||
|
rows="2"
|
||
|
{{ template "error-attrs" . }}
|
||
|
>{{ .Val }}</textarea><br>
|
||
|
{{ template "error-message" . }}
|
||
|
</label>
|
||
|
{{- end }}
|
||
|
</fieldset>
|
||
|
|
||
|
{{- range .Products }}
|
||
|
{{ template "product-form.gohtml" . }}
|
||
|
{{- end }}
|
||
|
|
||
|
<table id="invoice-summary">
|
||
|
<tbody>
|
||
|
<tr>
|
||
|
<th scope="row">{{(pgettext "Subtotal" "title")}}</th>
|
||
|
<td class="numeric">{{ .Subtotal | formatPrice }}</td>
|
||
|
</tr>
|
||
|
{{- range $tax := .Taxes }}
|
||
|
<tr>
|
||
|
<th scope="row">{{ index . 0 }}</th>
|
||
|
<td class="numeric">{{ index . 1 | formatPrice }}</td>
|
||
|
</tr>
|
||
|
{{- end }}
|
||
|
<tr>
|
||
|
<th scope="row">{{(pgettext "Total" "title")}}</th>
|
||
|
<td class="numeric">{{ .Total | formatPrice }}</td>
|
||
|
</tr>
|
||
|
</tbody>
|
||
|
</table>
|
||
|
|
||
|
<fieldset class="button-bar">
|
||
|
<button formnovalidate
|
||
|
name="action" value="select-products"
|
||
|
data-hx-get="/admin/invoices/product-form"
|
||
|
data-hx-target="#invoice-summary"
|
||
|
data-hx-swap="beforebegin show:bottom"
|
||
|
data-hx-select="unset"
|
||
|
data-hx-vals="js:{index: document.querySelectorAll('.new-invoice-product').length}"
|
||
|
type="submit">{{( pgettext "Add products" "action" )}}</button>
|
||
|
<button formnovalidate
|
||
|
id="recompute-button"
|
||
|
name="action" value="update"
|
||
|
type="submit">{{( pgettext "Update" "action" )}}</button>
|
||
|
<button class="primary" name="action" value="add"
|
||
|
{{ if .Slug }} formmethod="put" formaction="/admin/invoices/{{ .Slug }}" {{ else }} formaction="/admin/invoices" {{ end }}
|
||
|
type="submit">{{( pgettext "Save" "action" )}}</button>
|
||
|
</fieldset>
|
||
|
</form>
|
||
|
</section>
|
||
|
|
||
|
<script>
|
||
|
document.body.addEventListener('recompute', function () {
|
||
|
document.getElementById('recompute-button').click();
|
||
|
});
|
||
|
</script>
|
||
|
{{- end }}
|