From e5acbda7855f2f5d06904a84046168b8049f4365 Mon Sep 17 00:00:00 2001 From: guga kakhadze Date: Thu, 26 Jun 2025 21:30:08 +0400 Subject: [PATCH 1/6] Glowing by priority --- .../Highlight/Pulse-Diagnostic/resource.json | 16 +++++++ .../Highlight/Pulse-Diagnostic/style.json | 18 ++++++++ .../Highlight/Pulse-High/resource.json | 16 +++++++ .../Highlight/Pulse-High/style.json | 18 ++++++++ .../Highlight/Pulse-Low/resource.json | 16 +++++++ .../Highlight/Pulse-Low/style.json | 18 ++++++++ .../Highlight/Pulse-Medium/resource.json | 16 +++++++ .../Highlight/Pulse-Medium/style.json | 18 ++++++++ .../ignition/script-python/utils/code.py | 17 ++++++-- .../Highlight/Pulse-Diagnostic/resource.json | 16 +++++++ .../Highlight/Pulse-Diagnostic/style.json | 18 ++++++++ .../Highlight/Pulse-High/resource.json | 16 +++++++ .../Highlight/Pulse-High/style.json | 18 ++++++++ .../Highlight/Pulse-Low/resource.json | 16 +++++++ .../Highlight/Pulse-Low/style.json | 18 ++++++++ .../Highlight/Pulse-Medium/resource.json | 16 +++++++ .../Highlight/Pulse-Medium/style.json | 18 ++++++++ .../views/Alarm-Views/RealTime/view.json | 42 +++++++++---------- 18 files changed, 306 insertions(+), 25 deletions(-) create mode 100644 MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Diagnostic/resource.json create mode 100644 MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Diagnostic/style.json create mode 100644 MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-High/resource.json create mode 100644 MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-High/style.json create mode 100644 MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Low/resource.json create mode 100644 MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Low/style.json create mode 100644 MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Medium/resource.json create mode 100644 MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Medium/style.json create mode 100644 SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Diagnostic/resource.json create mode 100644 SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Diagnostic/style.json create mode 100644 SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-High/resource.json create mode 100644 SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-High/style.json create mode 100644 SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Low/resource.json create mode 100644 SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Low/style.json create mode 100644 SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Medium/resource.json create mode 100644 SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Medium/style.json diff --git a/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Diagnostic/resource.json b/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Diagnostic/resource.json new file mode 100644 index 0000000..22849a7 --- /dev/null +++ b/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Diagnostic/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "admin", + "timestamp": "2025-06-26T15:59:17Z" + }, + "lastModificationSignature": "c4aa68a4f62571cf6d849a47e59b28d57bd61ae5a604537c041dddf156ae7caf" + } +} \ No newline at end of file diff --git a/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Diagnostic/style.json b/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Diagnostic/style.json new file mode 100644 index 0000000..bbd0dd7 --- /dev/null +++ b/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Diagnostic/style.json @@ -0,0 +1,18 @@ +{ + "base": { + "animation": { + "duration": "2.5s", + "keyframes": { + "0%": { + "boxShadow": "0 0 12px 5px rgba(88, 158, 249, 0.8)" + }, + "50%": { + "boxShadow": "0 0 20px 8px rgba(88, 158, 249, 1)" + }, + "100%": { + "boxShadow": "0 0 5px 2px rgba(88, 158, 249, 0.3)" + } + } + } + } +} \ No newline at end of file diff --git a/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-High/resource.json b/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-High/resource.json new file mode 100644 index 0000000..f3ef911 --- /dev/null +++ b/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-High/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "admin", + "timestamp": "2025-06-26T15:59:24Z" + }, + "lastModificationSignature": "9249bad3cbdc85047473a1dde64734fa94bfdd65db0f489fd951f0418fca8784" + } +} \ No newline at end of file diff --git a/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-High/style.json b/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-High/style.json new file mode 100644 index 0000000..1ca57f6 --- /dev/null +++ b/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-High/style.json @@ -0,0 +1,18 @@ +{ + "base": { + "animation": { + "duration": "2.5s", + "keyframes": { + "0%": { + "boxShadow": "0 0 12px 5px rgba(245, 95, 89, 0.8)" + }, + "50%": { + "boxShadow": "0 0 20px 8px rgba(245, 95, 89, 1)" + }, + "100%": { + "boxShadow": "0 0 5px 2px rgba(245, 95, 89, 0.3)" + } + } + } + } +} \ No newline at end of file diff --git a/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Low/resource.json b/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Low/resource.json new file mode 100644 index 0000000..2d6a3d3 --- /dev/null +++ b/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Low/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "admin", + "timestamp": "2025-06-26T15:59:29Z" + }, + "lastModificationSignature": "1e87ebc5c34bb669001223707c04ff8f9bed1fdb1af60f1183e3b61922cec1fc" + } +} \ No newline at end of file diff --git a/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Low/style.json b/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Low/style.json new file mode 100644 index 0000000..825d919 --- /dev/null +++ b/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Low/style.json @@ -0,0 +1,18 @@ +{ + "base": { + "animation": { + "duration": "2.5s", + "keyframes": { + "0%": { + "boxShadow": "0 0 12px 5px rgba(255, 255, 0, 0.8)" + }, + "50%": { + "boxShadow": "0 0 20px 8px rgba(255, 255, 0, 1)" + }, + "100%": { + "boxShadow": "0 0 5px 2px rgba(255, 255, 0, 0.3)" + } + } + } + } +} \ No newline at end of file diff --git a/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Medium/resource.json b/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Medium/resource.json new file mode 100644 index 0000000..b8211ac --- /dev/null +++ b/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Medium/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "admin", + "timestamp": "2025-06-26T15:59:34Z" + }, + "lastModificationSignature": "acb0a55e90b90b5eec32cd4df512cb08aedbf6cf7b758579f9c6865c2346976b" + } +} \ No newline at end of file diff --git a/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Medium/style.json b/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Medium/style.json new file mode 100644 index 0000000..022d5f3 --- /dev/null +++ b/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Medium/style.json @@ -0,0 +1,18 @@ +{ + "base": { + "animation": { + "duration": "2.5s", + "keyframes": { + "0%": { + "boxShadow": "0 0 12px 5px rgba(247, 160, 96, 0.8)" + }, + "50%": { + "boxShadow": "0 0 20px 8px rgba(247, 160, 96, 1)" + }, + "100%": { + "boxShadow": "0 0 5px 2px rgba(247, 160, 96, 0.3)" + } + } + } + } +} \ No newline at end of file diff --git a/MTN6_SCADA/ignition/script-python/utils/code.py b/MTN6_SCADA/ignition/script-python/utils/code.py index a8f08cb..3b8d075 100644 --- a/MTN6_SCADA/ignition/script-python/utils/code.py +++ b/MTN6_SCADA/ignition/script-python/utils/code.py @@ -1,10 +1,14 @@ def handleTagHighlight(view, currentValue): - tag = currentValue.value + tag_priority = currentValue.value - if tag == "": + if tag_priority == None: return - splitedTag = str(tag).split("/") + parts = str(tag_priority).split("||") + tag = parts[0] + + splitedTag = tag.split("/") + deviceName = splitedTag[-1] Docked_East_Map = { @@ -22,6 +26,11 @@ def handleTagHighlight(view, currentValue): components = view.rootContainer.getChildren() + priority = parts[1] + +# if priority == "": +# priority = "Default" + for child in components: params = child.props.get("params", {}) tagProps = params.get("tagProps", {}) @@ -33,7 +42,7 @@ def handleTagHighlight(view, currentValue): tagPath = tagsList[0] if tag == tagPath: - child.props.style["classes"] = "Highlight/Pulse" + child.props.style["classes"] = "Highlight/Pulse-" + priority system.perspective.openDock(Docked_East_View, params={'tagProps': tagProps}) return True diff --git a/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Diagnostic/resource.json b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Diagnostic/resource.json new file mode 100644 index 0000000..f62f84b --- /dev/null +++ b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Diagnostic/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "admin", + "timestamp": "2025-06-26T15:56:25Z" + }, + "lastModificationSignature": "18bf39c86653c9dd5c4664422b3c1d40aa96d3931f0cd93cb0b7295c21817949" + } +} \ No newline at end of file diff --git a/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Diagnostic/style.json b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Diagnostic/style.json new file mode 100644 index 0000000..bbd0dd7 --- /dev/null +++ b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Diagnostic/style.json @@ -0,0 +1,18 @@ +{ + "base": { + "animation": { + "duration": "2.5s", + "keyframes": { + "0%": { + "boxShadow": "0 0 12px 5px rgba(88, 158, 249, 0.8)" + }, + "50%": { + "boxShadow": "0 0 20px 8px rgba(88, 158, 249, 1)" + }, + "100%": { + "boxShadow": "0 0 5px 2px rgba(88, 158, 249, 0.3)" + } + } + } + } +} \ No newline at end of file diff --git a/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-High/resource.json b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-High/resource.json new file mode 100644 index 0000000..1f2a952 --- /dev/null +++ b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-High/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "admin", + "timestamp": "2025-06-26T15:58:30Z" + }, + "lastModificationSignature": "f1be0638b51c37c24199bd33a7e875748cfa79940cb30b1b5ccf32e9e47936a7" + } +} \ No newline at end of file diff --git a/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-High/style.json b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-High/style.json new file mode 100644 index 0000000..1ca57f6 --- /dev/null +++ b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-High/style.json @@ -0,0 +1,18 @@ +{ + "base": { + "animation": { + "duration": "2.5s", + "keyframes": { + "0%": { + "boxShadow": "0 0 12px 5px rgba(245, 95, 89, 0.8)" + }, + "50%": { + "boxShadow": "0 0 20px 8px rgba(245, 95, 89, 1)" + }, + "100%": { + "boxShadow": "0 0 5px 2px rgba(245, 95, 89, 0.3)" + } + } + } + } +} \ No newline at end of file diff --git a/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Low/resource.json b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Low/resource.json new file mode 100644 index 0000000..08a7064 --- /dev/null +++ b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Low/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "admin", + "timestamp": "2025-06-26T15:52:14Z" + }, + "lastModificationSignature": "a27450cbd46150b09478dea57dc320cbb8435e455ebb5cc12d4e190540d59b9c" + } +} \ No newline at end of file diff --git a/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Low/style.json b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Low/style.json new file mode 100644 index 0000000..825d919 --- /dev/null +++ b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Low/style.json @@ -0,0 +1,18 @@ +{ + "base": { + "animation": { + "duration": "2.5s", + "keyframes": { + "0%": { + "boxShadow": "0 0 12px 5px rgba(255, 255, 0, 0.8)" + }, + "50%": { + "boxShadow": "0 0 20px 8px rgba(255, 255, 0, 1)" + }, + "100%": { + "boxShadow": "0 0 5px 2px rgba(255, 255, 0, 0.3)" + } + } + } + } +} \ No newline at end of file diff --git a/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Medium/resource.json b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Medium/resource.json new file mode 100644 index 0000000..4277552 --- /dev/null +++ b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Medium/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "admin", + "timestamp": "2025-06-26T15:57:29Z" + }, + "lastModificationSignature": "91e91a98d401979733d172ccf64ea9605a06ec782fb929a21dbb582441acb784" + } +} \ No newline at end of file diff --git a/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Medium/style.json b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Medium/style.json new file mode 100644 index 0000000..022d5f3 --- /dev/null +++ b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Medium/style.json @@ -0,0 +1,18 @@ +{ + "base": { + "animation": { + "duration": "2.5s", + "keyframes": { + "0%": { + "boxShadow": "0 0 12px 5px rgba(247, 160, 96, 0.8)" + }, + "50%": { + "boxShadow": "0 0 20px 8px rgba(247, 160, 96, 1)" + }, + "100%": { + "boxShadow": "0 0 5px 2px rgba(247, 160, 96, 0.3)" + } + } + } + } +} \ No newline at end of file diff --git a/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/Alarm-Views/RealTime/view.json b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/Alarm-Views/RealTime/view.json index 8649208..c317224 100644 --- a/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/Alarm-Views/RealTime/view.json +++ b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/Alarm-Views/RealTime/view.json @@ -689,7 +689,7 @@ "component": { "onRowClick": { "config": { - "script": "\tdata \u003d self.props.selection.data\n\tif not data or len(data) !\u003d 1:\n\t return\n\t\n\trow \u003d data[0]\n\tclickedTagPath \u003d row.get(\"FullTag\", \"\")\n\tMCM \u003d row.get(\"Location\", \"\")\n\t\n\tMCM_Pages_Map \u003d {\n\t\t\"MCM01\": \"Detailed-Views/MCM01 Fluid Inbound Merges 1-4\",\n\t\t\"MCM02\": \"Detailed-Views/MCM02 Fluid Inbound Merges 5-7\",\n\t\t\"MCM03\": \"Detailed-Views/MCM03 Non Con\",\n\t\t\"MCM04\": \"Detailed-Views/MCM04 North Bulk Inbound, Fluid Outbound and Problem Solve\",\n\t\t\"MCM05\": \"Detailed-Views/MCM05 South Bulk Inbound, Fluid Outbound and Problem Solve\",\n\t\t\"MCM06\": \"Detailed-Views/MCM06 Non Con\",\n\t\t\"MCM07\": \"Detailed-Views/MCM07 Bypass\",\n\t}\n\t\n\n\tpage \u003d MCM_Pages_Map.get(MCM)\n\t\n\tif not page:\n\t return\n\t\t\n\tdevice \u003d row.get(\"Device\", \"\")\n\t\n\tif not device or not clickedTagPath:\n\t\treturn\n\n\tpathToDevice \u003d \"\"\n\n#\tcheck for the mcm\n\tif \"MCM\" in device:\n\t\tparts \u003d clickedTagPath.split(\"/\")\n\t\tpathToDevice \u003d \"/\".join(parts[:3])\n\n\telse:\n\t\tindex \u003d clickedTagPath.find(device)\n\t\tif index \u003d\u003d -1:\n\t\t\treturn\n\t\tpathToDevice \u003d clickedTagPath[:index + len(device)]\n\n\t\t\n\t# Navigate to target view, passing the tag to highlight\n\tsystem.perspective.navigate(view \u003d page, params \u003d {\u0027highlightTagPath\u0027:pathToDevice})\n\t\n\t\n" + "script": "\tdata \u003d self.props.selection.data\n\tif not data or len(data) !\u003d 1:\n\t return\n\t\n\trow \u003d data[0]\n\tclickedTagPath \u003d row.get(\"FullTag\", \"\")\n\tMCM \u003d row.get(\"Location\", \"\")\n\t\n\tMCM_Pages_Map \u003d {\n\t\t\"MCM01\": \"Detailed-Views/MCM01 Fluid Inbound Merges 1-4\",\n\t\t\"MCM02\": \"Detailed-Views/MCM02 Fluid Inbound Merges 5-7\",\n\t\t\"MCM03\": \"Detailed-Views/MCM03 Non Con\",\n\t\t\"MCM04\": \"Detailed-Views/MCM04 North Bulk Inbound, Fluid Outbound and Problem Solve\",\n\t\t\"MCM05\": \"Detailed-Views/MCM05 South Bulk Inbound, Fluid Outbound and Problem Solve\",\n\t\t\"MCM06\": \"Detailed-Views/MCM06 Non Con\",\n\t\t\"MCM07\": \"Detailed-Views/MCM07 Bypass\",\n\t}\n\t\n\n\tpage \u003d MCM_Pages_Map.get(MCM)\n\t\n\tif not page:\n\t return\n\t\t\n\tdevice \u003d row.get(\"Device\", \"\")\n\t\n\tif not device or not clickedTagPath:\n\t\treturn\n\n\tpathToDevice \u003d \"\"\n\n#\tcheck for the mcm\n\tif \"MCM\" in device:\n\t\tparts \u003d clickedTagPath.split(\"/\")\n\t\tpathToDevice \u003d \"/\".join(parts[:3])\n\n\telse:\n\t\tindex \u003d clickedTagPath.find(device)\n\t\tif index \u003d\u003d -1:\n\t\t\treturn\n\t\tpathToDevice \u003d clickedTagPath[:index + len(device)]\n\n\tpriority \u003d row.get(\"Priority\", \"\")\n\t\n\tcombined \u003d pathToDevice + \"||\" + priority\n\t\n\t# Navigate to target view, passing the tag to highlight\n\tsystem.perspective.navigate(view \u003d page, params \u003d {\u0027highlightTagPath\u0027: str(combined)})\n\t\n\t\n" }, "scope": "G", "type": "script" @@ -1591,70 +1591,70 @@ { "Description": { "style": { - "classes": "Alarms-Styles/High" + "classes": "Alarms-Styles/Diagnostic" }, - "value": "MCM01 - Hello world" + "value": "UL1_4_VFD1 - Voltage" }, "Device": { "style": { - "classes": "Alarms-Styles/High" + "classes": "Alarms-Styles/Diagnostic" }, - "value": "MCM01" + "value": "UL1_4_VFD1" }, "Duration": { "style": { - "classes": "Alarms-Styles/High" + "classes": "Alarms-Styles/Diagnostic" }, - "value": "01:05:19" + "value": "05:42:49" }, "FullTag": { "style": { - "classes": "Alarms-Styles/High" + "classes": "Alarms-Styles/Diagnostic" }, - "value": "System/MCM01/MCM01/Beacon_Light" + "value": "System/MCM02/Conveyor/UL1_4_VFD1/Voltage" }, "ID": { "style": { - "classes": "Alarms-Styles/High" + "classes": "Alarms-Styles/Diagnostic" }, - "value": 12 + "value": 5 }, "Location": { "style": { - "classes": "Alarms-Styles/High" + "classes": "Alarms-Styles/Diagnostic" }, - "value": "MCM01" + "value": "MCM02" }, "Priority": { "style": { - "classes": "Alarms-Styles/High" + "classes": "Alarms-Styles/Diagnostic" }, - "value": "High" + "value": "Diagnostic" }, "StartTimestamp": { "style": { - "classes": "Alarms-Styles/High" + "classes": "Alarms-Styles/Diagnostic" }, "value": { "$": [ "ts", 0, - 1750942947091 + 1750956444058 ], - "$ts": 1750939070000 + "$ts": 1750936737000 } }, "Tag": { "style": { - "classes": "Alarms-Styles/High" + "classes": "Alarms-Styles/Diagnostic" }, - "value": "MCM01.HMI.Beacon_Light" + "value": "UL1_4_VFD1.HMI.Voltage" } } ], "mode": "multiple interval", "selectedColumn": "Location", - "selectedRow": 0 + "selectedRow": 3 } }, "type": "ia.display.table" From e4e1d27b4ff78e00b1f119862f322eebbabe655d Mon Sep 17 00:00:00 2001 From: guga kakhadze Date: Thu, 26 Jun 2025 21:44:18 +0400 Subject: [PATCH 2/6] header stil showed null and this time its fixed for good lol --- .../views/Header/Header/view.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/Header/Header/view.json b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/Header/Header/view.json index 56ca101..dd7a864 100644 --- a/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/Header/Header/view.json +++ b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/Header/Header/view.json @@ -819,11 +819,12 @@ "enabled": true, "rate": "3" }, - "queryPath": "GetActiveAlarmsByLocationAndPriority" + "queryPath": "GetActiveAlarmsByLocationAndPriority", + "returnFormat": "json" }, "transforms": [ { - "code": "\tif value is None or not hasattr(system.dataset, \"toPyDataSet\"):\n\t\treturn \n\t\t\n\trows \u003d system.dataset.toPyDataSet(value)\n\t\n\ttotal \u003d sum(row[\"Count\"] for row in rows)\n\t\n\treturn total", + "code": "\ttotal \u003d sum(row[\"Count\"] for row in value if \"Count\" in row and row[\"Count\"] is not None)\n\treturn total", "type": "script" } ], From 4af17cca3a9fd2dca0ea30c8ca2f0fdeb60dc8df Mon Sep 17 00:00:00 2001 From: guga kakhadze Date: Thu, 26 Jun 2025 22:36:37 +0400 Subject: [PATCH 3/6] creaded new reusable alarmhandleClick function. doing clicks on hitlist and history. exposing fulltag and device in hitlist and history sql queries. changed event methods from single clicks to double clicks. --- .../views/Alarm-Views/RealTime/view.json | 445 +++++++++++++++++- .../ignition/named-query/GetAlarms/query.sql | 140 +++--- .../named-query/GetAlarmsWithCount/query.sql | 8 +- .../script-python/alarms/alarm_click/code.py | 49 ++ .../alarms/alarm_click/resource.json | 17 + 5 files changed, 568 insertions(+), 91 deletions(-) create mode 100644 SCADA_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/alarms/alarm_click/code.py create mode 100644 SCADA_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/alarms/alarm_click/resource.json diff --git a/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/Alarm-Views/RealTime/view.json b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/Alarm-Views/RealTime/view.json index c317224..21e0b1a 100644 --- a/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/Alarm-Views/RealTime/view.json +++ b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/Alarm-Views/RealTime/view.json @@ -687,9 +687,9 @@ { "events": { "component": { - "onRowClick": { + "onRowDoubleClick": { "config": { - "script": "\tdata \u003d self.props.selection.data\n\tif not data or len(data) !\u003d 1:\n\t return\n\t\n\trow \u003d data[0]\n\tclickedTagPath \u003d row.get(\"FullTag\", \"\")\n\tMCM \u003d row.get(\"Location\", \"\")\n\t\n\tMCM_Pages_Map \u003d {\n\t\t\"MCM01\": \"Detailed-Views/MCM01 Fluid Inbound Merges 1-4\",\n\t\t\"MCM02\": \"Detailed-Views/MCM02 Fluid Inbound Merges 5-7\",\n\t\t\"MCM03\": \"Detailed-Views/MCM03 Non Con\",\n\t\t\"MCM04\": \"Detailed-Views/MCM04 North Bulk Inbound, Fluid Outbound and Problem Solve\",\n\t\t\"MCM05\": \"Detailed-Views/MCM05 South Bulk Inbound, Fluid Outbound and Problem Solve\",\n\t\t\"MCM06\": \"Detailed-Views/MCM06 Non Con\",\n\t\t\"MCM07\": \"Detailed-Views/MCM07 Bypass\",\n\t}\n\t\n\n\tpage \u003d MCM_Pages_Map.get(MCM)\n\t\n\tif not page:\n\t return\n\t\t\n\tdevice \u003d row.get(\"Device\", \"\")\n\t\n\tif not device or not clickedTagPath:\n\t\treturn\n\n\tpathToDevice \u003d \"\"\n\n#\tcheck for the mcm\n\tif \"MCM\" in device:\n\t\tparts \u003d clickedTagPath.split(\"/\")\n\t\tpathToDevice \u003d \"/\".join(parts[:3])\n\n\telse:\n\t\tindex \u003d clickedTagPath.find(device)\n\t\tif index \u003d\u003d -1:\n\t\t\treturn\n\t\tpathToDevice \u003d clickedTagPath[:index + len(device)]\n\n\tpriority \u003d row.get(\"Priority\", \"\")\n\t\n\tcombined \u003d pathToDevice + \"||\" + priority\n\t\n\t# Navigate to target view, passing the tag to highlight\n\tsystem.perspective.navigate(view \u003d page, params \u003d {\u0027highlightTagPath\u0027: str(combined)})\n\t\n\t\n" + "script": "\n\tmyData \u003d self.props.selection.data\n\n\talarms.alarm_click.handleClick(myData)\n\t\n\t" }, "scope": "G", "type": "script" @@ -1593,37 +1593,37 @@ "style": { "classes": "Alarms-Styles/Diagnostic" }, - "value": "UL1_4_VFD1 - Voltage" + "value": "FL2078_2_VFD1 - Voltage" }, "Device": { "style": { "classes": "Alarms-Styles/Diagnostic" }, - "value": "UL1_4_VFD1" + "value": "FL2078_2_VFD1" }, "Duration": { "style": { "classes": "Alarms-Styles/Diagnostic" }, - "value": "05:42:49" + "value": "07:05:16" }, "FullTag": { "style": { "classes": "Alarms-Styles/Diagnostic" }, - "value": "System/MCM02/Conveyor/UL1_4_VFD1/Voltage" + "value": "System/MCM01/Conveyor/FL2078_2_VFD1/Voltage" }, "ID": { "style": { "classes": "Alarms-Styles/Diagnostic" }, - "value": 5 + "value": 8 }, "Location": { "style": { "classes": "Alarms-Styles/Diagnostic" }, - "value": "MCM02" + "value": "MCM01" }, "Priority": { "style": { @@ -1639,22 +1639,21 @@ "$": [ "ts", 0, - 1750956444058 + 1750962272012 ], - "$ts": 1750936737000 + "$ts": 1750936755000 } }, "Tag": { "style": { "classes": "Alarms-Styles/Diagnostic" }, - "value": "UL1_4_VFD1.HMI.Voltage" + "value": "FL2078_2_VFD1.HMI.Voltage" } } ], - "mode": "multiple interval", - "selectedColumn": "Location", - "selectedRow": 3 + "selectedColumn": "Duration", + "selectedRow": 2 } }, "type": "ia.display.table" @@ -1749,6 +1748,17 @@ { "children": [ { + "events": { + "component": { + "onRowDoubleClick": { + "config": { + "script": "\t\n\tmyData \u003d self.props.selection.data\n\n\talarms.alarm_click.handleClick(myData)" + }, + "scope": "G", + "type": "script" + } + } + }, "meta": { "name": "AlarmsTable" }, @@ -2523,6 +2533,192 @@ "viewPath": "", "visible": true, "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "FullTag", + "filter": { + "boolean": { + "condition": "" + }, + "date": { + "condition": "", + "value": "" + }, + "enabled": false, + "number": { + "condition": "", + "value": "" + }, + "string": { + "condition": "", + "value": "" + }, + "visible": "on-hover" + }, + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "nullFormat": { + "includeNullStrings": false, + "nullFormatValue": "", + "strict": false + }, + "number": "value", + "numberFormat": "0,0.##", + "progressBar": { + "bar": { + "color": "", + "style": { + "classes": "" + } + }, + "max": 100, + "min": 0, + "track": { + "color": "", + "style": { + "classes": "" + } + }, + "value": { + "enabled": true, + "format": "0,0.##", + "justify": "center", + "style": { + "classes": "" + } + } + }, + "render": "auto", + "resizable": true, + "sort": "none", + "sortable": true, + "strictWidth": false, + "style": { + "classes": "", + "display": "none" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Device", + "filter": { + "boolean": { + "condition": "" + }, + "date": { + "condition": "", + "value": "" + }, + "enabled": false, + "number": { + "condition": "", + "value": "" + }, + "string": { + "condition": "", + "value": "" + }, + "visible": "on-hover" + }, + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "nullFormat": { + "includeNullStrings": false, + "nullFormatValue": "", + "strict": false + }, + "number": "value", + "numberFormat": "0,0.##", + "progressBar": { + "bar": { + "color": "", + "style": { + "classes": "" + } + }, + "max": 100, + "min": 0, + "track": { + "color": "", + "style": { + "classes": "" + } + }, + "value": { + "enabled": true, + "format": "0,0.##", + "justify": "center", + "style": { + "classes": "" + } + } + }, + "render": "auto", + "resizable": true, + "sort": "none", + "sortable": true, + "strictWidth": false, + "style": { + "classes": "", + "display": "none" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" } ], "emptyMessage": { @@ -2541,10 +2737,6 @@ }, "pager": { "activeOption": 5 - }, - "selection": { - "enableRowSelection": false, - "mode": "multiple interval" } }, "type": "ia.display.table" @@ -3171,6 +3363,17 @@ "$ts": 1750436956149 } }, + "events": { + "component": { + "onRowDoubleClick": { + "config": { + "script": "\t\n\tmyData \u003d self.props.selection.data\n\n\talarms.alarm_click.handleClick(myData)" + }, + "scope": "G", + "type": "script" + } + } + }, "meta": { "name": "Table" }, @@ -3732,7 +3935,7 @@ "style": { "classes": "" }, - "title": "Severity" + "title": "" }, "justify": "center", "nullFormat": { @@ -3968,6 +4171,192 @@ "viewPath": "", "visible": true, "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "FullTag", + "filter": { + "boolean": { + "condition": "" + }, + "date": { + "condition": "", + "value": "" + }, + "enabled": false, + "number": { + "condition": "", + "value": "" + }, + "string": { + "condition": "", + "value": "" + }, + "visible": "on-hover" + }, + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "nullFormat": { + "includeNullStrings": false, + "nullFormatValue": "", + "strict": false + }, + "number": "value", + "numberFormat": "0,0.##", + "progressBar": { + "bar": { + "color": "", + "style": { + "classes": "" + } + }, + "max": 100, + "min": 0, + "track": { + "color": "", + "style": { + "classes": "" + } + }, + "value": { + "enabled": true, + "format": "0,0.##", + "justify": "center", + "style": { + "classes": "" + } + } + }, + "render": "auto", + "resizable": true, + "sort": "none", + "sortable": true, + "strictWidth": false, + "style": { + "classes": "", + "display": "none" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Device", + "filter": { + "boolean": { + "condition": "" + }, + "date": { + "condition": "", + "value": "" + }, + "enabled": false, + "number": { + "condition": "", + "value": "" + }, + "string": { + "condition": "", + "value": "" + }, + "visible": "on-hover" + }, + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "nullFormat": { + "includeNullStrings": false, + "nullFormatValue": "", + "strict": false + }, + "number": "value", + "numberFormat": "0,0.##", + "progressBar": { + "bar": { + "color": "", + "style": { + "classes": "" + } + }, + "max": 100, + "min": 0, + "track": { + "color": "", + "style": { + "classes": "" + } + }, + "value": { + "enabled": true, + "format": "0,0.##", + "justify": "center", + "style": { + "classes": "" + } + } + }, + "render": "auto", + "resizable": true, + "sort": "none", + "sortable": true, + "strictWidth": false, + "style": { + "classes": "", + "display": "none" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" } ], "emptyMessage": { @@ -3989,7 +4378,22 @@ "bottom": false }, "selection": { - "enableRowSelection": false + "data": [ + { + "Description": "MCM01 - Hello world", + "Device": "MCM01", + "Duration": "06:30:56", + "EndTimestamp": null, + "FullTag": "System/MCM01/MCM01/Beacon_Light", + "ID": 12, + "Location": "MCM01", + "Priority": "High", + "StartTimestamp": "Thu Jun 26 2025 15:57:50 GMT+0400 (Georgia Standard Time)", + "Tag": "MCM01.HMI.Beacon_Light" + } + ], + "selectedColumn": "EndTimestamp", + "selectedRow": 0 }, "style": { "margin": 20 @@ -4381,6 +4785,7 @@ "contentStyle": { "classes": "Background-Styles/Grey-Background" }, + "currentTabIndex": 1, "menuType": "modern", "style": { "classes": "Background-Styles/Grey-Background" diff --git a/SCADA_PERSPECTIVE_PARENT_PROJECT/ignition/named-query/GetAlarms/query.sql b/SCADA_PERSPECTIVE_PARENT_PROJECT/ignition/named-query/GetAlarms/query.sql index 3f3a3e2..b029688 100644 --- a/SCADA_PERSPECTIVE_PARENT_PROJECT/ignition/named-query/GetAlarms/query.sql +++ b/SCADA_PERSPECTIVE_PARENT_PROJECT/ignition/named-query/GetAlarms/query.sql @@ -1,69 +1,71 @@ -WITH Active AS ( - SELECT - ae.id, - ae.eventtime, - ae.eventid, - ae.source, - ae.priority, - ae.displaypath, - TIMESTAMPDIFF(SECOND, ae.eventtime, COALESCE(ae_clear.eventtime, NOW())) AS duration_seconds - FROM alarm_events ae - LEFT JOIN alarm_events ae_clear - ON ae.eventid = ae_clear.eventid AND ae_clear.eventtype = 1 - WHERE ae.eventtype = 0 - AND ae.displaypath NOT LIKE '%System Startup%' - AND ae.source NOT LIKE '%System Startup%' - GROUP BY ae.id -- Ensure one row per alarm -), -SingleMyTag AS ( - SELECT aed.id, aed.strValue - FROM alarm_event_data aed - WHERE aed.propname = 'myTag' - GROUP BY aed.id -- Collapse duplicates by id -), -SingleClear AS ( - SELECT eventid, MIN(eventtime) AS eventtime - FROM alarm_events - WHERE eventtype = 1 - GROUP BY eventid -) - -SELECT - Active.id AS ID, - Active.eventtime AS StartTimestamp, - Clear.eventtime AS EndTimestamp, - - CONCAT( - LPAD(FLOOR(Active.duration_seconds / 3600), 2, '0'), ':', - LPAD(FLOOR((Active.duration_seconds % 3600) / 60), 2, '0'), ':', - LPAD(Active.duration_seconds % 60, 2, '0') - ) AS Duration, - - CONCAT(Active.displaypath, ' - ', SUBSTRING_INDEX(Active.source, ':/alm:', -1)) AS Description, - - CASE Active.priority - WHEN 0 THEN 'Diagnostic' - WHEN 1 THEN 'Low' - WHEN 2 THEN 'Medium' - WHEN 3 THEN 'High' - WHEN 4 THEN 'Critical' - ELSE 'Unknown' - END AS Priority, - - CONCAT( - Active.displaypath, - '.HMI.', - SUBSTRING_INDEX(aed.strValue, '/', -1) - ) AS Tag, - - SUBSTRING_INDEX(SUBSTRING_INDEX(aed.strValue, '/', 2), '/', -1) AS Location - -FROM Active - -LEFT JOIN SingleClear Clear - ON Active.eventid = Clear.eventid - -LEFT JOIN SingleMyTag aed - ON aed.id = Active.id - -ORDER BY Active.eventtime DESC; +WITH Active AS ( + SELECT + ae.id, + ae.eventtime, + ae.eventid, + ae.source, + ae.priority, + ae.displaypath, + TIMESTAMPDIFF(SECOND, ae.eventtime, COALESCE(ae_clear.eventtime, NOW())) AS duration_seconds + FROM alarm_events ae + LEFT JOIN alarm_events ae_clear + ON ae.eventid = ae_clear.eventid AND ae_clear.eventtype = 1 + WHERE ae.eventtype = 0 + AND ae.displaypath NOT LIKE '%System Startup%' + AND ae.source NOT LIKE '%System Startup%' + GROUP BY ae.id -- Ensure one row per alarm +), +SingleMyTag AS ( + SELECT aed.id, aed.strValue + FROM alarm_event_data aed + WHERE aed.propname = 'myTag' + GROUP BY aed.id -- Collapse duplicates by id +), +SingleClear AS ( + SELECT eventid, MIN(eventtime) AS eventtime + FROM alarm_events + WHERE eventtype = 1 + GROUP BY eventid +) + +SELECT + Active.id AS ID, + Active.eventtime AS StartTimestamp, + Clear.eventtime AS EndTimestamp, + + CONCAT( + LPAD(FLOOR(Active.duration_seconds / 3600), 2, '0'), ':', + LPAD(FLOOR((Active.duration_seconds % 3600) / 60), 2, '0'), ':', + LPAD(Active.duration_seconds % 60, 2, '0') + ) AS Duration, + + CONCAT(Active.displaypath, ' - ', SUBSTRING_INDEX(Active.source, ':/alm:', -1)) AS Description, + + CASE Active.priority + WHEN 0 THEN 'Diagnostic' + WHEN 1 THEN 'Low' + WHEN 2 THEN 'Medium' + WHEN 3 THEN 'High' + WHEN 4 THEN 'Critical' + ELSE 'Unknown' + END AS Priority, + + CONCAT( + Active.displaypath, + '.HMI.', + SUBSTRING_INDEX(aed.strValue, '/', -1) + ) AS Tag, + + SUBSTRING_INDEX(SUBSTRING_INDEX(aed.strValue, '/', 2), '/', -1) AS Location , + aed.strValue AS FullTag, + Active.displaypath as Device + +FROM Active + +LEFT JOIN SingleClear Clear + ON Active.eventid = Clear.eventid + +LEFT JOIN SingleMyTag aed + ON aed.id = Active.id + +ORDER BY Active.eventtime DESC; diff --git a/SCADA_PERSPECTIVE_PARENT_PROJECT/ignition/named-query/GetAlarmsWithCount/query.sql b/SCADA_PERSPECTIVE_PARENT_PROJECT/ignition/named-query/GetAlarmsWithCount/query.sql index fc32678..0cd98a1 100644 --- a/SCADA_PERSPECTIVE_PARENT_PROJECT/ignition/named-query/GetAlarmsWithCount/query.sql +++ b/SCADA_PERSPECTIVE_PARENT_PROJECT/ignition/named-query/GetAlarmsWithCount/query.sql @@ -9,7 +9,7 @@ SELECT '.HMI.', SUBSTRING_INDEX(aed.strValue, '/', -1) ) AS Tag, - + CASE Active.priority WHEN 0 THEN 'Diagnostic' WHEN 1 THEN 'Low' @@ -31,7 +31,11 @@ SELECT ) AS Duration, -- Total number of activations - COUNT(*) AS Count + COUNT(*) AS Count, + + -- Newly added columns + aed.strValue AS FullTag, + Active.displaypath AS Device FROM ( SELECT diff --git a/SCADA_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/alarms/alarm_click/code.py b/SCADA_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/alarms/alarm_click/code.py new file mode 100644 index 0000000..d2c79c8 --- /dev/null +++ b/SCADA_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/alarms/alarm_click/code.py @@ -0,0 +1,49 @@ +def handleClick(data): + if not data or len(data) != 1: + return + + row = data[0] + clickedTagPath = row.get("FullTag", "") + MCM = row.get("Location", "") + + MCM_Pages_Map = { + "MCM01": "Detailed-Views/MCM01 Fluid Inbound Merges 1-4", + "MCM02": "Detailed-Views/MCM02 Fluid Inbound Merges 5-7", + "MCM03": "Detailed-Views/MCM03 Non Con", + "MCM04": "Detailed-Views/MCM04 North Bulk Inbound, Fluid Outbound and Problem Solve", + "MCM05": "Detailed-Views/MCM05 South Bulk Inbound, Fluid Outbound and Problem Solve", + "MCM06": "Detailed-Views/MCM06 Non Con", + "MCM07": "Detailed-Views/MCM07 Bypass", + } + + + page = MCM_Pages_Map.get(MCM) + + if not page: + return + + device = row.get("Device", "") + + if not device or not clickedTagPath: + return + + pathToDevice = "" + + # check for the mcm + if "MCM" in device: + parts = clickedTagPath.split("/") + pathToDevice = "/".join(parts[:3]) + + else: + index = clickedTagPath.find(device) + if index == -1: + return + pathToDevice = clickedTagPath[:index + len(device)] + + priority = row.get("Priority", "") + + #combining with priority + combined = pathToDevice + "||" + priority + + # Navigate to target view, passing the tag to highlight + system.perspective.navigate(view = page, params = {'highlightTagPath': str(combined)}) \ No newline at end of file diff --git a/SCADA_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/alarms/alarm_click/resource.json b/SCADA_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/alarms/alarm_click/resource.json new file mode 100644 index 0000000..4fb4fbb --- /dev/null +++ b/SCADA_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/alarms/alarm_click/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "admin", + "timestamp": "2025-06-26T18:22:20Z" + }, + "hintScope": 2, + "lastModificationSignature": "b6ff9fb1f8b372d391f1e8e33122b287026821ab30ed938414fca2bd68f451a9" + } +} \ No newline at end of file From ad11f1606200758878e00f6e6aae21bd0ba630ea Mon Sep 17 00:00:00 2001 From: guga kakhadze Date: Thu, 26 Jun 2025 23:02:10 +0400 Subject: [PATCH 4/6] highlighting tags from docked south tables - active, histlist and history. --- .../Navigation-Views/Docked-South/view.json | 746 +++++++++++++++++- 1 file changed, 739 insertions(+), 7 deletions(-) diff --git a/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/Navigation-Views/Docked-South/view.json b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/Navigation-Views/Docked-South/view.json index e9e1ae1..41e5e65 100644 --- a/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/Navigation-Views/Docked-South/view.json +++ b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/Navigation-Views/Docked-South/view.json @@ -1,7 +1,7 @@ { "custom": { "MCM": "", - "currentTable": "HISTORY" + "currentTable": "ACTIVE" }, "params": {}, "propConfig": { @@ -65,6 +65,17 @@ { "children": [ { + "events": { + "component": { + "onRowDoubleClick": { + "config": { + "script": "\tdata \u003d self.props.selection.data\n\t\n\tsystem.perspective.print(alarms.alarm_click.handleClick(data))\n\t\n\tsystem.perspective.print(\"clicked\")" + }, + "scope": "G", + "type": "script" + } + } + }, "meta": { "name": "active-table" }, @@ -755,6 +766,192 @@ "viewPath": "", "visible": true, "width": 80 + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "FullTag", + "filter": { + "boolean": { + "condition": "" + }, + "date": { + "condition": "", + "value": "" + }, + "enabled": false, + "number": { + "condition": "", + "value": "" + }, + "string": { + "condition": "", + "value": "" + }, + "visible": "on-hover" + }, + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "nullFormat": { + "includeNullStrings": false, + "nullFormatValue": "", + "strict": false + }, + "number": "value", + "numberFormat": "0,0.##", + "progressBar": { + "bar": { + "color": "", + "style": { + "classes": "" + } + }, + "max": 100, + "min": 0, + "track": { + "color": "", + "style": { + "classes": "" + } + }, + "value": { + "enabled": true, + "format": "0,0.##", + "justify": "center", + "style": { + "classes": "" + } + } + }, + "render": "auto", + "resizable": true, + "sort": "none", + "sortable": true, + "strictWidth": false, + "style": { + "classes": "", + "display": "none" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Device", + "filter": { + "boolean": { + "condition": "" + }, + "date": { + "condition": "", + "value": "" + }, + "enabled": false, + "number": { + "condition": "", + "value": "" + }, + "string": { + "condition": "", + "value": "" + }, + "visible": "on-hover" + }, + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "nullFormat": { + "includeNullStrings": false, + "nullFormatValue": "", + "strict": false + }, + "number": "value", + "numberFormat": "0,0.##", + "progressBar": { + "bar": { + "color": "", + "style": { + "classes": "" + } + }, + "max": 100, + "min": 0, + "track": { + "color": "", + "style": { + "classes": "" + } + }, + "value": { + "enabled": true, + "format": "0,0.##", + "justify": "center", + "style": { + "classes": "" + } + } + }, + "render": "auto", + "resizable": true, + "sort": "none", + "sortable": true, + "strictWidth": false, + "style": { + "classes": "", + "display": "none" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" } ], "emptyMessage": { @@ -774,12 +971,89 @@ "bottom": false }, "selection": { - "mode": "multiple interval" + "data": [ + { + "Description": { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": "FL2078_2_VFD1 - Voltage" + }, + "Device": { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": "FL2078_2_VFD1" + }, + "Duration": { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": "07:38:49" + }, + "FullTag": { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": "System/MCM01/Conveyor/FL2078_2_VFD1/Voltage" + }, + "ID": { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": 8 + }, + "Location": { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": "MCM01" + }, + "Priority": { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": "Diagnostic" + }, + "StartTimestamp": { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "$": [ + "ts", + 0, + 1750964284885 + ], + "$ts": 1750936755000 + } + }, + "Tag": { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": "FL2078_2_VFD1.HMI.Voltage" + } + } + ], + "selectedColumn": "ID", + "selectedRow": 2 } }, "type": "ia.display.table" }, { + "events": { + "component": { + "onRowDoubleClick": { + "config": { + "script": "\tdata \u003d self.props.selection.data\n\t\n\talarms.alarm_click.handleClick(data)" + }, + "scope": "G", + "type": "script" + } + } + }, "meta": { "name": "hitList-table" }, @@ -1569,6 +1843,192 @@ "viewPath": "", "visible": true, "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "FullTag", + "filter": { + "boolean": { + "condition": "" + }, + "date": { + "condition": "", + "value": "" + }, + "enabled": false, + "number": { + "condition": "", + "value": "" + }, + "string": { + "condition": "", + "value": "" + }, + "visible": "on-hover" + }, + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "nullFormat": { + "includeNullStrings": false, + "nullFormatValue": "", + "strict": false + }, + "number": "value", + "numberFormat": "0,0.##", + "progressBar": { + "bar": { + "color": "", + "style": { + "classes": "" + } + }, + "max": 100, + "min": 0, + "track": { + "color": "", + "style": { + "classes": "" + } + }, + "value": { + "enabled": true, + "format": "0,0.##", + "justify": "center", + "style": { + "classes": "" + } + } + }, + "render": "auto", + "resizable": true, + "sort": "none", + "sortable": true, + "strictWidth": false, + "style": { + "classes": "", + "display": "none" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Device", + "filter": { + "boolean": { + "condition": "" + }, + "date": { + "condition": "", + "value": "" + }, + "enabled": false, + "number": { + "condition": "", + "value": "" + }, + "string": { + "condition": "", + "value": "" + }, + "visible": "on-hover" + }, + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "nullFormat": { + "includeNullStrings": false, + "nullFormatValue": "", + "strict": false + }, + "number": "value", + "numberFormat": "0,0.##", + "progressBar": { + "bar": { + "color": "", + "style": { + "classes": "" + } + }, + "max": 100, + "min": 0, + "track": { + "color": "", + "style": { + "classes": "" + } + }, + "value": { + "enabled": true, + "format": "0,0.##", + "justify": "center", + "style": { + "classes": "" + } + } + }, + "render": "auto", + "resizable": true, + "sort": "none", + "sortable": true, + "strictWidth": false, + "style": { + "classes": "", + "display": "none" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" } ], "emptyMessage": { @@ -1589,13 +2049,102 @@ "bottom": false }, "selection": { - "enableRowSelection": false, - "mode": "multiple interval" + "data": [ + { + "Count": { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": 1 + }, + "Description": { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": "UL1_4_VFD1 - Voltage" + }, + "Device": { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": "UL1_4_VFD1" + }, + "Duration": { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": "07:39:06" + }, + "FirstTimestamp": { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "$": [ + "ts", + 0, + 1750964283987 + ], + "$ts": 1750936737000 + } + }, + "FullTag": { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": "System/MCM02/Conveyor/UL1_4_VFD1/Voltage" + }, + "LastTimestamp": { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "$": [ + "ts", + 0, + 1750964283987 + ], + "$ts": 1750936737000 + } + }, + "Location": { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": "MCM02" + }, + "Priority": { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": "Diagnostic" + }, + "Tag": { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": "UL1_4_VFD1.HMI.Voltage" + } + } + ], + "selectedColumn": "FirstTimestamp", + "selectedRow": 3 } }, "type": "ia.display.table" }, { + "events": { + "component": { + "onRowDoubleClick": { + "config": { + "script": "\tdata \u003d self.props.selection.data\n\t\n\talarms.alarm_click.handleClick(data)" + }, + "scope": "G", + "type": "script" + } + } + }, "meta": { "name": "historical-table" }, @@ -2391,6 +2940,192 @@ "viewPath": "", "visible": true, "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "FullTag", + "filter": { + "boolean": { + "condition": "" + }, + "date": { + "condition": "", + "value": "" + }, + "enabled": false, + "number": { + "condition": "", + "value": "" + }, + "string": { + "condition": "", + "value": "" + }, + "visible": "on-hover" + }, + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "nullFormat": { + "includeNullStrings": false, + "nullFormatValue": "", + "strict": false + }, + "number": "value", + "numberFormat": "0,0.##", + "progressBar": { + "bar": { + "color": "", + "style": { + "classes": "" + } + }, + "max": 100, + "min": 0, + "track": { + "color": "", + "style": { + "classes": "" + } + }, + "value": { + "enabled": true, + "format": "0,0.##", + "justify": "center", + "style": { + "classes": "" + } + } + }, + "render": "auto", + "resizable": true, + "sort": "none", + "sortable": true, + "strictWidth": false, + "style": { + "classes": "", + "display": "none" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Device", + "filter": { + "boolean": { + "condition": "" + }, + "date": { + "condition": "", + "value": "" + }, + "enabled": false, + "number": { + "condition": "", + "value": "" + }, + "string": { + "condition": "", + "value": "" + }, + "visible": "on-hover" + }, + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "nullFormat": { + "includeNullStrings": false, + "nullFormatValue": "", + "strict": false + }, + "number": "value", + "numberFormat": "0,0.##", + "progressBar": { + "bar": { + "color": "", + "style": { + "classes": "" + } + }, + "max": 100, + "min": 0, + "track": { + "color": "", + "style": { + "classes": "" + } + }, + "value": { + "enabled": true, + "format": "0,0.##", + "justify": "center", + "style": { + "classes": "" + } + } + }, + "render": "auto", + "resizable": true, + "sort": "none", + "sortable": true, + "strictWidth": false, + "style": { + "classes": "", + "display": "none" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" } ], "emptyMessage": { @@ -2409,9 +3144,6 @@ }, "pager": { "bottom": false - }, - "selection": { - "enableRowSelection": false } }, "scripts": { From ae38f1a21cdbee2328e168008eb69691d8ba9bb9 Mon Sep 17 00:00:00 2001 From: guga kakhadze Date: Mon, 30 Jun 2025 13:58:42 +0400 Subject: [PATCH 5/6] clearing previous highlights from the view --- .../ignition/script-python/utils/code.py | 18 ++- .../Navigation-Views/Docked-South/view.json | 153 +----------------- 2 files changed, 11 insertions(+), 160 deletions(-) diff --git a/MTN6_SCADA/ignition/script-python/utils/code.py b/MTN6_SCADA/ignition/script-python/utils/code.py index 3b8d075..546a465 100644 --- a/MTN6_SCADA/ignition/script-python/utils/code.py +++ b/MTN6_SCADA/ignition/script-python/utils/code.py @@ -25,12 +25,12 @@ def handleTagHighlight(view, currentValue): Docked_East_View = Docked_East_Map["MCM"] components = view.rootContainer.getChildren() - + priority = parts[1] - -# if priority == "": -# priority = "Default" - + + foundMatch = False + +# clear all highlights and apply new one when found for child in components: params = child.props.get("params", {}) tagProps = params.get("tagProps", {}) @@ -39,11 +39,13 @@ def handleTagHighlight(view, currentValue): if len(tagsList) == 0: continue - tagPath = tagsList[0] + child.props.style.classes = "" + tagPath = tagsList[0] + if tag == tagPath: child.props.style["classes"] = "Highlight/Pulse-" + priority system.perspective.openDock(Docked_East_View, params={'tagProps': tagProps}) - return True + foundMatch = True - return False \ No newline at end of file + return foundMatch \ No newline at end of file diff --git a/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/Navigation-Views/Docked-South/view.json b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/Navigation-Views/Docked-South/view.json index 41e5e65..add594e 100644 --- a/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/Navigation-Views/Docked-South/view.json +++ b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/Navigation-Views/Docked-South/view.json @@ -69,7 +69,7 @@ "component": { "onRowDoubleClick": { "config": { - "script": "\tdata \u003d self.props.selection.data\n\t\n\tsystem.perspective.print(alarms.alarm_click.handleClick(data))\n\t\n\tsystem.perspective.print(\"clicked\")" + "script": "\tdata \u003d self.props.selection.data\n\t\n\talarms.alarm_click.handleClick(data)" }, "scope": "G", "type": "script" @@ -969,75 +969,6 @@ }, "pager": { "bottom": false - }, - "selection": { - "data": [ - { - "Description": { - "style": { - "classes": "Alarms-Styles/Diagnostic" - }, - "value": "FL2078_2_VFD1 - Voltage" - }, - "Device": { - "style": { - "classes": "Alarms-Styles/Diagnostic" - }, - "value": "FL2078_2_VFD1" - }, - "Duration": { - "style": { - "classes": "Alarms-Styles/Diagnostic" - }, - "value": "07:38:49" - }, - "FullTag": { - "style": { - "classes": "Alarms-Styles/Diagnostic" - }, - "value": "System/MCM01/Conveyor/FL2078_2_VFD1/Voltage" - }, - "ID": { - "style": { - "classes": "Alarms-Styles/Diagnostic" - }, - "value": 8 - }, - "Location": { - "style": { - "classes": "Alarms-Styles/Diagnostic" - }, - "value": "MCM01" - }, - "Priority": { - "style": { - "classes": "Alarms-Styles/Diagnostic" - }, - "value": "Diagnostic" - }, - "StartTimestamp": { - "style": { - "classes": "Alarms-Styles/Diagnostic" - }, - "value": { - "$": [ - "ts", - 0, - 1750964284885 - ], - "$ts": 1750936755000 - } - }, - "Tag": { - "style": { - "classes": "Alarms-Styles/Diagnostic" - }, - "value": "FL2078_2_VFD1.HMI.Voltage" - } - } - ], - "selectedColumn": "ID", - "selectedRow": 2 } }, "type": "ia.display.table" @@ -2047,88 +1978,6 @@ "pager": { "activeOption": 5, "bottom": false - }, - "selection": { - "data": [ - { - "Count": { - "style": { - "classes": "Alarms-Styles/Diagnostic" - }, - "value": 1 - }, - "Description": { - "style": { - "classes": "Alarms-Styles/Diagnostic" - }, - "value": "UL1_4_VFD1 - Voltage" - }, - "Device": { - "style": { - "classes": "Alarms-Styles/Diagnostic" - }, - "value": "UL1_4_VFD1" - }, - "Duration": { - "style": { - "classes": "Alarms-Styles/Diagnostic" - }, - "value": "07:39:06" - }, - "FirstTimestamp": { - "style": { - "classes": "Alarms-Styles/Diagnostic" - }, - "value": { - "$": [ - "ts", - 0, - 1750964283987 - ], - "$ts": 1750936737000 - } - }, - "FullTag": { - "style": { - "classes": "Alarms-Styles/Diagnostic" - }, - "value": "System/MCM02/Conveyor/UL1_4_VFD1/Voltage" - }, - "LastTimestamp": { - "style": { - "classes": "Alarms-Styles/Diagnostic" - }, - "value": { - "$": [ - "ts", - 0, - 1750964283987 - ], - "$ts": 1750936737000 - } - }, - "Location": { - "style": { - "classes": "Alarms-Styles/Diagnostic" - }, - "value": "MCM02" - }, - "Priority": { - "style": { - "classes": "Alarms-Styles/Diagnostic" - }, - "value": "Diagnostic" - }, - "Tag": { - "style": { - "classes": "Alarms-Styles/Diagnostic" - }, - "value": "UL1_4_VFD1.HMI.Voltage" - } - } - ], - "selectedColumn": "FirstTimestamp", - "selectedRow": 3 } }, "type": "ia.display.table" From 630708b9ae47dd67d76d9a1ab88a6018c1a42943 Mon Sep 17 00:00:00 2001 From: guga kakhadze Date: Mon, 30 Jun 2025 14:40:27 +0400 Subject: [PATCH 6/6] fixed the bug of docked south wasnt filtering after clicking on the active alarm and navigating --- .../Navigation-Views/Docked-South/view.json | 34 ++++++++++++++++--- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/Navigation-Views/Docked-South/view.json b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/Navigation-Views/Docked-South/view.json index add594e..f0787b1 100644 --- a/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/Navigation-Views/Docked-South/view.json +++ b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/Navigation-Views/Docked-South/view.json @@ -1,18 +1,32 @@ { "custom": { - "MCM": "", - "currentTable": "ACTIVE" + "MCM": 1, + "currentTable": "ACTIVE", + "page": "", + "view": "" }, "params": {}, "propConfig": { "custom.MCM": { + "binding": { + "config": { + "expression": "if({view.custom.view} !\u003d \"\", {view.custom.view}, {view.custom.page})" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.currentTable": { + "persistent": true + }, + "custom.page": { "binding": { "config": { "path": "page.props.path" }, "transforms": [ { - "code": "\tpath \u003d value\n\ttry:\n\t\tif \"MCM\" in path:\n\t\t\tindex \u003d path.find(\"MCM\")\n\t\t\treturn path[index:index+5] # MCM + 2 digits\n\texcept:\n\t\t\tpass\n\treturn \"\"\n\t", + "code": "\ttry:\n\t\tif \"MCM\" in value:\n\t\t\tindex \u003d value.find(\"MCM\")\n\t\t\treturn value[index:index+5] # MCM + 2 digits\n\texcept:\n\t\t\tpass\n\treturn \"\"", "type": "script" } ], @@ -20,7 +34,19 @@ }, "persistent": true }, - "custom.currentTable": { + "custom.view": { + "binding": { + "config": { + "path": "page.props.primaryView" + }, + "transforms": [ + { + "code": "\ttry:\n\t\tif \"MCM\" in value:\n\t\t\tindex \u003d value.find(\"MCM\")\n\t\t\treturn value[index:index+5] # MCM + 2 digits\n\texcept:\n\t\t\tpass\n\treturn \"\"", + "type": "script" + } + ], + "type": "property" + }, "persistent": true } },