{ "custom": { "auth": { "almAck": true, "almShelve": true, "config": true, "control": true }, "filters": { "alm": [], "prov": [], "tag": [] } }, "params": {}, "propConfig": { "custom.auth": { "binding": { "config": { "path": "session.props.auth.user.roles" }, "transforms": [ { "code": "\treturn utils.roles.validate(value)", "type": "script" } ], "type": "property" }, "persistent": true }, "custom.filters": { "onChange": { "enabled": null, "script": "\tif currentValue is not None:\n\t\tself.getChild(\"root\").getChild(\"AlarmJournalTable\").refreshData()" }, "persistent": true } }, "props": {}, "root": { "children": [ { "children": [ { "children": [ { "meta": { "name": "Label" }, "position": { "basis": "75px", "shrink": 0 }, "props": { "style": { "backgroundColor": "var(--neutral-30)" }, "text": "IO GW:", "textStyle": { "fontSize": "0.6em", "textAlign": "center", "textTransform": "uppercase" } }, "type": "ia.display.label" }, { "meta": { "name": "FlexRepeater" }, "position": { "grow": 1, "shrink": 0 }, "props": { "alignItems": "flex-start", "elementPosition": { "basis": "auto", "grow": 0, "shrink": 0 }, "instances": [ { "color": "var(--callToAction)", "filterString": "prov:Ignition_Common_IO_Gtwy", "instancePosition": {}, "instanceStyle": { "classes": "" }, "label": "Ignition_Common_IO_Gtwy", "source": "prov" }, { "color": "var(--callToAction)", "filterString": "prov:Ignition_SATB1_IO1_default", "instancePosition": {}, "instanceStyle": { "classes": "" }, "label": "Ignition_SATB1_IO1_default", "source": "prov" } ], "path": "Library/Templates/Framework/Pill Button", "style": { "gap": "5px", "padding": "8px 5px" }, "useDefaultViewHeight": false, "useDefaultViewWidth": false, "wrap": "wrap" }, "type": "ia.display.flex-repeater" }, { "children": [ { "events": { "component": { "onActionPerformed": { "config": { "script": "\tsource \u003d self.parent.parent.meta.name\n\tsystem.perspective.sendMessage(\u0027clearFilters\u0027, {\n\t\t\u0027source\u0027: source\n\t})\n\tself.parent.parent.parent.parent.getChild(\"AlarmStatusTable\").custom.filters[source] \u003d []" }, "scope": "G", "type": "script" } } }, "meta": { "name": "Button" }, "props": { "primary": false, "text": "Remove All", "textStyle": { "fontSize": "0.75em", "textAlign": "center" } }, "type": "ia.input.button" } ], "meta": { "name": "FlexContainer" }, "position": { "basis": "78px", "shrink": 0 }, "props": { "alignItems": "center", "justify": "center", "style": { "backgroundColor": "var(--neutral-30)", "border-left": "1px solid var(--border)" } }, "type": "ia.container.flex" } ], "meta": { "name": "prov" }, "position": { "display": false, "grow": 1 }, "props": { "style": { "borderBottom": "1px solid var(--border)", "borderTop": "1px solid var(--border)" } }, "type": "ia.container.flex" }, { "children": [ { "meta": { "name": "Label" }, "position": { "basis": "75px", "shrink": 0 }, "props": { "style": { "backgroundColor": "var(--neutral-30)" }, "text": "Quick Search:", "textStyle": { "fontSize": "0.6em", "textAlign": "center", "textTransform": "uppercase" } }, "type": "ia.display.label" }, { "meta": { "name": "FlexRepeater" }, "position": { "grow": 1 }, "propConfig": { "props.instances[11].label": { "binding": { "config": { "expression": "\u0027\u0027" }, "type": "expr" } } }, "props": { "elementPosition": { "basis": "auto", "grow": 0, "shrink": 0 }, "instances": [ { "color": "var(--callToAction)", "filterString": "", "instancePosition": {}, "instanceStyle": { "classes": "" }, "label": "DH1", "mode": "", "selected": false, "source": "tag" }, { "color": "var(--callToAction)", "filterString": "", "instancePosition": {}, "instanceStyle": { "classes": "" }, "label": "DH2", "mode": "", "selected": false, "source": "tag" }, { "color": "var(--callToAction)", "filterString": "", "instancePosition": {}, "instanceStyle": { "classes": "" }, "label": "DH3", "mode": "", "selected": false, "source": "tag" }, { "color": "var(--callToAction)", "filterString": "", "instancePosition": {}, "instanceStyle": { "classes": "" }, "label": "DH4", "mode": "", "selected": false, "source": "tag" }, { "color": "var(--callToAction)", "filterString": "", "instancePosition": {}, "instanceStyle": { "classes": "" }, "label": "DH5", "mode": "", "selected": false, "source": "tag" }, { "color": "var(--callToAction)", "filterString": "", "instancePosition": {}, "instanceStyle": { "classes": "" }, "label": "CHWS", "mode": "", "selected": false, "source": "tag" }, { "color": "var(--callToAction)", "filterString": "", "instancePosition": {}, "instanceStyle": { "classes": "" }, "label": "Electrical", "mode": "", "selected": false, "source": "tag" }, { "color": "var(--callToAction)", "filterString": "", "instancePosition": {}, "instanceStyle": { "classes": "" }, "label": "", "mode": "", "selected": false, "source": "tag" } ], "path": "Library/Templates/Framework/Pill Button", "style": { "gap": "5px", "padding": "8px 5px" }, "useDefaultViewHeight": false, "useDefaultViewWidth": false, "wrap": "wrap" }, "type": "ia.display.flex-repeater" }, { "children": [ { "events": { "component": { "onActionPerformed": { "config": { "script": "\tsource \u003d self.parent.parent.meta.name\n\tself.view.custom.filters[source] \u003d []\n\tflexRepeater \u003d self.parent.parent.getChild(\"FlexRepeater\")\n\ttoDelete \u003d []\n\tfor i, instance in enumerate(flexRepeater.props.instances):\n\t\tinstance[\u0027selected\u0027] \u003d False\n\t\tif instance[\u0027mode\u0027] \u003d\u003d \u0027Custom\u0027:\n\t\t\tinstance[\u0027label\u0027] \u003d \u0027\u0027\n\t\t\tif i \u003c len(flexRepeater.props.instances) - 1:\n\t\t\t\ttoDelete.append(i)\n\tfor index in reversed(toDelete):\n\t\tflexRepeater.props.instances.pop(index)" }, "scope": "G", "type": "script" } } }, "meta": { "name": "Button" }, "props": { "primary": false, "text": "Remove All", "textStyle": { "fontSize": "0.75em", "textAlign": "center" } }, "type": "ia.input.button" } ], "meta": { "name": "FlexContainer" }, "position": { "basis": "78px", "shrink": 0 }, "props": { "alignItems": "center", "justify": "center", "style": { "backgroundColor": "var(--neutral-30)", "border-left": "1px solid var(--border)" } }, "type": "ia.container.flex" } ], "meta": { "name": "tag" }, "position": { "grow": 1 }, "type": "ia.container.flex" } ], "meta": { "name": "FlexContainer" }, "position": { "shrink": 0 }, "props": { "direction": "column", "style": { "border": "1px solid var(--border)" } }, "type": "ia.container.flex" }, { "meta": { "name": "RadioGroup" }, "position": { "shrink": 0 }, "propConfig": { "props.value": { "binding": { "config": { "expression": "0" }, "type": "expr" }, "onChange": { "enabled": null, "script": "\tif currentValue is not None:\n\t\tself.getSibling(\"AlarmJournalTable\").refreshData()" } } }, "props": { "align": "start", "radioStyle": { "padding": "0px 10px" }, "radios": [ { "selected": true, "text": "Match on ANY", "value": 0 }, { "selected": false, "text": "Match on ALL", "value": 1 } ], "style": { "borderLeft": "1px solid var(--border)", "borderRight": "1px solid var(--border)", "fontSize": "0.8em", "padding": "4px 5px" } }, "type": "ia.input.radio-group" }, { "meta": { "name": "AlarmJournalTable" }, "position": { "grow": 1 }, "props": { "columns": { "displayPath": { "enabled": true }, "eventId": { "enabled": false }, "label": { "enabled": true }, "source": { "enabled": false } }, "dateRange": { "historical": { "endDate": { "$": [ "ts", 0, 1729635409199 ], "$ts": 1729494000000 }, "startDate": { "$": [ "ts", 0, 1729635406447 ], "$ts": 1729407600000 } }, "realtime": { "interval": 10, "unit": "minutes" } }, "filter": { "events": { "acked": false, "active": false, "cleared": false }, "priorities": { "critical": false, "high": false, "low": false, "medium": false } }, "rowStyles": { "acked": { "priorities": { "critical": { "backgroundColor": "#e2202860" }, "high": { "backgroundColor": "#de7c3360" }, "low": { "backgroundColor": "#7266b760" }, "medium": { "backgroundColor": "#f4b83460" } } }, "active": { "priorities": { "critical": { "backgroundColor": "#e22028b0" }, "high": { "backgroundColor": "#de7c33b0" }, "low": { "backgroundColor": "#7266b7b0" }, "medium": { "backgroundColor": "#f4b834b0" } } } }, "toolbar": { "enableFilter": false } }, "scripts": { "customMethods": [ { "name": "convertToDict", "params": [ "input_str" ], "script": " # Split by \u0027:/\u0027, keeping \u0027:\u0027 within key-value pairs\n parts \u003d input_str.split(\u0027:/\u0027)\n result_dict \u003d {}\n \n # Loop through the parts and create key-value pairs\n for part in parts:\n key, value \u003d part.split(\u0027:\u0027, 1)\n result_dict[key] \u003d value\n \n return result_dict" } ], "extensionFunctions": [ { "enabled": true, "name": "filterAlarm", "script": "\tresult \u003d True\n\tsource \u003d self.convertToDict(alarmEvent.get(\u0027source\u0027).toString())\n\tprov \u003d source[\u0027prov\u0027]\n\ttag \u003d source[\u0027tag\u0027]\n\talm \u003d source[\u0027alm\u0027]\n\t\n\tfilters \u003d self.view.custom.filters\n\tmatchRule \u003d self.getSibling(\"RadioGroup\").props.value\n\t\n\tif len(filters[\u0027prov\u0027]) \u003e 0:\n\t\tif prov not in filters[\u0027prov\u0027]:\n\t\t\tresult \u003d False\n\t\t\t\n\tif len(filters[\u0027tag\u0027]) \u003e 0:\n\t if matchRule \u003d\u003d 0: # match on ANY\n\t result \u003d False \n\t for t in filters[\u0027tag\u0027]:\n\t if t.upper() in tag.upper():\n\t result \u003d True\n\t break # If any tag matches, we can break out of the loop\n\t elif matchRule \u003d\u003d 1: # match on ALL\n\t for t in filters[\u0027tag\u0027]:\n\t if t.upper() not in tag.upper():\n\t result \u003d False\n\t break # If any tag doesn\u0027t match, stop and return False\n\t\n\treturn result" } ], "messageHandlers": [] }, "type": "ia.display.alarmjournaltable" } ], "meta": { "name": "root" }, "props": { "direction": "column" }, "scripts": { "customMethods": [], "extensionFunctions": null, "messageHandlers": [ { "messageType": "addFilter", "pageScope": true, "script": "\tsource \u003d payload[\u0027source\u0027]\n\tlabel \u003d payload[\u0027label\u0027]\n\tindex \u003d payload[\u0027index\u0027]\n\t\n\tflexRepeater \u003d self.getChild(\"FlexContainer\").getChild(source).getChild(\"FlexRepeater\")\n\t\n\tif label in self.view.custom.filters[source]:\n\t\tpass\n\telse:\n\t\tself.view.custom.filters[source].append(label)\n\t\tflexRepeater.props.instances[index].selected \u003d True", "sessionScope": false, "viewScope": false }, { "messageType": "customFilter", "pageScope": true, "script": "\tsource \u003d payload[\u0027source\u0027]\n\tlabel \u003d payload[\u0027label\u0027]\n\tindex \u003d payload[\u0027index\u0027]\n\t\n\tflexRepeater \u003d self.getChild(\"FlexContainer\").getChild(source).getChild(\"FlexRepeater\")\n\t\n\tif label in self.view.custom.filters[source]:\n\t\tpass\n\telse:\n\t\tself.view.custom.filters[source].append(label)\n\t\tflexRepeater.props.instances[index][\u0027selected\u0027] \u003d True\n\t\tflexRepeater.props.instances[index][\u0027label\u0027] \u003d label\n\t\tflexRepeater.props.instances.append({\n\t\t\t\"color\": \"var(--neutral-50)\",\n\t\t\t\"filterString\": \"\",\n\t\t\t\"instancePosition\": {},\n\t\t\t\"instanceStyle\": {\n\t\t\t\"classes\": \"\"\n\t\t\t},\n\t\t\t\"mode\": \"Custom\",\n\t\t\t\"selected\": False,\n\t\t\t\"source\": \"tag\",\n\t\t\t\"label\": \"\"\n\t\t\t})", "sessionScope": false, "viewScope": false }, { "messageType": "removeFilter", "pageScope": true, "script": "\tsource \u003d payload[\u0027source\u0027]\n\tlabel \u003d payload[\u0027label\u0027]\n\tindex \u003d payload[\u0027index\u0027]\n\t\n\tflexRepeater \u003d self.getChild(\"FlexContainer\").getChild(source).getChild(\"FlexRepeater\")\n\t\n\tif label in self.view.custom.filters[source]:\n\t\ti \u003d self.view.custom.filters[source].index(label)\n\t\tself.view.custom.filters[source].pop(i)\n\t\tflexRepeater.props.instances[index].selected \u003d False\n\t\tif flexRepeater.props.instances[index].mode \u003d\u003d \u0027Custom\u0027:\n\t\t\tflexRepeater.props.instances[index].label \u003d \u0027\u0027\n\t\t\tif index \u003c len(flexRepeater.props.instances) - 1:\n\t\t\t\tflexRepeater.props.instances.pop(index)\n\telse:\n\t\tpass", "sessionScope": false, "viewScope": false } ] }, "type": "ia.container.flex" } }