Compare commits

...

11 Commits

Author SHA1 Message Date
StephanRichter 747f829ded Merge branch 'main' into module/journal 2026-05-04 20:58:10 +02:00
StephanRichter 9417c60346 Merge branch 'accounting'
Build Docker Image / Docker-Build (push) Successful in 2m36s
Build Docker Image / Clean-Registry (push) Successful in 4s
2026-05-04 20:57:29 +02:00
StephanRichter f8db846369 Merge branch 'improvement/autocomplete'
Build Docker Image / Docker-Build (push) Successful in 3m3s
Build Docker Image / Clean-Registry (push) Successful in 4s
2026-05-04 20:53:48 +02:00
StephanRichter dee494f7ca implemented dropping transaction by clearing amount, source or destination field
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
2026-05-04 15:27:51 +02:00
StephanRichter a261d8eb9b Merge branch 'main' into accounting 2026-05-04 15:20:40 +02:00
StephanRichter dbd84f193e working on translations
Build Docker Image / Docker-Build (push) Successful in 3m8s
Build Docker Image / Clean-Registry (push) Successful in 3s
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
2026-05-04 15:13:44 +02:00
StephanRichter fa395b5a33 gui improvements
Build Docker Image / Docker-Build (push) Successful in 3m1s
Build Docker Image / Clean-Registry (push) Successful in 4s
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
2026-05-04 14:38:57 +02:00
StephanRichter 71309011a0 improving autocomplete
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
2026-04-24 11:45:34 +02:00
StephanRichter 4ded399972 Merge branch 'main' into module/journal 2026-04-23 23:35:24 +02:00
StephanRichter 8392edf408 Merge branch 'main' into module/journal 2026-04-22 08:26:07 +02:00
StephanRichter 9c80e0d77c preparing for journal with timestamps
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
2026-04-22 08:24:54 +02:00
7 changed files with 31 additions and 10 deletions
@@ -295,7 +295,7 @@ public class SqliteDb extends BaseDb implements AccountDb {
}
} else if (transaction.isDirty()) {
try {
if (transaction.amount() == 0) {
if (transaction.amount() == 0 || transaction.source().isEmpty() || transaction.destination().isEmpty()) {
delete().from(TABLE_TRANSACTIONS).where(Field.ID, equal(transaction.id())).where(ACCOUNT, equal(transaction.accountId())).execute(db);
} else {
replaceInto(TABLE_TRANSACTIONS, Field.ID, Field.ACCOUNT, Field.TIMESTAMP, Field.SOURCE, Field.DESTINATION, Field.AMOUNT, Field.DESCRIPTION)
@@ -6,6 +6,9 @@ import de.srsoftware.umbrella.core.constants.Field;
import java.util.HashMap;
import java.util.Map;
import static de.srsoftware.tools.Optionals.isSet;
import static de.srsoftware.tools.Optionals.nullIfEmpty;
public class IdOrString implements Mappable {
private final Long id;
private final String value;
@@ -52,6 +55,10 @@ public class IdOrString implements Mappable {
return map;
}
public boolean isEmpty() {
return id == null && !isSet(value);
}
@Override
public String toString() {
return value;
@@ -60,4 +67,4 @@ public class IdOrString implements Mappable {
public String value(){
return value;
}
}
}
@@ -155,5 +155,8 @@
{/if}
{:else}
<Display classes={{editable}} markdown={value} {onclick} {oncontextmenu} title={t('right_click_to_edit')} wrapper={type} />
{#if !value.display}
<button onclick={oncontextmenu}>{t('add_object',{object:t('content')})}</button>
{/if}
{/if}
</div>
+2 -1
View File
@@ -200,9 +200,10 @@
<LineEditor bind:value={project.name} editable={true} onSet={val => update({name:val})} />
</div>
<div>
<button onclick={kanban}>{t('show_kanban')}</button>
{t('options')}
</div>
<div>
<button onclick={kanban}><span class="symbol"></span> {t('show_kanban')}</button>
<button onclick={toggleSettings}><span class="symbol"></span> {t('settings')}</button>
</div>
<div>{t('state')}</div>
@@ -13,6 +13,8 @@ import de.srsoftware.umbrella.core.BaseDb;
import de.srsoftware.umbrella.messagebus.events.Event;
import java.sql.Connection;
import java.sql.SQLException;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
public class SqliteDb extends BaseDb implements JournalDb{
public SqliteDb(Connection connection) {
@@ -33,13 +35,14 @@ public class SqliteDb extends BaseDb implements JournalDb{
var sql = """
CREATE TABLE IF NOT EXISTS {0} (
{1} INTEGER PRIMARY KEY,
{2} INTEGER,
{3} VARCHAR(255) NOT NULL,
{4} VARCHAR(16) NOT NULL,
{5} TEXT
{2} LONG NOT NULL,
{3} INTEGER,
{4} VARCHAR(255) NOT NULL,
{5} VARCHAR(16) NOT NULL,
{6} TEXT
);
""";
sql = format(sql,TABLE_JOURNAL,ID,USER_ID,MODULE,ACTION,DESCRIPTION);
sql = format(sql,TABLE_JOURNAL,ID,TIMESTAMP,USER_ID,MODULE,ACTION,DESCRIPTION);
try {
db.prepareStatement(sql).execute();
} catch (SQLException e) {
@@ -50,8 +53,9 @@ public class SqliteDb extends BaseDb implements JournalDb{
@Override
public void logEvent(Event<?> event) {
try {
insertInto(TABLE_JOURNAL,USER_ID,MODULE,ACTION,DESCRIPTION)
.values(event.initiator().id(), event.module(), event.eventType(), event.describe())
var timestamp = LocalDateTime.now().toEpochSecond(ZoneOffset.UTC);
insertInto(TABLE_JOURNAL,TIMESTAMP,USER_ID,MODULE,ACTION,DESCRIPTION)
.values(timestamp,event.initiator().id(), event.module(), event.eventType(), event.describe())
.execute(db).close();
} catch (SQLException e) {
throw databaseException(ERROR_WRITE_EVENT,event.eventType(),event.initiator().name());
+3
View File
@@ -192,6 +192,8 @@
"items": "Artikel",
"join_objects" : "{objects} zusammenführen",
"kanban": "Kanban",
"key": "Suchbegriff",
"language": "Sprache",
@@ -307,6 +309,7 @@
"project ({id})": "Projekt ({id})",
"Project '{project}' was edited": "Projekt '{project}' wurde bearbeitet",
"projects": "Projekte",
"Projects": "Projekte",
"properties": "Eigenschaften",
"property": "Eigenschaft",
"purpose": "Zweck",
+3
View File
@@ -192,6 +192,8 @@
"items": "items",
"join_objects" : "join {objects}",
"kanban": "Kanban",
"key": "search term",
"language": "language",
@@ -307,6 +309,7 @@
"project ({id})": "project ({id})",
"Project '{project}' was edited": "Project '{project}' was edited",
"projects": "projects",
"Projects": "projects",
"properties": "properties",
"property": "property",
"purpose": "purpose",