From 48dfabaaf36621f608a46659855a4f00feef9360 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Thu, 10 Jul 2025 20:38:13 +0200 Subject: [PATCH] implemented selector for document state --- .../umbrella/documents/Constants.java | 12 ++++--- .../umbrella/documents/DocumentApi.java | 9 ++++++ frontend/src/routes/document/List.svelte | 3 +- .../src/routes/document/StateSelector.svelte | 31 ++++++++++++++++--- .../src/routes/document/TypeSelector.svelte | 4 +-- frontend/src/routes/document/View.svelte | 27 ++++++++++++---- translations/src/main/resources/de.json | 2 ++ web/src/main/resources/web/css/default.css | 7 +++++ 8 files changed, 76 insertions(+), 19 deletions(-) diff --git a/documents/src/main/java/de/srsoftware/umbrella/documents/Constants.java b/documents/src/main/java/de/srsoftware/umbrella/documents/Constants.java index 757df37..c11a5a5 100644 --- a/documents/src/main/java/de/srsoftware/umbrella/documents/Constants.java +++ b/documents/src/main/java/de/srsoftware/umbrella/documents/Constants.java @@ -9,13 +9,17 @@ import java.util.regex.Pattern; public class Constants { private Constants(){} + public static final Pattern POST_CODE = compile("(.*\\w+.*)\n(.*\\d+.*)\n(\\d{5}) (\\w+)",DOTALL); + public static final String COMPANIES = "companies"; + public static final String COMPANY = "company"; + public static final String CONFIG_DATABASE = "umbrella.modules.document.database"; public static final String CONTACTS = "contacts"; + public static final String CUSTOMERS = "customers"; public static final String ERROR_ADDRESS_MISSING = "{0} address does not contain street address / post code / city"; - public static final String PROJECT_ID = "project_id"; public static final String FIELD_AMOUNT = "amount"; @@ -75,6 +79,9 @@ public class Constants { public static final String PATH_POSITIONS = "positions"; public static final String PATH_SEND = "send"; public static final String PATH_TYPES = "types"; + public static final String PROJECT_ID = "project_id"; + + public static final String STATES = "states"; public static final String TABLE_COMPANY_SETTINGS = "company_settings"; public static final String TABLE_CUSTOMER_SETTINGS = "company_customer_settings"; @@ -84,7 +91,4 @@ public class Constants { public static final String TABLE_PRICES = "customer_prices"; public static final String TABLE_TEMPLATES = "templates"; - public static final String COMPANIES = "companies"; - public static final String COMPANY = "company"; - public static final String CUSTOMERS = "customers"; } diff --git a/documents/src/main/java/de/srsoftware/umbrella/documents/DocumentApi.java b/documents/src/main/java/de/srsoftware/umbrella/documents/DocumentApi.java index 7470920..2d58edd 100644 --- a/documents/src/main/java/de/srsoftware/umbrella/documents/DocumentApi.java +++ b/documents/src/main/java/de/srsoftware/umbrella/documents/DocumentApi.java @@ -28,8 +28,11 @@ import de.srsoftware.umbrella.documents.model.*; import java.io.IOException; import java.time.LocalDate; import java.util.HashMap; +import java.util.List; import java.util.Optional; import java.util.stream.Collectors; +import java.util.stream.Stream; + import org.json.JSONArray; import org.json.JSONObject; @@ -92,6 +95,7 @@ public class DocumentApi extends BaseHandler { case COMPANIES -> getCompanies(ex,user.get(),token.orElse(null)); case CONTACTS -> getContacts(ex,user.get(),token.orElse(null)); case PATH_TYPES -> getDocTypes(ex); + case STATES -> getDocStates(ex); case null -> super.doGet(path,ex); default -> { try { @@ -136,6 +140,11 @@ public class DocumentApi extends BaseHandler { return sendContent(ex,getLegacyContacts(ex,user,token)); } + private boolean getDocStates(HttpExchange ex) throws IOException { + var map = Stream.of(Document.State.values()).collect(Collectors.toMap(Document.State::code, Document.State::name)); + return sendContent(ex,map); + } + private boolean getDocTypes(HttpExchange ex) throws UmbrellaException, IOException { var types = db.listTypes(); var map = types.values().stream().collect(Collectors.toMap(Type::id, Type::name)); diff --git a/frontend/src/routes/document/List.svelte b/frontend/src/routes/document/List.svelte index 46f3ccc..8bb1765 100644 --- a/frontend/src/routes/document/List.svelte +++ b/frontend/src/routes/document/List.svelte @@ -85,8 +85,7 @@ {t('document.state')} {t('document.actions')} - {docType} - + diff --git a/frontend/src/routes/document/StateSelector.svelte b/frontend/src/routes/document/StateSelector.svelte index d827f62..dd9d8e6 100644 --- a/frontend/src/routes/document/StateSelector.svelte +++ b/frontend/src/routes/document/StateSelector.svelte @@ -1,7 +1,30 @@ - \ No newline at end of file +{#if states} + +{:else} +{message} +{/if} \ No newline at end of file diff --git a/frontend/src/routes/document/TypeSelector.svelte b/frontend/src/routes/document/TypeSelector.svelte index d14513a..775762a 100644 --- a/frontend/src/routes/document/TypeSelector.svelte +++ b/frontend/src/routes/document/TypeSelector.svelte @@ -7,7 +7,7 @@ async function loadTypes(){ const url = `${location.protocol}//${location.host.replace('5173','8080')}/api/document/types`; - var resp = await fetch(url,{ credentials: 'include'}); + var resp = await fetch(url,{credentials: 'include'}); if (resp.ok){ types = await resp.json(); } else { @@ -16,8 +16,6 @@ } onMount(loadTypes) - - {#if types} diff --git a/frontend/src/routes/document/View.svelte b/frontend/src/routes/document/View.svelte index 5014194..200470b 100644 --- a/frontend/src/routes/document/View.svelte +++ b/frontend/src/routes/document/View.svelte @@ -17,6 +17,16 @@ } } + function changeState(newVal){ + if (doc.state == 1 || confirm(t('document.confirm_state'))){ + doc.state = newVal; + } else { + const dummy = doc.state; + doc.state = null; // we need to alter in between, + doc.state = dummy; // otherwise the state will not be re-set + } + } + onMount(loadDoc); @@ -25,7 +35,7 @@ {/if} {#if doc} -
+
{t('document.customer')}
{#each doc.customer.name.split("\n") as line} @@ -42,7 +52,7 @@ {t('document.email',doc.customer.email)}
-
+
{t('document.sender')}
{#each doc.sender.name.split("\n") as line} @@ -56,18 +66,23 @@ {t('document.tax_id',doc.sender.tax_id)}
- {t('document.bank_account',doc.sender.bank_account)} + + {t('document.bank_account')}: + {#each doc.sender.bank_account.split("\n") as line} + {line}
+ {/each} +
-
+
{t('document.type_'+doc.type)}
{t('document.number')}: {doc.number}
-
{t('document.state')}:
+
{t('document.state')}:
{t('document.date')}: {doc.date}
{t('document.delivery')}: {doc.delivery}
{t('document.template')}: {doc.template.name} SElektor hier!
-
+
{t('document.head')} {doc.head}
diff --git a/translations/src/main/resources/de.json b/translations/src/main/resources/de.json index 75d5455..6128fa6 100644 --- a/translations/src/main/resources/de.json +++ b/translations/src/main/resources/de.json @@ -27,6 +27,8 @@ "sender_tax_id": "Steuernummer", "state": "Status", "state_declined": "abgelehnt", + "state_delayed": "verspätet", + "state_error": "Fehler", "state_new":"neu", "state_payed": "bezahlt", "state_sent": "versendet", diff --git a/web/src/main/resources/web/css/default.css b/web/src/main/resources/web/css/default.css index 2d5e22e..b65a3b2 100644 --- a/web/src/main/resources/web/css/default.css +++ b/web/src/main/resources/web/css/default.css @@ -49,4 +49,11 @@ fieldset[tabindex="0"]{ fieldset[tabindex="0"]:focus-within{ max-height: unset; +} +.left{ + float: left; +} + +.clear{ + clear: both; } \ No newline at end of file