bugfix + unified link code
This commit is contained in:
2
pom.xml
2
pom.xml
@@ -4,7 +4,7 @@
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>de.srsoftware</groupId>
|
||||
<artifactId>web4rail</artifactId>
|
||||
<version>0.10.3</version>
|
||||
<version>0.10.4</version>
|
||||
<name>Web4Rail</name>
|
||||
<packaging>jar</packaging>
|
||||
<description>Java Model Railway Control</description>
|
||||
|
||||
@@ -30,10 +30,6 @@ function addTile(x,y){
|
||||
return request({realm:'plan',action:mode,tile:selected.id,x:x,y:y});
|
||||
}
|
||||
|
||||
function car(id,action){
|
||||
return request({realm:"car",action:action,id:id});
|
||||
}
|
||||
|
||||
function clickTile(x,y){
|
||||
var id = x+"-"+y;
|
||||
if ($('#'+id).length > 0) request({realm:'plan',action:'click',id:id});
|
||||
@@ -222,10 +218,6 @@ function tileWindow(){
|
||||
$('.swapbtn').text(vertical ? '⇩' : '⇨');
|
||||
}
|
||||
|
||||
function train(id,action){
|
||||
return request({realm:'train',action:action,id:id});
|
||||
}
|
||||
|
||||
window.onload = function () {
|
||||
var isDragging = false;
|
||||
$('.menu > div').click(closeMenu);
|
||||
|
||||
@@ -1,6 +1,18 @@
|
||||
package de.srsoftware.web4rail;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import org.json.JSONObject;
|
||||
|
||||
import de.srsoftware.tools.Tag;
|
||||
|
||||
public class BaseClass implements Constants{
|
||||
|
||||
public static Tag link(String tagClass,Map<String,Object> params,Object caption) {
|
||||
String json = new JSONObject(params).toString().replace("\"", "'");
|
||||
return new Tag(tagClass).clazz("link").attr("onclick","request("+json+")").content(caption.toString());
|
||||
}
|
||||
|
||||
public static boolean isNull(Object o) {
|
||||
return o==null;
|
||||
}
|
||||
|
||||
@@ -168,7 +168,7 @@ public class Route extends BaseClass{
|
||||
Tag list = new Tag("ul");
|
||||
for (Condition condition : conditions) {
|
||||
Tag li = new Tag("li");
|
||||
condition.link("span",REALM_ROUTE+":"+id).addTo(li);
|
||||
link("span",Map.of(REALM,REALM_CONDITION,ID,id,ACTION,ACTION_PROPS,CONTEXT,REALM_ROUTE+":"+id),condition).addTo(li);
|
||||
Map<String, Object> params = Map.of(REALM,REALM_ROUTE,ID,id(),ACTION,DROP_CONDITION,REALM_CONDITION,condition.id());
|
||||
new Button(t("delete"), params).addTo(li.content(NBSP)).addTo(list);
|
||||
}
|
||||
@@ -611,7 +611,7 @@ public class Route extends BaseClass{
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return getClass().getSimpleName()+"("+name()+")";
|
||||
return getClass().getSimpleName()+"("+(isSet(train)?train+":":"")+name()+")";
|
||||
}
|
||||
|
||||
private void traceTrainFrom(Tile tile) {
|
||||
|
||||
@@ -96,12 +96,6 @@ public abstract class Action extends BaseClass {
|
||||
return new JSONObject().put(TYPE, getClass().getSimpleName());
|
||||
}
|
||||
|
||||
protected Tag link(Integer parentId, String context) {
|
||||
Map<String, String> props = Map.of(REALM,REALM_ACTIONS,ID,parentId+"/"+id,ACTION,ACTION_PROPS,CONTEXT,context);
|
||||
String action = "request("+(new JSONObject(props).toString().replace("\"", "'"))+")";
|
||||
return new Tag("span").content(toString()+NBSP).attr("onclick", action);
|
||||
}
|
||||
|
||||
public static List<Class<? extends Action>> list() {
|
||||
return List.of(
|
||||
ConditionalAction.class,
|
||||
|
||||
@@ -14,6 +14,7 @@ import org.slf4j.LoggerFactory;
|
||||
import de.keawe.tools.translations.Translation;
|
||||
import de.srsoftware.tools.Tag;
|
||||
import de.srsoftware.web4rail.Application;
|
||||
import de.srsoftware.web4rail.BaseClass;
|
||||
import de.srsoftware.web4rail.Constants;
|
||||
import de.srsoftware.web4rail.Plan;
|
||||
import de.srsoftware.web4rail.Window;
|
||||
@@ -87,7 +88,7 @@ public class ActionList extends Vector<Action> implements Constants{
|
||||
boolean first = true;
|
||||
for (Action action : this) {
|
||||
props.put(ID, id+"/"+action.id());
|
||||
Tag act = action.link(id,context).addTo(new Tag("li"));
|
||||
Tag act = BaseClass.link("span", Map.of(REALM,REALM_ACTIONS,ID,id+"/"+action.id(),ACTION,ACTION_PROPS,CONTEXT,context), this+NBSP).addTo(new Tag("li"));;
|
||||
if (!first) {
|
||||
props.put(ACTION, ACTION_MOVE);
|
||||
new Button("↑",props).addTo(act);
|
||||
|
||||
@@ -2,6 +2,7 @@ package de.srsoftware.web4rail.actions;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Vector;
|
||||
|
||||
import org.json.JSONArray;
|
||||
@@ -37,7 +38,9 @@ public class ConditionalAction extends Action {
|
||||
|
||||
if (!conditions.isEmpty()) {
|
||||
Tag list = new Tag("ul");
|
||||
for (Condition condition : conditions) condition.link("li",params.get(CONTEXT)).addTo(list);
|
||||
for (Condition condition : conditions) {
|
||||
link("li", Map.of(REALM,REALM_CONDITION,ID,id,ACTION,ACTION_PROPS,CONTEXT,params.get(CONTEXT)), condition).addTo(list);
|
||||
}
|
||||
list.addTo(fieldset);
|
||||
}
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@ import org.slf4j.LoggerFactory;
|
||||
import de.keawe.tools.translations.Translation;
|
||||
import de.srsoftware.tools.Tag;
|
||||
import de.srsoftware.web4rail.Application;
|
||||
import de.srsoftware.web4rail.BaseClass;
|
||||
import de.srsoftware.web4rail.Constants;
|
||||
import de.srsoftware.web4rail.Plan;
|
||||
import de.srsoftware.web4rail.Window;
|
||||
@@ -24,7 +25,7 @@ import de.srsoftware.web4rail.tags.Input;
|
||||
import de.srsoftware.web4rail.tags.Label;
|
||||
import de.srsoftware.web4rail.tags.Select;
|
||||
|
||||
public abstract class Condition implements Constants {
|
||||
public abstract class Condition extends BaseClass {
|
||||
public static final Logger LOG = LoggerFactory.getLogger(Condition.class);
|
||||
private static final String INVERTED = "inverted";
|
||||
private static final String PREFIX = Condition.class.getPackageName();
|
||||
@@ -86,11 +87,6 @@ public abstract class Condition implements Constants {
|
||||
inverted = json.has(INVERTED) && json.getBoolean(INVERTED);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Tag link(String tagClass,String context) {
|
||||
String json = new JSONObject(Map.of(REALM,REALM_CONDITION,ID,id,ACTION,ACTION_PROPS,CONTEXT,context)).toString().replace("\"", "'");
|
||||
return new Tag(tagClass).clazz("link").attr("onclick","request("+json+")").content(toString());
|
||||
}
|
||||
|
||||
private static List<Class<? extends Condition>> list() {
|
||||
return List.of(
|
||||
|
||||
@@ -7,6 +7,7 @@ import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.TreeSet;
|
||||
import java.util.Vector;
|
||||
@@ -18,7 +19,7 @@ import org.slf4j.LoggerFactory;
|
||||
import de.keawe.tools.translations.Translation;
|
||||
import de.srsoftware.tools.Tag;
|
||||
import de.srsoftware.web4rail.Application;
|
||||
import de.srsoftware.web4rail.Constants;
|
||||
import de.srsoftware.web4rail.BaseClass;
|
||||
import de.srsoftware.web4rail.Plan;
|
||||
import de.srsoftware.web4rail.Window;
|
||||
import de.srsoftware.web4rail.tags.Button;
|
||||
@@ -27,7 +28,7 @@ import de.srsoftware.web4rail.tags.Form;
|
||||
import de.srsoftware.web4rail.tags.Input;
|
||||
import de.srsoftware.web4rail.tags.Label;
|
||||
|
||||
public class Car implements Constants {
|
||||
public class Car extends BaseClass {
|
||||
protected static final Logger LOG = LoggerFactory.getLogger(Car.class);
|
||||
static HashMap<Integer,Car> cars = new HashMap<Integer, Car>();
|
||||
|
||||
@@ -122,7 +123,7 @@ public class Car implements Constants {
|
||||
}
|
||||
|
||||
public Tag link(String tagClass) {
|
||||
return new Tag(tagClass).clazz("link").attr("onclick","car("+id+",'"+ACTION_PROPS+"')").content(name());
|
||||
return link(tagClass, Map.of(REALM,REALM_CAR,ID,id,ACTION,ACTION_PROPS), name());
|
||||
}
|
||||
|
||||
static Vector<Car> list() {
|
||||
|
||||
@@ -311,7 +311,7 @@ public class Train extends BaseClass implements Comparable<Train> {
|
||||
}
|
||||
|
||||
public Tag link(String tagClass) {
|
||||
return new Tag(tagClass).clazz("link").attr("onclick","train("+id+",'"+ACTION_PROPS+"')").content(name());
|
||||
return link(tagClass, Map.of(REALM, REALM_TRAIN,ID,id,ACTION,ACTION_PROPS),name());
|
||||
}
|
||||
|
||||
public static TreeSet<Train> list() {
|
||||
@@ -336,11 +336,11 @@ public class Train extends BaseClass implements Comparable<Train> {
|
||||
|
||||
private Train load(JSONObject json) {
|
||||
pushPull = json.getBoolean(PUSH_PULL);
|
||||
if (json.has(BLOCK)) block = (Block) plan.get(json.getString(BLOCK), false);
|
||||
if (json.has(DIRECTION)) direction = Direction.valueOf(json.getString(DIRECTION));
|
||||
if (json.has(NAME)) name = json.getString(NAME);
|
||||
if (json.has(TAGS)) json.getJSONArray(TAGS ).forEach(elem -> { tags.add(elem.toString()); });
|
||||
if (json.has(TRACE)) json.getJSONArray(TRACE).forEach(elem -> { trace.add(plan.get(elem.toString(), false).set(this)); });
|
||||
if (json.has(BLOCK)) block = (Block) plan.get(json.getString(BLOCK), false).set(this); // do not move this up! during set, other fields will be referenced!
|
||||
for (Object id : json.getJSONArray(CARS)) add(Car.get(id));
|
||||
for (Object id : json.getJSONArray(LOCOS)) add((Locomotive) Car.get(id));
|
||||
|
||||
|
||||
@@ -10,8 +10,8 @@ import org.json.JSONObject;
|
||||
import de.srsoftware.tools.Tag;
|
||||
import de.srsoftware.web4rail.Connector;
|
||||
import de.srsoftware.web4rail.moving.Train;
|
||||
import de.srsoftware.web4rail.tags.Button;
|
||||
import de.srsoftware.web4rail.tags.Checkbox;
|
||||
import de.srsoftware.web4rail.tags.Form;
|
||||
import de.srsoftware.web4rail.tags.Input;
|
||||
import de.srsoftware.web4rail.tags.Label;
|
||||
import de.srsoftware.web4rail.tags.Select;
|
||||
@@ -51,8 +51,8 @@ public abstract class Block extends StretchableTile{
|
||||
}
|
||||
|
||||
@Override
|
||||
public Tag propForm(String id) {
|
||||
Tag form = super.propForm(id);
|
||||
public Form propForm(String id) {
|
||||
Form form = super.propForm(id);
|
||||
new Tag("h4").content(t("Block properties")).addTo(form);
|
||||
|
||||
new Input(NAME, name).addTo(new Label(t("name:")+NBSP)).addTo(new Tag("p")).addTo(form);
|
||||
@@ -64,20 +64,7 @@ public abstract class Block extends StretchableTile{
|
||||
|
||||
return form;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Tag propMenu() {
|
||||
Tag window = super.propMenu();
|
||||
|
||||
if (isSet(train)) {
|
||||
window.children().insertElementAt(new Button(t("stop"),"train("+train.id+",'"+ACTION_STOP+"')"), 1);
|
||||
window.children().insertElementAt(new Button(t("start"),"train("+train.id+",'"+ACTION_START+"')"), 1);
|
||||
window.children().insertElementAt(train.link("span"), 1);
|
||||
window.children().insertElementAt(new Tag("h4").content(t("Train:")), 1);
|
||||
}
|
||||
return window;
|
||||
}
|
||||
|
||||
public abstract List<Connector> startPoints();
|
||||
|
||||
@Override
|
||||
@@ -111,8 +98,8 @@ public abstract class Block extends StretchableTile{
|
||||
} else {
|
||||
Train newTrain = Train.get(trainId);
|
||||
if (isSet(newTrain) && newTrain != train) {
|
||||
newTrain.set(this);
|
||||
newTrain.dropTrace();
|
||||
newTrain.set(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ import org.json.JSONObject;
|
||||
|
||||
import de.srsoftware.tools.Tag;
|
||||
import de.srsoftware.web4rail.tags.Button;
|
||||
import de.srsoftware.web4rail.tags.Form;
|
||||
import de.srsoftware.web4rail.tags.Input;
|
||||
import de.srsoftware.web4rail.tags.Label;
|
||||
|
||||
@@ -105,8 +106,8 @@ public abstract class Contact extends Tile{
|
||||
|
||||
|
||||
@Override
|
||||
public Tag propForm(String formId) {
|
||||
Tag form = super.propForm(formId);
|
||||
public Form propForm(String formId) {
|
||||
Form form = super.propForm(formId);
|
||||
new Tag("h4").content(t("Hardware settings")).addTo(form);
|
||||
Tag label = new Input(ADDRESS, addr).addTo(new Label(t("Address:")+NBSP));
|
||||
Map<String, String> props = Map.of(REALM,REALM_CONTACT,ID,id(),ACTION,ACTION_ANALYZE);
|
||||
|
||||
@@ -14,6 +14,7 @@ import de.srsoftware.web4rail.Command.Reply;
|
||||
import de.srsoftware.web4rail.Device;
|
||||
import de.srsoftware.web4rail.Protocol;
|
||||
import de.srsoftware.web4rail.tags.Fieldset;
|
||||
import de.srsoftware.web4rail.tags.Form;
|
||||
import de.srsoftware.web4rail.tags.Input;
|
||||
import de.srsoftware.web4rail.tags.Label;
|
||||
import de.srsoftware.web4rail.tags.Radio;
|
||||
@@ -123,8 +124,8 @@ public class Relay extends Tile implements Device{
|
||||
}
|
||||
|
||||
@Override
|
||||
public Tag propForm(String id) {
|
||||
Tag form = super.propForm(id);
|
||||
public Form propForm(String id) {
|
||||
Form form = super.propForm(id);
|
||||
Fieldset fieldset = new Fieldset(t("Decoder settings"));
|
||||
Label protocol = new Label(t("Protocol:"));
|
||||
for (Protocol proto : Protocol.values()) {
|
||||
|
||||
@@ -7,6 +7,7 @@ import java.util.Map.Entry;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import de.srsoftware.tools.Tag;
|
||||
import de.srsoftware.web4rail.tags.Form;
|
||||
import de.srsoftware.web4rail.tags.Input;
|
||||
import de.srsoftware.web4rail.tags.Label;
|
||||
|
||||
@@ -36,8 +37,8 @@ public abstract class StretchableTile extends Tile {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Tag propForm(String id) {
|
||||
Tag form = super.propForm(id);
|
||||
public Form propForm(String id) {
|
||||
Form form = super.propForm(id);
|
||||
new Tag("h4").content(stretchType()).addTo(form);
|
||||
|
||||
new Input(STRETCH_LENGTH, stretch).numeric().addTo(new Label(stretchType()+":"+NBSP)).addTo(new Tag("p")).addTo(form);
|
||||
|
||||
@@ -195,7 +195,7 @@ public abstract class Tile extends BaseClass{
|
||||
return new Vector<Plan.Direction>();
|
||||
}
|
||||
|
||||
public Tag propForm(String formId) {
|
||||
public Form propForm(String formId) {
|
||||
Form form = new Form(formId);
|
||||
new Input(ACTION, ACTION_UPDATE).hideIn(form);
|
||||
new Input(REALM, REALM_PLAN).hideIn(form);
|
||||
@@ -214,16 +214,23 @@ public abstract class Tile extends BaseClass{
|
||||
|
||||
public Tag propMenu() {
|
||||
Window window = new Window("tile-properties",t("Properties of {} @ ({},{})",title(),x,y));
|
||||
String formId = "tile-properties-"+id();
|
||||
Tag form = propForm(formId);
|
||||
|
||||
if (isSet(train)) {
|
||||
window.children().insertElementAt(new Button(t("stop"),"train("+train.id+",'"+ACTION_STOP+"')"), 1);
|
||||
window.children().insertElementAt(new Button(t("start"),"train("+train.id+",'"+ACTION_START+"')"), 1);
|
||||
window.children().insertElementAt(train.link("span"), 1);
|
||||
window.children().insertElementAt(new Tag("h4").content(t("Train:")), 1);
|
||||
}
|
||||
|
||||
Form form = propForm("tile-properties-"+id());
|
||||
new Tag("h4").content(t("Length")).addTo(form);
|
||||
new Input(LENGTH,length).numeric().addTo(new Label(t("Length")+":"+NBSP)).addTo(form);
|
||||
new Tag("h4").content(t("Availability")).addTo(form);
|
||||
new Checkbox(DISABLED, t("disabled"), disabled).addTo(form);
|
||||
new Button(t("Apply"),"submitForm('"+formId+"')").addTo(form);
|
||||
new Button(t("Apply"),form).addTo(form);
|
||||
form.addTo(window);
|
||||
|
||||
if (isSet(route)) {
|
||||
if (isSet(route)) {
|
||||
new Tag("p").content(t("Locked by {}",route)).addTo(window);
|
||||
}
|
||||
|
||||
@@ -398,4 +405,4 @@ public abstract class Tile extends BaseClass{
|
||||
public int width() {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@ import de.srsoftware.web4rail.Command.Reply;
|
||||
import de.srsoftware.web4rail.Device;
|
||||
import de.srsoftware.web4rail.Protocol;
|
||||
import de.srsoftware.web4rail.tags.Fieldset;
|
||||
import de.srsoftware.web4rail.tags.Form;
|
||||
import de.srsoftware.web4rail.tags.Input;
|
||||
import de.srsoftware.web4rail.tags.Label;
|
||||
import de.srsoftware.web4rail.tags.Radio;
|
||||
@@ -108,8 +109,8 @@ public abstract class Turnout extends Tile implements Device{
|
||||
}
|
||||
|
||||
@Override
|
||||
public Tag propForm(String id) {
|
||||
Tag form = super.propForm(id);
|
||||
public Form propForm(String id) {
|
||||
Form form = super.propForm(id);
|
||||
Fieldset fieldset = new Fieldset(t("Decoder settings"));
|
||||
Label protocol = new Label(t("Protocol:"));
|
||||
for (Protocol proto : Protocol.values()) {
|
||||
|
||||
@@ -5,6 +5,7 @@ import java.util.HashMap;
|
||||
|
||||
import de.srsoftware.tools.Tag;
|
||||
import de.srsoftware.web4rail.tags.Fieldset;
|
||||
import de.srsoftware.web4rail.tags.Form;
|
||||
import de.srsoftware.web4rail.tags.Input;
|
||||
import de.srsoftware.web4rail.tags.Label;
|
||||
|
||||
@@ -34,8 +35,8 @@ public class TurnoutL extends Turnout {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Tag propForm(String id) {
|
||||
Tag form = super.propForm(id);
|
||||
public Form propForm(String id) {
|
||||
Form form = super.propForm(id);
|
||||
Tag fieldset = null;
|
||||
for (Tag child : form.children()) {
|
||||
if (child.is(Fieldset.TYPE)) {
|
||||
|
||||
@@ -5,6 +5,7 @@ import java.util.HashMap;
|
||||
|
||||
import de.srsoftware.tools.Tag;
|
||||
import de.srsoftware.web4rail.tags.Fieldset;
|
||||
import de.srsoftware.web4rail.tags.Form;
|
||||
import de.srsoftware.web4rail.tags.Input;
|
||||
import de.srsoftware.web4rail.tags.Label;
|
||||
|
||||
@@ -35,8 +36,8 @@ public class TurnoutR extends Turnout {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Tag propForm(String id) {
|
||||
Tag form = super.propForm(id);
|
||||
public Form propForm(String id) {
|
||||
Form form = super.propForm(id);
|
||||
Tag fieldset = null;
|
||||
for (Tag child : form.children()) {
|
||||
if (child.is(Fieldset.TYPE)) {
|
||||
|
||||
Reference in New Issue
Block a user