Ajout de la fonctionnalité Favoris (V2.2)

- Nouvelle catégorie Favoris: recuperation des favoris depuis Project.gfx (getFavorites.dg5)
- Pages menuFavorites.dg5 et showDataFav.dg5 + bibliothèques JSZip/jQuery
- Navigation index.dg5: ajout de la catégorie Favoris
- Correctif override.dg5: exclusion des points /services/subnet
- Bump version 2.2 et description "Alternative to Command"
- Mise a jour README (doc Favoris + changelog)
This commit is contained in:
2026-06-10 05:54:31 +02:00
parent fbd191d9dc
commit c6482c396d
13 changed files with 279 additions and 9 deletions
+3
View File
@@ -38,3 +38,6 @@ build/
.idea/
*.swp
*.swo
dev/
.claude/
+63 -6
View File
@@ -2,7 +2,7 @@
*English version below*
**Version:** 2.1\
**Version:** 2.2\
**Auteur:** Charles-Arthur DAVID\
**Plateforme:** Distech Controls Designer\
**Compatibilité:** Automates Eclypse (Version V2)\
@@ -21,6 +21,7 @@ Ce projet offre une navigation structurée par catégories de points (entrées/s
## Fonctionnalités
- **Navigation par catégories** : Organisation automatique des points BACnet par type
- Favoris (Favorites)
- Entrées Analogiques (Analog Input)
- Sorties Analogiques (Analog Output)
- Valeurs Analogiques (Analog Value)
@@ -34,6 +35,7 @@ Ce projet offre une navigation structurée par catégories de points (entrées/s
- Dérogations (Override)
- Alarmes (Alarms)
- **Favoris** : Récupération automatique des favoris configurés dans l'automate (fichier `Project.gfx`) et affichage regroupé par groupe de favoris
- **Support multilingue** : Interface disponible en Français et Anglais
- **Thème clair/sombre** : Personnalisation de l'apparence selon les préférences
- **Interface responsive** : Adaptation automatique à différentes tailles d'écran
@@ -51,7 +53,8 @@ Ce projet offre une navigation structurée par catégories de points (entrées/s
Téléchargez la version souhaitée dans la section Paquets:
[cadMyDCFacilities_V2.1.zip](https://git.cadjou.net/api/packages/DistechControls/generic/cadMyDCFacilities/2.1/cadMyDCFacilities_V2.1.zip)
- [cadMyDCFacilities_V2.2.zip](https://git.cadjou.net/api/packages/DistechControls/generic/cadMyDCFacilities/2.2/cadMyDCFacilities_V2.2.zip) (avec Favoris)
- [cadMyDCFacilities_V2.1.zip](https://git.cadjou.net/api/packages/DistechControls/generic/cadMyDCFacilities/2.1/cadMyDCFacilities_V2.1.zip) (sans Favoris)
### 2. Importation dans Designer
@@ -86,11 +89,16 @@ cadMyDC/
├── pages/ # Pages spécialisées
│ ├── alarms.dg5 # Gestion des alarmes
│ ├── loadingPage.dg5 # Page de chargement
│ ├── menuFavorites.dg5 # Menu des favoris (regroupement par groupe)
│ ├── noData.dg5 # Page sans données
│ ├── override.dg5 # Gestion des dérogations
│ ├── schedule.dg5 # Gestion des programmes horaires
│ ├── showData.dg5 # Affichage des données
│ ├── showDataFav.dg5 # Affichage des points favoris
│ └── trend.dg5 # Affichage des tendances
├── js/ # Scripts et bibliothèques
│ ├── getFavorites.dg5 # Récupération/parsing des favoris depuis Project.gfx
│ └── libraries/ # Bibliothèques tierces (jQuery, JSZip) pour la décompression
├── palette/ # Widgets personnalisés (vide actuellement)
└── fonts/ # Polices personnalisées
```
@@ -124,6 +132,7 @@ L'interface présente un menu latéral avec toutes les catégories de points dé
### Visualisation des données
- Les **favoris** (Favorites) affichent les points marqués comme favoris dans l'automate, regroupés par groupe de favoris
- Les **points standards** (AI, AO, AV, BI, BO, BV, MSI, MSV) affichent leurs valeurs et permettent les modifications (selon les droits)
- Les **tendances** (Trend Log) affichent les graphiques historiques
- Les **programmes** (Schedule) permettent la visualisation et modification des plannings
@@ -175,7 +184,12 @@ Toute demande de support adressée à Distech Controls concernant ce projet sera
## Historique des versions
### Version 2.1 (Actuelle)
### Version 2.2 (Actuelle)
- Nouvelle catégorie **Favoris** : récupération automatique des favoris depuis le `Project.gfx` de l'automate, affichage regroupé par groupe de favoris
- Correctif de la page **Dérogations** : exclusion des points `/services/subnet`
- Mise à jour de la description du projet (« Alternative to Command »)
### Version 2.1
- Interface de navigation structurée par catégories
- Support multilingue FR/EN (via paramètre URL)
- Thèmes clair/sombre
@@ -189,7 +203,7 @@ Toute demande de support adressée à Distech Controls concernant ce projet sera
*Version française ci-dessus*
**Version:** 2.1\
**Version:** 2.2\
**Author:** Charles-Arthur DAVID\
**Platform:** Distech Controls Designer\
**Compatibility:** Eclypse Controllers (Version V2)\
@@ -208,6 +222,7 @@ This project offers structured navigation by point categories (analog/digital/mu
## Features
- **Category-based navigation**: Automatic organization of BACnet points by type
- Favorites
- Analog Inputs
- Analog Outputs
- Analog Values
@@ -221,6 +236,7 @@ This project offers structured navigation by point categories (analog/digital/mu
- Overrides
- Alarms
- **Favorites**: Automatic retrieval of the favorites configured in the controller (`Project.gfx` file) and display grouped by favorite group
- **Multilingual support**: Interface available in French and English
- **Light/Dark theme**: Customization of appearance according to preferences
- **Responsive interface**: Automatic adaptation to different screen sizes
@@ -238,7 +254,8 @@ This project offers structured navigation by point categories (analog/digital/mu
Download the desired version from the Packages section:
[cadMyDCFacilities_V2.1.zip](https://git.cadjou.net/api/packages/DistechControls/generic/cadMyDCFacilities/2.1/cadMyDCFacilities_V2.1.zip)
- [cadMyDCFacilities_V2.2.zip](https://git.cadjou.net/api/packages/DistechControls/generic/cadMyDCFacilities/2.2/cadMyDCFacilities_V2.2.zip) (with Favorites)
- [cadMyDCFacilities_V2.1.zip](https://git.cadjou.net/api/packages/DistechControls/generic/cadMyDCFacilities/2.1/cadMyDCFacilities_V2.1.zip) (without Favorites)
### 2. Import into Designer
@@ -273,11 +290,16 @@ cadMyDC/
├── pages/ # Specialized pages
│ ├── alarms.dg5 # Alarms management
│ ├── loadingPage.dg5 # Loading page
│ ├── menuFavorites.dg5 # Favorites menu (grouped by group)
│ ├── noData.dg5 # No data page
│ ├── override.dg5 # Override management
│ ├── schedule.dg5 # Schedule management
│ ├── showData.dg5 # Data display
│ ├── showDataFav.dg5 # Favorite points display
│ └── trend.dg5 # Trends display
├── js/ # Scripts and libraries
│ ├── getFavorites.dg5 # Favorites retrieval/parsing from Project.gfx
│ └── libraries/ # Third-party libraries (jQuery, JSZip) for unzipping
├── palette/ # Custom widgets (currently empty)
└── fonts/ # Custom fonts
```
@@ -311,6 +333,7 @@ The interface presents a side menu with all automatically detected point categor
### Data Visualization
- **Favorites** display the points marked as favorites in the controller, grouped by favorite group
- **Standard points** (AI, AO, AV, BI, BO, BV, MSI, MSV) display their values and allow modifications (according to rights)
- **Trends** (Trend Log) display historical graphs
- **Schedules** allow viewing and modification of schedules
@@ -362,7 +385,12 @@ Any support request addressed to Distech Controls concerning this project will b
## Version History
### Version 2.1 (Current)
### Version 2.2 (Current)
- New **Favorites** category: automatic retrieval of favorites from the controller's `Project.gfx`, displayed grouped by favorite group
- **Override** page fix: exclusion of `/services/subnet` points
- Updated project description ("Alternative to Command")
### Version 2.1
- Category-based navigation interface
- Multilingual support FR/EN (via URL parameter)
- Light/Dark themes
@@ -371,3 +399,32 @@ Any support request addressed to Distech Controls concerning this project will b
- Compatible with Eclypse V2+
---
## Changelog
Le format est basé sur [Keep a Changelog](https://keepachangelog.com/fr/1.0.0/).
### [2.2] - 2026-06-10
#### Ajouté
- Catégorie **Favoris** dans la navigation principale.
- `js/getFavorites.dg5` : téléchargement du `Project.gfx` de l'automate, décompression côté navigateur (JSZip) et extraction de `Favorites.xml` vers `data/Favorites.csv`.
- `js/libraries/` : bibliothèques tierces (jQuery, JSZip, `getZip.html`, `dgframe.js`) pour la décompression.
- `pages/menuFavorites.dg5` : menu des favoris regroupés par groupe.
- `pages/showDataFav.dg5` : affichage des points d'un groupe de favoris.
#### Corrigé
- Page **Dérogations** (`pages/override.dg5`) : exclusion des points `/services/subnet` (en plus de `/services/hardware-io`).
#### Modifié
- Description du projet dans `_proj.json` : « Alternative to Command ».
### [2.1]
#### Ajouté
- Interface de navigation structurée par catégories de points BACnet.
- Support multilingue FR/EN (via paramètre URL).
- Thèmes clair/sombre.
- Pages spécialisées pour les alarmes, tendances, programmes horaires et dérogations.
- Auto-découverte des points BACnet.
- Compatibilité Eclypse V2+.
+1 -1
View File
@@ -1 +1 @@
{"name":"cadMyDC","owner":"admin","canRead":["all"],"canWrite":[],"isTemplate":false,"isLibrary":false,"category":null,"description":"MyDC Controls of Equivalence by Charles-Arthur DAVID","version":"2.1","firstDayOfWeek":0,"loadExternalConfig":false,"protected":false,"loadViewerLocale":false,"defaultWidth":1,"defaultHeight":1,"vendor":"","componentName":"","widgetFile":"index.dg5","uiWidgets":"","defaultTheme":""}
{"name":"cadMyDC","owner":"admin","canRead":["all"],"canWrite":[],"isTemplate":false,"isLibrary":false,"category":null,"description":"Alternative to Command by Charles-Arthur DAVID","version":"2.2","firstDayOfWeek":0,"loadExternalConfig":false,"protected":false,"loadViewerLocale":false,"defaultWidth":1,"defaultHeight":1,"vendor":"","componentName":"","widgetFile":"index.dg5","uiWidgets":"","defaultTheme":""}
+1 -1
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+37
View File
@@ -0,0 +1,37 @@
// test if a parameter value is designer table
let dgIframeId;
function dgIsParamTable(val){
return (val !== null && typeof(val)=='object' && val.hasOwnProperty('cols')
&& val.hasOwnProperty('rows'));
}
// interface to the dglux5 application
function onDGFrameMessage(e){
var data = e.data;
if (typeof(data)=='object'){
if (data.hasOwnProperty('dgIframeInit')){
dgIframeId = data['dgIframeInit'];
console.log(dgIframeId);
if (window.parent !== null){
// the first post back shouldn't contain any data change
window.parent.postMessage({'dgIframe':dgIframeId},'*');
}
} else if (data.hasOwnProperty('dgIframeUpdate')){
var updates = data['updates'];
if (typeof(updates)=='object'){
if (typeof(dgParams) == 'object'){
for (key in dgParams){
if (updates.hasOwnProperty(key)){
dgParams[key](updates[key]);
}}}
if (typeof(dgParamsUpdated) == 'function'){
dgParamsUpdated();
}}}}}
window.addEventListener('message',onDGFrameMessage);
// push parameter changes back to dglux
function dgUpdateParams(changes) {
if (dgIframeId !== null) {
window.parent.postMessage({'dgIframe':dgIframeId, changes:changes},'*');
} else {
throw 'dgUpdateParams failed, handshake not finished';
}
}
+154
View File
@@ -0,0 +1,154 @@
<!DOCTYPE html>
<html>
<head>
<script type='text/javascript' src='jquery-3.7.1.min.js'></script>
<script type='text/javascript' src='jszip.min.js'></script>
<script type='text/javascript' src='jszip-utils.min.js'></script>
<script type='text/javascript' src='dgframe.js'></script>
</head>
<body>
<div id="fetch"></div>
<script type='text/javascript'>
"use strict";
let zipSource = "";
let fileContent;
let blacklistFiles = "";
let blacklistSet = new Set();
let dgParams = {
"zipSource": function(val) {
zipSource = val;
unzip(zipSource);
},
"blacklistFiles": function(val) {
blacklistFiles = val;
blacklistSet = parseBlacklist(val);
},
"fileContent": function(val) {
fileContent = val;
}
};
// "chemin1,chemin2,..." -> Set de chemins normalises (slashes en /)
function parseBlacklist(str) {
let set = new Set();
if (!str) {
return set;
}
str.split(",").forEach(function(p) {
let norm = p.trim().replace(/\\/g, "/");
if (norm) {
set.add(norm);
}
});
return set;
}
// Prepare la donnee a charger par JSZip selon la forme recue.
// JSZip.loadAsync accepte aussi bien une chaine binaire qu'un Uint8Array.
function toZipData(input) {
if (typeof input === "string") {
let trimmed = input.trim();
// Reponse JSON {"binary":"<base64>"} -> decoder le base64
if (trimmed.charAt(0) === "{") {
let base64 = JSON.parse(trimmed).binary;
let bin = atob(base64);
let out = new Uint8Array(bin.length);
for (let i = 0; i < bin.length; i++) {
out[i] = bin.charCodeAt(i);
}
return out;
}
// Tableau d'octets en texte "[123,34,...]"
if (trimmed.charAt(0) === "[") {
return Uint8Array.from(JSON.parse(trimmed));
}
// Zip brut en chaine binaire (commence par "PK") -> JSZip l'accepte tel quel
return input;
}
// ArrayBuffer / TypedArray / tableau d'octets -> JSZip l'accepte tel quel
return input;
}
// Octets -> base64 (navigateur)
function bytesToBase64(bytes) {
let bin = "";
for (let i = 0; i < bytes.length; i++) {
bin += String.fromCharCode(bytes[i]);
}
return btoa(bin);
}
// Type MIME a partir de l'extension du fichier
function mimeFromName(name) {
let ext = name.split(".").pop().toLowerCase();
let map = {
png: "image/png", jpg: "image/jpeg", jpeg: "image/jpeg",
gif: "image/gif", bmp: "image/bmp", webp: "image/webp",
ico: "image/x-icon", svg: "image/svg+xml"
};
return map[ext] || "application/octet-stream";
}
// Decode le contenu d'un fichier selon son encodage reel.
// Texte: UTF-16 (BOM) ou UTF-8. Binaire (image): data URI base64 pour <img src="">.
function decodeContent(bytes, name) {
if (bytes.length >= 2 && bytes[0] === 0xFF && bytes[1] === 0xFE) {
return new TextDecoder("utf-16le").decode(bytes);
}
if (bytes.length >= 2 && bytes[0] === 0xFE && bytes[1] === 0xFF) {
return new TextDecoder("utf-16be").decode(bytes);
}
try {
return new TextDecoder("utf-8", { fatal: true }).decode(bytes);
} catch (e) {
return "data:" + mimeFromName(name) + ";base64," + bytesToBase64(bytes);
}
}
function unzip(source) {
let zipData;
try {
zipData = toZipData(source);
} catch (e) {
console.log("Erreur de decodage de l'entree:", e);
return;
}
JSZip.loadAsync(zipData)
.then(function(zip) {
let promises = [];
zip.forEach(function (relativePath, zipEntry) {
if (zipEntry.dir) {
return;
}
// Exclu: ni dans la table, ni chargement du contenu (memoire)
if (blacklistSet.has(relativePath.replace(/\\/g, "/"))) {
return;
}
promises.push(
zipEntry.async("uint8array").then(function(bytes) {
return {
name: zipEntry.name.split("/").pop().split("\\").pop(),
path: relativePath,
content: decodeContent(bytes, zipEntry.name)
};
})
);
});
return Promise.all(promises);
})
.then(function success(table) {
dgUpdateParams({ 'fileContent': JSON.stringify(table, null, 2) });
}, function error(e) {
console.log("Erreur de lecture du zip:", e);
});
}
</script>
</body>
</html>
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
!function(e){"object"==typeof exports?module.exports=e():"function"==typeof define&&define.amd?define(e):"undefined"!=typeof window?window.JSZipUtils=e():"undefined"!=typeof global?global.JSZipUtils=e():"undefined"!=typeof self&&(self.JSZipUtils=e())}(function(){return function o(i,f,u){function s(n,e){if(!f[n]){if(!i[n]){var t="function"==typeof require&&require;if(!e&&t)return t(n,!0);if(a)return a(n,!0);throw new Error("Cannot find module '"+n+"'")}var r=f[n]={exports:{}};i[n][0].call(r.exports,function(e){var t=i[n][1][e];return s(t||e)},r,r.exports,o,i,f,u)}return f[n].exports}for(var a="function"==typeof require&&require,e=0;e<u.length;e++)s(u[e]);return s}({1:[function(e,t,n){"use strict";var u={};function r(){try{return new window.XMLHttpRequest}catch(e){}}u._getBinaryFromXHR=function(e){return e.response||e.responseText};var s="undefined"!=typeof window&&window.ActiveXObject?function(){return r()||function(){try{return new window.ActiveXObject("Microsoft.XMLHTTP")}catch(e){}}()}:r;u.getBinaryContent=function(t,n){var e,r,o,i;"function"==typeof(n=n||{})?(i=n,n={}):"function"==typeof n.callback&&(i=n.callback),i||"undefined"==typeof Promise?(r=function(e){i(null,e)},o=function(e){i(e,null)}):e=new Promise(function(e,t){r=e,o=t});try{var f=s();f.open("GET",t,!0),"responseType"in f&&(f.responseType="arraybuffer"),f.overrideMimeType&&f.overrideMimeType("text/plain; charset=x-user-defined"),f.onreadystatechange=function(e){if(4===f.readyState)if(200===f.status||0===f.status)try{r(u._getBinaryFromXHR(f))}catch(e){o(new Error(e))}else o(new Error("Ajax error for "+t+" : "+this.status+" "+this.statusText))},n.progress&&(f.onprogress=function(e){n.progress({path:t,originalEvent:e,percent:e.loaded/e.total*100,loaded:e.loaded,total:e.total})}),f.send()}catch(e){o(new Error(e),null)}return e},t.exports=u},{}]},{},[1])(1)});
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
{"@type":"group","Left":{"@type":"symbol","height":"100.0%","creationPolicy":"onDisplay","symbol":"lib/dcWidgets/palette/widgets:Navigation.Left","!df":true,"tabData":["tabData1.data"],"tabData1":{"@type":"table","data":{"@type":"tabledata","cols":[{"name":"row","type":"number","meta":{"name":"row","type":"number"}},{"name":"label","meta":{"name":"v1"}},{"name":"path","meta":{"name":"v2"}},{"name":"icons","meta":{"name":"icons"}},{"name":"dataPath","meta":{"name":"dataPath"}}],"rows":[[0,"Home","samplePath/index.dg5","",""],[1,"Alarms","samplePath/pages/Schedules.dg5","",""],[2,"Schedule","samplePath/pages/Alarms.dg5","",""],[3,"Trends","samplePath/pages/Trends.dg5","",""]]},"!ps":["data"],"!x":32,"!y":102},"tabLabels":"Tab1,Tab2,Tab3","paths":"pages/charts.dg5,pages/gagues.dg5,pages/text.dg5","!paletteIcon":"assets/widgetIcons/VerticalNav.png","initialIndex":0,"Initial_Index":0,"Tab_Data":["tabData1.data"],"Default_Tab":0,"Data":["@parent.tableColumnMapping.output"],"Default":0,"designerResize":"vertical","allowResize":"vertical","autoSize":true,"!label":"Barre de navigation sur le côté","Dark_Theme":false,"Main_Nav_Width":180,"Follow_Global_Theme":true},"Inclusion_de_pages":{"@type":"pageInclude","width":"100%","height":"100%","creationPolicy":"onDisplay","flexShrink":1,"path":["@parent.Left.Path"],"dataPath":["@parent.Left.Datapath"]},"tableColumnMapping":{"@type":"tableColumnMapping","!ps":["input","retainColumns","0","1","2","3","4","5","6","7","output"],"!x":632,"!y":40,"input":["@parent.tableGroupBy.output"],"@array":["label","group","path","=\"pages/showDataFav.dg5\"","icons","s","dataPath","group"]},"width":"100%","height":"100%","clipContent":true,"layout":"horizontal","csvParser":{"@type":"csvParser","!ps":["input","withHeader","delimiter","parseError","output"],"!x":227,"!y":33,"input":["@parent.strLoader.output"],"withHeader":true},"strLoader":{"@type":"strLoader","autoRun":true,"!ps":["invoke","path","status","output"],"!x":56,"!y":31,"path":"data/Favorites.csv"},"!df":true,"minWidth":"auto","tableGroupBy":{"@type":"tableGroupBy","!ps":["input","baseColumn","nestedData","0","1","2","output"],"!x":436,"!y":39,"input":["@parent.csvParser.output"],"baseColumn":"group","@array":[null,null,null]},"@array":[["Left"],["Inclusion_de_pages"]],"@ver":10322}
+1 -1
View File
@@ -1 +1 @@
{"@type":"group","Group":{"@type":"group","symbol":"dataBoxRow","renderer":{"map":{"dataPath":["@parent.@data.value"]}},"data":["@parent.table1.data"],"layout":"vertical","alignItems":"flex-start","width":"100.0%","@array":[]},"Text":{"@type":"text","cornerRadius":0,"multiline":false,"fontSize":"26","border":{"@type":"fill","gradient":{"@type":"gradient","@array":[{"ratio":0,"color":"#000000","alpha":1},{"ratio":100,"color":"#ffffff","alpha":1}]},"color":16777215},"text":"No Data","color":0,"fontFamily":"Roboto-Medium.ttf","fontWeight":"bold","paddingLeft":10,"paddingRight":10,"paddingTop":10,"paddingBottom":10,"keepEqualPaddings":true,"hCenter":0,"display":["@parent.if.output"]},"table1":{"@type":"table","data":["@parent.tableFilter.output"],"!ps":["data"],"!x":911,"!y":85},"if":{"@type":"if","!ps":["op","0","1","then","else","output"],"!x":1223,"!y":85,"then":"true","else":"false","@array":[["@parent.length.output"],"0"]},"tableAggregation1":{"@type":"tableAggregation","!ps":["input","column","method","output"],"!x":615,"!y":85,"input":["@parent.tableTranspose.output"],"column":"v0","method":"tableUnion"},"length":{"@type":"length","!ps":["input","output"],"!x":1064,"!y":85,"input":["@parent.table1.data"]},"width":"100%","height":"100%","clipContent":true,"!df":true,"get_overrides":{"@type":"invokeAction","path":"/services/gfx/configuration","action":"get-overrides","!ps":["invoke","path","action"],"!x":168,"!y":85,"invoke":["@parent.stopwatch.onLoop"],"!actProps":[["urls","map"]],"autoRun":true},"stopwatch":{"@type":"stopwatch","interval":1,"step":1,"!ps":["enabled","interval","step","output","onLoop"],"!x":24,"!y":85,"enabled":true,"modulo":30},"jsonParser1":{"@type":"jsonParser","!ps":["input","output","parseError","selector"],"!x":315,"!y":85,"input":["@parent.get_overrides.urls"],"selector":"","drillDownFilter":"*"},"tableTranspose":{"@type":"tableTranspose","!ps":["input","ignoreColumns","headerColumn","includeHeaders","headerPrefix","output"],"!x":464,"!y":85,"input":["@parent.jsonParser1.output"],"headerPrefix":"v","includeHeaders":false},"tableFilter":{"@type":"tableFilter","!ps":["input","condition","output"],"!x":761,"!y":85,"input":["@parent.tableAggregation1.output"],"condition":"value.indexOf(\"/services/hardware-io\")==-1"},"@array":[["Group"],["Text"]],"@symbols":{"dataBoxRow":{"@type":"group","WidgetDataBox":{"@type":"jswidget","height":"100%","js":"lib/dcUtilities/widget.js#WidgetDataBox@DistechControls","width":"100%","background":{"@type":"fill"},"shadows":{"@type":"shadows","@array":[{"type":"dropShadow","color":0,"alpha":0.1,"x":0,"y":2,"blur":8}]},"!label":"Databox","showHeader":false,"allowResize":"horizontal","nodeList":["bind!nodeList.output"],"bind!nodeList":{"@type":"propMapBinding","!ps":["output"],"@array":[{"@type":"propMapItem","path":["@parent.@parent.@parent.@params.dataPath"],"dg!getNode":{"@type":"getNode","service":["@parent.service"],"path":["@parent.path"]},"dg!Time":1706521306,"!ps":["path"],"@params":{"!var":[{"n":"label","t":"string","isOutput":true},{"n":"numberFormat","t":"string","isOutput":true},{"n":"showPriority","t":"bool","isOutput":true},{"n":"showUnits","t":"bool","isOutput":true},{"n":"showPriorityParameter","t":"bool","isOutput":true},{"n":"showTrends","t":"bool","isOutput":true},{"n":"bindingRefreshRate","t":"number","isOutput":true},{"n":"inlineActions","t":"bool","isOutput":true},{"n":"showActions","t":"bool","isOutput":true},{"n":"actions","t":"multiselectEnum","isOutput":true}],"label":["@parent.dg!getNode.name"]}}]},"!df":true},"width":"100.0%","height":41,"clipContent":true,"scaleContent":"none","layout":"absolute","creationPolicy":"onDisplay","@array":[["WidgetDataBox"]],"@params":{"!reuse":true,"!var":[{"n":"dataPath","t":"string"}],"!layout":{"type":"vbox","children":["dataPath"]}},"@W":1306,"@H":41},"@df":{"pointsFilter":{"@type":"dfcontent","mapToTable":{"@type":"mapToTable","input":["@parent.@data"],"!ps":["input","output"],"!x":72,"!y":38},"!df":true,"tableFilter":{"@type":"tableFilter","!ps":["input","condition","output"],"!x":335,"!y":41,"input":["@parent.@params.tablePoints"],"condition":["@parent.concat.output"]},"concat":{"@type":"concat","!ps":["0","1","2","3","strict","output"],"!x":287,"!y":174,"strict":true,"@array":["ObjectType == \"",["@parent.mapToTable.output.0_objectType"],"\" && ObjectInstance ==",["@parent.mapToTable.output.0_instanceNumber"]]},"@params":{"!var":[{"n":"tablePoints","t":"tabledata"},{"n":"result","t":"tabledata","isOutput":true}],"result":["@parent.tableFilter.output"]}}}},"@ver":10271}
{"@type":"group","Group":{"@type":"group","symbol":"dataBoxRow","renderer":{"map":{"dataPath":["@parent.@data.value"]}},"data":["@parent.table1.data"],"layout":"vertical","alignItems":"flex-start","width":"100.0%","@array":[]},"Text":{"@type":"text","cornerRadius":0,"multiline":false,"fontSize":"26","border":{"@type":"fill","gradient":{"@type":"gradient","@array":[{"ratio":0,"color":"#000000","alpha":1},{"ratio":100,"color":"#ffffff","alpha":1}]},"color":16777215},"text":"No Data","color":0,"fontFamily":"Roboto-Medium.ttf","fontWeight":"bold","paddingLeft":10,"paddingRight":10,"paddingTop":10,"paddingBottom":10,"keepEqualPaddings":true,"hCenter":0,"display":["@parent.if.output"]},"table1":{"@type":"table","data":["@parent.tableFilter.output"],"!ps":["data"],"!x":911,"!y":85},"if":{"@type":"if","!ps":["op","0","1","then","else","output"],"!x":1223,"!y":85,"then":"true","else":"false","@array":[["@parent.length.output"],"0"]},"tableFilter":{"@type":"tableFilter","!ps":["input","condition","output"],"!x":761,"!y":85,"input":["@parent.tableAggregation1.output"],"condition":"value.indexOf(\"/services/hardware-io\")==-1 && value.indexOf(\"/services/subnet\")==-1"},"length":{"@type":"length","!ps":["input","output"],"!x":1064,"!y":85,"input":["@parent.table1.data"]},"tableAggregation1":{"@type":"tableAggregation","!ps":["input","column","method","output"],"!x":615,"!y":85,"input":["@parent.tableTranspose.output"],"column":"v0","method":"tableUnion"},"tableTranspose":{"@type":"tableTranspose","!ps":["input","ignoreColumns","headerColumn","includeHeaders","headerPrefix","output"],"!x":464,"!y":85,"input":["@parent.jsonParser1.output"],"headerPrefix":"v","includeHeaders":false},"width":"100%","height":"100%","clipContent":true,"!df":true,"get_overrides":{"@type":"invokeAction","path":"/services/gfx/configuration","action":"get-overrides","!ps":["invoke","path","action"],"!x":168,"!y":85,"!actProps":[["urls","map"]],"autoRun":true,"interval":30},"jsonParser1":{"@type":"jsonParser","!ps":["input","output","parseError","selector"],"!x":315,"!y":85,"input":["@parent.get_overrides.urls"],"selector":"","drillDownFilter":"*"},"@array":[["Group"],["Text"]],"@symbols":{"dataBoxRow":{"@type":"group","WidgetDataBox":{"@type":"jswidget","height":"100%","js":"lib/dcUtilities/widget.js#WidgetDataBox@DistechControls","width":"100%","background":{"@type":"fill"},"shadows":{"@type":"shadows","@array":[{"type":"dropShadow","color":0,"alpha":0.1,"x":0,"y":2,"blur":8}]},"!label":"Databox","showHeader":false,"allowResize":"horizontal","nodeList":["bind!nodeList.output"],"bind!nodeList":{"@type":"propMapBinding","!ps":["output"],"@array":[{"@type":"propMapItem","path":["@parent.@parent.@parent.@params.dataPath"],"dg!getNode":{"@type":"getNode","service":["@parent.service"],"path":["@parent.path"]},"dg!Time":1706521306,"!ps":["path"],"@params":{"!var":[{"n":"label","t":"string","isOutput":true},{"n":"numberFormat","t":"string","isOutput":true},{"n":"showPriority","t":"bool","isOutput":true},{"n":"showUnits","t":"bool","isOutput":true},{"n":"showPriorityParameter","t":"bool","isOutput":true},{"n":"showTrends","t":"bool","isOutput":true},{"n":"bindingRefreshRate","t":"number","isOutput":true},{"n":"inlineActions","t":"bool","isOutput":true},{"n":"showActions","t":"bool","isOutput":true},{"n":"actions","t":"multiselectEnum","isOutput":true}],"label":["@parent.dg!getNode.name"]}}]},"!df":true},"width":"100.0%","height":41,"clipContent":true,"scaleContent":"none","layout":"absolute","creationPolicy":"onDisplay","@array":[["WidgetDataBox"]],"@params":{"!reuse":true,"!var":[{"n":"dataPath","t":"string"}],"!layout":{"type":"vbox","children":["dataPath"]}},"@W":1306,"@H":41},"@df":{"pointsFilter":{"@type":"dfcontent","mapToTable":{"@type":"mapToTable","input":["@parent.@data"],"!ps":["input","output"],"!x":72,"!y":38},"!df":true,"tableFilter":{"@type":"tableFilter","!ps":["input","condition","output"],"!x":335,"!y":41,"input":["@parent.@params.tablePoints"],"condition":["@parent.concat.output"]},"concat":{"@type":"concat","!ps":["0","1","2","3","strict","output"],"!x":287,"!y":174,"strict":true,"@array":["ObjectType == \"",["@parent.mapToTable.output.0_objectType"],"\" && ObjectInstance ==",["@parent.mapToTable.output.0_instanceNumber"]]},"@params":{"!var":[{"n":"tablePoints","t":"tabledata"},{"n":"result","t":"tabledata","isOutput":true}],"result":["@parent.tableFilter.output"]}}}},"@ver":10322}
+1
View File
@@ -0,0 +1 @@
{"@type":"group","Group":{"@type":"group","symbol":"dataBoxRow","renderer":{"map":{"dataPath":["@parent.@data.path"]}},"Analog_Input":{"@type":"getChildren","path":["@parent.@parent.@params.dataPath"],"autoRun":true,"!ps":["path","output","error"],"!x":597,"!y":31},"data":["tableFilter.output"],"tableFilter":{"@type":"tableFilter","!ps":["input","condition","output"],"!x":461,"!y":169,"input":["@parent.csvParser.output"],"condition":["@parent.concat.output"]},"csvParser":{"@type":"csvParser","!ps":["input","withHeader","delimiter","parseError","output"],"!x":276,"!y":88,"input":["@parent.strLoader.output"],"withHeader":true},"concat":{"@type":"concat","!ps":["0","1","2","strict","output"],"!x":274,"!y":235,"strict":true,"@array":["group===\"",["@stage.@params.dataPath"],"\""]},"strLoader":{"@type":"strLoader","autoRun":true,"!ps":["invoke","path","status","output"],"!x":102.0103759765625,"!y":83.03121948242188,"path":"data/Favorites.csv"},"!df":true,"layout":"vertical","alignItems":"flex-start","width":"100.0%","@array":[]},"width":"100%","height":"100%","clipContent":true,"layout":"absolute","alignItems":"flex-start","vScroll":"auto","symbol":"","renderer":{"map":{"dataPath":""}},"@array":[["Group"]],"@params":{"!var":[{"n":"dataPath","t":"nodepath"}],"!layout":{"type":"vbox","children":["dataPath"]},"dataPath":"sss"},"@symbols":{"dataBoxRow":{"@type":"group","WidgetDataBox":{"@type":"jswidget","height":"100%","js":"lib/dcUtilities/widget.js#WidgetDataBox@DistechControls","width":"100%","background":{"@type":"fill"},"shadows":{"@type":"shadows","@array":[{"type":"dropShadow","color":0,"alpha":0.1,"x":0,"y":2,"blur":8}]},"!label":"Databox","showHeader":false,"allowResize":"horizontal","nodeList":["bind!nodeList.output"],"bind!nodeList":{"@type":"propMapBinding","!ps":["output"],"@array":[{"@type":"propMapItem","path":["@stage.replace.output"],"dg!getNode":{"@type":"getNode","service":["@parent.service"],"path":["@parent.path"]},"dg!Time":1706521306,"!ps":["path"],"@params":{"!var":[{"n":"label","t":"string","isOutput":true},{"n":"numberFormat","t":"string","isOutput":true},{"n":"showPriority","t":"bool","isOutput":true},{"n":"showUnits","t":"bool","isOutput":true},{"n":"showPriorityParameter","t":"bool","isOutput":true},{"n":"showTrends","t":"bool","isOutput":true},{"n":"bindingRefreshRate","t":"number","isOutput":true},{"n":"inlineActions","t":"bool","isOutput":true},{"n":"showActions","t":"bool","isOutput":true},{"n":"actions","t":"multiselectEnum","isOutput":true}],"label":["@parent.dg!getNode.name"]}}]},"!df":true},"replace":{"@type":"replace","!ps":["input","regexp","0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","output"],"!x":701,"!y":45,"input":["@parent.concat.output"],"!w":202,"@array":["AnalogValue","analog-values","HardwareInput0","analog-inputs","HardwareOutput1","analog-outputs","BinaryValue","binary-values","HardwareInput4","binary-inputs","HardwareOutput4","binary-outputs","MultiStateValue","multi-state-values","HardwareInput13","multi-state-inputs"]},"concat":{"@type":"concat","!ps":["0","1","2","3","strict","output"],"!x":313,"!y":39,"strict":true,"!w":292,"@array":["/services/bacnet/local/objects/",["@parent.if.output"],"/",["@parent.add.output"]]},"if":{"@type":"if","!ps":["op","0","1","then","else","output"],"!x":131,"!y":88,"op":"contains","then":["@parent.concat1.output"],"else":["@parent.concat1.0"],"@array":["HardwareInput,HardwareOutput",["@stage.mapToTable.output.0_type"]]},"add":{"@type":"add","!ps":["0","1","output"],"!x":243,"!y":240,"@array":[["@stage.mapToTable.output.0_index"],1]},"mapToTable":{"@type":"mapToTable","input":["@parent.@data"],"!ps":["input","output"],"!x":39,"!y":15},"concat1":{"@type":"concat","!ps":["0","1","strict","output"],"!x":4,"!y":208,"@array":[["@stage.mapToTable.output.0_type"],["@stage.mapToTable.output.0_typeId"]]},"width":"100.0%","height":41,"clipContent":true,"scaleContent":"none","layout":"absolute","creationPolicy":"onDisplay","!df":true,"@array":[["WidgetDataBox"]],"@params":{"!reuse":true,"!var":[{"n":"dataPath","t":"string"}],"!layout":{"type":"vbox","children":["dataPath"]}},"@W":1306,"@H":41}},"@ver":10322}