From 600b0f2cf467a8ae6f7a69e0d81a86bbf4cd5248 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Fri, 28 Nov 2025 20:38:45 +0100 Subject: [PATCH] working on event handlers for mobile devices Signed-off-by: Stephan Richter --- build.gradle.kts | 2 +- frontend/src/routes/task/EasyList.svelte | 70 +++++++++++++++---- .../de/srsoftware/umbrella/tags/SqliteDb.java | 20 +++--- 3 files changed, 66 insertions(+), 26 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 185edfd..a1a5076 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -41,7 +41,7 @@ subprojects { testImplementation(platform("org.junit:junit-bom:5.10.0")) testImplementation("org.junit.jupiter:junit-jupiter") implementation("de.srsoftware:configuration.api:1.0.2") - implementation("de.srsoftware:tools.jdbc:2.0.2") + implementation("de.srsoftware:tools.jdbc:2.0.3") implementation("de.srsoftware:tools.http:6.0.5") implementation("de.srsoftware:tools.mime:1.1.3") implementation("de.srsoftware:tools.logging:1.3.2") diff --git a/frontend/src/routes/task/EasyList.svelte b/frontend/src/routes/task/EasyList.svelte index 81183d7..96727be 100644 --- a/frontend/src/routes/task/EasyList.svelte +++ b/frontend/src/routes/task/EasyList.svelte @@ -16,17 +16,15 @@ let router = useTinyRouter(); let sorted = $derived(tasks ? Object.values(tasks).filter(noNoIndex).sort(byName) : null); + let start = 0; + let x = 0; + let y = 0; + + function byName(a,b){ return a.name.localeCompare(b.name); } - - function close(e,task){ - e.stopPropagation(); - e.preventDefault(); - update(task,60); - } - function goTag(e,newTag){ e.preventDefault(); e.stopPropagation(); @@ -39,9 +37,8 @@ const url = api(`task/tagged/${tag}`); const res = await get(url); if (res.ok){ - tasks = await res.json(); - console.log(Object.values(tasks).map(t => t.name)); yikes(); + tasks = await res.json(); input.focus(); } else error(res); } @@ -50,6 +47,12 @@ return !task.no_index; } + function ignore(evt){ + evt.preventDefault(); + evt.stopPropagation(); + return false; + } + function extend(e,task){ e.preventDefault(); e.stopPropagation(); @@ -57,10 +60,47 @@ return false; } - function open(e,task){ - e.stopPropagation(); - e.preventDefault(); - update(task,20); + + function getTask(evt){ + var link = evt.target; + var id = link.getAttribute('task_id'); + return tasks[id]; + } + + function onclick(evt) { + let task = getTask(evt); + if (task.status <= 20) { // open + update(task,60); + } else update(task,20); + return ignore(evt); + } + + function oncontextmenu(evt) { + highlight = getTask(evt); + return ignore(evt); + } + + function ontouchstart(evt){ + start = evt.timeStamp; + x = evt.touches[0].clientX; + y = evt.touches[0].clientY; + return ignore(evt); + } + + function ontouchend(evt){ + let d = Math.abs(x - evt.changedTouches[0].clientX) + Math.abs(y - evt.changedTouches[0].clientY); + measured(evt, evt.timeStamp - start, d); + return ignore(evt); + } + + + function measured(evt,duration,d){ + if (d > 100) return; + if (duration < 500){ + onclick(evt); + } else { + oncontextmenu(evt); + } } async function update(task,newState){ @@ -87,7 +127,7 @@ {#if sorted} {#each sorted as task} {#if task.status == 20 && (!filter || task.name.toLowerCase().includes(search))} - close(e,task)} oncontextmenu={e => extend(e,task)} > + {task.name} {#if highlight == task} @@ -103,7 +143,7 @@ {#if sorted} {#each sorted as task} {#if task.status > 20 && (!filter || task.name.toLowerCase().includes(search))} - open(e,task)} oncontextmenu={e => extend(e,task)} > + {task.name} {#if highlight == task} diff --git a/tags/src/main/java/de/srsoftware/umbrella/tags/SqliteDb.java b/tags/src/main/java/de/srsoftware/umbrella/tags/SqliteDb.java index 3f9d80e..db33e60 100644 --- a/tags/src/main/java/de/srsoftware/umbrella/tags/SqliteDb.java +++ b/tags/src/main/java/de/srsoftware/umbrella/tags/SqliteDb.java @@ -204,10 +204,10 @@ CREATE TABLE IF NOT EXISTS {0} ( public String delete(long userId, String module, long entityId, String tag) { try { Query.delete().from(TABLE_TAGS) - .where(TAG,equal(tag)).where(MODULE,equal(module)).where(ENTITY_ID,equal(entityId)).where(USER_ID,equal(userId)) + .where(TAG,iEqual(tag)).where(MODULE,iEqual(module)).where(ENTITY_ID,equal(entityId)).where(USER_ID,equal(userId)) .execute(db); Query.delete().from(TABLE_TAGS) - .where(TAG,equal(tag)).where(MODULE,equal(module)).where(ENTITY_ID,equal(entityId)).where(USER_ID,isNull()) + .where(TAG,iEqual(tag)).where(MODULE,iEqual(module)).where(ENTITY_ID,equal(entityId)).where(USER_ID,isNull()) .execute(db); return tag; } catch (SQLException e){ @@ -219,7 +219,7 @@ CREATE TABLE IF NOT EXISTS {0} ( public void deleteEntity(String module, long entityId) { try { Query.delete().from(TABLE_TAGS) - .where(MODULE,equal(module)).where(ENTITY_ID,equal(entityId)) + .where(MODULE,iEqual(module)).where(ENTITY_ID,equal(entityId)) .execute(db); } catch (SQLException e){ throw new UmbrellaException("Failed to save tags ({0} {1})",module,entityId); @@ -229,7 +229,7 @@ CREATE TABLE IF NOT EXISTS {0} ( @Override public Map> getUses(String tag, long userId) { try { - var rs = select(ALL).from(TABLE_TAGS).where(TAG,equal(tag)).where(USER_ID,equal(userId)).exec(db); + var rs = select(ALL).from(TABLE_TAGS).where(TAG,iEqual(tag)).where(USER_ID,equal(userId)).exec(db); var result = new HashMap>(); while (rs.next()){ var module = rs.getString(MODULE); @@ -237,7 +237,7 @@ CREATE TABLE IF NOT EXISTS {0} ( result.computeIfAbsent(module, k -> new ArrayList<>()).add(entityId); } rs.close(); - rs = select(ALL).from(TABLE_TAGS).where(TAG,equal(tag)).where(USER_ID,isNull()).exec(db); + rs = select(ALL).from(TABLE_TAGS).where(TAG,iEqual(tag)).where(USER_ID,isNull()).exec(db); while (rs.next()){ var module = rs.getString(MODULE); var entityId = rs.getLong(ENTITY_ID); @@ -256,12 +256,12 @@ CREATE TABLE IF NOT EXISTS {0} ( var tags = new HashSet(); // load tags assigned to user - var rs = select(TAG).from(TABLE_TAGS).where(MODULE,equal(module)).where(ENTITY_ID,equal(entityId)).where(USER_ID,equal(userId)).exec(db); + var rs = select(TAG).from(TABLE_TAGS).where(MODULE,iEqual(module)).where(ENTITY_ID,equal(entityId)).where(USER_ID,equal(userId)).exec(db); while (rs.next()) tags.add(rs.getString(1)); rs.close(); // load tags assigned to no user - rs = select(TAG).from(TABLE_TAGS).where(MODULE,equal(module)).where(ENTITY_ID,equal(entityId)).where(USER_ID,isNull()).exec(db); + rs = select(TAG).from(TABLE_TAGS).where(MODULE,iEqual(module)).where(ENTITY_ID,equal(entityId)).where(USER_ID,isNull()).exec(db); while (rs.next()) tags.add(rs.getString(1)); rs.close(); return tags; @@ -294,12 +294,12 @@ CREATE TABLE IF NOT EXISTS {0} ( var tags = new HashMap>(); // load tags assigned to user - var rs = select(ENTITY_ID,TAG).from(TABLE_TAGS).where(MODULE,equal(module)).where(ENTITY_ID,in(entityIds.toArray())).where(USER_ID,equal(userId)).exec(db); + var rs = select(ENTITY_ID,TAG).from(TABLE_TAGS).where(MODULE,iEqual(module)).where(ENTITY_ID,in(entityIds.toArray())).where(USER_ID,equal(userId)).exec(db); while (rs.next()) tags.computeIfAbsent(rs.getLong(ENTITY_ID), k -> new HashSet<>()).add(rs.getString(TAG)); rs.close(); // load tags assigned to no user - rs = select(ENTITY_ID,TAG).from(TABLE_TAGS).where(MODULE,equal(module)).where(ENTITY_ID,in(entityIds.toArray())).where(USER_ID,isNull()).exec(db); + rs = select(ENTITY_ID,TAG).from(TABLE_TAGS).where(MODULE,iEqual(module)).where(ENTITY_ID,in(entityIds.toArray())).where(USER_ID,isNull()).exec(db); while (rs.next()) tags.computeIfAbsent(rs.getLong(ENTITY_ID), k -> new HashSet<>()).add(rs.getString(TAG)); rs.close(); return tags; @@ -328,7 +328,7 @@ CREATE TABLE IF NOT EXISTS {0} ( @Override public void updateId(String module, Object oldId, Object newId) { try { - update(TABLE_TAGS).set(ENTITY_ID).where(MODULE,equal(module)).where(ENTITY_ID,equal(oldId)).prepare(db).apply(newId).close(); + update(TABLE_TAGS).set(ENTITY_ID).where(MODULE,iEqual(module)).where(ENTITY_ID,equal(oldId)).prepare(db).apply(newId).close(); LOG.log(DEBUG,"Updated tag @ {0}.{1} → {0}.{2}",module,oldId,newId); } catch (SQLException e) { throw databaseException("Failed to update {0}.{1} → {0}.{2}",module,oldId,newId);