2023-01-10 00:53:30 +01:00
|
|
|
"use strict";
|
|
|
|
|
|
2023-01-09 00:13:52 +01:00
|
|
|
var svg;
|
2023-01-10 00:53:30 +01:00
|
|
|
var data = {
|
|
|
|
|
rooms: [],
|
|
|
|
|
sensors: [],
|
|
|
|
|
events: []
|
|
|
|
|
};
|
2023-01-09 00:13:52 +01:00
|
|
|
var editModeEnabled = false;
|
|
|
|
|
|
|
|
|
|
$(function(){
|
|
|
|
|
// ------------------------------------------
|
|
|
|
|
// Setup map
|
|
|
|
|
// ------------------------------------------
|
|
|
|
|
|
2023-01-10 00:53:30 +01:00
|
|
|
svg = SVG("#map").size("100%", "700").viewbox(0, 0, 1000, 700);
|
2023-01-09 00:13:52 +01:00
|
|
|
|
|
|
|
|
// Initialize events
|
|
|
|
|
|
|
|
|
|
$("#button-edit").click(function() {
|
|
|
|
|
editMode(true);
|
|
|
|
|
});
|
|
|
|
|
$("#button-save").click(function() {
|
|
|
|
|
saveMap();
|
|
|
|
|
editMode(false);
|
|
|
|
|
drawMap();
|
|
|
|
|
});
|
|
|
|
|
$("#button-cancel").click(function() {
|
|
|
|
|
editMode(false);
|
|
|
|
|
drawMap();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Initialize background image uploader
|
|
|
|
|
|
|
|
|
|
$("#button-bg-edit").click(function() {
|
|
|
|
|
// Reset modal
|
|
|
|
|
$('#bg-file-input').parent().show();
|
|
|
|
|
if ($("#file_input").prop("jFiler") != null)
|
|
|
|
|
$("#file_input").prop("jFiler").reset();
|
|
|
|
|
$('#bg-file-progress').parent().hide();
|
|
|
|
|
$('#bgUploadModal').modal('show');
|
|
|
|
|
});
|
|
|
|
|
$('#bg-file-input').filer({
|
|
|
|
|
limit: 1,
|
|
|
|
|
extensions: ['jpg','png','svg','gif'],
|
|
|
|
|
maxSize: 3, // in MB
|
|
|
|
|
uploadFile: {
|
|
|
|
|
url: "",
|
|
|
|
|
type: 'POST',
|
|
|
|
|
enctype: 'multipart/form-data',
|
|
|
|
|
beforeSend: function(){
|
|
|
|
|
$('#bg-file-input').parent().hide();
|
|
|
|
|
$('#bg-file-progress').parent().show();
|
|
|
|
|
},
|
|
|
|
|
success: function(data, el){
|
|
|
|
|
$('#bgUploadModal').modal('hide');
|
|
|
|
|
drawMap();
|
|
|
|
|
},
|
|
|
|
|
error: function(el){
|
|
|
|
|
$("#bg-file-progress").addClass("progress-bar-danger");
|
|
|
|
|
},
|
|
|
|
|
onProgress: function(t){
|
2023-01-10 00:53:30 +01:00
|
|
|
$("#bg-file-progress").css("width", t + "%");
|
2023-01-09 00:13:52 +01:00
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// ------------------------------------------
|
|
|
|
|
// Start draw loop
|
|
|
|
|
// ------------------------------------------
|
|
|
|
|
|
2023-01-10 00:53:30 +01:00
|
|
|
fetchData(drawMap);
|
|
|
|
|
|
2023-01-09 00:13:52 +01:00
|
|
|
setInterval(function() {
|
2023-01-10 00:53:30 +01:00
|
|
|
if (editModeEnabled == false) {
|
|
|
|
|
fetchData(drawMap);
|
|
|
|
|
}
|
2023-01-09 00:13:52 +01:00
|
|
|
}, 3000); // 3 sec
|
2023-01-10 00:53:30 +01:00
|
|
|
//}, 10000); // 10 sec
|
2023-01-09 00:13:52 +01:00
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
2023-01-10 00:53:30 +01:00
|
|
|
// ----------------------------------------------
|
|
|
|
|
// Events
|
|
|
|
|
// ----------------------------------------------
|
2023-01-09 00:13:52 +01:00
|
|
|
|
|
|
|
|
function editMode(enable){
|
2023-01-10 00:53:30 +01:00
|
|
|
if (editModeEnabled == enable) {
|
2023-01-09 00:13:52 +01:00
|
|
|
return;
|
2023-01-10 00:53:30 +01:00
|
|
|
}
|
|
|
|
|
|
2023-01-09 00:13:52 +01:00
|
|
|
editModeEnabled = enable;
|
2023-01-10 00:53:30 +01:00
|
|
|
|
|
|
|
|
if (editModeEnabled) {
|
2023-01-09 00:13:52 +01:00
|
|
|
$(".edit-mode").show();
|
|
|
|
|
$(".view-mode").hide();
|
|
|
|
|
$("#map").css("border-color", "#6eb16e");
|
2023-01-10 00:53:30 +01:00
|
|
|
} else {
|
|
|
|
|
$(".room").selectize(false)
|
2023-01-09 00:13:52 +01:00
|
|
|
$(".edit-mode").hide();
|
|
|
|
|
$(".view-mode").show();
|
|
|
|
|
$("#map").css("border-color", "");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-01-10 00:53:30 +01:00
|
|
|
function beforeDragEvent(e) {
|
|
|
|
|
if (editModeEnabled == false) {
|
|
|
|
|
e.preventDefault(); // Prevent drag
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function selectEntity(e) {
|
|
|
|
|
if (editModeEnabled == false) {
|
|
|
|
|
e.target.selectize();
|
|
|
|
|
}
|
|
|
|
|
}
|
2023-01-09 00:13:52 +01:00
|
|
|
|
2023-01-10 00:53:30 +01:00
|
|
|
// --------------------------------------
|
|
|
|
|
// Draw
|
|
|
|
|
// --------------------------------------
|
2023-01-09 00:13:52 +01:00
|
|
|
|
2023-01-10 00:53:30 +01:00
|
|
|
function drawMap() {
|
|
|
|
|
// Reset map
|
|
|
|
|
//svg.clear();
|
2023-01-09 00:13:52 +01:00
|
|
|
|
2023-01-10 00:53:30 +01:00
|
|
|
// Background
|
2023-01-09 00:13:52 +01:00
|
|
|
|
2023-01-10 00:53:30 +01:00
|
|
|
if (svg.find(".bg-image").length <= 0) {
|
|
|
|
|
var bgImage = svg.image("?bgimage").addClass("bg-image")
|
|
|
|
|
.x(0)
|
|
|
|
|
.y(0)
|
|
|
|
|
.width("100%")
|
|
|
|
|
.height("100%");
|
|
|
|
|
}
|
2023-01-09 00:13:52 +01:00
|
|
|
|
2023-01-10 00:53:30 +01:00
|
|
|
// Rooms
|
2023-01-09 00:13:52 +01:00
|
|
|
|
2023-01-10 00:53:30 +01:00
|
|
|
if (data.rooms != null) {
|
|
|
|
|
$.each(data.rooms, function(i, room) {
|
|
|
|
|
svg.find("#room-" + room.id).remove();
|
2023-01-09 00:13:52 +01:00
|
|
|
|
2023-01-10 00:53:30 +01:00
|
|
|
var group = svg.group();
|
2023-01-09 00:13:52 +01:00
|
|
|
|
2023-01-10 00:53:30 +01:00
|
|
|
group.text(room.name).move(5, 5).fill('#999');
|
|
|
|
|
group.rect(room.map.width, room.map.height).selectize();
|
2023-01-09 00:13:52 +01:00
|
|
|
|
2023-01-10 00:53:30 +01:00
|
|
|
group.addClass("room")
|
|
|
|
|
.attr("id", "room-" + room.id)
|
|
|
|
|
.attr("room-id", room.id)
|
|
|
|
|
.x(room.map.x)
|
|
|
|
|
.y(room.map.y);
|
2023-01-09 00:13:52 +01:00
|
|
|
|
2023-01-10 00:53:30 +01:00
|
|
|
group.draggable().on('beforedrag', beforeDragEvent);
|
|
|
|
|
//group.on('mousedown', selectEntity, false);
|
|
|
|
|
});
|
|
|
|
|
}
|
2023-01-09 00:13:52 +01:00
|
|
|
|
2023-01-10 00:53:30 +01:00
|
|
|
// Sensors
|
2023-01-09 00:13:52 +01:00
|
|
|
|
2023-01-10 00:53:30 +01:00
|
|
|
if (data.sensors != null) {
|
|
|
|
|
$.each(data.sensors, function(i, sensor) {
|
|
|
|
|
svg.find("#sensor-" + sensor.id).remove();
|
2023-01-09 00:13:52 +01:00
|
|
|
|
2023-01-10 00:53:30 +01:00
|
|
|
var group = svg.group();
|
|
|
|
|
group.element('title').words(sensor.name);
|
2023-01-09 00:13:52 +01:00
|
|
|
|
2023-01-10 00:53:30 +01:00
|
|
|
group.text(sensor.data.valueStr).move(45, 15).fill('#999');
|
|
|
|
|
group.image("/img/temperature.svg").size(50, 50);
|
2023-01-09 00:13:52 +01:00
|
|
|
|
2023-01-10 00:53:30 +01:00
|
|
|
group.addClass("sensor")
|
|
|
|
|
.attr("id", "sensor-" + sensor.id)
|
|
|
|
|
.attr("sensor-id", sensor.id)
|
|
|
|
|
.x(sensor.map.x)
|
|
|
|
|
.y(sensor.map.y);
|
|
|
|
|
group.draggable().on('beforedrag', beforeDragEvent);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Events
|
|
|
|
|
|
|
|
|
|
if (data.events != null) {
|
|
|
|
|
$.each(data.events, function(i, event) {
|
|
|
|
|
svg.find("#event-" + event.id).remove();
|
|
|
|
|
|
|
|
|
|
var group = svg.group();
|
|
|
|
|
group.element('title').words(event.name);
|
|
|
|
|
|
|
|
|
|
var img = "/img/lightbulb_off.svg";
|
|
|
|
|
if (event.data.valueStr == "ON")
|
|
|
|
|
img = "/img/lightbulb_on.svg";
|
|
|
|
|
group.image(img).size(50, 50);
|
|
|
|
|
|
|
|
|
|
group.addClass("event")
|
|
|
|
|
.attr("id", "event-" + event.id)
|
|
|
|
|
.attr("event-id", event.id)
|
|
|
|
|
.x(event.map.x)
|
|
|
|
|
.y(event.map.y);
|
|
|
|
|
group.draggable().on('beforedrag', beforeDragEvent);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ----------------------------------------------
|
|
|
|
|
// Load and Store data
|
|
|
|
|
// ----------------------------------------------
|
|
|
|
|
|
|
|
|
|
async function fetchData(callback) {
|
|
|
|
|
await fetch('/api/room')
|
|
|
|
|
.then(response => response.json())
|
|
|
|
|
.then(json => {
|
|
|
|
|
data.rooms = json;
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
await fetch('/api/sensor')
|
|
|
|
|
.then(response => response.json())
|
|
|
|
|
.then(json => {
|
|
|
|
|
data.sensors = json;
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
await fetch('/api/event')
|
|
|
|
|
.then(response => response.json())
|
|
|
|
|
.then(json => {
|
|
|
|
|
data.events = json;
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
callback();
|
2023-01-09 00:13:52 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function saveMap(){
|
2023-01-10 00:53:30 +01:00
|
|
|
svg.find(".room").each(function(){
|
2023-01-09 00:13:52 +01:00
|
|
|
saveDevice(this, "room", "room-id");
|
|
|
|
|
});
|
2023-01-10 00:53:30 +01:00
|
|
|
svg.find(".sensor").each(function(){
|
2023-01-09 00:13:52 +01:00
|
|
|
saveDevice(this, "sensor", "sensor-id");
|
|
|
|
|
});
|
2023-01-10 00:53:30 +01:00
|
|
|
svg.find(".event").each(function(){
|
2023-01-09 00:13:52 +01:00
|
|
|
saveDevice(this, "event", "event-id");
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
function saveDevice(element, type, id){
|
|
|
|
|
$.ajax({
|
|
|
|
|
async: false,
|
|
|
|
|
dataType: "json",
|
|
|
|
|
url: "/api/map?",
|
|
|
|
|
data: {
|
|
|
|
|
action: "save",
|
|
|
|
|
id: element.attr(id),
|
|
|
|
|
type: type,
|
|
|
|
|
x: element.x(),
|
|
|
|
|
y: element.y()
|
|
|
|
|
},
|
|
|
|
|
});
|
2023-01-10 00:53:30 +01:00
|
|
|
}
|