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:
@@ -38,3 +38,6 @@ build/
|
||||
.idea/
|
||||
*.swp
|
||||
*.swo
|
||||
|
||||
dev/
|
||||
.claude/
|
||||
@@ -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
@@ -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
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -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';
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
+2
File diff suppressed because one or more lines are too long
+1
@@ -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)});
|
||||
Vendored
+13
File diff suppressed because one or more lines are too long
@@ -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 @@
|
||||
{"@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}
|
||||
@@ -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}
|
||||
Reference in New Issue
Block a user