diff --git a/documents/src/main/java/de/srsoftware/umbrella/documents/model/Document.java b/documents/src/main/java/de/srsoftware/umbrella/documents/model/Document.java index 1f9bfca..06588de 100644 --- a/documents/src/main/java/de/srsoftware/umbrella/documents/model/Document.java +++ b/documents/src/main/java/de/srsoftware/umbrella/documents/model/Document.java @@ -212,8 +212,8 @@ public final class Document implements Mappable { map.put(DATE, date); map.put(STATE, state.code); map.put(FIELD_DELIVERY, delivery); - map.put(FIELD_HEAD, markdown(head)); - map.put(FIELD_FOOTER, markdown(footer)); + map.put(FIELD_HEAD, Map.of(SOURCE,head,RENDERED,markdown(head))); + map.put(FIELD_FOOTER, Map.of(SOURCE,footer,RENDERED,markdown(footer))); map.put(FIELD_CURRENCY, currency); map.put(SENDER, sender.toMap()); map.put(FIELD_CUSTOMER, customer.toMap()); diff --git a/frontend/src/Components/LineEditor.svelte b/frontend/src/Components/LineEditor.svelte index de10dd7..1d12716 100644 --- a/frontend/src/Components/LineEditor.svelte +++ b/frontend/src/Components/LineEditor.svelte @@ -24,6 +24,16 @@ } + + {#if editable && editing} {:else} diff --git a/frontend/src/Components/MarkdownEditor.svelte b/frontend/src/Components/MarkdownEditor.svelte index 4b2fa27..89acef9 100644 --- a/frontend/src/Components/MarkdownEditor.svelte +++ b/frontend/src/Components/MarkdownEditor.svelte @@ -45,6 +45,13 @@ width: 100%; min-height: 100px; } + div{ + min-width: 40px; + min-height: 20px; + } + div:hover{ + border: 1px dotted; + } {#if editable && editing} diff --git a/frontend/src/routes/document/View.svelte b/frontend/src/routes/document/View.svelte index 893a53a..d742973 100644 --- a/frontend/src/routes/document/View.svelte +++ b/frontend/src/routes/document/View.svelte @@ -2,6 +2,7 @@ import { onMount } from 'svelte'; import { t } from '../../translations.svelte.js'; import { useTinyRouter } from 'svelte-tiny-router'; + import MarkdownEditor from '../../Components/MarkdownEditor.svelte'; import PositionList from './PositionList.svelte'; import StateSelector from './StateSelector.svelte'; import TemplateSelector from './TemplateSelector.svelte'; @@ -9,6 +10,9 @@ let error = null; let doc = $state(null); + let editable = $derived(doc.state == 1); + + async function loadDoc(){ const url = `${location.protocol}//${location.host.replace('5173','8080')}/api/document/${id}`; const resp = await fetch(url,{credentials:'include'}); @@ -39,42 +43,59 @@ {#if doc}
{t('document.customer')} -
- {#each doc.customer.name.split("\n") as line} - {line}
- {/each} -
-
- {t('document.customer_number',doc.customer.id)} -
-
- {t('document.tax_id',doc.customer.tax_id)} -
-
- {t('document.email',doc.customer.email)} -
+ + + + + + + + + + + + + + + + + + +
+ {#each doc.customer.name.split("\n") as line} + {line}
+ {/each} +
{t('document.customer_id')}:{doc.customer.id}
{t('document.tax_id')}:{doc.customer.tax_id}
{t('document.email')}:{doc.customer.email}
{t('document.sender')} -
- {#each doc.sender.name.split("\n") as line} - {line}
- {/each} -
-
- {t('document.court',doc.sender.court)} -
-
- {t('document.tax_id',doc.sender.tax_id)} -
-
- - {t('document.bank_account')}: - {#each doc.sender.bank_account.split("\n") as line} - {line}
- {/each} -
-
+ + + + + + + + + + + + + + + + + + +
+ {#each doc.sender.name.split("\n") as line} + {line}
+ {/each} +
{t('document.court')}:{doc.sender.court}
{t('document.tax_id')}:{doc.sender.tax_id}
{t('document.bank_account')}: + {#each doc.sender.bank_account.split("\n") as line} + {line}
+ {/each} +
{t('document.type_'+doc.type)} @@ -86,7 +107,7 @@
{t('document.head')} - {@html doc.head} +
{t('document.positions')} @@ -94,7 +115,7 @@
{t('document.footer')} - {@html doc.footer} +
{t('document.actions')} diff --git a/translations/src/main/resources/de.json b/translations/src/main/resources/de.json index 6128fa6..ad1748a 100644 --- a/translations/src/main/resources/de.json +++ b/translations/src/main/resources/de.json @@ -5,19 +5,23 @@ "document": { "actions": "Aktionen", "add_new": "{0} anlegen", - "bank_account": "Bankverbindung: {0}", - "court": "Amtsgericht: {0}", + "amount": "Menge", + "bank_account": "Bankverbindung", + "code": "Code", + "court": "Amtsgericht", "create_new": "neues Dokument", "customer": "Kunde", "customer_address": "Adresse", "customer_id": "Kundennummer", "date": "Datum", "delete": "löschen", - "email": "E-Mail: {0}", + "email": "E-Mail", "gross_sum": "Brutto-Summe", "list": "Dokumente", "list_of": "Dokumente von {0}", + "net_price": "Nettopreis", "number": "Nummer", + "pos": "Pos", "select_company" : "Wählen Sie eine ihrer Firmen:", "select_customer": "Kunde auswählen", "sender": "Absender", @@ -32,12 +36,16 @@ "state_new":"neu", "state_payed": "bezahlt", "state_sent": "versendet", - "tax_id": "Steuernummer: {0}", + "tax_id": "Steuernummer", + "tax_rate": "Steuersatz", + "title_or_desc": "Titel/Beschreibung", "type": "Dokumententyp", "type_confirmation": "Bestätigung", "type_invoice": "Rechnung", "type_offer": "Angebot", - "type_reminder": "Erinnerung" + "type_reminder": "Erinnerung", + "unit": "Einheit", + "unit_price": "Preis/Einheit" }, "footer": { "message" : "Umbrella ist ein Produkt von {0}." diff --git a/web/src/main/resources/web/css/default.css b/web/src/main/resources/web/css/default.css index 0c36e54..6cb6d3c 100644 --- a/web/src/main/resources/web/css/default.css +++ b/web/src/main/resources/web/css/default.css @@ -30,11 +30,12 @@ button{ border-color: yellow red red yellow; } footer { - position: absolute; + position: sticky; bottom: 0; width: 100%; text-align: center; margin: 5px; + background: black; } nav { position: sticky;