diff --git a/hal-core/resources/web/js/vue/components/EventActionComponent.js b/hal-core/resources/web/js/vue/components/EventActionComponent.js index 53a39942..43bf215f 100644 --- a/hal-core/resources/web/js/vue/components/EventActionComponent.js +++ b/hal-core/resources/web/js/vue/components/EventActionComponent.js @@ -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: ` -
- - - -
- - - -
-
+
+ + + +
` } \ No newline at end of file diff --git a/hal-core/src/se/hal/action/SendEventAction.java b/hal-core/src/se/hal/action/SendEventAction.java index a44ddc59..428d1bb9 100644 --- a/hal-core/src/se/hal/action/SendEventAction.java +++ b/hal-core/src/se/hal/action/SendEventAction.java @@ -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); } diff --git a/hal-core/src/se/hal/page/api/EventApiEndpoint.java b/hal-core/src/se/hal/page/api/EventApiEndpoint.java index fbd0c0cb..1e60197c 100644 --- a/hal-core/src/se/hal/page/api/EventApiEndpoint.java +++ b/hal-core/src/se/hal/page/api/EventApiEndpoint.java @@ -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 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 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;