diff --git a/pom.xml b/pom.xml index 1fea7e3..858ccbc 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 de.srsoftware web4rail - 1.1.3 + 1.1.4 Web4Rail jar Java Model Railway Control diff --git a/resources/css/style.css b/resources/css/style.css index d98eb3a..a7ba551 100644 --- a/resources/css/style.css +++ b/resources/css/style.css @@ -279,4 +279,11 @@ svg.disabled rect{ .cockpit .stop{ min-width: 150px; +} + +fieldset.notes{ + min-width: 50% +} +fieldset.notes textarea{ + min-width: 100%; } \ No newline at end of file diff --git a/resources/translations/Application.de.translation b/resources/translations/Application.de.translation index 49cdc32..ec7512e 100644 --- a/resources/translations/Application.de.translation +++ b/resources/translations/Application.de.translation @@ -100,6 +100,7 @@ new train : neuer Zug No : keine No free routes from {} : keine Route von {} frei NORTH : Norden +{} now heading for {} : {} ist nun unterweg nach {} Occupied area\: : Belegte Abschnitte: Off : Aus On : An diff --git a/src/main/java/de/srsoftware/web4rail/Constants.java b/src/main/java/de/srsoftware/web4rail/Constants.java index 38197a5..b8a27b5 100644 --- a/src/main/java/de/srsoftware/web4rail/Constants.java +++ b/src/main/java/de/srsoftware/web4rail/Constants.java @@ -56,6 +56,7 @@ public interface Constants { public static final String GITHUB_URL = "https://github.com/srsoftware-de/Web4Rail"; public static final String ID = "id"; public static final String NBSP = " "; + public static final String NOTES = "notes"; public static final String PORT = "port"; public static final String TYPE = "type"; public static final Charset UTF8 = StandardCharsets.UTF_8; diff --git a/src/main/java/de/srsoftware/web4rail/moving/Car.java b/src/main/java/de/srsoftware/web4rail/moving/Car.java index 17e6c9e..5771a84 100644 --- a/src/main/java/de/srsoftware/web4rail/moving/Car.java +++ b/src/main/java/de/srsoftware/web4rail/moving/Car.java @@ -28,6 +28,7 @@ import de.srsoftware.web4rail.tags.Form; import de.srsoftware.web4rail.tags.Input; import de.srsoftware.web4rail.tags.Label; import de.srsoftware.web4rail.tags.Table; +import de.srsoftware.web4rail.tags.TextArea; public class Car extends BaseClass implements Comparable{ protected static final Logger LOG = LoggerFactory.getLogger(Car.class); @@ -47,6 +48,7 @@ public class Car extends BaseClass implements Comparable{ private Train train; protected Plan plan; protected int maxSpeed = 0; + private String notes; public Car(String name) { this(name,null); @@ -70,7 +72,9 @@ public class Car extends BaseClass implements Comparable{ switch (params.get(ACTION)) { case ACTION_ADD: - new Car(params.get(Car.NAME)).plan(plan); + if (isSet(car)) { + car.clone().plan(plan); + } else new Car(params.get(Car.NAME)).plan(plan); return Car.manager(); case ACTION_PROPS: return car == null ? Car.manager() : car.properties(); @@ -81,6 +85,19 @@ public class Car extends BaseClass implements Comparable{ if (car instanceof Locomotive) return Locomotive.action(params,plan); return t("Unknown action: {}",params.get(ACTION)); } + + public Car clone() { + Car clone = new Car(name); + clone.maxSpeed = maxSpeed; + clone.length = length; + clone.tags = new HashSet(tags); + clone.notes = notes; + return clone; + } + + private Button cloneButton() { + return new Button(t("copy"),Map.of(REALM,REALM_CAR,ID,id(),ACTION,ACTION_ADD)); + } public static Car get(Object id) { return isNull(id) ? null : cars.get(Integer.parseInt(""+id)); // try to get by id @@ -97,6 +114,7 @@ public class Car extends BaseClass implements Comparable{ json.put(NAME, name); json.put(LENGTH, length); if (maxSpeed != 0) json.put(MAX_SPEED, maxSpeed); + if (isSet(notes) && !notes.isEmpty()) json.put(NOTES, notes); json.put(STOCK_ID, stockId); if (!tags.isEmpty()) json.put(TAGS, tags); return json; @@ -143,6 +161,7 @@ public class Car extends BaseClass implements Comparable{ if (json.has(ID)) id = json.getInt(ID); if (json.has(LENGTH)) length = json.getInt(LENGTH); if (json.has(MAX_SPEED)) maxSpeed = json.getInt(MAX_SPEED); + if (json.has(NOTES)) notes = json.getString(NOTES); if (json.has(STOCK_ID)) stockId = json.getString(STOCK_ID); if (json.has(TAGS)) json.getJSONArray(TAGS).forEach(elem -> { tags.add(elem.toString()); }); return this; @@ -153,8 +172,18 @@ public class Car extends BaseClass implements Comparable{ new Tag("h4").content(t("known cars")).addTo(win); new Tag("p").content(t("Click on a name to edit the entry.")).addTo(win); - Table table = new Table().addHead(t("Stock ID"),t("Name"),t("Max. Speed",speedUnit),t("Length"),t("Tags")); - cars.values().stream().filter(car -> !(car instanceof Locomotive)).forEach(car -> table.addRow(car.stockId,car.maxSpeed == 0 ? "–":(car.maxSpeed+NBSP+speedUnit),car.link(),car.length,String.join(", ", car.tags()))); + Table table = new Table().addHead(t("Stock ID"),t("Name"),t("Max. Speed",speedUnit),t("Length"),t("Tags"),t("Actions")); + cars.values() + .stream() + .filter(car -> !(car instanceof Locomotive)) + .forEach(car -> table.addRow( + car.stockId, + car.link(), + car.maxSpeed == 0 ? "–":(car.maxSpeed+NBSP+speedUnit), + car.length, + String.join(", ", car.tags()), + car.cloneButton() + )); table.addTo(win); Form form = new Form("add-car-form"); @@ -166,7 +195,7 @@ public class Car extends BaseClass implements Comparable{ fieldset.addTo(form).addTo(win); return win; } - + public int maxSpeed() { return maxSpeed; } @@ -196,6 +225,9 @@ public class Car extends BaseClass implements Comparable{ new Input(TAGS,String.join(", ", tags)).addTo(new Label(t("Tags")+NBSP)).addTo(fieldset); new Input(MAX_SPEED, maxSpeed).numeric().addTo(new Label(t("Maximum speed")+":"+NBSP)).content(NBSP+speedUnit).addTo(fieldset); fieldset.addTo(form); + + fieldset = new Fieldset(t("Notes")); + new TextArea(NOTES,notes).addTo(fieldset.clazz("notes")).addTo(form); return form; } @@ -243,7 +275,8 @@ public class Car extends BaseClass implements Comparable{ } public Car update(HashMap params) { - if (params.containsKey(NAME)) name = params.get(NAME); + if (params.containsKey(NAME)) name = params.get(NAME).trim(); + if (params.containsKey(NOTES)) notes = params.get(NOTES).trim(); if (params.containsKey(LENGTH)) length = Integer.parseInt(params.get(LENGTH)); if (params.containsKey(MAX_SPEED)) maxSpeed = Integer.parseInt(params.get(MAX_SPEED)); if (params.containsKey(STOCK_ID)) stockId = params.get(STOCK_ID); diff --git a/src/main/java/de/srsoftware/web4rail/tags/TextArea.java b/src/main/java/de/srsoftware/web4rail/tags/TextArea.java new file mode 100644 index 0000000..964b6a4 --- /dev/null +++ b/src/main/java/de/srsoftware/web4rail/tags/TextArea.java @@ -0,0 +1,29 @@ +package de.srsoftware.web4rail.tags; + +import de.srsoftware.tools.Tag; + +public class TextArea extends Tag{ + + private static final long serialVersionUID = -330127933233033028L; + public static final String NAME = "name"; + public static final String VALUE = "value"; + + public TextArea(String name) { + this(name,""); + } + + public TextArea(String name, Object value) { + super("textarea"); + attr("name", name); + content(value == null?"":value.toString()); + } + + public Tag hideIn(Tag form) { + return this.attr("type", "hidden").addTo(form); + } + + public TextArea numeric() { + attr("type","number"); + return this; + } +}