//
// renderWithZonesManager.js
//
// Created by Alezia Kurdis on January 28th, 2024.
// Copyright 2024 Overte e.V.
//
// This script is to manage the zone in the property renderWithZones more efficiently in the Create Application.
// It allows a global view over a specific selection with possibility to
// REPLACE, REMOVE or ADD zones on those properties more efficiently.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
let rwzmSelectedId = [];
let rwzmAllZonesList = [];
let rwzmUsedZonesList = [];
let rwzmSelectedEntitiesData = [];
let rwzmUndo = [];
let enforceLocked = false;
const RWZ_ZONE_SCAN_RADIUS = 27713; //maximal radius to cover the entire domain.
let rwzmOverlayWebWindow = null;
function renderWithZonesManager(entityIDs, highlightedID = "") {
if (rwzmGetCheckSum(entityIDs) !== rwzmGetCheckSum(rwzmSelectedId)) {
rwzmUndo = [];
}
rwzmSelectedId = entityIDs;
if (entityIDs.length === 0) {
audioFeedback.rejection();
Window.alert("You have nothing selected.");
return;
} else {
rwzmAllZonesList = [];
rwzmUsedZonesList = [];
rwzmSelectedEntitiesData = [];
rwzmAllZonesList = rwzmGetExistingZoneList();
let properties;
let i = 0;
let j = 0;
let rwzmData = {};
for (i = 0; i < entityIDs.length; i++ ){
properties = Entities.getEntityProperties(entityIDs[i], ["renderWithZones", "locked", "name", "type"]);
//Identify the unique zone used in renderWithZones properties of the entities and make the list of this in rwzmUsedZonesList
if (properties.renderWithZones.length > 0) {
for (j = 0; j < properties.renderWithZones.length; j++ ){
if (rwzmUsedZonesList.indexOf(properties.renderWithZones[j]) === -1) {
rwzmUsedZonesList.push(properties.renderWithZones[j]);
}
}
}
//Make the list of entities, with their id, renderWithZones, locked, in rwzmSelectedEntitiesData
rwzmData = {
"id": entityIDs[i],
"name": properties.name,
"type": properties.type,
"renderWithZones": properties.renderWithZones,
"locked": properties.locked
};
rwzmSelectedEntitiesData.push(rwzmData);
}
}
if (rwzmOverlayWebWindow === null) {
rwzmOverlayWebWindow = new OverlayWebWindow({
title: "RenderWithZones Manager",
source: Script.resolvePath("renderWithZonesManager.html"),
width: 1100,
height: 600
});
rwzmOverlayWebWindow.closed.connect(uiHasClosed);
rwzmOverlayWebWindow.webEventReceived.connect(webEventReceiver);
}
rwzmGenerateUI(highlightedID);
}
function rwzmGetCheckSum(array) {
let i = 0;
let sum = 0;
let strForm = JSON.stringify(array);
for (i = 0; i < strForm.length; i++) {
sum = sum + strForm.charCodeAt(i);
}
return sum;
}
function uiHasClosed() {
rwzmOverlayWebWindow.closed.disconnect(uiHasClosed);
rwzmOverlayWebWindow.webEventReceived.disconnect(webEventReceiver);
rwzmOverlayWebWindow = null;
}
function rwzmGenerateUI(highlightedID) {
let canUnlock = Entities.canAdjustLocks();
let uiContent = "";
let i = 0;
let k = 0;
let zones = "";
let name = "";
let elementClass = "";
let firstClass = "";
let isLocked = "";
let selectionBox = "";
let setCheck = "";
let addAction = "";
let toHighlight = "";
let viewBtnCaption = "";
let warning = false;
uiContent = uiContent + '