Compare commits

..
Author SHA1 Message Date
StephanRichter 68a7052c35 show "loading" while loading parent candidates
Build Docker Image / Clean-Registry (push) Successful in 5s
Build Docker Image / Docker-Build (push) Successful in 3m9s
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
2026-07-01 09:29:52 +02:00
StephanRichter aaf367480b fixed parent selector
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
2026-07-01 09:17:38 +02:00
StephanRichter f5476d7f1c added error message
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
2026-06-30 15:15:54 +02:00
7 changed files with 34 additions and 10 deletions
@@ -14,7 +14,6 @@ import de.srsoftware.umbrella.bookmarks.BookmarkApi;
import de.srsoftware.umbrella.company.CompanyModule; import de.srsoftware.umbrella.company.CompanyModule;
import de.srsoftware.umbrella.contact.ContactModule; import de.srsoftware.umbrella.contact.ContactModule;
import de.srsoftware.umbrella.core.SettingsService; import de.srsoftware.umbrella.core.SettingsService;
import de.srsoftware.umbrella.core.Util;
import de.srsoftware.umbrella.core.exceptions.UmbrellaException; import de.srsoftware.umbrella.core.exceptions.UmbrellaException;
import de.srsoftware.umbrella.documents.DocumentApi; import de.srsoftware.umbrella.documents.DocumentApi;
import de.srsoftware.umbrella.files.FileModule; import de.srsoftware.umbrella.files.FileModule;
@@ -34,7 +33,6 @@ import de.srsoftware.umbrella.translations.Translations;
import de.srsoftware.umbrella.user.UserModule; import de.srsoftware.umbrella.user.UserModule;
import de.srsoftware.umbrella.web.WebHandler; import de.srsoftware.umbrella.web.WebHandler;
import de.srsoftware.umbrella.wiki.WikiModule; import de.srsoftware.umbrella.wiki.WikiModule;
import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
@@ -15,7 +15,6 @@ import static java.lang.System.Logger.Level.*;
import static java.lang.System.Logger.Level.WARNING; import static java.lang.System.Logger.Level.WARNING;
import static java.nio.charset.StandardCharsets.UTF_8; import static java.nio.charset.StandardCharsets.UTF_8;
import com.xrbpowered.jparsedown.JParsedown;
import de.srsoftware.tools.Mappable; import de.srsoftware.tools.Mappable;
import de.srsoftware.tools.Query; import de.srsoftware.tools.Query;
import de.srsoftware.umbrella.core.exceptions.UmbrellaException; import de.srsoftware.umbrella.core.exceptions.UmbrellaException;
@@ -27,12 +26,13 @@ import java.net.URI;
import java.net.URL; import java.net.URL;
import java.security.MessageDigest; import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.time.Instant; import java.time.Instant;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.ZoneId; import java.time.ZoneId;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.regex.Pattern;
import org.json.JSONObject; import org.json.JSONObject;
public class Util { public class Util {
@@ -188,4 +188,19 @@ jspreadsheet(document.getElementById('spreadsheet'), {
public static String dateTimeOf(long epochMilis){ public static String dateTimeOf(long epochMilis){
return LocalDateTime.ofInstant(Instant.ofEpochMilli(epochMilis), ZoneId.systemDefault()).format(TIME_FORMATTER); return LocalDateTime.ofInstant(Instant.ofEpochMilli(epochMilis), ZoneId.systemDefault()).format(TIME_FORMATTER);
} }
public static String toJson(ResultSet rs) {
try {
Map<String,Object> map = new HashMap<>();
var meta = rs.getMetaData();
for (int col = 1; col <= meta.getColumnCount(); col++) {
var key = meta.getColumnName(col);
var val = rs.getObject(col);
map.put(key, val);
}
return new JSONObject(map).toString();
} catch (SQLException e){
return e.getMessage();
}
}
} }
+12 -1
View File
@@ -7,6 +7,7 @@
let { project, select = o => {}, task } = $props(); let { project, select = o => {}, task } = $props();
let tree = $state({}); let tree = $state({});
let loading = $state(true);
async function loadParentCandidates(){ async function loadParentCandidates(){
let url = api(`task/${task.id}/parent_candidates`); let url = api(`task/${task.id}/parent_candidates`);
@@ -14,6 +15,7 @@
if (res.ok){ if (res.ok){
yikes(); yikes();
tree = await res.json(); tree = await res.json();
loading = false;
} else error(res); } else error(res);
} }
@@ -21,7 +23,16 @@
</script> </script>
<div class="overlay parent_selector"> <div class="overlay parent_selector">
<h2>{t('select a new parent for {entity}',{entity:task.name})}</h2> <h2>
{t('select a new parent for {entity}',{entity:task.name})}
<button onclick={ev => select(null)}>{t('abort')}</button>
</h2>
{t('project')}: {project.name} {t('project')}: {project.name}
{#if loading}
<p>
{t('loading')}
</p>
{:else}
<TaskTree {tree} {select} /> <TaskTree {tree} {select} />
{/if}
</div> </div>
+1 -1
View File
@@ -193,7 +193,7 @@
function update_parent(newVal){ function update_parent(newVal){
select_parent = false; select_parent = false;
update({parent_task_id:newVal.id}); if (newVal) update({parent_task_id:newVal.id});
} }
function updatePermission(user_id,permission){ function updatePermission(user_id,permission){
@@ -14,11 +14,8 @@ import de.srsoftware.configuration.Configuration;
import de.srsoftware.tools.Path; import de.srsoftware.tools.Path;
import de.srsoftware.umbrella.core.BaseHandler; import de.srsoftware.umbrella.core.BaseHandler;
import de.srsoftware.umbrella.core.ModuleRegistry; import de.srsoftware.umbrella.core.ModuleRegistry;
import de.srsoftware.umbrella.core.Util;
import de.srsoftware.umbrella.core.api.MarkdownService; import de.srsoftware.umbrella.core.api.MarkdownService;
import de.srsoftware.umbrella.core.constants.Field;
import de.srsoftware.umbrella.core.exceptions.UmbrellaException; import de.srsoftware.umbrella.core.exceptions.UmbrellaException;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
@@ -18,10 +18,12 @@ import static de.srsoftware.umbrella.core.model.Status.*;
import static de.srsoftware.umbrella.core.model.Translatable.t; import static de.srsoftware.umbrella.core.model.Translatable.t;
import static de.srsoftware.umbrella.project.Constants.*; import static de.srsoftware.umbrella.project.Constants.*;
import static de.srsoftware.umbrella.task.Constants.*; import static de.srsoftware.umbrella.task.Constants.*;
import static java.lang.System.Logger.Level.TRACE;
import static java.text.MessageFormat.format; import static java.text.MessageFormat.format;
import de.srsoftware.tools.jdbc.Query; import de.srsoftware.tools.jdbc.Query;
import de.srsoftware.umbrella.core.BaseDb; import de.srsoftware.umbrella.core.BaseDb;
import de.srsoftware.umbrella.core.Util;
import de.srsoftware.umbrella.core.constants.Text; import de.srsoftware.umbrella.core.constants.Text;
import de.srsoftware.umbrella.core.exceptions.UmbrellaException; import de.srsoftware.umbrella.core.exceptions.UmbrellaException;
import de.srsoftware.umbrella.core.model.*; import de.srsoftware.umbrella.core.model.*;
@@ -242,6 +244,7 @@ CREATE TABLE IF NOT EXISTS {0} (
var tasks = new HashMap<Long,Task>(); var tasks = new HashMap<Long,Task>();
var rs = query.exec(db); var rs = query.exec(db);
while (rs.next()){ while (rs.next()){
LOG.log(TRACE,() -> Util.toJson(rs));
var task = Task.of(rs); var task = Task.of(rs);
tasks.put(task.id(),task); tasks.put(task.id(),task);
} }
@@ -195,7 +195,7 @@ public class TaskModule extends BaseHandler implements TaskService {
private boolean getParentCandidates(HttpExchange ex, long taskId, UmbrellaUser user) throws IOException { private boolean getParentCandidates(HttpExchange ex, long taskId, UmbrellaUser user) throws IOException {
var task = taskDb.load(taskId); var task = taskDb.load(taskId);
var project = projectService().load(task.projectId()); var project = projectService().load(task.projectId());
var projectTasks = taskDb.listProjectTasks(project.id(),null, false); var projectTasks = taskDb.listProjectTasks(project.id(),null, true);
var mapped = projectTasks.values().stream().collect(Collectors.toMap(Task::id,Task::toMap)); var mapped = projectTasks.values().stream().collect(Collectors.toMap(Task::id,Task::toMap));
var roots = new HashMap<Long,Map<String,Object>>(); var roots = new HashMap<Long,Map<String,Object>>();
for (var map : mapped.values()){ for (var map : mapped.values()){