Fixed Event overview page to properly modify events

This commit is contained in:
Ziver Koc 2024-09-26 00:54:58 +02:00
parent d049e524d5
commit 60024dc915
3 changed files with 110 additions and 54 deletions

View file

@ -1,4 +1,5 @@
import {eventStore} from 'EventStore'
import { alertStore } from 'AlertStore'
export default {
props: {
@ -11,25 +12,38 @@ export default {
checkboxChecked: internalEvent.data?.valueStr == 'ON',
}
},
methods: {
changeState(changeEvent) {
fetch('/api/event?' + new URLSearchParams({
id: this.event.id,
action: "modify",
data: changeEvent.target.type == "checkbox" ? this.checkboxChecked : changeEvent.target.value
}).toString(), {
method: 'PUT',
headers: {
'Accept': 'application/json',
},
})
.then(response => response.json())
.then(json => {
if (json['error'] != null) {
alertStore.alertError(json['error']);
return;
}
})
}
},
template: `
<form method="POST">
<input type="hidden" name="action" value="modify">
<input type="hidden" name="action-id" :value="event.id">
<div class="btn-toolbar pull-right">
<template v-if="event.dataType === 'ColorEventData'">
<input type="hidden" name="type" value="color">
<input type="color" name="data" onchange="this.form.submit()" :value="event.data?.valueStr">
</template>
<template v-else-if="event.dataType === 'LevelEventData'">
<input type="hidden" name="type" value="level">
<input class="styled-slider slider-progress" type="range" name="data" min="0" max="100" step="10" onchange="this.form.submit()" :value="event.data?.value * 100">
</template>
<template v-else-if="event.dataType === 'OnOffEventData'">
<input type="hidden" name="type" value="on-off">
<input class="switch" type="checkbox" name="data" onchange="this.form.submit()" v-model="checkboxChecked">
</template>
</div>
</form>
<div class="btn-toolbar pull-right">
<template v-if="event.dataType === 'ColorEventData'">
<input type="color" @change="changeState" :value="event.data?.valueStr">
</template>
<template v-else-if="event.dataType === 'LevelEventData'">
<input class="styled-slider slider-progress" type="range" min="0.0" max="1.0" step="0.1" @change="changeState" :value="event.data?.value">
</template>
<template v-else-if="event.dataType === 'OnOffEventData'">
<input class="switch" type="checkbox" @change="changeState" v-model="checkboxChecked">
</template>
</div>
`
}

View file

@ -34,7 +34,7 @@ public class SendEventAction implements HalAction {
// Send
EventControllerManager.getInstance().send(event, dataObj);
} else
logger.warning("Unable to find event with id: "+ event.getId());
logger.warning("Unable to find event for EventAction: " + this);
} catch (Exception e) {
logger.log(Level.SEVERE, null, e);
}

View file

@ -1,8 +1,13 @@
package se.hal.page.api;
import se.hal.EventControllerManager;
import se.hal.HalContext;
import se.hal.intf.HalApiEndpoint;
import se.hal.intf.HalEventData;
import se.hal.struct.Event;
import se.hal.struct.devicedata.ColorEventData;
import se.hal.struct.devicedata.LevelEventData;
import se.hal.struct.devicedata.OnOffEventData;
import zutil.ArrayUtil;
import zutil.ObjectUtil;
import zutil.db.DBConnection;
@ -43,46 +48,83 @@ public class EventApiEndpoint extends HalApiEndpoint {
if (request.get("id") != null)
reqIds = request.get("id").split(",");
String reqConfigType = request.get("configType");
String reqDataType = request.get("dataType");
if ("modify".equals(request.get("action"))) {
for (String idStr : reqIds) {
int id = Integer.parseInt(idStr);
Event event = Event.getEvent(db, id);
// Filter devices
if (event == null) {
logger.warning("Could not find given Event id: " + id);
continue;
}
List<Event> events = new ArrayList<>();
for (Event event : Event.getLocalEvents(db)) {
boolean filter_match = true;
// change event data
HalEventData eventData;
// id filtering
if (!ObjectUtil.isEmpty((Object) reqIds) && !ArrayUtil.contains(reqIds, "" + event.getId())) {
filter_match = false;
switch (event.getDeviceConfig().getDeviceDataClass().getSimpleName()) {
case "LevelEventData":
eventData = new LevelEventData(Integer.parseInt(request.get("data")) / 100.0, 0);
break;
case "ColorEventData":
eventData = new ColorEventData(request.get("data"), 0);
break;
case "OnOffEventData":
boolean booleanData = "on".equalsIgnoreCase(request.get("data")) || "true".equalsIgnoreCase(request.get("data"));
eventData = new OnOffEventData(booleanData, 0);
break;
default:
logger.warning("Unable to process event change request for event " + id + ", data type not supported: " + event.getDeviceConfig().getDeviceDataClass());
continue;
}
logger.info("Modifying Event(" + id + ") state: " + eventData);
EventControllerManager.getInstance().send(event, eventData);
}
} else {
String reqConfigType = request.get("configType");
String reqDataType = request.get("dataType");
// Filter devices
List<Event> events = new ArrayList<>();
for (Event event : Event.getLocalEvents(db)) {
boolean filter_match = true;
// id filtering
if (!ObjectUtil.isEmpty((Object) reqIds) && !ArrayUtil.contains(reqIds, "" + event.getId())) {
filter_match = false;
}
// device type filtering
if (!ObjectUtil.isEmpty(reqConfigType) &&
!event.getDeviceConfig().getClass().getSimpleName().equals(reqConfigType)) {
filter_match = false;
}
// data type filtering
if (!ObjectUtil.isEmpty(reqDataType) &&
!event.getDeviceConfig().getDeviceDataClass().getSimpleName().equals(reqDataType)) {
filter_match = false;
}
// Check the filter
if (filter_match) {
events.add(event);
}
}
// device type filtering
if (!ObjectUtil.isEmpty(reqConfigType) &&
!event.getDeviceConfig().getClass().getSimpleName().equals(reqConfigType)) {
filter_match = false;
// --------------------------------------
// Generate DataNode
// --------------------------------------
for (Event event : events) {
DataNode deviceNode = event.getDataNode();
deviceNode.set("type", "Event");
root.add(deviceNode);
}
// data type filtering
if (!ObjectUtil.isEmpty(reqDataType) &&
!event.getDeviceConfig().getDeviceDataClass().getSimpleName().equals(reqDataType)) {
filter_match = false;
}
// Check the filter
if (filter_match) {
events.add(event);
}
}
// --------------------------------------
// Generate DataNode
// --------------------------------------
for (Event event : events) {
DataNode deviceNode = event.getDataNode();
deviceNode.set("type", "Event");
root.add(deviceNode);
}
return root;